use std::time::Duration;
pub type SampleTime = u64;
#[derive(Debug, Clone)]
pub struct SampleTimeClock {
sample_rate: u32,
start_time: SampleTime,
}
impl SampleTimeClock {
pub fn new(sample_rate: u32) -> Self {
assert!(sample_rate > 0, "Invalid sample rate");
Self {
sample_rate,
start_time: 0,
}
}
pub fn duration_to_sample_time(duration: Duration, sample_rate: u32) -> SampleTime {
debug_assert!(sample_rate > 0, "Invalid sample rate");
if duration == Duration::MAX {
SampleTime::MAX
} else {
(duration.as_secs_f64() * sample_rate as f64) as SampleTime
}
}
pub fn sample_time_to_duration(sample_time: SampleTime, sample_rate: u32) -> Duration {
debug_assert!(sample_rate > 0, "Invalid sample rate");
if sample_time == SampleTime::MAX {
Duration::MAX
} else {
Duration::from_secs_f64(sample_time as f64 / sample_rate as f64)
}
}
pub fn reset(&mut self, current_time: SampleTime) {
self.start_time = current_time;
}
pub fn elapsed(&self, current_time: SampleTime) -> SampleTime {
current_time.saturating_sub(self.start_time)
}
pub fn elapsed_duration(&self, current_time: u64) -> Duration {
Self::sample_time_to_duration(self.elapsed(current_time), self.sample_rate)
}
}