summaryrefslogtreecommitdiff
path: root/src/audio.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/audio.rs')
-rw-r--r--src/audio.rs52
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);
+ }
+ }
+ }
}
}