rodio/source/
samples_converter.rs

1use std::marker::PhantomData;
2use std::time::Duration;
3
4use crate::{Sample, Source};
5use cpal::{FromSample, Sample as CpalSample};
6
7use super::SeekError;
8
9/// Wrap the input and lazily converts the samples it provides to the type
10/// specified by the generic parameter D
11#[derive(Clone)]
12pub struct SamplesConverter<I, D> {
13    inner: I,
14    dest: PhantomData<D>,
15}
16
17impl<I, D> SamplesConverter<I, D> {
18    /// Wrap the input and lazily converts the samples it provides to the type
19    /// specified by the generic parameter D
20    #[inline]
21    pub fn new(input: I) -> SamplesConverter<I, D> {
22        SamplesConverter {
23            inner: input,
24            dest: PhantomData,
25        }
26    }
27
28    /// Returns a reference to the inner source.
29    #[inline]
30    pub fn inner(&self) -> &I {
31        &self.inner
32    }
33
34    /// Returns a mutable reference to the inner source.
35    #[inline]
36    pub fn inner_mut(&mut self) -> &mut I {
37        &mut self.inner
38    }
39
40    /// Returns the inner source.
41    #[inline]
42    pub fn into_inner(self) -> I {
43        self.inner
44    }
45}
46
47impl<I, D> Iterator for SamplesConverter<I, D>
48where
49    I: Source,
50    I::Item: Sample,
51    D: FromSample<I::Item> + Sample,
52{
53    type Item = D;
54
55    #[inline]
56    fn next(&mut self) -> Option<D> {
57        self.inner.next().map(|s| CpalSample::from_sample(s))
58    }
59
60    #[inline]
61    fn size_hint(&self) -> (usize, Option<usize>) {
62        self.inner.size_hint()
63    }
64}
65
66impl<I, D> ExactSizeIterator for SamplesConverter<I, D>
67where
68    I: Source + ExactSizeIterator,
69    I::Item: Sample,
70    D: FromSample<I::Item> + Sample,
71{
72}
73
74impl<I, D> Source for SamplesConverter<I, D>
75where
76    I: Source,
77    I::Item: Sample,
78    D: FromSample<I::Item> + Sample,
79{
80    #[inline]
81    fn current_frame_len(&self) -> Option<usize> {
82        self.inner.current_frame_len()
83    }
84
85    #[inline]
86    fn channels(&self) -> u16 {
87        self.inner.channels()
88    }
89
90    #[inline]
91    fn sample_rate(&self) -> u32 {
92        self.inner.sample_rate()
93    }
94
95    #[inline]
96    fn total_duration(&self) -> Option<Duration> {
97        self.inner.total_duration()
98    }
99
100    #[inline]
101    fn try_seek(&mut self, pos: Duration) -> Result<(), SeekError> {
102        self.inner.try_seek(pos)
103    }
104}