如何使用ALSA混合多个PCM流

时间:2011-08-09 20:21:30

标签: playback alsa

我有两种不同的PCM样本流。是否有可能以某种方式混合它们并在同一输出设备上与ALSA一起玩?

我读过可能有可能使用调音台,但由于缺乏文档,我发现很难理解。任何人都可以提供一些关于如何实施这些信息的更多信息(如果确实如此)?

谢谢!

2 个答案:

答案 0 :(得分:3)

为此,检查您的系统是否包含.asoundrc文件。 如果不存在,则创建一个,然后将其放在/ home文件夹中。 使用以下设置更新它:

pcm.!default {
              type plug
              slave.pcm "dmixer"
}
pcm.dmixer  {
            type dmix
        ipc_key 1024
        slave {
          pcm "hw:1,0"
          period_time 0
              period_size 1024
          buffer_size 4096
          rate 44100
        }
        bindings {
          0 0
          1 1
        }
}
ctl.dmixer {
       type hw
       card 0
}

使用$aplay -l获取系统上的设备列表。 hw:X,Y来自您的硬件映射,其中X是卡号,而Y是设备号。

现在,打开终端,然后播放第一个PCM流: $aplay -f cd pcm_sound1.wav 在其他选项卡中,播放第二个PCM流: $aplay -f cd -D default pcm_sound2.wav

它会混合你的两个PCM数据流。

干杯,

答案 1 :(得分:1)

我不确定这是否值得一个单独的答案。我使用了HSC的回答和"ALSA Wiki - The Dmix Howto"的例子。 Dmix文档确实有点令人沮丧。

以下是适合我的示例~/.asoundrc。 "绑定"这部分是不必要的,但是HOWTO说它有助于多通道芯片更快地工作" (不确定我是否在乎?)。如果我绑定" 0 1 1 0"然后它切换右/左声道。如果我绑定" 0 1 1 1"然后我的右耳里有垃圾......显然ipc_key是必需的参数;我刚刚选择了一个随机整数。

# example 1
pcm.hw3mix {
    type dmix
    ipc_key 1939 # must be unique
    slave {
        pcm "hw:3"
        period_time 0
        period_size 1024 # must be power of 2
        buffer_size 4096
        rate 44100
    }
    bindings {
        0 0
        1 1
    }
}

pcm.!default hw3mix

最后一行使我的新hw3mix成为默认设备。

我将上述内容简化为:

# example 2
pcm.hw3mix {
    type dmix
    ipc_key 1939 # must be unique
    slave { pcm "hw:3" }
}

pcm.!default hw3mix

它似乎工作正常。

正如上面的ALSA Wiki链接所示,我可以进一步简化为:

# example 3
pcm.dsp0 {
    type plug
    slave.pcm "dmix"
}

pcm.!default dsp0

这可以进一步简化为:

# example 4
pcm.!default {
    type plug
    slave.pcm "dmix"
}

甚至:

# example 5
pcm.!default plug:dmix

但是,最后三个示例不允许我指定Dmix插件的参数。我想创建一个将多个流混合到" hw:3"的设备。我认为这必须被指定为Dmix的一个参数,因为它不是默认设备,所以我选择了上面的第二个例子。在我的实际~/.asoundrc中,还有一个块为" hw:0,0"调用" hw0mix",所以通过更改以下行的注释,我可以在耳机和扬声器之间切换(新创建的)流的输出:

#pcm.!default hw0mix
pcm.!default hw3mix

注意:以上是指像" hw:0,0"和" hw:3" ...有点难以找到如何确保我的各种USB音响设备的稳定设备号码,我在&#34下找到了说明here;订购了多张相同类型的卡"。配置由/etc/modprobe.d/中文件中的一行组成。这就是我如何获得像0和3这样的数字来引用重启时的相同设备。