ALSA dmix와 멀티 플러그인을 함께 사용하는 방법은 무엇입니까?

ALSA dmix와 멀티 플러그인을 함께 사용하는 방법은 무엇입니까?

나는 놀고 있어요콘솔 사운드 비주얼라이저자체 ALSA 장치가 듣기를 원합니다. 편집 중입니다 ~/.asoundrc. 난 내가 필요하다는 걸 알아multi 끼워 넣다사운드 데이터를 별도의 장치로 분할합니다. 하지만 제 사운드 카드에는 하드웨어 믹싱 기능이 없어서 dmix소프트웨어 믹싱을 위한 플러그인도 필요합니다.

multia를 슬레이브로 추가하려고 하면 다음 오류 (개행)dmix 가 발생합니다 .

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

"가상 중개자"를 노예 plug로 만들어서 가리켜 보았습니다.multidmix저것, 하지만 여전히 같은 오류가 발생합니다. dmix전체 체인을 원하는 plug것 같습니다 hw...

dmix모듈을 종속 모듈로 추가하려고 하면 multi다음과 같은 결과가 나타납니다.

Device or resource busy

예상한 대로 소프트웨어 믹싱은 파이프라인의 첫 번째 단계가 아니라 여러 프로그램이 사운드 카드에 접근하려고 시도하는 것입니다.

이 두 가지( 루프백 장치에 대한 dmixing 및 -ing)는 단독으로 잘 작동합니다.multi

왜 함께 일하고 함께 일하지 dmix않습니까 multi? 어떻게 해야 하나요?


~/.asoundrc옵션이 제공되는 곳은 내 것입니다.슬레이브 PCM에 대해 잘못된 유형 'multi':

# 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
#}

답변1

각 출력 장치에는 고유한 장치가 필요하다는 것이 밝혀졌습니다 dmix.

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

루프백과 루프백 사이에 1초를 놓쳤기 dmix때문에 평소 카드는 괜찮았지만 루프백 카드는 섞이지 않았습니다.multihw

매우 감사합니다C.L.인내심과 전문성.


기술적인 세부 사항은 다음과 같습니다 ~/.asoundrc.

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
    ]
}

관련 정보