diff --git a/server/src/server.rs b/server/src/server.rs index eb550c8..e7dd8c8 100644 --- a/server/src/server.rs +++ b/server/src/server.rs @@ -368,12 +368,15 @@ fn validate_stream_params(p: &StreamParams) -> cubeb::Result<()> { | ffi::CUBEB_SAMPLE_FLOAT32LE | ffi::CUBEB_SAMPLE_FLOAT32BE ); + let valid_layout = + p.layout == ffi::CUBEB_LAYOUT_UNDEFINED || p.layout.count_ones() == p.channels; if valid_format && p.channels >= 1 && p.channels <= MAX_CHANNELS && p.rate >= MIN_RATE && p.rate <= MAX_RATE + && valid_layout { Ok(()) } else { @@ -381,6 +384,38 @@ fn validate_stream_params(p: &StreamParams) -> cubeb::Result<()> { } } +#[cfg(test)] +mod stream_params_tests { + use super::*; + + fn stream_params(channels: u32, layout: ffi::cubeb_channel_layout) -> StreamParams { + StreamParams { + format: ffi::CUBEB_SAMPLE_FLOAT32LE, + rate: 48_000, + channels, + layout, + prefs: ffi::CUBEB_STREAM_PREF_NONE, + input_params: ffi::CUBEB_INPUT_PROCESSING_PARAM_NONE, + } + } + + #[test] + fn validate_channel_layout() { + assert_eq!( + validate_stream_params(&stream_params(2, ffi::CUBEB_LAYOUT_STEREO)), + Ok(()) + ); + assert_eq!( + validate_stream_params(&stream_params(255, ffi::CUBEB_LAYOUT_UNDEFINED)), + Ok(()) + ); + assert_eq!( + validate_stream_params(&stream_params(255, ffi::CUBEB_LAYOUT_STEREO)), + Err(cubeb::Error::InvalidParameter) + ); + } +} + fn validate_stream_create_params(params: &StreamCreateParams) -> cubeb::Result<()> { if params.input_stream_params.is_none() && params.output_stream_params.is_none() { return Err(cubeb::Error::InvalidParameter);