rodio/source/
empty_callback.rs

1use std::time::Duration;
2
3use super::SeekError;
4use crate::common::{ChannelCount, SampleRate};
5use crate::{Sample, Source};
6
7/// An empty source that executes a callback function
8pub struct EmptyCallback {
9    callback: Box<dyn Send + Fn()>,
10}
11
12impl EmptyCallback {
13    #[inline]
14    /// Create an empty source that executes a callback function.
15    /// Example use-case:
16    ///
17    /// Detect and do something when the source before this one has ended.
18    pub fn new(callback: Box<dyn Send + Fn()>) -> EmptyCallback {
19        EmptyCallback { callback }
20    }
21}
22
23impl Iterator for EmptyCallback {
24    type Item = Sample;
25
26    #[inline]
27    fn next(&mut self) -> Option<Self::Item> {
28        (self.callback)();
29        None
30    }
31}
32
33impl Source for EmptyCallback {
34    #[inline]
35    fn current_span_len(&self) -> Option<usize> {
36        None
37    }
38
39    #[inline]
40    fn channels(&self) -> ChannelCount {
41        1
42    }
43
44    #[inline]
45    fn sample_rate(&self) -> SampleRate {
46        48000
47    }
48
49    #[inline]
50    fn total_duration(&self) -> Option<Duration> {
51        Some(Duration::new(0, 0))
52    }
53
54    #[inline]
55    fn try_seek(&mut self, _: Duration) -> Result<(), SeekError> {
56        Err(SeekError::NotSupported {
57            underlying_source: std::any::type_name::<Self>(),
58        })
59    }
60}