web_audio_api/node/
media_stream_source.rs1use crate::context::{AudioContextRegistration, BaseAudioContext};
2use crate::media_streams::MediaStream;
3use crate::resampling::Resampler;
4use crate::RENDER_QUANTUM_SIZE;
5
6use super::{AudioNode, ChannelConfig, MediaStreamRenderer};
7
8#[derive(Debug)]
17pub struct MediaStreamAudioSourceOptions<'a> {
18    pub media_stream: &'a MediaStream,
19}
20
21#[derive(Debug)]
28pub struct MediaStreamAudioSourceNode {
29    registration: AudioContextRegistration,
30    channel_config: ChannelConfig,
31}
32
33impl AudioNode for MediaStreamAudioSourceNode {
34    fn registration(&self) -> &AudioContextRegistration {
35        &self.registration
36    }
37
38    fn channel_config(&self) -> &ChannelConfig {
39        &self.channel_config
40    }
41
42    fn number_of_inputs(&self) -> usize {
43        0
44    }
45
46    fn number_of_outputs(&self) -> usize {
47        1
48    }
49}
50
51impl MediaStreamAudioSourceNode {
52    pub fn new<C: BaseAudioContext>(
58        context: &C,
59        options: MediaStreamAudioSourceOptions<'_>,
60    ) -> Self {
61        context.base().register(move |registration| {
62            let node = MediaStreamAudioSourceNode {
63                registration,
64                channel_config: ChannelConfig::default(),
65            };
66
67            let resampler = Resampler::new(
68                context.sample_rate(),
69                RENDER_QUANTUM_SIZE,
70                options.media_stream.get_tracks()[0].iter(),
71            );
72
73            let render = MediaStreamRenderer::new(resampler);
74
75            (node, Box::new(render))
76        })
77    }
78}