servo_media_audio/
node.rs

1use crate::biquad_filter_node::{BiquadFilterNodeMessage, BiquadFilterNodeOptions};
2use crate::block::{Block, Chunk, Tick};
3use crate::buffer_source_node::{AudioBufferSourceNodeMessage, AudioBufferSourceNodeOptions};
4use crate::channel_node::ChannelNodeOptions;
5use crate::constant_source_node::ConstantSourceNodeOptions;
6use crate::gain_node::GainNodeOptions;
7use crate::iir_filter_node::IIRFilterNodeOptions;
8use crate::media_element_source_node::MediaElementSourceNodeMessage;
9use crate::oscillator_node::{OscillatorNodeMessage, OscillatorNodeOptions};
10use crate::panner_node::{PannerNodeMessage, PannerNodeOptions};
11use crate::param::{Param, ParamRate, ParamType, UserAutomationEvent};
12use servo_media_streams::{MediaSocket, MediaStreamId};
13use std::cmp::min;
14use std::sync::mpsc::Sender;
15use crate::stereo_panner::StereoPannerOptions;
16use crate::wave_shaper_node::{WaveShaperNodeMessage, WaveShaperNodeOptions};
17
18/// Information required to construct an audio node
19pub enum AudioNodeInit {
20    AnalyserNode(Box<dyn FnMut(Block) + Send>),
21    BiquadFilterNode(BiquadFilterNodeOptions),
22    AudioBuffer,
23    AudioBufferSourceNode(AudioBufferSourceNodeOptions),
24    ChannelMergerNode(ChannelNodeOptions),
25    ChannelSplitterNode,
26    ConstantSourceNode(ConstantSourceNodeOptions),
27    ConvolverNode,
28    DelayNode,
29    DynamicsCompressionNode,
30    GainNode(GainNodeOptions),
31    IIRFilterNode(IIRFilterNodeOptions),
32    MediaElementSourceNode,
33    MediaStreamDestinationNode(Box<dyn MediaSocket>),
34    MediaStreamSourceNode(MediaStreamId),
35    OscillatorNode(OscillatorNodeOptions),
36    PannerNode(PannerNodeOptions),
37    PeriodicWave,
38    ScriptProcessorNode,
39    StereoPannerNode(StereoPannerOptions),
40    WaveShaperNode(WaveShaperNodeOptions),
41}
42
43/// Type of AudioNodeEngine.
44#[derive(Debug, Clone, Copy, PartialEq, Eq)]
45pub enum AudioNodeType {
46    /// Not a constructable node
47    AudioListenerNode,
48    AnalyserNode,
49    BiquadFilterNode,
50    AudioBuffer,
51    AudioBufferSourceNode,
52    ChannelMergerNode,
53    ChannelSplitterNode,
54    ConstantSourceNode,
55    ConvolverNode,
56    DelayNode,
57    DestinationNode,
58    DynamicsCompressionNode,
59    GainNode,
60    IIRFilterNode,
61    MediaElementSourceNode,
62    MediaStreamDestinationNode,
63    MediaStreamSourceNode,
64    OscillatorNode,
65    PannerNode,
66    PeriodicWave,
67    ScriptProcessorNode,
68    StereoPannerNode,
69    WaveShaperNode,
70}
71
72#[derive(Copy, Clone, PartialEq, Eq, Debug)]
73pub enum ChannelCountMode {
74    Max,
75    ClampedMax,
76    Explicit,
77}
78
79#[derive(Copy, Clone, PartialEq, Eq, Debug)]
80pub enum ChannelInterpretation {
81    Discrete,
82    Speakers,
83}
84
85#[derive(Copy, Clone)]
86pub struct BlockInfo {
87    pub sample_rate: f32,
88    pub frame: Tick,
89    pub time: f64,
90}
91
92impl BlockInfo {
93    /// Given the current block, calculate the absolute zero-relative
94    /// tick of the given tick
95    pub fn absolute_tick(&self, tick: Tick) -> Tick {
96        self.frame + tick
97    }
98}
99
100pub struct ChannelInfo {
101    pub count: u8,
102    pub mode: ChannelCountMode,
103    pub interpretation: ChannelInterpretation,
104    pub context_channel_count: u8,
105}
106
107impl Default for ChannelInfo {
108    fn default() -> Self {
109        ChannelInfo {
110            count: 2,
111            mode: ChannelCountMode::Max,
112            interpretation: ChannelInterpretation::Speakers,
113            context_channel_count: 2,
114        }
115    }
116}
117
118impl ChannelInfo {
119    /// <https://webaudio.github.io/web-audio-api/#computednumberofchannels>
120    pub fn computed_number_of_channels(&self) -> u8 {
121        match self.mode {
122            ChannelCountMode::Max => self.context_channel_count,
123            ChannelCountMode::ClampedMax => min(self.count, self.context_channel_count),
124            ChannelCountMode::Explicit => self.count,
125        }
126    }
127}
128
129pub(crate) trait AudioNodeCommon {
130    fn channel_info(&self) -> &ChannelInfo;
131
132    fn channel_info_mut(&mut self) -> &mut ChannelInfo;
133}
134
135/// This trait represents the common features of all audio nodes.
136pub(crate) trait AudioNodeEngine: Send + AudioNodeCommon {
137    fn node_type(&self) -> AudioNodeType;
138
139    fn process(&mut self, inputs: Chunk, info: &BlockInfo) -> Chunk;
140
141    fn message(&mut self, msg: AudioNodeMessage, sample_rate: f32) {
142        match msg {
143            AudioNodeMessage::GetParamValue(id, tx) => {
144                let _ = tx.send(self.get_param(id).value());
145            }
146            AudioNodeMessage::SetChannelCount(c) => self.set_channel_count(c),
147            AudioNodeMessage::SetChannelMode(c) => self.set_channel_count_mode(c),
148            AudioNodeMessage::SetChannelInterpretation(c) => self.set_channel_interpretation(c),
149            AudioNodeMessage::SetParam(id, event) => {
150                self.get_param(id).insert_event(event.to_event(sample_rate))
151            }
152            AudioNodeMessage::SetParamRate(id, rate) => self.get_param(id).set_rate(rate),
153            _ => self.message_specific(msg, sample_rate),
154        }
155    }
156
157    /// Messages specific to this node
158    fn message_specific(&mut self, _: AudioNodeMessage, _sample_rate: f32) {}
159
160    fn input_count(&self) -> u32 {
161        1
162    }
163    fn output_count(&self) -> u32 {
164        1
165    }
166
167    /// Number of input channels for each input port
168    fn channel_count(&self) -> u8 {
169        self.channel_info().count
170    }
171
172    fn channel_count_mode(&self) -> ChannelCountMode {
173        self.channel_info().mode
174    }
175
176    fn channel_interpretation(&self) -> ChannelInterpretation {
177        self.channel_info().interpretation
178    }
179
180    fn set_channel_interpretation(&mut self, i: ChannelInterpretation) {
181        self.channel_info_mut().interpretation = i
182    }
183    fn set_channel_count(&mut self, c: u8) {
184        self.channel_info_mut().count = c;
185    }
186    fn set_channel_count_mode(&mut self, m: ChannelCountMode) {
187        self.channel_info_mut().mode = m;
188    }
189
190    /// If we're the destination node, extract the contained data
191    fn destination_data(&mut self) -> Option<Chunk> {
192        None
193    }
194
195    fn get_param(&mut self, _: ParamType) -> &mut Param {
196        panic!("No params on node {:?}", self.node_type())
197    }
198
199    fn set_listenerdata(&mut self, _: Block) {
200        panic!("can't accept listener connections")
201    }
202}
203
204pub enum AudioNodeMessage {
205    AudioBufferSourceNode(AudioBufferSourceNodeMessage),
206    AudioScheduledSourceNode(AudioScheduledSourceNodeMessage),
207    BiquadFilterNode(BiquadFilterNodeMessage),
208    GetParamValue(ParamType, Sender<f32>),
209    MediaElementSourceNode(MediaElementSourceNodeMessage),
210    OscillatorNode(OscillatorNodeMessage),
211    PannerNode(PannerNodeMessage),
212    SetChannelCount(u8),
213    SetChannelMode(ChannelCountMode),
214    SetChannelInterpretation(ChannelInterpretation),
215    SetParam(ParamType, UserAutomationEvent),
216    SetParamRate(ParamType, ParamRate),
217    WaveShaperNode(WaveShaperNodeMessage),
218}
219
220pub struct OnEndedCallback(pub Box<dyn FnOnce() + Send + 'static>);
221
222impl OnEndedCallback {
223    pub fn new<F: FnOnce() + Send + 'static>(callback: F) -> Self {
224        OnEndedCallback(Box::new(callback))
225    }
226}
227
228/// Type of message directed to AudioScheduledSourceNodes.
229pub enum AudioScheduledSourceNodeMessage {
230    /// Schedules a sound to playback at an exact time.
231    Start(f64),
232    /// Schedules a sound to stop playback at an exact time.
233    Stop(f64),
234    /// Register onended event callback.
235    RegisterOnEndedCallback(OnEndedCallback),
236}
237
238#[derive(Clone, Copy, PartialEq, Eq)]
239pub enum ShouldPlay {
240    /// Don't play anything
241    No,
242    /// Play, given start and end tick offsets
243    Between(Tick, Tick),
244}