use crate::*;
impl GameAudioContext {
pub fn create() -> GameAudioContext {
let context: AudioContext = AudioContext::new().expect("should create audio context");
let master_gain: GainNode = context
.create_gain()
.expect("should create master gain node");
let _ = master_gain.connect_with_audio_node(&context.destination());
master_gain.gain().set_value(AUDIO_DEFAULT_VOLUME as f32);
GameAudioContext::new(context, master_gain, AUDIO_DEFAULT_VOLUME)
}
pub fn apply_master_volume(&self, volume: f64) {
let clamped: f64 = Numeric::clamp(volume, 0.0, 1.0);
self.get_master_gain().gain().set_value(clamped as f32);
}
pub fn resume(&self) {
let _ = self.get_context().resume();
}
pub fn suspend(&self) {
let _ = self.get_context().suspend();
}
pub fn close(&self) {
let _ = self.get_context().close();
}
pub fn sample_rate(&self) -> f64 {
self.get_context().sample_rate() as f64
}
pub fn current_time(&self) -> f64 {
self.get_context().current_time()
}
}
impl Default for GameAudioContext {
fn default() -> GameAudioContext {
GameAudioContext::create()
}
}
impl AudioClip {
pub fn create(buffer: AudioBuffer, name: String) -> AudioClip {
AudioClip::new(
buffer,
name,
AudioPlayState::Stopped,
AUDIO_DEFAULT_LOOP,
AUDIO_DEFAULT_VOLUME,
AUDIO_DEFAULT_PLAYBACK_RATE,
)
}
pub fn play(&mut self, audio_context: &GameAudioContext) {
if self.get_state() == AudioPlayState::Playing {
return;
}
let source: AudioBufferSourceNode = audio_context
.get_context()
.create_buffer_source()
.expect("should create buffer source");
source.set_buffer(Some(self.get_buffer()));
source.set_loop(self.get_looping());
source
.playback_rate()
.set_value(self.get_playback_rate() as f32);
let gain: GainNode = audio_context
.get_context()
.create_gain()
.expect("should create gain node");
gain.gain().set_value(self.get_volume() as f32);
let _ = source.connect_with_audio_node(&gain);
let _ = gain.connect_with_audio_node(audio_context.get_master_gain());
let _ = source.start();
self.set_source_node(Some(source));
self.set_state(AudioPlayState::Playing);
}
pub fn stop(&mut self) {
if let Some(source) = self.get_mut_source_node().take() {
let scheduled: &AudioScheduledSourceNode = source.as_ref();
let _ = scheduled.stop_with_when(0.0);
let _ = source.disconnect();
}
self.set_state(AudioPlayState::Stopped);
}
pub fn update_looping(&mut self, looping: bool) {
self.set_looping(looping);
if let Some(source) = self.get_mut_source_node() {
source.set_loop(looping);
}
}
pub fn update_volume(&mut self, volume: f64) {
self.set_volume(Numeric::clamp(volume, 0.0, 1.0));
}
pub fn update_playback_rate(&mut self, rate: f64) {
self.set_playback_rate(rate);
if let Some(source) = self.get_mut_source_node() {
source.playback_rate().set_value(rate as f32);
}
}
pub fn duration(&self) -> f64 {
self.get_buffer().duration()
}
pub fn channel_count(&self) -> u32 {
self.get_buffer().number_of_channels()
}
}