From bd09ed207ab7eb38d1505b86182fec97de4337d4 Mon Sep 17 00:00:00 2001 From: Ian Hobson Date: Fri, 12 May 2023 16:52:06 +0200 Subject: [PATCH] Re-use the write buffer between calls to write_frames This resulted in a ~10% speedup in test runs of the deinter example. --- src/wavewriter.rs | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/src/wavewriter.rs b/src/wavewriter.rs index c5df769..6c84bef 100644 --- a/src/wavewriter.rs +++ b/src/wavewriter.rs @@ -25,6 +25,7 @@ where W: Write + Seek, { inner: WaveChunkWriter, + write_buffer: Vec, } impl AudioFrameWriter @@ -32,7 +33,10 @@ where W: Write + Seek, { fn new(inner: WaveChunkWriter) -> Self { - AudioFrameWriter { inner } + AudioFrameWriter { + inner, + write_buffer: Vec::new(), + } } /// Write interleaved samples in `buffer` @@ -54,14 +58,11 @@ where }); } - let mut write_buffer = self - .inner - .inner - .format - .create_raw_buffer(buffer.len() / channel_count); + let frame_count = buffer.len() / channel_count; + let write_buffer_size = format.block_alignment as usize * frame_count; + self.write_buffer.resize(write_buffer_size, 0); - let into_bytes: &mut [u8] = &mut write_buffer; - let mut write_cursor = Cursor::new(into_bytes); + let mut write_cursor = Cursor::new(&mut self.write_buffer); let common_format = format.common_format(); let bits_per_sample = format.bits_per_sample; @@ -98,8 +99,8 @@ where ), } - self.inner.write_all(&write_buffer)?; - Ok(write_buffer.len() as u64 / self.inner.inner.format.channel_count as u64) + self.inner.write_all(&self.write_buffer)?; + Ok(()) } /// Finish writing audio frames and unwrap the inner `WaveWriter`.