Commit 4a492f2c authored by Sebastian Dröge's avatar Sebastian Dröge
Browse files

pulsesrc: Allocate/free PA mainloop during state changes

...also destroy the stream and context during state changes.
parent e69ba0f9
...@@ -250,8 +250,6 @@ gst_pulsesrc_class_init (GstPulseSrcClass * klass) ...@@ -250,8 +250,6 @@ gst_pulsesrc_class_init (GstPulseSrcClass * klass)
static void static void
gst_pulsesrc_init (GstPulseSrc * pulsesrc, GstPulseSrcClass * klass) gst_pulsesrc_init (GstPulseSrc * pulsesrc, GstPulseSrcClass * klass)
{ {
int e;
pulsesrc->server = NULL; pulsesrc->server = NULL;
pulsesrc->device = NULL; pulsesrc->device = NULL;
pulsesrc->device_description = NULL; pulsesrc->device_description = NULL;
...@@ -274,12 +272,6 @@ gst_pulsesrc_init (GstPulseSrc * pulsesrc, GstPulseSrcClass * klass) ...@@ -274,12 +272,6 @@ gst_pulsesrc_init (GstPulseSrc * pulsesrc, GstPulseSrcClass * klass)
pulsesrc->paused = FALSE; pulsesrc->paused = FALSE;
pulsesrc->in_read = FALSE; pulsesrc->in_read = FALSE;
pulsesrc->mainloop = pa_threaded_mainloop_new ();
g_assert (pulsesrc->mainloop);
e = pa_threaded_mainloop_start (pulsesrc->mainloop);
g_assert (e == 0);
pulsesrc->mixer = NULL; pulsesrc->mixer = NULL;
pulsesrc->probe = gst_pulseprobe_new (G_OBJECT (pulsesrc), G_OBJECT_GET_CLASS (pulsesrc), PROP_DEVICE, pulsesrc->server, FALSE, TRUE); /* FALSE for sinks, TRUE for sources */ pulsesrc->probe = gst_pulseprobe_new (G_OBJECT (pulsesrc), G_OBJECT_GET_CLASS (pulsesrc), PROP_DEVICE, pulsesrc->server, FALSE, TRUE); /* FALSE for sinks, TRUE for sources */
...@@ -320,15 +312,9 @@ gst_pulsesrc_finalize (GObject * object) ...@@ -320,15 +312,9 @@ gst_pulsesrc_finalize (GObject * object)
{ {
GstPulseSrc *pulsesrc = GST_PULSESRC_CAST (object); GstPulseSrc *pulsesrc = GST_PULSESRC_CAST (object);
pa_threaded_mainloop_stop (pulsesrc->mainloop);
gst_pulsesrc_destroy_context (pulsesrc);
g_free (pulsesrc->server); g_free (pulsesrc->server);
g_free (pulsesrc->device); g_free (pulsesrc->device);
pa_threaded_mainloop_free (pulsesrc->mainloop);
if (pulsesrc->mixer) { if (pulsesrc->mixer) {
gst_pulsemixer_ctrl_free (pulsesrc->mixer); gst_pulsemixer_ctrl_free (pulsesrc->mixer);
pulsesrc->mixer = NULL; pulsesrc->mixer = NULL;
...@@ -1177,9 +1163,16 @@ gst_pulsesrc_change_state (GstElement * element, GstStateChange transition) ...@@ -1177,9 +1163,16 @@ gst_pulsesrc_change_state (GstElement * element, GstStateChange transition)
{ {
GstStateChangeReturn ret; GstStateChangeReturn ret;
GstPulseSrc *this = GST_PULSESRC_CAST (element); GstPulseSrc *this = GST_PULSESRC_CAST (element);
int e;
switch (transition) { switch (transition) {
case GST_STATE_CHANGE_NULL_TO_READY: case GST_STATE_CHANGE_NULL_TO_READY:
this->mainloop = pa_threaded_mainloop_new ();
g_assert (this->mainloop);
e = pa_threaded_mainloop_start (this->mainloop);
g_assert (e == 0);
if (!this->mixer) if (!this->mixer)
this->mixer = this->mixer =
gst_pulsemixer_ctrl_new (G_OBJECT (this), this->server, gst_pulsemixer_ctrl_new (G_OBJECT (this), this->server,
...@@ -1212,6 +1205,16 @@ gst_pulsesrc_change_state (GstElement * element, GstStateChange transition) ...@@ -1212,6 +1205,16 @@ gst_pulsesrc_change_state (GstElement * element, GstStateChange transition)
gst_pulsemixer_ctrl_free (this->mixer); gst_pulsemixer_ctrl_free (this->mixer);
this->mixer = NULL; this->mixer = NULL;
} }
if (this->mainloop)
pa_threaded_mainloop_stop (this->mainloop);
gst_pulsesrc_destroy_context (this);
if (this->mainloop) {
pa_threaded_mainloop_free (this->mainloop);
this->mainloop = NULL;
}
break; break;
default: default:
break; break;
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment