This commit is contained in:
Fernando Jiménez Moreno 2018-06-29 14:41:58 +02:00
parent 986c2f7842
commit 02c39eb9ef
3 changed files with 115 additions and 0 deletions

View file

@ -0,0 +1,97 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v.2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
use dom::audionode::AudioNode;
use dom::audioparam::{AudioParam, AudioParamImpl};
use dom::baseaudiocontext::BaseAudioContext;
use dom::bindings::codegen::Bindings::AudioParamBinding::AutomationRate;
use dom::bindings::codegen::Bindings::AudioNodeBinding::AudioNodeOptions;
use dom::bindings::codegen::Bindings::AudioNodeBinding::{ChannelCountMode, ChannelInterpretation};
use dom::bindings::codegen::Bindings::GainNodeBinding::{self, GainNodeMethods, GainOptions};
use dom::bindings::error::Fallible;
use dom::bindings::reflector::reflect_dom_object;
use dom::bindings::root::DomRoot;
use dom::window::Window;
use dom_struct::dom_struct;
use servo_media::audio::context::AudioContext;
use servo_media::audio::gain_node::{GainNodeMessage, GainNodeOptions};
use servo_media::audio::graph::NodeId;
use servo_media::audio::node::{AudioNodeMessage, AudioNodeType};
use servo_media::audio::param::{UserAutomationEvent, RampKind};
use std::f32;
use std::rc::Rc;
audio_param_impl!(Gain, GainNode, GainNodeMessage, SetGain);
#[dom_struct]
pub struct GainNode {
node: AudioNode,
gain: DomRoot<AudioParam>,
}
impl GainNode {
#[allow(unsafe_code)]
#[allow(unrooted_must_root)]
pub fn new_inherited(
window: &Window,
context: &BaseAudioContext,
gain_options: &GainOptions,
) -> GainNode {
let mut node_options = unsafe { AudioNodeOptions::empty(window.get_cx()) };
node_options.channelCount = Some(2);
node_options.channelCountMode = Some(ChannelCountMode::Max);
node_options.channelInterpretation = Some(ChannelInterpretation::Speakers);
let node = AudioNode::new_inherited(
AudioNodeType::GainNode(gain_options.into()),
None,
context,
&node_options,
1, // inputs
1, // outputs
);
let gain = Gain::new(context.audio_context_impl(), node.node_id());
let gain = AudioParam::new(window,
Box::new(gain),
AutomationRate::A_rate,
1., // default value
f32::MIN, // min value
f32::MAX, // max value
);
GainNode {
node,
gain
}
}
#[allow(unrooted_must_root)]
pub fn new(window: &Window,
context: &BaseAudioContext,
options: &GainOptions
) -> DomRoot<GainNode> {
let node = GainNode::new_inherited(window, context, options);
reflect_dom_object(Box::new(node), window, GainNodeBinding::Wrap)
}
pub fn Constructor(
window: &Window,
context: &BaseAudioContext,
options: &GainOptions,
) -> Fallible<DomRoot<GainNode>> {
Ok(GainNode::new(window, context, options))
}
}
impl GainNodeMethods for GainNode {
fn Gain(&self) -> DomRoot<AudioParam> {
DomRoot::from_ref(&self.gain)
}
}
impl<'a> From<&'a GainOptions> for GainNodeOptions {
fn from(options: &'a GainOptions) -> Self {
Self {
gain: *options.gain,
}
}
}

View file

@ -296,6 +296,7 @@ pub mod filereader;
pub mod filereadersync;
pub mod focusevent;
pub mod formdata;
pub mod gainnode;
pub mod gamepad;
pub mod gamepadbutton;
pub mod gamepadbuttonlist;

View file

@ -0,0 +1,17 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
/*
* The origin of this IDL file is
* https://webaudio.github.io/web-audio-api/#gainnode
*/
dictionary GainOptions : AudioNodeOptions {
float gain = 1.0;
};
[Exposed=Window,
Constructor (BaseAudioContext context, optional GainOptions options)]
interface GainNode : AudioNode {
readonly attribute AudioParam gain;
};