Skip to main content

script/dom/audio/
mediastreamaudiodestinationnode.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::ServoMedia;
10use servo_media::audio::audio_node::AudioNodeInit;
11use servo_media::audio::graph::NodeId;
12use servo_media::streams::MediaStreamType;
13
14use crate::dom::audio::audiocontext::AudioContext;
15use crate::dom::audio::audionode::{AudioNode, AudioNodeOptionsHelper};
16use crate::dom::audio::baseaudiocontext::BaseAudioContext;
17use crate::dom::audionode::UnwrappedAudioNodeOptions;
18use crate::dom::bindings::codegen::Bindings::AudioNodeBinding::{
19    AudioNodeOptions, ChannelCountMode, ChannelInterpretation,
20};
21use crate::dom::bindings::codegen::Bindings::MediaStreamAudioDestinationNodeBinding::MediaStreamAudioDestinationNodeMethods;
22use crate::dom::bindings::error::{Error, Fallible};
23use crate::dom::bindings::inheritance::Castable;
24use crate::dom::bindings::reflector::DomGlobal;
25use crate::dom::bindings::root::{Dom, DomRoot};
26use crate::dom::mediastream::MediaStream;
27use crate::dom::window::Window;
28
29#[dom_struct]
30pub(crate) struct MediaStreamAudioDestinationNode {
31    node: AudioNode,
32    stream: Dom<MediaStream>,
33}
34
35impl MediaStreamAudioDestinationNode {
36    fn new_inherited(
37        node_id: Option<NodeId>,
38        context: &BaseAudioContext,
39        node_options: UnwrappedAudioNodeOptions,
40        stream: &MediaStream,
41    ) -> Self {
42        MediaStreamAudioDestinationNode {
43            node: AudioNode::new_inherited(
44                node_id,
45                context,
46                node_options,
47                1, // inputs
48                0, // outputs
49            ),
50            stream: Dom::from_ref(stream),
51        }
52    }
53}
54
55impl MediaStreamAudioDestinationNodeMethods<crate::DomTypeHolder>
56    for MediaStreamAudioDestinationNode
57{
58    /// <https://webaudio.github.io/web-audio-api/#dom-mediastreamaudiodestinationnode-mediastreamaudiodestinationnode>
59    fn Constructor(
60        cx: &mut JSContext,
61        window: &Window,
62        proto: Option<HandleObject>,
63        context: &AudioContext,
64        options: &AudioNodeOptions,
65    ) -> Fallible<DomRoot<MediaStreamAudioDestinationNode>> {
66        let media = ServoMedia::get();
67        let (socket, id) = media.create_stream_and_socket(MediaStreamType::Audio);
68        let stream = MediaStream::new_single(cx, &context.global(), id, MediaStreamType::Audio);
69        let node_options = options.unwrap_or(
70            2,
71            ChannelCountMode::Explicit,
72            ChannelInterpretation::Speakers,
73        );
74        if AudioNode::channel_count_check(node_options.count) {
75            return Err(Error::NotSupported(Some(String::from(
76                "Channel count not supported",
77            ))));
78        }
79        let audio_node_init = AudioNodeInit::MediaStreamDestinationNode(socket);
80        let node_id =
81            AudioNode::generate_audio_node_id(cx, &node_options, audio_node_init, context.upcast());
82        Ok(reflect_dom_object_with_proto(
83            cx,
84            Box::new(MediaStreamAudioDestinationNode::new_inherited(
85                node_id,
86                context.upcast(),
87                node_options,
88                &stream,
89            )),
90            window,
91            proto,
92        ))
93    }
94
95    /// <https://webaudio.github.io/web-audio-api/#dom-mediastreamaudiodestinationnode-stream>
96    fn Stream(&self) -> DomRoot<MediaStream> {
97        DomRoot::from_ref(&self.stream)
98    }
99}