![如何将多个属性传递给 PulseAudio 模块参数 source_output_properties?](https://linux22.com/image/925065/%E5%A6%82%E4%BD%95%E5%B0%86%E5%A4%9A%E4%B8%AA%E5%B1%9E%E6%80%A7%E4%BC%A0%E9%80%92%E7%BB%99%20PulseAudio%20%E6%A8%A1%E5%9D%97%E5%8F%82%E6%95%B0%20source_output_properties%EF%BC%9F.png)
许多 PulseAudio 模块接受属性列表作为参数,但我找不到有关该列表格式的任何文档,而且我能找到的所有示例都只传递一个属性。以下是我想要做的:
pactl load-module module-loopback source=… sink=… \
source_output_properties='module-stream-restore.id="loopback" media.name="foo"'
此调用导致无用的错误消息
Failure: Module initialisation failed
系统日志包含稍微更有帮助的信息
module-loopback.c: Failed to parse module arguments
单独传递这两个参数中的任何一个都可以正常工作,所以问题在于同时传递这两个参数。我尝试了各种格式,包括传递source_output_properties
两次参数,但总是得到相同的错误。
我知道pacmd
在加载模块后可以用来更改源输出的属性,但是在 shell 脚本中编写脚本要复杂得多,因为您需要找到新源输出的索引。
由于没有文档说明如何做到这一点,我查看了源代码,解析属性列表的函数看起来它应该接受我提供的格式的参数列表。
有什么线索可以告诉我们如何做到这一点吗?
我正在使用 PulseAudio 版本 13.0。
答案1
通过根据源代码进行有根据的猜测,我发现了以下两种传递多个属性的工作方式:
pactl load-module module-loopback source_output_properties="'foo=\"bar\" baz=\"gloink\"'"
pactl load-module module-loopback source_output_properties='foo="bar"baz="gloink"'
显然,PulseAudio 正在应用其自己的引号解析,其与 shell 的引号解析的交互存在缺陷。
解决这个问题的另一种方式适合于 shell 脚本,pacmd
而是使用:
pacmd <<EOF
load-module module-loopback source_output_properties='foo="bar" baz="gloink"'
EOF
这样,我们就可以避免 shell 的引号解析,从而恢复一些理智。
这些似乎都没有在任何地方有记录,所以我提交了错误。