增加Audio类
This commit is contained in:
		
							parent
							
								
									2e161ff6a8
								
							
						
					
					
						commit
						637fe89e37
					
				|  | @ -0,0 +1,60 @@ | |||
| #include "..\e2dbase.h" | ||||
| 
 | ||||
| 
 | ||||
| e2d::Audio * e2d::Audio::_instance = nullptr; | ||||
| 
 | ||||
| e2d::Audio * e2d::Audio::getInstance() | ||||
| { | ||||
| 	if (!_instance) | ||||
| 	{ | ||||
| 		_instance = new (std::nothrow) Audio; | ||||
| 	} | ||||
| 	return _instance; | ||||
| } | ||||
| 
 | ||||
| void e2d::Audio::destroyInstance() | ||||
| { | ||||
| 	if (_instance) | ||||
| 	{ | ||||
| 		delete _instance; | ||||
| 		_instance = nullptr; | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| IXAudio2 * e2d::Audio::getXAudio2() | ||||
| { | ||||
| 	return _xAudio2; | ||||
| } | ||||
| 
 | ||||
| IXAudio2MasteringVoice * e2d::Audio::getMasteringVoice() | ||||
| { | ||||
| 	return _masteringVoice; | ||||
| } | ||||
| 
 | ||||
| e2d::Audio::Audio() | ||||
| 	: _xAudio2(nullptr) | ||||
| 	, _masteringVoice(nullptr) | ||||
| { | ||||
| 	::CoInitialize(nullptr); | ||||
| 
 | ||||
| 	ThrowIfFailed( | ||||
| 		XAudio2Create(&_xAudio2, 0) | ||||
| 	); | ||||
| 
 | ||||
| 	ThrowIfFailed( | ||||
| 		_xAudio2->CreateMasteringVoice(&_masteringVoice) | ||||
| 	); | ||||
| } | ||||
| 
 | ||||
| e2d::Audio::~Audio() | ||||
| { | ||||
| 	if (_masteringVoice) | ||||
| 	{ | ||||
| 		_masteringVoice->DestroyVoice(); | ||||
| 		_masteringVoice = nullptr; | ||||
| 	} | ||||
| 
 | ||||
| 	SafeRelease(_xAudio2); | ||||
| 
 | ||||
| 	::CoUninitialize(); | ||||
| } | ||||
|  | @ -22,6 +22,12 @@ void operator delete(void * block, e2d::autorelease_t const &) E2D_NOEXCEPT | |||
| } | ||||
| 
 | ||||
| 
 | ||||
| e2d::GC * e2d::GC::getInstance() | ||||
| { | ||||
| 	static GC _instance; | ||||
| 	return &_instance; | ||||
| } | ||||
| 
 | ||||
| e2d::GC::GC() | ||||
| 	: _notifyed(false) | ||||
| 	, _cleanup(false) | ||||
|  | @ -32,12 +38,29 @@ e2d::GC::GC() | |||
| e2d::GC::~GC() | ||||
| { | ||||
| 	// 删除所有对象
 | ||||
| 	this->clear(); | ||||
| 	Game::getInstance()->clearAllScenes(); | ||||
| 	Timer::getInstance()->clearAllTasks(); | ||||
| 	ActionManager::getInstance()->clearAll(); | ||||
| 
 | ||||
| 	// 헌뇜暠튬뻠닸
 | ||||
| 	_cleanup = true; | ||||
| 	for (const auto& ref : _pool) | ||||
| 	{ | ||||
| 		delete ref; | ||||
| 	} | ||||
| 	_pool.clear(); | ||||
| 	_cleanup = false; | ||||
| 
 | ||||
| 	// 헌뇜뻠닸
 | ||||
| 	Image::clearCache(); | ||||
| } | ||||
| 
 | ||||
| 	// 헌뇜데절
 | ||||
| 	Player::destroyInstance(); | ||||
| 	Audio::destroyInstance(); | ||||
| 	Renderer::destroyInstance(); | ||||
| 	Input::destroyInstance(); | ||||
| 	Window::destroyInstance(); | ||||
| 	Game::destroyInstance(); | ||||
| } | ||||
| 
 | ||||
