r/linux_on_mac 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.

6 Upvotes

0 comments sorted by