@@ -387,12 +387,12 @@ impl SectorMapBuilder {
387387
388388struct DecodedPacket {
389389 timestamp : u64 ,
390- samples : Vec < i16 > ,
390+ sample_buf : SampleBuffer < i16 > ,
391391}
392392
393393impl 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