1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
use anyhow::Result;
use bevy_asset::AssetLoader;
use std::{path::Path, sync::Arc};

/// A source of audio data
#[derive(Clone)]
pub struct AudioSource {
    pub bytes: Arc<Vec<u8>>,
}

impl AsRef<[u8]> for AudioSource {
    fn as_ref(&self) -> &[u8] {
        &self.bytes
    }
}

/// Loads mp3 files as [AudioSource] [Assets](bevy_asset::Assets)
#[derive(Default)]
pub struct Mp3Loader;

impl AssetLoader<AudioSource> for Mp3Loader {
    fn from_bytes(&self, _asset_path: &Path, bytes: Vec<u8>) -> Result<AudioSource> {
        Ok(AudioSource {
            bytes: Arc::new(bytes),
        })
    }

    fn extensions(&self) -> &[&str] {
        static EXTENSIONS: &[&str] = &["mp3", "flac", "wav", "ogg"];
        EXTENSIONS
    }
}