Skip to main content

script/dom/audio/
constantsourcenode.rs

1/* This Source Code Form is subject to the terms of the Mozilla Public
2 * License, v. 2.0. If a copy of the MPL was not distributed with this
3 * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4
5use dom_struct::dom_struct;
6use js::context::JSContext;
7use js::rust::HandleObject;
8use script_bindings::reflector::reflect_dom_object_with_proto;
9use servo_media::audio::audio_node::{AudioNodeInit, AudioNodeType};
10use servo_media::audio::constant_source_node::ConstantSourceNodeOptions as ServoMediaConstantSourceOptions;
11use servo_media::audio::param::ParamType;
12
13use crate::conversions::Convert;
14use crate::dom::audio::audioparam::AudioParam;
15use crate::dom::audio::audioscheduledsourcenode::AudioScheduledSourceNode;
16use crate::dom::audio::baseaudiocontext::BaseAudioContext;
17use crate::dom::bindings::codegen::Bindings::AudioParamBinding::AutomationRate;
18use crate::dom::bindings::codegen::Bindings::ConstantSourceNodeBinding::{
19    ConstantSourceNodeMethods, ConstantSourceOptions,
20};
21use crate::dom::bindings::error::Fallible;
22use crate::dom::bindings::root::{Dom, DomRoot};
23use crate::dom::window::Window;
24
25#[dom_struct]
26pub(crate) struct ConstantSourceNode {
27    source_node: AudioScheduledSourceNode,
28    offset: Dom<AudioParam>,
29}
30
31impl ConstantSourceNode {
32    #[cfg_attr(crown, expect(crown::unrooted_must_root))]
33    fn new_inherited(
34        cx: &mut JSContext,
35        window: &Window,
36        context: &BaseAudioContext,
37        options: &ConstantSourceOptions,
38    ) -> Fallible<ConstantSourceNode> {
39        let node_options = Default::default();
40        let offset = *options.offset;
41        let source_node = AudioScheduledSourceNode::new_inherited(
42            cx,
43            AudioNodeInit::ConstantSourceNode(options.convert()),
44            context,
45            node_options, /* 2, MAX, Speakers */
46            0,            /* inputs */
47            1,            /* outputs */
48        )?;
49        let node_id = source_node.node().node_id();
50        // <https://webaudio.github.io/web-audio-api/#dom-constantsourcenode-offset>
51        let offset = AudioParam::new(
52            cx,
53            window,
54            context,
55            node_id,
56            AudioNodeType::ConstantSourceNode,
57            ParamType::Offset,
58            AutomationRate::A_rate,
59            offset,
60            f32::MIN,
61            f32::MAX,
62        );
63
64        Ok(ConstantSourceNode {
65            source_node,
66            offset: Dom::from_ref(&offset),
67        })
68    }
69
70    pub(crate) fn new(
71        cx: &mut JSContext,
72        window: &Window,
73        context: &BaseAudioContext,
74        options: &ConstantSourceOptions,
75    ) -> Fallible<DomRoot<ConstantSourceNode>> {
76        Self::new_with_proto(cx, window, None, context, options)
77    }
78
79    #[cfg_attr(crown, expect(crown::unrooted_must_root))]
80    fn new_with_proto(
81        cx: &mut JSContext,
82        window: &Window,
83        proto: Option<HandleObject>,
84        context: &BaseAudioContext,
85        options: &ConstantSourceOptions,
86    ) -> Fallible<DomRoot<ConstantSourceNode>> {
87        let node = ConstantSourceNode::new_inherited(cx, window, context, options)?;
88        Ok(reflect_dom_object_with_proto(
89            cx,
90            Box::new(node),
91            window,
92            proto,
93        ))
94    }
95}
96
97impl ConstantSourceNodeMethods<crate::DomTypeHolder> for ConstantSourceNode {
98    /// <https://webaudio.github.io/web-audio-api/#dom-constantsourcenode-constantsourcenode>
99    fn Constructor(
100        cx: &mut JSContext,
101        window: &Window,
102        proto: Option<HandleObject>,
103        context: &BaseAudioContext,
104        options: &ConstantSourceOptions,
105    ) -> Fallible<DomRoot<ConstantSourceNode>> {
106        ConstantSourceNode::new_with_proto(cx, window, proto, context, options)
107    }
108
109    /// <https://webaudio.github.io/web-audio-api/#dom-constantsourcenode-offset>
110    fn Offset(&self) -> DomRoot<AudioParam> {
111        DomRoot::from_ref(&self.offset)
112    }
113}
114
115impl Convert<ServoMediaConstantSourceOptions> for ConstantSourceOptions {
116    fn convert(self) -> ServoMediaConstantSourceOptions {
117        ServoMediaConstantSourceOptions {
118            offset: *self.offset,
119        }
120    }
121}