script/dom/audio/
mediastreamaudiodestinationnode.rs1use 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, 0, ),
50 stream: Dom::from_ref(stream),
51 }
52 }
53}
54
55impl MediaStreamAudioDestinationNodeMethods<crate::DomTypeHolder>
56 for MediaStreamAudioDestinationNode
57{
58 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 fn Stream(&self) -> DomRoot<MediaStream> {
97 DomRoot::from_ref(&self.stream)
98 }
99}