From: S?bastien G. <kx...@us...> - 2004-04-22 20:42:49
|
Update of /cvsroot/vba/VisualBoyAdvance/src/gtk In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv23207 Modified Files: system.cpp vba.glade window.cpp window.h Log Message: Added sound support. Index: system.cpp =================================================================== RCS file: /cvsroot/vba/VisualBoyAdvance/src/gtk/system.cpp,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** system.cpp 16 Apr 2004 01:12:01 -0000 1.3 --- system.cpp 22 Apr 2004 20:42:39 -0000 1.4 *************** *** 19,24 **** --- 19,26 ---- #include <stdio.h> #include <stdarg.h> + #include <string.h> #include <SDL.h> + #include <SDL_thread.h> #include "../GBA.h" *************** *** 26,53 **** #include "../gb/gbGlobals.h" #include "../Util.h" #include "window.h" ! int systemRedShift; ! int systemGreenShift; ! int systemBlueShift; ! int systemColorDepth; ! int systemDebug; ! int systemVerbose; ! int systemSaveUpdateCounter; ! int systemFrameSkip; ! u32 systemColorMap32[0x10000]; ! u16 systemColorMap16[0x10000]; ! u16 systemGbPalette[24]; bool systemSoundOn; int systemRenderedFrames; int systemFPS; ! int emulating; ! bool debugger; ! int RGB_LOW_BITS_MASK; ! inline VBA::Window * gui() { return VBA::Window::poGetInstance(); --- 28,67 ---- #include "../gb/gbGlobals.h" #include "../Util.h" + #include "../Sound.h" #include "window.h" ! // Required vars, used by the emulator core ! // ! int systemRedShift; ! int systemGreenShift; ! int systemBlueShift; ! int systemColorDepth; ! int systemDebug; ! int systemVerbose; ! int systemSaveUpdateCounter; ! int systemFrameSkip; ! u32 systemColorMap32[0x10000]; ! u16 systemColorMap16[0x10000]; ! u16 systemGbPalette[24]; bool systemSoundOn; + int emulating; + bool debugger; + int RGB_LOW_BITS_MASK; + + // Extra vars, only used for the GUI + // int systemRenderedFrames; int systemFPS; ! // Sound stuff ! // ! static SDL_cond * pstSoundCond = NULL; ! static SDL_mutex * pstSoundMutex = NULL; ! static u8 auiSoundBuffer[4096]; ! static int iSoundLen = 0; ! inline VBA::Window * GUI() { return VBA::Window::poGetInstance(); *************** *** 61,67 **** va_end(args); ! Gtk::MessageDialog oDialog(*gui(), csMsg, Gtk::MESSAGE_ERROR, Gtk::BUTTONS_OK); oDialog.run(); free(csMsg); --- 75,83 ---- va_end(args); ! Gtk::MessageDialog oDialog(*GUI(), csMsg, Gtk::MESSAGE_ERROR, Gtk::BUTTONS_OK); + oDialog.show(); // TEST + oDialog.grab_focus(); // TEST oDialog.run(); free(csMsg); *************** *** 70,74 **** void systemDrawScreen() { ! gui()->vDrawScreen(); systemRenderedFrames++; } --- 86,90 ---- void systemDrawScreen() { ! GUI()->vDrawScreen(); systemRenderedFrames++; } *************** *** 81,85 **** u32 systemReadJoypad(int) { ! return gui()->uiReadJoypad(); } --- 97,101 ---- u32 systemReadJoypad(int) { ! return GUI()->uiReadJoypad(); } *************** *** 89,98 **** systemRenderedFrames = 0; ! gui()->vShowSpeed(_iSpeed); } void system10Frames(int _iRate) { ! gui()->vComputeFrameskip(_iRate); } --- 105,114 ---- systemRenderedFrames = 0; ! GUI()->vShowSpeed(_iSpeed); } void system10Frames(int _iRate) { ! GUI()->vComputeFrameskip(_iRate); } *************** *** 103,107 **** void systemSetTitle(const char * _csTitle) { ! gui()->set_title(_csTitle); } --- 119,123 ---- void systemSetTitle(const char * _csTitle) { ! GUI()->set_title(_csTitle); } *************** *** 112,119 **** --- 128,250 ---- void systemWriteDataToSoundBuffer() { + if (SDL_GetAudioStatus() != SDL_AUDIO_PLAYING) + { + SDL_PauseAudio(0); + } + + bool bWait = true; + while (bWait && ! speedup && GUI()->iGetThrottle() == 0) + { + SDL_mutexP(pstSoundMutex); + if (iSoundLen < 2048 * 2) + { + bWait = false; + } + SDL_mutexV(pstSoundMutex); + } + + int iLen = soundBufferLen; + int iCopied = 0; + if (iSoundLen + iLen >= 2048 * 2) + { + iCopied = 2048 * 2 - iSoundLen; + memcpy(&auiSoundBuffer[iSoundLen], soundFinalWave, iCopied); + + iSoundLen = 2048 * 2; + SDL_CondSignal(pstSoundCond); + + bWait = true; + if (! speedup && GUI()->iGetThrottle() == 0) + { + while(bWait) + { + SDL_mutexP(pstSoundMutex); + if (iSoundLen < 2048 * 2) + { + bWait = false; + } + SDL_mutexV(pstSoundMutex); + } + + memcpy(auiSoundBuffer, ((u8 *)soundFinalWave) + iCopied, + soundBufferLen - iCopied); + + iSoundLen = soundBufferLen - iCopied; + } + else + { + memcpy(auiSoundBuffer, ((u8 *)soundFinalWave) + iCopied, + soundBufferLen); + } + } + else + { + memcpy(&auiSoundBuffer[iSoundLen], soundFinalWave, soundBufferLen); + iSoundLen += soundBufferLen; + } + } + + static void vSoundCallback(void * _pvUserData, u8 * _puiStream, int _iLen) + { + if (! emulating) + { + return; + } + + SDL_mutexP(pstSoundMutex); + if (! speedup && GUI()->iGetThrottle() == 0) + { + while (iSoundLen < 2048 * 2 && emulating) + { + SDL_CondWait(pstSoundCond, pstSoundMutex); + } + } + if (emulating) + { + memcpy(_puiStream, auiSoundBuffer, _iLen); + } + iSoundLen = 0; + SDL_mutexV(pstSoundMutex); } bool systemSoundInit() { + SDL_AudioSpec stAudio; + + switch (soundQuality) + { + case 1: + stAudio.freq = 44100; + soundBufferLen = 1470 * 2; + break; + case 2: + stAudio.freq = 22050; + soundBufferLen = 736 * 2; + break; + case 4: + stAudio.freq = 11025; + soundBufferLen = 368 * 2; + break; + } + + stAudio.format = AUDIO_S16SYS; + stAudio.channels = 2; + stAudio.samples = 1024; + stAudio.callback = vSoundCallback; + stAudio.userdata = NULL; + + if (SDL_OpenAudio(&stAudio, NULL) < 0) + { + fprintf(stderr, "Failed to open audio: %s\n", SDL_GetError()); + return false; + } + + pstSoundCond = SDL_CreateCond(); + pstSoundMutex = SDL_CreateMutex(); + + soundBufferTotalLen = soundBufferLen * 10; + iSoundLen = 0; + systemSoundOn = true; + return true; } *************** *** 121,132 **** --- 252,281 ---- void systemSoundShutdown() { + SDL_mutexP(pstSoundMutex); + int iSave = emulating; + emulating = 0; + SDL_CondSignal(pstSoundCond); + SDL_mutexV(pstSoundMutex); + + SDL_DestroyCond(pstSoundCond); + pstSoundCond = NULL; + + SDL_DestroyMutex(pstSoundMutex); + pstSoundMutex = NULL; + + SDL_CloseAudio(); + + emulating = iSave; + systemSoundOn = false; } void systemSoundPause() { + SDL_PauseAudio(1); } void systemSoundResume() { + SDL_PauseAudio(0); } *************** *** 168,172 **** bool systemCanChangeSoundQuality() { ! return false; } --- 317,321 ---- bool systemCanChangeSoundQuality() { ! return true; } Index: window.h =================================================================== RCS file: /cvsroot/vba/VisualBoyAdvance/src/gtk/window.h,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** window.h 16 Apr 2004 06:33:18 -0000 1.6 --- window.h 22 Apr 2004 20:42:40 -0000 1.7 *************** *** 26,29 **** --- 26,31 ---- #include <string> + #include "../System.h" + #include "configfile.h" #include "screenarea.h" *************** *** 61,83 **** void vComputeFrameskip(int _iRate); void vShowSpeed(int _iSpeed); ! inline u32 uiReadJoypad() { return m_uiJoypadState; } ! inline ECartridge eGetCartridge() { return m_eCartridge; } protected: enum EShowSpeed { ! ShowSpeedNone, ! ShowSpeedPercentage, ! ShowSpeedDetailed }; enum ESaveType { ! SaveTypeAuto, ! SaveTypeEEPROM, ! SaveTypeSRAM, ! SaveTypeFlash, ! SaveTypeEEPROMSensor, ! SaveTypeNone }; --- 63,111 ---- void vComputeFrameskip(int _iRate); void vShowSpeed(int _iSpeed); ! ! inline u32 uiReadJoypad() const { return m_uiJoypadState; } ! inline ECartridge eGetCartridge() const { return m_eCartridge; } ! inline int iGetThrottle() const { return m_iThrottle; } protected: enum EShowSpeed { ! ShowNone, ! ShowPercentage, ! ShowDetailed }; enum ESaveType { ! SaveAuto, ! SaveEEPROM, ! SaveSRAM, ! SaveFlash, ! SaveEEPROMSensor, ! SaveNone ! }; ! ! enum ESoundStatus ! { ! SoundOff, ! SoundMute, ! SoundOn ! }; ! ! enum ESoundQuality ! { ! Sound44K = 1, ! Sound22K = 2, ! Sound11K = 4 ! }; ! ! enum ESoundVolume ! { ! Sound100, ! Sound200, ! Sound300, ! Sound400, ! Sound25, ! Sound50 }; *************** *** 97,100 **** --- 125,135 ---- virtual void vOnSaveTypeToggled(Gtk::CheckMenuItem * _poCMI, int _iSaveType); virtual void vOnFlashSizeToggled(Gtk::CheckMenuItem * _poCMI, int _iFlashSize); + virtual void vOnSoundStatusToggled(Gtk::CheckMenuItem * _poCMI, int _iSoundStatus); + virtual void vOnSoundEchoToggled(Gtk::CheckMenuItem * _poCMI); + virtual void vOnSoundLowPassToggled(Gtk::CheckMenuItem * _poCMI); + virtual void vOnSoundReverseToggled(Gtk::CheckMenuItem * _poCMI); + virtual void vOnSoundChannelToggled(Gtk::CheckMenuItem * _poCMI, int _iSoundChannel); + virtual void vOnSoundQualityToggled(Gtk::CheckMenuItem * _poCMI, int _iSoundQuality); + virtual void vOnSoundVolumeToggled(Gtk::CheckMenuItem * _poCMI, int _iSoundVolume); virtual void vOnFilter2xToggled(Gtk::CheckMenuItem * _poCMI, int _iFilter2x); virtual void vOnFilterIBToggled(Gtk::CheckMenuItem * _poCMI, int _iFilterIB); *************** *** 123,126 **** --- 158,165 ---- const int m_iSaveTypeMin; const int m_iSaveTypeMax; + const int m_iSoundQualityMin; + const int m_iSoundQualityMax; + const int m_iSoundVolumeMin; + const int m_iSoundVolumeMax; const int m_iFilter2xMin; const int m_iFilter2xMax; *************** *** 137,140 **** --- 176,180 ---- Config::Section * m_poCoreConfig; Config::Section * m_poDisplayConfig; + Config::Section * m_poSoundConfig; Gtk::FileSelection * m_poFileOpenDialog; *************** *** 142,145 **** --- 182,186 ---- Gtk::CheckMenuItem * m_poFilePauseItem; Gtk::CheckMenuItem * m_poUseBiosItem; + Gtk::CheckMenuItem * m_poSoundOffItem; SigC::Connection m_oEmuSig; Index: window.cpp =================================================================== RCS file: /cvsroot/vba/VisualBoyAdvance/src/gtk/window.cpp,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** window.cpp 16 Apr 2004 06:33:18 -0000 1.6 --- window.cpp 22 Apr 2004 20:42:40 -0000 1.7 *************** *** 27,30 **** --- 27,31 ---- #include "../gb/GB.h" #include "../gb/gbGlobals.h" + #include "../Sound.h" #include "../Util.h" *************** *** 62,69 **** m_iScaleMin (1), m_iScaleMax (6), ! m_iShowSpeedMin (ShowSpeedNone), ! m_iShowSpeedMax (ShowSpeedDetailed), ! m_iSaveTypeMin (SaveTypeAuto), ! m_iSaveTypeMax (SaveTypeNone), m_iFilter2xMin (FirstFilter), m_iFilter2xMax (LastFilter), --- 63,74 ---- m_iScaleMin (1), m_iScaleMax (6), ! m_iShowSpeedMin (ShowNone), ! m_iShowSpeedMax (ShowDetailed), ! m_iSaveTypeMin (SaveAuto), ! m_iSaveTypeMax (SaveNone), ! m_iSoundQualityMin(Sound44K), ! m_iSoundQualityMax(Sound11K), ! m_iSoundVolumeMin (Sound100), ! m_iSoundVolumeMax (Sound50), m_iFilter2xMin (FirstFilter), m_iFilter2xMax (LastFilter), *************** *** 293,299 **** astShowSpeed[] = { ! { "ShowSpeedNone", ShowSpeedNone }, ! { "ShowSpeedPercentage", ShowSpeedPercentage }, ! { "ShowSpeedDetailed", ShowSpeedDetailed } }; EShowSpeed eDefaultShowSpeed = (EShowSpeed)m_poDisplayConfig->oGetKey<int>("show_speed"); --- 298,304 ---- astShowSpeed[] = { ! { "ShowSpeedNone", ShowNone }, ! { "ShowSpeedPercentage", ShowPercentage }, ! { "ShowSpeedDetailed", ShowDetailed } }; EShowSpeed eDefaultShowSpeed = (EShowSpeed)m_poDisplayConfig->oGetKey<int>("show_speed"); *************** *** 320,329 **** astSaveType[] = { ! { "SaveTypeAutomatic", SaveTypeAuto }, ! { "SaveTypeEeprom", SaveTypeEEPROM }, ! { "SaveTypeSram", SaveTypeSRAM }, ! { "SaveTypeFlash", SaveTypeFlash }, ! { "SaveTypeEepromSensor", SaveTypeEEPROMSensor }, ! { "SaveTypeNone", SaveTypeNone } }; ESaveType eDefaultSaveType = (ESaveType)m_poCoreConfig->oGetKey<int>("save_type"); --- 325,334 ---- astSaveType[] = { ! { "SaveTypeAutomatic", SaveAuto }, ! { "SaveTypeEeprom", SaveEEPROM }, ! { "SaveTypeSram", SaveSRAM }, ! { "SaveTypeFlash", SaveFlash }, ! { "SaveTypeEepromSensor", SaveEEPROMSensor }, ! { "SaveTypeNone", SaveNone } }; ESaveType eDefaultSaveType = (ESaveType)m_poCoreConfig->oGetKey<int>("save_type"); *************** *** 367,370 **** --- 372,511 ---- } + // Sound menu + // + std::string sDefaultSoundStatus = m_poSoundConfig->sGetKey("status"); + + poCMI = dynamic_cast<Gtk::CheckMenuItem *>(_poXml->get_widget("SoundOff")); + if (sDefaultSoundStatus == "off") + { + poCMI->set_active(); + vOnSoundStatusToggled(poCMI, SoundOff); + } + poCMI->signal_toggled().connect(SigC::bind<Gtk::CheckMenuItem *, int>( + SigC::slot(*this, &Window::vOnSoundStatusToggled), + poCMI, SoundOff)); + m_poSoundOffItem = poCMI; + + poCMI = dynamic_cast<Gtk::CheckMenuItem *>(_poXml->get_widget("SoundMute")); + if (sDefaultSoundStatus == "mute") + { + poCMI->set_active(); + vOnSoundStatusToggled(poCMI, SoundMute); + } + poCMI->signal_toggled().connect(SigC::bind<Gtk::CheckMenuItem *, int>( + SigC::slot(*this, &Window::vOnSoundStatusToggled), + poCMI, SoundMute)); + + poCMI = dynamic_cast<Gtk::CheckMenuItem *>(_poXml->get_widget("SoundOn")); + if (sDefaultSoundStatus == "on") + { + poCMI->set_active(); + vOnSoundStatusToggled(poCMI, SoundOn); + } + poCMI->signal_toggled().connect(SigC::bind<Gtk::CheckMenuItem *, int>( + SigC::slot(*this, &Window::vOnSoundStatusToggled), + poCMI, SoundOn)); + + poCMI = dynamic_cast<Gtk::CheckMenuItem *>(_poXml->get_widget("SoundEcho")); + poCMI->set_active(m_poSoundConfig->oGetKey<bool>("echo")); + vOnSoundEchoToggled(poCMI); + poCMI->signal_toggled().connect(SigC::bind<Gtk::CheckMenuItem *>( + SigC::slot(*this, &Window::vOnSoundEchoToggled), + poCMI)); + + poCMI = dynamic_cast<Gtk::CheckMenuItem *>(_poXml->get_widget("SoundLowPass")); + poCMI->set_active(m_poSoundConfig->oGetKey<bool>("low_pass")); + vOnSoundLowPassToggled(poCMI); + poCMI->signal_toggled().connect(SigC::bind<Gtk::CheckMenuItem *>( + SigC::slot(*this, &Window::vOnSoundLowPassToggled), + poCMI)); + + poCMI = dynamic_cast<Gtk::CheckMenuItem *>(_poXml->get_widget("SoundReverseStereo")); + poCMI->set_active(m_poSoundConfig->oGetKey<bool>("reverse_stereo")); + vOnSoundReverseToggled(poCMI); + poCMI->signal_toggled().connect(SigC::bind<Gtk::CheckMenuItem *>( + SigC::slot(*this, &Window::vOnSoundReverseToggled), + poCMI)); + + struct + { + const char * m_csName; + const int m_iSoundChannel; + const bool m_bChecked; + } + astSoundChannel[] = + { + { "SoundChannel1", 0, m_poSoundConfig->oGetKey<bool>("channel_1") }, + { "SoundChannel2", 1, m_poSoundConfig->oGetKey<bool>("channel_2") }, + { "SoundChannel3", 2, m_poSoundConfig->oGetKey<bool>("channel_3") }, + { "SoundChannel4", 3, m_poSoundConfig->oGetKey<bool>("channel_4") }, + { "SoundChannelA", 4, m_poSoundConfig->oGetKey<bool>("channel_A") }, + { "SoundChannelB", 5, m_poSoundConfig->oGetKey<bool>("channel_B") } + }; + for (guint i = 0; i < sizeof(astSoundChannel) / sizeof(astSoundChannel[0]); i++) + { + poCMI = dynamic_cast<Gtk::CheckMenuItem *>(_poXml->get_widget(astSoundChannel[i].m_csName)); + poCMI->set_active(astSoundChannel[i].m_bChecked); + vOnSoundChannelToggled(poCMI, astSoundChannel[i].m_iSoundChannel); + poCMI->signal_toggled().connect(SigC::bind<Gtk::CheckMenuItem *, int>( + SigC::slot(*this, &Window::vOnSoundChannelToggled), + poCMI, astSoundChannel[i].m_iSoundChannel)); + } + + struct + { + const char * m_csName; + const ESoundQuality m_eSoundQuality; + } + astSoundQuality[] = + { + { "Sound11Khz", Sound11K }, + { "Sound22Khz", Sound22K }, + { "Sound44Khz", Sound44K } + }; + ESoundQuality eDefaultSoundQuality = (ESoundQuality)m_poSoundConfig->oGetKey<int>("quality"); + for (guint i = 0; i < sizeof(astSoundQuality) / sizeof(astSoundQuality[0]); i++) + { + poCMI = dynamic_cast<Gtk::CheckMenuItem *>(_poXml->get_widget(astSoundQuality[i].m_csName)); + if (astSoundQuality[i].m_eSoundQuality == eDefaultSoundQuality) + { + poCMI->set_active(); + vOnSoundQualityToggled(poCMI, eDefaultSoundQuality); + } + poCMI->signal_toggled().connect(SigC::bind<Gtk::CheckMenuItem *, int>( + SigC::slot(*this, &Window::vOnSoundQualityToggled), + poCMI, astSoundQuality[i].m_eSoundQuality)); + } + + // Volume menu + // + struct + { + const char * m_csName; + const ESoundVolume m_eSoundVolume; + } + astSoundVolume[] = + { + { "Volume25", Sound25 }, + { "Volume50", Sound50 }, + { "Volume100", Sound100 }, + { "Volume200", Sound200 }, + { "Volume300", Sound300 }, + { "Volume400", Sound400 } + }; + ESoundVolume eDefaultSoundVolume = (ESoundVolume)m_poSoundConfig->oGetKey<int>("volume"); + for (guint i = 0; i < sizeof(astSoundVolume) / sizeof(astSoundVolume[0]); i++) + { + poCMI = dynamic_cast<Gtk::CheckMenuItem *>(_poXml->get_widget(astSoundVolume[i].m_csName)); + if (astSoundVolume[i].m_eSoundVolume == eDefaultSoundVolume) + { + poCMI->set_active(); + vOnSoundVolumeToggled(poCMI, eDefaultSoundVolume); + } + poCMI->signal_toggled().connect(SigC::bind<Gtk::CheckMenuItem *, int>( + SigC::slot(*this, &Window::vOnSoundVolumeToggled), + poCMI, astSoundVolume[i].m_eSoundVolume)); + } + // Filter menu // *************** *** 494,497 **** --- 635,639 ---- systemFrameSkip = 0; systemSoundOn = false; + soundOffFlag = true; systemRenderedFrames = 0; *************** *** 545,573 **** // m_poCoreConfig = m_oConfig.poAddSection("Core"); ! m_poCoreConfig->vSetKey ("frameskip", "auto" ); ! m_poCoreConfig->vSetKey ("throttle", 0 ); ! m_poCoreConfig->vSetKey ("layer_bg0", true ); ! m_poCoreConfig->vSetKey ("layer_bg1", true ); ! m_poCoreConfig->vSetKey ("layer_bg2", true ); ! m_poCoreConfig->vSetKey ("layer_bg3", true ); ! m_poCoreConfig->vSetKey ("layer_obj", true ); ! m_poCoreConfig->vSetKey ("layer_win0", true ); ! m_poCoreConfig->vSetKey ("layer_win1", true ); ! m_poCoreConfig->vSetKey ("layer_objwin", true ); ! m_poCoreConfig->vSetKey ("use_bios_file", false ); ! m_poCoreConfig->vSetKey ("bios_file", "" ); ! m_poCoreConfig->vSetKey<int>("save_type", SaveTypeAuto ); ! m_poCoreConfig->vSetKey<int>("flash_size", 64 ); // Display section // m_poDisplayConfig = m_oConfig.poAddSection("Display"); ! m_poDisplayConfig->vSetKey ("scale", 1 ); ! m_poDisplayConfig->vSetKey<int>("show_speed", ShowSpeedPercentage ); ! m_poDisplayConfig->vSetKey<int>("filter2x", FilterNone ); ! m_poDisplayConfig->vSetKey<int>("filterIB", FilterIBNone ); #ifdef MMX ! m_poDisplayConfig->vSetKey ("filter_disable_mmx", false ); #endif // MMX } --- 687,731 ---- // m_poCoreConfig = m_oConfig.poAddSection("Core"); ! m_poCoreConfig->vSetKey ("frameskip", "auto" ); ! m_poCoreConfig->vSetKey ("throttle", 0 ); ! m_poCoreConfig->vSetKey ("layer_bg0", true ); ! m_poCoreConfig->vSetKey ("layer_bg1", true ); ! m_poCoreConfig->vSetKey ("layer_bg2", true ); ! m_poCoreConfig->vSetKey ("layer_bg3", true ); ! m_poCoreConfig->vSetKey ("layer_obj", true ); ! m_poCoreConfig->vSetKey ("layer_win0", true ); ! m_poCoreConfig->vSetKey ("layer_win1", true ); ! m_poCoreConfig->vSetKey ("layer_objwin", true ); ! m_poCoreConfig->vSetKey ("use_bios_file", false ); ! m_poCoreConfig->vSetKey ("bios_file", "" ); ! m_poCoreConfig->vSetKey<int>("save_type", SaveAuto ); ! m_poCoreConfig->vSetKey<int>("flash_size", 64 ); // Display section // m_poDisplayConfig = m_oConfig.poAddSection("Display"); ! m_poDisplayConfig->vSetKey ("scale", 1 ); ! m_poDisplayConfig->vSetKey<int>("show_speed", ShowPercentage ); ! m_poDisplayConfig->vSetKey<int>("filter2x", FilterNone ); ! m_poDisplayConfig->vSetKey<int>("filterIB", FilterIBNone ); #ifdef MMX ! m_poDisplayConfig->vSetKey ("filter_disable_mmx", false ); #endif // MMX + + // Sound section + // + m_poSoundConfig = m_oConfig.poAddSection("Sound"); + m_poSoundConfig->vSetKey("status", "on" ); + m_poSoundConfig->vSetKey("echo", false ); + m_poSoundConfig->vSetKey("low_pass", false ); + m_poSoundConfig->vSetKey("reverse_stereo", false ); + m_poSoundConfig->vSetKey("channel_1", true ); + m_poSoundConfig->vSetKey("channel_2", true ); + m_poSoundConfig->vSetKey("channel_3", true ); + m_poSoundConfig->vSetKey("channel_4", true ); + m_poSoundConfig->vSetKey("channel_A", true ); + m_poSoundConfig->vSetKey("channel_B", true ); + m_poSoundConfig->vSetKey("quality", Sound22K ); + m_poSoundConfig->vSetKey("volume", Sound100 ); } *************** *** 655,658 **** --- 813,838 ---- m_poDisplayConfig->vSetKey("filterIB", iAdjusted); } + + // Sound section + // + sValue = m_poSoundConfig->sGetKey("status"); + if (sValue != "off" && sValue != "on" && sValue != "mute") + { + m_poSoundConfig->vSetKey("status", "on"); + } + + iValue = m_poSoundConfig->oGetKey<int>("quality"); + iAdjusted = CLAMP(iValue, m_iSoundQualityMin, m_iSoundQualityMax); + if (iValue != iAdjusted) + { + m_poSoundConfig->vSetKey("quality", iAdjusted); + } + + iValue = m_poSoundConfig->oGetKey<int>("volume"); + iAdjusted = CLAMP(iValue, m_iSoundVolumeMin, m_iSoundVolumeMax); + if (iValue != iAdjusted) + { + m_poSoundConfig->vSetKey("volume", iAdjusted); + } } *************** *** 749,758 **** char csTitle[50]; ! if (m_eShowSpeed == ShowSpeedPercentage) { snprintf(csTitle, 50, "VBA - %d%%", _iSpeed); set_title(csTitle); } ! else if (m_eShowSpeed == ShowSpeedDetailed) { snprintf(csTitle, 50, "VBA - %d%% (%d, %d fps)", --- 929,938 ---- char csTitle[50]; ! if (m_eShowSpeed == ShowPercentage) { snprintf(csTitle, 50, "VBA - %d%%", _iSpeed); set_title(csTitle); } ! else if (m_eShowSpeed == ShowDetailed) { snprintf(csTitle, 50, "VBA - %d%% (%d, %d fps)", *************** *** 1081,1084 **** --- 1261,1265 ---- { vStopEmu(); + vSetDefaultTitle(); vDrawDefaultScreen(); vSaveBattery(); *************** *** 1239,1243 **** m_eShowSpeed = (EShowSpeed)_iShowSpeed; ! if (m_eShowSpeed == ShowSpeedNone) { vSetDefaultTitle(); --- 1420,1424 ---- m_eShowSpeed = (EShowSpeed)_iShowSpeed; ! if (m_eShowSpeed == ShowNone) { vSetDefaultTitle(); *************** *** 1275,1278 **** --- 1456,1581 ---- } + void Window::vOnSoundStatusToggled(Gtk::CheckMenuItem * _poCMI, int _iSoundStatus) + { + if (! _poCMI->get_active()) + { + return; + } + + std::string sSoundStatus; + switch (_iSoundStatus) + { + case SoundOff: + soundOffFlag = true; + if (systemSoundOn) + { + soundShutdown(); + } + sSoundStatus = "off"; + break; + case SoundMute: + soundDisable(0x30f); + sSoundStatus = "mute"; + break; + case SoundOn: + if (soundOffFlag) + { + soundOffFlag = false; + if (! soundInit()) + { + m_poSoundOffItem->set_active(); + return; + } + } + soundEnable(0x30f); + sSoundStatus = "on"; + break; + } + m_poSoundConfig->vSetKey("status", sSoundStatus); + } + + void Window::vOnSoundEchoToggled(Gtk::CheckMenuItem * _poCMI) + { + soundEcho = _poCMI->get_active(); + m_poSoundConfig->vSetKey("echo", soundEcho); + } + + void Window::vOnSoundLowPassToggled(Gtk::CheckMenuItem * _poCMI) + { + soundLowPass = _poCMI->get_active(); + m_poSoundConfig->vSetKey("low_pass", soundLowPass); + } + + void Window::vOnSoundReverseToggled(Gtk::CheckMenuItem * _poCMI) + { + soundReverse = _poCMI->get_active(); + m_poSoundConfig->vSetKey("reverse_stereo", soundReverse); + } + + void Window::vOnSoundChannelToggled(Gtk::CheckMenuItem * _poCMI, int _iSoundChannel) + { + int iShift = _iSoundChannel; + if (_iSoundChannel > 3) + { + iShift += 4; + } + int iFlag = 1 << iShift; + int iActive = soundGetEnable() & 0x30f; + if (_poCMI->get_active()) + { + iActive |= iFlag; + } + else + { + iActive &= ~iFlag; + } + soundEnable(iActive); + soundDisable(~iActive & 0x30f); + + const char * acsChannels[] = + { + "channel_1", + "channel_2", + "channel_3", + "channel_4", + "channel_A", + "channel_B" + }; + m_poSoundConfig->vSetKey(acsChannels[_iSoundChannel], _poCMI->get_active()); + } + + void Window::vOnSoundQualityToggled(Gtk::CheckMenuItem * _poCMI, int _iSoundQuality) + { + if (! _poCMI->get_active()) + { + return; + } + + if (m_eCartridge == CartridgeGBA) + { + soundSetQuality(_iSoundQuality); + } + else if (m_eCartridge == CartridgeGB) + { + gbSoundSetQuality(_iSoundQuality); + } + else + { + soundQuality = _iSoundQuality; + } + m_poSoundConfig->vSetKey("quality", _iSoundQuality); + } + + void Window::vOnSoundVolumeToggled(Gtk::CheckMenuItem * _poCMI, int _iSoundVolume) + { + if (! _poCMI->get_active()) + { + return; + } + + soundVolume = _iSoundVolume; + m_poSoundConfig->vSetKey("volume", _iSoundVolume); + } + void Window::vOnFilter2xToggled(Gtk::CheckMenuItem * _poCMI, int _iFilter2x) { Index: vba.glade =================================================================== RCS file: /cvsroot/vba/VisualBoyAdvance/src/gtk/vba.glade,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** vba.glade 16 Apr 2004 01:12:01 -0000 1.4 --- vba.glade 22 Apr 2004 20:42:40 -0000 1.5 *************** *** 11,14 **** --- 11,19 ---- <property name="resizable">True</property> <property name="destroy_with_parent">False</property> + <property name="decorated">True</property> + <property name="skip_taskbar_hint">False</property> + <property name="skip_pager_hint">False</property> + <property name="type_hint">GDK_WINDOW_TYPE_HINT_NORMAL</property> + <property name="gravity">GDK_GRAVITY_NORTH_WEST</property> <child> *************** *** 46,50 **** <child internal-child="image"> ! <widget class="GtkImage" id="image74"> <property name="visible">True</property> <property name="stock">gtk-open</property> --- 51,55 ---- <child internal-child="image"> ! <widget class="GtkImage" id="image80"> <property name="visible">True</property> <property name="stock">gtk-open</property> *************** *** 60,64 **** <child> ! <widget class="GtkMenuItem" id="separator1"> <property name="visible">True</property> </widget> --- 65,69 ---- <child> ! <widget class="GtkSeparatorMenuItem" id="separator1"> <property name="visible">True</property> </widget> *************** *** 100,104 **** <child> ! <widget class="GtkMenuItem" id="separator2"> <property name="visible">True</property> </widget> --- 105,109 ---- <child> ! <widget class="GtkSeparatorMenuItem" id="separator2"> <property name="visible">True</property> </widget> *************** *** 125,129 **** <child> ! <widget class="GtkMenuItem" id="separator3"> <property name="visible">True</property> </widget> --- 130,134 ---- <child> ! <widget class="GtkSeparatorMenuItem" id="separator3"> <property name="visible">True</property> </widget> *************** *** 139,143 **** <child> ! <widget class="GtkMenuItem" id="separator4"> <property name="visible">True</property> </widget> --- 144,148 ---- <child> ! <widget class="GtkSeparatorMenuItem" id="separator4"> <property name="visible">True</property> </widget> *************** *** 161,165 **** <child> ! <widget class="GtkMenuItem" id="separator5"> <property name="visible">True</property> </widget> --- 166,170 ---- <child> ! <widget class="GtkSeparatorMenuItem" id="separator5"> <property name="visible">True</property> </widget> *************** *** 183,187 **** <child> ! <widget class="GtkMenuItem" id="separator6"> <property name="visible">True</property> </widget> --- 188,192 ---- <child> ! <widget class="GtkSeparatorMenuItem" id="separator6"> <property name="visible">True</property> </widget> *************** *** 195,199 **** <child internal-child="image"> ! <widget class="GtkImage" id="image75"> <property name="visible">True</property> <property name="stock">gtk-close</property> --- 200,204 ---- <child internal-child="image"> ! <widget class="GtkImage" id="image81"> <property name="visible">True</property> <property name="stock">gtk-close</property> *************** *** 216,220 **** <child internal-child="image"> ! <widget class="GtkImage" id="image76"> <property name="visible">True</property> <property name="stock">gtk-quit</property> --- 221,225 ---- <child internal-child="image"> ! <widget class="GtkImage" id="image82"> <property name="visible">True</property> <property name="stock">gtk-quit</property> *************** *** 334,338 **** <child> ! <widget class="GtkMenuItem" id="separator19"> <property name="visible">True</property> </widget> --- 339,343 ---- <child> ! <widget class="GtkSeparatorMenuItem" id="separator19"> <property name="visible">True</property> </widget> *************** *** 521,525 **** <child> ! <widget class="GtkMenuItem" id="separator9"> <property name="visible">True</property> </widget> --- 526,530 ---- <child> ! <widget class="GtkSeparatorMenuItem" id="separator9"> <property name="visible">True</property> </widget> *************** *** 743,747 **** <child> ! <widget class="GtkMenuItem" id="separator10"> <property name="visible">True</property> </widget> --- 748,752 ---- <child> ! <widget class="GtkSeparatorMenuItem" id="separator10"> <property name="visible">True</property> </widget> *************** *** 831,850 **** <child> ! <widget class="GtkMenuItem" id="separator11"> ! <property name="visible">True</property> ! </widget> ! </child> ! ! <child> ! <widget class="GtkCheckMenuItem" id="SoundOldSync"> ! <property name="visible">True</property> ! <property name="label" translatable="yes">Use old synchronization</property> ! <property name="use_underline">True</property> ! <property name="active">False</property> ! </widget> ! </child> ! ! <child> ! <widget class="GtkMenuItem" id="separator12"> <property name="visible">True</property> </widget> --- 836,840 ---- <child> ! <widget class="GtkSeparatorMenuItem" id="separator11"> <property name="visible">True</property> </widget> *************** *** 879,883 **** <child> ! <widget class="GtkMenuItem" id="separator13"> <property name="visible">True</property> </widget> --- 869,873 ---- <child> ! <widget class="GtkSeparatorMenuItem" id="separator13"> <property name="visible">True</property> </widget> *************** *** 939,943 **** <child> ! <widget class="GtkMenuItem" id="separator14"> <property name="visible">True</property> </widget> --- 929,933 ---- <child> ! <widget class="GtkSeparatorMenuItem" id="separator14"> <property name="visible">True</property> </widget> *************** *** 974,978 **** <child> ! <widget class="GtkMenuItem" id="separator15"> <property name="visible">True</property> </widget> --- 964,968 ---- <child> ! <widget class="GtkSeparatorMenuItem" id="separator15"> <property name="visible">True</property> </widget> *************** *** 1083,1087 **** <child> ! <widget class="GtkMenuItem" id="separator16"> <property name="visible">True</property> </widget> --- 1073,1077 ---- <child> ! <widget class="GtkSeparatorMenuItem" id="separator16"> <property name="visible">True</property> </widget> *************** *** 1203,1207 **** <child> ! <widget class="GtkMenuItem" id="separator20"> <property name="visible">True</property> </widget> --- 1193,1197 ---- <child> ! <widget class="GtkSeparatorMenuItem" id="separator20"> <property name="visible">True</property> </widget> *************** *** 1348,1352 **** <child> ! <widget class="GtkMenuItem" id="separator17"> <property name="visible">True</property> </widget> --- 1338,1342 ---- <child> ! <widget class="GtkSeparatorMenuItem" id="separator17"> <property name="visible">True</property> </widget> *************** *** 1421,1425 **** <child> ! <widget class="GtkMenuItem" id="separator18"> <property name="visible">True</property> </widget> --- 1411,1415 ---- <child> ! <widget class="GtkSeparatorMenuItem" id="separator18"> <property name="visible">True</property> </widget> *************** *** 1466,1470 **** <child> ! <widget class="GtkMenuItem" id="separator24"> <property name="visible">True</property> </widget> --- 1456,1460 ---- <child> ! <widget class="GtkSeparatorMenuItem" id="separator24"> <property name="visible">True</property> </widget> *************** *** 1480,1484 **** <child> ! <widget class="GtkMenuItem" id="separator25"> <property name="visible">True</property> </widget> --- 1470,1474 ---- <child> ! <widget class="GtkSeparatorMenuItem" id="separator25"> <property name="visible">True</property> </widget> *************** *** 1649,1652 **** --- 1639,1646 ---- <property name="xscale">0</property> <property name="yscale">0</property> + <property name="top_padding">0</property> + <property name="bottom_padding">0</property> + <property name="left_padding">0</property> + <property name="right_padding">0</property> <child> *************** *** 1667,1674 **** <property name="title" translatable="yes">About VBA</property> <property name="type">GTK_WINDOW_TOPLEVEL</property> ! <property name="window_position">GTK_WIN_POS_NONE</property> <property name="modal">False</property> <property name="resizable">True</property> <property name="destroy_with_parent">True</property> <property name="has_separator">True</property> --- 1661,1673 ---- <property name="title" translatable="yes">About VBA</property> <property name="type">GTK_WINDOW_TOPLEVEL</property> ! <property name="window_position">GTK_WIN_POS_CENTER_ON_PARENT</property> <property name="modal">False</property> <property name="resizable">True</property> <property name="destroy_with_parent">True</property> + <property name="decorated">True</property> + <property name="skip_taskbar_hint">False</property> + <property name="skip_pager_hint">False</property> + <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property> + <property name="gravity">GDK_GRAVITY_NORTH_WEST</property> <property name="has_separator">True</property> *************** *** 1692,1695 **** --- 1691,1695 ---- <property name="use_stock">True</property> <property name="relief">GTK_RELIEF_NORMAL</property> + <property name="focus_on_click">True</property> <property name="response_id">-7</property> </widget> *************** *** 1776,1783 **** <property name="title" translatable="yes">Throttle</property> <property name="type">GTK_WINDOW_TOPLEVEL</property> ! <property name="window_position">GTK_WIN_POS_NONE</property> <property name="modal">False</property> <property name="resizable">True</property> <property name="destroy_with_parent">True</property> <property name="has_separator">True</property> --- 1776,1788 ---- <property name="title" translatable="yes">Throttle</property> <property name="type">GTK_WINDOW_TOPLEVEL</property> ! <property name="window_position">GTK_WIN_POS_CENTER_ON_PARENT</property> <property name="modal">False</property> <property name="resizable">True</property> <property name="destroy_with_parent">True</property> + <property name="decorated">True</property> + <property name="skip_taskbar_hint">False</property> + <property name="skip_pager_hint">False</property> + <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property> + <property name="gravity">GDK_GRAVITY_NORTH_WEST</property> <property name="has_separator">True</property> *************** *** 1801,1804 **** --- 1806,1810 ---- <property name="use_stock">True</property> <property name="relief">GTK_RELIEF_NORMAL</property> + <property name="focus_on_click">True</property> <property name="response_id">-6</property> </widget> *************** *** 1813,1816 **** --- 1819,1823 ---- <property name="use_stock">True</property> <property name="relief">GTK_RELIEF_NORMAL</property> + <property name="focus_on_click">True</property> <property name="response_id">-5</property> </widget> |