在pulseaudio中重新映射和组合两个扬声器的问题

在pulseaudio中重新映射和组合两个扬声器的问题

我有一对蓝牙扬声器和一对线路输入扬声器,我试图同时播放它们。我在连接和玩这两个游戏时都没有遇到任何问题,但连接它们却带来了很多问题。此外,我的蓝牙扬声器设置翻转,因此我正在重新映射它们以匹配正确的位置。

我看到了几个线程,描述了如何使用pulseaudio翻转扬声器module-remap-sink,并使用组合扬声器module-combine-sink。我还想为硬线扬声器添加延迟以解决蓝牙延迟,因此我添加了一个module-null-sink并将其监听源循环到硬线接收器中以获得此延迟。下面列出了我的四个命令。

注意:为了格式化目的,我在这里用反斜杠分割长行。每个命令是实际代码中的一行

pacmd load-module module-null-sink sink_name=delayed_speakers \
    sink_properties=device.description=DelayedSpeakers
pacmd load-module module-remap-sink sink_name=remapped_bluetooth \ 
    master=bluez_sink.EC_81_93_5A_66_BB.a2dp_sink channels=2 \
    master_channel_map=front-left,front-right channel_map=rear-right,rear-left remix=no 
pacmd load-module module-loopback latency_msec=80 source=delayed_speakers.monitor \
    sink=alsa_output.usb-Generic_USB_Audio-00.analog-stereo
pacmd load-module module-combine-sink slaves=remapped_bluetooth,delayed_speakers \ 
    sink_name=CombinedSink sink_properties=device.description=CombinedSpeakers \
    channel_map=front-left,front-right,rear-left,rear-right

当我从 bash 终端逐个运行每个命令时,这一系列命令工作正常,但我想将其设置为在启动时运行,因此我编写了一个包含这些行的 bash 脚本。当我运行 bash 脚本时,combinedSpeakers 接收器永远不会加载。为了调查这一点,我注释掉了该行并单独测试了每delayed_speakersremapped_bluetooth。如果我将 module-remap-sink 放在 module-loopback 之前,则硬线音频会接收来自delayed_speakersremapped_bluetooth(包括正确的重新映射)输出的输出。如果我翻转这些线的顺序,蓝牙扬声器就会接收两条线的输出。我尝试在每个模块加载之间添加 10 秒的睡眠,但这也无法解决问题。我在下面包含了我的脚本。

#!/bin/bash
echo "Loading null sink";
pacmd load-module module-null-sink sink_name=delayed_speakers \
    sink_properties=device.description=DelayedSpeakers

sleep 10
echo "Loading remap sink"
pacmd load-module module-remap-sink sink_name=remapped_bluetooth \
    master=bluez_sink.EC_81_93_5A_66_BB.a2dp_sink channels=2 \
    master_channel_map=front-left,front-right channel_map=rear-right,rear-left \
    remix=no

sleep 10
echo "Loading delayed speakers loopback"
pacmd load-module module-loopback latency_msec=80 source=delayed_speakers.monitor \
    sink=alsa_output.usb-Generic_USB_Audio-00.analog-stereo

sleep 10
echo "Loading combined sink"
pacmd load-module module-combine-sink slaves=remapped_bluetooth,delayed_speakers \
    sink_name=CombinedSink sink_properties=device.description=CombinedSpeakers \
    channel_map=front-left,front-right,rear-left,rear-right

当我检查 的pulseaudio 日志时systemctl --user status pulseaudio,我看到 100 条或更多消息 pulseaudio[7998]: q overrun, queuing locally,以及一条消息
No remapping configured, proceeding nonetheless!。此后,我无法再执行任何pactlpacmd命令,直到我使用 重新启动pulseaudio sudo pkill -9 pulseaudio

编辑:我知道我可以将模块加载添加到 default.pa 文件中,但这在我的情况下不起作用,因为文件运行时我的蓝牙扬声器未连接,因此模块加载会失败

答案1

我想通了这个问题。事实证明,失败并不在于脚本,而只是巧合。每当我尝试module-remap-sink在默认接收器上使用时就会发生故障。此故障悄无声息地发生,并且 pacmd 正常存在。只有当我尝试set-default使用这个新的重新映射的接收器或创建包含它的组合接收器时,pulseaudio 才会变得无响应。

解决方案:pacmd set-default-sink 0在使用之前使用module-remap-sink(如果有问题的接收器是接收器 0,则使用另一个索引)。如果有问题的接收器是唯一的接收器,那么您可以使用 创建一个虚拟接收器pacmd load-module module-null-sink,切换到它,配置重新映射,最后删除虚拟接收器。

答案2

仅供记录,当尝试重新映射源而不是接收器时,会出现完全相同的问题。

对来源做同样的事情效果很好:

pactl load-module module-null-source source_name=dummy-temp-source
pactl set-default-source dummy-temp-source

然后执行所有源重新映射命令。无需在中间添加额外的睡眠!

最后切换到您创建的源之一:

pactl set-default-source my-newly-created-source

并删除临时的

pactl unload-module module-null-source

备注:我注意到该模块module-null-source没有在脉冲音频模块文档。我想知道为什么,但通过在我的 shell 中使用命令行补全,它被列在可能的补全中...我尝试了它,它按预期工作...

无法投票,因为我没有足够的声誉,但非常感谢@scott-driggers!我真的很困惑,事实上有些东西在 shell 中工作,但不在脚本的上下文中工作,并且经历了添加额外睡眠的愚蠢方式......

相关内容