diff --git a/stella/src/common/FrameBufferGL.cxx b/stella/src/common/FrameBufferGL.cxx index 191e17768..b54db0566 100644 --- a/stella/src/common/FrameBufferGL.cxx +++ b/stella/src/common/FrameBufferGL.cxx @@ -13,7 +13,7 @@ // See the file "license" for information on usage and redistribution of // this file, and for a DISCLAIMER OF ALL WARRANTIES. // -// $Id: FrameBufferGL.cxx,v 1.13 2005-02-21 02:23:48 stephena Exp $ +// $Id: FrameBufferGL.cxx,v 1.14 2005-02-22 18:40:52 stephena Exp $ //============================================================================ #include @@ -22,14 +22,15 @@ #include "Console.hxx" #include "FrameBuffer.hxx" -#include "FrameBufferSDL.hxx" #include "FrameBufferGL.hxx" #include "MediaSrc.hxx" #include "Settings.hxx" +#include "OSystem.hxx" // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -FrameBufferGL::FrameBufferGL() - : myTexture(0), +FrameBufferGL::FrameBufferGL(OSystem* osystem) + : FrameBuffer(osystem), + myTexture(0), myScreenmode(0), myScreenmodeCount(0), myFilterParam(GL_NEAREST), @@ -50,42 +51,23 @@ FrameBufferGL::~FrameBufferGL() // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - bool FrameBufferGL::initSubsystem() { - // Get the desired width and height of the display - myWidth = myMediaSource->width() << 1; - myHeight = myMediaSource->height(); + mySDLFlags |= SDL_OPENGL; // Get the aspect ratio for the display // Since the display is already doubled horizontally, we half the // ratio that is provided - theAspectRatio = myConsole->settings().getFloat("gl_aspect") / 2; + theAspectRatio = myOSystem->settings().getFloat("gl_aspect") / 2; if(theAspectRatio <= 0.0) theAspectRatio = 1.0; - // Now create the OpenGL SDL screen - Uint32 initflags = SDL_INIT_VIDEO | SDL_INIT_TIMER; - if(SDL_Init(initflags) < 0) - return false; - - // Check which system we are running under - // Get the system-specific WM information - SDL_VERSION(&myWMInfo.version); - if(SDL_GetWMInfo(&myWMInfo) > 0) - myWMAvailable = true; - // Get the maximum size of a window for THIS screen theMaxZoomLevel = maxWindowSizeForScreen(); // Check to see if window size will fit in the screen - if((uInt32)myConsole->settings().getInt("zoom") > theMaxZoomLevel) + if((uInt32)myOSystem->settings().getInt("zoom") > theMaxZoomLevel) theZoomLevel = theMaxZoomLevel; else - theZoomLevel = myConsole->settings().getInt("zoom"); - - mySDLFlags = SDL_OPENGL; - mySDLFlags |= myConsole->settings().getBool("fullscreen") ? SDL_FULLSCREEN : 0; - - // Set the window title and icon - setWindowAttributes(); + theZoomLevel = myOSystem->settings().getInt("zoom"); // Set up the OpenGL attributes myDepth = SDL_GetVideoInfo()->vfmt->BitsPerPixel; @@ -156,23 +138,8 @@ bool FrameBufferGL::initSubsystem() // and the textures setupPalette(); - // Make sure that theUseFullScreenFlag sets up fullscreen mode correctly - if(myConsole->settings().getBool("fullscreen")) - { - grabMouse(true); - showCursor(false); - } - else - { - // Keep mouse in game window if grabmouse is selected - grabMouse(myConsole->settings().getBool("grabmouse")); - - // Show or hide the cursor depending on the 'hidecursor' argument - showCursor(!myConsole->settings().getBool("hidecursor")); - } - // Show some OpenGL info - if(myConsole->settings().getBool("showinfo")) + if(myOSystem->settings().getBool("showinfo")) { cout << "Video rendering: OpenGL mode" << endl; @@ -247,11 +214,13 @@ bool FrameBufferGL::createScreen() // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void FrameBufferGL::drawMediaSource() { + MediaSource& mediasrc = myOSystem->console().mediaSource(); + // Copy the mediasource framebuffer to the RGB texture - uInt8* currentFrame = myMediaSource->currentFrameBuffer(); - uInt8* previousFrame = myMediaSource->previousFrameBuffer(); - uInt32 width = myMediaSource->width(); - uInt32 height = myMediaSource->height(); + uInt8* currentFrame = mediasrc.currentFrameBuffer(); + uInt8* previousFrame = mediasrc.previousFrameBuffer(); + uInt32 width = mediasrc.width(); + uInt32 height = mediasrc.height(); uInt16* buffer = (uInt16*) myTexture->pixels; register uInt32 y; @@ -384,7 +353,7 @@ bool FrameBufferGL::createTextures() return false; // Create an OpenGL texture from the SDL texture - string filter = myConsole->settings().getString("gl_filter"); + string filter = myOSystem->settings().getString("gl_filter"); if(filter == "linear") { myFilterParam = GL_LINEAR; @@ -471,13 +440,13 @@ void FrameBufferGL::toggleFilter() if(myFilterParam == GL_NEAREST) { myFilterParam = GL_LINEAR; - myConsole->settings().setString("gl_filter", "linear"); + myOSystem->settings().setString("gl_filter", "linear"); showMessage("Filtering: GL_LINEAR"); } else { myFilterParam = GL_NEAREST; - myConsole->settings().setString("gl_filter", "nearest"); + myOSystem->settings().setString("gl_filter", "nearest"); showMessage("Filtering: GL_NEAREST"); } @@ -523,7 +492,7 @@ void FrameBufferGL::viewport(uInt32* screenWidth, uInt32* screenHeight, uInt32 desktopWidth = this->screenWidth(); uInt32 desktopHeight = this->screenHeight(); - if(myConsole->settings().getBool("gl_fsmax") && + if(myOSystem->settings().getBool("gl_fsmax") && desktopWidth != 0 && desktopHeight != 0) { // Use the largest available screen size @@ -543,7 +512,7 @@ void FrameBufferGL::viewport(uInt32* screenWidth, uInt32* screenHeight, iwidth = (Uint16) (scale * iwidth); iheight = (Uint16) (scale * iheight); } - else if(myConsole->settings().getBool("gl_fsmax") && + else if(myOSystem->settings().getBool("gl_fsmax") && myScreenmode != (SDL_Rect**) -1) { // Use the largest available screen size diff --git a/stella/src/common/FrameBufferGL.hxx b/stella/src/common/FrameBufferGL.hxx index 5823fdd6b..57908498f 100644 --- a/stella/src/common/FrameBufferGL.hxx +++ b/stella/src/common/FrameBufferGL.hxx @@ -13,7 +13,7 @@ // See the file "license" for information on usage and redistribution of // this file, and for a DISCLAIMER OF ALL WARRANTIES. // -// $Id: FrameBufferGL.hxx,v 1.7 2005-02-21 02:23:48 stephena Exp $ +// $Id: FrameBufferGL.hxx,v 1.8 2005-02-22 18:40:53 stephena Exp $ //============================================================================ #ifndef FRAMEBUFFER_GL_HXX @@ -23,6 +23,8 @@ #include #include +class OSystem; + #include "bspf.hxx" #include "FrameBuffer.hxx" @@ -31,7 +33,7 @@ This class implements an SDL OpenGL framebuffer. @author Stephen Anthony - @version $Id: FrameBufferGL.hxx,v 1.7 2005-02-21 02:23:48 stephena Exp $ + @version $Id: FrameBufferGL.hxx,v 1.8 2005-02-22 18:40:53 stephena Exp $ */ class FrameBufferGL : public FrameBuffer { @@ -39,22 +41,22 @@ class FrameBufferGL : public FrameBuffer /** Creates a new OpenGL framebuffer */ - FrameBufferGL(); + FrameBufferGL(OSystem* osystem); /** Destructor */ virtual ~FrameBufferGL(); - /** - Switches between the two filtering options in OpenGL. - Currently, these are GL_NEAREST and GL_LINEAR. - */ - void toggleFilter(); - ////////////////////////////////////////////////////////////////////// // The following methods are derived from FrameBuffer.hxx ////////////////////////////////////////////////////////////////////// + /** + This routine is called to initialize OpenGL video mode. + Return false if any operation fails, otherwise return true. + */ + virtual bool initSubsystem(); + /** This routine is called whenever the screen needs to be recreated. It updates the global screen variable. @@ -69,21 +71,13 @@ class FrameBufferGL : public FrameBuffer @param b The blue component of the color. */ virtual Uint32 mapRGB(Uint8 r, Uint8 g, Uint8 b) - { return SDL_MapRGB(myTexture->format, r, g, b); } + { return SDL_MapRGB(myScreen->format, r, g, b); } /** - This routine is called to get the specified scanline data. - - @param row The row we are looking for - @param data The actual pixel data (in bytes) + Switches between the two filtering options in OpenGL. + Currently, these are GL_NEAREST and GL_LINEAR. */ - virtual void scanline(uInt32 row, uInt8* data); - - /** - This routine should be called to setup the video system for us to use. - Return false if any operation fails, otherwise return true. - */ - virtual bool initSubsystem(); + virtual void toggleFilter(); /** This routine should be called anytime the MediaSource needs to be redrawn @@ -130,8 +124,15 @@ class FrameBufferGL : public FrameBuffer */ virtual void postFrameUpdate(); - private: + /** + This routine is called to get the specified scanline data. + @param row The row we are looking for + @param data The actual pixel data (in bytes) + */ + virtual void scanline(uInt32 row, uInt8* data); + + private: bool createTextures(); void viewport(uInt32* screenWidth, uInt32* screenHeight, diff --git a/stella/src/common/FrameBufferSoft.cxx b/stella/src/common/FrameBufferSoft.cxx index d05738e81..f75ac80a4 100644 --- a/stella/src/common/FrameBufferSoft.cxx +++ b/stella/src/common/FrameBufferSoft.cxx @@ -13,7 +13,7 @@ // See the file "license" for information on usage and redistribution of // this file, and for a DISCLAIMER OF ALL WARRANTIES. // -// $Id: FrameBufferSoft.cxx,v 1.8 2005-02-21 20:41:18 stephena Exp $ +// $Id: FrameBufferSoft.cxx,v 1.9 2005-02-22 18:40:55 stephena Exp $ //============================================================================ #include @@ -62,9 +62,6 @@ bool FrameBufferSoft::initSubsystem() else theZoomLevel = myOSystem->settings().getInt("zoom"); - // Set the window title and icon - setWindowAttributes(); - // Create the screen if(!createScreen()) return false; @@ -95,6 +92,12 @@ bool FrameBufferSoft::createScreen() return true; } +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +void FrameBufferSoft::toggleFilter() +{ + // No filter added yet ... +} + // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void FrameBufferSoft::drawMediaSource() { diff --git a/stella/src/common/FrameBufferSoft.hxx b/stella/src/common/FrameBufferSoft.hxx index d91f781d0..7440f76eb 100644 --- a/stella/src/common/FrameBufferSoft.hxx +++ b/stella/src/common/FrameBufferSoft.hxx @@ -13,7 +13,7 @@ // See the file "license" for information on usage and redistribution of // this file, and for a DISCLAIMER OF ALL WARRANTIES. // -// $Id: FrameBufferSoft.hxx,v 1.6 2005-02-21 20:41:19 stephena Exp $ +// $Id: FrameBufferSoft.hxx,v 1.7 2005-02-22 18:40:55 stephena Exp $ //============================================================================ #ifndef FRAMEBUFFER_SOFT_HXX @@ -34,7 +34,7 @@ class RectList; This class implements an SDL software framebuffer. @author Stephen Anthony - @version $Id: FrameBufferSoft.hxx,v 1.6 2005-02-21 20:41:19 stephena Exp $ + @version $Id: FrameBufferSoft.hxx,v 1.7 2005-02-22 18:40:55 stephena Exp $ */ class FrameBufferSoft : public FrameBuffer { @@ -74,6 +74,12 @@ class FrameBufferSoft : public FrameBuffer virtual Uint32 mapRGB(Uint8 r, Uint8 g, Uint8 b) { return SDL_MapRGB(myScreen->format, r, g, b); } + /** + Switches between the filtering options in software mode. + Currently, none exist. + */ + virtual void toggleFilter(); + /** This routine should be called anytime the MediaSource needs to be redrawn to the screen. diff --git a/stella/src/common/SoundSDL.cxx b/stella/src/common/SoundSDL.cxx index 2f76e13f4..1336f3e51 100644 --- a/stella/src/common/SoundSDL.cxx +++ b/stella/src/common/SoundSDL.cxx @@ -13,7 +13,7 @@ // See the file "license" for information on usage and redistribution of // this file, and for a DISCLAIMER OF ALL WARRANTIES. // -// $Id: SoundSDL.cxx,v 1.10 2005-02-22 02:59:53 stephena Exp $ +// $Id: SoundSDL.cxx,v 1.11 2005-02-22 18:40:55 stephena Exp $ //============================================================================ #include @@ -37,9 +37,6 @@ SoundSDL::SoundSDL(OSystem* osystem) myFragmentSizeLogBase2(0), myIsMuted(false) { - uInt32 fragsize = myOSystem->settings().getInt("fragsize"); - myVolume = myOSystem->settings().getInt("volume"); - if(SDL_InitSubSystem(SDL_INIT_AUDIO) < 0) { cerr << "WARNING: Couldn't initialize SDL audio system! " << endl; @@ -48,6 +45,8 @@ SoundSDL::SoundSDL(OSystem* osystem) } else { + uInt32 fragsize = myOSystem->settings().getInt("fragsize"); + SDL_AudioSpec desired; desired.freq = 31400; desired.format = AUDIO_U8; @@ -93,6 +92,16 @@ SoundSDL::SoundSDL(OSystem* osystem) // And start the SDL sound subsystem ... SDL_PauseAudio(0); + + // Adjust volume to that defined in settings + myVolume = myOSystem->settings().getInt("volume"); + setVolume(myVolume); + + // Show some info + if(myOSystem->settings().getBool("showinfo")) + cout << "Sound enabled:" << endl + << " Volume : " << myVolume << endl + << " Frag size: " << fragsize << endl << endl; } } diff --git a/stella/src/common/mainSDL.cxx b/stella/src/common/mainSDL.cxx index 66b5c877f..da51e2ad5 100644 --- a/stella/src/common/mainSDL.cxx +++ b/stella/src/common/mainSDL.cxx @@ -13,7 +13,7 @@ // See the file "license" for information on usage and redistribution of // this file, and for a DISCLAIMER OF ALL WARRANTIES. // -// $Id: mainSDL.cxx,v 1.23 2005-02-22 02:59:53 stephena Exp $ +// $Id: mainSDL.cxx,v 1.24 2005-02-22 18:40:56 stephena Exp $ //============================================================================ #include @@ -45,9 +45,6 @@ #ifdef DISPLAY_OPENGL #include "FrameBufferGL.hxx" - - // Indicates whether to use OpenGL mode - static bool theUseOpenGLFlag; #endif #if defined(UNIX) @@ -442,12 +439,10 @@ void HandleEvents() theSound->adjustVolume(1); break; -#ifdef DISPLAY_OPENGL case SDLK_f: - if(theUseOpenGLFlag) - ((FrameBufferGL*)theDisplay)->toggleFilter(); + theDisplay->toggleFilter(); break; -#endif + #ifdef DEVELOPER_SUPPORT case SDLK_END: // Alt-End increases XStart theOSystem->console().changeXStart(1); @@ -545,10 +540,10 @@ void HandleEvents() case SDLK_s: // Ctrl-s saves properties to a file // Attempt to merge with propertiesSet if(theSettings->getBool("mergeprops")) - theOSystem->console().saveProperties(theSettings->propertiesOutputFilename(), true); + theOSystem->console().saveProperties(theOSystem->propertiesOutputFilename(), true); else // Save to file in home directory { - string newPropertiesFile = theSettings->baseDir() + "/" + \ + string newPropertiesFile = theOSystem->baseDir() + "/" + \ theOSystem->console().properties().get("Cartridge.Name") + ".pro"; theOSystem->console().saveProperties(newPropertiesFile); } @@ -766,7 +761,7 @@ void SetupProperties(PropertiesSet& set) { bool useMemList = false; string theAltPropertiesFile = theSettings->getString("altpro"); - string thePropertiesFile = theSettings->propertiesInputFilename(); + string thePropertiesFile = theOSystem->propertiesInputFilename(); // When 'listrominfo' or 'mergeprops' is specified, we need to have the // full list in memory @@ -897,20 +892,13 @@ int main(int argc, char* argv[]) // Create an SDL window string videodriver = theSettings->getString("video"); if(videodriver == "soft") - { theDisplay = new FrameBufferSoft(theOSystem); - } #ifdef DISPLAY_OPENGL else if(videodriver == "gl") - { - theDisplay = new FrameBufferGL(); - theUseOpenGLFlag = true; - } + theDisplay = new FrameBufferGL(theOSystem); #endif else // a driver that doesn't exist was requested, so use software mode - { theDisplay = new FrameBufferSoft(theOSystem); - } if(!theDisplay) { @@ -920,22 +908,11 @@ int main(int argc, char* argv[]) return 0; } - // Create a sound object for playing audio + // Create a sound object for playing audio, even if sound has been disabled if(theSettings->getBool("sound")) - { theSound = new SoundSDL(theOSystem); - - ostringstream message; - message << "Sound enabled:" << endl; -//FIXME << " Volume : " << volume << endl -// << " Frag size: " << fragsize << endl; - ShowInfo(message.str()); - } - else // even if sound has been disabled, we still need a sound object - { + else theSound = new Sound(theOSystem); - ShowInfo("Sound disabled"); - } // Get a pointer to the file which contains the cartridge ROM const char* file = argv[argc - 1]; @@ -954,7 +931,7 @@ int main(int argc, char* argv[]) uInt32 size = in.gcount(); in.close(); - // Create the 2600 game console + // Create an instance of the 2600 game console Console* theConsole = (Console*) NULL; theConsole = new Console(image, size, theOSystem); diff --git a/stella/src/emucore/FrameBuffer.cxx b/stella/src/emucore/FrameBuffer.cxx index 5de44799e..741fb5b7a 100644 --- a/stella/src/emucore/FrameBuffer.cxx +++ b/stella/src/emucore/FrameBuffer.cxx @@ -13,7 +13,7 @@ // See the file "license" for information on usage and redistribution of // this file, and for a DISCLAIMER OF ALL WARRANTIES. // -// $Id: FrameBuffer.cxx,v 1.15 2005-02-22 02:59:54 stephena Exp $ +// $Id: FrameBuffer.cxx,v 1.16 2005-02-22 18:40:59 stephena Exp $ //============================================================================ #include @@ -93,23 +93,33 @@ FrameBuffer::~FrameBuffer(void) // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void FrameBuffer::initialize(const string title, uInt32 width, uInt32 height) { - myWidth = width; - myHeight = height; + bool isAlreadyInitialized = (SDL_WasInit(SDL_INIT_VIDEO) & SDL_INIT_VIDEO) > 0; + myWidth = width; + myHeight = height; myFrameRate = myOSystem->settings().getInt("framerate"); - // Now initialize the SDL screen - Uint32 initflags = SDL_INIT_VIDEO | SDL_INIT_TIMER; - if(SDL_Init(initflags) < 0) - return; + // Now (re)initialize the SDL video system + if(!isAlreadyInitialized) + { + Uint32 initflags = SDL_INIT_VIDEO | SDL_INIT_TIMER; - // Get the system-specific WM information - SDL_VERSION(&myWMInfo.version); - if(SDL_GetWMInfo(&myWMInfo) > 0) - myWMAvailable = true; + if(SDL_Init(initflags) < 0) + return; + + // Get the system-specific WM information + SDL_VERSION(&myWMInfo.version); + if(SDL_GetWMInfo(&myWMInfo) > 0) + myWMAvailable = true; + + setWindowIcon(); + } mySDLFlags = myOSystem->settings().getBool("fullscreen") ? SDL_FULLSCREEN : 0; + // Set window title + setWindowTitle(title); + // Initialize video subsystem initSubsystem(); @@ -1029,13 +1039,14 @@ uInt32 FrameBuffer::screenHeight() } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -void FrameBuffer::setWindowAttributes() +void FrameBuffer::setWindowTitle(const string title) { - // Set the window title - ostringstream name; - name << "Stella: \"" << myOSystem->console().properties().get("Cartridge.Name") << "\""; - SDL_WM_SetCaption(name.str().c_str(), "stella"); + SDL_WM_SetCaption(title.c_str(), "stella"); +} +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +void FrameBuffer::setWindowIcon() +{ #ifndef MAC_OSX // Set the window icon uInt32 w, h, ncols, nbytes; @@ -1052,7 +1063,7 @@ void FrameBuffer::setWindowAttributes() for(uInt32 i = 0; i < ncols; i++) { unsigned char code; - char color[32]; + char color[32]; uInt32 col; sscanf(stella_icon[1 + i], "%c c %s", &code, color); diff --git a/stella/src/emucore/FrameBuffer.hxx b/stella/src/emucore/FrameBuffer.hxx index 92f35aac0..8b4b393ca 100644 --- a/stella/src/emucore/FrameBuffer.hxx +++ b/stella/src/emucore/FrameBuffer.hxx @@ -13,7 +13,7 @@ // See the file "license" for information on usage and redistribution of // this file, and for a DISCLAIMER OF ALL WARRANTIES. // -// $Id: FrameBuffer.hxx,v 1.15 2005-02-21 20:43:10 stephena Exp $ +// $Id: FrameBuffer.hxx,v 1.16 2005-02-22 18:41:11 stephena Exp $ //============================================================================ #ifndef FRAMEBUFFER_HXX @@ -39,7 +39,7 @@ FIXME This class also implements a MAME-like user interface where Stella settin can be changed. @author Stephen Anthony - @version $Id: FrameBuffer.hxx,v 1.15 2005-02-21 20:43:10 stephena Exp $ + @version $Id: FrameBuffer.hxx,v 1.16 2005-02-22 18:41:11 stephena Exp $ */ class FrameBuffer { @@ -55,7 +55,7 @@ class FrameBuffer virtual ~FrameBuffer(); /** - Initializes the framebuffer display. This must be called before any + (Re)initializes the framebuffer display. This must be called before any calls are made to derived methods. @param title The title of the window @@ -207,9 +207,9 @@ FIXME uInt32 maxWindowSizeForScreen(); /** - Set the title and icon for the main SDL window. + Set the title for the main SDL window. */ - void setWindowAttributes(); + void setWindowTitle(const string title); /** Set up the palette for a screen of any depth > 8. @@ -241,6 +241,11 @@ FIXME */ virtual Uint32 mapRGB(Uint8 r, Uint8 g, Uint8 b) = 0; + /** + Switches between the filtering options in the video subsystem. + */ + virtual void toggleFilter() = 0; + /** This routine should be called anytime the MediaSource needs to be redrawn to the screen. @@ -351,6 +356,11 @@ FIXME float theAspectRatio; private: + /** + Set the icon for the main SDL window. + */ + void setWindowIcon(); + // Enumeration representing the different types of user interface widgets enum Widget { W_NONE, MAIN_MENU, REMAP_MENU, INFO_MENU }; diff --git a/stella/src/emucore/OSystem.cxx b/stella/src/emucore/OSystem.cxx index ed2a89a2d..6144136ba 100644 --- a/stella/src/emucore/OSystem.cxx +++ b/stella/src/emucore/OSystem.cxx @@ -13,7 +13,7 @@ // See the file "license" for information on usage and redistribution of // this file, and for a DISCLAIMER OF ALL WARRANTIES. // -// $Id: OSystem.cxx,v 1.2 2005-02-21 20:43:20 stephena Exp $ +// $Id: OSystem.cxx,v 1.3 2005-02-22 18:41:12 stephena Exp $ //============================================================================ #include @@ -39,9 +39,33 @@ OSystem::~OSystem() } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -void OSystem::update() +void OSystem::setPropertiesFiles(const string& userprops, + const string& systemprops) { -// myFrameBuffer.update(); + // Set up the input and output properties files + myPropertiesOutputFile = userprops; + + if(fileExists(userprops)) + myPropertiesInputFile = userprops; + else if(fileExists(systemprops)) + myPropertiesInputFile = systemprops; + else + myPropertiesInputFile = ""; +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +void OSystem::setConfigFiles(const string& userconfig, + const string& systemconfig) +{ + // Set up the names of the input and output config files + myConfigOutputFile = userconfig; + + if(fileExists(userconfig)) + myConfigInputFile = userconfig; + else if(fileExists(systemconfig)) + myConfigInputFile = systemconfig; + else + myConfigInputFile = ""; } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/stella/src/emucore/OSystem.hxx b/stella/src/emucore/OSystem.hxx index 7bec499b4..74e8cdede 100644 --- a/stella/src/emucore/OSystem.hxx +++ b/stella/src/emucore/OSystem.hxx @@ -13,7 +13,7 @@ // See the file "license" for information on usage and redistribution of // this file, and for a DISCLAIMER OF ALL WARRANTIES. // -// $Id: OSystem.hxx,v 1.2 2005-02-21 20:43:20 stephena Exp $ +// $Id: OSystem.hxx,v 1.3 2005-02-22 18:41:12 stephena Exp $ //============================================================================ #ifndef OSYSTEM_HXX @@ -35,7 +35,7 @@ class PropertiesSet; other objects belong. @author Stephen Anthony - @version $Id: OSystem.hxx,v 1.2 2005-02-21 20:43:20 stephena Exp $ + @version $Id: OSystem.hxx,v 1.3 2005-02-22 18:41:12 stephena Exp $ */ class OSystem { @@ -51,12 +51,6 @@ class OSystem virtual ~OSystem(); public: - /** - Updates the osystem by one frame. Determines which subsystem should - be updated. Generally will be called 'framerate' times per second. - */ - void update(); - /** Adds the specified eventhandler to the system. @@ -146,6 +140,68 @@ class OSystem */ Console& console(void) const { return *myConsole; } + /** + Set the base directory for all configuration files + */ + void setBaseDir(const string& basedir) { myBaseDir = basedir; } + + /** + Set the directory where state files are stored + */ + void setStateDir(const string& statedir) { myStateDir = statedir; } + + /** + Set the locations of game properties files + */ + void setPropertiesFiles(const string& userprops, const string& systemprops); + + /** + Set the locations of config files + */ + void setConfigFiles(const string& userconfig, const string& systemconfig); + + /** + Return the default directory for storing data. + */ + string baseDir() { return myBaseDir; } + + /** + Return the directory for storing state files. + */ + string stateDir() { return myStateDir; } + + /** + This method should be called to get the filename of the + properties (stella.pro) file for the purpose of loading. + + @return String representing the full path of the properties filename. + */ + string propertiesInputFilename() { return myPropertiesInputFile; } + + /** + This method should be called to get the filename of the + properties (stella.pro) file for the purpose of saving. + + @return String representing the full path of the properties filename. + */ + string propertiesOutputFilename() { return myPropertiesOutputFile; } + + /** + This method should be called to get the filename of the config file + for the purpose of loading. + + @return String representing the full path of the config filename. + */ + string configInputFilename() { return myConfigInputFile; } + + /** + This method should be called to get the filename of the config file + for the purpose of saving. + + @return String representing the full path of the config filename. + */ + string configOutputFilename() { return myConfigOutputFile; } + public: ////////////////////////////////////////////////////////////////////// // The following methods are system-specific and must be implemented @@ -171,6 +227,15 @@ class OSystem */ virtual bool fileExists(const string& filename) = 0; + /** + This method should be called to create the specified directory. + + @param path The directory to create + + @return boolean representing whether or not the directory was created + */ + virtual bool makeDir(const string& path) = 0; + protected: // Pointer to the EventHandler object EventHandler* myEventHandler; @@ -190,6 +255,15 @@ class OSystem // Pointer to the (currently defined) Console object Console* myConsole; + private: + string myBaseDir; + string myStateDir; + + string myPropertiesInputFile; + string myPropertiesOutputFile; + string myConfigInputFile; + string myConfigOutputFile; + private: // Copy constructor isn't supported by this class so make it private OSystem(const OSystem&); diff --git a/stella/src/emucore/Settings.cxx b/stella/src/emucore/Settings.cxx index 8e120739b..227df4ab9 100644 --- a/stella/src/emucore/Settings.cxx +++ b/stella/src/emucore/Settings.cxx @@ -13,7 +13,7 @@ // See the file "license" for information on usage and redistribution of // this file, and for a DISCLAIMER OF ALL WARRANTIES. // -// $Id: Settings.cxx,v 1.32 2005-02-21 20:43:20 stephena Exp $ +// $Id: Settings.cxx,v 1.33 2005-02-22 18:41:12 stephena Exp $ //============================================================================ #include @@ -80,7 +80,7 @@ void Settings::loadConfig() string line, key, value; uInt32 equalPos; - ifstream in(myConfigInputFile.c_str()); + ifstream in(myOSystem->configInputFilename().c_str()); if(!in || !in.is_open()) { cout << "Error: Couldn't load settings file\n"; @@ -217,7 +217,7 @@ void Settings::usage() // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void Settings::saveConfig() { - ofstream out(myConfigOutputFile.c_str()); + ofstream out(myOSystem->configOutputFilename().c_str()); if(!out || !out.is_open()) { cout << "Error: Couldn't save settings file\n"; diff --git a/stella/src/emucore/Settings.hxx b/stella/src/emucore/Settings.hxx index 7890ee2e9..3715552fb 100644 --- a/stella/src/emucore/Settings.hxx +++ b/stella/src/emucore/Settings.hxx @@ -13,7 +13,7 @@ // See the file "license" for information on usage and redistribution of // this file, and for a DISCLAIMER OF ALL WARRANTIES. // -// $Id: Settings.hxx,v 1.20 2005-02-21 20:43:21 stephena Exp $ +// $Id: Settings.hxx,v 1.21 2005-02-22 18:41:14 stephena Exp $ //============================================================================ #ifndef SETTINGS_HXX @@ -28,7 +28,7 @@ class OSystem; This class provides an interface for accessing frontend specific settings. @author Stephen Anthony - @version $Id: Settings.hxx,v 1.20 2005-02-21 20:43:21 stephena Exp $ + @version $Id: Settings.hxx,v 1.21 2005-02-22 18:41:14 stephena Exp $ */ class Settings { @@ -138,61 +138,10 @@ class Settings */ void setString(const string& key, const string& value, bool save = true); - public: - /** - This method should be called to get the filename of the - properties (stella.pro) file for the purpose of loading. - - @return String representing the full path of the properties filename. - */ - string propertiesInputFilename() { return myPropertiesInputFile; } - - /** - This method should be called to get the filename of the - properties (stella.pro) file for the purpose of saving. - - @return String representing the full path of the properties filename. - */ - string propertiesOutputFilename() { return myPropertiesOutputFile; } - - - /** - This method should be called to get the filename of the config file - for the purpose of loading. - - @return String representing the full path of the config filename. - */ - string configInputFilename() { return myConfigInputFile; } - - /** - This method should be called to get the filename of the config file - for the purpose of saving. - - @return String representing the full path of the config filename. - */ - string configOutputFilename() { return myConfigOutputFile; } - - /** - Return the default directory for storing data. - */ - string baseDir() { return myBaseDir; } - - /** - Set the OSystem object for this settings class - */ - void setOSystem(OSystem* osystem) { myOSystem = osystem; } - protected: void set(const string& key, const string& value, bool save = true); - string myBaseDir; - string myStateDir; - - string myPropertiesInputFile; - string myPropertiesOutputFile; - string myConfigInputFile; - string myConfigOutputFile; - + // The parent OSystem object OSystem* myOSystem; // Structure used for storing settings diff --git a/stella/src/emucore/Sound.cxx b/stella/src/emucore/Sound.cxx index acda94d02..e41f2d245 100644 --- a/stella/src/emucore/Sound.cxx +++ b/stella/src/emucore/Sound.cxx @@ -13,13 +13,16 @@ // See the file "license" for information on usage and redistribution of // this file, and for a DISCLAIMER OF ALL WARRANTIES. // -// $Id: Sound.cxx,v 1.16 2005-02-22 02:59:54 stephena Exp $ +// $Id: Sound.cxx,v 1.17 2005-02-22 18:41:15 stephena Exp $ //============================================================================ #include "Serializer.hxx" #include "Deserializer.hxx" +#include "bspf.hxx" + #include "OSystem.hxx" +#include "Settings.hxx" #include "Sound.hxx" // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -30,6 +33,11 @@ Sound::Sound(OSystem* osystem) { // Add the sound object to the system myOSystem->attach(this); + + // Show some info + if(myOSystem->settings().getBool("showinfo") && + !myOSystem->settings().getBool("sound")) + cout << "Sound disabled." << endl << endl; } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/stella/src/unix/OSystemUNIX.cxx b/stella/src/unix/OSystemUNIX.cxx index 5b5281eb6..9422b917c 100644 --- a/stella/src/unix/OSystemUNIX.cxx +++ b/stella/src/unix/OSystemUNIX.cxx @@ -13,7 +13,7 @@ // See the file "license" for information on usage and redistribution of // this file, and for a DISCLAIMER OF ALL WARRANTIES. // -// $Id: OSystemUNIX.cxx,v 1.2 2005-02-21 20:43:47 stephena Exp $ +// $Id: OSystemUNIX.cxx,v 1.3 2005-02-22 18:41:15 stephena Exp $ //============================================================================ #include @@ -42,7 +42,7 @@ OSystemUNIX::~OSystemUNIX() string OSystemUNIX::stateFilename(const string& md5, uInt32 state) { ostringstream buf; -//FIXME buf << myStateDir << md5 << ".st" << state; + buf << stateDir() << "/" << md5 << ".st" << state; return buf.str(); } @@ -50,5 +50,11 @@ string OSystemUNIX::stateFilename(const string& md5, uInt32 state) // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - bool OSystemUNIX::fileExists(const string& filename) { - return (access(filename.c_str(), F_OK) == 0); + return access(filename.c_str(), F_OK) == 0; +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +bool OSystemUNIX::makeDir(const string& path) +{ + return mkdir(path.c_str(), 0777) == 0; } diff --git a/stella/src/unix/OSystemUNIX.hxx b/stella/src/unix/OSystemUNIX.hxx index 5958a782d..f022def71 100644 --- a/stella/src/unix/OSystemUNIX.hxx +++ b/stella/src/unix/OSystemUNIX.hxx @@ -13,7 +13,7 @@ // See the file "license" for information on usage and redistribution of // this file, and for a DISCLAIMER OF ALL WARRANTIES. // -// $Id: OSystemUNIX.hxx,v 1.2 2005-02-21 20:43:53 stephena Exp $ +// $Id: OSystemUNIX.hxx,v 1.3 2005-02-22 18:41:16 stephena Exp $ //============================================================================ #ifndef OSYSTEM_UNIX_HXX @@ -26,7 +26,7 @@ This class defines UNIX-like OS's (Linux) system specific settings. @author Stephen Anthony - @version $Id: OSystemUNIX.hxx,v 1.2 2005-02-21 20:43:53 stephena Exp $ + @version $Id: OSystemUNIX.hxx,v 1.3 2005-02-22 18:41:16 stephena Exp $ */ class OSystemUNIX : public OSystem { @@ -62,6 +62,15 @@ class OSystemUNIX : public OSystem @return boolean representing whether or not the file exists */ virtual bool fileExists(const string& filename); + + /** + This method should be called to create the specified directory. + + @param path The directory to create + + @return boolean representing whether or not the directory was created + */ + virtual bool makeDir(const string& path); }; #endif diff --git a/stella/src/unix/SettingsUNIX.cxx b/stella/src/unix/SettingsUNIX.cxx index 4892715a2..a7dd20dc5 100644 --- a/stella/src/unix/SettingsUNIX.cxx +++ b/stella/src/unix/SettingsUNIX.cxx @@ -13,16 +13,10 @@ // See the file "license" for information on usage and redistribution of // this file, and for a DISCLAIMER OF ALL WARRANTIES. // -// $Id: SettingsUNIX.cxx,v 1.9 2005-02-21 20:43:53 stephena Exp $ +// $Id: SettingsUNIX.cxx,v 1.10 2005-02-22 18:41:16 stephena Exp $ //============================================================================ #include -#include -#include - -#include -#include -#include #include "bspf.hxx" #include "OSystem.hxx" @@ -33,40 +27,26 @@ SettingsUNIX::SettingsUNIX(OSystem* osystem) : Settings(osystem) { - // First set variables that the parent class needs - myBaseDir = getenv("HOME"); - string stelladir = myBaseDir + "/.stella"; + // First set variables that the OSystem needs + string basedir = getenv("HOME"); + myOSystem->setBaseDir(basedir); + string stelladir = basedir + "/.stella"; if(!myOSystem->fileExists(stelladir)) - mkdir(stelladir.c_str(), 0777); -// FIXME - add a OSystem mkdir + myOSystem->makeDir(stelladir); - myStateDir = stelladir + "/state/"; - if(!myOSystem->fileExists(myStateDir)) - mkdir(myStateDir.c_str(), 0777); + string statedir = stelladir + "/state/"; + if(!myOSystem->fileExists(statedir)) + myOSystem->makeDir(statedir); + myOSystem->setStateDir(statedir); string userPropertiesFile = stelladir + "/stella.pro"; string systemPropertiesFile = "/etc/stella.pro"; - string userConfigFile = stelladir + "/stellarc"; - string systemConfigFile = "/etc/stellarc"; + myOSystem->setPropertiesFiles(userPropertiesFile, systemPropertiesFile); - // Set up the names of the input and output config files - myConfigOutputFile = userConfigFile; - if(myOSystem->fileExists(userConfigFile)) - myConfigInputFile = userConfigFile; - else if(myOSystem->fileExists(systemConfigFile)) - myConfigInputFile = systemConfigFile; - else - myConfigInputFile = ""; - - // Set up the input and output properties files - myPropertiesOutputFile = userPropertiesFile; - if(myOSystem->fileExists(userPropertiesFile)) - myPropertiesInputFile = userPropertiesFile; - else if(myOSystem->fileExists(systemPropertiesFile)) - myPropertiesInputFile = systemPropertiesFile; - else - myPropertiesInputFile = ""; + string userConfigFile = stelladir + "/stellarc"; + string systemConfigFile = "/etc/stellarc"; + myOSystem->setConfigFiles(userConfigFile, systemConfigFile); } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -