1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
use audio_processor_traits::{Float, SimpleAudioProcessor};
use std::marker::PhantomData;
pub struct MonoToStereoProcessor<SampleType> {
source_channel: usize,
phantom: PhantomData<SampleType>,
}
impl<SampleType> Default for MonoToStereoProcessor<SampleType> {
fn default() -> Self {
MonoToStereoProcessor::new(0)
}
}
impl<SampleType> MonoToStereoProcessor<SampleType> {
pub fn new(source_channel: usize) -> Self {
MonoToStereoProcessor {
source_channel,
phantom: Default::default(),
}
}
pub fn set_source_channel(&mut self, source_channel: usize) {
self.source_channel = source_channel;
}
pub fn source_channel(&self) -> usize {
self.source_channel
}
}
impl<SampleType> SimpleAudioProcessor for MonoToStereoProcessor<SampleType>
where
SampleType: Float + Sync + Send,
{
type SampleType = SampleType;
fn s_process_frame(&mut self, frame: &mut [Self::SampleType]) {
let source_sample = frame[self.source_channel];
for sample in frame.iter_mut() {
*sample = source_sample;
}
}
}
#[cfg(test)]
mod test {
use audio_processor_testing_helpers::assert_f_eq;
use audio_processor_traits::{simple_processor, AudioBuffer, InterleavedAudioBuffer};
use super::*;
#[test]
fn test_mono_to_stereo_handles_mono_input() {
let mut mono = MonoToStereoProcessor::new(1);
let mut samples = [1., 0.1, 1., 0.1, 1., 0.1, 1., 0.1, 1., 0.1, 1., 0.1];
let mut input = InterleavedAudioBuffer::new(2, &mut samples);
simple_processor::process_buffer(&mut mono, &mut input);
for sample_index in 0..input.num_samples() {
for channel_index in 0..input.num_channels() {
let sample = *input.get(channel_index, sample_index);
assert_f_eq!(sample, 0.1);
}
}
}
#[test]
fn test_mono_to_stereo_can_have_the_source_changed() {
let mut mono = MonoToStereoProcessor::new(1);
mono.set_source_channel(0);
let mut samples = [1., 0.1, 1., 0.1, 1., 0.1, 1., 0.1, 1., 0.1, 1., 0.1];
let mut input = InterleavedAudioBuffer::new(2, &mut samples);
simple_processor::process_buffer(&mut mono, &mut input);
for sample_index in 0..input.num_samples() {
for channel_index in 0..input.num_channels() {
let sample = *input.get(channel_index, sample_index);
assert_f_eq!(sample, 1.);
}
}
}
}