script/dom/audio/
mediastreamaudiosourcenode.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::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, 1, ),
47 stream: Dom::from_ref(stream),
48 }
49 }
50}
51
52impl MediaStreamAudioSourceNodeMethods<crate::DomTypeHolder> for MediaStreamAudioSourceNode {
53 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 fn MediaStream(&self) -> DomRoot<MediaStream> {
94 DomRoot::from_ref(&self.stream)
95 }
96}