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.

I can confirm that this is impacting one of my apps that uses 'averagePowerLevel' to display audio meters to the user from an AVCaptureDevice. It worked perfectly fine in iPadOS 26.2, now in 26.4 it reports -120 dB all the time meaning the audio meters do not work. Still works okay on iOS 18.7.3.

I do hope Apple can push a fix in the 26.4.1 update or that this issue is addressed in 26.5. I don't really want to update my entire audio pipeline with an if #available(iOS 26.4, *) { } code block.

I already use the Audio Engine for a number of other things and don't want to break anything in the existing workflow, thus I am hesitant to implement @eddiewangyw's solution. It's likely best for user's to go without audio meters for the time being and wait for Apple to push a fix for this in a future software update.

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