1use std::sync::Arc;
3
4use crate::{
5 assert_valid_buffer_length, assert_valid_channel_number, assert_valid_number_of_channels,
6 assert_valid_sample_rate,
7};
8
9#[derive(Clone, Debug)]
16pub struct AudioBufferOptions {
17 pub number_of_channels: usize,
19 pub length: usize,
21 pub sample_rate: f32,
23}
24
25#[derive(Clone, Debug)]
69pub struct AudioBuffer {
70 pub(crate) channels: Vec<ChannelData>,
71 pub(crate) sample_rate: f32,
72}
73
74impl AudioBuffer {
75 pub fn new(options: AudioBufferOptions) -> Self {
84 assert_valid_sample_rate(options.sample_rate);
85 assert_valid_buffer_length(options.length);
86 assert_valid_number_of_channels(options.number_of_channels);
87
88 let silence = ChannelData::new(options.length);
89
90 Self {
91 channels: vec![silence; options.number_of_channels],
92 sample_rate: options.sample_rate,
93 }
94 }
95
96 pub fn from(samples: Vec<Vec<f32>>, sample_rate: f32) -> Self {
108 assert_valid_sample_rate(sample_rate);
109 assert_valid_number_of_channels(samples.len());
110
111 let channels: Vec<_> = samples.into_iter().map(ChannelData::from).collect();
112 if !channels.iter().all(|c| c.len() == channels[0].len()) {
113 panic!("Trying to create AudioBuffer from channel data with unequal length");
114 }
115
116 Self {
117 channels,
118 sample_rate,
119 }
120 }
121
122 pub fn number_of_channels(&self) -> usize {
124 self.channels.len()
125 }
126
127 pub fn length(&self) -> usize {
129 self.channels.first().map(ChannelData::len).unwrap_or(0)
130 }
131
132 pub fn sample_rate(&self) -> f32 {
134 self.sample_rate
135 }
136
137 pub fn duration(&self) -> f64 {
139 self.length() as f64 / self.sample_rate as f64
140 }
141
142 pub fn copy_from_channel(&self, destination: &mut [f32], channel_number: usize) {
149 assert_valid_channel_number(channel_number, self.number_of_channels());
150
151 self.copy_from_channel_with_offset(destination, channel_number, 0);
152 }
153
154 pub fn copy_from_channel_with_offset(
161 &self,
162 destination: &mut [f32],
163 channel_number: usize,
164 offset: usize,
165 ) {
166 assert_valid_channel_number(channel_number, self.number_of_channels());
167 let offset = offset.min(self.length());
168 let dest_length = destination.len();
173 let max_frame = (self.length() - offset).clamp(0, dest_length);
174 let channel = self.channel_data(channel_number).as_slice();
175
176 destination[..max_frame].copy_from_slice(&channel[offset..(max_frame + offset)]);
177 }
178
179 pub fn copy_to_channel(&mut self, source: &[f32], channel_number: usize) {
186 assert_valid_channel_number(channel_number, self.number_of_channels());
187
188 self.copy_to_channel_with_offset(source, channel_number, 0);
189 }
190
191 pub fn copy_to_channel_with_offset(
198 &mut self,
199 source: &[f32],
200 channel_number: usize,
201 offset: usize,
202 ) {
203 assert_valid_channel_number(channel_number, self.number_of_channels());
204 let offset = offset.min(self.length());
205 let src_len = source.len();
210 let max_frame = (self.length() - offset).clamp(0, src_len);
211 let channel = self.channel_data_mut(channel_number).as_mut_slice();
212
213 channel[offset..(max_frame + offset)].copy_from_slice(&source[..max_frame]);
214 }
215
216 pub fn get_channel_data(&self, channel_number: usize) -> &[f32] {
223 assert_valid_channel_number(channel_number, self.number_of_channels());
224 self.channel_data(channel_number).as_slice()
227 }
228
229 pub fn get_channel_data_mut(&mut self, channel_number: usize) -> &mut [f32] {
236 assert_valid_channel_number(channel_number, self.number_of_channels());
237 self.channel_data_mut(channel_number).as_mut_slice()
238 }
239
240 pub(crate) fn from_channels(channels: Vec<ChannelData>, sample_rate: f32) -> Self {
243 Self {
244 channels,
245 sample_rate,
246 }
247 }
248
249 pub(crate) fn channels(&self) -> &[ChannelData] {
251 &self.channels
252 }
253
254 pub(crate) fn channels_mut(&mut self) -> &mut [ChannelData] {
256 &mut self.channels
257 }
258
259 pub(crate) fn channel_data(&self, index: usize) -> &ChannelData {
264 &self.channels[index]
265 }
266
267 pub(crate) fn channel_data_mut(&mut self, index: usize) -> &mut ChannelData {
271 &mut self.channels[index]
272 }
273
274 pub(crate) fn extend(&mut self, other: &Self) {
278 assert_eq!(self.sample_rate, other.sample_rate);
279 assert_eq!(self.number_of_channels(), other.number_of_channels());
280
281 let data = self.channels_mut();
282 data.iter_mut()
283 .zip(other.channels.iter())
284 .for_each(|(channel, other_channel)| {
285 let cur_channel_data = Arc::make_mut(&mut channel.data);
286 cur_channel_data.extend(other_channel.as_slice());
287 })
288 }
289
290 pub(crate) fn split_off(&mut self, index: usize) -> Self {
292 let channels: Vec<_> = self
293 .channels_mut()
294 .iter_mut()
295 .map(|channel_data| Arc::make_mut(&mut channel_data.data).split_off(index))
296 .map(ChannelData::from)
297 .collect();
298
299 AudioBuffer::from_channels(channels, self.sample_rate)
300 }
301
302 pub(crate) fn resample(&mut self, sample_rate: f32) {
312 assert_valid_sample_rate(sample_rate);
313
314 if float_eq::float_eq!(self.sample_rate, sample_rate, abs <= 0.1) {
316 self.sample_rate = sample_rate;
317 return;
318 }
319
320 if self.length() == 0 {
322 self.sample_rate = sample_rate;
323 return;
324 }
325
326 let source_sr = self.sample_rate as f64;
327 let target_sr = sample_rate as f64;
328 let ratio = target_sr / source_sr;
329 let source_length = self.length();
330 let target_length = (self.length() as f64 * ratio).ceil() as usize;
331
332 let num_channels = self.number_of_channels();
333 let mut resampled = Vec::<Vec<f32>>::with_capacity(num_channels);
334 resampled.resize_with(num_channels, || Vec::<f32>::with_capacity(target_length));
335
336 for i in 0..target_length {
337 let position = i as f64 / (target_length - 1) as f64; let playhead = position * (source_length - 1) as f64;
339 let playhead_floored = playhead.floor();
340 let prev_index = playhead_floored as usize;
341 let next_index = (prev_index + 1).min(source_length - 1);
342
343 let k = (playhead - playhead_floored) as f32;
344 let k_inv = 1. - k;
345
346 for (channel, resampled_data) in resampled.iter_mut().enumerate() {
347 let prev_sample = self.channels[channel].data[prev_index];
348 let next_sample = self.channels[channel].data[next_index];
349
350 let value = k_inv * prev_sample + k * next_sample;
351 resampled_data.push(value);
352 }
353 }
354
355 self.channels
356 .iter_mut()
357 .zip(resampled)
358 .for_each(|(channel_data, resampled_data)| {
359 channel_data.data = Arc::new(resampled_data);
360 });
361
362 self.sample_rate = sample_rate;
363 }
364}
365
366#[derive(Clone, PartialEq)]
370pub(crate) struct ChannelData {
371 data: Arc<Vec<f32>>,
372}
373
374impl std::fmt::Debug for ChannelData {
375 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
376 f.debug_struct("ChannelData")
377 .field("len", &self.len())
378 .finish_non_exhaustive()
379 }
380}
381
382impl ChannelData {
383 pub fn new(length: usize) -> Self {
384 let buffer = vec![0.; length];
385 let data = Arc::new(buffer);
386
387 Self { data }
388 }
389
390 pub fn from(data: Vec<f32>) -> Self {
391 Self {
392 data: Arc::new(data),
393 }
394 }
395
396 pub fn len(&self) -> usize {
397 self.data.len()
398 }
399
400 #[allow(dead_code)]
402 pub fn is_empty(&self) -> bool {
403 self.data.is_empty()
404 }
405
406 pub fn as_slice(&self) -> &[f32] {
407 &self.data[..]
408 }
409
410 pub fn as_mut_slice(&mut self) -> &mut [f32] {
411 &mut Arc::make_mut(&mut self.data)[..]
412 }
413}
414
415#[cfg(test)]
416mod tests {
417 use float_eq::assert_float_eq;
418 use std::f32::consts::PI;
419
420 use super::*;
421
422 #[test]
423 fn test_constructor() {
424 let options = AudioBufferOptions {
425 number_of_channels: 1,
426 length: 96000,
427 sample_rate: 48000.,
428 };
429
430 let audio_buffer = AudioBuffer::new(options);
431
432 assert_eq!(audio_buffer.number_of_channels(), 1);
433 assert_eq!(audio_buffer.length(), 96000);
434 assert_float_eq!(audio_buffer.sample_rate(), 48000., abs <= 0.);
435 assert_float_eq!(audio_buffer.duration(), 2., abs <= 0.);
436 }
437
438 #[test]
439 #[should_panic]
440 fn test_zero_channels() {
441 let options = AudioBufferOptions {
442 number_of_channels: 0,
443 length: 10,
444 sample_rate: 48000.,
445 };
446
447 AudioBuffer::new(options); }
449
450 #[test]
451 #[should_panic]
452 fn test_zero_channels_from() {
453 let samples = vec![];
454 let sample_rate = 48000.;
455
456 AudioBuffer::from(samples, sample_rate); }
458
459 #[test]
460 #[should_panic]
461 fn test_invalid_sample_rate() {
462 let options = AudioBufferOptions {
463 number_of_channels: 1,
464 length: 10,
465 sample_rate: 0.,
466 };
467
468 AudioBuffer::new(options); }
470
471 #[test]
472 #[should_panic]
473 fn test_invalid_sample_rate_from() {
474 let samples = vec![vec![0.]];
475 let sample_rate = 0.;
476
477 AudioBuffer::from(samples, sample_rate); }
479
480 #[test]
481 #[should_panic]
482 fn test_invalid_length() {
483 let options = AudioBufferOptions {
484 number_of_channels: 1,
485 length: 0,
486 sample_rate: 48000.,
487 };
488
489 AudioBuffer::new(options); }
491
492 #[test]
493 fn test_channel_data_get_set() {
494 let options = AudioBufferOptions {
495 number_of_channels: 1,
496 length: 10,
497 sample_rate: 48000.,
498 };
499
500 let mut audio_buffer = AudioBuffer::new(options);
501 audio_buffer.channel_data_mut(0).as_mut_slice().fill(1.);
502 assert_float_eq!(
503 audio_buffer.channel_data(0).as_slice()[..],
504 [1.; 10][..],
505 abs_all <= 0.
506 );
507 }
508
509 #[test]
510 #[should_panic]
511 fn test_invalid_copy_from_channel() {
512 let options = AudioBufferOptions {
513 number_of_channels: 1,
514 length: 10,
515 sample_rate: 48000.,
516 };
517
518 let audio_buffer = AudioBuffer::new(options);
519
520 let mut dest = vec![1.; 10];
522 audio_buffer.copy_from_channel(&mut dest, 1);
523 }
524
525 #[test]
526 fn test_copy_from_channel() {
527 let options = AudioBufferOptions {
528 number_of_channels: 1,
529 length: 10,
530 sample_rate: 48000.,
531 };
532
533 let audio_buffer = AudioBuffer::new(options);
534
535 let mut dest = vec![1.; 10];
537 audio_buffer.copy_from_channel(&mut dest, 0);
538 assert_float_eq!(dest[..], vec![0.; 10][..], abs_all <= 0.);
539
540 let mut dest = vec![1.; 5];
542 audio_buffer.copy_from_channel(&mut dest, 0);
543 assert_float_eq!(dest[..], [0., 0., 0., 0., 0.][..], abs_all <= 0.);
544
545 let mut dest = vec![1.; 11];
547 audio_buffer.copy_from_channel(&mut dest, 0);
548 assert_float_eq!(
549 dest[..],
550 [0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.][..],
551 abs_all <= 0.
552 );
553
554 let mut dest = vec![1.; 10];
556 audio_buffer.copy_from_channel_with_offset(&mut dest, 0, 5);
557 assert_float_eq!(
558 dest[..],
559 [0., 0., 0., 0., 0., 1., 1., 1., 1., 1.][..],
560 abs_all <= 0.
561 );
562
563 let mut dest = vec![1.; 10];
565 audio_buffer.copy_from_channel_with_offset(&mut dest, 0, usize::MAX);
566
567 assert_float_eq!(dest[..], vec![1.; 10][..], abs_all <= 0.);
568 }
569
570 #[test]
571 #[should_panic]
572 fn test_invalid_copy_to_channel() {
573 let options = AudioBufferOptions {
574 number_of_channels: 1,
575 length: 10,
576 sample_rate: 48000.,
577 };
578
579 let mut audio_buffer = AudioBuffer::new(options);
580
581 let src = vec![1.; 10];
583 audio_buffer.copy_to_channel(&src, 1);
584 }
585
586 #[test]
587 fn test_copy_to_channel() {
588 let options = AudioBufferOptions {
589 number_of_channels: 1,
590 length: 10,
591 sample_rate: 48000.,
592 };
593
594 {
595 let mut audio_buffer = AudioBuffer::new(options.clone());
597 let src = vec![1.; 10];
598 audio_buffer.copy_to_channel(&src, 0);
599 assert_float_eq!(
600 audio_buffer.channel_data(0).as_slice()[..],
601 [1.; 10][..],
602 abs_all <= 0.
603 );
604 }
605
606 {
607 let mut audio_buffer = AudioBuffer::new(options.clone());
609 let src = vec![1.; 5];
610 audio_buffer.copy_to_channel(&src, 0);
611 assert_float_eq!(
612 audio_buffer.channel_data(0).as_slice()[..],
613 [1., 1., 1., 1., 1., 0., 0., 0., 0., 0.][..],
614 abs_all <= 0.
615 );
616 }
617
618 {
619 let mut audio_buffer = AudioBuffer::new(options.clone());
621 let src = vec![1.; 12];
622 audio_buffer.copy_to_channel(&src, 0);
623 assert_float_eq!(
624 audio_buffer.channel_data(0).as_slice()[..],
625 [1., 1., 1., 1., 1., 1., 1., 1., 1., 1.][..],
626 abs_all <= 0.
627 );
628 }
629
630 {
631 let mut audio_buffer = AudioBuffer::new(options.clone());
633 let src = vec![1.; 10];
634 audio_buffer.copy_to_channel_with_offset(&src, 0, 5);
635 assert_float_eq!(
636 audio_buffer.channel_data(0).as_slice()[..],
637 [0., 0., 0., 0., 0., 1., 1., 1., 1., 1.][..],
638 abs_all <= 0.
639 );
640 }
641
642 {
643 let mut audio_buffer = AudioBuffer::new(options);
645 let src = vec![1.; 10];
646 audio_buffer.copy_to_channel_with_offset(&src, 0, usize::MAX);
647 assert_float_eq!(
648 audio_buffer.channel_data(0).as_slice()[..],
649 [0.; 10][..],
650 abs_all <= 0.
651 );
652 }
653 }
654
655 #[test]
656 #[should_panic]
657 fn test_invalid_get_channel_data() {
658 let options = AudioBufferOptions {
659 number_of_channels: 1,
660 length: 10,
661 sample_rate: 48000.,
662 };
663
664 let audio_buffer = AudioBuffer::new(options);
665
666 audio_buffer.get_channel_data(1);
667 }
668
669 #[test]
671 fn test_silent() {
672 let options = AudioBufferOptions {
673 number_of_channels: 2,
674 length: 10,
675 sample_rate: 44100.,
676 };
677 let b = AudioBuffer::new(options);
678
679 assert_eq!(b.length(), 10);
680 assert_eq!(b.number_of_channels(), 2);
681 assert_float_eq!(b.sample_rate(), 44100., abs_all <= 0.);
682 assert_float_eq!(b.channel_data(0).as_slice(), &[0.; 10][..], abs_all <= 0.);
683 assert_float_eq!(b.channel_data(1).as_slice(), &[0.; 10][..], abs_all <= 0.);
684 assert_eq!(b.channels().get(2), None);
685 }
686
687 #[test]
688 fn test_concat() {
689 let options = AudioBufferOptions {
690 number_of_channels: 2,
691 length: 5,
692 sample_rate: 44100.,
693 };
694 let mut b1 = AudioBuffer::new(options.clone());
695 let b2 = AudioBuffer::new(options);
696 b1.extend(&b2);
697
698 assert_eq!(b1.length(), 10);
699 assert_eq!(b1.number_of_channels(), 2);
700 assert_float_eq!(b1.sample_rate(), 44100., abs_all <= 0.);
701
702 let channel_data = ChannelData::from(vec![1.; 5]);
703 let b3 = AudioBuffer::from_channels(vec![channel_data; 2], 44100.);
704
705 b1.extend(&b3);
706
707 assert_eq!(b1.length(), 15);
708 assert_eq!(b1.number_of_channels(), 2);
709 assert_float_eq!(b1.sample_rate(), 44100., abs_all <= 0.);
710 assert_float_eq!(
711 b1.channel_data(0).as_slice(),
712 &[0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 1., 1., 1., 1.][..],
713 abs_all <= 0.
714 );
715 }
716
717 #[test]
718 #[should_panic]
719 fn test_resample_to_zero_hertz() {
720 let channel = ChannelData::from(vec![1., 2., 3., 4., 5.]);
721 let mut buffer = AudioBuffer::from_channels(vec![channel], 48000.);
722 buffer.resample(0.);
723 }
724
725 #[test]
726 fn test_resample_from_empty() {
727 let channel = ChannelData::from(vec![]);
728 let mut buffer = AudioBuffer::from_channels(vec![channel], 48000.);
729 buffer.resample(48000.);
730
731 assert_eq!(buffer.length(), 0);
732 assert_float_eq!(buffer.sample_rate, 48000., abs_all <= 0.);
733 }
734
735 #[test]
736 fn test_upsample() {
737 let channel = ChannelData::from(vec![1., 2., 3., 4., 5.]);
738 let mut buffer = AudioBuffer::from_channels(vec![channel], 48000.);
739 buffer.resample(96000.); let mut expected = [0.; 10];
742 let incr = 4. / 9.; for (i, value) in expected.iter_mut().enumerate() {
745 *value = 1. + incr * i as f32;
746 }
747
748 assert_float_eq!(
749 buffer.channel_data(0).as_slice(),
750 &expected[..],
751 abs_all <= 1e-6
752 );
753
754 assert_float_eq!(buffer.sample_rate, 96000., abs_all <= 0.);
755 }
756
757 #[test]
758 fn test_downsample() {
759 let channel = ChannelData::from(vec![1., 2., 3., 4., 5.]);
760 let mut buffer = AudioBuffer::from_channels(vec![channel], 96000.);
761 buffer.resample(48000.); assert_float_eq!(
764 buffer.channel_data(0).as_slice(),
765 &[1., 3., 5.][..],
766 abs_all <= 0.
767 );
768
769 assert_float_eq!(buffer.sample_rate, 48000., abs_all <= 0.);
770 }
771
772 #[test]
773 fn test_resample_stereo() {
774 [22500, 38000, 48000, 96000].iter().for_each(|sr| {
775 let source_sr = *sr;
776 let target_sr = 44_100;
777
778 let mut left = Vec::<f32>::with_capacity(source_sr);
779 let mut right = Vec::<f32>::with_capacity(source_sr);
780
781 for i in 0..source_sr {
782 let phase = i as f32 / source_sr as f32 * 2. * PI;
783 left.push(phase.sin());
784 right.push(phase.cos());
785 }
786
787 let left_chan = ChannelData::from(left);
788 let right_chan = ChannelData::from(right);
789 let mut buffer =
790 AudioBuffer::from_channels(vec![left_chan, right_chan], source_sr as f32);
791 buffer.resample(target_sr as f32);
792
793 let mut expected_left = vec![];
794 let mut expected_right = vec![];
795
796 for i in 0..target_sr {
797 let phase = i as f32 / target_sr as f32 * 2. * PI;
798 expected_left.push(phase.sin());
799 expected_right.push(phase.cos());
800 }
801
802 assert_float_eq!(
803 buffer.get_channel_data(0)[..],
804 &expected_left[..],
805 abs_all <= 1e-3
806 );
807
808 assert_float_eq!(
809 buffer.get_channel_data(1)[..],
810 &expected_right[..],
811 abs_all <= 1e-3
812 );
813
814 assert_float_eq!(buffer.sample_rate, target_sr as f32, abs_all <= 0.);
815 });
816 }
817}