⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 msoundplayer.cpp

📁 这是一个用BREW和VC++开发的暴力摩托游戏,与大家一同分享.
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#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 + -