Просмотр исходного кода

Interface for AudioSource and AudioListener (WIP)

BearishSun 9 лет назад
Родитель
Сommit
1c01ab784c

+ 5 - 0
Source/BansheeCore/CMakeSources.cmake

@@ -470,12 +470,16 @@ set(BS_BANSHEECORE_SRC_SCENE
 set(BS_BANSHEECORE_INC_AUDIO
 	"Include/BsAudio.h"
 	"Include/BsAudioClip.h"
+	"Include/BsAudioListener.h"
+	"Include/BsAudioSource.h"
 	"Include/BsAudioClipImportOptions.h"
 )
 
 set(BS_BANSHEECORE_SRC_AUDIO
 	"Source/BsAudio.cpp"
 	"Source/BsAudioClip.cpp"
+	"Source/BsAudioListener.cpp"
+	"Source/BsAudioSource.cpp"
 	"Source/BsAudioClipImportOptions.cpp"
 )
 
@@ -551,5 +555,6 @@ set(BS_BANSHEECORE_SRC
 	${BS_BANSHEECORE_SRC_NOFILTER}
 	${BS_BANSHEECORE_SRC_PHYSICS}
 	${BS_BANSHEECORE_SRC_SCENE}
+	${BS_BANSHEECORE_INC_AUDIO}
 	${BS_BANSHEECORE_SRC_AUDIO}
 )

+ 28 - 0
Source/BansheeCore/Include/BsAudio.h

@@ -11,11 +11,35 @@ namespace BansheeEngine
 	 *  @{
 	 */
 
+	struct AudioDevice
+	{
+		WString name;
+	};
+
 	/** Provides global functionality relating to sounds and music. */
 	class BS_CORE_EXPORT Audio : public Module<Audio>
 	{
+	public:
+		virtual ~Audio() { }
+
+		virtual void setVolume(float volume) = 0;
+		virtual float getVolume() const = 0;
+
+		virtual void setPaused(bool paused) = 0;
+		virtual bool isPaused() const = 0;
+
+		virtual void update() = 0;
+
+		virtual void setActiveDevice(const AudioDevice& device) = 0;
+		virtual AudioDevice getActiveDevice() const = 0;
+		
+		virtual AudioDevice getDefaultDevice() const = 0;
+		virtual Vector<AudioDevice> getAllDevices() const = 0;
+
 	protected:
 		friend class AudioClip;
+		friend class AudioListener;
+		friend class AudioSource;
 
 		/** 
 		 * Creates a new audio clip.
@@ -28,6 +52,10 @@ namespace BansheeEngine
 		 */
 		virtual SPtr<AudioClip> createClip(const SPtr<DataStream>& samples, UINT32 streamSize, UINT32 numSamples,
 			const AUDIO_CLIP_DESC& desc) = 0;
+
+		virtual SPtr<AudioListener> createListener() = 0;
+
+		virtual SPtr<AudioSource> createSource() = 0;
 	};
 
 	/** Provides easier access to Audio. */

+ 43 - 0
Source/BansheeCore/Include/BsAudioListener.h

@@ -0,0 +1,43 @@
+//********************************** Banshee Engine (www.banshee3d.com) **************************************************//
+//**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
+#pragma once
+
+#include "BsCorePrerequisites.h"
+#include "BsVector3.h"
+
+namespace BansheeEngine
+{
+	/** @addtogroup Audio
+	 *  @{
+	 */
+
+	class BS_CORE_EXPORT AudioListener
+	{
+	public:
+		virtual ~AudioListener() {}
+
+		virtual void setPosition(const Vector3& position);
+		Vector3 getPosition() const { return mPosition; }
+
+		virtual void setDirection(const Vector3& direction);
+		Vector3 getDirection() const { return mDirection; }
+
+		virtual void setUp(const Vector3& up);
+		Vector3 getUp() const { return mUp; }
+
+		virtual void setVelocity(const Vector3& velocity);
+		Vector3 getVelocity() const { return mVelocity; }
+
+		static SPtr<AudioListener> create();
+
+	protected:
+		AudioListener();
+
+		Vector3 mPosition;
+		Vector3 mDirection;
+		Vector3 mUp;
+		Vector3 mVelocity;
+	};
+
+	/** @} */
+}

+ 77 - 0
Source/BansheeCore/Include/BsAudioSource.h

@@ -0,0 +1,77 @@
+//********************************** Banshee Engine (www.banshee3d.com) **************************************************//
+//**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
+#pragma once
+
+#include "BsCorePrerequisites.h"
+#include "BsVector3.h"
+
+namespace BansheeEngine
+{
+	/** @addtogroup Audio
+	 *  @{
+	 */
+
+	enum class AudioSourceState
+	{
+		Playing,
+		Paused,
+		Stopped
+	};
+
+	class BS_CORE_EXPORT AudioSource
+	{
+	public:
+		virtual ~AudioSource() { }
+
+		virtual void setClip(const HAudioClip& clip);
+		HAudioClip getClip() const { return mAudioClip; }
+
+		virtual void setPosition(const Vector3& position);
+		Vector3 getPosition() const { return mPosition; }
+
+		virtual void setVelocity(const Vector3& velocity);
+		Vector3 getVelocity() const { return mVelocity; }
+
+		virtual void setVolume(float volume); // [0, 1] range
+		float getVolume() const { return mVolume; }
+
+		virtual void setPitch(float pitch);
+		float getPitch() const { return mPitch; }
+
+		virtual void setIsLooping(bool loop);
+		bool getIsLooping() const { return mLoop; }
+
+		virtual void setPriority(UINT32 priority);
+		UINT32 getPriority() const { return mPriority; }
+
+		virtual void setMinDistance(float distance);
+		float getMinDistance() const { return mMinDistance; }
+
+		virtual void setAttenuation(float attenuation);
+		float getAttenuation() const { return mAttenuation; }
+
+		virtual void play();
+		virtual void pause();
+		virtual void stop();
+
+		AudioSourceState getState() const { return mState; }
+
+		static SPtr<AudioSource> create();
+
+	protected:
+		AudioSource();
+
+		HAudioClip mAudioClip;
+		Vector3 mPosition;
+		Vector3 mVelocity;
+		float mVolume;
+		float mPitch;
+		bool mLoop;
+		UINT32 mPriority;
+		float mMinDistance;
+		float mAttenuation;
+		AudioSourceState mState;
+	};
+
+	/** @} */
+}

+ 2 - 0
Source/BansheeCore/Include/BsCorePrerequisites.h

@@ -344,6 +344,8 @@ namespace BansheeEngine
 	class CCharacterController;
 	class ShaderDefines;
 	class ShaderImportOptions;
+	class AudioListener;
+	class AudioSource;
 	// Asset import
 	class SpecificImporter;
 	class Importer;

+ 1 - 0
Source/BansheeCore/Source/BsAudioClip.cpp

@@ -2,6 +2,7 @@
 //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
 #include "BsAudioClip.h"
 #include "BsResources.h"
+#include "BsAudioClip.h"
 #include "BsAudio.h"
 #include "BsAudioClipRTTI.h"
 

+ 38 - 0
Source/BansheeCore/Source/BsAudioListener.cpp

@@ -0,0 +1,38 @@
+//********************************** Banshee Engine (www.banshee3d.com) **************************************************//
+//**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
+#include "BsAudioListener.h"
+#include "BsAudio.h"
+
+namespace BansheeEngine
+{
+	AudioListener::AudioListener()
+		:mDirection(-Vector3::UNIT_Z), mUp(Vector3::UNIT_Y)
+	{
+		
+	}
+
+	void AudioListener::setPosition(const Vector3& position)
+	{
+		mPosition = position;
+	}
+
+	void AudioListener::setDirection(const Vector3& direction)
+	{
+		mDirection = direction;
+	}
+
+	void AudioListener::setUp(const Vector3& up)
+	{
+		mUp = up;
+	}
+
+	void AudioListener::setVelocity(const Vector3& velocity)
+	{
+		mVelocity = velocity;
+	}
+
+	SPtr<AudioListener> AudioListener::create()
+	{
+		return gAudio().createListener();
+	}	
+}

+ 79 - 0
Source/BansheeCore/Source/BsAudioSource.cpp

@@ -0,0 +1,79 @@
+//********************************** Banshee Engine (www.banshee3d.com) **************************************************//
+//**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
+#include "BsAudioSource.h"
+#include "BsAudio.h"
+
+namespace BansheeEngine
+{
+	AudioSource::AudioSource()
+		: mVolume(1.0f), mPitch(1.0f), mLoop(false), mPriority(0), mMinDistance(1.0f), mAttenuation(1.0f)
+		, mState(AudioSourceState::Stopped)
+	{
+
+	}
+
+	void AudioSource::setClip(const HAudioClip& clip)
+	{
+		mAudioClip = clip;
+	}
+
+	void AudioSource::setPosition(const Vector3& position)
+	{
+		mPosition = position;
+	}
+
+	void AudioSource::setVelocity(const Vector3& velocity)
+	{
+		mVelocity = velocity;
+	}
+
+	void AudioSource::setVolume(float volume)
+	{
+		mVolume = volume;
+	}
+
+	void AudioSource::setPitch(float pitch)
+	{
+		mPitch = pitch;
+	}
+
+	void AudioSource::setIsLooping(bool loop)
+	{
+		mLoop = loop;
+	}
+
+	void AudioSource::setPriority(UINT32 priority)
+	{
+		mPriority = priority;
+	}
+
+	void AudioSource::setMinDistance(float distance)
+	{
+		mMinDistance = distance;
+	}
+
+	void AudioSource::setAttenuation(float attenuation)
+	{
+		mAttenuation = attenuation;
+	}
+
+	void AudioSource::play()
+	{
+		mState = AudioSourceState::Playing;
+	}
+
+	void AudioSource::pause()
+	{
+		mState = AudioSourceState::Paused;
+	}
+
+	void AudioSource::stop()
+	{
+		mState = AudioSourceState::Stopped;
+	}
+
+	SPtr<AudioSource> AudioSource::create()
+	{
+		return gAudio().createSource();
+	}
+}

+ 6 - 0
Source/BansheeOpenAudio/CMakeSources.cmake

@@ -7,6 +7,9 @@ set(BS_BANSHEEOPENAUDIO_INC_NOFILTER
 	"Include/BsOAFileReader.h"
 	"Include/BsOAOggVorbisWriter.h"
 	"Include/BsOAAudioClip.h"
+	"Include/BsOAAudio.h"
+	"Include/BsOAAudioSource.h"
+	"Include/BsOAAudioListener.h"
 )
 
 set(BS_BANSHEEOPENAUDIO_SRC_NOFILTER
@@ -17,6 +20,9 @@ set(BS_BANSHEEOPENAUDIO_SRC_NOFILTER
 	"Source/BsOAFLACReader.cpp"
 	"Source/BsOAOggVorbisWriter.cpp"
 	"Source/BsOAAudioClip.cpp"
+	"Source/BsOAAudio.cpp"
+	"Source/BsOAAudioSource.cpp"
+	"Source/BsOAAudioListener.cpp"
 )
 
 source_group("Header Files" FILES ${BS_BANSHEEOPENAUDIO_INC_NOFILTER})

+ 49 - 0
Source/BansheeOpenAudio/Include/BsOAAudio.h

@@ -0,0 +1,49 @@
+//********************************** Banshee Engine (www.banshee3d.com) **************************************************//
+//**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
+#pragma once
+
+#include "BsOAPrerequisites.h"
+#include "BsAudio.h"
+
+namespace BansheeEngine
+{
+	/** @addtogroup OpenAudio
+	 *  @{
+	 */
+	
+	class BS_OA_EXPORT OAAudio : public Audio
+	{
+	public:
+		OAAudio();
+		virtual ~OAAudio();
+
+		/** @copydoc Audio::setVolume */
+		void setVolume(float volume) override;
+
+		/** @copydoc Audio::getVolume */
+		float getVolume() const override;
+
+		/** @copydoc Audio::setPaused */
+		void setPaused(bool paused) override;
+
+		/** @copydoc Audio::isPaused */
+		bool isPaused() const override;
+
+		/** @copydoc Audio::update */
+		void update() override;
+
+		/** @copydoc Audio::setActiveDevice */
+		void setActiveDevice(const AudioDevice& device) override;
+
+		/** @copydoc Audio::getActiveDevice */
+		AudioDevice getActiveDevice() const override;
+
+		/** @copydoc Audio::getDefaultDevice */
+		AudioDevice getDefaultDevice() const override;
+
+		/** @copydoc Audio::getAllDevices */
+		Vector<AudioDevice> getAllDevices() const override;
+	};
+
+	/** @} */
+}

+ 34 - 0
Source/BansheeOpenAudio/Include/BsOAAudioListener.h

@@ -0,0 +1,34 @@
+//********************************** Banshee Engine (www.banshee3d.com) **************************************************//
+//**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
+#pragma once
+
+#include "BsOAPrerequisites.h"
+#include "BsAudioListener.h"
+
+namespace BansheeEngine
+{
+	/** @addtogroup OpenAudio
+	 *  @{
+	 */
+	
+	class BS_OA_EXPORT OAAudioListener : public AudioListener
+	{
+	public:
+		OAAudioListener();
+		virtual ~OAAudioListener();
+
+		/** @copydoc AudioListener::setPosition */
+		void setPosition(const Vector3& position) override;
+
+		/** @copydoc AudioListener::setDirection */
+		void setDirection(const Vector3& direction) override;
+
+		/** @copydoc AudioListener::setUp */
+		void setUp(const Vector3& up) override;
+
+		/** @copydoc AudioListener::setVelocity */
+		void setVelocity(const Vector3& velocity) override;
+	};
+
+	/** @} */
+}

+ 58 - 0
Source/BansheeOpenAudio/Include/BsOAAudioSource.h

@@ -0,0 +1,58 @@
+//********************************** Banshee Engine (www.banshee3d.com) **************************************************//
+//**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
+#pragma once
+
+#include "BsOAPrerequisites.h"
+#include "BsAudioSource.h"
+
+namespace BansheeEngine
+{
+	/** @addtogroup OpenAudio
+	 *  @{
+	 */
+	
+	class BS_OA_EXPORT OAAudioSource : public AudioSource
+	{
+	public:
+		OAAudioSource();
+		virtual ~OAAudioSource();
+
+		/** @copydoc AudioSource::setClip */
+		void setClip(const HAudioClip& clip) override;
+
+		/** @copydoc AudioSource::setPosition */
+		void setPosition(const Vector3& position) override;
+
+		/** @copydoc AudioSource::setVelocity */
+		void setVelocity(const Vector3& velocity) override;
+
+		/** @copydoc AudioSource::setVolume */
+		void setVolume(float volume) override;
+
+		/** @copydoc AudioSource::setPitch */
+		void setPitch(float pitch) override;
+
+		/** @copydoc AudioSource::setIsLooping */
+		void setIsLooping(bool loop) override;
+
+		/** @copydoc AudioSource::setPriority */
+		void setPriority(UINT32 priority) override;
+
+		/** @copydoc AudioSource::setMinDistance */
+		void setMinDistance(float distance) override;
+
+		/** @copydoc AudioSource::setAttenuation */
+		void setAttenuation(float attenuation) override;
+
+		/** @copydoc AudioSource::play */
+		void play() override;
+
+		/** @copydoc AudioSource::pause */
+		void pause() override;
+
+		/** @copydoc AudioSource::stop */
+		void stop() override;
+	};
+
+	/** @} */
+}

+ 66 - 0
Source/BansheeOpenAudio/Source/BsOAAudio.cpp

@@ -0,0 +1,66 @@
+//********************************** Banshee Engine (www.banshee3d.com) **************************************************//
+//**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
+#include "BsOAAudio.h"
+
+namespace BansheeEngine
+{
+	OAAudio::OAAudio()
+	{
+		
+	}
+
+	OAAudio::~OAAudio()
+	{
+		
+	}
+
+	void OAAudio::setVolume(float volume)
+	{
+		// TODO
+	}
+
+	float OAAudio::getVolume() const
+	{
+		// TODO
+		return 1.0f;
+	}
+
+	void OAAudio::setPaused(bool paused)
+	{
+		// TODO
+	}
+
+	bool OAAudio::isPaused() const
+	{
+		// TODO
+		return false;
+	}
+
+	void OAAudio::update()
+	{
+		// TODO
+	}
+
+	void OAAudio::setActiveDevice(const AudioDevice& device)
+	{
+		// TODO
+	}
+
+	AudioDevice OAAudio::getActiveDevice() const
+	{
+		// TODO
+		return AudioDevice();
+	}
+
+	AudioDevice OAAudio::getDefaultDevice() const
+	{
+		// TODO
+		return AudioDevice();
+	}
+
+	Vector<AudioDevice> OAAudio::getAllDevices() const
+	{
+		// TODO
+		return Vector<AudioDevice>();
+	}
+}

+ 44 - 0
Source/BansheeOpenAudio/Source/BsOAAudioListener.cpp

@@ -0,0 +1,44 @@
+//********************************** Banshee Engine (www.banshee3d.com) **************************************************//
+//**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
+#include "BsOAAudioListener.h"
+
+namespace BansheeEngine
+{
+	OAAudioListener::OAAudioListener()
+	{
+		
+	}
+
+	OAAudioListener::~OAAudioListener()
+	{
+		
+	}
+
+	void OAAudioListener::setPosition(const Vector3& position)
+	{
+		AudioListener::setPosition(position);
+
+		// TODO
+	}
+
+	void OAAudioListener::setDirection(const Vector3& direction)
+	{
+		AudioListener::setDirection(direction);
+
+		// TODO
+	}
+
+	void OAAudioListener::setUp(const Vector3& up)
+	{
+		AudioListener::setUp(up);
+
+		// TODO
+	}
+
+	void OAAudioListener::setVelocity(const Vector3& velocity)
+	{
+		AudioListener::setVelocity(velocity);
+
+		// TODO
+	}
+}

+ 100 - 0
Source/BansheeOpenAudio/Source/BsOAAudioSource.cpp

@@ -0,0 +1,100 @@
+//********************************** Banshee Engine (www.banshee3d.com) **************************************************//
+//**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
+#include "BsOAAudioSource.h"
+
+namespace BansheeEngine
+{
+	OAAudioSource::OAAudioSource()
+	{
+		
+	}
+
+	OAAudioSource::~OAAudioSource()
+	{
+		
+	}
+
+	void OAAudioSource::setClip(const HAudioClip& clip)
+	{
+		AudioSource::setClip(clip);
+
+		// TODO
+	}
+
+	void OAAudioSource::setPosition(const Vector3& position)
+	{
+		AudioSource::setPosition(position);
+
+		// TODO
+	}
+
+	void OAAudioSource::setVelocity(const Vector3& velocity)
+	{
+		AudioSource::setVelocity(velocity);
+
+		// TODO
+	}
+
+	void OAAudioSource::setVolume(float volume)
+	{
+		AudioSource::setVolume(volume);
+
+		// TODO
+	}
+
+	void OAAudioSource::setPitch(float pitch)
+	{
+		AudioSource::setPitch(pitch);
+
+		// TODO
+	}
+
+	void OAAudioSource::setIsLooping(bool loop)
+	{
+		AudioSource::setIsLooping(loop);
+
+		// TODO
+	}
+
+	void OAAudioSource::setPriority(UINT32 priority)
+	{
+		AudioSource::setPriority(priority);
+
+		// TODO
+	}
+
+	void OAAudioSource::setMinDistance(float distance)
+	{
+		AudioSource::setMinDistance(distance);
+
+		// TODO
+	}
+
+	void OAAudioSource::setAttenuation(float attenuation)
+	{
+		AudioSource::setAttenuation(attenuation);
+
+		// TODO
+	}
+
+	void OAAudioSource::play()
+	{
+		AudioSource::play();
+
+		// TODO
+	}
+
+	void OAAudioSource::pause()
+	{
+		AudioSource::pause();
+
+		// TODO
+	}
+
+	void OAAudioSource::stop()
+	{
+		AudioSource::stop();
+
+		// TODO
+	}
+}