diff options
Diffstat (limited to 'src/audio.rs')
| -rw-r--r-- | src/audio.rs | 52 |
1 files changed, 48 insertions, 4 deletions
diff --git a/src/audio.rs b/src/audio.rs index 5cbce90..0dca32e 100644 --- a/src/audio.rs +++ b/src/audio.rs @@ -103,28 +103,53 @@ impl Assets { #[cfg(not(target_arch = "wasm32"))] pub struct Context { + manager: kira::manager::AudioManager, } #[cfg(not(target_arch = "wasm32"))] impl Context { pub fn new() -> Self { Self { + manager: kira::manager::AudioManager::new(kira::manager::AudioManagerSettings::default()) + .expect("failed to create audio manager"), } } } #[cfg(not(target_arch = "wasm32"))] pub struct Audio { + data: kira::sound::static_sound::StaticSoundData, } #[cfg(not(target_arch = "wasm32"))] impl Audio { - pub fn new(ctx: &Context, _bytes: &[u8]) -> Self { + pub fn new(_ctx: &Context, bytes: &'static [u8]) -> Self { Self { + data: kira::sound::static_sound::StaticSoundData::from_cursor(std::io::Cursor::new(bytes)) + .expect("failed to decode audio"), } } - pub fn play(&self, ctx: &Context, looping: Option<(Option<f64>, Option<f64>)>) { + pub fn play( + &self, + ctx: &mut Context, + looping: Option<(Option<f64>, Option<f64>)> + ) -> Result<kira::sound::static_sound::StaticSoundHandle, String> + { + let sd = if let Some((ss, se)) = looping { + let start = if let Some(s) = ss { s } else { 0.0 }; + if let Some(e) = se { + self.data.loop_region(start..e) + } else { + self.data.loop_region(start..) + } + } else { + self.data.clone() + }; + match ctx.manager.play(sd) { + Ok(h) => Ok(h), + Err(e) => Err(e.to_string()), + } } } @@ -132,6 +157,7 @@ impl Audio { pub struct Assets { pub ctx: Context, pub audio: HashMap<String, Audio>, + pub music_handle: Option<kira::sound::static_sound::StaticSoundHandle>, } #[cfg(not(target_arch = "wasm32"))] @@ -144,19 +170,37 @@ impl Assets { Self { ctx, audio, + music_handle: None, } } pub fn play_sfx(&mut self, name: &str) { if let Some(a) = self.audio.get(name) { - a.play(&self.ctx, None); + if let Err(e) = a.play(&mut self.ctx, None) { + log::warn!("failed to play sound {}: {}", name, e); + } } } pub fn is_music_playing(&self) -> bool { - false + if let Some(mh) = &self.music_handle { + mh.state() == kira::sound::PlaybackState::Playing + } else { false } } pub fn play_music(&mut self, name: &str, start: Option<f64>, end: Option<f64>) { + if let Some(s) = &mut self.music_handle { + let _ = s.stop(kira::tween::Tween::default()); + } + if let Some(a) = self.audio.get(name) { + match a.play(&mut self.ctx, Some((start, end))) { + Ok(h) => { + self.music_handle = Some(h); + }, + Err(e) => { + log::warn!("failed to play music {}: {}", name, e); + } + } + } } } |
