/* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ use dom_struct::dom_struct; use js::rust::HandleObject; use servo_media::audio::node::AudioNodeInit; use servo_media::streams::MediaStreamType; use servo_media::ServoMedia; use crate::dom::audiocontext::AudioContext; use crate::dom::audionode::AudioNode; use crate::dom::bindings::codegen::Bindings::AudioNodeBinding::{ AudioNodeOptions, ChannelCountMode, ChannelInterpretation, }; use crate::dom::bindings::codegen::Bindings::MediaStreamAudioDestinationNodeBinding::MediaStreamAudioDestinationNodeMethods; use crate::dom::bindings::error::Fallible; use crate::dom::bindings::inheritance::Castable; use crate::dom::bindings::reflector::{reflect_dom_object_with_proto, DomObject}; use crate::dom::bindings::root::{Dom, DomRoot}; use crate::dom::mediastream::MediaStream; use crate::dom::window::Window; use crate::script_runtime::CanGc; #[dom_struct] pub struct MediaStreamAudioDestinationNode { node: AudioNode, stream: Dom, } impl MediaStreamAudioDestinationNode { #[allow(crown::unrooted_must_root)] pub fn new_inherited( context: &AudioContext, options: &AudioNodeOptions, ) -> Fallible { let media = ServoMedia::get().unwrap(); let (socket, id) = media.create_stream_and_socket(MediaStreamType::Audio); let stream = MediaStream::new_single(&context.global(), id, MediaStreamType::Audio); let node_options = options.unwrap_or( 2, ChannelCountMode::Explicit, ChannelInterpretation::Speakers, ); let node = AudioNode::new_inherited( AudioNodeInit::MediaStreamDestinationNode(socket), context.upcast(), node_options, 1, // inputs 0, // outputs )?; Ok(MediaStreamAudioDestinationNode { node, stream: Dom::from_ref(&stream), }) } pub fn new( window: &Window, context: &AudioContext, options: &AudioNodeOptions, ) -> Fallible> { Self::new_with_proto(window, None, context, options, CanGc::note()) } #[allow(crown::unrooted_must_root)] fn new_with_proto( window: &Window, proto: Option, context: &AudioContext, options: &AudioNodeOptions, can_gc: CanGc, ) -> Fallible> { let node = MediaStreamAudioDestinationNode::new_inherited(context, options)?; Ok(reflect_dom_object_with_proto( Box::new(node), window, proto, can_gc, )) } #[allow(non_snake_case)] pub fn Constructor( window: &Window, proto: Option, can_gc: CanGc, context: &AudioContext, options: &AudioNodeOptions, ) -> Fallible> { MediaStreamAudioDestinationNode::new_with_proto(window, proto, context, options, can_gc) } } impl MediaStreamAudioDestinationNodeMethods for MediaStreamAudioDestinationNode { /// fn Stream(&self) -> DomRoot { DomRoot::from_ref(&self.stream) } }