📄 sound.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 + -