use crate::error::VadError;
pub const SUPPORTED_SAMPLE_RATES: &[u32] = &[8000, 16000, 32000, 48000];
pub fn validate_sample_rate(sample_rate: u32) -> Result<(), VadError> {
if SUPPORTED_SAMPLE_RATES.contains(&sample_rate) {
Ok(())
} else {
Err(VadError::InvalidSampleRate(sample_rate))
}
}
pub fn frame_samples(sample_rate: u32, duration_ms: u32) -> usize {
(sample_rate as usize * duration_ms as usize) / 1000
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn valid_sample_rates() {
for &rate in SUPPORTED_SAMPLE_RATES {
assert!(validate_sample_rate(rate).is_ok());
}
}
#[test]
fn invalid_sample_rates() {
assert!(validate_sample_rate(44100).is_err());
assert!(validate_sample_rate(22050).is_err());
assert!(validate_sample_rate(0).is_err());
}
#[test]
fn frame_samples_calculation() {
assert_eq!(frame_samples(16000, 10), 160);
assert_eq!(frame_samples(16000, 20), 320);
assert_eq!(frame_samples(16000, 30), 480);
assert_eq!(frame_samples(8000, 10), 80);
assert_eq!(frame_samples(48000, 30), 1440);
}
}