Skip to main content

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