feat(keyboard): improve typing, voice flow, and polish reliability
Reduce extension memory pressure and delivery races while adding richer candidates, tactile feedback, and safer two-level creative polishing.
This commit is contained in:
@@ -2,12 +2,10 @@
|
||||
// OSGKeyboard · Shared
|
||||
//
|
||||
// Sendable wrapper around a Float32 audio buffer's raw samples.
|
||||
// The snapshot is the only thing that crosses actor / concurrency
|
||||
// boundaries; the recognizer re-creates an `AVAudioPCMBuffer` on its
|
||||
// own side and consumes it locally (never yielding it back out).
|
||||
// Lives in Shared (no AVFoundation) so utterance chunking stays extension-safe.
|
||||
// The AVAudioPCMBuffer initializer lives in OSGKeyboardHostSupport.
|
||||
|
||||
import Foundation
|
||||
import AVFoundation
|
||||
|
||||
public struct AudioBufferSnapshot: Sendable {
|
||||
public let samples: [Float]
|
||||
@@ -17,18 +15,4 @@ public struct AudioBufferSnapshot: Sendable {
|
||||
self.samples = samples
|
||||
self.sampleRate = sampleRate
|
||||
}
|
||||
|
||||
/// Construct from an `AVAudioPCMBuffer` by copying out the channel data.
|
||||
public init(buffer: AVAudioPCMBuffer) {
|
||||
guard let channelData = buffer.floatChannelData else {
|
||||
self.samples = []
|
||||
self.sampleRate = buffer.format.sampleRate
|
||||
return
|
||||
}
|
||||
let n = Int(buffer.frameLength)
|
||||
var copy = [Float](repeating: 0, count: n)
|
||||
memcpy(©, channelData[0], n * MemoryLayout<Float>.size)
|
||||
self.samples = copy
|
||||
self.sampleRate = buffer.format.sampleRate
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user