Files
2026-10-01 15:00:40 +02:00

25 lines
899 B
Swift

import Foundation
public enum AudioLevel {
/// Reported for empty or silent buffers (log of zero would be -infinity).
public static let silenceFloorDbfs: Float = -120
public static func rmsDbfs(_ samples: [Float]) -> Float {
samples.withUnsafeBufferPointer { rmsDbfs($0) }
}
public static func rmsDbfs(_ samples: UnsafeBufferPointer<Float>) -> Float {
guard !samples.isEmpty else { return silenceFloorDbfs }
var sum: Float = 0
for sample in samples { sum += sample * sample }
let rms = (sum / Float(samples.count)).squareRoot()
guard rms > 0 else { return silenceFloorDbfs }
return max(silenceFloorDbfs, 20 * log10(rms))
}
/// VU reading for a dBFS level, where `referenceDbfs` is 0 VU.
public static func vu(fromDbfs dbfs: Float, referenceDbfs: Float = -20) -> Float {
dbfs - referenceDbfs
}
}