diff options
author | Sjoerd Simons <sjoerd.simons@collabora.co.uk> | 2011-11-10 03:00:10 +0800 |
---|---|---|
committer | Sjoerd Simons <sjoerd.simons@collabora.co.uk> | 2011-11-11 22:01:07 +0800 |
commit | 8b9ee2a0f048ce6263efe0d0660ed04a53861adf (patch) | |
tree | 9ee947393f466ccf04f2154f910a8ac70e8a49cb /src | |
parent | ffaa3afe49651493d0dcb01eba1b6dcd1134eed1 (diff) | |
download | gsoc2013-empathy-8b9ee2a0f048ce6263efe0d0660ed04a53861adf.tar gsoc2013-empathy-8b9ee2a0f048ce6263efe0d0660ed04a53861adf.tar.gz gsoc2013-empathy-8b9ee2a0f048ce6263efe0d0660ed04a53861adf.tar.bz2 gsoc2013-empathy-8b9ee2a0f048ce6263efe0d0660ed04a53861adf.tar.lz gsoc2013-empathy-8b9ee2a0f048ce6263efe0d0660ed04a53861adf.tar.xz gsoc2013-empathy-8b9ee2a0f048ce6263efe0d0660ed04a53861adf.tar.zst gsoc2013-empathy-8b9ee2a0f048ce6263efe0d0660ed04a53861adf.zip |
Don't turn on echo cancellation on the source if it's for raw conferences
https://bugzilla.gnome.org/show_bug.cgi?id=663842
Diffstat (limited to 'src')
-rw-r--r-- | src/empathy-audio-sink.c | 2 | ||||
-rw-r--r-- | src/empathy-audio-src.c | 12 | ||||
-rw-r--r-- | src/empathy-audio-src.h | 6 | ||||
-rw-r--r-- | src/empathy-call-window.c | 25 |
4 files changed, 41 insertions, 4 deletions
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 (); @@ -517,6 +516,13 @@ empathy_audio_src_new (void) } 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) { EmpathyGstAudioSrcPrivate *priv = EMPATHY_GST_AUDIO_SRC_GET_PRIVATE (src); 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 @@ -2691,6 +2691,23 @@ empathy_call_window_channel_closed_cb (EmpathyCallHandler *handler, } 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, EmpathyCallWindow *self) @@ -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"); |