Skip to content

Race condition in AVAudioEngine lifecycle when Bluetooth device (AirPods Max) reconnects — SIGSEGV (1.6.4) / SIGABRT (1.6.2) #640

Description

@WhiteRangeRover

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

  1. Have a Bluetooth headset with mic (e.g. AirPods Max) that occasionally drops
    and reconnects to the Mac
  2. 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

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingneeds reproductionBug report needs enough detail to reproduce.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions