From 081912c5fb031b82b1ea81f1b61c80e032b71b1a Mon Sep 17 00:00:00 2001 From: Pierre Krieger Date: Mon, 15 Dec 2014 11:58:52 +0100 Subject: [PATCH] Implement some samples rate conversions --- examples/beep.rs | 6 ++---- src/conversions.rs | 33 +++++++++++++++++++++++++++++++-- src/lib.rs | 2 +- src/wasapi/mod.rs | 2 +- 4 files changed, 35 insertions(+), 8 deletions(-) diff --git a/examples/beep.rs b/examples/beep.rs index a19ced3..935b0c2 100644 --- a/examples/beep.rs +++ b/examples/beep.rs @@ -20,11 +20,9 @@ fn main() { loop { let mut buffer = channel.append_data(1, cpal::SamplesRate(44100)); - for sample in buffer.chunks_mut(1) { + for sample in buffer.iter_mut() { let value = data_source.next().unwrap(); - - sample[0] = value; - //sample[1] = value; + *sample = value; } } } diff --git a/src/conversions.rs b/src/conversions.rs index a70cbe8..b6c9b8a 100644 --- a/src/conversions.rs +++ b/src/conversions.rs @@ -7,6 +7,35 @@ This includes conversion between samples formats, channels or sample rates. pub fn convert_samples_rate(input: &[T], from: ::SamplesRate, to: ::SamplesRate) -> Vec where T: Copy { + let from = from.0; + let to = to.0; + + // if `from` is a multiple of `to` (for example `from` is 44100 and `to` is 22050), + // then we simply skip some samples + if from % to == 0 { + let mut result = Vec::new(); + for element in input.chunks((from / to) as uint) { + result.push(element[0]); + } + return result; + } + + // if `to` is a multiple of `from` (for example `to` is 44100 and `from` is 22050) + // TODO: dumb algorithm + // FIXME: doesn't take channels into account + if to % from == 0 { + let mut result = Vec::new(); + for element in input.windows(2) { + for _ in range(0, (to / from) as uint) { + result.push(element[0]); + } + } + for _ in range(0, (to / from) as uint) { + result.push(*input.last().unwrap()); + } + return result; + } + unimplemented!() } @@ -32,10 +61,10 @@ pub fn convert_channels(input: &[T], from: ::ChannelsCount, to: ::ChannelsCou result } -#[cfg(test)] +/*#[cfg(test)] mod test { #[test] fn test_convert_channels() { } -} +}*/ diff --git a/src/lib.rs b/src/lib.rs index 472948d..97e78e3 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -20,7 +20,7 @@ pub type ChannelsCount = u16; /// #[deriving(Show, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)] -pub struct SamplesRate(pub u16); +pub struct SamplesRate(pub u32); /// Represents a buffer that must be filled with audio data. /// diff --git a/src/wasapi/mod.rs b/src/wasapi/mod.rs index 52a605b..d472958 100644 --- a/src/wasapi/mod.rs +++ b/src/wasapi/mod.rs @@ -33,7 +33,7 @@ impl Channel { } pub fn get_samples_rate(&self) -> ::SamplesRate { - ::SamplesRate(self.samples_per_second as u16) + ::SamplesRate(self.samples_per_second as u32) } pub fn get_samples_format(&self) -> ::SampleFormat {