| void e2d::GC::flush() | ||||
| { | ||||
|  | @ -59,37 +82,6 @@ void e2d::GC::flush() | |||
| 	} | ||||
| } | ||||
| 
 | ||||
| void e2d::GC::clear() | ||||
| { | ||||
| 	_cleanup = true; | ||||
| 
 | ||||
| 	Game::getInstance()->clearAllScenes(); | ||||
| 	Timer::getInstance()->clearAllTasks(); | ||||
| 	ActionManager::getInstance()->clearAll(); | ||||
| 
 | ||||
| 	for (const auto& ref : _pool) | ||||
| 	{ | ||||
| 		delete ref; | ||||
| 	} | ||||
| 	_pool.clear(); | ||||
| 	_cleanup = false; | ||||
| 
 | ||||
| 	// 헌뇜뻠닸
 | ||||
| 	Image::clearCache(); | ||||
| 
 | ||||
| 	// 헌뇜데절
 | ||||
| 	Game::destroyInstance(); | ||||
| 	Renderer::destroyInstance(); | ||||
| 	Input::destroyInstance(); | ||||
| 	Window::destroyInstance(); | ||||
| } | ||||
| 
 | ||||
| e2d::GC * e2d::GC::getInstance() | ||||
| { | ||||
| 	static GC _instance; | ||||
| 	return &_instance; | ||||
| } | ||||
| 
 | ||||
| void e2d::GC::autorelease(Ref * ref) | ||||
| { | ||||
| 	if (ref) | ||||
|  |  | |||
|  | @ -22,44 +22,6 @@ inline bool TraceError(wchar_t* sPrompt, HRESULT hr) | |||
| } | ||||
| 
 | ||||
| 
 | ||||
| e2d::Music::XAudio2Tool::XAudio2Tool() | ||||
| { | ||||
| 	::CoInitialize(nullptr); | ||||
| 
 | ||||
| 	ThrowIfFailed( | ||||
| 		XAudio2Create(&_xAudio2, 0) | ||||
| 	); | ||||
| 
 | ||||
| 	ThrowIfFailed( | ||||
| 		_xAudio2->CreateMasteringVoice(&_masteringVoice) | ||||
| 	); | ||||
| } | ||||
| 
 | ||||
| e2d::Music::XAudio2Tool::~XAudio2Tool() | ||||
| { | ||||
| 	_masteringVoice->DestroyVoice(); | ||||
| 	_xAudio2->Release(); | ||||
| 
 | ||||
| 	::CoUninitialize(); | ||||
| } | ||||
| 
 | ||||
| e2d::Music::XAudio2Tool* e2d::Music::XAudio2Tool::getInstance() | ||||
| { | ||||
| 	static XAudio2Tool instance; | ||||
| 	return &instance; | ||||
| } | ||||
| 
 | ||||
| IXAudio2 * e2d::Music::XAudio2Tool::getXAudio2() | ||||
| { | ||||
| 	return _xAudio2; | ||||
| } | ||||
| 
 | ||||
