/* ** 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 . */ /*********************************************************************************************** *** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S *** *********************************************************************************************** * * * Project Name : commando * * * * $Archive:: /Commando/Code/Commando/dlgconfigaudiotab.cpp $* * * * Author:: Patrick Smith * * * * $Modtime:: 1/25/02 7:12p $* * * * $Revision:: 11 $* * * *---------------------------------------------------------------------------------------------* * Functions: * * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ #include "dlgconfigaudiotab.h" #include "resource.h" #include "sliderctrl.h" #include "wwaudio.h" #include "comboboxctrl.h" #include "listctrl.h" #include "_globals.h" #include "string_ids.h" #include "translatedb.h" #include "audiblesound.h" #include "dialogmgr.h" //////////////////////////////////////////////////////////////// // // DlgConfigAudioTabClass // //////////////////////////////////////////////////////////////// DlgConfigAudioTabClass::DlgConfigAudioTabClass (void) : InitialDeviceIndex (0), InitialIsStereo (true), InitialHertz (44100), InitialBits (16), SoundVolumeTestSound (NULL), MusicVolumeTestSound (NULL), DialogVolumeTestSound (NULL), CinematicVolumeTestSound (NULL), SoundVolumeTestSoundStartTime (0), MusicVolumeTestSoundStartTime (0), DialogVolumeTestSoundStartTime (0), CinematicVolumeTestSoundStartTime (0), ChildDialogClass (IDD_CONFIG_AUDIO) { SoundVolumeTestSound = WWAudioClass::Get_Instance ()->Create_Sound_Effect ("laser_rifle_fire_01.wav"); if (SoundVolumeTestSound != NULL) { SoundVolumeTestSound->Set_Loop_Count (0); SoundVolumeTestSound->Set_Type (AudibleSoundClass::TYPE_SOUND_EFFECT); } MusicVolumeTestSound = WWAudioClass::Get_Instance ()->Create_Sound_Effect ("sakura battle theme.mp3"); if (MusicVolumeTestSound != NULL) { MusicVolumeTestSound->Set_Type (AudibleSoundClass::TYPE_MUSIC); } DialogVolumeTestSound = WWAudioClass::Get_Instance ()->Create_Sound_Effect ("m00s1_s1s1gbmg_snd.wav"); if (DialogVolumeTestSound != NULL) { DialogVolumeTestSound->Set_Loop_Count (0); DialogVolumeTestSound->Set_Type (AudibleSoundClass::TYPE_DIALOG); } CinematicVolumeTestSound = WWAudioClass::Get_Instance ()->Create_Sound_Effect ("00-n000e.wav"); if (CinematicVolumeTestSound != NULL) { CinematicVolumeTestSound->Set_Loop_Count (0); CinematicVolumeTestSound->Set_Type (AudibleSoundClass::TYPE_CINEMATIC); } return ; } //////////////////////////////////////////////////////////////// // // ~DlgConfigAudioTabClass // //////////////////////////////////////////////////////////////// DlgConfigAudioTabClass::~DlgConfigAudioTabClass (void) { if (SoundVolumeTestSound != NULL) { SoundVolumeTestSound->Stop (); REF_PTR_RELEASE (SoundVolumeTestSound); } if (MusicVolumeTestSound != NULL) { MusicVolumeTestSound->Stop (); REF_PTR_RELEASE (MusicVolumeTestSound); } if (DialogVolumeTestSound != NULL) { DialogVolumeTestSound->Stop (); REF_PTR_RELEASE (DialogVolumeTestSound); } if (CinematicVolumeTestSound != NULL) { CinematicVolumeTestSound->Stop (); REF_PTR_RELEASE (CinematicVolumeTestSound); } return ; } //////////////////////////////////////////////////////////////// // // On_Init_Dialog // //////////////////////////////////////////////////////////////// void DlgConfigAudioTabClass::On_Init_Dialog (void) { ChildDialogClass::On_Init_Dialog (); // // Read the audio library's settings from the registry // bool is_stereo = WWAudioClass::Get_Instance ()->Get_Playback_Stereo (); float sound_vol = WWAudioClass::Get_Instance ()->Get_Sound_Effects_Volume (); float music_vol = WWAudioClass::Get_Instance ()->Get_Music_Volume (); float dialog_vol = WWAudioClass::Get_Instance ()->Get_Dialog_Volume (); float cinematic_vol = WWAudioClass::Get_Instance ()->Get_Cinematic_Volume (); bool sound_on = WWAudioClass::Get_Instance ()->Are_Sound_Effects_On (); bool music_on = WWAudioClass::Get_Instance ()->Is_Music_On (); bool dialog_on = WWAudioClass::Get_Instance ()->Is_Dialog_On (); bool cinematic_on = WWAudioClass::Get_Instance ()->Is_Cinematic_Sound_On (); SliderCtrlClass *snd_vol_slider = (SliderCtrlClass *)Get_Dlg_Item (IDC_SOUND_EFFECTS_SLIDER); SliderCtrlClass *mus_vol_slider = (SliderCtrlClass *)Get_Dlg_Item (IDC_MUSIC_SLIDER); SliderCtrlClass *dia_vol_slider = (SliderCtrlClass *)Get_Dlg_Item (IDC_DIALOG_SLIDER); SliderCtrlClass *cin_vol_slider = (SliderCtrlClass *)Get_Dlg_Item (IDC_CINEMATIC_SLIDER); // // Setup the sound volume controls // Check_Dlg_Button (IDC_SOUND_EFFECTS_CHECK, sound_on); if (snd_vol_slider != NULL) { snd_vol_slider->Set_Range (0, 100); snd_vol_slider->Set_Pos (static_cast(sound_vol * 100), false); } // // Setup the music volume controls // Check_Dlg_Button (IDC_MUSIC_CHECK, music_on); if (mus_vol_slider != NULL) { mus_vol_slider->Set_Range (0, 100); mus_vol_slider->Set_Pos (static_cast(music_vol * 100), false); } // // Setup the dialog volume controls // Check_Dlg_Button (IDC_DIALOG_CHECK, dialog_on); if (dia_vol_slider != NULL) { dia_vol_slider->Set_Range (0, 100); dia_vol_slider->Set_Pos (static_cast(dialog_vol * 100), false); } // // Setup the dialog volume controls // Check_Dlg_Button (IDC_CINEMATIC_CHECK, cinematic_on); if (cin_vol_slider != NULL) { cin_vol_slider->Set_Range (0, 100); cin_vol_slider->Set_Pos (static_cast(cinematic_vol * 100), false); } // // Check the stereo box if necessary // Check_Dlg_Button (IDC_STEREO_CHECK, is_stereo); InitialIsStereo = is_stereo; // // Configure the comboboxes and list control // Configure_Quality_Combobox (); Configure_Rate_Combobox (); Configure_Speaker_Combobox (); Configure_Driver_List (); // // Update the enabled state of the volume sliders // Update_Slider_Enable_State (); return ; } ///////////////////////////////////////////////////////////////////////////// // // Update_Slider_Enable_State // ///////////////////////////////////////////////////////////////////////////// void DlgConfigAudioTabClass::Update_Slider_Enable_State (void) { bool sound_enabled = Is_Dlg_Button_Checked (IDC_SOUND_EFFECTS_CHECK); bool music_enabled = Is_Dlg_Button_Checked (IDC_MUSIC_CHECK); bool dialog_enabled = Is_Dlg_Button_Checked (IDC_DIALOG_CHECK); bool cinematic_enabled = Is_Dlg_Button_Checked (IDC_CINEMATIC_CHECK); // // Enable the slider's based on the state of the check boxes // Enable_Dlg_Item (IDC_SOUND_EFFECTS_SLIDER, sound_enabled); Enable_Dlg_Item (IDC_MUSIC_SLIDER, music_enabled); Enable_Dlg_Item (IDC_DIALOG_SLIDER, dialog_enabled); Enable_Dlg_Item (IDC_CINEMATIC_SLIDER, cinematic_enabled); // // Update the audio itself // WWAudioClass::Get_Instance ()->Allow_Sound_Effects (sound_enabled); WWAudioClass::Get_Instance ()->Allow_Music (music_enabled); WWAudioClass::Get_Instance ()->Allow_Dialog (dialog_enabled); WWAudioClass::Get_Instance ()->Allow_Cinematic_Sound (cinematic_enabled); return ; } ////////////////////////////////////////////////////////////////////// // // Configure_Rate_Combobox // ////////////////////////////////////////////////////////////////////// void DlgConfigAudioTabClass::Configure_Rate_Combobox (void) { ComboBoxCtrlClass *combo_box = (ComboBoxCtrlClass *)Get_Dlg_Item (IDC_RATE_COMBO); if (combo_box == NULL) { return ; } // // Add an entry for each locale to the combobox // combo_box->Add_String (TRANSLATE (IDS_SND_RATE_11)); combo_box->Add_String (TRANSLATE (IDS_SND_RATE_22)); combo_box->Add_String (TRANSLATE (IDS_SND_RATE_44)); InitialHertz = WWAudioClass::Get_Instance ()->Get_Playback_Rate (); switch (InitialHertz) { case 11025: combo_box->Set_Curr_Sel (0); break; case 22050: combo_box->Set_Curr_Sel (1); break; default: case 44100: combo_box->Set_Curr_Sel (2); break; } return ; } ////////////////////////////////////////////////////////////////////// // // Configure_Speaker_Combobox // ////////////////////////////////////////////////////////////////////// void DlgConfigAudioTabClass::Configure_Speaker_Combobox (void) { ComboBoxCtrlClass *combo_box = (ComboBoxCtrlClass *)Get_Dlg_Item (IDC_SPEAKER_SETUP_COMBO); if (combo_box == NULL) { return ; } // // Add an entry for each speaker type to the combobox // combo_box->Add_String (TRANSLATE (IDS_MENU_SPEAKER_2)); combo_box->Add_String (TRANSLATE (IDS_MENU_SPEAKER_HEADPHONE)); combo_box->Add_String (TRANSLATE (IDS_MENU_SPEAKER_SURROUND)); combo_box->Add_String (TRANSLATE (IDS_MENU_SPEAKER_4)); // // Select the current setting // int type = WWAudioClass::Get_Instance ()->Get_Speaker_Type (); switch (type) { default: case AIL_3D_2_SPEAKER: combo_box->Set_Curr_Sel (0); break; case AIL_3D_HEADPHONE: combo_box->Set_Curr_Sel (1); break; case AIL_3D_SURROUND: combo_box->Set_Curr_Sel (2); break; case AIL_3D_4_SPEAKER: combo_box->Set_Curr_Sel (3); break; } return ; } ////////////////////////////////////////////////////////////////////// // // Configure_Quality_Combobox // ////////////////////////////////////////////////////////////////////// void DlgConfigAudioTabClass::Configure_Quality_Combobox (void) { ComboBoxCtrlClass *combo_box = (ComboBoxCtrlClass *)Get_Dlg_Item (IDC_QUALITY_COMBO); if (combo_box == NULL) { return ; } // // Add an entry for each locale to the combobox // combo_box->Add_String (TRANSLATE (IDS_SND_8_BIT)); combo_box->Add_String (TRANSLATE (IDS_SND_16_BIT)); InitialBits = WWAudioClass::Get_Instance ()->Get_Playback_Bits (); // // Select the appropriate quality combobox entry // switch (InitialBits) { case 8: combo_box->Set_Curr_Sel (0); break; default: case 16: combo_box->Set_Curr_Sel (1); break; } return ; } ////////////////////////////////////////////////////////////////////// // // On_Command // ////////////////////////////////////////////////////////////////////// void DlgConfigAudioTabClass::On_Command (int ctrl_id, int message_id, DWORD param) { switch (ctrl_id) { case IDC_SOUND_EFFECTS_CHECK: case IDC_MUSIC_CHECK: case IDC_DIALOG_CHECK: case IDC_CINEMATIC_CHECK: Update_Slider_Enable_State (); break; case IDC_DEFAULTS_BUTTON: Set_Default_Volumes (); break; } ChildDialogClass::On_Command (ctrl_id, message_id, param); return ; } ////////////////////////////////////////////////////////////////////// // // Configure_Driver_List // ////////////////////////////////////////////////////////////////////// void DlgConfigAudioTabClass::Configure_Driver_List (void) { ListCtrlClass *list_ctrl = (ListCtrlClass *)Get_Dlg_Item (IDC_DRIVER_LIST); if (list_ctrl == NULL) { return ; } // // Get the name of the current 3D driver // StringClass device_name = WWAudioClass::Get_Instance ()->Get_3D_Driver_Name (); // // Configure the column // list_ctrl->Add_Column (TRANSLATE (IDS_SND_DRIVER_COL), 1.0F, Vector3 (1, 1, 1)); // // 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)) { WideStringClass wide_driver_name; wide_driver_name.Convert_From (driver_info->name); // // Add an entry to the list for this driver // int item_index = list_ctrl->Insert_Entry (index, wide_driver_name); if (item_index >= 0) { list_ctrl->Set_Entry_Data (item_index, 0, (DWORD)driver_info->driver); // // Select this entry if its the default // if (::lstrcmpi (device_name, driver_info->name) == 0) { list_ctrl->Set_Curr_Sel (item_index); selected_default = true; } } } } // // Select the first entry by default (if necessary) // if (selected_default == false) { list_ctrl->Set_Curr_Sel (0); } // // Record the initial device index so we don't have // to recreate the device if its not necessary // InitialDeviceIndex = list_ctrl->Get_Curr_Sel (); return ; } ///////////////////////////////////////////////////////////////////////////// // // On_Apply // ///////////////////////////////////////////////////////////////////////////// bool DlgConfigAudioTabClass::On_Apply (void) { StringClass device_name; int hertz = 44100; int bits = 16; int speaker_type = 0; bool is_stereo = true; float sound_vol = 1.0F; float music_vol = 1.0F; float dialog_vol = 1.0F; float cinematic_vol = 1.0F; bool sound_on = true; bool music_on = true; bool dialog_on = true; bool cinematic_on = true; SliderCtrlClass *snd_vol_slider = (SliderCtrlClass *)Get_Dlg_Item (IDC_SOUND_EFFECTS_SLIDER); SliderCtrlClass *mus_vol_slider = (SliderCtrlClass *)Get_Dlg_Item (IDC_MUSIC_SLIDER); SliderCtrlClass *dia_vol_slider = (SliderCtrlClass *)Get_Dlg_Item (IDC_DIALOG_SLIDER); SliderCtrlClass *cin_vol_slider = (SliderCtrlClass *)Get_Dlg_Item (IDC_CINEMATIC_SLIDER); // // Get the volume settings // sound_vol = snd_vol_slider->Get_Pos () / 100.0F; music_vol = mus_vol_slider->Get_Pos () / 100.0F; dialog_vol = dia_vol_slider->Get_Pos () / 100.0F; cinematic_vol = cin_vol_slider->Get_Pos () / 100.0F; // // Setup the music volume controls // sound_on = Is_Dlg_Button_Checked (IDC_SOUND_EFFECTS_CHECK); music_on = Is_Dlg_Button_Checked (IDC_MUSIC_CHECK); dialog_on = Is_Dlg_Button_Checked (IDC_DIALOG_CHECK); cinematic_on = Is_Dlg_Button_Checked (IDC_CINEMATIC_CHECK); // // Get the name of the selected device // ListCtrlClass *list_ctrl = (ListCtrlClass *)Get_Dlg_Item (IDC_DRIVER_LIST); int device_index = list_ctrl->Get_Curr_Sel (); if (device_index >= 0) { WideStringClass wide_device_name = list_ctrl->Get_Entry_Text (device_index, 0); wide_device_name.Convert_To (device_name); } // // Get the stereo flag from the dialog // is_stereo = Is_Dlg_Button_Checked (IDC_STEREO_CHECK); // // Get the playback bit rate from the dialog // ComboBoxCtrlClass *combo_box = (ComboBoxCtrlClass *)Get_Dlg_Item (IDC_QUALITY_COMBO); int quality_cursel = combo_box->Get_Curr_Sel (); if (quality_cursel == 0) { bits = 8; } else if (quality_cursel == 1) { bits = 16; } // // Get the playback rate from the controls // combo_box = (ComboBoxCtrlClass *)Get_Dlg_Item (IDC_RATE_COMBO); int rate_cursel = combo_box->Get_Curr_Sel (); if (rate_cursel == 0) { hertz = 11025; } else if (rate_cursel == 1) { hertz = 22050; } else if (rate_cursel == 2) { hertz = 44100; } // // Get the playback rate from the controls // combo_box = (ComboBoxCtrlClass *)Get_Dlg_Item (IDC_SPEAKER_SETUP_COMBO); speaker_type = combo_box->Get_Curr_Sel (); // // Store these settings in the registry // WWAudioClass::Get_Instance ()->Save_To_Registry (APPLICATION_SUB_KEY_NAME_SOUND, device_name, is_stereo, bits, hertz, sound_on, music_on, dialog_on, cinematic_on, sound_vol, music_vol, dialog_vol, cinematic_vol, speaker_type); // // Don't change drivers unless necessary // if (InitialBits != bits || InitialHertz != hertz || InitialDeviceIndex != device_index || is_stereo != InitialIsStereo) { WWAudioClass::Get_Instance ()->Open_2D_Device (is_stereo, bits, hertz); WWAudioClass::Get_Instance ()->Select_3D_Device (device_name); } // // Apply the simple changes // WWAudioClass::Get_Instance ()->Set_Sound_Effects_Volume (sound_vol); WWAudioClass::Get_Instance ()->Set_Music_Volume (music_vol); WWAudioClass::Get_Instance ()->Set_Dialog_Volume (dialog_vol); WWAudioClass::Get_Instance ()->Set_Cinematic_Volume (cinematic_vol); WWAudioClass::Get_Instance ()->Allow_Sound_Effects (sound_on); WWAudioClass::Get_Instance ()->Allow_Music (music_on); WWAudioClass::Get_Instance ()->Allow_Dialog (dialog_on); WWAudioClass::Get_Instance ()->Allow_Cinematic_Sound (cinematic_on); WWAudioClass::Get_Instance ()->Set_Speaker_Type (speaker_type); return true; } ///////////////////////////////////////////////////////////////////////////// // // On_SliderCtrl_Pos_Changed // ///////////////////////////////////////////////////////////////////////////// void DlgConfigAudioTabClass::On_SliderCtrl_Pos_Changed ( SliderCtrlClass * slider_ctrl, int ctrl_id, int new_pos ) { if (ctrl_id == IDC_SOUND_EFFECTS_SLIDER) { // // Update the sound effects volume... // float sound_vol = slider_ctrl->Get_Pos () / 100.0F; WWAudioClass::Get_Instance ()->Set_Sound_Effects_Volume (sound_vol); // // Start the sound effect sound playing // if ( SoundVolumeTestSound != NULL && (SoundVolumeTestSound->Is_Playing () == false || ((DialogMgrClass::Get_Time () - SoundVolumeTestSoundStartTime) > 150))) { SoundVolumeTestSound->Stop (); SoundVolumeTestSound->Set_Loop_Count (0); SoundVolumeTestSound->Play (); // // Record a time stamp for this sound... // SoundVolumeTestSoundStartTime = DialogMgrClass::Get_Time (); } } else if (ctrl_id == IDC_MUSIC_SLIDER) { // // Update the music volume... // float music_vol = slider_ctrl->Get_Pos () / 100.0F; WWAudioClass::Get_Instance ()->Set_Music_Volume (music_vol); // // Start the music sound playing // if (MusicVolumeTestSound != NULL && MusicVolumeTestSound->Is_Playing () == false) { MusicVolumeTestSound->Play (); } // // Record a time stamp for this sound... // MusicVolumeTestSoundStartTime = DialogMgrClass::Get_Time (); } else if (ctrl_id == IDC_DIALOG_SLIDER) { // // Update the dialog volume... // float dialog_vol = slider_ctrl->Get_Pos () / 100.0F; WWAudioClass::Get_Instance ()->Set_Dialog_Volume (dialog_vol); // // Start the dialog effect sound playing // if (DialogVolumeTestSound != NULL) { DialogVolumeTestSound->Set_Loop_Count (0); DialogVolumeTestSound->Play (); // // Record a time stamp for this sound... // DialogVolumeTestSoundStartTime = DialogMgrClass::Get_Time (); } } else if (ctrl_id == IDC_CINEMATIC_SLIDER) { // // Update the dialog volume... // float cinematic_vol = slider_ctrl->Get_Pos () / 100.0F; WWAudioClass::Get_Instance ()->Set_Cinematic_Volume (cinematic_vol); // // Start the dialog effect sound playing // if (CinematicVolumeTestSound != NULL) { CinematicVolumeTestSound->Set_Loop_Count (0); CinematicVolumeTestSound->Play (); // // Record a time stamp for this sound... // CinematicVolumeTestSoundStartTime = DialogMgrClass::Get_Time (); } } return ; } ///////////////////////////////////////////////////////////////////////////// // // On_Frame_Update // ///////////////////////////////////////////////////////////////////////////// void DlgConfigAudioTabClass::On_Frame_Update (void) { int curr_time = DialogMgrClass::Get_Time (); // // Stop the sound volume test sound if necessary // if (SoundVolumeTestSound != NULL && (curr_time - SoundVolumeTestSoundStartTime) > 500) { SoundVolumeTestSound->Set_Loop_Count (1); } // // Stop the sound volume test sound if necessary // if (MusicVolumeTestSound != NULL && (curr_time - MusicVolumeTestSoundStartTime) > 2000) { MusicVolumeTestSound->Stop (); } // // Stop the dialog test sound if necessary // if (DialogVolumeTestSound != NULL && (curr_time - DialogVolumeTestSoundStartTime) > 2000) { DialogVolumeTestSound->Set_Loop_Count (1); } // // Stop the cinematic test sound if necessary // if (CinematicVolumeTestSound != NULL && (curr_time - CinematicVolumeTestSoundStartTime) > 2000) { CinematicVolumeTestSound->Set_Loop_Count (1); } ChildDialogClass::On_Frame_Update (); return ; } ///////////////////////////////////////////////////////////////////////////// // // Set_Default_Volumes // ///////////////////////////////////////////////////////////////////////////// void DlgConfigAudioTabClass::Set_Default_Volumes (void) { int defaultmusicvolume, defaultsoundvolume, defaultdialogvolume, defaultcinematicvolume; SliderCtrlClass *snd_vol_slider = (SliderCtrlClass *)Get_Dlg_Item (IDC_SOUND_EFFECTS_SLIDER); SliderCtrlClass *mus_vol_slider = (SliderCtrlClass *)Get_Dlg_Item (IDC_MUSIC_SLIDER); SliderCtrlClass *dia_vol_slider = (SliderCtrlClass *)Get_Dlg_Item (IDC_DIALOG_SLIDER); SliderCtrlClass *cin_vol_slider = (SliderCtrlClass *)Get_Dlg_Item (IDC_CINEMATIC_SLIDER); // IML: Get the default settings from the audio system. WWAudioClass::Get_Instance()->Load_Default_Volume (defaultmusicvolume, defaultsoundvolume, defaultdialogvolume, defaultcinematicvolume); snd_vol_slider->Set_Pos (defaultsoundvolume); mus_vol_slider->Set_Pos (defaultmusicvolume); dia_vol_slider->Set_Pos (defaultdialogvolume); cin_vol_slider->Set_Pos (defaultcinematicvolume); return ; }