Skip to content

Commit f0ff8ee

Browse files
committed
linux-rust: add listening mode picker for airpods
1 parent 06d99b7 commit f0ff8ee

6 files changed

Lines changed: 378 additions & 76 deletions

File tree

linux-rust/src/devices/airpods.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use crate::bluetooth::aacp::{AACPManager, ProximityKeyType, AACPEvent, AirPodsLEKeys};
22
use crate::bluetooth::aacp::ControlCommandIdentifiers;
3-
// use crate::bluetooth::att::ATTManager;
3+
use crate::bluetooth::att::ATTManager;
44
use crate::media_controller::MediaController;
55
use bluer::Address;
66
use log::{debug, info, error};

linux-rust/src/devices/enums.rs

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
use std::fmt::Display;
2+
use iced::widget::{combo_box, ComboBox};
23
use serde::{Deserialize, Serialize};
34
use crate::devices::airpods::AirPodsInformation;
45
use crate::devices::nothing::NothingInformation;
@@ -53,8 +54,50 @@ impl Display for DeviceState {
5354
#[derive(Clone, Debug)]
5455
pub struct AirPodsState {
5556
pub device_name: String,
57+
pub noise_control_mode: AirPodsNoiseControlMode,
58+
pub noise_control_state: combo_box::State<AirPodsNoiseControlMode>,
5659
pub conversation_awareness_enabled: bool,
5760
pub personalized_volume_enabled: bool,
61+
pub allow_off_mode: bool
62+
}
63+
64+
#[derive(Clone, Debug)]
65+
pub enum AirPodsNoiseControlMode {
66+
Off,
67+
NoiseCancellation,
68+
Transparency,
69+
Adaptive
70+
}
71+
72+
impl Display for AirPodsNoiseControlMode {
73+
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
74+
match self {
75+
AirPodsNoiseControlMode::Off => write!(f, "Off"),
76+
AirPodsNoiseControlMode::NoiseCancellation => write!(f, "Noise Cancellation"),
77+
AirPodsNoiseControlMode::Transparency => write!(f, "Transparency"),
78+
AirPodsNoiseControlMode::Adaptive => write!(f, "Adaptive"),
79+
}
80+
}
81+
}
82+
83+
impl AirPodsNoiseControlMode {
84+
pub fn from_byte(value: &u8) -> Self {
85+
match value {
86+
0x01 => AirPodsNoiseControlMode::Off,
87+
0x02 => AirPodsNoiseControlMode::NoiseCancellation,
88+
0x03 => AirPodsNoiseControlMode::Transparency,
89+
0x04 => AirPodsNoiseControlMode::Adaptive,
90+
_ => AirPodsNoiseControlMode::Off,
91+
}
92+
}
93+
pub fn to_byte(&self) -> u8 {
94+
match self {
95+
AirPodsNoiseControlMode::Off => 0x01,
96+
AirPodsNoiseControlMode::NoiseCancellation => 0x02,
97+
AirPodsNoiseControlMode::Transparency => 0x03,
98+
AirPodsNoiseControlMode::Adaptive => 0x04,
99+
}
100+
}
58101
}
59102

60103
#[derive(Clone, Debug)]

