From 205fe95129ec0bb133e718271601c1962329a949 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Mon, 13 Mar 2023 10:29:25 +0800 Subject: [PATCH] update AudioClip, AudioMusic - let AssetManager handle game audio - unload particles and music after playing it to save RAM --- .../forge/adventure/character/MapActor.java | 13 +++++--- forge-gui-mobile/src/forge/assets/Assets.java | 32 ++++++++++++++++++- .../src/forge/sound/AudioClip.java | 7 ++-- .../src/forge/sound/AudioMusic.java | 18 +++++++++-- 4 files changed, 59 insertions(+), 11 deletions(-) diff --git a/forge-gui-mobile/src/forge/adventure/character/MapActor.java b/forge-gui-mobile/src/forge/adventure/character/MapActor.java index 7077f1b212e..c8fe9219ac0 100644 --- a/forge-gui-mobile/src/forge/adventure/character/MapActor.java +++ b/forge-gui-mobile/src/forge/adventure/character/MapActor.java @@ -1,5 +1,6 @@ package forge.adventure.character; +import com.badlogic.gdx.files.FileHandle; import com.badlogic.gdx.graphics.Pixmap; import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.graphics.g2d.Batch; @@ -26,7 +27,8 @@ public class MapActor extends Actor { } static class CurrentEffect { - public CurrentEffect(String path, ParticleEffect effect, Vector2 offset, boolean overlay) { + public CurrentEffect(FileHandle file, String path, ParticleEffect effect, Vector2 offset, boolean overlay) { + this.fileHandle = file; this.path = path; this.effect = effect; this.offset = offset; @@ -34,6 +36,7 @@ public class MapActor extends Actor { } private final String path; + private FileHandle fileHandle; public ParticleEffect effect; public Vector2 offset; public boolean overlay = true; @@ -57,10 +60,11 @@ public class MapActor extends Actor { } public void playEffect(String path, float duration, boolean overlay, Vector2 offset) { - ParticleEffect effect = Forge.getAssets().getEffect(Config.instance().getFile(path)); + FileHandle file = Config.instance().getFile(path); + ParticleEffect effect = Forge.getAssets().getEffect(file); if (effect != null) { effect.setPosition(getCenter().x, getCenter().y); - effects.add(new CurrentEffect(path, effect, offset, overlay)); + effects.add(new CurrentEffect(file, path, effect, offset, overlay)); //ParticleEffect.setDuration uses an integer for some reason if (duration != 0) { for (ParticleEmitter emitter : effect.getEmitters()) { @@ -159,8 +163,7 @@ public class MapActor extends Actor { if (effect.effect.isComplete()) { effects.removeIndex(i); i--; - //assetmanager should handle dispose automatically - //effect.effect.dispose(); + Forge.getAssets().manager().unload(effect.fileHandle.path()); } } if (effects.size == 0 && removeIfEffectsAreFinished && getParent() != null) diff --git a/forge-gui-mobile/src/forge/assets/Assets.java b/forge-gui-mobile/src/forge/assets/Assets.java index b9c3e19af04..db22c8dcbb1 100644 --- a/forge-gui-mobile/src/forge/assets/Assets.java +++ b/forge-gui-mobile/src/forge/assets/Assets.java @@ -8,6 +8,8 @@ import com.badlogic.gdx.assets.loaders.FileHandleResolver; import com.badlogic.gdx.assets.loaders.ParticleEffectLoader; import com.badlogic.gdx.assets.loaders.TextureLoader.TextureParameter; import com.badlogic.gdx.assets.loaders.resolvers.AbsoluteFileHandleResolver; +import com.badlogic.gdx.audio.Music; +import com.badlogic.gdx.audio.Sound; import com.badlogic.gdx.files.FileHandle; import com.badlogic.gdx.graphics.Pixmap; import com.badlogic.gdx.graphics.Texture; @@ -368,6 +370,34 @@ public class Assets implements Disposable { return textrafonts.get(name); } + public Music getMusic(FileHandle file) { + if (file == null || !file.exists() || !FileType.Absolute.equals(file.type())) { + System.err.println("Failed to load: " + file +"!."); + return null; + } + Music music = manager().get(file.path(), Music.class, false); + if (music == null) { + manager().load(file.path(), Music.class); + manager().finishLoadingAsset(file.path()); + music = manager().get(file.path(), Music.class); + } + return music; + } + + public Sound getSound(FileHandle file) { + if (file == null || !file.exists() || !FileType.Absolute.equals(file.type())) { + System.err.println("Failed to load: " + file +"!."); + return null; + } + Sound sound = manager().get(file.path(), Sound.class, false); + if (sound == null) { + manager().load(file.path(), Sound.class); + manager().finishLoadingAsset(file.path()); + sound = manager().get(file.path(), Sound.class); + } + return sound; + } + public class MemoryTrackingAssetManager extends AssetManager { private int currentMemory; private Map memoryPerFile; @@ -530,8 +560,8 @@ public class Assets implements Disposable { super.unload(fileName); if (memoryPerFile.containsKey(fileName)) { memoryPerFile.remove(fileName); + cardArtCache().clear(); } - cardArtCache().clear(); } public float getMemoryInMegabytes() { diff --git a/forge-gui-mobile/src/forge/sound/AudioClip.java b/forge-gui-mobile/src/forge/sound/AudioClip.java index be27b4978e6..bfff7b00b15 100644 --- a/forge-gui-mobile/src/forge/sound/AudioClip.java +++ b/forge-gui-mobile/src/forge/sound/AudioClip.java @@ -21,6 +21,7 @@ package forge.sound; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.audio.Sound; import com.badlogic.gdx.files.FileHandle; +import forge.Forge; public class AudioClip implements IAudioClip { private Sound clip; @@ -33,7 +34,7 @@ public class AudioClip implements IAudioClip { private AudioClip(final FileHandle fileHandle) { try { - clip = Gdx.audio.newSound(fileHandle); + clip = Forge.getAssets().getSound(fileHandle); } catch (Exception ex) { System.err.println("Unable to load sound file: " + fileHandle.toString()); @@ -48,7 +49,7 @@ public class AudioClip implements IAudioClip { Thread.sleep(SoundSystem.DELAY); } catch (InterruptedException ex) { - ex.printStackTrace(); + //ex.printStackTrace(); } clip.play(value); } @@ -61,7 +62,7 @@ public class AudioClip implements IAudioClip { Thread.sleep(SoundSystem.DELAY); } catch (InterruptedException ex) { - ex.printStackTrace(); + //ex.printStackTrace(); } clip.loop(); } diff --git a/forge-gui-mobile/src/forge/sound/AudioMusic.java b/forge-gui-mobile/src/forge/sound/AudioMusic.java index 4bb5e3ea87a..b594554e573 100644 --- a/forge-gui-mobile/src/forge/sound/AudioMusic.java +++ b/forge-gui-mobile/src/forge/sound/AudioMusic.java @@ -3,15 +3,21 @@ package forge.sound; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.audio.Music; import com.badlogic.gdx.audio.Music.OnCompletionListener; +import com.badlogic.gdx.files.FileHandle; +import forge.Forge; public class AudioMusic implements IAudioMusic { private Music music; + private FileHandle file; public AudioMusic(String filename) { - music = Gdx.audio.newMusic(Gdx.files.absolute(filename)); + file = Gdx.files.absolute(filename); + music = Forge.getAssets().getMusic(file); } public void play(final Runnable onComplete) { + if (music == null) + return; music.setOnCompletionListener(new OnCompletionListener() { @Override public void onCompletion(Music music) { @@ -22,27 +28,35 @@ public class AudioMusic implements IAudioMusic { } public void pause() { + if (music == null) + return; music.pause(); } public void resume() { + if (music == null) + return; if (!music.isPlaying()) { music.play(); } } public void stop() { + if (music == null) + return; music.setOnCompletionListener(null); //prevent firing if stopped manually music.stop(); } public void dispose() { stop(); - music.dispose(); + Forge.getAssets().manager().unload(file.path()); } @Override public void setVolume(float value) { + if (music == null) + return; music.setVolume(value); } }