amethyst_audio/components/
mod.rs

1//! `amethyst` audio ecs components
2
3pub use self::{audio_emitter::AudioEmitter, audio_listener::AudioListener};
4
5use amethyst_assets::PrefabData;
6use amethyst_core::{
7    ecs::prelude::{Entity, Read, WriteStorage},
8    math::Point3,
9};
10use amethyst_error::Error;
11
12use serde::{Deserialize, Serialize};
13
14use crate::output::Output;
15
16mod audio_emitter;
17mod audio_listener;
18
19/// `PrefabData` for loading audio components
20///
21/// For `AudioListener`, the currently registered `Output` in the `World` will be used.
22#[derive(Clone, Debug, Default, Deserialize, Serialize)]
23pub struct AudioPrefab {
24    emitter: bool,
25    /// Left, Right
26    listener: Option<(Point3<f32>, Point3<f32>)>,
27}
28
29impl<'a> PrefabData<'a> for AudioPrefab {
30    type SystemData = (
31        WriteStorage<'a, AudioEmitter>,
32        WriteStorage<'a, AudioListener>,
33        Option<Read<'a, Output>>,
34    );
35    type Result = ();
36
37    fn add_to_entity(
38        &self,
39        entity: Entity,
40        system_data: &mut Self::SystemData,
41        _: &[Entity],
42        _: &[Entity],
43    ) -> Result<(), Error> {
44        if self.emitter {
45            system_data.0.insert(entity, AudioEmitter::default())?;
46        }
47        if let Some((left_ear, right_ear)) = self.listener {
48            system_data.1.insert(
49                entity,
50                AudioListener {
51                    left_ear,
52                    right_ear,
53                },
54            )?;
55        }
56        Ok(())
57    }
58}