use crate::errors::error;
use claxon::metadata::StreamInfo;
use rogue_logging::Error;
#[must_use]
pub fn is_resample_required(info: &StreamInfo) -> bool {
info.sample_rate > 48000 || info.bits_per_sample > 16
}
pub fn get_resample_rate(info: &StreamInfo) -> Result<u32, Error> {
if info.sample_rate % 44100 == 0 {
Ok(44100)
} else if info.sample_rate % 48000 == 0 {
Ok(48000)
} else {
Err(error("get sample rate", "invalid sample rate".to_owned()))
}
}
#[allow(
clippy::cast_precision_loss,
clippy::cast_lossless,
clippy::cast_sign_loss,
clippy::as_conversions,
clippy::cast_possible_truncation
)]
pub fn get_average_bit_rate(info: &StreamInfo) -> Option<u32> {
let total_samples = info.samples?;
let total_bits = total_samples * info.bits_per_sample as u64 * info.channels as u64;
let duration_seconds = total_samples as f64 / info.sample_rate as f64;
let bit_rate = total_bits as f64 / duration_seconds;
let bit_rate = bit_rate.round() as u32;
Some(bit_rate)
}
#[allow(
clippy::cast_precision_loss,
clippy::cast_sign_loss,
clippy::cast_possible_truncation,
clippy::as_conversions
)]
pub fn get_duration(info: &StreamInfo) -> Option<u32> {
let seconds = info.samples? as f64 / f64::from(info.sample_rate);
Some(seconds.round() as u32)
}