bevy_mod_kira 0.1.1

A plugin that integrates the Kira audio library for use in the Bevy game engine
Documentation
use bevy::prelude::Events;

use bevy::prelude::error;
use bevy::prelude::NonSendMut;
use bevy::prelude::{Commands, Component, Entity, Query, ResMut};
use bevy::reflect::Reflect;

use kira::track::TrackBuilder;
use kira::track::TrackHandle;

pub use crate::static_sound_loader::{KiraStaticSoundAsset, StaticSoundFileLoader};

use crate::KiraContext;

#[derive(Component, Default, Reflect)]
pub struct KiraTracks(#[reflect(ignore)] pub Vec<TrackHandle>);

pub struct KiraAddTrackEvent {
    entity: Entity,
    track: TrackBuilder,
}

impl KiraAddTrackEvent {
    pub fn new(entity: Entity, track: TrackBuilder) -> Self {
        Self { entity, track }
    }
}

pub(super) fn do_add_track_sys(
    mut commands: Commands,
    mut kira: NonSendMut<KiraContext>,
    mut query: Query<(Entity, Option<&mut KiraTracks>)>,
    mut ev_add_track: ResMut<Events<KiraAddTrackEvent>>,
) {
    for event in ev_add_track.drain() {
        if let Some(manager) = kira.get_manager() {
            if let Ok(track_handle) = manager.add_sub_track(event.track) {
                if let Ok((eid, tracks)) = query.get_mut(event.entity) {
                    match tracks {
                        Some(mut sounds) => {
                            sounds.0.push(track_handle);
                        }
                        None => {
                            commands.entity(eid).insert(KiraTracks(vec![track_handle]));
                        }
                    };
                } else {
                    error!(
                        "Failed to associate track handle with entity: {:?}. \
                 The handle will be dropped.",
                        event.entity
                    );
                }
            }
        }
    }
}