1use crate::{ffi, Status, Synth};
2
3pub trait IsSamples {
5 fn write_samples(self, synth: &Synth) -> Status;
6}
7
8impl IsSamples for &mut [i16] {
9 fn write_samples(self, synth: &Synth) -> Status {
11 let len = self.len() / 2;
12 unsafe { synth.write_i16(len, self.as_mut_ptr(), 0, 2, self.as_mut_ptr(), 1, 2) }
13 }
14}
15
16impl IsSamples for (&mut [i16], &mut [i16]) {
17 fn write_samples(self, synth: &Synth) -> Status {
19 let len = self.0.len().min(self.1.len());
20 unsafe { synth.write_i16(len, self.0.as_mut_ptr(), 0, 1, self.1.as_mut_ptr(), 0, 1) }
21 }
22}
23
24impl IsSamples for &mut [f32] {
25 fn write_samples(self, synth: &Synth) -> Status {
27 let len = self.len() / 2;
28 unsafe { synth.write_f32(len, self.as_mut_ptr(), 0, 2, self.as_mut_ptr(), 1, 2) }
29 }
30}
31
32impl IsSamples for (&mut [f32], &mut [f32]) {
33 fn write_samples(self, synth: &Synth) -> Status {
35 let len = self.0.len().min(self.1.len());
36 unsafe { synth.write_f32(len, self.0.as_mut_ptr(), 0, 1, self.1.as_mut_ptr(), 0, 1) }
37 }
38}
39
40impl Synth {
44 pub fn write<S: IsSamples>(&self, samples: S) -> Status {
48 samples.write_samples(self)
49 }
50
51 #[allow(clippy::missing_safety_doc)] #[allow(clippy::too_many_arguments)]
60 #[inline]
61 pub unsafe fn write_i16(
62 &self,
63 len: usize,
64 lbuf: *mut i16,
65 loff: u32,
66 lincr: u32,
67 rbuf: *mut i16,
68 roff: u32,
69 rincr: u32,
70 ) -> Status {
71 self.zero_ok(ffi::fluid_synth_write_s16(
72 self.handle,
73 len as _,
74 lbuf as _,
75 loff as _,
76 lincr as _,
77 rbuf as _,
78 roff as _,
79 rincr as _,
80 ))
81 }
82
83 #[allow(clippy::missing_safety_doc)] #[allow(clippy::too_many_arguments)]
92 #[inline]
93 pub unsafe fn write_f32(
94 &self,
95 len: usize,
96 lbuf: *mut f32,
97 loff: u32,
98 lincr: u32,
99 rbuf: *mut f32,
100 roff: u32,
101 rincr: u32,
102 ) -> Status {
103 self.zero_ok(ffi::fluid_synth_write_float(
104 self.handle,
105 len as _,
106 lbuf as _,
107 loff as _,
108 lincr as _,
109 rbuf as _,
110 roff as _,
111 rincr as _,
112 ))
113 }
114}