use crate::{ffi, Status, Synth};
pub trait IsSamples {
fn write_samples(self, synth: &Synth) -> Status;
}
impl IsSamples for &mut [i16] {
fn write_samples(self, synth: &Synth) -> Status {
let len = self.len() / 2;
unsafe { synth.write_i16(len, self.as_mut_ptr(), 0, 2, self.as_mut_ptr(), 1, 2) }
}
}
impl IsSamples for (&mut [i16], &mut [i16]) {
fn write_samples(self, synth: &Synth) -> Status {
let len = self.0.len().min(self.1.len());
unsafe { synth.write_i16(len, self.0.as_mut_ptr(), 0, 1, self.1.as_mut_ptr(), 0, 1) }
}
}
impl IsSamples for &mut [f32] {
fn write_samples(self, synth: &Synth) -> Status {
let len = self.len() / 2;
unsafe { synth.write_f32(len, self.as_mut_ptr(), 0, 2, self.as_mut_ptr(), 1, 2) }
}
}
impl IsSamples for (&mut [f32], &mut [f32]) {
fn write_samples(self, synth: &Synth) -> Status {
let len = self.0.len().min(self.1.len());
unsafe { synth.write_f32(len, self.0.as_mut_ptr(), 0, 1, self.1.as_mut_ptr(), 0, 1) }
}
}
impl Synth {
pub fn write<S: IsSamples>(&self, samples: S) -> Status {
samples.write_samples(self)
}
#[allow(clippy::missing_safety_doc)] #[allow(clippy::too_many_arguments)]
#[inline]
pub unsafe fn write_i16(
&self,
len: usize,
lbuf: *mut i16,
loff: u32,
lincr: u32,
rbuf: *mut i16,
roff: u32,
rincr: u32,
) -> Status {
self.zero_ok(ffi::fluid_synth_write_s16(
self.handle,
len as _,
lbuf as _,
loff as _,
lincr as _,
rbuf as _,
roff as _,
rincr as _,
))
}
#[allow(clippy::missing_safety_doc)] #[allow(clippy::too_many_arguments)]
#[inline]
pub unsafe fn write_f32(
&self,
len: usize,
lbuf: *mut f32,
loff: u32,
lincr: u32,
rbuf: *mut f32,
roff: u32,
rincr: u32,
) -> Status {
self.zero_ok(ffi::fluid_synth_write_float(
self.handle,
len as _,
lbuf as _,
loff as _,
lincr as _,
rbuf as _,
roff as _,
rincr as _,
))
}
}