mirror of
https://github.com/servo/servo.git
synced 2025-06-10 01:23:13 +00:00
* Add disconnect methods * Use Dom, not DomRoot DomRoot will keep it permanently rooted, it should only be used in values not on the JS heap
97 lines
3.4 KiB
Rust
97 lines
3.4 KiB
Rust
/* 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::{Dom, 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: Dom<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: Dom::from_ref(&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,
|
|
}
|
|
}
|
|
}
|