#!/bin/bash sudo apt update && sudo apt upgrade -y sudo apt install -y \ pipewire \ pipewire-pulse \ wireplumber \ pipewire-alsa \ pipewire-jack \ pipewire-audio \ libspa-0.2-bluetooth sudo apt install -y qpwgraph sudo apt install -y easyeffects # Install PipeWire Wayland portal sudo apt-get install -y xdg-desktop-portal xdg-desktop-portal-gnome # Disable PulseAudio systemctl --user disable pulseaudio.service pulseaudio.socket systemctl --user mask pulseaudio.service pulseaudio.socket # Stop PulseAudio immediately systemctl --user stop pulseaudio.service pulseaudio.socket # Enable PipeWire and its components systemctl --user enable pipewire pipewire-pulse wireplumber systemctl --user start pipewire pipewire-pulse wireplumber mkdir -p ~/.config/pipewire cp /usr/share/pipewire/pipewire.conf ~/.config/pipewire/ # Create user pipewire config directory mkdir -p ~/.config/pipewire/pipewire.conf.d/ # Set lower latency (default is 1024/48000 = ~21ms) cat > ~/.config/pipewire/pipewire.conf.d/10-custom.conf << 'EOF' context.properties = { default.clock.rate = 96000 default.clock.quantum = 512 default.clock.min-quantum = 32 default.clock.max-quantum = 8192 } EOF # Create a virtual null sink (useful for recording desktop audio) pactl load-module module-null-sink media.class=Audio/Sink sink_name=virtual-speaker object.linger=1 # Create a loopback (route audio from virtual sink to real output) pactl load-module module-loopback source=virtual-speaker.monitor sink=@DEFAULT_SINK@ systemctl --user restart pipewire.service pipewire-pulse.service wireplumber.service # Verify PipeWire is now the audio server pactl info | grep "Server Name" #https://oneuptime.com/blog/post/2026-03-02-how-to-set-up-pipewire-as-audio-server-on-ubuntu/view