La salida digital de audio en Linux

Términos utilizados al hablar de salidas digitales son:

  • IEC958 – El nombre del estándar IEC y la etiqueta con la que suele aparecer la salida en los mezcladores ALSA.
  • S/PDIF ó SPDIF – De Sony/Philips Digital Interface Format, una especificación para la comunicación de datos digitales de audio.

Cómo está configurado el mezclador afectará a las pruebas a realizar así que compruébalo ahora mismo. Ejecuta alsamixer y comprueba que Playback o All está seleccionado para View, en la parte superior de la pantalla. Busca estos canales y haz lo que se sugiere debajo.

  • Salida IEC958: Pulsa M para quitar el mute.
  • IEC958, IEC958 1 o cualquier canal nombrado de forma similar: Configúralo a «PCM Out».

Al referirse a una salida digital, establecerla como «PCM Out» solicita de la tarjeta que le pase el flujo de audio exactamente tal y como es recibido de la aplicación sin pasar por el mezclador. Esto es importante dado que el punto de tener una salida digital de audio es extraer los datos en crudo del PC y llevarlo a un dispositivo con mejores conversiones de audio. Mucha gente, incluyendo diseñadores de hardware, consideran una salida digital de audio como simplemente una versión libre de ruido de una salida analógica. Sin embargo la interfaz está realmente separada y es unidireccional. Es importante mantener esto en mente al enviar flujos de audio surround AC3 desde la tarjeta a un decodificador externo. En este caso cualquier modificación del flujo lo inutiliza.

ALSA puede mostrar la salida digital al sistema de distintas formas; como dispositivo independiente en una tarjeta de sonido o como alias. Se describe debajo cómo averiguar cómo lo está haciendo.

En la mayor parte de las tarjetas la salida digital es un dispositivo de reproducción de audio específico. Para enumerar todos los que tienes utiliza este comando:

  [jranders@chickadee ~]$ aplay -l
  **** List of PLAYBACK Hardware Devices ****
  card 0: T71Space [Terratec Aureon 7.1-Space], device 0: ICE1724 [ICE1724]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
  card 0: T71Space [Terratec Aureon 7.1-Space], device 1: IEC1724 IEC958 [IEC1724 IEC958]
  Subdevices: 0/1
  Subdevice #0: subdevice #0
  card 0: T71Space [Terratec Aureon 7.1-Space], device 2: ICE1724 Surrounds [ICE1724 Surround PCM]
  Subdevices: 3/3
  Subdevice #0: subdevice #0
  Subdevice #1: subdevice #1
  Subdevice #2: subdevice #2
  

Cada dispositivo se especifica como hw:(tarjeta),(dispositivo). La salida mostrada enumera al dispositivo 1 como «IEC1724 IEC958». Esa es la salida digital en esta tarjeta, así que tendrás que referirte a ella como hw:0,1. Si tu tarjeta no muestra un dispositivo IEC958 busca las etiquetas «S/PDIF» o «digital».

Si aparece un error indicando «invalid arguments» intenta utilizar plughw en vez de hw en los ejemplos.

En otras tarjetas la salida digital es ya —o incluso exclusivamente— definida como un alias. Utiliza aplay -L para obtener los dispositivos de salida disponibles. En un sistema con una tarjeta de sonido incorporada a una placa base nForce 4 y una M-Audio Delta Audiophile 2496, la salida es:

  $ aplay -L
  default:CARD=CK804
  NVidia CK804, NVidia CK804
  Default Audio Device
  front:CARD=CK804,DEV=0
  NVidia CK804, NVidia CK804
  Front speakers
  surround40:CARD=CK804,DEV=0
  NVidia CK804, NVidia CK804
  4.0 Surround output to Front and Rear speakers
  surround41:CARD=CK804,DEV=0
  NVidia CK804, NVidia CK804
  4.1 Surround output to Front, Rear and Subwoofer speakers
  surround50:CARD=CK804,DEV=0
  NVidia CK804, NVidia CK804
  5.0 Surround output to Front, Center and Rear speakers
  surround51:CARD=CK804,DEV=0
  NVidia CK804, NVidia CK804
  5.1 Surround output to Front, Center, Rear and Subwoofer speakers
  null
  Discard all samples (playback) or generate zero samples (capture)
  default:CARD=M2496
  M Audio Audiophile 24/96, ICE1712 multi
  Default Audio Device
  front:CARD=M2496,DEV=0
  M Audio Audiophile 24/96, ICE1712 multi
  Front speakers
  surround40:CARD=M2496,DEV=0
  M Audio Audiophile 24/96, ICE1712 multi
  4.0 Surround output to Front and Rear speakers
  surround41:CARD=M2496,DEV=0
  M Audio Audiophile 24/96, ICE1712 multi
  4.1 Surround output to Front, Rear and Subwoofer speakers
  surround50:CARD=M2496,DEV=0
  M Audio Audiophile 24/96, ICE1712 multi
  5.0 Surround output to Front, Center and Rear speakers
  surround51:CARD=M2496,DEV=0
  M Audio Audiophile 24/96, ICE1712 multi
  5.1 Surround output to Front, Center, Rear and Subwoofer speakers
  iec958:CARD=M2496,DEV=0
  M Audio Audiophile 24/96, ICE1712 multi
  IEC958 (S/PDIF) Digital Audio Output
  

