共用方式為


DSSPEAKER_DIRECTOUT說話者設定

附註 此資訊適用於 Windows XP 和舊版作系統。 從 Windows Vista 開始,IDirectSound::GetSpeakerConfigIDirectSound::SetSpeakerConfig 已被取代。

應用程式程式可以呼叫 IDirectSound::SetSpeakerConfig 方法,並將喇叭組態參數設定為 DSSPEAKER_DIRECTOUT,將 DirectSound 喇叭組態設定變更為直接輸出模式(請參閱 Microsoft Windows SDK 檔)。 這會指定無喇叭組態,其中來自應用程式的播放數據流中的通道會直接輸出到音訊配接器,而不會被解譯為喇叭位置。 不過,輸入數據流仍可透過取樣速率轉換、衰減、篩選和其他類型的處理來修改,而不需要假設將喇叭指派給通道。

一旦生效,DSSPEAKER_DIRECTOUT喇叭組態設定會是全域的,而且會影響整個音訊裝置。 後續執行的所有音訊應用程式都會受限於新的設定,直到 DirectSound 再次變更設定為止。

在直接輸出模式中,音訊裝置會將第一個通道轉譯為裝置上的第一個輸出連接器、第二個通道到裝置上的第二個輸出,依此顯示。 這可讓音訊撰寫應用程式將多通道數據直接輸出到裝置,例如外部混音器或音訊儲存裝置(硬碟、ADAT 等等)。 例如,可能會指派 48 通道數據流中的通道,如下表所示。

頻道號碼內容 0

聲樂

1

2

吉他

3

低音

...

47

鋼琴

對於這類原始音訊數據,喇叭位置毫無意義,並將說話者位置指派給輸入或輸出數據流可能會導致不必要的副作用。 例如,KMixer 之類的元件可能會藉由將 3D 虛擬化或 Dolby Surround Pro 邏輯編碼等說話者特有效果套用至數據流,來不當介入。 請注意,原始數據通道的數目不受通道遮罩中的位數目所限制。

即使是專為音頻編輯而設計的裝置,通常也應該接受 KSPROPERTY_AUDIO_CHANNEL_CONFIG set-property 要求,將其喇叭組態變更為KSAUDIO_SPEAKER_DIRECTOUT。 一般而言,裝置應該避免要求失敗,除非它可以以某種方式確認其輸出已連線到喇叭,而且無法用於任何其他用途(例如,做為外部混音器的輸入)。

使用直接輸出模式的應用程式通常會針對特定硬體裝置撰寫。 這可讓應用程式事先知道裝置支援的直接輸出數據格式,包括通道數目,以及這些通道中的數據應該如何解譯。 此知識是必要的,因為當應用程式在直接輸出模式設定的裝置上呼叫 IDirectSound::GetSpeakerConfig 時,裝置只會確認它處於此模式;它不會提供任何其他資訊,說明在直接輸出模式中支援之數據流格式的通道數目。 然而,這項資訊可能透過將 KSPROPERTY_AUDIO_MIX_LEVEL_CAPS get-property 要求傳送至裝置混音器針腳上的超級混音器節點來取得;請參閱 DirectSound Node-Ordering Requirements

指定直接輸出數據流的波浪格式時,應用程式應該將 dwChannelMaskWAVEATEXTENSIBLE 結構的成員設定為值為零的值KSAUDIO_SPEAKER_DIRECTOUT。 零的通道掩碼表示未定義說話者位置。 一如往常,數據流中的通道數目會以 Format.nChannels 成員指定。

當裝置設定為直接輸出模式時,硬體廠商可以選擇支援 DirectSound 硬體加速。 DirectSound 應用程式可以透過其中一個裝置的混合針腳播放直接輸出串流,如果有的話。 一旦所有可用的硬體針腳實例都用盡,任何新的串流都會改為通過 KMixer。

在直接輸出模式中設定的裝置混合串流時,KMixer 會套用一對一輸入數據流的通道,以及它輸出至裝置之混合數據流的通道。 這表示,如果應用程式產生數個具有相同通道數目的直接輸出數據流,例如,輸出混合的每個通道 N 只是輸入 KMixer 之所有數據流的通道 N 總和。

混合數個直接輸出數據流時,其包含的通道數目不同,KMixer 的混合演算法會稍微複雜一點。 在此情況下,混合的每個通道 N 都是具有通道 N 之所有輸入數據流的通道 N 總和。例如,如果 KMixer 混合四邊形和立體聲輸入數據流以形成四邊形輸出混合,則通道零和其中一個輸出混合是輸入立體聲和四邊形串流的通道零和一個。 不過,立體聲輸入數據流不會對兩個和三個混合的通道造成任何貢獻,這完全取自四方輸入數據流的最後兩個通道。

嘗試執行下列其中一項的應用程式有無法預期的行為風險:

  • 透過以直接輸出模式設定的裝置,播放非直接輸出格式的串流。

  • 透過未以直接輸出模式設定的裝置播放直接輸出串流。

當遇到其中一個案例時,KMixer 會避免只是嘗試開啟數據流失敗。 相反地,它會嘗試使用上述的一對一對應演算法來處理明顯的不相容。 使用者可能或可能不滿意結果。 其他音訊元件無法預期會以與 KMixer 相同的方式處理這些情況。 例如,在直接輸出模式中設定之裝置的驅動程式應該會失敗,嘗試針對不是直接輸出格式的輸出數據流開啟硬體緩衝區,反之亦然。

音訊撰寫應用程式可能需要讓使用者接聽它已混合到其輸出數據流的前幾個通道的數據,但忽略仍包含在數據流其餘通道中的原始數據。 KMixer 的行為使這個簡單明瞭。 例如,如果 24 通道播放資料流包含通道 0 和 1 的立體聲混合,以及通道 2 到 23 的原始數據,應用程式會執行下列動作:

  • 使用 DSSPEAKER_STEREO 呼叫 setSpeakerConfig,以立體聲模式設定目標音訊裝置(這不一定是應用程式用來編輯串流的裝置)。

  • 將播放數據流 NMATEXTENSIBLE 結構 dwChannelMask 變更為 KSAUDIO_SPEAKER_STEREO,但會將 Format.nChannels 設定為 24,這是數據流中的通道總數。

KMixer 只會混合播放數據流的立體聲通道,如通道遮罩中所述,並捨棄其餘 22 個通道,其中包含原始數據。 請記住,對 DirectSound 喇叭組態設定所做的任何變更都不太可能生效,直到目前的 DirectSound 物件終結,另一個物件才會生效(請參閱 套用 Speaker-Configuration 設定)。