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;
9use servo_media::audio::audio_node::AudioNodeInit;
10use servo_media::audio::graph::NodeId;
11use servo_media::streams::MediaStreamType;
12
13use crate::dom::audio::audiocontext::AudioContext;
14use crate::dom::audio::audionode::AudioNode;
15use crate::dom::audio::baseaudiocontext::BaseAudioContext;
16use crate::dom::audionode::UnwrappedAudioNodeOptions;
17use crate::dom::bindings::codegen::Bindings::MediaStreamAudioSourceNodeBinding::{
18    MediaStreamAudioSourceNodeMethods, MediaStreamAudioSourceOptions,
19};
20use crate::dom::bindings::error::{Error, Fallible};
21use crate::dom::bindings::inheritance::Castable;
22use crate::dom::bindings::root::{Dom, DomRoot};
23use crate::dom::mediastream::MediaStream;
24use crate::dom::window::Window;
25
26#[dom_struct]
27pub(crate) struct MediaStreamAudioSourceNode {
28    node: AudioNode,
29    stream: Dom<MediaStream>,
30}
31
32impl MediaStreamAudioSourceNode {
33    fn new_inherited(
34        node_id: Option<NodeId>,
35        context: &BaseAudioContext,
36        node_options: UnwrappedAudioNodeOptions,
37        stream: &MediaStream,
38    ) -> Self {
39        MediaStreamAudioSourceNode {
40            node: AudioNode::new_inherited(
41                node_id,
42                context,
43                node_options,
44                0, // inputs
45                1, // outputs
46            ),
47            stream: Dom::from_ref(stream),
48        }
49    }
50}
51
52impl MediaStreamAudioSourceNodeMethods<crate::DomTypeHolder> for MediaStreamAudioSourceNode {
53    /// <https://webaudio.github.io/web-audio-api/#dom-mediastreamaudiosourcenode-mediastreamaudiosourcenode>
54    fn Constructor(
55        cx: &mut JSContext,
56        window: &Window,
57        proto: Option<HandleObject>,
58        context: &AudioContext,
59        options: &MediaStreamAudioSourceOptions,
60    ) -> Fallible<DomRoot<MediaStreamAudioSourceNode>> {
61        let node_options: UnwrappedAudioNodeOptions = Default::default();
62        if AudioNode::channel_count_check(node_options.count) {
63            return Err(Error::NotSupported(Some(String::from(
64                "Channel count not supported",
65            ))));
66        }
67        let track = options
68            .mediaStream
69            .get_tracks()
70            .iter()
71            .find(|t| t.ty() == MediaStreamType::Audio)
72            .ok_or(Error::InvalidState(Some(
73                "MediaStream has no audio track".into(),
74            )))?
75            .id();
76        let audio_node_init = AudioNodeInit::MediaStreamSourceNode(track);
77        let node_id =
78            AudioNode::generate_audio_node_id(cx, &node_options, audio_node_init, context.upcast());
79        Ok(reflect_dom_object_with_proto(
80            cx,
81            Box::new(MediaStreamAudioSourceNode::new_inherited(
82                node_id,
83                context.upcast(),
84                node_options,
85                &options.mediaStream,
86            )),
87            window,
88            proto,
89        ))
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}