1use super::audionode::*;
4use super::*;
5extern crate alloc;
6use alloc::vec::Vec;
7use numeric_array::ArrayLength;
8
9pub struct BufferMut<'a>(&'a mut [F32x]);
14
15impl<'a> BufferMut<'a> {
16 #[inline]
18 pub fn new(buffer: &'a mut [F32x]) -> Self {
19 debug_assert!(buffer.len() & (SIMD_LEN - 1) == 0);
20 Self(buffer)
21 }
22
23 #[inline]
25 pub fn empty() -> Self {
26 Self(&mut [])
27 }
28
29 #[inline]
31 pub fn subset(&mut self, first_channel: usize, channels: usize) -> BufferMut {
32 debug_assert!(first_channel + channels <= self.channels());
33 BufferMut::new(
34 &mut self.0[(first_channel << SIMD_C)..((first_channel + channels) << SIMD_C)],
35 )
36 }
37
38 #[inline]
40 pub fn buffer_ref(&mut self) -> BufferRef {
41 BufferRef::new(self.0)
42 }
43
44 #[inline]
46 pub fn channels(&self) -> usize {
47 self.0.len() >> SIMD_C
48 }
49
50 #[inline]
52 pub fn channel(&self, channel: usize) -> &[F32x] {
53 debug_assert!(channel < self.channels());
54 &(self.0)[(channel << SIMD_C)..(channel + 1) << SIMD_C]
55 }
56
57 #[inline]
59 pub fn channel_mut(&mut self, channel: usize) -> &mut [F32x] {
60 debug_assert!(channel < self.channels());
61 &mut (self.0)[(channel << SIMD_C)..(channel + 1) << SIMD_C]
62 }
63
64 #[inline]
66 pub fn channel_f32(&self, channel: usize) -> &'a [f32] {
67 debug_assert!(channel < self.channels());
68 let data = self.channel(channel).as_ptr() as *const f32;
69 unsafe { core::slice::from_raw_parts(data, MAX_BUFFER_SIZE) }
71 }
72
73 #[inline]
75 pub fn channel_f32_mut(&mut self, channel: usize) -> &'a mut [f32] {
76 debug_assert!(channel < self.channels());
77 let data = self.channel_mut(channel).as_mut_ptr() as *mut f32;
78 unsafe { core::slice::from_raw_parts_mut(data, MAX_BUFFER_SIZE) }
80 }
81
82 #[inline]
84 pub fn set(&mut self, channel: usize, i: usize, value: F32x) {
85 debug_assert!(channel < self.channels());
86 (self.0)[(channel << SIMD_C) + i] = value;
87 }
88
89 #[inline]
91 pub fn set_f32(&mut self, channel: usize, i: usize, value: f32) {
92 debug_assert!(channel < self.channels());
93 (self.0)[(channel << SIMD_C) + (i >> SIMD_S)].as_array_mut()[i & SIMD_M] = value;
94 }
97
98 #[inline]
100 pub fn at(&self, channel: usize, i: usize) -> F32x {
101 debug_assert!(channel < self.channels());
102 (self.0)[(channel << SIMD_C) + i]
103 }
104
105 #[inline]
107 pub fn at_mut(&mut self, channel: usize, i: usize) -> &mut F32x {
108 debug_assert!(channel < self.channels());
109 &mut (self.0)[(channel << SIMD_C) + i]
110 }
111
112 #[inline]
114 pub fn at_f32(&self, channel: usize, i: usize) -> f32 {
115 debug_assert!(channel < self.channels());
116 (self.0)[(channel << SIMD_C) + (i >> SIMD_S)].as_array_ref()[i & SIMD_M]
117 }
118
119 pub fn add(&mut self, channel: usize, i: usize, value: F32x) {
121 debug_assert!(channel < self.channels());
122 (self.0)[(channel << SIMD_C) + i] += value;
123 }
124}
125
126pub struct BufferRef<'a>(&'a [F32x]);
130
131impl<'a> BufferRef<'a> {
132 #[inline]
134 pub fn new(buffer: &'a [F32x]) -> Self {
135 debug_assert!(buffer.len() & (SIMD_LEN - 1) == 0);
136 Self(buffer)
137 }
138
139 #[inline]
141 pub fn empty() -> Self {
142 Self(&[])
143 }
144
145 #[inline]
147 pub fn subset(&self, first_channel: usize, channels: usize) -> BufferRef {
148 debug_assert!(first_channel + channels <= self.channels());
149 BufferRef::new(&self.0[(first_channel << SIMD_C)..((first_channel + channels) << SIMD_C)])
150 }
151
152 #[inline]
154 pub fn channels(&self) -> usize {
155 self.0.len() >> SIMD_C
156 }
157
158 #[inline]
160 pub fn channel(&self, channel: usize) -> &[F32x] {
161 debug_assert!(channel < self.channels());
162 &(self.0)[(channel << SIMD_C)..(channel + 1) << SIMD_C]
163 }
164
165 #[inline]
167 pub fn channel_f32(&self, channel: usize) -> &'a [f32] {
168 debug_assert!(channel < self.channels());
169 let data = self.channel(channel).as_ptr() as *const f32;
170 unsafe { core::slice::from_raw_parts(data, MAX_BUFFER_SIZE) }
172 }
173
174 #[inline]
176 pub fn at(&self, channel: usize, i: usize) -> F32x {
177 debug_assert!(channel < self.channels());
178 (self.0)[(channel << SIMD_C) + i]
179 }
180
181 #[inline]
183 pub fn at_f32(&self, channel: usize, i: usize) -> f32 {
184 debug_assert!(channel < self.channels());
185 (self.0)[(channel << SIMD_C) + (i >> SIMD_S)].as_array_ref()[i & SIMD_M]
186 }
187}
188
189#[derive(Clone, Default)]
192pub struct BufferVec {
193 buffer: Vec<F32x>,
194}
195
196impl BufferVec {
197 pub fn new(channels: usize) -> Self {
199 let mut buffer = Vec::with_capacity(channels << SIMD_C);
200 buffer.resize(channels << SIMD_C, F32x::ZERO);
201 Self { buffer }
202 }
203
204 #[inline]
206 pub fn channels(&self) -> usize {
207 self.buffer.len() >> SIMD_C
208 }
209
210 #[inline]
212 pub fn length(&self) -> usize {
213 SIMD_LEN
214 }
215
216 #[inline]
218 #[allow(clippy::len_without_is_empty)]
219 pub fn len(&self) -> usize {
220 SIMD_LEN
221 }
222
223 #[inline]
225 pub fn at(&self, channel: usize, i: usize) -> F32x {
226 debug_assert!(channel < self.channels());
227 self.buffer[(channel << SIMD_C) + i]
228 }
229
230 #[inline]
232 pub fn set(&mut self, channel: usize, i: usize, value: F32x) {
233 debug_assert!(channel < self.channels());
234 self.buffer[(channel << SIMD_C) + i] = value;
235 }
236
237 #[inline]
239 pub fn at_f32(&self, channel: usize, i: usize) -> f32 {
240 debug_assert!(channel < self.channels());
241 self.buffer[(channel << SIMD_C) + (i >> SIMD_S)].as_array_ref()[i & SIMD_M]
242 }
243
244 #[inline]
246 pub fn set_f32(&mut self, channel: usize, i: usize, value: f32) {
247 debug_assert!(channel < self.channels());
248 self.buffer[(channel << SIMD_C) + (i >> SIMD_S)].as_array_mut()[i & SIMD_M] = value;
249 }
250
251 #[inline]
253 pub fn channel(&self, channel: usize) -> &[F32x] {
254 debug_assert!(channel < self.channels());
255 &self.buffer[(channel << SIMD_C)..(channel + 1) << SIMD_C]
256 }
257
258 #[inline]
260 pub fn channel_mut(&mut self, channel: usize) -> &mut [F32x] {
261 debug_assert!(channel < self.channels());
262 &mut self.buffer[(channel << SIMD_C)..(channel + 1) << SIMD_C]
263 }
264
265 #[inline]
267 pub fn channel_f32(&mut self, channel: usize) -> &[f32] {
268 debug_assert!(channel < self.channels());
269 let data = self.channel(channel).as_ptr() as *const f32;
270 unsafe { core::slice::from_raw_parts(data, MAX_BUFFER_SIZE) }
272 }
273
274 #[inline]
276 pub fn channel_f32_mut(&mut self, channel: usize) -> &mut [f32] {
277 debug_assert!(channel < self.channels());
278 let data = self.channel_mut(channel).as_mut_ptr() as *mut f32;
279 unsafe { core::slice::from_raw_parts_mut(data, MAX_BUFFER_SIZE) }
281 }
282
283 #[inline]
285 pub fn clear(&mut self) {
286 self.buffer.fill(F32x::ZERO);
287 }
288
289 pub fn resize(&mut self, channels: usize) {
291 self.buffer.resize(channels << SIMD_C, F32x::ZERO);
292 }
293
294 #[inline]
296 pub fn buffer_ref(&self) -> BufferRef {
297 BufferRef::new(&self.buffer)
298 }
299
300 #[inline]
302 pub fn buffer_mut(&mut self) -> BufferMut {
303 BufferMut::new(&mut self.buffer)
304 }
305}
306
307#[repr(C)]
313#[derive(Clone, Default)]
314pub struct BufferArray<N: ArrayLength> {
315 array: Frame<[F32x; SIMD_LEN], N>,
316}
317
318impl<N: ArrayLength> BufferArray<N> {
319 #[inline]
321 pub fn new() -> Self {
322 Self::default()
323 }
324
325 #[inline]
327 pub(crate) fn uninitialized() -> Self {
328 #[allow(clippy::uninit_assumed_init)]
330 unsafe {
331 core::mem::MaybeUninit::uninit().assume_init()
332 }
333 }
334
335 #[inline]
337 pub fn at(&self, channel: usize, i: usize) -> F32x {
338 self.array[channel][i]
339 }
340
341 #[inline]
343 pub fn at_f32(&self, channel: usize, i: usize) -> f32 {
344 debug_assert!(channel < self.channels());
345 self.array[channel][i >> SIMD_S].as_array_ref()[i & SIMD_M]
346 }
347
348 #[inline]
350 pub fn set(&mut self, channel: usize, i: usize, value: F32x) {
351 debug_assert!(channel < self.channels());
352 self.array[channel][i] = value;
353 }
354
355 #[inline]
357 pub fn set_f32(&mut self, channel: usize, i: usize, value: f32) {
358 debug_assert!(channel < self.channels());
359 self.array[channel][i >> SIMD_S].as_array_mut()[i & SIMD_M] = value;
360 }
361
362 #[inline]
364 pub fn channels(&self) -> usize {
365 N::USIZE
366 }
367
368 #[inline]
370 pub fn length(&self) -> usize {
371 SIMD_LEN
372 }
373
374 #[inline]
376 #[allow(clippy::len_without_is_empty)]
377 pub fn len(&self) -> usize {
378 SIMD_LEN
379 }
380
381 #[inline]
383 pub fn clear(&mut self) {
384 self.array.fill([F32x::ZERO; SIMD_LEN]);
385 }
386
387 #[inline]
389 pub fn channel(&self, channel: usize) -> &[F32x] {
390 unsafe {
392 &core::slice::from_raw_parts(self.array.as_ptr() as *const F32x, N::USIZE << SIMD_C)
393 [(channel << SIMD_C)..(channel + 1) << SIMD_C]
394 }
395 }
396
397 #[inline]
399 pub fn channel_mut(&mut self, channel: usize) -> &mut [F32x] {
400 unsafe {
402 &mut core::slice::from_raw_parts_mut(
403 self.array.as_mut_ptr() as *mut F32x,
404 N::USIZE << SIMD_C,
405 )[(channel << SIMD_C)..(channel + 1) << SIMD_C]
406 }
407 }
408
409 #[inline]
411 pub fn channel_f32(&mut self, channel: usize) -> &[f32] {
412 let data = self.channel(channel).as_ptr() as *const f32;
413 unsafe { core::slice::from_raw_parts(data, MAX_BUFFER_SIZE) }
415 }
416
417 #[inline]
419 pub fn channel_f32_mut(&mut self, channel: usize) -> &mut [f32] {
420 let data = self.channel_mut(channel).as_mut_ptr() as *mut f32;
421 unsafe { core::slice::from_raw_parts_mut(data, MAX_BUFFER_SIZE) }
423 }
424
425 #[inline]
427 pub fn buffer_ref(&self) -> BufferRef {
428 let slice = unsafe {
430 core::slice::from_raw_parts(self.array.as_ptr() as *const F32x, N::USIZE << SIMD_C)
431 };
432 BufferRef::new(slice)
433 }
434
435 #[inline]
437 pub fn buffer_mut(&mut self) -> BufferMut {
438 let data = self.array.as_mut_ptr() as *mut F32x;
440 let slice = unsafe { core::slice::from_raw_parts_mut(data, N::USIZE << SIMD_C) };
441 BufferMut::new(slice)
442 }
443}