下圖顯示波形音訊串流的資料格式描述元。
如圖所示, KSDATAFORMAT 結構之後的其他格式資訊數量會因資料格式而異。
音訊系統以數種方式使用這種類型的格式描述符:
上圖所示的格式描述元會以呼叫參數的形式傳遞至迷你埠驅動程式的 NewStream 方法 (例如,請參閱 IMiniportWaveCyclic::NewStream) 。
IMiniport::DataRangeIntersection 方法的 ResultantFormat 參數會指向方法寫入格式描述元的緩衝區,如上圖所示。
KSPROPERTY_PIN_DATAINTERSECTION 取得屬性要求會擷取如前圖所示的格式描述符。
KSPROPERTY_PIN_PROPOSEDATAFORMAT 設定屬性要求接受格式描述子,如上圖所示。
類似的格式會用於 KsCreatePin 函式的 Connect 呼叫參數。 此參數指向緩衝區開頭的 KSPIN_CONNECT 結構,該結構也包含格式描述元。 緊接在 KSPIN_CONNECT 結構之後的格式描述元會以 KSDATAFORMAT 結構開頭,如上圖所示。
KSDATAFORMAT 結構之後的格式資訊應該是 WAVEFORMATEXTENSIBLE 結構。 WAVEFORMATEXTENSIBLE 是 WAVEFORMATEX 的擴充版本,可以描述比 WAVEFORMATEX 更廣泛的格式。
WAVEFORMAT 已過時,而且任何版本的 Microsoft Windows 中的 WDM 音訊子系統都不支援。 PCMWAVEFORMAT 結構是 WAVEFORMAT 的擴充版本,也已過時。
四個波形格式結構 (WAVEFORMAT、PCMWAVEFORMAT、WAVEFORMATEX 和 WAVEFORMATEXTENSIBLE) 都以相同的五個成員開頭,以 wFormatTag 開頭。 上圖顯示這四個結構彼此疊加,以醒目提示結構中相同的部分。
WAVEFORMATEXTENSIBLE 通過新增三個成員來擴充 WAVEFORMATEX,首先是 Samples.wValidBitsPerSample。 (Samples 是聯集,其另一個成員 wValidSamplesPerBlock 會針對某些壓縮格式使用,而不是 wValidBitsPerSample 。 wFormatTag 成員緊接在緩衝區中 KSDATAFORMAT 結構結尾之後,會指定 KSDATAFORMAT 之後的格式資訊類型。
與 WAVEFORMATEX 不同,WAVEFORMATEXTENSIBLE 可以執行下列動作:
將每個樣本的位元數與樣本容器的大小分開指定。 例如,20 位元樣本可以左對齊地儲存在三位元組的容器中。 WAVEFORMATEX 無法區分每個樣本的資料位數與樣本容器大小,因此無法明確描述這類格式。
將特定說話者位置指派給多聲道串流中的音訊聲道。 WAVEFORMATEX 缺乏此功能,只能充分支援單聲道和(雙聲道)立體聲串流。
WAVEFORMATEX 的遺留使用
WAVEFORMATEX 所描述的任何格式也可以由 WAVEFORMATEXTENSIBLE 描述。 如需將 WAVEFORMATEX 結構轉換成 WAVEFORMATEXTENSIBLE 的相關資訊,請參閱 在格式標籤和子格式 GUID 之間轉換。
WAVEFORMATEX 足以描述樣本大小為 8 或 16 位的格式,但 WAVEFORMATEXTENSIBLE 必須充分描述樣本精確度大於 16 位的格式。 以下提供兩個範例:
樣本精確度為 24 位元的資料流程可以使用 32 位元容器大小進行有效率的處理,但可以轉換成使用 24 位元容器,以提高儲存體效率,而不會遺失資料。
處理具有 24 位樣本資料的資料流時,僅提供 20 位精確度的渲染裝置可以使用抖動來改善其輸出訊號的忠實度。 然而,抖動需要額外的處理時間,如果原始流的精度僅為 20 位,則無需進行額外的處理。
在這兩個範例中,只有在樣品精度和容器尺寸都已知的情況下,才能保持訊號品質,同時在處理和儲存效率之間做出適當的權衡。
如果 WAVEFORMATEX 或 WAVEFORMATEXTENSIBLE 結構可以明確描述簡單格式,音訊驅動程式可以選擇選取任一結構來描述格式。 不過,音訊驅動程式通常會使用 WAVEFORMATEX 來指定具有 8 位或 16 位樣本的單聲道和 (雙聲道) 立體聲 PCM 格式,而某些較舊的應用程式可能會預期所有音訊驅動程式都使用 WAVEFORMATEX 來指定這些格式。
如果驅動程式支援可明確指定為 WAVEFORMATEX 或 WAVEFORMATEXTENSIBLE 結構的音訊格式,則驅動程式應該辨識格式,而不論用戶端應用程式或元件用來指定結構的兩個結構中的哪一個。 例如,如果音訊裝置支援 44.1 kHz、16 位、立體聲 PCM 格式,則迷你埠驅動程式的 KSPROPERTY_PIN_PROPOSEDATAFORMAT 屬性處理常式及其 NewStream 方法實作應該接受該格式,而不論格式是否指定為 WAVEFORMATEX 或 WAVEFORMATEXTENSIBLE 結構。
為了簡化格式資料的處理,驅動程式通常會使用 WAVEFORMATEXTENSIBLE 結構來在內部表示格式。 此方法可能需要將輸入 WAVEFORMATEX 結構轉換成內部 WAVEFORMATEXTENSIBLE 表示法,或將內部 WAVEFORMATEXTENSIBLE 表示法轉換成輸出 WAVEFORMATEX 結構。
在 WAVEFORMATEXTENSIBLE 中, dwBitsPerSample 是容器大小,而 wValidBitsPerSample 是每個範例的有效數據位數目。 容器一律在記憶體中以位元組對齊方式,而且容器大小必須指定為 8 位的倍數。