audio: Use volume subscription to detect changes
Fixes https://github.com/pop-os/cosmic-applets/issues/301. Should be combined with the subscription code here to avoid duplication, and two things using pulse.
This commit is contained in:
parent
35491b80a2
commit
78b734afc2
5 changed files with 33 additions and 24 deletions
4
Cargo.lock
generated
4
Cargo.lock
generated
|
|
@ -929,6 +929,7 @@ dependencies = [
|
||||||
name = "cosmic-applet-audio"
|
name = "cosmic-applet-audio"
|
||||||
version = "0.1.1"
|
version = "0.1.1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
|
"cosmic-settings-subscriptions",
|
||||||
"cosmic-time",
|
"cosmic-time",
|
||||||
"i18n-embed 0.14.1",
|
"i18n-embed 0.14.1",
|
||||||
"i18n-embed-fl 0.8.0",
|
"i18n-embed-fl 0.8.0",
|
||||||
|
|
@ -964,7 +965,6 @@ dependencies = [
|
||||||
"tracing-log",
|
"tracing-log",
|
||||||
"tracing-subscriber",
|
"tracing-subscriber",
|
||||||
"udev",
|
"udev",
|
||||||
"upower_dbus",
|
|
||||||
"zbus 4.2.2",
|
"zbus 4.2.2",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
@ -5308,7 +5308,7 @@ checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67"
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "smithay-client-toolkit"
|
name = "smithay-client-toolkit"
|
||||||
version = "0.18.0"
|
version = "0.18.0"
|
||||||
source = "git+https://github.com/smithay/client-toolkit?rev=3bed072#3bed072b966022f5f929d12f3aff089b1ace980b"
|
source = "git+https://github.com/smithay/client-toolkit//?rev=3bed072#3bed072b966022f5f929d12f3aff089b1ace980b"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bitflags 2.5.0",
|
"bitflags 2.5.0",
|
||||||
"bytemuck",
|
"bytemuck",
|
||||||
|
|
|
||||||
|
|
@ -26,6 +26,7 @@ cctk = { git = "https://github.com/pop-os/cosmic-protocols", package = "cosmic-c
|
||||||
cosmic-protocols = { git = "https://github.com/pop-os/cosmic-protocols", default-features = false, features = [
|
cosmic-protocols = { git = "https://github.com/pop-os/cosmic-protocols", default-features = false, features = [
|
||||||
"client",
|
"client",
|
||||||
], rev = "c8d3a1c" }
|
], rev = "c8d3a1c" }
|
||||||
|
cosmic-settings-subscriptions = { git = "https://github.com/pop-os/cosmic-settings-subscriptions" }
|
||||||
cosmic-time = { git = "https://github.com/pop-os/cosmic-time", default-features = false, features = [
|
cosmic-time = { git = "https://github.com/pop-os/cosmic-time", default-features = false, features = [
|
||||||
"libcosmic",
|
"libcosmic",
|
||||||
"once_cell",
|
"once_cell",
|
||||||
|
|
|
||||||
|
|
@ -5,6 +5,7 @@ edition = "2021"
|
||||||
license = "GPL-3.0"
|
license = "GPL-3.0"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
|
cosmic-settings-subscriptions.workspace = true
|
||||||
cosmic-time.workspace = true
|
cosmic-time.workspace = true
|
||||||
i18n-embed-fl.workspace = true
|
i18n-embed-fl.workspace = true
|
||||||
i18n-embed.workspace = true
|
i18n-embed.workspace = true
|
||||||
|
|
|
||||||
|
|
@ -32,6 +32,7 @@ use cosmic::widget::Row;
|
||||||
use cosmic::widget::{divider, icon};
|
use cosmic::widget::{divider, icon};
|
||||||
use cosmic::Renderer;
|
use cosmic::Renderer;
|
||||||
use cosmic::{Element, Theme};
|
use cosmic::{Element, Theme};
|
||||||
|
use cosmic_settings_subscriptions::pulse as sub_pulse;
|
||||||
use cosmic_time::{anim, chain, id, once_cell::sync::Lazy, Instant, Timeline};
|
use cosmic_time::{anim, chain, id, once_cell::sync::Lazy, Instant, Timeline};
|
||||||
use iced::wayland::popup::{destroy_popup, get_popup};
|
use iced::wayland::popup::{destroy_popup, get_popup};
|
||||||
use iced::widget::container;
|
use iced::widget::container;
|
||||||
|
|
@ -64,6 +65,10 @@ pub struct Audio {
|
||||||
current_input: Option<DeviceInfo>,
|
current_input: Option<DeviceInfo>,
|
||||||
outputs: Vec<DeviceInfo>,
|
outputs: Vec<DeviceInfo>,
|
||||||
inputs: Vec<DeviceInfo>,
|
inputs: Vec<DeviceInfo>,
|
||||||
|
sink_mute: bool,
|
||||||
|
sink_volume: u32,
|
||||||
|
source_mute: bool,
|
||||||
|
source_volume: u32,
|
||||||
pulse_state: PulseState,
|
pulse_state: PulseState,
|
||||||
popup: Option<window::Id>,
|
popup: Option<window::Id>,
|
||||||
timeline: Timeline,
|
timeline: Timeline,
|
||||||
|
|
@ -78,19 +83,13 @@ impl Audio {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn output_icon_name(&self) -> &'static str {
|
fn output_icon_name(&self) -> &'static str {
|
||||||
let Some(output) = self.current_output.as_ref() else {
|
if self.sink_mute || self.sink_volume == 0 {
|
||||||
return "audio-volume-muted-symbolic";
|
|
||||||
};
|
|
||||||
|
|
||||||
let volume = output.volume.avg();
|
|
||||||
let output_volume = volume_to_percent(volume);
|
|
||||||
if volume.is_muted() {
|
|
||||||
"audio-volume-muted-symbolic"
|
"audio-volume-muted-symbolic"
|
||||||
} else if output_volume < 33.0 {
|
} else if self.sink_volume < 33 {
|
||||||
"audio-volume-low-symbolic"
|
"audio-volume-low-symbolic"
|
||||||
} else if output_volume < 66.0 {
|
} else if self.sink_volume < 66 {
|
||||||
"audio-volume-medium-symbolic"
|
"audio-volume-medium-symbolic"
|
||||||
} else if output_volume <= 100.0 {
|
} else if self.sink_volume <= 100 {
|
||||||
"audio-volume-high-symbolic"
|
"audio-volume-high-symbolic"
|
||||||
} else {
|
} else {
|
||||||
"audio-volume-overamplified-symbolic"
|
"audio-volume-overamplified-symbolic"
|
||||||
|
|
@ -102,17 +101,11 @@ impl Audio {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn input_icon_name(&self) -> &'static str {
|
fn input_icon_name(&self) -> &'static str {
|
||||||
let Some(input) = self.current_input.as_ref() else {
|
if self.source_mute || self.source_volume == 0 {
|
||||||
return "microphone-sensitivity-muted-symbolic";
|
|
||||||
};
|
|
||||||
|
|
||||||
let volume = input.volume.avg();
|
|
||||||
let input_volume = volume_to_percent(volume);
|
|
||||||
if volume.is_muted() || input_volume == 0.0 {
|
|
||||||
"microphone-sensitivity-muted-symbolic"
|
"microphone-sensitivity-muted-symbolic"
|
||||||
} else if input_volume < 33.0 {
|
} else if self.source_volume < 33 {
|
||||||
"microphone-sensitivity-low-symbolic"
|
"microphone-sensitivity-low-symbolic"
|
||||||
} else if input_volume < 66.0 {
|
} else if self.source_volume < 66 {
|
||||||
"microphone-sensitivity-medium-symbolic"
|
"microphone-sensitivity-medium-symbolic"
|
||||||
} else {
|
} else {
|
||||||
"microphone-sensitivity-high-symbolic"
|
"microphone-sensitivity-high-symbolic"
|
||||||
|
|
@ -145,6 +138,7 @@ pub enum Message {
|
||||||
MprisRequest(MprisRequest),
|
MprisRequest(MprisRequest),
|
||||||
Token(TokenUpdate),
|
Token(TokenUpdate),
|
||||||
OpenSettings,
|
OpenSettings,
|
||||||
|
PulseSub(sub_pulse::Event),
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Audio {
|
impl Audio {
|
||||||
|
|
@ -540,6 +534,20 @@ impl cosmic::Application for Audio {
|
||||||
cosmic::process::spawn(cmd);
|
cosmic::process::spawn(cmd);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
Message::PulseSub(event) => match event {
|
||||||
|
sub_pulse::Event::SinkVolume(value) => {
|
||||||
|
self.sink_volume = value;
|
||||||
|
}
|
||||||
|
sub_pulse::Event::SinkMute(value) => {
|
||||||
|
self.sink_mute = value;
|
||||||
|
}
|
||||||
|
sub_pulse::Event::SourceVolume(value) => {
|
||||||
|
self.source_volume = value;
|
||||||
|
}
|
||||||
|
sub_pulse::Event::SourceMute(value) => {
|
||||||
|
self.source_mute = value;
|
||||||
|
}
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
Command::none()
|
Command::none()
|
||||||
|
|
@ -559,6 +567,7 @@ impl cosmic::Application for Audio {
|
||||||
}),
|
}),
|
||||||
mpris_subscription::mpris_subscription(0).map(Message::Mpris),
|
mpris_subscription::mpris_subscription(0).map(Message::Mpris),
|
||||||
activation_token_subscription(0).map(Message::Token),
|
activation_token_subscription(0).map(Message::Token),
|
||||||
|
sub_pulse::subscription().map(Message::PulseSub),
|
||||||
])
|
])
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -5,6 +5,7 @@ edition = "2021"
|
||||||
license = "GPL-3.0"
|
license = "GPL-3.0"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
|
cosmic-settings-subscriptions.workspace = true
|
||||||
cosmic-time.workspace = true
|
cosmic-time.workspace = true
|
||||||
drm = "0.11.1"
|
drm = "0.11.1"
|
||||||
futures.workspace = true
|
futures.workspace = true
|
||||||
|
|
@ -19,6 +20,3 @@ tracing-subscriber.workspace = true
|
||||||
tracing.workspace = true
|
tracing.workspace = true
|
||||||
udev = "0.8"
|
udev = "0.8"
|
||||||
zbus.workspace = true
|
zbus.workspace = true
|
||||||
# TODO branch
|
|
||||||
upower_dbus = { git = "https://github.com/pop-os/dbus-settings-bindings", branch = "upower" }
|
|
||||||
cosmic-settings-subscriptions = { git = "https://github.com/pop-os/cosmic-settings-subscriptions" }
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue