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

Iphone OpenAL在一段时间后停止工作(iOS),iphone,ios,ipad,openal,Iphone,Ios,Ipad,Openal,在我的应用程序中,我通常使用5个缓冲区和5个源,但它会上下变化一些。从一开始一切正常,但过了一段时间,似乎出现了某种类型的资源泄漏,因此播放的声音越来越少。跑步大约15分钟后,所有声音都消失了。我已经在我的代码中搜索了一个bug好几天了,我猜资源泄漏在别处。伪: context = alcCreateContext(device, attributes); alcMakeContextCurrent(context); alutInitWithoutContext(0,

在我的应用程序中,我通常使用5个缓冲区和5个源,但它会上下变化一些。从一开始一切正常,但过了一段时间,似乎出现了某种类型的资源泄漏,因此播放的声音越来越少。跑步大约15分钟后,所有声音都消失了。我已经在我的代码中搜索了一个bug好几天了,我猜资源泄漏在别处。伪:

    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上的bug与运行旧iOS版本的iPhone3GS上的bug相同。怎么办,怎么办


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

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