use rodio::{Sample, Source, source::Zero};
pub enum SoundOrSilence<T>
where
T: Source,
{
Sound(T),
Silence(Zero),
}
impl<T> Iterator for SoundOrSilence<T>
where
T: Source,
{
type Item = Sample;
fn next(&mut self) -> Option<Self::Item> {
match self {
SoundOrSilence::Sound(source) => source.next(),
SoundOrSilence::Silence(silence) => silence.next(),
}
}
fn size_hint(&self) -> (usize, Option<usize>) {
match self {
SoundOrSilence::Sound(source) => source.size_hint(),
SoundOrSilence::Silence(silence) => silence.size_hint(),
}
}
}
impl<T> Source for SoundOrSilence<T>
where
T: Source,
{
fn current_span_len(&self) -> Option<usize> {
match self {
SoundOrSilence::Sound(source) => source.current_span_len(),
SoundOrSilence::Silence(silence) => silence.current_span_len(),
}
}
fn channels(&self) -> rodio::ChannelCount {
match self {
SoundOrSilence::Sound(source) => source.channels(),
SoundOrSilence::Silence(silence) => silence.channels(),
}
}
fn sample_rate(&self) -> rodio::SampleRate {
match self {
SoundOrSilence::Sound(source) => source.sample_rate(),
SoundOrSilence::Silence(silence) => silence.sample_rate(),
}
}
fn total_duration(&self) -> Option<std::time::Duration> {
match self {
SoundOrSilence::Sound(source) => source.total_duration(),
SoundOrSilence::Silence(silence) => silence.total_duration(),
}
}
}