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

予想通り、ソフトウェアミキシングはパイプラインの最初のステップではなく、複数のプログラムがサウンドカードにアクセスしようとすることです。

これら2つ(ループバックデバイスのdmixingと-ing)は単独でうまく機能します。multi

なぜ一緒に働き、一緒に働かないのですdmixmulti?どうすればいいですか?


~/.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

非常にありがとうCL忍耐と専門知識。


技術的な詳細は次のとおりです~/.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
    ]
}

おすすめ記事