void AudioPlayer::cleunup() { if ( mFmodSys ) { FMOD_CHECK( FMOD_System_Close( mFmodSys ) ); FMOD_CHECK( FMOD_System_Release( mFmodSys ) ); mFmodSys = NULL; } }
bool AudioPlayer::init() { unsigned int version; FMOD_CHECK( FMOD_System_Create( &mFmodSys ) ); FMOD_CHECK( FMOD_System_GetVersion( mFmodSys , &version ) ); if (version < FMOD_VERSION) { ErrorMsg("Error! You are using an old version of FMOD %08x. This program requires %08x\n", version, FMOD_VERSION); return false; } FMOD_CHECK( FMOD_System_Init( mFmodSys , MaxNumChannel , FMOD_INIT_NORMAL, NULL ) ); return true; }
ResBase* AudioPlayer::createResource( ResID id , ResInfo& info ) { SoundResInfo& soundInfo = static_cast< SoundResInfo& >( info ); SoundRes* res = new SoundRes; FMOD_CHECK( FMOD_System_CreateSound( mFmodSys , info.path.c_str() , FMOD_DEFAULT , 0 , &res->sound ) ); res->volume = soundInfo.volume; return res; }
void AudioPlayer::stopSound( SoundID sID ) { if ( sID == ERROR_SOUND_ID ) return; Channel* channel = getChannel( sID ); if ( !channel ) return; FMOD_CHECK( FMOD_Channel_Stop( channel ) ); }
void AudioPlayer::update( unsigned time ) { FMOD_CHECK( FMOD_System_Update( mFmodSys ) ); for( unsigned i = 0 ; i < MaxNumChannel ; ++i ) { if ( mChannels[ i ] == NULL ) continue; FMOD_BOOL isPlaying; if ( FMOD_Channel_IsPlaying( mChannels[i] , &isPlaying ) == FMOD_OK ) { if ( !isPlaying ) mChannels[i] = NULL; } } }
bool SFXFMODDevice::_init() { #define FMOD_CHECK( message ) \ if( result != FMOD_OK ) \ { \ Con::errorf( "SFXFMODDevice::_init() - %s (%s)", \ message, \ FMOD_ErrorString( result ) ); \ return false; \ } AssertISV(smSystem, "SFXFMODDevice::_init() - can't init w/o an existing FMOD system handle!"); FMOD_RESULT result; // Get some prefs. if( smPrefPluginPath && smPrefPluginPath[ 0 ] ) { char fullPath[ 4096 ]; Platform::makeFullPathName( smPrefPluginPath, fullPath, sizeof( fullPath ) ); smFunc->FMOD_System_SetPluginPath( smSystem, fullPath ); } else { smFunc->FMOD_System_SetPluginPath( smSystem, Platform::getExecutablePath() ); } // Initialize everything from fmod. FMOD_SPEAKERMODE speakermode; FMOD_CAPS caps; result = smFunc->FMOD_System_GetDriverCaps(smSystem, 0, &caps, ( int* ) 0, &speakermode); FMOD_CHECK( "SFXFMODDevice::init - Failed to get driver caps" ); result = smFunc->FMOD_System_SetDriver(smSystem, mDeviceIndex); FMOD_CHECK( "SFXFMODDevice::init - Failed to set driver" ); result = smFunc->FMOD_System_SetSpeakerMode(smSystem, speakermode); FMOD_CHECK( "SFXFMODDevice::init - Failed to set the user selected speaker mode" ); if (caps & FMOD_CAPS_HARDWARE_EMULATED) /* The user has the 'Acceleration' slider set to off! This is really bad for latency!. */ { /* You might want to warn the user about this. */ result = smFunc->FMOD_System_SetDSPBufferSize(smSystem, 1024, 10); FMOD_CHECK( "SFXFMODDevice::init - Failed to set DSP buffer size" ); } Con::printf( "\nFMOD Device caps:" ); #define PRINT_CAP( name ) \ if( caps & FMOD_CAPS_ ## name ) \ Con::printf( #name ); PRINT_CAP( HARDWARE ); PRINT_CAP( HARDWARE_EMULATED ); PRINT_CAP( OUTPUT_MULTICHANNEL ); PRINT_CAP( OUTPUT_FORMAT_PCM8 ); PRINT_CAP( OUTPUT_FORMAT_PCM16 ); PRINT_CAP( OUTPUT_FORMAT_PCM24 ); PRINT_CAP( OUTPUT_FORMAT_PCM32 ); PRINT_CAP( OUTPUT_FORMAT_PCMFLOAT ); PRINT_CAP( REVERB_LIMITED ); Con::printf( "" ); bool tryAgain; do { tryAgain = false; FMOD_INITFLAGS flags = FMOD_INIT_NORMAL | FMOD_INIT_VOL0_BECOMES_VIRTUAL; if( smPrefDisableSoftware ) flags |= FMOD_INIT_SOFTWARE_DISABLE; if( smPrefUseSoftwareOcclusion ) flags |= FMOD_INIT_SOFTWARE_OCCLUSION; if( smPrefUseSoftwareHRTF ) flags |= FMOD_INIT_SOFTWARE_HRTF; if( smPrefUseSoftwareReverbLowmem ) flags |= FMOD_INIT_SOFTWARE_REVERB_LOWMEM; if( smPrefEnableProfile ) flags |= FMOD_INIT_ENABLE_PROFILE; if( smPrefGeometryUseClosest ) flags |= FMOD_INIT_GEOMETRY_USECLOSEST; if( smEventSystem ) result = smFunc->FMOD_EventSystem_Init( smEventSystem, 100, flags, ( void* ) 0, FMOD_EVENT_INIT_NORMAL ); else result = smFunc->FMOD_System_Init( smSystem, 100, flags, ( void* ) 0 ); if( result == FMOD_ERR_OUTPUT_CREATEBUFFER ) /* Ok, the speaker mode selected isn't supported by this soundcard. Switch it back to stereo... */ { result = smFunc->FMOD_System_SetSpeakerMode( smSystem, FMOD_SPEAKERMODE_STEREO ); FMOD_CHECK( "SFXFMODDevice::init - failed on fallback speaker mode setup" ); tryAgain = true; } } while( tryAgain ); FMOD_CHECK( "SFXFMODDevice::init - failed to init system" ); // Print hardware channel info. if( caps & FMOD_CAPS_HARDWARE ) { int num3D, num2D, numTotal; if( smFunc->FMOD_System_GetHardwareChannels( smSystem, &num2D, &num3D, &numTotal ) == FMOD_OK ) Con::printf( "FMOD Hardware channels: 2d=%i, 3d=%i, total=%i", num2D, num3D, numTotal ); } // Set up filesystem. //FIXME: Don't do this for now. Crashes on Windows. #if 0 smFunc->FMOD_System_SetFileSystem( smSystem, fmodFileOpenCallback, fmodFileCloseCallback, fmodFileReadCallback, fmodFileSeekCallback, -1 ); #endif // Set capabilities. mCaps = CAPS_Reverb | CAPS_VoiceManagement; if( smEventSystem ) mCaps |= CAPS_FMODDesigner; // Start the update thread. #ifndef TORQUE_DEDICATED // Avoid dependency on platform/async for Linx dedicated. if( !Con::getBoolVariable( "$_forceAllMainThread" ) ) { SFXInternal::gUpdateThread = new AsyncPeriodicUpdateThread ( "FMOD Update Thread", SFXInternal::gBufferUpdateList, Con::getIntVariable( "$pref::SFX::updateInterval", SFXInternal::DEFAULT_UPDATE_INTERVAL ) ); SFXInternal::gUpdateThread->start(); } #endif return true; }
void SoundRes::release() { FMOD_CHECK( FMOD_Sound_Release( sound ) ); sound = NULL; }