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;
18use crate::dom::bindings::root::{Dom, DomRoot};
19use crate::dom::mediastream::MediaStream;
20use crate::dom::window::Window;
21use crate::script_runtime::CanGc;
22
23#[dom_struct]
24pub(crate) struct MediaStreamAudioSourceNode {
25 node: AudioNode,
26 stream: Dom<MediaStream>,
27}
28
29impl MediaStreamAudioSourceNode {
30 #[cfg_attr(crown, allow(crown::unrooted_must_root))]
31 pub(crate) fn new_inherited(
32 context: &AudioContext,
33 stream: &MediaStream,
34 ) -> Fallible<MediaStreamAudioSourceNode> {
35 let track = stream
36 .get_tracks()
37 .iter()
38 .find(|t| t.ty() == MediaStreamType::Audio)
39 .ok_or(Error::InvalidState)?
40 .id();
41 let node = AudioNode::new_inherited(
42 AudioNodeInit::MediaStreamSourceNode(track),
43 context.upcast(),
44 Default::default(),
45 0, 1, )?;
48 Ok(MediaStreamAudioSourceNode {
49 node,
50 stream: Dom::from_ref(stream),
51 })
52 }
53
54 pub(crate) fn new(
55 window: &Window,
56 context: &AudioContext,
57 stream: &MediaStream,
58 can_gc: CanGc,
59 ) -> Fallible<DomRoot<MediaStreamAudioSourceNode>> {
60 Self::new_with_proto(window, None, context, stream, can_gc)
61 }
62
63 #[cfg_attr(crown, allow(crown::unrooted_must_root))]
64 fn new_with_proto(
65 window: &Window,
66 proto: Option<HandleObject>,
67 context: &AudioContext,
68 stream: &MediaStream,
69 can_gc: CanGc,
70 ) -> Fallible<DomRoot<MediaStreamAudioSourceNode>> {
71 let node = MediaStreamAudioSourceNode::new_inherited(context, stream)?;
72 Ok(reflect_dom_object_with_proto(
73 Box::new(node),
74 window,
75 proto,
76 can_gc,
77 ))
78 }
79}
80
81impl MediaStreamAudioSourceNodeMethods<crate::DomTypeHolder> for MediaStreamAudioSourceNode {
82 fn Constructor(
84 window: &Window,
85 proto: Option<HandleObject>,
86 can_gc: CanGc,
87 context: &AudioContext,
88 options: &MediaStreamAudioSourceOptions,
89 ) -> Fallible<DomRoot<MediaStreamAudioSourceNode>> {
90 MediaStreamAudioSourceNode::new_with_proto(
91 window,
92 proto,
93 context,
94 &options.mediaStream,
95 can_gc,
96 )
97 }
98
99 fn MediaStream(&self) -> DomRoot<MediaStream> {
101 DomRoot::from_ref(&self.stream)
102 }
103}