38 lines
1.5 KiB
Swift
38 lines
1.5 KiB
Swift
import AVFoundation
|
|
import SstCore
|
|
|
|
/// Records `seconds` of microphone audio; returns nil if access is denied or recording fails.
|
|
func recordSamples(seconds: Double, onLevel: ((Float) -> Void)? = nil) async -> [Float]? {
|
|
guard await AVCaptureDevice.requestAccess(for: .audio) else {
|
|
print("Microfoon-toegang geweigerd (Systeeminstellingen → Privacy → Microfoon).")
|
|
return nil
|
|
}
|
|
let recorder = AudioRecorder()
|
|
recorder.onLevel = onLevel
|
|
do { try recorder.start() } catch {
|
|
print("start mislukt:", error.localizedDescription)
|
|
return nil
|
|
}
|
|
print("Neem \(Int(seconds)) s op — praat nu")
|
|
try? await Task.sleep(for: .seconds(seconds))
|
|
return recorder.stop()
|
|
}
|
|
|
|
func runRecordProbe() async {
|
|
final class Levels: @unchecked Sendable {
|
|
let lock = NSLock()
|
|
var values: [Float] = []
|
|
func add(_ v: Float) { lock.withLock { values.append(v) } }
|
|
}
|
|
let levels = Levels()
|
|
guard let samples = await recordSamples(seconds: 3, onLevel: { levels.add($0) }) else { return }
|
|
let peak = samples.map { abs($0) }.max() ?? 0
|
|
print("samples: \(samples.count) (verwacht ≈ 48000), piek: \(peak)")
|
|
let values = levels.lock.withLock { levels.values }
|
|
if let lo = values.min(), let hi = values.max() {
|
|
print(String(format: "niveau-meldingen: %d (≈ %.0f per s), bereik %.1f … %.1f dBFS", values.count, Double(values.count) / 3, lo, hi))
|
|
} else {
|
|
print("geen niveau-meldingen ontvangen")
|
|
}
|
|
}
|