Konvertieren zwischen Formattags und Unterformat-GUIDs

Die Richtlinien für die Verarbeitung von Nicht-PCM-WAVE_FORMAT_EXTENSIBLE-Formaten ähneln denen für Nicht-PCM-Formate, die durch Tags im Wellenformat angegeben werden. Insbesondere sollte ein WAVE_FORMAT_EXTENSIBLE-Format für PCM-Formate über eine vom Werk getrennte Pin factory verfügen, und es erfordert einen eigenen Datenbereichs-Schnittmengenhandler.

Das Audioformat für ein WAVE_FORMAT_EXTENSIBLE-Format wird von der GUID im SubFormat-Element der KSDATAFORMAT-Struktur angegeben. Jedes registrierte Wellenformattag verfügt über eine entsprechende Unterformat-GUID, die vom DEFINE_WAVEFORMATEX_GUID Makros in Ksmedia.h generiert wird. Beispielsweise wird die GUID, die dem tag WAVE_FORMAT_DOLBY_AC3_SPDIF entspricht, als DEFINE_WAVEFORMATEX_GUID(WAVE_FORMAT_DOLBY_AC3_SPDIF) definiert.

Dieser Codeausschnitt aus Ksmedia.h zeigt, wie Sie eine neue GUID als autoinitialisierte statische Variable definieren:

#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)

Diese Makros von Ksmedia.h konvertieren zwischen Tags im Wellenformat und den zugehörigen GUIDs:

#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)

Der folgende Beispielcode kombiniert diese Techniken, um eine Unterformat-GUID zu erstellen, die auf dem Wellenformattag WAVE_FORMAT_AC3_SPDIF basiert, das den Wert 0x0092 hat:

#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);
}