Overlay: block new sessions while sending; delay runtime restart

This commit is contained in:
Peter Steinberger
2025-12-09 05:02:03 +01:00
parent b04f04776b
commit 1bbb424322
2 changed files with 18 additions and 1 deletions

View File

@@ -13,6 +13,7 @@ final class VoiceWakeOverlayController: ObservableObject {
enum Source: String { case wakeWord, pushToTalk }
@Published private(set) var model = Model()
var isVisible: Bool { self.model.isVisible }
struct Model {
var text: String = ""
@@ -51,6 +52,10 @@ final class VoiceWakeOverlayController: ObservableObject {
forwardEnabled: Bool = false,
isFinal: Bool = false) -> UUID
{
if self.model.isSending {
self.logger.log(level: .info, "overlay drop session_start while sending")
return self.activeToken ?? UUID()
}
let token = UUID()
let message = """
overlay session_start source=\(source.rawValue) \

View File

@@ -359,7 +359,7 @@ actor VoiceWakeRuntime {
self.overlayToken = nil
self.cooldownUntil = Date().addingTimeInterval(self.debounceAfterSend)
self.restartRecognizer()
self.scheduleRestartRecognizer()
}
// MARK: - Audio level handling
@@ -406,6 +406,18 @@ actor VoiceWakeRuntime {
}
}
private func scheduleRestartRecognizer(delay: TimeInterval = 0.7) {
Task { [weak self] in
let nanos = UInt64(max(0, delay) * 1_000_000_000)
try? await Task.sleep(nanoseconds: nanos)
guard let self else { return }
if self.isCapturing { return }
let overlayVisible = await MainActor.run { VoiceWakeOverlayController.shared.isVisible }
if overlayVisible { return }
self.restartRecognizer()
}
}
func applyPushToTalkCooldown() {
self.cooldownUntil = Date().addingTimeInterval(self.debounceAfterSend)
}