play_audio_v01.rs
· 972 B · Rust
Raw
use mlua::prelude::*;
use std::fs::File;
use std::io::BufReader;
use rodio::{Decoder, OutputStream, Sink};
use std::time::Duration;
use futures_timer::Delay;
async fn play_local_file(lua: &Lua, (filepath, volume, duration): (String, f32, u64)) -> LuaResult<()> {
let (_stream, stream_handle) = OutputStream::try_default().unwrap();
let sink = Sink::try_new(&stream_handle).unwrap();
sink.set_volume(volume);
let file = BufReader::new(File::open(filepath).unwrap());
let source = Decoder::new(file).unwrap();
sink.append(source);
Delay::new(Duration::from_millis(duration)).await;
Ok(())
}
#[tokio::main]
#[mlua::lua_module]
async fn lua_audio(lua: &Lua) -> LuaResult<LuaTable> {
let exports = lua.create_table()?;
exports.set("play_from_file", lua.create_async_function(play_local_file)?)?;
Ok(exports)
}
#[mlua::lua_module]
fn rust_module_error(_: &Lua) -> LuaResult<LuaTable> {
Err("custom module error".to_lua_err())
}
| 1 | use mlua::prelude::*; |
| 2 | use std::fs::File; |
| 3 | use std::io::BufReader; |
| 4 | use rodio::{Decoder, OutputStream, Sink}; |
| 5 | use std::time::Duration; |
| 6 | use futures_timer::Delay; |
| 7 | |
| 8 | async fn play_local_file(lua: &Lua, (filepath, volume, duration): (String, f32, u64)) -> LuaResult<()> { |
| 9 | let (_stream, stream_handle) = OutputStream::try_default().unwrap(); |
| 10 | let sink = Sink::try_new(&stream_handle).unwrap(); |
| 11 | sink.set_volume(volume); |
| 12 | let file = BufReader::new(File::open(filepath).unwrap()); |
| 13 | let source = Decoder::new(file).unwrap(); |
| 14 | sink.append(source); |
| 15 | Delay::new(Duration::from_millis(duration)).await; |
| 16 | Ok(()) |
| 17 | } |
| 18 | |
| 19 | #[tokio::main] |
| 20 | #[mlua::lua_module] |
| 21 | async fn lua_audio(lua: &Lua) -> LuaResult<LuaTable> { |
| 22 | let exports = lua.create_table()?; |
| 23 | exports.set("play_from_file", lua.create_async_function(play_local_file)?)?; |
| 24 | Ok(exports) |
| 25 | } |
| 26 | |
| 27 | #[mlua::lua_module] |
| 28 | fn rust_module_error(_: &Lua) -> LuaResult<LuaTable> { |
| 29 | Err("custom module error".to_lua_err()) |
| 30 | } |