尝试使用混响效果玩 Sink 时,rodio 会出现恐慌

问题描述 投票:0回答:1

我正在尝试按照这个示例添加混响效果,但是当尝试播放水槽时

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

有什么指点吗?

rust audio rodio
1个回答
0
投票

使用链接的示例和您提供的代码,我尝试组合一个最小的可重现示例,但它正在使用示例歌曲。 您能检查一下链接的音频文件是否也发生这种情况吗?

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();
}
© www.soinside.com 2019 - 2024. All rights reserved.