mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2026-03-21 05:33:49 -04:00
filter-chain: add example upmix filter
Add an example filter of PSD upmixing, using filters, convolver and delay to simulate the upmixing logic in audioconvert.
This commit is contained in:
parent
42b994204d
commit
66942e5654
2 changed files with 152 additions and 0 deletions
|
|
@ -9,6 +9,7 @@ conf_files = [
|
||||||
[ 'sink-eq6.conf', 'sink-eq6.conf' ],
|
[ 'sink-eq6.conf', 'sink-eq6.conf' ],
|
||||||
[ 'sink-matrix-spatialiser.conf', 'sink-matrix-spatialiser.conf' ],
|
[ 'sink-matrix-spatialiser.conf', 'sink-matrix-spatialiser.conf' ],
|
||||||
[ 'source-rnnoise.conf', 'source-rnnoise.conf' ],
|
[ 'source-rnnoise.conf', 'source-rnnoise.conf' ],
|
||||||
|
[ 'sink-upmix-5.1-filter.conf', 'sink-upmix-5.1-filter.conf' ],
|
||||||
]
|
]
|
||||||
|
|
||||||
foreach c : conf_files
|
foreach c : conf_files
|
||||||
|
|
|
||||||
151
src/daemon/filter-chain/sink-upmix-5.1-filter.conf
Normal file
151
src/daemon/filter-chain/sink-upmix-5.1-filter.conf
Normal file
|
|
@ -0,0 +1,151 @@
|
||||||
|
# Stereo to 5.1 upmix sink
|
||||||
|
#
|
||||||
|
# Copy this file into a conf.d/ directory such as
|
||||||
|
# ~/.config/pipewire/filter-chain.conf.d/
|
||||||
|
#
|
||||||
|
context.modules = [
|
||||||
|
{ name = libpipewire-module-filter-chain
|
||||||
|
args = {
|
||||||
|
node.description = "Upmix Sink"
|
||||||
|
filter.graph = {
|
||||||
|
nodes = [
|
||||||
|
{ type = builtin name = copyFL label = copy }
|
||||||
|
{ type = builtin name = copyFR label = copy }
|
||||||
|
{ type = builtin name = copyOFL label = copy }
|
||||||
|
{ type = builtin name = copyOFR label = copy }
|
||||||
|
{
|
||||||
|
# this mixes the front left and right together
|
||||||
|
# for filtering the center and subwoofer signal-
|
||||||
|
name = mixF
|
||||||
|
type = builtin
|
||||||
|
label = mixer
|
||||||
|
control = {
|
||||||
|
"Gain 1" = 0.707
|
||||||
|
"Gain 2" = 0.707
|
||||||
|
}
|
||||||
|
}
|
||||||
|
{
|
||||||
|
# filtering of the FC and LFE channel. We use a 2 channel
|
||||||
|
# parametric equalizer with custom filters for each channel.
|
||||||
|
# This makes it possible to run the filters in parallel.
|
||||||
|
type = builtin
|
||||||
|
name = eq_FC_LFE
|
||||||
|
label = param_eq
|
||||||
|
config = {
|
||||||
|
filters1 = [
|
||||||
|
# FC is a crossover filter (with 2 lowpass biquads)
|
||||||
|
{ type = bq_lowpass freq = 12000 },
|
||||||
|
{ type = bq_lowpass freq = 12000 },
|
||||||
|
]
|
||||||
|
filters2 = [
|
||||||
|
# LFE is first a gain adjustment (with a highself) and
|
||||||
|
# then a crossover filter (with 2 lowpass biquads)
|
||||||
|
{ type = bq_highshelf freq = 0 gain = -20.0 }, # gain -20dB
|
||||||
|
{ type = bq_lowpass freq = 120 },
|
||||||
|
{ type = bq_lowpass freq = 120 },
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
{
|
||||||
|
# for the rear channels, we subtract the front channels. Do this
|
||||||
|
# with a mixer with negative gain to flip the sign.
|
||||||
|
name = subR
|
||||||
|
type = builtin
|
||||||
|
label = mixer
|
||||||
|
control = {
|
||||||
|
"Gain 1" = 0.707
|
||||||
|
"Gain 2" = -0.707
|
||||||
|
}
|
||||||
|
}
|
||||||
|
{
|
||||||
|
# a delay for the rear Left channel. This can be
|
||||||
|
# replaced with the convolver below. */
|
||||||
|
type = builtin
|
||||||
|
name = delayRL
|
||||||
|
label = delay
|
||||||
|
config = { "max-delay" = 1 }
|
||||||
|
control = { "Delay (s)" = 0.012 }
|
||||||
|
}
|
||||||
|
{
|
||||||
|
# a delay for the rear Right channel. This can be
|
||||||
|
# replaced with the convolver below. */
|
||||||
|
type = builtin
|
||||||
|
name = delayRR
|
||||||
|
label = delay
|
||||||
|
config = { "max-delay" = 1 }
|
||||||
|
control = { "Delay (s)" = 0.012 }
|
||||||
|
}
|
||||||
|
{
|
||||||
|
# an optional convolver with a hilbert curve to
|
||||||
|
# change the phase. It also has a delay, making the above
|
||||||
|
# left delay filter optional.
|
||||||
|
type = builtin
|
||||||
|
name = convRL
|
||||||
|
label = convolver
|
||||||
|
config = {
|
||||||
|
gain = 1.0
|
||||||
|
delay = 0.012
|
||||||
|
filename = "/hilbert"
|
||||||
|
length = 33
|
||||||
|
}
|
||||||
|
}
|
||||||
|
{
|
||||||
|
# an optional convolver with a hilbert curve to
|
||||||
|
# change the phase. It also has a delay, making the above
|
||||||
|
# right delay filter optional.
|
||||||
|
type = builtin
|
||||||
|
name = convRR
|
||||||
|
label = convolver
|
||||||
|
config = {
|
||||||
|
gain = -1.0
|
||||||
|
delay = 0.012
|
||||||
|
filename = "/hilbert"
|
||||||
|
length = 33
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
links = [
|
||||||
|
{ output = "copyFL:Out" input="mixF:In 1" }
|
||||||
|
{ output = "copyFR:Out" input="mixF:In 2" }
|
||||||
|
{ output = "copyFL:Out" input="copyOFR:In" }
|
||||||
|
{ output = "copyFR:Out" input="copyOFL:In" }
|
||||||
|
{ output = "mixF:Out" input="eq_FC_LFE:In 1" }
|
||||||
|
{ output = "mixF:Out" input="eq_FC_LFE:In 2" }
|
||||||
|
{ output = "copyFL:Out" input="subR:In 1" }
|
||||||
|
{ output = "copyFR:Out" input="subR:In 2" }
|
||||||
|
# here we can choose to just delay or also convolve
|
||||||
|
#
|
||||||
|
#{ output = "subR:Out" input="delayRL:In" }
|
||||||
|
#{ output = "subR:Out" input="delayRR:In" }
|
||||||
|
{ output = "subR:Out" input="convRL:In" }
|
||||||
|
{ output = "subR:Out" input="convRR:In" }
|
||||||
|
]
|
||||||
|
inputs = [ "copyFL:In" "copyFR:In" ]
|
||||||
|
outputs = [
|
||||||
|
"copyOFL:Out"
|
||||||
|
"copyOFR:Out"
|
||||||
|
"eq_FC_LFE:Out 1"
|
||||||
|
"eq_FC_LFE:Out 2"
|
||||||
|
# here we can choose to just delay or also convolve
|
||||||
|
#
|
||||||
|
#"delayRL:Out"
|
||||||
|
#"delayRR:Out"
|
||||||
|
"convRL:Out"
|
||||||
|
"convRR:Out"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
capture.props = {
|
||||||
|
node.name = "effect_input.upmix_5.1"
|
||||||
|
media.class = "Audio/Sink"
|
||||||
|
audio.position = [ FL FR ]
|
||||||
|
}
|
||||||
|
playback.props = {
|
||||||
|
node.name = "effect_output.upmix_5.1"
|
||||||
|
audio.position = [ FL FR FC LFE RL RR ]
|
||||||
|
stream.dont-remix = true
|
||||||
|
node.passive = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue