Background del supporto non PCM

Diversi problemi impediscono alle versioni precedenti di Microsoft Windows di supportare formati non PCM tramite le API waveOut e DirectSound. Questi problemi e come sono stati risolti sono illustrati di seguito.

API waveOut

Il livello software che separa le applicazioni waveOut dai driver di onda VxD è abbastanza sottile. I driver e le applicazioni che supportano un formato di onda personalizzato possono trasmettere i dati in tale formato indipendentemente dal fatto che il sistema operativo comprenda il formato.

Tuttavia, in Windows 2000 e Windows 98 il framework audio WDM forza tutti i dati audio elaborati dall'API waveOut (e il renderer waveOut di DirectShow) per passare il driver di sistema KMixer (Kmixer.sys), ovvero il mixer audio del kernel. Una chiamata waveOutOpen ha esito positivo solo se KMixer supporta il formato, indipendentemente dal fatto che il driver supporti il formato.

KMixer gestisce WAVE_FORMAT_PCM in tutti i sistemi operativi WDM. Windows 2000 e versioni successive e Windows 98 SE, estendere KMixer per supportare non solo WAVE_FORMAT_IEEE_FLOAT ma anche varianti WAVEFORMATEXTENSIBLE di formati PCM e IEEE-float. Poiché KMixer non supporta formati non PCM, un tentativo di passare dati non PCM tramite KMixer ha esito negativo.

Windows supporta formati non PCM consentendo ai dati audio non PCM di ignorare semplicemente KMixer. In particolare, i flussi di dati waveOut non PCM direttamente a PortCls (o USBAudio) anziché passare prima tramite KMixer. Qualsiasi combinazione di dati non PCM deve essere eseguita nell'hardware, ma le applicazioni che usano dati non PCM in un formato come AC-3 o WMA Pro in genere non richiedono la combinazione e i driver non supportano in genere la combinazione di hardware in tale formato.

DirectSound API

Nei driver waveOut legacy e nei driver VxD, DirectSound supporta i formati WAVEFORMATEX (ma non WAVEFORMATEXTENSIBLE) per buffer primari e secondari, con 8 o 16 bit per campione, una o due canali e una frequenza di campionamento compresa tra 100 Hz e 100 kHz. I driver VxD possono limitare ulteriormente i formati consentiti per i buffer primari quando il livello cooperativo è impostato su DSSCL_WRITEPRIMARY (vedere la descrizione del metodo IDirectSoundBuffer::SetFormat in DirectX SDK). Queste limitazioni non sono state modificate in Windows Me o Windows XP.

I driver WDM possono supportare formati PCM sia in formato WAVEFORMATEX che WAVEFORMATEXTENSIBLE. Per Windows 2000 e versioni successive, Windows Me e Windows 98 SE, i driver possono supportare anche il formato di WAVE_FORMAT_IEEE_FLOAT per i buffer di DSBCAPS_LOCSOFTWARE primari e secondari (misti da KMixer) sia in formato WAVEFORMATEX CHE WAVEFORMATEXTENSIBLE.

La chiamata a SetFormat per specificare il formato dati di un buffer primario ha solo un effetto indiretto sul formato di combinazione finale scelto dalla scheda audio. L'oggetto buffer primario viene usato per ottenere l'interfaccia IDirectSound3DListener e per impostare il volume globale e la panoramica del dispositivo, ma non rappresenta il flusso di output singolo dalla scheda audio. KMixer combina invece i dati del buffer primario per consentire a diversi client DirectSound di DSSCL_WRITEPRIMARY di eseguire simultaneamente.

In Windows 2000 e Windows 98 DirectSound supporta solo i dati PCM. (Lo stesso vale per DirectShow, che usa il renderer di DirectSound). Una chiamata a CreateSoundBuffer con un formato non PCM ha sempre esito negativo, anche se il driver supporta il formato. L'errore si verifica per due motivi. Prima di tutto, ogni volta che DirectSound crea un pin KS, specifica automaticamente KSDATAFORMAT_SUBTYPE_PCM anziché derivare il sottotipo dal membro wFormatTag della struttura WAVEFORMATEX usata per creare l'oggetto IDirectSoundBuffer . In secondo luogo, DirectSound richiede che ogni percorso dati disponga di nodi volume e SRC (conversione a frequenza di esempio) (KSNODETYPE_VOLUME e KSNODETYPE_SRC), indipendentemente dal fatto che i controlli di panoramica, volume o frequenza del client nel buffer DirectSound. Questo requisito viene soddisfatto se i dati passano tramite KMixer o il dispositivo esegue la combinazione hardware. Per i formati non PCM, tuttavia, KMixer non è presente nel percorso dei dati e i driver stessi non riescono quando viene richiesto di eseguire la combinazione hardware.

Windows XP e versioni successive e Windows Me, rimuovere le limitazioni che impedivano alle applicazioni DirectSound di usare formati non PCM. DirectSound 8 (e versioni successive) usa il sottotipo di formato corretto e non richiede più i nodi volume e SRC in ogni percorso dati.