OpenAL设备,缓冲区和上下文关系

sun*_*ide 8 audio openal

我正在尝试创建一个面向对象的模型来包装OpenAL,并且在理解设备,缓冲区和上下文时遇到一些问题.

从我在程序员指南中可以看到,有多个设备,每个设备可以有多个上下文以及多个缓冲区.每个上下文都有一个监听器,alListener*()所有函数都在活动上下文的监听器上运行.(这意味着如果我想改变它的倾听者,我必须首先激活另一个上下文,如果我做对了.)到目前为止,那么好.令我恼火的是,我需要将设备传递给alcCreateContext()函数,但没有alGenBuffers().

这怎么工作呢?当我打开多个设备时,在哪个设备上创建了缓冲区?缓冲区是否在所有设备之间共享?如果我关闭所有打开的设备,缓冲区会发生什么?

(或者我错过了什么?)

sun*_*ide 4

好的,问题解决了。我在这里问了这个问题,答案是

所有 al* 函数(而不是 alc* 函数)都在当前上下文上运行。因此,alGenBuffer 调用将对当前上下文进行操作,并创建属于该上下文的设备的缓冲区(一个上下文只能有一个设备)。

在一个设备上创建的缓冲区在另一设备上不可用。

当您调用 alcCloseDevice 时,设备的缓冲区将(可能)自动销毁。

因此,我必须使该设备的任意上下文处于活动状态,然后创建缓冲区,然后再次使旧上下文处于活动状态。或者,如果设备不活动,则完全阻止创建缓冲区,这意味着它的上下文都不活动。