1use rtsan_standalone::nonblocking;
2
3use core::{marker::PhantomData, ptr::NonNull};
4
5use super::view::AudioBlockSequentialView;
6use crate::{
7 AudioBlock, AudioBlockMut, Sample,
8 iter::{StridedSampleIter, StridedSampleIterMut},
9};
10
11pub struct AudioBlockSequentialViewMut<'a, S: Sample> {
31 data: &'a mut [S],
32 num_channels: u16,
33 num_frames: usize,
34 num_channels_allocated: u16,
35 num_frames_allocated: usize,
36}
37
38impl<'a, S: Sample> AudioBlockSequentialViewMut<'a, S> {
39 #[nonblocking]
48 pub fn from_slice(data: &'a mut [S], num_channels: u16) -> Self {
49 assert!(
50 num_channels > 0 && data.len() % num_channels as usize == 0,
51 "data length {} must be divisible by num_channels {}",
52 data.len(),
53 num_channels
54 );
55 let num_frames = data.len() / num_channels as usize;
56 Self {
57 data,
58 num_channels,
59 num_frames,
60 num_channels_allocated: num_channels,
61 num_frames_allocated: num_frames,
62 }
63 }
64
65 #[nonblocking]
82 pub fn from_slice_limited(
83 data: &'a mut [S],
84 num_channels_visible: u16,
85 num_frames_visible: usize,
86 num_channels_allocated: u16,
87 num_frames_allocated: usize,
88 ) -> Self {
89 assert!(num_channels_visible <= num_channels_allocated);
90 assert!(num_frames_visible <= num_frames_allocated);
91 assert_eq!(
92 data.len(),
93 num_channels_allocated as usize * num_frames_allocated
94 );
95 Self {
96 data,
97 num_channels: num_channels_visible,
98 num_frames: num_frames_visible,
99 num_channels_allocated,
100 num_frames_allocated,
101 }
102 }
103
104 #[nonblocking]
113 pub unsafe fn from_ptr(ptr: *mut S, num_channels: u16, num_frames: usize) -> Self {
114 Self {
115 data: unsafe {
116 std::slice::from_raw_parts_mut(ptr, num_channels as usize * num_frames)
117 },
118 num_channels,
119 num_frames,
120 num_channels_allocated: num_channels,
121 num_frames_allocated: num_frames,
122 }
123 }
124
125 #[nonblocking]
134 pub unsafe fn from_ptr_limited(
135 ptr: *mut S,
136 num_channels_visible: u16,
137 num_frames_visible: usize,
138 num_channels_allocated: u16,
139 num_frames_allocated: usize,
140 ) -> Self {
141 assert!(num_channels_visible <= num_channels_allocated);
142 assert!(num_frames_visible <= num_frames_allocated);
143 Self {
144 data: unsafe {
145 std::slice::from_raw_parts_mut(
146 ptr,
147 num_channels_allocated as usize * num_frames_allocated,
148 )
149 },
150 num_channels: num_channels_visible,
151 num_frames: num_frames_visible,
152 num_channels_allocated,
153 num_frames_allocated,
154 }
155 }
156
157 #[nonblocking]
163 pub fn channel(&self, channel: u16) -> &[S] {
164 assert!(channel < self.num_channels);
165 let start = channel as usize * self.num_frames_allocated;
166 let end = start + self.num_frames;
167 &self.data[start..end]
168 }
169
170 #[nonblocking]
176 pub fn channel_mut(&mut self, channel: u16) -> &mut [S] {
177 assert!(channel < self.num_channels);
178 let start = channel as usize * self.num_frames_allocated;
179 let end = start + self.num_frames;
180 &mut self.data[start..end]
181 }
182
183 #[nonblocking]
187 pub fn channels(&self) -> impl ExactSizeIterator<Item = &[S]> {
188 self.data
189 .chunks(self.num_frames_allocated)
190 .take(self.num_channels as usize)
191 .map(|frame| &frame[..self.num_frames])
192 }
193
194 #[nonblocking]
198 pub fn channels_mut(&mut self) -> impl ExactSizeIterator<Item = &mut [S]> {
199 self.data
200 .chunks_mut(self.num_frames_allocated)
201 .take(self.num_channels as usize)
202 .map(|frame| &mut frame[..self.num_frames])
203 }
204
205 #[nonblocking]
210 pub fn raw_data(&self) -> &[S] {
211 &self.data
212 }
213
214 #[nonblocking]
219 pub fn raw_data_mut(&mut self) -> &mut [S] {
220 &mut self.data
221 }
222
223 #[nonblocking]
224 pub fn view(&self) -> AudioBlockSequentialView<'_, S> {
225 AudioBlockSequentialView::from_slice_limited(
226 self.data,
227 self.num_channels,
228 self.num_frames,
229 self.num_channels_allocated,
230 self.num_frames_allocated,
231 )
232 }
233
234 #[nonblocking]
235 pub fn view_mut(&mut self) -> AudioBlockSequentialViewMut<'_, S> {
236 AudioBlockSequentialViewMut::from_slice_limited(
237 self.data,
238 self.num_channels,
239 self.num_frames,
240 self.num_channels_allocated,
241 self.num_frames_allocated,
242 )
243 }
244}
245
246impl<S: Sample> AudioBlock<S> for AudioBlockSequentialViewMut<'_, S> {
247 type PlanarView = [S; 0];
248
249 #[nonblocking]
250 fn num_channels(&self) -> u16 {
251 self.num_channels
252 }
253
254 #[nonblocking]
255 fn num_frames(&self) -> usize {
256 self.num_frames
257 }
258
259 #[nonblocking]
260 fn num_channels_allocated(&self) -> u16 {
261 self.num_channels_allocated
262 }
263
264 #[nonblocking]
265 fn num_frames_allocated(&self) -> usize {
266 self.num_frames_allocated
267 }
268
269 #[nonblocking]
270 fn layout(&self) -> crate::BlockLayout {
271 crate::BlockLayout::Sequential
272 }
273
274 #[nonblocking]
275 fn sample(&self, channel: u16, frame: usize) -> S {
276 assert!(channel < self.num_channels);
277 assert!(frame < self.num_frames);
278 unsafe {
279 *self
280 .data
281 .get_unchecked(channel as usize * self.num_frames_allocated + frame)
282 }
283 }
284
285 #[nonblocking]
286 fn channel_iter(&self, channel: u16) -> impl ExactSizeIterator<Item = &S> {
287 assert!(channel < self.num_channels);
288 self.data
289 .iter()
290 .skip(channel as usize * self.num_frames_allocated)
291 .take(self.num_frames)
292 }
293
294 #[nonblocking]
295 fn channels_iter(&self) -> impl ExactSizeIterator<Item = impl ExactSizeIterator<Item = &S>> {
296 let num_frames = self.num_frames; let num_frames_allocated = self.num_frames_allocated; self.data
300 .chunks(num_frames_allocated)
301 .take(self.num_channels as usize)
302 .map(move |channel_chunk| channel_chunk.iter().take(num_frames))
303 }
304
305 #[nonblocking]
306 fn frame_iter(&self, frame: usize) -> impl ExactSizeIterator<Item = &S> {
307 assert!(frame < self.num_frames);
308 self.data
309 .iter()
310 .skip(frame)
311 .step_by(self.num_frames_allocated)
312 .take(self.num_channels as usize)
313 }
314
315 #[nonblocking]
316 fn frames_iter(&self) -> impl ExactSizeIterator<Item = impl ExactSizeIterator<Item = &S>> {
317 let num_channels = self.num_channels as usize;
318 let num_frames = self.num_frames;
319 let stride = self.num_frames_allocated;
320 let data_ptr = self.data.as_ptr();
321
322 (0..num_frames).map(move |frame_idx| {
323 let start_ptr = if self.data.is_empty() {
328 NonNull::dangling().as_ptr() } else {
330 unsafe { data_ptr.add(frame_idx) }
333 };
334
335 StridedSampleIter::<'_, S> {
336 ptr: NonNull::new(start_ptr as *mut S).unwrap_or(NonNull::dangling()), stride,
341 remaining: num_channels, _marker: PhantomData,
343 }
344 })
345 }
346
347 #[nonblocking]
348 fn as_view(&self) -> impl AudioBlock<S> {
349 self.view()
350 }
351
352 #[nonblocking]
353 fn as_sequential_view(&self) -> Option<AudioBlockSequentialView<'_, S>> {
354 Some(self.view())
355 }
356}
357
358impl<S: Sample> AudioBlockMut<S> for AudioBlockSequentialViewMut<'_, S> {
359 type PlanarViewMut = [S; 0];
360
361 #[nonblocking]
362 fn set_num_channels_visible(&mut self, num_channels: u16) {
363 assert!(num_channels <= self.num_channels_allocated);
364 self.num_channels = num_channels;
365 }
366
367 #[nonblocking]
368 fn set_num_frames_visible(&mut self, num_frames: usize) {
369 assert!(num_frames <= self.num_frames_allocated);
370 self.num_frames = num_frames;
371 }
372
373 #[nonblocking]
374 fn sample_mut(&mut self, channel: u16, frame: usize) -> &mut S {
375 assert!(channel < self.num_channels);
376 assert!(frame < self.num_frames);
377 unsafe {
378 self.data
379 .get_unchecked_mut(channel as usize * self.num_frames_allocated + frame)
380 }
381 }
382
383 #[nonblocking]
384 fn channel_iter_mut(&mut self, channel: u16) -> impl ExactSizeIterator<Item = &mut S> {
385 assert!(channel < self.num_channels);
386 self.data
387 .iter_mut()
388 .skip(channel as usize * self.num_frames_allocated)
389 .take(self.num_frames)
390 }
391
392 #[nonblocking]
393 fn channels_iter_mut(
394 &mut self,
395 ) -> impl ExactSizeIterator<Item = impl ExactSizeIterator<Item = &mut S>> {
396 let num_frames = self.num_frames;
397 let num_frames_allocated = self.num_frames_allocated;
398 self.data
399 .chunks_mut(num_frames_allocated)
400 .take(self.num_channels as usize)
401 .map(move |channel_chunk| channel_chunk.iter_mut().take(num_frames))
402 }
403
404 #[nonblocking]
405 fn frame_iter_mut(&mut self, frame: usize) -> impl ExactSizeIterator<Item = &mut S> {
406 assert!(frame < self.num_frames);
407 self.data
408 .iter_mut()
409 .skip(frame)
410 .step_by(self.num_frames_allocated)
411 .take(self.num_channels as usize)
412 }
413
414 #[nonblocking]
415 fn frames_iter_mut(
416 &mut self,
417 ) -> impl ExactSizeIterator<Item = impl ExactSizeIterator<Item = &mut S>> {
418 let num_channels = self.num_channels as usize;
419 let num_frames = self.num_frames;
420 let stride = self.num_frames_allocated;
421 let data_ptr = self.data.as_mut_ptr();
422
423 (0..num_frames).map(move |frame_idx| {
424 let start_ptr = if self.data.is_empty() {
429 NonNull::dangling().as_ptr() } else {
431 unsafe { data_ptr.add(frame_idx) }
434 };
435
436 StridedSampleIterMut::<'_, S> {
437 ptr: NonNull::new(start_ptr).unwrap_or(NonNull::dangling()), stride,
442 remaining: num_channels, _marker: PhantomData,
444 }
445 })
446 }
447
448 #[nonblocking]
449 fn as_view_mut(&mut self) -> impl AudioBlockMut<S> {
450 self.view_mut()
451 }
452
453 #[nonblocking]
454 fn as_sequential_view_mut(&mut self) -> Option<AudioBlockSequentialViewMut<'_, S>> {
455 Some(self.view_mut())
456 }
457}
458
459impl<S: Sample + core::fmt::Debug> core::fmt::Debug for AudioBlockSequentialViewMut<'_, S> {
460 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
461 writeln!(f, "AudioBlockSequentialViewMut {{")?;
462 writeln!(f, " num_channels: {}", self.num_channels)?;
463 writeln!(f, " num_frames: {}", self.num_frames)?;
464 writeln!(
465 f,
466 " num_channels_allocated: {}",
467 self.num_channels_allocated
468 )?;
469 writeln!(f, " num_frames_allocated: {}", self.num_frames_allocated)?;
470 writeln!(f, " channels:")?;
471
472 for (i, channel) in self.channels().enumerate() {
473 writeln!(f, " {}: {:?}", i, channel)?;
474 }
475
476 writeln!(f, " raw_data: {:?}", self.raw_data())?;
477 writeln!(f, "}}")?;
478
479 Ok(())
480 }
481}
482
483#[cfg(test)]
484mod tests {
485 use super::*;
486 use rtsan_standalone::no_sanitize_realtime;
487
488 #[test]
489 fn test_member_functions() {
490 let mut data = [0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 0.0, 0.0, 0.0, 0.0];
491 let mut block =
492 AudioBlockSequentialViewMut::<f32>::from_slice_limited(&mut data, 2, 3, 3, 4);
493
494 assert_eq!(block.channel(0), &[0.0, 1.0, 2.0]);
496 assert_eq!(block.channel(1), &[4.0, 5.0, 6.0]);
497
498 assert_eq!(block.channel_mut(0), &[0.0, 1.0, 2.0]);
499 assert_eq!(block.channel_mut(1), &[4.0, 5.0, 6.0]);
500
501 let mut channels = block.channels();
503 assert_eq!(channels.next().unwrap(), &[0.0, 1.0, 2.0]);
504 assert_eq!(channels.next().unwrap(), &[4.0, 5.0, 6.0]);
505 assert_eq!(channels.next(), None);
506 drop(channels);
507
508 let mut channels = block.channels_mut();
509 assert_eq!(channels.next().unwrap(), &[0.0, 1.0, 2.0]);
510 assert_eq!(channels.next().unwrap(), &[4.0, 5.0, 6.0]);
511 assert_eq!(channels.next(), None);
512 drop(channels);
513
514 assert_eq!(
516 block.raw_data(),
517 &[0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 0.0, 0.0, 0.0, 0.0]
518 );
519
520 let view = block.view();
522 assert_eq!(view.num_channels(), block.num_channels());
523 assert_eq!(view.num_frames(), block.num_frames());
524 assert_eq!(
525 view.num_channels_allocated(),
526 block.num_channels_allocated()
527 );
528 assert_eq!(view.num_frames_allocated(), block.num_frames_allocated());
529 assert_eq!(view.raw_data(), block.raw_data());
530
531 let num_channels = block.num_channels();
532 let num_frames = block.num_frames();
533 let num_channels_allocated = block.num_channels_allocated();
534 let num_frames_allocated = block.num_frames_allocated();
535 let data = block.raw_data().to_vec();
536 let view = block.view_mut();
537 assert_eq!(view.num_channels(), num_channels);
538 assert_eq!(view.num_frames(), num_frames);
539 assert_eq!(view.num_channels_allocated(), num_channels_allocated);
540 assert_eq!(view.num_frames_allocated(), num_frames_allocated);
541 assert_eq!(view.raw_data(), &data);
542 }
543
544 #[test]
545 fn test_samples() {
546 let mut data = vec![0.0; 10];
547 let mut block = AudioBlockSequentialViewMut::<f32>::from_slice(&mut data, 2);
548
549 let num_frames = block.num_frames();
550 for ch in 0..block.num_channels() {
551 for f in 0..block.num_frames() {
552 *block.sample_mut(ch, f) = (ch as usize * num_frames + f) as f32;
553 }
554 }
555
556 for ch in 0..block.num_channels() {
557 for f in 0..block.num_frames() {
558 assert_eq!(block.sample(ch, f), (ch as usize * num_frames + f) as f32);
559 }
560 }
561
562 assert_eq!(
563 block.raw_data(),
564 &[0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0]
565 );
566 }
567
568 #[test]
569 fn test_channels() {
570 let mut data = [0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 0.0, 0.0, 0.0, 0.0];
571 let mut block = AudioBlockSequentialViewMut::from_slice_limited(&mut data, 2, 3, 3, 4);
572
573 let mut channels = block.channels();
574 assert_eq!(channels.next().unwrap(), &[0.0, 1.0, 2.0]);
575 assert_eq!(channels.next().unwrap(), &[4.0, 5.0, 6.0]);
576 assert_eq!(channels.next(), None);
577 drop(channels);
578
579 let mut channels = block.channels_mut();
580 assert_eq!(channels.next().unwrap(), &[0.0, 1.0, 2.0]);
581 assert_eq!(channels.next().unwrap(), &[4.0, 5.0, 6.0]);
582 assert_eq!(channels.next(), None);
583 }
584
585 #[test]
586 fn test_channel_iter() {
587 let mut data = vec![0.0; 10];
588 let mut block = AudioBlockSequentialViewMut::<f32>::from_slice(&mut data, 2);
589
590 let channel = block.channel_iter(0).copied().collect::<Vec<_>>();
591 assert_eq!(channel, vec![0.0, 0.0, 0.0, 0.0, 0.0]);
592 let channel = block.channel_iter(1).copied().collect::<Vec<_>>();
593 assert_eq!(channel, vec![0.0, 0.0, 0.0, 0.0, 0.0]);
594
595 block
596 .channel_iter_mut(0)
597 .enumerate()
598 .for_each(|(i, v)| *v = i as f32);
599 block
600 .channel_iter_mut(1)
601 .enumerate()
602 .for_each(|(i, v)| *v = i as f32 + 10.0);
603
604 let channel = block.channel_iter(0).copied().collect::<Vec<_>>();
605 assert_eq!(channel, vec![0.0, 1.0, 2.0, 3.0, 4.0]);
606 let channel = block.channel_iter(1).copied().collect::<Vec<_>>();
607 assert_eq!(channel, vec![10.0, 11.0, 12.0, 13.0, 14.0]);
608 }
609
610 #[test]
611 fn test_channel_iters() {
612 let mut data = vec![0.0; 10];
613 let mut block = AudioBlockSequentialViewMut::<f32>::from_slice(&mut data, 2);
614
615 let mut channels_iter = block.channels_iter();
616 let channel = channels_iter.next().unwrap().copied().collect::<Vec<_>>();
617 assert_eq!(channel, vec![0.0, 0.0, 0.0, 0.0, 0.0]);
618 let channel = channels_iter.next().unwrap().copied().collect::<Vec<_>>();
619 assert_eq!(channel, vec![0.0, 0.0, 0.0, 0.0, 0.0]);
620 assert!(channels_iter.next().is_none());
621 drop(channels_iter);
622
623 let mut channels_iter = block.channels_iter_mut();
624 channels_iter
625 .next()
626 .unwrap()
627 .enumerate()
628 .for_each(|(i, v)| *v = i as f32);
629 channels_iter
630 .next()
631 .unwrap()
632 .enumerate()
633 .for_each(|(i, v)| *v = i as f32 + 10.0);
634 assert!(channels_iter.next().is_none());
635 drop(channels_iter);
636
637 let mut channels_iter = block.channels_iter();
638 let channel = channels_iter.next().unwrap().copied().collect::<Vec<_>>();
639 assert_eq!(channel, vec![0.0, 1.0, 2.0, 3.0, 4.0]);
640 let channel = channels_iter.next().unwrap().copied().collect::<Vec<_>>();
641 assert_eq!(channel, vec![10.0, 11.0, 12.0, 13.0, 14.0]);
642 assert!(channels_iter.next().is_none());
643 drop(channels_iter);
644 }
645
646 #[test]
647 fn test_frame_iter() {
648 let mut data = vec![0.0; 12];
649 let mut block = AudioBlockSequentialViewMut::<f32>::from_slice(&mut data, 2);
650 block.set_visible(2, 5);
651
652 for i in 0..block.num_frames() {
653 let frame = block.frame_iter(i).copied().collect::<Vec<_>>();
654 assert_eq!(frame, vec![0.0, 0.0]);
655 }
656
657 for i in 0..block.num_frames() {
658 let add = i as f32 * 10.0;
659 block
660 .frame_iter_mut(i)
661 .enumerate()
662 .for_each(|(i, v)| *v = i as f32 + add);
663 }
664
665 let channel = block.frame_iter(0).copied().collect::<Vec<_>>();
666 assert_eq!(channel, vec![0.0, 1.0]);
667 let channel = block.frame_iter(1).copied().collect::<Vec<_>>();
668 assert_eq!(channel, vec![10.0, 11.0]);
669 let channel = block.frame_iter(2).copied().collect::<Vec<_>>();
670 assert_eq!(channel, vec![20.0, 21.0]);
671 let channel = block.frame_iter(3).copied().collect::<Vec<_>>();
672 assert_eq!(channel, vec![30.0, 31.0]);
673 let channel = block.frame_iter(4).copied().collect::<Vec<_>>();
674 assert_eq!(channel, vec![40.0, 41.0]);
675 }
676
677 #[test]
678 fn test_frame_iters() {
679 let mut data = vec![0.0; 12];
680 let mut block = AudioBlockSequentialViewMut::<f32>::from_slice(&mut data, 2);
681 block.set_visible(2, 5);
682
683 let num_frames = block.num_frames;
684 let mut frames_iter = block.frames_iter();
685 for _ in 0..num_frames {
686 let frame = frames_iter.next().unwrap().copied().collect::<Vec<_>>();
687 assert_eq!(frame, vec![0.0, 0.0]);
688 }
689 assert!(frames_iter.next().is_none());
690 drop(frames_iter);
691
692 let mut frames_iter = block.frames_iter_mut();
693 for i in 0..num_frames {
694 let add = i as f32 * 10.0;
695 frames_iter
696 .next()
697 .unwrap()
698 .enumerate()
699 .for_each(|(i, v)| *v = i as f32 + add);
700 }
701 assert!(frames_iter.next().is_none());
702 drop(frames_iter);
703
704 let mut frames_iter = block.frames_iter();
705 let frame = frames_iter.next().unwrap().copied().collect::<Vec<_>>();
706 assert_eq!(frame, vec![0.0, 1.0]);
707 let frame = frames_iter.next().unwrap().copied().collect::<Vec<_>>();
708 assert_eq!(frame, vec![10.0, 11.0]);
709 let frame = frames_iter.next().unwrap().copied().collect::<Vec<_>>();
710 assert_eq!(frame, vec![20.0, 21.0]);
711 let frame = frames_iter.next().unwrap().copied().collect::<Vec<_>>();
712 assert_eq!(frame, vec![30.0, 31.0]);
713 let frame = frames_iter.next().unwrap().copied().collect::<Vec<_>>();
714 assert_eq!(frame, vec![40.0, 41.0]);
715 assert!(frames_iter.next().is_none());
716 }
717
718 #[test]
719 fn test_from_slice() {
720 let mut data = [0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0];
721 let block = AudioBlockSequentialViewMut::<f32>::from_slice(&mut data, 2);
722 assert_eq!(block.num_channels(), 2);
723 assert_eq!(block.num_channels_allocated, 2);
724 assert_eq!(block.num_frames(), 5);
725 assert_eq!(block.num_frames_allocated, 5);
726 assert_eq!(
727 block.channel_iter(0).copied().collect::<Vec<_>>(),
728 vec![0.0, 1.0, 2.0, 3.0, 4.0]
729 );
730 assert_eq!(
731 block.channel_iter(1).copied().collect::<Vec<_>>(),
732 vec![5.0, 6.0, 7.0, 8.0, 9.0]
733 );
734 assert_eq!(
735 block.frame_iter(0).copied().collect::<Vec<_>>(),
736 vec![0.0, 5.0]
737 );
738 assert_eq!(
739 block.frame_iter(1).copied().collect::<Vec<_>>(),
740 vec![1.0, 6.0]
741 );
742 assert_eq!(
743 block.frame_iter(2).copied().collect::<Vec<_>>(),
744 vec![2.0, 7.0]
745 );
746 assert_eq!(
747 block.frame_iter(3).copied().collect::<Vec<_>>(),
748 vec![3.0, 8.0]
749 );
750 assert_eq!(
751 block.frame_iter(4).copied().collect::<Vec<_>>(),
752 vec![4.0, 9.0]
753 );
754 }
755
756 #[test]
757 fn test_view() {
758 let mut data = [0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0];
759 let block = AudioBlockSequentialViewMut::<f32>::from_slice(&mut data, 2);
760 assert!(block.as_interleaved_view().is_none());
761 assert!(block.as_planar_view().is_none());
762 assert!(block.as_sequential_view().is_some());
763 let view = block.as_view();
764 assert_eq!(
765 view.channel_iter(0).copied().collect::<Vec<_>>(),
766 vec![0.0, 1.0, 2.0, 3.0, 4.0]
767 );
768 assert_eq!(
769 view.channel_iter(1).copied().collect::<Vec<_>>(),
770 vec![5.0, 6.0, 7.0, 8.0, 9.0]
771 );
772 }
773
774 #[test]
775 fn test_view_mut() {
776 let mut data = vec![0.0; 10];
777 let mut block = AudioBlockSequentialViewMut::<f32>::from_slice(&mut data, 2);
778 assert!(block.as_interleaved_view().is_none());
779 assert!(block.as_planar_view().is_none());
780 assert!(block.as_sequential_view().is_some());
781 {
782 let mut view = block.as_view_mut();
783 view.channel_iter_mut(0)
784 .enumerate()
785 .for_each(|(i, v)| *v = i as f32);
786 view.channel_iter_mut(1)
787 .enumerate()
788 .for_each(|(i, v)| *v = i as f32 + 10.0);
789 }
790
791 assert_eq!(
792 block.channel_iter(0).copied().collect::<Vec<_>>(),
793 vec![0.0, 1.0, 2.0, 3.0, 4.0]
794 );
795 assert_eq!(
796 block.channel_iter(1).copied().collect::<Vec<_>>(),
797 vec![10.0, 11.0, 12.0, 13.0, 14.0]
798 );
799 }
800
801 #[test]
802 fn test_limited() {
803 let mut data = [1.0, 2.0, 0.0, 3.0, 4.0, 0.0, 5.0, 6.0, 0.0, 0.0, 0.0, 0.0];
804
805 let mut block = AudioBlockSequentialViewMut::from_slice_limited(&mut data, 2, 3, 3, 4);
806
807 assert_eq!(block.num_channels(), 2);
808 assert_eq!(block.num_frames(), 3);
809 assert_eq!(block.num_channels_allocated, 3);
810 assert_eq!(block.num_frames_allocated, 4);
811
812 for i in 0..block.num_channels() {
813 assert_eq!(block.channel_iter(i).count(), 3);
814 assert_eq!(block.channel_iter_mut(i).count(), 3);
815 }
816 for i in 0..block.num_frames() {
817 assert_eq!(block.frame_iter(i).count(), 2);
818 assert_eq!(block.frame_iter_mut(i).count(), 2);
819 }
820 }
821
822 #[test]
823 fn test_from_ptr() {
824 let mut data = [0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0];
825 let block =
826 unsafe { AudioBlockSequentialViewMut::<f32>::from_ptr(data.as_mut_ptr(), 2, 5) };
827 assert_eq!(block.num_channels(), 2);
828 assert_eq!(block.num_channels_allocated, 2);
829 assert_eq!(block.num_frames(), 5);
830 assert_eq!(block.num_frames_allocated, 5);
831 assert_eq!(block.channel(0), &[0.0, 1.0, 2.0, 3.0, 4.0]);
832 assert_eq!(block.channel(1), &[5.0, 6.0, 7.0, 8.0, 9.0]);
833 }
834
835 #[test]
836 fn test_from_ptr_limited() {
837 let mut data = [1.0, 2.0, 0.0, 3.0, 4.0, 0.0, 5.0, 6.0, 0.0, 0.0, 0.0, 0.0];
838
839 let mut block =
840 unsafe { AudioBlockSequentialViewMut::from_ptr_limited(data.as_mut_ptr(), 2, 3, 3, 4) };
841
842 assert_eq!(block.num_channels(), 2);
843 assert_eq!(block.num_frames(), 3);
844 assert_eq!(block.num_channels_allocated, 3);
845 assert_eq!(block.num_frames_allocated, 4);
846
847 for i in 0..block.num_channels() {
848 assert_eq!(block.channel_iter(i).count(), 3);
849 assert_eq!(block.channel_iter_mut(i).count(), 3);
850 }
851 for i in 0..block.num_frames() {
852 assert_eq!(block.frame_iter(i).count(), 2);
853 assert_eq!(block.frame_iter_mut(i).count(), 2);
854 }
855 }
856
857 #[test]
858 #[should_panic]
859 #[no_sanitize_realtime]
860 fn test_slice_out_of_bounds() {
861 let mut data = [0.0; 3 * 4];
862 let block = AudioBlockSequentialViewMut::from_slice_limited(&mut data, 2, 3, 3, 4);
863
864 block.channel(2);
865 }
866
867 #[test]
868 #[should_panic]
869 #[no_sanitize_realtime]
870 fn test_slice_out_of_bounds_mut() {
871 let mut data = [0.0; 3 * 4];
872 let mut block = AudioBlockSequentialViewMut::from_slice_limited(&mut data, 2, 3, 3, 4);
873
874 block.channel_mut(2);
875 }
876}