From ecbb7c6756f63dafd3949e47682bea7e89aff0bc Mon Sep 17 00:00:00 2001 From: Theis Pieter Hollebeek Date: Mon, 3 Mar 2025 17:48:27 +0100 Subject: [PATCH] muting audio --- src/gui/audio.rs | 47 ++++++++++++++++++++++++++++++++++++----------- src/gui/render.rs | 13 ++++++++++--- 2 files changed, 46 insertions(+), 14 deletions(-) diff --git a/src/gui/audio.rs b/src/gui/audio.rs index d850184..b27e288 100644 --- a/src/gui/audio.rs +++ b/src/gui/audio.rs @@ -12,34 +12,59 @@ fn source_from_path>(path: P) -> Decoder>( stream_handle: &OutputStreamHandle, - sink: &mut Sink, + sink: &mut Option, path: P, volume: f32, ) { let source = source_from_path(path); - *sink = Sink::try_new(&stream_handle).unwrap(); - sink.set_volume(volume); - sink.append(source); + *sink = Sink::try_new(&stream_handle).ok(); + if let Some(sink) = sink { + sink.set_volume(volume); + sink.append(source); + } } -pub fn audio_thread() -> mpsc::Sender { - let (sender, receiver) = mpsc::channel(); +pub enum Command { + ToggleMuted, + PlayEffect(SoundEffect), +} + +pub fn audio_thread() -> mpsc::Sender { + let (sender, receiver) = mpsc::channel::(); let _ = std::thread::spawn(move || { let (_stream, stream_handle) = OutputStream::try_default().unwrap(); let music_sink = Sink::try_new(&stream_handle).unwrap(); - let mut hard_drop_sink = Sink::try_new(&stream_handle).unwrap(); - let mut line_clear_sink = Sink::try_new(&stream_handle).unwrap(); - let mut move_sink = Sink::try_new(&stream_handle).unwrap(); - let mut rotation_sink = Sink::try_new(&stream_handle).unwrap(); + let mut hard_drop_sink = None; + let mut line_clear_sink = None; + let mut move_sink = None; + let mut rotation_sink = None; + let mut muted = false; music_sink.append(source_from_path("resources/music.ogg").repeat_infinite()); loop { - let Ok(effect) = receiver.recv() else { + let Ok(cmd) = receiver.recv() else { break; }; + let effect = match cmd { + Command::ToggleMuted => { + muted = !muted; + if muted { + music_sink.pause(); + } else { + music_sink.play(); + } + continue; + } + Command::PlayEffect(effect) => effect, + }; + + if muted { + continue; + } + let base_volume = 0.5; match effect { SoundEffect::HardDrop => play_audio( diff --git a/src/gui/render.rs b/src/gui/render.rs index 504e472..9936428 100644 --- a/src/gui/render.rs +++ b/src/gui/render.rs @@ -191,6 +191,11 @@ pub fn start_game() -> Result<(), String> { game = Game::new(); continue; } + Keycode::M => { + audio_thread.send(audio::Command::ToggleMuted).unwrap(); + continue; + } + Keycode::P => { paused = !paused; continue; @@ -242,9 +247,11 @@ pub fn start_game() -> Result<(), String> { )?; } else { let effects = game.step(&actions); - effects - .into_iter() - .for_each(|effect| audio_thread.send(effect).unwrap()); + effects.into_iter().for_each(|effect| { + audio_thread + .send(audio::Command::PlayEffect(effect)) + .unwrap() + }); } canvas.present();