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}