mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-11-03 09:01:54 -05: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-matrix-spatialiser.conf', 'sink-matrix-spatialiser.conf' ],
|
||||
[ 'source-rnnoise.conf', 'source-rnnoise.conf' ],
|
||||
[ 'sink-upmix-5.1-filter.conf', 'sink-upmix-5.1-filter.conf' ],
|
||||
]
|
||||
|
||||
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