dash and wgui sounds

This commit is contained in:
Aleksander
2026-01-03 15:00:31 +01:00
parent 383bf3b11f
commit feba52c28f
34 changed files with 258 additions and 96 deletions

View File

@@ -16,6 +16,7 @@ serde = { workspace = true, features = ["rc"] }
xdg.workspace = true
chrono = "0.4.42"
smol = "2.0.2"
wgui = { path = "../wgui/" }
rodio = { version = "0.21.1", default-features = false, features = [
"playback",
"mp3",

View File

@@ -1,6 +1,10 @@
use std::{collections::HashMap, io::Cursor};
use rodio::Source;
use wgui::{
assets::{self, AssetProvider},
sound::WguiSoundType,
};
pub struct AudioSystem {
audio_stream: Option<rodio::OutputStream>,
@@ -15,6 +19,14 @@ pub struct SamplePlayer {
samples: HashMap<String, AudioSample>,
}
fn get_sample_name_from_wgui_sound_type(sound: WguiSoundType) -> &'static str {
match sound {
WguiSoundType::ButtonMouseEnter => "wgui_mouse_enter",
WguiSoundType::ButtonPress => "wgui_button_press",
WguiSoundType::ButtonRelease => "wgui_button_release",
}
}
impl SamplePlayer {
pub fn new() -> Self {
Self {
@@ -23,9 +35,39 @@ impl SamplePlayer {
}
pub fn register_sample(&mut self, sample_name: &str, sample: AudioSample) {
log::debug!("registering audio sample \"{sample_name}\"");
self.samples.insert(String::from(sample_name), sample);
}
pub fn register_mp3_sample_from_assets(
&mut self,
sample_name: &str,
assets: &mut dyn AssetProvider,
path: &str,
) -> anyhow::Result<()> {
// load only once
if self.samples.contains_key(sample_name) {
return Ok(());
}
let data = assets.load_from_path(path)?;
self.register_sample(sample_name, AudioSample::from_mp3(&data)?);
Ok(())
}
pub fn register_wgui_samples(&mut self, assets: &mut dyn AssetProvider) -> anyhow::Result<()> {
let mut load = |sound: WguiSoundType| -> anyhow::Result<()> {
let sample_name = get_sample_name_from_wgui_sound_type(sound);
self.register_mp3_sample_from_assets(sample_name, assets, &format!("sound/{}.mp3", sample_name))
};
load(WguiSoundType::ButtonPress)?;
load(WguiSoundType::ButtonRelease)?;
load(WguiSoundType::ButtonMouseEnter)?;
Ok(())
}
pub fn play_sample(&mut self, system: &mut AudioSystem, sample_name: &str) {
let Some(sample) = self.samples.get(sample_name) else {
log::error!("failed to play sample by name {}", sample_name);
@@ -34,6 +76,12 @@ impl SamplePlayer {
system.play_sample(sample);
}
pub fn play_wgui_samples(&mut self, system: &mut AudioSystem, samples: Vec<WguiSoundType>) {
for sample in samples {
self.play_sample(system, get_sample_name_from_wgui_sound_type(sample));
}
}
}
impl Default for SamplePlayer {