Skip to content

Commit 125bdcb

Browse files
committed
Fix lingering peak meter recording stream.
Only run the capture when needed. We use map/unmap for this.
1 parent 6e062bf commit 125bdcb

File tree

1 file changed

+27
-14
lines changed

1 file changed

+27
-14
lines changed

src/ui/volumebox.rs

+27-14
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,11 @@ use crate::{
66
};
77
use glib::{clone, closure_local, ControlFlow, SignalHandlerId};
88
use gtk::{prelude::*, subclass::prelude::*};
9-
use std::cell::{Cell, RefCell, OnceCell};
9+
use std::cell::{Cell, RefCell};
1010
use wireplumber as wp;
11+
use crate::pwvucontrol_warning;
1112

1213
mod imp {
13-
use crate::pwvucontrol_warning;
14-
1514
use super::*;
1615

1716
#[derive(Default, gtk::CompositeTemplate, glib::Properties)]
@@ -22,8 +21,8 @@ mod imp {
2221
pub(super) node_object: RefCell<Option<PwNodeObject>>,
2322

2423
metadata_changed_event: Cell<Option<SignalHandlerId>>,
25-
levelbarprovider: OnceCell<LevelbarProvider>,
26-
timeoutid: Cell<Option<glib::SourceId>>,
24+
levelbarprovider: Cell<Option<LevelbarProvider>>,
25+
timeoutid: Cell<Option<gtk::TickCallbackId>>,
2726
pub(super) level: Cell<f32>,
2827
pub(super) default_node: Cell<u32>,
2928
pub(super) default_node_changed_handler: RefCell<Option<Box<dyn Fn()>>>,
@@ -166,12 +165,6 @@ mod imp {
166165
self.level_bar.add_offset_value(gtk::LEVEL_BAR_OFFSET_HIGH, 0.0);
167166
self.level_bar.add_offset_value(gtk::LEVEL_BAR_OFFSET_FULL, 1.0);
168167

169-
// Monitoring ourselves cause an infinite loop.
170-
if item.name() != "pwvucontrol-peak-detect" {
171-
self.setuplevelbar();
172-
} else {
173-
self.level_bar.set_visible(false);
174-
}
175168
}
176169

177170
fn dispose(&self) {
@@ -181,12 +174,31 @@ mod imp {
181174
metadata.disconnect(sid);
182175
};
183176
};
177+
}
178+
}
179+
180+
impl WidgetImpl for PwVolumeBox {
181+
fn unmap(&self) {
184182
if let Some(t) = self.timeoutid.take() {
185183
t.remove();
186184
}
185+
self.levelbarprovider.take();
186+
self.parent_unmap();
187+
}
188+
189+
fn map(&self) {
190+
self.parent_map();
191+
192+
// Monitoring ourselves cause an infinite loop.
193+
let item = self.node_object.borrow();
194+
let item = item.as_ref().unwrap();
195+
if item.name() != "pwvucontrol-peak-detect" {
196+
self.setuplevelbar();
197+
} else {
198+
self.level_bar.set_visible(false);
199+
}
187200
}
188201
}
189-
impl WidgetImpl for PwVolumeBox {}
190202
impl ListBoxRowImpl for PwVolumeBox {}
191203

192204
impl BuildableImpl for PwVolumeBox {
@@ -217,13 +229,14 @@ mod imp {
217229
let item = item.as_ref().cloned().unwrap();
218230

219231
if let Ok(provider) = LevelbarProvider::new(&self.obj(), item.boundid()) {
220-
self.levelbarprovider.set(provider).expect("Provider not set already");
232+
self.levelbarprovider.set(Some(provider));
221233

222234
let obj = self.obj();
223-
self.level_bar.add_tick_callback(clone!(@strong obj => @default-panic, move |_, _| {
235+
let callbackid = self.level_bar.add_tick_callback(clone!(@strong obj => @default-panic, move |_, _| {
224236
obj.imp().level_bar.set_value(obj.imp().level.get() as f64);
225237
ControlFlow::Continue
226238
}));
239+
self.timeoutid.set(Some(callbackid));
227240
}
228241
}
229242
}

0 commit comments

Comments
 (0)