有没有一个例子可以说明如何在Rust中使用alto的minimp3?我尝试了一个非常基本的设置,但是alto的文档并没有什么帮助。
[dependencies]
minimp3 = "*"
alto = "*"
use minimp3::{Decoder, Frame, Error};
use alto::{Alto, Stereo};
use std::fs::File;
fn main() {
println!("Playback test");
let mut decoder = Decoder::new(File::open("damien.mp3").unwrap());
let alto = Alto::load_default().expect("shit");
for s in alto.enumerate_outputs() {
println!("Found device: {}", s.to_str().expect("shit"));
}
let device = alto.open(None).expect("can't no open"); // Opens the default audio device
let context = device.new_context(None).expect("cant create no contexto"); // Creates a default context
// Configure listener
context.set_position([1.0, 4.0, 5.0]);
context.set_velocity([2.5, 0.0, 0.0]);
context.set_orientation(([0.0, 0.0, 1.0], [0.0, 1.0, 0.0]));
let source = context.new_static_source().expect("busshit");
loop {
match decoder.next_frame() {
Ok(Frame { data, sample_rate, channels, .. }) => {
context.new_buffer::<Stereo<i16>, [i16]>(data, 44_100);
},
Err(Error::Eof) => break,
Err(e) => panic!("{:?}", e),
}
}
}
问题是在第28行,我不能匹配... data
到正确的类型。
context.new_buffer::<Stereo<i16>, [i16]>(data, 44_100);
我不知道该怎么做 data: B
应该是。
我会把它从:
context.new_buffer::<Stereo<i16>, [i16]>(data, 44_100);
改成
context.new_buffer::<Stereo<i16>, _>(data, sample_rate);
它要找的类型是 Vec<i16>
但你可以使用 _
来让它推断类型。
如果你使用的是StaticSource,你可能需要先读取整个mp3文件,然后再用 context.new_buffer
循环之后。
否则,你可以使用StreamingSource,然后用 source.queue_buffer
. 这里有一个很好的例子,它可以将初始的5个缓冲区排成队,然后在他们玩完后用新的缓冲区来补充。例子.