2010-06-02 61 views
8

我试图创建一个面向对象的模型来包装OpenAL并且在理解设备,缓冲区和上下文时有一点问题。OpenAL设备,缓冲区和上下文关系

从我在程序员指南中可以看到的,有多个设备,其中每个设备可以有多个上下文以及多个缓冲区。每个上下文都有一个监听器,并且所有的函数都在活动上下文的监听器上运行。 (这意味着如果我想改变它的监听者,我必须先创建另一个上下文,如果我明白了的话)。到目前为止,这么好。 虽然我需要将设备传递给alcCreateContext()函数,但是没有传递给alGenBuffers(),但令我感到恼火的是。

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

(或者有什么我错过了吗?)

回答

4

好的,问题解决了。我问的问题here和答案是

所有的人*函数(而不是ALC *功能),在当前背景下 操作。因此,alGenBuffer调用将在当前上下文中运行,并创建属于上下文设备的缓冲区(上下文只能有一个设备)。

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

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

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