📄 msoundplayer.cpp
字号:
#include "MSoundPlayer.h"
void CMSoundPlayer::setResToolRef(CMResourceTool *pResTool) {
pResTool_ = pResTool;
}
void CMSoundPlayer::initialize(int nSoundCount) {
int i;
// 荤款靛 单捞磐狼 肮荐
nSoundCount_ = nSoundCount;
#ifdef LOAD_FROM_FILE
// 荤款靛 滚欺(Default 滚欺)
pSoundBuf_ = (byte **)MALLOC(sizeof(byte*)*nSoundCount_);
// 单捞磐 矫累痢(OFFSET)
pSoundStart_ = (int *)MALLOC(sizeof(int)*nSoundCount_);
// 单捞磐 农扁(LENGTH)
pSoundSize_ = (int *)MALLOC(sizeof(int)*nSoundCount_);
// 角力 单捞磐 农扁
pSoundRealSize_ = (int *)MALLOC(sizeof(int)*nSoundCount_);
// 荤款靛 滚欺 檬扁拳
for(i = 0; i < nSoundCount_; i++) {
pSoundBuf_[i] = NULL;
}
#else
// 荤款靛 府家胶
pSoundRes_ = (CMBinary **)MALLOC(sizeof(CMBinary*)*nSoundCount_);
for(i = 0; i < nSoundCount_; i++) {
pSoundRes_[i] = NULL;
}
#endif // LOAD_FROM_FILE
// KP6160 or SetInfo俊 措茄 滚欺
pSoundBuffArr_ = (AEESoundPlayerInfo *)MALLOC(sizeof(AEESoundPlayerInfo) );
pSoundBuffArr_->pData = NULL;
// 荤款靛 敲饭捞绢 牢胶畔胶绰 窍唱父 荤侩茄促.
ISHELL_CreateInstance(pIShell_, AEECLSID_SOUNDPLAYER, (void **)&pISoundPlayer_);
#ifndef USE_CALLBACK
totalPlayTimeMs_ = (int *)MALLOC(sizeof(int)*nSoundCount_);
for(i = 0; i < nSoundCount_; i++) {
totalPlayTimeMs_[i] = -1;
}
#endif // USE_CALLBACK
playPriority_ = (uint8 *)MALLOC(sizeof(uint8)*nSoundCount_);
// Play 快急鉴困 0栏肺 檬扁拳
for(i = 0; i < nSoundCount_; i++) {
playPriority_[i] = 0;
}
// 扁夯 Gap Delay
// 2005 0127 吝埃俊 荤款靛啊 救唱坷绰 泅惑.
// 荤款靛 敲饭捞 掉饭捞 辨捞 汲沥 促福霸.....
//nGapDelay_ = 300;
nGapDelay_ = 400;
nPlayingIndex_ = MYSOUND_PLAY_NOTHING;
initSoundData();
bSound_ = true;
#ifdef _6160_EXCEPTION
bIs6160_ = Is6160();
#endif
}
void CMSoundPlayer::finalize() {
stopSound();
int i;
#ifdef LOAD_FROM_FILE
for(i = 0; i < nSoundCount_; i++) {
freeSoundFile(i);
}
FREE(pSoundBuf_);
FREE(pSoundStart_);
FREE(pSoundSize_);
FREE(pSoundRealSize_);
#else
for(i = 0; i < nSoundCount_; i++) {
freeSoundRes(i);
}
if(pSoundRes_) {
FREE(pSoundRes_);
}
#endif // LOAD_FROM_FILE
if(pSoundBuffArr_ != NULL) {
if(pSoundBuffArr_->pData != NULL) {
FREE(pSoundBuffArr_->pData);
}
FREE(pSoundBuffArr_);
}
if(pISoundPlayer_ != NULL) {
ISOUNDPLAYER_Release(pISoundPlayer_);
}
#ifndef USE_CALLBACK
if(totalPlayTimeMs_) {
FREE(totalPlayTimeMs_);
totalPlayTimeMs_ = NULL;
}
#endif
if(playPriority_) {
FREE(playPriority_);
playPriority_ = NULL;
}
if(pResTool_){
delete pResTool_;
}
}
/*
// File俊辑 单捞磐 肺爹篮 沥秦柳 颇老 器杆阑 瘤淖阑 锭父 啊瓷窍促.
// 沥秦柳 颇老 器杆阑 瘤挪 颇老捞 捞固 粮犁秦具 茄促.
// 颇老篮 createSoundFileInfo 窃荐甫 捞侩窍咯 捍钦且 荤款靛 颇老甸狼 府胶飘父 舅搁 窍唱狼 颇老肺 捍钦 矫懦 荐 乐促.
// 颇老 器杆 : 1锅掳 单捞磐 农扁 4byte + 1锅掳 单捞磐 + 2锅掳 单捞磐 农扁 4byte + 2锅掳 单捞磐 + .... n 锅掳 ..
// 厚拘绵苞 拘绵篮 庆歹痹距捞 悼老窍促. 拘绵狼 版快 钦捍等 颇老 傈眉啊 拘绵捞 等 巴捞 酒聪扼
// 阿阿狼 捍钦瞪 颇老甸捞 拘绵捞 等 巴捞促. load 且锭 厚拘绵苞 拘绵篮 备盒窍咯 荐青茄促.
*/
#ifdef LOAD_FROM_FILE
// pSndFileName : 捍钦等 荤款靛 颇老 or 捍钦且 荤款靛 颇老(pMergeFileNames啊 粮犁且锭父 or 俊鼓俊辑父)
// pMergeFileNames : 捍钦且 荤款靛 颇老 捞抚甸狼 2瞒盔 硅凯 器牢磐(捞 皋辑靛俊辑绰 捞 器牢磐啊 曼炼窍绊
// 乐绰 皋葛府甫 秦力且 氓烙阑 瘤瘤 臼绰促.)
boolean CMSoundPlayer::createSoundFileInfo(char *pSndFileName, char **pMergeFileNames) {
pSoundFileName_ = pSndFileName;
// 俊鼓饭捞磐俊辑 荤款靛 颇老阑 捍钦茄促. 捍钦且 荤款靛 颇老甸狼 捞抚蔼捞 NULL捞 酒匆版快俊父...
// 捞何盒篮 迄俊辑绰 悼累登瘤 臼绰促.
if(pMergeFileNames) {
#ifdef AEE_SIMULATOR
createSoundFile(pSndFileName, pMergeFileNames);
#endif // AEE_SIMULATOR
}
// 捍钦等 荤款靛 单捞磐 颇老俊辑 阿阿狼 荤款靛狼 荤捞令客 困摹甫 茫酒郴绢 历厘茄促.
createSoundFileHead(pSndFileName);
return true;
}
#ifdef AEE_SIMULATOR
void CMSoundPlayer::createSoundFile(char *pTrgFileName, char **pSrcFileNames) {
IFileMgr *pIFileMgr = NULL;
IFile *pDestFile, *pSrcFile = NULL;
FileInfo fi;
byte *pBuf;
int i, nSize;
ISHELL_CreateInstance(pIShell_, AEECLSID_FILEMGR, (void**)&pIFileMgr);
pDestFile = IFILEMGR_OpenFile(pIFileMgr, pTrgFileName, _OFM_READWRITE);
// 颇老捞 捞固 粮犁窍搁 昏力茄促.
if ( pDestFile != NULL ) {
IFILE_Release(pDestFile);
IFILEMGR_Remove(pIFileMgr, pTrgFileName);
pDestFile = IFILEMGR_OpenFile(pIFileMgr, pTrgFileName, _OFM_READWRITE);
}
// 颇老捞 粮犁窍瘤 臼栏搁 积己
if ( pDestFile == NULL ) {
pDestFile = IFILEMGR_OpenFile(pIFileMgr, pTrgFileName, _OFM_CREATE);
} else {
return;
}
// 荤款靛 颇老 单捞磐 历厘
IFILE_Seek(pDestFile, _SEEK_START, 0);
for ( i=0; i<getSoundCount(); i++ )
{
pSrcFile = IFILEMGR_OpenFile(pIFileMgr, pSrcFileNames[i], _OFM_READ);
IFILE_GetInfo(pSrcFile, &fi);
if ( pBuf != NULL )
{
FREE(pBuf);
pBuf = NULL;
}
pBuf = (byte *)MALLOC(fi.dwSize);
nSize = fi.dwSize;
IFILE_Seek(pSrcFile, _SEEK_START, 0);
IFILE_Read(pSrcFile, (void *)pBuf, nSize);
IFILE_Write(pDestFile, &nSize, sizeof(int));
IFILE_Write(pDestFile, (void *)pBuf, nSize);
FREE(pBuf);
pBuf = NULL;
IFILE_Release(pSrcFile);
}
IFILE_Release(pDestFile);
IFILEMGR_Release(pIFileMgr);
}
#endif // AEE_SIMULATOR
boolean CMSoundPlayer::loadSoundFile(int nIndex, boolean bCompressed) {
#ifdef DEBUG_CODE_ENABLED
if ( (nIndex < 0) || (nIndex >= nSoundCount_) ) {
DBGPRINTF("[MSoundPlayer class]-[loadSoundFile func] : Out of index.");
return false;
}
#endif
if ( (nIndex < 0) || (nIndex >= nSoundCount_) || pSoundBuf_[nIndex] )
{
return false;
}
IFileMgr *pIFileMgr = NULL;
IFile *pIFile = NULL;
int nCurrentPoint = pSoundStart_[nIndex];
int nSize = pSoundSize_[nIndex];
pSoundBuf_[nIndex] = (byte *)MALLOC(nSize);
ISHELL_CreateInstance(pIShell_, AEECLSID_FILEMGR, (void**)&pIFileMgr);
pIFile = IFILEMGR_OpenFile(pIFileMgr, pSoundFileName_, _OFM_READ);
if ( !pIFile )
{
if (pIFileMgr) IFILEMGR_Release(pIFileMgr);
return false;
}
// CUtil::setFilePoint(pIFile, nCurrentPoint);
if ( nCurrentPoint < 0 )
{
return false;
}
else if ( EFAILED == IFILE_Seek(pIFile, _SEEK_START, nCurrentPoint) )
{
return false;
}
IFILE_Read(pIFile, (void *)pSoundBuf_[nIndex], nSize);
// 单捞磐 拘绵栏肺 汲沥登绢 乐促搁 拘绵阑 乾促.
if(bCompressed) {
byte *decompressedData; // 拘绵秦力等 捞饶狼 官捞飘
int size;
decompressedData = decodeLZMAData(pSoundBuf_[nIndex], nSize, &size );
freeSoundFile(nIndex);
pSoundBuf_[nIndex] = decompressedData;
pSoundRealSize_[nIndex] = size;
} else {
pSoundRealSize_[nIndex] = pSoundSize_[nIndex];
}
if (pIFile) IFILE_Release(pIFile);
if (pIFileMgr) IFILEMGR_Release(pIFileMgr);
return true;
}
void CMSoundPlayer::freeSoundFile(int nIndex) {
#ifdef DEBUG_CODE_ENABLED
if ( (nIndex < 0) || (nIndex >= nSoundCount_) ) {
DBGPRINTF("[MSoundPlayer class]-[freeSoundFile func] : Out of index.");
return;
}
#endif
if ( pSoundBuf_[nIndex] != NULL )
{
if ( nPlayingIndex_ == nIndex )
{
initSoundData();
}
FREE(pSoundBuf_[nIndex]);
pSoundBuf_[nIndex] = NULL;
}
}
boolean CMSoundPlayer::createSoundFileHead(char *pRefFileName) {
IFileMgr *pIFileMgr = NULL;
IFile *pIFile = NULL;
int i, nSize, nCurrentPoint;
ISHELL_CreateInstance(pIShell_, AEECLSID_FILEMGR, (void**)&pIFileMgr);
pIFile = IFILEMGR_OpenFile(pIFileMgr, pRefFileName, _OFM_READ);
if ( !pIFile )
{
if (pIFileMgr) IFILEMGR_Release(pIFileMgr);
return false;
}
nCurrentPoint = 0;
for ( i=0; i<nSoundCount_; i++ )
{
// CUtil::setFilePoint(pIFile, nCurrentPoint);
if ( EFAILED == IFILE_Seek(pIFile, _SEEK_START, nCurrentPoint) )
{
return false;
}
IFILE_Read(pIFile, (void *)&nSize, sizeof(int));
pSoundStart_[i] = (nCurrentPoint + sizeof(int));
pSoundSize_[i] = nSize;
nCurrentPoint += (sizeof(int) + nSize);
}
if (pIFile) IFILE_Release(pIFile);
if (pIFileMgr) IFILEMGR_Release(pIFileMgr);
return true;
}
/*
// Resource俊辑狼 单捞磐 肺爹篮 庆歹 器杆苞绰 惑包捞 绝促.
// 窜, Resource俊 荤款靛 单捞磐甫 持扁傈俊 4byte Length header甫 菊俊 嘿腮促.
*/
#else
boolean CMSoundPlayer::loadSoundRes(int nIndex, int ResID, char *szFileName, boolean bCompressed) {
#ifdef DEBUG_CODE_ENABLED
if ( (nIndex < 0) || (nIndex >= nSoundCount_) ) {
DBGPRINTF("[MSoundPlayer class]-[loadSoundRes func] : Out of index.");
return false;
}
#endif
if ( (nIndex < 0) || (nIndex >= nSoundCount_) || pSoundRes_[nIndex] )
{
return false;
}
if(bCompressed) {
pSoundRes_[nIndex] = pResTool_->loadCompressedData(ResID, szFileName);
} else {
pSoundRes_[nIndex] = pResTool_->loadBinary(ResID, szFileName);
}
return true;
}
void CMSoundPlayer::freeSoundRes(int nIndex) {
#ifdef DEBUG_CODE_ENABLED
if ( (nIndex < 0) || (nIndex >= nSoundCount_) ) {
DBGPRINTF("[MSoundPlayer class]-[freeSoundRes func] : Out of index.");
return;
}
#endif
if(pSoundRes_[nIndex] != NULL) {
delete pSoundRes_[nIndex];
pSoundRes_[nIndex] = NULL;
}
}
#endif // LOAD_FROM_FILE
void CMSoundPlayer::initSoundData() {
stopSound();
nWaitCount_ = nGapDelay_;
nQueueCount_ = 0;
nRepeatIndex_ = -1;
}
void CMSoundPlayer::push(int nIndex, boolean bRepeat) {
// 泅犁 Play吝牢 荤款靛 单捞磐客 快急 鉴困 厚背
if ( nPlayingIndex_ >= 0 && nIndex >= 0 ) {
if ( playPriority_[nIndex] < playPriority_[nPlayingIndex_] ) {
// DBGPRINTF("快急鉴困 俊矾");
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -