Browse Source

Exposed global Audio manager to managed code

BearishSun 9 years ago
parent
commit
7b8fc664ea

+ 0 - 2
Source/BansheeMono/Include/BsMonoArray.h

@@ -104,8 +104,6 @@ namespace BansheeEngine
 	{
 		// A layer of indirection for all methods specialized by ScriptArray. */
 
-
-
 		template<class T>
 		T ScriptArray_get(MonoArray* array, UINT32 idx)
 		{

+ 94 - 0
Source/MBansheeEngine/Audio/Audio.cs

@@ -0,0 +1,94 @@
+//********************************** Banshee Engine (www.banshee3d.com) **************************************************//
+//**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
+using System;
+using System.Runtime.CompilerServices;
+
+namespace BansheeEngine
+{
+    /// <summary>
+    /// Identifier for a device that can be used for playing audio.
+    /// </summary>
+    public class AudioDevice : ScriptObject
+    {
+        /// <summary>
+        /// Constructor for internal use by the runtime only.
+        /// </summary>
+        private AudioDevice() { }
+
+        /// <summary>
+        /// Name of the audio device.
+        /// </summary>
+        public string Name
+        {
+            get { return Internal_GetName(mCachedPtr); }
+        }
+
+        [MethodImpl(MethodImplOptions.InternalCall)]
+        private static extern string Internal_GetName(IntPtr thisPtr);
+    }
+
+    /// <summary>
+    /// Provides global functionality relating to sounds and music.
+    /// </summary>
+    public static class Audio
+    {
+        /// <summary>
+        /// Global audio volume. In range [0, 1].
+        /// </summary>
+        public static float Volume
+        {
+            get { return Internal_GetVolume(); }
+            set { Internal_SetVolume(value); }
+        }
+
+        /// <summary>
+        /// Device on which is the audio played back on.
+        /// </summary>
+        public static AudioDevice ActiveDevice
+        {
+            get { return Internal_GetActiveDevice(); }
+            set
+            {
+                IntPtr devicePtr = IntPtr.Zero;
+                if (value != null)
+                    devicePtr = value.GetCachedPtr();
+
+                Internal_SetActiveDevice(devicePtr);
+            }
+        }
+
+        /// <summary>
+        /// Returns the default audio device identifier.
+        /// </summary>
+        public static AudioDevice DefaultDevice
+        {
+            get { return Internal_GetDefaultDevice(); }
+        }
+
+        /// <summary>
+        /// Returns a list of all available audio devices
+        /// </summary>
+        public static AudioDevice[] AllDevices
+        {
+            get { return Internal_GetAllDevices(); }
+        }
+
+        [MethodImpl(MethodImplOptions.InternalCall)]
+        private static extern void Internal_SetVolume(float volume);
+
+        [MethodImpl(MethodImplOptions.InternalCall)]
+        private static extern float Internal_GetVolume();
+
+        [MethodImpl(MethodImplOptions.InternalCall)]
+        private static extern void Internal_SetActiveDevice(IntPtr device);
+
+        [MethodImpl(MethodImplOptions.InternalCall)]
+        private static extern AudioDevice Internal_GetActiveDevice();
+
+        [MethodImpl(MethodImplOptions.InternalCall)]
+        private static extern AudioDevice Internal_GetDefaultDevice();
+
+        [MethodImpl(MethodImplOptions.InternalCall)]
+        private static extern AudioDevice[] Internal_GetAllDevices();
+    }
+}

+ 1 - 0
Source/MBansheeEngine/MBansheeEngine.csproj

@@ -43,6 +43,7 @@
     <Reference Include="System.Xml" />
   </ItemGroup>
   <ItemGroup>
+    <Compile Include="Audio\Audio.cs" />
     <Compile Include="Audio\AudioClip.cs" />
     <Compile Include="Rendering\PostProcessSettings.cs" />
     <Compile Include="Utility\AsyncOp.cs" />

+ 2 - 0
Source/SBansheeEngine/CMakeSources.cmake

@@ -134,6 +134,7 @@ set(BS_SBANSHEEENGINE_INC_WRAPPERS
 	"Include/BsScriptResourceRef.h"
 	"Include/BsScriptPostProcessSettings.h"
 	"Include/BsScriptAudioClip.h"
+	"Include/BsScriptAudio.h"
 )
 
 set(BS_SBANSHEEENGINE_INC_WRAPPERS_GUI
@@ -258,6 +259,7 @@ set(BS_SBANSHEEENGINE_SRC_WRAPPERS
 	"Source/BsScriptRenderable.cpp"
 	"Source/BsScriptPostProcessSettings.cpp"
 	"Source/BsScriptAudioClip.cpp"
+	"Source/BsScriptAudio.cpp"
 )
 
 set(BS_SBANSHEEENGINE_INC_SERIALIZATION

+ 58 - 0
Source/SBansheeEngine/Include/BsScriptAudio.h

@@ -0,0 +1,58 @@
+//********************************** Banshee Engine (www.banshee3d.com) **************************************************//
+//**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
+#pragma once
+
+#include "BsScriptEnginePrerequisites.h"
+#include "BsScriptObject.h"
+#include "BsAudio.h"
+
+namespace BansheeEngine
+{
+	/** @addtogroup ScriptInteropEngine
+	 *  @{
+	 */
+
+	/** Interop class between C++ & CLR for AudioDevice. */
+	class BS_SCR_BE_EXPORT ScriptAudioDevice : public ScriptObject<ScriptAudioDevice>
+	{
+	public:
+		SCRIPT_OBJ(ENGINE_ASSEMBLY, "BansheeEngine", "AudioDevice")
+
+		/** Converts a native audio device into its managed counterpart. */
+		static MonoObject* create(const AudioDevice& device);
+
+		/** Returns the native audio device. */
+		const AudioDevice& getDevice() const { return mDevice; }
+	private:
+		ScriptAudioDevice(MonoObject* instance, const AudioDevice& device);
+
+		AudioDevice mDevice;
+
+		/************************************************************************/
+		/* 								CLR HOOKS						   		*/
+		/************************************************************************/
+		static MonoString* internal_GetName(ScriptAudioDevice* thisPtr);
+	};
+
+	/**	Interop class between C++ & CLR for Audio. */
+	class BS_SCR_BE_EXPORT ScriptAudio : public ScriptObject<ScriptAudio>
+	{
+	public:
+		SCRIPT_OBJ(ENGINE_ASSEMBLY, "BansheeEngine", "Audio")
+
+	private:
+		ScriptAudio(MonoObject* instance);
+
+		/************************************************************************/
+		/* 								CLR HOOKS						   		*/
+		/************************************************************************/
+		static void internal_SetVolume(float volume);
+		static float internal_GetVolume();
+		static void internal_SetActiveDevice(ScriptAudioDevice* device);
+		static MonoObject* internal_GetActiveDevice();
+		static MonoObject* internal_GetDefaultDevice();
+		static MonoArray* internal_GetAllDevices();
+	};
+
+	/** @} */
+}

+ 4 - 0
Source/SBansheeEngine/Source/BsPlayInEditorManager.cpp

@@ -7,6 +7,7 @@
 #include "BsSceneObject.h"
 #include "BsApplication.h"
 #include "BsPhysics.h"
+#include "BsAudio.h"
 
 namespace BansheeEngine
 {
@@ -45,6 +46,7 @@ namespace BansheeEngine
 			mPausableTime = 0.0f;
 
 			gPhysics().setPaused(true);
+			gAudio().setPaused(true);
 
 			mSavedScene->_instantiate();
 			gSceneManager()._setRootNode(mSavedScene);
@@ -60,12 +62,14 @@ namespace BansheeEngine
 			}
 
 			gPhysics().setPaused(false);
+			gAudio().setPaused(false);
 		}
 			break;
 		case PlayInEditorState::Paused:
 		{
 			mFrameStepActive = false;
 			gPhysics().setPaused(true);
+			gAudio().setPaused(true);
 
 			if (oldState == PlayInEditorState::Stopped)
 			{

+ 82 - 0
Source/SBansheeEngine/Source/BsScriptAudio.cpp

@@ -0,0 +1,82 @@
+//********************************** Banshee Engine (www.banshee3d.com) **************************************************//
+//**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
+#include "BsScriptAudio.h"
+#include "BsMonoMethod.h"
+#include "BsMonoUtil.h"
+
+namespace BansheeEngine
+{
+	ScriptAudioDevice::ScriptAudioDevice(MonoObject* instance, const AudioDevice& device)
+		:ScriptObject(instance), mDevice(device)
+	{ }
+
+	void ScriptAudioDevice::initRuntimeData()
+	{
+		metaData.scriptClass->addInternalCall("Internal_GetName", &ScriptAudioDevice::internal_GetName);
+	}
+
+	MonoObject* ScriptAudioDevice::create(const AudioDevice& device)
+	{
+		MonoObject* instance = metaData.scriptClass->createInstance();
+
+		new (bs_alloc<ScriptAudioDevice>()) ScriptAudioDevice(instance, device);
+		return instance;
+	}
+
+	MonoString* ScriptAudioDevice::internal_GetName(ScriptAudioDevice* thisPtr)
+	{
+		return MonoUtil::wstringToMono(thisPtr->getDevice().name);
+	}
+
+	ScriptAudio::ScriptAudio(MonoObject* instance)
+		:ScriptObject(instance)
+	{ }
+
+	void ScriptAudio::initRuntimeData()
+	{
+		metaData.scriptClass->addInternalCall("Internal_SetVolume", &ScriptAudio::internal_SetVolume);
+		metaData.scriptClass->addInternalCall("Internal_GetVolume", &ScriptAudio::internal_GetVolume);
+		metaData.scriptClass->addInternalCall("Internal_SetActiveDevice", &ScriptAudio::internal_SetActiveDevice);
+		metaData.scriptClass->addInternalCall("Internal_GetActiveDevice", &ScriptAudio::internal_GetActiveDevice);
+		metaData.scriptClass->addInternalCall("Internal_GetDefaultDevice", &ScriptAudio::internal_GetDefaultDevice);
+		metaData.scriptClass->addInternalCall("Internal_GetAllDevices", &ScriptAudio::internal_GetAllDevices);
+	}
+
+	void ScriptAudio::internal_SetVolume(float volume)
+	{
+		gAudio().setVolume(volume);
+	}
+
+	float ScriptAudio::internal_GetVolume()
+	{
+		return gAudio().getVolume();
+	}
+
+	void ScriptAudio::internal_SetActiveDevice(ScriptAudioDevice* device)
+	{
+		gAudio().setActiveDevice(device->getDevice());
+	}
+
+	MonoObject* ScriptAudio::internal_GetActiveDevice()
+	{
+		return ScriptAudioDevice::create(gAudio().getActiveDevice());
+	}
+
+	MonoObject* ScriptAudio::internal_GetDefaultDevice()
+	{
+		return ScriptAudioDevice::create(gAudio().getDefaultDevice());
+	}
+
+	MonoArray* ScriptAudio::internal_GetAllDevices()
+	{
+		const Vector<AudioDevice>& devices = gAudio().getAllDevices();
+
+		UINT32 numDevices = (UINT32)devices.size();
+		ScriptArray scriptArray = ScriptArray::create<ScriptAudioDevice>(numDevices);
+
+		for (UINT32 i = 0; i < numDevices; i++)
+			scriptArray.set(i, ScriptAudioDevice::create(devices[i]));
+
+		return scriptArray.getInternal();
+	}
+}