Problema
El S/PDIF óptico transporta solo dos canales de PCM, así que enviar 5.1 requiere comprimir el audio a AC-3. Windows no lo hace por software, y las placas que lo resuelven por hardware son minoría: en el resto, cualquier programa que reproduzca 5.1 termina mezclado a estéreo al elegir la salida digital.
Contexto y restricciones
El proyecto cubre desde un driver de modo kernel hasta una aplicación de escritorio, sobre hardware de audio real y una salida digital conectada a un receiver.
Arquitectura
Un driver KMDF/ACX expone un endpoint de reproducción 5.1 que Windows materializa como un dispositivo más; el driver descarta las muestras y existe únicamente para que ese endpoint sea real, ya que no puede crearse desde una aplicación. La mezcla se captura después en user mode con WASAPI loopback, se aplica ganancia por canal, se codifica a AC-3 con FFmpeg, se enmarca como IEC 61937 y se entrega al dispositivo digital en modo exclusivo.
Decisiones clave de ingeniería
- Mantener el driver como un sumidero sin procesamiento y capturar el audio en user mode, dejando la lógica de riesgo fuera del kernel.
- Elegir el dispositivo de salida sondeando cuáles aceptan un portador IEC 61937 AC-3, en lugar de confiar en el orden de enumeración.
- Registrar cada estado del ciclo de vida del driver en el registro de Windows, porque la salida de depuración del kernel no es utilizable en ejecuciones desatendidas.
Desafíos
- El endpoint se enumeraba correctamente pero no podía abrirse en modo compartido hasta implementar el stream de tiempo real y declarar el soporte de notificaciones de buffer.
- Sostener un reloj de presentación estable en el driver sin bloquear el camino de tiempo real.
Enfoque de desarrollo
El desarrollo separó el driver, el motor de puente reutilizable y la interfaz, de modo que la aplicación de escritorio y la versión de línea de comandos comparten un único motor.
Validación y pruebas
El repositorio incluye pruebas unitarias y cuatro compuertas de verificación en tiempo de ejecución contra el driver instalado: estado del dispositivo, contrato del endpoint, reproducción real de seis canales y captura por loopback comparando la energía por canal contra amplitudes conocidas. También hay una prueba de remoción del dispositivo durante la reproducción. No se publican mediciones de latencia extremo a extremo.
Resultado
El resultado es una cadena funcional entre software que reproduce 5.1 y un receiver conectado por óptico, publicada como código abierto. El driver está firmado con un certificado de prueba, por lo que requiere el modo de prueba de Windows.
Tecnologías
- C++
- Windows Driver Kit
- KMDF
- ACX
- WASAPI
- FFmpeg
- IEC 61937
- Win32
- CMake