summaryrefslogtreecommitdiff
path: root/src/spice-gstaudio.c
diff options
context:
space:
mode:
authorJakub Janků <jjanku@redhat.com>2021-02-19 11:24:47 +0100
committerJakub Janků <jjanku@redhat.com>2021-02-19 12:44:23 +0100
commit0ad07adc3ea3cce66f5551104caabea6a7e5ab6b (patch)
treeb3f5a6d8b3d89f98f69013e4382f7d202cbe0dab /src/spice-gstaudio.c
parent5f65dccb1a11c2901bdc8bf819834a5ffd666eca (diff)
gstaudio: remove record bus watch to release GstBus
The GSource added by gst_bus_add_watch() apparently holds a reference to the GstBus. This can be seen by running GST_DEBUG="GST_TRACER:7" GST_TRACERS="leaks" spicy: GST_TRACER :0:: object-alive, type-name=(string)GstBus, address=(gpointer)0x1e76db0, description=(string)<bus6>, ref-count=(uint)1, trace=(string); (note that gst_deinit() must be called for this output to be shown, which doesn't happen in virt-viewer; see 0381e62) To fix this, save the source's id returned by gst_bus_add_watch() and remove the source when the pipe is unreferenced. Signed-off-by: Jakub Janků <jjanku@redhat.com>
Diffstat (limited to 'src/spice-gstaudio.c')
-rw-r--r--src/spice-gstaudio.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/src/spice-gstaudio.c b/src/spice-gstaudio.c
index d56e19b..d67727f 100644
--- a/src/spice-gstaudio.c
+++ b/src/spice-gstaudio.c
@@ -41,6 +41,7 @@ struct _SpiceGstaudioPrivate {
struct stream playback;
struct stream record;
guint mmtime_id;
+ guint rbus_watch_id;
};
G_DEFINE_TYPE_WITH_PRIVATE(SpiceGstaudio, spice_gstaudio, SPICE_TYPE_AUDIO)
@@ -77,6 +78,10 @@ static void spice_gstaudio_dispose(GObject *obj)
p = gstaudio->priv;
stream_dispose(&p->playback);
+ if (p->rbus_watch_id > 0) {
+ g_source_remove(p->rbus_watch_id);
+ p->rbus_watch_id = 0;
+ }
stream_dispose(&p->record);
if (p->pchannel)
@@ -191,6 +196,10 @@ static void record_start(SpiceRecordChannel *channel, gint format, gint channels
(p->record.rate != frequency ||
p->record.channels != channels)) {
gst_element_set_state(p->record.pipe, GST_STATE_NULL);
+ if (p->rbus_watch_id > 0) {
+ g_source_remove(p->rbus_watch_id);
+ p->rbus_watch_id = 0;
+ }
g_clear_pointer(&p->record.pipe, gst_object_unref);
}
@@ -211,7 +220,7 @@ static void record_start(SpiceRecordChannel *channel, gint format, gint channels
}
bus = gst_pipeline_get_bus(GST_PIPELINE(p->record.pipe));
- gst_bus_add_watch(bus, record_bus_cb, data);
+ p->rbus_watch_id = gst_bus_add_watch(bus, record_bus_cb, data);
gst_object_unref(GST_OBJECT(bus));
p->record.src = gst_bin_get_by_name(GST_BIN(p->record.pipe), "audiosrc");