From e7a43f6d915f31dd0d53957677aa048c3f8a5988 Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Tue, 31 Aug 2021 13:52:52 +0200 Subject: [PATCH] filter-chain: add 7.1 virtual sink example --- src/daemon/filter-chain/meson.build | 1 + .../sink-virtual-surround-7.1-hesuvi.conf | 121 ++++++++++++++++++ 2 files changed, 122 insertions(+) create mode 100644 src/daemon/filter-chain/sink-virtual-surround-7.1-hesuvi.conf diff --git a/src/daemon/filter-chain/meson.build b/src/daemon/filter-chain/meson.build index 1bdb6554d..de650c4f3 100644 --- a/src/daemon/filter-chain/meson.build +++ b/src/daemon/filter-chain/meson.build @@ -1,6 +1,7 @@ conf_files = [ [ 'demonic.conf', 'demonic.conf' ], [ 'sink-virtual-surround-5.1-kemar.conf', 'sink-virtual-surround-5.1-kemar.conf' ], + [ 'sink-virtual-surround-7.1-hesuvi.conf', 'sink-virtual-surround-7.1-hesuvi.conf' ], [ 'sink-dolby-surround.conf', 'sink-dolby-surround.conf' ], [ 'sink-eq6.conf', 'sink-eq6.conf' ], [ 'sink-matrix-spatialiser.conf', 'sink-matrix-spatialiser.conf' ], diff --git a/src/daemon/filter-chain/sink-virtual-surround-7.1-hesuvi.conf b/src/daemon/filter-chain/sink-virtual-surround-7.1-hesuvi.conf new file mode 100644 index 000000000..840737562 --- /dev/null +++ b/src/daemon/filter-chain/sink-virtual-surround-7.1-hesuvi.conf @@ -0,0 +1,121 @@ +# Convolver sink +# +# start with pipewire -c filter-chain/sink-virtual-surround-7.1-hesuvi.conf +# +context.properties = { + log.level = 0 +} + +context.spa-libs = { + audio.convert.* = audioconvert/libspa-audioconvert + support.* = support/libspa-support +} + +context.modules = [ + { name = libpipewire-module-rtkit + args = { + #nice.level = -11 + #rt.prio = 88 + #rt.time.soft = 2000000 + #rt.time.hard = 2000000 + } + flags = [ ifexists nofail ] + } + { name = libpipewire-module-protocol-native } + { name = libpipewire-module-client-node } + { name = libpipewire-module-adapter } + + { name = libpipewire-module-filter-chain + args = { + node.name = "effect_output.virtual-surround-7.1-hesuvi" + node.description = "Virtual Surround Sink" + media.name = "Virtual Surround Sink" + filter.graph = { + nodes = [ + # duplicate inputs + { type = builtin label = copy name = copyFL } + { type = builtin label = copy name = copyFR } + { type = builtin label = copy name = copyFC } + { type = builtin label = copy name = copyRL } + { type = builtin label = copy name = copyRR } + { type = builtin label = copy name = copySL } + { type = builtin label = copy name = copySR } + { type = builtin label = copy name = copyLFE } + + # apply hrir - HeSuVi 14-channel WAV (not the *-.wav variants) (note: */44/* in HeSuVi are the same, but resampled to 44100) + { type = builtin label = convolver name = convFL_L config = { filename = "hrir_hesuvi/hrir.wav" channel = 0 } } + { type = builtin label = convolver name = convFL_R config = { filename = "hrir_hesuvi/hrir.wav" channel = 1 } } + { type = builtin label = convolver name = convSL_L config = { filename = "hrir_hesuvi/hrir.wav" channel = 2 } } + { type = builtin label = convolver name = convSL_R config = { filename = "hrir_hesuvi/hrir.wav" channel = 3 } } + { type = builtin label = convolver name = convRL_L config = { filename = "hrir_hesuvi/hrir.wav" channel = 4 } } + { type = builtin label = convolver name = convRL_R config = { filename = "hrir_hesuvi/hrir.wav" channel = 5 } } + { type = builtin label = convolver name = convFC_L config = { filename = "hrir_hesuvi/hrir.wav" channel = 6 } } + { type = builtin label = convolver name = convFR_R config = { filename = "hrir_hesuvi/hrir.wav" channel = 7 } } + { type = builtin label = convolver name = convFR_L config = { filename = "hrir_hesuvi/hrir.wav" channel = 8 } } + { type = builtin label = convolver name = convSR_R config = { filename = "hrir_hesuvi/hrir.wav" channel = 9 } } + { type = builtin label = convolver name = convSR_L config = { filename = "hrir_hesuvi/hrir.wav" channel = 10 } } + { type = builtin label = convolver name = convRR_R config = { filename = "hrir_hesuvi/hrir.wav" channel = 11 } } + { type = builtin label = convolver name = convRR_L config = { filename = "hrir_hesuvi/hrir.wav" channel = 12 } } + { type = builtin label = convolver name = convFC_R config = { filename = "hrir_hesuvi/hrir.wav" channel = 13 } } + + # treat LFE as FC + { type = builtin label = convolver name = convLFE_L config = { filename = "hrir_hesuvi/hrir.wav" channel = 6 } } + { type = builtin label = convolver name = convLFE_R config = { filename = "hrir_hesuvi/hrir.wav" channel = 13 } } + + # stereo output + { type = builtin label = mixer name = mixL } + { type = builtin label = mixer name = mixR } + ] + links = [ + # input + { output = "copyFL:Out" input="convFL_L:In" } + { output = "copyFL:Out" input="convFL_R:In" } + { output = "copySL:Out" input="convSL_L:In" } + { output = "copySL:Out" input="convSL_R:In" } + { output = "copyRL:Out" input="convRL_L:In" } + { output = "copyRL:Out" input="convRL_R:In" } + { output = "copyFC:Out" input="convFC_L:In" } + { output = "copyFR:Out" input="convFR_R:In" } + { output = "copyFR:Out" input="convFR_L:In" } + { output = "copySR:Out" input="convSR_R:In" } + { output = "copySR:Out" input="convSR_L:In" } + { output = "copyRR:Out" input="convRR_R:In" } + { output = "copyRR:Out" input="convRR_L:In" } + { output = "copyFC:Out" input="convFC_R:In" } + { output = "copyLFE:Out" input="convLFE_L:In" } + { output = "copyLFE:Out" input="convLFE_R:In" } + + # output + { output = "convFL_L:Out" input="mixL:In 1" } + { output = "convFL_R:Out" input="mixR:In 1" } + { output = "convSL_L:Out" input="mixL:In 2" } + { output = "convSL_R:Out" input="mixR:In 2" } + { output = "convRL_L:Out" input="mixL:In 3" } + { output = "convRL_R:Out" input="mixR:In 3" } + { output = "convFC_L:Out" input="mixL:In 4" } + { output = "convFC_R:Out" input="mixR:In 4" } + { output = "convFR_R:Out" input="mixR:In 5" } + { output = "convFR_L:Out" input="mixL:In 5" } + { output = "convSR_R:Out" input="mixR:In 6" } + { output = "convSR_L:Out" input="mixL:In 6" } + { output = "convRR_R:Out" input="mixR:In 7" } + { output = "convRR_L:Out" input="mixL:In 7" } + { output = "convLFE_R:Out" input="mixR:In 8" } + { output = "convLFE_L:Out" input="mixL:In 8" } + ] + inputs = [ "copyFL:In" "copyFR:In" "copyFC:In" "copyLFE:In" "copyRL:In" "copyRR:In", "copySL:In", "copySR:In" ] + outputs = [ "mixL:Out" "mixR:Out" ] + } + capture.props = { + media.class = Audio/Sink + audio.channels = 8 + audio.position = [ FL FR FC LFE RL RR SL SR ] + } + playback.props = { + node.passive = true + audio.channels = 2 + audio.position = [ FL FR ] + } + } + } +]