diff --git a/stepmania/src/arch/LoadingWindow/LoadingWindow_Cocoa.h b/stepmania/src/arch/LoadingWindow/LoadingWindow_Cocoa.h index d05dba21a9..19915c235a 100644 --- a/stepmania/src/arch/LoadingWindow/LoadingWindow_Cocoa.h +++ b/stepmania/src/arch/LoadingWindow/LoadingWindow_Cocoa.h @@ -5,6 +5,7 @@ #include "LoadingWindow.h" #include "RageFile.h" +#include "RageUtil.h" extern "C" { diff --git a/stepmania/src/arch/Sound/RageSoundDriver.cpp b/stepmania/src/arch/Sound/RageSoundDriver.cpp new file mode 100644 index 0000000000..2022d45d4b --- /dev/null +++ b/stepmania/src/arch/Sound/RageSoundDriver.cpp @@ -0,0 +1,75 @@ +#include "global.h" +#include "RageSoundDriver.h" +#include "RageLog.h" +#include "RageUtil.h" +#include "LocalizedString.h" +#include "Foreach.h" + +map *RegisterSoundDriver::g_pRegistrees; +RegisterSoundDriver::RegisterSoundDriver( const istring &sName, CreateSoundDriverFn pfn ) +{ + if( g_pRegistrees == NULL ) + g_pRegistrees = new map; + + ASSERT( g_pRegistrees->find(sName) == g_pRegistrees->end() ); + (*g_pRegistrees)[sName] = pfn; +} + +static LocalizedString SOUND_DRIVERS_CANNOT_EMPTY( "Arch", "Sound Drivers cannot be empty." ); +RageSoundDriver *MakeRageSoundDriver( const RString &drivers ) +{ + vector DriversToTry; + split( drivers, ",", DriversToTry, true ); + + if( DriversToTry.empty() ) + RageException::Throw( "%s", SOUND_DRIVERS_CANNOT_EMPTY.GetValue().c_str() ); + + FOREACH_CONST( RString, DriversToTry, Driver ) + { + map::const_iterator iter = RegisterSoundDriver::g_pRegistrees->find( istring(*Driver) ); + + if( iter == RegisterSoundDriver::g_pRegistrees->end() ) + { + LOG->Trace( "Unknown sound driver: %s", Driver->c_str() ); + continue; + } + + RageSoundDriver *pRet = (iter->second)(); + DEBUG_ASSERT( pRet ); + const RString sError = pRet->Init(); + + if( sError.empty() ) + { + LOG->Info( "Sound driver: %s", Driver->c_str() ); + return pRet; + } + LOG->Info( "Couldn't load driver %s: %s", Driver->c_str(), sError.c_str() ); + SAFE_DELETE( pRet ); + } + return NULL; +} + +/* + * (c) 2002-2006 Gleen Maynard, Steve Checkoway + * All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, and/or sell copies of the Software, and to permit persons to + * whom the Software is furnished to do so, provided that the above + * copyright notice(s) and this permission notice appear in all copies of + * the Software and that both the above copyright notice(s) and this + * permission notice appear in supporting documentation. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF + * THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS + * INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT + * OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS + * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR + * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ diff --git a/stepmania/src/arch/Sound/RageSoundDriver.h b/stepmania/src/arch/Sound/RageSoundDriver.h index ceecb72062..5c78672dce 100644 --- a/stepmania/src/arch/Sound/RageSoundDriver.h +++ b/stepmania/src/arch/Sound/RageSoundDriver.h @@ -1,6 +1,8 @@ #ifndef RAGE_SOUND_DRIVER #define RAGE_SOUND_DRIVER +#include "RageUtil.h" + class RageSoundBase; class RageSoundDriver { @@ -48,6 +50,19 @@ public: virtual ~RageSoundDriver() { } }; +typedef RageSoundDriver *(*CreateSoundDriverFn)(); +struct RegisterSoundDriver +{ + static map *g_pRegistrees; + RegisterSoundDriver( const istring &sName, CreateSoundDriverFn pfn ); +}; +// Can't use Create##name because many of these have -sw suffixes. +#define REGISTER_SOUND_DRIVER_CLASS2( name, x ) \ + static RageSoundDriver *Create##x() { return new RageSound_##x; } \ + static RegisterSoundDriver register_##x( #name, Create##x ) +#define REGISTER_SOUND_DRIVER_CLASS( name ) REGISTER_SOUND_DRIVER_CLASS2( name, name ) + + /* * (c) 2002-2004 Glenn Maynard * All rights reserved. diff --git a/stepmania/src/arch/Sound/RageSoundDriver_AU.cpp b/stepmania/src/arch/Sound/RageSoundDriver_AU.cpp index c580840f01..03b4a2fea5 100644 --- a/stepmania/src/arch/Sound/RageSoundDriver_AU.cpp +++ b/stepmania/src/arch/Sound/RageSoundDriver_AU.cpp @@ -4,6 +4,8 @@ #include "archutils/Darwin/DarwinThreadHelpers.h" #include +REGISTER_SOUND_DRIVER_CLASS2( AudioUnit, AU ); + static const UInt32 kFramesPerPacket = 1; static const UInt32 kChannelsPerFrame = 2; static const UInt32 kBitsPerChannel = 16; diff --git a/stepmania/src/arch/Sound/RageSoundDriver_AU.h b/stepmania/src/arch/Sound/RageSoundDriver_AU.h index 407f9ea9a1..318fe86bab 100644 --- a/stepmania/src/arch/Sound/RageSoundDriver_AU.h +++ b/stepmania/src/arch/Sound/RageSoundDriver_AU.h @@ -36,7 +36,6 @@ private: RageSemaphore m_Semaphore; }; -#define USE_RAGE_SOUND_AU #endif /* * (c) 2004-2006 Steve Checkoway diff --git a/stepmania/src/arch/Sound/RageSoundDriver_CA.cpp b/stepmania/src/arch/Sound/RageSoundDriver_CA.cpp index 00ac015a8d..26ddd6326d 100644 --- a/stepmania/src/arch/Sound/RageSoundDriver_CA.cpp +++ b/stepmania/src/arch/Sound/RageSoundDriver_CA.cpp @@ -6,6 +6,8 @@ #include "PrefsManager.h" #include "archutils/Darwin/DarwinThreadHelpers.h" +REGISTER_SOUND_DRIVER_CLASS2( CoreAudio, CA ); + static const UInt8 kAudioDeviceSectionInput = 0x01; static const UInt8 kAudioDeviceSectionOutput = 0x00; static const UInt8 kAudioDeviceSectionGlobal = 0x00; diff --git a/stepmania/src/arch/Sound/RageSoundDriver_CA.h b/stepmania/src/arch/Sound/RageSoundDriver_CA.h index fe002bb779..8c9a13378d 100644 --- a/stepmania/src/arch/Sound/RageSoundDriver_CA.h +++ b/stepmania/src/arch/Sound/RageSoundDriver_CA.h @@ -51,7 +51,6 @@ private: static OSStatus JackChanged( AudioDeviceID inDevice, UInt32 inChannel, Boolean isInput, AudioDevicePropertyID inPropertyID, void *inData ); }; -#define USE_RAGE_SOUND_CA #endif diff --git a/stepmania/src/arch/Sound/RageSoundDriver_Null.cpp b/stepmania/src/arch/Sound/RageSoundDriver_Null.cpp index 22ebaf4aac..b70f5a8085 100644 --- a/stepmania/src/arch/Sound/RageSoundDriver_Null.cpp +++ b/stepmania/src/arch/Sound/RageSoundDriver_Null.cpp @@ -4,6 +4,8 @@ #include "RageUtil.h" #include "PrefsManager.h" +REGISTER_SOUND_DRIVER_CLASS( Null ); + const int channels = 2; void RageSound_Null::Update() diff --git a/stepmania/src/arch/arch.cpp b/stepmania/src/arch/arch.cpp index 2d05953a69..4525f59af7 100644 --- a/stepmania/src/arch/arch.cpp +++ b/stepmania/src/arch/arch.cpp @@ -112,71 +112,6 @@ MemoryCardDriver *MakeMemoryCardDriver() return ret; } -static LocalizedString SOUND_DRIVERS_CANNOT_EMPTY( "Arch", "Sound Drivers cannot be empty." ); -RageSoundDriver *MakeRageSoundDriver( const RString &drivers ) -{ - vector DriversToTry; - split( drivers, ",", DriversToTry, true ); - - if( DriversToTry.empty() ) - RageException::Throw( "%s", SOUND_DRIVERS_CANNOT_EMPTY.GetValue().c_str() ); - - RString Driver; - RageSoundDriver *ret = NULL; - - for( unsigned i = 0; ret == NULL && i < DriversToTry.size(); ++i ) - { - Driver = DriversToTry[i]; - LOG->Trace( "Initializing driver: %s", DriversToTry[i].c_str() ); - -#ifdef USE_RAGE_SOUND_ALSA9 - if( !DriversToTry[i].CompareNoCase("ALSA") ) ret = new RageSound_ALSA9; -#endif -#ifdef USE_RAGE_SOUND_ALSA9_SOFTWARE - if( !DriversToTry[i].CompareNoCase("ALSA-sw") ) ret = new RageSound_ALSA9_Software; -#endif -#ifdef USE_RAGE_SOUND_CA - if( !DriversToTry[i].CompareNoCase("CoreAudio") ) ret = new RageSound_CA; -#endif -#ifdef USE_RAGE_SOUND_AU - if( !DriversToTry[i].CompareNoCase("AudioUnit") ) ret = new RageSound_AU; -#endif -#ifdef USE_RAGE_SOUND_DSOUND - if( !DriversToTry[i].CompareNoCase("DirectSound") ) ret = new RageSound_DSound; -#endif -#ifdef USE_RAGE_SOUND_DSOUND_SOFTWARE - if( !DriversToTry[i].CompareNoCase("DirectSound-sw") ) ret = new RageSound_DSound_Software; -#endif -#ifdef USE_RAGE_SOUND_NULL - if( !DriversToTry[i].CompareNoCase("Null") ) ret = new RageSound_Null; -#endif -#ifdef USE_RAGE_SOUND_OSS - if( !DriversToTry[i].CompareNoCase("OSS") ) ret = new RageSound_OSS; -#endif -#ifdef USE_RAGE_SOUND_WAVE_OUT - if( !DriversToTry[i].CompareNoCase("WaveOut") ) ret = new RageSound_WaveOut; -#endif - - if( ret == NULL ) - { - LOG->Trace( "Unknown sound driver name: %s", DriversToTry[i].c_str() ); - continue; - } - - RString sError = ret->Init(); - if( sError != "" ) - { - LOG->Info( "Couldn't load driver %s: %s", DriversToTry[i].c_str(), sError.c_str() ); - SAFE_DELETE( ret ); - } - } - - if( ret ) - LOG->Info( "Sound driver: %s", Driver.c_str() ); - - return ret; -} - /* * (c) 2002-2005 Glenn Maynard, Ben Anderson * All rights reserved. diff --git a/stepmania/src/arch/arch_default.h b/stepmania/src/arch/arch_default.h index 4afba7a8f2..3d7e99c846 100644 --- a/stepmania/src/arch/arch_default.h +++ b/stepmania/src/arch/arch_default.h @@ -8,9 +8,6 @@ #include "LoadingWindow/LoadingWindow_Win32.h" #include "LowLevelWindow/LowLevelWindow_Win32.h" #include "MemoryCard/MemoryCardDriverThreaded_Windows.h" -#include "Sound/RageSoundDriver_DSound.h" -#include "Sound/RageSoundDriver_DSound_Software.h" -#include "Sound/RageSoundDriver_WaveOut.h" #define DEFAULT_INPUT_DRIVER_LIST "DirectInput,Pump,Para" #define DEFAULT_MOVIE_DRIVER_LIST "Theora,FFMpeg,DShow,Null" #define DEFAULT_SOUND_DRIVER_LIST "DirectSound,DirectSound-sw,WaveOut,Null" @@ -21,8 +18,6 @@ #include "LoadingWindow/LoadingWindow_Cocoa.h" #include "LowLevelWindow/LowLevelWindow_Cocoa.h" #include "MemoryCard/MemoryCardDriverThreaded_OSX.h" -#include "Sound/RageSoundDriver_CA.h" -#include "Sound/RageSoundDriver_AU.h" #define DEFAULT_INPUT_DRIVER_LIST "Carbon" #define DEFAULT_MOVIE_DRIVER_LIST "Theora,FFMpeg,Null" #define DEFAULT_SOUND_DRIVER_LIST "AudioUnit,CoreAudio,Null" @@ -33,8 +28,6 @@ #include "LoadingWindow/LoadingWindow_Xbox.h" #include "LowLevelWindow/LowLevelWindow_Win32.h" #include "MemoryCard/MemoryCardDriverThreaded_Windows.h" -#include "Sound/RageSoundDriver_DSound.h" -#include "Sound/RageSoundDriver_DSound_Software.h" #define DEFAULT_INPUT_DRIVER_LIST "Xbox" #define DEFAULT_MOVIE_DRIVER_LIST "Theora,FFMpeg,DShow,Null" #define DEFAULT_SOUND_DRIVER_LIST "DirectSound,DirectSound-sw,Null" @@ -56,13 +49,6 @@ #if defined(HAVE_GTK) #include "LoadingWindow/LoadingWindow_Gtk.h" #endif -#ifdef HAVE_ALSA -#include "Sound/RageSoundDriver_ALSA9.h" -#include "Sound/RageSoundDriver_ALSA9_Software.h" -#endif -#ifdef HAVE_OSS -#include "Sound/RageSoundDriver_OSS.h" -#endif #if defined(LINUX) #define DEFAULT_INPUT_DRIVER_LIST "X11,Joystick" #else @@ -78,7 +64,6 @@ #include "Lights/LightsDriver_SystemMessage.h" #include "Lights/LightsDriver_Null.h" #include "LoadingWindow/LoadingWindow_Null.h" -#include "Sound/RageSoundDriver_Null.h" #include "MemoryCard/MemoryCardDriver_Null.h" #endif