Salida de audio a múltiples dispositivos de sonido simultáneamente

10

Me gustaría que mi RasPi envíe audio a mi puerto de salida de audio a bordo, y también a mi tarjeta de salida digital (un I2S Hifiberry Digi). Esto debería ser posible con ALSA. Tengo los controladores cargados y puedo enviarlos a ambos dispositivos de sonido individualmente, pero combinarlos simplemente no funciona. Hay varias publicaciones que explican cómo hacer esto, pero no puedo hacer que mi configuración funcione.

El error de aplay:

Playing WAVE 'sin1000_48khz.wav' : Signed 16 bit Little Endian, Rate 48000 Hz, Stereo
ALSA lib pcm_params.c:2162:(snd1_pcm_hw_refine_slave) Slave PCM not usable
aplay: set_params:1059: Broken configuration for this PCM: no configurations available

Salida de "aplay -l"

**** List of PLAYBACK Hardware Devices ****
card 0: sndrpihifiberry [snd_rpi_hifiberry_digi], device 0: HifiBerry Digi HiFi wm8804-spdif-0 []
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 1: ALSA [bcm2835 ALSA], device 0: bcm2835 ALSA [bcm2835 ALSA]
  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 1: ALSA [bcm2835 ALSA], device 1: bcm2835 ALSA [bcm2835 IEC958/HDMI]
  Subdevices: 1/1
  Subdevice #0: subdevice #0

Salida de "aplay -L"

null
   Discard all samples (playback) or generate zero samples (capture)
sysdefault:CARD=sndrpihifiberry
    snd_rpi_hifiberry_digi,
    Default Audio Device
sysdefault:CARD=ALSA
    bcm2835 ALSA, bcm2835 ALSA
    Default Audio Device`

Contenido de /etc/asound.conf

pcm.both {
    type route
    slave.pcm {
        type multi    
        slaves.a.pcm "hw:0,0"
        slaves.b.pcm "hw:1,0"
        slaves.a.channels 2
        slaves.b.channels 2

        bindings.0.slave a
        bindings.0.channel 0    
        bindings.1.slave a
        bindings.1.channel 1

        bindings.2.slave b
        bindings.2.channel 0
        bindings.3.slave b
        bindings.3.channel 1
    }

    ttable.0.0 1
    ttable.1.1 1

    ttable.0.2 1
    ttable.1.3 1
}

ctl.both {
    type hw
    card sndrpihifiberry
    device 0
}

pcm.hifiberry {
    type hw    
    card sndrpihifiberry
    device 0
}

ctl.hifiberry {
    type hw
    card sndrpihifiberry
    device 0
}

pcm.audioout {
    type hw
    card ALSA
    device 0
}

ctl.audioout {
    type hw
    card ALSA
    device 0
}

pcm.!default {
    type plug
    slave {
        pcm both
    }
}

#pcm.!default {    
#    type hw
#    card sndrpihifiberry
#    device 0
#}

ctl.!default {
    type hw
    card sndrpihifiberry
    device 0
}
Christi
fuente
Creo que deberías investigar pulseaudio. Pero podría estar equivocado aquí
Gerben
3
He estudiado pulseaudio. Mi experiencia fue que básicamente no funcionó.
Christi
Después de una investigación más profunda (y un segundo intento con pulseaudio), creo que el problema es que este tipo de característica requiere acceso compartido a la memoria de la tarjeta de sonido y / o soporte de mmap. El controlador RasPi I2S no es compatible con esto. Realmente no puedo confirmar esto, ya que no hay información de depuración particularmente útil ni de ALSA ni de PulseAudio; en general, todo funciona hasta que intentas activar múltiples fuentes de sonido. No estoy seguro de si esto se solucionará en los núcleos RasPi o no, pero tratar de solucionarlo requeriría más tiempo del que estoy dispuesto a invertir.
Christi
Solo puedo sugerirle que intente que pulseaudio funcione , ya que es capaz de hacer exactamente lo que desea hacer (incluida la extensión a otras tarjetas de sonido en la red).
earthmeLon
Como mencioné anteriormente, conseguí que Pulseaudio funcionara. Funciona bien en cada dispositivo individual, y luego falla cuando intenta crear una secuencia a múltiples salidas a la vez. Creo que la falta de asignación de memoria en el controlador RasPi I2S es la culpable, pero una mayor depuración implicaría esencialmente aprender la estructura interna de ALSA y / o Pulseaudio, que no tengo tiempo ni ganas de hacer.
Christi

Respuestas:

1

Es un poco hacky, pero ¿has considerado el teecomando? Lea más sobre StackExchange en la redirección de tee y vea el artículo de Wiki para más ejemplos. Estoy pensando que si tiene un comando que genera el nombre del archivo o el enlace al contenido multimedia, lstal vez, y lo utiliza teepara llamar comandos a su reproductor multimedia preferido. Así es como escribiría el problema ...


#!/bin/bash
MediaPlayer="$1"
MediaOptions1="$2"
MediaOptions2="$3"
InputParcer="ls $4"
${InputParcer} | tee >(${MediaPlayer} ${MediaOptions1}) >(${MediaPlayer} ${MediaOptions2}) || echo 'Exiting baddly'

Notas:

Lo anterior podría estar codificado para tener ciertas opciones para cada bifurcación de salida y la InputParcervariable debe editarse si planea enviar un directorio o enlace web que contenga más de un archivo multimedia. Pero un archivo a la vez esto debería salir a ambos si el MediaOptions1/2 está codificado o configurado en cada ejecución. Es un poco hacky, has sido advertido.

... después de la prueba y tal cosa, probablemente arrojaría if [ ${#} < 4]; then echo "error"; ficerca de la parte superior; editando la 4cantidad de argumentos que he sentido necesita estar allí. Al ejecutarse tal cual, bash scripted_dule_player 'aplay <common_options>' '<options_output1>' '<options_output2>' '</full/file/path/to/mediafile>'asegúrese de modificar para su sistema las opciones y rutas de archivos que desea ejecutar; entre las cosas <>.

Los problemas con el uso teeson que no es muy portátil entre sabores de Linux y puede causar problemas con el audio que no se reproduce en sincronización entre las salidas. En cambio, sugeriría usarlo omxplayer -o bothpara emitir sonido a dos dispositivos separados, pero como esto solo se ha probado en un RPi que tiene HDMI y salida de audio enchufados, no es exactamente la configuración utilizada por el OP y el OP solicitó algo alsa.

También hay un buen blog sobre el tema de alsa configuraciones de múltiples usuarios de tarjetas de sonido que quizás desee consultar; tal vez tenga un error en el suyo que hará que mi código anterior bloquee un punto discutible; solo tenga en cuenta que la guía estaba dirigida a Linux con sabor a Slaker, no a Raspbian.

S0AndS0
fuente