rustraight 0.5.2

A simple 2D game library for Rust, inspired by DXLib
// サウンド API の動作確認用サンプル。
// 必要アセット: 検証素材/sounds/{se_16bit.wav, se_8bit.wav, bgm.ogg, se.wav}
//
// 確認対象: load_sound / play_sound / stop_sound / set_volume / free_sound / free_all_sounds
//           WAV(16bit/8bit) と OGG Vorbis のデコード経路、非対応フォーマットの失敗ハンドリング

use rustraight::prelude::*;

fn asset(rel: &str) -> String {
    format!("{}/検証素材/{}", env!("CARGO_MANIFEST_DIR"), rel)
}

fn main() {
    init(WindowConfig {
        title: String::from("10_sound"),
        width: 700,
        height: 400,
        screen_width: 700,
        screen_height: 400,
        ..Default::default()
    });

    let se16 = load_sound(&asset("sounds/se_16bit.wav"));
    let se8  = load_sound(&asset("sounds/se_8bit.wav"));
    let bgm  = load_sound(&asset("sounds/bgm.ogg"));
    // se.wav は 32bit float PCM (WAVE_FORMAT_IEEE_FLOAT) 形式。
    // rustraight が対応するのは PCM 8/16-bit のみのため失敗する(戻り値 0)はず。
    let unsupported = load_sound(&asset("sounds/se.wav"));

    let mut bgm_playing = false;
    let mut bgm_volume = 1.0f32;
    let mut bgm_freed = false;

    while advance_frame() {
        draw_fill(MAIN_SCREEN, Color::rgb(15, 15, 20));

        draw_text(MAIN_SCREEN, 10, 10, format!("se_16bit handle={se16}  se_8bit handle={se8}  bgm handle={bgm}"), Color::WHITE);
        draw_text(MAIN_SCREEN, 10, 30, format!("se.wav(32bit float, 非対応) load_sound結果: {unsupported} (0=失敗のはず)"), Color::RED);

        draw_text(MAIN_SCREEN, 10, 70, "1: se_16bit再生  2: se_8bit再生  3: bgmループ再生/停止切替", Color::YELLOW);
        draw_text(MAIN_SCREEN, 10, 90, "+/-: bgm音量変更  F: free_sound(bgm)  A: free_all_sounds(不可逆)", Color::YELLOW);
        draw_text(MAIN_SCREEN, 10, 120, format!("bgm_playing={bgm_playing}  bgm_volume={bgm_volume:.2}  bgm_freed={bgm_freed}"), Color::GREEN);

        if is_just_pressed(KeyCode::Digit1) { play_sound(se16, false); log_info!("play_sound(se16, false)"); }
        if is_just_pressed(KeyCode::Digit2) { play_sound(se8, false); log_info!("play_sound(se8, false)"); }
        if is_just_pressed(KeyCode::Digit3) {
            bgm_playing = !bgm_playing;
            if bgm_playing { play_sound(bgm, true); } else { stop_sound(bgm); }
        }
        if is_just_pressed(KeyCode::Equal) { bgm_volume = (bgm_volume + 0.1).min(1.0); set_volume(bgm, bgm_volume); }
        if is_just_pressed(KeyCode::Minus) { bgm_volume = (bgm_volume - 0.1).max(0.0); set_volume(bgm, bgm_volume); }
        if is_just_pressed(KeyCode::KeyF) && !bgm_freed {
            free_sound(bgm);
            bgm_freed = true;
            bgm_playing = false;
        }
        if is_just_pressed(KeyCode::KeyA) {
            free_all_sounds();
            log_info!("free_all_sounds() 実行。以後このプロセス内では音声再生が一切効かなくなるはず");
        }
    }
}