use crate::{ffi, Synth, Status};
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)
}
#[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 _))
}
#[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 _))
}
}