From fb11478bf6fec40160436049a596fd27e96e5764 Mon Sep 17 00:00:00 2001 From: Pierre Krieger Date: Mon, 22 Dec 2014 15:34:18 +0100 Subject: [PATCH] Cleanup and add tests for convert_channels --- src/conversions.rs | 47 ++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 41 insertions(+), 6 deletions(-) diff --git a/src/conversions.rs b/src/conversions.rs index b6c9b8a..2a5c77b 100644 --- a/src/conversions.rs +++ b/src/conversions.rs @@ -39,9 +39,21 @@ pub fn convert_samples_rate(input: &[T], from: ::SamplesRate, to: ::SamplesRa unimplemented!() } +/// Converts between a certain number of channels. +/// +/// If the target number is inferior to the source number, additional channels are removed. +/// +/// If the target number is superior to the source number, the value of channel `N` is equal +/// to the value of channel `N % source_channels`. +/// +/// ## Panic +/// +/// Panics if `from` is 0, `to` is 0, or if the data length is not a multiple of `from`. pub fn convert_channels(input: &[T], from: ::ChannelsCount, to: ::ChannelsCount) -> Vec where T: Copy { + assert!(from != 0); + assert!(to != 0); assert!(input.len() % from as uint == 0); let mut result = Vec::new(); @@ -53,18 +65,41 @@ pub fn convert_channels(input: &[T], from: ::ChannelsCount, to: ::ChannelsCou } // adding extra ones - for i in range(0, ::std::cmp::max(0, to - from)) { - result.push(element[i as uint % element.len()]); + if to > from { + for i in range(0, to - from) { + result.push(element[i as uint % element.len()]); + } } } result } -/*#[cfg(test)] +#[cfg(test)] mod test { - #[test] - fn test_convert_channels() { + use super::convert_channels; + #[test] + fn remove_channels() { + let result = convert_channels(&[1u16, 2, 3, 1, 2, 3], 3, 2); + assert_eq!(result.as_slice(), [1, 2, 1, 2]); + + let result = convert_channels(&[1u16, 2, 3, 4, 1, 2, 3, 4], 4, 1); + assert_eq!(result.as_slice(), [1, 1]); } -}*/ + + #[test] + fn add_channels() { + let result = convert_channels(&[1u16, 2, 1, 2], 2, 3); + assert_eq!(result.as_slice(), [1, 2, 1, 1, 2, 1]); + + let result = convert_channels(&[1u16, 2, 1, 2], 2, 4); + assert_eq!(result.as_slice(), [1, 2, 1, 2, 1, 2, 1, 2]); + } + + #[test] + #[should_fail] + fn convert_channels_wrong_data_len() { + convert_channels(&[1u16, 2, 3], 2, 1); + } +}