feat: improve meeting mode trigger to detect speech as fallback

Meeting mode auto-start now triggers on system audio energy OR speech
detection (VAD). Fixes issue where Electron-based apps like Nextcloud
Talk were not triggering recording because ScreenCaptureKit didn't
capture their audio reliably. Also improved debug logging.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
michael.borak
2026-02-06 09:41:16 +01:00
parent 4803323087
commit 76ebe9e40c

View File

@@ -246,22 +246,29 @@ impl AudioProcessor {
// Periodically log energy to help debug why meeting mode might not start
if self.last_event_time.elapsed().as_millis() > 2000 && self.recording_mode == "meeting" {
if let Some(app) = &self.app_handle {
emit_log(app, "DEBUG", &format!("Waiting for Meeting... Current System Energy: {:.4} (Threshold: 0.005)", max_system_energy));
emit_log(app, "DEBUG", &format!(
"Waiting for Meeting... SysEnergy: {:.4} (thr: 0.005), VAD Speech: {} | SysQueue empty: {}",
max_system_energy, self.is_speech_active,
if let Ok(q) = self.system_queue.lock() { q.is_empty() } else { true }
));
}
}
// MODE-SPECIFIC TRIGGER LOGIC:
// "voice" -> Trigger if user speaks (is_speech_active)
// "meeting" -> Trigger ONLY if system audio energy detected (Call starting)
// "voice" -> Trigger if user speaks (VAD)
// "meeting" -> Trigger if system audio energy detected OR speech detected.
// Some apps (e.g. Electron-based Nextcloud Talk) may route audio
// in ways that ScreenCaptureKit doesn't always capture immediately.
// Allowing speech as a fallback trigger ensures calls are recorded.
let trigger = if self.recording_mode == "voice" {
self.is_speech_active
} else {
system_active
system_active || self.is_speech_active
};
if trigger {
// Trigger Detected!
println!("Auto-Start: Call detected (SysEnergy: {}). Flushing pre-roll...", max_system_energy);
println!("Auto-Start: Call detected (SysEnergy: {}, Speech: {}). Flushing pre-roll...", 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)