Como posso usar o ALSA dmix e vários plugins juntos?

5

Estou jogando com o um visualizador de som do console que deseja que seu próprio dispositivo ALSA ouça. Estou editando ~/.asoundrc . Eu sei que precisarei do multi plug-in para dividir os dados de som em dispositivos separados. No entanto, minha placa de som não tem mixagem de hardware, então eu também precisarei de um plugin dmix em algum lugar, para mixagem de software.

Se eu tentar adicionar um multi como escravo do dmix , obtenho esse erro (line-wrapped) :

ALSA lib pcm_direct.c:1525:(_snd_pcm_direct_get_slave_ipc_offset)
Invalid type 'multi' for slave PCM

Eu tentei criar um "intermediário fictício" plug com o multi como escravo e apontando o dmix para esse , mas ainda assim recebo o mesmo erro. Parece que dmix quer que toda a cadeia de coisas seja plug ou hw

Se eu tentar adicionar um módulo dmix como um escravo de um multi , obtenho

Device or resource busy

Como seria de esperar quando a mixagem de software não é o primeiro passo no pipeline, mas vários programas tentam pegar a placa de som.

Essas duas coisas ( dmix ing e multi -ing para um dispositivo de loopback) funcionam bem separadamente.

Por que dmix e multi não funcionam juntos? Como posso fazer isso funcionar?

Aqui está o meu ~/.asoundrc , com opções que dão tipo inválido 'multi' para PCM escravo :

# thx
# http://wiki.ubuntuusers.de/.asoundrc
# http://alsa.opensrc.org/Dmix
# http://forums.linuxmint.com/viewtopic.php?f=196&t=94877

pcm.snd_card {
    type hw
    card 1
    device 0
}

# allows multiple programs to output sound simultanously ("software mixing")
pcm.dmixer {
    type dmix
    ipc_key 1024
    ipc_perm 0666 # allow other users
    slave.pcm "out"
    slave {
        period_time 0
        period_size 1024
        buffer_size 4096
        ### if having problems
        # rate 44100
        ### some sound cards need the exact data format
        # format S32_LE
        ### Available formats: S8 U8 S16_LE S16_BE U16_LE U16_BE S24_LE S24_BE
        ###                    U24_LE U24_BE S32_LE S32_BE U32_LE U32_BE
        ###                    FLOAT_LE FLOAT_BE FLOAT64_LE FLOAT64_BE
        ###                    IEC958_SUBFRAME_LE IEC958_SUBFRAME_BE MU_LAW
        ###                    A_LAW IMA_ADPCM MPEG GSM
        channels 2 # must match bindings
    }
    bindings {
        0 0
        1 1
    }
}

# allows multiple programs to capture simultaneously
pcm.dsnooper {
    type dsnoop
    ipc_key 2048
    ipc_perm 0666 
    slave.pcm "snd_card"
    slave 
    {
        period_time 0
        period_size 1024
        buffer_size 4096
        channels 2 
    }
    bindings {
        0 0
        1 1
    }
}

pcm.!default {
    type asym
    playback.pcm "dmixer"
    capture.pcm "dsnooper"
}

pcm.out {
    type plug
    slave.pcm {
        type multi
        slaves {
            a { channels 2 pcm "snd_card" }
            b { channels 2 pcm "hw:Loopback,0,0" }
        }
        bindings {
            0 { slave a channel 0 }
            1 { slave a channel 1 }
            2 { slave b channel 0 }
            3 { slave b channel 1 }
        }
    }
    ttable [
        [ 1 0 1 0 ]   # left  -> a.left,  b.left
        [ 0 1 0 1 ]   # right -> a.right, b.right
    ]
}

# In case I ever want to use PulseAudio, for bluetooth speakers or such.
#pcm.!default {
#    type pulse
#}
#ctl.!default {
#    type pulse
#}
    
por Anko 06.04.2015 / 03:08

1 resposta

4

Acontece que cada dispositivo de saída precisa de seu próprio dmix :

[!default] → multi → dmix → hw [normal]
                   ↳ dmix → hw [loopback]

Eu estava perdendo um segundo dmix entre o multi e o loopback- hw , então, embora a minha carta usual estivesse bem, a placa de loopback não tinha mistura.

Muito obrigado a CL. pela paciência e experiência.

Para os detalhes técnicos, aqui está meu ~/.asoundrc agora:

pcm.snd_card { # my usual sound card
    type hw
    card 2
}

ctl.!default { # default control; alsamixer and such will use this
    type hw
    card 2
}

# software mixer for sound card
pcm.dmixer {
    type dmix
    ipc_key 1024
    ipc_perm 0666 # allow other users
    slave.pcm "snd_card"
    slave {
        period_time 0
        period_size 1024
        buffer_size 4096
        channels 2 # must match bindings
    }
    bindings {
        0 0
        1 1
    }
}

# software mixer for loopback device
pcm.dmixerloop {
    type dmix
    ipc_key 2048
    ipc_perm 0666 # allow other users
    slave.pcm "hw:Loopback,0,0"
    slave {
        period_time 0
        period_size 1024
        buffer_size 4096
        channels 2 # must match bindings
    }
    bindings {
        0 0
        1 1
    }
}

# allows multiple programs to capture simultaneously
pcm.dsnooper {
    type dsnoop
    ipc_key 2048
    ipc_perm 0666 
    slave.pcm "snd_card"
    slave 
    {
        period_time 0
        period_size 1024
        buffer_size 4096
        channels 2 
    }
    bindings {
        0 0
        1 1
    }
}

pcm.!default {
    type asym
    playback.pcm "out"
    capture.pcm "dsnooper"
}

# Multi, splitting onto usual card and loopback
pcm.out {
    type plug
    slave.pcm {
        type multi
        slaves {
            a { channels 2 pcm "dmixer" }
            b { channels 2 pcm "dmixerloop" }
        }
        bindings {
            0 { slave a channel 0 }
            1 { slave a channel 1 }
            2 { slave b channel 0 }
            3 { slave b channel 1 }
        }
    }
    ttable [
        [ 1 0 1 0 ]   # left  -> a.left,  b.left
        [ 0 1 0 1 ]   # right -> a.right, b.right
    ]
}
    
por 06.04.2015 / 17:50

Tags