Skip to main content

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