【问题标题】:OpenAL stops working after some time (iOS)OpenAL 在一段时间后停止工作 (iOS)
【发布时间】:2013-07-16 14:15:03
【问题描述】:

在我的应用程序中,我通常使用 5 个缓冲区和 5 个源,但它会上下波动。从一开始一切正常,但一段时间后似乎有某种类型的资源泄漏,所以播放的声音越来越少。运行大约 15 分钟后,所有声音都消失了。我已经在我的代码中搜索了几天的错误,我猜资源泄漏在其他地方。伪:

    context = alcCreateContext(device, attributes);
    alcMakeContextCurrent(context);
    alutInitWithoutContext(0, 0);
    ...
10: buffer = alutCreateBufferFromFileImage(data, len);
    ...
    alGenSources(1, &sid);
    alSourcei(sid, AL_SOURCE_RELATIVE, AL_FALSE);
    alSourcef(sid, AL_ROLLOFF_FACTOR, 0.2f);
    alSourcei(sid, AL_BUFFER, buffer);
    ...
    alSourceStop(sid);
    ...
    alDeleteSources(1, &sid);
    alDeleteBuffers(1, &buffer);
    ...
    goto 10

每次调用后,我都会检查 OpenAL 错误,但从未报告过任何错误。我还尝试在将应用程序移入/移出后台时添加暂停/恢复代码,如下所示:

// -> background
alcMakeContextCurrent(0);
alcSuspendContext(context);
// -> foreground
alcMakeContextCurrent(context);
alcProcessContext(context);

但这并没有任何明显的效果(当我将应用程序推到后台时,然后再次将其拉回)。在最新 iOS 版本的 iPad2 上,在运行旧 iOS 版本的 iPhone3GS 上,该错误是相同的。怎么办,怎么办?

编辑:在调试版本中,我从 alSourcePlay(sid=5260) 返回 -1。一方面,据我所知,-1 不是有效的返回码之一。一些旧的实现似乎将 AL_INVALID 定义为 -1。忽略这一点,根据实现,如果在执行 alDeleteSources() 时回收来自 alGenSources() 的 sid,则 5260 非常高。有谁知道删除的时候样本ID是不是被回收了,还是只是一个计数器?

【问题讨论】:

    标签: iphone ios ipad openal


    【解决方案1】:

    我找不到解决此问题的方法,这似乎是 iOS 上的 OpenAL 实现中的资源泄漏。我的规避方法是关闭并重新初始化 OpenAL,它在一些故障的情况下工作得很好,但替代方案要糟糕得多。修复代码:

    if OpenALIrreparableLeakState:
        for sound in resources_of_type("sound"):
            sound.release()
        openal.shutdown()
        openal.initialize()
        for sound in resources_of_type("sound"):
            sound.load()
    

    【讨论】:

      猜你喜欢
      • 2010-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多