Esempio n. 1
0
	void AudioPlayer::cleunup()
	{
		if ( mFmodSys )
		{
			FMOD_CHECK( FMOD_System_Close( mFmodSys ) );
			FMOD_CHECK( FMOD_System_Release( mFmodSys ) );
			mFmodSys = NULL;
		}
	}
Esempio n. 2
0
	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;
	}
Esempio n. 3
0
	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;
	}
Esempio n. 4
0
	void AudioPlayer::stopSound( SoundID sID )
	{
		if ( sID == ERROR_SOUND_ID )
			return;

		Channel* channel = getChannel( sID );
		if ( !channel )
			return;

		FMOD_CHECK( FMOD_Channel_Stop( channel ) );
	}
Esempio n. 5
0
	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;
}
Esempio n. 7
0
	void SoundRes::release()
	{
		FMOD_CHECK( FMOD_Sound_Release( sound ) );
		sound = NULL;
	}