script/dom/audio/
mediastreamaudiosourcenode.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;
8use servo_media::streams::MediaStreamType;
9
10use crate::dom::audio::audiocontext::AudioContext;
11use crate::dom::audio::audionode::AudioNode;
12use crate::dom::bindings::codegen::Bindings::MediaStreamAudioSourceNodeBinding::{
13    MediaStreamAudioSourceNodeMethods, MediaStreamAudioSourceOptions,
14};
15use crate::dom::bindings::error::{Error, Fallible};
16use crate::dom::bindings::inheritance::Castable;
17use crate::dom::bindings::reflector::reflect_dom_object_with_proto;
18use crate::dom::bindings::root::{Dom, DomRoot};
19use crate::dom::mediastream::MediaStream;
20use crate::dom::window::Window;
21use crate::script_runtime::CanGc;
22
23#[dom_struct]
24pub(crate) struct MediaStreamAudioSourceNode {
25    node: AudioNode,
26    stream: Dom<MediaStream>,
27}
28
29impl MediaStreamAudioSourceNode {
30    #[cfg_attr(crown, allow(crown::unrooted_must_root))]
31    pub(crate) fn new_inherited(
32        context: &AudioContext,
33        stream: &MediaStream,
34    ) -> Fallible<MediaStreamAudioSourceNode> {
35        let track = stream
36            .get_tracks()
37            .iter()
38            .find(|t| t.ty() == MediaStreamType::Audio)
39            .ok_or(Error::InvalidState)?
40            .id();
41        let node = AudioNode::new_inherited(
42            AudioNodeInit::MediaStreamSourceNode(track),
43            context.upcast(),
44            Default::default(),
45            0, // inputs
46            1, // outputs
47        )?;
48        Ok(MediaStreamAudioSourceNode {
49            node,
50            stream: Dom::from_ref(stream),
51        })
52    }
53
54    pub(crate) fn new(
55        window: &Window,
56        context: &AudioContext,
57        stream: &MediaStream,
58        can_gc: CanGc,
59    ) -> Fallible<DomRoot<MediaStreamAudioSourceNode>> {
60        Self::new_with_proto(window, None, context, stream, can_gc)
61    }
62
63    #[cfg_attr(crown, allow(crown::unrooted_must_root))]
64    fn new_with_proto(
65        window: &Window,
66        proto: Option<HandleObject>,
67        context: &AudioContext,
68        stream: &MediaStream,
69        can_gc: CanGc,
70    ) -> Fallible<DomRoot<MediaStreamAudioSourceNode>> {
71        let node = MediaStreamAudioSourceNode::new_inherited(context, stream)?;
72        Ok(reflect_dom_object_with_proto(
73            Box::new(node),
74            window,
75            proto,
76            can_gc,
77        ))
78    }
79}
80
81impl MediaStreamAudioSourceNodeMethods<crate::DomTypeHolder> for MediaStreamAudioSourceNode {
82    /// <https://webaudio.github.io/web-audio-api/#dom-mediastreamaudiosourcenode-mediastreamaudiosourcenode>
83    fn Constructor(
84        window: &Window,
85        proto: Option<HandleObject>,
86        can_gc: CanGc,
87        context: &AudioContext,
88        options: &MediaStreamAudioSourceOptions,
89    ) -> Fallible<DomRoot<MediaStreamAudioSourceNode>> {
90        MediaStreamAudioSourceNode::new_with_proto(
91            window,
92            proto,
93            context,
94            &options.mediaStream,
95            can_gc,
96        )
97    }
98
99    /// <https://webaudio.github.io/web-audio-api/#dom-MediaStreamAudioSourceNode-stream>
100    fn MediaStream(&self) -> DomRoot<MediaStream> {
101        DomRoot::from_ref(&self.stream)
102    }
103}