servo_media_audio/
media_stream_source_node.rs

1use crate::AudioStreamReader;
2use crate::block::Chunk;
3use crate::node::{AudioNodeEngine, BlockInfo};
4use crate::node::{AudioNodeType, ChannelInfo};
5use crate::param::{Param, ParamType};
6
7#[derive(AudioNodeCommon)]
8pub(crate) struct MediaStreamSourceNode {
9    channel_info: ChannelInfo,
10    reader: Box<dyn AudioStreamReader + Send>,
11    playing: bool,
12}
13
14impl MediaStreamSourceNode {
15    pub fn new(reader: Box<dyn AudioStreamReader + Send>, channel_info: ChannelInfo) -> Self {
16        Self {
17            channel_info,
18            reader,
19            playing: false,
20        }
21    }
22}
23
24impl AudioNodeEngine for MediaStreamSourceNode {
25    fn node_type(&self) -> AudioNodeType {
26        AudioNodeType::MediaStreamSourceNode
27    }
28
29    fn process(&mut self, mut inputs: Chunk, _: &BlockInfo) -> Chunk {
30        debug_assert!(inputs.len() == 0);
31
32        if !self.playing {
33            self.playing = true;
34            self.reader.start();
35        }
36
37        let block = self.reader.pull();
38        inputs.blocks.push(block);
39
40        inputs
41    }
42
43    fn input_count(&self) -> u32 {
44        0
45    }
46
47    fn get_param(&mut self, _: ParamType) -> &mut Param {
48        panic!("No params on MediaStreamSourceNode");
49    }
50}