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