mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-02-17 11:45:25 +00:00
pulsesink: move the shared mainloop from class to static var
Just have one static var for the shared mainloop instead of one class variable and copies in the instance.
This commit is contained in:
parent
604c6555a4
commit
ae8d210fdb
2 changed files with 96 additions and 102 deletions
|
@ -104,17 +104,26 @@ typedef struct _GstPulseRingBufferClass GstPulseRingBufferClass;
|
||||||
|
|
||||||
typedef struct _GstPulseContext GstPulseContext;
|
typedef struct _GstPulseContext GstPulseContext;
|
||||||
|
|
||||||
|
/* Store the PA contexts in a hash table to allow easy sharing among
|
||||||
|
* multiple instances of the sink. Keys are $context_name@$server_name
|
||||||
|
* (strings) and values should be GstPulseContext pointers.
|
||||||
|
*/
|
||||||
struct _GstPulseContext
|
struct _GstPulseContext
|
||||||
{
|
{
|
||||||
pa_context *context;
|
pa_context *context;
|
||||||
GSList *ring_buffers;
|
GSList *ring_buffers;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Store the PA contexts in a hash table to allow easy sharing among
|
|
||||||
* multiple instances of the sink. Keys are $context_name@$server_name
|
|
||||||
* (strings) and values should be GstPulseContext pointers. */
|
|
||||||
static GHashTable *gst_pulse_shared_contexts = NULL;
|
static GHashTable *gst_pulse_shared_contexts = NULL;
|
||||||
|
|
||||||
|
/* use one static main-loop for all instances
|
||||||
|
* this is needed to make the context sharing work as the contexts are
|
||||||
|
* released when releasing their parent main-loop
|
||||||
|
*/
|
||||||
|
static pa_threaded_mainloop *mainloop = NULL;
|
||||||
|
static guint mainloop_ref_ct = 0;
|
||||||
|
|
||||||
|
/* lock for access to shared resources */
|
||||||
static GMutex *pa_shared_ressource_mutex = NULL;
|
static GMutex *pa_shared_ressource_mutex = NULL;
|
||||||
|
|
||||||
/* We keep a custom ringbuffer that is backed up by data allocated by
|
/* We keep a custom ringbuffer that is backed up by data allocated by
|
||||||
|
@ -432,7 +441,7 @@ gst_pulseringbuffer_open_device (GstRingBuffer * buf)
|
||||||
else
|
else
|
||||||
pbuf->context_name = g_strdup (psink->client_name);
|
pbuf->context_name = g_strdup (psink->client_name);
|
||||||
|
|
||||||
pa_threaded_mainloop_lock (psink->mainloop);
|
pa_threaded_mainloop_lock (mainloop);
|
||||||
g_mutex_lock (pa_shared_ressource_mutex);
|
g_mutex_lock (pa_shared_ressource_mutex);
|
||||||
|
|
||||||
pctx = g_hash_table_lookup (gst_pulse_shared_contexts, pbuf->context_name);
|
pctx = g_hash_table_lookup (gst_pulse_shared_contexts, pbuf->context_name);
|
||||||
|
@ -442,7 +451,7 @@ gst_pulseringbuffer_open_device (GstRingBuffer * buf)
|
||||||
/* get the mainloop api and create a context */
|
/* get the mainloop api and create a context */
|
||||||
GST_INFO_OBJECT (psink, "new context with name %s, pbuf=%p, pctx=%p",
|
GST_INFO_OBJECT (psink, "new context with name %s, pbuf=%p, pctx=%p",
|
||||||
pbuf->context_name, pbuf, pctx);
|
pbuf->context_name, pbuf, pctx);
|
||||||
api = pa_threaded_mainloop_get_api (psink->mainloop);
|
api = pa_threaded_mainloop_get_api (mainloop);
|
||||||
if (!(pctx->context = pa_context_new (api, pbuf->context_name)))
|
if (!(pctx->context = pa_context_new (api, pbuf->context_name)))
|
||||||
goto create_failed;
|
goto create_failed;
|
||||||
|
|
||||||
|
@ -451,7 +460,7 @@ gst_pulseringbuffer_open_device (GstRingBuffer * buf)
|
||||||
g_strdup (pbuf->context_name), (gpointer) pctx);
|
g_strdup (pbuf->context_name), (gpointer) pctx);
|
||||||
/* register some essential callbacks */
|
/* register some essential callbacks */
|
||||||
pa_context_set_state_callback (pctx->context,
|
pa_context_set_state_callback (pctx->context,
|
||||||
gst_pulsering_context_state_cb, psink->mainloop);
|
gst_pulsering_context_state_cb, mainloop);
|
||||||
#ifdef HAVE_PULSE_0_9_12
|
#ifdef HAVE_PULSE_0_9_12
|
||||||
pa_context_set_subscribe_callback (pctx->context,
|
pa_context_set_subscribe_callback (pctx->context,
|
||||||
gst_pulsering_context_subscribe_cb, pctx);
|
gst_pulsering_context_subscribe_cb, pctx);
|
||||||
|
@ -489,13 +498,13 @@ gst_pulseringbuffer_open_device (GstRingBuffer * buf)
|
||||||
|
|
||||||
/* Wait until the context is ready */
|
/* Wait until the context is ready */
|
||||||
GST_LOG_OBJECT (psink, "waiting..");
|
GST_LOG_OBJECT (psink, "waiting..");
|
||||||
pa_threaded_mainloop_wait (psink->mainloop);
|
pa_threaded_mainloop_wait (mainloop);
|
||||||
}
|
}
|
||||||
|
|
||||||
GST_LOG_OBJECT (psink, "opened the device");
|
GST_LOG_OBJECT (psink, "opened the device");
|
||||||
|
|
||||||
g_mutex_unlock (pa_shared_ressource_mutex);
|
g_mutex_unlock (pa_shared_ressource_mutex);
|
||||||
pa_threaded_mainloop_unlock (psink->mainloop);
|
pa_threaded_mainloop_unlock (mainloop);
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
|
@ -505,7 +514,7 @@ unlock_and_fail:
|
||||||
g_mutex_unlock (pa_shared_ressource_mutex);
|
g_mutex_unlock (pa_shared_ressource_mutex);
|
||||||
gst_pulsering_destroy_context (pbuf);
|
gst_pulsering_destroy_context (pbuf);
|
||||||
|
|
||||||
pa_threaded_mainloop_unlock (psink->mainloop);
|
pa_threaded_mainloop_unlock (mainloop);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
create_failed:
|
create_failed:
|
||||||
|
@ -535,9 +544,9 @@ gst_pulseringbuffer_close_device (GstRingBuffer * buf)
|
||||||
|
|
||||||
GST_LOG_OBJECT (psink, "closing device");
|
GST_LOG_OBJECT (psink, "closing device");
|
||||||
|
|
||||||
pa_threaded_mainloop_lock (psink->mainloop);
|
pa_threaded_mainloop_lock (mainloop);
|
||||||
gst_pulsering_destroy_context (pbuf);
|
gst_pulsering_destroy_context (pbuf);
|
||||||
pa_threaded_mainloop_unlock (psink->mainloop);
|
pa_threaded_mainloop_unlock (mainloop);
|
||||||
|
|
||||||
GST_LOG_OBJECT (psink, "closed device");
|
GST_LOG_OBJECT (psink, "closed device");
|
||||||
|
|
||||||
|
@ -562,7 +571,7 @@ gst_pulsering_stream_state_cb (pa_stream * s, void *userdata)
|
||||||
case PA_STREAM_FAILED:
|
case PA_STREAM_FAILED:
|
||||||
case PA_STREAM_TERMINATED:
|
case PA_STREAM_TERMINATED:
|
||||||
GST_LOG_OBJECT (psink, "signaling");
|
GST_LOG_OBJECT (psink, "signaling");
|
||||||
pa_threaded_mainloop_signal (psink->mainloop, 0);
|
pa_threaded_mainloop_signal (mainloop, 0);
|
||||||
break;
|
break;
|
||||||
case PA_STREAM_UNCONNECTED:
|
case PA_STREAM_UNCONNECTED:
|
||||||
case PA_STREAM_CREATING:
|
case PA_STREAM_CREATING:
|
||||||
|
@ -586,7 +595,7 @@ gst_pulsering_stream_request_cb (pa_stream * s, size_t length, void *userdata)
|
||||||
if (pbuf->in_commit && (length >= rbuf->spec.segsize)) {
|
if (pbuf->in_commit && (length >= rbuf->spec.segsize)) {
|
||||||
/* only signal when we are waiting in the commit thread
|
/* only signal when we are waiting in the commit thread
|
||||||
* and got request for atleast a segment */
|
* and got request for atleast a segment */
|
||||||
pa_threaded_mainloop_signal (psink->mainloop, 0);
|
pa_threaded_mainloop_signal (mainloop, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -730,7 +739,7 @@ gst_pulseringbuffer_acquire (GstRingBuffer * buf, GstRingBufferSpec * spec)
|
||||||
if (!gst_pulse_fill_sample_spec (spec, &pbuf->sample_spec))
|
if (!gst_pulse_fill_sample_spec (spec, &pbuf->sample_spec))
|
||||||
goto invalid_spec;
|
goto invalid_spec;
|
||||||
|
|
||||||
pa_threaded_mainloop_lock (psink->mainloop);
|
pa_threaded_mainloop_lock (mainloop);
|
||||||
|
|
||||||
/* we need a context and a no stream */
|
/* we need a context and a no stream */
|
||||||
g_assert (pbuf->context);
|
g_assert (pbuf->context);
|
||||||
|
@ -850,7 +859,7 @@ gst_pulseringbuffer_acquire (GstRingBuffer * buf, GstRingBufferSpec * spec)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
/* Wait until the stream is ready */
|
/* Wait until the stream is ready */
|
||||||
pa_threaded_mainloop_wait (psink->mainloop);
|
pa_threaded_mainloop_wait (mainloop);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* After we passed the volume off of to PA we never want to set it
|
/* After we passed the volume off of to PA we never want to set it
|
||||||
|
@ -872,7 +881,7 @@ gst_pulseringbuffer_acquire (GstRingBuffer * buf, GstRingBufferSpec * spec)
|
||||||
spec->segsize = actual->minreq;
|
spec->segsize = actual->minreq;
|
||||||
spec->segtotal = actual->tlength / spec->segsize;
|
spec->segtotal = actual->tlength / spec->segsize;
|
||||||
|
|
||||||
pa_threaded_mainloop_unlock (psink->mainloop);
|
pa_threaded_mainloop_unlock (mainloop);
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
|
@ -880,7 +889,7 @@ gst_pulseringbuffer_acquire (GstRingBuffer * buf, GstRingBufferSpec * spec)
|
||||||
unlock_and_fail:
|
unlock_and_fail:
|
||||||
{
|
{
|
||||||
gst_pulsering_destroy_stream (pbuf);
|
gst_pulsering_destroy_stream (pbuf);
|
||||||
pa_threaded_mainloop_unlock (psink->mainloop);
|
pa_threaded_mainloop_unlock (mainloop);
|
||||||
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
@ -923,9 +932,9 @@ gst_pulseringbuffer_release (GstRingBuffer * buf)
|
||||||
psink = GST_PULSESINK_CAST (GST_OBJECT_PARENT (buf));
|
psink = GST_PULSESINK_CAST (GST_OBJECT_PARENT (buf));
|
||||||
pbuf = GST_PULSERING_BUFFER_CAST (buf);
|
pbuf = GST_PULSERING_BUFFER_CAST (buf);
|
||||||
|
|
||||||
pa_threaded_mainloop_lock (psink->mainloop);
|
pa_threaded_mainloop_lock (mainloop);
|
||||||
gst_pulsering_destroy_stream (pbuf);
|
gst_pulsering_destroy_stream (pbuf);
|
||||||
pa_threaded_mainloop_unlock (psink->mainloop);
|
pa_threaded_mainloop_unlock (mainloop);
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
@ -939,7 +948,7 @@ gst_pulsering_success_cb (pa_stream * s, int success, void *userdata)
|
||||||
pbuf = GST_PULSERING_BUFFER_CAST (userdata);
|
pbuf = GST_PULSERING_BUFFER_CAST (userdata);
|
||||||
psink = GST_PULSESINK_CAST (GST_OBJECT_PARENT (pbuf));
|
psink = GST_PULSESINK_CAST (GST_OBJECT_PARENT (pbuf));
|
||||||
|
|
||||||
pa_threaded_mainloop_signal (psink->mainloop, 0);
|
pa_threaded_mainloop_signal (mainloop, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* update the corked state of a stream, must be called with the mainloop
|
/* update the corked state of a stream, must be called with the mainloop
|
||||||
|
@ -961,7 +970,7 @@ gst_pulsering_set_corked (GstPulseRingBuffer * pbuf, gboolean corked,
|
||||||
goto cork_failed;
|
goto cork_failed;
|
||||||
|
|
||||||
while (wait && pa_operation_get_state (o) == PA_OPERATION_RUNNING) {
|
while (wait && pa_operation_get_state (o) == PA_OPERATION_RUNNING) {
|
||||||
pa_threaded_mainloop_wait (psink->mainloop);
|
pa_threaded_mainloop_wait (mainloop);
|
||||||
if (gst_pulsering_is_dead (psink, pbuf))
|
if (gst_pulsering_is_dead (psink, pbuf))
|
||||||
goto server_dead;
|
goto server_dead;
|
||||||
}
|
}
|
||||||
|
@ -1002,14 +1011,14 @@ gst_pulseringbuffer_clear (GstRingBuffer * buf)
|
||||||
pbuf = GST_PULSERING_BUFFER_CAST (buf);
|
pbuf = GST_PULSERING_BUFFER_CAST (buf);
|
||||||
psink = GST_PULSESINK_CAST (GST_OBJECT_PARENT (pbuf));
|
psink = GST_PULSESINK_CAST (GST_OBJECT_PARENT (pbuf));
|
||||||
|
|
||||||
pa_threaded_mainloop_lock (psink->mainloop);
|
pa_threaded_mainloop_lock (mainloop);
|
||||||
GST_DEBUG_OBJECT (psink, "clearing");
|
GST_DEBUG_OBJECT (psink, "clearing");
|
||||||
if (pbuf->stream) {
|
if (pbuf->stream) {
|
||||||
/* don't wait for the flush to complete */
|
/* don't wait for the flush to complete */
|
||||||
if ((o = pa_stream_flush (pbuf->stream, NULL, pbuf)))
|
if ((o = pa_stream_flush (pbuf->stream, NULL, pbuf)))
|
||||||
pa_operation_unref (o);
|
pa_operation_unref (o);
|
||||||
}
|
}
|
||||||
pa_threaded_mainloop_unlock (psink->mainloop);
|
pa_threaded_mainloop_unlock (mainloop);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -1031,7 +1040,7 @@ mainloop_enter_defer_cb (pa_mainloop_api * api, void *userdata)
|
||||||
|
|
||||||
/* signal the waiter */
|
/* signal the waiter */
|
||||||
pulsesink->pa_defer_ran = TRUE;
|
pulsesink->pa_defer_ran = TRUE;
|
||||||
pa_threaded_mainloop_signal (pulsesink->mainloop, 0);
|
pa_threaded_mainloop_signal (mainloop, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* start/resume playback ASAP, we don't uncork here but in the commit method */
|
/* start/resume playback ASAP, we don't uncork here but in the commit method */
|
||||||
|
@ -1044,17 +1053,17 @@ gst_pulseringbuffer_start (GstRingBuffer * buf)
|
||||||
pbuf = GST_PULSERING_BUFFER_CAST (buf);
|
pbuf = GST_PULSERING_BUFFER_CAST (buf);
|
||||||
psink = GST_PULSESINK_CAST (GST_OBJECT_PARENT (pbuf));
|
psink = GST_PULSESINK_CAST (GST_OBJECT_PARENT (pbuf));
|
||||||
|
|
||||||
pa_threaded_mainloop_lock (psink->mainloop);
|
pa_threaded_mainloop_lock (mainloop);
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (psink, "scheduling stream status");
|
GST_DEBUG_OBJECT (psink, "scheduling stream status");
|
||||||
psink->pa_defer_ran = FALSE;
|
psink->pa_defer_ran = FALSE;
|
||||||
pa_mainloop_api_once (pa_threaded_mainloop_get_api (psink->mainloop),
|
pa_mainloop_api_once (pa_threaded_mainloop_get_api (mainloop),
|
||||||
mainloop_enter_defer_cb, psink);
|
mainloop_enter_defer_cb, psink);
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (psink, "starting");
|
GST_DEBUG_OBJECT (psink, "starting");
|
||||||
pbuf->paused = FALSE;
|
pbuf->paused = FALSE;
|
||||||
gst_pulsering_set_corked (pbuf, FALSE, FALSE);
|
gst_pulsering_set_corked (pbuf, FALSE, FALSE);
|
||||||
pa_threaded_mainloop_unlock (psink->mainloop);
|
pa_threaded_mainloop_unlock (mainloop);
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
@ -1070,7 +1079,7 @@ gst_pulseringbuffer_pause (GstRingBuffer * buf)
|
||||||
pbuf = GST_PULSERING_BUFFER_CAST (buf);
|
pbuf = GST_PULSERING_BUFFER_CAST (buf);
|
||||||
psink = GST_PULSESINK_CAST (GST_OBJECT_PARENT (pbuf));
|
psink = GST_PULSESINK_CAST (GST_OBJECT_PARENT (pbuf));
|
||||||
|
|
||||||
pa_threaded_mainloop_lock (psink->mainloop);
|
pa_threaded_mainloop_lock (mainloop);
|
||||||
GST_DEBUG_OBJECT (psink, "pausing and corking");
|
GST_DEBUG_OBJECT (psink, "pausing and corking");
|
||||||
/* make sure the commit method stops writing */
|
/* make sure the commit method stops writing */
|
||||||
pbuf->paused = TRUE;
|
pbuf->paused = TRUE;
|
||||||
|
@ -1078,9 +1087,9 @@ gst_pulseringbuffer_pause (GstRingBuffer * buf)
|
||||||
if (pbuf->in_commit) {
|
if (pbuf->in_commit) {
|
||||||
/* we are waiting in a commit, signal */
|
/* we are waiting in a commit, signal */
|
||||||
GST_DEBUG_OBJECT (psink, "signal commit");
|
GST_DEBUG_OBJECT (psink, "signal commit");
|
||||||
pa_threaded_mainloop_signal (psink->mainloop, 0);
|
pa_threaded_mainloop_signal (mainloop, 0);
|
||||||
}
|
}
|
||||||
pa_threaded_mainloop_unlock (psink->mainloop);
|
pa_threaded_mainloop_unlock (mainloop);
|
||||||
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
@ -1102,7 +1111,7 @@ mainloop_leave_defer_cb (pa_mainloop_api * api, void *userdata)
|
||||||
gst_element_post_message (GST_ELEMENT (pulsesink), message);
|
gst_element_post_message (GST_ELEMENT (pulsesink), message);
|
||||||
|
|
||||||
pulsesink->pa_defer_ran = TRUE;
|
pulsesink->pa_defer_ran = TRUE;
|
||||||
pa_threaded_mainloop_signal (pulsesink->mainloop, 0);
|
pa_threaded_mainloop_signal (mainloop, 0);
|
||||||
gst_object_unref (pulsesink);
|
gst_object_unref (pulsesink);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1118,13 +1127,13 @@ gst_pulseringbuffer_stop (GstRingBuffer * buf)
|
||||||
pbuf = GST_PULSERING_BUFFER_CAST (buf);
|
pbuf = GST_PULSERING_BUFFER_CAST (buf);
|
||||||
psink = GST_PULSESINK_CAST (GST_OBJECT_PARENT (pbuf));
|
psink = GST_PULSESINK_CAST (GST_OBJECT_PARENT (pbuf));
|
||||||
|
|
||||||
pa_threaded_mainloop_lock (psink->mainloop);
|
pa_threaded_mainloop_lock (mainloop);
|
||||||
pbuf->paused = TRUE;
|
pbuf->paused = TRUE;
|
||||||
res = gst_pulsering_set_corked (pbuf, TRUE, TRUE);
|
res = gst_pulsering_set_corked (pbuf, TRUE, TRUE);
|
||||||
/* Inform anyone waiting in _commit() call that it shall wakeup */
|
/* Inform anyone waiting in _commit() call that it shall wakeup */
|
||||||
if (pbuf->in_commit) {
|
if (pbuf->in_commit) {
|
||||||
GST_DEBUG_OBJECT (psink, "signal commit thread");
|
GST_DEBUG_OBJECT (psink, "signal commit thread");
|
||||||
pa_threaded_mainloop_signal (psink->mainloop, 0);
|
pa_threaded_mainloop_signal (mainloop, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (strcmp (psink->pa_version, "0.9.12")) {
|
if (strcmp (psink->pa_version, "0.9.12")) {
|
||||||
|
@ -1133,7 +1142,7 @@ gst_pulseringbuffer_stop (GstRingBuffer * buf)
|
||||||
if ((o = pa_stream_flush (pbuf->stream, gst_pulsering_success_cb, pbuf))) {
|
if ((o = pa_stream_flush (pbuf->stream, gst_pulsering_success_cb, pbuf))) {
|
||||||
while (pa_operation_get_state (o) == PA_OPERATION_RUNNING) {
|
while (pa_operation_get_state (o) == PA_OPERATION_RUNNING) {
|
||||||
GST_DEBUG_OBJECT (psink, "wait for completion");
|
GST_DEBUG_OBJECT (psink, "wait for completion");
|
||||||
pa_threaded_mainloop_wait (psink->mainloop);
|
pa_threaded_mainloop_wait (mainloop);
|
||||||
if (gst_pulsering_is_dead (psink, pbuf))
|
if (gst_pulsering_is_dead (psink, pbuf))
|
||||||
goto server_dead;
|
goto server_dead;
|
||||||
}
|
}
|
||||||
|
@ -1151,11 +1160,11 @@ cleanup:
|
||||||
GST_DEBUG_OBJECT (psink, "scheduling stream status");
|
GST_DEBUG_OBJECT (psink, "scheduling stream status");
|
||||||
psink->pa_defer_ran = FALSE;
|
psink->pa_defer_ran = FALSE;
|
||||||
gst_object_ref (psink);
|
gst_object_ref (psink);
|
||||||
pa_mainloop_api_once (pa_threaded_mainloop_get_api (psink->mainloop),
|
pa_mainloop_api_once (pa_threaded_mainloop_get_api (mainloop),
|
||||||
mainloop_leave_defer_cb, psink);
|
mainloop_leave_defer_cb, psink);
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (psink, "waiting for stream status");
|
GST_DEBUG_OBJECT (psink, "waiting for stream status");
|
||||||
pa_threaded_mainloop_unlock (psink->mainloop);
|
pa_threaded_mainloop_unlock (mainloop);
|
||||||
|
|
||||||
return res;
|
return res;
|
||||||
|
|
||||||
|
@ -1275,7 +1284,7 @@ gst_pulseringbuffer_commit (GstRingBuffer * buf, guint64 * sample,
|
||||||
goto start_failed;
|
goto start_failed;
|
||||||
}
|
}
|
||||||
|
|
||||||
pa_threaded_mainloop_lock (psink->mainloop);
|
pa_threaded_mainloop_lock (mainloop);
|
||||||
GST_DEBUG_OBJECT (psink, "entering commit");
|
GST_DEBUG_OBJECT (psink, "entering commit");
|
||||||
pbuf->in_commit = TRUE;
|
pbuf->in_commit = TRUE;
|
||||||
|
|
||||||
|
@ -1367,7 +1376,7 @@ gst_pulseringbuffer_commit (GstRingBuffer * buf, guint64 * sample,
|
||||||
|
|
||||||
/* we can't write a single byte, wait a bit */
|
/* we can't write a single byte, wait a bit */
|
||||||
GST_LOG_OBJECT (psink, "waiting for free space");
|
GST_LOG_OBJECT (psink, "waiting for free space");
|
||||||
pa_threaded_mainloop_wait (psink->mainloop);
|
pa_threaded_mainloop_wait (mainloop);
|
||||||
|
|
||||||
if (pbuf->paused)
|
if (pbuf->paused)
|
||||||
goto was_paused;
|
goto was_paused;
|
||||||
|
@ -1487,7 +1496,7 @@ gst_pulseringbuffer_commit (GstRingBuffer * buf, guint64 * sample,
|
||||||
|
|
||||||
/* we can't write a single byte, wait a bit */
|
/* we can't write a single byte, wait a bit */
|
||||||
GST_LOG_OBJECT (psink, "waiting for free space");
|
GST_LOG_OBJECT (psink, "waiting for free space");
|
||||||
pa_threaded_mainloop_wait (psink->mainloop);
|
pa_threaded_mainloop_wait (mainloop);
|
||||||
|
|
||||||
if (pbuf->paused)
|
if (pbuf->paused)
|
||||||
goto was_paused;
|
goto was_paused;
|
||||||
|
@ -1575,7 +1584,7 @@ gst_pulseringbuffer_commit (GstRingBuffer * buf, guint64 * sample,
|
||||||
data = data_end + bps;
|
data = data_end + bps;
|
||||||
|
|
||||||
pbuf->in_commit = FALSE;
|
pbuf->in_commit = FALSE;
|
||||||
pa_threaded_mainloop_unlock (psink->mainloop);
|
pa_threaded_mainloop_unlock (mainloop);
|
||||||
|
|
||||||
done:
|
done:
|
||||||
result = inr - ((data_end - data) / bps);
|
result = inr - ((data_end - data) / bps);
|
||||||
|
@ -1588,7 +1597,7 @@ unlock_and_fail:
|
||||||
{
|
{
|
||||||
pbuf->in_commit = FALSE;
|
pbuf->in_commit = FALSE;
|
||||||
GST_LOG_OBJECT (psink, "we are reset");
|
GST_LOG_OBJECT (psink, "we are reset");
|
||||||
pa_threaded_mainloop_unlock (psink->mainloop);
|
pa_threaded_mainloop_unlock (mainloop);
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
no_start:
|
no_start:
|
||||||
|
@ -1605,14 +1614,14 @@ uncork_failed:
|
||||||
{
|
{
|
||||||
pbuf->in_commit = FALSE;
|
pbuf->in_commit = FALSE;
|
||||||
GST_ERROR_OBJECT (psink, "uncork failed");
|
GST_ERROR_OBJECT (psink, "uncork failed");
|
||||||
pa_threaded_mainloop_unlock (psink->mainloop);
|
pa_threaded_mainloop_unlock (mainloop);
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
was_paused:
|
was_paused:
|
||||||
{
|
{
|
||||||
pbuf->in_commit = FALSE;
|
pbuf->in_commit = FALSE;
|
||||||
GST_LOG_OBJECT (psink, "we are paused");
|
GST_LOG_OBJECT (psink, "we are paused");
|
||||||
pa_threaded_mainloop_unlock (psink->mainloop);
|
pa_threaded_mainloop_unlock (mainloop);
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
writable_size_failed:
|
writable_size_failed:
|
||||||
|
@ -1887,7 +1896,7 @@ gst_pulsesink_get_time (GstClock * clock, GstBaseAudioSink * sink)
|
||||||
pbuf = GST_PULSERING_BUFFER_CAST (sink->ringbuffer);
|
pbuf = GST_PULSERING_BUFFER_CAST (sink->ringbuffer);
|
||||||
psink = GST_PULSESINK_CAST (GST_OBJECT_PARENT (pbuf));
|
psink = GST_PULSESINK_CAST (GST_OBJECT_PARENT (pbuf));
|
||||||
|
|
||||||
pa_threaded_mainloop_lock (psink->mainloop);
|
pa_threaded_mainloop_lock (mainloop);
|
||||||
if (gst_pulsering_is_dead (psink, pbuf))
|
if (gst_pulsering_is_dead (psink, pbuf))
|
||||||
goto server_dead;
|
goto server_dead;
|
||||||
|
|
||||||
|
@ -1898,7 +1907,7 @@ gst_pulsesink_get_time (GstClock * clock, GstBaseAudioSink * sink)
|
||||||
time = GST_CLOCK_TIME_NONE;
|
time = GST_CLOCK_TIME_NONE;
|
||||||
} else
|
} else
|
||||||
time *= 1000;
|
time *= 1000;
|
||||||
pa_threaded_mainloop_unlock (psink->mainloop);
|
pa_threaded_mainloop_unlock (mainloop);
|
||||||
|
|
||||||
GST_LOG_OBJECT (psink, "current time is %" GST_TIME_FORMAT,
|
GST_LOG_OBJECT (psink, "current time is %" GST_TIME_FORMAT,
|
||||||
GST_TIME_ARGS (time));
|
GST_TIME_ARGS (time));
|
||||||
|
@ -1909,7 +1918,7 @@ gst_pulsesink_get_time (GstClock * clock, GstBaseAudioSink * sink)
|
||||||
server_dead:
|
server_dead:
|
||||||
{
|
{
|
||||||
GST_DEBUG_OBJECT (psink, "the server is dead");
|
GST_DEBUG_OBJECT (psink, "the server is dead");
|
||||||
pa_threaded_mainloop_unlock (psink->mainloop);
|
pa_threaded_mainloop_unlock (mainloop);
|
||||||
|
|
||||||
return GST_CLOCK_TIME_NONE;
|
return GST_CLOCK_TIME_NONE;
|
||||||
}
|
}
|
||||||
|
@ -1986,10 +1995,10 @@ gst_pulsesink_set_volume (GstPulseSink * psink, gdouble volume)
|
||||||
GstPulseRingBuffer *pbuf;
|
GstPulseRingBuffer *pbuf;
|
||||||
uint32_t idx;
|
uint32_t idx;
|
||||||
|
|
||||||
if (!psink->mainloop)
|
if (!mainloop)
|
||||||
goto no_mainloop;
|
goto no_mainloop;
|
||||||
|
|
||||||
pa_threaded_mainloop_lock (psink->mainloop);
|
pa_threaded_mainloop_lock (mainloop);
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (psink, "setting volume to %f", volume);
|
GST_DEBUG_OBJECT (psink, "setting volume to %f", volume);
|
||||||
|
|
||||||
|
@ -2012,7 +2021,7 @@ unlock:
|
||||||
if (o)
|
if (o)
|
||||||
pa_operation_unref (o);
|
pa_operation_unref (o);
|
||||||
|
|
||||||
pa_threaded_mainloop_unlock (psink->mainloop);
|
pa_threaded_mainloop_unlock (mainloop);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
@ -2054,10 +2063,10 @@ gst_pulsesink_set_mute (GstPulseSink * psink, gboolean mute)
|
||||||
GstPulseRingBuffer *pbuf;
|
GstPulseRingBuffer *pbuf;
|
||||||
uint32_t idx;
|
uint32_t idx;
|
||||||
|
|
||||||
if (!psink->mainloop)
|
if (!mainloop)
|
||||||
goto no_mainloop;
|
goto no_mainloop;
|
||||||
|
|
||||||
pa_threaded_mainloop_lock (psink->mainloop);
|
pa_threaded_mainloop_lock (mainloop);
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (psink, "setting mute state to %d", mute);
|
GST_DEBUG_OBJECT (psink, "setting mute state to %d", mute);
|
||||||
|
|
||||||
|
@ -2078,7 +2087,7 @@ unlock:
|
||||||
if (o)
|
if (o)
|
||||||
pa_operation_unref (o);
|
pa_operation_unref (o);
|
||||||
|
|
||||||
pa_threaded_mainloop_unlock (psink->mainloop);
|
pa_threaded_mainloop_unlock (mainloop);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
@ -2138,7 +2147,7 @@ gst_pulsesink_sink_input_info_cb (pa_context * c, const pa_sink_input_info * i,
|
||||||
}
|
}
|
||||||
|
|
||||||
done:
|
done:
|
||||||
pa_threaded_mainloop_signal (psink->mainloop, 0);
|
pa_threaded_mainloop_signal (mainloop, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static gdouble
|
static gdouble
|
||||||
|
@ -2149,10 +2158,10 @@ gst_pulsesink_get_volume (GstPulseSink * psink)
|
||||||
gdouble v = DEFAULT_VOLUME;
|
gdouble v = DEFAULT_VOLUME;
|
||||||
uint32_t idx;
|
uint32_t idx;
|
||||||
|
|
||||||
if (!psink->mainloop)
|
if (!mainloop)
|
||||||
goto no_mainloop;
|
goto no_mainloop;
|
||||||
|
|
||||||
pa_threaded_mainloop_lock (psink->mainloop);
|
pa_threaded_mainloop_lock (mainloop);
|
||||||
|
|
||||||
pbuf = GST_PULSERING_BUFFER_CAST (GST_BASE_AUDIO_SINK (psink)->ringbuffer);
|
pbuf = GST_PULSERING_BUFFER_CAST (GST_BASE_AUDIO_SINK (psink)->ringbuffer);
|
||||||
if (pbuf == NULL || pbuf->stream == NULL)
|
if (pbuf == NULL || pbuf->stream == NULL)
|
||||||
|
@ -2166,7 +2175,7 @@ gst_pulsesink_get_volume (GstPulseSink * psink)
|
||||||
goto info_failed;
|
goto info_failed;
|
||||||
|
|
||||||
while (pa_operation_get_state (o) == PA_OPERATION_RUNNING) {
|
while (pa_operation_get_state (o) == PA_OPERATION_RUNNING) {
|
||||||
pa_threaded_mainloop_wait (psink->mainloop);
|
pa_threaded_mainloop_wait (mainloop);
|
||||||
if (gst_pulsering_is_dead (psink, pbuf))
|
if (gst_pulsering_is_dead (psink, pbuf))
|
||||||
goto unlock;
|
goto unlock;
|
||||||
}
|
}
|
||||||
|
@ -2177,7 +2186,7 @@ unlock:
|
||||||
if (o)
|
if (o)
|
||||||
pa_operation_unref (o);
|
pa_operation_unref (o);
|
||||||
|
|
||||||
pa_threaded_mainloop_unlock (psink->mainloop);
|
pa_threaded_mainloop_unlock (mainloop);
|
||||||
|
|
||||||
if (v > MAX_VOLUME) {
|
if (v > MAX_VOLUME) {
|
||||||
GST_WARNING_OBJECT (psink, "Clipped volume from %f to %f", v, MAX_VOLUME);
|
GST_WARNING_OBJECT (psink, "Clipped volume from %f to %f", v, MAX_VOLUME);
|
||||||
|
@ -2220,10 +2229,10 @@ gst_pulsesink_get_mute (GstPulseSink * psink)
|
||||||
uint32_t idx;
|
uint32_t idx;
|
||||||
gboolean mute = FALSE;
|
gboolean mute = FALSE;
|
||||||
|
|
||||||
if (!psink->mainloop)
|
if (!mainloop)
|
||||||
goto no_mainloop;
|
goto no_mainloop;
|
||||||
|
|
||||||
pa_threaded_mainloop_lock (psink->mainloop);
|
pa_threaded_mainloop_lock (mainloop);
|
||||||
mute = psink->mute;
|
mute = psink->mute;
|
||||||
|
|
||||||
pbuf = GST_PULSERING_BUFFER_CAST (GST_BASE_AUDIO_SINK (psink)->ringbuffer);
|
pbuf = GST_PULSERING_BUFFER_CAST (GST_BASE_AUDIO_SINK (psink)->ringbuffer);
|
||||||
|
@ -2238,7 +2247,7 @@ gst_pulsesink_get_mute (GstPulseSink * psink)
|
||||||
goto info_failed;
|
goto info_failed;
|
||||||
|
|
||||||
while (pa_operation_get_state (o) == PA_OPERATION_RUNNING) {
|
while (pa_operation_get_state (o) == PA_OPERATION_RUNNING) {
|
||||||
pa_threaded_mainloop_wait (psink->mainloop);
|
pa_threaded_mainloop_wait (mainloop);
|
||||||
if (gst_pulsering_is_dead (psink, pbuf))
|
if (gst_pulsering_is_dead (psink, pbuf))
|
||||||
goto unlock;
|
goto unlock;
|
||||||
}
|
}
|
||||||
|
@ -2247,7 +2256,7 @@ unlock:
|
||||||
if (o)
|
if (o)
|
||||||
pa_operation_unref (o);
|
pa_operation_unref (o);
|
||||||
|
|
||||||
pa_threaded_mainloop_unlock (psink->mainloop);
|
pa_threaded_mainloop_unlock (mainloop);
|
||||||
|
|
||||||
return mute;
|
return mute;
|
||||||
|
|
||||||
|
@ -2300,7 +2309,7 @@ gst_pulsesink_sink_info_cb (pa_context * c, const pa_sink_info * i, int eol,
|
||||||
psink->device_description = g_strdup (i->description);
|
psink->device_description = g_strdup (i->description);
|
||||||
|
|
||||||
done:
|
done:
|
||||||
pa_threaded_mainloop_signal (psink->mainloop, 0);
|
pa_threaded_mainloop_signal (mainloop, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static gchar *
|
static gchar *
|
||||||
|
@ -2310,10 +2319,10 @@ gst_pulsesink_device_description (GstPulseSink * psink)
|
||||||
pa_operation *o = NULL;
|
pa_operation *o = NULL;
|
||||||
gchar *t;
|
gchar *t;
|
||||||
|
|
||||||
if (!psink->mainloop)
|
if (!mainloop)
|
||||||
goto no_mainloop;
|
goto no_mainloop;
|
||||||
|
|
||||||
pa_threaded_mainloop_lock (psink->mainloop);
|
pa_threaded_mainloop_lock (mainloop);
|
||||||
pbuf = GST_PULSERING_BUFFER_CAST (GST_BASE_AUDIO_SINK (psink)->ringbuffer);
|
pbuf = GST_PULSERING_BUFFER_CAST (GST_BASE_AUDIO_SINK (psink)->ringbuffer);
|
||||||
if (pbuf == NULL || pbuf->stream == NULL)
|
if (pbuf == NULL || pbuf->stream == NULL)
|
||||||
goto no_buffer;
|
goto no_buffer;
|
||||||
|
@ -2324,7 +2333,7 @@ gst_pulsesink_device_description (GstPulseSink * psink)
|
||||||
goto info_failed;
|
goto info_failed;
|
||||||
|
|
||||||
while (pa_operation_get_state (o) == PA_OPERATION_RUNNING) {
|
while (pa_operation_get_state (o) == PA_OPERATION_RUNNING) {
|
||||||
pa_threaded_mainloop_wait (psink->mainloop);
|
pa_threaded_mainloop_wait (mainloop);
|
||||||
if (gst_pulsering_is_dead (psink, pbuf))
|
if (gst_pulsering_is_dead (psink, pbuf))
|
||||||
goto unlock;
|
goto unlock;
|
||||||
}
|
}
|
||||||
|
@ -2334,7 +2343,7 @@ unlock:
|
||||||
pa_operation_unref (o);
|
pa_operation_unref (o);
|
||||||
|
|
||||||
t = g_strdup (psink->device_description);
|
t = g_strdup (psink->device_description);
|
||||||
pa_threaded_mainloop_unlock (psink->mainloop);
|
pa_threaded_mainloop_unlock (mainloop);
|
||||||
|
|
||||||
return t;
|
return t;
|
||||||
|
|
||||||
|
@ -2450,7 +2459,7 @@ gst_pulsesink_change_title (GstPulseSink * psink, const gchar * t)
|
||||||
pa_operation *o = NULL;
|
pa_operation *o = NULL;
|
||||||
GstPulseRingBuffer *pbuf;
|
GstPulseRingBuffer *pbuf;
|
||||||
|
|
||||||
pa_threaded_mainloop_lock (psink->mainloop);
|
pa_threaded_mainloop_lock (mainloop);
|
||||||
|
|
||||||
pbuf = GST_PULSERING_BUFFER_CAST (GST_BASE_AUDIO_SINK (psink)->ringbuffer);
|
pbuf = GST_PULSERING_BUFFER_CAST (GST_BASE_AUDIO_SINK (psink)->ringbuffer);
|
||||||
|
|
||||||
|
@ -2468,7 +2477,7 @@ unlock:
|
||||||
|
|
||||||
if (o)
|
if (o)
|
||||||
pa_operation_unref (o);
|
pa_operation_unref (o);
|
||||||
pa_threaded_mainloop_unlock (psink->mainloop);
|
pa_threaded_mainloop_unlock (mainloop);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
@ -2527,7 +2536,7 @@ gst_pulsesink_change_props (GstPulseSink * psink, GstTagList * l)
|
||||||
if (empty)
|
if (empty)
|
||||||
goto finish;
|
goto finish;
|
||||||
|
|
||||||
pa_threaded_mainloop_lock (psink->mainloop);
|
pa_threaded_mainloop_lock (mainloop);
|
||||||
pbuf = GST_PULSERING_BUFFER_CAST (GST_BASE_AUDIO_SINK (psink)->ringbuffer);
|
pbuf = GST_PULSERING_BUFFER_CAST (GST_BASE_AUDIO_SINK (psink)->ringbuffer);
|
||||||
if (pbuf == NULL || pbuf->stream == NULL)
|
if (pbuf == NULL || pbuf->stream == NULL)
|
||||||
goto no_buffer;
|
goto no_buffer;
|
||||||
|
@ -2542,7 +2551,7 @@ unlock:
|
||||||
if (o)
|
if (o)
|
||||||
pa_operation_unref (o);
|
pa_operation_unref (o);
|
||||||
|
|
||||||
pa_threaded_mainloop_unlock (psink->mainloop);
|
pa_threaded_mainloop_unlock (mainloop);
|
||||||
|
|
||||||
finish:
|
finish:
|
||||||
|
|
||||||
|
@ -2625,28 +2634,23 @@ static GstStateChangeReturn
|
||||||
gst_pulsesink_change_state (GstElement * element, GstStateChange transition)
|
gst_pulsesink_change_state (GstElement * element, GstStateChange transition)
|
||||||
{
|
{
|
||||||
GstPulseSink *pulsesink = GST_PULSESINK (element);
|
GstPulseSink *pulsesink = GST_PULSESINK (element);
|
||||||
GstPulseSinkClass *klass = GST_PULSESINK_GET_CLASS (pulsesink);
|
|
||||||
GstStateChangeReturn ret;
|
GstStateChangeReturn ret;
|
||||||
guint res;
|
guint res;
|
||||||
|
|
||||||
switch (transition) {
|
switch (transition) {
|
||||||
case GST_STATE_CHANGE_NULL_TO_READY:
|
case GST_STATE_CHANGE_NULL_TO_READY:
|
||||||
g_mutex_lock (pa_shared_ressource_mutex);
|
g_mutex_lock (pa_shared_ressource_mutex);
|
||||||
if (!klass->main_loop_ref_ct) {
|
if (!mainloop_ref_ct) {
|
||||||
GST_INFO_OBJECT (element, "new pa main loop thread");
|
GST_INFO_OBJECT (element, "new pa main loop thread");
|
||||||
klass->mainloop = pa_threaded_mainloop_new ();
|
if (!(mainloop = pa_threaded_mainloop_new ()))
|
||||||
if (!klass->mainloop)
|
|
||||||
goto mainloop_failed;
|
goto mainloop_failed;
|
||||||
klass->main_loop_ref_ct = 1;
|
mainloop_ref_ct = 1;
|
||||||
res = pa_threaded_mainloop_start (klass->mainloop);
|
res = pa_threaded_mainloop_start (mainloop);
|
||||||
g_assert (res == 0);
|
g_assert (res == 0);
|
||||||
g_mutex_unlock (pa_shared_ressource_mutex);
|
g_mutex_unlock (pa_shared_ressource_mutex);
|
||||||
|
|
||||||
pulsesink->mainloop = klass->mainloop;
|
|
||||||
} else {
|
} else {
|
||||||
GST_INFO_OBJECT (element, "reusing pa main loop thread");
|
GST_INFO_OBJECT (element, "reusing pa main loop thread");
|
||||||
pulsesink->mainloop = klass->mainloop;
|
mainloop_ref_ct++;
|
||||||
klass->main_loop_ref_ct++;
|
|
||||||
g_mutex_unlock (pa_shared_ressource_mutex);
|
g_mutex_unlock (pa_shared_ressource_mutex);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -2670,15 +2674,14 @@ gst_pulsesink_change_state (GstElement * element, GstStateChange transition)
|
||||||
GST_BASE_AUDIO_SINK (pulsesink)->provided_clock));
|
GST_BASE_AUDIO_SINK (pulsesink)->provided_clock));
|
||||||
break;
|
break;
|
||||||
case GST_STATE_CHANGE_READY_TO_NULL:
|
case GST_STATE_CHANGE_READY_TO_NULL:
|
||||||
if (pulsesink->mainloop) {
|
if (mainloop) {
|
||||||
g_mutex_lock (pa_shared_ressource_mutex);
|
g_mutex_lock (pa_shared_ressource_mutex);
|
||||||
klass->main_loop_ref_ct--;
|
mainloop_ref_ct--;
|
||||||
pulsesink->mainloop = NULL;
|
if (!mainloop_ref_ct) {
|
||||||
if (!klass->main_loop_ref_ct) {
|
|
||||||
GST_INFO_OBJECT (element, "terminating pa main loop thread");
|
GST_INFO_OBJECT (element, "terminating pa main loop thread");
|
||||||
pa_threaded_mainloop_stop (klass->mainloop);
|
pa_threaded_mainloop_stop (mainloop);
|
||||||
pa_threaded_mainloop_free (klass->mainloop);
|
pa_threaded_mainloop_free (mainloop);
|
||||||
klass->mainloop = NULL;
|
mainloop = NULL;
|
||||||
}
|
}
|
||||||
g_mutex_unlock (pa_shared_ressource_mutex);
|
g_mutex_unlock (pa_shared_ressource_mutex);
|
||||||
}
|
}
|
||||||
|
@ -2701,15 +2704,14 @@ state_failure:
|
||||||
{
|
{
|
||||||
if (transition == GST_STATE_CHANGE_NULL_TO_READY) {
|
if (transition == GST_STATE_CHANGE_NULL_TO_READY) {
|
||||||
/* Clear the PA mainloop if baseaudiosink failed to open the ring_buffer */
|
/* Clear the PA mainloop if baseaudiosink failed to open the ring_buffer */
|
||||||
g_assert (pulsesink->mainloop);
|
g_assert (mainloop);
|
||||||
g_mutex_lock (pa_shared_ressource_mutex);
|
g_mutex_lock (pa_shared_ressource_mutex);
|
||||||
klass->main_loop_ref_ct--;
|
mainloop_ref_ct--;
|
||||||
pulsesink->mainloop = NULL;
|
if (!mainloop_ref_ct) {
|
||||||
if (!klass->main_loop_ref_ct) {
|
|
||||||
GST_INFO_OBJECT (element, "terminating pa main loop thread");
|
GST_INFO_OBJECT (element, "terminating pa main loop thread");
|
||||||
pa_threaded_mainloop_stop (klass->mainloop);
|
pa_threaded_mainloop_stop (mainloop);
|
||||||
pa_threaded_mainloop_free (klass->mainloop);
|
pa_threaded_mainloop_free (mainloop);
|
||||||
klass->mainloop = NULL;
|
mainloop = NULL;
|
||||||
}
|
}
|
||||||
g_mutex_unlock (pa_shared_ressource_mutex);
|
g_mutex_unlock (pa_shared_ressource_mutex);
|
||||||
}
|
}
|
||||||
|
|
|
@ -46,9 +46,6 @@ G_BEGIN_DECLS
|
||||||
(G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_PULSESINK))
|
(G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_PULSESINK))
|
||||||
#define GST_PULSESINK_CAST(obj) \
|
#define GST_PULSESINK_CAST(obj) \
|
||||||
((GstPulseSink *)(obj))
|
((GstPulseSink *)(obj))
|
||||||
#define GST_PULSESINK_GET_CLASS(obj) \
|
|
||||||
(G_TYPE_INSTANCE_GET_CLASS((obj),GST_TYPE_PULSESINK,GstPulseSinkClass))
|
|
||||||
|
|
||||||
|
|
||||||
typedef struct _GstPulseSink GstPulseSink;
|
typedef struct _GstPulseSink GstPulseSink;
|
||||||
typedef struct _GstPulseSinkClass GstPulseSinkClass;
|
typedef struct _GstPulseSinkClass GstPulseSinkClass;
|
||||||
|
@ -60,8 +57,6 @@ struct _GstPulseSink
|
||||||
gchar *server, *device, *stream_name, *client_name;
|
gchar *server, *device, *stream_name, *client_name;
|
||||||
gchar *device_description;
|
gchar *device_description;
|
||||||
|
|
||||||
pa_threaded_mainloop *mainloop;
|
|
||||||
|
|
||||||
GstPulseProbe *probe;
|
GstPulseProbe *probe;
|
||||||
|
|
||||||
gdouble volume;
|
gdouble volume;
|
||||||
|
@ -82,9 +77,6 @@ struct _GstPulseSink
|
||||||
struct _GstPulseSinkClass
|
struct _GstPulseSinkClass
|
||||||
{
|
{
|
||||||
GstBaseAudioSinkClass parent_class;
|
GstBaseAudioSinkClass parent_class;
|
||||||
|
|
||||||
pa_threaded_mainloop *mainloop;
|
|
||||||
guint main_loop_ref_ct;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
GType gst_pulsesink_get_type (void);
|
GType gst_pulsesink_get_type (void);
|
||||||
|
|
Loading…
Reference in a new issue