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