| IXAudio2MasteringVoice * e2d::Music::XAudio2Tool::getMasteringVoice() | ||||
| { | ||||
| 	return _masteringVoice; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| e2d::Music::Music() | ||||
| 	: _opened(false) | ||||
| 	, _wfx(nullptr) | ||||
|  | @ -70,8 +32,6 @@ e2d::Music::Music() | |||
| 	, _voice(nullptr) | ||||
| 	, _voiceCallback() | ||||
| { | ||||
| 	auto xAudio2 = XAudio2Tool::getInstance()->getXAudio2(); | ||||
| 	xAudio2->AddRef(); | ||||
| } | ||||
| 
 | ||||
| e2d::Music::Music(const e2d::String & filePath) | ||||
|  | @ -84,9 +44,6 @@ e2d::Music::Music(const e2d::String & filePath) | |||
| 	, _voice(nullptr) | ||||
| 	, _voiceCallback() | ||||
| { | ||||
| 	auto xAudio2 = XAudio2Tool::getInstance()->getXAudio2(); | ||||
| 	xAudio2->AddRef(); | ||||
| 
 | ||||
| 	this->open(filePath); | ||||
| } | ||||
| 
 | ||||
|  | @ -100,18 +57,12 @@ e2d::Music::Music(const Resource& res) | |||
| 	, _voice(nullptr) | ||||
| 	, _voiceCallback() | ||||
| { | ||||
| 	auto xAudio2 = XAudio2Tool::getInstance()->getXAudio2(); | ||||
| 	xAudio2->AddRef(); | ||||
| 
 | ||||
| 	this->open(res); | ||||
| } | ||||
| 
 | ||||
| e2d::Music::~Music() | ||||
| { | ||||
| 	close(); | ||||
| 
 | ||||
| 	auto xAudio2 = XAudio2Tool::getInstance()->getXAudio2(); | ||||
| 	xAudio2->Release(); | ||||
| } | ||||
| 
 | ||||
| bool e2d::Music::open(const e2d::String & filePath) | ||||
|  | @ -173,7 +124,7 @@ bool e2d::Music::open(const e2d::String & filePath) | |||
| 	} | ||||
| 
 | ||||
| 	// ´´½¨ÒôÔ´
 | ||||
| 	auto xAudio2 = XAudio2Tool::getInstance()->getXAudio2(); | ||||
| 	auto xAudio2 = Audio::getInstance()->getXAudio2(); | ||||
| 	HRESULT hr = xAudio2->CreateSourceVoice(&_voice, _wfx, 0, XAUDIO2_DEFAULT_FREQ_RATIO, &_voiceCallback); | ||||
| 
 | ||||
| 	if (FAILED(hr)) | ||||
|  | @ -251,7 +202,7 @@ bool e2d::Music::open(const Resource& res) | |||
| 	} | ||||
| 
 | ||||
| 	// ´´½¨ÒôÔ´
 | ||||
| 	auto xAudio2 = XAudio2Tool::getInstance()->getXAudio2(); | ||||
| 	auto xAudio2 = Audio::getInstance()->getXAudio2(); | ||||
| 	HRESULT hr = xAudio2->CreateSourceVoice(&_voice, _wfx, 0, XAUDIO2_DEFAULT_FREQ_RATIO, &_voiceCallback); | ||||
| 
 | ||||
| 	if (FAILED(hr)) | ||||
|  |  | |||
|  | @ -1,6 +1,26 @@ | |||
| #include "..\e2dtool.h" | ||||
| 
 | ||||
| 
 | ||||
| e2d::Player * e2d::Player::_instance = nullptr; | ||||
| 
 | ||||
| e2d::Player * e2d::Player::getInstance() | ||||
| { | ||||
| 	if (!_instance) | ||||
| 	{ | ||||
| 		_instance = new (std::nothrow) Player; | ||||
| 	} | ||||
| 	return _instance; | ||||
| } | ||||
| 
 | ||||
