apu
This commit is contained in:
parent
444636f621
commit
1e11c22493
|
@ -81,7 +81,7 @@ impl Apu {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn step(&mut self) -> Option<f32> {
|
pub fn clock(&mut self) -> Option<f32> {
|
||||||
let mut sample = None;
|
let mut sample = None;
|
||||||
|
|
||||||
if (self.frame_counter == 4 && FRAME_COUNTER_STEPS[..4].contains(&self.cycle))
|
if (self.frame_counter == 4 && FRAME_COUNTER_STEPS[..4].contains(&self.cycle))
|
||||||
|
|
13
src/audio.rs
13
src/audio.rs
|
@ -3,7 +3,7 @@ extern crate sdl2;
|
||||||
use sdl2::audio::{AudioCallback, AudioSpecDesired};
|
use sdl2::audio::{AudioCallback, AudioSpecDesired};
|
||||||
|
|
||||||
pub struct Speaker {
|
pub struct Speaker {
|
||||||
buffer: Vec<f32>,
|
buffer: [f32; 4096*4],
|
||||||
head: usize,
|
head: usize,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -13,7 +13,14 @@ impl AudioCallback for Speaker {
|
||||||
for (i, x) in out.iter_mut().enumerate() {
|
for (i, x) in out.iter_mut().enumerate() {
|
||||||
*x = self.buffer[i+self.head]; // get data from apu
|
*x = self.buffer[i+self.head]; // get data from apu
|
||||||
}
|
}
|
||||||
self.buffer = self.buffer[4096..].to_vec();
|
self.head = (self.head + 4096) % (4096*4)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Speaker {
|
||||||
|
pub fn append(&mut self, sample: f32) {
|
||||||
|
self.buffer[self.head] = sample;
|
||||||
|
self.head = (self.head + 1) % (4096*4);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -31,6 +38,6 @@ pub fn initialize(context: &sdl2::Sdl) -> Result<sdl2::audio::AudioDevice<Speake
|
||||||
println!("{:?}", spec);
|
println!("{:?}", spec);
|
||||||
|
|
||||||
// initialize the audio callback
|
// initialize the audio callback
|
||||||
Speaker{buffer: vec![], head: 0}
|
Speaker{buffer: [0_f32; 4096*4], head: 0}
|
||||||
})
|
})
|
||||||
}
|
}
|
|
@ -35,8 +35,9 @@ fn main() -> Result<(), String> {
|
||||||
let mut screen_buffer = vec![0; byte_width * byte_height]; // contains raw RGB data for the screen
|
let mut screen_buffer = vec![0; byte_width * byte_height]; // contains raw RGB data for the screen
|
||||||
|
|
||||||
// Set up audio
|
// Set up audio
|
||||||
let mut speaker = audio::initialize(&sdl_context).expect("Could not create audio device");
|
let mut audio_device = audio::initialize(&sdl_context).expect("Could not create audio device");
|
||||||
let mut half_cycle = false;
|
let mut half_cycle = false;
|
||||||
|
audio_device.resume();
|
||||||
|
|
||||||
// Initialize hardware components
|
// Initialize hardware components
|
||||||
let cart = Cartridge::new();
|
let cart = Cartridge::new();
|
||||||
|
@ -64,7 +65,10 @@ fn main() -> Result<(), String> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for _ in 0..apu_cycles {
|
for _ in 0..apu_cycles {
|
||||||
cpu.apu.step();
|
match cpu.apu.clock() {
|
||||||
|
Some(sample) => audio_device.speaker.append(sample),
|
||||||
|
None => (),
|
||||||
|
}
|
||||||
}
|
}
|
||||||
// clock PPU three times for every CPU cycle
|
// clock PPU three times for every CPU cycle
|
||||||
for _ in 0..cpu_cycles * 3 {
|
for _ in 0..cpu_cycles * 3 {
|
||||||
|
|
Loading…
Reference in New Issue