Capture engine records silence from all local (non-Bluetooth) input devices — only AirPods work
- Dominant language
- Swift
- Stars
- 2.9k
- Forks
- 226
- PR merge metrics
- No merged PRs in 30d
Description
**Environment:** Hex (latest, 0.8.x) · macOS 26.x · Apple Silicon · Model: Parakeet TDT v2
**Summary:**
Hex records digital silence from every wired/built-in input device I have. The full
pipeline runs (engine arms, buffers are produced, Parakeet transcribes) but the audio is
empty. The ONLY device that works is AirPods. macOS's own Sound → Input meter shows all
these mics working, and other apps capture them fine, so the mics/permissions/hardware are
not the issue.
**Devices tested:**
| Device | Format | Result |
|---|---|---|
| AirPods Pro 1 (BT) | 24 kHz, 1ch | ✅ works |
| AirPods Pro 2 (BT) | 48 kHz, 2ch | ✅ works |
| Built-in MacBook mic | 48 kHz, 1ch | ❌ silence |
| Samson Q2U (USB) | 48 kHz, 2ch | ❌ silence |
| Samson Q2U (USB) | 16 kHz, 1... (Hz forced) | ❌ silence |
**Ruled out (each tested):**
- Sample rate — AirPods Pro 2 is 48 kHz and works; Samson forced to 16 kHz still fails.
- Channel count — AirPods Pro 2 is 2ch and works; built-in is 1ch and fails.
- Permission — AirPods working proves Hex holds mic/TCC access.
- Super Fast mode — fails identically ON and OFF.
- Device (re)selection, changing macOS default input, and USB replug/rebind — no effect.
**Common factor:** the only working devices are Bluetooth headsets that are a single device
for BOTH input and output. Every input-only device (built-in mic, USB mic) — where input ≠
the output device (built-in speakers) — records silence. Log shows a
`CADefaultDeviceAggregate-…` bound to `BuiltInSpeakerDevice` in the failing case.
**Log evidence (failing, Samson selected):**
[Recording] Capture engine first buffer … frames=1632
[Parakeet] clip check … channels=1
[Transcription] Transcribed audio … to text length 0
(`frames=1632` appears to be only the silent pre-roll; no live audio is captured.)
**Suspected area:** `SuperFastCaptureController` — the `AVAudioConverter(from: inputFormat,
to: 16kHz)` path and/or `AVAudioEngine.inputNode` binding when the input device differs from
the output device (the OS builds a CADefaultDeviceAggregate that yields silent input buffers).
**Related:** #204 (multichannel Scarlett records silence), #251 (output device breaks built-in
mic input), #218, #252, #264.
Contributor guide
No contributing guide indexed for this repository
Research direction
Start in SuperFastCaptureController, focusing on the AVAudioEngine.inputNode binding and AVAudioConverter path when the selected input differs from the output device. Reproduce with the built-in mic or Samson Q2U, compare logs and buffers against AirPods, and verify that non-Bluetooth devices produce live audio rather than only silent pre-roll frames.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- macos, swift
- Domain
- audio-video-rtc, desktop
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Quiet
- Clarity
- Mostly clear
- Newbie friendliness
- 48/100