| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518 |
- /*
- ** Command & Conquer Renegade(tm)
- ** Copyright 2025 Electronic Arts Inc.
- **
- ** 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 3 of the License, 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, see <http://www.gnu.org/licenses/>.
- */
- // AudioConfigDialog.cpp : implementation file
- //
- #include "stdafx.h"
- #include "wwconfig.h"
- #include "audioconfigdialog.h"
- #include "wwaudio.h"
- #include "locale_api.h"
- #include "wwconfig_ids.h"
- #include "..\..\combat\specialbuilds.h"
- #ifdef _DEBUG
- #define new DEBUG_NEW
- #undef THIS_FILE
- static char THIS_FILE[] = __FILE__;
- #endif
- /////////////////////////////////////////////////////////////////////////////
- // Constants
- /////////////////////////////////////////////////////////////////////////////
- enum
- {
- COL_DRIVER_NAME = 0,
- };
- /*
- #ifdef MULTIPLAYERDEMO
- const char *RENEGADE_SUB_KEY_NAME_AUDIO = "Software\\Westwood\\RenegadeMPDemo\\Sound";
- #else
- const char *RENEGADE_SUB_KEY_NAME_AUDIO = "Software\\Westwood\\Renegade\\Sound";
- #endif // MULTIPLAYERDEMO
- */
- #if defined(FREEDEDICATEDSERVER)
- const char *RENEGADE_SUB_KEY_NAME_AUDIO = "Software\\Westwood\\RenegadeFDS\\Sound";
- #elif defined(MULTIPLAYERDEMO)
- const char *RENEGADE_SUB_KEY_NAME_AUDIO = "Software\\Westwood\\RenegadeMPDemo\\Sound";
- #elif defined(BETACLIENT)
- const char *RENEGADE_SUB_KEY_NAME_AUDIO = "Software\\Westwood\\RenegadeBeta\\Sound";
- #else
- const char *RENEGADE_SUB_KEY_NAME_AUDIO = "Software\\Westwood\\Renegade\\Sound";
- #endif
- /////////////////////////////////////////////////////////////////////////////
- //
- // AudioConfigDialogClass
- //
- /////////////////////////////////////////////////////////////////////////////
- AudioConfigDialogClass::AudioConfigDialogClass(CWnd* pParent /*=NULL*/)
- : CDialog(AudioConfigDialogClass::IDD, pParent)
- {
- //{{AFX_DATA_INIT(AudioConfigDialogClass)
- // NOTE: the ClassWizard will add member initialization here
- //}}AFX_DATA_INIT
- CDialog::Create (AudioConfigDialogClass::IDD, pParent);
- return ;
- }
- /////////////////////////////////////////////////////////////////////////////
- //
- // DoDataExchange
- //
- /////////////////////////////////////////////////////////////////////////////
- void
- AudioConfigDialogClass::DoDataExchange (CDataExchange *pDX)
- {
- CDialog::DoDataExchange(pDX);
- //{{AFX_DATA_MAP(AudioConfigDialogClass)
- DDX_Control(pDX, IDC_SOUND_EFFECTS_SLIDER, m_SoundVolSlider);
- DDX_Control(pDX, IDC_MUSIC_SLIDER, m_MusicVolSlider);
- DDX_Control(pDX, IDC_DIALOG_SLIDER, m_DialogVolSlider);
- DDX_Control(pDX, IDC_CINEMATIC_SLIDER, m_CinematicVolSlider);
- DDX_Control(pDX, IDC_DRIVER_LIST, m_ListCtrl);
- //}}AFX_DATA_MAP
- return ;
- }
- BEGIN_MESSAGE_MAP(AudioConfigDialogClass, CDialog)
- //{{AFX_MSG_MAP(AudioConfigDialogClass)
- ON_WM_DESTROY()
- //}}AFX_MSG_MAP
- END_MESSAGE_MAP()
- /////////////////////////////////////////////////////////////////////////////
- //
- // OnInitDialog
- //
- // Modified: 12/06/2001 by MML - Retrieving strings from Locomoto file.
- /////////////////////////////////////////////////////////////////////////////
- BOOL
- AudioConfigDialogClass::OnInitDialog (void)
- {
- char string [_MAX_PATH];
-
- CDialog::OnInitDialog ();
- //
- // Set all the static strings for this dialog.
- //
- Locale_GetString( IDS_DRIVER, string );
- SetDlgItemText( IDC_DRIVER, string );
- Locale_GetString( IDS_VOLUME, string );
- SetDlgItemText( IDC_VOLUME, string );
- Locale_GetString( IDS_SOUND_EFFECTS, string );
- SetDlgItemText( IDC_SOUND_EFFECTS_CHECK, string );
- Locale_GetString( IDS_MUSIC, string );
- SetDlgItemText( IDC_MUSIC_CHECK, string );
- Locale_GetString( IDS_DIALOG, string );
- SetDlgItemText( IDC_DIALOG_CHECK, string );
- Locale_GetString( IDS_CINEMATIC, string);
- SetDlgItemText( IDC_CINEMATIC_CHECK, string );
- Locale_GetString( IDS_QUALITY, string );
- SetDlgItemText( IDC_QUALITY, string );
- SendDlgItemMessage (IDC_QUALITY_COMBO, CB_RESETCONTENT, 0, 0);
- SendDlgItemMessage (IDC_QUALITY_COMBO, CB_ADDSTRING, 0, (LPARAM)Locale_GetString (IDS_8_BIT, string));
- SendDlgItemMessage (IDC_QUALITY_COMBO, CB_ADDSTRING, 0, (LPARAM)Locale_GetString (IDS_16_BIT, string));
- Locale_GetString( IDS_PLAYBACK_RATE, string );
- SetDlgItemText( IDC_PLAYBACK_RATE, string );
- SendDlgItemMessage (IDC_RATE_COMBO, CB_RESETCONTENT, 0, 0);
- SendDlgItemMessage (IDC_RATE_COMBO, CB_ADDSTRING, 0, (LPARAM)Locale_GetString (IDS_11_KHZ, string));
- SendDlgItemMessage (IDC_RATE_COMBO, CB_ADDSTRING, 0, (LPARAM)Locale_GetString (IDS_22_KHZ, string));
- SendDlgItemMessage (IDC_RATE_COMBO, CB_ADDSTRING, 0, (LPARAM)Locale_GetString (IDS_44_KHZ, string));
- Locale_GetString( IDS_SPEAKER_SETUP, string );
- SetDlgItemText( IDC_SPEAKER_SETUP, string );
- SendDlgItemMessage (IDC_SPEAKER_COMBO, CB_RESETCONTENT, 0, 0);
- SendDlgItemMessage (IDC_SPEAKER_COMBO, CB_ADDSTRING, 0, (LPARAM)Locale_GetString (IDS_2_SPEAKER, string));
- SendDlgItemMessage (IDC_SPEAKER_COMBO, CB_ADDSTRING, 0, (LPARAM)Locale_GetString (IDS_HEADPHONE, string));
- SendDlgItemMessage (IDC_SPEAKER_COMBO, CB_ADDSTRING, 0, (LPARAM)Locale_GetString (IDS_SURROUND_SOUND, string));
- SendDlgItemMessage (IDC_SPEAKER_COMBO, CB_ADDSTRING, 0, (LPARAM)Locale_GetString (IDS_4_SPEAKER, string));
- Locale_GetString( IDS_STEREO, string );
- SetDlgItemText( IDC_STEREO_CHECK, string );
- //
- // Startup the audio library
- //
- new WWAudioClass;
- WWAudioClass::Get_Instance ()->Initialize ();
-
- //
- // Read the audio library's settings from the registry
- //
- StringClass device_name;
- bool is_stereo = true;
- int bits = 16;
- int hertz = 44100;
- bool sound_on = true;
- bool music_on = true;
- bool dialog_on = true;
- bool cinematic_on = true;
- float sound_vol = 1.0F;
- float music_vol = 1.0F;
- float dialog_vol = 1.0F;
- float cinematic_vol = 1.0F;
- int speaker_type = 0;
- WWAudioClass::Get_Instance ()->Load_From_Registry (RENEGADE_SUB_KEY_NAME_AUDIO,
- device_name, is_stereo, bits, hertz, sound_on,
- music_on, dialog_on, cinematic_on, sound_vol,
- music_vol, dialog_vol, cinematic_vol, speaker_type);
- //
- // Setup the sound volume controls
- //
- m_SoundVolSlider.SetRange (0, 100);
- m_SoundVolSlider.SetPos (static_cast<int>(sound_vol * 100));
- SendDlgItemMessage (IDC_SOUND_EFFECTS_CHECK, BM_SETCHECK, (WPARAM)sound_on);
- //
- // Setup the music volume controls
- //
- m_MusicVolSlider.SetRange (0, 100);
- m_MusicVolSlider.SetPos (static_cast<int>(music_vol * 100));
- SendDlgItemMessage (IDC_MUSIC_CHECK, BM_SETCHECK, (WPARAM)music_on);
- //
- // Setup the dialog volume controls
- //
- m_DialogVolSlider.SetRange (0, 100);
- m_DialogVolSlider.SetPos (static_cast<int>(dialog_vol * 100));
- SendDlgItemMessage (IDC_DIALOG_CHECK, BM_SETCHECK, (WPARAM)dialog_on);
- //
- // Setup the cinematic volume controls
- //
- m_CinematicVolSlider.SetRange (0, 100);
- m_CinematicVolSlider.SetPos (static_cast<int>(cinematic_vol * 100));
- SendDlgItemMessage (IDC_CINEMATIC_CHECK, BM_SETCHECK, (WPARAM)cinematic_on);
- //
- // Check the stereo box if necessary
- //
- SendDlgItemMessage (IDC_STEREO_CHECK, BM_SETCHECK, (WPARAM)is_stereo);
- //
- // Select the appropriate quality combobox entry
- //
- switch (bits)
- {
- case 8:
- SendDlgItemMessage (IDC_QUALITY_COMBO, CB_SETCURSEL, (WPARAM)0);
- break;
- default:
- case 16:
- SendDlgItemMessage (IDC_QUALITY_COMBO, CB_SETCURSEL, (WPARAM)1);
- break;
- }
- //
- // Select the appropriate kHz combobox entry
- //
- switch (hertz)
- {
- case 11025:
- SendDlgItemMessage (IDC_RATE_COMBO, CB_SETCURSEL, (WPARAM)0);
- break;
- case 22050:
- SendDlgItemMessage (IDC_RATE_COMBO, CB_SETCURSEL, (WPARAM)1);
- break;
- default:
- case 44100:
- SendDlgItemMessage (IDC_RATE_COMBO, CB_SETCURSEL, (WPARAM)2);
- break;
- }
- // Select the appropriate speaker setup combobox entry
- switch (speaker_type) {
- default:
- case 0:
- SendDlgItemMessage (IDC_SPEAKER_COMBO, CB_SETCURSEL, (WPARAM)0);
- break;
- case 1:
- SendDlgItemMessage (IDC_SPEAKER_COMBO, CB_SETCURSEL, (WPARAM)1);
- break;
-
- case 2:
- SendDlgItemMessage (IDC_SPEAKER_COMBO, CB_SETCURSEL, (WPARAM)2);
- break;
-
- case 3:
- SendDlgItemMessage (IDC_SPEAKER_COMBO, CB_SETCURSEL, (WPARAM)3);
- break;
- }
- //
- // Configure the list control
- //
- m_ListCtrl.SetExtendedStyle (m_ListCtrl.GetExtendedStyle () | LVS_EX_FULLROWSELECT);
- m_ListCtrl.InsertColumn (COL_DRIVER_NAME, "Driver Name");
- //
- // Size the columns
- //
- CRect rect;
- m_ListCtrl.GetClientRect (&rect);
- int width = rect.Width () - ::GetSystemMetrics (SM_CXVSCROLL);
- m_ListCtrl.SetColumnWidth (0, width);
- //
- // Loop over all the drivers
- //
- bool selected_default = false;
- int driver_count = WWAudioClass::Get_Instance ()->Get_3D_Device_Count ();
- for (int index = 0; index < driver_count; index ++) {
-
- //
- // Get information about this sound driver
- //
- WWAudioClass::DRIVER_INFO_STRUCT *driver_info = NULL;
- if (WWAudioClass::Get_Instance ()->Get_3D_Device (index, &driver_info)) {
-
- //
- // Add an entry to the list for this driver
- //
- int item_index = m_ListCtrl.InsertItem (0xFF, driver_info->name);
- if (item_index >= 0) {
- m_ListCtrl.SetItemData (item_index, (DWORD)driver_info->driver);
- //
- // Select this entry if its the default
- //
- if (::lstrcmpi (device_name, driver_info->name) == 0) {
- m_ListCtrl.SetItemState (item_index, LVIS_SELECTED, LVIS_SELECTED);
- selected_default = true;
- }
- }
- }
- }
- //
- // Select the first entry by default (if necessary)
- //
- if (selected_default == false) {
- m_ListCtrl.SetItemState (0, LVIS_SELECTED, LVIS_SELECTED);
- }
- //
- // Update the enabled state of the volume sliders
- //
- Update_Slider_Enable_State ();
- return TRUE;
- }
- /////////////////////////////////////////////////////////////////////////////
- //
- // OnDestroy
- //
- /////////////////////////////////////////////////////////////////////////////
- void
- AudioConfigDialogClass::OnDestroy (void)
- {
- //
- // Shutdown the audio library
- //
- WWAudioClass::Get_Instance ()->Shutdown ();
- delete WWAudioClass::Get_Instance ();
- CDialog::OnDestroy ();
- return ;
- }
- /////////////////////////////////////////////////////////////////////////////
- //
- // Apply_Changes
- //
- /////////////////////////////////////////////////////////////////////////////
- void
- AudioConfigDialogClass::Apply_Changes (void)
- {
- StringClass device_name;
- int hertz = 44100;
- int bits = 16;
- int speaker_type = 0;
- bool is_stereo = true;
- bool sound_on = true;
- bool music_on = true;
- bool dialog_on = true;
- bool cinematic_on = true;
- float sound_vol = 1.0F;
- float music_vol = 1.0F;
- float dialog_vol = 1.0F;
- float cinematic_vol = 1.0F;
- //
- // Get the volume settings
- //
- sound_vol = m_SoundVolSlider.GetPos () / 100.0F;
- music_vol = m_MusicVolSlider.GetPos () / 100.0F;
- dialog_vol = m_DialogVolSlider.GetPos () / 100.0F;
- cinematic_vol = m_CinematicVolSlider.GetPos() / 100.0F;
- //
- // Get the volume controls
- //
- sound_on = (SendDlgItemMessage (IDC_SOUND_EFFECTS_CHECK, BM_GETCHECK) == 1);
- music_on = (SendDlgItemMessage (IDC_MUSIC_CHECK, BM_GETCHECK) == 1);
- dialog_on = (SendDlgItemMessage (IDC_DIALOG_CHECK, BM_GETCHECK) == 1);
- cinematic_on = (SendDlgItemMessage (IDC_CINEMATIC_CHECK, BM_GETCHECK) == 1);
- //
- // Get the name of the selected device
- //
- int selected_item = m_ListCtrl.GetNextItem (-1, LVNI_ALL | LVNI_SELECTED);
- if (selected_item >= 0) {
- device_name = (const char *)m_ListCtrl.GetItemText (selected_item, 0);
- }
- //
- // Get the stereo flag from the dialog
- //
- is_stereo = bool(SendDlgItemMessage (IDC_STEREO_CHECK, BM_GETCHECK) == 1);
- //
- // Get the playback bit rate from the dialog
- //
- int quality_cursel = SendDlgItemMessage (IDC_QUALITY_COMBO, CB_GETCURSEL);
- if (quality_cursel == 0) {
- bits = 8;
- } else if (quality_cursel == 1) {
- bits = 16;
- }
- //
- // Get the playback rate from the controls
- //
- int rate_cursel = SendDlgItemMessage (IDC_RATE_COMBO, CB_GETCURSEL);
- if (rate_cursel == 0) {
- hertz = 11025;
- } else if (rate_cursel == 1) {
- hertz = 22050;
- } else if (rate_cursel == 2) {
- hertz = 44100;
- }
- // Get the speaker setup from the controls.
- speaker_type = SendDlgItemMessage (IDC_SPEAKER_COMBO, CB_GETCURSEL);
- //
- // Store these settings in the registry
- //
- WWAudioClass::Get_Instance ()->Save_To_Registry (RENEGADE_SUB_KEY_NAME_AUDIO,
- device_name, is_stereo, bits, hertz,
- sound_on, music_on, dialog_on, cinematic_on,
- sound_vol, music_vol, dialog_vol, cinematic_vol, speaker_type);
- return ;
- }
- /////////////////////////////////////////////////////////////////////////////
- //
- // WindowProc
- //
- /////////////////////////////////////////////////////////////////////////////
- LRESULT
- AudioConfigDialogClass::WindowProc
- (
- UINT message,
- WPARAM wParam,
- LPARAM lParam
- )
- {
- if (message == (WM_USER + 101)) {
- Apply_Changes ();
- }
- return CDialog::WindowProc(message, wParam, lParam);
- }
- /////////////////////////////////////////////////////////////////////////////
- //
- // Update_Slider_Enable_State
- //
- /////////////////////////////////////////////////////////////////////////////
- void
- AudioConfigDialogClass::Update_Slider_Enable_State (void)
- {
- BOOL sound_enabled = IsDlgButtonChecked (IDC_SOUND_EFFECTS_CHECK);
- BOOL music_enabled = IsDlgButtonChecked (IDC_MUSIC_CHECK);
- BOOL dialog_enabled = IsDlgButtonChecked (IDC_DIALOG_CHECK);
- BOOL cinematic_enabled = IsDlgButtonChecked (IDC_CINEMATIC_CHECK);
- //
- // Enable the slider's based on the state of the check boxes
- //
- ::EnableWindow (::GetDlgItem (m_hWnd, IDC_SOUND_EFFECTS_SLIDER), sound_enabled);
- ::EnableWindow (::GetDlgItem (m_hWnd, IDC_MUSIC_SLIDER), music_enabled);
- ::EnableWindow (::GetDlgItem (m_hWnd, IDC_DIALOG_SLIDER), dialog_enabled);
- ::EnableWindow (::GetDlgItem (m_hWnd, IDC_CINEMATIC_SLIDER), cinematic_enabled);
- return ;
- }
- /////////////////////////////////////////////////////////////////////////////
- //
- // OnCommand
- //
- /////////////////////////////////////////////////////////////////////////////
- BOOL
- AudioConfigDialogClass::OnCommand (WPARAM wParam, LPARAM lParam)
- {
- switch (LOWORD (wParam)) {
- //
- // Update the enabled state of the volume sliders
- //
- case IDC_SOUND_EFFECTS_CHECK:
- case IDC_MUSIC_CHECK:
- case IDC_DIALOG_CHECK:
- case IDC_CINEMATIC_CHECK:
- Update_Slider_Enable_State();
- break;
- }
-
- return CDialog::OnCommand (wParam, lParam);
- }
|