From 2b38ddf78dfde3a86f3283a800dcc3f7cf372a12 Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Sat, 13 Dec 2025 00:14:52 +0000 Subject: [PATCH] fix(ios): avoid actor isolation in audio tap --- apps/ios/Sources/Voice/VoiceWakeManager.swift | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/apps/ios/Sources/Voice/VoiceWakeManager.swift b/apps/ios/Sources/Voice/VoiceWakeManager.swift index a8833b4a4..f336a4ec1 100644 --- a/apps/ios/Sources/Voice/VoiceWakeManager.swift +++ b/apps/ios/Sources/Voice/VoiceWakeManager.swift @@ -2,6 +2,18 @@ import AVFAudio import Foundation import Speech +final class SpeechRequestBox: @unchecked Sendable { + let request: SFSpeechAudioBufferRecognitionRequest + + init(request: SFSpeechAudioBufferRecognitionRequest) { + self.request = request + } + + func append(_ buffer: AVAudioPCMBuffer) { + self.request.append(buffer) + } +} + @MainActor final class VoiceWakeManager: NSObject, ObservableObject { @Published var isEnabled: Bool = false @@ -95,9 +107,10 @@ final class VoiceWakeManager: NSObject, ObservableObject { let inputNode = self.audioEngine.inputNode inputNode.removeTap(onBus: 0) + let requestBox = SpeechRequestBox(request: request) let recordingFormat = inputNode.outputFormat(forBus: 0) - inputNode.installTap(onBus: 0, bufferSize: 1024, format: recordingFormat) { [request] buffer, _ in - request.append(buffer) + inputNode.installTap(onBus: 0, bufferSize: 1024, format: recordingFormat) { @Sendable [requestBox] buffer, _ in + requestBox.append(buffer) } self.audioEngine.prepare()