[Linux/rust] Implemented high-res microphone support#655
Conversation
Adds AAC-ELD decoding using ffmpegs libavcodec and pipes the decoded 0x58 AACP stream into a virtual PipeWire input.
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.
|
Two things:
|
Add a setting to automatically disable conversation detection when the Hi-Res microphone is capturing, restoring the previous state after capture ends.
capture. Disabling the high-res mic during capture removed the input device, making pipewire switch to the HFP mic.
Done. Your changes went missing for some reason. I used your card profile code snippet in the last commit. |
|
I’m not sure what happened, but I don’t hear any audio anymore on the hires output when the hires microphone is active. The hires microphone seems to be working though. I’ve tried various builds / commits to no avail. The issue started around the time when I put the AirPods back in their case without disconnecting them first and while hires audio was on. Rebooting and switching on and off hires mic didn’t help either. |
Do understand correctly: you can't hear any audio (e.g. playing a YouTube video), but the mic works correctly? Can you provide some more information about your environment? |
Added support for Apple’s proprietary high-resolution microphone stream
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:
libavcodec(LGPL-licensed)TODO
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.