audio_master/
audio_buffer.rs

1use crate::audio_math::{AudioMath, AudioMathImpl};
2use crate::consts::MAX_AUDIO_CHANNELS;
3use crate::float_type::FloatType;
4
5// const INV_SQRT2: f64 = 0.7071067811865476;
6const INV_SQRT2: f32 = 0.7071067811865476;
7
8/// Represents common audio channel layouts, where the enum variant's repr(usize) corresponds
9/// to the number of channels in that layout.
10#[repr(usize)]
11#[derive(Clone, Copy, Debug, PartialEq, Eq)]
12pub enum AudioChannelLayout {
13    /// Single channel audio (monaural).
14    Mono = 1,
15    /// Two-channel audio (left and right).
16    Stereo = 2,
17    /// Three-channel surround sound (left, right, center).
18    Surround30 = 3,
19    /// Four-channel surround sound (left, right, center, rear).
20    Surround40 = 4,
21    /// Six-channel surround sound (5.1: left, right, center, LFE, left surround, right surround).
22    Surround51 = 6,
23    /// Eight-channel surround sound (7.1: adds rear left and rear right).
24    Surround71 = 8,
25}
26
27impl Default for AudioChannelLayout {
28    fn default() -> Self {
29        Self::Stereo
30    }
31}
32
33/// Represents individual audio channels in a multi-channel setup, with repr(usize) for indexing.
34#[repr(usize)]
35#[derive(Clone, Copy, Debug)]
36pub enum AudioChannel {
37    /// Left channel.
38    Left = 0,
39    /// Right channel.
40    Right = 1,
41    /// Center channel.
42    Center = 2,
43    /// Low-Frequency Effects (subwoofer) channel.
44    LFE = 3,
45    /// Left surround channel.
46    LeftSurround = 4,
47    /// Right surround channel.
48    RightSurround = 5,
49    /// Rear left channel (for 7.1 layouts).
50    RearLeft = 6,
51    /// Rear right channel (for 7.1 layouts).
52    RearRight = 7,
53}
54
55pub trait AudioBufferMathImpl<T: FloatType>: Sized {
56    /// This adjusts the audio levels to a target RMS value.
57    fn normalize_rms(&mut self, rms_factor: T);
58
59    /// Useful for gain adjustments.
60    fn normalize(&mut self, factor: T);
61}
62
63/// Trait for interleaved audio buffer operations, where samples from all channels are stored
64/// in a single contiguous buffer (e.g., LRLRLR... for stereo).
65pub trait AudioBufferInterleavedImpl<T: FloatType>: Sized {
66    /// Creates a new interleaved audio buffer with the specified length (per channel) and channel layout.
67    /// The total buffer length will be `length * layout as usize`.
68    fn new(length: usize, layout: AudioChannelLayout) -> AudioBufferInterleaved<T>;
69
70    /// Resets the buffer by filling it with zeros.
71    fn reset(&mut self);
72
73    /// Returns the current channel layout of the buffer.
74    fn get_channel_layout(&self) -> AudioChannelLayout;
75
76    /// Sets a new channel layout, potentially reallocating the buffer if the layout changes.
77    fn set_channel_layout(&mut self, layout: AudioChannelLayout);
78
79    /// Returns an immutable reference to the entire interleaved buffer.
80    fn get_buffer(&self) -> &[T];
81
82    /// Returns a mutable reference to the entire interleaved buffer.
83    fn get_buffer_mut(&mut self) -> &mut [T];
84
85    /// Returns the length per channel (planar length).
86    fn len_planar(&self) -> usize;
87
88    /// Returns the total interleaved length (channels * planar length).
89    fn len_interleaved(&self) -> usize;
90
91    /// Resizes the buffer to a new planar length, adjusting the total size accordingly.
92    fn resize(&mut self, new_len: usize);
93
94    /// Copies the interleaved data into a planar AudioBuffer (separate buffers per channel).
95    fn copy_to_planar(&self, output: &mut AudioBuffer<T>);
96}
97
98/// Trait for planar audio buffer operations, where each channel has its own separate buffer.
99pub trait AudioBufferImpl<T: FloatType>: Sized {
100    /// Creates a new planar audio buffer with the specified length (per channel) and channel layout.
101    fn new(len: usize, layout: AudioChannelLayout) -> AudioBuffer<T>;
102
103    /// Creates a new planar audio buffer with default length (0) and the specified layout.
104    fn new_with_layout(layout: AudioChannelLayout) -> AudioBuffer<T>;
105
106    /// Returns an immutable slice for the specified channel.
107    /// Panics if the channel index exceeds the layout's channel count.
108    fn get_channel(&self, channel: usize) -> &[T];
109
110    /// Returns a mutable slice for the specified channel.
111    /// Panics if the channel index exceeds the layout's channel count.
112    fn get_channel_mut(&mut self, channel: usize) -> &mut [T];
113
114    /// Returns an immutable slice for the specified channel without bounds checking.
115    unsafe fn get_channel_unchecked(&self, channel: usize) -> &[T];
116
117    /// Returns a mutable slice for the specified channel without bounds checking.
118    unsafe fn get_channel_unchecked_mut(&mut self, channel: usize) -> &mut [T];
119
120    /// Resizes all channel buffers to the new length, filling new space with zeros.
121    fn resize(&mut self, new_len: usize);
122
123    /// Copies all channels' data into an interleaved destination slice.
124    /// Panics if the destination length does not match `self.len() * self.channel_layout() as usize`.
125    fn copy_to_interleaved(&self, dst: &mut [T]);
126
127    /// Mixes another AudioBuffer into this one without applying gain.
128    /// Panics if lengths or layouts do not match.
129    fn mix_with(&mut self, other: &AudioBuffer<T>);
130
131    /// Mixes another AudioBuffer into this one with the specified gain applied to the other buffer.
132    /// Panics if lengths or layouts do not match.
133    fn mix_with_gain(&mut self, other: &AudioBuffer<T>, gain: f32);
134
135    /// Copies data from another AudioBuffer.
136    /// Panics if lengths or layouts do not match.
137    fn copy_from(&mut self, other: &AudioBuffer<T>);
138
139    /// Copies data from an interleaved buffer.
140    /// Panics if the interleaved length does not match the expected size.
141    fn copy_from_interleaved(&mut self, buffer: &[T]);
142
143    /// Copies a range from an interleaved input buffer, starting at an offset.
144    /// - `start` and `end`: Range in the input buffer.
145    /// - `offset`: Starting channel offset in the planar buffer.
146    /// Panics if `start > end` or `end >= input.len()`.
147    fn copy_from_interleaved_range(&mut self, input: &[T], start: usize, end: usize, offset: usize);
148
149    /// Returns the current channel layout.
150    fn channel_layout(&self) -> AudioChannelLayout;
151
152    /// Sets a new channel layout, converting the audio signal into new layout.
153    fn set_channel_layout(&mut self, new_layout: AudioChannelLayout);
154
155    /// Resets all buffers by filling them with zeros.
156    fn reset(&mut self);
157
158    /// Returns the length per channel (planar length).
159    fn len(&self) -> usize;
160
161    /// Returns the total interleaved length (channels * planar length).
162    fn len_interleaved(&self) -> usize;
163
164    /// Converts this buffer to a cloned AudioBuffer with f32 samples.
165    fn to_f32(&self) -> AudioBuffer<f32>;
166
167    /// Converts this buffer to a cloned AudioBuffer with f64 samples.
168    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    /// Total interleaved length (layout * len())
175    len_interleaved: usize, 
176    layout: AudioChannelLayout,
177}
178
179#[derive(Debug, Clone)]
180pub struct AudioBufferInterleaved<T: FloatType> {
181    buffer: Vec<T>,
182    /// Length per channel.
183    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)); // ismatched types expected type parameter `T` found type `{float}`
499        }
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                    // L_mono = T::from(0.5) * L + T::from(0.5) * R
563                    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                    // L_mono = T::from(0.5) * L + T::from(0.5) * R + 0.707 * C
577                    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                    // L_mono = T::from(0.5) * L + T::from(0.5) * R + T::from(0.5) * Ls + T::from(0.5) * Rs
594                    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                    // L_mono = T::from(0.5) * L + T::from(0.5) * R + 0.707 * C + T::from(0.5) * Ls + T::from(0.5) * Rs + T::from(0.5) * LFE
613                    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                    // L_mono = T::from(0.5) * L + T::from(0.5) * R + 0.707 * C + T::from(0.5) * Ls + T::from(0.5) * Rs + T::from(0.5) * Lsr + T::from(0.5) * Rsr + T::from(0.5) * LFE
636                    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                    // L = R = Mono
668                    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                    // L_stereo = L + 0.707 * C, R_stereo = R + 0.707 * C
684                    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                    // L_stereo = L + T::from(0.5) * Ls, R_stereo = R + T::from(0.5) * Rs
700                    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                    // L_stereo = L + 0.707 * C + T::from(0.5) * Ls + T::from(0.5) * LFE
717                    // R_stereo = R + 0.707 * C + T::from(0.5) * Rs + T::from(0.5) * LFE
718                    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                    // L_stereo = L + 0.707 * C + T::from(0.5) * Ls + T::from(0.5) * Lsr + T::from(0.5) * LFE
743                    // R_stereo = R + 0.707 * C + T::from(0.5) * Rs + T::from(0.5) * Rsr + T::from(0.5) * LFE
744                    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    /// Converts the buffer to Surround 3.0 (3 channels: L, R, C).
774    fn into_surround30(&mut self) {
775        match self.layout {
776            AudioChannelLayout::Mono => {
777                unsafe {
778                    // L = R = C = Mono
779                    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                    // L = L, R = R, C = T::from(0.5) * L + T::from(0.5) * R
796                    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                    // L = L + T::from(0.5) * Ls, R = R + T::from(0.5) * Rs, C = 0
814                    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                    // L = L + T::from(0.5) * Ls + T::from(0.5) * LFE, R = R + T::from(0.5) * Rs + T::from(0.5) * LFE, C = C
833                    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                    // L = L + T::from(0.5) * Ls + T::from(0.5) * Lsr + T::from(0.5) * LFE
855                    // R = R + T::from(0.5) * Rs + T::from(0.5) * Rsr + T::from(0.5) * LFE
856                    // C = C
857                    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    /// Converts the buffer to Surround 4.0 (4 channels: L, R, Ls, Rs).
886    fn into_surround40(&mut self) {
887        match self.layout {
888            AudioChannelLayout::Mono => {
889                unsafe {
890                    // L = R = Ls = Rs = Mono
891                    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                    // let ls = (*aud.add(AudioChannel::Left as usize)).as_mut_ptr();
899                    // let rs = (*aud.add(AudioChannel::RightSurround as usize)).as_mut_ptr();
900                    // let lsr = (*aud.add(AudioChannel::RearLeft as usize)).as_mut_ptr();
901                    // let rsr = (*aud.add(AudioChannel::RearRight as usize)).as_mut_ptr();
902                    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                    // L = L, R = R, Ls = L, Rs = R
914                    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                    // let ls = (*aud.add(AudioChannel::Left as usize)).as_mut_ptr();
922                    // let rs = (*aud.add(AudioChannel::RightSurround as usize)).as_mut_ptr();
923                    // let lsr = (*aud.add(AudioChannel::RearLeft as usize)).as_mut_ptr();
924                    // let rsr = (*aud.add(AudioChannel::RearRight as usize)).as_mut_ptr();
925                    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                    // L = L, R = R, Ls = T::from(0.5) * C, Rs = T::from(0.5) * C
937                    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                    // let ls = (*aud.add(AudioChannel::Left as usize)).as_mut_ptr();
945                    // let rs = (*aud.add(AudioChannel::RightSurround as usize)).as_mut_ptr();
946                    // let lsr = (*aud.add(AudioChannel::RearLeft as usize)).as_mut_ptr();
947                    // let rsr = (*aud.add(AudioChannel::RearRight as usize)).as_mut_ptr();
948                    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                    // L = L + T::from(0.5) * LFE, R = R + T::from(0.5) * LFE, Ls = Ls, Rs = Rs
961                    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                    // let lsr = (*aud.add(AudioChannel::RearLeft as usize)).as_mut_ptr();
971                    // let rsr = (*aud.add(AudioChannel::RearRight as usize)).as_mut_ptr();
972                    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                    // L = L + T::from(0.5) * LFE, R = R + T::from(0.5) * LFE, Ls = Ls + T::from(0.5) * Lsr, Rs = Rs + T::from(0.5) * Rsr
984                    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    /// Converts the buffer to Surround 5.1 (6 channels: L, R, C, LFE, Ls, Rs).
1008    fn into_surround51(&mut self) {
1009        match self.layout {
1010            AudioChannelLayout::Mono => {
1011                unsafe {
1012                    // L = R = C = Ls = Rs = Mono, LFE = 0
1013                    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                    // let lsr = (*aud.add(AudioChannel::RearLeft as usize)).as_mut_ptr();
1023                    // let rsr = (*aud.add(AudioChannel::RearRight as usize)).as_mut_ptr();
1024                    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); // LFE
1029                        *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                    // L = L, R = R, C = T::from(0.5) * L + T::from(0.5) * R, Ls = L, Rs = R, LFE = 0
1038                    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                    // let lsr = (*aud.add(AudioChannel::RearLeft as usize)).as_mut_ptr();
1048                    // let rsr = (*aud.add(AudioChannel::RearRight as usize)).as_mut_ptr();
1049                    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); // LFE
1054                        *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                    // L = L, R = R, C = C, Ls = T::from(0.5) * C, Rs = T::from(0.5) * C, LFE = 0
1063                    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                    // let lsr = (*aud.add(AudioChannel::RearLeft as usize)).as_mut_ptr();
1073                    // let rsr = (*aud.add(AudioChannel::RearRight as usize)).as_mut_ptr();
1074                    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); // LFE
1079                        *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                    // L = L, R = R, C = 0, LFE = 0, Ls = Ls, Rs = Rs
1088                    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                    // let lsr = (*aud.add(AudioChannel::RearLeft as usize)).as_mut_ptr();
1098                    // let rsr = (*aud.add(AudioChannel::RearRight as usize)).as_mut_ptr();
1099                    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); // C
1103                        *lfe.add(i) = T::from(0.0); // LFE
1104                        *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                    // L = L + T::from(0.5) * Lsr, R = R + T::from(0.5) * Rsr, C = C, LFE = LFE, Ls = Ls, Rs = Rs
1114                    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    /// Converts the buffer to Surround 7.1 (8 channels: L, R, C, LFE, Ls, Rs, Lsr, Rsr).
1140    fn into_surround71(&mut self) {
1141        match self.layout {
1142            AudioChannelLayout::Mono => {
1143                unsafe {
1144                    // L = R = C = Ls = Rs = Lsr = Rsr = Mono, LFE = 0
1145                    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}