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