增加从程序资源读取音乐的功能
This commit is contained in:
parent
2eb845a4df
commit
69f6172fa0
|
|
@ -36,7 +36,12 @@ public:
|
||||||
virtual ~MusicPlayer();
|
virtual ~MusicPlayer();
|
||||||
|
|
||||||
bool open(
|
bool open(
|
||||||
e2d::String strFileName
|
const e2d::String& strFileName
|
||||||
|
);
|
||||||
|
|
||||||
|
bool MusicPlayer::open(
|
||||||
|
int resNameId,
|
||||||
|
const e2d::String& resType
|
||||||
);
|
);
|
||||||
|
|
||||||
bool play(
|
bool play(
|
||||||
|
|
@ -88,10 +93,16 @@ protected:
|
||||||
|
|
||||||
typedef std::map<UINT, MusicPlayer *> MusicMap;
|
typedef std::map<UINT, MusicPlayer *> MusicMap;
|
||||||
|
|
||||||
static MusicMap& GetMusicList()
|
static MusicMap& GetMusicFileList()
|
||||||
{
|
{
|
||||||
static MusicMap s_List;
|
static MusicMap s_MusicFileList;
|
||||||
return s_List;
|
return s_MusicFileList;
|
||||||
|
}
|
||||||
|
|
||||||
|
static MusicMap& GetMusicResList()
|
||||||
|
{
|
||||||
|
static MusicMap s_MusicResList;
|
||||||
|
return s_MusicResList;
|
||||||
}
|
}
|
||||||
|
|
||||||
MusicPlayer::MusicPlayer()
|
MusicPlayer::MusicPlayer()
|
||||||
|
|
@ -111,7 +122,7 @@ MusicPlayer::~MusicPlayer()
|
||||||
close();
|
close();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool MusicPlayer::open(e2d::String strFileName)
|
bool MusicPlayer::open(const e2d::String& strFileName)
|
||||||
{
|
{
|
||||||
if (m_bOpened)
|
if (m_bOpened)
|
||||||
{
|
{
|
||||||
|
|
@ -183,6 +194,86 @@ bool MusicPlayer::open(e2d::String strFileName)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool MusicPlayer::open(int resNameId, const e2d::String& resType)
|
||||||
|
{
|
||||||
|
HRSRC hResInfo;
|
||||||
|
HGLOBAL hResData;
|
||||||
|
DWORD dwSize;
|
||||||
|
void* pvRes;
|
||||||
|
|
||||||
|
if (m_bOpened)
|
||||||
|
{
|
||||||
|
WARN_IF(true, "MusicInfo can be opened only once!");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!s_pXAudio2)
|
||||||
|
{
|
||||||
|
WARN_IF(true, "IXAudio2 nullptr pointer error!");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Loading it as a file failed, so try it as a resource
|
||||||
|
if (nullptr == (hResInfo = FindResourceW(HINST_THISCOMPONENT, MAKEINTRESOURCE(resNameId), resType)))
|
||||||
|
return TraceError(L"FindResource");
|
||||||
|
|
||||||
|
if (nullptr == (hResData = LoadResource(HINST_THISCOMPONENT, hResInfo)))
|
||||||
|
return TraceError(L"LoadResource");
|
||||||
|
|
||||||
|
if (0 == (dwSize = SizeofResource(HINST_THISCOMPONENT, hResInfo)))
|
||||||
|
return TraceError(L"SizeofResource");
|
||||||
|
|
||||||
|
if (nullptr == (pvRes = LockResource(hResData)))
|
||||||
|
return TraceError(L"LockResource");
|
||||||
|
|
||||||
|
m_pResourceBuffer = new CHAR[dwSize];
|
||||||
|
memcpy(m_pResourceBuffer, pvRes, dwSize);
|
||||||
|
|
||||||
|
MMIOINFO mmioInfo;
|
||||||
|
ZeroMemory(&mmioInfo, sizeof(mmioInfo));
|
||||||
|
mmioInfo.fccIOProc = FOURCC_MEM;
|
||||||
|
mmioInfo.cchBuffer = dwSize;
|
||||||
|
mmioInfo.pchBuffer = (CHAR*)m_pResourceBuffer;
|
||||||
|
|
||||||
|
m_hmmio = mmioOpen(nullptr, &mmioInfo, MMIO_ALLOCBUF | MMIO_READ);
|
||||||
|
|
||||||
|
if (!_readMMIO())
|
||||||
|
{
|
||||||
|
// ReadMMIO will fail if its an not a wave file
|
||||||
|
mmioClose(m_hmmio, 0);
|
||||||
|
return TraceError(L"ReadMMIO");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!_resetFile())
|
||||||
|
return TraceError(L"ResetFile");
|
||||||
|
|
||||||
|
// After the reset, the size of the wav file is m_ck.cksize so store it now
|
||||||
|
m_dwSize = m_ck.cksize;
|
||||||
|
|
||||||
|
// Read the sample data into memory
|
||||||
|
m_pbWaveData = new BYTE[m_dwSize];
|
||||||
|
|
||||||
|
if (!_read(m_pbWaveData, m_dwSize))
|
||||||
|
{
|
||||||
|
TraceError(L"Failed to read WAV data");
|
||||||
|
SAFE_DELETE_ARRAY(m_pbWaveData);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ´´½¨ÒôÔ´
|
||||||
|
HRESULT hr;
|
||||||
|
if (FAILED(hr = s_pXAudio2->CreateSourceVoice(&m_pSourceVoice, m_pwfx)))
|
||||||
|
{
|
||||||
|
TraceError(L"Create source voice error", hr);
|
||||||
|
SAFE_DELETE_ARRAY(m_pbWaveData);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_bOpened = true;
|
||||||
|
m_bPlaying = false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
bool MusicPlayer::play(int nLoopCount)
|
bool MusicPlayer::play(int nLoopCount)
|
||||||
{
|
{
|
||||||
if (!m_bOpened)
|
if (!m_bOpened)
|
||||||
|
|
@ -518,7 +609,7 @@ bool e2d::Music::preload(String strFilePath)
|
||||||
{
|
{
|
||||||
UINT nRet = strFilePath.getHashCode();
|
UINT nRet = strFilePath.getHashCode();
|
||||||
|
|
||||||
if (GetMusicList().end() != GetMusicList().find(nRet))
|
if (GetMusicFileList().end() != GetMusicFileList().find(nRet))
|
||||||
{
|
{
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
@ -529,7 +620,32 @@ bool e2d::Music::preload(String strFilePath)
|
||||||
if (pPlayer->open(strFilePath))
|
if (pPlayer->open(strFilePath))
|
||||||
{
|
{
|
||||||
pPlayer->setVolume(s_fMusicVolume);
|
pPlayer->setVolume(s_fMusicVolume);
|
||||||
GetMusicList().insert(std::pair<UINT, MusicPlayer *>(nRet, pPlayer));
|
GetMusicFileList().insert(std::pair<UINT, MusicPlayer *>(nRet, pPlayer));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
delete pPlayer;
|
||||||
|
pPlayer = nullptr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool e2d::Music::preload(int resNameId, String resType)
|
||||||
|
{
|
||||||
|
if (GetMusicResList().end() != GetMusicResList().find(resNameId))
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
MusicPlayer * pPlayer = new (std::nothrow) MusicPlayer();
|
||||||
|
|
||||||
|
if (pPlayer->open(resNameId, resType))
|
||||||
|
{
|
||||||
|
pPlayer->setVolume(s_fMusicVolume);
|
||||||
|
GetMusicResList().insert(std::pair<UINT, MusicPlayer *>(resNameId, pPlayer));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
@ -546,7 +662,20 @@ bool e2d::Music::play(String strFilePath, int nLoopCount)
|
||||||
if (Music::preload(strFilePath))
|
if (Music::preload(strFilePath))
|
||||||
{
|
{
|
||||||
UINT nRet = strFilePath.getHashCode();
|
UINT nRet = strFilePath.getHashCode();
|
||||||
auto pMusic = GetMusicList()[nRet];
|
auto pMusic = GetMusicFileList()[nRet];
|
||||||
|
if (pMusic->play(nLoopCount))
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool e2d::Music::play(int resNameId, String resType, int nLoopCount)
|
||||||
|
{
|
||||||
|
if (Music::preload(resNameId, resType))
|
||||||
|
{
|
||||||
|
auto pMusic = GetMusicResList()[resNameId];
|
||||||
if (pMusic->play(nLoopCount))
|
if (pMusic->play(nLoopCount))
|
||||||
{
|
{
|
||||||
return true;
|
return true;
|
||||||
|
|
@ -562,8 +691,14 @@ void e2d::Music::pause(String strFilePath)
|
||||||
|
|
||||||
UINT nRet = strFilePath.getHashCode();
|
UINT nRet = strFilePath.getHashCode();
|
||||||
|
|
||||||
if (GetMusicList().end() != GetMusicList().find(nRet))
|
if (GetMusicFileList().end() != GetMusicFileList().find(nRet))
|
||||||
GetMusicList()[nRet]->pause();
|
GetMusicFileList()[nRet]->pause();
|
||||||
|
}
|
||||||
|
|
||||||
|
void e2d::Music::pause(int resNameId, String resType)
|
||||||
|
{
|
||||||
|
if (GetMusicResList().end() != GetMusicResList().find(resNameId))
|
||||||
|
GetMusicResList()[resNameId]->pause();
|
||||||
}
|
}
|
||||||
|
|
||||||
void e2d::Music::resume(String strFilePath)
|
void e2d::Music::resume(String strFilePath)
|
||||||
|
|
@ -573,8 +708,14 @@ void e2d::Music::resume(String strFilePath)
|
||||||
|
|
||||||
UINT nRet = strFilePath.getHashCode();
|
UINT nRet = strFilePath.getHashCode();
|
||||||
|
|
||||||
if (GetMusicList().end() != GetMusicList().find(nRet))
|
if (GetMusicFileList().end() != GetMusicFileList().find(nRet))
|
||||||
GetMusicList()[nRet]->resume();
|
GetMusicFileList()[nRet]->resume();
|
||||||
|
}
|
||||||
|
|
||||||
|
void e2d::Music::resume(int resNameId, String resType)
|
||||||
|
{
|
||||||
|
if (GetMusicResList().end() != GetMusicResList().find(resNameId))
|
||||||
|
GetMusicResList()[resNameId]->pause();
|
||||||
}
|
}
|
||||||
|
|
||||||
void e2d::Music::stop(String strFilePath)
|
void e2d::Music::stop(String strFilePath)
|
||||||
|
|
@ -584,8 +725,14 @@ void e2d::Music::stop(String strFilePath)
|
||||||
|
|
||||||
UINT nRet = strFilePath.getHashCode();
|
UINT nRet = strFilePath.getHashCode();
|
||||||
|
|
||||||
if (GetMusicList().end() != GetMusicList().find(nRet))
|
if (GetMusicFileList().end() != GetMusicFileList().find(nRet))
|
||||||
GetMusicList()[nRet]->stop();
|
GetMusicFileList()[nRet]->stop();
|
||||||
|
}
|
||||||
|
|
||||||
|
void e2d::Music::stop(int resNameId, String resType)
|
||||||
|
{
|
||||||
|
if (GetMusicResList().end() != GetMusicResList().find(resNameId))
|
||||||
|
GetMusicResList()[resNameId]->stop();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool e2d::Music::isPlaying(String strFilePath)
|
bool e2d::Music::isPlaying(String strFilePath)
|
||||||
|
|
@ -595,12 +742,19 @@ bool e2d::Music::isPlaying(String strFilePath)
|
||||||
|
|
||||||
UINT nRet = strFilePath.getHashCode();
|
UINT nRet = strFilePath.getHashCode();
|
||||||
|
|
||||||
if (GetMusicList().end() != GetMusicList().find(nRet))
|
if (GetMusicFileList().end() != GetMusicFileList().find(nRet))
|
||||||
return GetMusicList()[nRet]->isPlaying();
|
return GetMusicFileList()[nRet]->isPlaying();
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool e2d::Music::isPlaying(int resNameId, String resType)
|
||||||
|
{
|
||||||
|
if (GetMusicResList().end() != GetMusicResList().find(resNameId))
|
||||||
|
return GetMusicResList()[resNameId]->isPlaying();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
double e2d::Music::getVolume()
|
double e2d::Music::getVolume()
|
||||||
{
|
{
|
||||||
return s_fMusicVolume;
|
return s_fMusicVolume;
|
||||||
|
|
@ -609,7 +763,7 @@ double e2d::Music::getVolume()
|
||||||
void e2d::Music::setVolume(double fVolume)
|
void e2d::Music::setVolume(double fVolume)
|
||||||
{
|
{
|
||||||
s_fMusicVolume = min(max(static_cast<float>(fVolume), -224), 224);
|
s_fMusicVolume = min(max(static_cast<float>(fVolume), -224), 224);
|
||||||
for (auto pair : GetMusicList())
|
for (auto pair : GetMusicFileList())
|
||||||
{
|
{
|
||||||
pair.second->setVolume(s_fMusicVolume);
|
pair.second->setVolume(s_fMusicVolume);
|
||||||
}
|
}
|
||||||
|
|
@ -617,7 +771,7 @@ void e2d::Music::setVolume(double fVolume)
|
||||||
|
|
||||||
void e2d::Music::pauseAll()
|
void e2d::Music::pauseAll()
|
||||||
{
|
{
|
||||||
for (auto pair : GetMusicList())
|
for (auto pair : GetMusicFileList())
|
||||||
{
|
{
|
||||||
pair.second->pause();
|
pair.second->pause();
|
||||||
}
|
}
|
||||||
|
|
@ -625,7 +779,7 @@ void e2d::Music::pauseAll()
|
||||||
|
|
||||||
void e2d::Music::resumeAll()
|
void e2d::Music::resumeAll()
|
||||||
{
|
{
|
||||||
for (auto pair : GetMusicList())
|
for (auto pair : GetMusicFileList())
|
||||||
{
|
{
|
||||||
pair.second->resume();
|
pair.second->resume();
|
||||||
}
|
}
|
||||||
|
|
@ -633,7 +787,7 @@ void e2d::Music::resumeAll()
|
||||||
|
|
||||||
void e2d::Music::stopAll()
|
void e2d::Music::stopAll()
|
||||||
{
|
{
|
||||||
for (auto pair : GetMusicList())
|
for (auto pair : GetMusicFileList())
|
||||||
{
|
{
|
||||||
pair.second->stop();
|
pair.second->stop();
|
||||||
}
|
}
|
||||||
|
|
@ -671,13 +825,13 @@ bool e2d::Music::__init()
|
||||||
|
|
||||||
void e2d::Music::__uninit()
|
void e2d::Music::__uninit()
|
||||||
{
|
{
|
||||||
for (auto pair : GetMusicList())
|
for (auto pair : GetMusicFileList())
|
||||||
{
|
{
|
||||||
pair.second->close();
|
pair.second->close();
|
||||||
delete pair.second;
|
delete pair.second;
|
||||||
}
|
}
|
||||||
|
|
||||||
GetMusicList().clear();
|
GetMusicFileList().clear();
|
||||||
|
|
||||||
if (s_pMasteringVoice)
|
if (s_pMasteringVoice)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -63,32 +63,69 @@ public:
|
||||||
String strFilePath /* 音乐文件路径 */
|
String strFilePath /* 音乐文件路径 */
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// 渡속潼稜있栗都
|
||||||
|
static bool preload(
|
||||||
|
int resNameId, /* 稜있栗都츰냔 */
|
||||||
|
String resType /* 稜있栗都잚謹 */
|
||||||
|
);
|
||||||
|
|
||||||
// 播放音乐
|
// 播放音乐
|
||||||
static bool play(
|
static bool play(
|
||||||
String strFilePath, /* 音乐文件路径 */
|
String strFilePath, /* 音乐文件路径 */
|
||||||
int nLoopCount = 0 /* 重复播放次数,设置 -1 为循环播放 */
|
int nLoopCount = 0 /* 重复播放次数,设置 -1 为循环播放 */
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// 꺄렴稜있
|
||||||
|
static bool play(
|
||||||
|
int resNameId, /* 稜있栗都츰냔 */
|
||||||
|
String resType, /* 稜있栗都잚謹 */
|
||||||
|
int nLoopCount = 0 /* 路릿꺄렴늴鑒,<E99192>零 -1 槨琦뻔꺄렴 */
|
||||||
|
);
|
||||||
|
|
||||||
// 暂停音乐
|
// 暂停音乐
|
||||||
static void pause(
|
static void pause(
|
||||||
String strFilePath /* 音乐文件路径 */
|
String strFilePath /* 音乐文件路径 */
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// 董界稜있
|
||||||
|
static void pause(
|
||||||
|
int resNameId, /* 稜있栗都츰냔 */
|
||||||
|
String resType /* 稜있栗都잚謹 */
|
||||||
|
);
|
||||||
|
|
||||||
// 继续播放音乐
|
// 继续播放音乐
|
||||||
static void resume(
|
static void resume(
|
||||||
String strFilePath /* 音乐文件路径 */
|
String strFilePath /* 音乐文件路径 */
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// 셨崎꺄렴稜있
|
||||||
|
static void resume(
|
||||||
|
int resNameId, /* 稜있栗都츰냔 */
|
||||||
|
String resType /* 稜있栗都잚謹 */
|
||||||
|
);
|
||||||
|
|
||||||
// 停止音乐
|
// 停止音乐
|
||||||
static void stop(
|
static void stop(
|
||||||
String strFilePath /* 音乐文件路径 */
|
String strFilePath /* 音乐文件路径 */
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// 界岺稜있
|
||||||
|
static void stop(
|
||||||
|
int resNameId, /* 稜있栗都츰냔 */
|
||||||
|
String resType /* 稜있栗都잚謹 */
|
||||||
|
);
|
||||||
|
|
||||||
// 获取音乐播放状态
|
// 获取音乐播放状态
|
||||||
static bool isPlaying(
|
static bool isPlaying(
|
||||||
String strFilePath /* 音乐文件路径 */
|
String strFilePath /* 音乐文件路径 */
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// 삿혤稜있꺄렴榴檄
|
||||||
|
static bool isPlaying(
|
||||||
|
int resNameId, /* 稜있栗都츰냔 */
|
||||||
|
String resType /* 稜있栗都잚謹 */
|
||||||
|
);
|
||||||
|
|
||||||
// 获取音量
|
// 获取音量
|
||||||
static double getVolume();
|
static double getVolume();
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue