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

📄 sound.cpp

📁 一个3D的保龄球的源代码
💻 CPP
字号:
/*
* ============================================================================
*  Name     : CSound
*  Part of  : Game
*  Created  : 2003-09-03 by Zheng Jie Sheng
*  Implementation notes:
*  Version  :
*  Copyright: Gameloft S.A.
*
* ============================================================================
*/

#include "engine.h"
#include "simplememory.h"
#include "Sound.h"
#include "sysdef.h"
#include "resfile.h"


//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CSound::CSound(CEngine *pEngine)
{
	int i;
	SYS_ASSERT(NULL != pEngine);
	m_pEngine = pEngine;
#ifdef BREW11
	m_pSoundPlayer = NULL;
#else
	m_pMedia = NULL;
#endif
	for(i=0; i<SOUND_NUMBER; i++)
		pMediaData[i] = NULL;
	flag = 0;
	stop  =0;
	importantPlaying = 0;
	lastMidi = nextMidi = -1;

	playerSoundOn = DEFAULT_PLAYER_SOUND_SET;
	
#ifdef LG
	m_soundVolume=soundMid;
#else
	m_soundVolume=soundLoud;
#endif
	

	vibOn = true;  //default false??? //Milo 12-23

	m_pISound =NULL;
}

CSound::~CSound()
{
	int i;

#ifdef BREW11
	if(m_pSoundPlayer)
	{
#if !defined T720
		ISOUNDPLAYER_Stop(m_pSoundPlayer);
#endif
		ISOUNDPLAYER_RegisterNotify(m_pSoundPlayer, NULL, NULL);
		ISOUNDPLAYER_SetInfo(m_pSoundPlayer, 0);
	}
	for(i=0; i<SOUND_NUMBER; i++)
	{
		if(NULL != pMediaData[i])
			pMediaData[i] = NULL;
	}
	if(m_pSoundPlayer)
	{
		ISOUNDPLAYER_Release(m_pSoundPlayer);
		m_pSoundPlayer = NULL;
	}
#else
	if(m_pMedia)
	{
#ifdef SAMSUNG
		//SetVolume(soundMid);
#endif
		IMEDIA_Stop(m_pMedia);
		IMEDIA_RegisterNotify (m_pMedia, NULL, NULL);
		IMEDIA_SetMediaData (m_pMedia, NULL);
	}

	for(i=0; i<SOUND_NUMBER; i++)
	{
		if(NULL != pMediaData[i])
			pMediaData[i] = NULL;
	}
	if(m_pMedia)
	{
		IMEDIA_Release (m_pMedia);
		m_pMedia = NULL;
	}
#endif

	if(m_pISound)
	{
		ISOUND_Release(m_pISound);
		m_pISound = NULL;
	}
}

bool CSound::loadMIDI( int soundID, const char *file )
{
	if(NULL == pMediaData[soundID])
	{
		CResFile *pRes = m_pEngine->GetRes();
		CSimpleMemory *pMem = m_pEngine->GetMem();
		void *h = pRes->FindRecord(file);
		if(h)
		{
			nDataSize[soundID] = pRes->GetDecompressedSize(h);
			SYS_ASSERT( -1 != nDataSize[soundID] );
			if( -1 == nDataSize[soundID] )
				return false;
			pMediaData[soundID] = pMem->GlobalMalloc(nDataSize[soundID]);
			SYS_ASSERT( NULL != pMediaData[soundID] );
			if(NULL != pMediaData[soundID])
				pRes->Read(h, pMediaData[soundID], nDataSize[soundID]);
			idebug|=4;
		}
		else
			return false;
	}
    SYS_ASSERT(NULL != pMediaData[soundID]);
	return (NULL != pMediaData[soundID]);
}

#ifdef BREW11
static void NotifyProc(void * pUser, AEESoundPlayerCmd eCBType, AEESoundPlayerStatus eSPStatus, uint32 dwParam)
{
	CSound *pSound = (CSound*)pUser;
	switch(eCBType)
	{
	case AEE_SOUNDPLAYER_PLAY_CB:
		switch(eSPStatus)
		{
		case AEE_SOUNDPLAYER_SUCCESS:
			pSound->flag &= ~SOUND_MUSICEND;
			pSound->flag |= SOUND_PLAYING;
			break;

		case AEE_SOUNDPLAYER_ABORTED:
		case AEE_SOUNDPLAYER_DONE:
		case AEE_SOUNDPLAYER_FAILURE:
			pSound->flag |= SOUND_MUSICEND;
			pSound->flag &= ~SOUND_PLAYING;
			pSound->lastMidi = -1;
			if(pSound->nextMidi != -1 && GETUPTIMEMS()-pSound->nextMidiStartTick > 500)
				pSound->nextMidi = -1;
			break;


		}
	}
}
#else
static void NotifyProc(void * pUser, AEEMediaCmdNotify * pCmdNotify)
{
	CSound *pSound = (CSound*)pUser;

	if (pCmdNotify->nCmd == MM_CMD_PLAY)  // IMEDIA_Play/IMEDIA_Record events
	{
		switch (pCmdNotify->nStatus)
		{
         case MM_STATUS_START:
			pSound->flag &= ~SOUND_MUSICEND;
			pSound->flag |= SOUND_PLAYING;
			pSound->idebug|=2;
			break;
         case MM_STATUS_DONE:    // playback done
         case MM_STATUS_ABORT:   // playback aborted
			pSound->flag |= SOUND_MUSICEND;
			pSound->flag &= ~SOUND_PLAYING;
			break;
		case MM_STATUS_PAUSE:
			pSound->flag |=SOUND_PAUSE;
			break;

		case MM_STATUS_RESUME:
			pSound->flag &=~SOUND_PAUSE;
			break;
		}
	}
}
#endif

bool CSound::soundInit()
{
#ifdef BREW11
	if(NULL == m_pSoundPlayer)
	{
		int nRet;
		nRet = ISHELL_CreateInstance (m_pEngine->m_pIShell, AEECLSID_SOUNDPLAYER,(void **)&m_pSoundPlayer);
		if (SUCCESS != nRet)
		{	
			m_pSoundPlayer = NULL;
			SYS_ASSERT(0);
			return false;
		}
		SYS_ASSERT(NULL != m_pSoundPlayer);
		if(NULL != m_pSoundPlayer)
			ISOUNDPLAYER_RegisterNotify(m_pSoundPlayer, NotifyProc, this);

	}
#else
	if(NULL == m_pMedia)
	{
		int nRet;
		nRet = ISHELL_CreateInstance (m_pEngine->m_pIShell, AEECLSID_MEDIAMIDI, (void **)&m_pMedia);
		if (SUCCESS != nRet)
		{	
			m_pMedia = NULL;
			SYS_ASSERT(0);
			return false;
		}
		SYS_ASSERT(NULL != m_pMedia);

		if(NULL != m_pMedia)
		{
			IMEDIA_RegisterNotify (m_pMedia, NotifyProc, this);
			SetVolume(m_soundVolume);
		}
		idebug|=1;
	}
#endif


	if(NULL == m_pISound)
	{
		int nRet;
		nRet = ISHELL_CreateInstance (m_pEngine->m_pIShell, AEECLSID_SOUND,(void **)&m_pISound);
		if (SUCCESS != nRet)
		{	
			m_pISound = NULL;
			SYS_ASSERT(0);
			return false;
		}
		SYS_ASSERT(NULL != m_pISound);
		if(NULL != m_pISound)
			ISOUND_RegisterNotify(m_pISound, NULL, NULL);

	}

	return true;
}

void CSound::playMIDI( int id, int loop )
{
#ifdef LG
	if(/* m_soundVolume == soundNone*/0)
#else
	if(m_soundVolume == soundNone)
#endif	
		return;
	if (id < 0 || id >= SOUND_NUMBER)
		return;
	if (pMediaData[id] == NULL)
		return;

	if(lastMidi != id)
	{
		lastMidi = id;
		nextMidi = id;
		nextMidiStartTick = GETUPTIMEMS();

		
		stopMIDI();

		if(loop)
			flag |= SOUND_LOOPMUSIC;
		else
			flag &= ~SOUND_LOOPMUSIC;

		idebug|=8;		
	}			
}

void CSound::stopMIDI()
{
	flag &= ~SOUND_LOOPMUSIC;
#if defined BREW11
#if !defined T720
	if(m_pSoundPlayer)
		ISOUNDPLAYER_Stop(m_pSoundPlayer);
#endif
#else
	if(m_pMedia)
		IMEDIA_Stop(m_pMedia);
#endif
	lastMidi = -1;
}

