ggdt/examples/audio_playback/src/main.rs

99 lines
3 KiB
Rust
Raw Normal View History

2022-05-28 20:29:40 -04:00
use std::path::Path;
use anyhow::Result;
use sdl2::keyboard::Scancode;
use libretrogd::audio::*;
use libretrogd::graphics::*;
use libretrogd::system::*;
#[derive(Debug, Copy, Clone)]
struct AudioChannelStatus {
size: usize,
position: usize,
playing: bool
}
fn main() -> Result<()> {
let mut system = SystemBuilder::new().window_title("Audio Playback").vsync(true).build()?;
let mut is_running = true;
let sound1 = AudioBuffer::load_wav_file(Path::new("./assets/pickup-coin.wav"))?;
let sound2 = AudioBuffer::load_wav_file(Path::new("./assets/powerup.wav"))?;
let sound3 = AudioBuffer::load_wav_file(Path::new("./assets/explosion.wav"))?;
let sound4 = AudioBuffer::load_wav_file(Path::new("./assets/jump.wav"))?;
let sound5 = AudioBuffer::load_wav_file(Path::new("./assets/laser-shoot.wav"))?;
let mut statuses = [AudioChannelStatus { size: 0, position: 0, playing: false }; NUM_CHANNELS];
while is_running {
system.do_events_with(|event| {
if let sdl2::event::Event::Quit { .. } = event {
is_running = false;
}
});
let mut audio_device = system.audio.lock();
if system.keyboard.is_key_pressed(Scancode::Escape) {
is_running = false;
}
if system.keyboard.is_key_pressed(Scancode::Num1) {
audio_device.play_buffer(&sound1, false)?;
2022-05-28 20:29:40 -04:00
}
if system.keyboard.is_key_pressed(Scancode::Num2) {
audio_device.play_buffer(&sound2, false)?;
2022-05-28 20:29:40 -04:00
}
if system.keyboard.is_key_pressed(Scancode::Num3) {
audio_device.play_buffer(&sound3, false)?;
2022-05-28 20:29:40 -04:00
}
if system.keyboard.is_key_pressed(Scancode::Num4) {
audio_device.play_buffer(&sound4, false)?;
2022-05-28 20:29:40 -04:00
}
if system.keyboard.is_key_pressed(Scancode::Num5) {
audio_device.play_buffer(&sound5, false)?;
2022-05-28 20:29:40 -04:00
}
for index in 0..NUM_CHANNELS {
let channel = &audio_device[index];
let mut status = &mut statuses[index];
status.playing = channel.playing;
status.position = channel.position;
status.size = channel.data.len();
}
drop(audio_device);
system.video.clear(0);
system.video.print_string("Audio Channels", 16, 16, FontRenderOpts::Color(14), &system.font);
let mut y = 32;
for index in 0..NUM_CHANNELS {
let status = &statuses[index];
system.video.print_string(
&format!(
"channel {} - {} {}",
index,
if status.playing { "playing" } else { "not playing" },
if status.playing { String::from(format!("{} / {}", status.position, status.size)) } else { String::new() }
),
16, y,
FontRenderOpts::Color(15),
&system.font
);
y += 16;
}
system.display()?;
}
Ok(())
}