Skip to content

Commit a32e131

Browse files
committed
Add option to play beeps on volume changes.
Only applies to output devices (aka sinks) as it just triggers the standard system beep.
1 parent 63087f0 commit a32e131

File tree

4 files changed

+44
-0
lines changed

4 files changed

+44
-0
lines changed

data/com.saivert.pwvucontrol.gschema.xml.in

+5
Original file line numberDiff line numberDiff line change
@@ -26,5 +26,10 @@
2626
<summary>Use led style peak meter</summary>
2727
<description></description>
2828
</key>
29+
<key name="beep-on-volume-changes" type="b">
30+
<default>false</default>
31+
<summary>Play system beep on volume change</summary>
32+
<description>Lets you preview the sound level even if you don't play any audio.</description>
33+
</key>
2934
</schema>
3035
</schemalist>

data/resources/ui/window.ui

+4
Original file line numberDiff line numberDiff line change
@@ -317,6 +317,10 @@
317317
<attribute name="label" translatable="yes">_Keyboard Shortcuts</attribute>
318318
<attribute name="action">win.show-help-overlay</attribute>
319319
</item>
320+
<item>
321+
<attribute name="label" translatable="yes">Beep on volume changes</attribute>
322+
<attribute name="action">win.beep-on-volume-changes</attribute>
323+
</item>
320324
<item>
321325
<attribute name="label" translatable="yes">_About Pwvucontrol</attribute>
322326
<attribute name="action">app.about</attribute>

src/ui/sinkbox.rs

+8
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,14 @@ mod imp {
6060
let item = obj.node_object().expect("nodeobj");
6161

6262
self.volumebox.set_node_object(&item);
63+
64+
if matches!(item.nodetype(), NodeType::Sink) {
65+
self.volumebox.imp().volume_scale.connect_volume_notify(|_| {
66+
let window = PwvucontrolWindow::default();
67+
window.play_beep();
68+
});
69+
}
70+
6371
self.volumebox.set_default_node_change_handler(clone!(@weak self as widget => move || {
6472
widget.obj().default_node_changed();
6573
}));

src/ui/window.rs

+27
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
// SPDX-License-Identifier: GPL-3.0-or-later
22

3+
use std::time::Duration;
4+
35
use crate::macros::*;
46
use crate::{
57
application::PwvucontrolApplication,
@@ -11,12 +13,15 @@ use adw::subclass::prelude::*;
1113
use gettextrs::gettext;
1214
use glib::clone;
1315
use gtk::{gio, prelude::*};
16+
use std::cell::Cell;
17+
use std::time;
1418

1519
pub enum PwvucontrolWindowView {
1620
Connected,
1721
Disconnected,
1822
}
1923
mod imp {
24+
2025
use super::*;
2126

2227
#[derive(Debug, gtk::CompositeTemplate)]
@@ -44,6 +49,9 @@ mod imp {
4449
pub info_banner: TemplateChild<adw::Banner>,
4550

4651
pub settings: gio::Settings,
52+
53+
pub beep_elapsed: Cell<time::Instant>,
54+
pub beep_enabled: Cell<bool>,
4755
}
4856

4957
impl Default for PwvucontrolWindow {
@@ -60,6 +68,8 @@ mod imp {
6068
reconnectbtn: TemplateChild::default(),
6169
settings: gio::Settings::new(APP_ID),
6270
info_banner: TemplateChild::default(),
71+
beep_elapsed: Cell::new(std::time::Instant::now()),
72+
beep_enabled: Default::default(),
6373
}
6474
}
6575
}
@@ -179,6 +189,13 @@ mod imp {
179189
self.obj().add_action(&overamplification_action);
180190
let use_led_peakmeter_action = self.settings.create_action("use-peakmeter-led");
181191
self.obj().add_action(&use_led_peakmeter_action);
192+
let beep_on_volume_changes_action = self.settings.create_action("beep-on-volume-changes");
193+
self.obj().add_action(&beep_on_volume_changes_action);
194+
195+
self.settings.connect_changed(Some("beep-on-volume-changes"), clone!(@weak self as widget => move |settings, _key| {
196+
widget.beep_enabled.set(settings.boolean("beep-on-volume-changes"));
197+
}));
198+
self.beep_enabled.set(self.settings.boolean("beep-on-volume-changes"));
182199

183200
self.obj().load_window_state();
184201
}
@@ -291,6 +308,16 @@ impl PwvucontrolWindow {
291308
imp.info_banner.set_title(&message);
292309
imp.info_banner.set_revealed(manager.node_model().n_items() == 0);
293310
}
311+
312+
pub(crate) fn play_beep(&self) {
313+
if !self.imp().beep_enabled.get() {
314+
return;
315+
}
316+
if self.imp().beep_elapsed.get().elapsed() > Duration::from_secs(1) {
317+
self.display().beep();
318+
self.imp().beep_elapsed.set(time::Instant::now());
319+
}
320+
}
294321
}
295322

296323
impl Default for PwvucontrolWindow {

0 commit comments

Comments
 (0)