script/dom/audio/
constantsourcenode.rs1use std::f32;
6
7use dom_struct::dom_struct;
8use js::rust::HandleObject;
9use servo_media::audio::constant_source_node::ConstantSourceNodeOptions as ServoMediaConstantSourceOptions;
10use servo_media::audio::node::{AudioNodeInit, AudioNodeType};
11use servo_media::audio::param::ParamType;
12
13use crate::conversions::Convert;
14use crate::dom::audio::audioparam::AudioParam;
15use crate::dom::audio::audioscheduledsourcenode::AudioScheduledSourceNode;
16use crate::dom::audio::baseaudiocontext::BaseAudioContext;
17use crate::dom::bindings::codegen::Bindings::AudioParamBinding::AutomationRate;
18use crate::dom::bindings::codegen::Bindings::ConstantSourceNodeBinding::{
19 ConstantSourceNodeMethods, ConstantSourceOptions,
20};
21use crate::dom::bindings::error::Fallible;
22use crate::dom::bindings::reflector::reflect_dom_object_with_proto;
23use crate::dom::bindings::root::{Dom, DomRoot};
24use crate::dom::window::Window;
25use crate::script_runtime::CanGc;
26
27#[dom_struct]
28pub(crate) struct ConstantSourceNode {
29 source_node: AudioScheduledSourceNode,
30 offset: Dom<AudioParam>,
31}
32
33impl ConstantSourceNode {
34 #[cfg_attr(crown, allow(crown::unrooted_must_root))]
35 fn new_inherited(
36 window: &Window,
37 context: &BaseAudioContext,
38 options: &ConstantSourceOptions,
39 can_gc: CanGc,
40 ) -> Fallible<ConstantSourceNode> {
41 let node_options = Default::default();
42 let offset = *options.offset;
43 let source_node = AudioScheduledSourceNode::new_inherited(
44 AudioNodeInit::ConstantSourceNode(options.convert()),
45 context,
46 node_options, 0, 1, )?;
50 let node_id = source_node.node().node_id();
51 let offset = AudioParam::new(
52 window,
53 context,
54 node_id,
55 AudioNodeType::ConstantSourceNode,
56 ParamType::Offset,
57 AutomationRate::A_rate,
58 offset,
59 f32::MIN,
60 f32::MAX,
61 can_gc,
62 );
63
64 Ok(ConstantSourceNode {
65 source_node,
66 offset: Dom::from_ref(&offset),
67 })
68 }
69
70 pub(crate) fn new(
71 window: &Window,
72 context: &BaseAudioContext,
73 options: &ConstantSourceOptions,
74 can_gc: CanGc,
75 ) -> Fallible<DomRoot<ConstantSourceNode>> {
76 Self::new_with_proto(window, None, context, options, can_gc)
77 }
78
79 #[cfg_attr(crown, allow(crown::unrooted_must_root))]
80 fn new_with_proto(
81 window: &Window,
82 proto: Option<HandleObject>,
83 context: &BaseAudioContext,
84 options: &ConstantSourceOptions,
85 can_gc: CanGc,
86 ) -> Fallible<DomRoot<ConstantSourceNode>> {
87 let node = ConstantSourceNode::new_inherited(window, context, options, can_gc)?;
88 Ok(reflect_dom_object_with_proto(
89 Box::new(node),
90 window,
91 proto,
92 can_gc,
93 ))
94 }
95}
96
97impl ConstantSourceNodeMethods<crate::DomTypeHolder> for ConstantSourceNode {
98 fn Constructor(
100 window: &Window,
101 proto: Option<HandleObject>,
102 can_gc: CanGc,
103 context: &BaseAudioContext,
104 options: &ConstantSourceOptions,
105 ) -> Fallible<DomRoot<ConstantSourceNode>> {
106 ConstantSourceNode::new_with_proto(window, proto, context, options, can_gc)
107 }
108
109 fn Offset(&self) -> DomRoot<AudioParam> {
111 DomRoot::from_ref(&self.offset)
112 }
113}
114
115impl Convert<ServoMediaConstantSourceOptions> for ConstantSourceOptions {
116 fn convert(self) -> ServoMediaConstantSourceOptions {
117 ServoMediaConstantSourceOptions {
118 offset: *self.offset,
119 }
120 }
121}