From ca0bfc39a28d6d2fee085bccf34ce04b1e3c6a54 Mon Sep 17 00:00:00 2001 From: Connor McLaughlin Date: Sat, 3 Oct 2020 12:24:03 +1000 Subject: [PATCH] CDROM: Add a setting and hotkey to mute CD audio --- src/core/cdrom.cpp | 4 ++-- src/core/host_interface.cpp | 1 + src/core/settings.cpp | 2 ++ src/core/settings.h | 1 + src/duckstation-libretro/libretro_host_interface.cpp | 7 ++++++- src/duckstation-qt/audiosettingswidget.cpp | 6 +++++- src/duckstation-qt/audiosettingswidget.ui | 9 ++++++++- src/frontend-common/common_host_interface.cpp | 11 +++++++++++ 8 files changed, 36 insertions(+), 5 deletions(-) diff --git a/src/core/cdrom.cpp b/src/core/cdrom.cpp index ed6fe40e7..2dfc0f751 100644 --- a/src/core/cdrom.cpp +++ b/src/core/cdrom.cpp @@ -2018,7 +2018,7 @@ void CDROM::ProcessXAADPCMSector(const u8* raw_sector, const CDImage::SubChannel CDXA::DecodeADPCMSector(raw_sector, sample_buffer.data(), m_xa_last_samples.data()); // Only send to SPU if we're not muted. - if (m_muted || m_adpcm_muted) + if (m_muted || m_adpcm_muted || g_settings.cdrom_mute_cd_audio) return; g_spu.GeneratePendingSamples(); @@ -2082,7 +2082,7 @@ void CDROM::ProcessCDDASector(const u8* raw_sector, const CDImage::SubChannelQ& } // Apply volume when pushing sectors to SPU. - if (m_muted) + if (m_muted || g_settings.cdrom_mute_cd_audio) return; g_spu.GeneratePendingSamples(); diff --git a/src/core/host_interface.cpp b/src/core/host_interface.cpp index 146a0d38e..a576ae150 100644 --- a/src/core/host_interface.cpp +++ b/src/core/host_interface.cpp @@ -456,6 +456,7 @@ void HostInterface::SetDefaultSettings(SettingsInterface& si) si.SetBoolValue("CDROM", "ReadThread", true); si.SetBoolValue("CDROM", "RegionCheck", true); si.SetBoolValue("CDROM", "LoadImageToRAM", false); + si.SetBoolValue("CDROM", "MuteCDAudio", false); si.SetStringValue("Audio", "Backend", Settings::GetAudioBackendName(Settings::DEFAULT_AUDIO_BACKEND)); si.SetIntValue("Audio", "OutputVolume", 100); diff --git a/src/core/settings.cpp b/src/core/settings.cpp index 9c67ac9cc..54782c2e4 100644 --- a/src/core/settings.cpp +++ b/src/core/settings.cpp @@ -175,6 +175,7 @@ void Settings::Load(SettingsInterface& si) cdrom_read_thread = si.GetBoolValue("CDROM", "ReadThread", true); cdrom_region_check = si.GetBoolValue("CDROM", "RegionCheck", true); cdrom_load_image_to_ram = si.GetBoolValue("CDROM", "LoadImageToRAM", false); + cdrom_mute_cd_audio = si.GetBoolValue("CDROM", "MuteCDAudio", false); audio_backend = ParseAudioBackend(si.GetStringValue("Audio", "Backend", GetAudioBackendName(DEFAULT_AUDIO_BACKEND)).c_str()) @@ -294,6 +295,7 @@ void Settings::Save(SettingsInterface& si) const si.SetBoolValue("CDROM", "ReadThread", cdrom_read_thread); si.SetBoolValue("CDROM", "RegionCheck", cdrom_region_check); si.SetBoolValue("CDROM", "LoadImageToRAM", cdrom_load_image_to_ram); + si.SetBoolValue("CDROM", "MuteCDAudio", cdrom_mute_cd_audio); si.SetStringValue("Audio", "Backend", GetAudioBackendName(audio_backend)); si.SetIntValue("Audio", "OutputVolume", audio_output_volume); diff --git a/src/core/settings.h b/src/core/settings.h index 24471d268..8738ee452 100644 --- a/src/core/settings.h +++ b/src/core/settings.h @@ -122,6 +122,7 @@ struct Settings bool cdrom_read_thread = true; bool cdrom_region_check = true; bool cdrom_load_image_to_ram = false; + bool cdrom_mute_cd_audio = false; AudioBackend audio_backend = AudioBackend::Cubeb; s32 audio_output_volume = 100; diff --git a/src/duckstation-libretro/libretro_host_interface.cpp b/src/duckstation-libretro/libretro_host_interface.cpp index e1b5a5815..0e2cdfcb0 100644 --- a/src/duckstation-libretro/libretro_host_interface.cpp +++ b/src/duckstation-libretro/libretro_host_interface.cpp @@ -445,7 +445,7 @@ void LibretroHostInterface::OnSystemDestroyed() m_using_hardware_renderer = false; } -static std::array s_option_definitions = {{ +static std::array s_option_definitions = {{ {"duckstation_Console.Region", "Console Region", "Determines which region/hardware to emulate. Auto-Detect will use the region of the disc inserted.", @@ -476,6 +476,11 @@ static std::array s_option_definitions = {{ "lock up while the image is preloaded.", {{"true", "Enabled"}, {"false", "Disabled"}}, "false"}, + {"duckstation_CDROM.MuteCDAudio", + "Mute CD Audio", + "Forcibly mutes both CD-DA and XA audio from the CD-ROM. Can be used to disable background music in some games.", + {{"true", "Enabled"}, {"false", "Disabled"}}, + "false"}, {"duckstation_CPU.ExecutionMode", "CPU Execution Mode", "Which mode to use for CPU emulation. Recompiler provides the best performance.", diff --git a/src/duckstation-qt/audiosettingswidget.cpp b/src/duckstation-qt/audiosettingswidget.cpp index 0a1e603c0..68dac77c4 100644 --- a/src/duckstation-qt/audiosettingswidget.cpp +++ b/src/duckstation-qt/audiosettingswidget.cpp @@ -22,6 +22,7 @@ AudioSettingsWidget::AudioSettingsWidget(QtHostInterface* host_interface, QWidge SettingWidgetBinder::BindWidgetToBoolSetting(m_host_interface, m_ui.syncToOutput, "Audio", "Sync"); SettingWidgetBinder::BindWidgetToIntSetting(m_host_interface, m_ui.bufferSize, "Audio", "BufferSize"); SettingWidgetBinder::BindWidgetToBoolSetting(m_host_interface, m_ui.startDumpingOnBoot, "Audio", "DumpOnBoot"); + SettingWidgetBinder::BindWidgetToBoolSetting(m_host_interface, m_ui.muteCDAudio, "CDROM", "MuteCDAudio"); m_ui.volume->setValue(m_host_interface->GetIntSettingValue("Audio", "OutputVolume")); m_ui.muted->setChecked(m_host_interface->GetBoolSettingValue("Audio", "OutputMuted")); @@ -53,8 +54,11 @@ AudioSettingsWidget::AudioSettingsWidget(QtHostInterface* host_interface, QWidge tr("Start dumping audio to file as soon as the emulator is started. Mainly useful as a debug option.")); dialog->registerWidgetHelp(m_ui.volume, tr("Volume"), "100", tr("Controls the volume of the audio played on the host. Values are in percentage.")); - dialog->registerWidgetHelp(m_ui.muted, tr("Mute"), tr("Unchecked"), + dialog->registerWidgetHelp(m_ui.muted, tr("Mute All Sound"), tr("Unchecked"), tr("Prevents the emulator from producing any audible sound.")); + dialog->registerWidgetHelp(m_ui.muteCDAudio, tr("Mute CD Audio"), tr("Unchecked"), + tr("Forcibly mutes both CD-DA and XA audio from the CD-ROM. Can be used to disable " + "background music in some games.")); } AudioSettingsWidget::~AudioSettingsWidget() = default; diff --git a/src/duckstation-qt/audiosettingswidget.ui b/src/duckstation-qt/audiosettingswidget.ui index c3ef0d3b4..8ecc39ec7 100644 --- a/src/duckstation-qt/audiosettingswidget.ui +++ b/src/duckstation-qt/audiosettingswidget.ui @@ -149,7 +149,14 @@ - Mute + Mute All Sound + + + + + + + Mute CD Audio diff --git a/src/frontend-common/common_host_interface.cpp b/src/frontend-common/common_host_interface.cpp index 464ae813d..a4f1a918d 100644 --- a/src/frontend-common/common_host_interface.cpp +++ b/src/frontend-common/common_host_interface.cpp @@ -1549,6 +1549,17 @@ void CommonHostInterface::RegisterAudioHotkeys() AddFormattedOSDMessage(2.0f, TranslateString("OSDMessage", "Volume: %d%%"), g_settings.audio_output_volume); } }); + RegisterHotkey(StaticString(TRANSLATABLE("Hotkeys", "Audio")), StaticString("AudioCDAudioMute"), + StaticString(TRANSLATABLE("Hotkeys", "Toggle CD Audio Mute")), [this](bool pressed) { + if (System::IsValid() && !pressed) + { + g_settings.cdrom_mute_cd_audio = !g_settings.cdrom_mute_cd_audio; + AddOSDMessage(g_settings.cdrom_mute_cd_audio ? + TranslateStdString("OSDMessage", "CD Audio Muted.") : + TranslateStdString("OSDMessage", "CD Audio Unmuted."), + 2.0f); + } + }); RegisterHotkey(StaticString(TRANSLATABLE("Hotkeys", "Audio")), StaticString("AudioVolumeUp"), StaticString(TRANSLATABLE("Hotkeys", "Volume Up")), [this](bool pressed) { if (System::IsValid() && pressed)