From 2de51f7a488c432c290669553e736583fd859b98 Mon Sep 17 00:00:00 2001 From: CrispyPin Date: Wed, 18 Jan 2023 23:09:59 +0100 Subject: [PATCH] set channel volumes from menu --- src/main.rs | 36 ++++++++++++++++++++++++------------ src/sound.rs | 18 +++++++++++++++++- 2 files changed, 41 insertions(+), 13 deletions(-) diff --git a/src/main.rs b/src/main.rs index 642cb20..e1dfa4e 100644 --- a/src/main.rs +++ b/src/main.rs @@ -26,7 +26,7 @@ struct UIChannel { struct App { channels: Vec, - selected_channel: usize, + selected_index: usize, _stream: OutputStream, stream_handle: OutputStreamHandle, quit: bool, @@ -38,7 +38,7 @@ impl App { .expect("Failed to create output stream"); Self { channels: Vec::new(), - selected_channel: 0, + selected_index: 0, _stream, stream_handle, quit: false, @@ -85,7 +85,7 @@ impl App { for (i, channel) in self.channels.iter().enumerate() { println!( "{}{}:\n {:.0}", - if i == self.selected_channel { ">" } else { " " }, + if i == self.selected_index { ">" } else { " " }, &channel.name, (channel.volume * 100.0) ); @@ -106,16 +106,28 @@ impl App { match event.code { KeyCode::Char('q') => self.quit = true, - KeyCode::Up => { - self.selected_channel = match self.selected_channel { - 0 => self.channels.len() - 1, - n => n - 1, - }; - } - KeyCode::Down => { - self.selected_channel = (self.selected_channel + 1) % self.channels.len(); - } + KeyCode::Up => self.select_prev(), + KeyCode::Down => self.select_next(), + KeyCode::Right => self.set_channel_volume(0.1), + KeyCode::Left => self.set_channel_volume(-0.1), _ => (), } } + + fn set_channel_volume(&mut self, delta: f32) { + let channel = self.channels.get_mut(self.selected_index).unwrap(); + channel.volume = (channel.volume + delta).clamp(0., 2.); + *channel.internal_volume.lock().unwrap() = channel.volume; + } + + fn select_prev(&mut self) { + self.selected_index = match self.selected_index { + 0 => self.channels.len() - 1, + n => n - 1, + }; + } + + fn select_next(&mut self) { + self.selected_index = (self.selected_index + 1) % self.channels.len(); + } } diff --git a/src/sound.rs b/src/sound.rs index 732a987..e62a009 100644 --- a/src/sound.rs +++ b/src/sound.rs @@ -7,6 +7,8 @@ use std::time::Duration; pub struct Snoud { channels: Vec, sample_rate: u32, + sync_rate: u32, + since_sync: u32, } struct SoundChannel { @@ -35,6 +37,11 @@ impl Iterator for Snoud { type Item = i16; fn next(&mut self) -> Option { + self.since_sync += 1; + if self.since_sync == self.sync_rate { + self.since_sync = 0; + self.sync(); + } let mut out: Self::Item = 0; for c in &mut self.channels { if c.paused { @@ -66,9 +73,12 @@ impl Source for Snoud { impl Snoud { pub fn new(/* filenames: &[String] */) -> Self { // let channels = filenames.iter().map(SoundChannel::new).collect(); + let sample_rate = 48000; Self { - sample_rate: 48000, + sample_rate, channels: Vec::new(), + sync_rate: sample_rate / 20, + since_sync: 0, } } @@ -78,4 +88,10 @@ impl Snoud { self.channels.push(new); volume_sync } + + fn sync(&mut self) { + for c in &mut self.channels { + c.volume = *c.volume_sync.lock().unwrap(); + } + } }