| void e2d::Player::destroyInstance() | ||||
| { | ||||
| 	if (_instance) | ||||
| 	{ | ||||
| 		delete _instance; | ||||
| 		_instance = nullptr; | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| e2d::Player::Player() | ||||
| 	: _volume(1.f) | ||||
| { | ||||
|  | @ -15,8 +35,6 @@ e2d::Player::~Player() | |||
| 			delete pair.second; | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	CoUninitialize(); | ||||
| } | ||||
| 
 | ||||
| bool e2d::Player::preload(const String & filePath) | ||||
|  |  | |||
							
								
								
									
										152
									
								
								core/e2dbase.h
								
								
								
								
							
							
						
						
									
										152
									
								
								core/e2dbase.h
								
								
								
								
							|  | @ -139,65 +139,6 @@ private: | |||
| }; | ||||
| 
 | ||||
| 
 | ||||
| // 输入设备
 | ||||
| class Input | ||||
| { | ||||
| public: | ||||
| 	// 获取输入设备实例
 | ||||
| 	static Input * getInstance(); | ||||
| 
 | ||||
| 	// 销毁输入设备实例
 | ||||
| 	static void destroyInstance(); | ||||
| 
 | ||||
| 	// 检测键盘某按键是否正被按下
 | ||||
| 	bool isDown( | ||||
| 		KeyCode key | ||||
| 	); | ||||
| 
 | ||||
| 	// 检测鼠标按键是否正被按下
 | ||||
| 	bool isDown( | ||||
| 		MouseCode code | ||||
| 	); | ||||
| 
 | ||||
| 	// 获得鼠标X轴坐标值
 | ||||
| 	float getMouseX(); | ||||
| 
 | ||||
| 	// 获得鼠标Y轴坐标值
 | ||||
| 	float getMouseY(); | ||||
| 
 | ||||
| 	// 获得鼠标坐标值
 | ||||
| 	Point getMousePos(); | ||||
| 
 | ||||
| 	// 获得鼠标X轴坐标增量
 | ||||
| 	float getMouseDeltaX(); | ||||
| 
 | ||||
| 	// 获得鼠标Y轴坐标增量
 | ||||
| 	float getMouseDeltaY(); | ||||
| 
 | ||||
| 	// 获得鼠标Z轴(鼠标滚轮)坐标增量
 | ||||
| 	float getMouseDeltaZ(); | ||||
| 
 | ||||
| 	// 刷新输入设备状态
 | ||||
| 	void update(); | ||||
| 
 | ||||
| protected: | ||||
| 	Input(); | ||||
| 
 | ||||
| 	~Input(); | ||||
| 
 | ||||
| 	E2D_DISABLE_COPY(Input); | ||||
| 
 | ||||
| protected: | ||||
| 	IDirectInput8W* _directInput; | ||||
| 	IDirectInputDevice8W* _keyboardDevice; | ||||
| 	IDirectInputDevice8W* _mouseDevice; | ||||
| 	DIMOUSESTATE _mouseState; | ||||
| 	char _keyBuffer[256]; | ||||
| 
 | ||||
| 	static Input * _instance; | ||||
| }; | ||||
| 
 | ||||
| 
 | ||||
| // 渲染器
 | ||||
| class Renderer | ||||
| { | ||||
|  | @ -283,6 +224,96 @@ protected: | |||
| }; | ||||
| 
 | ||||
| 
 | ||||
| // 输入设备
 | ||||
| class Input | ||||
| { | ||||
| public: | ||||
| 	// 获取输入设备实例
 | ||||
| 	static Input * getInstance(); | ||||
| 
 | ||||
| 	// 销毁输入设备实例
 | ||||
| 	static void destroyInstance(); | ||||
| 
 | ||||
| 	// 检测键盘某按键是否正被按下
 | ||||
| 	bool isDown( | ||||
| 		KeyCode key | ||||
| 	); | ||||
| 
 | ||||
| 	// 检测鼠标按键是否正被按下
 | ||||
| 	bool isDown( | ||||
| 		MouseCode code | ||||
| 	); | ||||
| 
 | ||||
| 	// 获得鼠标X轴坐标值
 | ||||
| 	float getMouseX(); | ||||
| 
 | ||||
| 	// 获得鼠标Y轴坐标值
 | ||||
| 	float getMouseY(); | ||||
| 
 | ||||
| 	// 获得鼠标坐标值
 | ||||
| 	Point getMousePos(); | ||||
| 
 | ||||
| 	// 获得鼠标X轴坐标增量
 | ||||
| 	float getMouseDeltaX(); | ||||
| 
 | ||||
| 	// 获得鼠标Y轴坐标增量
 | ||||
| 	float getMouseDeltaY(); | ||||
| 
 | ||||
| 	// 获得鼠标Z轴(鼠标滚轮)坐标增量
 | ||||
| 	float getMouseDeltaZ(); | ||||
| 
 | ||||
| 	// 刷新输入设备状态
 | ||||
| 	void update(); | ||||
| 
 | ||||
| protected: | ||||
| 	Input(); | ||||
| 
 | ||||
| 	~Input(); | ||||
| 
 | ||||
| 	E2D_DISABLE_COPY(Input); | ||||
| 
 | ||||
| protected: | ||||
| 	IDirectInput8W * _directInput; | ||||
| 	IDirectInputDevice8W* _keyboardDevice; | ||||
| 	IDirectInputDevice8W* _mouseDevice; | ||||
| 	DIMOUSESTATE _mouseState; | ||||
| 	char _keyBuffer[256]; | ||||
| 
 | ||||
| 	static Input * _instance; | ||||
| }; | ||||
| 
 | ||||
| 
 | ||||
| // 音频设备
 | ||||
| class Audio | ||||
| { | ||||
| public: | ||||
| 	// 获取音频设备实例
 | ||||
| 	static Audio * getInstance(); | ||||
| 
 | ||||
| 	// 销毁实例
 | ||||
| 	static void destroyInstance(); | ||||
| 
 | ||||
| 	// 获取 XAudio2 实例对象
 | ||||
| 	IXAudio2 * getXAudio2(); | ||||
| 
 | ||||
| 	// 获取 MasteringVoice 实例对象
 | ||||
| 	IXAudio2MasteringVoice* getMasteringVoice(); | ||||
| 
 | ||||
| protected: | ||||
| 	Audio(); | ||||
| 
 | ||||
| 	virtual ~Audio(); | ||||
| 
 | ||||
| 	E2D_DISABLE_COPY(Audio); | ||||
| 
 | ||||
| protected: | ||||
| 	IXAudio2 * _xAudio2; | ||||
| 	IXAudio2MasteringVoice* _masteringVoice; | ||||
| 
 | ||||
| 	static Audio * _instance; | ||||
| }; | ||||
| 
 | ||||
| 
 | ||||
| class Timer; | ||||
| class ActionManager; | ||||
| class Scene; | ||||
|  | @ -395,9 +426,6 @@ public: | |||
| 	// 刷新内存池
 | ||||
| 	void flush(); | ||||
| 
 | ||||
| 	// 回收内存池中的所有对象
 | ||||
| 	void clear(); | ||||
| 
 | ||||
| private: | ||||
| 	GC(); | ||||
| 
 | ||||
|  |  | |||
|  | @ -115,27 +115,6 @@ public: | |||
| 	// 삿혤 IXAudio2SourceVoice 뚤蹶
 | ||||
| 	IXAudio2SourceVoice * getIXAudio2SourceVoice() const; | ||||
| 
 | ||||
| public: | ||||
| 	class XAudio2Tool | ||||
| 	{ | ||||
| 	public: | ||||
| 		XAudio2Tool(); | ||||
| 
 | ||||
| 		~XAudio2Tool(); | ||||
| 
 | ||||
| 		static XAudio2Tool* getInstance(); | ||||
| 
 | ||||
| 		// 获取 XAudio2 实例对象
 | ||||
| 		IXAudio2 * getXAudio2(); | ||||
| 
 | ||||
| 		// 获取 MasteringVoice 实例对象
 | ||||
| 		IXAudio2MasteringVoice* getMasteringVoice(); | ||||
| 
 | ||||
| 	protected: | ||||
| 		IXAudio2 * _xAudio2; | ||||
| 		IXAudio2MasteringVoice* _masteringVoice; | ||||
| 	}; | ||||
| 
 | ||||
| protected: | ||||
| 	bool _readMMIO(); | ||||
| 
 | ||||
|  | @ -169,12 +148,12 @@ protected: | |||
| // 稜있꺄렴포
 | ||||
| class Player | ||||
| { | ||||
| 	friend class Game; | ||||
| 
 | ||||
| public: | ||||
| 	Player(); | ||||
| 	// 获取播放器实例
 | ||||
| 	static Player * getInstance(); | ||||
| 
 | ||||
| 	~Player(); | ||||
| 	// 销毁实例
 | ||||
| 	static void destroyInstance(); | ||||
| 
 | ||||
| 	// 渡속潼稜있栗都
 | ||||
| 	bool preload( | ||||
|  | @ -258,9 +237,18 @@ public: | |||
| 	// 헌왕稜있뻠닸
 | ||||
| 	void clearCache(); | ||||
| 
 | ||||
| private: | ||||
| protected: | ||||
| 	Player(); | ||||
| 
 | ||||
| 	~Player(); | ||||
| 
 | ||||
| 	E2D_DISABLE_COPY(Player); | ||||
| 
 | ||||
| protected: | ||||
| 	float _volume; | ||||
| 	std::map<size_t, Music*> _musicList; | ||||
| 
 | ||||
| 	static Player * _instance; | ||||
| }; | ||||
| 
 | ||||
| 
 | ||||
|  |  | |||
|  | @ -51,6 +51,7 @@ | |||
|     <ClCompile Include="..\..\core\Action\ScaleTo.cpp" /> | ||||
|     <ClCompile Include="..\..\core\Action\Sequence.cpp" /> | ||||
|     <ClCompile Include="..\..\core\Action\Spawn.cpp" /> | ||||
|     <ClCompile Include="..\..\core\Base\Audio.cpp" /> | ||||
|     <ClCompile Include="..\..\core\Base\Game.cpp" /> | ||||
|     <ClCompile Include="..\..\core\Base\GC.cpp" /> | ||||
|     <ClCompile Include="..\..\core\Base\Input.cpp" /> | ||||
|  |  | |||
|  | @ -238,5 +238,8 @@ | |||
|     <ClCompile Include="..\..\core\Node\Canvas.cpp"> | ||||
|       <Filter>Node</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="..\..\core\Base\Audio.cpp"> | ||||
|       <Filter>Base</Filter> | ||||
|     </ClCompile> | ||||
|   </ItemGroup> | ||||
| </Project> | ||||
|  | @ -195,6 +195,7 @@ | |||
|     <ClCompile Include="..\..\core\Action\ScaleTo.cpp" /> | ||||
|     <ClCompile Include="..\..\core\Action\Sequence.cpp" /> | ||||
|     <ClCompile Include="..\..\core\Action\Spawn.cpp" /> | ||||
|     <ClCompile Include="..\..\core\Base\Audio.cpp" /> | ||||
|     <ClCompile Include="..\..\core\Base\Game.cpp" /> | ||||
|     <ClCompile Include="..\..\core\Base\GC.cpp" /> | ||||
|     <ClCompile Include="..\..\core\Base\Input.cpp" /> | ||||
|  |  | |||
|  | @ -238,5 +238,8 @@ | |||
|     <ClCompile Include="..\..\core\Node\Canvas.cpp"> | ||||
|       <Filter>Node</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="..\..\core\Base\Audio.cpp"> | ||||
|       <Filter>Base</Filter> | ||||
|     </ClCompile> | ||||
|   </ItemGroup> | ||||
| </Project> | ||||
|  | @ -215,6 +215,7 @@ | |||
|     <ClCompile Include="..\..\core\Action\Sequence.cpp" /> | ||||
|     <ClCompile Include="..\..\core\Action\FiniteTimeAction.cpp" /> | ||||
|     <ClCompile Include="..\..\core\Action\Spawn.cpp" /> | ||||
|     <ClCompile Include="..\..\core\Base\Audio.cpp" /> | ||||
|     <ClCompile Include="..\..\core\Base\Game.cpp" /> | ||||
|     <ClCompile Include="..\..\core\Base\GC.cpp" /> | ||||
|     <ClCompile Include="..\..\core\Base\Input.cpp" /> | ||||
|  |  | |||
|  | @ -231,6 +231,9 @@ | |||
|     <ClCompile Include="..\..\core\Node\Canvas.cpp"> | ||||
|       <Filter>Node</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="..\..\core\Base\Audio.cpp"> | ||||
|       <Filter>Base</Filter> | ||||
|     </ClCompile> | ||||
|   </ItemGroup> | ||||
|   <ItemGroup> | ||||
|     <ClInclude Include="..\..\core\easy2d.h" /> | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue