裝置格式

對於音訊應用程式,使用較高層級音訊 API 的優點,例如 DirectSound 或 Windows 多媒體 waveOutXxx 函式,是 API 會自動在應用程式所使用的數據流格式與音訊裝置所使用的格式之間轉換。 相反地,核心音訊 API 會更嚴格,因為它們需要應用程式串流使用與裝置所使用的格式相同或密切相關的格式。 因此,使用核心音訊 API 播放或錄製音訊數據流的應用程式可能需要執行一些或所有串流格式之間的轉換。

使用 WASAPI 管理共用模式資料流的應用程式可以依賴音訊引擎執行有限的格式轉換。 音訊引擎可以在應用程式所使用的標準 PCM 樣本大小與引擎用於其內部處理的浮點樣本之間轉換。 不過,應用程式數據流的格式通常必須具有與裝置所使用的數據流格式相同的通道數目和相同的取樣率。

如果應用程式以獨佔模式使用裝置,應用程式必須使用音訊硬體明確支持的數據流格式。 在獨佔模式中,應用程式和裝置會直接交換音訊數據,而不需要音訊引擎介入。

許多音訊裝置都支援 PCM 和非 PCM 資料流格式。 不過,音訊引擎只能混合 PCM 數據流。 因此,只有獨佔模式數據流可以有非 PCM 格式。 此外,獨佔模式僅支援具有固定數據速率的非 PCM 格式。 固定速率非 PCM 格式的範例是 48-kHz Windows Media Audio Professional (WMA Pro) 音訊串流,其會以數位形式通過索尼/菲利普斯數位介面 (S/PDIF) 連結,而不進行譯碼。 如需透過 S/PDIF 使用 WMA Pro 資料流的詳細資訊,請參閱 指定 WMA Pro 數據範圍

WASAPI 會使用 SEMANTICATEXSEMANTICATEXTENSIBLE 結構來指定數據流格式。 被擴充以描述更大格式範圍的波解X 結構,實際上是一種波狀結構。 任何可由獨立 抗波波子 結構所描述的格式,也可以透過 「超聲波」XTENSIBLE 結構來描述。

SEMANTICATEXTENSIBLE 結構的第一個成員是「超聲波」結構。 ITERATEX 結構的內容會指出它是獨立的波解波器X 結構,還是一部分的電壓ATEXTENSIBLE 結構。

獨立 電壓ATEX 結構可以充分描述一或兩個通道的格式,以及8位的倍數樣本大小。 根據本身, SEMANTICATEX 結構無法指定通道與喇叭位置的對應。 此外,雖然 NUMERICATEX 會指定每個音訊樣本的容器大小,但它無法在樣本中指定有效位數(例如,24 位容器中的 20 位有效位數)。 相反地 ,SEMANTICATEXTENSIBLE 結構可以同時指定通道與喇叭的對應,以及每個樣本中位數的有效位數。

如需關於波解X 和電壓ATEXTENSIBLE的詳細資訊,請參閱 Windows DDK 檔。

從 Windows 7 開始, 並已擴充了「IECATEXTENSIBLE 」,以代表透過 IEC 61937 相容介面傳輸編碼音訊的裝置格式。 如需新結構的相關信息,請參閱 代表 IEC 61937 傳輸的格式。

指定裝置格式

下列 WASAPI 方法會使用 打波器XWAVEFORMATEXTENSIBLE 結構來描述數據流格式:

GetMixFormat 方法會擷取音訊引擎用於其內部處理共用模式數據流的數據流格式。 方法一 律會使用 SEMANTICATEXTENSIBLE 結構來指定格式,而不是獨立 的 INSTEADATEX 結構。

IsFormatSupported 方法會指出音訊端點裝置是否支援特定的數據流格式。 呼叫端必須指定數據流格式是否要用於共用模式或獨佔模式。 針對共用模式格式,方法會查詢音訊引擎,以判斷它是否支援指定的格式。 針對獨佔模式格式,方法會查詢設備驅動器。 某些設備驅動器會報告,如果格式是由獨立的VALUEATEX 結構指定,則它們支援1通道或2通道或2通道 PCM格式,但如果它是由VALUEATEXTENSIBLE結構指定,則會拒絕相同的格式。 若要從這些驅動程式取得可靠的結果,獨佔模式應用程式應該針對每一個 1 通道或 2 通道 PCM 格式呼叫 IsFormatSupported 兩次—一個呼叫應該使用獨立的 SEMANTICATEX 結構來指定格式,另一個呼叫應該使用 SEMANTICATEXTENSIBLE 結構來指定相同的格式。

在應用程式使用 GetMixFormat 或 IsFormatSupported 來尋找共用模式或獨佔模式數據流的適當格式之後,應用程式可以呼叫 Initialize 方法,以使用該格式初始化數據流。 嘗試使用與 GetMixFormat 方法取得的混合格式不同之格式來初始化共用模式數據流的應用程式,但通道數目與混合格式的取樣率相同,可能會成功。 呼叫 Initialize 之前,應用程式可以呼叫 IsFormatSupported,以確認 Initialize 將接受格式。

音訊引擎用於其內部處理共用模式數據流的混合格式與音訊端點裝置在共用模式模式中使用的數據流格式密切相關,但不一定與相同。 透過 Windows 多媒體控制面板,Mmsys.cpl,使用者可以選取音訊端點裝置在共用模式中運作時將使用的數據流格式。 步驟如下:

  1. 若要執行Mmsys.cpl,請開啟 [命令提示字元] 視窗,然後輸入下列命令:

    控件mmsys.cpl

    或者,您可以以滑鼠右鍵按下位於任務欄右側的通知區域中的喇叭圖示,然後選取 [播放裝置] 或 [錄製裝置],以執行Mmsys.cpl。

  2. 開啟 [Mmsys.cpl] 視窗之後,請從播放裝置清單或錄製裝置清單中選取裝置,然後按兩下 [ 內容]。

  3. 當屬性窗口開啟時,按兩下 [進階],然後從標示為 [預設格式] 方塊的可用格式清單中選取格式。

例如,假設使用者從播放裝置的可用格式清單中選取下列預設格式:

2 通道,16 位,44100 Hz (CD 品質)

這是裝置後續在共用模式中運作時將使用的格式。 在 Windows Vista 中,音訊引擎會針對共用模式數據流的內部處理,使用此格式稍微修改的版本。 音訊引擎會使用具有相同數目的通道(兩個)和相同取樣率(44100 Hz)的格式,但在處理樣本之前,它會將樣本轉換成浮點數。 音訊引擎會先將輸出混合中的浮點樣本轉換成16位整數,再透過裝置播放。

應用程式可以查詢音訊端點裝置的 PKEY_AudioEngine_DeviceFormat 屬性,以取得用戶為裝置選取的共用模式格式。 如需查詢裝置屬性的相關信息,請參閱 裝置屬性

某些應用程式可能會發現裝置的 PKEY_AudioEngine_DeviceFormat 屬性所指定的格式,是適合在裝置上開啟獨佔模式數據流的格式。 管理獨佔模式數據流的其他應用程式可能會有額外的需求,這些需求會要求與裝置進行複雜的格式交涉。 一般而言,其中一個應用程式會建構適當的格式清單,並在清單開頭使用慣用的格式。 然後,應用程式會反覆呼叫 IsFormatSupported 與清單中的每個後續格式,從清單開頭開始,直到它找到裝置所支援的格式為止。

音訊端點裝置