libpipewire-module-combine-stream - Combine Stream

NAME  DESCRIPTION  MODULE NAME  MODULE OPTIONS  GENERAL OPTIONS  STREAM OPTIONS  EXAMPLE CONFIGURATION 

NAME

libpipewire-module-combine-stream − Combine Stream

DESCRIPTION

The combine stream can make:

a new virtual sink that forwards audio to other sinks

a new virtual source that combines audio from other sources

The sources and sink that need to be combined can be selected using generic match rules. This makes it possible to combine static nodes or nodes based on certain properties.

MODULE NAME

libpipewire-module-combine-stream

MODULE OPTIONS

node.name: a unique name for the stream

node.description: a human readable name for the stream

combine.mode = capture | playback | sink | source, default sink

combine.latency-compensate: use delay buffers to match stream latencies

combine.on-demand-streams: use metadata to create streams on demand

combine.props = {}: properties to be passed to the sink/source

stream.props = {}: properties to be passed to the streams

stream.rules = {}: rules for matching streams, use create-stream actions

GENERAL OPTIONS

Options with well-known behavior.

remote.name

audio.channels

audio.position

media.name

node.latency

node.name

node.description

node.group

node.virtual

media.class

STREAM OPTIONS

audio.position: Set the stream channel map. By default this is the same channel map as the combine stream.

combine.audio.position: map the combine audio positions to the stream positions. combine input channels are mapped one-by-one to stream output channels.

EXAMPLE CONFIGURATION

context.modules = [
{ name = libpipewire−module−combine−stream
args = {
combine.mode = sink
node.name = "combine_sink"
node.description = "My Combine Sink"
combine.latency−compensate = false
combine.props = {
audio.position = [ FL FR ]
}
stream.props = {
}
stream.rules = [
{
matches = [
# any of the items in matches needs to match, if one does,
# actions are emited.
{
# all keys must match the value. ! negates. ˜ starts regex.
#node.name = "˜alsa_input.*"
media.class = "Audio/Sink"
}
]
actions = {
create−stream = {
#combine.audio.position = [ FL FR ]
#audio.position = [ FL FR ]
}
}
}
]
}
}
]

Below is an example configuration that makes a 5.1 virtual audio sink from 3 separate stereo sinks.

context.modules = [
{ name = libpipewire−module−combine−stream
args = {
combine.mode = sink
node.name = "combine_sink_5_1"
node.description = "My 5.1 Combine Sink"
combine.latency−compensate = false
combine.props = {
audio.position = [ FL FR FC LFE SL SR ]
}
stream.props = {
stream.dont−remix = true # link matching channels without remixing
}
stream.rules = [
{ matches = [
{ media.class = "Audio/Sink"
node.name = "alsa_output.usb−Topping_E30−00.analog−stereo"
} ]
actions = { create−stream = {
combine.audio.position = [ FL FR ]
audio.position = [ FL FR ]
} } }
{ matches = [
{ media.class = "Audio/Sink"
node.name = "alsa_output.usb−BEHRINGER_UMC404HD_192k−00.pro−output−0"
} ]
actions = { create−stream = {
combine.audio.position = [ FC LFE ]
audio.position = [ AUX0 AUX1 ]
} } }
{ matches = [
{ media.class = "Audio/Sink"
node.name = "alsa_output.pci−0000_00_1b.0.analog−stereo"
} ]
actions = { create−stream = {
combine.audio.position = [ SL SR ]
audio.position = [ FL FR ]
} } }
]
}
}
]

Below is an example configuration that makes a 4.0 virtual audio source from 2 separate stereo sources.

context.modules = [
{ name = libpipewire−module−combine−stream
args = {
combine.mode = source
node.name = "combine_source_4_0"
node.description = "My 4.0 Combine Source"
combine.props = {
audio.position = [ FL FR SL SR ]
}
stream.props = {
stream.dont−remix = true
}
stream.rules = [
{ matches = [
{ media.class = "Audio/Source"
node.name = "alsa_input.usb−046d_HD_Pro_Webcam_C920_09D53E1F−02.analog−stereo"
} ]
actions = { create−stream = {
audio.position = [ FL FR ]
combine.audio.position = [ FL FR ]
} } }
{ matches = [
{ media.class = "Audio/Source"
node.name = "alsa_input.usb−046d_0821_9534DE90−00.analog−stereo"
} ]
actions = { create−stream = {
audio.position = [ FL FR ]
combine.audio.position = [ SL SR ]
} } }
]
}
}
]


Updated 2024-01-29 - jenkler.se | uex.se