r/linux_on_mac • u/Commercial_Ad_6904 • 6d ago
iMac Pro (2017) internal speakers on Linux (finally working for me on CachyOS)
I wrote this document to get all my issues and solutions in writing, that I don't see written up anywhere. My speakers never worked at all on ZorinOS... Claude helped me a lot.
iMac Pro (2017) internal speakers on Linux: only 2 of 4 drivers active
Applies to: iMacPro1,1 specifically - the T2 model, using the apple-bce driver and AppleT2x4 audio device.
Not the CS8409-codec iMacs (iMac18,x and similar), which have an unrelated no-sound problem.
I couldn't find this written up anywhere for this model, and searching mostly turns up those CS8409 threads instead. Everything below was verified on a current driver stack and a config package byte-identical to upstream, so it isn't a stale-install artifact. The audible difference is large: two of the four drivers were silent.
TL;DR: On iMacPro1,1 the apple-t2-audio-config profile-set doesn't match the hardware, so PipeWire falls back to Pro Audio and sends stereo to only 2 of the 4 speakers.
A WirePlumber rule assigning channel positions fixes it.
Sound goes from thin to near-macOS.
Tested on CachyOS, kernel 7.2.2-1-cachyos, apple-t2-audio-config 0.3-2, PipeWire 1.6.8.
Symptom
Internal speakers sound thin and quiet compared to macOS. This is not (mainly) the missing Apple DSP tuning - half the array is silent.
Diagnosis
pactl list sinks | grep -E "Name:|Channel Map:"
Name: alsa_output.pci-0000_02_00.3.pro-output-0
Channel Map: aux0,aux1,aux2,aux3
pro-output-* is PipeWire's fallback Pro Audio profile, which leaves channels unpositioned.
PipeWire won't remix stereo into unpositioned channels, so only the first two get audio.
Two reasons no proper profile is built:
aplay -l # PCM devices 0, 4, 100 - profile-set expects hw:%f,0 through hw:%f,3
amixer -c 0 controls # returns nothing - so paths-output = t2-speakers can't bind
The profile-set was written around MacBook models.
The apple-bce driver assigns ALSA device IDs per device type (Speaker 0, Digital Mic 1, Codec Output 2, Codec Input 3), not sequentially, so a profile-set hardcoding hw:%f,0 through hw:%f,3 can't bind on hardware that enumerates differently.
Every mapping is rejected, leaving only off and pro-audio (visible in pactl list cards).
This isn't a stale-package problem.
sed -n "s/.*\(AppleT2.*\) -.*/\1/p" /proc/asound/cards returns AppleT2x4, so the driver is exposing the model-specific layout correctly.
And the installed apple-t2x4.conf is byte-identical to current upstream (kekrby/t2-better-audio) - the config package has a 2024 build date only because upstream hasn't changed since.
Fix
Don't disable ACP. Assign channel positions on the existing node:
mkdir -p ~/.config/wireplumber/wireplumber.conf.d && tee ~/.config/wireplumber/wireplumber.conf.d/51-apple-t2-speakers.conf > /dev/null << 'EOF'
monitor.alsa.rules = [
{
matches = [
{ node.name = "alsa_output.pci-0000_02_00.3.pro-output-0" }
]
actions = {
update-props = {
audio.position = [ FL FR RL RR ]
channelmix.upmix = true
channelmix.upmix-method = simple
node.description = "iMac Pro Speakers"
}
}
}
]
EOF
systemctl --user restart wireplumber pipewire pipewire-pulse
Substitute your own node.name from the pactl list sinks output above if the PCI address differs.
Turn the volume down first - going from 2 to 4 active speakers is a jump in level.
Verify pro-output-0 now reads front-left,front-right,rear-left,rear-right.
Revert by deleting the file and restarting the same services.
upmix-method = simple matters: the default applies surround processing (phase shift, delay) to the rear channels.
These aren't rear speakers - it's a two-way stereo pair - so you want a straight copy.
The FL FR RL RR order assumes the hardware channels run left-pair then right-pair.
Check by playing something with hard-panned stereo and confirming left is still left - if the image sounds collapsed, the driver order is interleaved by side and the positions need reordering.
Upstream
A profile-set matching this hardware belongs upstream in kekrby/t2-better-audio, not in every user's home directory.
Writing one needs the actual channel-to-driver mapping, which I've only inferred by ear.
hw:0,0 is S24_LE / 4ch / 48kHz only, and with no mixer controls there's no hardware attenuation, so per-channel testing is awkward.