audio_processor_traits/audio_buffer/
mod.rs1use std::ops::{AddAssign, Div};
25
26use num::Zero;
27
28pub use util::*;
32
33mod util;
37
38#[derive(Debug, Clone, Default, PartialEq, PartialOrd, Ord, Eq)]
39pub struct AudioBuffer<SampleType> {
40 channels: Vec<Vec<SampleType>>,
41}
42
43impl<SampleType: Clone + Default> AudioBuffer<SampleType> {
44 pub fn from_interleaved(channels: usize, samples: &[SampleType]) -> Self {
45 let mut buffers = vec![vec![SampleType::default(); samples.len() / channels]; channels];
46 copy_from_interleaved(samples, buffers.as_mut_slice());
47
48 Self::new(buffers)
49 }
50
51 pub fn copy_from_interleaved(&mut self, source: &[SampleType]) {
52 copy_from_interleaved(source, &mut self.channels);
53 }
54
55 pub fn copy_into_interleaved(&self, target: &mut [SampleType]) {
56 copy_into_interleaved(&self.channels, target);
57 }
58}
59
60impl<SampleType: Copy + num::Zero> AudioBuffer<SampleType> {
61 pub fn copy_from(&mut self, source: &Self) {
62 for (target, source) in self.channels.iter_mut().zip(source.channels.iter()) {
63 target.copy_from_slice(source);
64 }
65 }
66}
67
68impl<SampleType: Clone> AudioBuffer<SampleType> {
69 pub fn resize_with(
70 &mut self,
71 channels: usize,
72 samples: usize,
73 mut value: impl FnMut() -> SampleType,
74 ) {
75 self.channels
76 .resize_with(channels, || vec![value(); samples]);
77 }
78}
79
80impl<SampleType: num::Zero + Clone> AudioBuffer<SampleType> {
81 pub fn resize(&mut self, channels: usize, samples: usize) {
82 if self.num_channels() != channels {
83 self.channels
84 .resize_with(channels, || vec![SampleType::zero(); samples]);
85 }
86
87 if self.num_samples() != samples {
88 for channel in &mut self.channels {
89 channel.resize(samples, SampleType::zero());
90 }
91 }
92 }
93}
94
95impl<SampleType> AudioBuffer<SampleType> {
96 pub fn new(channels: Vec<Vec<SampleType>>) -> Self {
97 Self { channels }
98 }
99
100 pub fn empty() -> Self {
101 Self::new(vec![])
102 }
103
104 pub fn channel(&self, channel: usize) -> &[SampleType] {
105 &self.channels[channel]
106 }
107
108 pub fn channel_mut(&mut self, channel: usize) -> &mut [SampleType] {
109 &mut self.channels[channel]
110 }
111
112 pub fn channels(&self) -> &Vec<Vec<SampleType>> {
113 &self.channels
114 }
115
116 pub fn channels_mut(&mut self) -> &mut Vec<Vec<SampleType>> {
117 &mut self.channels
118 }
119
120 pub fn slice_mut(&mut self) -> impl Iterator<Item = &mut SampleType> {
121 self.channels.iter_mut().flat_map(|c| c.iter_mut())
122 }
123
124 pub fn num_channels(&self) -> usize {
125 self.channels.len()
126 }
127
128 pub fn num_samples(&self) -> usize {
129 if self.channels.is_empty() {
130 0
131 } else {
132 self.channels[0].len()
133 }
134 }
135
136 pub fn get(&self, channel: usize, sample: usize) -> &SampleType {
137 &self.channels[channel][sample]
138 }
139
140 pub fn get_mut(&mut self, channel: usize, sample: usize) -> &mut SampleType {
141 &mut self.channels[channel][sample]
142 }
143
144 pub fn set(&mut self, channel: usize, sample: usize, value: SampleType) {
145 self.channels[channel][sample] = value;
146 }
147
148 pub fn is_empty(&self) -> bool {
149 self.channels.is_empty() || self.channels[0].is_empty()
150 }
151}
152
153impl<SampleType: Copy + Zero + Div<Output = SampleType> + AddAssign + From<f32>>
154 AudioBuffer<SampleType>
155{
156 pub fn get_mono(&self, sample: usize) -> SampleType {
157 let mut sum = SampleType::zero();
158 for channel in &self.channels {
159 sum += channel[sample];
160 }
161 sum / SampleType::from(self.channels.len() as f32)
162 }
163}
164
165impl<SampleType: Clone + AddAssign> AudioBuffer<SampleType> {
166 pub fn add(&mut self, other: &Self) {
167 for (channel, other_channel) in self.channels.iter_mut().zip(other.channels.iter()) {
168 for (sample, other_sample) in channel.iter_mut().zip(other_channel.iter()) {
169 *sample += other_sample.clone();
170 }
171 }
172 }
173}
174
175impl<SampleType, I, J> From<I> for AudioBuffer<SampleType>
176where
177 I: Iterator<Item = J>,
178 Vec<SampleType>: From<J>,
179{
180 fn from(value: I) -> Self {
181 AudioBuffer::new(value.map(Vec::from).collect())
182 }
183}
184
185#[cfg(feature = "vst")]
186pub mod vst;
187
188pub fn copy_from_interleaved<SampleType: Clone>(
190 source: &[SampleType],
191 target: &mut [Vec<SampleType>],
192) {
193 if target.is_empty() {
194 return;
195 }
196
197 let num_channels = target.len();
198 for (sample_idx, frame) in source.chunks(num_channels).enumerate() {
199 for (channel_idx, sample) in frame.iter().enumerate() {
200 target[channel_idx][sample_idx] = sample.clone();
201 }
202 }
203}
204
205pub fn copy_into_interleaved<SampleType: Clone>(
206 source: &[Vec<SampleType>],
207 target: &mut [SampleType],
208) {
209 if source.is_empty() {
210 return;
211 }
212
213 let num_channels = source.len();
214 for (sample_idx, frame) in target.chunks_mut(num_channels).enumerate() {
215 for (channel_idx, sample) in frame.iter_mut().enumerate() {
216 *sample = source[channel_idx][sample_idx].clone();
217 }
218 }
219}
220
221pub fn to_interleaved<SampleType: Copy + num::Zero>(
222 source: &[SampleType],
223 num_channels: usize,
224) -> Vec<Vec<SampleType>> {
225 let mut result = vec![vec![SampleType::zero(); source.len() / num_channels]; num_channels];
226 copy_from_interleaved(source, &mut result);
227 result
228}
229
230#[cfg(test)]
231mod test {
232 use super::*;
233
234 #[test]
235 fn test_from_interleaved() {
236 let source = vec![1.0, 2.0, 3.0, 4.0];
237 let target = AudioBuffer::from_interleaved(2, &source);
238 assert_eq!(target.channels, vec![vec![1.0, 3.0], vec![2.0, 4.0]]);
239 }
240
241 #[test]
242 fn test_audio_buffer_copy_from_interleaved() {
243 let source = vec![1.0, 2.0, 3.0, 4.0];
244 let mut target = AudioBuffer::empty();
245 target.resize(2, 2);
246 target.copy_from_interleaved(&source);
247 }
248
249 #[test]
250 fn test_audio_buffer_copy_into_interleaved() {
251 let source = vec![vec![1.0, 3.0], vec![2.0, 4.0]];
252 let buffer = AudioBuffer::new(source);
253
254 let mut target = vec![0.0; 4];
255 buffer.copy_into_interleaved(&mut target);
256 assert_eq!(target, vec![1.0, 2.0, 3.0, 4.0]);
257 }
258
259 #[test]
260 fn test_copy_from_interleaved_empty() {
261 let mut target: Vec<Vec<f32>> = vec![vec![0.0; 0]; 0];
262 let source = vec![];
263 copy_from_interleaved(&source, &mut target);
264 assert_eq!(target, Vec::<Vec<f32>>::new());
265 }
266
267 #[test]
268 fn test_copy_from_interleaved() {
269 let mut target: Vec<Vec<f32>> = vec![vec![0.0; 2]; 2];
270 let source = vec![1.0, 2.0, 3.0, 4.0];
271 copy_from_interleaved(&source, &mut target);
272 assert_eq!(target, vec![vec![1.0, 3.0], vec![2.0, 4.0]]);
273 }
274
275 #[test]
276 fn test_to_interleaved() {
277 let source = vec![1.0, 2.0, 3.0, 4.0];
278 let result = to_interleaved(&source, 2);
279 assert_eq!(result, vec![vec![1.0, 3.0], vec![2.0, 4.0]]);
280 }
281
282 #[test]
283 fn test_copy_into_interleaved() {
284 let source = vec![vec![1.0, 3.0], vec![2.0, 4.0]];
285 let mut target = vec![0.0, 0.0, 0.0, 0.0];
286 copy_into_interleaved(&source, &mut target);
287 assert_eq!(target, vec![1.0, 2.0, 3.0, 4.0]);
288 }
289}