1use crate::audio_math::{AudioMath, AudioMathImpl};
2use crate::consts::MAX_AUDIO_CHANNELS;
3use crate::float_type::FloatType;
4
5const INV_SQRT2: f32 = 0.7071067811865476;
7
8#[repr(usize)]
11#[derive(Clone, Copy, Debug, PartialEq, Eq)]
12pub enum AudioChannelLayout {
13 Mono = 1,
15 Stereo = 2,
17 Surround30 = 3,
19 Surround40 = 4,
21 Surround51 = 6,
23 Surround71 = 8,
25}
26
27impl Default for AudioChannelLayout {
28 fn default() -> Self {
29 Self::Stereo
30 }
31}
32
33#[repr(usize)]
35#[derive(Clone, Copy, Debug)]
36pub enum AudioChannel {
37 Left = 0,
39 Right = 1,
41 Center = 2,
43 LFE = 3,
45 LeftSurround = 4,
47 RightSurround = 5,
49 RearLeft = 6,
51 RearRight = 7,
53}
54
55pub trait AudioBufferMathImpl<T: FloatType>: Sized {
56 fn normalize_rms(&mut self, rms_factor: T);
58
59 fn normalize(&mut self, factor: T);
61}
62
63pub trait AudioBufferInterleavedImpl<T: FloatType>: Sized {
66 fn new(length: usize, layout: AudioChannelLayout) -> AudioBufferInterleaved<T>;
69
70 fn reset(&mut self);
72
73 fn get_channel_layout(&self) -> AudioChannelLayout;
75
76 fn set_channel_layout(&mut self, layout: AudioChannelLayout);
78
79 fn get_buffer(&self) -> &[T];
81
82 fn get_buffer_mut(&mut self) -> &mut [T];
84
85 fn len_planar(&self) -> usize;
87
88 fn len_interleaved(&self) -> usize;
90
91 fn resize(&mut self, new_len: usize);
93
94 fn copy_to_planar(&self, output: &mut AudioBuffer<T>);
96}
97
98pub trait AudioBufferImpl<T: FloatType>: Sized {
100 fn new(len: usize, layout: AudioChannelLayout) -> AudioBuffer<T>;
102
103 fn new_with_layout(layout: AudioChannelLayout) -> AudioBuffer<T>;
105
106 fn get_channel(&self, channel: usize) -> &[T];
109
110 fn get_channel_mut(&mut self, channel: usize) -> &mut [T];
113
114 unsafe fn get_channel_unchecked(&self, channel: usize) -> &[T];
116
117 unsafe fn get_channel_unchecked_mut(&mut self, channel: usize) -> &mut [T];
119
120 fn resize(&mut self, new_len: usize);
122
123 fn copy_to_interleaved(&self, dst: &mut [T]);
126
127 fn mix_with(&mut self, other: &AudioBuffer<T>);
130
131 fn mix_with_gain(&mut self, other: &AudioBuffer<T>, gain: f32);
134
135 fn copy_from(&mut self, other: &AudioBuffer<T>);
138
139 fn copy_from_interleaved(&mut self, buffer: &[T]);
142
143 fn copy_from_interleaved_range(&mut self, input: &[T], start: usize, end: usize, offset: usize);
148
149 fn channel_layout(&self) -> AudioChannelLayout;
151
152 fn set_channel_layout(&mut self, new_layout: AudioChannelLayout);
154
155 fn reset(&mut self);
157
158 fn len(&self) -> usize;
160
161 fn len_interleaved(&self) -> usize;
163
164 fn to_f32(&self) -> AudioBuffer<f32>;
166
167 fn to_f64(&self) -> AudioBuffer<f64>;
169}
170
171#[derive(Debug, Clone)]
172pub struct AudioBuffer<T: FloatType> {
173 buffers: [Vec<T>; MAX_AUDIO_CHANNELS],
174 len_interleaved: usize,
176 layout: AudioChannelLayout,
177}
178
179#[derive(Debug, Clone)]
180pub struct AudioBufferInterleaved<T: FloatType> {
181 buffer: Vec<T>,
182 len_planar: usize,
184 layout: AudioChannelLayout,
185}
186
187impl<T: FloatType> AudioBufferInterleavedImpl<T> for AudioBufferInterleaved<T> {
188 fn new(len: usize, layout: AudioChannelLayout) -> AudioBufferInterleaved<T> {
189 unsafe {
190 let len_interleaved = len * layout as usize;
191 let mut buffer: Vec<T> = Vec::with_capacity(len_interleaved);
192 buffer.set_len(len_interleaved);
193 buffer.fill(0.0.into());
194
195 let len_planar = len;
196
197 return AudioBufferInterleaved {
198 buffer,
199 layout,
200 len_planar,
201 };
202 }
203 }
204
205 fn reset(&mut self) {
206 self.buffer.fill(0.0.into());
207 }
208
209 fn get_channel_layout(&self) -> AudioChannelLayout {
210 return self.layout;
211 }
212
213 fn set_channel_layout(&mut self, layout: AudioChannelLayout) {
214 if self.layout != layout {
215 *self = AudioBufferInterleaved::new(self.len_planar(), layout);
216 }
217 }
218
219 fn get_buffer(&self) -> &[T] {
220 return self.buffer.as_slice();
221 }
222
223 fn get_buffer_mut(&mut self) -> &mut [T] {
224 return self.buffer.as_mut_slice();
225 }
226
227 fn len_planar(&self) -> usize {
228 return self.len_planar;
229 }
230
231 fn len_interleaved(&self) -> usize {
232 return self.buffer.len();
233 }
234
235 fn resize(&mut self, new_len: usize) {
236 self.len_planar = new_len;
237 self.buffer
238 .resize(new_len * self.layout as usize, 0.0.into());
239 }
240
241 fn copy_to_planar(&self, output: &mut AudioBuffer<T>) {
242 output.copy_from_interleaved(&self.buffer);
243 }
244}
245
246impl<T: FloatType> AudioBufferMathImpl<T> for AudioBufferInterleaved<T> {
247 fn normalize_rms(&mut self, rms_factor: T) {
248 AudioMath::normalize_rms(&mut self.buffer.as_mut_slice(), rms_factor);
249 }
250
251 fn normalize(&mut self, factor: T) {
252 AudioMath::normalize(&mut self.buffer.as_mut_slice(), factor);
253 }
254}
255
256impl<T: FloatType> AudioBufferMathImpl<T> for AudioBuffer<T> {
257 fn normalize_rms(&mut self, rms_factor: T) {
258 for buffer in self.buffers.iter_mut() {
259 AudioMath::normalize_rms(buffer.as_mut_slice(), rms_factor);
260 }
261 }
262
263 fn normalize(&mut self, factor: T) {
264 for buffer in self.buffers.iter_mut() {
265 AudioMath::normalize(buffer.as_mut_slice(), factor);
266 }
267 }
268}
269
270impl<T: FloatType> AudioBufferImpl<T> for AudioBuffer<T> {
271 fn new(len: usize, layout: AudioChannelLayout) -> AudioBuffer<T> {
272 let mut buffers: [Vec<T>; 8] = std::array::from_fn(|_| Vec::with_capacity(len));
273
274 for bf in buffers.iter_mut() {
275 unsafe {
276 bf.set_len(len);
277 }
278 }
279
280 let len_interleaved = len * layout as usize;
281
282 return AudioBuffer {
283 buffers,
284 layout,
285 len_interleaved,
286 };
287 }
288
289 fn new_with_layout(layout: AudioChannelLayout) -> AudioBuffer<T> {
290 let mut buffers: [Vec<T>; 8] = std::array::from_fn(|_| Vec::default());
291
292 for bf in buffers.iter_mut() {
293 unsafe {
294 bf.set_len(0);
295 }
296 }
297
298 let len_interleaved = 0usize;
299
300 return AudioBuffer {
301 buffers,
302 layout,
303 len_interleaved,
304 };
305 }
306
307 #[inline]
308 fn get_channel(&self, channel: usize) -> &[T] {
309 assert!(channel < self.layout as usize);
310
311 unsafe {
312 return self.buffers.get_unchecked(channel);
313 }
314 }
315
316 #[inline]
317 fn get_channel_mut(&mut self, channel: usize) -> &mut [T] {
318 assert!(channel < self.layout as usize);
319
320 unsafe {
321 return self.buffers.get_unchecked_mut(channel);
322 }
323 }
324
325 #[inline]
326 unsafe fn get_channel_unchecked(&self, channel: usize) -> &[T] {
327 unsafe {
328 return self.buffers.get_unchecked(channel);
329 }
330 }
331
332 #[inline]
333 unsafe fn get_channel_unchecked_mut(&mut self, channel: usize) -> &mut [T] {
334 unsafe {
335 return self.buffers.get_unchecked_mut(channel);
336 }
337 }
338
339 fn resize(&mut self, new_len: usize) {
340 for bf in self.buffers.iter_mut() {
341 bf.resize(new_len, 0.0.into());
342 }
343
344 self.len_interleaved = new_len * self.layout as usize;
345 }
346
347 fn copy_to_interleaved(&self, dst: &mut [T]) {
348 assert!(dst.len() == self.len() * self.layout as usize);
349
350 let dst = dst.as_mut_ptr();
351 let buffers = self.get_buffers();
352
353 unsafe {
354 for i in 0..self.len() {
355 for channel in 0..self.layout as usize {
356 *dst.add(i * self.layout as usize + channel) =
357 *(*buffers.add(channel)).as_mut_ptr().add(i);
358 }
359 }
360 }
361 }
362
363 fn mix_with(&mut self, other: &AudioBuffer<T>) {
364 assert!(other.len() == self.len(), "Buffers length don't match");
365 assert!(
366 other.channel_layout() == self.channel_layout(),
367 "Buffers channel layout don't match",
368 );
369
370 unsafe {
371 let buffers = self.get_buffers();
372 let other_buffers = other.get_buffers();
373
374 for ch in 0..self.channel_layout() as usize {
375 let left = buffers.add(ch);
376 let right = other_buffers.add(ch);
377
378 AudioMath::mix_signals_inplace((*left).as_mut_slice(), (*right).as_slice(), 1.0);
379 }
380 }
381 }
382
383 fn mix_with_gain(&mut self, other: &AudioBuffer<T>, gain: f32) {
384 assert!(other.len() == self.len(), "Buffer lengths do not match");
385 assert!(
386 other.channel_layout() == self.channel_layout(),
387 "Buffer channel layouts do not match",
388 );
389
390 unsafe {
391 let buffers = self.get_buffers();
392 let other_buffers = other.get_buffers();
393
394 for ch in 0..self.channel_layout() as usize {
395 let left = buffers.add(ch);
396 let right = other_buffers.add(ch);
397
398 AudioMath::mix_signals_inplace((*left).as_mut_slice(), (*right).as_slice(), gain);
399 }
400 }
401 }
402
403 fn copy_from(&mut self, other: &AudioBuffer<T>) {
404 assert!(other.len() == self.len(), "Buffer lengths do not match");
405 assert!(
406 other.channel_layout() == self.channel_layout(),
407 "Buffer channel layouts do not match",
408 );
409
410 unsafe {
411 let buffers = self.get_buffers();
412 let other_buffers = other.get_buffers();
413
414 for i in 0..self.layout as usize {
415 std::ptr::copy_nonoverlapping(
416 (*other_buffers.add(i)).as_ptr(),
417 (*buffers.add(i)).as_mut_ptr(),
418 self.len(),
419 );
420 }
421 }
422 }
423
424 fn copy_from_interleaved(&mut self, buffer: &[T]) {
425 assert!(buffer.len() * self.layout as usize == self.len());
426
427 let channels = self.layout as usize;
428
429 unsafe {
430 for i in 0..self.len() {
431 for ch in 0..channels {
432 *self.get_channel_mut(ch).as_mut_ptr().add(i) =
433 *buffer.as_ptr().add(i * channels + ch);
434 }
435 }
436 }
437 }
438
439 fn copy_from_interleaved_range(
440 &mut self,
441 input: &[T],
442 start: usize,
443 end: usize,
444 offset: usize,
445 ) {
446 assert!(start < end || end <= input.len());
447
448 unsafe {
449 let num_channels = self.channel_layout() as usize;
450 let num_samples = end - start;
451
452 for channel in 0..num_channels {
453 let dst = self.get_channel_unchecked_mut(channel).as_mut_ptr();
454 let input = input.as_ptr();
455 for i in 0..num_samples {
456 *dst.add(offset + i) = *input.add((start + i) * num_channels + channel);
457 }
458 }
459 }
460 }
461
462 #[inline]
463 fn channel_layout(&self) -> AudioChannelLayout {
464 return self.layout;
465 }
466
467 fn set_channel_layout(&mut self, new_layout: AudioChannelLayout) {
468 if self.layout == new_layout {
469 return;
470 }
471
472 self.len_interleaved = self.len() * new_layout as usize;
473
474 match new_layout {
475 AudioChannelLayout::Mono => {
476 self.into_mono();
477 }
478 AudioChannelLayout::Stereo => {
479 self.into_stereo();
480 }
481 AudioChannelLayout::Surround30 => {
482 self.into_surround30();
483 }
484 AudioChannelLayout::Surround40 => {
485 self.into_surround40();
486 }
487 AudioChannelLayout::Surround51 => {
488 self.into_surround51();
489 }
490 AudioChannelLayout::Surround71 => {
491 self.into_surround71();
492 }
493 }
494 }
495
496 fn reset(&mut self) {
497 for ch in self.buffers.iter_mut() {
498 ch.fill(T::from(0.0)); }
500 }
501
502 #[inline]
503 fn len(&self) -> usize {
504 unsafe {
505 return self.buffers.get_unchecked(0).len();
506 }
507 }
508
509 #[inline]
510 fn len_interleaved(&self) -> usize {
511 return self.len_interleaved;
512 }
513
514 #[inline]
515 fn to_f32(&self) -> AudioBuffer<f32> {
516 unsafe {
517 let mut new = AudioBuffer::<f32>::new(self.len(), self.layout);
518
519 for i in 0..self.layout as usize {
520 let new_buff = new.get_channel_unchecked_mut(i).as_mut_ptr();
521 for (y, s) in self.buffers.get_unchecked(i).iter().enumerate() {
522 *new_buff.add(y) = s.to_f32();
523 }
524 }
525
526 return new;
527 }
528 }
529
530 #[inline]
531 fn to_f64(&self) -> AudioBuffer<f64> {
532 unsafe {
533 let mut new = AudioBuffer::<f64>::new(self.len(), self.layout);
534
535 for i in 0..self.layout as usize {
536 let new_buff = new.get_channel_unchecked_mut(i).as_mut_ptr();
537 for (y, s) in self.buffers.get_unchecked(i).iter().enumerate() {
538 *new_buff.add(y) = s.to_f64();
539 }
540 }
541
542 return new;
543 }
544 }
545}
546
547impl<T: FloatType> AudioBuffer<T> {
548 #[inline]
549 pub(super) fn get_buffers(&self) -> *mut Vec<T> {
550 let ptr = self.buffers.as_ptr();
551
552 return ptr as *mut Vec<T>;
553 }
554}
555
556impl<T: FloatType> AudioBuffer<T> {
557 fn into_mono(&mut self) {
558 match self.layout {
559 AudioChannelLayout::Mono => {}
560 AudioChannelLayout::Stereo => {
561 unsafe {
562 let len = self.len();
564 let aud = self.buffers.as_mut_ptr();
565
566 let left = (*aud.add(AudioChannel::Left as usize)).as_mut_ptr();
567 let right = (*aud.add(AudioChannel::Right as usize)).as_mut_ptr();
568 for i in 0..len {
569 *left.add(i) = T::from(0.5) * *left.add(i) + T::from(0.5) * *right.add(i);
570 }
571 self.layout = AudioChannelLayout::Mono;
572 }
573 }
574 AudioChannelLayout::Surround30 => {
575 unsafe {
576 let len = self.len();
578 let aud = self.buffers.as_mut_ptr();
579
580 let left = (*aud.add(AudioChannel::Left as usize)).as_mut_ptr();
581 let right = (*aud.add(AudioChannel::Right as usize)).as_mut_ptr();
582 let center = (*aud.add(AudioChannel::Center as usize)).as_mut_ptr();
583 for i in 0..len {
584 *left.add(i) = T::from(0.5) * *left.add(i)
585 + T::from(0.5) * *right.add(i)
586 + T::from(INV_SQRT2) * *center.add(i);
587 }
588 self.layout = AudioChannelLayout::Mono;
589 }
590 }
591 AudioChannelLayout::Surround40 => {
592 unsafe {
593 let len = self.len();
595 let aud = self.buffers.as_mut_ptr();
596 let left = (*aud.add(AudioChannel::Left as usize)).as_mut_ptr();
597
598 let right = (*aud.add(AudioChannel::Right as usize)).as_mut_ptr();
599 let ls = (*aud.add(AudioChannel::Left as usize)).as_mut_ptr();
600 let rs = (*aud.add(AudioChannel::RightSurround as usize)).as_mut_ptr();
601 for i in 0..len {
602 *left.add(i) = T::from(0.5) * *left.add(i)
603 + T::from(0.5) * *right.add(i)
604 + T::from(0.5) * *ls.add(i)
605 + T::from(0.5) * *rs.add(i);
606 }
607 self.layout = AudioChannelLayout::Mono;
608 }
609 }
610 AudioChannelLayout::Surround51 => {
611 unsafe {
612 let len = self.len();
614 let aud = self.buffers.as_mut_ptr();
615
616 let left = (*aud.add(AudioChannel::Left as usize)).as_mut_ptr();
617 let right = (*aud.add(AudioChannel::Right as usize)).as_mut_ptr();
618 let center = (*aud.add(AudioChannel::Center as usize)).as_mut_ptr();
619 let lfe = (*aud.add(AudioChannel::LFE as usize)).as_mut_ptr();
620 let ls = (*aud.add(AudioChannel::Left as usize)).as_mut_ptr();
621 let rs = (*aud.add(AudioChannel::RightSurround as usize)).as_mut_ptr();
622 for i in 0..len {
623 *left.add(i) = T::from(0.5) * *left.add(i)
624 + T::from(0.5) * *right.add(i)
625 + T::from(INV_SQRT2) * *center.add(i)
626 + T::from(0.5) * *lfe.add(i)
627 + T::from(0.5) * *ls.add(i)
628 + T::from(0.5) * *rs.add(i);
629 }
630 self.layout = AudioChannelLayout::Mono;
631 }
632 }
633 AudioChannelLayout::Surround71 => {
634 unsafe {
635 let len = self.len();
637 let aud = self.buffers.as_mut_ptr();
638
639 let left = (*aud.add(AudioChannel::Left as usize)).as_mut_ptr();
640 let right = (*aud.add(AudioChannel::Right as usize)).as_mut_ptr();
641 let center = (*aud.add(AudioChannel::Center as usize)).as_mut_ptr();
642 let lfe = (*aud.add(AudioChannel::LFE as usize)).as_mut_ptr();
643 let ls = (*aud.add(AudioChannel::Left as usize)).as_mut_ptr();
644 let rs = (*aud.add(AudioChannel::RightSurround as usize)).as_mut_ptr();
645 let lsr = (*aud.add(AudioChannel::RearLeft as usize)).as_mut_ptr();
646 let rsr = (*aud.add(AudioChannel::RearRight as usize)).as_mut_ptr();
647 for i in 0..len {
648 *left.add(i) = T::from(0.5) * *left.add(i)
649 + T::from(0.5) * *right.add(i)
650 + T::from(INV_SQRT2) * *center.add(i)
651 + T::from(0.5) * *lfe.add(i)
652 + T::from(0.5) * *ls.add(i)
653 + T::from(0.5) * *rs.add(i)
654 + T::from(0.5) * *lsr.add(i)
655 + T::from(0.5) * *rsr.add(i);
656 }
657 self.layout = AudioChannelLayout::Mono;
658 }
659 }
660 }
661 }
662
663 fn into_stereo(&mut self) {
664 match self.layout {
665 AudioChannelLayout::Mono => {
666 unsafe {
667 let len = self.len();
669 let aud = self.buffers.as_mut_ptr();
670
671 let left = (*aud.add(AudioChannel::Left as usize)).as_mut_ptr();
672 let right = (*aud.add(AudioChannel::Right as usize)).as_mut_ptr();
673 for i in 0..self.len() {
674 *left.add(i) = *left.add(i);
675 *right.add(i) = *left.add(i);
676 }
677 self.layout = AudioChannelLayout::Stereo;
678 }
679 }
680 AudioChannelLayout::Stereo => {}
681 AudioChannelLayout::Surround30 => {
682 unsafe {
683 let len = self.len();
685 let aud = self.buffers.as_mut_ptr();
686
687 let left = (*aud.add(AudioChannel::Left as usize)).as_mut_ptr();
688 let right = (*aud.add(AudioChannel::Right as usize)).as_mut_ptr();
689 let center = (*aud.add(AudioChannel::Center as usize)).as_mut_ptr();
690 for i in 0..self.len() {
691 *left.add(i) = *left.add(i) + T::from(INV_SQRT2) * *center.add(i);
692 *right.add(i) = *right.add(i) + T::from(INV_SQRT2) * *center.add(i);
693 }
694 self.layout = AudioChannelLayout::Stereo;
695 }
696 }
697 AudioChannelLayout::Surround40 => {
698 unsafe {
699 let len = self.len();
701 let aud = self.buffers.as_mut_ptr();
702
703 let left = (*aud.add(AudioChannel::Left as usize)).as_mut_ptr();
704 let right = (*aud.add(AudioChannel::Right as usize)).as_mut_ptr();
705 let ls = (*aud.add(AudioChannel::Left as usize)).as_mut_ptr();
706 let rs = (*aud.add(AudioChannel::LFE as usize)).as_mut_ptr();
707 for i in 0..self.len() {
708 *left.add(i) = *left.add(i) + T::from(0.5) * *ls.add(i);
709 *right.add(i) = *right.add(i) + T::from(0.5) * *rs.add(i);
710 }
711 self.layout = AudioChannelLayout::Stereo;
712 }
713 }
714 AudioChannelLayout::Surround51 => {
715 unsafe {
716 let len = self.len();
719 let aud = self.buffers.as_mut_ptr();
720
721 let left = (*aud.add(AudioChannel::Left as usize)).as_mut_ptr();
722 let right = (*aud.add(AudioChannel::Right as usize)).as_mut_ptr();
723 let center = (*aud.add(AudioChannel::Center as usize)).as_mut_ptr();
724 let lfe = (*aud.add(AudioChannel::LFE as usize)).as_mut_ptr();
725 let ls = (*aud.add(AudioChannel::Left as usize)).as_mut_ptr();
726 let rs = (*aud.add(AudioChannel::RightSurround as usize)).as_mut_ptr();
727 for i in 0..self.len() {
728 *left.add(i) = *left.add(i)
729 + T::from(INV_SQRT2) * *center.add(i)
730 + T::from(0.5) * *ls.add(i)
731 + T::from(0.5) * *lfe.add(i);
732 *right.add(i) = *right.add(i)
733 + T::from(INV_SQRT2) * *center.add(i)
734 + T::from(0.5) * *rs.add(i)
735 + T::from(0.5) * *lfe.add(i);
736 }
737 self.layout = AudioChannelLayout::Stereo;
738 }
739 }
740 AudioChannelLayout::Surround71 => {
741 unsafe {
742 let len = self.len();
745 let aud = self.buffers.as_mut_ptr();
746
747 let left = (*aud.add(AudioChannel::Left as usize)).as_mut_ptr();
748 let right = (*aud.add(AudioChannel::Right as usize)).as_mut_ptr();
749 let center = (*aud.add(AudioChannel::Center as usize)).as_mut_ptr();
750 let lfe = (*aud.add(AudioChannel::LFE as usize)).as_mut_ptr();
751 let ls = (*aud.add(AudioChannel::Left as usize)).as_mut_ptr();
752 let rs = (*aud.add(AudioChannel::RightSurround as usize)).as_mut_ptr();
753 let lsr = (*aud.add(AudioChannel::RearLeft as usize)).as_mut_ptr();
754 let rsr = (*aud.add(AudioChannel::RearRight as usize)).as_mut_ptr();
755 for i in 0..self.len() {
756 *left.add(i) = *left.add(i)
757 + T::from(INV_SQRT2) * *center.add(i)
758 + T::from(0.5) * *ls.add(i)
759 + T::from(0.5) * *lsr.add(i)
760 + T::from(0.5) * *lfe.add(i);
761 *right.add(i) = *right.add(i)
762 + T::from(INV_SQRT2) * *center.add(i)
763 + T::from(0.5) * *rs.add(i)
764 + T::from(0.5) * *rsr.add(i)
765 + T::from(0.5) * *lfe.add(i);
766 }
767 self.layout = AudioChannelLayout::Stereo;
768 }
769 }
770 }
771 }
772
773 fn into_surround30(&mut self) {
775 match self.layout {
776 AudioChannelLayout::Mono => {
777 unsafe {
778 let len = self.len();
780 let aud = self.buffers.as_mut_ptr();
781
782 let left = (*aud.add(AudioChannel::Left as usize)).as_mut_ptr();
783 let right = (*aud.add(AudioChannel::Right as usize)).as_mut_ptr();
784 let center = (*aud.add(AudioChannel::Center as usize)).as_mut_ptr();
785 for i in 0..self.len() {
786 *left.add(i) = *left.add(i);
787 *right.add(i) = *left.add(i);
788 *center.add(i) = *left.add(i);
789 }
790 self.layout = AudioChannelLayout::Surround30;
791 }
792 }
793 AudioChannelLayout::Stereo => {
794 unsafe {
795 let len = self.len();
797 let aud = self.buffers.as_mut_ptr();
798
799 let left = (*aud.add(AudioChannel::Left as usize)).as_mut_ptr();
800 let right = (*aud.add(AudioChannel::Right as usize)).as_mut_ptr();
801 let center = (*aud.add(AudioChannel::Center as usize)).as_mut_ptr();
802 for i in 0..self.len() {
803 *left.add(i) = *left.add(i);
804 *right.add(i) = *right.add(i);
805 *center.add(i) = T::from(0.5) * *left.add(i) + T::from(0.5) * *right.add(i);
806 }
807 self.layout = AudioChannelLayout::Surround30;
808 }
809 }
810 AudioChannelLayout::Surround30 => {}
811 AudioChannelLayout::Surround40 => {
812 unsafe {
813 let len = self.len();
815 let aud = self.buffers.as_mut_ptr();
816
817 let left = (*aud.add(AudioChannel::Left as usize)).as_mut_ptr();
818 let right = (*aud.add(AudioChannel::Right as usize)).as_mut_ptr();
819 let center = (*aud.add(AudioChannel::Center as usize)).as_mut_ptr();
820 let ls = (*aud.add(AudioChannel::Left as usize)).as_mut_ptr();
821 let rs = (*aud.add(AudioChannel::LFE as usize)).as_mut_ptr();
822 for i in 0..self.len() {
823 *left.add(i) = *left.add(i) + T::from(0.5) * *ls.add(i);
824 *right.add(i) = *right.add(i) + T::from(0.5) * *rs.add(i);
825 *center.add(i) = T::from(0.0);
826 }
827 self.layout = AudioChannelLayout::Surround30;
828 }
829 }
830 AudioChannelLayout::Surround51 => {
831 unsafe {
832 let len = self.len();
834 let aud = self.buffers.as_mut_ptr();
835
836 let left = (*aud.add(AudioChannel::Left as usize)).as_mut_ptr();
837 let right = (*aud.add(AudioChannel::Right as usize)).as_mut_ptr();
838 let center = (*aud.add(AudioChannel::Center as usize)).as_mut_ptr();
839 let lfe = (*aud.add(AudioChannel::LFE as usize)).as_mut_ptr();
840 let ls = (*aud.add(AudioChannel::Left as usize)).as_mut_ptr();
841 let rs = (*aud.add(AudioChannel::RightSurround as usize)).as_mut_ptr();
842 for i in 0..self.len() {
843 *left.add(i) =
844 *left.add(i) + T::from(0.5) * *ls.add(i) + T::from(0.5) * *lfe.add(i);
845 *right.add(i) =
846 *right.add(i) + T::from(0.5) * *rs.add(i) + T::from(0.5) * *lfe.add(i);
847 *center.add(i) = *center.add(i);
848 }
849 self.layout = AudioChannelLayout::Surround30;
850 }
851 }
852 AudioChannelLayout::Surround71 => {
853 unsafe {
854 let len = self.len();
858 let aud = self.buffers.as_mut_ptr();
859
860 let left = (*aud.add(AudioChannel::Left as usize)).as_mut_ptr();
861 let right = (*aud.add(AudioChannel::Right as usize)).as_mut_ptr();
862 let center = (*aud.add(AudioChannel::Center as usize)).as_mut_ptr();
863 let lfe = (*aud.add(AudioChannel::LFE as usize)).as_mut_ptr();
864 let ls = (*aud.add(AudioChannel::Left as usize)).as_mut_ptr();
865 let rs = (*aud.add(AudioChannel::RightSurround as usize)).as_mut_ptr();
866 let lsr = (*aud.add(AudioChannel::RearLeft as usize)).as_mut_ptr();
867 let rsr = (*aud.add(AudioChannel::RearRight as usize)).as_mut_ptr();
868 for i in 0..self.len() {
869 *left.add(i) = *left.add(i)
870 + T::from(0.5) * *ls.add(i)
871 + T::from(0.5) * *lsr.add(i)
872 + T::from(0.5) * *lfe.add(i);
873 *right.add(i) = *right.add(i)
874 + T::from(0.5) * *rs.add(i)
875 + T::from(0.5) * *rsr.add(i)
876 + T::from(0.5) * *lfe.add(i);
877 *center.add(i) = *center.add(i);
878 }
879 self.layout = AudioChannelLayout::Surround30;
880 }
881 }
882 }
883 }
884
885 fn into_surround40(&mut self) {
887 match self.layout {
888 AudioChannelLayout::Mono => {
889 unsafe {
890 let len = self.len();
892 let aud = self.buffers.as_mut_ptr();
893
894 let left = (*aud.add(AudioChannel::Left as usize)).as_mut_ptr();
895 let right = (*aud.add(AudioChannel::Right as usize)).as_mut_ptr();
896 let center = (*aud.add(AudioChannel::Center as usize)).as_mut_ptr();
897 let lfe = (*aud.add(AudioChannel::LFE as usize)).as_mut_ptr();
898 for i in 0..self.len() {
903 *left.add(i) = *left.add(i);
904 *right.add(i) = *left.add(i);
905 *center.add(i) = *left.add(i);
906 *lfe.add(i) = *left.add(i);
907 }
908 self.layout = AudioChannelLayout::Surround40;
909 }
910 }
911 AudioChannelLayout::Stereo => {
912 unsafe {
913 let len = self.len();
915 let aud = self.buffers.as_mut_ptr();
916
917 let left = (*aud.add(AudioChannel::Left as usize)).as_mut_ptr();
918 let right = (*aud.add(AudioChannel::Right as usize)).as_mut_ptr();
919 let center = (*aud.add(AudioChannel::Center as usize)).as_mut_ptr();
920 let lfe = (*aud.add(AudioChannel::LFE as usize)).as_mut_ptr();
921 for i in 0..self.len() {
926 *left.add(i) = *left.add(i);
927 *right.add(i) = *right.add(i);
928 *center.add(i) = *left.add(i);
929 *lfe.add(i) = *right.add(i);
930 }
931 self.layout = AudioChannelLayout::Surround40;
932 }
933 }
934 AudioChannelLayout::Surround30 => {
935 unsafe {
936 let len = self.len();
938 let aud = self.buffers.as_mut_ptr();
939
940 let left = (*aud.add(AudioChannel::Left as usize)).as_mut_ptr();
941 let right = (*aud.add(AudioChannel::Right as usize)).as_mut_ptr();
942 let center = (*aud.add(AudioChannel::Center as usize)).as_mut_ptr();
943 let lfe = (*aud.add(AudioChannel::LFE as usize)).as_mut_ptr();
944 for i in 0..self.len() {
949 *left.add(i) = *left.add(i);
950 *right.add(i) = *right.add(i);
951 *center.add(i) = T::from(0.5) * *center.add(i);
952 *lfe.add(i) = T::from(0.5) * *center.add(i);
953 }
954 self.layout = AudioChannelLayout::Surround40;
955 }
956 }
957 AudioChannelLayout::Surround40 => {}
958 AudioChannelLayout::Surround51 => {
959 unsafe {
960 let len = self.len();
962 let aud = self.buffers.as_mut_ptr();
963
964 let left = (*aud.add(AudioChannel::Left as usize)).as_mut_ptr();
965 let right = (*aud.add(AudioChannel::Right as usize)).as_mut_ptr();
966 let center = (*aud.add(AudioChannel::Center as usize)).as_mut_ptr();
967 let lfe = (*aud.add(AudioChannel::LFE as usize)).as_mut_ptr();
968 let ls = (*aud.add(AudioChannel::Left as usize)).as_mut_ptr();
969 let rs = (*aud.add(AudioChannel::RightSurround as usize)).as_mut_ptr();
970 for i in 0..self.len() {
973 *left.add(i) = *left.add(i) + T::from(0.5) * *lfe.add(i);
974 *right.add(i) = *right.add(i) + T::from(0.5) * *lfe.add(i);
975 *center.add(i) = *ls.add(i);
976 *lfe.add(i) = *rs.add(i);
977 }
978 self.layout = AudioChannelLayout::Surround40;
979 }
980 }
981 AudioChannelLayout::Surround71 => {
982 unsafe {
983 let len = self.len();
985 let aud = self.buffers.as_mut_ptr();
986
987 let left = (*aud.add(AudioChannel::Left as usize)).as_mut_ptr();
988 let right = (*aud.add(AudioChannel::Right as usize)).as_mut_ptr();
989 let center = (*aud.add(AudioChannel::Center as usize)).as_mut_ptr();
990 let lfe = (*aud.add(AudioChannel::LFE as usize)).as_mut_ptr();
991 let ls = (*aud.add(AudioChannel::Left as usize)).as_mut_ptr();
992 let rs = (*aud.add(AudioChannel::RightSurround as usize)).as_mut_ptr();
993 let lsr = (*aud.add(AudioChannel::RearLeft as usize)).as_mut_ptr();
994 let rsr = (*aud.add(AudioChannel::RearRight as usize)).as_mut_ptr();
995 for i in 0..self.len() {
996 *left.add(i) = *left.add(i) + T::from(0.5) * *lfe.add(i);
997 *right.add(i) = *right.add(i) + T::from(0.5) * *lfe.add(i);
998 *center.add(i) = *ls.add(i) + T::from(0.5) * *lsr.add(i);
999 *lfe.add(i) = *rs.add(i) + T::from(0.5) * *rsr.add(i);
1000 }
1001 self.layout = AudioChannelLayout::Surround40;
1002 }
1003 }
1004 }
1005 }
1006
1007 fn into_surround51(&mut self) {
1009 match self.layout {
1010 AudioChannelLayout::Mono => {
1011 unsafe {
1012 let len = self.len();
1014 let aud = self.buffers.as_mut_ptr();
1015
1016 let left = (*aud.add(AudioChannel::Left as usize)).as_mut_ptr();
1017 let right = (*aud.add(AudioChannel::Right as usize)).as_mut_ptr();
1018 let center = (*aud.add(AudioChannel::Center as usize)).as_mut_ptr();
1019 let lfe = (*aud.add(AudioChannel::LFE as usize)).as_mut_ptr();
1020 let ls = (*aud.add(AudioChannel::Left as usize)).as_mut_ptr();
1021 let rs = (*aud.add(AudioChannel::RightSurround as usize)).as_mut_ptr();
1022 for i in 0..self.len() {
1025 *left.add(i) = *left.add(i);
1026 *right.add(i) = *left.add(i);
1027 *center.add(i) = *left.add(i);
1028 *lfe.add(i) = T::from(0.0); *ls.add(i) = *left.add(i);
1030 *rs.add(i) = *left.add(i);
1031 }
1032 self.layout = AudioChannelLayout::Surround51;
1033 }
1034 }
1035 AudioChannelLayout::Stereo => {
1036 unsafe {
1037 let len = self.len();
1039 let aud = self.buffers.as_mut_ptr();
1040
1041 let left = (*aud.add(AudioChannel::Left as usize)).as_mut_ptr();
1042 let right = (*aud.add(AudioChannel::Right as usize)).as_mut_ptr();
1043 let center = (*aud.add(AudioChannel::Center as usize)).as_mut_ptr();
1044 let lfe = (*aud.add(AudioChannel::LFE as usize)).as_mut_ptr();
1045 let ls = (*aud.add(AudioChannel::Left as usize)).as_mut_ptr();
1046 let rs = (*aud.add(AudioChannel::RightSurround as usize)).as_mut_ptr();
1047 for i in 0..self.len() {
1050 *left.add(i) = *left.add(i);
1051 *right.add(i) = *right.add(i);
1052 *center.add(i) = T::from(0.5) * *left.add(i) + T::from(0.5) * *right.add(i);
1053 *lfe.add(i) = T::from(0.0); *ls.add(i) = *left.add(i);
1055 *rs.add(i) = *right.add(i);
1056 }
1057 self.layout = AudioChannelLayout::Surround51;
1058 }
1059 }
1060 AudioChannelLayout::Surround30 => {
1061 unsafe {
1062 let len = self.len();
1064 let aud = self.buffers.as_mut_ptr();
1065
1066 let left = (*aud.add(AudioChannel::Left as usize)).as_mut_ptr();
1067 let right = (*aud.add(AudioChannel::Right as usize)).as_mut_ptr();
1068 let center = (*aud.add(AudioChannel::Center as usize)).as_mut_ptr();
1069 let lfe = (*aud.add(AudioChannel::LFE as usize)).as_mut_ptr();
1070 let ls = (*aud.add(AudioChannel::Left as usize)).as_mut_ptr();
1071 let rs = (*aud.add(AudioChannel::RightSurround as usize)).as_mut_ptr();
1072 for i in 0..self.len() {
1075 *left.add(i) = *left.add(i);
1076 *right.add(i) = *right.add(i);
1077 *center.add(i) = *center.add(i);
1078 *lfe.add(i) = T::from(0.0); *ls.add(i) = T::from(0.5) * *center.add(i);
1080 *rs.add(i) = T::from(0.5) * *center.add(i);
1081 }
1082 self.layout = AudioChannelLayout::Surround51;
1083 }
1084 }
1085 AudioChannelLayout::Surround40 => {
1086 unsafe {
1087 let len = self.len();
1089 let aud = self.buffers.as_mut_ptr();
1090
1091 let left = (*aud.add(AudioChannel::Left as usize)).as_mut_ptr();
1092 let right = (*aud.add(AudioChannel::Right as usize)).as_mut_ptr();
1093 let center = (*aud.add(AudioChannel::Center as usize)).as_mut_ptr();
1094 let lfe = (*aud.add(AudioChannel::LFE as usize)).as_mut_ptr();
1095 let ls = (*aud.add(AudioChannel::Left as usize)).as_mut_ptr();
1096 let rs = (*aud.add(AudioChannel::RightSurround as usize)).as_mut_ptr();
1097 for i in 0..self.len() {
1100 *left.add(i) = *left.add(i);
1101 *right.add(i) = *right.add(i);
1102 *center.add(i) = T::from(0.0); *lfe.add(i) = T::from(0.0); *ls.add(i) = *ls.add(i);
1105 *rs.add(i) = *rs.add(i);
1106 }
1107 self.layout = AudioChannelLayout::Surround51;
1108 }
1109 }
1110 AudioChannelLayout::Surround51 => {}
1111 AudioChannelLayout::Surround71 => {
1112 unsafe {
1113 let len = self.len();
1115 let aud = self.buffers.as_mut_ptr();
1116
1117 let left = (*aud.add(AudioChannel::Left as usize)).as_mut_ptr();
1118 let right = (*aud.add(AudioChannel::Right as usize)).as_mut_ptr();
1119 let center = (*aud.add(AudioChannel::Center as usize)).as_mut_ptr();
1120 let lfe = (*aud.add(AudioChannel::LFE as usize)).as_mut_ptr();
1121 let ls = (*aud.add(AudioChannel::Left as usize)).as_mut_ptr();
1122 let rs = (*aud.add(AudioChannel::RightSurround as usize)).as_mut_ptr();
1123 let lsr = (*aud.add(AudioChannel::RearLeft as usize)).as_mut_ptr();
1124 let rsr = (*aud.add(AudioChannel::RearRight as usize)).as_mut_ptr();
1125 for i in 0..self.len() {
1126 *left.add(i) = *left.add(i) + T::from(0.5) * *lsr.add(i);
1127 *right.add(i) = *right.add(i) + T::from(0.5) * *rsr.add(i);
1128 *center.add(i) = *center.add(i);
1129 *lfe.add(i) = *lfe.add(i);
1130 *ls.add(i) = *ls.add(i);
1131 *rs.add(i) = *rs.add(i);
1132 }
1133 self.layout = AudioChannelLayout::Surround51;
1134 }
1135 }
1136 }
1137 }
1138
1139 fn into_surround71(&mut self) {
1141 match self.layout {
1142 AudioChannelLayout::Mono => {
1143 unsafe {
1144 let len = self.len();
1146 let aud = self.buffers.as_mut_ptr();
1147
1148 let left = (*aud.add(AudioChannel::Left as usize)).as_mut_ptr();
1149 let right = (*aud.add(AudioChannel::Right as usize)).as_mut_ptr();
1150 let center = (*aud.add(AudioChannel::Center as usize)).as_mut_ptr();
1151 let lfe = (*aud.add(AudioChannel::LFE as usize)).as_mut_ptr();
1152 let ls = (*aud.add(AudioChannel::LeftSurround as usize)).as_mut_ptr();
1153 let rs = (*aud.add(AudioChannel::RightSurround as usize)).as_mut_ptr();
1154 let lsr = (*aud.add(AudioChannel::RearLeft as usize)).as_mut_ptr();
1155 let rsr = (*aud.add(AudioChannel::RearRight as usize)).as_mut_ptr();
1156
1157 for i in 0..len {
1158 let v = *left.add(i);
1159 *left.add(i) = v;
1160 *right.add(i) = v;
1161 *center.add(i) = v;
1162 *lfe.add(i) = T::from(0.0);
1163 *ls.add(i) = v;
1164 *rs.add(i) = v;
1165 *lsr.add(i) = v;
1166 *rsr.add(i) = v;
1167 }
1168 }
1169 self.layout = AudioChannelLayout::Surround71;
1170 }
1171
1172 AudioChannelLayout::Stereo => {
1173 unsafe {
1174 let len = self.len();
1175 let aud = self.buffers.as_mut_ptr();
1176
1177 let left = (*aud.add(AudioChannel::Left as usize)).as_mut_ptr();
1178 let right = (*aud.add(AudioChannel::Right as usize)).as_mut_ptr();
1179 let center = (*aud.add(AudioChannel::Center as usize)).as_mut_ptr();
1180 let lfe = (*aud.add(AudioChannel::LFE as usize)).as_mut_ptr();
1181 let ls = (*aud.add(AudioChannel::LeftSurround as usize)).as_mut_ptr();
1182 let rs = (*aud.add(AudioChannel::RightSurround as usize)).as_mut_ptr();
1183 let lsr = (*aud.add(AudioChannel::RearLeft as usize)).as_mut_ptr();
1184 let rsr = (*aud.add(AudioChannel::RearRight as usize)).as_mut_ptr();
1185
1186 for i in 0..len {
1187 let l = *left.add(i);
1188 let r = *right.add(i);
1189
1190 *center.add(i) = T::from(0.5) * l + T::from(0.5) * r;
1191 *lfe.add(i) = T::from(0.0);
1192
1193 *ls.add(i) = l;
1194 *rs.add(i) = r;
1195 *lsr.add(i) = l;
1196 *rsr.add(i) = r;
1197 }
1198 }
1199 self.layout = AudioChannelLayout::Surround71;
1200 }
1201
1202 AudioChannelLayout::Surround30 => {
1203 unsafe {
1204 let len = self.len();
1205 let aud = self.buffers.as_mut_ptr();
1206
1207 let left = (*aud.add(AudioChannel::Left as usize)).as_mut_ptr();
1208 let right = (*aud.add(AudioChannel::Right as usize)).as_mut_ptr();
1209 let center = (*aud.add(AudioChannel::Center as usize)).as_mut_ptr();
1210 let lfe = (*aud.add(AudioChannel::LFE as usize)).as_mut_ptr();
1211 let ls = (*aud.add(AudioChannel::LeftSurround as usize)).as_mut_ptr();
1212 let rs = (*aud.add(AudioChannel::RightSurround as usize)).as_mut_ptr();
1213 let lsr = (*aud.add(AudioChannel::RearLeft as usize)).as_mut_ptr();
1214 let rsr = (*aud.add(AudioChannel::RearRight as usize)).as_mut_ptr();
1215
1216 for i in 0..len {
1217 let c = *center.add(i);
1218 *lfe.add(i) = T::from(0.0);
1219 *ls.add(i) = T::from(0.5) * c;
1220 *rs.add(i) = T::from(0.5) * c;
1221 *lsr.add(i) = T::from(0.5) * c;
1222 *rsr.add(i) = T::from(0.5) * c;
1223 }
1224 }
1225 self.layout = AudioChannelLayout::Surround71;
1226 }
1227
1228 AudioChannelLayout::Surround40 => {
1229 unsafe {
1230 let aud = self.buffers.as_mut_ptr();
1231
1232 let center = &mut *aud.add(AudioChannel::Center as usize);
1233 let lfe = &mut *aud.add(AudioChannel::LFE as usize);
1234 let ls = &*aud.add(AudioChannel::LeftSurround as usize);
1235 let rs = &*aud.add(AudioChannel::RightSurround as usize);
1236 let lsr = &mut *aud.add(AudioChannel::RearLeft as usize);
1237 let rsr = &mut *aud.add(AudioChannel::RearRight as usize);
1238
1239 center.fill(T::from(0.0));
1240 lfe.fill(T::from(0.0));
1241 lsr.copy_from_slice(ls);
1242 rsr.copy_from_slice(rs);
1243 }
1244 self.layout = AudioChannelLayout::Surround71;
1245 }
1246
1247 AudioChannelLayout::Surround51 => {
1248 unsafe {
1249 let aud = self.buffers.as_mut_ptr();
1250
1251 let ls = &*aud.add(AudioChannel::LeftSurround as usize);
1252 let rs = &*aud.add(AudioChannel::RightSurround as usize);
1253 let lsr = &mut *aud.add(AudioChannel::RearLeft as usize);
1254 let rsr = &mut *aud.add(AudioChannel::RearRight as usize);
1255
1256 lsr.copy_from_slice(ls);
1257 rsr.copy_from_slice(rs);
1258 }
1259 self.layout = AudioChannelLayout::Surround71;
1260 }
1261
1262 AudioChannelLayout::Surround71 => {}
1263 }
1264 }
1265}