Creating a blackhole in Ubuntu 20.04
- Cloning this gist
- Install pipewire
- Configure pipewire audio server
- Create blackhole sink and virtual microphone
- Forward certain audio sources to blackhole microphone
# cd inside personal workspace folder (optional, for myself)
mkdir -p ~/workspace/cednore && cd ~/workspace/cednore
# clone this gist
git clone [email protected]:84e387a098840778b135719a85cb3681.git blackhole-guide-focal
# 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
# 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 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
$ 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
# 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
pw-link blackhole-mix:monitor_FL blackhole-mic:input_FL
pw-link blackhole-mix:monitor_FR blackhole-mic:input_FR