From 7f48fb37e97f0af6c3f6d026a47f05852aa0be3a Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Wed, 22 Sep 2010 18:50:44 +0200 Subject: [PATCH] pulse: fix device_description in READY Make the is_dead check more clear and add an option to check for the status of the stream in addition to the context. We don't need a stream to get the device_description string. Fixes #630317 --- ext/pulse/pulsesink.c | 46 +++++++++++++++++++----------------- ext/pulse/pulsesrc.c | 55 +++++++++++++++++++++---------------------- 2 files changed, 52 insertions(+), 49 deletions(-) diff --git a/ext/pulse/pulsesink.c b/ext/pulse/pulsesink.c index 4eb46b99f2..8bed0c1b29 100644 --- a/ext/pulse/pulsesink.c +++ b/ext/pulse/pulsesink.c @@ -341,20 +341,30 @@ gst_pulseringbuffer_finalize (GObject * object) G_OBJECT_CLASS (ring_parent_class)->finalize (object); } + +#define CONTEXT_OK(c) ((c) && PA_CONTEXT_IS_GOOD (pa_context_get_state ((c)))) +#define STREAM_OK(s) ((s) && PA_STREAM_IS_GOOD (pa_stream_get_state ((s)))) + static gboolean -gst_pulsering_is_dead (GstPulseSink * psink, GstPulseRingBuffer * pbuf) +gst_pulsering_is_dead (GstPulseSink * psink, GstPulseRingBuffer * pbuf, + gboolean check_stream) { - if (!pbuf->context - || !PA_CONTEXT_IS_GOOD (pa_context_get_state (pbuf->context)) - || !pbuf->stream - || !PA_STREAM_IS_GOOD (pa_stream_get_state (pbuf->stream))) { + if (!CONTEXT_OK (pbuf->context)) + goto error; + + if (check_stream && !STREAM_OK (pbuf->stream)) + goto error; + + return FALSE; + +error: + { const gchar *err_str = pbuf->context ? pa_strerror (pa_context_errno (pbuf->context)) : NULL; GST_ELEMENT_ERROR (psink, RESOURCE, FAILED, ("Disconnected: %s", err_str), (NULL)); return TRUE; } - return FALSE; } static void @@ -971,7 +981,7 @@ gst_pulsering_set_corked (GstPulseRingBuffer * pbuf, gboolean corked, while (wait && pa_operation_get_state (o) == PA_OPERATION_RUNNING) { pa_threaded_mainloop_wait (mainloop); - if (gst_pulsering_is_dead (psink, pbuf)) + if (gst_pulsering_is_dead (psink, pbuf, TRUE)) goto server_dead; } pbuf->corked = corked; @@ -1143,7 +1153,7 @@ gst_pulseringbuffer_stop (GstRingBuffer * buf) while (pa_operation_get_state (o) == PA_OPERATION_RUNNING) { GST_DEBUG_OBJECT (psink, "wait for completion"); pa_threaded_mainloop_wait (mainloop); - if (gst_pulsering_is_dead (psink, pbuf)) + if (gst_pulsering_is_dead (psink, pbuf, TRUE)) goto server_dead; } GST_DEBUG_OBJECT (psink, "flush completed"); @@ -1897,7 +1907,7 @@ gst_pulsesink_get_time (GstClock * clock, GstBaseAudioSink * sink) psink = GST_PULSESINK_CAST (GST_OBJECT_PARENT (pbuf)); pa_threaded_mainloop_lock (mainloop); - if (gst_pulsering_is_dead (psink, pbuf)) + if (gst_pulsering_is_dead (psink, pbuf, TRUE)) goto server_dead; /* if we don't have enough data to get a timestamp, just return NONE, which @@ -2176,7 +2186,7 @@ gst_pulsesink_get_volume (GstPulseSink * psink) while (pa_operation_get_state (o) == PA_OPERATION_RUNNING) { pa_threaded_mainloop_wait (mainloop); - if (gst_pulsering_is_dead (psink, pbuf)) + if (gst_pulsering_is_dead (psink, pbuf, TRUE)) goto unlock; } @@ -2248,7 +2258,7 @@ gst_pulsesink_get_mute (GstPulseSink * psink) while (pa_operation_get_state (o) == PA_OPERATION_RUNNING) { pa_threaded_mainloop_wait (mainloop); - if (gst_pulsering_is_dead (psink, pbuf)) + if (gst_pulsering_is_dead (psink, pbuf, TRUE)) goto unlock; } @@ -2300,11 +2310,6 @@ gst_pulsesink_sink_info_cb (pa_context * c, const pa_sink_info * i, int eol, if (!i) goto done; - if (!pbuf->stream) - goto done; - - g_assert (i->index == pa_stream_get_device_index (pbuf->stream)); - g_free (psink->device_description); psink->device_description = g_strdup (i->description); @@ -2324,17 +2329,16 @@ gst_pulsesink_device_description (GstPulseSink * psink) pa_threaded_mainloop_lock (mainloop); pbuf = GST_PULSERING_BUFFER_CAST (GST_BASE_AUDIO_SINK (psink)->ringbuffer); - if (pbuf == NULL || pbuf->stream == NULL) + if (pbuf == NULL) goto no_buffer; - if (!(o = pa_context_get_sink_info_by_index (pbuf->context, - pa_stream_get_device_index (pbuf->stream), - gst_pulsesink_sink_info_cb, pbuf))) + if (!(o = pa_context_get_sink_info_by_name (pbuf->context, + psink->device, gst_pulsesink_sink_info_cb, pbuf))) goto info_failed; while (pa_operation_get_state (o) == PA_OPERATION_RUNNING) { pa_threaded_mainloop_wait (mainloop); - if (gst_pulsering_is_dead (psink, pbuf)) + if (gst_pulsering_is_dead (psink, pbuf, FALSE)) goto unlock; } diff --git a/ext/pulse/pulsesrc.c b/ext/pulse/pulsesrc.c index 0baad9f163..0509bfd6e1 100644 --- a/ext/pulse/pulsesrc.c +++ b/ext/pulse/pulsesrc.c @@ -359,23 +359,28 @@ gst_pulsesrc_finalize (GObject * object) G_OBJECT_CLASS (parent_class)->finalize (object); } -static gboolean -gst_pulsesrc_is_dead (GstPulseSrc * pulsesrc) -{ +#define CONTEXT_OK(c) ((c) && PA_CONTEXT_IS_GOOD (pa_context_get_state ((c)))) +#define STREAM_OK(s) ((s) && PA_STREAM_IS_GOOD (pa_stream_get_state ((s)))) - if (!pulsesrc->context - || !PA_CONTEXT_IS_GOOD (pa_context_get_state (pulsesrc->context)) - || !pulsesrc->stream - || !PA_STREAM_IS_GOOD (pa_stream_get_state (pulsesrc->stream))) { +static gboolean +gst_pulsesrc_is_dead (GstPulseSrc * pulsesrc, gboolean check_stream) +{ + if (!CONTEXT_OK (pulsesrc->context)) + goto error; + + if (check_stream && !STREAM_OK (pulsesrc->stream)) + goto error; + + return FALSE; + +error: + { const gchar *err_str = pulsesrc->context ? pa_strerror (pa_context_errno (pulsesrc->context)) : NULL; - GST_ELEMENT_ERROR ((pulsesrc), RESOURCE, FAILED, ("Disconnected: %s", err_str), (NULL)); return TRUE; } - - return FALSE; } static void @@ -385,15 +390,13 @@ gst_pulsesrc_source_info_cb (pa_context * c, const pa_source_info * i, int eol, GstPulseSrc *pulsesrc = GST_PULSESRC_CAST (userdata); if (!i) - return; - - if (!pulsesrc->stream) - return; - - g_assert (i->index == pa_stream_get_device_index (pulsesrc->stream)); + goto done; g_free (pulsesrc->device_description); pulsesrc->device_description = g_strdup (i->description); + +done: + pa_threaded_mainloop_signal (pulsesrc->mainloop, 0); } static gchar * @@ -407,12 +410,8 @@ gst_pulsesrc_device_description (GstPulseSrc * pulsesrc) pa_threaded_mainloop_lock (pulsesrc->mainloop); - if (!pulsesrc->stream) - goto unlock; - - if (!(o = pa_context_get_source_info_by_index (pulsesrc->context, - pa_stream_get_device_index (pulsesrc->stream), - gst_pulsesrc_source_info_cb, pulsesrc))) { + if (!(o = pa_context_get_source_info_by_name (pulsesrc->context, + pulsesrc->device, gst_pulsesrc_source_info_cb, pulsesrc))) { GST_ELEMENT_ERROR (pulsesrc, RESOURCE, FAILED, ("pa_stream_get_source_info() failed: %s", @@ -422,7 +421,7 @@ gst_pulsesrc_device_description (GstPulseSrc * pulsesrc) while (pa_operation_get_state (o) == PA_OPERATION_RUNNING) { - if (gst_pulsesrc_is_dead (pulsesrc)) + if (gst_pulsesrc_is_dead (pulsesrc, FALSE)) goto unlock; pa_threaded_mainloop_wait (pulsesrc->mainloop); @@ -713,7 +712,7 @@ gst_pulsesrc_read (GstAudioSrc * asrc, gpointer data, guint length) /*check if we have a leftover buffer */ if (!pulsesrc->read_buffer) { for (;;) { - if (gst_pulsesrc_is_dead (pulsesrc)) + if (gst_pulsesrc_is_dead (pulsesrc, TRUE)) goto unlock_and_fail; /* read all available data, we keep a pointer to the data and the length @@ -805,7 +804,7 @@ gst_pulsesrc_delay (GstAudioSrc * asrc) guint result; pa_threaded_mainloop_lock (pulsesrc->mainloop); - if (gst_pulsesrc_is_dead (pulsesrc)) + if (gst_pulsesrc_is_dead (pulsesrc, TRUE)) goto server_dead; /* get the latency, this can fail when we don't have a latency update yet. @@ -1100,7 +1099,7 @@ gst_pulsesrc_reset (GstAudioSrc * asrc) pa_threaded_mainloop_lock (pulsesrc->mainloop); GST_DEBUG_OBJECT (pulsesrc, "reset"); - if (gst_pulsesrc_is_dead (pulsesrc)) + if (gst_pulsesrc_is_dead (pulsesrc, TRUE)) goto unlock_and_fail; if (!(o = @@ -1121,7 +1120,7 @@ gst_pulsesrc_reset (GstAudioSrc * asrc) pulsesrc->operation_success = FALSE; while (pa_operation_get_state (o) == PA_OPERATION_RUNNING) { - if (gst_pulsesrc_is_dead (pulsesrc)) + if (gst_pulsesrc_is_dead (pulsesrc, TRUE)) goto unlock_and_fail; pa_threaded_mainloop_wait (pulsesrc->mainloop); @@ -1159,7 +1158,7 @@ gst_pulsesrc_set_corked (GstPulseSrc * psrc, gboolean corked, gboolean wait) while (wait && pa_operation_get_state (o) == PA_OPERATION_RUNNING) { pa_threaded_mainloop_wait (psrc->mainloop); - if (gst_pulsesrc_is_dead (psrc)) + if (gst_pulsesrc_is_dead (psrc, TRUE)) goto server_dead; } psrc->corked = corked;