From 88e40cd27a5a9ec3d3bd84973f75d782dea5bc5a Mon Sep 17 00:00:00 2001 From: 409 Date: Sat, 29 Jun 2024 13:41:59 +0200 Subject: [PATCH 1/4] fix: crash when an instruction is issed while there are no sink inputs --- src/mixer.rs | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/mixer.rs b/src/mixer.rs index aaa698f..e9f2643 100644 --- a/src/mixer.rs +++ b/src/mixer.rs @@ -303,6 +303,12 @@ impl Mixer { pub fn select_next(&mut self) { let mut index_lock = self.selected_index.lock().unwrap(); + let sink_input_len = self.sink_inputs.len(); + if sink_input_len == 0 { + *index_lock = None; + return; + } + match *index_lock { Some(current_index) => { let new_index: usize = @@ -328,6 +334,12 @@ impl Mixer { pub fn select_previous(&mut self) { let mut index_lock = self.selected_index.lock().unwrap(); + let sink_input_len = self.sink_inputs.len(); + if sink_input_len == 0 { + *index_lock = None; + return; + } + match *index_lock { Some(current_index) => { let new_index: usize = match current_index.overflowing_sub(1) { From 389c8f8ebeb4f503e322fb739cb211506186a508 Mon Sep 17 00:00:00 2001 From: 409 Date: Sat, 29 Jun 2024 13:42:41 +0200 Subject: [PATCH 2/4] feat: show current sink input number and sink input length in notification --- src/mixer.rs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/mixer.rs b/src/mixer.rs index e9f2643..2959b13 100644 --- a/src/mixer.rs +++ b/src/mixer.rs @@ -487,10 +487,14 @@ impl Mixer { return; }; + let sink_inputs_length = self.sink_inputs.len(); let current_sink = &self.sink_inputs.get(&sink_index).unwrap(); let current_sink_volume_percent = current_sink.get_volume_percent(); let _ = send_notification_with_progress( - &format!("{}: {}%", ¤t_sink.name, current_sink_volume_percent), + &format!( + "({}/{}) {}: {}%", + index + 1, sink_inputs_length, ¤t_sink.name, current_sink_volume_percent + ), current_sink_volume_percent, ); } From 638eded2825260be309c610aca0aa8e7bd0ae5df Mon Sep 17 00:00:00 2001 From: 409 Date: Sat, 29 Jun 2024 13:43:27 +0200 Subject: [PATCH 3/4] fix: ignore mono sink inputs (this would lead to duplicates sometimes) --- src/mixer.rs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/mixer.rs b/src/mixer.rs index 2959b13..8901a42 100644 --- a/src/mixer.rs +++ b/src/mixer.rs @@ -209,6 +209,10 @@ impl Mixer { .borrow_mut() .get_sink_input_info(sink_index, move |r| { if let ListResult::Item(sink_input) = r { + if sink_input.channel_map.len() == 1 { + return; + } + *operation_result.lock().unwrap() = Some(SinkInputMixerData { name: get_sink_input_name(sink_input).unwrap(), volume: sink_input.volume.avg().0, From 39f1148cad97ca1d41838b0fb90dbb9b6762392c Mon Sep 17 00:00:00 2001 From: 409 Date: Sat, 29 Jun 2024 13:44:42 +0200 Subject: [PATCH 4/4] fix: crash when a sink input was removed --- src/mixer.rs | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/src/mixer.rs b/src/mixer.rs index 8901a42..f5d6266 100644 --- a/src/mixer.rs +++ b/src/mixer.rs @@ -238,20 +238,18 @@ impl Mixer { Some(current_index) => { drop(selected_index_lock); - let removed_sink_input_index = self - .sink_inputs - .keys() - .position(|k| *k == sink_index) - .unwrap(); + if let Some(removed_sink_input_index) = + self.sink_inputs.keys().position(|k| *k == sink_index) + { + let current_key = + *self.sink_inputs.keys().nth(current_index).unwrap(); - let current_key = - *self.sink_inputs.keys().nth(current_index).unwrap(); - - if self.sink_inputs.remove(&sink_index).is_some() { - if sink_index == current_key - || removed_sink_input_index > current_index - { - self.select_previous(); + if self.sink_inputs.remove(&sink_index).is_some() { + if sink_index == current_key + || removed_sink_input_index > current_index + { + self.select_previous(); + } } } }