Si ves IEC958 ó S/PDIF en esta lista puedes usar la identificación completa con los parámetros CARD y DEV como dispositivo de salida, en vez de hw:x,y. En este caso M2496 y 0.

Nota importante: La emulación OSS utiliza los dispositivos hw:0,0 y hw:0,1 como /dev/dsp y /dev/adsp. Tenlo en cuenta si utilizas aplicaciones OSS.

Si aún no has encontrado tu dispositivo digital sigue leyendo. De otra forma puedes saltar esta sección.

Un comando más que muestra tus dispositivos ALSA:

  tapas@mango:~$ cat /proc/asound/devices
  1:       : sequencer
  0: [0- 0]: ctl
  8: [0- 0]: raw midi
  18: [0- 2]: digital audio playback
  17: [0- 1]: digital audio playback
  16: [0- 0]: digital audio playback
  24: [0- 0]: digital audio capture
  33:       : timer
  

Aquí puedes ver tres dispositivos de salida de audio:

  18: [0- 2]: digital audio playback
  17: [0- 1]: digital audio playback
  16: [0- 0]: digital audio playback
  

Uno de esos tres será la salida digital. Puedes probar una por una utilizando el comando aplay, o alternativamente alsaplayer o mplayer. Si quieres utilizar aplay para esta prueba debes tener un fichero .wav. Los números entre corchetes son los índices para la tarjeta de sonido x y el dispositivo x en esa tarjeta. Así pues, para reproducir utilizando el primer dispositivo en la primera tarjeta [0 -0] debes usar:

$ aplay -D hw:0,0 file.wav
  

Y para la segunda y la tercera:

  aplay -D hw:0,1 file.wav
  aplay -D hw:0,2 file.wav
  

O bien, con mplayer:

  $ mplayer file.wav -ao alsa:device=hw=0,0
  

Si oyes sonido al ejecutar uno de esos comandos, has encontrado tu salida digital. Si no, comprueba la conexión, el volumen del receptor, y la configuración del mezclador como se explicó arriba.

Para utilizar la salida digital conecta tu tarjeta a algo —p.ej. un equipo de altavoces surround— con un cable digital. Dile al programa que envíe el sonido a hw:x,y o a plughw:x,y donde x es el número de tarjeta e y el número de dispositivo tal y como lo mostró aplay -l. Para mi tarjeta es hw:0,1.

Ejemplos:

  • Para mplayer utiliza -ao alsa:device=plughw=0.1 —es un punto, no una coma—
  • Para XMMS utiliza Preferences > Audio I/O plugins > Output plugin seleccionando ALSA > Configure > Set Audio device como plughw:0,1
  • Para MythTV utiliza Utilities/Setup > Setup > General, en la tercera página escribe ALSA:plughw:0,1 en Audio output device
  • En xine utiliza el tab audio en la configuración donde puedes escribir la salida que deseas como pcm.plughw:0,1 y el Audio driver como ALSA

Si oyes ruidos raros, parecidos a un módem antiguo con hw, utiliza plughw en su lugar. Recuerda esta explicación.

Si nada de esto funciona podría ser debido a un problema en el soporte de la tarjeta o el driver a los formatos de audio o las velocidades de muestra. Este será probablemente el problema si te encuentras errores «invalid arguments». Es un motivo para utilizar el plugin mezclador dmix. Busca las notas sobre tu tarjeta en ALSA modules and Sound cards y atiende a las notas sobre .asoundrc o asound.conf.

Puedes establecer tu dispositivo de salida preferido utilizando .asoundrc o /etc/asound.conf, donde necesitas añadir esto:

pcm.!default {
  type hw
  card 
  device 
}
      

Todo esto te permite de lejos utilizar la salida digital pero no activa Dolby Digital o DTS Passthrough, donde la señal se envía codificada al receptor. Y sin esto, no consigues el surround. Recuerda que no todas las fuentes admiten surround digital, aunque los DVD y las televisiones digitales habitualmente sí.

  • En mplayer utiliza -ac hwac3 o -ac hwdts. No especifiques canales porque la tradición los establece a 2, el valor por defecto. Asegúrate de que channels no aparece en tu fichero de configuración. Para encontrar la pista de audio deseada ejecuta mplayer con -v y busca aid. English Dolby 5.1 suele ser 128, así que puedes ejecutar mplayer -aid 128. Si la pista de audio es DTS utiliza hwdts.
  • En MythTV soporta el audio digital de una TV. En Utilities/Setup > Setup > General, en la tercera página, elige «Enable AC3 to S/PDIF passthrough».
  • En xine, busca el tab audio en Setup y configura la situación de los altavoces en Pass Through y salida 5.1 —ALSA passthrough— hacia tu salida digital ALSA, así pcm.plughw:0,1.

