Skip to content

Buffered is silent with no errors. #839

@kitsuvm

Description

@kitsuvm

I'm using Windows 11, rodio is working normally without Buffered.

//builtin.rs

pub fn preload() {
    log("Loading built-in looped audio...");
    let _ = &BUILTIN_LOOP_SOURCES;
    log("Built-in looped audio loaded.");
}

pub static BUILTIN_LOOP_SOURCES: LazyLock<
    HashMap<&'static str, Buffered<LoopedDecoder<Cursor<&'static [u8]>>>>,
> = LazyLock::new(|| load("Looped", BUILTIN_LOOP_AUDIOS, Decoder::new_looped));


pub fn load<T: Source>(
    audio_type: &str,
    list: &'static [(&str, &[u8])],
    func: fn(Cursor<&'static [u8]>) -> Result<T, DecoderError>,
) -> HashMap<&'static str, Buffered<T>> {
    let mut map = HashMap::new();

    for (name, bytes) in list.iter() {
        let cursor = Cursor::new(*bytes);
        let decoder = match func(cursor) {
            Ok(decoder) => {
                log(&format!("Loaded built-in {} audio: {}", audio_type, name));
                decoder
            }
            Err(err) => {
                log_error(&format!(
                    "Failed to load built-in {} audio {}: {}",
                    audio_type, name, err
                ));
                continue;
            }
        };

        map.insert(*name, decoder.buffered());
    }

    map
}

pub static BUILTIN_LOOP_AUDIOS: &[(&str, &[u8])] =
    &[("domingo", DOMINGO_AUDIO), ("kitty", KITTY_AUDIO)];


pub static DOMINGO_AUDIO: &[u8] = include_bytes!("../../assets/domingo.ogg");
pub static KITTY_AUDIO: &[u8] = include_bytes!("../../assets/kitty.ogg");
//engine.rs
pub struct AudioEngine {
    _stream_handle: OutputStream,
    background_sink: Sink,
}

impl AudioEngine {
    pub fn new() -> Result<Self, Error> {
        let mut stream_handle = OutputStreamBuilder::open_default_stream()?;

        stream_handle.log_on_drop(DEBUGGER.enabled);

        let background_sink = Sink::connect_new(stream_handle.mixer());

        Ok(Self {
            _stream_handle: stream_handle,
            background_sink,
        })
    }

    pub fn play_looped<T: Source + Send + 'static>(
        &self,
        name: &str,
        source: T,
    ) -> Result<(), DecoderError> {
        log(&format!("Playing looped audio: {name}"));

        self.background_sink.append(source);
        let sink_len = self.background_sink.len();
        log(&format!("Background sink length: {}", sink_len));
        for _ in 1..sink_len {
            log(&format!("Skipping one in background sink..."));
            self.background_sink.skip_one();
        }

        Ok(())
    }

    pub fn get_builtin_looped(
        &self,
        name: &str,
    ) -> Option<Buffered<LoopedDecoder<Cursor<&'static [u8]>>>> {
        match BUILTIN_LOOP_SOURCES.get(name) {
            Some(audio) => Some(audio.clone()),
            None => {
                log_error(&format!("Builtin looped audio {} not found!", name));
                None
            }
        }
    }

    pub fn play_domingo(&self) {
        let Some(domingo) = self.get_builtin_looped("domingo") else {
            return;
        };

        let _ = self
            .play_looped("builtin::DOMINGO", domingo)
            .inspect_err(|e| log_error(&format!("Can't play builtin DOMINGO: {}", e)));
    }

    pub fn play_kitty(&self) {
        let Some(kitty) = self.get_builtin_looped("kitty") else {
            return;
        };

        let _ = self
            .play_looped("builtin::KITTY", kitty)
            .inspect_err(|e| log_error(&format!("Can't play builtin KITTY: {}", e)));
    }
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions