pub trait Ym2149Backend: Send {
fn new() -> Self
where
Self: Sized;
fn with_clocks(master_clock: u32, sample_rate: u32) -> Self
where
Self: Sized;
fn reset(&mut self);
fn write_register(&mut self, addr: u8, value: u8);
fn read_register(&self, addr: u8) -> u8;
fn load_registers(&mut self, regs: &[u8; 16]);
fn dump_registers(&self) -> [u8; 16];
fn clock(&mut self);
fn get_sample(&self) -> f32;
fn generate_samples(&mut self, count: usize) -> Vec<f32> {
let mut samples = vec![0.0; count];
self.generate_samples_into(&mut samples);
samples
}
fn generate_samples_into(&mut self, buffer: &mut [f32]) {
for sample in buffer.iter_mut() {
self.clock();
*sample = self.get_sample();
}
}
fn generate_samples_with_channels(
&mut self,
buffer: &mut [f32],
channel_outputs: &mut [[f32; 3]],
) {
debug_assert_eq!(buffer.len(), channel_outputs.len());
for (sample, channels) in buffer.iter_mut().zip(channel_outputs.iter_mut()) {
self.clock();
*sample = self.get_sample();
let (a, b, c) = self.get_channel_outputs();
*channels = [a, b, c];
}
}
fn get_channel_outputs(&self) -> (f32, f32, f32);
fn set_channel_mute(&mut self, channel: usize, mute: bool);
fn is_channel_muted(&self, channel: usize) -> bool;
fn set_color_filter(&mut self, enabled: bool);
fn trigger_envelope(&mut self) {
}
fn set_drum_sample_override(&mut self, _channel: usize, _sample: Option<f32>) {
}
fn set_mixer_overrides(&mut self, _force_tone: [bool; 3], _force_noise_mute: [bool; 3]) {
}
}