# [SONIDO] Decodificar ac3 desde ENTRADA spdif (pend.)

## cmd_

Hola buenas, llevo bastante tiempo mirando el tema este. El caso es que estoy buscando la forma para poder decodificar una señal dolby digital (ac3) de 6 canales que llega a través de una entrada digital (spdif) de la tarjeta de sonido (desde un dvd, consola, etc.).

Dispongo de un conjunto de altavoces 5.1 analógicos pero no de un amplificador-decodificador externo que sea capaz de procesar la señal dolby digital, por eso quiero usar el ordenador como decodificador.

La tarjeta es una Audigy de primera generación con una bahia de 5.25" con entradas/salidas. Esta tarjeta bajo windows es capaz de decodificar los streams ac3 ya que usa su propio decodificador controlado por el driver (y con licencia cerrada claro).

En el caso de linux la tarjeta solo es capaz de procesar streams en formato PCM y limitándose a 2 canales, lo que vendría a ser "estéreo digital", y en el caso de un stream codificado en ac3 pues sencillamente no lo procesa y se oye ruido basura.

He estado mirando en la documentación de ALSA y he visto que existe un plugin para codificar llamado a52encode que se usa para cuando quieres mandar una señal dolby digital a un decodificador externo, pero esto es algo que yo no busco con este post.

Me parece muy extraño que exista un plugin para codificar y no uno para decodificar ni como opción cuando las librerías usadas para ello tienen licencias GPL, las usan todos los reproductores multimedia (mplayer, xine..).

He probado a grabar el stream en bruto con arecord, lo que sería el ruido para probar a ver si con ac3dec, a52dec o algun reproductor multimedia podía decodificarlo, pero no he obtenido resultados. También lo he intentado en tiempo real sin especificar archivos mediante stdin/stdout pero tampoco.

Lo probé así para ver si grababa bien:

```
$arecord -Dplughw:0,0 -t wav -f dat musica.wav

$aplay musica.wav     #Se oie correcto si es un stream PCM, y se oie el ruido si es ac3

$ac3dec -Dsurround51 -6 musica.wav

argh!

Violación de segmento #Esto acaba de petar..

```

Y así:

```
$arecord -Dplughw:0,0 -t raw -f dat | ac3dec -Dsurround51 -6 #Que también peta..
```

Buscando por internet y por este mismo foro me he encontrado con este post: https://forums.gentoo.org/viewtopic-t-611252-highlight-dolby+digital.html En el cual hay un enlace a una lista de correo con una pequeña aplicación que ayuda en el proceso antes mencionado de arecord+ac3dec, pero yo no he obtenido éxito.

Lo que trato de encontrar es un método de decodificación por software, por lo que es válido para cualquier tarjeta, por lo que si alguien podría probarlo le estaría muy agradecido   :Rolling Eyes: 

Gracias.

----------

## esteban_conde

He mirado por si fuera cuestion de "USE" utilizando ufed y he visto un par de ellas, algo como dolby-record-switch y dolbyinrec, pienso que poniendo esas USE en tu make.conf y recompilando el programa que uses para descodificar ac3 a lo mejor suena la flauta.

Si no quieres hacerlo de la forma que te propongo (acierto/error), en buscar de este mismo foro trata de documentarte sobre lo que hacen esas USE a lo mejor se corresponde con lo que esperas.

----------

## cmd_

Hola esteban_conde muchas gracias por mostrar interés en mi problema. He buscado información sobre las USE que comentas y creo que se usan únicamente con media-video/vdr para poder añadir la opción a esta aplicación para que pueda grabar streams desde la salida spdif interna de algunas tarjetas de televisión. El tema es que, creo que esto se usaba en antiguos modelos de algunas tarjetas analógicas ya que ahora todas reciben el audio de manera digital por el mismo medio que el vídeo (son DVB, satelite, TDT, ec.), con lo que no necesitan de ningún puente hasta la tarjeta de sonido, con lo que está en desuso (solo se conserva ya la USE dolbyinrec).

De todas formas media-video/vdr necesita de una tarjeta de TV para poder funcionar y grabar estos stream en ac3, y yo no dispongo de ninguna. También he visto que muchos usuarios pueden grabar pero no reproducir en tiempo real que es lo que a mi me interesa, además lo de grabar la entrada spdif ya lo he conseguido con arecord.

He enviado un nuevo post al hilo de jimyx17 a ver si a él se lo ocurre algo ya que obtuvo éxito con su método. También he indicado cierta información sobre mi tarjeta de sonido que podría ser útil y que también postearé aquí:

Este es mi .asoundrc

