LibGDX:AudioFlinger无法创建状态为-12的曲目

时间:2019-03-08 21:40:19

标签: audio libgdx soundpool audiotrack audioflinger

我最近在我的LibGDX游戏中添加了声音。进行了设置,以便将我需要的所有声音加载到AssetManager中,并在需要通过getSound(String name)方法播放它们时将它们检索出来。

当您玩游戏时,它可以正常工作,但最终它会停止播放某些游戏,有时甚至停止播放大多数游戏。我会优先考虑最近播放的那些文件,并在需要时停止那些较旧的文件,但是LibGDX似乎并没有给您太多控制权。

发生这种情况时出现的日志错误 E/AudioTrack: AudioFlinger could not create track, status: -12 E/SoundPool: Error creating AudioTrack

通常一次播放很多声音,一次播放大约10-20个小声音,具体取决于情况,所以我很确定这就是问题所在。我已经在这里阅读过有关使用SoundPool播放声音后释放声音的信息,但是我不确定如何使用LibGDX做到这一点,或者是否有可能,因为我当时没有看到类似的声音我看了。

此外,我对所有声音都使用ogg文件,但它们都不是很大。 谢谢!

1 个答案:

答案 0 :(得分:1)

解决了!通过创建我自己的(伪类)Sound类,并使用AssetManager将其与assetManager.setLoader()一起使用的加载器。在自定义Sound类中,我将每种声音设置为在soundId中跟踪其Array<Long>,然后每次播放时,我都会根据{{1 }}变量,停止数组中最早的声音。 0表示一次只能播放一次,直到我认为有必要为止。这可能不是一个完美的解决方案,但似乎效果很好。

欢迎批评。

我创建的“ limit”类:

Sound

public class MySound { private Sound sound; private Array<Long> ids; private int limit; public MySound(Sound sound) { this.sound = sound; ids = new Array<Long>(); limit = 0; } public long play() { limitSounds(); long id = sound.play(); ids.add(id); return id; } public long play(float volume) { limitSounds(); long id = sound.play(volume); ids.add(id); return id; } public long play(float volume, float pitch, float pan) { limitSounds(); long id = sound.play(volume, pitch, pan); ids.add(id); return id; } public long loop() { limitSounds(); long id = sound.loop(); ids.add(id); return id; } public long loop(float volume) { limitSounds(); long id = sound.loop(volume); ids.add(id); return id; } public long loop(float volume, float pitch, float pan) { limitSounds(); long id = sound.loop(volume, pitch, pan); ids.add(id); return id; } public void stop() { ids.clear(); sound.stop(); } public void pause() { sound.pause(); } public void resume() { sound.resume(); } public void dispose() { sound.dispose(); } public void stop(long soundId) { if (ids.contains(soundId, true)) { ids.removeValue(soundId, true); } sound.stop(soundId); } public void pause(long soundId) { sound.pause(soundId); } public void resume(long soundId) { sound.resume(soundId); } public void setLooping(long soundId, boolean looping) { sound.setLooping(soundId, looping); } public void setPitch(long soundId, float pitch) { sound.setPitch(soundId, pitch); } public void setVolume(long soundId, float volume) { sound.setVolume(soundId, volume); } public void setPan(long soundId, float pan, float volume) { sound.setPan(soundId, pan, volume); } private void limitSounds () { if (ids.size > limit) { sound.stop(ids.get(0)); ids.removeIndex(0); } } public void setLimit (int limit) { this.limit = limit; } } 类,用于MySoundLoader

AssetManager