c362aabb5e
- 10-/30- conf 的虚拟声卡与各级输出都加 node.always-process + node.pause-on-idle=false: 空闲时若被 suspend, 客户端(Chromium 经 pipewire-pulse)会认为输出端不再消费而停止推数据, 表现为"播着播着突然没声音, 刷新页面才恢复" - LN_TARGET_DB -16 -> -12(听着更响) - 新增 测试/监控链路.py
49 lines
2.3 KiB
Plaintext
49 lines
2.3 KiB
Plaintext
# Collaplex 虚拟声卡 + 响度归一化 —— 本文件由 脚本/安装.sh 生成(占位符: __HRTF_IN__ / __WRAPPER__)
|
|
# 链路: 全局音频(应用输出) -> collaplex_vsink(虚拟声卡) -> 响度归一化(pipe DSP) -> 数字输出(S/PDIF)
|
|
context.modules = [
|
|
{ name = libpipewire-module-filter-chain
|
|
flags = [ nofail ]
|
|
args = {
|
|
node.description = "Collaplex 虚拟声卡 (响度归一化)"
|
|
media.name = "Collaplex Virtual Sink"
|
|
filter.graph = {
|
|
nodes = [
|
|
{ type = builtin label = copy name = c1L }
|
|
{ type = builtin label = copy name = c1R }
|
|
{ type = builtin label = pipe name = lnL
|
|
config = { command = "__WRAPPER__" } }
|
|
{ type = builtin label = pipe name = lnR
|
|
config = { command = "__WRAPPER__" } }
|
|
{ type = builtin label = copy name = c2L }
|
|
{ type = builtin label = copy name = c2R }
|
|
]
|
|
links = [
|
|
{ output = "c1L:Out" input = "lnL:In" }
|
|
{ output = "c1R:Out" input = "lnR:In" }
|
|
{ output = "lnL:Out" input = "c2L:In" }
|
|
{ output = "lnR:Out" input = "c2R:In" }
|
|
]
|
|
inputs = [ "c1L:In" "c1R:In" ]
|
|
outputs = [ "c2L:Out" "c2R:Out" ]
|
|
}
|
|
capture.props = {
|
|
media.class = Audio/Sink
|
|
node.name = collaplex_vsink
|
|
audio.position = [ FL FR ]
|
|
# ★ 虚拟声卡必须常驻运行。空闲时若被 suspend, 客户端(Chromium 经
|
|
# pipewire-pulse)会认为输出端停止消费而不再推数据 —— 表现为
|
|
# "播着播着突然没声音, 刷新页面才恢复"。让节点永不空闲休眠。
|
|
node.always-process = true
|
|
node.pause-on-idle = false
|
|
}
|
|
playback.props = {
|
|
node.name = collaplex_vsink_out
|
|
audio.position = [ FL FR ]
|
|
node.target = "__HRTF_IN__"
|
|
node.always-process = true
|
|
node.pause-on-idle = false
|
|
}
|
|
}
|
|
}
|
|
]
|