@@ -45,44 +45,43 @@ impl AudioOutput {
4545 let emulator_ptr = emulator as * mut Emulator as usize ;
4646
4747 thread:: spawn ( move || {
48- let mut buffer = Vec :: new ( ) ;
49- let mut interp_phase: f64 = 0.0 ;
50- let mut prev_sample: i32 = 0 ;
51- let mut sample_available = false ;
48+ let mut buffer = Vec :: with_capacity ( 1024 ) ;
49+ let mut phase: f64 = 0.0 ;
50+ let mut prev_sample: f64 = 0.0 ;
51+ let mut curr_sample: f64 = 0.0 ;
52+ let mut has_curr = false ;
5253
5354 while running. load ( Ordering :: SeqCst ) {
5455 let emulator = unsafe { & mut * ( emulator_ptr as * mut Emulator ) } ;
5556
5657 if emulator. apu_has_sample ( ) {
57- let sample = emulator . apu_take_sample ( ) ;
58- prev_sample = sample ;
59- sample_available = true ;
58+ prev_sample = curr_sample ;
59+ curr_sample = emulator . apu_take_sample ( ) as f64 ;
60+ has_curr = true ;
6061 }
6162
62- while interp_phase < 1.0 {
63- if buffer. len ( ) >= 512 {
63+ while phase < 1.0 {
64+ if buffer. len ( ) >= 960 {
6465 break ;
6566 }
6667
67- let interpolated = if sample_available {
68- let sample = emulator. apu_take_sample ( ) ;
69- prev_sample = sample;
70- sample_available = false ;
71- sample as f64
68+ let interpolated = if has_curr {
69+ let t = phase. clamp ( 0.0 , 1.0 ) ;
70+ prev_sample + ( curr_sample - prev_sample) * t
7271 } else {
73- prev_sample as f64
72+ prev_sample
7473 } ;
7574
7675 let output_sample = interpolated. clamp ( -128.0 , 127.0 ) as i16 ;
7776 buffer. push ( output_sample) ;
7877 buffer. push ( output_sample) ;
7978
80- interp_phase += 1.0 / UPSAMPLE_RATIO ;
79+ phase += 1.0 / UPSAMPLE_RATIO ;
8180 }
8281
83- interp_phase -= 1.0 ;
82+ phase -= 1.0 ;
8483
85- if ! buffer. is_empty ( ) {
84+ if buffer. len ( ) >= 512 {
8685 let rodio_samples: Vec < i16 > = buffer. drain ( ..) . collect ( ) ;
8786 if let Some ( sink_guard) = sink. lock ( ) . unwrap ( ) . as_ref ( ) {
8887 if !sink_guard. empty ( ) {
0 commit comments