Skip to content

[Linux/rust] Implemented high-res microphone support#655

Open
LuanAdemi wants to merge 10 commits into
librepods-org:linux/rustfrom
LuanAdemi:linux/rust
Open

[Linux/rust] Implemented high-res microphone support#655
LuanAdemi wants to merge 10 commits into
librepods-org:linux/rustfrom
LuanAdemi:linux/rust

Conversation

@LuanAdemi

@LuanAdemi LuanAdemi commented Jun 26, 2026

Copy link
Copy Markdown

Added support for Apple’s proprietary high-resolution microphone stream

image

A huge thank you to everyone in the reverse-engineering Discord channel who helped make this possible. Special thanks to @kavishdevar for the initial discovery, Bluetooth packet captures, and for figuring out the correct AACP command sequence.

How it works

AirPods are capable of transmitting a high-resolution mono microphone stream using Apple’s AACP protocol, while simultaneously maintaining high-quality audio playback over A2DP.

This pull request adds support for:

  • Required AACP control commands
  • Audio packet framing for the uplink stream
  • AAC-ELD decoding via FFmpeg’s libavcodec (LGPL-licensed)
  • PipeWire integration using a virtual input device

TODO

  • Check license compatibility (especially if we need a patent license)

AI usage

The code in this pull request was refactored using Claude Code since I have little experience with rust and my rust code sucks. I carefully reviewed and tested every ai generated code snipped.

Adds AAC-ELD decoding using ffmpegs libavcodec and pipes the decoded
0x58 AACP stream into a virtual PipeWire input.
@LuanAdemi LuanAdemi mentioned this pull request Jun 26, 2026
26 tasks
The capture stream and decoder thread are now started or stopped
automatically based on whether an application is actively recording
from the persistent virtual input device.
Introduce a centralized AppSettings struct to handle loading and
saving of application configuration.
The main change is a watchdog pattern that handles missing SDUs by
restarting the capture after N SDUs got lost.
corrupt connection.

Exiting using the tray did not teardown the mic stream, leaving the
connection in a corrupted state.
@kavishdevar

kavishdevar commented Jul 1, 2026

Copy link
Copy Markdown
Collaborator

Two things:

  • Conversational awareness should be disabled when mic is active. not just the callbacks, we should be sending the ctrl cmd
  • The a2dp transport reset causes a switch to Headset profile, and a2dp profiles aren't available anymore. instead of suspending the sink, we can set the card profile to off and then back to a2dp (without sleep) and this fixes the audio playing from only one of the airpods

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants