diff --git a/src/audio.rs b/src/audio.rs index 08ebde5..46ad466 100644 --- a/src/audio.rs +++ b/src/audio.rs @@ -2,15 +2,15 @@ /// TODO: Custom Asset: FmodEventMapper /// use crate::prelude::*; -use bevy_fmod::prelude::AudioSource; -use bevy_fmod::prelude::*; -use serde::Deserialize; use bevy::{ asset::{AssetLoader, LoadContext, LoadedAsset}, prelude::*, reflect::{TypePath, TypeUuid}, utils::BoxedFuture, }; +use bevy_fmod::prelude::AudioSource; +use bevy_fmod::prelude::*; +use serde::Deserialize; pub(crate) struct AudioPlugin; @@ -28,7 +28,8 @@ impl Plugin for AudioPlugin { "./assets/audio/Martian Chess Audio/Build/Desktop/SFX.bank", ], }); - app.add_asset::().init_asset_loader::(); + app.add_asset::() + .init_asset_loader::(); app.add_systems(OnEnter(GameState::Menu), play_background); app.add_systems( @@ -42,23 +43,22 @@ impl Plugin for AudioPlugin { } } -#[derive(Event, Debug)] +#[derive(Event, Debug, PartialEq)] pub enum AudioEvent { MainMusic, + StopMainMusic, MenuSelect, PickUp, PutDown, Idle, + StopIdle, Invalid, } #[derive(Resource)] struct AudioTweakfile(Handle); -fn load_tweakfile( - server: Res, - mut commands: Commands, -) { +fn load_tweakfile(server: Res, mut commands: Commands) { let handle: Handle = server.load("audio/martian.audio.tweak"); commands.insert_resource(AudioTweakfile(handle)); } @@ -73,18 +73,21 @@ fn play_audio(mut events: Query<&AudioSource, Added>) { fn audio_trigger( mut events: EventReader, + sources: Query<&AudioSource>, studio: Res, mut commands: Commands, server: Res, audio_settings: Res>, display_state: Res>, ) { - let tweak = audio_settings.get(&server.load("audio/martian.audio.tweak")).expect("Load audio tweakfile"); + let tweak = audio_settings + .get(&server.load("audio/martian.audio.tweak")) + .expect("Load audio tweakfile"); debug!("Audio tweaks: {:?}", tweak); let state = display_state.get(); events.iter().for_each(|event| { let aud = match event { - AudioEvent::MainMusic => tweak.music.main.clone(), + AudioEvent::MainMusic | AudioEvent::StopMainMusic => tweak.music.main.clone(), AudioEvent::MenuSelect => tweak.menu.select.clone(), AudioEvent::PickUp => match state { DisplayState::Display2d => tweak.display2d.pick_up.clone(), @@ -94,7 +97,7 @@ fn audio_trigger( DisplayState::Display2d => tweak.display2d.put_down.clone(), DisplayState::Display3d => tweak.display3d.put_down.clone(), }, - AudioEvent::Idle => match state { + AudioEvent::Idle | AudioEvent::StopIdle => match state { DisplayState::Display2d => tweak.display2d.idle.clone(), DisplayState::Display3d => tweak.display3d.idle.clone(), }, @@ -103,11 +106,27 @@ fn audio_trigger( DisplayState::Display3d => tweak.display3d.invalid.clone(), }, }; + // There is an event for this if !aud.is_empty() { let event_str = format!("event:{}", aud); if let Ok(event_description) = studio.0.get_event(event_str.as_str()) { - info!("Playing FMOD {:?}", event_str); - commands.spawn(AudioSource::new(event_description)); + let audio_source = AudioSource::new(event_description); + // We are stopping a playing event + if *event == AudioEvent::StopIdle || *event == AudioEvent::StopMainMusic { + info!("Stopping audio {}", event_str); + // TODO: Find and stop playing instances of this audio + sources + .iter() + .filter(|source| { + format!("{:?}", source.event_instance) + == format!("{:?}", audio_source.event_instance) + }) + .for_each(|source| source.stop()); + // we are playing a sound + } else { + info!("Playing audoi {}", event_str); + commands.spawn(audio_source); + } } else { warn!("Music not found for {:?}", event_str); } diff --git a/src/game.rs b/src/game.rs index 8baff09..48e250c 100644 --- a/src/game.rs +++ b/src/game.rs @@ -372,6 +372,7 @@ pub(crate) fn update_board( *index = to_idx.clone(); if !(*played) { audio_events.send(audio::AudioEvent::PutDown); + audio_events.send(audio::AudioEvent::StopIdle); *played = true; } }