From 96a2ccc3a5a223ca664ffef10af84aebb9971a04 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Fri, 5 Feb 2021 01:32:00 +0800 Subject: [PATCH] [Mobile] Sound/Music Adjustment --- .../src/main/java/forge/sound/AudioClip.java | 2 +- .../src/main/java/forge/sound/AudioMusic.java | 5 ++ forge-gui-mobile/src/forge/Forge.java | 5 ++ .../src/forge/animation/AbilityEffect.java | 3 +- .../forge/screens/settings/SettingsPage.java | 64 +++++++++++++++---- .../src/forge/sound/AudioClip.java | 4 +- .../src/forge/sound/AudioMusic.java | 5 ++ forge-gui/res/languages/de-DE.properties | 4 ++ forge-gui/res/languages/en-US.properties | 4 ++ forge-gui/res/languages/es-ES.properties | 4 ++ forge-gui/res/languages/it-IT.properties | 4 ++ forge-gui/res/languages/zh-CN.properties | 4 ++ .../forge/properties/ForgePreferences.java | 2 + .../src/main/java/forge/sound/IAudioClip.java | 2 +- .../main/java/forge/sound/IAudioMusic.java | 1 + .../main/java/forge/sound/NoSoundClip.java | 2 +- .../main/java/forge/sound/SoundSystem.java | 34 ++++++++-- 17 files changed, 123 insertions(+), 26 deletions(-) diff --git a/forge-gui-desktop/src/main/java/forge/sound/AudioClip.java b/forge-gui-desktop/src/main/java/forge/sound/AudioClip.java index 7189f318ce7..67cfa46557a 100644 --- a/forge-gui-desktop/src/main/java/forge/sound/AudioClip.java +++ b/forge-gui-desktop/src/main/java/forge/sound/AudioClip.java @@ -58,7 +58,7 @@ public class AudioClip implements IAudioClip { } @Override - public final void play() { + public final void play(float value) { if (clips.stream().anyMatch(ClipWrapper::isRunning)) { // introduce small delay to make a batch sounds more granular, // e.g. when you auto-tap 4 lands the 4 tap sounds should diff --git a/forge-gui-desktop/src/main/java/forge/sound/AudioMusic.java b/forge-gui-desktop/src/main/java/forge/sound/AudioMusic.java index f0aaf49207e..dad5eb58623 100644 --- a/forge-gui-desktop/src/main/java/forge/sound/AudioMusic.java +++ b/forge-gui-desktop/src/main/java/forge/sound/AudioMusic.java @@ -114,4 +114,9 @@ public class AudioMusic implements IAudioMusic { close(); canResume = false; } + + @Override + public void setVolume(float value) { + //todo + } } diff --git a/forge-gui-mobile/src/forge/Forge.java b/forge-gui-mobile/src/forge/Forge.java index 4a7e9321ff7..a623ea7aec4 100644 --- a/forge-gui-mobile/src/forge/Forge.java +++ b/forge-gui-mobile/src/forge/Forge.java @@ -78,6 +78,8 @@ public class Forge implements ApplicationListener { public static int androidVersion = 0; public static boolean autoCache = false; public static int lastButtonIndex = 0; + public static float clipVol = 1f; + public static float musicVol = 1f; public static ApplicationListener getApp(Clipboard clipboard0, IDeviceAdapter deviceAdapter0, String assetDir0, boolean value, boolean androidOrientation, int totalRAM, boolean isTablet, int AndroidAPI, String AndroidRelease, String deviceName) { if (GuiBase.getInterface() == null) { @@ -118,6 +120,9 @@ public class Forge implements ApplicationListener { destroyThis = true; //Prevent back() ForgePreferences prefs = new ForgePreferences(); + clipVol = prefs.getPrefInt(FPref.UI_VOL_SOUNDS)/100f; + musicVol = prefs.getPrefInt(FPref.UI_VOL_SOUNDS)/100f; + String skinName; if (FileUtil.doesFileExist(ForgeConstants.MAIN_PREFS_FILE)) { skinName = prefs.getPref(FPref.UI_SKIN); diff --git a/forge-gui-mobile/src/forge/animation/AbilityEffect.java b/forge-gui-mobile/src/forge/animation/AbilityEffect.java index 755aa68d16a..c2a5a61ec17 100644 --- a/forge-gui-mobile/src/forge/animation/AbilityEffect.java +++ b/forge-gui-mobile/src/forge/animation/AbilityEffect.java @@ -1,5 +1,6 @@ package forge.animation; +import forge.Forge; import forge.Graphics; import forge.properties.ForgeConstants; import forge.sound.AudioClip; @@ -23,7 +24,7 @@ public enum AbilityEffect { if (soundClip == null) { soundClip = AudioClip.createClip(ForgeConstants.EFFECTS_DIR + wav); } - soundClip.play(); + soundClip.play(Forge.clipVol); animation.start(); } diff --git a/forge-gui-mobile/src/forge/screens/settings/SettingsPage.java b/forge-gui-mobile/src/forge/screens/settings/SettingsPage.java index f2f0f34708e..485d99e4fb5 100644 --- a/forge-gui-mobile/src/forge/screens/settings/SettingsPage.java +++ b/forge-gui-mobile/src/forge/screens/settings/SettingsPage.java @@ -438,20 +438,58 @@ public class SettingsPage extends TabPage { localizer.getMessage("nlVibrateAfterLongPress")), 6); //Sound Options - lstSettings.addItem(new BooleanSetting(FPref.UI_ENABLE_SOUNDS, - localizer.getMessage("cbEnableSounds"), - localizer.getMessage("nlEnableSounds")), - 7); - lstSettings.addItem(new BooleanSetting(FPref.UI_ENABLE_MUSIC, - localizer.getMessage("cbEnableMusic"), - localizer.getMessage("nlEnableMusic")) { - @Override - public void select() { - super.select(); - //update background music when this setting changes - SoundSystem.instance.changeBackgroundTrack(); + if(GuiBase.getInterface().isLibgdxPort()) { + lstSettings.addItem(new CustomSelectSetting(FPref.UI_VOL_SOUNDS, + localizer.getMessage("cbAdjustSoundsVolume"), + localizer.getMessage("nlAdjustSoundsVolume"), + new String[]{"0", "25", "50", "75", "100"}) { + @Override + public void valueChanged(String newValue) { + super.valueChanged(newValue); + try { + int val = Integer.parseInt(newValue); + Forge.clipVol = val/100f; } - },7); + catch (Exception e) { + Forge.clipVol = 1f; + } + } + }, 7); + lstSettings.addItem(new CustomSelectSetting(FPref.UI_VOL_MUSIC, + localizer.getMessage("cbAdjustMusicVolume"), + localizer.getMessage("nlAdjustMusicVolume"), + new String[]{"0", "25", "50", "75", "100"}) { + @Override + public void valueChanged(String newValue) { + super.valueChanged(newValue); + try { + int val = Integer.parseInt(newValue); + Forge.musicVol = val/100f; + } + catch (Exception e) { + Forge.musicVol = 1f; + } + //update background music when this setting changes + SoundSystem.instance.changeBackgroundTrack(); + SoundSystem.instance.adjustVolume(Forge.musicVol); + } + }, 7); + } else { + lstSettings.addItem(new BooleanSetting(FPref.UI_ENABLE_SOUNDS, + localizer.getMessage("cbEnableSounds"), + localizer.getMessage("nlEnableSounds")), + 7); + lstSettings.addItem(new BooleanSetting(FPref.UI_ENABLE_MUSIC, + localizer.getMessage("cbEnableMusic"), + localizer.getMessage("nlEnableMusic")) { + @Override + public void select() { + super.select(); + //update background music when this setting changes + SoundSystem.instance.changeBackgroundTrack(); + } + },7); + } /*lstSettings.addItem(new BooleanSetting(FPref.UI_ALT_SOUND_SYSTEM, "Use Alternate Sound System", "Use the alternate sound system (only use if you have issues with sound not playing or disappearing)."), diff --git a/forge-gui-mobile/src/forge/sound/AudioClip.java b/forge-gui-mobile/src/forge/sound/AudioClip.java index 792125836d5..17effa6048e 100644 --- a/forge-gui-mobile/src/forge/sound/AudioClip.java +++ b/forge-gui-mobile/src/forge/sound/AudioClip.java @@ -40,7 +40,7 @@ public class AudioClip implements IAudioClip { } } - public final void play() { + public final void play(float value) { if (clip == null) { return; } @@ -50,7 +50,7 @@ public class AudioClip implements IAudioClip { catch (InterruptedException ex) { ex.printStackTrace(); } - clip.play(); + clip.play(value); } public final void loop() { diff --git a/forge-gui-mobile/src/forge/sound/AudioMusic.java b/forge-gui-mobile/src/forge/sound/AudioMusic.java index cef9ebd158a..4bb5e3ea87a 100644 --- a/forge-gui-mobile/src/forge/sound/AudioMusic.java +++ b/forge-gui-mobile/src/forge/sound/AudioMusic.java @@ -40,4 +40,9 @@ public class AudioMusic implements IAudioMusic { stop(); music.dispose(); } + + @Override + public void setVolume(float value) { + music.setVolume(value); + } } diff --git a/forge-gui/res/languages/de-DE.properties b/forge-gui/res/languages/de-DE.properties index caf87fbeda6..1a23093fda3 100644 --- a/forge-gui/res/languages/de-DE.properties +++ b/forge-gui/res/languages/de-DE.properties @@ -84,6 +84,8 @@ cbRandomFoil=zufällige Foil-Karten cbRandomArtInPools=zufällige Kartenbilder in erzeugten Kartensammlungen cbEnableSounds=Ton aktiviert cbEnableMusic=Musik aktiviert +cbAdjustSoundsVolume=Adjust Sound Volume +cbAdjustMusicVolume=Adjust Music Volume cbAltSoundSystem=Nutze alternatives Sound-System cbSROptimize=Optimiere Interface für Screenreader cbUiForTouchScreen=Verbessere Oberfläche für Touchscreens @@ -182,6 +184,8 @@ nlDisplayCurrentCardColors=Zeigt eine Übersicht der aktuellen Farbe der Karten SoundOptions=Sound-Optionen nlEnableSounds=Geräusche während des Spiels nlEnableMusic=Hintergrundmusik während des Spiels +nlAdjustSoundsVolume=Adjust sound effects volume during the game +nlAdjustMusicVolume=Adjust background music during the game nlAltSoundSystem=Nutze alternatives Sound-System (nur nutzen, wenn es Probleme mit fehlenden Geräuschen gibt) nlSrOptimize=Setze verschiedene Optionen, um Forge besser für Screenreader lesbar zu machen KeyboardShortcuts=Tastenkombinationen diff --git a/forge-gui/res/languages/en-US.properties b/forge-gui/res/languages/en-US.properties index 65eb3df4339..92814be2cf8 100644 --- a/forge-gui/res/languages/en-US.properties +++ b/forge-gui/res/languages/en-US.properties @@ -84,6 +84,8 @@ cbRandomFoil=Random Foil cbRandomArtInPools=Randomize Card Art in Generated Card Pools cbEnableSounds=Enable Sounds cbEnableMusic=Enable Music +cbAdjustSoundsVolume=Adjust Sound Volume +cbAdjustMusicVolume=Adjust Music Volume cbAltSoundSystem=Use Alternate Sound System cbSROptimize=Optimize UI for screen readers cbUiForTouchScreen=Enhance UI for Touchscreens @@ -182,6 +184,8 @@ nlDisplayCurrentCardColors=Displays the breakdown of the current color of cards SoundOptions=Sound Options nlEnableSounds=Enable sound effects during the game nlEnableMusic=Enable background music during the game +nlAdjustSoundsVolume=Adjust sound effects volume during the game +nlAdjustMusicVolume=Adjust background music during the game nlAltSoundSystem=Use the alternate sound system (only use if you have issues with sound not playing or disappearing) nlSrOptimize=Set various options to make FOrge work better with screen readers KeyboardShortcuts=Keyboard Shortcuts diff --git a/forge-gui/res/languages/es-ES.properties b/forge-gui/res/languages/es-ES.properties index cdc267ab054..4c61ec007a3 100644 --- a/forge-gui/res/languages/es-ES.properties +++ b/forge-gui/res/languages/es-ES.properties @@ -84,6 +84,8 @@ cbRandomFoil=Foil Aleatorio cbRandomArtInPools=Aleatorizar Arte de la Carta en los pools que se generen cbEnableSounds=Activar sonidos cbEnableMusic=Activar música +cbAdjustSoundsVolume=Adjust Sound Volume +cbAdjustMusicVolume=Adjust Music Volume cbAltSoundSystem=Utilizar el sistema de sonido alternativo cbSROptimize=Optimizar la interfaz de usuario para los lectores de pantalla cbUiForTouchScreen=Mejorar la interfaz de usuario para pantallas táctiles @@ -182,6 +184,8 @@ nlDisplayCurrentCardColors=Muestra el color actual de las cartas en el panel de SoundOptions=Opciones de Sonido nlEnableSounds=Habilita los efectos de sonido durante el juego nlEnableMusic=Habilita la música de fondo durante el juego +nlAdjustSoundsVolume=Adjust sound effects volume during the game +nlAdjustMusicVolume=Adjust background music during the game nlAltSoundSystem=Use el sistema de sonido alternativo (solo use si tiene problemas con el sonido que no se reproduce o desaparece) nlSrOptimize=Establecer varias opciones para que Forge funcione mejor con los lectores de pantalla KeyboardShortcuts=Atajos de teclado diff --git a/forge-gui/res/languages/it-IT.properties b/forge-gui/res/languages/it-IT.properties index 7529aa984e3..c185ccc905c 100644 --- a/forge-gui/res/languages/it-IT.properties +++ b/forge-gui/res/languages/it-IT.properties @@ -84,6 +84,8 @@ cbRandomFoil=Lamina casuale cbRandomArtInPools=Randomizza l''arte della carta nei pool di carte generati cbEnableSounds=Abilita suoni cbEnableMusic=Abilita musica +cbAdjustSoundsVolume=Adjust Sound Volume +cbAdjustMusicVolume=Adjust Music Volume cbAltSoundSystem=Usa un sistema audio alternativo cbSROptimize=Optimize UI for screen readers cbUiForTouchScreen=Migliora l''interfaccia utente per i touchscreen @@ -182,6 +184,8 @@ nlDisplayCurrentCardColors=Visualizza la suddivisione del colore corrente delle SoundOptions=Opzioni audio nlEnableSounds=Abilita gli effetti sonori durante il gioco nlEnableMusic=Abilita la musica di sottofondo durante il gioco +nlAdjustSoundsVolume=Adjust sound effects volume during the game +nlAdjustMusicVolume=Adjust background music during the game nlAltSoundSystem=Utilizza il sistema audio alternativo (utilizza solo se hai problemi con l''audio che non viene riprodotto o che scompare) nlSrOptimize=Set various options to make FOrge work better with screen readers KeyboardShortcuts=Tasti rapidi diff --git a/forge-gui/res/languages/zh-CN.properties b/forge-gui/res/languages/zh-CN.properties index 47c643b5e08..33bb4ccf77a 100644 --- a/forge-gui/res/languages/zh-CN.properties +++ b/forge-gui/res/languages/zh-CN.properties @@ -84,6 +84,8 @@ cbRandomFoil=随机闪卡 cbRandomArtInPools=在生成的卡池中随机加入闪卡 cbEnableSounds=启用音效 cbEnableMusic=启用背景音乐 +cbAdjustSoundsVolume=Adjust Sound Volume +cbAdjustMusicVolume=Adjust Music Volume cbAltSoundSystem=使用备用音效系统 cbUiForTouchScreen=触摸屏UI增强 cbSROptimize=为屏幕阅读器启用UI优化 @@ -182,6 +184,8 @@ nlDisplayCurrentCardColors=在卡牌详情窗格中显示当前牌的颜色 SoundOptions=声音选项 nlEnableSounds=在游戏中启用声音效果 nlEnableMusic=在游戏中启用背景音乐 +nlAdjustSoundsVolume=Adjust sound effects volume during the game +nlAdjustMusicVolume=Adjust background music during the game nlAltSoundSystem=使用备用音效系统(仅在声音消失的情况使用) nlSrOptimize=使屏幕阅读器能更好的在forge上使用 KeyboardShortcuts=键盘快捷键 diff --git a/forge-gui/src/main/java/forge/properties/ForgePreferences.java b/forge-gui/src/main/java/forge/properties/ForgePreferences.java index d7101907172..43eb5c40e0b 100644 --- a/forge-gui/src/main/java/forge/properties/ForgePreferences.java +++ b/forge-gui/src/main/java/forge/properties/ForgePreferences.java @@ -111,6 +111,8 @@ public class ForgePreferences extends PreferencesStore { UI_TIMED_TARGETING_OVERLAY_UPDATES ("true"), UI_ENABLE_SOUNDS ("true"), UI_ENABLE_MUSIC ("true"), + UI_VOL_SOUNDS ("100"), + UI_VOL_MUSIC ("100"), UI_ALT_SOUND_SYSTEM ("false"), UI_CURRENT_AI_PROFILE ("Default"), UI_CLONE_MODE_SOURCE ("false"), diff --git a/forge-gui/src/main/java/forge/sound/IAudioClip.java b/forge-gui/src/main/java/forge/sound/IAudioClip.java index 479eccc4da3..a8f1158677d 100644 --- a/forge-gui/src/main/java/forge/sound/IAudioClip.java +++ b/forge-gui/src/main/java/forge/sound/IAudioClip.java @@ -1,7 +1,7 @@ package forge.sound; public interface IAudioClip { - void play(); + void play(float value); boolean isDone(); void stop(); void loop(); diff --git a/forge-gui/src/main/java/forge/sound/IAudioMusic.java b/forge-gui/src/main/java/forge/sound/IAudioMusic.java index 14ebdd774a4..bcd4147a42b 100644 --- a/forge-gui/src/main/java/forge/sound/IAudioMusic.java +++ b/forge-gui/src/main/java/forge/sound/IAudioMusic.java @@ -6,4 +6,5 @@ public interface IAudioMusic { void resume(); void stop(); void dispose(); + void setVolume(float value); } diff --git a/forge-gui/src/main/java/forge/sound/NoSoundClip.java b/forge-gui/src/main/java/forge/sound/NoSoundClip.java index 1b9edb63679..7d519bbb12f 100644 --- a/forge-gui/src/main/java/forge/sound/NoSoundClip.java +++ b/forge-gui/src/main/java/forge/sound/NoSoundClip.java @@ -4,7 +4,7 @@ package forge.sound; public class NoSoundClip implements IAudioClip { @Override - public void play() { } + public void play(float value) { } @Override public boolean isDone() { return false; } diff --git a/forge-gui/src/main/java/forge/sound/SoundSystem.java b/forge-gui/src/main/java/forge/sound/SoundSystem.java index 3561456c7d9..500bef1d398 100644 --- a/forge-gui/src/main/java/forge/sound/SoundSystem.java +++ b/forge-gui/src/main/java/forge/sound/SoundSystem.java @@ -43,8 +43,14 @@ public class SoundSystem { * was unavailable or failed to load. */ protected IAudioClip fetchResource(final SoundEffectType type) { - if (!FModel.getPreferences().getPrefBoolean(FPref.UI_ENABLE_SOUNDS)) { - return emptySound; + if (GuiBase.getInterface().isLibgdxPort()) { + if (FModel.getPreferences().getPrefInt(FPref.UI_VOL_SOUNDS)<1) { + return emptySound; + } + } else { + if (!FModel.getPreferences().getPrefBoolean(FPref.UI_ENABLE_SOUNDS)) { + return emptySound; + } } IAudioClip clip = loadedClips.get(type); @@ -66,8 +72,14 @@ public class SoundSystem { * was unavailable or failed to load. */ protected IAudioClip fetchResource(final String fileName) { - if (!FModel.getPreferences().getPrefBoolean(FPref.UI_ENABLE_SOUNDS)) { - return emptySound; + if (GuiBase.getInterface().isLibgdxPort()) { + if (FModel.getPreferences().getPrefInt(FPref.UI_VOL_SOUNDS)<1) { + return emptySound; + } + } else { + if (!FModel.getPreferences().getPrefBoolean(FPref.UI_ENABLE_SOUNDS)) { + return emptySound; + } } IAudioClip clip = loadedScriptClips.get(fileName); @@ -101,7 +113,7 @@ public class SoundSystem { else { final IAudioClip snd = fetchResource(resourceFileName); if (!isSynchronized || snd.isDone()) { - snd.play(); + snd.play(FModel.getPreferences().getPrefInt(FPref.UI_VOL_SOUNDS)/100f); } } } @@ -116,7 +128,7 @@ public class SoundSystem { else { final IAudioClip snd = fetchResource(type); if (!isSynchronized || snd.isDone()) { - snd.play(); + snd.play(FModel.getPreferences().getPrefInt(FPref.UI_VOL_SOUNDS)/100f); } } } @@ -182,6 +194,12 @@ public class SoundSystem { changeBackgroundTrack(); } + public void adjustVolume(float value) { + if (currentTrack != null) { + currentTrack.setVolume(value); + } + } + public void changeBackgroundTrack() { //ensure old track stopped and disposed of if needed if (currentTrack != null) { @@ -189,7 +207,9 @@ public class SoundSystem { currentTrack = null; } - if (currentPlaylist == null || !FModel.getPreferences().getPrefBoolean(FPref.UI_ENABLE_MUSIC)) { + if (currentPlaylist == null || GuiBase.getInterface().isLibgdxPort() + ? FModel.getPreferences().getPrefInt(FPref.UI_VOL_MUSIC) < 1 + : !FModel.getPreferences().getPrefBoolean(FPref.UI_ENABLE_MUSIC)) { return; }