協(xié)作級別
因為Windows是一個多任務環(huán)境,多個應用程序可能在任意時刻對一個設(shè)備驅(qū)動器進行操作。雖然使用協(xié)作級別,DirectX仍然確保每個應用程序不能以錯誤方式或在錯誤時刻訪問設(shè)備。每個DirectSound應用程序都有一個協(xié)作級別,用于決定它被允許訪問設(shè)備的程度。
在創(chuàng)建一個設(shè)備對象后,你必須使用IDirectSound8::SetCooperativeLevel 方法為這個設(shè)備設(shè)置協(xié)作級別。如果你不這么做,將無法聽到聲音。下面這個例子為DirectSound設(shè)備設(shè)置了協(xié)作級別,這個設(shè)備由IDirectSound8接口lpDirectSound標識。Hwnd參數(shù)是應用程序窗口句柄。
HRESULT hr = lpDirectSound->SetCooperativeLevel(hwnd, DSSCL_PRIORITY);
if (FAILED(hr))
...{
ErrorHandler(hr); // Add error-handling here.
}
DirectSound為聲音設(shè)備定義了三個協(xié)作級別,由值DSSCL_NORMAL,DSSCL_PRIORITY和DSSCL_WRITEPRIMARY指定。
注意:DSSCL_EXCLUSIBE協(xié)作級別已經(jīng)過時。一個DirectX應用程序不再可能使其他應用程序沉寂。那些要求專用級別的應用程序?qū)⒈毁x予優(yōu)先級別。
標準協(xié)作級別
在標準協(xié)作級別(DSSCL_NORMAL)下,應用程序不能設(shè)置主緩沖區(qū)的格式,填充主緩沖區(qū),或者壓縮設(shè)備的On-board內(nèi)存。所有在這個協(xié)作級別的應用程序使用一個22KHz,立體音效,8位采樣格式的主緩沖區(qū),這樣設(shè)備能夠在應用程序間順利地切換。
優(yōu)先協(xié)作級別
當使用一個出于優(yōu)先協(xié)作級別(DSSCL_PRIORITY)地DirectSound設(shè)備時,應用程序享有對硬件資源的優(yōu)先權(quán),如硬件混頻,設(shè)置主緩沖區(qū)的格式,以及壓縮設(shè)備的On-board內(nèi)存。
游戲程序在幾乎所有環(huán)境下都應該使用優(yōu)先協(xié)作級別。這個級別給予了應用程序大的行為能力,使它能夠控制采樣率和位深度。優(yōu)先協(xié)作級別也允許來自其他應用程序(如IP電話)的聲音與游戲中的聲音一同被聽到。
寫主緩沖區(qū)協(xié)作級別
協(xié)作級別是寫主緩沖區(qū)(DSSCL_WRITEPRIMARY)。當使用這一協(xié)作級別的DirectSound設(shè)備時,你的應用程序能夠直接訪問非WDM驅(qū)動的主緩沖區(qū)。在這種模式下,應用程序必須直接填充主緩沖區(qū)。此時,輔助緩沖區(qū)無法被播放。
一個應用程序為了獲取對主緩沖區(qū)中音頻采樣的直接寫訪問,必須被設(shè)置為寫主緩沖區(qū)級別。如果應用程序沒有被設(shè)置成這一級別,那么所有對主緩沖區(qū)上IDirectSoundBuffer::Lock方法的調(diào)用都將失敗。
注意:主緩沖區(qū)只支持IDirectSoundBuffer接口,而不是IDirectSoundBuffer8。
當你的應用程序被設(shè)置為寫主緩沖區(qū)協(xié)作級別并出于前臺位置時,所有用于其他應用程序的輔助緩沖區(qū)將被停止并標記為已丟失。當你的應用程序順次移動到后臺時,它的主緩沖區(qū)被標記為已丟失,并且在應用程序再次移動到前臺時被恢復。
如果一個DirectSound驅(qū)動器不在用戶系統(tǒng)中時,你無法設(shè)置寫主緩沖區(qū)協(xié)作級別。為判斷是否出于這種情形,調(diào)用IDirectSound8::GetCaps方法,并檢查DSCAPS結(jié)構(gòu)中DSCAPS_EMULDRIVER標識。
因為Windows是一個多任務環(huán)境,多個應用程序可能在任意時刻對一個設(shè)備驅(qū)動器進行操作。雖然使用協(xié)作級別,DirectX仍然確保每個應用程序不能以錯誤方式或在錯誤時刻訪問設(shè)備。每個DirectSound應用程序都有一個協(xié)作級別,用于決定它被允許訪問設(shè)備的程度。
在創(chuàng)建一個設(shè)備對象后,你必須使用IDirectSound8::SetCooperativeLevel 方法為這個設(shè)備設(shè)置協(xié)作級別。如果你不這么做,將無法聽到聲音。下面這個例子為DirectSound設(shè)備設(shè)置了協(xié)作級別,這個設(shè)備由IDirectSound8接口lpDirectSound標識。Hwnd參數(shù)是應用程序窗口句柄。
HRESULT hr = lpDirectSound->SetCooperativeLevel(hwnd, DSSCL_PRIORITY);
if (FAILED(hr))
...{
ErrorHandler(hr); // Add error-handling here.
}
DirectSound為聲音設(shè)備定義了三個協(xié)作級別,由值DSSCL_NORMAL,DSSCL_PRIORITY和DSSCL_WRITEPRIMARY指定。
注意:DSSCL_EXCLUSIBE協(xié)作級別已經(jīng)過時。一個DirectX應用程序不再可能使其他應用程序沉寂。那些要求專用級別的應用程序?qū)⒈毁x予優(yōu)先級別。
標準協(xié)作級別
在標準協(xié)作級別(DSSCL_NORMAL)下,應用程序不能設(shè)置主緩沖區(qū)的格式,填充主緩沖區(qū),或者壓縮設(shè)備的On-board內(nèi)存。所有在這個協(xié)作級別的應用程序使用一個22KHz,立體音效,8位采樣格式的主緩沖區(qū),這樣設(shè)備能夠在應用程序間順利地切換。
優(yōu)先協(xié)作級別
當使用一個出于優(yōu)先協(xié)作級別(DSSCL_PRIORITY)地DirectSound設(shè)備時,應用程序享有對硬件資源的優(yōu)先權(quán),如硬件混頻,設(shè)置主緩沖區(qū)的格式,以及壓縮設(shè)備的On-board內(nèi)存。
游戲程序在幾乎所有環(huán)境下都應該使用優(yōu)先協(xié)作級別。這個級別給予了應用程序大的行為能力,使它能夠控制采樣率和位深度。優(yōu)先協(xié)作級別也允許來自其他應用程序(如IP電話)的聲音與游戲中的聲音一同被聽到。
寫主緩沖區(qū)協(xié)作級別
協(xié)作級別是寫主緩沖區(qū)(DSSCL_WRITEPRIMARY)。當使用這一協(xié)作級別的DirectSound設(shè)備時,你的應用程序能夠直接訪問非WDM驅(qū)動的主緩沖區(qū)。在這種模式下,應用程序必須直接填充主緩沖區(qū)。此時,輔助緩沖區(qū)無法被播放。
一個應用程序為了獲取對主緩沖區(qū)中音頻采樣的直接寫訪問,必須被設(shè)置為寫主緩沖區(qū)級別。如果應用程序沒有被設(shè)置成這一級別,那么所有對主緩沖區(qū)上IDirectSoundBuffer::Lock方法的調(diào)用都將失敗。
注意:主緩沖區(qū)只支持IDirectSoundBuffer接口,而不是IDirectSoundBuffer8。
當你的應用程序被設(shè)置為寫主緩沖區(qū)協(xié)作級別并出于前臺位置時,所有用于其他應用程序的輔助緩沖區(qū)將被停止并標記為已丟失。當你的應用程序順次移動到后臺時,它的主緩沖區(qū)被標記為已丟失,并且在應用程序再次移動到前臺時被恢復。
如果一個DirectSound驅(qū)動器不在用戶系統(tǒng)中時,你無法設(shè)置寫主緩沖區(qū)協(xié)作級別。為判斷是否出于這種情形,調(diào)用IDirectSound8::GetCaps方法,并檢查DSCAPS結(jié)構(gòu)中DSCAPS_EMULDRIVER標識。

