www.pudn.com > coolMEMORY.rar > AS_Fmod.cpp
//-----------------------------------------------------------------------------
// File: AS_Fmod.cpp
//-----------------------------------------------------------------------------
#include "AS_Engine.h"
// Variables: *****************************************************************
BOOL bASMusicFinished; // Is the music finished??
///////////////////////////////////////////////////////////////////////////////
// Functions: *****************************************************************
BOOL ASInitFmod(void);
BOOL ASDestroyFmod(void);
BOOL ASLoadFmodSamples(char (*)[256], int, AS_FMOD_SAMPLE *);
BOOL ASDestroyFmodSamples(int, AS_FMOD_SAMPLE *);
BOOL ASDestroyFmodSample(AS_FMOD_SAMPLE *);
BOOL ASLoadFmodSample(FSOUND_SAMPLE *, char *, int);
BOOL ASPlayFmodSample(FSOUND_SAMPLE *, int);
BOOL ASStopAllFmodSamples(int, AS_FMOD_SAMPLE *);
BOOL ASStopFmodSample(AS_FMOD_SAMPLE *);
BOOL ASPlayFmodMusic(AS_FMOD_MUSIC *, char *);
BOOL ASDestroyFmodMusic(AS_FMOD_MUSIC *);
BOOL ASSetPauseFmodMusic(AS_FMOD_MUSIC *, BOOL);
signed char ASFmodEndCallback(FSOUND_STREAM *, void *, int, int);
///////////////////////////////////////////////////////////////////////////////
BOOL ASInitFmod(void)
{ // begin ASInitFmod()
_AS->WriteLogMessage("Init Fmod");
FSOUND_SetOutput(_ASConfig->bySoundOutput);
FSOUND_SetMinHardwareChannels(AS_MAX_SOUND_CHANNELS);
FSOUND_SetMaxHardwareChannels(AS_MAX_SOUND_CHANNELS);
FSOUND_SetSFXMasterVolume(_ASConfig->iSoundVolume);
if(!FSOUND_Init(44100, AS_MAX_SOUND_CHANNELS, 0))
{
_AS->WriteLogMessage("Init of Fmod failed!");
_AS->bSoundPossible = FALSE;
return TRUE;
}
_AS->bSoundPossible = TRUE;
return FALSE;
} // end ASInitFmod()
BOOL ASDestroyFmod(void)
{ // begin ASDestroyFmod()
if(!_AS->bSoundPossible)
return FALSE;
_AS->WriteLogMessage("Destroy Fmod");
FSOUND_Close();
return FALSE;
} // end ASDestroyFmod()
BOOL ASLoadFmodSamples(char (*byFilename)[256], int iSamples, AS_FMOD_SAMPLE *pSample)
{ // begin ASLoadFmodSamples()
AS_PROGRESS_WINDOW ProgressWindow;
char byTemp[256];
if(!_AS->bSoundPossible)
return FALSE;
ProgressWindow.CreateProgressWindow("Sounds");
ProgressWindow.SetTask("Load sounds...");
ProgressWindow.SetProgress(0);
_AS->WriteLogMessage("Load sounds");
for(int i = 0; i < iSamples; i++)
{
ProgressWindow.SetSubTask("%s", pSample[i].byFilename);
ProgressWindow.SetProgress((UINT) (((float) i/iSamples)*100));
sprintf(byTemp, "%s%s\\%s", _AS->byProgramPath, _AS->bySoundDirectory, byFilename[i]);
strcpy(pSample[i].byFilename, byTemp);
if(ASLoadFmodSample(&pSample[i], pSample[i].byFilename, i))
_AS->WriteLogMessage("Couldn't load this sound");
}
return FALSE;
} // begin ASLoadFmodSamples()
BOOL ASDestroyFmodSamples(int iSamples, AS_FMOD_SAMPLE *pSample)
{ // begin ASDestroyFmodSamples()
_AS->WriteLogMessage("Destroy sounds");
for(int i = 0; i < iSamples; i++)
{
_AS->WriteLogMessage(pSample[i].byFilename);
FSOUND_StopSound(pSample[i].iChannel);
FSOUND_Sample_Free(pSample[i].pSample);
memset(&pSample[i], 0, sizeof(AS_FMOD_SAMPLE));
}
return FALSE;
} // end ASDestroyFmodSamples()
BOOL ASDestroyFmodSample(AS_FMOD_SAMPLE *pSample)
{ // begin ASDestroyFmodSample()
if(!pSample)
return FALSE;
_AS->WriteLogMessage("Destroy sound");
_AS->WriteLogMessage(pSample->byFilename);
FSOUND_StopSound(pSample->iChannel);
FSOUND_Sample_Free(pSample->pSample);
pSample->pSample = NULL;
return FALSE;
} // end ASDestroyFmodSamples()
BOOL ASLoadFmodSample(AS_FMOD_SAMPLE *pSample, char *pbyFilename, int iChannel)
{ // begin ASLoadFmodSample()
if(!_AS->bSoundPossible)
return FALSE;
for(int i = 20; i < AS_MAX_SOUND_CHANNELS; i++)
{
if(!FSOUND_IsPlaying(i))
break;
}
if(i >= AS_MAX_SOUND_CHANNELS)
return TRUE; // No canal free!
_AS->WriteLogMessage("Load sound: %s", pbyFilename);
pSample->pSample = FSOUND_Sample_Load(i, pbyFilename, FSOUND_HW3D, 0); // FSOUND_STEREO
if(!pSample->pSample)
return TRUE;
pSample->iChannel = iChannel;
return FALSE;
} // end ASLoadFmodSample()
BOOL ASPlayFmodSample(AS_FMOD_SAMPLE *pSample, int iMode)
{ // begin ASPlayFmodSample()
if(!_AS->bSoundPossible || !_ASConfig->bSound ||
(iMode == FSOUND_LOOP_NORMAL && FSOUND_IsPlaying(pSample->iChannel)))
return FALSE;
FSOUND_Sample_SetLoopMode(pSample->pSample, iMode);
for(int i = FMUSIC_GetNumChannels(GameMusic.pMod)+1; i < AS_MAX_SOUND_CHANNELS; i++)
{
if(!FSOUND_IsPlaying(i))
break;
}
if(i >= AS_MAX_SOUND_CHANNELS)
return FALSE; // No canal free!
if(iMode == FSOUND_LOOP_NORMAL)
FSOUND_PlaySound(pSample->iChannel, pSample->pSample);
else
FSOUND_PlaySound(i, pSample->pSample);
return FALSE;
} // end ASPlayFmodSample()
BOOL ASStopAllFmodSamples(int iSamples, AS_FMOD_SAMPLE *pSample)
{ // begin ASStopAllFmodSamples()
for(int i = 0; i < iSamples; i++)
FSOUND_StopSound(pSample[i].iChannel);
return FALSE;
} // end ASStopAllFmodSamples()
BOOL ASStopFmodSample(AS_FMOD_SAMPLE *pSample)
{ // begin ASPlayFmodSample()
if(!_AS->bSoundPossible)
return FALSE;
FSOUND_StopSound(pSample->iChannel);
return FALSE;
} // end ASStopFmodSample()
BOOL ASPlayFmodMusic(AS_FMOD_MUSIC *pMusic, char *pbyFilename)
{ // begin ASPlayFmodMusic()
if(!_AS->bSoundPossible || !_ASConfig->bMusic)
return FALSE;
_AS->WriteLogMessage("Load music: %s", pbyFilename);
pMusic->pMod = FMUSIC_LoadSong(pbyFilename);
if(!pMusic->pMod)
{
pMusic->pStream = FSOUND_Stream_OpenFile(pbyFilename, FSOUND_NORMAL | FSOUND_LOOP_NORMAL | FSOUND_2D, 0);
FSOUND_Stream_SetEndCallback(pMusic->pStream, ASFmodEndCallback, 0);
FSOUND_Stream_SetSynchCallback(pMusic->pStream, ASFmodEndCallback, 0);
FSOUND_Stream_Play(FSOUND_FREE, pMusic->pStream);
}
else
{
pMusic->pStream = NULL;
FMUSIC_PlaySong(pMusic->pMod);
_ASConfig->iSoundVolume = _ASConfig->iMusicVolume;
FSOUND_SetSFXMasterVolume(_ASConfig->iSoundVolume);
}
bASMusicFinished = FALSE;
if(FMUSIC_GetType(pMusic->pMod) != FMUSIC_TYPE_IT)
FMUSIC_SetMasterVolume(pMusic->pMod, _ASConfig->iMusicVolume);
if(FMUSIC_GetType(pMusic->pMod) == FMUSIC_TYPE_MOD || FMUSIC_GetType(pMusic->pMod) == FMUSIC_TYPE_S3M)
FMUSIC_SetPanSeperation(pMusic->pMod, 0.85f);
return FALSE;
} // end ASPlayFmodMusic()
BOOL ASDestroyFmodMusic(AS_FMOD_MUSIC *pMusic)
{ // begin ASDestroyFmodMusic()
if(pMusic->pMod)
{
FMUSIC_FreeSong(pMusic->pMod);
pMusic->pMod = NULL;
}
else
{
FSOUND_Stream_Close(pMusic->pStream);
pMusic->pStream = NULL;
}
return FALSE;
} // end ASDestroyFmodMusic()
BOOL ASSetPauseFmodMusic(AS_FMOD_MUSIC *pMusic, BOOL bPause)
{ // begin ASSetPauseFmodMusic()
if(pMusic->pMod)
FMUSIC_SetPaused(GameMusic.pMod, bPause);
return FALSE;
} // end ASSetPauseFmodMusic()
signed char ASFmodEndCallback(FSOUND_STREAM *pStream, void *pBuff, int iLen, int iParam)
{ // begin ASFmodEndCallback()
if(pBuff)
{ // Synchpoint:
}
else
{ // Stream ended:
bASMusicFinished = TRUE;
}
return TRUE;
} // end ASFmodEndCallback()