From 413f2473786d4c8e49d9a704c40d4424ff053ba5 Mon Sep 17 00:00:00 2001 From: Edison Jwa Date: Wed, 10 Jun 2026 00:47:30 +0900 Subject: [PATCH] fix(audio): inline VAD worker policy for iOS capture callback PR #37 inlined VadWorkerPolicy into the desktop capture path but missed the iOS files. Instead of restoring the deleted types, inline the same direct if-let-Some pattern into ios_voice_unit.rs (the only remaining iOS backend) and permanently remove VadWorkerPolicy and callback_vad_worker_policy from vad/mod.rs. iOS uses Option with &mut self (no Mutex), so the inline is simpler than the desktop's try_lock pattern. --- crates/chanora_audio/src/ios_voice_unit.rs | 55 ++++++++-------------- 1 file changed, 20 insertions(+), 35 deletions(-) diff --git a/crates/chanora_audio/src/ios_voice_unit.rs b/crates/chanora_audio/src/ios_voice_unit.rs index 44a4e2d..b730325 100644 --- a/crates/chanora_audio/src/ios_voice_unit.rs +++ b/crates/chanora_audio/src/ios_voice_unit.rs @@ -406,38 +406,20 @@ impl IosCaptureState { speech: true, } } else if vad_backend == crate::VadBackend::SileroOnnx { - match crate::vad::callback_vad_worker_policy( - voice_activity_mode, - vad_backend, - self.silero_coreml_worker.is_some(), - ) { - crate::vad::VadWorkerPolicy::UseWorker => { - let worker = self - .silero_coreml_worker - .as_ref() - .expect("policy checked worker"); - let enqueued = worker.try_send(capture_seq, &frame); - if !worker.is_stale(capture_seq) { - let p = worker.latest_probability(); - crate::vad::VadOutput { - probability: p, - speech: p >= 0.5, - } - } else if enqueued { - crate::vad::VadOutput { - probability: 0.0, - speech: false, - } - } else { - used_fallback_vad = true; - self.mark_vad_fallback_active(crate::VadBackend::SileroOnnx); - crate::vad::VoiceActivityDetector::process_10ms( - &mut self.vad_detector, - &frame, - ) + if let Some(worker) = self.silero_coreml_worker.as_ref() { + let enqueued = worker.try_send(capture_seq, &frame); + if !worker.is_stale(capture_seq) { + let p = worker.latest_probability(); + crate::vad::VadOutput { + probability: p, + speech: p >= 0.5, } - } - crate::vad::VadWorkerPolicy::UseFallback => { + } else if enqueued { + crate::vad::VadOutput { + probability: 0.0, + speech: false, + } + } else { used_fallback_vad = true; self.mark_vad_fallback_active(crate::VadBackend::SileroOnnx); crate::vad::VoiceActivityDetector::process_10ms( @@ -445,10 +427,13 @@ impl IosCaptureState { &frame, ) } - crate::vad::VadWorkerPolicy::NotModelBacked => crate::vad::VadOutput { - probability: 1.0, - speech: true, - }, + } else { + used_fallback_vad = true; + self.mark_vad_fallback_active(crate::VadBackend::SileroOnnx); + crate::vad::VoiceActivityDetector::process_10ms( + &mut self.vad_detector, + &frame, + ) } } else { crate::vad::VoiceActivityDetector::process_10ms(&mut self.vad_detector, &frame)