void CSound::Update()
{
	int ret = 0;
	
#ifdef LG
	if( 0/*m_soundVolume == soundNone*/)
#else
	if( m_soundVolume == soundNone)
#endif
	
	{
		stopMIDI();
		return;
	}
	if(flag&SOUND_PAUSE)
		return;

#ifdef BREW11
	if(NULL == m_pSoundPlayer)
		return;

	AEESoundPlayerInfo pinfo;

	if(nextMidi >= 0 && !(flag & SOUND_PLAYING))
	{
		lastTime = ISHELL_GetUpTimeMS (m_pEngine->m_pIShell);

		SYS_ASSERT(NULL != pMediaData[nextMidi]);
		if(NULL == pMediaData[nextMidi])
			return;
		pinfo.eInput = SDT_BUFFER;
		pinfo.pData = pMediaData[nextMidi];
		pinfo.dwSize = nDataSize[nextMidi];

		lastMidi = nextMidi;
		nextMidi = -1; // sound will be played, clear the queue

		ret = ISOUNDPLAYER_SetInfo(m_pSoundPlayer, &pinfo);

		if (ret == AEE_SUCCESS)
		{
			ISOUNDPLAYER_Play(m_pSoundPlayer);
		}
	}
	else if((flag & SOUND_LOOPMUSIC) && (flag & SOUND_MUSICEND))
	{
		ISOUNDPLAYER_Rewind(m_pSoundPlayer, 0);
		ISOUNDPLAYER_Play(m_pSoundPlayer);
	} 
#else
	if(nextMidi >= 0 && !(flag & SOUND_PLAYING))
	{
		lastTime = ISHELL_GetUpTimeMS (m_pEngine->m_pIShell);
		
		SYS_ASSERT(NULL != pMediaData[nextMidi]);
		if(NULL == pMediaData[nextMidi])
			return;
		m_md.clsData = MMD_BUFFER;
		m_md.pData = pMediaData[nextMidi];
		m_md.dwSize = nDataSize[nextMidi];

		lastMidi = nextMidi;
		nextMidi = -1; // sound will be played, clear the queue

		//Free this one before we can play the next
		if(NULL != m_pMedia)
		{
			IMEDIA_Release(m_pMedia);
			m_pMedia = NULL;
		}
		ret = ISHELL_CreateInstance (m_pEngine->m_pIShell, AEECLSID_MEDIAPMD, (void **)&m_pMedia);
		if(SUCCESS == ret)
		{
			ret = IMEDIA_SetMediaData (m_pMedia, &m_md);
			
#ifdef LG
		SetVolume(m_soundVolume);
#endif
			
		if(NULL != m_pMedia)
		
		{
			int a = 	IMEDIA_RegisterNotify (m_pMedia, NotifyProc, this);
		}
			if (ret == AEE_SUCCESS)
			{
				IMEDIA_Play(m_pMedia);
				DBGPRINTF("Start sound: %d", lastMidi);
			}
		}
		else
			m_pMedia = NULL;
	}
	else if((flag & SOUND_LOOPMUSIC) && (flag & SOUND_MUSICEND) && (NULL != m_pMedia))
	{
		IMEDIA_Rewind (m_pMedia, 10000);
		IMEDIA_Play(m_pMedia);
	} 
	idebug|=16;
#endif
}



void CSound::PlayVibrate(int timeTick)
{
	ISOUND_Vibrate(m_pISound,timeTick); //Milo 12-23 
}

void CSound::SetVibOn(char cVibOn)
{
	vibOn = cVibOn;
	
}



void CSound::pauseMIDI()
{
	int ret=0;
	if(lastMusic!=-1 && flag&SOUND_PLAYING)
		ret=IMEDIA_Pause(m_pMedia);

}


void CSound::ResumeMIDI()
{
	int ret=0;
	if(lastMusic!=-1 && flag&SOUND_PAUSE)
		ret=IMEDIA_Resume(m_pMedia);

}



void CSound::StopVibrate()
{
	ISOUND_StopVibrate(m_pISound);
}



#ifdef LG

void CSound::SetVolume(int eVolumeType)
{
	int soundv = 0;
	switch(eVolumeType)
	{
		case soundNone:			
			soundv = 0;
			break;
		case soundLow:			
			soundv = AEE_MAX_VOLUME/3;
			break;
		case soundMid:			
			soundv = 2*AEE_MAX_VOLUME/3;
			break;
		case soundLoud:			
			soundv = AEE_MAX_VOLUME;
			break;
		default:
			break;
	}
	m_soundVolume = eVolumeType;
	if (m_pMedia != NULL)
		IMEDIA_SetVolume(m_pMedia, soundv);
}

#else

void CSound::SetVolume(int eVolumeType)
{
	m_soundVolume = eVolumeType;
	return;
}

#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -