From: Christophe Fergeau <cfergeau@xxxxxxxxxx> This commit adds GStreamer 1.0 support. To enable GStreamer 1.0: --with-audio=gstreamer1 There is only a few changes between those versions, worth mentioning: - audio capabilities "audio/x-raw,format=..." instead of "audio/x-raw-int,..." - appsink signal for new data changed from "new-buffer" to "new-sample" --- configure.ac | 17 +++++++++++--- gtk/spice-audio.c | 4 ++-- gtk/spice-gstaudio.c | 64 +++++++++++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 79 insertions(+), 6 deletions(-) diff --git a/configure.ac b/configure.ac index 0d65823..17680e6 100644 --- a/configure.ac +++ b/configure.ac @@ -288,7 +288,7 @@ AS_IF([test "x$have_phodav" = "xyes"], AC_DEFINE(USE_PHODAV, [1], [Define if supporting phodav])) AC_ARG_WITH([audio], - AS_HELP_STRING([--with-audio=@<:@gstreamer/pulse/auto/no@:>@], [Select audio backend @<:@default=auto@:>@]), + AS_HELP_STRING([--with-audio=@<:@gstreamer/gstreamer1/pulse/auto/no@:>@], [Select audio backend @<:@default=auto@:>@]), [], [with_audio="auto"]) @@ -297,7 +297,7 @@ AS_IF([test "x$with_audio" = "xauto"], [ ]) case "$with_audio" in - gstreamer|pulse|no*) + gstreamer|gstreamer1|pulse|no*) ;; *) AC_MSG_ERROR(Unsupported audio backend) esac @@ -326,7 +326,18 @@ AS_IF([test "x$have_gst" = "xyes"], [AC_MSG_ERROR([GStreamer requested but not found]) ]) ]) -AM_CONDITIONAL([WITH_GSTAUDIO], [test "x$have_gst" = "xyes"]) + +AS_IF([test "x$with_audio" = "xgstreamer1"], + [PKG_CHECK_MODULES(GST, gstreamer-1.0 gstreamer-base-1.0 gstreamer-app-1.0 gstreamer-audio-1.0, [have_gst1=yes], [have_gst1=no])], + [have_gst1=no]) + +AS_IF([test "x$have_gst1" = "xyes"], + [AC_DEFINE([WITH_GST1AUDIO], 1, [Have GStreamer 1.0?])], + [AS_IF([test "x$with_audio" = "xgstreamer1"], + [AC_MSG_ERROR([GStreamer 1.0 requested but not found]) + ]) +]) +AM_CONDITIONAL([WITH_GSTAUDIO], [test "x$have_gst" = "xyes" -o "x$have_gst1" = "xyes"]) AC_SUBST(GST_CFLAGS) AC_SUBST(GST_LIBS) diff --git a/gtk/spice-audio.c b/gtk/spice-audio.c index dbd3a8b..34c1b69 100644 --- a/gtk/spice-audio.c +++ b/gtk/spice-audio.c @@ -47,7 +47,7 @@ #ifdef WITH_PULSE #include "spice-pulse.h" #endif -#ifdef WITH_GSTAUDIO +#if defined(WITH_GSTAUDIO) || defined(WITH_GST1AUDIO) #include "spice-gstaudio.h" #endif @@ -219,7 +219,7 @@ SpiceAudio *spice_audio_new(SpiceSession *session, GMainContext *context, #ifdef WITH_PULSE self = SPICE_AUDIO(spice_pulse_new(session, context, name)); #endif -#ifdef WITH_GSTAUDIO +#if defined(WITH_GSTAUDIO) || defined(WITH_GST1AUDIO) self = SPICE_AUDIO(spice_gstaudio_new(session, context, name)); #endif if (!self) diff --git a/gtk/spice-gstaudio.c b/gtk/spice-gstaudio.c index faa0c74..d3c091a 100644 --- a/gtk/spice-gstaudio.c +++ b/gtk/spice-gstaudio.c @@ -21,9 +21,13 @@ #include <gst/gst.h> #include <gst/app/gstappsrc.h> -#include <gst/app/gstappbuffer.h> #include <gst/app/gstappsink.h> +#ifdef WITH_GST1AUDIO +#include <gst/audio/streamvolume.h> +#else +#include <gst/app/gstappbuffer.h> #include <gst/interfaces/streamvolume.h> +#endif #include "spice-gstaudio.h" #include "spice-common.h" @@ -133,7 +137,12 @@ static void record_new_buffer(GstAppSink *appsink, gpointer data) g_return_if_fail(p != NULL); +#ifdef WITH_GST1AUDIO + msg = gst_message_new_application(GST_OBJECT(p->record.pipe), + gst_structure_new_empty ("new-sample")); +#else msg = gst_message_new_application(GST_OBJECT(p->record.pipe), NULL); +#endif gst_element_post_message(p->record.pipe, msg); } @@ -155,6 +164,38 @@ static gboolean record_bus_cb(GstBus *bus, GstMessage *msg, gpointer data) g_return_val_if_fail(p != NULL, FALSE); switch (GST_MESSAGE_TYPE(msg)) { +#ifdef WITH_GST1AUDIO + case GST_MESSAGE_APPLICATION: { + GstSample *s; + GstBuffer *buffer; + GstMapInfo mapping; + + s = gst_app_sink_pull_sample(GST_APP_SINK(p->record.sink)); + if (!s) { + if (!gst_app_sink_is_eos(GST_APP_SINK(p->record.sink))) + g_warning("eos not reached, but can't pull new sample"); + return TRUE; + } + + buffer = gst_sample_get_buffer(s); + if (!buffer) { + if (!gst_app_sink_is_eos(GST_APP_SINK(p->record.sink))) + g_warning("eos not reached, but can't pull new buffer"); + return TRUE; + } + if (!gst_buffer_map(buffer, &mapping, GST_MAP_READ)) { + return TRUE; + } + + spice_record_send_data(SPICE_RECORD_CHANNEL(p->rchannel), + /* FIXME: server side doesn't care about ts? + what is the unit? ms apparently */ + mapping.data, mapping.size, 0); + gst_buffer_unmap(buffer, &mapping); + gst_sample_unref(s); + break; + } +#else case GST_MESSAGE_APPLICATION: { GstBuffer *b; @@ -171,6 +212,7 @@ static gboolean record_bus_cb(GstBus *bus, GstMessage *msg, gpointer data) GST_BUFFER_DATA(b), GST_BUFFER_SIZE(b), 0); break; } +#endif default: break; } @@ -198,9 +240,15 @@ static void record_start(SpiceRecordChannel *channel, gint format, gint channels if (!p->record.pipe) { GError *error = NULL; GstBus *bus; +#ifdef WITH_GST1AUDIO + gchar *audio_caps = + g_strdup_printf("audio/x-raw,format=\"S16LE\",channels=%d,rate=%d," + "layout=interleaved", channels, frequency); +#else gchar *audio_caps = g_strdup_printf("audio/x-raw-int,channels=%d,rate=%d,signed=(boolean)true," "width=16,depth=16,endianness=1234", channels, frequency); +#endif gchar *pipeline = g_strdup_printf("autoaudiosrc name=audiosrc ! queue ! audioconvert ! audioresample ! " "appsink caps=\"%s\" name=appsink", audio_caps); @@ -221,8 +269,13 @@ static void record_start(SpiceRecordChannel *channel, gint format, gint channels p->record.channels = channels; gst_app_sink_set_emit_signals(GST_APP_SINK(p->record.sink), TRUE); +#ifdef WITH_GST1AUDIO + spice_g_signal_connect_object(p->record.sink, "new-sample", + G_CALLBACK(record_new_buffer), gstaudio, 0); +#else spice_g_signal_connect_object(p->record.sink, "new-buffer", G_CALLBACK(record_new_buffer), gstaudio, 0); +#endif lerr: g_clear_error(&error); @@ -313,8 +366,13 @@ static void playback_start(SpicePlaybackChannel *channel, gint format, gint chan if (!p->playback.pipe) { GError *error = NULL; gchar *audio_caps = +#ifdef WITH_GST1AUDIO + g_strdup_printf("audio/x-raw,format=\"S16LE\",channels=%d,rate=%d," + "layout=interleaved", channels, frequency); +#else g_strdup_printf("audio/x-raw-int,channels=%d,rate=%d,signed=(boolean)true," "width=16,depth=16,endianness=1234", channels, frequency); +#endif gchar *pipeline = g_strdup (g_getenv("SPICE_GST_AUDIOSINK")); if (pipeline == NULL) pipeline = g_strdup_printf("appsrc is-live=1 do-timestamp=0 caps=\"%s\" name=\"appsrc\" ! queue ! " @@ -356,7 +414,11 @@ static void playback_data(SpicePlaybackChannel *channel, g_return_if_fail(p != NULL); audio = g_memdup(audio, size); /* TODO: try to avoid memory copy */ +#ifdef WITH_GST1AUDIO + buf = gst_buffer_new_wrapped(audio, size); +#else buf = gst_app_buffer_new(audio, size, g_free, audio); +#endif gst_app_src_push_buffer(GST_APP_SRC(p->playback.src), buf); } -- 2.1.0 _______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/spice-devel