web_audio_api/node/
mod.rs1use crate::render::{
4 AudioParamValues, AudioProcessor, AudioRenderQuantum, AudioWorkletGlobalScope,
5};
6use crate::AudioBufferIter;
7
8mod audio_node;
10pub use audio_node::*;
11mod scheduled_source;
12pub use scheduled_source::*;
13
14mod 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
58struct 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 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 let output = &mut outputs[0];
85
86 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; 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}