snes9x/win32/CFMODEx.cpp

144 lines
2.9 KiB
C++

#ifdef FMODEX_SUPPORT
#ifndef FMOD_SUPPORT
#include "CFMODEx.h"
#include "wsnes9x.h"
#include "../snes9x.h"
#include "../apu/apu.h"
CFMODEx::CFMODEx(void)
{
initDone = false;
fmodStream = NULL;
fmodSystem = NULL;
}
CFMODEx::~CFMODEx(void)
{
DeInitFMODEx();
if(fmodSystem)
fmodSystem->release();
}
bool CFMODEx::InitStream()
{
FMOD_CREATESOUNDEXINFO createSoundExInfo={0};
createSoundExInfo.cbsize = sizeof(FMOD_CREATESOUNDEXINFO);
createSoundExInfo.defaultfrequency = Settings.SoundPlaybackRate;
createSoundExInfo.numchannels = (Settings.Stereo?2:1);
createSoundExInfo.format = (Settings.SixteenBitSound?FMOD_SOUND_FORMAT_PCM16:FMOD_SOUND_FORMAT_PCM8);
createSoundExInfo.pcmreadcallback = FMODExStreamCallback;
createSoundExInfo.suggestedsoundtype = FMOD_SOUND_TYPE_USER;
//fmodSystem->getDSPBufferSize(&temp,NULL);
// 768 was the bufferSize in FMOD
sampleCount = (Settings.SoundPlaybackRate * GUI.SoundBufferSize/2 ) / 1000;
if (Settings.Stereo)
sampleCount *= 2;
bufferSize = sampleCount * (Settings.SixteenBitSound?2:1);
createSoundExInfo.length = bufferSize;
createSoundExInfo.decodebuffersize = bufferSize/4;
FMOD_RESULT fr = fmodSystem->createStream(NULL,FMOD_OPENUSER | FMOD_LOOP_NORMAL | FMOD_OPENRAW,&createSoundExInfo,&fmodStream);
if(!(fr==FMOD_OK)) {
return false;
}
fr = fmodSystem->playSound(FMOD_CHANNEL_FREE,fmodStream,0,NULL);
return true;
}
void CFMODEx::DeInitStream()
{
if (fmodStream)
{
fmodStream->release();
fmodStream = NULL;
}
}
bool CFMODEx::InitFMODEx()
{
if(initDone)
return true;
FMOD_RESULT fr;
if(!(FMOD::System_Create(&fmodSystem)==FMOD_OK))
return false;
switch (GUI.SoundDriver)
{
default:
case WIN_FMODEX_DEFAULT_DRIVER:
fr = fmodSystem->setOutput(FMOD_OUTPUTTYPE_AUTODETECT);
break;
case WIN_FMODEX_ASIO_DRIVER:
fr = fmodSystem->setOutput(FMOD_OUTPUTTYPE_ASIO);
break;
case WIN_FMODEX_OPENAL_DRIVER:
fr = fmodSystem->setOutput(FMOD_OUTPUTTYPE_OPENAL);
break;
}
fr = fmodSystem->init(2,FMOD_INIT_NORMAL,0);
if(fr!=FMOD_OK)
return false;
initDone = true;
return true;
}
void CFMODEx::DeInitFMODEx()
{
initDone = false;
DeInitStream();
if(fmodSystem) {
fmodSystem->release();
fmodSystem = NULL;
}
}
bool CFMODEx::SetupSound()
{
if(!initDone)
return false;
DeInitStream();
return InitStream();
}
void CFMODEx::ProcessSound()
{
EnterCriticalSection(&GUI.SoundCritSect);
S9xFinalizeSamples();
LeaveCriticalSection(&GUI.SoundCritSect);
}
FMOD_RESULT F_CALLBACK CFMODEx::FMODExStreamCallback(
FMOD_SOUND * sound,
void * data,
unsigned int datalen
)
{
int sample_count = datalen;
sample_count >>= (Settings.SixteenBitSound?1:0);
EnterCriticalSection(&GUI.SoundCritSect);
S9xMixSamples((unsigned char *) data, sample_count);
LeaveCriticalSection(&GUI.SoundCritSect);
SetEvent(GUI.SoundSyncEvent);
return FMOD_OK;
}
#endif
#endif