Hintergrund der Nicht-PCM-Unterstützung

Mehrere Probleme verhinderten, dass frühere Versionen von Microsoft Windows Nicht-PCM-Formate über die waveOut- und DirectSound-APIs unterstützen. Diese Probleme und wie sie gelöst wurden, werden im Folgenden erläutert.

waveOut-API

Die Softwareebene, die waveOut-Anwendungen von VxD-Wellentreibern trennt, ist ziemlich dünn. Treiber und Anwendungen, die ein benutzerdefiniertes Wellenformat unterstützen, können Daten in diesem Format streamen, unabhängig davon, ob das Betriebssystem das Format versteht.

In Windows 2000 und Windows 98 erzwingt das WDM-Audioframework jedoch, dass alle Audiodaten, die von der waveOut-API (und dem waveOut-Renderer von DirectShow) verarbeitet werden, über den KMixer-Systemtreiber (Kmixer.sys) übergeben werden, bei dem es sich um den Kernel-Audiomixer handelt. Ein waveOutOpen-Aufruf ist nur erfolgreich, wenn KMixer das Format unterstützt, unabhängig davon, ob der Treiber das Format unterstützt.

KMixer verarbeitet WAVE_FORMAT_PCM auf allen WDM-Betriebssystemen. Windows 2000 und höher und Windows 98 SE erweitern KMixer, um nicht nur WAVE_FORMAT_IEEE_FLOAT, sondern auch WAVEFORMATEXTENSIBLE-Varianten von PCM- und IEEE-float-Formaten zu unterstützen. Da KMixer keine Nicht-PCM-Formate unterstützt, schlägt der Versuch, Nicht-PCM-Daten über KMixer zu übergeben, fehl.

Windows unterstützt Nicht-PCM-Formate, indem es Nicht-PCM-Audiodaten erlaubt, KMixer einfach zu umgehen. Insbesondere fließt waveOut-Nicht-PCM-Daten direkt an PortCls (oder USBAudio), anstatt zuerst KMixer zu durchlaufen. Jede Vermischung von Nicht-PCM-Daten muss in Hardware erfolgen, aber Anwendungen, die Nicht-PCM-Daten in einem Format wie AC-3 oder WMA Pro verwenden, erfordern in der Regel keine Vermischung, und Treiber unterstützen in der Regel keine Hardwaremischung in diesem Format.

DirectSound-API

Bei legacy waveOut-Treibern und VxD-Treibern unterstützt DirectSound WAVEFORMATEX (aber nicht WAVEFORMATEXTENSIBLE) PCM-Formate für primäre und sekundäre Puffer mit 8 oder 16 Bit pro Sample, einem oder zwei Kanälen und einer Abtastrate zwischen 100 Hz und 100 kHz. VxD-Treiber können die formate, die für primäre Puffer zulässig sind, weiter einschränken, wenn die Kooperativebene auf DSSCL_WRITEPRIMARY festgelegt ist (siehe Beschreibung der IDirectSoundBuffer::SetFormat-Methode im DirectX SDK). Diese Einschränkungen haben sich in Windows Me oder Windows XP nicht geändert.

WDM-Treiber können PCM-Formate sowohl im WAVEFORMATEX- als auch im WAVEFORMATEXTENSIBLE-Format unterstützen. Für Windows 2000 und höher, Windows Me und Windows 98 SE können Treiber auch das WAVE_FORMAT_IEEE_FLOAT-Format sowohl für primäre als auch sekundäre DSBCAPS_LOCSOFTWARE Puffer (gemischt von KMixer) in WAVEFORMATEX und WAVEFORMATEXTENSIBLE unterstützen.

Das Aufrufen von SetFormat, um das Datenformat eines primären Puffers anzugeben, wirkt sich nur indirekt auf das endgültige Mischformat aus, das vom Sound Karte ausgewählt wird. Das primäre Pufferobjekt wird zum Abrufen der IDirectSound3DListener-Schnittstelle und zum Festlegen der globalen Lautstärke und schwenkung des Geräts verwendet, stellt jedoch nicht den einzelnen Ausgabedatenstrom aus dem Sound Karte dar. Stattdessen mischt KMixer die primären Pufferdaten, damit mehrere DSSCL_WRITEPRIMARY DirectSound-Clients gleichzeitig ausgeführt werden können.

Unter Windows 2000 und Windows 98 unterstützt DirectSound nur PCM-Daten. (Gleiches gilt für DirectShow, das den Renderer von DirectSound verwendet.) Ein Aufruf von CreateSoundBuffer mit einem Nicht-PCM-Format schlägt immer fehl, auch wenn der Treiber das Format unterstützt. Fehler treten aus zwei Gründen auf. Erstens: Wenn DirectSound einen KS-Pin erstellt, wird automatisch KSDATAFORMAT_SUBTYPE_PCM angegeben, anstatt den Untertyp vom wFormatTag-Member der WAVEFORMATEX-Struktur abzuleiten, der zum Erstellen des IDirectSoundBuffer-Objekts verwendet wird. Zweitens erfordert DirectSound, dass jeder Datenpfad über Volume- und SRC-Knoten (KSNODETYPE_VOLUME und KSNODETYPE_SRC) verfügt, unabhängig davon, ob der Client Schwenk-, Volume- oder Frequenzsteuerungen für den DirectSound-Puffer anfordert. Diese Anforderung wird erfüllt, wenn entweder die Daten KMixer durchlaufen oder das Gerät hardwaregemischt wird. Bei Nicht-PCM-Formaten ist KMixer jedoch nicht im Datenpfad vorhanden, und die Treiber selbst schlagen in der Regel fehl, wenn sie zur Hardwaremischung aufgefordert werden.

Windows XP und höher sowie Windows Me entfernen die Einschränkungen, die DirectSound-Anwendungen an der Verwendung von Nicht-PCM-Formaten gehindert haben. DirectSound 8 (und höhere Versionen) verwendet den richtigen Formatuntertyp und erfordert nicht mehr automatisch Volume- und SRC-Knoten in jedem Datenpfad.