首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >LibGDX: AudioFlinger无法创建轨道,状态为-12

LibGDX: AudioFlinger无法创建轨道,状态为-12
EN

Stack Overflow用户
提问于 2019-03-09 05:40:19
回答 1查看 206关注 0票数 1

我最近在我的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文件为所有的声音,他们没有一个是非常大的。谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-11 13:25:50

解决了!通过创建我自己的(类似于伪的) Sound类,并使用assetManager.setLoader()为它创建一个加载器,以便与AssetManager一起使用。在自定义的Sound类中,我将每个声音设置为在Array<Long>中跟踪它们的soundId,然后每次播放时,我都会根据limit变量检查数组的大小,停止数组中最老的声音。0表示一次只能播放一个,直到我决定需要播放为止。这可能不是一个完美的解决方案,但它似乎工作得相当好。

欢迎批评。

我创建的"Sound“类:

代码语言:javascript
复制
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

代码语言:javascript
复制
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> {
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55071388

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档