script/dom/audio/
mediastreamtrackaudiosourcenode.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;
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, 1, ),
46 track: Dom::from_ref(track),
47 }
48 }
49}
50
51impl MediaStreamTrackAudioSourceNodeMethods<crate::DomTypeHolder>
52 for MediaStreamTrackAudioSourceNode
53{
54 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}