From 7d3668a08afc712d9dbcee2268beff67c1269610 Mon Sep 17 00:00:00 2001 From: "L. E. Segovia" Date: Mon, 16 Jun 2025 13:21:45 -0300 Subject: [PATCH] audiofx: Fix Nightly dangerous_implicit_autorefs, part 2 Skip using raw pointers altogether. Part-of: --- audio/audiofx/src/audioloudnorm/imp.rs | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/audio/audiofx/src/audioloudnorm/imp.rs b/audio/audiofx/src/audioloudnorm/imp.rs index 428b1c800..667929189 100644 --- a/audio/audiofx/src/audioloudnorm/imp.rs +++ b/audio/audiofx/src/audioloudnorm/imp.rs @@ -474,10 +474,22 @@ impl State { // Safety: Index ranges are checked below and both slices from buf are // guaranteed to be non-overlapping (210ms limiter_buf difference). let (buf_read, buf_write, limiter_buf) = unsafe { - let buf = &mut &mut *self.buf as *mut &mut [f64]; - let buf_read = (&(*buf)).get_unchecked(self.buf_index..(self.buf_index + channels)); - let buf_write = (&mut (*buf)) - .get_unchecked_mut(self.prev_buf_index..(self.prev_buf_index + channels)); + let (buf_read, buf_write) = { + let (a1, a2) = self.buf.split_at_mut_unchecked(self.buf_index); + let (buf_read, after_buf_read) = a2.split_at_mut_unchecked(channels); + + let buf_write = if self.prev_buf_index < self.buf_index { + // Non-overlapping guarantee + &mut a1[self.prev_buf_index..self.prev_buf_index + channels] + } else { + // Split happens at buf_index + channels + let idx = self.prev_buf_index - (self.buf_index + channels); + &mut after_buf_read[idx..idx + channels] + }; + + // Seal the read buffer + (&*buf_read, buf_write) + }; let limiter_buf = self .limiter_buf .get_unchecked_mut(self.limiter_buf_index..(self.limiter_buf_index + channels));