linux-rust/src/main.rs

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -123,18 +123,17 @@ async fn async_main(
123123
Ok(device) => {
124124
let name = device.name().await?.unwrap_or_else(|| "Unknown".to_string());
125125
info!("Found connected AirPods: {}, initializing.", name);
126-
let ui_tx_clone = ui_tx.clone();
127-
ui_tx_clone.send(BluetoothUIMessage::DeviceConnected(device.address().to_string())).unwrap();
128-
let airpods_device = AirPodsDevice::new(device.address(), tray_handle.clone(), ui_tx_clone).await;
126+
let airpods_device = AirPodsDevice::new(device.address(), tray_handle.clone(), ui_tx.clone()).await;
129127

130128
let mut managers = device_managers.write().await;
129+
// let dev_managers = DeviceManagers::with_both(airpods_device.aacp_manager.clone(), airpods_device.att_manager.clone());
131130
let dev_managers = DeviceManagers::with_aacp(airpods_device.aacp_manager.clone());
132131
managers
133132
.entry(device.address().to_string())
134133
.or_insert(dev_managers)
135-
.set_aacp(airpods_device.aacp_manager)
136-
;
137-
drop(managers)
134+
.set_aacp(airpods_device.aacp_manager);
135+
drop(managers);
136+
ui_tx.send(BluetoothUIMessage::DeviceConnected(device.address().to_string())).unwrap();
138137
}
139138
Err(_) => {
140139
info!("No connected AirPods found.");
@@ -150,16 +149,16 @@ async fn async_main(
150149
let ui_tx_clone = ui_tx.clone();
151150
let device_managers = device_managers.clone();
152151
tokio::spawn(async move {
153-
ui_tx_clone.send(BluetoothUIMessage::DeviceConnected(addr_str.clone())).unwrap();
154152
let mut managers = device_managers.write().await;
155153
match type_ {
156154
devices::enums::DeviceType::Nothing => {
157-
let dev = devices::nothing::NothingDevice::new(device.address(), ui_tx_clone).await;
155+
let dev = devices::nothing::NothingDevice::new(device.address(), ui_tx_clone.clone()).await;
158156
let dev_managers = DeviceManagers::with_att(dev.att_manager.clone());
159157
managers
160-
.entry(addr_str)
158+
.entry(addr_str.clone())
161159
.or_insert(dev_managers)
162160
.set_att(dev.att_manager);
161+
ui_tx_clone.send(BluetoothUIMessage::DeviceConnected(addr_str)).unwrap();
163162
}
164163
_ => {}
165164
}
@@ -212,14 +211,14 @@ async fn async_main(
212211
let device_managers = device_managers.clone();
213212
tokio::spawn(async move {
214213
let mut managers = device_managers.write().await;
215-
ui_tx_clone.send(BluetoothUIMessage::DeviceConnected(addr_str.clone())).unwrap();
216-
let dev = devices::nothing::NothingDevice::new(addr, ui_tx_clone).await;
214+
let dev = devices::nothing::NothingDevice::new(addr, ui_tx_clone.clone()).await;
217215
let dev_managers = DeviceManagers::with_att(dev.att_manager.clone());
218216
managers
219-
.entry(addr_str)
217+
.entry(addr_str.clone())
220218
.or_insert(dev_managers)
221219
.set_att(dev.att_manager);
222220
drop(managers);
221+
ui_tx_clone.send(BluetoothUIMessage::DeviceConnected(addr_str.clone())).unwrap();
223222
});
224223
}
225224
_ => {}
@@ -236,15 +235,16 @@ async fn async_main(
236235
let ui_tx_clone = ui_tx.clone();
237236
let device_managers = device_managers.clone();
238237
tokio::spawn(async move {
239-
ui_tx_clone.send(BluetoothUIMessage::DeviceConnected(addr_str.clone())).unwrap();
240-
let airpods_device = AirPodsDevice::new(addr, handle_clone, ui_tx_clone).await;
238+
let airpods_device = AirPodsDevice::new(addr, handle_clone, ui_tx_clone.clone()).await;
241239
let mut managers = device_managers.write().await;
240+
// let dev_managers = DeviceManagers::with_both(airpods_device.aacp_manager.clone(), airpods_device.att_manager.clone());
242241
let dev_managers = DeviceManagers::with_aacp(airpods_device.aacp_manager.clone());
243242
managers
244-
.entry(addr_str)
243+
.entry(addr_str.clone())
245244
.or_insert(dev_managers)
246245
.set_aacp(airpods_device.aacp_manager);
247246
drop(managers);
247+
ui_tx_clone.send(BluetoothUIMessage::DeviceConnected(addr_str.clone())).unwrap();
248248
});
249249
true
250250
})?;

0 commit comments

Comments
 (0)