core: sound: sound chip optimization

Compute sampling rate and cycles per cycles ahead of time


Former-commit-id: 2959cadd693ff08a69251d642583cc984c040fc2
This commit is contained in:
Michel Heily 2019-12-31 23:46:34 +02:00
parent 71a4837d25
commit 05f1085410

View file

@ -97,6 +97,9 @@ pub struct SoundController {
sound_bias: u16, sound_bias: u16,
sample_rate: f32,
cycles_per_sample: usize,
dma_sound: [DmaSoundChannel; 2], dma_sound: [DmaSoundChannel; 2],
resampler: CosineResampler, resampler: CosineResampler,
@ -133,6 +136,8 @@ impl SoundController {
sqr1_initial_vol: 0, sqr1_initial_vol: 0,
sqr1_cur_vol: 0, sqr1_cur_vol: 0,
sound_bias: 0x200, sound_bias: 0x200,
sample_rate: 32_768f32,
cycles_per_sample: 512,
dma_sound: [Default::default(), Default::default()], dma_sound: [Default::default(), Default::default()],
resampler: resampler, resampler: resampler,
@ -273,7 +278,15 @@ impl SoundController {
self.dma_sound[1].fifo.write(((value >> 8) & 0xff) as i8); self.dma_sound[1].fifo.write(((value >> 8) & 0xff) as i8);
} }
REG_SOUNDBIAS => self.sound_bias = value & 0xc3fe, REG_SOUNDBIAS => {
self.sound_bias = value & 0xc3fe;
let resolution = self.sound_bias.bit_range(14..16) as usize;
self.sample_rate = (32768 << resolution) as f32;
if self.sample_rate != self.resampler.in_freq {
self.resampler.in_freq = self.sample_rate;
}
self.cycles_per_sample = 512 >> resolution;
},
_ => { _ => {
println!( println!(
@ -308,19 +321,9 @@ impl SoundController {
} }
} }
fn sample_rate(&self) -> i32 {
let resolution = self.sound_bias.bit_range(14..16) as usize;
(32768 << resolution) as i32
}
pub fn update(&mut self, cycles: usize) { pub fn update(&mut self, cycles: usize) {
let resolution = self.sound_bias.bit_range(14..16) as usize; while cycles - self.last_sample_cycles >= self.cycles_per_sample {
let cycles_per_sample = 512 >> resolution; self.last_sample_cycles += self.cycles_per_sample;
self.resampler.in_freq = self.sample_rate() as f32;
while cycles - self.last_sample_cycles >= cycles_per_sample {
self.last_sample_cycles += cycles_per_sample;
// time to push a new sample! // time to push a new sample!