Realtime voice map
A clickable map of the current iOS/macOS Vibecom path: microphone capture, Swift state, Rust FFI, Opus/RTP transport, server routing, receive jitter/decode, and Apple playback. Pick a flow, then click any block to see ownership, files, inputs, outputs, diagnostics, and current latency-lab notes.
Full speech loop
Pieces on the board
Same client code runs on macOS and iOS where practical; platform audio and app-host behavior split at the edges.
Latency profile ledger
These are the knobs visible in Settings and applied before connect. Low latency is explicit, not hardwired.
| Profile | Rust media | Apple capture/playback | What to watch |
|---|---|---|---|
| Standard | 20ms Opus frames, jitter target 3 packets, playback prime 3 frames. | Capture tap 960 frames, input-tap backend, playback threshold 1920 frames, drain 20ms, iOS preferred IO 20ms. | Production default. Not the low-latency smoke path. |
| Low latency smoke | 5ms Opus frames, jitter target 1 packet, playback prime 1 frame via env before connect. | Capture tap 240 frames, sink-node backend, playback threshold 240 frames, drain 5ms, iOS preferred IO 5ms. | Current smoke path. Do not hide failures by inflating jitter/prime. |
Current stutter microscope
Bad receive cases usually show rustSeqGap=0 and rustSeqOoO=0; Logs/5 had one near-tail gap.
Watch rustUnderflow, rustLatencyDrop, rustCatchUp, and rustQueued.
Watch AudioOut underrun, priming, restartPrimed, idle, and depth.
0fb2ca0 render-quantum priming and 04df469 async sender pacer both made smoke worse.
Low-latency profile active, but Apple tap delivered 4800-frame / ~100ms iOS batches. Burst jitter, not network jitter.
Low latency switched to AVAudioSinkNode capture. iOS became clean at 240-frame cadence; macOS hardware callbacks still around 512 frames.
Render-quantum startup threshold made macOS output sit in priming/idle too often. Reverted by 2386c4d.
Sender pacer caused immediate stutter and tape-slow playback. Reverted by d9f3bf2. Next target is receive/playout cadence.