Allow adjusting the audio sample rate
This commit is contained in:
parent
8e4f2bc114
commit
2d6730bb0b
|
@ -3,6 +3,7 @@
|
|||
pub struct Audio {
|
||||
pub current_buffer_is_0: bool,
|
||||
pub playing: bool,
|
||||
pub sample_rate: u32,
|
||||
}
|
||||
|
||||
impl Audio {
|
||||
|
@ -10,6 +11,7 @@ impl Audio {
|
|||
Audio {
|
||||
current_buffer_is_0: true,
|
||||
playing: false,
|
||||
sample_rate: 0,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -174,6 +174,7 @@ impl Bus {
|
|||
0x80000600 => { // audio port
|
||||
let mut audio_lock = self.audio.lock().unwrap();
|
||||
audio_lock.playing = word != 0;
|
||||
audio_lock.sample_rate = word;
|
||||
audio_lock.current_buffer_is_0 = false; // the first buffer refill interrupt will invert this to true
|
||||
}
|
||||
0x80001000..=0x80005003 => { // disk controller port
|
||||
|
|
|
@ -191,7 +191,7 @@ fn main() {
|
|||
let (_stream, stream_handle) = OutputStream::try_default().unwrap();
|
||||
let sink = Sink::try_new(&stream_handle).unwrap();
|
||||
loop {
|
||||
// every 500 ms, play what is in the audio buffer and tell fox32 to swap them
|
||||
// every `sleep` number of ms, play what is in the audio buffer and tell fox32 to swap them
|
||||
let mut audio_lock = audio.lock().unwrap();
|
||||
if audio_lock.playing {
|
||||
let current_buffer: Vec<i16> = if audio_lock.current_buffer_is_0 {
|
||||
|
@ -201,11 +201,13 @@ fn main() {
|
|||
audio_lock.current_buffer_is_0 = true;
|
||||
memory_audio.ram()[AUDIO_BUFFER_1_ADDRESS..AUDIO_BUFFER_1_ADDRESS+AUDIO_BUFFER_SIZE].to_vec().chunks_exact(2).map(|x| ((x[1] as i16) << 8) | x[0] as i16).collect()
|
||||
};
|
||||
let buffer = SamplesBuffer::new(1, 22050, current_buffer);
|
||||
let buffer = SamplesBuffer::new(1, audio_lock.sample_rate, current_buffer);
|
||||
// 1 Hz = 1000 ms
|
||||
let sleep: f32 = (1000 as f32 / audio_lock.sample_rate as f32) * (AUDIO_BUFFER_SIZE as f32 / 2.0);
|
||||
sink.append(buffer);
|
||||
drop(audio_lock);
|
||||
interrupt_sender_audio.send(Interrupt::Request(0xFE)).unwrap(); // audio interrupt, swap audio buffers
|
||||
thread::sleep(time::Duration::from_millis(500));
|
||||
thread::sleep(time::Duration::from_millis(sleep as u64));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue
Block a user