script/dom/audio/
mediastreamaudiosourcenode.rs1use dom_struct::dom_struct;
6use js::rust::HandleObject;
7use servo_media::audio::node::AudioNodeInit;
8use servo_media::streams::MediaStreamType;
9
10use crate::dom::audio::audiocontext::AudioContext;
11use crate::dom::audio::audionode::AudioNode;
12use crate::dom::bindings::codegen::Bindings::MediaStreamAudioSourceNodeBinding::{
13 MediaStreamAudioSourceNodeMethods, MediaStreamAudioSourceOptions,
14};
15use crate::dom::bindings::error::{Error, Fallible};
16use crate::dom::bindings::inheritance::Castable;
17use crate::dom::bindings::reflector::reflect_dom_object_with_proto_and_cx;
18use crate::dom::bindings::root::{Dom, DomRoot};
19use crate::dom::mediastream::MediaStream;
20use crate::dom::window::Window;
21
22#[dom_struct]
23pub(crate) struct MediaStreamAudioSourceNode {
24 node: AudioNode,
25 stream: Dom<MediaStream>,
26}
27
28impl MediaStreamAudioSourceNode {
29 #[cfg_attr(crown, expect(crown::unrooted_must_root))]
30 pub(crate) fn new_inherited(
31 context: &AudioContext,
32 stream: &MediaStream,
33 ) -> Fallible<MediaStreamAudioSourceNode> {
34 let track = stream
35 .get_tracks()
36 .iter()
37 .find(|t| t.ty() == MediaStreamType::Audio)
38 .ok_or(Error::InvalidState(None))?
39 .id();
40 let node = AudioNode::new_inherited(
41 AudioNodeInit::MediaStreamSourceNode(track),
42 context.upcast(),
43 Default::default(),
44 0, 1, )?;
47 Ok(MediaStreamAudioSourceNode {
48 node,
49 stream: Dom::from_ref(stream),
50 })
51 }
52
53 pub(crate) fn new(
54 cx: &mut js::context::JSContext,
55 window: &Window,
56 context: &AudioContext,
57 stream: &MediaStream,
58 ) -> Fallible<DomRoot<MediaStreamAudioSourceNode>> {
59 Self::new_with_proto(cx, window, None, context, stream)
60 }
61
62 #[cfg_attr(crown, expect(crown::unrooted_must_root))]
63 fn new_with_proto(
64 cx: &mut js::context::JSContext,
65 window: &Window,
66 proto: Option<HandleObject>,
67 context: &AudioContext,
68 stream: &MediaStream,
69 ) -> Fallible<DomRoot<MediaStreamAudioSourceNode>> {
70 let node = MediaStreamAudioSourceNode::new_inherited(context, stream)?;
71 Ok(reflect_dom_object_with_proto_and_cx(
72 Box::new(node),
73 window,
74 proto,
75 cx,
76 ))
77 }
78}
79
80impl MediaStreamAudioSourceNodeMethods<crate::DomTypeHolder> for MediaStreamAudioSourceNode {
81 fn Constructor(
83 cx: &mut js::context::JSContext,
84 window: &Window,
85 proto: Option<HandleObject>,
86 context: &AudioContext,
87 options: &MediaStreamAudioSourceOptions,
88 ) -> Fallible<DomRoot<MediaStreamAudioSourceNode>> {
89 MediaStreamAudioSourceNode::new_with_proto(cx, window, proto, context, &options.mediaStream)
90 }
91
92 fn MediaStream(&self) -> DomRoot<MediaStream> {
94 DomRoot::from_ref(&self.stream)
95 }
96}