mirror of
https://github.com/italicsjenga/agb.git
synced 2024-10-18 08:01:39 +11:00
43 lines
1 KiB
Rust
43 lines
1 KiB
Rust
|
use hound;
|
||
|
use proc_macro::TokenStream;
|
||
|
use quote::quote;
|
||
|
use std::path::Path;
|
||
|
use syn::parse_macro_input;
|
||
|
|
||
|
#[proc_macro]
|
||
|
pub fn include_wav(input: TokenStream) -> TokenStream {
|
||
|
let input = parse_macro_input!(input as syn::LitStr);
|
||
|
|
||
|
let filename = input.value();
|
||
|
|
||
|
let root = std::env::var("CARGO_MANIFEST_DIR").expect("Failed to get cargo manifest dir");
|
||
|
let path = Path::new(&root).join(&*filename);
|
||
|
|
||
|
let include_path = path.to_string_lossy();
|
||
|
|
||
|
let mut wav_reader = hound::WavReader::open(&path)
|
||
|
.unwrap_or_else(|_| panic!("Failed to load file {}", include_path));
|
||
|
|
||
|
assert_eq!(
|
||
|
wav_reader.spec().sample_rate,
|
||
|
10512,
|
||
|
"agb currently only supports sample rate of 10512Hz"
|
||
|
);
|
||
|
|
||
|
let samples = wav_reader
|
||
|
.samples::<i8>()
|
||
|
.map(|sample| sample.unwrap() as u8);
|
||
|
|
||
|
let result = quote! {
|
||
|
{
|
||
|
const _: &[u8] = include_bytes!(#include_path);
|
||
|
|
||
|
&[
|
||
|
#(#samples),*
|
||
|
]
|
||
|
}
|
||
|
};
|
||
|
|
||
|
TokenStream::from(result)
|
||
|
}
|