Fixing Audio on a MacBook Pro (T2) with Linux and PipeWire
Getting audio working on a MacBook Pro with Apple’s T2 chip can be tricky on modern Linux distributions. This post documents the exact steps I used to get full audio working on a MacBook Pro 16,1 (A2141) running Ubuntu Plucky with the T2Linux kernel, including an optional DSP speaker configuration.
The Problem
After following the T2Linux audio guide and installing PipeWire, I still had no sound. Tools that rely on PulseAudio compatibility failed:
pactl info
Connection failure: Connection refused
pa_context_connect() failed: Connection refused
Native PipeWire clients also failed to connect:
pw-cli info 0
Error: "failed to connect: Host is down"
Although pipewire.service
appeared to be running, clients could not talk to the PipeWire core.
The Root Cause
PipeWire clients connect through the libpipewire-module-protocol-native
module. If that module is not loaded, clients cannot connect, even if the PipeWire process is running. Some third-party scripts (including certain DSP installers) place a full /etc/pipewire/pipewire.conf
that overrides the distribution’s default configuration in /usr/share/pipewire/pipewire.conf
. Those overrides can omit the native protocol module, resulting in “Host is down”.
The Fix
Reset PipeWire to defaults (removes overrides and stale user configs):
sudo mv /etc/pipewire /etc/pipewire.disabled.$(date +%s) rm -rf ~/.config/pipewire ~/.local/state/pipewire systemctl --user daemon-reexec systemctl --user restart pipewire
Verify the core is reachable:
ls -l /run/user/1000/pipewire-0 pw-cli info 0
You should see a socket at
/run/user/1000/pipewire-0
and JSON info frompw-cli
.Restart the audio stack and confirm PulseAudio compatibility is active:
systemctl --user restart wireplumber pipewire-pulse pactl info
pactl info
should print Server Name: PulseAudio (on PipeWire 1.x).
Optional: T2 DSP Configuration for MacBook Pro 16,1
The 16-inch MacBook Pro (16,1) has a multi-speaker layout. A community DSP configuration improves routing and EQ:
git clone -b speakers_161 https://github.com/lemmyg/t2-apple-audio-dsp.git
cd t2-apple-audio-dsp
bash install.sh
However, this installer may install a complete /etc/pipewire
tree that replaces defaults and breaks connectivity again. The safe approach is:
Disable the installer’s global config but keep its DSP files:
sudo mv /etc/pipewire /etc/pipewire.dsp.disabled.$(date +%s)
Copy only the DSP drop-in into the distribution’s drop-in directory:
sudo mkdir -p /usr/share/pipewire/pipewire.conf.d sudo cp /etc/pipewire.dsp.disabled.*/pipewire.conf.d/10-t2_161_speakers.conf \ /usr/share/pipewire/pipewire.conf.d/
Ensure the drop-in extends, rather than replaces, the default modules. Open the copied file and change the first line:
context.modules = [
to:
context.modules += [
This keeps all default modules (including
libpipewire-module-protocol-native
) and adds the DSP filter-chain.Restart services and verify:
systemctl --user restart pipewire wireplumber pipewire-pulse pactl info pactl list short sinks
You should see the DSP sink (for example, a node created by the filter-chain). For a quick check:
speaker-test -t wav -l 1
Results
After restoring the default PipeWire configuration and loading the DSP graph as a proper drop-in, audio works reliably. Clients connect to the PipeWire core, PulseAudio compatibility is available, and the multi-speaker DSP routing provides correct channel mapping and improved sound.
Tips
- Do not replace
/usr/share/pipewire/pipewire.conf
. Use/usr/share/pipewire/pipewire.conf.d/
for additions. - If you see “Host is down” or “Connection refused,” check for overrides under
/etc/pipewire
and remove or rename them. - When merging custom configs, prefer
context.modules += [ ... ]
rather than redefiningcontext.modules = [ ... ]
.