From 8b9ee2a0f048ce6263efe0d0660ed04a53861adf Mon Sep 17 00:00:00 2001 From: Sjoerd Simons Date: Wed, 9 Nov 2011 19:00:10 +0000 Subject: Don't turn on echo cancellation on the source if it's for raw conferences https://bugzilla.gnome.org/show_bug.cgi?id=663842 --- src/empathy-audio-sink.c | 2 +- src/empathy-audio-src.c | 12 +++++++++--- src/empathy-audio-src.h | 6 ++++++ src/empathy-call-window.c | 25 +++++++++++++++++++++++++ 4 files changed, 41 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/empathy-audio-sink.c b/src/empathy-audio-sink.c index 3d4496cd1..7a8d42bfc 100644 --- a/src/empathy-audio-sink.c +++ b/src/empathy-audio-sink.c @@ -217,7 +217,7 @@ create_sink (void) if (sink == NULL) return NULL; - empathy_call_set_stream_properties (sink); + empathy_call_set_stream_properties (sink, TRUE); return sink; } diff --git a/src/empathy-audio-src.c b/src/empathy-audio-src.c index 350a29a8d..24a2e8ed4 100644 --- a/src/empathy-audio-src.c +++ b/src/empathy-audio-src.c @@ -53,8 +53,6 @@ enum { }; /* private structure */ -typedef struct _EmpathyGstAudioSrcPrivate EmpathyGstAudioSrcPrivate; - struct _EmpathyGstAudioSrcPrivate { gboolean dispose_has_run; @@ -207,7 +205,7 @@ create_src (void) if (src == NULL) return NULL; - empathy_call_set_stream_properties (src); + empathy_call_set_stream_properties (src, TRUE); return src; } @@ -220,6 +218,7 @@ empathy_audio_src_init (EmpathyGstAudioSrc *obj) GstElement *capsfilter; GstCaps *caps; + obj->priv = priv; priv->peak_level = -G_MAXDOUBLE; priv->lock = g_mutex_new (); @@ -516,6 +515,13 @@ empathy_audio_src_new (void) return gst_element_factory_make ("empathyaudiosrc", NULL); } +void +empathy_audio_src_set_echo_cancel (EmpathyGstAudioSrc *src, + gboolean enable) +{ + empathy_call_set_stream_properties (src->priv->src, enable); +} + void empathy_audio_src_set_volume (EmpathyGstAudioSrc *src, gdouble volume) { diff --git a/src/empathy-audio-src.h b/src/empathy-audio-src.h index 14813abc1..ff568ce30 100644 --- a/src/empathy-audio-src.h +++ b/src/empathy-audio-src.h @@ -29,6 +29,8 @@ G_BEGIN_DECLS typedef struct _EmpathyGstAudioSrc EmpathyGstAudioSrc; typedef struct _EmpathyGstAudioSrcClass EmpathyGstAudioSrcClass; +typedef struct _EmpathyGstAudioSrcPrivate EmpathyGstAudioSrcPrivate; + struct _EmpathyGstAudioSrcClass { GstBinClass parent_class; @@ -36,6 +38,7 @@ struct _EmpathyGstAudioSrcClass { struct _EmpathyGstAudioSrc { GstBin parent; + EmpathyGstAudioSrcPrivate *priv; }; GType empathy_audio_src_get_type (void); @@ -59,6 +62,9 @@ GType empathy_audio_src_get_type (void); GstElement *empathy_audio_src_new (void); +void empathy_audio_src_set_echo_cancel (EmpathyGstAudioSrc *src, gboolean + enable); + void empathy_audio_src_set_volume (EmpathyGstAudioSrc *src, gdouble volume); gdouble empathy_audio_src_get_volume (EmpathyGstAudioSrc *src); diff --git a/src/empathy-call-window.c b/src/empathy-call-window.c index 8a4a3aa29..de29f15c0 100644 --- a/src/empathy-call-window.c +++ b/src/empathy-call-window.c @@ -2690,6 +2690,23 @@ empathy_call_window_channel_closed_cb (EmpathyCallHandler *handler, empathy_call_window_restart_call (self); } +static gboolean +empathy_call_window_content_is_raw (TfContent *content) +{ + FsConference *conference; + gboolean israw; + + g_object_get (content, "fs-conference", &conference, NULL); + g_assert (conference != NULL); + + /* FIXME: Ugly hack, update when moving a packetization property into + * farstream */ + israw = g_str_has_prefix (GST_OBJECT_NAME (conference), "fsrawconf"); + gst_object_unref (conference); + + return israw; +} + static gboolean empathy_call_window_content_removed_cb (EmpathyCallHandler *handler, TfContent *content, @@ -3420,6 +3437,14 @@ empathy_call_window_content_added_cb (EmpathyCallHandler *handler, switch (media_type) { case FS_MEDIA_TYPE_AUDIO: + + /* For raw audio conferences assume that the receiver of the raw data + * wants it unprocessed, so turn off any echo cancellation and any + * other audio improvements that come with it */ + empathy_audio_src_set_echo_cancel ( + EMPATHY_GST_AUDIO_SRC (priv->audio_input), + !empathy_call_window_content_is_raw (content)); + if (!gst_bin_add (GST_BIN (priv->pipeline), priv->audio_input)) { g_warning ("Could not add audio source to pipeline"); -- cgit v1.2.3