diff --git a/audio/src/node.rs b/audio/src/node.rs index d402d861..85ba77ed 100644 --- a/audio/src/node.rs +++ b/audio/src/node.rs @@ -3,7 +3,7 @@ use buffer_source_node::{AudioBufferSourceNodeMessage, AudioBufferSourceNodeOpti use channel_node::ChannelNodeOptions; use gain_node::GainNodeOptions; use oscillator_node::OscillatorNodeOptions; -use panner_node::PannerNodeOptions; +use panner_node::{PannerNodeMessage, PannerNodeOptions}; use param::{Param, ParamRate, ParamType, UserAutomationEvent}; use std::boxed::FnBox; use std::sync::mpsc::Sender; @@ -179,6 +179,7 @@ pub(crate) trait AudioNodeEngine: Send + AudioNodeCommon { pub enum AudioNodeMessage { AudioBufferSourceNode(AudioBufferSourceNodeMessage), AudioScheduledSourceNode(AudioScheduledSourceNodeMessage), + PannerNode(PannerNodeMessage), GetParamValue(ParamType, Sender), SetChannelCount(u8), SetChannelMode(ChannelCountMode), diff --git a/audio/src/panner_node.rs b/audio/src/panner_node.rs index 56c0bd3d..c314cf25 100644 --- a/audio/src/panner_node.rs +++ b/audio/src/panner_node.rs @@ -1,6 +1,6 @@ use euclid::Vector3D; use block::{Block, Chunk, FRAMES_PER_BLOCK, Tick}; -use node::{AudioNodeEngine, BlockInfo}; +use node::{AudioNodeEngine, AudioNodeMessage, BlockInfo}; use node::{AudioNodeType, ChannelInfo, ChannelCountMode, ChannelInterpretation}; use param::{Param, ParamDir, ParamType}; use std::f32::consts::PI; @@ -46,6 +46,17 @@ pub struct PannerNodeOptions { pub cone_outer_gain: f64, } +pub enum PannerNodeMessage { + SetPanningModel(PanningModel), + SetDistanceModel(DistanceModel), + SetRefDistance(f64), + SetMaxDistance(f64), + SetRolloff(f64), + SetConeInner(f64), + SetConeOuter(f64), + SetConeGain(f64), +} + impl Default for PannerNodeOptions { fn default() -> Self { PannerNodeOptions { @@ -372,4 +383,20 @@ impl AudioNodeEngine for PannerNode { fn set_listenerdata(&mut self, data: Block) { self.listener_data = Some(data); } + + fn message_specific(&mut self, message: AudioNodeMessage, _sample_rate: f32) { + match message { + AudioNodeMessage::PannerNode(p) => match p { + PannerNodeMessage::SetPanningModel(p) => self.panning_model = p, + PannerNodeMessage::SetDistanceModel(d) => self.distance_model = d, + PannerNodeMessage::SetRefDistance(val) => self.ref_distance = val, + PannerNodeMessage::SetMaxDistance(val) => self.max_distance = val, + PannerNodeMessage::SetRolloff(val) => self.rolloff_factor = val, + PannerNodeMessage::SetConeInner(val) => self.cone_inner_angle = val, + PannerNodeMessage::SetConeOuter(val) => self.cone_outer_angle = val, + PannerNodeMessage::SetConeGain(val) => self.cone_outer_gain = val, + } + _ => () + } + } }