Skip to content

Commit 88e29bb

Browse files
committed
Add over-amplification support.
1 parent 470a3bf commit 88e29bb

File tree

5 files changed

+66
-3
lines changed

5 files changed

+66
-3
lines changed

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,5 +16,10 @@
1616
<summary>Default window maximized behaviour</summary>
1717
<description></description>
1818
</key>
19+
<key name="enable-overamplification" type="b">
20+
<default>false</default>
21+
<summary>Enable over-amplification</summary>
22+
<description></description>
23+
</key>
1924
</schema>
2025
</schemalist>

data/resources/ui/window.ui

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -293,6 +293,10 @@
293293
</template>
294294
<menu id="primary_menu">
295295
<section>
296+
<item>
297+
<attribute name="label" translatable="yes">_Enable over-amplification</attribute>
298+
<attribute name="action">win.enable-overamplification</attribute>
299+
</item>
296300
<item>
297301
<attribute name="label" translatable="yes">_Keyboard Shortcuts</attribute>
298302
<attribute name="action">win.show-help-overlay</attribute>

src/backend/pwnodeobject.rs

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,12 @@ use wp::{
77
registry::{Constraint, ConstraintType, Interest}
88
};
99
use std::cell::{Cell, RefCell};
10-
use glib::{self, clone, subclass::{prelude::*, Signal}, ObjectExt, ParamSpec, Properties, Value, CastNone};
10+
use glib::{self, clone, subclass::{prelude::*, Signal}, ObjectExt, ParamSpec, Properties, Value, CastNone, Cast};
1111
use once_cell::sync::{Lazy, OnceCell};
1212
use gtk::{gio, prelude::ListModelExt};
1313
use super::{PwDeviceObject, PwRouteObject, PwChannelObject, PwvucontrolManager};
14+
use wp::registry::ObjectManager;
15+
1416
use crate::macros::*;
1517

1618
mod mixerapi;
@@ -83,6 +85,8 @@ pub mod imp {
8385
pub(super) wpnode: OnceCell<wp::pw::Node>,
8486

8587
pub(super) block: Cell<bool>,
88+
89+
pub(super) om: RefCell<ObjectManager>,
8690
}
8791

8892
impl Default for PwNodeObject {
@@ -104,6 +108,7 @@ pub mod imp {
104108
channellock: Default::default(),
105109
wpnode: OnceCell::default(),
106110
block: Default::default(),
111+
om: Default::default(),
107112
hidden: Default::default(),
108113
}
109114
}
@@ -205,6 +210,27 @@ pub mod imp {
205210
obj.update_volume_using_mixerapi();
206211
obj.update_icon_name();
207212

213+
let om = self.om.borrow();
214+
215+
om.add_interest([Constraint::compare(ConstraintType::PwProperty, "link.output.node", node.bound_id(), true)]
216+
.iter().collect::<Interest<wp::pw::Link>>());
217+
218+
if let Ok(Some(device_id)) = node.device_id() {
219+
om.add_interest([Constraint::compare(ConstraintType::PwGlobalProperty, "device.id", device_id, true)]
220+
.iter()
221+
.collect::<Interest<wp::pw::Device>>());
222+
}
223+
224+
225+
om.connect_object_added(clone!(@weak self as widget => move |_om, obj| {
226+
if let Some(link) = obj.downcast_ref::<wp::pw::Link>() {
227+
let linked_node_id: u32 = link.pw_property("link.input.node").expect("link.input.node property");
228+
let linked_node = PwvucontrolManager::default().get_node_by_id(linked_node_id);
229+
pwvucontrol_info!("Node {} linked to node id {linked_node_id} ({:?})", widget.obj().name(), linked_node.map(|x|x.name()));
230+
}
231+
}));
232+
233+
PwvucontrolManager::default().wp_core().install_object_manager(&om);
208234
}
209235
}
210236

@@ -241,7 +267,7 @@ impl PwNodeObject {
241267
let props = wp_node.global_properties().expect("Node has no properties");
242268

243269
let name_gstr = match self.nodetype() {
244-
NodeType::Sink => {
270+
NodeType::Sink | NodeType::Source => {
245271
props
246272
.get("node.description")
247273
.or_else(|| props.get("node.nick"))
@@ -486,6 +512,7 @@ impl PwNodeObject {
486512
}
487513

488514
pub(crate) fn get_device(&self) -> Option<PwDeviceObject> {
515+
489516
if let Ok(Some(device_id)) = self.wpnode().device_id() {
490517
let manager = PwvucontrolManager::default();
491518
return manager.get_device_by_id(device_id);

src/ui/volumebox.rs

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
// SPDX-License-Identifier: GPL-3.0-or-later
22

3-
use crate::{backend::PwChannelObject, backend::PwNodeObject, backend::PwvucontrolManager, ui::LevelbarProvider, ui::PwChannelBox};
3+
use crate::{backend::{PwChannelObject, PwNodeObject, PwvucontrolManager}, ui::{LevelbarProvider, PwChannelBox, PwvucontrolWindow}};
44

55
use glib::{clone, closure_local, ControlFlow, SignalHandlerId};
66
use gtk::{prelude::*, subclass::prelude::*};
@@ -136,6 +136,30 @@ mod imp {
136136
.transform_from(cubic_to_linear)
137137
.build();
138138

139+
fn update_overamplification(volume_scale: &gtk::Scale) {
140+
let window: PwvucontrolWindow = PwvucontrolWindow::default();
141+
let enable_overamplification = window.imp().settings.boolean("enable-overamplification");
142+
143+
volume_scale.clear_marks();
144+
volume_scale.add_mark(0.0, gtk::PositionType::Bottom, Some("Silence"));
145+
volume_scale.add_mark(1.0, gtk::PositionType::Bottom, Some("100%"));
146+
147+
148+
if enable_overamplification {
149+
volume_scale.add_mark(1.525, gtk::PositionType::Bottom, Some("150%"));
150+
volume_scale.set_range(0.0, 1.525);
151+
} else {
152+
volume_scale.set_range(0.0, 1.0);
153+
}
154+
}
155+
156+
update_overamplification(&self.volume_scale);
157+
158+
let window = PwvucontrolWindow::default();
159+
window.imp().settings.connect_changed(Some("enable-overamplification"), clone!(@weak self as widget => move |_,_| {
160+
update_overamplification(&widget.volume_scale);
161+
}));
162+
139163
let manager = PwvucontrolManager::default();
140164

141165
let defaultnodesapi = manager.default_nodes_api();

src/ui/window.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,9 @@ mod imp {
153153
}
154154
});
155155

156+
let overamplification_action = self.settings.create_action("enable-overamplification");
157+
self.obj().add_action(&overamplification_action);
158+
156159
self.obj().load_window_state();
157160
}
158161
}

0 commit comments

Comments
 (0)