我正在尝试按照这个示例添加混响效果,但是当尝试播放水槽时
panic
。
thread '<unnamed>' panicked at /feelslikehome/.cargo/registry/src/index.crates.io-6f17d22bba15001f/rodio-0.19.0/src/conversions/channels.rs:100:13:
attempt to subtract with overflow
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
fatal runtime error: Rust panics must be rethrown
这就是我所做的:
// this is a function that returns (Mode, Sink, Stream) tuple
match Decoder::new(BufReader::new(file)) {
Ok(decoder) => {
let mode = get_mode(path);
if mode == Mode::Bass {
// Duration is just an arbitrary number, I tried 0, milliseconds, etc.
let reverb = decoder.buffered().reverb(Duration::from_secs(30), 1.0);
sink.append(reverb);
} else {
sink.append(decoder);
}
sink.pause();
Some((mode, sink, stream))
}
Err(e) => {
info!("Failed to create decoder: {:?}", e);
None
}
}
我怀疑调用
buffered()
是问题所在,但这是必需的,因为混响需要 clone
源。 unbuffered
解码器没有 API。当我马上尝试玩水槽时,也是panic
。
有什么指点吗?
使用链接的示例和您提供的代码,我尝试组合一个最小的可重现示例,但它正在使用示例歌曲。 您能检查一下链接的音频文件是否也发生这种情况吗?
use rodio::{Decoder, Source};
use std::io::BufReader;
use std::time::Duration;
fn main() {
let (_stream, handle) = rodio::OutputStream::try_default().unwrap();
let sink = rodio::Sink::try_new(&handle).unwrap();
let file = std::fs::File::open("assets/music.ogg").unwrap();
match Decoder::new(BufReader::new(file)) {
Ok(decoder) => {
let reverb = decoder.buffered().reverb(Duration::from_millis(70), 1.0);
sink.append(reverb);
}
Err(e) => {
panic!("Failed to create decoder: {:?}", e);
}
}
sink.sleep_until_end();
}