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
18pub 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#[derive(Debug, Clone, Copy, PartialEq, Eq)]
45pub enum AudioNodeType {
46    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    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    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
135pub(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    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    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    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
228pub enum AudioScheduledSourceNodeMessage {
230    Start(f64),
232    Stop(f64),
234    RegisterOnEndedCallback(OnEndedCallback),
236}
237
238#[derive(Clone, Copy, PartialEq, Eq)]
239pub enum ShouldPlay {
240    No,
242    Between(Tick, Tick),
244}