servo_media_audio/
media_stream_destination_node.rs

1use crate::block::Chunk;
2use crate::node::{AudioNodeEngine, BlockInfo};
3use crate::node::{AudioNodeType, ChannelInfo};
4use servo_media_streams::MediaSocket;
5use crate::sink::AudioSink;
6
7#[derive(AudioNodeCommon)]
8pub(crate) struct MediaStreamDestinationNode {
9    channel_info: ChannelInfo,
10    sink: Box<dyn AudioSink + 'static>,
11}
12
13impl MediaStreamDestinationNode {
14    pub fn new(
15        socket: Box<dyn MediaSocket>,
16        sample_rate: f32,
17        sink: Box<dyn AudioSink + 'static>,
18        channel_info: ChannelInfo,
19    ) -> Self {
20        sink.init_stream(channel_info.count, sample_rate, socket)
21            .expect("init_stream failed");
22        sink.play().expect("Sink didn't start");
23        MediaStreamDestinationNode { channel_info, sink }
24    }
25}
26
27impl AudioNodeEngine for MediaStreamDestinationNode {
28    fn node_type(&self) -> AudioNodeType {
29        AudioNodeType::MediaStreamDestinationNode
30    }
31
32    fn process(&mut self, inputs: Chunk, _: &BlockInfo) -> Chunk {
33        self.sink
34            .push_data(inputs)
35            .expect("Pushing to stream failed");
36        Chunk::default()
37    }
38
39    fn output_count(&self) -> u32 {
40        0
41    }
42}