Skip to main content

script/dom/audio/
mediastreamtrackaudiosourcenode.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_and_cx;
9use servo_media::audio::node::AudioNodeInit;
10
11use crate::dom::audio::audiocontext::AudioContext;
12use crate::dom::audio::audionode::AudioNode;
13use crate::dom::bindings::codegen::Bindings::MediaStreamTrackAudioSourceNodeBinding::{
14    MediaStreamTrackAudioSourceNodeMethods, MediaStreamTrackAudioSourceOptions,
15};
16use crate::dom::bindings::error::Fallible;
17use crate::dom::bindings::inheritance::Castable;
18use crate::dom::bindings::root::{Dom, DomRoot};
19use crate::dom::mediastreamtrack::MediaStreamTrack;
20use crate::dom::window::Window;
21
22#[dom_struct]
23pub(crate) struct MediaStreamTrackAudioSourceNode {
24    node: AudioNode,
25    track: Dom<MediaStreamTrack>,
26}
27
28impl MediaStreamTrackAudioSourceNode {
29    #[cfg_attr(crown, expect(crown::unrooted_must_root))]
30    pub(crate) fn new_inherited(
31        cx: &mut JSContext,
32        context: &AudioContext,
33        track: &MediaStreamTrack,
34    ) -> Fallible<MediaStreamTrackAudioSourceNode> {
35        let node = AudioNode::new_inherited(
36            cx,
37            AudioNodeInit::MediaStreamSourceNode(track.id()),
38            context.upcast(),
39            Default::default(),
40            0, // inputs
41            1, // outputs
42        )?;
43        Ok(MediaStreamTrackAudioSourceNode {
44            node,
45            track: Dom::from_ref(track),
46        })
47    }
48
49    pub(crate) fn new(
50        cx: &mut js::context::JSContext,
51        window: &Window,
52        context: &AudioContext,
53        track: &MediaStreamTrack,
54    ) -> Fallible<DomRoot<MediaStreamTrackAudioSourceNode>> {
55        Self::new_with_proto(cx, window, None, context, track)
56    }
57
58    #[cfg_attr(crown, expect(crown::unrooted_must_root))]
59    fn new_with_proto(
60        cx: &mut JSContext,
61        window: &Window,
62        proto: Option<HandleObject>,
63        context: &AudioContext,
64        track: &MediaStreamTrack,
65    ) -> Fallible<DomRoot<MediaStreamTrackAudioSourceNode>> {
66        let node = MediaStreamTrackAudioSourceNode::new_inherited(cx, context, track)?;
67        Ok(reflect_dom_object_with_proto_and_cx(
68            Box::new(node),
69            window,
70            proto,
71            cx,
72        ))
73    }
74}
75
76impl MediaStreamTrackAudioSourceNodeMethods<crate::DomTypeHolder>
77    for MediaStreamTrackAudioSourceNode
78{
79    /// <https://webaudio.github.io/web-audio-api/#dom-mediastreamtrackaudiosourcenode-mediastreamtrackaudiosourcenode>
80    fn Constructor(
81        cx: &mut JSContext,
82        window: &Window,
83        proto: Option<HandleObject>,
84        context: &AudioContext,
85        options: &MediaStreamTrackAudioSourceOptions,
86    ) -> Fallible<DomRoot<MediaStreamTrackAudioSourceNode>> {
87        MediaStreamTrackAudioSourceNode::new_with_proto(
88            cx,
89            window,
90            proto,
91            context,
92            &options.mediaStreamTrack,
93        )
94    }
95}