Roon incorrectly identifies USB-C connected AirPods Max as Bluetooth (ref#H06AMT)

Hi! What’s not quite right with Roon?

· None of the above quite fits

None of the above quite fits

· App interface looks or behaves oddly

Tell us what's going on

· When AirPods Max are connected via usb-c to iPad or iPhone, Roon signal path reports it as Bluetooth

Tell us about your home network

· Orbi 6e mesh.

Unfortunately, you have to turn off Bluetooth in order for Roon to recognize the AirPods Max as “headphones” and definitively use the USB-C path. There has been some discussion about this topic elsewhere, including whether Apple has provided the needed API switchgear for apps outside its own Music ecosystem.

I did a bit more digging into this using a small Swift Playgrounds app querying AVAudioSession.currentRoute, and the behaviour seems more complicated than just “Roon misidentifies USB-C AirPods Max”.

With Bluetooth enabled and USB-C connected, iOS exposes the route to third-party apps as:

Type: BluetoothA2DPOutput

via:

AVAudioSession.sharedInstance().currentRoute.outputs

So in that state, Roon is actually reporting what the public API is giving it.

Interestingly though, Control Center simultaneously labels the connection as “USB Audio”, so internally iOS clearly knows there is a USB audio path active.

When I disable Bluetooth completely (while leaving USB-C connected), the route changes entirely. The same API then reports:

Name: AirPods Max USB Audio

Type: Headphones UID: AppleUSBAudioEngine:Apple Inc.:AirPods Max USB Audio…

At that point:

  • Roon reports “Headphones”
  • Spatial Audio disappears
  • Conversation Awareness disappears
  • the UID exposes a real CoreAudio USB audio engine

That makes me think there are actually two distinct operating modes here, not just a cosmetic reporting issue.

My current theory is:

  • With Bluetooth enabled, Apple keeps the AirPods running through the normal AirPods/Bluetooth stack (possibly for Spatial Audio, device switching, head tracking etc.), even if audio may still partly travel over USB internally.
  • With Bluetooth disabled, iOS falls back to a straightforward USB audio device mode via AppleUSBAudioEngine.

So I’m not sure it’s accurate to say “Bluetooth must be off for Roon to definitively use USB-C”. What seems more accurate is:

  • Bluetooth ON - iOS exposes the route as BluetoothA2DPOutput
  • Bluetooth OFF - iOS exposes a genuine USB audio engine

Roon appears to just reflect whichever route abstraction iOS exposes through AVAudioSession.

The unresolved part is whether the Bluetooth-enabled mode is:

  • genuinely transporting audio over AAC/A2DP Bluetooth, or
  • still transporting PCM over USB internally while exposing the route logically as Bluetooth for compatibility with the AirPods feature stack.

The cleanest way to answer that would probably be on a Mac using Apple Bluetooth developer tools (PacketLogger/Bluetooth Explorer). Someone could check whether active A2DP audio packets are still flowing while USB-C audio is playing. If only BLE/control traffic is present, then it would suggest audio is actually travelling over USB even though iOS reports the route as Bluetooth.

Hello

Your findings with AVAudioSession explain exactly why Roon reports what it reports. It’s a classic case of the OS abstraction layer throwing third-party developers under the bus.

According to everything Apple states online, the USB-C AirPods Max should natively support Lossless audio (up to 24-bit/48kHz) over a wired connection. However, there is a huge catch that everyone always forgets: Apple’s internal DSP.

Even when connected via USB-C, the audio signal doesn’t just go straight to the drivers. It passes through Apple’s proprietary H-series chip stack for real-time DSP, Adaptive EQ, ANC, and spatial processing.

Because Apple’s audio pipeline and APIs are completely closed, it is a total black box.

There is absolutely no public API that allows third-party apps like Roon to look “under the hood” of the chip and see whether iOS is actually passing pristine PCM or sneakily re-encoding it to AAC when Bluetooth is active. Roon can only reflect the abstraction layer AVAudioSession provides.

Ultimately, this isn’t a Roon issue - it’s entirely on Apple’s implementation. Whether it’s a cosmetic API quirk or actual background compression is a question only Apple’s CoreAudio engineers can answer.

Thanks for your understanding.