Fondo de la compatibilidad con no PCM
Varios problemas impedían que las versiones anteriores de Microsoft Windows admitan formatos que no son PCM a través de las API waveOut y DirectSound. A continuación se describen estos problemas y cómo se han resuelto.
waveOut API
La capa de software que separa las aplicaciones waveOut de los controladores de onda de VxD es bastante delgada. Los controladores y las aplicaciones que admiten un formato de onda personalizado pueden transmitir datos en ese formato independientemente de si el sistema operativo entiende el formato.
Sin embargo, en Windows 2000 y Windows 98, el marco de audio WDM obliga a todos los datos de audio procesados por la API waveOut (y el representador waveOut de DirectShow) para pasar por el controlador del sistema KMixer (Kmixer.sys), que es el mezclador de audio kernel. Una llamada waveOutOpen solo se realiza correctamente si KMixer admite el formato, independientemente de si el controlador admite el formato.
KMixer controla WAVE_FORMAT_PCM en todos los sistemas operativos WDM. Windows 2000 y versiones posteriores, y Windows 98 SE, amplíaN KMixer para admitir no solo WAVE_FORMAT_IEEE_FLOAT sino también variantes WAVEFORMATEXTENSIBLE de formatos PCM y IEEE-float. Dado que KMixer no admite ningún formato PCM, se produce un error al intentar pasar datos que no son PCM a través de KMixer.
Windows admite formatos que no son PCM al permitir que los datos de audio que no son PCM simplemente omitan KMixer. En concreto, los datos de waveOut que no son PCM fluyen directamente a PortCls (o USBAudio) en lugar de pasar primero a través de KMixer. Cualquier combinación de datos que no sean PCM debe realizarse en hardware, pero las aplicaciones que usan datos que no son PCM en un formato como AC-3 o WMA Pro normalmente no requieren mezcla y los controladores normalmente no admiten la combinación de hardware en ese formato.
DirectSound API
En los controladores waveOut heredados y los controladores VxD, DirectSound admite formatos PCM WAVEFORMATEX (pero no WAVEFORMATEXTENSIBLE) para búferes primarios y secundarios, con 8 o 16 bits por muestra, uno o dos canales, y una frecuencia de muestreo entre 100 Hz y 100 kHz. Los controladores VxD pueden limitar aún más los formatos permitidos para los búferes principales cuando el nivel cooperativo se establece en DSSCL_WRITEPRIMARY (consulte la descripción del método IDirectSoundBuffer::SetFormat en el SDK de DirectX). Estas limitaciones no han cambiado en Windows Me o Windows XP.
Los controladores WDM pueden admitir formatos PCM en formato WAVEFORMATEX y WAVEFORMATEXTENSIBLE. Para Windows 2000 y versiones posteriores, Windows Me y Windows 98 SE, los controladores también pueden admitir el formato de WAVE_FORMAT_IEEE_FLOAT para los búferes de DSBCAPS_LOCSOFTWARE principal y secundario (mixtos por KMixer) en formato WAVEFORMATEX y WAVEFORMATEXTENSIBLE.
Llamar a SetFormat para especificar el formato de datos de un búfer principal solo tiene un efecto indirecto en el formato de mezcla final elegido por la tarjeta de sonido. El objeto de búfer principal se usa para obtener la interfaz IDirectSound3DListener y para establecer el volumen global y el movimiento panorámico del dispositivo, pero no representa la secuencia de salida única de la tarjeta de sonido. En su lugar, KMixer mezcla los datos del búfer principal para permitir que varios clientes de DirectSound DSSCL_WRITEPRIMARY se ejecuten simultáneamente.
En Windows 2000 y Windows 98, DirectSound solo admite datos pcM. (Lo mismo sucede con DirectShow, que usa el representador de DirectSound). Siempre se produce un error en una llamada a CreateSoundBuffer con un formato que no sea PCM, incluso si el controlador admite el formato. El error se produce por dos motivos. En primer lugar, cada vez que DirectSound crea un pin KS, especifica automáticamente KSDATAFORMAT_SUBTYPE_PCM en lugar de derivar el subtipo del miembro wFormatTag de la estructura WAVEFORMATEX que se usa para crear el objeto IDirectSoundBuffer . En segundo lugar, DirectSound requiere que todas las rutas de acceso de datos tengan nodos de volumen y SRC (conversión de velocidad de muestreo) (KSNODETYPE_VOLUME y KSNODETYPE_SRC), independientemente de si el cliente solicita controles panorámicos, de volumen o de frecuencia en el búfer de DirectSound. Este requisito se cumple si los datos pasan a través de KMixer o el dispositivo realiza la mezcla de hardware. Sin embargo, en el caso de los formatos que no son PCM, KMixer no está presente en la ruta de acceso de datos y los propios controladores suelen producir un error cuando se le pide que realice la combinación de hardware.
Windows XP y versiones posteriores, y Windows Me, quitan las limitaciones que impedían que las aplicaciones de DirectSound usaran formatos que no son PCM. DirectSound 8 (y versiones posteriores) usa el subtipo de formato correcto y ya no requiere automáticamente nodos de volumen y SRC en cada ruta de acceso de datos.