1use crate::*;
2
3impl GameAudioContext {
5 pub fn create() -> GameAudioContext {
11 let context: AudioContext = AudioContext::new().expect("should create audio context");
12 let master_gain: GainNode = context
13 .create_gain()
14 .expect("should create master gain node");
15 let _ = master_gain.connect_with_audio_node(&context.destination());
16 master_gain.gain().set_value(AUDIO_DEFAULT_VOLUME as f32);
17 GameAudioContext::new(context, master_gain, AUDIO_DEFAULT_VOLUME)
18 }
19
20 pub fn apply_master_volume(&self, volume: f64) {
26 let clamped: f64 = Numeric::clamp(volume, 0.0, 1.0);
27 self.get_master_gain().gain().set_value(clamped as f32);
28 }
29
30 pub fn resume(&self) {
32 let _ = self.get_context().resume();
33 }
34
35 pub fn suspend(&self) {
37 let _ = self.get_context().suspend();
38 }
39
40 pub fn close(&self) {
42 let _ = self.get_context().close();
43 }
44
45 pub fn sample_rate(&self) -> f64 {
51 self.get_context().sample_rate() as f64
52 }
53
54 pub fn current_time(&self) -> f64 {
60 self.get_context().current_time()
61 }
62}
63
64impl Default for GameAudioContext {
66 fn default() -> GameAudioContext {
67 GameAudioContext::create()
68 }
69}
70
71impl AudioClip {
73 pub fn create(buffer: AudioBuffer, name: String) -> AudioClip {
84 AudioClip::new(
85 buffer,
86 name,
87 AudioPlayState::Stopped,
88 AUDIO_DEFAULT_LOOP,
89 AUDIO_DEFAULT_VOLUME,
90 AUDIO_DEFAULT_PLAYBACK_RATE,
91 )
92 }
93
94 pub fn play(&mut self, audio_context: &GameAudioContext) {
103 if self.get_state() == AudioPlayState::Playing {
104 return;
105 }
106 let source: AudioBufferSourceNode = audio_context
107 .get_context()
108 .create_buffer_source()
109 .expect("should create buffer source");
110 source.set_buffer(Some(self.get_buffer()));
111 source.set_loop(self.get_looping());
112 source
113 .playback_rate()
114 .set_value(self.get_playback_rate() as f32);
115 let gain: GainNode = audio_context
116 .get_context()
117 .create_gain()
118 .expect("should create gain node");
119 gain.gain().set_value(self.get_volume() as f32);
120 let _ = source.connect_with_audio_node(&gain);
121 let _ = gain.connect_with_audio_node(audio_context.get_master_gain());
122 let _ = source.start();
123 self.set_source_node(Some(source));
124 self.set_state(AudioPlayState::Playing);
125 }
126
127 pub fn stop(&mut self) {
129 if let Some(source) = self.get_mut_source_node().take() {
130 let scheduled: &AudioScheduledSourceNode = source.as_ref();
131 let _ = scheduled.stop_with_when(0.0);
132 let _ = source.disconnect();
133 }
134 self.set_state(AudioPlayState::Stopped);
135 }
136
137 pub fn update_looping(&mut self, looping: bool) {
143 self.set_looping(looping);
144 if let Some(source) = self.get_mut_source_node() {
145 source.set_loop(looping);
146 }
147 }
148
149 pub fn update_volume(&mut self, volume: f64) {
155 self.set_volume(Numeric::clamp(volume, 0.0, 1.0));
156 }
157
158 pub fn update_playback_rate(&mut self, rate: f64) {
164 self.set_playback_rate(rate);
165 if let Some(source) = self.get_mut_source_node() {
166 source.playback_rate().set_value(rate as f32);
167 }
168 }
169
170 pub fn duration(&self) -> f64 {
176 self.get_buffer().duration()
177 }
178
179 pub fn channel_count(&self) -> u32 {
185 self.get_buffer().number_of_channels()
186 }
187}