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#[derive(Clone)]
12pub struct SamplesConverter<I, D> {
13 inner: I,
14 dest: PhantomData<D>,
15}
16
17impl<I, D> SamplesConverter<I, D> {
18 #[inline]
21 pub fn new(input: I) -> SamplesConverter<I, D> {
22 SamplesConverter {
23 inner: input,
24 dest: PhantomData,
25 }
26 }
27
28 #[inline]
30 pub fn inner(&self) -> &I {
31 &self.inner
32 }
33
34 #[inline]
36 pub fn inner_mut(&mut self) -> &mut I {
37 &mut self.inner
38 }
39
40 #[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}