Angeben von AC-3-Datenbereichen
Die Headerdatei Mmreg.h definiert den Wert 0x0092 als Wave-Format-Tag für AC-3-over-S/PDIF:
#define WAVE_FORMAT_DOLBY_AC3_SPDIF 0x0092
Tags im Wellenformat 0x0240 und 0x0241 stehen für 0x0092, und viele DVD-Anwendungen behandeln die drei Tags als identisch. Um Redundanz zu vermeiden, sollten Treiber und Anwendungen jedoch nur Tag-0x0092 unterstützen (und keine Tags 0x0240 und 0x0241 unterstützen).
Die entsprechende Format-Subtype-GUID kann mithilfe des DEFINE_WAVEFORMATEX_GUID Makros aus der Headerdatei Ksmedia.h wie folgt als Wave-Format-Tag angegeben werden:
#define KSDATAFORMAT_SUBTYPE_AC3_SPDIF \
DEFINE_WAVEFORMATEX_GUID(WAVE_FORMAT_DOLBY_AC3_SPDIF)
Das folgende Codebeispiel zeigt, wie ein WaveCyclic- oder WavePci-Miniporttreiber die KSDATARANGE_AUDIO Tabelleneinträge für einen Pin angeben kann, der das AC-3-over-S/PDIF-Format unterstützt:
static KSDATARANGE_AUDIO PinDataRangesAC3Stream[] =
{
// 48-kHz AC-3 over S/PDIF
{
{
sizeof(KSDATARANGE_AUDIO),
0,
0,
0,
STATICGUIDOF(KSDATAFORMAT_TYPE_AUDIO),
STATICGUIDOF(KSDATAFORMAT_SUBTYPE_DOLBY_AC3_SPDIF),
STATICGUIDOF(KSDATAFORMAT_SPECIFIER_WAVEFORMATEX)
},
2, // Max number of channels
16, // Minimum number of bits per sample
16, // Maximum number of bits per channel
48000, // Minimum rate
48000 // Maximum rate
},
// If you do not include this second data range (which is identical
// to the first except for the value KSDATAFORMAT_SPECIFIER_DSOUND),
// then your non-PCM pin is not seen by DirectSound on Windows 98 SE
// or Windows 2000, regardless of the DirectX version or whether a
// hotfix or service pack is installed.
{
{
sizeof(KSDATARANGE_AUDIO),
0,
0,
0,
STATICGUIDOF(KSDATAFORMAT_TYPE_AUDIO),
STATICGUIDOF(KSDATAFORMAT_SUBTYPE_DOLBY_AC3_SPDIF),
STATICGUIDOF(KSDATAFORMAT_SPECIFIER_DSOUND)
},
2, // Max number of channels
16, // Minimum number of bits per sample
16, // Maximum number of bits per channel
48000, // Minimum rate
48000 // Maximum rate
}
};
Der zweite Datenbereichseintrag in der vorherigen Tabelle ist erforderlich, damit DirectSound das Nicht-PCM AC-3-over-S/PDIF-Format in Windows 2000 SP2 und in Microsoft Windows 98 SE + Hotfix verarbeiten kann.
Für jeden Datenbereich, den der Miniporttreiber mit KSDATAFORMAT_SPECIFIER_WAVEFORMATEX angibt, fügt der Porttreiber automatisch einen zweiten Datenbereich hinzu, der mit KSDATAFORMAT_SPECIFIER_DSOUND angegeben wird, ansonsten aber mit dem ersten identisch ist. (Sie können dies überprüfen, indem Sie das KsStudio-Hilfsprogramm verwenden, um die Liste der Datenbereiche anzuzeigen.) In Windows 2000 und Windows 98 erstellt der Porttreiber KSDATAFORMAT_SPECIFIER_DSOUND Versionen von Datenbereichen nur für KSDATAFORMAT_SUBTYPE_PCM Formate, da DirectSound-Versionen vor DirectSound 8 nur PCM unterstützen. Diese Einschränkung wird in Windows XP und höher und in Windows Me entfernt. Es wird jedoch nicht in Windows 2000 SP2 oder im Hot-Fix-Paket für Windows 98 SE entfernt, und um Nicht-PCM in DirectSound in diesen Windows-Versionen zu unterstützen, sollte ein Treiber explizit zwei Datenbereiche für jedes Nicht-PCM-Datenformat auflisten: einer mit KSDATAFORMAT_SPECIFIER_WAVEFORMATEX und ein anderer mit KSDATAFORMAT_SPECIFIER_DSOUND.
Wie in S/PDIF Pass-Through Übertragung von Nicht-PCM-Streams erläutert, verwenden die beiden AC-3-über-S/PDIF-Datenbereiche die folgenden PCM-Parameter: zwei Kanäle und 16 Bit pro Kanal.