Skip to main content

web_audio_api/node/
mod.rs

1//! The AudioNode interface and concrete types
2
3use crate::render::{
4    AudioParamValues, AudioProcessor, AudioRenderQuantum, AudioWorkletGlobalScope,
5};
6use crate::AudioBufferIter;
7
8// traits
9mod audio_node;
10pub use audio_node::*;
11mod scheduled_source;
12pub use scheduled_source::*;
13
14// nodes
15mod analyser;
16pub use analyser::*;
17mod audio_buffer_source;
18pub use audio_buffer_source::*;
19mod biquad_filter;
20pub use biquad_filter::*;
21mod channel_merger;
22pub use channel_merger::*;
23mod channel_splitter;
24pub use channel_splitter::*;
25mod constant_source;
26pub use constant_source::*;
27mod convolver;
28pub use convolver::*;
29mod delay;
30pub use delay::*;
31mod destination;
32pub use destination::*;
33mod dynamics_compressor;
34pub use dynamics_compressor::*;
35mod gain;
36pub use gain::*;
37mod iir_filter;
38pub use iir_filter::*;
39mod media_element_source;
40pub use media_element_source::*;
41mod media_stream_destination;
42pub use media_stream_destination::*;
43mod media_stream_source;
44pub use media_stream_source::*;
45mod media_stream_track_source;
46pub use media_stream_track_source::*;
47mod oscillator;
48pub use oscillator::*;
49mod panner;
50pub use panner::*;
51mod script_processor;
52pub use script_processor::*;
53mod stereo_panner;
54pub use stereo_panner::*;
55mod waveshaper;
56pub use waveshaper::*;
57
58// `MediaStreamRenderer` is internally used by `MediaElementAudioSourceNode` and
59// `MediaStreamAudioSourceNode`.
60struct MediaStreamRenderer<R> {
61    stream: R,
62    finished: bool,
63}
64
65impl<R> MediaStreamRenderer<R> {
66    fn new(stream: R) -> Self {
67        Self {
68            stream,
69            // scheduler,
70            finished: false,
71        }
72    }
73}
74
75impl<R: AudioBufferIter> AudioProcessor for MediaStreamRenderer<R> {
76    fn process(
77        &mut self,
78        _inputs: &[AudioRenderQuantum],
79        outputs: &mut [AudioRenderQuantum],
80        _params: AudioParamValues<'_>,
81        _scope: &AudioWorkletGlobalScope,
82    ) -> bool {
83        // single output node
84        let output = &mut outputs[0];
85
86        // @note - maybe we need to disciminate between a paused and depleted term
87        match self.stream.next() {
88            Some(Ok(buffer)) => {
89                let channels = buffer.number_of_channels();
90                output.set_number_of_channels(channels);
91                output
92                    .channels_mut()
93                    .iter_mut()
94                    .zip(buffer.channels())
95                    .for_each(|(o, i)| o.copy_from_slice(i.as_slice()));
96            }
97            Some(Err(e)) => {
98                log::warn!("Error playing audio stream: {}", e);
99                self.finished = true; // halt playback
100                output.make_silent()
101            }
102            None => {
103                if !self.finished {
104                    log::debug!("Stream finished");
105                    self.finished = true;
106                }
107                output.make_silent()
108            }
109        }
110
111        !self.finished
112    }
113}