Sobre xine, establecer la salida 5.1 en ALSA passthrough y plug:iec958 me funcionó. Ahora mi receptor AV informa de los modos Dolby/DTS y no sólo de sonido PCM.

Estos parámetros me funcionaron con mi M-Audio Delta Audiophile con el chip IEC1712 para conseguir passthrough en xine. Nótese la sintaxis para especificar la tarjeta, tomada tal cual de aplay -L. La tarjeta ofrece el enlace IEC958 como alias y sólo presenta un dispositivo al sistema. Puedes usar estas líneas en tu fichero ~/.xine/config.

  audio.device.alsa_passthrough_device:iec958:CARD=M2496,DEV=0
  audio.device.alsa_surround40_device:surround40:CARD=M2496,DEV=0
  audio.device.alsa_surround51_device:surround51:CARD=M2496,DEV=0
  audio.output.speaker_arrangement:Pass Through
  

Cuando empieces a ver la película —no durante el menú— tu receptor mostrará que está recibiendo surround digital.

Una buena prueba para comprobar el passthrough perfecto a nivel de bit, digital o S/PDIF, es reproducir unos ficheros wav de ejemplo hacia el decodificador a través de una conexión TOSlink o analógica. El indicador DD o DTS debería iluminarse y todo debería sonar bien. Puedes utilizar aplay para reproducir audio, dado que es lo más sencillo cuando simplemente quieres mandar datos a la tarjeta. Así:

  aplay -D iec958:CARD=M2496,DEV=0 Norrlanda.wav
  

Los parámetros:

  • -D iec958:CARD=M2496,DEV=0 establecen el dispositivo de salida, utilizando el obtenido de aplay -L
  • Los ficheros proporcionados tienen las cabeceras correctas para el flujo de datos. Si obtienes resultados raros con otro material fuente puedes probar -f dat para que utilice una velocidad de muestra de 48 KHz, y un formato de muestra de 16 bits little endian, el habitual en los DVD.

Un método alternativo sería dejar que ffmpeg decodifique el AC3 o DTS y lo envíe por 5.1(6) ó 6.1(7) salidas analógicas separadas a un amplificador o a unos altavoces utilizando tres cables RCA. Al menos con los ficheros sugeridos mplayer parece reconocer adecuadamente el audio codificado en DTS y elegir una librería de decodificación —en mi caso libdca— de forma que la reproducción sea trivial.

  $ mplayer -channels 6 Norrlanda.wav

  Playing Norrlanda.wav.
  Audio file file format detected.
  ==========================================================================
  Opening audio decoder: [libdca] DTS decoding with libdca
  AUDIO: 44100 Hz, 6 ch, s16le, 1411.2 kbit/33.33% (ratio: 176400->529200)
  Selected audio codec: [dts] afm: libdca (DTS-libdca)
  ==========================================================================
  AO: [null] 44100Hz 6ch s16le (2 bytes per sample)
  Video: no video
  Starting playback...
  A:  26.7 (26.7) of 265.0 (04:25.0) 12.8%
  

Visto en Digital Out publicado en ALSA wiki.

¿Te pareció interesante? Sé tan amable de menear este artículo en tuxéame.

Lee también

ac3 alsa Audio audiophile delta digital dolby dts dvd ffmpeg iec958 Linux m-audio mplayer mythtv oss passthrough pcm rca spdif surround wav xine xmms

Bookmark and Share

4 Respuestas to “La salida digital de audio en Linux”

  1. muchas gracias por publicar esta info tan util, un saludo!

  2. A ti por leerla.

  3. hola, bueno.. pues disculpa que te moleste, pero tengo un problema con esto del audio, soy usuario de kubuntu 9.04, tengo una HPPavilion Dv225la, el problema es que al instalar el sonido me sale en las bocinas frontales y en el audifono, ahora no se como hacer para que cuando conecte el audifono el sonido de las bocinas se detenga o se corte. podrias ayudarme?

    llevo ya como 5 dias buscando y esto es lo mas coherente que he leido,
    saludos

  4. No se me ocurre pero sí sospecho que debe depender de que el hardware lo permita y no sólo de los drivers ALSA correspondientes. ¿Por qué no dejas la pregunta en el foro GNU/Linux de Hispasonic y te ayudamos desde allí entre todos?

Deja una Respuesta

El enlace de tu firma no es válido para los buscadores. Cualquier intento por tu parte de hacer spam no tendrá el resultado esperado. Haz un comentario interesante y contribuye a la discusión.