use std::{io::BufReader, sync::Arc};
use super::*;
use rodio::{Decoder, OutputStream, Sink};
pub struct Multimedia;
impl Module for Multimedia {
async fn load(&self, state: &mut State) -> Result<(), LuaError> {
let module = state.lua.create_table()?;
module.set(
"play_sound",
state.lua.create_function(|_, path: String| {
let (_stream, stream_handle) = match OutputStream::try_default() {
Ok(r) => r,
Err(e) => return Err(LuaError::external(Arc::new(e))),
};
let sink = match Sink::try_new(&stream_handle) {
Ok(r) => r,
Err(e) => return Err(LuaError::external(Arc::new(e))),
};
let f = BufReader::new(File::open(path)?);
let source = match Decoder::new(f) {
Ok(r) => r,
Err(e) => return Err(LuaError::external(Arc::new(e))),
};
sink.append(source);
sink.sleep_until_end();
Ok(())
})?,
)?;
create_module(&state.lua, "autosway.multimedia", module)?;
Ok(())
}
}