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 { 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 } }