2010-06-02 51 views
8

我試圖創建一個面向對象的模型來包裝OpenAL並且在理解設備,緩衝區和上下文時有一點問題。OpenAL設備,緩衝區和上下文關係

從我在程序員指南中可以看到的,有多個設備,其中每個設備可以有多個上下文以及多個緩衝區。每個上下文都有一個監聽器,並且所有的函數都在活動上下文的監聽器上運行。 (這意味着如果我想改變它的監聽者,我必須先創建另一個上下文,如果我明白了的話)。到目前爲止,這麼好。 雖然我需要將設備傳遞給alcCreateContext()函數,但是沒有傳遞給alGenBuffers(),但令我感到惱火的是。

這是如何工作的呢?當我打開多個設備時,在哪個設備上創建緩衝區?所有設備之間是否共享緩衝區?如果關閉所有打開的設備,緩衝區會發生什麼變化?

(或者有什麼我錯過了嗎?)

回答

4

好的,問題解決了。我問的問題here和答案是

所有的人*函數(而不是ALC *功能),在當前背景下 操作。因此,alGenBuffer調用將在當前上下文中運行,並創建屬於上下文設備的緩衝區(上下文只能有一個設備)。

在一臺設備上創建的緩衝區在另一臺設備上不可用。

當您撥打 alcCloseDevice時,設備的緩衝區將(可能)自動銷燬。

所以我必須使該設備的任意上下文處於活動狀態,然後創建緩衝區,然後再次使舊的上下文處於活動狀態。或者,如果設備未處於活動狀態,則完全阻止創建緩衝區,這意味着它沒有任何上下文處於活動狀態。