diff --git a/stepmania/src/arch/arch.cpp b/stepmania/src/arch/arch.cpp new file mode 100644 index 0000000000..e93543b164 --- /dev/null +++ b/stepmania/src/arch/arch.cpp @@ -0,0 +1,361 @@ +/* + * This file provides functions to create driver objects. + */ + +#include "global.h" +#include "RageLog.h" +#include "RageUtil.h" + +#include "PrefsManager.h" +#include "arch.h" +#include "arch_platform.h" + +#include "ArchHooks/Selector_ArchHooks.h" +ArchHooks *MakeArchHooks() +{ + return new ARCH_HOOKS; +} + +#include "Dialog/Selector_Dialog.h" +DialogDriver *MakeDialogDriver() +{ + CString drivers = "win32,cocoa,null"; + CStringArray DriversToTry; + split(drivers, ",", DriversToTry, true); + + ASSERT( DriversToTry.size() != 0 ); + + CString Driver; + DialogDriver *ret = NULL; + + for( unsigned i = 0; ret == NULL && i < DriversToTry.size(); ++i ) + { + Driver = DriversToTry[i]; + +#ifdef USE_DIALOG_DRIVER_COCOA + if( !DriversToTry[i].CompareNoCase("Cocoa") ) ret = new DialogDriver_Cocoa; +#endif +#ifdef USE_DIALOG_DRIVER_NULL + if( !DriversToTry[i].CompareNoCase("Null") ) ret = new DialogDriver_Null; +#endif +#ifdef USE_DIALOG_DRIVER_WIN32 + if( !DriversToTry[i].CompareNoCase("Win32") ) ret = new DialogDriver_Win32; +#endif + + if( ret == NULL ) + { + continue; + } + + CString sError = ret->Init(); + if( sError != "" ) + { + if( LOG ) + LOG->Info( "Couldn't load driver %s: %s", DriversToTry[i].c_str(), sError.c_str() ); + SAFE_DELETE( ret ); + } + } + + return ret; +} + +#include "InputHandler/Selector_InputHandler.h" +void MakeInputHandlers(CString drivers, vector &Add) +{ + CStringArray DriversToTry; + split(drivers, ",", DriversToTry, true); + + ASSERT( DriversToTry.size() != 0 ); + + CString Driver; + + for(unsigned i = 0; i < DriversToTry.size(); ++i) + { +#ifdef USE_INPUT_HANDLER_DIRECTINPUT + if(!DriversToTry[i].CompareNoCase("DirectInput") ) Add.push_back(new InputHandler_DInput); +#endif +#ifdef USE_INPUT_HANDLER_LINUX_JOYSTICK + if(!DriversToTry[i].CompareNoCase("Linux_Joystick") ) Add.push_back(new InputHandler_Linux_Joystick); +#endif +#ifdef USE_INPUT_HANDLER_LINUX_TTY + if(!DriversToTry[i].CompareNoCase("Linux_tty") ) Add.push_back(new InputHandler_Linux_tty); +#endif +#ifdef USE_INPUT_HANDLER_MONKEY_KEYBOARD + if(!DriversToTry[i].CompareNoCase("MonkeyKeyboard") ) Add.push_back(new InputHandler_MonkeyKeyboard); +#endif +#ifdef USE_INPUT_HANDLER_SDL + if(!DriversToTry[i].CompareNoCase("SDL") ) Add.push_back(new InputHandler_SDL); +#endif +#ifdef USE_INPUT_HANDLER_WIN32_PARA + if(!DriversToTry[i].CompareNoCase("Para") ) Add.push_back(new InputHandler_Win32_Para); +#endif +#ifdef USE_INPUT_HANDLER_WIN32_PUMP + if(!DriversToTry[i].CompareNoCase("Pump") ) Add.push_back(new InputHandler_Win32_Pump); +#endif +#ifdef USE_INPUT_HANDLER_X11 + if(!DriversToTry[i].CompareNoCase("X11") ) Add.push_back(new InputHandler_X11); +#endif +#ifdef USE_INPUT_HANDLER_XBOX + if(!DriversToTry[i].CompareNoCase("Xbox") ) Add.push_back(new InputHandler_Xbox); +#endif + } +} + +#include "Lights/Selector_LightsDriver.h" +LightsDriver *MakeLightsDriver(CString driver) +{ + LOG->Trace( "Initializing lights driver: %s", driver.c_str() ); + + LightsDriver *ret = NULL; + +#ifdef USE_LIGHTS_DRIVER_LINUX_PARALLEL + if( !driver.CompareNoCase("LinuxParallel") ) ret = new LightsDriver_LinuxParallel; +#endif +#ifdef USE_LIGHTS_DRIVER_LINUX_WEEDTECH + if( !driver.CompareNoCase("WeedTech") ) ret = new LightsDriver_LinuxWeedTech; +#endif +#ifdef USE_LIGHTS_DRIVER_NULL + if( !driver.CompareNoCase("Null") ) ret = new LightsDriver_Null; +#endif +#ifdef USE_LIGHTS_DRIVER_SYSTEM_MESSAGE + if( !driver.CompareNoCase("SystemMessage") ) ret = new LightsDriver_SystemMessage; +#endif +#ifdef USE_LIGHTS_DRIVER_WIN32_PARALLEL + if( !driver.CompareNoCase("Parallel") ) ret = new LightsDriver_Win32Parallel; +#endif + + if( ret == NULL ) + LOG->Warn( "Unknown lights driver name: %s", driver.c_str() ); + + return ret; +} + +#include "LoadingWindow/Selector_LoadingWindow.h" +LoadingWindow *MakeLoadingWindow() +{ + if( !PREFSMAN->m_bShowLoadingWindow ) + return new LoadingWindow_Null; + + /* Don't load NULL by default. On most systems, if we can't load the SDL + * loading window, we won't be able to init OpenGL, either, so don't bother. */ + CString drivers = "xbox,win32,cocoa,gtk,sdl"; + CStringArray DriversToTry; + split(drivers, ",", DriversToTry, true); + + ASSERT( DriversToTry.size() != 0 ); + + CString Driver; + LoadingWindow *ret = NULL; + + for(unsigned i = 0; ret == NULL && i < DriversToTry.size(); ++i) + { + Driver = DriversToTry[i]; + +#ifdef USE_LOADING_WINDOW_COCOA + if(!DriversToTry[i].CompareNoCase("Cocoa") ) ret = new LoadingWindow_Cocoa; +#endif +#ifdef USE_LOADING_WINDOW_GTK + if(!DriversToTry[i].CompareNoCase("Gtk") ) ret = new LoadingWindow_Gtk; +#endif +#ifdef USE_LOADING_WINDOW_NULL + if(!DriversToTry[i].CompareNoCase("Null") ) ret = new LoadingWindow_Null; +#endif +#ifdef USE_LOADING_WINDOW_SDL + if(!DriversToTry[i].CompareNoCase("SDL") ) ret = new LoadingWindow_SDL; +#endif +#ifdef USE_LOADING_WINDOW_WIN32 + if(!DriversToTry[i].CompareNoCase("Win32") ) ret = new LoadingWindow_Win32; +#endif +#ifdef USE_LOADING_WINDOW_XBOX + if(!DriversToTry[i].CompareNoCase("Xbox") ) ret = new LoadingWindow_Xbox; +#endif + + + if( ret == NULL ) + continue; + + CString 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("Loading window: %s", Driver.c_str()); + + return ret; +} + +#include "LowLevelWindow/Selector_LowLevelWindow.h" +LowLevelWindow *MakeLowLevelWindow() +{ + return new ARCH_LOW_LEVEL_WINDOW; +} + +#include "MemoryCard/MemoryCardDriver_Null.h" +#include "MemoryCard/Selector_MemoryCardDriver.h" +MemoryCardDriver *MakeMemoryCardDriver() +{ + if( !PREFSMAN->m_bMemoryCards ) + return new MemoryCardDriver_Null; + + MemoryCardDriver *ret = NULL; + +#ifdef ARCH_MEMORY_CARD_DRIVER + ret = new ARCH_MEMORY_CARD_DRIVER; +#endif + + if( !ret ) + ret = new MemoryCardDriver_Null; + + return ret; +} + +#include "MovieTexture/Selector_MovieTexture.h" +static void DumpAVIDebugInfo(CString); +/* Try drivers in order of preference until we find one that works. */ +RageMovieTexture *MakeRageMovieTexture(RageTextureID ID) +{ + DumpAVIDebugInfo( ID.filename ); + + CStringArray DriversToTry; + split(PREFSMAN->m_sMovieDrivers, ",", DriversToTry, true); + ASSERT(DriversToTry.size() != 0); + + CString Driver; + RageMovieTexture *ret = NULL; + + for( unsigned i=0; ret==NULL && iTrace("Initializing driver: %s", Driver.c_str()); +#ifdef USE_MOVIE_TEXTURE_DSHOW + if( !Driver.CompareNoCase("DShow") ) ret = new MovieTexture_DShow(ID); +#endif +#ifdef USE_MOVIE_TEXTURE_FFMPEG + if( !Driver.CompareNoCase("FFMpeg") ) ret = new MovieTexture_FFMpeg(ID); +#endif +#ifdef USE_MOVIE_TEXTURE_NULL + if( !Driver.CompareNoCase("Null") ) ret = new MovieTexture_Null(ID); +#endif + if( ret == NULL ) + { + LOG->Warn( "Unknown movie driver name: %s", Driver.c_str() ); + continue; + } + + CString sError = ret->Init(); + if( sError != "" ) + { + LOG->Info( "Couldn't load driver %s: %s", Driver.c_str(), sError.c_str() ); + SAFE_DELETE( ret ); + } + } + if (!ret) + RageException::Throw("Couldn't create a movie texture"); + + LOG->Trace("Created movie texture \"%s\" with driver \"%s\"", + ID.filename.c_str(), Driver.c_str() ); + return ret; +} + +#include "Sound/Selector_RageSoundDriver.h" +RageSoundDriver *MakeRageSoundDriver(CString drivers) +{ + CStringArray DriversToTry; + split(drivers, ",", DriversToTry, true); + + ASSERT( DriversToTry.size() != 0 ); + + CString 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_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_QT1 + if(!DriversToTry[i].CompareNoCase("QT1")) ret = new RageSound_QT1; +#endif +#ifdef USE_RAGE_SOUND_WAVE_OUT + if(!DriversToTry[i].CompareNoCase("WaveOut")) ret = new RageSound_WaveOut; +#endif + + if( ret == NULL ) + { + LOG->Warn( "Unknown sound driver name: %s", DriversToTry[i].c_str() ); + continue; + } + + CString 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; +} + +// Helper for MakeRageMovieTexture() +static void DumpAVIDebugInfo( CString fn ) +{ + CString type, handler; + if( !RageMovieTexture::GetFourCC( fn, handler, type ) ) + return; + + LOG->Trace("Movie %s has handler '%s', type '%s'", fn.c_str(), handler.c_str(), type.c_str()); +} + +/* + * (c) 2002-2005 Glenn Maynard, Ben Anderson + * 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/arch.h b/stepmania/src/arch/arch.h new file mode 100644 index 0000000000..6684503c8c --- /dev/null +++ b/stepmania/src/arch/arch.h @@ -0,0 +1,70 @@ +#ifndef ARCH_H +#define ARCH_H + +#include "global.h" +#include "RageTextureID.h" + +/* Include this file if you need to create an instance of a driver object. */ +class ArchHooks; +ArchHooks *MakeArchHooks(); + +class DialogDriver; +DialogDriver *MakeDialogDriver(); + +class InputHandler; +void MakeInputHandlers(CString drivers, vector &Add); + +class LightsDriver; +LightsDriver *MakeLightsDriver(CString driver); + +class LoadingWindow; +LoadingWindow *MakeLoadingWindow(); + +class LowLevelWindow; +LowLevelWindow *MakeLowLevelWindow(); + +class MemoryCardDriver; +MemoryCardDriver *MakeMemoryCardDriver(); + +class RageMovieTexture; +RageMovieTexture *MakeRageMovieTexture(RageTextureID ID); + +class RageSoundDriver; +RageSoundDriver *MakeRageSoundDriver(CString drivers); + +// Put renderers switch here, makes things cleaner +#if defined(_WINDOWS) +#define SUPPORT_OPENGL +#define SUPPORT_D3D +#elif defined(_XBOX) +#define SUPPORT_D3D +#else +#define SUPPORT_OPENGL +#endif + +#endif + +/* + * (c) 2002-2005 Glenn Maynard, Ben Anderson + * 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. + */