4848//!
4949
5050use crate :: prelude:: Engine ;
51- use bevy:: { audio:: AudioSink , prelude:: * } ;
51+ use bevy:: {
52+ audio:: { AudioSink , PlaybackMode , Volume } ,
53+ prelude:: * ,
54+ } ;
5255use std:: { array:: IntoIter , fmt:: Debug } ;
5356
5457#[ derive( Default ) ]
@@ -70,7 +73,7 @@ impl Plugin for AudioManagerPlugin {
7073pub struct AudioManager {
7174 sfx_queue : Vec < ( String , f32 ) > ,
7275 music_queue : Vec < Option < ( String , f32 ) > > ,
73- playing : Option < Handle < AudioSink > > ,
76+ playing : Option < Entity > ,
7477 music_playing : bool ,
7578}
7679
@@ -227,46 +230,49 @@ impl From<MusicPreset> for String {
227230 }
228231}
229232
233+ #[ derive( Component ) ]
234+ struct Music ;
235+
230236/// The Bevy system that checks to see if there is any audio management that needs to be done.
231237#[ doc( hidden) ]
232238pub fn queue_managed_audio_system (
239+ mut commands : Commands ,
240+ music_query : Query < ( Entity , & AudioSink ) , With < Music > > ,
233241 asset_server : Res < AssetServer > ,
234- audio : Res < Audio > ,
235- audio_sinks : Res < Assets < AudioSink > > ,
236242 mut game_state : ResMut < Engine > ,
237243) {
238244 for ( sfx, volume) in game_state. audio_manager . sfx_queue . drain ( ..) {
239245 let sfx_path = format ! ( "audio/{}" , sfx) ;
240- let sfx_handle = asset_server . load ( sfx_path . as_str ( ) ) ;
241- audio . play_with_settings (
242- sfx_handle ,
243- PlaybackSettings {
244- volume,
246+ commands . spawn ( AudioBundle {
247+ source : asset_server . load ( sfx_path . as_str ( ) ) ,
248+ settings : PlaybackSettings {
249+ mode : PlaybackMode :: Despawn ,
250+ volume : Volume :: new_relative ( volume ) ,
245251 ..Default :: default ( )
246252 } ,
247- ) ;
253+ } ) ;
248254 }
249255 #[ allow( clippy:: for_loops_over_fallibles) ]
250256 if let Some ( item) = game_state. audio_manager . music_queue . drain ( ..) . last ( ) {
251257 // stop any music currently playing
252- if let Some ( sink_handle) = & game_state. audio_manager . playing {
253- if let Some ( sink) = audio_sinks. get ( sink_handle) {
254- sink. stop ( ) ;
255- }
258+ if let Ok ( ( entity, music) ) = music_query. get_single ( ) {
259+ music. stop ( ) ;
260+ commands. entity ( entity) . despawn ( ) ;
256261 }
257262 // start the new music...if we have some
258263 if let Some ( ( music, volume) ) = item {
259264 let music_path = format ! ( "audio/{}" , music) ;
260- let music_handle = asset_server. load ( music_path. as_str ( ) ) ;
261- let sink_handle = audio_sinks. get_handle ( audio. play_with_settings (
262- music_handle,
263- PlaybackSettings {
264- repeat : true ,
265- volume,
266- ..Default :: default ( )
267- } ,
268- ) ) ;
269- game_state. audio_manager . playing = Some ( sink_handle) ;
265+ let entity = commands
266+ . spawn ( AudioBundle {
267+ source : asset_server. load ( music_path. as_str ( ) ) ,
268+ settings : PlaybackSettings {
269+ volume : Volume :: new_relative ( volume) ,
270+ mode : PlaybackMode :: Loop ,
271+ ..Default :: default ( )
272+ } ,
273+ } )
274+ . id ( ) ;
275+ game_state. audio_manager . playing = Some ( entity) ;
270276 }
271277 }
272278}
0 commit comments