From b85fbe3257296afae08d560fbe09babe7c637790 Mon Sep 17 00:00:00 2001 From: Nolan Darilek Date: Thu, 12 Aug 2021 13:18:45 -0500 Subject: [PATCH] Add MP3 support. --- Cargo.toml | 3 ++- src/lib.rs | 33 ++++++++++++++++++++++++++++++++- 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 39bc8fe..df06e96 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -13,4 +13,5 @@ anyhow = "1" bevy = { version = "0.5", default-features = false } claxon = "0.4" hound = "3" -lewton = "0.10" \ No newline at end of file +lewton = "0.10" +minimp3 = "0.5" \ No newline at end of file diff --git a/src/lib.rs b/src/lib.rs index 94ec850..b56e450 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -19,6 +19,7 @@ use bevy::{ utils::BoxedFuture, }; use lewton::inside_ogg::OggStreamReader; +use minimp3::{Decoder, Error}; #[derive(Clone, Debug, TypeUuid)] #[uuid = "aa22d11e-3bed-11eb-8708-00155dea3db9"] @@ -70,6 +71,36 @@ impl AssetLoader for BufferAssetLoader { sample_rate: stream.ident_hdr.audio_sample_rate as i32, }) } + "mp3" => { + let mut decoder = Decoder::new(cursor); + let mut samples: Vec = vec![]; + let mut channels = 0_u16; + let mut sample_rate = 0; + let mut succeeded = true; + loop { + match decoder.next_frame() { + Ok(mut frame) => { + samples.append(&mut frame.data); + channels = frame.channels as u16; + sample_rate = frame.sample_rate; + } + Err(Error::Eof) => break, + Err(_) => { + succeeded = false; + break; + } + }; + } + if succeeded { + Some(Buffer { + samples, + channels, + sample_rate, + }) + } else { + None + } + } "wav" => { let reader = hound::WavReader::new(cursor); if let Ok(mut reader) = reader { @@ -96,7 +127,7 @@ impl AssetLoader for BufferAssetLoader { } fn extensions(&self) -> &[&str] { - &["flac", "ogg", "wav"] + &["flac", "ogg", "mp3", "wav"] } }