Skip to content

Commit 4301e2b

Browse files
beholdnectwvd
authored andcommitted
Reduce copying and allocation
1 parent 386ad64 commit 4301e2b

1 file changed

Lines changed: 20 additions & 12 deletions

File tree

core/src/mac/scsi/cdrom/backends/cuesheet.rs

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -387,12 +387,12 @@ impl SectorMapBuilder {
387387

388388
struct DecodedPacket {
389389
timestamp: u64,
390-
samples: Vec<i16>,
390+
sample_buf: SampleBuffer<i16>,
391391
}
392392

393393
impl DecodedPacket {
394394
fn frame_count(&self) -> usize {
395-
self.samples.len() / 2 // 2 samples per frame
395+
self.sample_buf.len() / 2 // 2 samples per frame
396396
}
397397
}
398398

@@ -511,31 +511,39 @@ impl AudioFile {
511511

512512
while result.len() < sample_count {
513513
if self.decoded_packet.is_none() || self.stream_ts >= self.next_packet_ts {
514-
self.decoded_packet = None;
514+
let old_buf = self.decoded_packet.take().map(|p| p.sample_buf);
515515

516516
let packet = self.format_reader.next_packet()?;
517517
let audio_buf = self.decoder.decode(&packet)?;
518518
let audio_buf_frame_count = audio_buf.frames();
519519

520-
let mut converted_buf = SampleBuffer::<i16>::new(
521-
audio_buf.capacity() as u64,
522-
SignalSpec::new(
523-
AUDIO_FRAMES_PER_SEC,
524-
Channels::FRONT_LEFT | Channels::FRONT_RIGHT,
525-
),
526-
);
520+
// Reuse old SampleBuffer if possible
521+
let mut converted_buf = if let Some(old_buf) = old_buf
522+
&& old_buf.capacity() >= audio_buf.capacity()
523+
{
524+
old_buf
525+
} else {
526+
SampleBuffer::<i16>::new(
527+
audio_buf.capacity() as u64,
528+
SignalSpec::new(
529+
AUDIO_FRAMES_PER_SEC,
530+
Channels::FRONT_LEFT | Channels::FRONT_RIGHT,
531+
),
532+
)
533+
};
534+
527535
converted_buf.copy_interleaved_ref(audio_buf);
528536

529537
self.decoded_packet = Some(DecodedPacket {
530538
timestamp: self.next_packet_ts,
531-
samples: converted_buf.samples().to_vec(),
539+
sample_buf: converted_buf,
532540
});
533541
self.next_packet_ts += audio_buf_frame_count as u64;
534542
}
535543

536544
let decoded_packet = self.decoded_packet.as_ref().unwrap();
537545
let frame_in_packet = usize::try_from(self.stream_ts - decoded_packet.timestamp)? * 2;
538-
let samples = &decoded_packet.samples[frame_in_packet..];
546+
let samples = &decoded_packet.sample_buf.samples()[frame_in_packet..];
539547
let remaining = sample_count - result.len();
540548
let samples = &samples[..remaining.min(samples.len())];
541549
result.extend(samples);

0 commit comments

Comments
 (0)