1use crate::BusInfo;
35
36pub struct ConversionBuffers {
43 pub main_input_f32: Vec<Vec<f32>>,
45 pub main_output_f32: Vec<Vec<f32>>,
47 pub aux_input_f32: Vec<Vec<Vec<f32>>>,
49 pub aux_output_f32: Vec<Vec<Vec<f32>>>,
51}
52
53impl ConversionBuffers {
54 pub fn new() -> Self {
59 Self {
60 main_input_f32: Vec::new(),
61 main_output_f32: Vec::new(),
62 aux_input_f32: Vec::new(),
63 aux_output_f32: Vec::new(),
64 }
65 }
66
67 pub fn allocate_from_buses(
78 input_buses: &[BusInfo],
79 output_buses: &[BusInfo],
80 max_frames: usize,
81 ) -> Self {
82 let main_in_channels = input_buses
84 .first()
85 .map(|b| b.channel_count as usize)
86 .unwrap_or(0);
87 let main_out_channels = output_buses
88 .first()
89 .map(|b| b.channel_count as usize)
90 .unwrap_or(0);
91
92 let main_input_f32: Vec<Vec<f32>> = (0..main_in_channels)
93 .map(|_| vec![0.0f32; max_frames])
94 .collect();
95
96 let main_output_f32: Vec<Vec<f32>> = (0..main_out_channels)
97 .map(|_| vec![0.0f32; max_frames])
98 .collect();
99
100 let aux_input_f32: Vec<Vec<Vec<f32>>> = input_buses
102 .iter()
103 .skip(1)
104 .map(|info| {
105 (0..info.channel_count)
106 .map(|_| vec![0.0f32; max_frames])
107 .collect()
108 })
109 .collect();
110
111 let aux_output_f32: Vec<Vec<Vec<f32>>> = output_buses
112 .iter()
113 .skip(1)
114 .map(|info| {
115 (0..info.channel_count)
116 .map(|_| vec![0.0f32; max_frames])
117 .collect()
118 })
119 .collect();
120
121 Self {
122 main_input_f32,
123 main_output_f32,
124 aux_input_f32,
125 aux_output_f32,
126 }
127 }
128
129 pub fn allocate(
141 main_input_channels: usize,
142 main_output_channels: usize,
143 aux_input_channels: &[usize],
144 aux_output_channels: &[usize],
145 max_frames: usize,
146 ) -> Self {
147 let main_input_f32 = (0..main_input_channels)
148 .map(|_| vec![0.0f32; max_frames])
149 .collect();
150
151 let main_output_f32 = (0..main_output_channels)
152 .map(|_| vec![0.0f32; max_frames])
153 .collect();
154
155 let aux_input_f32 = aux_input_channels
156 .iter()
157 .map(|&channels| (0..channels).map(|_| vec![0.0f32; max_frames]).collect())
158 .collect();
159
160 let aux_output_f32 = aux_output_channels
161 .iter()
162 .map(|&channels| (0..channels).map(|_| vec![0.0f32; max_frames]).collect())
163 .collect();
164
165 Self {
166 main_input_f32,
167 main_output_f32,
168 aux_input_f32,
169 aux_output_f32,
170 }
171 }
172
173 #[inline]
181 pub fn main_input_mut(&mut self, channel: usize) -> Option<&mut [f32]> {
182 self.main_input_f32.get_mut(channel).map(|v| v.as_mut_slice())
183 }
184
185 #[inline]
187 pub fn main_input(&self, channel: usize) -> Option<&[f32]> {
188 self.main_input_f32.get(channel).map(|v| v.as_slice())
189 }
190
191 #[inline]
193 pub fn main_output_mut(&mut self, channel: usize) -> Option<&mut [f32]> {
194 self.main_output_f32.get_mut(channel).map(|v| v.as_mut_slice())
195 }
196
197 #[inline]
199 pub fn main_output(&self, channel: usize) -> Option<&[f32]> {
200 self.main_output_f32.get(channel).map(|v| v.as_slice())
201 }
202
203 #[inline]
205 pub fn main_input_channel_count(&self) -> usize {
206 self.main_input_f32.len()
207 }
208
209 #[inline]
211 pub fn main_output_channel_count(&self) -> usize {
212 self.main_output_f32.len()
213 }
214
215 #[inline]
227 pub fn aux_input_mut(&mut self, bus: usize, channel: usize, len: usize) -> Option<&mut [f32]> {
228 self.aux_input_f32
229 .get_mut(bus)
230 .and_then(|b| b.get_mut(channel))
231 .map(|v| {
232 let actual_len = len.min(v.len());
233 &mut v[..actual_len]
234 })
235 }
236
237 #[inline]
239 pub fn aux_input(&self, bus: usize, channel: usize, len: usize) -> Option<&[f32]> {
240 self.aux_input_f32
241 .get(bus)
242 .and_then(|b| b.get(channel))
243 .map(|v| &v[..len.min(v.len())])
244 }
245
246 #[inline]
248 pub fn aux_output_mut(&mut self, bus: usize, channel: usize, len: usize) -> Option<&mut [f32]> {
249 self.aux_output_f32
250 .get_mut(bus)
251 .and_then(|b| b.get_mut(channel))
252 .map(|v| {
253 let actual_len = len.min(v.len());
254 &mut v[..actual_len]
255 })
256 }
257
258 #[inline]
260 pub fn aux_output(&self, bus: usize, channel: usize, len: usize) -> Option<&[f32]> {
261 self.aux_output_f32
262 .get(bus)
263 .and_then(|b| b.get(channel))
264 .map(|v| &v[..len.min(v.len())])
265 }
266
267 #[inline]
269 pub fn aux_input_bus_count(&self) -> usize {
270 self.aux_input_f32.len()
271 }
272
273 #[inline]
275 pub fn aux_output_bus_count(&self) -> usize {
276 self.aux_output_f32.len()
277 }
278
279 #[inline]
281 pub fn aux_input_channel_count(&self, bus: usize) -> usize {
282 self.aux_input_f32.get(bus).map(|b| b.len()).unwrap_or(0)
283 }
284
285 #[inline]
287 pub fn aux_output_channel_count(&self, bus: usize) -> usize {
288 self.aux_output_f32.get(bus).map(|b| b.len()).unwrap_or(0)
289 }
290}
291
292impl Default for ConversionBuffers {
293 fn default() -> Self {
294 Self::new()
295 }
296}
297
298#[cfg(test)]
299mod tests {
300 use super::*;
301
302 #[test]
303 fn test_new_empty() {
304 let buffers = ConversionBuffers::new();
305 assert_eq!(buffers.main_input_channel_count(), 0);
306 assert_eq!(buffers.main_output_channel_count(), 0);
307 assert_eq!(buffers.aux_input_bus_count(), 0);
308 assert_eq!(buffers.aux_output_bus_count(), 0);
309 }
310
311 #[test]
312 fn test_allocate_stereo() {
313 let buffers = ConversionBuffers::allocate(2, 2, &[], &[], 512);
314
315 assert_eq!(buffers.main_input_channel_count(), 2);
316 assert_eq!(buffers.main_output_channel_count(), 2);
317 assert_eq!(buffers.aux_input_bus_count(), 0);
318 assert_eq!(buffers.aux_output_bus_count(), 0);
319
320 assert_eq!(buffers.main_input_f32[0].len(), 512);
322 assert_eq!(buffers.main_output_f32[1].len(), 512);
323 }
324
325 #[test]
326 fn test_allocate_with_aux() {
327 let buffers = ConversionBuffers::allocate(2, 2, &[2, 1], &[2], 256);
328
329 assert_eq!(buffers.main_input_channel_count(), 2);
330 assert_eq!(buffers.main_output_channel_count(), 2);
331 assert_eq!(buffers.aux_input_bus_count(), 2);
332 assert_eq!(buffers.aux_output_bus_count(), 1);
333
334 assert_eq!(buffers.aux_input_channel_count(0), 2);
335 assert_eq!(buffers.aux_input_channel_count(1), 1);
336 assert_eq!(buffers.aux_output_channel_count(0), 2);
337 }
338
339 #[test]
340 fn test_allocate_from_buses() {
341 let input_buses = vec![
342 BusInfo::stereo("Main In"),
343 BusInfo::aux("Sidechain", 2),
344 ];
345 let output_buses = vec![BusInfo::stereo("Main Out")];
346
347 let buffers = ConversionBuffers::allocate_from_buses(&input_buses, &output_buses, 1024);
348
349 assert_eq!(buffers.main_input_channel_count(), 2);
350 assert_eq!(buffers.main_output_channel_count(), 2);
351 assert_eq!(buffers.aux_input_bus_count(), 1);
352 assert_eq!(buffers.aux_input_channel_count(0), 2);
353 assert_eq!(buffers.aux_output_bus_count(), 0);
354 }
355
356 #[test]
357 fn test_accessors() {
358 let mut buffers = ConversionBuffers::allocate(2, 2, &[2], &[], 128);
359
360 if let Some(buf) = buffers.main_input_mut(0) {
362 buf[0] = 0.5;
363 }
364 assert_eq!(buffers.main_input(0).unwrap()[0], 0.5);
365
366 if let Some(buf) = buffers.main_output_mut(1) {
368 buf[10] = -0.5;
369 }
370 assert_eq!(buffers.main_output(1).unwrap()[10], -0.5);
371
372 if let Some(buf) = buffers.aux_input_mut(0, 0, 64) {
374 buf[0] = 0.25;
375 }
376 assert_eq!(buffers.aux_input(0, 0, 64).unwrap()[0], 0.25);
377
378 assert!(buffers.main_input(5).is_none());
380 assert!(buffers.aux_input(5, 0, 64).is_none());
381 }
382}