```
pcm.doom {   #To remap the swaped sub/center with rear channels for ET:QuakeWars

   slave.pcm surround51

   slave.channels 6

   type route

   ttable.0.0 1

   ttable.1.1 1

   ttable.2.4 1

   ttable.3.5 1

   ttable.4.2 1

   ttable.5.3 1

}
```

Aquí está el arecord --list-devices 

```
# arecord -l

**** List of PLAYBACK Hardware Devices ****

card 0: Audigy [Audigy 1 [SB0090]], device 0: emu10k1 [ADC Capture/Standard PCM Playback]

  Subdevices: 32/32

  Subdevice #0: subdevice #0

  Subdevice #1: subdevice #1

  Subdevice #2: subdevice #2

  Subdevice #3: subdevice #3

  Subdevice #4: subdevice #4

  Subdevice #5: subdevice #5

  Subdevice #6: subdevice #6

  Subdevice #7: subdevice #7

  Subdevice #8: subdevice #8

  Subdevice #9: subdevice #9

  Subdevice #10: subdevice #10

  Subdevice #11: subdevice #11

  Subdevice #12: subdevice #12

  Subdevice #13: subdevice #13

  Subdevice #14: subdevice #14

  Subdevice #15: subdevice #15

  Subdevice #16: subdevice #16

  Subdevice #17: subdevice #17

  Subdevice #18: subdevice #18

  Subdevice #19: subdevice #19

  Subdevice #20: subdevice #20

  Subdevice #21: subdevice #21

  Subdevice #22: subdevice #22

  Subdevice #23: subdevice #23

  Subdevice #24: subdevice #24

  Subdevice #25: subdevice #25

  Subdevice #26: subdevice #26

  Subdevice #27: subdevice #27

  Subdevice #28: subdevice #28

  Subdevice #29: subdevice #29

  Subdevice #30: subdevice #30

  Subdevice #31: subdevice #31

card 0: Audigy [Audigy 1 [SB0090]], device 2: emu10k1 efx [Multichannel Capture/PT Playback]

  Subdevices: 8/8

  Subdevice #0: subdevice #0

  Subdevice #1: subdevice #1

  Subdevice #2: subdevice #2

  Subdevice #3: subdevice #3

  Subdevice #4: subdevice #4

  Subdevice #5: subdevice #5

  Subdevice #6: subdevice #6

  Subdevice #7: subdevice #7

card 0: Audigy [Audigy 1 [SB0090]], device 3: emu10k1 [Multichannel Playback]

  Subdevices: 1/1

  Subdevice #0: subdevice #0

```

También arecord --list-pcms

```
# arecord -L

default:CARD=Audigy

    Audigy 1 [SB0090], ADC Capture/Standard PCM Playback

    Default Audio Device

front:CARD=Audigy,DEV=0

    Audigy 1 [SB0090], ADC Capture/Standard PCM Playback

    Front speakers

rear:CARD=Audigy,DEV=0

    Audigy 1 [SB0090], ADC Capture/Standard PCM Playback

    Rear speakers

center_lfe:CARD=Audigy,DEV=0

    Audigy 1 [SB0090], ADC Capture/Standard PCM Playback

    Center and Subwoofer speakers

surround40:CARD=Audigy,DEV=0

    Audigy 1 [SB0090], ADC Capture/Standard PCM Playback

    4.0 Surround output to Front and Rear speakers

surround41:CARD=Audigy,DEV=0

    Audigy 1 [SB0090], ADC Capture/Standard PCM Playback

    4.1 Surround output to Front, Rear and Subwoofer speakers

surround50:CARD=Audigy,DEV=0

    Audigy 1 [SB0090], ADC Capture/Standard PCM Playback

    5.0 Surround output to Front, Center and Rear speakers

surround51:CARD=Audigy,DEV=0

    Audigy 1 [SB0090], ADC Capture/Standard PCM Playback

    5.1 Surround output to Front, Center, Rear and Subwoofer speakers

iec958:CARD=Audigy,DEV=0

    Audigy 1 [SB0090], ADC Capture/Standard PCM Playback

    IEC958 (S/PDIF) Digital Audio Output

null

    Discard all samples (playback) or generate zero samples (capture)

```

Información de spdif de /proc/asound/card0/spdif-in cuando una señal PCM signal es enviada: 

```
# cat /proc/asound/card0/spdif-in

CD-ROM S/PDIF In

No signal detected.

Optical or Coax S/PDIF In

Professional Mode     : no

Not Audio Data        : no

Copyright             : yes

Emphasis              : none

Mode                  : 0

Category Code         : 0x4

Generation Status     : copy

Source Mask           : 0

Channel Number        : unspec

Sample Rate           : 48000Hz

Clock Accuracy        : 1000ppm

S/PDIF Valid          : on

S/PDIF Locked         : on

Rate Locked           : on

Estimated Sample Rate : 47998

```

