| 
									
										
										
										
											2018-02-01 22:07:44 +08:00
										 |  |  | #include "..\emanagers.h"
 | 
					
						
							|  |  |  | #include "..\etools.h"
 | 
					
						
							|  |  |  | #include <map>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static IXAudio2 * s_pXAudio2 = nullptr; | 
					
						
							|  |  |  | static IXAudio2MasteringVoice * s_pMasteringVoice = nullptr; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-07 16:37:12 +08:00
										 |  |  | typedef std::pair<UINT, e2d::Music *> MusicPair; | 
					
						
							|  |  |  | typedef std::map<UINT, e2d::Music *> MusicList; | 
					
						
							| 
									
										
										
										
											2018-02-01 22:07:44 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | static MusicList& getMusicList() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	static MusicList s_List; | 
					
						
							|  |  |  | 	return s_List; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-07 16:37:12 +08:00
										 |  |  | bool e2d::MusicManager::add(const String & strFilePath) | 
					
						
							| 
									
										
										
										
											2018-02-01 22:07:44 +08:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2018-02-07 16:37:12 +08:00
										 |  |  | 	Music * pPlayer = get(strFilePath); | 
					
						
							| 
									
										
										
										
											2018-02-01 22:07:44 +08:00
										 |  |  | 	if (pPlayer) | 
					
						
							|  |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2018-02-03 22:04:43 +08:00
										 |  |  | 		return true; | 
					
						
							| 
									
										
										
										
											2018-02-01 22:07:44 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	else | 
					
						
							|  |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2018-03-01 23:47:42 +08:00
										 |  |  | 		UINT nRet = strFilePath.getHashCode(); | 
					
						
							| 
									
										
										
										
											2018-02-07 16:37:12 +08:00
										 |  |  | 		pPlayer = new Music(); | 
					
						
							| 
									
										
										
										
											2018-02-01 22:07:44 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		if (pPlayer->_open(strFilePath)) | 
					
						
							|  |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2018-02-03 22:04:43 +08:00
										 |  |  | 			getMusicList().insert(MusicPair(nRet, pPlayer)); | 
					
						
							|  |  |  | 			return true; | 
					
						
							| 
									
										
										
										
											2018-02-01 22:07:44 +08:00
										 |  |  | 		} | 
					
						
							|  |  |  | 		else | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			delete pPlayer; | 
					
						
							| 
									
										
										
										
											2018-02-03 22:04:43 +08:00
										 |  |  | 			return false; | 
					
						
							| 
									
										
										
										
											2018-02-01 22:07:44 +08:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-07 16:37:12 +08:00
										 |  |  | e2d::Music * e2d::MusicManager::get(const String & strFilePath) | 
					
						
							| 
									
										
										
										
											2018-02-01 22:07:44 +08:00
										 |  |  | { | 
					
						
							|  |  |  | 	if (strFilePath.isEmpty()) | 
					
						
							|  |  |  | 		return nullptr; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-01 23:47:42 +08:00
										 |  |  | 	UINT nRet = strFilePath.getHashCode(); | 
					
						
							| 
									
										
										
										
											2018-02-01 22:07:44 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	if (getMusicList().end() != getMusicList().find(nRet)) | 
					
						
							|  |  |  | 		return getMusicList()[nRet]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return nullptr; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-07 16:37:12 +08:00
										 |  |  | void e2d::MusicManager::pauseAllMusics() | 
					
						
							| 
									
										
										
										
											2018-02-01 22:07:44 +08:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2018-02-03 22:04:43 +08:00
										 |  |  | 	for (auto iter : getMusicList()) | 
					
						
							| 
									
										
										
										
											2018-02-01 22:07:44 +08:00
										 |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2018-02-03 22:04:43 +08:00
										 |  |  | 		iter.second->pause(); | 
					
						
							| 
									
										
										
										
											2018-02-01 22:07:44 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-07 16:37:12 +08:00
										 |  |  | void e2d::MusicManager::resumeAllMusics() | 
					
						
							| 
									
										
										
										
											2018-02-01 22:07:44 +08:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2018-02-03 22:04:43 +08:00
										 |  |  | 	for (auto iter : getMusicList()) | 
					
						
							| 
									
										
										
										
											2018-02-01 22:07:44 +08:00
										 |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2018-02-03 22:04:43 +08:00
										 |  |  | 		iter.second->resume(); | 
					
						
							| 
									
										
										
										
											2018-02-01 22:07:44 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-07 16:37:12 +08:00
										 |  |  | void e2d::MusicManager::stopAllMusics() | 
					
						
							| 
									
										
										
										
											2018-02-01 22:07:44 +08:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2018-02-03 22:04:43 +08:00
										 |  |  | 	for (auto iter : getMusicList()) | 
					
						
							| 
									
										
										
										
											2018-02-01 22:07:44 +08:00
										 |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2018-02-03 22:04:43 +08:00
										 |  |  | 		iter.second->stop(); | 
					
						
							| 
									
										
										
										
											2018-02-01 22:07:44 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-07 16:37:12 +08:00
										 |  |  | IXAudio2 * e2d::MusicManager::getIXAudio2() | 
					
						
							| 
									
										
										
										
											2018-02-01 22:07:44 +08:00
										 |  |  | { | 
					
						
							|  |  |  | 	return s_pXAudio2; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-07 16:37:12 +08:00
										 |  |  | IXAudio2MasteringVoice * e2d::MusicManager::getIXAudio2MasteringVoice() | 
					
						
							| 
									
										
										
										
											2018-02-01 22:07:44 +08:00
										 |  |  | { | 
					
						
							|  |  |  | 	return s_pMasteringVoice; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-07 16:37:12 +08:00
										 |  |  | bool e2d::MusicManager::__init() | 
					
						
							| 
									
										
										
										
											2018-02-01 22:07:44 +08:00
										 |  |  | { | 
					
						
							|  |  |  | 	HRESULT hr; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (FAILED(hr = XAudio2Create(&s_pXAudio2, 0))) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		WARN_IF(true, "Failed to init XAudio2 engine"); | 
					
						
							|  |  |  | 		return false; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (FAILED(hr = s_pXAudio2->CreateMasteringVoice(&s_pMasteringVoice))) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		WARN_IF(true, "Failed creating mastering voice"); | 
					
						
							|  |  |  | 		SafeReleaseInterface(&s_pXAudio2); | 
					
						
							|  |  |  | 		return false; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return true; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-07 16:37:12 +08:00
										 |  |  | void e2d::MusicManager::__uninit() | 
					
						
							| 
									
										
										
										
											2018-02-01 22:07:44 +08:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2018-02-03 22:04:43 +08:00
										 |  |  | 	for (auto iter : getMusicList()) | 
					
						
							| 
									
										
										
										
											2018-02-01 22:07:44 +08:00
										 |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2018-02-03 22:04:43 +08:00
										 |  |  | 		iter.second->_close(); | 
					
						
							|  |  |  | 		delete iter.second; | 
					
						
							| 
									
										
										
										
											2018-02-01 22:07:44 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	getMusicList().clear(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (s_pMasteringVoice) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		s_pMasteringVoice->DestroyVoice(); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	SafeReleaseInterface(&s_pXAudio2); | 
					
						
							|  |  |  | } |