diff --git a/project/vc2008_mfc/VBA2008.vcproj b/project/vc2008_mfc/VBA2008.vcproj index d11a3435..2812d4dc 100644 --- a/project/vc2008_mfc/VBA2008.vcproj +++ b/project/vc2008_mfc/VBA2008.vcproj @@ -606,7 +606,7 @@ > m_bSaveAndValidate == TRUE ) { + m_enabled = BST_CHECKED == enhance_sound.GetCheck(); + m_surround = BST_CHECKED == surround.GetCheck(); + m_echo = (float)echo.GetPos() / 100.0f; + m_stereo = (float)stereo.GetPos() / 100.0f; + m_volume = (float)volume.GetPos() / 100.0f; + } +} + +BOOL AudioCoreSettingsDlg::OnTtnNeedText(UINT id, NMHDR *pNMHDR, LRESULT *pResult) +{ + TOOLTIPTEXT *t3 = (TOOLTIPTEXT *)pNMHDR; // dirty Windows API + BOOL i_provided_tooltip_with_text = TRUE; + + if( !( t3->uFlags & TTF_IDISHWND ) ) { + return FALSE; + } + // even dirtier Windows API: + // t3->hdr.idFrom is actually a HWND, holy cow, why? + // The other case does not even occur. + int controlID = ::GetDlgCtrlID( (HWND)t3->hdr.idFrom ); + CString res; + TCHAR buf[0x400]; // Use own string buffer because szText has an 80 char limit. + // We can't use a dynamic buffer size because Windows does some shady things with + // t3->lpszText at the end of this function, so we have no chance to free the buffer + // before the end of this function. + + switch( controlID ) { + case IDC_VOLUME: + _stprintf_s( t3->szText, _countof( t3->szText ), _T( "%i%%" ), volume.GetPos() ); + break; + case IDC_ECHO: + _stprintf_s( t3->szText, _countof( t3->szText ), _T( "%i%%" ), echo.GetPos() ); + break; + case IDC_STEREO: + _stprintf_s( t3->szText, _countof( t3->szText ), _T( "%i%%" ), stereo.GetPos() ); + break; + case IDC_DEFAULT_VOLUME: + res.LoadString( IDS_TOOLTIP_DEFAULT_VOLUME ); + _tcscpy_s( buf, _countof( buf ), res.GetString() ); + t3->lpszText = buf; + break; + case IDC_ENHANCE_SOUND: + res.LoadString( IDS_TOOLTIP_ENHANCE_SOUND ); + _tcscpy_s( buf, _countof( buf ), res.GetString() ); + t3->lpszText = buf; + break; + case IDC_SURROUND: + res.LoadString( IDS_TOOLTIP_SURROUND ); + _tcscpy_s( buf, _countof( buf ), res.GetString() ); + t3->lpszText = buf; + break; + default: + i_provided_tooltip_with_text = FALSE; + break; + } + + return i_provided_tooltip_with_text; +} + + +BEGIN_MESSAGE_MAP(AudioCoreSettingsDlg, CDialog) + ON_NOTIFY_EX(TTN_NEEDTEXT, 0, &AudioCoreSettingsDlg::OnTtnNeedText) + ON_BN_CLICKED(IDC_DEFAULT_VOLUME, &AudioCoreSettingsDlg::OnBnClickedDefaultVolume) +END_MESSAGE_MAP() + + +// AudioCoreSettingsDlg message handlers + +BOOL AudioCoreSettingsDlg::OnInitDialog() +{ + CDialog::OnInitDialog(); + + // Set up tooltip control + toolTip = new CToolTipCtrl; + toolTip->Create( this ); + toolTip->AddTool( GetDlgItem( IDC_DEFAULT_VOLUME ) ); + toolTip->AddTool( GetDlgItem( IDC_ENHANCE_SOUND ) ); + toolTip->AddTool( GetDlgItem( IDC_SURROUND ) ); + toolTip->Activate( TRUE ); + + enhance_sound.SetCheck( m_enabled ? BST_CHECKED : BST_UNCHECKED ); + + surround.SetCheck( m_surround ? BST_CHECKED : BST_UNCHECKED ); + + echo.SetRange( 0, 100 ); + echo.SetPos( (int)( m_echo * 100.0f ) ); + + stereo.SetRange( 0, 100 ); + stereo.SetPos( (int)( m_stereo * 100.0f ) ); + + volume.SetRange( (int)( MIN_VOLUME * 100.0f ), (int)( MAX_VOLUME * 100.0f ) ); + volume.SetPos( (int)( m_volume * 100.0f ) ); + + return TRUE; // return TRUE unless you set the focus to a control + // EXCEPTION: OCX Property Pages should return FALSE +} + +BOOL AudioCoreSettingsDlg::PreTranslateMessage(MSG* pMsg) +{ + // Required for enabling ToolTips in a modal dialog box. + if( NULL != toolTip ) { + toolTip->RelayEvent( pMsg ); + } + + return CDialog::PreTranslateMessage(pMsg); +} + +void AudioCoreSettingsDlg::OnBnClickedDefaultVolume() +{ + volume.SetPos( 100 ); +} diff --git a/src/win32/AudioCoreSettingsDlg.h b/src/win32/AudioCoreSettingsDlg.h new file mode 100644 index 00000000..ac8f55f8 --- /dev/null +++ b/src/win32/AudioCoreSettingsDlg.h @@ -0,0 +1,42 @@ +#pragma once + +#include "stdafx.h" + + +// AudioCoreSettingsDlg dialog + +class AudioCoreSettingsDlg : public CDialog +{ + DECLARE_DYNAMIC(AudioCoreSettingsDlg) + +public: + bool m_enabled; + bool m_surround; + float m_echo; + float m_stereo; + float m_volume; + + AudioCoreSettingsDlg(CWnd* pParent = NULL); // standard constructor + virtual ~AudioCoreSettingsDlg(); + + virtual BOOL OnInitDialog(); + virtual BOOL PreTranslateMessage(MSG* pMsg); + afx_msg void OnBnClickedDefaultVolume(); + +// Dialog Data + enum { IDD = IDD_AUDIO_CORE_SETTINGS }; + +protected: + virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support + afx_msg BOOL OnTtnNeedText(UINT id, NMHDR *pNMHDR, LRESULT *pResult); // Retrieve text for ToolTip + + DECLARE_MESSAGE_MAP() + +private: + CButton enhance_sound; + CButton surround; + CSliderCtrl echo; + CSliderCtrl stereo; + CSliderCtrl volume; + CToolTipCtrl *toolTip; +}; diff --git a/src/win32/AudioEffectsDlg.cpp b/src/win32/AudioEffectsDlg.cpp deleted file mode 100644 index 52b667d8..00000000 --- a/src/win32/AudioEffectsDlg.cpp +++ /dev/null @@ -1,70 +0,0 @@ -// ..\..\src\win32\AudioEffectsDlg.cpp : implementation file -// - -#include "stdafx.h" -#include "AudioEffectsDlg.h" - -// Has to be in int range! -#define SLIDER_RESOLUTION ( 100 ) -// We do everything in percents. - - -// AudioEffectsDlg dialog - -IMPLEMENT_DYNAMIC(AudioEffectsDlg, CDialog) - -AudioEffectsDlg::AudioEffectsDlg(CWnd* pParent /*=NULL*/) - : CDialog(AudioEffectsDlg::IDD, pParent) - , m_enabled( false ) - , m_surround( false ) - , m_echo( 0.0f ) - , m_stereo( 0.0f ) -{ -} - -AudioEffectsDlg::~AudioEffectsDlg() -{ -} - -void AudioEffectsDlg::DoDataExchange(CDataExchange* pDX) -{ - CDialog::DoDataExchange(pDX); - - CButton *enhance_sound = (CButton *)GetDlgItem( IDC_ENHANCE_SOUND ); - CButton *surround = (CButton * )GetDlgItem( IDC_SURROUND ); - CSliderCtrl *echo = (CSliderCtrl *)GetDlgItem( IDC_ECHO ); - CSliderCtrl *stereo = (CSliderCtrl *)GetDlgItem( IDC_STEREO ); - - if( pDX->m_bSaveAndValidate == TRUE ) { - m_enabled = BST_CHECKED == enhance_sound->GetCheck(); - m_surround = BST_CHECKED == surround->GetCheck(); - m_echo = (float)echo->GetPos() / (float)SLIDER_RESOLUTION; - m_stereo = (float)stereo->GetPos() / (float)SLIDER_RESOLUTION; - } else { - enhance_sound->SetCheck( m_enabled ? BST_CHECKED : BST_UNCHECKED ); - surround->SetCheck( m_surround ? BST_CHECKED : BST_UNCHECKED ); - echo->SetPos( (int)( m_echo * (float)SLIDER_RESOLUTION ) ); - stereo->SetPos( (int)( m_stereo * (float)SLIDER_RESOLUTION ) ); - } -} - - -BEGIN_MESSAGE_MAP(AudioEffectsDlg, CDialog) -END_MESSAGE_MAP() - - -// AudioEffectsDlg message handlers - -BOOL AudioEffectsDlg::OnInitDialog() -{ - CDialog::OnInitDialog(); - - CSliderCtrl *echo = (CSliderCtrl *)GetDlgItem( IDC_ECHO ); - echo->SetRange( 0, SLIDER_RESOLUTION ); - - CSliderCtrl *stereo = (CSliderCtrl *)GetDlgItem( IDC_STEREO ); - stereo->SetRange( 0, SLIDER_RESOLUTION ); - - return TRUE; // return TRUE unless you set the focus to a control - // EXCEPTION: OCX Property Pages should return FALSE -} diff --git a/src/win32/AudioEffectsDlg.h b/src/win32/AudioEffectsDlg.h deleted file mode 100644 index a4befc2b..00000000 --- a/src/win32/AudioEffectsDlg.h +++ /dev/null @@ -1,28 +0,0 @@ -#pragma once - - -// AudioEffectsDlg dialog - -class AudioEffectsDlg : public CDialog -{ - DECLARE_DYNAMIC(AudioEffectsDlg) - -public: - bool m_enabled; - bool m_surround; - float m_echo; - float m_stereo; - - AudioEffectsDlg(CWnd* pParent = NULL); // standard constructor - virtual ~AudioEffectsDlg(); - -// Dialog Data - enum { IDD = IDD_AUDIO_EFFECTS }; - -protected: - virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support - - DECLARE_MESSAGE_MAP() -public: - virtual BOOL OnInitDialog(); -}; diff --git a/src/win32/MainWnd.cpp b/src/win32/MainWnd.cpp index 1af57b04..9bc6ccd6 100644 --- a/src/win32/MainWnd.cpp +++ b/src/win32/MainWnd.cpp @@ -431,7 +431,7 @@ BEGIN_MESSAGE_MAP(MainWnd, CWnd) ON_COMMAND(ID_OUTPUTAPI_XAUDIO2CONFIG, &MainWnd::OnOutputapiXaudio2config) ON_UPDATE_COMMAND_UI(ID_OUTPUTAPI_XAUDIO2CONFIG, &MainWnd::OnUpdateOutputapiXaudio2config) ON_WM_ENTERSIZEMOVE() - ON_COMMAND(ID_AUDIO_EFFECTS, &MainWnd::OnAudioEffects) + ON_COMMAND(ID_AUDIO_CORE_SETTINGS, &MainWnd::OnAudioEffects) END_MESSAGE_MAP() diff --git a/src/win32/MainWndOptions.cpp b/src/win32/MainWndOptions.cpp index d6717b5e..c025544b 100644 --- a/src/win32/MainWndOptions.cpp +++ b/src/win32/MainWndOptions.cpp @@ -36,7 +36,7 @@ #include "OALConfig.h" #include "XAudio2_Config.h" #include "BIOSDialog.h" -#include "AudioEffectsDlg.h" +#include "AudioCoreSettingsDlg.h" #include "../System.h" #include "../agb/agbprint.h" @@ -816,12 +816,13 @@ void MainWnd::OnUpdateOptionsSoundMute(CCmdUI* pCmdUI) void MainWnd::OnAudioEffects() { - AudioEffectsDlg dlg; + AudioCoreSettingsDlg dlg; dlg.m_enabled = gb_effects_config.enabled; dlg.m_surround = gb_effects_config.surround; dlg.m_echo = gb_effects_config.echo; dlg.m_stereo = gb_effects_config.stereo; + dlg.m_volume = soundGetVolume(); if( IDOK == dlg.DoModal() ) { gb_effects_config_t _new; @@ -832,6 +833,8 @@ void MainWnd::OnAudioEffects() _new.stereo = dlg.m_stereo; gbSoundConfigEffects( _new ); + + soundSetVolume( dlg.m_volume ); } } diff --git a/src/win32/VBA.rc b/src/win32/VBA.rc index 4dda16e8..1f0833e1 100644 --- a/src/win32/VBA.rc +++ b/src/win32/VBA.rc @@ -1167,24 +1167,30 @@ BEGIN RTEXT "Device:",IDC_STATIC,6,6,48,12 END -IDD_AUDIO_EFFECTS DIALOGEX 0, 0, 136, 144 +IDD_AUDIO_CORE_SETTINGS DIALOGEX 0, 0, 256, 144 STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Audio Effects" +CAPTION "Audio Core Settings" FONT 8, "MS Shell Dlg", 400, 0, 0x1 BEGIN - DEFPUSHBUTTON "OK",IDOK,30,126,48,14 - PUSHBUTTON "Cancel",IDCANCEL,84,126,48,14 + DEFPUSHBUTTON "OK",IDOK,150,126,48,14 + PUSHBUTTON "Cancel",IDCANCEL,204,126,48,14 GROUPBOX "Game Boy only",IDC_STATIC,6,6,126,114 - CONTROL "Enhance sound",IDC_ENHANCE_SOUND,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,12,18,90,12 - CONTROL "Surround",IDC_SURROUND,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,24,30,90,12 + CONTROL "Enhance sound",IDC_ENHANCE_SOUND,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,12,18,65,10 + CONTROL "Surround",IDC_SURROUND,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,24,30,45,10 GROUPBOX "Echo",IDC_STATIC,24,42,102,36 - CONTROL "",IDC_ECHO,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,30,54,90,12 + CONTROL "",IDC_ECHO,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | TBS_TOOLTIPS | WS_TABSTOP,30,54,90,12 LTEXT "None",IDC_STATIC,30,66,36,8,SS_CENTERIMAGE RTEXT "Lots",IDC_STATIC,84,66,36,8,SS_CENTERIMAGE GROUPBOX "Stereo",IDC_STATIC,24,78,102,36 - CONTROL "",IDC_STEREO,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,30,90,90,12 + CONTROL "",IDC_STEREO,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | TBS_TOOLTIPS | WS_TABSTOP,30,90,90,12 LTEXT "Center",IDC_STATIC,30,102,36,8,SS_CENTERIMAGE RTEXT "Left/Right",IDC_STATIC,84,102,36,8,SS_CENTERIMAGE + GROUPBOX "Game Boy Advance only",IDC_STATIC,138,6,114,114 + GROUPBOX "Volume",IDC_STATIC,144,18,102,42 + CONTROL "",IDC_VOLUME,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | TBS_TOOLTIPS | WS_TABSTOP,150,30,90,12 + LTEXT "Mute",IDC_STATIC,150,42,18,12,SS_CENTERIMAGE + RTEXT "Max",IDC_STATIC,222,42,18,12,SS_CENTERIMAGE + PUSHBUTTON "Default",IDC_DEFAULT_VOLUME,174,42,42,12,BS_NOTIFY END @@ -1537,10 +1543,10 @@ BEGIN BOTTOMMARGIN, 89 END - IDD_AUDIO_EFFECTS, DIALOG + IDD_AUDIO_CORE_SETTINGS, DIALOG BEGIN LEFTMARGIN, 7 - RIGHTMARGIN, 129 + RIGHTMARGIN, 249 TOPMARGIN, 7 BOTTOMMARGIN, 137 END @@ -1796,7 +1802,7 @@ BEGIN MENUITEM "Off", ID_OPTIONS_SOUND_PCMINTERPOLATION_NONE END MENUITEM SEPARATOR - MENUITEM "Effects...", ID_AUDIO_EFFECTS + MENUITEM "Core Settings...", ID_AUDIO_CORE_SETTINGS MENUITEM SEPARATOR POPUP "Sound Channels" BEGIN @@ -2222,6 +2228,9 @@ BEGIN IDS_INVALID_CBA_CODE "Invalid CBA code. Format is XXXXXXXX YYYY." IDS_CBA_CODE_WARNING "Warning: Codes seem to be for a different game.\nCodes may not work correctly." IDS_OUT_OF_MEMORY "Failed to allocate memory for %s" + IDS_TOOLTIP_DEFAULT_VOLUME "Reset to default volume (100%)." + IDS_TOOLTIP_ENHANCE_SOUND "Enable the following sound enhancements." + IDS_TOOLTIP_SURROUND "Inverts the phase of some channels, making it sound as if sound is coming from behind." END STRINGTABLE diff --git a/src/win32/resource.h b/src/win32/resource.h index 39145015..a0af800d 100644 --- a/src/win32/resource.h +++ b/src/win32/resource.h @@ -45,7 +45,10 @@ #define IDS_CBA_CODE_WARNING 40 #define IDS_OUT_OF_MEMORY 41 #define IDS_WRONG_GAMESHARK_CODE 42 +#define IDS_TOOLTIP_DEFAULT_VOLUME 42 #define IDS_UNSUPPORTED_GAMESHARK_CODE 43 +#define IDS_TOOLTIP_ENHANCE_SOUND 43 +#define IDS_TOOLTIP_SURROUND 44 #define IDI_MAINICON 101 #define IDD_REGISTERS 102 #define IDD_DEBUG 103 @@ -101,7 +104,7 @@ #define IDD_BIOS 161 #define IDD_FULLSCREEN 162 #define IDD_XAUDIO2_CONFIG 163 -#define IDD_AUDIO_EFFECTS 164 +#define IDD_AUDIO_CORE_SETTINGS 164 #define IDC_R0 1000 #define IDC_EDIT_UP 1000 #define IDC_R1 1001 @@ -545,6 +548,8 @@ #define IDC_ECHO 1289 #define IDC_STEREO 1290 #define IDC_SLIDER2 1291 +#define IDC_VOLUME 1291 +#define IDC_DEFAULT_VOLUME 1292 #define IDS_OAL_NODEVICE 2000 #define IDS_OAL_NODLL 2001 #define IDS_AVI_CANNOT_CREATE_AVI 2002 @@ -861,7 +866,7 @@ #define ID_LOADGAME_DONOTCHANGEBATTERYSAVE 40362 #define ID_OUTPUTAPI_CONFIGURATION40363 40363 #define ID_OUTPUTAPI_XAUDIO2CONFIG 40364 -#define ID_AUDIO_EFFECTS 40365 +#define ID_AUDIO_CORE_SETTINGS 40365 // Next default values for new objects // @@ -869,7 +874,7 @@ #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 165 #define _APS_NEXT_COMMAND_VALUE 40366 -#define _APS_NEXT_CONTROL_VALUE 1292 +#define _APS_NEXT_CONTROL_VALUE 1296 #define _APS_NEXT_SYMED_VALUE 103 #endif #endif