This repository has been archived on 2025-02-27. You can view files and clone it, but cannot push or open issues or pull requests.
CnC_Renegade/Code/Tools/WWConfig/AudioConfigDialog.cpp

518 lines
14 KiB
C++

/*
** 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);
}