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