From 2c93afce9eceb7e4ce0272a8f93968badb2656bf Mon Sep 17 00:00:00 2001 From: "michael.borak" Date: Fri, 6 Feb 2026 10:45:53 +0100 Subject: [PATCH] fix: meeting mode triggers only on system audio, not speech Reverts speech-based fallback trigger. Meeting mode now strictly requires system audio energy > 0.005 to trigger auto-start. The system_queue always has data (even silence) from ScreenCaptureKit, so checking queue emptiness caused false positives. Speech alone must never trigger meeting mode. Co-Authored-By: Claude Opus 4.5 --- src-tauri/src/audio_processor.rs | 21 +++++++-------------- 1 file changed, 7 insertions(+), 14 deletions(-) diff --git a/src-tauri/src/audio_processor.rs b/src-tauri/src/audio_processor.rs index 5baa823..39d00d3 100644 --- a/src-tauri/src/audio_processor.rs +++ b/src-tauri/src/audio_processor.rs @@ -256,27 +256,20 @@ impl AudioProcessor { // MODE-SPECIFIC TRIGGER LOGIC: // "voice" -> Trigger if user speaks (VAD) - // "meeting" -> Trigger ONLY if system audio energy detected. - // Speech alone is NOT enough (prevents false triggers when - // user talks near the mic without being in a call). - // However, speech + ANY system audio (even below threshold) - // counts as a trigger, to catch Electron apps (e.g. Nextcloud Talk) - // that may produce low-level system audio. - let sys_queue_has_data = if let Ok(q) = self.system_queue.lock() { !q.is_empty() } else { false }; - let system_has_any_audio = max_system_energy > 0.0001 || sys_queue_has_data; - + // "meeting" -> Trigger ONLY on system audio energy above threshold. + // Speech alone NEVER triggers meeting mode to prevent + // false starts when user speaks near mic without a call. + // The threshold (0.005) is low enough to catch ringtones, + // call audio, and notification sounds from any app. let trigger = if self.recording_mode == "voice" { self.is_speech_active } else { - // Primary: system audio above threshold - // Fallback: speech detected AND system audio stream has ANY data - // (catches low-volume call audio from Electron/WebRTC apps) - system_active || (self.is_speech_active && system_has_any_audio) + system_active }; if trigger { // Trigger Detected! - println!("Auto-Start: Call detected (SysEnergy: {}, Speech: {}, SysHasData: {}). Flushing pre-roll...", max_system_energy, self.is_speech_active, system_has_any_audio); + println!("Auto-Start: Trigger! (Mode: {}, SysEnergy: {:.4}, Speech: {})", self.recording_mode, max_system_energy, self.is_speech_active); self.waiting_for_speech = false; // Flush Ring Buffer (Orderly: from ring_pos to end, then 0 to ring_pos)