我正在使用OpenAL播放声音。我正在尝试实现即弃即用播放功能,该功能采用缓冲区ID并将其分配给我先前已分配的池中的源,并进行播放。但是,对象生存期存在问题。
在OpenGL中,删除功能可以自动解除绑定(例如纹理),或者在最终解除绑定时自动删除(例如着色器),因此通常易于管理删除。但是alDeleteBuffers
,AL_INVALID_OPERATION
如果缓冲区仍绑定到源,则会简单地失败。
是否有一种惯用的方式来“删除” OpenAL缓冲区,使它们可以完成播放,然后自动解除绑定,从而真正解除绑定?我是否需要将缓冲区管理更深入地绑定到源池中(例如,删除缓冲区还需要检查所有分配的源)?
同样,在结束播放时,是否有一种惯用的方式来解除绑定(但不删除)缓冲区?如果当我在寻找免费资源时,只需要查看是否附加了缓冲区,而不必费心检查源状态,那将是很好的。
(尽管使用C的方法也不错,但我使用的是C ++。假设使用GCd语言并使用终结器的方法可能不适用。)