diff --git a/audio/src/buffer_source_node.rs b/audio/src/buffer_source_node.rs index 486f7444..1d4915f6 100644 --- a/audio/src/buffer_source_node.rs +++ b/audio/src/buffer_source_node.rs @@ -74,9 +74,9 @@ pub(crate) struct AudioBufferSourceNode { } impl AudioBufferSourceNode { - pub fn new(options: AudioBufferSourceNodeOptions) -> Self { + pub fn new(options: AudioBufferSourceNodeOptions, channel_info: ChannelInfo) -> Self { Self { - channel_info: Default::default(), + channel_info, buffer: options.buffer, detune: Param::new(options.detune), loop_enabled: options.loop_enabled, diff --git a/audio/src/channel_node.rs b/audio/src/channel_node.rs index e77ad00e..34021f42 100644 --- a/audio/src/channel_node.rs +++ b/audio/src/channel_node.rs @@ -16,13 +16,9 @@ pub(crate) struct ChannelMergerNode { } impl ChannelMergerNode { - pub fn new(params: ChannelNodeOptions) -> Self { + pub fn new(params: ChannelNodeOptions, channel_info: ChannelInfo) -> Self { ChannelMergerNode { - channel_info: ChannelInfo { - count: 1, - mode: ChannelCountMode::Explicit, - ..Default::default() - }, + channel_info, channels: params.channels, } } @@ -72,13 +68,9 @@ pub(crate) struct ChannelSplitterNode { } impl ChannelSplitterNode { - pub fn new(params: ChannelNodeOptions) -> Self { + pub fn new(channel_info: ChannelInfo) -> Self { ChannelSplitterNode { - channel_info: ChannelInfo { - count: params.channels, - mode: ChannelCountMode::Explicit, - interpretation: ChannelInterpretation::Discrete, - }, + channel_info, } } } diff --git a/audio/src/context.rs b/audio/src/context.rs index c23257a2..33572020 100644 --- a/audio/src/context.rs +++ b/audio/src/context.rs @@ -1,7 +1,7 @@ use AudioBackend; use decoder::{AudioDecoder, AudioDecoderCallbacks, AudioDecoderOptions}; use graph::{AudioGraph, InputPort, NodeId, OutputPort, PortId}; -use node::{AudioNodeInit, AudioNodeMessage}; +use node::{AudioNodeInit, AudioNodeMessage, ChannelInfo}; use render_thread::AudioRenderThread; use render_thread::AudioRenderThreadMsg; use std::cell::Cell; @@ -160,11 +160,11 @@ impl AudioContext { rx.recv().unwrap() } - pub fn create_node(&self, node_type: AudioNodeInit) -> NodeId { + pub fn create_node(&self, node_type: AudioNodeInit, ch: ChannelInfo) -> NodeId { let (tx, rx) = mpsc::channel(); let _ = self .sender - .send(AudioRenderThreadMsg::CreateNode(node_type, tx)); + .send(AudioRenderThreadMsg::CreateNode(node_type, tx, ch)); rx.recv().unwrap() } diff --git a/audio/src/gain_node.rs b/audio/src/gain_node.rs index d33f8f6a..23eca4d6 100644 --- a/audio/src/gain_node.rs +++ b/audio/src/gain_node.rs @@ -23,9 +23,9 @@ pub(crate) struct GainNode { } impl GainNode { - pub fn new(options: GainNodeOptions) -> Self { + pub fn new(options: GainNodeOptions, channel_info: ChannelInfo) -> Self { Self { - channel_info: Default::default(), + channel_info, gain: Param::new(options.gain), } } diff --git a/audio/src/node.rs b/audio/src/node.rs index 85ba77ed..34d69eb4 100644 --- a/audio/src/node.rs +++ b/audio/src/node.rs @@ -16,7 +16,7 @@ pub enum AudioNodeInit { AudioBuffer, AudioBufferSourceNode(AudioBufferSourceNodeOptions), ChannelMergerNode(ChannelNodeOptions), - ChannelSplitterNode(ChannelNodeOptions), + ChannelSplitterNode, ConstantSourceNode, ConvolverNode, DelayNode, diff --git a/audio/src/oscillator_node.rs b/audio/src/oscillator_node.rs index 745d355a..afd08bd2 100644 --- a/audio/src/oscillator_node.rs +++ b/audio/src/oscillator_node.rs @@ -52,9 +52,9 @@ pub(crate) struct OscillatorNode { } impl OscillatorNode { - pub fn new(options: OscillatorNodeOptions) -> Self { + pub fn new(options: OscillatorNodeOptions, channel_info: ChannelInfo) -> Self { Self { - channel_info: Default::default(), + channel_info, frequency: Param::new(options.freq.into()), detune: Param::new(options.detune.into()), phase: 0., diff --git a/audio/src/panner_node.rs b/audio/src/panner_node.rs index 55334356..01e32644 100644 --- a/audio/src/panner_node.rs +++ b/audio/src/panner_node.rs @@ -1,7 +1,7 @@ use euclid::Vector3D; use block::{Block, Chunk, FRAMES_PER_BLOCK, Tick}; use node::{AudioNodeEngine, AudioNodeMessage, BlockInfo}; -use node::{AudioNodeType, ChannelInfo, ChannelCountMode, ChannelInterpretation}; +use node::{AudioNodeType, ChannelInfo}; use param::{Param, ParamDir, ParamType}; use std::f32::consts::PI; @@ -99,13 +99,9 @@ pub(crate) struct PannerNode { } impl PannerNode { - pub fn new(options: PannerNodeOptions) -> Self { + pub fn new(options: PannerNodeOptions, channel_info: ChannelInfo) -> Self { Self { - channel_info: ChannelInfo { - count: 2, - mode: ChannelCountMode::ClampedMax, - interpretation: ChannelInterpretation::Speakers, - }, + channel_info, panning_model: options.panning_model, distance_model: options.distance_model, position_x: Param::new(options.position_x), diff --git a/audio/src/render_thread.rs b/audio/src/render_thread.rs index d45e6723..573908d8 100644 --- a/audio/src/render_thread.rs +++ b/audio/src/render_thread.rs @@ -4,7 +4,7 @@ use channel_node::{ChannelMergerNode, ChannelSplitterNode}; use context::{AudioContextOptions, ProcessingState, StateChangeResult}; use gain_node::GainNode; use graph::{AudioGraph, InputPort, NodeId, OutputPort, PortId}; -use node::BlockInfo; +use node::{BlockInfo, ChannelInfo}; use node::{AudioNodeEngine, AudioNodeInit, AudioNodeMessage}; use offline_sink::OfflineAudioSink; use oscillator_node::OscillatorNode; @@ -14,7 +14,7 @@ use std::sync::mpsc::{Receiver, Sender}; use AudioBackend; pub enum AudioRenderThreadMsg { - CreateNode(AudioNodeInit, Sender), + CreateNode(AudioNodeInit, Sender, ChannelInfo), ConnectPorts(PortId, PortId), MessageNode(NodeId, AudioNodeMessage), Resume(Sender), @@ -126,21 +126,21 @@ impl AudioRenderThread { make_render_thread_state_change!(suspend, Suspended, stop); - fn create_node(&mut self, node_type: AudioNodeInit) -> NodeId { + fn create_node(&mut self, node_type: AudioNodeInit, ch: ChannelInfo) -> NodeId { let mut needs_listener = false; let node: Box = match node_type { AudioNodeInit::AudioBufferSourceNode(options) => { - Box::new(AudioBufferSourceNode::new(options)) + Box::new(AudioBufferSourceNode::new(options, ch)) } - AudioNodeInit::GainNode(options) => Box::new(GainNode::new(options)), + AudioNodeInit::GainNode(options) => Box::new(GainNode::new(options, ch)), AudioNodeInit::PannerNode(options) => { needs_listener = true; - Box::new(PannerNode::new(options)) + Box::new(PannerNode::new(options, ch)) }, - AudioNodeInit::OscillatorNode(options) => Box::new(OscillatorNode::new(options)), - AudioNodeInit::ChannelMergerNode(options) => Box::new(ChannelMergerNode::new(options)), - AudioNodeInit::ChannelSplitterNode(options) => { - Box::new(ChannelSplitterNode::new(options)) + AudioNodeInit::OscillatorNode(options) => Box::new(OscillatorNode::new(options, ch)), + AudioNodeInit::ChannelMergerNode(options) => Box::new(ChannelMergerNode::new(options, ch)), + AudioNodeInit::ChannelSplitterNode => { + Box::new(ChannelSplitterNode::new(ch)) } _ => unimplemented!(), }; @@ -170,8 +170,8 @@ impl AudioRenderThread { let handle_msg = move |context: &mut Self, msg: AudioRenderThreadMsg| -> bool { let mut break_loop = false; match msg { - AudioRenderThreadMsg::CreateNode(node_type, tx) => { - let _ = tx.send(context.create_node(node_type)); + AudioRenderThreadMsg::CreateNode(node_type, tx, ch) => { + let _ = tx.send(context.create_node(node_type, ch)); } AudioRenderThreadMsg::ConnectPorts(output, input) => { context.connect_ports(output, input); diff --git a/examples/android/lib/src/lib.rs b/examples/android/lib/src/lib.rs index cbfac2b6..4eee2111 100644 --- a/examples/android/lib/src/lib.rs +++ b/examples/android/lib/src/lib.rs @@ -13,10 +13,10 @@ struct AudioStream { impl AudioStream { pub fn new() -> Self { let context = ServoMedia::get().unwrap().create_audio_context(Default::default()); - let osc = context.create_node(AudioNodeInit::OscillatorNode(Default::default())); + let osc = context.create_node(AudioNodeInit::OscillatorNode(Default::default()), Default::default()); let mut options = GainNodeOptions::default(); options.gain = 0.5; - let gain = context.create_node(AudioNodeInit::GainNode(options)); + let gain = context.create_node(AudioNodeInit::GainNode(options), Default::default()); let dest = context.dest_node(); context.connect_ports(osc.output(0), gain.input(0)); context.connect_ports(gain.output(0), dest.input(0)); diff --git a/examples/audio_decoder.rs b/examples/audio_decoder.rs index d1214376..825b11db 100644 --- a/examples/audio_decoder.rs +++ b/examples/audio_decoder.rs @@ -50,7 +50,7 @@ fn run_example(servo_media: Arc) { receiver.recv().unwrap(); println!("Audio decoded"); let buffer_source = - context.create_node(AudioNodeInit::AudioBufferSourceNode(Default::default())); + context.create_node(AudioNodeInit::AudioBufferSourceNode(Default::default()), Default::default()); let dest = context.dest_node(); context.connect_ports(buffer_source.output(0), dest.input(0)); context.message_node( diff --git a/examples/channels.rs b/examples/channels.rs index b74560fa..5150b445 100644 --- a/examples/channels.rs +++ b/examples/channels.rs @@ -10,14 +10,14 @@ use std::{thread, time}; fn run_example(servo_media: Arc) { let context = servo_media.create_audio_context(Default::default()); let mut options = Default::default(); - let osc = context.create_node(AudioNodeInit::OscillatorNode(options)); + let osc = context.create_node(AudioNodeInit::OscillatorNode(options), Default::default()); options.freq = 213.; - let osc2 = context.create_node(AudioNodeInit::OscillatorNode(options)); + let osc2 = context.create_node(AudioNodeInit::OscillatorNode(options), Default::default()); let mut options = GainNodeOptions::default(); options.gain = 0.7; - let gain = context.create_node(AudioNodeInit::GainNode(options)); + let gain = context.create_node(AudioNodeInit::GainNode(options), Default::default()); let options = ChannelNodeOptions { channels: 2 }; - let merger = context.create_node(AudioNodeInit::ChannelMergerNode(options)); + let merger = context.create_node(AudioNodeInit::ChannelMergerNode(options), Default::default()); let dest = context.dest_node(); context.connect_ports(osc.output(0), gain.input(0)); diff --git a/examples/channelsum.rs b/examples/channelsum.rs index 48e0e523..b4b92f9f 100644 --- a/examples/channelsum.rs +++ b/examples/channelsum.rs @@ -10,17 +10,17 @@ use std::{thread, time}; fn run_example(servo_media: Arc) { let context = servo_media.create_audio_context(Default::default()); let mut options = Default::default(); - let osc = context.create_node(AudioNodeInit::OscillatorNode(options)); + let osc = context.create_node(AudioNodeInit::OscillatorNode(options), Default::default()); options.freq = 213.; - let osc2 = context.create_node(AudioNodeInit::OscillatorNode(options)); + let osc2 = context.create_node(AudioNodeInit::OscillatorNode(options), Default::default()); options.freq = 100.; - let osc3 = context.create_node(AudioNodeInit::OscillatorNode(options)); + let osc3 = context.create_node(AudioNodeInit::OscillatorNode(options), Default::default()); let mut options = GainNodeOptions::default(); options.gain = 0.7; - let gain = context.create_node(AudioNodeInit::GainNode(options)); + let gain = context.create_node(AudioNodeInit::GainNode(options), Default::default()); let options = ChannelNodeOptions { channels: 2 }; - let merger = context.create_node(AudioNodeInit::ChannelMergerNode(options)); + let merger = context.create_node(AudioNodeInit::ChannelMergerNode(options), Default::default()); let dest = context.dest_node(); context.connect_ports(osc.output(0), merger.input(0)); diff --git a/examples/offline_context.rs b/examples/offline_context.rs index 9a0f6204..33641cb7 100644 --- a/examples/offline_context.rs +++ b/examples/offline_context.rs @@ -25,7 +25,7 @@ fn run_example(servo_media: Arc) { processed_audio.lock().unwrap().extend_from_slice((*buffer).as_ref()); sender.lock().unwrap().send(()).unwrap(); })); - let osc = context.create_node(AudioNodeInit::OscillatorNode(Default::default())); + let osc = context.create_node(AudioNodeInit::OscillatorNode(Default::default()), Default::default()); let dest = context.dest_node(); context.connect_ports(osc.output(0), dest.input(0)); context.message_node( @@ -40,7 +40,7 @@ fn run_example(servo_media: Arc) { // Create audio context to play the processed audio. let context = servo_media.create_audio_context(Default::default()); let buffer_source = - context.create_node(AudioNodeInit::AudioBufferSourceNode(Default::default())); + context.create_node(AudioNodeInit::AudioBufferSourceNode(Default::default()), Default::default()); let dest = context.dest_node(); context.connect_ports(buffer_source.output(0), dest.input(0)); context.message_node( diff --git a/examples/panner.rs b/examples/panner.rs index c7645b89..1dc217ff 100644 --- a/examples/panner.rs +++ b/examples/panner.rs @@ -11,7 +11,7 @@ fn run_example(servo_media: Arc) { let context = servo_media.create_audio_context(Default::default()); let dest = context.dest_node(); let listener = context.listener(); - let osc = context.create_node(AudioNodeInit::OscillatorNode(Default::default())); + let osc = context.create_node(AudioNodeInit::OscillatorNode(Default::default()), Default::default()); let mut options = PannerNodeOptions::default(); options.cone_outer_angle = 0.; options.position_x = 100.; @@ -19,7 +19,7 @@ fn run_example(servo_media: Arc) { options.position_z = 100.; options.ref_distance = 100.; options.rolloff_factor = 0.01; - let panner = context.create_node(AudioNodeInit::PannerNode(options)); + let panner = context.create_node(AudioNodeInit::PannerNode(options), Default::default()); context.connect_ports(osc.output(0), panner.input(0)); context.connect_ports(panner.output(0), dest.input(0)); let _ = context.resume(); diff --git a/examples/params.rs b/examples/params.rs index 879deb17..3d2f1943 100644 --- a/examples/params.rs +++ b/examples/params.rs @@ -10,10 +10,10 @@ use std::{thread, time}; fn run_example(servo_media: Arc) { let context = servo_media.create_audio_context(Default::default()); let dest = context.dest_node(); - let osc = context.create_node(AudioNodeInit::OscillatorNode(Default::default())); + let osc = context.create_node(AudioNodeInit::OscillatorNode(Default::default()), Default::default()); let mut options = GainNodeOptions::default(); options.gain = 0.5; - let gain = context.create_node(AudioNodeInit::GainNode(options)); + let gain = context.create_node(AudioNodeInit::GainNode(options), Default::default()); context.connect_ports(osc.output(0), gain.input(0)); context.connect_ports(gain.output(0), dest.input(0)); let _ = context.resume(); diff --git a/examples/params_connect.rs b/examples/params_connect.rs index b99a1568..9cdd015b 100644 --- a/examples/params_connect.rs +++ b/examples/params_connect.rs @@ -13,9 +13,9 @@ fn run_example(servo_media: Arc) { let context = servo_media.create_audio_context(Default::default()); let mut options = OscillatorNodeOptions::default(); options.freq = 2.0; - let lfo = context.create_node(AudioNodeInit::OscillatorNode(options)); - let osc = context.create_node(AudioNodeInit::OscillatorNode(Default::default())); - let gain = context.create_node(AudioNodeInit::GainNode(Default::default())); + let lfo = context.create_node(AudioNodeInit::OscillatorNode(options), Default::default()); + let osc = context.create_node(AudioNodeInit::OscillatorNode(Default::default()), Default::default()); + let gain = context.create_node(AudioNodeInit::GainNode(Default::default()), Default::default()); let dest = context.dest_node(); context.connect_ports(lfo.output(0), gain.param(ParamType::Gain)); context.connect_ports(gain.output(0), dest.input(0)); diff --git a/examples/params_connect2.rs b/examples/params_connect2.rs index 411a55b8..e1c54364 100644 --- a/examples/params_connect2.rs +++ b/examples/params_connect2.rs @@ -14,11 +14,11 @@ fn run_example(servo_media: Arc) { let context = servo_media.create_audio_context(Default::default()); let mut options = OscillatorNodeOptions::default(); options.freq = 2.0; - let lfo = context.create_node(AudioNodeInit::OscillatorNode(options)); - let osc = context.create_node(AudioNodeInit::OscillatorNode(Default::default())); + let lfo = context.create_node(AudioNodeInit::OscillatorNode(options), Default::default()); + let osc = context.create_node(AudioNodeInit::OscillatorNode(Default::default()), Default::default()); let mut options = GainNodeOptions::default(); options.gain = 100.; - let gain = context.create_node(AudioNodeInit::GainNode(options)); + let gain = context.create_node(AudioNodeInit::GainNode(options), Default::default()); let dest = context.dest_node(); context.connect_ports(lfo.output(0), gain.input(0)); context.connect_ports(gain.output(0), osc.param(ParamType::Frequency)); diff --git a/examples/params_settarget.rs b/examples/params_settarget.rs index a8ea8e11..462631ac 100644 --- a/examples/params_settarget.rs +++ b/examples/params_settarget.rs @@ -9,7 +9,7 @@ use std::{thread, time}; fn run_example(servo_media: Arc) { let context = servo_media.create_audio_context(Default::default()); let dest = context.dest_node(); - let osc = context.create_node(AudioNodeInit::OscillatorNode(Default::default())); + let osc = context.create_node(AudioNodeInit::OscillatorNode(Default::default()), Default::default()); context.connect_ports(osc.output(0), dest.input(0)); let _ = context.resume(); context.message_node( diff --git a/examples/play.rs b/examples/play.rs index 70504c29..c9a05ae7 100644 --- a/examples/play.rs +++ b/examples/play.rs @@ -11,10 +11,10 @@ use std::{thread, time}; fn run_example(servo_media: Arc) { let context = servo_media.create_audio_context(Default::default()); - let osc = context.create_node(AudioNodeInit::OscillatorNode(Default::default())); + let osc = context.create_node(AudioNodeInit::OscillatorNode(Default::default()), Default::default()); let mut options = GainNodeOptions::default(); options.gain = 0.5; - let gain = context.create_node(AudioNodeInit::GainNode(options)); + let gain = context.create_node(AudioNodeInit::GainNode(options), Default::default()); let dest = context.dest_node(); context.connect_ports(osc.output(0), gain.input(0)); context.connect_ports(gain.output(0), dest.input(0)); diff --git a/examples/play_noise.rs b/examples/play_noise.rs index 2c34f26f..34045553 100644 --- a/examples/play_noise.rs +++ b/examples/play_noise.rs @@ -11,7 +11,7 @@ use std::{thread, time}; fn run_example(servo_media: Arc) { let context = servo_media.create_audio_context(Default::default()); let buffer_source = - context.create_node(AudioNodeInit::AudioBufferSourceNode(Default::default())); + context.create_node(AudioNodeInit::AudioBufferSourceNode(Default::default()), Default::default()); let dest = context.dest_node(); context.connect_ports(buffer_source.output(0), dest.input(0)); let mut buffers = vec![Vec::with_capacity(4096), Vec::with_capacity(4096)];