diff --git a/Source/Core/AudioCommon/Src/AudioCommonConfig.cpp b/Source/Core/AudioCommon/Src/AudioCommonConfig.cpp index c46a1edfbe..777fdbab95 100644 --- a/Source/Core/AudioCommon/Src/AudioCommonConfig.cpp +++ b/Source/Core/AudioCommon/Src/AudioCommonConfig.cpp @@ -1,32 +1,52 @@ -#include "AudioCommon.h" -AudioCommonConfig ac_Config; - -// Load from given file -void AudioCommonConfig::Load(IniFile &file) { - file.Get("Config", "EnableDTKMusic", &m_EnableDTKMusic, true); - file.Get("Config", "EnableThrottle", &m_EnableThrottle, true); -#ifdef _WIN32 - file.Get("Config", "Backend", &sBackend, "DSound"); -#elif defined(__APPLE__) - std::string temp; - file.Get("Config", "Backend", &temp, "AOSound"); - strncpy(sBackend, temp.c_str(), 128); -#else - file.Get("Config", "Backend", &sBackend, "AOSound"); -#endif -} - -// Set the values for the file -void AudioCommonConfig::Set(IniFile &file) { - file.Set("Config", "EnableDTKMusic", m_EnableDTKMusic); - file.Set("Config", "EnableThrottle", m_EnableThrottle); - file.Set("Config", "Backend", sBackend); -} - -// Update according to the values (stream/mixer) -void AudioCommonConfig::Update() { - if (soundStream) { - soundStream->GetMixer()->SetThrottle(m_EnableThrottle); - soundStream->GetMixer()->SetDTKMusic(m_EnableDTKMusic); - } -} +// Copyright (C) 2003-2009 Dolphin Project. + +// 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, version 2.0. + +// 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 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#include "AudioCommon.h" +AudioCommonConfig ac_Config; + +// Load from given file +void AudioCommonConfig::Load(IniFile &file) { + file.Get("Config", "EnableDTKMusic", &m_EnableDTKMusic, true); + file.Get("Config", "EnableThrottle", &m_EnableThrottle, true); + file.Get("Config", "Volume", &m_Volume, 0); +#ifdef _WIN32 + file.Get("Config", "Backend", &sBackend, "DSound"); +#elif defined(__APPLE__) + std::string temp; + file.Get("Config", "Backend", &temp, "AOSound"); + strncpy(sBackend, temp.c_str(), 128); +#else + file.Get("Config", "Backend", &sBackend, "AOSound"); +#endif +} + +// Set the values for the file +void AudioCommonConfig::Set(IniFile &file) { + file.Set("Config", "EnableDTKMusic", m_EnableDTKMusic); + file.Set("Config", "EnableThrottle", m_EnableThrottle); + file.Set("Config", "Backend", sBackend); + file.Set("Config", "Volume", m_Volume); +} + +// Update according to the values (stream/mixer) +void AudioCommonConfig::Update() { + if (soundStream) { + soundStream->GetMixer()->SetThrottle(m_EnableThrottle); + soundStream->GetMixer()->SetDTKMusic(m_EnableDTKMusic); + soundStream->SetVolume(m_Volume); + } +} diff --git a/Source/Core/AudioCommon/Src/AudioCommonConfig.h b/Source/Core/AudioCommon/Src/AudioCommonConfig.h index 19b0db90ef..53507325f9 100644 --- a/Source/Core/AudioCommon/Src/AudioCommonConfig.h +++ b/Source/Core/AudioCommon/Src/AudioCommonConfig.h @@ -1,32 +1,50 @@ -#ifndef _AUDIO_COMMON_CONFIG_H_ -#define _AUDIO_COMMON_CONFIG_H_ - -#include -#include "IniFile.h" - -// Backend Types -#define BACKEND_DIRECTSOUND "DSound" -#define BACKEND_AOSOUND "AOSound" -#define BACKEND_OPENAL "OpenAL" -#define BACKEND_NULL "NullSound" -struct AudioCommonConfig -{ - bool m_EnableDTKMusic; - bool m_EnableThrottle; -#ifdef __APPLE__ - char sBackend[128]; -#else - std::string sBackend; -#endif - - // Load from given file - void Load(IniFile &file); - - // Set the values for the file - void Set(IniFile &file); - - // Update according to the values (stream/mixer) - void Update(); -}; - -#endif //AUDIO_COMMON_CONFIG +// Copyright (C) 2003-2009 Dolphin Project. + +// 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, version 2.0. + +// 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 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#ifndef _AUDIO_COMMON_CONFIG_H_ +#define _AUDIO_COMMON_CONFIG_H_ + +#include +#include "IniFile.h" + +// Backend Types +#define BACKEND_DIRECTSOUND "DSound" +#define BACKEND_AOSOUND "AOSound" +#define BACKEND_OPENAL "OpenAL" +#define BACKEND_NULL "NullSound" +struct AudioCommonConfig +{ + bool m_EnableDTKMusic; + bool m_EnableThrottle; + int m_Volume; +#ifdef __APPLE__ + char sBackend[128]; +#else + std::string sBackend; +#endif + + // Load from given file + void Load(IniFile &file); + + // Set the values for the file + void Set(IniFile &file); + + // Update according to the values (stream/mixer) + void Update(); +}; + +#endif //AUDIO_COMMON_CONFIG diff --git a/Source/Core/AudioCommon/Src/DSoundStream.cpp b/Source/Core/AudioCommon/Src/DSoundStream.cpp index 9ed4d592f4..94a26bd81b 100644 --- a/Source/Core/AudioCommon/Src/DSoundStream.cpp +++ b/Source/Core/AudioCommon/Src/DSoundStream.cpp @@ -16,6 +16,7 @@ // http://code.google.com/p/dolphin-emu/ #include +#include #include #include "DSoundStream.h" @@ -40,7 +41,7 @@ bool DSound::CreateBuffer() // Fill out DSound buffer description. dsbdesc.dwSize = sizeof(DSBUFFERDESC); - dsbdesc.dwFlags = DSBCAPS_GETCURRENTPOSITION2 | DSBCAPS_STICKYFOCUS; + dsbdesc.dwFlags = DSBCAPS_GETCURRENTPOSITION2 | DSBCAPS_STICKYFOCUS | DSBCAPS_CTRLVOLUME; dsbdesc.dwBufferBytes = bufferSize = BUFSIZE; dsbdesc.lpwfxFormat = (WAVEFORMATEX *)&pcmwf; dsbdesc.guid3DAlgorithm = DS3DALG_DEFAULT; @@ -49,6 +50,7 @@ bool DSound::CreateBuffer() if (SUCCEEDED(res)) { dsBuffer->SetCurrentPosition(0); + dsBuffer->SetVolume(m_volume); return true; } else @@ -152,6 +154,17 @@ bool DSound::Start() return true; } +void DSound::SetVolume(int volume) +{ + // This is in "dBA attenuation" from 0 to -10000, logarithmic + m_volume = (int)floor(log10((float)volume) * 5000.0f) - 10000; + + soundCriticalSection.Enter(); + if (ds != NULL) + dsBuffer->SetVolume(m_volume); + soundCriticalSection.Leave(); +} + void DSound::Update() { soundSyncEvent.Set(); diff --git a/Source/Core/AudioCommon/Src/DSoundStream.h b/Source/Core/AudioCommon/Src/DSoundStream.h index b4668a9995..17f91d27d3 100644 --- a/Source/Core/AudioCommon/Src/DSoundStream.h +++ b/Source/Core/AudioCommon/Src/DSoundStream.h @@ -42,6 +42,7 @@ class DSound : public SoundStream int bufferSize; //i bytes int totalRenderedBytes; + int m_volume; // playback position int currentPos; @@ -73,6 +74,7 @@ public: virtual bool Start(); virtual void SoundLoop(); + virtual void SetVolume(int volume); virtual void Stop(); static bool isValid() { return true; } virtual bool usesMixer() const { return true; } diff --git a/Source/Core/AudioCommon/Src/SoundStream.h b/Source/Core/AudioCommon/Src/SoundStream.h index 5c642936bc..b0864e2aff 100644 --- a/Source/Core/AudioCommon/Src/SoundStream.h +++ b/Source/Core/AudioCommon/Src/SoundStream.h @@ -40,6 +40,7 @@ public: static bool isValid() { return false; } virtual CMixer *GetMixer() const { return m_mixer; } virtual bool Start() { return false; } + virtual void SetVolume(int) {} virtual void SoundLoop() {} virtual void Stop() {} virtual void Update() {} diff --git a/Source/Plugins/Plugin_DSP_HLE/Src/ConfigDlg.cpp b/Source/Plugins/Plugin_DSP_HLE/Src/ConfigDlg.cpp index fede3cd81d..4fea0e1a84 100644 --- a/Source/Plugins/Plugin_DSP_HLE/Src/ConfigDlg.cpp +++ b/Source/Plugins/Plugin_DSP_HLE/Src/ConfigDlg.cpp @@ -25,6 +25,7 @@ EVT_CHECKBOX(ID_ENABLE_HLE_AUDIO, ConfigDialog::SettingsChanged) EVT_CHECKBOX(ID_ENABLE_DTK_MUSIC, ConfigDialog::SettingsChanged) EVT_CHECKBOX(ID_ENABLE_THROTTLE, ConfigDialog::SettingsChanged) EVT_CHECKBOX(ID_ENABLE_RE0_FIX, ConfigDialog::SettingsChanged) +EVT_COMMAND_SCROLL(ID_VOLUME, ConfigDialog::VolumeChanged) END_EVENT_TABLE() ConfigDialog::ConfigDialog(wxWindow *parent, wxWindowID id, const wxString &title, const wxPoint &position, const wxSize& size, long style) @@ -45,7 +46,10 @@ ConfigDialog::ConfigDialog(wxWindow *parent, wxWindowID id, const wxString &titl m_buttonEnableThrottle = new wxCheckBox(this, ID_ENABLE_THROTTLE, wxT("Enable Other Audio (Throttle)"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator); m_buttonEnableRE0Fix = new wxCheckBox(this, ID_ENABLE_RE0_FIX, wxT("Enable RE0 Audio Fix"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator); wxStaticText *BackendText = new wxStaticText(this, wxID_ANY, wxT("Audio Backend"), wxDefaultPosition, wxDefaultSize, 0); - m_BackendSelection = new wxComboBox(this, ID_BACKEND, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxArrayBackends, wxCB_READONLY, wxDefaultValidator); + m_BackendSelection = new wxComboBox(this, ID_BACKEND, wxEmptyString, wxDefaultPosition, wxSize(90, 20), wxArrayBackends, wxCB_READONLY, wxDefaultValidator); + + m_volumeSlider = new wxSlider(this, ID_VOLUME, ac_Config.m_Volume, 1, 100, wxDefaultPosition, wxDefaultSize, wxSL_VERTICAL|wxSL_INVERSE); + m_volumeText = new wxStaticText(this, wxID_ANY, wxString::Format(wxT("%d %%"), ac_Config.m_Volume), wxDefaultPosition, wxDefaultSize, 0); // Update values m_buttonEnableHLEAudio->SetValue(g_Config.m_EnableHLEAudio ? true : false); @@ -62,56 +66,79 @@ ConfigDialog::ConfigDialog(wxWindow *parent, wxWindowID id, const wxString &titl m_buttonEnableRE0Fix->SetToolTip(wxT("This fixes audo in RE0 and maybe some other games.")); m_BackendSelection->SetToolTip(wxT("Changing this will have no effect while the emulator is running!")); + // Create sizer and add items to dialog wxBoxSizer *sMain = new wxBoxSizer(wxVERTICAL); + wxBoxSizer *sSettings = new wxBoxSizer(wxHORIZONTAL); + wxBoxSizer *sBackend = new wxBoxSizer(wxHORIZONTAL); + wxBoxSizer *sButtons = new wxBoxSizer(wxHORIZONTAL); + wxStaticBoxSizer *sbSettings = new wxStaticBoxSizer(wxVERTICAL, this, wxT("Sound Settings")); sbSettings->Add(m_buttonEnableHLEAudio, 0, wxALL, 5); sbSettings->Add(m_buttonEnableDTKMusic, 0, wxALL, 5); sbSettings->Add(m_buttonEnableThrottle, 0, wxALL, 5); sbSettings->Add(m_buttonEnableRE0Fix, 0, wxALL, 5); - wxBoxSizer *sBackend = new wxBoxSizer(wxHORIZONTAL); - sBackend->Add(BackendText, 0, wxALIGN_CENTRE_VERTICAL|wxALL, 5); - sBackend->Add(m_BackendSelection); - sbSettings->Add(sBackend); + sBackend->Add(BackendText, 0, wxALIGN_CENTER|wxALL, 5); + sBackend->Add(m_BackendSelection, 0, wxALL, 1); + sbSettings->Add(sBackend, 0, wxALL, 2); - sMain->Add(sbSettings, 0, wxEXPAND|wxALL, 5); - wxBoxSizer *sButtons = new wxBoxSizer(wxHORIZONTAL); - sButtons->Add(150, 0); // Lazy way to make the dialog as wide as we want it - sButtons->Add(m_OK, 0, wxALL, 5); - sMain->Add(sButtons, 0, wxEXPAND); - this->SetSizerAndFit(sMain); + wxStaticBoxSizer *sbSettingsV = new wxStaticBoxSizer(wxVERTICAL, this, wxT("Volume")); + sbSettingsV->Add(m_volumeSlider, 0, wxLEFT|wxRIGHT|wxALIGN_CENTER, 6); + sbSettingsV->Add(m_volumeText, 0, wxALL|wxALIGN_LEFT, 4); + + sSettings->Add(sbSettings, 0, wxALL|wxEXPAND, 4); + sSettings->Add(sbSettingsV, 0, wxALL|wxEXPAND, 4); + sMain->Add(sSettings, 0, wxALL|wxEXPAND, 4); + + sButtons->AddStretchSpacer(); + sButtons->Add(m_OK, 0, wxALL, 1); + sMain->Add(sButtons, 0, wxALL|wxEXPAND, 4); + SetSizerAndFit(sMain); } // Add audio output options void ConfigDialog::AddBackend(const char* backend) { + // Update values m_BackendSelection->Append(wxString::FromAscii(backend)); - // Update value #ifdef __APPLE__ m_BackendSelection->SetValue(wxString::FromAscii(ac_Config.sBackend)); #else m_BackendSelection->SetValue(wxString::FromAscii(ac_Config.sBackend.c_str())); #endif + + // Unfortunately, DSound is the only API having a volume setting... +#ifndef _WIN32 + m_volumeSlider->Disable(); + m_volumeText->Disable(); +#endif } ConfigDialog::~ConfigDialog() { } +void ConfigDialog::VolumeChanged(wxScrollEvent& WXUNUSED(event)) +{ + ac_Config.m_Volume = m_volumeSlider->GetValue(); + ac_Config.Update(); + + m_volumeText->SetLabel(wxString::Format(wxT("%d %%"), m_volumeSlider->GetValue())); +} + void ConfigDialog::SettingsChanged(wxCommandEvent& event) { g_Config.m_EnableHLEAudio = m_buttonEnableHLEAudio->GetValue(); g_Config.m_EnableRE0Fix = m_buttonEnableRE0Fix->GetValue(); ac_Config.m_EnableDTKMusic = m_buttonEnableDTKMusic->GetValue(); ac_Config.m_EnableThrottle = m_buttonEnableThrottle->GetValue(); - if (soundStream != NULL) - soundStream->GetMixer()->SetThrottle(ac_Config.m_EnableThrottle); #ifdef __APPLE__ strncpy(ac_Config.sBackend, m_BackendSelection->GetValue().mb_str(), 128); #else ac_Config.sBackend = m_BackendSelection->GetValue().mb_str(); #endif + ac_Config.Update(); g_Config.Save(); if (event.GetId() == wxID_OK) diff --git a/Source/Plugins/Plugin_DSP_HLE/Src/ConfigDlg.h b/Source/Plugins/Plugin_DSP_HLE/Src/ConfigDlg.h index 1a1675f6a0..1cb54a237d 100644 --- a/Source/Plugins/Plugin_DSP_HLE/Src/ConfigDlg.h +++ b/Source/Plugins/Plugin_DSP_HLE/Src/ConfigDlg.h @@ -39,6 +39,8 @@ public: private: DECLARE_EVENT_TABLE(); + wxSlider *m_volumeSlider; + wxStaticText *m_volumeText; wxButton *m_OK; wxCheckBox *m_buttonEnableHLEAudio; wxCheckBox *m_buttonEnableDTKMusic; @@ -54,11 +56,13 @@ private: ID_ENABLE_DTK_MUSIC, ID_ENABLE_THROTTLE, ID_ENABLE_RE0_FIX, - ID_BACKEND + ID_BACKEND, + ID_VOLUME }; void OnOK(wxCommandEvent& event); void SettingsChanged(wxCommandEvent& event); + void VolumeChanged(wxScrollEvent& event); }; #endif //__DSP_HLE_CONFIGDIALOG_h__ diff --git a/Source/Plugins/Plugin_DSP_LLE/Src/DSPConfigDlgLLE.cpp b/Source/Plugins/Plugin_DSP_LLE/Src/DSPConfigDlgLLE.cpp index 6f75879ed0..43377c59ad 100644 --- a/Source/Plugins/Plugin_DSP_LLE/Src/DSPConfigDlgLLE.cpp +++ b/Source/Plugins/Plugin_DSP_LLE/Src/DSPConfigDlgLLE.cpp @@ -91,8 +91,6 @@ void DSPConfigDialogLLE::SettingsChanged(wxCommandEvent& event) { ac_Config.m_EnableDTKMusic = m_buttonEnableDTKMusic->GetValue(); ac_Config.m_EnableThrottle = m_buttonEnableThrottle->GetValue(); - if (soundStream != NULL) - soundStream->GetMixer()->SetThrottle(ac_Config.m_EnableThrottle); #ifdef __APPLE__ strncpy(ac_Config.sBackend, m_BackendSelection->GetValue().mb_str(), 128);