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 | } |