Skip to content

Instantly share code, notes, and snippets.

@skobkin
Last active June 21, 2023 15:35
Show Gist options
  • Save skobkin/ed9adf733e00cf9e4326c7b4d6eafaac to your computer and use it in GitHub Desktop.
Save skobkin/ed9adf733e00cf9e4326c7b4d6eafaac to your computer and use it in GitHub Desktop.
PipeWire and PulseAudio channel remapping for Focusrite 18i20 gen3
# <other parts of the configuration removed>
# Remapping Focusrite IO for separate use
# Inputs
# https://www.freedesktop.org/wiki/Software/PulseAudio/Documentation/User/Modules/#module-remap-source
load-module module-remap-source source_name=18i20-in-1 source_properties="device.description='18i20 Input 1'" master=alsa_input.usb-Focusrite_Scarlett_18i20_USB_P92XEEZ9A04D41-00.multichannel-input remix=no channels=1 master_channel_map=front-left channel_map=mono
load-module module-remap-source source_name=18i20-in-2 source_properties="device.description='18i20 Input 2'" master=alsa_input.usb-Focusrite_Scarlett_18i20_USB_P92XEEZ9A04D41-00.multichannel-input remix=no channels=1 master_channel_map=front-right channel_map=mono
load-module module-remap-source source_name=18i20-in-3 source_properties="device.description='18i20 Input 3'" master=alsa_input.usb-Focusrite_Scarlett_18i20_USB_P92XEEZ9A04D41-00.multichannel-input remix=no channels=1 master_channel_map=rear-left channel_map=mono
load-module module-remap-source source_name=18i20-in-4 source_properties="device.description='18i20 Input 4'" master=alsa_input.usb-Focusrite_Scarlett_18i20_USB_P92XEEZ9A04D41-00.multichannel-input remix=no channels=1 master_channel_map=rear-right channel_map=mono
load-module module-remap-source source_name=18i20-in-5 source_properties="device.description='18i20 Input 5'" master=alsa_input.usb-Focusrite_Scarlett_18i20_USB_P92XEEZ9A04D41-00.multichannel-input remix=no channels=1 master_channel_map=front-center channel_map=mono
load-module module-remap-source source_name=18i20-in-6 source_properties="device.description='18i20 Input 6'" master=alsa_input.usb-Focusrite_Scarlett_18i20_USB_P92XEEZ9A04D41-00.multichannel-input remix=no channels=1 master_channel_map=lfe channel_map=mono
load-module module-remap-source source_name=18i20-in-7 source_properties="device.description='18i20 Input 7'" master=alsa_input.usb-Focusrite_Scarlett_18i20_USB_P92XEEZ9A04D41-00.multichannel-input remix=no channels=1 master_channel_map=side-left channel_map=mono
load-module module-remap-source source_name=18i20-in-8 source_properties="device.description='18i20 Input 8'" master=alsa_input.usb-Focusrite_Scarlett_18i20_USB_P92XEEZ9A04D41-00.multichannel-input remix=no channels=1 master_channel_map=side-right channel_map=mono
# Outputs
# https://www.freedesktop.org/wiki/Software/PulseAudio/Documentation/User/Modules/#module-remap-sink
load-module module-remap-sink master=alsa_output.usb-Focusrite_Scarlett_18i20_USB_P92XEEZ9A04D41-00.multichannel-output sink_name=18i20-Output-1 sink_properties="device.description='18i20 Output 1 (1-2)'" remix=no channels=2 channel_map=front-left,front-right
load-module module-remap-sink master=alsa_output.usb-Focusrite_Scarlett_18i20_USB_P92XEEZ9A04D41-00.multichannel-output sink_name=18i20-Output-2 sink_properties="device.description='18i20 Output 2 (3-4)'" remix=no channels=2 channel_map=rear-left,rear-right
context.modules = [
# Analog Input 1
{ name = libpipewire-module-loopback
args = {
node.description = "18i20 Input 01"
capture.props = {
node.name = "capture.18i20_in_01"
audio.position = [ AUX0 ]
stream.dont-remix = true
target.object = "alsa_input.usb-Focusrite_Scarlett_18i20_USB_P92XEEZ9A04D41-00.pro-input-0"
node.passive = true
}
playback.props = {
node.name = "18i20_in_01"
media.class = "Audio/Source"
audio.position = [ MONO ]
}
}
}
# Analog Input 2
{ name = libpipewire-module-loopback
args = {
node.description = "18i20 Input 02"
capture.props = {
node.name = "capture.18i20_in_02"
audio.position = [ AUX1 ]
stream.dont-remix = true
target.object = "alsa_input.usb-Focusrite_Scarlett_18i20_USB_P92XEEZ9A04D41-00.pro-input-0"
node.passive = true
}
playback.props = {
node.name = "18i20_in_02"
media.class = "Audio/Source"
audio.position = [ MONO ]
}
}
}
# Analog Input 3
{ name = libpipewire-module-loopback
args = {
node.description = "18i20 Input 03"
capture.props = {
node.name = "capture.18i20_in_03"
audio.position = [ AUX2 ]
stream.dont-remix = true
target.object = "alsa_input.usb-Focusrite_Scarlett_18i20_USB_P92XEEZ9A04D41-00.pro-input-0"
node.passive = true
}
playback.props = {
node.name = "18i20_in_03"
media.class = "Audio/Source"
audio.position = [ MONO ]
}
}
}
# Analog Input 4
{ name = libpipewire-module-loopback
args = {
node.description = "18i20 Input 04"
capture.props = {
node.name = "capture.18i20_in_04"
audio.position = [ AUX3 ]
stream.dont-remix = true
target.object = "alsa_input.usb-Focusrite_Scarlett_18i20_USB_P92XEEZ9A04D41-00.pro-input-0"
node.passive = true
}
playback.props = {
node.name = "18i20_in_04"
media.class = "Audio/Source"
audio.position = [ MONO ]
}
}
}
# Analog Input 5
{ name = libpipewire-module-loopback
args = {
node.description = "18i20 Input 05"
capture.props = {
node.name = "capture.18i20_in_05"
audio.position = [ AUX4 ]
stream.dont-remix = true
target.object = "alsa_input.usb-Focusrite_Scarlett_18i20_USB_P92XEEZ9A04D41-00.pro-input-0"
node.passive = true
}
playback.props = {
node.name = "18i20_in_05"
media.class = "Audio/Source"
audio.position = [ MONO ]
}
}
}
# Analog Input 6
{ name = libpipewire-module-loopback
args = {
node.description = "18i20 Input 06"
capture.props = {
node.name = "capture.18i20_in_06"
audio.position = [ AUX5 ]
stream.dont-remix = true
target.object = "alsa_input.usb-Focusrite_Scarlett_18i20_USB_P92XEEZ9A04D41-00.pro-input-0"
node.passive = true
}
playback.props = {
node.name = "18i20_in_06"
media.class = "Audio/Source"
audio.position = [ MONO ]
}
}
}
# Analog Input 7
{ name = libpipewire-module-loopback
args = {
node.description = "18i20 Input 07"
capture.props = {
node.name = "capture.18i20_in_07"
audio.position = [ AUX6 ]
stream.dont-remix = true
target.object = "alsa_input.usb-Focusrite_Scarlett_18i20_USB_P92XEEZ9A04D41-00.pro-input-0"
node.passive = true
}
playback.props = {
node.name = "18i20_in_07"
media.class = "Audio/Source"
audio.position = [ MONO ]
}
}
}
# Analog Input 8
{ name = libpipewire-module-loopback
args = {
node.description = "18i20 Input 08"
capture.props = {
node.name = "capture.18i20_in_08"
audio.position = [ AUX7 ]
stream.dont-remix = true
target.object = "alsa_input.usb-Focusrite_Scarlett_18i20_USB_P92XEEZ9A04D41-00.pro-input-0"
node.passive = true
}
playback.props = {
node.name = "18i20_in_08"
media.class = "Audio/Source"
audio.position = [ MONO ]
}
}
}
# Loopback (stereo)
{ name = libpipewire-module-loopback
args = {
node.description = "18i20 Loopback"
capture.props = {
node.name = "capture.18i20_in_loopback"
audio.position = [ AUX8 AUX9 ]
stream.dont-remix = true
target.object = "alsa_input.usb-Focusrite_Scarlett_18i20_USB_P92XEEZ9A04D41-00.pro-input-0"
node.passive = true
}
playback.props = {
node.name = "18i20_in_loopback"
media.class = "Audio/Source"
audio.position = [ FL FR ]
}
}
}
]
@skobkin
Copy link
Author

skobkin commented May 28, 2022

HOWTO

What is what

  • 00-focusrite-scarlett-18i20gen3-remap.pa is my old configuration for PulseAudio. Could be placed in PulseAudio configuration directory (/etc/pulse/default.pa.d/ for system-wide configuration).
  • 00-scarlett18i20gen3-inputs.conf is my new configuration for PipeWire. Could be placed in PipeWire configuration directory (for example ~/.config/pipewire/pipewire.conf.d for per-user configuration or /etc/pipewire/pipewire.conf.d/ for system-wide).

Obtaining master, sinks and sources

PulseAudio

Use pacmd list-sources and pacmd list-sinks to obtain master name, sources and sinks.

PipeWire

Use pw-link -o, pw-link -i, etc.

More info

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment