From e6239a3c38794b9c82128218f05ceea27eae1573 Mon Sep 17 00:00:00 2001 From: bgk Date: Tue, 23 Dec 2008 13:51:48 +0000 Subject: [PATCH] GTK : Replaced the sound configuration menu by a dialog git-svn-id: https://svn.code.sf.net/p/vbam/code/trunk@819 a31d4220-a93d-0410-bf67-fe4944624d44 --- CMakeLists.txt | 1 + src/gtk/soundconfig.cpp | 125 +++++++++++++++++++++++++++++ src/gtk/soundconfig.h | 53 +++++++++++++ src/gtk/ui/sound.ui | 151 ++++++++++++++++++++++++++++++++++++ src/gtk/ui/vbam.glade | 102 ++---------------------- src/gtk/window.cpp | 83 +++----------------- src/gtk/window.h | 19 ++--- src/gtk/windowcallbacks.cpp | 43 ++++------ 8 files changed, 369 insertions(+), 208 deletions(-) create mode 100644 src/gtk/soundconfig.cpp create mode 100644 src/gtk/soundconfig.h create mode 100644 src/gtk/ui/sound.ui diff --git a/CMakeLists.txt b/CMakeLists.txt index 1b15d8ae..10bfdf1f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -209,6 +209,7 @@ SET(SRC_GTK src/gtk/joypadconfig.cpp src/gtk/directoriesconfig.cpp src/gtk/displayconfig.cpp + src/gtk/soundconfig.cpp src/gtk/screenarea.cpp src/gtk/screenarea-cairo.cpp src/gtk/screenarea-xvideo.cpp diff --git a/src/gtk/soundconfig.cpp b/src/gtk/soundconfig.cpp new file mode 100644 index 00000000..6681cf8f --- /dev/null +++ b/src/gtk/soundconfig.cpp @@ -0,0 +1,125 @@ +// -*- C++ -*- +// VisualBoyAdvance - Nintendo Gameboy/GameboyAdvance (TM) emulator. +// Copyright (C) 2008 VBA-M development team + +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2, or(at your option) +// any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, +// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +#include "soundconfig.h" + +#include +#include +#include + +#include "intl.h" + +namespace VBA +{ + +SoundConfigDialog::SoundConfigDialog(GtkDialog* _pstDialog, const Glib::RefPtr& refBuilder) : + Gtk::Dialog(_pstDialog), + m_poConfig(0) +{ + refBuilder->get_widget("VolumeComboBox", m_poVolumeComboBox); + refBuilder->get_widget("RateComboBox", m_poRateComboBox); + + m_poVolumeComboBox->signal_changed().connect(sigc::mem_fun(*this, &SoundConfigDialog::vOnVolumeChanged)); + m_poRateComboBox->signal_changed().connect(sigc::mem_fun(*this, &SoundConfigDialog::vOnRateChanged)); +} + +void SoundConfigDialog::vSetConfig(Config::Section * _poConfig, VBA::Window * _poWindow) +{ + m_poConfig = _poConfig; + m_poWindow = _poWindow; + + bool bMute = m_poConfig->oGetKey("mute"); + float fSoundVolume = m_poConfig->oGetKey("volume"); + + if (bMute) + m_poVolumeComboBox->set_active(0); + else if (0.0f <= fSoundVolume && fSoundVolume <= 0.25f) + m_poVolumeComboBox->set_active(1); + else if (0.25f < fSoundVolume && fSoundVolume <= 0.50f) + m_poVolumeComboBox->set_active(2); + else if (1.0f < fSoundVolume && fSoundVolume <= 2.0f) + m_poVolumeComboBox->set_active(4); + else + m_poVolumeComboBox->set_active(3); + + VBA::Window::ESoundQuality eSoundQuality = (VBA::Window::ESoundQuality)m_poConfig->oGetKey("quality"); + switch (eSoundQuality) + { + case VBA::Window::Sound44K: + m_poRateComboBox->set_active(2); + break; + case VBA::Window::Sound22K: + m_poRateComboBox->set_active(1); + break; + case VBA::Window::Sound11K: + m_poRateComboBox->set_active(0); + break; + } +} + +void SoundConfigDialog::vOnVolumeChanged() +{ + int iVolume = m_poVolumeComboBox->get_active_row_number(); + switch (iVolume) + { + case 0: // Mute + m_poConfig->vSetKey("mute", true); + m_poConfig->vSetKey("volume", 1.0f); + break; + case 1: // 25 % + m_poConfig->vSetKey("mute", false); + m_poConfig->vSetKey("volume", 0.25f); + break; + case 2: // 50 % + m_poConfig->vSetKey("mute", false); + m_poConfig->vSetKey("volume", 0.50f); + break; + case 4: // 200 % + m_poConfig->vSetKey("mute", false); + m_poConfig->vSetKey("volume", 2.00f); + break; + case 3: // 100 % + default: + m_poConfig->vSetKey("mute", false); + m_poConfig->vSetKey("volume", 1.00f); + break; + } + + m_poWindow->vApplyConfigMute(); + m_poWindow->vApplyConfigVolume(); +} + +void SoundConfigDialog::vOnRateChanged() +{ + int iRate = m_poRateComboBox->get_active_row_number(); + switch (iRate) + { + case 0: // 11 KHz + m_poConfig->vSetKey("quality", VBA::Window::Sound11K); + break; + case 1: // 22 KHz + m_poConfig->vSetKey("quality", VBA::Window::Sound22K); + break; + case 2: // 44 KHz + default: + m_poConfig->vSetKey("quality", VBA::Window::Sound44K); + break; + } +} + +} // namespace VBA diff --git a/src/gtk/soundconfig.h b/src/gtk/soundconfig.h new file mode 100644 index 00000000..5778708c --- /dev/null +++ b/src/gtk/soundconfig.h @@ -0,0 +1,53 @@ +// -*- C++ -*- +// VisualBoyAdvance - Nintendo Gameboy/GameboyAdvance (TM) emulator. +// Copyright (C) 2008 VBA-M development team + +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2, or(at your option) +// any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, +// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +#ifndef __VBA_SOUNDCONFIG_H__ +#define __VBA_SOUNDCONFIG_H__ + +#include +#include +#include + +#include "configfile.h" +#include "window.h" + +namespace VBA +{ + +class SoundConfigDialog : public Gtk::Dialog +{ +public: + SoundConfigDialog(GtkDialog* _pstDialog, const Glib::RefPtr& refBuilder); + + void vSetConfig(Config::Section * _poConfig, VBA::Window * _poWindow); + +private: + void vOnVolumeChanged(); + void vOnRateChanged(); + + VBA::Window * m_poWindow; + + Config::Section * m_poConfig; + Gtk::ComboBox * m_poVolumeComboBox; + Gtk::ComboBox * m_poRateComboBox; +}; + +} // namespace VBA + + +#endif // __VBA_SOUNDCONFIG_H__ diff --git a/src/gtk/ui/sound.ui b/src/gtk/ui/sound.ui new file mode 100644 index 00000000..9b2600a3 --- /dev/null +++ b/src/gtk/ui/sound.ui @@ -0,0 +1,151 @@ + + + + + + + + + + Mute + + + 25 % + + + 50 % + + + 100 % + + + 200 % + + + + + + + + + + 11 KHz + + + 22 KHz + + + 44 KHz + + + + + 5 + GTK_WIN_POS_CENTER_ON_PARENT + GDK_WINDOW_TYPE_HINT_DIALOG + False + + + True + 2 + + + True + 10 + 2 + 2 + 10 + 10 + + + True + model1 + + + + 0 + + + + + 1 + 2 + + + + + True + 1 + Volume : + + + GTK_FILL + + + + + True + 1 + Sample rate : + + + 1 + 2 + GTK_FILL + + + + + True + model2 + + + + 0 + + + + + 1 + 2 + 1 + 2 + + + + + 1 + + + + + True + GTK_BUTTONBOX_END + + + + + + True + True + True + gtk-close + True + + + 1 + + + + + False + GTK_PACK_END + + + + + + button1 + + + diff --git a/src/gtk/ui/vbam.glade b/src/gtk/ui/vbam.glade index 9c9b665d..8ee2a2a9 100644 --- a/src/gtk/ui/vbam.glade +++ b/src/gtk/ui/vbam.glade @@ -604,101 +604,6 @@ - - - True - _Sound - True - - - - - True - Mute - True - - - - - True - - - - - True - 11 _Khz - True - True - - - - - True - 22 K_hz - True - Sound11Khz - - - - - True - 44 Kh_z - True - Sound11Khz - - - - - True - - - - - True - _Volume - True - - - - - True - 25% - True - True - - - - - True - 50% - True - Volume25 - - - - - True - 100% - True - Volume25 - - - - - True - 200% - True - Volume25 - - - - - - - - - - True @@ -784,6 +689,13 @@ True + + + True + _Sound ... + True + + True diff --git a/src/gtk/window.cpp b/src/gtk/window.cpp index 24a34e30..b42b3546 100644 --- a/src/gtk/window.cpp +++ b/src/gtk/window.cpp @@ -144,6 +144,8 @@ Window::Window(GtkWindow * _pstWindow, const Glib::RefPtr & _poXml) : vApplyConfigScreenArea(); vApplyConfigFilter(); vApplyConfigFilterIB(); + vApplyConfigMute(); + vApplyConfigVolume(); Gtk::MenuItem * poMI; Gtk::CheckMenuItem * poCMI; @@ -389,68 +391,6 @@ Window::Window(GtkWindow * _pstWindow, const Glib::RefPtr & _poXml) : poCMI, astFlashSize[i].m_iFlashSize)); } - // Sound menu - // - poCMI = dynamic_cast(_poXml->get_widget("SoundMute")); - poCMI->set_active(m_poSoundConfig->oGetKey("mute")); - vOnSoundMuteToggled(poCMI); - poCMI->signal_toggled().connect(sigc::bind( - sigc::mem_fun(*this, &Window::vOnSoundMuteToggled), - poCMI)); - - struct - { - const char * m_csName; - const ESoundQuality m_eSoundQuality; - } - astSoundQuality[] = - { - { "Sound11Khz", Sound11K }, - { "Sound22Khz", Sound22K }, - { "Sound44Khz", Sound44K } - }; - ESoundQuality eDefaultSoundQuality = (ESoundQuality)m_poSoundConfig->oGetKey("quality"); - for (guint i = 0; i < G_N_ELEMENTS(astSoundQuality); i++) - { - poCMI = dynamic_cast(_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( - sigc::mem_fun(*this, &Window::vOnSoundQualityToggled), - poCMI, astSoundQuality[i].m_eSoundQuality)); - } - - // Volume menu - // - struct - { - const char * m_csName; - const float m_fSoundVolume; - } - astSoundVolume[] = - { - { "Volume25", 0.25f }, - { "Volume50", 0.50f }, - { "Volume100", 1.00f }, - { "Volume200", 2.00f } - }; - float fDefaultSoundVolume = m_poSoundConfig->oGetKey("volume"); - for (guint i = 0; i < G_N_ELEMENTS(astSoundVolume); i++) - { - poCMI = dynamic_cast(_poXml->get_widget(astSoundVolume[i].m_csName)); - if (astSoundVolume[i].m_fSoundVolume == fDefaultSoundVolume) - { - poCMI->set_active(); - vOnSoundVolumeToggled(poCMI, fDefaultSoundVolume); - } - poCMI->signal_toggled().connect(sigc::bind( - sigc::mem_fun(*this, &Window::vOnSoundVolumeToggled), - poCMI, astSoundVolume[i].m_fSoundVolume)); - } - // Gameboy menu // poCMI = dynamic_cast(_poXml->get_widget("GameboyBorder")); @@ -499,6 +439,10 @@ Window::Window(GtkWindow * _pstWindow, const Glib::RefPtr & _poXml) : poMI = dynamic_cast(_poXml->get_widget("DisplayConfigure")); poMI->signal_activate().connect(sigc::mem_fun(*this, &Window::vOnDisplayConfigure)); + // Sound menu + poMI = dynamic_cast(_poXml->get_widget("SoundConfigure")); + poMI->signal_activate().connect(sigc::mem_fun(*this, &Window::vOnSoundConfigure)); + // Joypad menu // poMI = dynamic_cast(_poXml->get_widget("JoypadConfigure")); @@ -979,14 +923,14 @@ void Window::vApplyConfigVolume() void Window::vApplyConfigSoundQuality() { - m_eSoundQuality = (ESoundQuality)m_poSoundConfig->oGetKey("quality"); + ESoundQuality eSoundQuality = (ESoundQuality)m_poSoundConfig->oGetKey("quality"); if (m_eCartridge == CartridgeGBA) { - soundSetQuality(m_eSoundQuality); + soundSetQuality(eSoundQuality); } else if (m_eCartridge == CartridgeGB) { - gbSoundSetQuality(m_eSoundQuality); + gbSoundSetQuality(eSoundQuality); } } @@ -1132,14 +1076,7 @@ bool Window::bLoadROM(const std::string & _rsFile) emulating = 1; m_bWasEmulating = false; - if (m_eCartridge == CartridgeGBA) - { - soundSetQuality(m_eSoundQuality); - } - else - { - gbSoundSetQuality(m_eSoundQuality); - } + vApplyConfigSoundQuality(); vUpdateGameSlots(); vHistoryAdd(_rsFile); diff --git a/src/gtk/window.h b/src/gtk/window.h index 9515d985..e91b2810 100644 --- a/src/gtk/window.h +++ b/src/gtk/window.h @@ -61,6 +61,13 @@ public: OutputXvideo }; + enum ESoundQuality + { + Sound44K = 1, + Sound22K = 2, + Sound11K = 4 + }; + // GB/GBA screen sizes const int m_iGBScreenWidth; const int m_iGBScreenHeight; @@ -114,13 +121,6 @@ protected: SoundOn }; - enum ESoundQuality - { - Sound44K = 1, - Sound22K = 2, - Sound11K = 4 - }; - enum EEmulatorType { EmulatorAuto, @@ -160,14 +160,12 @@ protected: virtual void vOnShowSpeedToggled(Gtk::CheckMenuItem * _poCMI, int _iShowSpeed); virtual void vOnSaveTypeToggled(Gtk::CheckMenuItem * _poCMI, int _iSaveType); virtual void vOnFlashSizeToggled(Gtk::CheckMenuItem * _poCMI, int _iFlashSize); - virtual void vOnSoundMuteToggled(Gtk::CheckMenuItem * _poCMI); - virtual void vOnSoundQualityToggled(Gtk::CheckMenuItem * _poCMI, int _iSoundQuality); - virtual void vOnSoundVolumeToggled(Gtk::CheckMenuItem * _poCMI, float _fSoundVolume); virtual void vOnGBBorderToggled(Gtk::CheckMenuItem * _poCMI); virtual void vOnGBPrinterToggled(Gtk::CheckMenuItem * _poCMI); virtual void vOnEmulatorTypeToggled(Gtk::CheckMenuItem * _poCMI, int _iEmulatorType); virtual void vOnJoypadConfigure(); virtual void vOnDisplayConfigure(); + virtual void vOnSoundConfigure(); virtual void vOnHelpAbout(); virtual bool bOnEmuIdle(); @@ -261,7 +259,6 @@ private: bool m_bWasEmulating; bool m_bAutoFrameskip; EShowSpeed m_eShowSpeed; - ESoundQuality m_eSoundQuality; void vInitSystem(); void vUnInitSystem(); diff --git a/src/gtk/windowcallbacks.cpp b/src/gtk/windowcallbacks.cpp index 0db4d82b..4e6c5f49 100644 --- a/src/gtk/windowcallbacks.cpp +++ b/src/gtk/windowcallbacks.cpp @@ -39,6 +39,7 @@ #include "joypadconfig.h" #include "directoriesconfig.h" #include "displayconfig.h" +#include "soundconfig.h" namespace VBA { @@ -471,35 +472,6 @@ void Window::vOnFlashSizeToggled(Gtk::CheckMenuItem * _poCMI, int _iFlashSize) m_poCoreConfig->vSetKey("flash_size", _iFlashSize); } -void Window::vOnSoundMuteToggled(Gtk::CheckMenuItem * _poCMI) -{ - bool bMute = _poCMI->get_active(); - m_poSoundConfig->vSetKey("mute", bMute); - vApplyConfigMute(); -} - -void Window::vOnSoundQualityToggled(Gtk::CheckMenuItem * _poCMI, int _iSoundQuality) -{ - if (! _poCMI->get_active()) - { - return; - } - - m_poSoundConfig->vSetKey("quality", _iSoundQuality); - vApplyConfigSoundQuality(); -} - -void Window::vOnSoundVolumeToggled(Gtk::CheckMenuItem * _poCMI, float _fSoundVolume) -{ - if (! _poCMI->get_active()) - { - return; - } - - m_poSoundConfig->vSetKey("volume", _fSoundVolume); - vApplyConfigVolume(); -} - void Window::vOnGBBorderToggled(Gtk::CheckMenuItem * _poCMI) { gbBorderOn = _poCMI->get_active(); @@ -550,6 +522,19 @@ void Window::vOnDisplayConfigure() poDialog->hide(); } +void Window::vOnSoundConfigure() +{ + std::string sUiFile = sGetUiFilePath("sound.ui"); + Glib::RefPtr poBuilder = Gtk::Builder::create_from_file(sUiFile); + + SoundConfigDialog * poDialog = 0; + poBuilder->get_widget_derived("SoundConfigDialog", poDialog); + poDialog->vSetConfig(m_poSoundConfig, this); + poDialog->set_transient_for(*this); + poDialog->run(); + poDialog->hide(); +} + void Window::vOnHelpAbout() { Gtk::AboutDialog oAboutDialog;