kitlangton / kitlangton/Hex

Capture engine records silence from all local (non-Bluetooth) input devices — only AirPods work

Open
#272 1 comment 0 reactions 0 assignees View on GitHub
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

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.