use crate::error::{Error, ErrorCode};
use libsamplerate::*;
use std::ffi::CStr;
#[derive(Debug, Copy, Clone, Eq, PartialEq, Hash)]
pub enum ConverterType {
SincBestQuality = SRC_SINC_BEST_QUALITY as isize,
SincMediumQuality = SRC_SINC_MEDIUM_QUALITY as isize,
SincFastest = SRC_SINC_FASTEST as isize,
ZeroOrderHold = SRC_ZERO_ORDER_HOLD as isize,
Linear = SRC_LINEAR as isize,
}
impl ConverterType {
pub fn from_int(value: isize) -> Result<ConverterType, Error> {
match value {
0 => Ok(ConverterType::SincBestQuality),
1 => Ok(ConverterType::SincMediumQuality),
2 => Ok(ConverterType::SincFastest),
3 => Ok(ConverterType::ZeroOrderHold),
4 => Ok(ConverterType::Linear),
_ => Err(Error::from_code(ErrorCode::BadConverter)),
}
}
pub fn name(&self) -> &'static str {
unsafe { CStr::from_ptr(src_get_name(*self as i32)) }
.to_str()
.unwrap()
}
pub fn description(&self) -> &'static str {
unsafe { CStr::from_ptr(src_get_description(*self as i32)) }
.to_str()
.unwrap()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn create_converter_type_from_int() {
assert_eq!(
ConverterType::from_int(0),
Ok(ConverterType::SincBestQuality)
);
assert_eq!(
ConverterType::from_int(1),
Ok(ConverterType::SincMediumQuality)
);
assert_eq!(ConverterType::from_int(2), Ok(ConverterType::SincFastest));
assert_eq!(ConverterType::from_int(3), Ok(ConverterType::ZeroOrderHold));
assert_eq!(ConverterType::from_int(4), Ok(ConverterType::Linear));
assert_eq!(
ConverterType::from_int(8),
Err(Error::from_code(ErrorCode::BadConverter))
);
}
#[test]
fn name() {
assert_eq!(
ConverterType::SincBestQuality.name(),
"Best Sinc Interpolator"
);
assert_eq!(
ConverterType::SincMediumQuality.name(),
"Medium Sinc Interpolator"
);
assert_eq!(
ConverterType::SincFastest.name(),
"Fastest Sinc Interpolator"
);
assert_eq!(ConverterType::ZeroOrderHold.name(), "ZOH Interpolator");
assert_eq!(ConverterType::Linear.name(), "Linear Interpolator");
}
#[test]
fn description() {
assert_eq!(
ConverterType::SincBestQuality.description(),
"Band limited sinc interpolation, best quality, 144dB SNR, 96% BW."
);
assert_eq!(
ConverterType::SincMediumQuality.description(),
"Band limited sinc interpolation, medium quality, 121dB SNR, 90% BW."
);
assert_eq!(
ConverterType::SincFastest.description(),
"Band limited sinc interpolation, fastest, 97dB SNR, 80% BW."
);
assert_eq!(
ConverterType::ZeroOrderHold.description(),
"Zero order hold interpolator, very fast, poor quality."
);
assert_eq!(
ConverterType::Linear.description(),
"Linear interpolator, very fast, poor quality."
);
}
}