c9f0fd077798a93b40b52fa92b453848e34d25f2
Addresses the most common causes of the engine failing to start: - Defensive teardown before starting (removeTap + stop + reset) — a leftover tap from a prior attempt makes installTap throw "already has a tap". - Validate the input node's hardware format (sampleRate/channels > 0) and fail with a clear "No microphone input" message instead of throwing. - Use inputNode.inputFormat(forBus:0) for the tap. - Category .playAndRecord + [.duckOthers, .defaultToSpeaker] (more permissive than .record with .duckOthers). - Surface the underlying NSError domain+code in the banner + log to pinpoint any remaining device-specific failure. DEBUG-only KISANI_VOICE_START hook to drive the real engine on a sim. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Description
Personal productivity and fitness companion — iOS SwiftUI app
Languages
Swift
99.3%
HTML
0.4%
Shell
0.3%