mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-27 20:21:24 +00:00
pulse: Drop support for PA versions before 0.9.16
This drops support fof PulseAudio versions prior to 0.9.16, which was released about 1.5 years ago. Testing with very old versions is not feasible and we don't want to maintain 2 independent code-paths.
This commit is contained in:
parent
3daf1ecc21
commit
04786a6d31
5 changed files with 13 additions and 218 deletions
22
configure.ac
22
configure.ac
|
@ -834,27 +834,7 @@ AG_GST_CHECK_FEATURE(PULSE, [pulseaudio plug-in], pulseaudio, [
|
||||||
dnl used in ext/pulse/pulseutil.c
|
dnl used in ext/pulse/pulseutil.c
|
||||||
AC_CHECK_HEADERS([process.h])
|
AC_CHECK_HEADERS([process.h])
|
||||||
|
|
||||||
AG_GST_PKG_CHECK_MODULES(PULSE, libpulse >= 0.9.10)
|
AG_GST_PKG_CHECK_MODULES(PULSE, libpulse >= 0.9.16)
|
||||||
AG_GST_PKG_CHECK_MODULES(PULSE_0_9_11, libpulse >= 0.9.11)
|
|
||||||
if test x$HAVE_PULSE_0_9_11 = xyes; then
|
|
||||||
AC_DEFINE(HAVE_PULSE_0_9_11, 1, [defined if pulseaudio >= 0.9.11 is available])
|
|
||||||
fi
|
|
||||||
AG_GST_PKG_CHECK_MODULES(PULSE_0_9_12, libpulse >= 0.9.12)
|
|
||||||
if test x$HAVE_PULSE_0_9_12 = xyes; then
|
|
||||||
AC_DEFINE(HAVE_PULSE_0_9_12, 1, [defined if pulseaudio >= 0.9.12 is available])
|
|
||||||
fi
|
|
||||||
AG_GST_PKG_CHECK_MODULES(PULSE_0_9_13, libpulse >= 0.9.13)
|
|
||||||
if test x$HAVE_PULSE_0_9_13 = xyes; then
|
|
||||||
AC_DEFINE(HAVE_PULSE_0_9_13, 1, [defined if pulseaudio >= 0.9.13 is available])
|
|
||||||
fi
|
|
||||||
AG_GST_PKG_CHECK_MODULES(PULSE_0_9_15, libpulse >= 0.9.15)
|
|
||||||
if test x$HAVE_PULSE_0_9_15 = xyes; then
|
|
||||||
AC_DEFINE(HAVE_PULSE_0_9_15, 1, [defined if pulseaudio >= 0.9.15 is available])
|
|
||||||
fi
|
|
||||||
AG_GST_PKG_CHECK_MODULES(PULSE_0_9_16, libpulse >= 0.9.16)
|
|
||||||
if test x$HAVE_PULSE_0_9_16 = xyes; then
|
|
||||||
AC_DEFINE(HAVE_PULSE_0_9_16, 1, [defined if pulseaudio >= 0.9.16 is available])
|
|
||||||
fi
|
|
||||||
AG_GST_PKG_CHECK_MODULES(PULSE_0_9_20, libpulse >= 0.9.20)
|
AG_GST_PKG_CHECK_MODULES(PULSE_0_9_20, libpulse >= 0.9.20)
|
||||||
if test x$HAVE_PULSE_0_9_20 = xyes; then
|
if test x$HAVE_PULSE_0_9_20 = xyes; then
|
||||||
AC_DEFINE(HAVE_PULSE_0_9_20, 1, [defined if pulseaudio >= 0.9.20 is available])
|
AC_DEFINE(HAVE_PULSE_0_9_20, 1, [defined if pulseaudio >= 0.9.20 is available])
|
||||||
|
|
|
@ -63,11 +63,6 @@
|
||||||
GST_DEBUG_CATEGORY_EXTERN (pulse_debug);
|
GST_DEBUG_CATEGORY_EXTERN (pulse_debug);
|
||||||
#define GST_CAT_DEFAULT pulse_debug
|
#define GST_CAT_DEFAULT pulse_debug
|
||||||
|
|
||||||
/* according to
|
|
||||||
* http://www.pulseaudio.org/ticket/314
|
|
||||||
* we need pulse-0.9.12 to use sink volume properties
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define DEFAULT_SERVER NULL
|
#define DEFAULT_SERVER NULL
|
||||||
#define DEFAULT_DEVICE NULL
|
#define DEFAULT_DEVICE NULL
|
||||||
#define DEFAULT_DEVICE_NAME NULL
|
#define DEFAULT_DEVICE_NAME NULL
|
||||||
|
@ -145,13 +140,11 @@ struct _GstPulseRingBuffer
|
||||||
|
|
||||||
pa_sample_spec sample_spec;
|
pa_sample_spec sample_spec;
|
||||||
|
|
||||||
#ifdef HAVE_PULSE_0_9_16
|
|
||||||
void *m_data;
|
void *m_data;
|
||||||
size_t m_towrite;
|
size_t m_towrite;
|
||||||
size_t m_writable;
|
size_t m_writable;
|
||||||
gint64 m_offset;
|
gint64 m_offset;
|
||||||
gint64 m_lastoffset;
|
gint64 m_lastoffset;
|
||||||
#endif
|
|
||||||
|
|
||||||
gboolean corked:1;
|
gboolean corked:1;
|
||||||
gboolean in_commit:1;
|
gboolean in_commit:1;
|
||||||
|
@ -229,21 +222,13 @@ gst_pulseringbuffer_init (GstPulseRingBuffer * pbuf)
|
||||||
pbuf->context = NULL;
|
pbuf->context = NULL;
|
||||||
pbuf->stream = NULL;
|
pbuf->stream = NULL;
|
||||||
|
|
||||||
#ifdef HAVE_PULSE_0_9_13
|
|
||||||
pa_sample_spec_init (&pbuf->sample_spec);
|
pa_sample_spec_init (&pbuf->sample_spec);
|
||||||
#else
|
|
||||||
pbuf->sample_spec.format = PA_SAMPLE_INVALID;
|
|
||||||
pbuf->sample_spec.rate = 0;
|
|
||||||
pbuf->sample_spec.channels = 0;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef HAVE_PULSE_0_9_16
|
|
||||||
pbuf->m_data = NULL;
|
pbuf->m_data = NULL;
|
||||||
pbuf->m_towrite = 0;
|
pbuf->m_towrite = 0;
|
||||||
pbuf->m_writable = 0;
|
pbuf->m_writable = 0;
|
||||||
pbuf->m_offset = 0;
|
pbuf->m_offset = 0;
|
||||||
pbuf->m_lastoffset = 0;
|
pbuf->m_lastoffset = 0;
|
||||||
#endif
|
|
||||||
|
|
||||||
pbuf->corked = TRUE;
|
pbuf->corked = TRUE;
|
||||||
pbuf->in_commit = FALSE;
|
pbuf->in_commit = FALSE;
|
||||||
|
@ -255,7 +240,6 @@ gst_pulsering_destroy_stream (GstPulseRingBuffer * pbuf)
|
||||||
{
|
{
|
||||||
if (pbuf->stream) {
|
if (pbuf->stream) {
|
||||||
|
|
||||||
#ifdef HAVE_PULSE_0_9_16
|
|
||||||
if (pbuf->m_data) {
|
if (pbuf->m_data) {
|
||||||
/* drop shm memory buffer */
|
/* drop shm memory buffer */
|
||||||
pa_stream_cancel_write (pbuf->stream);
|
pa_stream_cancel_write (pbuf->stream);
|
||||||
|
@ -267,7 +251,6 @@ gst_pulsering_destroy_stream (GstPulseRingBuffer * pbuf)
|
||||||
pbuf->m_offset = 0;
|
pbuf->m_offset = 0;
|
||||||
pbuf->m_lastoffset = 0;
|
pbuf->m_lastoffset = 0;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
pa_stream_disconnect (pbuf->stream);
|
pa_stream_disconnect (pbuf->stream);
|
||||||
|
|
||||||
|
@ -318,9 +301,7 @@ gst_pulsering_destroy_context (GstPulseRingBuffer * pbuf)
|
||||||
|
|
||||||
/* Make sure we don't get any further callbacks */
|
/* Make sure we don't get any further callbacks */
|
||||||
pa_context_set_state_callback (pctx->context, NULL, NULL);
|
pa_context_set_state_callback (pctx->context, NULL, NULL);
|
||||||
#ifdef HAVE_PULSE_0_9_12
|
|
||||||
pa_context_set_subscribe_callback (pctx->context, NULL, NULL);
|
pa_context_set_subscribe_callback (pctx->context, NULL, NULL);
|
||||||
#endif
|
|
||||||
|
|
||||||
g_hash_table_remove (gst_pulse_shared_contexts, pbuf->context_name);
|
g_hash_table_remove (gst_pulse_shared_contexts, pbuf->context_name);
|
||||||
|
|
||||||
|
@ -397,7 +378,6 @@ gst_pulsering_context_state_cb (pa_context * c, void *userdata)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef HAVE_PULSE_0_9_12
|
|
||||||
static void
|
static void
|
||||||
gst_pulsering_context_subscribe_cb (pa_context * c,
|
gst_pulsering_context_subscribe_cb (pa_context * c,
|
||||||
pa_subscription_event_type_t t, uint32_t idx, void *userdata)
|
pa_subscription_event_type_t t, uint32_t idx, void *userdata)
|
||||||
|
@ -431,7 +411,6 @@ gst_pulsering_context_subscribe_cb (pa_context * c,
|
||||||
g_atomic_int_compare_and_exchange (&psink->notify, 0, 1);
|
g_atomic_int_compare_and_exchange (&psink->notify, 0, 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
/* will be called when the device should be opened. In this case we will connect
|
/* will be called when the device should be opened. In this case we will connect
|
||||||
* to the server. We should not try to open any streams in this state. */
|
* to the server. We should not try to open any streams in this state. */
|
||||||
|
@ -478,10 +457,8 @@ gst_pulseringbuffer_open_device (GstRingBuffer * buf)
|
||||||
/* 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, mainloop);
|
gst_pulsering_context_state_cb, mainloop);
|
||||||
#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);
|
||||||
#endif
|
|
||||||
|
|
||||||
/* try to connect to the server and wait for completion, we don't want to
|
/* try to connect to the server and wait for completion, we don't want to
|
||||||
* autospawn a deamon */
|
* autospawn a deamon */
|
||||||
|
@ -659,11 +636,7 @@ gst_pulsering_stream_latency_cb (pa_stream * s, void *userdata)
|
||||||
GST_LOG_OBJECT (psink, "latency update (information unknown)");
|
GST_LOG_OBJECT (psink, "latency update (information unknown)");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
#ifdef HAVE_PULSE_0_9_11
|
|
||||||
sink_usec = info->configured_sink_usec;
|
sink_usec = info->configured_sink_usec;
|
||||||
#else
|
|
||||||
sink_usec = 0;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
GST_LOG_OBJECT (psink,
|
GST_LOG_OBJECT (psink,
|
||||||
"latency_update, %" G_GUINT64_FORMAT ", %d:%" G_GINT64_FORMAT ", %d:%"
|
"latency_update, %" G_GUINT64_FORMAT ", %d:%" G_GINT64_FORMAT ", %d:%"
|
||||||
|
@ -688,7 +661,6 @@ gst_pulsering_stream_suspended_cb (pa_stream * p, void *userdata)
|
||||||
GST_DEBUG_OBJECT (psink, "stream resumed");
|
GST_DEBUG_OBJECT (psink, "stream resumed");
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef HAVE_PULSE_0_9_11
|
|
||||||
static void
|
static void
|
||||||
gst_pulsering_stream_started_cb (pa_stream * p, void *userdata)
|
gst_pulsering_stream_started_cb (pa_stream * p, void *userdata)
|
||||||
{
|
{
|
||||||
|
@ -700,9 +672,7 @@ gst_pulsering_stream_started_cb (pa_stream * p, void *userdata)
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (psink, "stream started");
|
GST_DEBUG_OBJECT (psink, "stream started");
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef HAVE_PULSE_0_9_15
|
|
||||||
static void
|
static void
|
||||||
gst_pulsering_stream_event_cb (pa_stream * p, const char *name,
|
gst_pulsering_stream_event_cb (pa_stream * p, const char *name,
|
||||||
pa_proplist * pl, void *userdata)
|
pa_proplist * pl, void *userdata)
|
||||||
|
@ -729,7 +699,6 @@ gst_pulsering_stream_event_cb (pa_stream * p, const char *name,
|
||||||
GST_DEBUG_OBJECT (psink, "got unknown event %s", name);
|
GST_DEBUG_OBJECT (psink, "got unknown event %s", name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
/* This method should create a new stream of the given @spec. No playback should
|
/* This method should create a new stream of the given @spec. No playback should
|
||||||
* start yet so we start in the corked state. */
|
* start yet so we start in the corked state. */
|
||||||
|
@ -800,14 +769,10 @@ gst_pulseringbuffer_acquire (GstRingBuffer * buf, GstRingBufferSpec * spec)
|
||||||
gst_pulsering_stream_latency_cb, pbuf);
|
gst_pulsering_stream_latency_cb, pbuf);
|
||||||
pa_stream_set_suspended_callback (pbuf->stream,
|
pa_stream_set_suspended_callback (pbuf->stream,
|
||||||
gst_pulsering_stream_suspended_cb, pbuf);
|
gst_pulsering_stream_suspended_cb, pbuf);
|
||||||
#ifdef HAVE_PULSE_0_9_11
|
|
||||||
pa_stream_set_started_callback (pbuf->stream,
|
pa_stream_set_started_callback (pbuf->stream,
|
||||||
gst_pulsering_stream_started_cb, pbuf);
|
gst_pulsering_stream_started_cb, pbuf);
|
||||||
#endif
|
|
||||||
#ifdef HAVE_PULSE_0_9_15
|
|
||||||
pa_stream_set_event_callback (pbuf->stream,
|
pa_stream_set_event_callback (pbuf->stream,
|
||||||
gst_pulsering_stream_event_cb, pbuf);
|
gst_pulsering_stream_event_cb, pbuf);
|
||||||
#endif
|
|
||||||
|
|
||||||
/* buffering requirements. When setting prebuf to 0, the stream will not pause
|
/* buffering requirements. When setting prebuf to 0, the stream will not pause
|
||||||
* when we cause an underrun, which causes time to continue. */
|
* when we cause an underrun, which causes time to continue. */
|
||||||
|
@ -836,15 +801,10 @@ gst_pulseringbuffer_acquire (GstRingBuffer * buf, GstRingBufferSpec * spec)
|
||||||
|
|
||||||
/* construct the flags */
|
/* construct the flags */
|
||||||
flags = PA_STREAM_INTERPOLATE_TIMING | PA_STREAM_AUTO_TIMING_UPDATE |
|
flags = PA_STREAM_INTERPOLATE_TIMING | PA_STREAM_AUTO_TIMING_UPDATE |
|
||||||
#ifdef HAVE_PULSE_0_9_11
|
PA_STREAM_ADJUST_LATENCY | PA_STREAM_START_CORKED;
|
||||||
PA_STREAM_ADJUST_LATENCY |
|
|
||||||
#endif
|
|
||||||
PA_STREAM_START_CORKED;
|
|
||||||
|
|
||||||
#ifdef HAVE_PULSE_0_9_12
|
|
||||||
if (psink->mute_set && psink->mute)
|
if (psink->mute_set && psink->mute)
|
||||||
flags |= PA_STREAM_START_MUTED;
|
flags |= PA_STREAM_START_MUTED;
|
||||||
#endif
|
|
||||||
|
|
||||||
/* we always start corked (see flags above) */
|
/* we always start corked (see flags above) */
|
||||||
pbuf->corked = TRUE;
|
pbuf->corked = TRUE;
|
||||||
|
@ -1149,18 +1109,16 @@ gst_pulseringbuffer_stop (GstRingBuffer * buf)
|
||||||
pa_threaded_mainloop_signal (mainloop, 0);
|
pa_threaded_mainloop_signal (mainloop, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (strcmp (psink->pa_version, "0.9.12")) {
|
/* then try to flush, it's not fatal when this fails */
|
||||||
/* then try to flush, it's not fatal when this fails */
|
GST_DEBUG_OBJECT (psink, "flushing");
|
||||||
GST_DEBUG_OBJECT (psink, "flushing");
|
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 (mainloop);
|
||||||
pa_threaded_mainloop_wait (mainloop);
|
if (gst_pulsering_is_dead (psink, pbuf, TRUE))
|
||||||
if (gst_pulsering_is_dead (psink, pbuf, TRUE))
|
goto server_dead;
|
||||||
goto server_dead;
|
|
||||||
}
|
|
||||||
GST_DEBUG_OBJECT (psink, "flush completed");
|
|
||||||
}
|
}
|
||||||
|
GST_DEBUG_OBJECT (psink, "flush completed");
|
||||||
}
|
}
|
||||||
res = TRUE;
|
res = TRUE;
|
||||||
|
|
||||||
|
@ -1336,7 +1294,6 @@ gst_pulseringbuffer_commit (GstRingBuffer * buf, guint64 * sample,
|
||||||
"need to write %d samples at offset %" G_GINT64_FORMAT, *toprocess,
|
"need to write %d samples at offset %" G_GINT64_FORMAT, *toprocess,
|
||||||
offset);
|
offset);
|
||||||
|
|
||||||
#ifdef HAVE_PULSE_0_9_16
|
|
||||||
if (offset != pbuf->m_lastoffset)
|
if (offset != pbuf->m_lastoffset)
|
||||||
GST_LOG_OBJECT (psink, "discontinuity, offset is %" G_GINT64_FORMAT ", "
|
GST_LOG_OBJECT (psink, "discontinuity, offset is %" G_GINT64_FORMAT ", "
|
||||||
"last offset was %" G_GINT64_FORMAT, offset, pbuf->m_lastoffset);
|
"last offset was %" G_GINT64_FORMAT, offset, pbuf->m_lastoffset);
|
||||||
|
@ -1484,94 +1441,10 @@ gst_pulseringbuffer_commit (GstRingBuffer * buf, guint64 * sample,
|
||||||
pbuf->m_towrite = 0;
|
pbuf->m_towrite = 0;
|
||||||
pbuf->m_offset = offset + towrite; /* keep track of current offset */
|
pbuf->m_offset = offset + towrite; /* keep track of current offset */
|
||||||
}
|
}
|
||||||
#else
|
|
||||||
|
|
||||||
for (;;) {
|
|
||||||
/* FIXME, this is not quite right */
|
|
||||||
if ((avail = pa_stream_writable_size (pbuf->stream)) == (size_t) - 1)
|
|
||||||
goto writable_size_failed;
|
|
||||||
|
|
||||||
/* We always try to satisfy a request for data */
|
|
||||||
GST_LOG_OBJECT (psink, "writable bytes %" G_GSIZE_FORMAT, avail);
|
|
||||||
|
|
||||||
/* convert to samples, we can only deal with multiples of the
|
|
||||||
* sample size */
|
|
||||||
avail /= bps;
|
|
||||||
|
|
||||||
if (avail > 0)
|
|
||||||
break;
|
|
||||||
|
|
||||||
/* see if we need to uncork because we have no free space */
|
|
||||||
if (pbuf->corked) {
|
|
||||||
if (!gst_pulsering_set_corked (pbuf, FALSE, FALSE))
|
|
||||||
goto uncork_failed;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* we can't write a single byte, wait a bit */
|
|
||||||
GST_LOG_OBJECT (psink, "waiting for free space");
|
|
||||||
pa_threaded_mainloop_wait (mainloop);
|
|
||||||
|
|
||||||
if (pbuf->paused)
|
|
||||||
goto was_paused;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (avail > out_samples)
|
|
||||||
avail = out_samples;
|
|
||||||
|
|
||||||
towrite = avail * bps;
|
|
||||||
|
|
||||||
GST_LOG_OBJECT (psink, "writing %u samples at offset %" G_GUINT64_FORMAT,
|
|
||||||
(guint) avail, offset);
|
|
||||||
|
|
||||||
if (G_LIKELY (inr == outr && !reverse)) {
|
|
||||||
/* no rate conversion, simply write out the samples */
|
|
||||||
if (pa_stream_write (pbuf->stream, data, towrite, NULL, offset,
|
|
||||||
PA_SEEK_ABSOLUTE) < 0)
|
|
||||||
goto write_failed;
|
|
||||||
|
|
||||||
data += towrite;
|
|
||||||
in_samples -= avail;
|
|
||||||
out_samples -= avail;
|
|
||||||
} else {
|
|
||||||
guint8 *dest, *d, *d_end;
|
|
||||||
|
|
||||||
/* we need to allocate a temporary buffer to resample the data into,
|
|
||||||
* FIXME, we should have a pulseaudio API to allocate this buffer for us
|
|
||||||
* from the shared memory. */
|
|
||||||
dest = d = g_malloc (towrite);
|
|
||||||
d_end = d + towrite;
|
|
||||||
|
|
||||||
if (!reverse) {
|
|
||||||
if (inr >= outr)
|
|
||||||
/* forward speed up */
|
|
||||||
FWD_UP_SAMPLES (data, data_end, d, d_end);
|
|
||||||
else
|
|
||||||
/* forward slow down */
|
|
||||||
FWD_DOWN_SAMPLES (data, data_end, d, d_end);
|
|
||||||
} else {
|
|
||||||
if (inr >= outr)
|
|
||||||
/* reverse speed up */
|
|
||||||
REV_UP_SAMPLES (data, data_end, d, d_end);
|
|
||||||
else
|
|
||||||
/* reverse slow down */
|
|
||||||
REV_DOWN_SAMPLES (data, data_end, d, d_end);
|
|
||||||
}
|
|
||||||
/* see what we have left to write */
|
|
||||||
towrite = (d - dest);
|
|
||||||
if (pa_stream_write (pbuf->stream, dest, towrite,
|
|
||||||
g_free, offset, PA_SEEK_ABSOLUTE) < 0)
|
|
||||||
goto write_failed;
|
|
||||||
|
|
||||||
avail = towrite / bps;
|
|
||||||
}
|
|
||||||
#endif /* HAVE_PULSE_0_9_16 */
|
|
||||||
|
|
||||||
*sample += avail;
|
*sample += avail;
|
||||||
offset += avail * bps;
|
offset += avail * bps;
|
||||||
|
|
||||||
#ifdef HAVE_PULSE_0_9_16
|
|
||||||
pbuf->m_lastoffset = offset;
|
pbuf->m_lastoffset = offset;
|
||||||
#endif
|
|
||||||
|
|
||||||
/* check if we need to uncork after writing the samples */
|
/* check if we need to uncork after writing the samples */
|
||||||
if (pbuf->corked) {
|
if (pbuf->corked) {
|
||||||
|
@ -1657,7 +1530,6 @@ write_failed:
|
||||||
static void
|
static void
|
||||||
gst_pulsering_flush (GstPulseRingBuffer * pbuf)
|
gst_pulsering_flush (GstPulseRingBuffer * pbuf)
|
||||||
{
|
{
|
||||||
#ifdef HAVE_PULSE_0_9_16
|
|
||||||
GstPulseSink *psink;
|
GstPulseSink *psink;
|
||||||
|
|
||||||
psink = GST_PULSESINK_CAST (GST_OBJECT_PARENT (pbuf));
|
psink = GST_PULSESINK_CAST (GST_OBJECT_PARENT (pbuf));
|
||||||
|
@ -1694,7 +1566,6 @@ write_failed:
|
||||||
pa_strerror (pa_context_errno (pbuf->context))), (NULL));
|
pa_strerror (pa_context_errno (pbuf->context))), (NULL));
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void gst_pulsesink_set_property (GObject * object, guint prop_id,
|
static void gst_pulsesink_set_property (GObject * object, guint prop_id,
|
||||||
|
@ -1758,14 +1629,11 @@ gst_pulsesink_init_interfaces (GType type)
|
||||||
NULL,
|
NULL,
|
||||||
NULL,
|
NULL,
|
||||||
};
|
};
|
||||||
#ifdef HAVE_PULSE_0_9_12
|
|
||||||
static const GInterfaceInfo svol_iface_info = {
|
static const GInterfaceInfo svol_iface_info = {
|
||||||
NULL, NULL, NULL
|
NULL, NULL, NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
g_type_add_interface_static (type, GST_TYPE_STREAM_VOLUME, &svol_iface_info);
|
g_type_add_interface_static (type, GST_TYPE_STREAM_VOLUME, &svol_iface_info);
|
||||||
#endif
|
|
||||||
|
|
||||||
g_type_add_interface_static (type, GST_TYPE_IMPLEMENTS_INTERFACE,
|
g_type_add_interface_static (type, GST_TYPE_IMPLEMENTS_INTERFACE,
|
||||||
&implements_iface_info);
|
&implements_iface_info);
|
||||||
g_type_add_interface_static (type, GST_TYPE_PROPERTY_PROBE,
|
g_type_add_interface_static (type, GST_TYPE_PROPERTY_PROBE,
|
||||||
|
@ -1796,7 +1664,6 @@ gst_pulsesink_base_init (gpointer g_class)
|
||||||
"width = (int) 32, "
|
"width = (int) 32, "
|
||||||
"depth = (int) 32, "
|
"depth = (int) 32, "
|
||||||
"rate = (int) [ 1, MAX ], " "channels = (int) [ 1, 32 ];"
|
"rate = (int) [ 1, MAX ], " "channels = (int) [ 1, 32 ];"
|
||||||
#ifdef HAVE_PULSE_0_9_15
|
|
||||||
"audio/x-raw-int, "
|
"audio/x-raw-int, "
|
||||||
"endianness = (int) { " ENDIANNESS " }, "
|
"endianness = (int) { " ENDIANNESS " }, "
|
||||||
"signed = (boolean) TRUE, "
|
"signed = (boolean) TRUE, "
|
||||||
|
@ -1810,7 +1677,6 @@ gst_pulsesink_base_init (gpointer g_class)
|
||||||
"width = (int) 32, "
|
"width = (int) 32, "
|
||||||
"depth = (int) 24, "
|
"depth = (int) 24, "
|
||||||
"rate = (int) [ 1, MAX ], " "channels = (int) [ 1, 32 ];"
|
"rate = (int) [ 1, MAX ], " "channels = (int) [ 1, 32 ];"
|
||||||
#endif
|
|
||||||
"audio/x-raw-int, "
|
"audio/x-raw-int, "
|
||||||
"signed = (boolean) FALSE, "
|
"signed = (boolean) FALSE, "
|
||||||
"width = (int) 8, "
|
"width = (int) 8, "
|
||||||
|
@ -1888,7 +1754,6 @@ gst_pulsesink_class_init (GstPulseSinkClass * klass)
|
||||||
"Human-readable name of the sound device", DEFAULT_DEVICE_NAME,
|
"Human-readable name of the sound device", DEFAULT_DEVICE_NAME,
|
||||||
G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
|
G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
|
||||||
|
|
||||||
#ifdef HAVE_PULSE_0_9_12
|
|
||||||
g_object_class_install_property (gobject_class,
|
g_object_class_install_property (gobject_class,
|
||||||
PROP_VOLUME,
|
PROP_VOLUME,
|
||||||
g_param_spec_double ("volume", "Volume",
|
g_param_spec_double ("volume", "Volume",
|
||||||
|
@ -1899,7 +1764,6 @@ gst_pulsesink_class_init (GstPulseSinkClass * klass)
|
||||||
g_param_spec_boolean ("mute", "Mute",
|
g_param_spec_boolean ("mute", "Mute",
|
||||||
"Mute state of this stream", DEFAULT_MUTE,
|
"Mute state of this stream", DEFAULT_MUTE,
|
||||||
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
|
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
|
||||||
#endif
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* GstPulseSink:client
|
* GstPulseSink:client
|
||||||
|
@ -1997,15 +1861,9 @@ gst_pulsesink_init (GstPulseSink * pulsesink, GstPulseSinkClass * klass)
|
||||||
|
|
||||||
pulsesink->notify = 0;
|
pulsesink->notify = 0;
|
||||||
|
|
||||||
/* needed for conditional execution */
|
|
||||||
pulsesink->pa_version = pa_get_library_version ();
|
|
||||||
|
|
||||||
pulsesink->properties = NULL;
|
pulsesink->properties = NULL;
|
||||||
pulsesink->proplist = NULL;
|
pulsesink->proplist = NULL;
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (pulsesink, "using pulseaudio version %s",
|
|
||||||
pulsesink->pa_version);
|
|
||||||
|
|
||||||
/* override with a custom clock */
|
/* override with a custom clock */
|
||||||
if (GST_BASE_AUDIO_SINK (pulsesink)->provided_clock)
|
if (GST_BASE_AUDIO_SINK (pulsesink)->provided_clock)
|
||||||
gst_object_unref (GST_BASE_AUDIO_SINK (pulsesink)->provided_clock);
|
gst_object_unref (GST_BASE_AUDIO_SINK (pulsesink)->provided_clock);
|
||||||
|
@ -2043,7 +1901,6 @@ gst_pulsesink_finalize (GObject * object)
|
||||||
G_OBJECT_CLASS (parent_class)->finalize (object);
|
G_OBJECT_CLASS (parent_class)->finalize (object);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef HAVE_PULSE_0_9_12
|
|
||||||
static void
|
static void
|
||||||
gst_pulsesink_set_volume (GstPulseSink * psink, gdouble volume)
|
gst_pulsesink_set_volume (GstPulseSink * psink, gdouble volume)
|
||||||
{
|
{
|
||||||
|
@ -2342,7 +2199,6 @@ info_failed:
|
||||||
goto unlock;
|
goto unlock;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gst_pulsesink_sink_info_cb (pa_context * c, const pa_sink_info * i, int eol,
|
gst_pulsesink_sink_info_cb (pa_context * c, const pa_sink_info * i, int eol,
|
||||||
|
@ -2435,14 +2291,12 @@ gst_pulsesink_set_property (GObject * object,
|
||||||
g_free (pulsesink->device);
|
g_free (pulsesink->device);
|
||||||
pulsesink->device = g_value_dup_string (value);
|
pulsesink->device = g_value_dup_string (value);
|
||||||
break;
|
break;
|
||||||
#ifdef HAVE_PULSE_0_9_12
|
|
||||||
case PROP_VOLUME:
|
case PROP_VOLUME:
|
||||||
gst_pulsesink_set_volume (pulsesink, g_value_get_double (value));
|
gst_pulsesink_set_volume (pulsesink, g_value_get_double (value));
|
||||||
break;
|
break;
|
||||||
case PROP_MUTE:
|
case PROP_MUTE:
|
||||||
gst_pulsesink_set_mute (pulsesink, g_value_get_boolean (value));
|
gst_pulsesink_set_mute (pulsesink, g_value_get_boolean (value));
|
||||||
break;
|
break;
|
||||||
#endif
|
|
||||||
case PROP_CLIENT:
|
case PROP_CLIENT:
|
||||||
g_free (pulsesink->client_name);
|
g_free (pulsesink->client_name);
|
||||||
if (!g_value_get_string (value)) {
|
if (!g_value_get_string (value)) {
|
||||||
|
@ -2484,14 +2338,12 @@ gst_pulsesink_get_property (GObject * object,
|
||||||
case PROP_DEVICE_NAME:
|
case PROP_DEVICE_NAME:
|
||||||
g_value_take_string (value, gst_pulsesink_device_description (pulsesink));
|
g_value_take_string (value, gst_pulsesink_device_description (pulsesink));
|
||||||
break;
|
break;
|
||||||
#ifdef HAVE_PULSE_0_9_12
|
|
||||||
case PROP_VOLUME:
|
case PROP_VOLUME:
|
||||||
g_value_set_double (value, gst_pulsesink_get_volume (pulsesink));
|
g_value_set_double (value, gst_pulsesink_get_volume (pulsesink));
|
||||||
break;
|
break;
|
||||||
case PROP_MUTE:
|
case PROP_MUTE:
|
||||||
g_value_set_boolean (value, gst_pulsesink_get_mute (pulsesink));
|
g_value_set_boolean (value, gst_pulsesink_get_mute (pulsesink));
|
||||||
break;
|
break;
|
||||||
#endif
|
|
||||||
case PROP_CLIENT:
|
case PROP_CLIENT:
|
||||||
g_value_set_string (value, pulsesink->client_name);
|
g_value_set_string (value, pulsesink->client_name);
|
||||||
break;
|
break;
|
||||||
|
@ -2547,7 +2399,6 @@ name_failed:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef HAVE_PULSE_0_9_11
|
|
||||||
static void
|
static void
|
||||||
gst_pulsesink_change_props (GstPulseSink * psink, GstTagList * l)
|
gst_pulsesink_change_props (GstPulseSink * psink, GstTagList * l)
|
||||||
{
|
{
|
||||||
|
@ -2625,7 +2476,6 @@ update_failed:
|
||||||
goto unlock;
|
goto unlock;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gst_pulsesink_flush_ringbuffer (GstPulseSink * psink)
|
gst_pulsesink_flush_ringbuffer (GstPulseSink * psink)
|
||||||
|
@ -2701,9 +2551,7 @@ gst_pulsesink_event (GstBaseSink * sink, GstEvent * event)
|
||||||
g_free (description);
|
g_free (description);
|
||||||
g_free (buf);
|
g_free (buf);
|
||||||
|
|
||||||
#ifdef HAVE_PULSE_0_9_11
|
|
||||||
gst_pulsesink_change_props (pulsesink, l);
|
gst_pulsesink_change_props (pulsesink, l);
|
||||||
#endif
|
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -299,13 +299,7 @@ gst_pulsesrc_init (GstPulseSrc * pulsesrc, GstPulseSrcClass * klass)
|
||||||
pulsesrc->read_buffer = NULL;
|
pulsesrc->read_buffer = NULL;
|
||||||
pulsesrc->read_buffer_length = 0;
|
pulsesrc->read_buffer_length = 0;
|
||||||
|
|
||||||
#ifdef HAVE_PULSE_0_9_13
|
|
||||||
pa_sample_spec_init (&pulsesrc->sample_spec);
|
pa_sample_spec_init (&pulsesrc->sample_spec);
|
||||||
#else
|
|
||||||
pulsesrc->sample_spec.format = PA_SAMPLE_INVALID;
|
|
||||||
pulsesrc->sample_spec.rate = 0;
|
|
||||||
pulsesrc->sample_spec.channels = 0;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
pulsesrc->operation_success = FALSE;
|
pulsesrc->operation_success = FALSE;
|
||||||
pulsesrc->paused = FALSE;
|
pulsesrc->paused = FALSE;
|
||||||
|
@ -598,11 +592,7 @@ gst_pulsesrc_stream_latency_update_cb (pa_stream * s, void *userdata)
|
||||||
"latency update (information unknown)");
|
"latency update (information unknown)");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
#ifdef HAVE_PULSE_0_9_11
|
|
||||||
source_usec = info->configured_source_usec;
|
source_usec = info->configured_source_usec;
|
||||||
#else
|
|
||||||
source_usec = 0;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
GST_LOG_OBJECT (GST_PULSESRC_CAST (userdata),
|
GST_LOG_OBJECT (GST_PULSESRC_CAST (userdata),
|
||||||
"latency_update, %" G_GUINT64_FORMAT ", %d:%" G_GINT64_FORMAT ", %d:%"
|
"latency_update, %" G_GUINT64_FORMAT ", %d:%" G_GINT64_FORMAT ", %d:%"
|
||||||
|
@ -1042,11 +1032,8 @@ gst_pulsesrc_prepare (GstAudioSrc * asrc, GstRingBufferSpec * spec)
|
||||||
GST_INFO_OBJECT (pulsesrc, "fragsize: %d", wanted.fragsize);
|
GST_INFO_OBJECT (pulsesrc, "fragsize: %d", wanted.fragsize);
|
||||||
|
|
||||||
if (pa_stream_connect_record (pulsesrc->stream, pulsesrc->device, &wanted,
|
if (pa_stream_connect_record (pulsesrc->stream, pulsesrc->device, &wanted,
|
||||||
PA_STREAM_INTERPOLATE_TIMING |
|
PA_STREAM_INTERPOLATE_TIMING | PA_STREAM_AUTO_TIMING_UPDATE |
|
||||||
PA_STREAM_AUTO_TIMING_UPDATE | PA_STREAM_NOT_MONOTONOUS |
|
PA_STREAM_NOT_MONOTONIC | PA_STREAM_ADJUST_LATENCY |
|
||||||
#ifdef HAVE_PULSE_0_9_11
|
|
||||||
PA_STREAM_ADJUST_LATENCY |
|
|
||||||
#endif
|
|
||||||
PA_STREAM_START_CORKED) < 0) {
|
PA_STREAM_START_CORKED) < 0) {
|
||||||
GST_ELEMENT_ERROR (pulsesrc, RESOURCE, FAILED,
|
GST_ELEMENT_ERROR (pulsesrc, RESOURCE, FAILED,
|
||||||
("Failed to connect stream: %s",
|
("Failed to connect stream: %s",
|
||||||
|
|
|
@ -98,7 +98,6 @@ gst_pulse_fill_sample_spec (GstRingBufferSpec * spec, pa_sample_spec * ss)
|
||||||
ss->format = PA_SAMPLE_S32LE;
|
ss->format = PA_SAMPLE_S32LE;
|
||||||
else if (spec->format == GST_S32_BE && spec->width == 32)
|
else if (spec->format == GST_S32_BE && spec->width == 32)
|
||||||
ss->format = PA_SAMPLE_S32BE;
|
ss->format = PA_SAMPLE_S32BE;
|
||||||
#ifdef HAVE_PULSE_0_9_15
|
|
||||||
else if (spec->format == GST_S24_3LE && spec->width == 24)
|
else if (spec->format == GST_S24_3LE && spec->width == 24)
|
||||||
ss->format = PA_SAMPLE_S24LE;
|
ss->format = PA_SAMPLE_S24LE;
|
||||||
else if (spec->format == GST_S24_3BE && spec->width == 24)
|
else if (spec->format == GST_S24_3BE && spec->width == 24)
|
||||||
|
@ -107,7 +106,6 @@ gst_pulse_fill_sample_spec (GstRingBufferSpec * spec, pa_sample_spec * ss)
|
||||||
ss->format = PA_SAMPLE_S24_32LE;
|
ss->format = PA_SAMPLE_S24_32LE;
|
||||||
else if (spec->format == GST_S24_BE && spec->width == 32)
|
else if (spec->format == GST_S24_BE && spec->width == 32)
|
||||||
ss->format = PA_SAMPLE_S24_32BE;
|
ss->format = PA_SAMPLE_S24_32BE;
|
||||||
#endif
|
|
||||||
else
|
else
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
|
|
|
@ -41,22 +41,4 @@ void gst_pulse_cvolume_from_linear (pa_cvolume *v, unsigned channels, gdouble vo
|
||||||
|
|
||||||
pa_proplist *gst_pulse_make_proplist (const GstStructure *properties);
|
pa_proplist *gst_pulse_make_proplist (const GstStructure *properties);
|
||||||
|
|
||||||
#if !HAVE_PULSE_0_9_11
|
|
||||||
static inline int PA_CONTEXT_IS_GOOD(pa_context_state_t x) {
|
|
||||||
return
|
|
||||||
x == PA_CONTEXT_CONNECTING ||
|
|
||||||
x == PA_CONTEXT_AUTHORIZING ||
|
|
||||||
x == PA_CONTEXT_SETTING_NAME ||
|
|
||||||
x == PA_CONTEXT_READY;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Return non-zero if the passed state is one of the connected states */
|
|
||||||
static inline int PA_STREAM_IS_GOOD(pa_stream_state_t x) {
|
|
||||||
return
|
|
||||||
x == PA_STREAM_CREATING ||
|
|
||||||
x == PA_STREAM_READY;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in a new issue