use crate::decoded_hps::DecodedHps;
#[derive(Debug, Clone, PartialEq)]
pub struct DecodedHpsRodioSource(DecodedHps);
impl DecodedHpsRodioSource {
pub(crate) fn new(decoded_hps: DecodedHps) -> Self {
Self(decoded_hps)
}
}
impl Iterator for DecodedHpsRodioSource {
type Item = f32;
fn next(&mut self) -> Option<Self::Item> {
self.0.next().map(|sample| sample as f32 / i16::MAX as f32)
}
}
impl rodio::Source for DecodedHpsRodioSource {
fn current_span_len(&self) -> Option<usize> {
None
}
fn channels(&self) -> u16 {
self.0.channel_count as u16
}
fn sample_rate(&self) -> u32 {
self.0.sample_rate
}
fn total_duration(&self) -> Option<std::time::Duration> {
if self.0.is_looping() {
None
} else {
Some(self.0.duration())
}
}
}