fix(ios): avoid actor isolation in audio tap
This commit is contained in:
@@ -2,6 +2,18 @@ import AVFAudio
|
|||||||
import Foundation
|
import Foundation
|
||||||
import Speech
|
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
|
@MainActor
|
||||||
final class VoiceWakeManager: NSObject, ObservableObject {
|
final class VoiceWakeManager: NSObject, ObservableObject {
|
||||||
@Published var isEnabled: Bool = false
|
@Published var isEnabled: Bool = false
|
||||||
@@ -95,9 +107,10 @@ final class VoiceWakeManager: NSObject, ObservableObject {
|
|||||||
let inputNode = self.audioEngine.inputNode
|
let inputNode = self.audioEngine.inputNode
|
||||||
inputNode.removeTap(onBus: 0)
|
inputNode.removeTap(onBus: 0)
|
||||||
|
|
||||||
|
let requestBox = SpeechRequestBox(request: request)
|
||||||
let recordingFormat = inputNode.outputFormat(forBus: 0)
|
let recordingFormat = inputNode.outputFormat(forBus: 0)
|
||||||
inputNode.installTap(onBus: 0, bufferSize: 1024, format: recordingFormat) { [request] buffer, _ in
|
inputNode.installTap(onBus: 0, bufferSize: 1024, format: recordingFormat) { @Sendable [requestBox] buffer, _ in
|
||||||
request.append(buffer)
|
requestBox.append(buffer)
|
||||||
}
|
}
|
||||||
|
|
||||||
self.audioEngine.prepare()
|
self.audioEngine.prepare()
|
||||||
|
|||||||
Reference in New Issue
Block a user