feat: AudioLevel helper and AudioRecorder.onLevel
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,24 @@
|
||||
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
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user