deltaphc / raylib-rs

Rust bindings for raylib
Other
751 stars 134 forks source link

streaming audio output stuttering #188

Open Frank-Buss opened 4 months ago

Frank-Buss commented 4 months ago

This code should create a sine wave, but stutters (tested on Linux) :

use raylib::{ffi::SetAudioStreamBufferSizeDefault, prelude::*};
use std::f32::consts::PI;
use raylib::prelude::RaylibAudio;

fn main() {
    let (mut rl, thread) = raylib::init()
        .size(800, 450)
        .title("raylib example - raw audio streaming")
        .build();

    rl.set_target_fps(30);
    unsafe { SetAudioStreamBufferSizeDefault(4096) };
    let mut audio = RaylibAudio::init_audio_device();
    let sample_rate = 44100;
    let sample_size = 16;
    let channels = 1;
    let mut audio_stream = AudioStream::init_audio_stream(&thread, sample_rate, sample_size, channels);
    audio.play_audio_stream(&mut audio_stream);
    let mut frequency = 440.0;
    let mut sine_wave = vec![0i16; 1024];
    let mut gt = 0;
    while !rl.window_should_close() {
        if audio.is_audio_stream_processed(&audio_stream) {
            audio_stream.update_audio_stream(&mut sine_wave);
            for sample in sine_wave.iter_mut() {
                let t = gt as f32 / sample_rate as f32;
                gt += 1;
                *sample = ((t * frequency * 2.0 * PI).sin() * i16::MAX as f32) as i16;
            }
        }
        if rl.is_mouse_button_down(MouseButton::MOUSE_LEFT_BUTTON) {
            let mouse_position = rl.get_mouse_position();
            frequency = 40.0 + mouse_position.y / 450.0 * 880.0;  // Modify frequency based on mouse Y position
        }
        let mut d = rl.begin_drawing(&thread);
        d.clear_background(Color::RAYWHITE);
        d.draw_text(&format!("Frequency: {:.2} Hz", frequency), 10, 20, 20, Color::DARKGRAY);
    }
}