Skip to content

Instantly share code, notes, and snippets.

@cednore
Last active July 26, 2022 15:19
Show Gist options
  • Save cednore/84e387a098840778b135719a85cb3681 to your computer and use it in GitHub Desktop.
Save cednore/84e387a098840778b135719a85cb3681 to your computer and use it in GitHub Desktop.
Creating a blackhole in Ubuntu 20.04

blackhole-guide-focal

Creating a blackhole in Ubuntu 20.04

gist ubuntu

Table of Contents

  1. Cloning this gist
  2. Install pipewire
  3. Configure pipewire audio server
  4. Create blackhole sink and virtual microphone
  5. Forward certain audio sources to blackhole microphone

Cloning this gist

# cd inside personal workspace folder (optional, for myself)
mkdir -p ~/workspace/cednore && cd ~/workspace/cednore

# clone this gist
git clone git@gist.github.com:84e387a098840778b135719a85cb3681.git blackhole-guide-focal

Install pipewire

# insert pipewire and wireplumber ppa
sudo add-apt-repository ppa:pipewire-debian/pipewire-upstream
sudo add-apt-repository ppa:pipewire-debian/wireplumber-upstream

# install pipewire packages
sudo apt install \
  pipewire{,-{doc,audio-client-libraries,pulse,bin,locales,tests}} \
  libpipewire-0.3-{0,dev,modules} \
  libpipewire-module-x11-bell \
  libspa-0.2-{bluetooth,dev,jack,modules} \
  gstreamer1.0-pipewire

# install wireplumber packages
sudo apt install \
  wireplumber{,-doc} \
  libwireplumber-0.4-{0,dev} \
  gir1.2-wp-0.4

Configure pipewire audio server

# disable pulseaudio server
systemctl --user --now disable pulseaudio.{socket,service}
systemctl --user mask pulseaudio

# enable pipewire server and wireplumber service
systemctl --user --now enable pipewire{,-pulse}.{socket,service}
systemctl --user --now enable wireplumber.service

# reboot system
reboot

# verify if pipewire server is running
pactl info | grep '^Server Name' # output should be `Server Name: PulseAudio (on PipeWire x.y.z)`

Create blackhole sink and virtual microphone

# create blackhole sink interface
pactl load-module module-null-sink sink_properties=media.class=Audio/Sink sink_name=blackhole-mix channel_map=stereo

# create virtual microphone
pactl load-module module-null-sink sink_properties=media.class=Audio/Source/Virtual sink_name=blackhole-mic channel_map=front-left,front-right

Forward certain audio sources to blackhole microphone

1. List all audio outputs by running pw-link -o

$ pw-link -o
Midi-Bridge:Midi Through:(capture_0) Midi Through Port-0
v4l2_input.pci-0000_00_14.0-usb-0_6_1.0:out_0            # <- Headphone mic
alsa_output.pci-0000_00_1f.3.analog-stereo:monitor_FL    # <- Device output left
alsa_output.pci-0000_00_1f.3.analog-stereo:monitor_FR    # <- Device output right
alsa_input.pci-0000_00_1f.3.analog-stereo:capture_FL     # <- Embedded mic left
alsa_input.pci-0000_00_1f.3.analog-stereo:capture_FR     # <- Embedded mic right

2. Link your target outputs to mix sink

# example scenario: mixing headphone mic and device output (make sure you are coping correct sink name from above output)
pw-link v4l2_input.pci-0000_00_14.0-usb-0_6_1.0:out_0 blackhole-mix:playback_FL
pw-link alsa_output.pci-0000_00_1f.3.analog-stereo:monitor_FL blackhole-mix:playback_FL
pw-link alsa_output.pci-0000_00_1f.3.analog-stereo:monitor_FR blackhole-mix:playback_FR

3. Link your mix sink to virtual microphone

pw-link blackhole-mix:monitor_FL blackhole-mic:input_FL
pw-link blackhole-mix:monitor_FR blackhole-mic:input_FR
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment