Skip to content

Commit 2e84098

Browse files
committed
resampling
1 parent a0e251e commit 2e84098

1 file changed

Lines changed: 17 additions & 18 deletions

File tree

src/interface/audio.rs

Lines changed: 17 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)