Describe the bug
Summary
FluidVoice crashes when a Bluetooth audio device (AirPods Max) reconnects to the Mac
and CoreAudio publishes multiple new AudioDeviceIDs (A2DP/ACL/SCO) in quick succession.
This appears to be a race condition between AVAudioEngine teardown/rebuild and the
device-configuration-change notification handler.
Environment
- macOS 15.7.5 (24G624)
- MacBook Pro (Mac14,9)
- Bluetooth device: AirPods Max (firmware 6F25)
- Reproduced on both v1.6.4 (build 15) and v1.6.2 (build 13)
Evidence
Confirmed via log show correlation (not attached):
- 18:37:49.963 — bluetoothd: AirPods Max "Device connected" (full reconnect)
- 18:37:50.450–50.452 — bluetoothd publishes 3 new CoreAudio devices for the headset
(A2DP "-taad", control "-tacl", HFP/SCO "-tsco")
- 18:37:50.470 — coreaudiod (pid 444) registers as listener session with bluetoothd
- 18:37:52.3557 — FluidVoice crashes (~1.9s after the device publish burst)
Crash 1 — v1.6.4, SIGSEGV
Crashed thread 9, queue AVAudioIOUnit, in objc_msgSend called from
AVAudioIOUnit::IOUnitPropertyListener, racing against a concurrent
-[AVAudioEngine dealloc] on another thread. EXC_BAD_ACCESS at an unmapped address.
(attach crash1 report)
Crash 2 — v1.6.2, SIGABRT
Main thread, in ASRService.registerEngineConfigurationChangeObserver() →
objc_initWeak → weak_register_no_lock fatal error (weak reference to an object
mid-deallocation), while another thread is concurrently in AVAudioEngine dealloc
and a third thread is in IOUnitPropertyListener.
(attach crash2 report)
Hypothesis
Both crashes stem from the same root cause: no synchronization between
(a) tearing down/rebuilding the AVAudioEngine session and
(b) handling audio-device-configuration-change notifications, when several
device changes arrive in a short burst (e.g. a Bluetooth headset reconnecting).
FluidVoice-2026-07-16-183758.ips.txt
FluidVoice-2026-07-16-185650.ips.txt
Reproduction steps
Steps to reproduce
- Have a Bluetooth headset with mic (e.g. AirPods Max) that occasionally drops
and reconnects to the Mac
- Use FluidVoice for dictation around the time the headset reconnects
Expected behavior
FluidVoice should have worked as usual.
Actual behavior
Crash occurs within ~2 seconds of the headset publishing new audio devices
App Version
1.6.4
macOS Version
macOS 15.7.5
Architecture
Apple Silicon
Logs or crash report
Screenshots or screen recording
No response
Describe the bug
Summary
FluidVoice crashes when a Bluetooth audio device (AirPods Max) reconnects to the Mac
and CoreAudio publishes multiple new AudioDeviceIDs (A2DP/ACL/SCO) in quick succession.
This appears to be a race condition between AVAudioEngine teardown/rebuild and the
device-configuration-change notification handler.
Environment
Evidence
Confirmed via
log showcorrelation (not attached):(A2DP "-taad", control "-tacl", HFP/SCO "-tsco")
Crash 1 — v1.6.4, SIGSEGV
Crashed thread 9, queue AVAudioIOUnit, in objc_msgSend called from
AVAudioIOUnit::IOUnitPropertyListener, racing against a concurrent
-[AVAudioEngine dealloc] on another thread. EXC_BAD_ACCESS at an unmapped address.
(attach crash1 report)
Crash 2 — v1.6.2, SIGABRT
Main thread, in ASRService.registerEngineConfigurationChangeObserver() →
objc_initWeak → weak_register_no_lock fatal error (weak reference to an object
mid-deallocation), while another thread is concurrently in AVAudioEngine dealloc
and a third thread is in IOUnitPropertyListener.
(attach crash2 report)
Hypothesis
Both crashes stem from the same root cause: no synchronization between
(a) tearing down/rebuilding the AVAudioEngine session and
(b) handling audio-device-configuration-change notifications, when several
device changes arrive in a short burst (e.g. a Bluetooth headset reconnecting).
FluidVoice-2026-07-16-183758.ips.txt
FluidVoice-2026-07-16-185650.ips.txt
Reproduction steps
Steps to reproduce
and reconnects to the Mac
Expected behavior
FluidVoice should have worked as usual.
Actual behavior
Crash occurs within ~2 seconds of the headset publishing new audio devices
App Version
1.6.4
macOS Version
macOS 15.7.5
Architecture
Apple Silicon
Logs or crash report
Screenshots or screen recording
No response