Información de spdif de /proc/asound/card0/spdif-in cuando una señal Dolby Digital 5.1 es enviada: 

```
# cat /proc/asound/card0/spdif-in

CD-ROM S/PDIF In

No signal detected.

Optical or Coax S/PDIF In

Professional Mode     : no

Not Audio Data        : yes

Copyright             : yes

Emphasis              : none

Mode                  : 0

Category Code         : 0x4

Generation Status     : copy

Source Mask           : 0

Channel Number        : unspec

Sample Rate           : 48000Hz

Clock Accuracy        : 1000ppm

S/PDIF Valid          : off

S/PDIF Locked         : on

Rate Locked           : on

Estimated Sample Rate : 47998

```

Listado de /proc/asound/card0/

```
# ls /proc/asound/card0/

codec97#0  emu10k1  fx8010_acode  fx8010_code  fx8010_gpr  fx8010_tram_addr  fx8010_tram_data  id  midi0  midi1  midi2  midi3  oss_mixer  pcm0c  pcm0p  pcm1c  pcm2c  pcm2p  pcm3p  spdif-in  voices  wavetableD1

```

Gracias de nuevo   :Wink: 

----------

## gringo

no tengo ni idea de estas cosillas y no entiendo ni la mitad de los términos que mencionas, con que pueda escuchar música en mi ordenador me doy por contento  :Razz: 

Así que sólo comento dos cosas por si te sirven para algo, perdón de antemano si estoy diciendo alguna tontería  :

- tengo entendido que el driver OSS tiene mejor soporte para cosas específicas como lo que comentas. Quizás te interese echarle un vistazo, no vaya a ser que el driver OSS si sea capaz de decodificar un stream ac3.

- le has echado un vistazo a pulseaudio ? Igual este software te permite manejarlo o indentificarlo todo de una manera mas fácil ya que está pensado para casos como el tuyo por lo que he leído.

suerte y saluetes !

----------

## cmd_

Uhm, instalar OSS4 en gentoo parece un poco pesado, no hay paquetes oficiales, hay que tirar de un overlay y claro, también tendría que desactivar ALSA para que OSS4 tuviese acceso sin conflictos al hardware.. he pensado probarlo con un live-cd pero no he encontrado ninguno que traiga oss4 de serie.

En cuanto a PulseAudio no es mas que un servidor de sonido mas avanzado que esd o arts, permite controlar el volumen por aplicación, usar módulos para añadir funciones, conectividad con otros servidores de sonido, para encaminarlo por red y poder escuchar el sonido de otros pc's.. pero a nivel de capturar para luego modificar también lo tengo con ALSA.

Con todo tipo de servidores de sonido cuando se habla de plugin a52 (AC3) siempre es para codificación, nunca para decodificación. Será el tema de las licencias, que los laboratorios Dolby deben cobrar royalties por cada aparato/software decodificador. A los que venden reproductores se lo cobrarán mediante el chip que montan, los fabricantes de tarjetas de sonido tendrán la licencia mediante software (aunque solo sea una clave para habilitar la decodificación por hardware), y en el caso de los reproductores de pago todos tienen la característica de poder decodificar dichos stream.

Pero yo sigo sin entender una cosa, si existen librerias como liba52, estas están bajo licencia GPL y se están usando con streams contenidos en discos dvd desde hace años.. Porque no existen plug-in para alsa, oss, pulseaudio, jack, lo que sea que sean capaces de usar esta librería en tiempo real?

En EEUU sé que hay controversia acerca de ciertas librerias para multimedia como p.ej libdvdcs, que por eso te piden aceptación antes de ser instalados y que no vienen de serie con muchas distribuciones por ese motivo. Pero yo no vivo en eeuu...

Otra cosa mas, yo cuando compré esta tarejta de sonido en su precio también pagué una licencia a los laboratorios Dolby mediante el fabricante de la misma para poder decodificar estos stream no? en este caso solo se aplicaría si uso su software o si uso el hardware? y si es a nivel de software porque no se me proporciona una clave o algún método mediante firmware o algo para que yo pueda disponer de lo que he pagado?

En fin, creo que me voy a volver loco, voy a seguir intentando el primer método, el de capturar datos y decodificarlos con el software ya dispnible, aunque no debe ser lo mejor a nivel de latencias   :Confused: 

----------

