3

我正在为 iPhone 和 OpenAL 使用 XCode 4.5。问题是我无法在播放声音后删除声音缓冲区:alSourcePlay().如果我不播放源 - 缓冲区被删除并且 nemory 被释放而没有问题。

加载声音:

alGenBuffers(1, &bufferID);

// Loading awaiting data blob into buffer.
alBufferData(bufferID, format, outData, size, freq);

// Getting source ID from OpenAL.
alGenSources(1, &sourceID);

// Attacing buffer to source.
alSourcei(sourceID, AL_BUFFER, bufferID);

//playing sound (if i comment this line, the problem dissapears)
alSourcePlay(soundId);

释放声音:

//detaching buffer
alSourcei(sourceID, AL_BUFFER, bufferID);
//deleting source
alDeleteSources(1, &sourceID);
//deleting buffer
alDeleteBuffers(1, &bufferID);

删除缓冲区不会引发任何错误,但不会从内存中释放。我正在使用 Instruments 来监控内存。

我花了一周的时间寻找解决方案并阅读 OpenAL 文档。

如果您有 OpenAL 方面的经验,请提供帮助!

谢谢!

4

3 回答 3

3

从文档中:

alDeleteBuffers

说明:该函数删除一个或多个缓冲区,释放缓冲区使用的资源。无法删除附加到源的缓冲区。有关如何从源中分离缓冲区的信息,请参阅 alSourcei 和 alSourceUnqueueBuffers。

alSourcei

备注:缓冲区名称 0 保留为“NULL 缓冲区”,并被 alSourcei(..., AL_BUFFER, ...) 接受为长度为零的有效缓冲区。NULL 缓冲区对于从源中分离缓冲区非常有用使用此调用或使用 alSourceQueueBuffers 附加。

这应该有效:

//detaching buffer
alSourcei(sourceID, AL_BUFFER, 0); //<-- detach using NULL buffer
//deleting source
alDeleteSources(1, &sourceID);
//deleting buffer
alDeleteBuffers(1, &bufferID);
于 2014-11-24T16:30:46.667 回答
1

释放声音时,呼叫应该是:

alSourcei(sourceID, AL_BUFFER, 0);

这是根据 OpenAL 程序员指南:

http://connect.creativelabs.com/openal/Documentation/OpenAL_Programmers_Guide.pdf

于 2013-05-08T17:50:21.570 回答
0

我不知道这是否对您来说是相关信息,但我遇到了同样的问题,我通过在删除源后 1 秒删除缓冲区来解决它。因此,当需要删除时,我将缓冲区存储在一个带有时间戳的字典中,该时间戳告诉它何时应该被删除,然后通过调用来删除缓冲区

alDeleteBuffers(1, &bufferID);

一旦时间戳已经过去,其他地方。这背后的基本原理是 iOS OpenAL 在另一个线程中运行,您需要给它时间来处理源删除。

于 2014-06-04T16:24:13.917 回答