一段时间后,OpenAL停止工作(iOS)

时间:2013-07-16 14:15:03

标签: iphone ios ipad openal

在我的应用程序中,我通常使用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);

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

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

1 个答案:

答案 0 :(得分:0)

我发现没有办法解决这个问题,它似乎是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()