mirror of
https://github.com/Xetibo/ReSet.git
synced 2025-04-17 18:18:34 +02:00
fix: Use buffer for sending volume updates
This commit is contained in:
parent
67f3457e3a
commit
52445b9ba0
|
@ -20,6 +20,9 @@ glib::wrapper! {
|
||||||
@implements gtk::Accessible, gtk::Buildable, gtk::ConstraintTarget, gtk::Orientable;
|
@implements gtk::Accessible, gtk::Buildable, gtk::ConstraintTarget, gtk::Orientable;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
unsafe impl Send for OutputStreamEntry {}
|
||||||
|
unsafe impl Sync for OutputStreamEntry {}
|
||||||
|
|
||||||
impl OutputStreamEntry {
|
impl OutputStreamEntry {
|
||||||
pub fn new(source_box: Arc<SourceBox>, stream: OutputStream) -> Self {
|
pub fn new(source_box: Arc<SourceBox>, stream: OutputStream) -> Self {
|
||||||
let obj: Self = Object::builder().build();
|
let obj: Self = Object::builder().build();
|
||||||
|
|
|
@ -192,9 +192,10 @@ pub fn populate_outputstreams(input_box: Arc<SourceBox>) {
|
||||||
for stream in streams {
|
for stream in streams {
|
||||||
let index = stream.index;
|
let index = stream.index;
|
||||||
let input_stream = Arc::new(OutputStreamEntry::new(input_box.clone(), stream));
|
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));
|
let entry = Arc::new(ListEntry::new(&*input_stream));
|
||||||
entry.set_activatable(false);
|
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);
|
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();
|
let mut map = output_box_imp.resetSourceMap.write().unwrap();
|
||||||
map.remove(&alias.unwrap().2);
|
map.remove(&alias.unwrap().2);
|
||||||
let mut index = output_box_imp.resetModelIndex.write().unwrap();
|
let mut index = output_box_imp.resetModelIndex.write().unwrap();
|
||||||
*index -= 1;
|
if *index != 0 {
|
||||||
|
*index -= 1;
|
||||||
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
true
|
true
|
||||||
|
@ -406,9 +409,10 @@ pub fn start_input_box_listener(
|
||||||
let mut list = output_box_imp.resetOutputStreamList.write().unwrap();
|
let mut list = output_box_imp.resetOutputStreamList.write().unwrap();
|
||||||
let index = ir.stream.index;
|
let index = ir.stream.index;
|
||||||
let output_stream = Arc::new(OutputStreamEntry::new(output_box.clone(), ir.stream));
|
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));
|
let entry = Arc::new(ListEntry::new(&*output_stream));
|
||||||
entry.set_activatable(false);
|
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);
|
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 = source_box.clone();
|
||||||
let output_box_imp = output_box.imp();
|
let output_box_imp = output_box.imp();
|
||||||
let mut list = output_box_imp.resetOutputStreamList.write().unwrap();
|
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() {
|
if entry.is_none() {
|
||||||
|
println!("tried to remove nonexistant?? wat");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
output_box_imp.resetOutputStreams.remove(&*entry.unwrap().0);
|
output_box_imp.resetOutputStreams.remove(&*entry.unwrap().0);
|
||||||
list.remove(&ir.index);
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
true
|
true
|
||||||
|
|
|
@ -19,6 +19,9 @@ glib::wrapper! {
|
||||||
@implements gtk::Accessible, gtk::Buildable, gtk::ConstraintTarget, gtk::Orientable;
|
@implements gtk::Accessible, gtk::Buildable, gtk::ConstraintTarget, gtk::Orientable;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
unsafe impl Send for SourceEntry {}
|
||||||
|
unsafe impl Sync for SourceEntry {}
|
||||||
|
|
||||||
impl SourceEntry {
|
impl SourceEntry {
|
||||||
pub fn new(is_default: bool, check_group: Arc<CheckButton>, stream: Source) -> Self {
|
pub fn new(is_default: bool, check_group: Arc<CheckButton>, stream: Source) -> Self {
|
||||||
let obj: Self = Object::builder().build();
|
let obj: Self = Object::builder().build();
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
|
use std::cell::RefCell;
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
use std::time::Duration;
|
use std::time::{Duration, SystemTime};
|
||||||
|
|
||||||
use adw::glib;
|
use adw::glib;
|
||||||
use adw::glib::Object;
|
use adw::glib::Object;
|
||||||
|
@ -8,7 +9,8 @@ use dbus::blocking::Connection;
|
||||||
use dbus::Error;
|
use dbus::Error;
|
||||||
use glib::subclass::types::ObjectSubclassIsExt;
|
use glib::subclass::types::ObjectSubclassIsExt;
|
||||||
use glib::{clone, Cast, Propagation};
|
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 ReSet_Lib::audio::audio::InputStream;
|
||||||
|
|
||||||
use super::inputStreamEntryImpl;
|
use super::inputStreamEntryImpl;
|
||||||
|
@ -59,6 +61,13 @@ impl InputStreamEntry {
|
||||||
let stream = stream.unwrap();
|
let stream = stream.unwrap();
|
||||||
let index = stream.index;
|
let index = stream.index;
|
||||||
let channels = stream.channels;
|
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);
|
set_inputstream_volume(value, index, channels);
|
||||||
Propagation::Proceed
|
Propagation::Proceed
|
||||||
}),
|
}),
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
use std::cell::RefCell;
|
use std::cell::RefCell;
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
use std::time::SystemTime;
|
||||||
|
|
||||||
use gtk::subclass::prelude::*;
|
use gtk::subclass::prelude::*;
|
||||||
use gtk::{glib, Button, CompositeTemplate, DropDown, Label, ProgressBar, Scale};
|
use gtk::{glib, Button, CompositeTemplate, DropDown, Label, ProgressBar, Scale};
|
||||||
|
@ -25,6 +26,7 @@ pub struct InputStreamEntry {
|
||||||
pub resetVolumeMeter: TemplateChild<ProgressBar>,
|
pub resetVolumeMeter: TemplateChild<ProgressBar>,
|
||||||
pub stream: Arc<RefCell<InputStream>>,
|
pub stream: Arc<RefCell<InputStream>>,
|
||||||
pub associatedSink: Arc<RefCell<(u32, String)>>,
|
pub associatedSink: Arc<RefCell<(u32, String)>>,
|
||||||
|
pub volumeTimeStamp: RefCell<Option<SystemTime>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[glib::object_subclass]
|
#[glib::object_subclass]
|
||||||
|
|
|
@ -35,7 +35,13 @@ unsafe impl Sync for SinkBox {}
|
||||||
|
|
||||||
impl SinkBox {
|
impl SinkBox {
|
||||||
pub fn new() -> Self {
|
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) {
|
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<SinkBox>) {
|
pub fn populate_sinks(output_box: Arc<SinkBox>) {
|
||||||
gio::spawn_blocking(move || {
|
gio::spawn_blocking(move || {
|
||||||
let output_box_ref = output_box.clone();
|
let output_box_ref = output_box.clone();
|
||||||
|
@ -81,7 +93,7 @@ pub fn populate_sinks(output_box: Arc<SinkBox>) {
|
||||||
let default_sink = output_box_imp.resetDefaultSink.clone();
|
let default_sink = output_box_imp.resetDefaultSink.clone();
|
||||||
let sink = default_sink.borrow();
|
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 fraction = (*volume as f64 / 655.36).round();
|
||||||
let percentage = (fraction).to_string() + "%";
|
let percentage = (fraction).to_string() + "%";
|
||||||
output_box_imp.resetVolumePercentage.set_text(&percentage);
|
output_box_imp.resetVolumePercentage.set_text(&percentage);
|
||||||
|
@ -239,7 +251,11 @@ fn get_default_sink() -> Sink {
|
||||||
res.unwrap().0
|
res.unwrap().0
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn start_output_box_listener(conn: Connection, listeners: Arc<Listeners>, sink_box: Arc<SinkBox>) -> Connection {
|
pub fn start_output_box_listener(
|
||||||
|
conn: Connection,
|
||||||
|
listeners: Arc<Listeners>,
|
||||||
|
sink_box: Arc<SinkBox>,
|
||||||
|
) -> Connection {
|
||||||
if listeners.network_listener.load(Ordering::SeqCst) {
|
if listeners.network_listener.load(Ordering::SeqCst) {
|
||||||
return conn;
|
return conn;
|
||||||
}
|
}
|
||||||
|
@ -339,7 +355,9 @@ pub fn start_output_box_listener(conn: Connection, listeners: Arc<Listeners>, si
|
||||||
let mut map = output_box_imp.resetSinkMap.write().unwrap();
|
let mut map = output_box_imp.resetSinkMap.write().unwrap();
|
||||||
map.remove(&alias.unwrap().2);
|
map.remove(&alias.unwrap().2);
|
||||||
let mut index = output_box_imp.resetModelIndex.write().unwrap();
|
let mut index = output_box_imp.resetModelIndex.write().unwrap();
|
||||||
*index -= 1;
|
if *index != 0 {
|
||||||
|
*index -= 1;
|
||||||
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
true
|
true
|
||||||
|
|
|
@ -42,7 +42,7 @@
|
||||||
<object class="GtkScale" id="resetVolumeSlider">
|
<object class="GtkScale" id="resetVolumeSlider">
|
||||||
<property name="adjustment">
|
<property name="adjustment">
|
||||||
<object class="GtkAdjustment">
|
<object class="GtkAdjustment">
|
||||||
<property name="page-increment">2005.4016</property>
|
<property name="page-increment">10000.0</property>
|
||||||
<property name="step-increment">2005.4016</property>
|
<property name="step-increment">2005.4016</property>
|
||||||
<property name="upper">100270.08</property>
|
<property name="upper">100270.08</property>
|
||||||
</object>
|
</object>
|
||||||
|
@ -50,6 +50,9 @@
|
||||||
<property name="hexpand">True</property>
|
<property name="hexpand">True</property>
|
||||||
<property name="valign">center</property>
|
<property name="valign">center</property>
|
||||||
<property name="value-pos">bottom</property>
|
<property name="value-pos">bottom</property>
|
||||||
|
<marks>
|
||||||
|
<mark position="bottom" value="65536.0">100%</mark>
|
||||||
|
</marks>
|
||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
<child>
|
<child>
|
||||||
|
|
|
@ -438,7 +438,7 @@
|
||||||
(7,9,"GtkScale","value-pos","bottom",None,None,None,None,None,None,None,None,None),
|
(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","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,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","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,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),
|
(7,11,"GtkButton","icon-name","audio-volume-high-symbolic",None,None,None,None,None,None,None,None,None),
|
||||||
|
@ -798,10 +798,13 @@
|
||||||
</object_property>
|
</object_property>
|
||||||
<object_data>
|
<object_data>
|
||||||
(3,42,"GtkWidget",1,1,None,None,None,None,None,None),
|
(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)
|
||||||
</object_data>
|
</object_data>
|
||||||
<object_data_arg>
|
<object_data_arg>
|
||||||
(7,9,"GtkScale",2,2,"value","50.0"),
|
(7,9,"GtkScale",2,2,"value","65536.0"),
|
||||||
(3,42,"GtkWidget",2,2,"name","b")
|
(3,42,"GtkWidget",2,2,"name","b"),
|
||||||
|
(7,9,"GtkScale",2,2,"position","bottom")
|
||||||
</object_data_arg>
|
</object_data_arg>
|
||||||
</cambalache-project>
|
</cambalache-project>
|
||||||
|
|
Loading…
Reference in a new issue