Closed
Description
I've been exploring the new seeking feature and noticed a couple of issues. When a source is played, it gets removed from the queue and try_seek()
stops working. On macOS, it even stalls the thread without returning an error, which might need its own bug report.
One idea I had to work around this is to implement a NeverStop
source that never returns None
on next()
. However, I'm wondering if there's a better way to handle this, like automatically pausing when a source finishes.
My current workaround for reference>
#[derive(Clone, Debug)]
pub struct NeverStop<I>
where
I: Source,
I::Item: Sample,
{
source: I,
}
impl<I> NeverStop<I>
where
I: Source,
I::Item: Sample,
{
pub fn new(source: I) -> Self {
NeverStop { source }
}
}
impl<I> Iterator for NeverStop<I>
where
I: Source,
I::Item: Sample,
{
type Item = <I as Iterator>::Item;
fn next(&mut self) -> Option<<I as Iterator>::Item> {
// if next is None, then the source has ended and we should return 0
Some(self.source.next().unwrap_or_else(|| I::Item::zero_value()))
}
}
impl<I> Source for NeverStop<I>
where
I: Iterator + Source,
I::Item: Sample,
{
fn current_frame_len(&self) -> Option<usize> {
None
}
fn channels(&self) -> u16 {
self.source.channels()
}
fn sample_rate(&self) -> u32 {
self.source.sample_rate()
}
fn total_duration(&self) -> Option<std::time::Duration> {
None
}
fn try_seek(&mut self, pos: Duration) -> Result<(), rodio::source::SeekError> {
self.source.try_seek(pos)
}
}