Skip to content

Commit bd00f3f

Browse files
authored
Defer error handling to user when removing audio sources (#107)
Use fallible observer
1 parent f600744 commit bd00f3f

File tree

1 file changed

+17
-15
lines changed

1 file changed

+17
-15
lines changed

src/fmod_plugin.rs

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
1-
use bevy::app::PreStartup;
1+
use bevy::ecs::error::Result;
2+
use bevy::ecs::lifecycle::Remove;
3+
use bevy::ecs::observer::On;
4+
use bevy::ecs::system::Query;
25
use bevy::log::error;
3-
use bevy::prelude::{App, Plugin, PostUpdate, Res, Update, World};
6+
use bevy::prelude::{App, Plugin, PostUpdate, Res, Update};
47

58
use crate::components::audio_listener::AudioListener;
69
use crate::components::audio_source::AudioSource;
@@ -21,15 +24,15 @@ impl Plugin for FmodPlugin {
2124
fn build(&self, app: &mut App) {
2225
app.add_plugins(VelocityPlugin)
2326
.insert_resource(FmodStudio::new(self.audio_banks_paths, self.plugin_paths))
24-
.add_systems(PreStartup, register_component_hooks)
2527
.add_systems(
2628
Update,
2729
(
2830
AudioSource::update_3d_attributes,
2931
AudioListener::update_3d_attributes,
3032
),
3133
)
32-
.add_systems(PostUpdate, Self::update);
34+
.add_systems(PostUpdate, Self::update)
35+
.add_observer(on_remove_audio_source);
3336
}
3437
}
3538

@@ -49,16 +52,15 @@ impl FmodPlugin {
4952
}
5053
}
5154

52-
fn register_component_hooks(world: &mut World) {
53-
world
54-
.register_component_hooks::<AudioSource>()
55-
.on_remove(|mut world, hook_context| {
56-
let entity = hook_context.entity;
57-
let mut entity_mut = world.entity_mut(entity);
58-
let audio_source = entity_mut.get_mut::<AudioSource>().unwrap();
59-
let event_instance = audio_source.event_instance;
55+
fn on_remove_audio_source(
56+
remove: On<Remove, AudioSource>,
57+
query: Query<&mut AudioSource>,
58+
) -> Result {
59+
let audio_source = query.get(remove.entity)?;
60+
let event_instance = audio_source.event_instance;
6061

61-
event_instance.stop(audio_source.despawn_stop_mode).unwrap();
62-
event_instance.release().unwrap();
63-
});
62+
event_instance.stop(audio_source.despawn_stop_mode)?;
63+
event_instance.release()?;
64+
65+
Ok(())
6466
}

0 commit comments

Comments
 (0)