Re-use the write buffer between calls to write_frames

This resulted in a ~10% speedup in test runs of the deinter example.
This commit is contained in:
Ian Hobson
2023-05-12 16:52:06 +02:00
parent 3d1826007e
commit bd09ed207a

View File

@@ -25,6 +25,7 @@ where
W: Write + Seek, W: Write + Seek,
{ {
inner: WaveChunkWriter<W>, inner: WaveChunkWriter<W>,
write_buffer: Vec<u8>,
} }
impl<W> AudioFrameWriter<W> impl<W> AudioFrameWriter<W>
@@ -32,7 +33,10 @@ where
W: Write + Seek, W: Write + Seek,
{ {
fn new(inner: WaveChunkWriter<W>) -> Self { fn new(inner: WaveChunkWriter<W>) -> Self {
AudioFrameWriter { inner } AudioFrameWriter {
inner,
write_buffer: Vec::new(),
}
} }
/// Write interleaved samples in `buffer` /// Write interleaved samples in `buffer`
@@ -54,14 +58,11 @@ where
}); });
} }
let mut write_buffer = self let frame_count = buffer.len() / channel_count;
.inner let write_buffer_size = format.block_alignment as usize * frame_count;
.inner self.write_buffer.resize(write_buffer_size, 0);
.format
.create_raw_buffer(buffer.len() / channel_count);
let into_bytes: &mut [u8] = &mut write_buffer; let mut write_cursor = Cursor::new(&mut self.write_buffer);
let mut write_cursor = Cursor::new(into_bytes);
let common_format = format.common_format(); let common_format = format.common_format();
let bits_per_sample = format.bits_per_sample; let bits_per_sample = format.bits_per_sample;
@@ -98,8 +99,8 @@ where
), ),
} }
self.inner.write_all(&write_buffer)?; self.inner.write_all(&self.write_buffer)?;
Ok(write_buffer.len() as u64 / self.inner.inner.format.channel_count as u64) Ok(())
} }
/// Finish writing audio frames and unwrap the inner `WaveWriter`. /// Finish writing audio frames and unwrap the inner `WaveWriter`.