对于一个带有树莓派 PI 3 和 USB 7.1 通道声卡的个人声音项目,我需要将声卡用作 8 个独立的单声道,在特定通道上播放不同的单声道声音。有时,两个或多个单声道声音会在给定通道上同时播放(混合)。我终于在我的.asoundrc
配置文件中找到了执行此操作的方法:
pcm_slave.usbsoundcard {
pcm "hw:1"
rate 44100
channels 8
periods 128
period_time 0
period_size 1024
buffer_time 0
buffer_size 4096
}
pcm.ch1 {
type dmix
slave usbsoundcard
ipc_key 1001
bindings [ 0 ]
}
pcm.ch2 {
type dmix
slave usbsoundcard
ipc_key 1001
bindings [ 1 ]
}
pcm.ch3 {
type dmix
slave usbsoundcard
ipc_key 1001
bindings [ 6 ]
}
pcm.ch4 {
type dmix
slave usbsoundcard
ipc_key 1001
bindings [ 7 ]
}
pcm.ch5 {
type dmix
slave usbsoundcard
ipc_key 1001
bindings [ 2 ]
}
pcm.ch6 {
type dmix
slave usbsoundcard
ipc_key 1001
bindings [ 3 ]
}
pcm.ch7 {
type dmix
slave usbsoundcard
ipc_key 1001
bindings [ 4 ]
}
pcm.ch8 {
type dmix
slave usbsoundcard
ipc_key 1001
bindings [ 5 ]
}
有了这个配置文件,我可以在我想要的通道上播放我想要的内容,并且如果需要的话,我可以使用如下命令在每个独立通道上同时播放多个声音:
aplay -D plug:ch3 sound1_mono.wav &
aplay -D plug:ch3 sound2_mono.wav & # sound 2 mixed with sound 1 on channel 3
aplay -D plug:ch7 sound3_mono.wav &
aplay -D plug:ch8 sound4_mono.wav &
ETC...
但我想补充另一种可能性。我想添加一个名为“all”的虚拟通道,它必须在所有 8 个单声道通道上路由播放的声音。最终目标是将 Asterisk pbx 系统配置为对讲机以使用此通道:呼叫时,Asterisk 将自动应答,并且我希望在声卡的所有 8 个通道上路由(混合)语音。
我天真地尝试过:
pcm.all {
type dmix
slave usbsoundcard
ipc_key 1001
bindings [ 0 1 2 3 4 5 6 7 ]
}
但这不起作用。为了进行测试,我还在“所有”虚拟通道上播放单声道声音。如果我这样做: aplay -Dplug:all sound5_mono.wav 声音在所有通道 ch1...ch8 上正确播放,其中没有播放其他 wav 文件。但在已经播放声音的通道上,听不到 sound5_mono。 wav 但我有噼啪声
我该如何编写我的 .asoundrc 文件才能使其工作?我想要做的是一种音频多房间:在不同的房间中的每个频道 ch1.... ch8 上播放不同的单声道文件,当我使用 SIP 电话呼叫树莓派时,所有房间都会播放(混合)语音。
答案1
即使你的最后一个建议不适用于虚拟通道“全部”,它也对我有很大帮助,我尝试了一些在我的计算机上完美运行的东西,使用相同的 USB 声卡。
这是配置文件:
pcm.dmix8 {
type dmix
ipc_key 1001
slave {
pcm "hw:2"
rate 44100
channels 8
period_size 1024
buffer_size 32768
} }
pcm.ch1 {
type plug
slave.pcm dmix8
ttable.0.0 1 }
pcm.ch2 {
type plug
slave.pcm dmix8
ttable.0.1 1 }
pcm.ch3 {
type plug
slave.pcm dmix8
ttable.0.6 1 }
pcm.ch4 {
type plug
slave.pcm dmix8
ttable.0.7 1 }
pcm.ch5 {
type plug
slave.pcm dmix8
ttable.0.4 1 }
pcm.ch6 {
type plug
slave.pcm dmix8
ttable.0.5 1 }
pcm.ch7 {
type plug
slave.pcm dmix8
ttable.0.6 1 }
pcm.ch8 {
type plug
slave.pcm dmix8
ttable.0.7 1 }
pcm.all {
type plug
slave.pcm dmix8
ttable.0.0 1
ttable.0.1 1
ttable.0.2 1
ttable.0.3 1
ttable.0.4 1
ttable.0.5 1
ttable.0.6 1
ttable.0.7 1 }
有了这个配置文件,一切都按预期工作! Asterisk 使用“all”通道作为本地软电话,ch1...ch8 用于在 8 个不同的房间播放不同的单声道声音。当我呼叫 Asterisk 时,它会自动应答,我可以听到 8 HP 中的声音,与房间现有的声音混合在一起:)
非常感谢您的帮助 !
下一步,尝试在我的树莓派 3 板上尝试,但没有理由出现不同的行为。
答案2
我不确定您是否可以dmix
对相同的定义使用不同的定义ipc_key
;使用通用dmix
设备可能是一个更好的主意。
为了能够在所有通道上播放立体声文件,您必须首先将其转换为单声道。
pcm.dmix8 {
type dmix
slave {
pcm "hw:1"
rate 44100
channels 8
period_size 1024
buffer_size 32768
}
}
pcm.ch1 {
type plug
slave.pcm dmix8
ttable.0.0 1
}
pcm.ch2 {
type plug
slave.pcm dmix8
ttable.0.1 1
}
# and so on with "ttable.0.x 1"
pcm.all {
type plug
slave {
pcm {
type route
slave.pcm dmix8
ttable [ [ 1 1 1 1 1 1 1 1 ] ]
}
channels 1
}
}