From fc048304ee86d4e34879ba62dfcfd42887bc4302 Mon Sep 17 00:00:00 2001 From: Fabio Lenherr / DashieTM Date: Mon, 1 Apr 2024 23:45:46 +0200 Subject: [PATCH] wip: Add TAudioStreamObject --- .../audio/generic_audio_functions.rs | 97 +++------------ src/components/audio/generic_const.rs | 6 + src/components/audio/generic_entry.rs | 116 +++++++++--------- src/components/audio/generic_utils.rs | 34 +++++ .../audio/input/output_stream_entry.rs | 7 ++ .../audio/input/output_stream_entry_impl.rs | 33 ++++- src/components/audio/input/source_box.rs | 4 +- .../audio/input/source_box_handlers.rs | 35 ++++-- src/components/audio/input/source_box_impl.rs | 14 +-- src/components/audio/input/source_const.rs | 20 +++ src/components/audio/input/source_entry.rs | 44 ++----- .../audio/input/source_entry_impl.rs | 4 +- src/components/audio/mod.rs | 2 + .../audio/output/input_stream_entry.rs | 7 ++ .../audio/output/input_stream_entry_impl.rs | 34 ++++- src/components/audio/output/sink_box.rs | 4 +- .../audio/output/sink_box_handlers.rs | 33 +++-- src/components/audio/output/sink_box_impl.rs | 14 +-- src/components/audio/output/sink_const.rs | 20 +++ src/components/audio/output/sink_entry.rs | 56 ++------- .../audio/output/sink_entry_impl.rs | 4 +- 21 files changed, 327 insertions(+), 261 deletions(-) create mode 100644 src/components/audio/generic_const.rs create mode 100644 src/components/audio/generic_utils.rs diff --git a/src/components/audio/generic_audio_functions.rs b/src/components/audio/generic_audio_functions.rs index db97ca2..ec1e722 100644 --- a/src/components/audio/generic_audio_functions.rs +++ b/src/components/audio/generic_audio_functions.rs @@ -1,90 +1,25 @@ -use std::{sync::Arc, time::Duration}; +use std::sync::Arc; use adw::traits::ComboRowExt; -use dbus::{ - arg::{Arg, Get}, - blocking::Connection, - Error, +use gtk::prelude::{ButtonExt, CheckButtonExt, RangeExt}; +use re_set_lib::audio::audio_structures::{TAudioObject, TAudioStreamObject}; + +use super::generic_entry::{ + TAudioBox, TAudioBoxImpl, TAudioEntry, TAudioEntryImpl, TAudioStream, TAudioStreamImpl, }; -use gtk::{ - gio, - prelude::{ButtonExt, CheckButtonExt, RangeExt}, -}; -use re_set_lib::audio::audio_structures::AudioObject; - -use crate::components::{ - base::error_impl::{show_error, ReSetErrorImpl}, - utils::{AUDIO, BASE, DBUS_PATH}, -}; - -use super::generic_entry::{Audio, AudioBox, AudioBoxImpl, AudioImpl, DBusFunction}; - -pub fn set_volume( - value: f64, - index: u32, - channels: u16, - reset_box: Arc, - function: &'static DBusFunction, -) -> bool { - gio::spawn_blocking(move || { - let conn = Connection::new_session().unwrap(); - let proxy = conn.with_proxy(BASE, DBUS_PATH, Duration::from_millis(1000)); - let res: Result<(), Error> = - proxy.method_call(AUDIO, function.function, (index, channels, value as u32)); - if res.is_err() { - // TODO: also log this with LOG/ERROR - show_error::(reset_box.clone(), function.error); - } - }); - true -} - -pub fn toggle_audio_object_mute( - index: u32, - muted: bool, - input_box: Arc, - function: &'static DBusFunction, -) -> bool { - gio::spawn_blocking(move || { - let conn = Connection::new_session().unwrap(); - let proxy = conn.with_proxy(BASE, DBUS_PATH, Duration::from_millis(1000)); - let res: Result<(), Error> = proxy.method_call(AUDIO, function.function, (index, muted)); - if res.is_err() { - // TODO: also log this with LOG/ERROR - show_error::(input_box.clone(), function.error); - } - }); - true -} - -pub fn set_default_audio_object( - name: Arc, - input_box: Arc, - function: &'static DBusFunction, -) -> Option -where - T: ReSetErrorImpl + 'static, - R: Arg + for<'z> Get<'z>, -{ - let conn = Connection::new_session().unwrap(); - let proxy = conn.with_proxy(BASE, DBUS_PATH, Duration::from_millis(1000)); - let res: Result<(R,), Error> = proxy.method_call(AUDIO, function.function, (name.as_str(),)); - if res.is_err() { - show_error::(input_box.clone(), function.error); - return None; - } - Some(res.unwrap().0) -} pub fn refresh_default_audio_object< - A: AudioBox + Send + Sync + 'static, - OBJ: AudioObject + Send + Sync + 'static, - Entry: Audio, - EntryImpl: AudioImpl, - BoxImpl: AudioBoxImpl, + AudioObject: TAudioObject + Send + Sync + 'static, + StreamObject: TAudioStreamObject + Send + Sync + 'static, + AudioEntry: TAudioEntry, + AudioEntryImpl: TAudioEntryImpl, + AudioStream: TAudioStream, + AudioStreamImpl: TAudioStreamImpl, + AudioBox: TAudioBox + Send + Sync + 'static, + AudioBoxImpl: TAudioBoxImpl, >( - new_audio_object: OBJ, - reset_box: Arc, + new_audio_object: AudioObject, + reset_box: Arc, entry: bool, ) { let volume = *new_audio_object.volume().first().unwrap_or(&0_u32); diff --git a/src/components/audio/generic_const.rs b/src/components/audio/generic_const.rs new file mode 100644 index 0000000..58438b5 --- /dev/null +++ b/src/components/audio/generic_const.rs @@ -0,0 +1,6 @@ +use super::generic_entry::DBusFunction; + +pub const LISTCARDS: DBusFunction = DBusFunction { + function: "ListCards", + error: "Failed to get list profiles", +}; diff --git a/src/components/audio/generic_entry.rs b/src/components/audio/generic_entry.rs index 92f65bd..e28afed 100644 --- a/src/components/audio/generic_entry.rs +++ b/src/components/audio/generic_entry.rs @@ -12,32 +12,26 @@ use glib::{ Object, }; use gtk::{gio, Button, CheckButton, Label, Scale, StringList, TemplateChild}; -use re_set_lib::audio::audio_structures::AudioObject; +use re_set_lib::audio::audio_structures::{TAudioObject, TAudioStreamObject}; use crate::components::base::error::ReSetError; use crate::components::base::error_impl::ReSetErrorImpl; use crate::components::base::list_entry::ListEntry; use crate::components::utils::set_action_row_ellipsis; -use super::generic_audio_functions::{ - refresh_default_audio_object, set_default_audio_object, set_volume, toggle_audio_object_mute, -}; - -pub trait Audio>: IsClass + IsA { - fn entry_imp(&self) -> &IMP; -} - -pub trait AudioBox { - fn box_imp(&self) -> &AudioBoxImpl; -} +use super::generic_audio_functions::refresh_default_audio_object; +use super::generic_utils::audio_dbus_call; pub type AudioEntryMap = Arc, Arc, String)>>>; -#[allow(dead_code)] pub type AudioStreamEntryMap = Arc, Arc)>>>; pub type AudioMap = Arc>>; +pub trait TAudioBox { + fn box_imp(&self) -> &AudioBoxImpl; +} + #[allow(dead_code)] -pub trait AudioBoxImpl { +pub trait TAudioBoxImpl { fn audio_object_row(&self) -> &TemplateChild; fn cards_row(&self) -> &TemplateChild; fn audio_object_dropdown(&self) -> &TemplateChild; @@ -51,9 +45,9 @@ pub trait AudioBoxImpl { fn cards(&self) -> &TemplateChild; fn error(&self) -> &TemplateChild; fn default_check_button(&self) -> Arc; - fn default_audio_object(&self) -> Arc>; + fn default_audio_object(&self) -> Arc>; fn audio_object_list(&self) -> &AudioEntryMap; - // fn audio_object_stream_list(&self) -> AudioStreamEntryMap; + fn audio_object_stream_list(&self) -> &AudioStreamEntryMap; fn model_list(&self) -> Arc>; fn model_index(&self) -> Arc>; fn source_map(&self) -> &AudioMap; @@ -61,14 +55,18 @@ pub trait AudioBoxImpl { fn icons(&self) -> &AudioIcons; } +pub trait TAudioEntry: IsClass + IsA { + fn entry_imp(&self) -> &TAudioEntryImpl; +} + #[allow(dead_code)] -pub trait AudioImpl { +pub trait TAudioEntryImpl { fn name(&self) -> &TemplateChild; fn selected_audio_object(&self) -> &TemplateChild; fn mute(&self) -> &TemplateChild