From 52445b9ba050aba9ba1ee96bf9b2c69ec891fe80 Mon Sep 17 00:00:00 2001 From: Fabio Lenherr / DashieTM Date: Sat, 18 Nov 2023 15:08:56 +0100 Subject: [PATCH] fix: Use buffer for sending volume updates --- src/components/input/outputStreamEntry.rs | 3 +++ src/components/input/sourceBox.rs | 14 ++++++---- src/components/input/sourceEntry.rs | 3 +++ src/components/output/inputStreamEntry.rs | 13 ++++++++-- src/components/output/inputStreamEntryImpl.rs | 2 ++ src/components/output/sinkBox.rs | 26 ++++++++++++++++--- src/resources/resetInputStreamEntry.ui | 5 +++- src/resources/resetUI.cmb | 11 +++++--- 8 files changed, 61 insertions(+), 16 deletions(-) diff --git a/src/components/input/outputStreamEntry.rs b/src/components/input/outputStreamEntry.rs index afff09f..ac9025e 100644 --- a/src/components/input/outputStreamEntry.rs +++ b/src/components/input/outputStreamEntry.rs @@ -20,6 +20,9 @@ glib::wrapper! { @implements gtk::Accessible, gtk::Buildable, gtk::ConstraintTarget, gtk::Orientable; } +unsafe impl Send for OutputStreamEntry {} +unsafe impl Sync for OutputStreamEntry {} + impl OutputStreamEntry { pub fn new(source_box: Arc, stream: OutputStream) -> Self { let obj: Self = Object::builder().build(); diff --git a/src/components/input/sourceBox.rs b/src/components/input/sourceBox.rs index 2bf3353..7e9e0de 100644 --- a/src/components/input/sourceBox.rs +++ b/src/components/input/sourceBox.rs @@ -192,9 +192,10 @@ pub fn populate_outputstreams(input_box: Arc) { for stream in streams { let index = stream.index; let input_stream = Arc::new(OutputStreamEntry::new(input_box.clone(), stream)); + let input_stream_clone = input_stream.clone(); let entry = Arc::new(ListEntry::new(&*input_stream)); entry.set_activatable(false); - list.insert(index, (entry.clone(), input_stream.clone())); + list.insert(index, (entry.clone(), input_stream_clone)); input_box_imp.resetOutputStreams.append(&*entry); } }); @@ -352,7 +353,9 @@ pub fn start_input_box_listener( let mut map = output_box_imp.resetSourceMap.write().unwrap(); map.remove(&alias.unwrap().2); let mut index = output_box_imp.resetModelIndex.write().unwrap(); - *index -= 1; + if *index != 0 { + *index -= 1; + } }); }); true @@ -406,9 +409,10 @@ pub fn start_input_box_listener( let mut list = output_box_imp.resetOutputStreamList.write().unwrap(); let index = ir.stream.index; let output_stream = Arc::new(OutputStreamEntry::new(output_box.clone(), ir.stream)); + let output_stream_clone = output_stream.clone(); let entry = Arc::new(ListEntry::new(&*output_stream)); entry.set_activatable(false); - list.insert(index, (entry.clone(), output_stream.clone())); + list.insert(index, (entry.clone(), output_stream_clone)); output_box_imp.resetOutputStreams.append(&*entry); }); }); @@ -486,12 +490,12 @@ pub fn start_input_box_listener( let output_box = source_box.clone(); let output_box_imp = output_box.imp(); let mut list = output_box_imp.resetOutputStreamList.write().unwrap(); - let entry = list.get(&ir.index); + let entry = list.remove(&ir.index); if entry.is_none() { + println!("tried to remove nonexistant?? wat"); return; } output_box_imp.resetOutputStreams.remove(&*entry.unwrap().0); - list.remove(&ir.index); }); }); true diff --git a/src/components/input/sourceEntry.rs b/src/components/input/sourceEntry.rs index 067c63b..0e8a082 100644 --- a/src/components/input/sourceEntry.rs +++ b/src/components/input/sourceEntry.rs @@ -19,6 +19,9 @@ glib::wrapper! { @implements gtk::Accessible, gtk::Buildable, gtk::ConstraintTarget, gtk::Orientable; } +unsafe impl Send for SourceEntry {} +unsafe impl Sync for SourceEntry {} + impl SourceEntry { pub fn new(is_default: bool, check_group: Arc, stream: Source) -> Self { let obj: Self = Object::builder().build(); diff --git a/src/components/output/inputStreamEntry.rs b/src/components/output/inputStreamEntry.rs index bfd69ae..5509048 100644 --- a/src/components/output/inputStreamEntry.rs +++ b/src/components/output/inputStreamEntry.rs @@ -1,5 +1,6 @@ +use std::cell::RefCell; use std::sync::Arc; -use std::time::Duration; +use std::time::{Duration, SystemTime}; use adw::glib; use adw::glib::Object; @@ -8,7 +9,8 @@ use dbus::blocking::Connection; use dbus::Error; use glib::subclass::types::ObjectSubclassIsExt; use glib::{clone, Cast, Propagation}; -use gtk::{gio, StringObject}; +use gtk::prelude::ScaleExt; +use gtk::{gio, PositionType, StringObject}; use ReSet_Lib::audio::audio::InputStream; use super::inputStreamEntryImpl; @@ -59,6 +61,13 @@ impl InputStreamEntry { let stream = stream.unwrap(); let index = stream.index; let channels = stream.channels; + { + let mut time = imp.volumeTimeStamp.borrow_mut(); + if time.is_some() && time.unwrap().elapsed().unwrap() < Duration::from_millis(50) { + return Propagation::Proceed; + } + *time = Some(SystemTime::now()); + } set_inputstream_volume(value, index, channels); Propagation::Proceed }), diff --git a/src/components/output/inputStreamEntryImpl.rs b/src/components/output/inputStreamEntryImpl.rs index 29ec348..b42e0db 100644 --- a/src/components/output/inputStreamEntryImpl.rs +++ b/src/components/output/inputStreamEntryImpl.rs @@ -1,5 +1,6 @@ use std::cell::RefCell; use std::sync::Arc; +use std::time::SystemTime; use gtk::subclass::prelude::*; use gtk::{glib, Button, CompositeTemplate, DropDown, Label, ProgressBar, Scale}; @@ -25,6 +26,7 @@ pub struct InputStreamEntry { pub resetVolumeMeter: TemplateChild, pub stream: Arc>, pub associatedSink: Arc>, + pub volumeTimeStamp: RefCell>, } #[glib::object_subclass] diff --git a/src/components/output/sinkBox.rs b/src/components/output/sinkBox.rs index 88c9a81..55b5f72 100644 --- a/src/components/output/sinkBox.rs +++ b/src/components/output/sinkBox.rs @@ -35,7 +35,13 @@ unsafe impl Sync for SinkBox {} impl SinkBox { pub fn new() -> Self { - Object::builder().build() + let obj: Self = Object::builder().build(); + { + let imp = obj.imp(); + let mut model_index = imp.resetModelIndex.write().unwrap(); + *model_index = 0; + } + obj } pub fn setupCallbacks(&self) { @@ -53,6 +59,12 @@ impl SinkBox { } } +impl Default for SinkBox { + fn default() -> Self { + Self::new() + } +} + pub fn populate_sinks(output_box: Arc) { gio::spawn_blocking(move || { let output_box_ref = output_box.clone(); @@ -81,7 +93,7 @@ pub fn populate_sinks(output_box: Arc) { let default_sink = output_box_imp.resetDefaultSink.clone(); let sink = default_sink.borrow(); - let volume = sink.volume.first().unwrap_or_else(|| &(0 as u32)); + let volume = sink.volume.first().unwrap_or(&0); let fraction = (*volume as f64 / 655.36).round(); let percentage = (fraction).to_string() + "%"; output_box_imp.resetVolumePercentage.set_text(&percentage); @@ -239,7 +251,11 @@ fn get_default_sink() -> Sink { res.unwrap().0 } -pub fn start_output_box_listener(conn: Connection, listeners: Arc, sink_box: Arc) -> Connection { +pub fn start_output_box_listener( + conn: Connection, + listeners: Arc, + sink_box: Arc, +) -> Connection { if listeners.network_listener.load(Ordering::SeqCst) { return conn; } @@ -339,7 +355,9 @@ pub fn start_output_box_listener(conn: Connection, listeners: Arc, si let mut map = output_box_imp.resetSinkMap.write().unwrap(); map.remove(&alias.unwrap().2); let mut index = output_box_imp.resetModelIndex.write().unwrap(); - *index -= 1; + if *index != 0 { + *index -= 1; + } }); }); true diff --git a/src/resources/resetInputStreamEntry.ui b/src/resources/resetInputStreamEntry.ui index 42b0929..925133c 100644 --- a/src/resources/resetInputStreamEntry.ui +++ b/src/resources/resetInputStreamEntry.ui @@ -42,7 +42,7 @@ - 2005.4016 + 10000.0 2005.4016 100270.08 @@ -50,6 +50,9 @@ True center bottom + + 100% + diff --git a/src/resources/resetUI.cmb b/src/resources/resetUI.cmb index 4704a10..afcce47 100644 --- a/src/resources/resetUI.cmb +++ b/src/resources/resetUI.cmb @@ -438,7 +438,7 @@ (7,9,"GtkScale","value-pos","bottom",None,None,None,None,None,None,None,None,None), (7,9,"GtkWidget","hexpand","True",None,None,None,None,None,None,None,None,None), (7,9,"GtkWidget","valign","center",None,None,None,None,None,None,None,None,None), - (7,10,"GtkAdjustment","page-increment","2005.4016",None,None,None,None,None,None,None,None,None), + (7,10,"GtkAdjustment","page-increment","10000.0",None,None,None,None,None,None,None,None,None), (7,10,"GtkAdjustment","step-increment","2005.4016",None,None,None,None,None,None,None,None,None), (7,10,"GtkAdjustment","upper","100270.08",None,None,None,None,None,None,None,None,None), (7,11,"GtkButton","icon-name","audio-volume-high-symbolic",None,None,None,None,None,None,None,None,None), @@ -798,10 +798,13 @@ (3,42,"GtkWidget",1,1,None,None,None,None,None,None), - (3,42,"GtkWidget",2,2,None,1,None,None,None,None) + (3,42,"GtkWidget",2,2,None,1,None,None,None,None), + (7,9,"GtkScale",1,1,None,None,None,None,None,None), + (7,9,"GtkScale",2,2,"100%",1,None,None,None,None) - (7,9,"GtkScale",2,2,"value","50.0"), - (3,42,"GtkWidget",2,2,"name","b") + (7,9,"GtkScale",2,2,"value","65536.0"), + (3,42,"GtkWidget",2,2,"name","b"), + (7,9,"GtkScale",2,2,"position","bottom")