After upgrade to iOS 26.4, averagePowerLevel and peakHoldLevel are stuck -120

We have an application that capture audio and video. App captures audio PCM on internal or external microphone and displays audio level on the screen.

App was working fine for many years but after iOS 26.4 upgrade, averagePowerLevel and peakHoldLevel are stuck to -120 values.

Any suggestion?

We're having the same issue with our camera app.

Hello Giroux, miamitwinz,

This is an issue we're aware of (FB22272504), but we're not aware of any recommended workaround so far. If you find something that helps you avoid the issue, please share it with the community by posting it here.

Even though we're aware of this issue, we still encourage you to open a bug report, and post the FB number here once you do. The specific info you include your bug report might help our investigation, and filing the bug report you to get notified when it is resolved.

Bug Reporting: How and Why? explains how you can open a bug report.

Thank you for reporting,

Richard Yeh  Developer Technical Support

Until this is fixed, one workaround that's worked for me in a similar situation: bypass AVAudioRecorder's metering entirely and compute levels from the raw PCM buffers using AVAudioEngine.

Install a tap on the input node and calculate RMS manually:

let inputNode = audioEngine.inputNode
let format = inputNode.outputFormat(forBus: 0)
inputNode.installTap(onBus: 0, bufferSize: 1024, format: format) { buffer, _ in
    guard let channelData = buffer.floatChannelData?[0] else { return }
    let frameLength = Int(buffer.frameLength)
    var rms: Float = 0
    vDSP_measqv(channelData, 1, &rms, vDSP_Length(frameLength))
    let avgPower = 10 * log10f(rms)
    // Use avgPower instead of averagePowerLevel
}

This gives you the same dB scale as averagePowerLevel without depending on the broken metering path. vDSP_measqv from Accelerate is efficient enough for real-time use — I've measured under 0.1ms per buffer on A14 and later.

One caveat: make sure you're calling audioEngine.prepare() before start() on 26.4 — I've seen cases where skipping prepare() causes the input node format to report 0 channels, which would also result in silent buffers.

After upgrade to iOS 26.4, averagePowerLevel and peakHoldLevel are stuck -120
 
 
Q