Alsa duplica el sonido del altavoz a HDMI

Alsa duplica el sonido del altavoz a HDMI

Estoy buscando ayuda o consejo para configurar mi audio en mi máquina Linux.

Me gustaría duplicar el audio que sale del altavoz a la salida hdmi.

Por favor vea la configuración que tengo:

aplay -l
**** List of PLAYBACK Hardware Devices ****
card 0: HDMI [HDA ATI HDMI], device 3: Generic Digital [Generic Digital]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 1: Generic [HD-Audio Generic], device 0: ALC662 rev3 Analog [ALC662 rev3 Analog]
  Subdevices: 0/1
  Subdevice #0: subdevice #0
card 1: Generic [HD-Audio Generic], device 1: ALC662 rev3 Digital [ALC662 rev3 Digital]
  Subdevices: 1/1
  Subdevice #0: subdevice #0

# aplay -L
null
    Discard all samples (playback) or generate zero samples (capture)
hdmi:CARD=HDMI,DEV=0
    HDA ATI HDMI, Generic Digital
    HDMI Audio Output
sysdefault:CARD=Generic
    HD-Audio Generic, ALC662 rev3 Analog
    Default Audio Device
front:CARD=Generic,DEV=0
    HD-Audio Generic, ALC662 rev3 Analog
    Front speakers
surround21:CARD=Generic,DEV=0
    HD-Audio Generic, ALC662 rev3 Analog
    2.1 Surround output to Front and Subwoofer speakers
surround40:CARD=Generic,DEV=0
    HD-Audio Generic, ALC662 rev3 Analog
    4.0 Surround output to Front and Rear speakers
surround41:CARD=Generic,DEV=0
    HD-Audio Generic, ALC662 rev3 Analog
    4.1 Surround output to Front, Rear and Subwoofer speakers
surround50:CARD=Generic,DEV=0
    HD-Audio Generic, ALC662 rev3 Analog
    5.0 Surround output to Front, Center and Rear speakers
surround51:CARD=Generic,DEV=0
    HD-Audio Generic, ALC662 rev3 Analog
    5.1 Surround output to Front, Center, Rear and Subwoofer speakers
surround71:CARD=Generic,DEV=0
    HD-Audio Generic, ALC662 rev3 Analog
    7.1 Surround output to Front, Center, Side, Rear and Woofer speakers
iec958:CARD=Generic,DEV=0
    HD-Audio Generic, ALC662 rev3 Digital
    IEC958 (S/PDIF) Digital Audio Output

y el

asound.conf

pcm.!default{
 type plug
 slave.pcm "speakerphat"
}

ctl.!default {
 type hw card 1
}

pcm.speakerphat {
  type softvol
  slave.pcm "plughw:1"
  control.name "Master"
  control.card 1
}

El sonido ha sido habilitado por para los parlantes:

amixer -q sset 'Master' unmute
amixer -q sset 'IEC958' unmute

Respuesta1

Esta respuesta se presenta como una posible respuesta funcional en el contexto de un sistema de sonido exclusivo de alsa.
Todos los fragmentos de código a partir de ahora deben encatenarse y reemplazar las definiciones existentes de asound.conf.
Todo esto podría acortarse mucho mediante definiciones en cascada. sin embargo, elmagiaSería más difícil de entender y la depuración aún más… ;-)


Comencemos a definir el convertidor de velocidad que se utilizará en caso de que sea necesario remuestreo (dmix remuestrea cuando sea necesario)

defaults.pcm.rate_converter "speexrate_best"

Luego, defina principalmente alias para los dispositivos.sin bloqueopermitiendo que varias aplicaciones abran el dispositivo asociado simultáneamente.

pcm.ALC662{
        type hw
        card Generic
        device 1
        subdevice 0
        nonblock true}
ctl.ALC662{
        type hw
        card Generic}
pcm.ATI{
        type hw
        card HDMI
        device 0
        subdevice 0
        nonblock true}
ctl.ATI{
        type hw
        card HDMI}

Procedamos ahora conmezcladefinición de complemento (que permite mezclar múltiples fuentes de sonido y remuestreo cuando sea necesario). Uno para cada dispositivo de salida de sonido.
Nota laclave_ipc(identificador de memoria compartida). Elija cualquier número único. (verifique el primer disparo sudo ipcs -ma)
También tenga en cuenta que aún está documentado según sea necesario, ahora me doy cuenta en mi sistema de que especificar ipc_key es simplemente inútil. ¿Probablemente alguna actualización que eliminó el uso de ipcs tipo sysV detrás de mi espalda…?
También siéntete libre de adaptarte.tamaño_período&tamaño del búferde acuerdo con sus requisitos de latencia y capacidades del sistema...

pcm.analog {
    type dmix
    ipc_key 219345
    slave{
        pcm ALC662
        format S32_LE
        period_size 1024
        buffer_size 4096 }}

pcm.hdmi {
    type dmix
    ipc_key 219346
    slave{
        pcm ATI
        format S32_LE
        period_size 1024
        buffer_size 4096 }}

Ahora viene elmagia: Combinación de múltiples transmisiones (estéreo vg 2 canales) en una (estéreo vg 2 canales) gracias amultienchufar :

pcm.analogHDMI {
    type multi
    slaves.a.pcm "analog"
    slaves.a.channels 2
    slaves.b.pcm "hdmi"
    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}

Eso es todo ? Mmmm bueno… todavía no:

Tenga en cuenta que el pcm resultante no está en formato intercalado sino en formato "complejo". Por lo tanto, no es accesible para aplicaciones que solo pueden manejar el formato intercalado (o no intercalado). En tal caso, envuelva este PCM con un complemento de ruta o complemento.

WILCO, vamosrutacanales (volumen fuente.destino):

pcm.2in1 {
    type route
    slave.pcm "analogHDMI"   
    ttable.0.0 1
    ttable.1.1 1
    ttable.0.2 1
    ttable.1.3 1}

Por supuesto, si desea que esta sea la salida predeterminada de Alsa, deberá agregar:

pcm.!default {
    type plug
    slave.pcm "2in1"}

Para másreferencia.

información relacionada