在格式標記與子格式 GUID 之間轉換
處理非 PCM WAVE_FORMAT_EXTENSIBLE格式的指導方針與波浪格式標籤所指定的非 PCM 格式類似。 具體來說,WAVE_FORMAT_EXTENSIBLE格式應該有與 PCM 格式的處理站分開的針腳處理站,而且需要自己的資料範圍交集處理常式。
WAVE_FORMAT_EXTENSIBLE格式的音訊格式是由KSDATAFORMAT結構的SubFormat成員中的 GUID 所指定。 每個已註冊的波浪格式標籤都有對應的子格式 GUID,這是由 Ksmedia.h 中的 DEFINE_WAVEFORMATEX_GUID 宏所產生。 例如,對應至WAVE_FORMAT_DOLBY_AC3_SPDIF標記的 GUID 會定義為DEFINE_WAVEFORMATEX_GUID (WAVE_FORMAT_DOLBY_AC3_SPDIF) 。
Ksmedia.h 的這個程式碼片段示範如何將新的 GUID 定義為自動初始化靜態變數:
#define STATIC_KSDATAFORMAT_SUBTYPE_WAVEFORMATEX \
0x00000000L, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71
DEFINE_GUIDSTRUCT("00000000-0000-0010-8000-00aa00389b71", KSDATAFORMAT_SUBTYPE_WAVEFORMATEX);
#define KSDATAFORMAT_SUBTYPE_WAVEFORMATEX DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_WAVEFORMATEX)
來自 Ksmedia.h 的這些宏會在波浪格式標記與其相關聯的 GUID 之間轉換:
#if !defined( DEFINE_WAVEFORMATEX_GUID )
#define DEFINE_WAVEFORMATEX_GUID(x) \
(USHORT)(x), 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71
#endif
#define INIT_WAVEFORMATEX_GUID(Guid, x) \
{ \
*(Guid) = KSDATAFORMAT_SUBTYPE_WAVEFORMATEX; \
(Guid)->Data1 = (USHORT)(x); \
}
#define IS_VALID_WAVEFORMATEX_GUID(Guid) \
(!memcmp(((PUSHORT)&KSDATAFORMAT_SUBTYPE_WAVEFORMATEX) + 1, \
((PUSHORT)(Guid)) + 1, sizeof(GUID) - sizeof(USHORT)))
#define EXTRACT_WAVEFORMATEX_ID(Guid)(USHORT)((Guid)->Data1)
下列範例程式碼結合這些技術來建立以波浪格式標籤WAVE_FORMAT_AC3_SPDIF為基礎的子格式 GUID,其值為 0x0092:
#define STATIC_KSDATAFORMAT_SUBTYPE_DOLBY_AC3_SPDIF \
DEFINE_WAVEFORMATEX_GUID(WAVE_FORMAT_DOLBY_AC3_SPDIF)
DEFINE_GUIDSTRUCT("00000092-0000-0010-8000-00aa00389b71",
KSDATAFORMAT_SUBTYPE_DOLBY_AC3_SPDIF);
#define KSDATAFORMAT_SUBTYPE_DOLBY_AC3_SPDIF \
DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_DOLBY_AC3_SPDIF)
...
INIT_WAVEFORMATEX_GUID(pMyGuid,myWaveFormatTag);
...
if (IS_VALID_WAVEFORMATEX_GUID(aWaveFormatExGuidPtr)) {
aWaveFormatTag = EXTRACT_WAVEFORMATEX_ID(aWaveFormatExGuidPtr);
}
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應