LibGDX:AudioFlinger 无法创建轨道,状态 -12
Posted
技术标签:
【中文标题】LibGDX:AudioFlinger 无法创建轨道,状态 -12【英文标题】:LibGDX: AudioFlinger could not create track, status -12 【发布时间】:2019-03-08 21:40:19 【问题描述】:我最近在我的 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 文件,但它们都不是很大。 谢谢!
【问题讨论】:
我认为 SoundPool 只是对对象池设计模式的引用,而不是开箱即用可在 LibGDX 中使用的类。尝试搜索对游戏编程和一般编程非常有用的设计模式 是的,我想到了,因为它不是我找到的任何文档中的一个类。我看过一些,但我会寻找一些有声音设计细节的。 【参考方案1】:解决了!通过创建我自己的(一种伪)Sound
类,以及使用assetManager.setLoader()
与AssetManager
一起使用的加载器。在自定义 Sound
类中,我将每个声音设置为在 Array<Long>
中跟踪它们的 soundId
s,然后每次播放时,我都会根据 limit
变量检查数组的大小,停止最旧的声音在数组中。 0 表示一次只能播放一个,根据我的决定是必要的。这可能不是一个完美的解决方案,但它似乎工作得很好。
欢迎批评。
我创建的“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
:
public class MySoundLoader extends AsynchronousAssetLoader<MySound, MySoundLoader.SoundParameter>
private MySound sound;
public MySoundLoader(FileHandleResolver resolver)
super(resolver);
@Override
public Array<AssetDescriptor> getDependencies(String fileName, FileHandle file, SoundParameter parameter)
return null;
@Override
public void loadAsync(AssetManager manager, String fileName, FileHandle file, SoundParameter parameter)
sound = new MySound(Gdx.audio.newSound(file));
@Override
public MySound loadSync(AssetManager manager, String fileName, FileHandle file, SoundParameter parameter)
MySound sound = this.sound;
this.sound = null;
return sound;
static public class SoundParameter extends AssetLoaderParameters<MySound>
【讨论】:
以上是关于LibGDX:AudioFlinger 无法创建轨道,状态 -12的主要内容,如果未能解决你的问题,请参考以下文章
AudioTrack:AudioFlinger 无法创建轨道,状态:-32
SoundPool“AudioFlinger 无法创建音轨,状态:-12”