From 85393c2ef87c101294229492595dcc32e9a3c92d Mon Sep 17 00:00:00 2001 From: ParantezTech <12572227+par274@users.noreply.github.com> Date: Tue, 13 Oct 2026 18:11:24 +0300 Subject: [PATCH] [GUI] Added cross-platform playback menu music and title music volume control --- src/SharpEmu.GUI/GuiSettings.cs | 5 + src/SharpEmu.GUI/Languages/ar.json | 4 + src/SharpEmu.GUI/Languages/az.json | 4 + src/SharpEmu.GUI/Languages/br.json | 4 + src/SharpEmu.GUI/Languages/de.json | 4 + src/SharpEmu.GUI/Languages/dk.json | 4 + src/SharpEmu.GUI/Languages/ee.json | 4 + src/SharpEmu.GUI/Languages/en.json | 4 + src/SharpEmu.GUI/Languages/es.json | 4 + src/SharpEmu.GUI/Languages/fr.json | 4 + src/SharpEmu.GUI/Languages/hu.json | 4 + src/SharpEmu.GUI/Languages/it.json | 4 + src/SharpEmu.GUI/Languages/ja.json | 4 + src/SharpEmu.GUI/Languages/ko.json | 4 + src/SharpEmu.GUI/Languages/nl.json | 4 + src/SharpEmu.GUI/Languages/pl.json | 4 + src/SharpEmu.GUI/Languages/pt.json | 4 + src/SharpEmu.GUI/Languages/ru.json | 4 + src/SharpEmu.GUI/Languages/tr.json | 4 + src/SharpEmu.GUI/MainWindow.axaml | 30 +++ src/SharpEmu.GUI/MainWindow.axaml.cs | 39 ++++ src/SharpEmu.GUI/SndPreviewPlayer.cs | 212 ++++++++++++------ .../GUI/TitleMusicVolumeTests.cs | 20 ++ 23 files changed, 305 insertions(+), 73 deletions(-) create mode 100644 tests/SharpEmu.Libs.Tests/GUI/TitleMusicVolumeTests.cs diff --git a/src/SharpEmu.GUI/GuiSettings.cs b/src/SharpEmu.GUI/GuiSettings.cs index 1e48bba..709ce22 100644 --- a/src/SharpEmu.GUI/GuiSettings.cs +++ b/src/SharpEmu.GUI/GuiSettings.cs @@ -40,6 +40,8 @@ public sealed class GuiSettings /// Loop the selected game's sce_sys/snd0.at9 preview music. public bool PlayTitleMusic { get; set; } = true; + public double TitleMusicVolume { get; set; } = 1.0; + public string LibraryLayout { get; set; } = "Carousel"; public double EmbeddedConsoleHeight { get; set; } = 240; @@ -148,6 +150,9 @@ public sealed class GuiSettings legacyProfile is { Length: 2 } ? legacyProfile[1] : settings.DefaultProfile); settings.DiscordClientId ??= "1525606762248540221"; settings.LibraryLayout = NormalizeChoice(settings.LibraryLayout, "Carousel", "Grid"); + settings.TitleMusicVolume = double.IsFinite(settings.TitleMusicVolume) + ? Math.Clamp(settings.TitleMusicVolume, 0.0, 1.0) + : 1.0; settings.ConsoleType = NormalizeChoice(settings.ConsoleType, "PS5"); settings.ConsoleLanguage = NormalizeChoice( settings.ConsoleLanguage, diff --git a/src/SharpEmu.GUI/Languages/ar.json b/src/SharpEmu.GUI/Languages/ar.json index 7c7c318..dc48a02 100644 --- a/src/SharpEmu.GUI/Languages/ar.json +++ b/src/SharpEmu.GUI/Languages/ar.json @@ -44,6 +44,10 @@ "Library.Stat.TitleId": "معرّف اللعبة", "Common.Back": "رجوع", + "Library.Music.Volume": "مستوى صوت موسيقى اللعبة", + "Library.Music.Mute": "كتم موسيقى اللعبة", + "Library.Music.Unmute": "إلغاء كتم موسيقى اللعبة", + "Options.General": "عام", "Options.Logging": "التسجيل", "Options.Section.Emulation": "المحاكاة", diff --git a/src/SharpEmu.GUI/Languages/az.json b/src/SharpEmu.GUI/Languages/az.json index 8a418d1..16389c2 100644 --- a/src/SharpEmu.GUI/Languages/az.json +++ b/src/SharpEmu.GUI/Languages/az.json @@ -31,6 +31,10 @@ "Library.Stat.TitleId": "Oyunun ID-si", "Common.Back": "Geri qayıt", + "Library.Music.Volume": "Oyun musiqisinin səs səviyyəsi", + "Library.Music.Mute": "Oyun musiqisini susdur", + "Library.Music.Unmute": "Oyun musiqisinin səsini aç", + "Options.General": "Ümumi", "Options.Logging": "Jurnala yazma", "Options.Env.Tab": "Mühit", diff --git a/src/SharpEmu.GUI/Languages/br.json b/src/SharpEmu.GUI/Languages/br.json index 964ebbf..10df6d6 100644 --- a/src/SharpEmu.GUI/Languages/br.json +++ b/src/SharpEmu.GUI/Languages/br.json @@ -44,6 +44,10 @@ "Library.Stat.TitleId": "ID do título", "Common.Back": "Voltar", + "Library.Music.Volume": "Volume da música do jogo", + "Library.Music.Mute": "Silenciar música do jogo", + "Library.Music.Unmute": "Ativar som da música do jogo", + "Options.General": "Opções Gerais", "Options.Logging": "Logs", "Options.Env.Tab": "Ambiente", diff --git a/src/SharpEmu.GUI/Languages/de.json b/src/SharpEmu.GUI/Languages/de.json index e4b6b76..769587f 100644 --- a/src/SharpEmu.GUI/Languages/de.json +++ b/src/SharpEmu.GUI/Languages/de.json @@ -44,6 +44,10 @@ "Library.Stat.TitleId": "Titel-ID", "Common.Back": "Zurück", + "Library.Music.Volume": "Lautstärke der Spielmusik", + "Library.Music.Mute": "Spielmusik stummschalten", + "Library.Music.Unmute": "Stummschaltung der Spielmusik aufheben", + "Options.General": "Allgemein", "Options.Logging": "Protokollierung", "Options.Section.Emulation": "EMULATION", diff --git a/src/SharpEmu.GUI/Languages/dk.json b/src/SharpEmu.GUI/Languages/dk.json index b10d989..a3e223e 100644 --- a/src/SharpEmu.GUI/Languages/dk.json +++ b/src/SharpEmu.GUI/Languages/dk.json @@ -44,6 +44,10 @@ "Library.Stat.TitleId": "Titel-id", "Common.Back": "Tilbage", + "Library.Music.Volume": "Lydstyrke for spilmusik", + "Library.Music.Mute": "Slå spilmusik fra", + "Library.Music.Unmute": "Slå spilmusik til", + "Options.General": "Generelt", "Options.Logging": "Logging", "Options.Section.Emulation": "EMULERING", diff --git a/src/SharpEmu.GUI/Languages/ee.json b/src/SharpEmu.GUI/Languages/ee.json index c6cef57..c50d4de 100644 --- a/src/SharpEmu.GUI/Languages/ee.json +++ b/src/SharpEmu.GUI/Languages/ee.json @@ -47,6 +47,10 @@ "Library.Stat.TitleId": "Title ID", "Common.Back": "Tagasi", + "Library.Music.Volume": "Mängumuusika helitugevus", + "Library.Music.Mute": "Vaigista mängumuusika", + "Library.Music.Unmute": "Lülita mängumuusika heli sisse", + "Options.General": "Üldine", "Options.Logging": "Logimine", "Options.Env.Tab": "Keskkond", diff --git a/src/SharpEmu.GUI/Languages/en.json b/src/SharpEmu.GUI/Languages/en.json index 3fd4a95..61d2046 100644 --- a/src/SharpEmu.GUI/Languages/en.json +++ b/src/SharpEmu.GUI/Languages/en.json @@ -66,6 +66,10 @@ "Library.Stat.TitleId": "Title ID", "Common.Back": "Back", + "Library.Music.Volume": "Title music volume", + "Library.Music.Mute": "Mute title music", + "Library.Music.Unmute": "Unmute title music", + "Options.General": "General", "Options.Logging": "Logging", "Options.Env.Tab": "Environment", diff --git a/src/SharpEmu.GUI/Languages/es.json b/src/SharpEmu.GUI/Languages/es.json index ed8abdb..9cee02a 100644 --- a/src/SharpEmu.GUI/Languages/es.json +++ b/src/SharpEmu.GUI/Languages/es.json @@ -44,6 +44,10 @@ "Library.Stat.TitleId": "ID del título", "Common.Back": "Volver", + "Library.Music.Volume": "Volumen de la música del juego", + "Library.Music.Mute": "Silenciar la música del juego", + "Library.Music.Unmute": "Activar el sonido de la música del juego", + "Options.General": "General", "Options.Logging": "Logs", "Options.Section.Emulation": "EMULACIÓN", diff --git a/src/SharpEmu.GUI/Languages/fr.json b/src/SharpEmu.GUI/Languages/fr.json index 30c14e6..a1ea94e 100644 --- a/src/SharpEmu.GUI/Languages/fr.json +++ b/src/SharpEmu.GUI/Languages/fr.json @@ -46,6 +46,10 @@ "Library.Stat.TitleId": "ID du titre", "Common.Back": "Retour", + "Library.Music.Volume": "Volume de la musique du jeu", + "Library.Music.Mute": "Couper la musique du jeu", + "Library.Music.Unmute": "Rétablir la musique du jeu", + "Options.General": "Général", "Options.Logging": "Journalisation", "Options.Env.Tab": "Environnement", diff --git a/src/SharpEmu.GUI/Languages/hu.json b/src/SharpEmu.GUI/Languages/hu.json index af24a81..d1ea2d2 100644 --- a/src/SharpEmu.GUI/Languages/hu.json +++ b/src/SharpEmu.GUI/Languages/hu.json @@ -44,6 +44,10 @@ "Library.Stat.TitleId": "Címazonosító", "Common.Back": "Vissza", + "Library.Music.Volume": "Játékzene hangereje", + "Library.Music.Mute": "Játékzene némítása", + "Library.Music.Unmute": "Játékzene visszakapcsolása", + "Options.General": "Általános", "Options.Logging": "Logolás", "Options.Env.Tab": "Környezet", diff --git a/src/SharpEmu.GUI/Languages/it.json b/src/SharpEmu.GUI/Languages/it.json index 97a6885..d5306ba 100644 --- a/src/SharpEmu.GUI/Languages/it.json +++ b/src/SharpEmu.GUI/Languages/it.json @@ -44,6 +44,10 @@ "Library.Stat.TitleId": "ID titolo", "Common.Back": "Indietro", + "Library.Music.Volume": "Volume della musica del gioco", + "Library.Music.Mute": "Disattiva audio della musica del gioco", + "Library.Music.Unmute": "Riattiva audio della musica del gioco", + "Options.General": "Generale", "Options.Logging": "Log", "Options.Section.Emulation": "EMULAZIONE", diff --git a/src/SharpEmu.GUI/Languages/ja.json b/src/SharpEmu.GUI/Languages/ja.json index 697da9d..97b48a6 100644 --- a/src/SharpEmu.GUI/Languages/ja.json +++ b/src/SharpEmu.GUI/Languages/ja.json @@ -44,6 +44,10 @@ "Library.Stat.TitleId": "タイトルID", "Common.Back": "戻る", + "Library.Music.Volume": "ゲーム音楽の音量", + "Library.Music.Mute": "ゲーム音楽をミュート", + "Library.Music.Unmute": "ゲーム音楽のミュートを解除", + "Options.General": "一般", "Options.Logging": "ロギング", "Options.Section.Emulation": "エミュレーション", diff --git a/src/SharpEmu.GUI/Languages/ko.json b/src/SharpEmu.GUI/Languages/ko.json index 443677a..53bfd0a 100644 --- a/src/SharpEmu.GUI/Languages/ko.json +++ b/src/SharpEmu.GUI/Languages/ko.json @@ -44,6 +44,10 @@ "Library.Stat.TitleId": "타이틀 ID", "Common.Back": "뒤로", + "Library.Music.Volume": "게임 음악 볼륨", + "Library.Music.Mute": "게임 음악 음소거", + "Library.Music.Unmute": "게임 음악 음소거 해제", + "Options.General": "일반", "Options.Logging": "로깅", "Options.Section.Emulation": "에뮬레이션", diff --git a/src/SharpEmu.GUI/Languages/nl.json b/src/SharpEmu.GUI/Languages/nl.json index 0c83373..a3a11a4 100644 --- a/src/SharpEmu.GUI/Languages/nl.json +++ b/src/SharpEmu.GUI/Languages/nl.json @@ -44,6 +44,10 @@ "Library.Stat.TitleId": "Titel-ID", "Common.Back": "Terug", + "Library.Music.Volume": "Volume van gamemuziek", + "Library.Music.Mute": "Gamemuziek dempen", + "Library.Music.Unmute": "Dempen van gamemuziek opheffen", + "Options.General": "Algemeen", "Options.Logging": "Logging", "Options.Section.Emulation": "EMULATIE", diff --git a/src/SharpEmu.GUI/Languages/pl.json b/src/SharpEmu.GUI/Languages/pl.json index f15bb64..5e9e58d 100644 --- a/src/SharpEmu.GUI/Languages/pl.json +++ b/src/SharpEmu.GUI/Languages/pl.json @@ -47,6 +47,10 @@ "Library.Stat.TitleId": "Numer seryjny", "Common.Back": "Wstecz", + "Library.Music.Volume": "Głośność muzyki w grze", + "Library.Music.Mute": "Wycisz muzykę z gry", + "Library.Music.Unmute": "Włącz dźwięk muzyki z gry", + "Options.General": "Ogólne", "Options.Logging": "Dziennik zdarzeń", "Options.Env.Tab": "Środowisko", diff --git a/src/SharpEmu.GUI/Languages/pt.json b/src/SharpEmu.GUI/Languages/pt.json index 27f1d15..eefd0a6 100644 --- a/src/SharpEmu.GUI/Languages/pt.json +++ b/src/SharpEmu.GUI/Languages/pt.json @@ -44,6 +44,10 @@ "Library.Stat.TitleId": "ID do título", "Common.Back": "Voltar", + "Library.Music.Volume": "Volume da música do jogo", + "Library.Music.Mute": "Silenciar música do jogo", + "Library.Music.Unmute": "Reativar som da música do jogo", + "Options.General": "Geral", "Options.Logging": "Registos", "Options.Env.Tab": "Ambiente", diff --git a/src/SharpEmu.GUI/Languages/ru.json b/src/SharpEmu.GUI/Languages/ru.json index 7bbd4e8..14766da 100644 --- a/src/SharpEmu.GUI/Languages/ru.json +++ b/src/SharpEmu.GUI/Languages/ru.json @@ -45,6 +45,10 @@ "Library.Stat.TitleId": "ID игры", "Common.Back": "Назад", + "Library.Music.Volume": "Громкость музыки игры", + "Library.Music.Mute": "Выключить музыку игры", + "Library.Music.Unmute": "Включить музыку игры", + "Options.General": "Основные", "Options.Logging": "Логгирование", "Options.Env.Tab": "Окружение", diff --git a/src/SharpEmu.GUI/Languages/tr.json b/src/SharpEmu.GUI/Languages/tr.json index 6135c15..e5d4512 100644 --- a/src/SharpEmu.GUI/Languages/tr.json +++ b/src/SharpEmu.GUI/Languages/tr.json @@ -46,6 +46,10 @@ "Library.Stat.TitleId": "Başlık kimliği", "Common.Back": "Geri", + "Library.Music.Volume": "Oyun müziği ses seviyesi", + "Library.Music.Mute": "Oyun müziğini kapat", + "Library.Music.Unmute": "Oyun müziğini aç", + "Options.General": "Genel", "Options.Logging": "Günlükleme", "Options.Section.Emulation": "EMÜLASYON", diff --git a/src/SharpEmu.GUI/MainWindow.axaml b/src/SharpEmu.GUI/MainWindow.axaml index e9ab69c..9c29630 100644 --- a/src/SharpEmu.GUI/MainWindow.axaml +++ b/src/SharpEmu.GUI/MainWindow.axaml @@ -146,6 +146,36 @@ SPDX-License-Identifier: GPL-2.0-or-later + + + + + + 7 + 7 + 24 + 14 + 14 + 7 + + + +