Skip to content

Instantly share code, notes, and snippets.

@bnordgren
Last active May 25, 2023 13:53
Show Gist options
  • Save bnordgren/bd520c4e8afb6c946be6365906f956f7 to your computer and use it in GitHub Desktop.
Save bnordgren/bd520c4e8afb6c946be6365906f956f7 to your computer and use it in GitHub Desktop.
Pipewire configuration for webmeetings and audio mixers
This directory contains some mappings used for:
1] Managing webmeeting audio with OBS; and
2] Virtual sinks which map to the Mackie ProFX12v3 4-channel audio output
(where channels 3-4 can appear on the mixing board as an input)
The two targets are the ProFX mixer and the Scarlett 2i2 interface box.
To enable the Scarlett as the output device:
1] Uncomment the appropriate target.object line in webmeeting.conf
2] Rename ProFX.conf to ProFX.conf.disabled
To enable the ProFX as the output device:
1] Uncomment the appropriate target.object line in webmeeting.conf
2] Rename ProFX.conf.disabled to ProFX.conf
Then run:
systemctl --user restart pipewire
To use OBS to manage sound for webmeetings:
A] In OBS
1] Settings -> Audio -> Desktop Audio == "Default Non-Webmeeting Audio"
2] Settings -> Audio -> Desktop Audio 2 == "Webmeeting Audio"
3] Settings -> Audio -> Mic/Aux Audio == < Your microphone source > (ProFX or Scarlett)
4] Settings -> Audio -> Monitoring Device == Monitor of OBS Audio
5] Audio Mixer Panel -> 3 Vertical Dots -> Desktop Audio -> Audio Monitoring == Monitor and Output
6] Audio Mixer Panel -> 3 Vertical Dots -> Desktop Audio 2 -> Audio Monitoring == Monitor Off
7] Audio Mixer Panel -> 3 Vertical Dots -> Mic/Aux -> Audio Monitoring == Monitor and Output
B] In webmeeting software
1] Set speaker to "Webmeeting Audio"
2] Set microphone to "OBS Audio"
context.modules = [
{ name = libpipewire-module-loopback
args = {
node.description = "ProFX Channels 3-4"
#target.delay.sec = 1.5
capture.props = {
node.name = "ProFX_3_4"
media.class = "Audio/Sink"
audio.channels = 2
audio.position = [ FL FR ]
}
playback.props = {
node.name = "playback.ProFX_3_4"
audio.channels = 2
audio.position = [ RL RR ]
target.object = "alsa_output.usb-LOUD_Technologies_Inc._ProFX-00.analog-surround-40"
#node.dont-reconnect = true
stream.dont-remix = true
#node.passive = true
}
}
}
{ name = libpipewire-module-loopback
args = {
node.description = "ProFX Channels 1-2"
#target.delay.sec = 1.5
capture.props = {
node.name = "ProFX_1_2"
media.class = "Audio/Sink"
audio.channels = 2
audio.position = [ FL FR ]
}
playback.props = {
node.name = "playback.ProFX_1_2"
audio.channels = 2
audio.position = [ FL FR ]
target.object = "alsa_output.usb-LOUD_Technologies_Inc._ProFX-00.analog-surround-40"
#node.dont-reconnect = true
stream.dont-remix = true
#node.passive = true
}
}
}
]
context.modules = [
{ name = libpipewire-module-loopback
args = {
node.description = "Webmeeting Audio"
capture.props = {
node.name = "input.webmeeting_audio"
media.class = "Audio/Sink"
audio.channels = 2
#stream.dont-remix = true
}
playback.props = {
node.name = "playback.webmeeting_audio"
audio.channels = 2
#target.object = "ProFX_3_4"
target.object = "alsa_output.usb-Focusrite_Scarlett_2i2_USB_Y8ATAE5079692D-00.Direct__hw_USB__sink"
}
}
}
{ name = libpipewire-module-loopback
args = {
node.description = "Default Non-Webmeeting Audio"
capture.props = {
node.name = "input.dummy_default"
media.class = "Audio/Sink"
audio.channels = 2
audio.position = [ FL FR ]
}
playback.props = {
node.name = "playback.dummy_default"
audio.channels = 2
#target.object = "ProFX_3_4"
target.object = "alsa_output.usb-Focusrite_Scarlett_2i2_USB_Y8ATAE5079692D-00.Direct__hw_USB__sink"
stream.dont-remix = true
}
}
}
{ name = libpipewire-module-loopback
args = {
node.description = "OBS Audio"
capture.props = {
node.name = "input.obs_monitor"
media.class = "Audio/Sink"
audio.channels = 2
#stream.dont-remix = true
}
playback.props = {
node.name = "playback.obs_monitor"
media.class = "Audio/Source"
audio.channels = 2
}
}
}
]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment