feat: Add initial Bluetooth functionality

This commit is contained in:
Fabio Lenherr / DashieTM 2023-11-18 22:15:09 +01:00
parent 03fc3790c0
commit 9108ab0d74
14 changed files with 514 additions and 20 deletions

View file

@ -2,6 +2,7 @@ use std::sync::atomic::Ordering;
use std::sync::Arc;
use std::time::{Duration, SystemTime};
use crate::components::base::cardEntry::CardEntry;
use crate::components::base::listEntry::ListEntry;
use crate::components::base::utils::{
InputStreamAdded, InputStreamChanged, InputStreamRemoved, Listeners, SinkAdded, SinkChanged,
@ -18,7 +19,7 @@ use glib::subclass::prelude::ObjectSubclassIsExt;
use glib::{clone, Cast, Propagation, Variant};
use gtk::prelude::ActionableExt;
use gtk::{gio, StringObject};
use ReSet_Lib::audio::audio::{InputStream, Sink};
use ReSet_Lib::audio::audio::{Card, InputStream, Sink};
use super::inputStreamEntry::InputStreamEntry;
use super::sinkBoxImpl;
@ -52,10 +53,20 @@ impl SinkBox {
selfImp
.resetSinksRow
.set_action_target_value(Some(&Variant::from("outputDevices")));
selfImp
.resetCardsRow
.set_action_name(Some("navigation.push"));
selfImp
.resetCardsRow
.set_action_target_value(Some(&Variant::from("profileConfiguration")));
selfImp.resetCardsRow.connect_action_name_notify(|_| {});
selfImp
.resetInputStreamButton
.set_action_name(Some("navigation.pop"));
selfImp
.resetInputCardsBackButton
.set_action_name(Some("navigation.pop"));
}
}
@ -84,6 +95,7 @@ pub fn populate_sinks(output_box: Arc<SinkBox>) {
}
}
populate_inputstreams(output_box.clone());
populate_cards(output_box.clone());
glib::spawn_future(async move {
glib::idle_add_once(move || {
let output_box_ref_slider = output_box.clone();
@ -217,6 +229,22 @@ pub fn populate_inputstreams(output_box: Arc<SinkBox>) {
});
}
pub fn populate_cards(output_box: Arc<SinkBox>) {
gio::spawn_blocking(move || {
let output_box_ref = output_box.clone();
let cards = get_cards();
glib::spawn_future(async move {
glib::idle_add_once(move || {
let imp = output_box_ref.imp();
for card in cards {
imp.resetCards
.append(&ListEntry::new(&CardEntry::new(card)));
}
});
});
});
}
fn get_input_streams() -> Vec<InputStream> {
let conn = Connection::new_session().unwrap();
let proxy = conn.with_proxy(
@ -260,6 +288,20 @@ fn get_default_sink() -> Sink {
res.unwrap().0
}
fn get_cards() -> Vec<Card> {
let conn = Connection::new_session().unwrap();
let proxy = conn.with_proxy(
"org.xetibo.ReSet",
"/org/xetibo/ReSet",
Duration::from_millis(1000),
);
let res: Result<(Vec<Card>,), Error> = proxy.method_call("org.xetibo.ReSet", "ListCards", ());
if res.is_err() {
return Vec::new();
}
res.unwrap().0
}
pub fn start_output_box_listener(
conn: Connection,
listeners: Arc<Listeners>,

View file

@ -22,6 +22,8 @@ pub struct SinkBox {
#[template_child]
pub resetSinksRow: TemplateChild<ListEntry>,
#[template_child]
pub resetCardsRow: TemplateChild<ListEntry>,
#[template_child]
pub resetSinkDropdown: TemplateChild<DropDown>,
#[template_child]
pub resetSinkMute: TemplateChild<Button>,
@ -37,6 +39,10 @@ pub struct SinkBox {
pub resetInputStreamButton: TemplateChild<ListEntry>,
#[template_child]
pub resetInputStreams: TemplateChild<Box>,
#[template_child]
pub resetInputCardsBackButton: TemplateChild<ListEntry>,
#[template_child]
pub resetCards: TemplateChild<Box>,
pub resetDefaultCheckButton: Arc<CheckButton>,
pub resetDefaultSink: Arc<RefCell<Sink>>,
pub resetSinkList: Arc<RwLock<HashMap<u32, (Arc<ListEntry>, Arc<SinkEntry>, String)>>>,