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