mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-06-07 07:58:51 +00:00
pulsesrc: Allocate/free PA mainloop during state changes
...also destroy the stream and context during state changes.
This commit is contained in:
parent
e69ba0f94f
commit
4a492f2c8a
1 changed files with 17 additions and 14 deletions
|
@ -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)
|
||||||
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)
|
||||||
{
|
{
|
||||||
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)
|
||||||
{
|
{
|
||||||
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)
|
||||||
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;
|
||||||
|
|
Loading…
Reference in a new issue