This repository has been archived on 2024-12-14. You can view files and clone it, but cannot push or open issues or pull requests.
rustboyadvance-ng/rustboyadvance-core/src/sound/fifo.rs

53 lines
1.1 KiB
Rust
Raw Normal View History

// TODO write tests or replace with a crate
const SOUND_FIFO_CAPACITY: usize = 32;
use serde::{Deserialize, Serialize};
#[derive(Serialize, Deserialize, Clone, Debug)]
pub struct SoundFifo {
wr_pos: usize,
rd_pos: usize,
count: usize,
data: [i8; SOUND_FIFO_CAPACITY],
}
impl SoundFifo {
pub fn new() -> SoundFifo {
SoundFifo {
wr_pos: 0,
rd_pos: 0,
count: 0,
data: [0; SOUND_FIFO_CAPACITY],
}
}
pub fn write(&mut self, value: i8) {
if self.count >= SOUND_FIFO_CAPACITY {
return;
}
self.data[self.wr_pos] = value;
self.wr_pos = (self.wr_pos + 1) % SOUND_FIFO_CAPACITY;
self.count += 1;
}
pub fn read(&mut self) -> i8 {
if self.count == 0 {
return 0;
};
let value = self.data[self.rd_pos];
self.rd_pos = (self.rd_pos + 1) % SOUND_FIFO_CAPACITY;
self.count -= 1;
value
}
pub fn count(&self) -> usize {
self.count
}
pub fn reset(&mut self) {
self.wr_pos = 0;
self.rd_pos = 0;
self.count = 0;
}
}