From 6b19934b9a237b648f36b0da943bde046b6488c0 Mon Sep 17 00:00:00 2001 From: Sjoerd Simons Date: Sun, 20 May 2012 13:07:57 +0200 Subject: Don't put the status in the header if the user has none --- src/empathy-call-window.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/empathy-call-window.c b/src/empathy-call-window.c index 191a23833..564504f99 100644 --- a/src/empathy-call-window.c +++ b/src/empathy-call-window.c @@ -1875,7 +1875,11 @@ set_remote_user_name (EmpathyCallWindow *self, const gchar *status = empathy_contact_get_status (contact); gchar *label; - label = g_strdup_printf ("%s\n%s", alias, status); + if (status != NULL) + label = g_strdup_printf ("%s\n%s", alias, status); + else + label = g_strdup (alias); + gtk_label_set_markup (GTK_LABEL (self->priv->remote_user_name_toolbar), label); g_free (label); -- cgit v1.2.3 From 7e7a60c59f7e07612cdbc5e547dbb9a1151834ab Mon Sep 17 00:00:00 2001 From: Sjoerd Simons Date: Sun, 20 May 2012 19:59:29 +0200 Subject: Call window: Ellipsize alias and status If the user alias is too long both the hangup and the dialpad buttons get pushed into a drop-down menu. Even worse when the alias doesn't fit, it just isn't shown at all anymore. Given the username is already printed in the title and the user tends to know who they're calling with, ellipsizing the alias isn't an issue. Which has the nice side-effect of keeping the hangup and dialpad buttons on the toolbar in all cases like they should be. Unfortunately as pango doesn't ellipsize if it still has enough height left to put more lines in. So put the alias and status in seperate labels in a vbox which isn't set to fill. --- src/empathy-call-window.c | 22 +++++++++++++-------- src/empathy-call-window.ui | 48 ++++++++++++++++++++++------------------------ 2 files changed, 37 insertions(+), 33 deletions(-) diff --git a/src/empathy-call-window.c b/src/empathy-call-window.c index 564504f99..1301f96d1 100644 --- a/src/empathy-call-window.c +++ b/src/empathy-call-window.c @@ -161,6 +161,7 @@ struct _EmpathyCallWindowPriv GtkWidget *remote_user_avatar_widget; GtkWidget *remote_user_avatar_toolbar; GtkWidget *remote_user_name_toolbar; + GtkWidget *remote_user_status_toolbar; GtkWidget *status_label; GtkWidget *hangup_button; GtkWidget *audio_call_button; @@ -1564,6 +1565,7 @@ empathy_call_window_init (EmpathyCallWindow *self) "errors_vbox", &priv->errors_vbox, "pane", &priv->pane, "remote_user_name_toolbar", &priv->remote_user_name_toolbar, + "remote_user_status_toolbar", &priv->remote_user_status_toolbar, "remote_user_avatar_toolbar", &priv->remote_user_avatar_toolbar, "status_label", &priv->status_label, "audiocall", &priv->audio_call_button, @@ -1873,16 +1875,20 @@ set_remote_user_name (EmpathyCallWindow *self, { const gchar *alias = empathy_contact_get_alias (contact); const gchar *status = empathy_contact_get_status (contact); - gchar *label; - if (status != NULL) - label = g_strdup_printf ("%s\n%s", alias, status); - else - label = g_strdup (alias); + gtk_label_set_text (GTK_LABEL (self->priv->remote_user_name_toolbar), alias); + + if (status != NULL) { + gchar *markup; - gtk_label_set_markup (GTK_LABEL (self->priv->remote_user_name_toolbar), - label); - g_free (label); + markup = g_markup_printf_escaped ("%s", status); + gtk_label_set_markup (GTK_LABEL (self->priv->remote_user_status_toolbar), + markup); + g_free (markup); + } else { + gtk_label_set_markup (GTK_LABEL (self->priv->remote_user_status_toolbar), + ""); + } } static void diff --git a/src/empathy-call-window.ui b/src/empathy-call-window.ui index 2158b2b83..2caa242b8 100644 --- a/src/empathy-call-window.ui +++ b/src/empathy-call-window.ui @@ -164,27 +164,37 @@ False True - - True - + True - - True + + + + True + PANGO_ELLIPSIZE_END + 0 + + + False + + + + + True + PANGO_ELLIPSIZE_END + 0 + + + False + + - - - - True - - - True - + True @@ -193,9 +203,6 @@ call-stop Hang up current call - - False - @@ -203,9 +210,6 @@ camera-web Start a video call - - True - @@ -213,9 +217,6 @@ call-start Start an audio call - - True - @@ -224,9 +225,6 @@ input-dialpad Display the dialpad - - True - -- cgit v1.2.3 From 1fa90edcd725ae7ac78a3caed904b3e382e25560 Mon Sep 17 00:00:00 2001 From: Sjoerd Simons Date: Sun, 20 May 2012 21:31:13 +0200 Subject: call: Make the remote video background black Mimic totem in making the background for our video output black by default and without extra borders. It does look nicer. --- src/empathy-call-window.c | 23 +++++------------------ 1 file changed, 5 insertions(+), 18 deletions(-) diff --git a/src/empathy-call-window.c b/src/empathy-call-window.c index 1301f96d1..23c250dca 100644 --- a/src/empathy-call-window.c +++ b/src/empathy-call-window.c @@ -73,9 +73,8 @@ #include "empathy-rounded-texture.h" #include "empathy-camera-menu.h" -#define CONTENT_HBOX_BORDER_WIDTH 6 #define CONTENT_HBOX_SPACING 3 -#define CONTENT_HBOX_CHILDREN_PACKING_PADDING 3 +#define CONTENT_HBOX_CHILDREN_PACKING_PADDING 0 #define SELF_VIDEO_SECTION_WIDTH 120 #define SELF_VIDEO_SECTION_HEIGHT 90 @@ -1549,10 +1548,8 @@ empathy_call_window_init (EmpathyCallWindow *self) gchar *filename; ClutterConstraint *constraint; ClutterActor *remote_avatar; - GtkStyleContext *context; GtkCssProvider *provider; - GdkRGBA rgba; - ClutterColor bg; + ClutterColor black = { 0, 0, 0, 0 }; priv = self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, EMPATHY_TYPE_CALL_WINDOW, EmpathyCallWindowPriv); @@ -1643,8 +1640,6 @@ empathy_call_window_init (EmpathyCallWindow *self) priv->content_hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, CONTENT_HBOX_SPACING); - gtk_container_set_border_width (GTK_CONTAINER (priv->content_hbox), - CONTENT_HBOX_BORDER_WIDTH); gtk_box_pack_start (GTK_BOX (priv->pane), priv->content_hbox, TRUE, TRUE, 0); @@ -1659,18 +1654,11 @@ empathy_call_window_init (EmpathyCallWindow *self) gtk_widget_set_size_request (priv->video_container, EMPATHY_VIDEO_WIDGET_DEFAULT_WIDTH, EMPATHY_VIDEO_WIDGET_DEFAULT_HEIGHT); - /* Set the background color to that of the rest of the window */ - context = gtk_widget_get_style_context (priv->content_hbox); - gtk_style_context_get_background_color (context, - GTK_STATE_FLAG_NORMAL, &rgba); - bg.red = CLAMP (rgba.red * 255.0, 0, 255); - bg.green = CLAMP (rgba.green * 255.0, 0, 255); - bg.blue = CLAMP (rgba.blue * 255.0, 0, 255); - bg.alpha = CLAMP (rgba.alpha * 255.0, 0, 255); + /* Set the background black */ clutter_stage_set_color ( CLUTTER_STAGE (gtk_clutter_embed_get_stage ( GTK_CLUTTER_EMBED (priv->video_container))), - &bg); + &black); clutter_container_add ( CLUTTER_CONTAINER (gtk_clutter_embed_get_stage ( @@ -1686,6 +1674,7 @@ empathy_call_window_init (EmpathyCallWindow *self) priv->remote_user_avatar_widget = gtk_image_new (); remote_avatar = gtk_clutter_actor_new_with_contents ( priv->remote_user_avatar_widget); + make_background_transparent (GTK_CLUTTER_ACTOR (remote_avatar)); clutter_container_add_actor (CLUTTER_CONTAINER (priv->video_box), remote_avatar); @@ -3840,8 +3829,6 @@ show_borders (EmpathyCallWindow *window, gboolean set_fullscreen) { EmpathyCallWindowPriv *priv = GET_PRIV (window); - gtk_container_set_border_width (GTK_CONTAINER (priv->content_hbox), - set_fullscreen ? 0 : CONTENT_HBOX_BORDER_WIDTH); gtk_box_set_spacing (GTK_BOX (priv->content_hbox), set_fullscreen ? 0 : CONTENT_HBOX_SPACING); -- cgit v1.2.3 From 0343d38411f58086366190100521c6a847985c13 Mon Sep 17 00:00:00 2001 From: Sjoerd Simons Date: Mon, 21 May 2012 10:00:21 +0200 Subject: Keep some margin for the preview and the floating toolbar Now that the video box is flush against the sides add some extra margin for the things floating inside. --- src/empathy-call-window.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/empathy-call-window.c b/src/empathy-call-window.c index 23c250dca..7577abd11 100644 --- a/src/empathy-call-window.c +++ b/src/empathy-call-window.c @@ -75,6 +75,7 @@ #define CONTENT_HBOX_SPACING 3 #define CONTENT_HBOX_CHILDREN_PACKING_PADDING 0 +#define OVERLAY_MARGIN 6 #define SELF_VIDEO_SECTION_WIDTH 120 #define SELF_VIDEO_SECTION_HEIGHT 90 @@ -1550,6 +1551,8 @@ empathy_call_window_init (EmpathyCallWindow *self) ClutterActor *remote_avatar; GtkCssProvider *provider; ClutterColor black = { 0, 0, 0, 0 }; + ClutterMargin overlay_margin = { OVERLAY_MARGIN, OVERLAY_MARGIN, + OVERLAY_MARGIN, OVERLAY_MARGIN }; priv = self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, EMPATHY_TYPE_CALL_WINDOW, EmpathyCallWindowPriv); @@ -1683,7 +1686,10 @@ empathy_call_window_init (EmpathyCallWindow *self) priv->overlay_layout = clutter_box_layout_new (); clutter_box_layout_set_vertical ( CLUTTER_BOX_LAYOUT (priv->overlay_layout), TRUE); - priv->overlay_box = clutter_box_new (priv->overlay_layout); + priv->overlay_box = clutter_actor_new (); + clutter_actor_set_layout_manager (priv->overlay_box, priv->overlay_layout); + + clutter_actor_set_margin (priv->overlay_box, &overlay_margin); clutter_bin_layout_add (CLUTTER_BIN_LAYOUT (priv->video_layout), priv->overlay_box, -- cgit v1.2.3 From 4f2d28ecffbd3b5f77b81539fba0f7ce66618ed9 Mon Sep 17 00:00:00 2001 From: Sjoerd Simons Date: Mon, 21 May 2012 10:31:57 +0200 Subject: Call: Let the floating toolbar be above the preview The call window has previews in the four corners, before the lower ones were packed in a way that they would appear above the floating toolbar which looks strange when the floating toolbar disappears. Instead allow the lower preview to be below the floating toolbar so they're evenly spread out. --- src/empathy-call-window.c | 39 +++++++++++++++++++-------------------- 1 file changed, 19 insertions(+), 20 deletions(-) diff --git a/src/empathy-call-window.c b/src/empathy-call-window.c index 7577abd11..38aebe669 100644 --- a/src/empathy-call-window.c +++ b/src/empathy-call-window.c @@ -183,9 +183,9 @@ struct _EmpathyCallWindowPriv ClutterActor *video_box; ClutterLayoutManager *video_layout; - /* A Box layout manager containing a bin for previews + /* A bin layout manager containing a bin for previews * and the floating toolbar */ - ClutterActor *overlay_box; + ClutterActor *overlay_bin; ClutterLayoutManager *overlay_layout; /* Bin layout for the previews */ @@ -386,7 +386,7 @@ empathy_call_window_show_video_output (EmpathyCallWindow *self, gtk_widget_set_visible (self->priv->remote_user_avatar_widget, !show); - clutter_actor_raise_top (self->priv->overlay_box); + clutter_actor_raise_top (self->priv->overlay_bin); } static void @@ -654,9 +654,9 @@ empathy_call_window_create_preview_rectangles (EmpathyCallWindow *self) CLUTTER_BIN_ALIGNMENT_CENTER, CLUTTER_BIN_ALIGNMENT_CENTER); self->priv->preview_box = box = clutter_box_new (self->priv->preview_layout); - clutter_box_layout_pack (CLUTTER_BOX_LAYOUT (self->priv->overlay_layout), - box, TRUE, TRUE, TRUE, - CLUTTER_BOX_ALIGNMENT_CENTER, CLUTTER_BOX_ALIGNMENT_START); + clutter_bin_layout_add (CLUTTER_BIN_LAYOUT (self->priv->overlay_layout), + box, + CLUTTER_BIN_ALIGNMENT_FILL, CLUTTER_BIN_ALIGNMENT_FILL); self->priv->preview_rectangle1 = empathy_call_window_create_preview_rectangle (self, @@ -1647,8 +1647,8 @@ empathy_call_window_init (EmpathyCallWindow *self) TRUE, TRUE, 0); /* main contents remote avatar/video box */ - priv->video_layout = clutter_bin_layout_new (CLUTTER_BIN_ALIGNMENT_CENTER, - CLUTTER_BIN_ALIGNMENT_CENTER); + priv->video_layout = clutter_bin_layout_new (CLUTTER_BIN_ALIGNMENT_FILL, + CLUTTER_BIN_ALIGNMENT_FILL); priv->video_box = clutter_box_new (priv->video_layout); @@ -1682,17 +1682,16 @@ empathy_call_window_init (EmpathyCallWindow *self) clutter_container_add_actor (CLUTTER_CONTAINER (priv->video_box), remote_avatar); - /* create the overlay box */ - priv->overlay_layout = clutter_box_layout_new (); - clutter_box_layout_set_vertical ( - CLUTTER_BOX_LAYOUT (priv->overlay_layout), TRUE); - priv->overlay_box = clutter_actor_new (); - clutter_actor_set_layout_manager (priv->overlay_box, priv->overlay_layout); + /* create the overlay bin */ + priv->overlay_layout = clutter_bin_layout_new (CLUTTER_BIN_ALIGNMENT_CENTER, + CLUTTER_BIN_ALIGNMENT_CENTER); + priv->overlay_bin = clutter_actor_new (); + clutter_actor_set_layout_manager (priv->overlay_bin, priv->overlay_layout); - clutter_actor_set_margin (priv->overlay_box, &overlay_margin); + clutter_actor_set_margin (priv->overlay_bin, &overlay_margin); clutter_bin_layout_add (CLUTTER_BIN_LAYOUT (priv->video_layout), - priv->overlay_box, + priv->overlay_bin, CLUTTER_BIN_ALIGNMENT_FILL, CLUTTER_BIN_ALIGNMENT_FILL); empathy_call_window_create_preview_rectangles (self); @@ -1713,9 +1712,9 @@ empathy_call_window_init (EmpathyCallWindow *self) gtk_widget_reparent (priv->bottom_toolbar, gtk_clutter_actor_get_widget (GTK_CLUTTER_ACTOR (priv->floating_toolbar))); - clutter_box_layout_pack (CLUTTER_BOX_LAYOUT (priv->overlay_layout), - priv->floating_toolbar, FALSE, FALSE, FALSE, - CLUTTER_BOX_ALIGNMENT_CENTER, CLUTTER_BOX_ALIGNMENT_END); + clutter_bin_layout_add (CLUTTER_BIN_LAYOUT (priv->overlay_layout), + priv->floating_toolbar, + CLUTTER_BIN_ALIGNMENT_CENTER, CLUTTER_BIN_ALIGNMENT_END); clutter_actor_set_opacity (priv->floating_toolbar, FLOATING_TOOLBAR_OPACITY); @@ -3226,7 +3225,7 @@ empathy_call_window_show_video_output_cb (gpointer user_data) { gtk_widget_hide (self->priv->remote_user_avatar_widget); clutter_actor_show (self->priv->video_output); - clutter_actor_raise_top (self->priv->overlay_box); + clutter_actor_raise_top (self->priv->overlay_bin); } return FALSE; -- cgit v1.2.3 From 246b14f2722e6aac0c9744e49edd70594846f004 Mon Sep 17 00:00:00 2001 From: Sjoerd Simons Date: Mon, 21 May 2012 10:48:53 +0200 Subject: call: Adjust the preview rectangle colors As our default background is now black the non-highlighted previews get hard to see. Change the rectangle colors to white for the highlighted version and a darkened white for the non-highlighted. --- src/empathy-call-window.c | 31 ++++--------------------------- 1 file changed, 4 insertions(+), 27 deletions(-) diff --git a/src/empathy-call-window.c b/src/empathy-call-window.c index 38aebe669..67b1aea0b 100644 --- a/src/empathy-call-window.c +++ b/src/empathy-call-window.c @@ -844,51 +844,28 @@ empathy_call_window_move_video_preview (EmpathyCallWindow *self, g_settings_set_enum (self->priv->settings, "camera-position", pos); } -static void -_clutter_color_from_rgba (ClutterColor *color, - const GdkRGBA *rgba) -{ - color->red = (guint8) floor (rgba->red * 255); - color->green = (guint8) floor (rgba->green * 255); - color->blue = (guint8) floor (rgba->blue * 255); - color->alpha = (guint8) floor (rgba->alpha * 255); -} - static void empathy_call_window_highlight_preview_rectangle (EmpathyCallWindow *self, PreviewPosition pos) { ClutterActor *rectangle; - GtkStyleContext *context; - GdkRGBA rgba; - ClutterColor color, highlight; + ClutterColor white = { 0xff, 0xff, 0xff, 0xff}; rectangle = empathy_call_window_get_preview_rectangle (self, pos); - context = gtk_widget_get_style_context (GTK_WIDGET (self)); - gtk_style_context_get_color (context, 0, &rgba); - - _clutter_color_from_rgba (&color, &rgba); - clutter_color_shade (&color, 1.4, &highlight); empathy_rounded_rectangle_set_border_width ( EMPATHY_ROUNDED_RECTANGLE (rectangle), 2 * SELF_VIDEO_SECTION_MARGIN); empathy_rounded_rectangle_set_border_color ( - EMPATHY_ROUNDED_RECTANGLE (rectangle), &highlight); + EMPATHY_ROUNDED_RECTANGLE (rectangle), &white); } static void empathy_call_window_darken_preview_rectangle (EmpathyCallWindow *self, ClutterActor *rectangle) { - GtkStyleContext *context; - GdkRGBA rgba; - ClutterColor color, darker; - - context = gtk_widget_get_style_context (GTK_WIDGET (self)); - gtk_style_context_get_background_color (context, 0, &rgba); + ClutterColor white = { 0xff, 0xff, 0xff, 0xff}, darker; - _clutter_color_from_rgba (&color, &rgba); - clutter_color_shade (&color, 0.55, &darker); + clutter_color_shade (&white, 0.55, &darker); empathy_rounded_rectangle_set_border_width ( EMPATHY_ROUNDED_RECTANGLE (rectangle), 1); -- cgit v1.2.3 From 9f1691878cc95951039eb2d7a47b6462569da299 Mon Sep 17 00:00:00 2001 From: Sjoerd Simons Date: Mon, 21 May 2012 11:55:25 +0200 Subject: audio input: Switch to stream volumes Newer gstreamer & pulseaudio support the stream volume interface for input as well. Prefer this over using the mixer interface as it's both simpler and actually does as intended. Besides that the mixer interface is buggy and seems to not correctly adjust the current input device if the source was switch to a non-default input. As an extra put in a volume element to locally enforce the current mute state. This ensure that whatever happens, if the UI says mute, the stream is guaranteed to be muted. This prevents awkward situations if the source element doesn't support stream volumes or the notification is buggy (like with current pulsesrc in releases). --- src/empathy-audio-src.c | 214 ++++++++++++++++-------------------------------- 1 file changed, 72 insertions(+), 142 deletions(-) diff --git a/src/empathy-audio-src.c b/src/empathy-audio-src.c index 9a882c146..5a82979aa 100644 --- a/src/empathy-audio-src.c +++ b/src/empathy-audio-src.c @@ -23,7 +23,7 @@ #include #include -#include +#include #include #include @@ -61,6 +61,7 @@ struct _EmpathyGstAudioSrcPrivate gboolean dispose_has_run; GstElement *src; GstElement *level; + GstElement *volume_element; EmpathyMicMonitor *mic_monitor; @@ -74,8 +75,6 @@ struct _EmpathyGstAudioSrcPrivate gdouble volume; gboolean mute; - /* the mixer track on src we follow and adjust */ - GstMixerTrack *track; GMutex *lock; guint level_idle_id; @@ -86,37 +85,34 @@ struct _EmpathyGstAudioSrcPrivate (G_TYPE_INSTANCE_GET_PRIVATE ((o), EMPATHY_TYPE_GST_AUDIO_SRC, \ EmpathyGstAudioSrcPrivate)) -/* There is no predefined maximum channels by gstreamer, just pick 32, which is - * the same as the pulseaudio maximum */ -#define MAX_MIC_CHANNELS 32 + +static gboolean +empathy_audio_src_volume_changed (GObject *object, + GParamSpec *pspec, + gpointer user_data); static void empathy_audio_set_hw_mute (EmpathyGstAudioSrc *self, gboolean mute) { - g_mutex_lock (self->priv->lock); - /* If there is no mixer available ignore the setting */ - if (self->priv->track == NULL) - goto out; + if (mute == self->priv->mute) + return; - gst_mixer_set_mute (GST_MIXER (self->priv->src), self->priv->track, mute); + g_object_set (self->priv->src, "mute", mute, NULL); + + /* Belt and braces: If for some reason the underlying src doesn't mute + * correctly or doesn't update us when it unmutes correctly enforce it using + * our own volume element. Our UI can in no circumstances be made to think + * the input is muted while it's not */ + g_object_set (self->priv->volume_element, "mute", mute, NULL); -out: - g_mutex_unlock (self->priv->lock); self->priv->mute = mute; } static gboolean empathy_audio_src_get_hw_mute (EmpathyGstAudioSrc *self) { - gboolean result = self->priv->mute; - - g_mutex_lock (self->priv->lock); - if (self->priv->track == NULL) - goto out; - - result = GST_MIXER_TRACK_HAS_FLAG (self->priv->track, GST_MIXER_TRACK_MUTE); -out: - g_mutex_unlock (self->priv->lock); + gboolean result; + g_object_get (self->priv->src, "mute", &result, NULL); return result; } @@ -125,42 +121,18 @@ static void empathy_audio_src_set_hw_volume (EmpathyGstAudioSrc *self, gdouble volume) { - gint volumes[MAX_MIC_CHANNELS]; - int i; - - g_mutex_lock (self->priv->lock); - /* If there is no mixer available ignore the setting */ - if (self->priv->track == NULL) - goto out; - - for (i = 0; i < MAX_MIC_CHANNELS; i++) - volumes[i] = self->priv->track->max_volume * volume; - - gst_mixer_set_volume (GST_MIXER (self->priv->src), - self->priv->track, volumes); - -out: - g_mutex_unlock (self->priv->lock); + if (volume == self->priv->volume) + return; + g_object_set (self->priv->src, "volume", volume, NULL); self->priv->volume = volume; } static gdouble empathy_audio_src_get_hw_volume (EmpathyGstAudioSrc *self) { - gint volumes[MAX_MIC_CHANNELS]; - gdouble result = self->priv->volume; - - g_mutex_lock (self->priv->lock); - if (self->priv->track == NULL) - goto out; - - gst_mixer_get_volume (GST_MIXER (self->priv->src), - self->priv->track, volumes); - result = volumes[0]/(gdouble)self->priv->track->max_volume; - -out: - g_mutex_unlock (self->priv->lock); + gdouble result; + g_object_get (self->priv->src, "volume", &result, NULL); return result; } @@ -265,43 +237,6 @@ empathy_audio_src_source_output_index_notify (GObject *object, source_output_idx, empathy_audio_src_get_current_mic_cb, self); } -static GstMixerTrack * -empathy_audio_src_get_track (GstElement *src) -{ - const GList *t; - GstMixerTrack *track = NULL; - - if (!gst_element_implements_interface (src, GST_TYPE_MIXER)) - { - g_warning ("No mixer interface implementation, can't control volume"); - return NULL; - } - - for (t = gst_mixer_list_tracks (GST_MIXER (src)); - t != NULL; t = g_list_next (t)) - { - GstMixerTrack *tr = t->data; - if (!tp_strdiff (tr->label, "Master")) - { - track = tr; - break; - } - } - - if (track == NULL) - { - g_warning ("No suitable track found"); - } - else if (track->num_channels > MAX_MIC_CHANNELS) - { - g_warning ("Microphones with more then %d channels not supported ", - MAX_MIC_CHANNELS); - track = NULL; - } - - return track; -} - static GstElement * create_src (void) { @@ -354,6 +289,31 @@ empathy_audio_src_init (EmpathyGstAudioSrc *obj) if (priv->src == NULL) return; + if (GST_IS_STREAM_VOLUME (priv->src)) + { + gdouble volume; + gboolean mute; + /* We can't do a bidirection bind as the ::notify comes from another + * thread, for other bits of empathy it's most simpler if it comes from + * the main thread */ + g_object_bind_property (obj, "volume", priv->src, "volume", + G_BINDING_DEFAULT); + g_object_bind_property (obj, "mute", priv->src, "mute", + G_BINDING_DEFAULT); + + /* sync and callback for bouncing */ + g_object_get (priv->src, "volume", &volume, NULL); + g_object_set (obj, "volume", volume, NULL); + + g_object_get (priv->src, "mute", &mute, NULL); + g_object_set (obj, "mute", mute, NULL); + + g_signal_connect (priv->src, "notify::volume", + G_CALLBACK (empathy_audio_src_volume_changed), obj); + g_signal_connect (priv->src, "notify::mute", + G_CALLBACK (empathy_audio_src_volume_changed), obj); + } + gst_bin_add (GST_BIN (obj), priv->src); /* Explicitly state what format we want from pulsesrc. This pushes resampling @@ -372,9 +332,13 @@ empathy_audio_src_init (EmpathyGstAudioSrc *obj) gst_bin_add (GST_BIN (obj), capsfilter); gst_element_link (priv->src, capsfilter); + priv->volume_element = gst_element_factory_make ("volume", NULL); + gst_bin_add (GST_BIN (obj), priv->volume_element); + gst_element_link (capsfilter, priv->volume_element); + priv->level = gst_element_factory_make ("level", NULL); gst_bin_add (GST_BIN (obj), priv->level); - gst_element_link (capsfilter, priv->level); + gst_element_link (priv->volume_element, priv->level); src = gst_element_get_static_pad (priv->level, "src"); @@ -575,7 +539,7 @@ empathy_audio_src_levels_updated (gpointer user_data) } static gboolean -empathy_audio_src_volume_changed (gpointer user_data) +empathy_audio_src_volume_changed_idle (gpointer user_data) { EmpathyGstAudioSrc *self = EMPATHY_GST_AUDIO_SRC (user_data); EmpathyGstAudioSrcPrivate *priv = EMPATHY_GST_AUDIO_SRC_GET_PRIVATE (self); @@ -598,12 +562,30 @@ empathy_audio_src_volume_changed (gpointer user_data) if (mute != priv->mute) { priv->mute = mute; + /* hw mute changed, follow with own volume */ + g_object_set (self->priv->volume_element, "mute", mute, NULL); g_object_notify (G_OBJECT (self), "mute"); } return FALSE; } +static gboolean +empathy_audio_src_volume_changed (GObject *object, + GParamSpec *pspec, + gpointer user_data) +{ + EmpathyGstAudioSrc *self = EMPATHY_GST_AUDIO_SRC (user_data); + + g_mutex_lock (self->priv->lock); + if (self->priv->volume_idle_id == 0) + self->priv->volume_idle_id = g_idle_add ( + empathy_audio_src_volume_changed_idle, self); + g_mutex_unlock (self->priv->lock); + + return FALSE; +} + static void empathy_audio_src_handle_message (GstBin *bin, GstMessage *message) { @@ -662,58 +644,6 @@ empathy_audio_src_handle_message (GstBin *bin, GstMessage *message) g_mutex_unlock (priv->lock); } - else if (GST_MESSAGE_TYPE (message) == GST_MESSAGE_ELEMENT && - GST_MESSAGE_SRC (message) == GST_OBJECT (priv->src)) - { - GstMixerTrack *track = NULL; - - /* Listen for mute or volume changes on the src element */ - if (gst_mixer_message_get_type (message) == - GST_MIXER_MESSAGE_VOLUME_CHANGED) - gst_mixer_message_parse_volume_changed (message, &track, - NULL, NULL); - - if (gst_mixer_message_get_type (message) == - GST_MIXER_MESSAGE_MUTE_TOGGLED) - gst_mixer_message_parse_mute_toggled (message, &track, NULL); - - g_mutex_lock (priv->lock); - - if (track != NULL && track == priv->track && priv->volume_idle_id == 0) - priv->volume_idle_id = g_idle_add ( - empathy_audio_src_volume_changed, self); - - g_mutex_unlock (priv->lock); - } - else if (GST_MESSAGE_TYPE (message) == GST_MESSAGE_STATE_CHANGED && - GST_MESSAGE_SRC (message) == GST_OBJECT (priv->src)) - { - GstState old, new; - - gst_message_parse_state_changed (message, &old, &new, NULL); - - /* GstMixer is only available in state >= READY, so only start - * controlling the source element when going to ready state and stop - * doing so when going below ready. Furthermore once we have mixer read - * the current volume level from it and remove the settings done by - * Empathy. We want to pick up the level pulseaudio saved */ - if (old == GST_STATE_NULL && new == GST_STATE_READY) - { - g_mutex_lock (priv->lock); - priv->track = empathy_audio_src_get_track (priv->src); - if (priv->track != NULL) - priv->volume_idle_id = g_idle_add ( - empathy_audio_src_volume_changed, self); - g_mutex_unlock (priv->lock); - } - else if (old == GST_STATE_READY && new == GST_STATE_NULL) - { - g_mutex_lock (priv->lock); - priv->track = NULL; - g_mutex_unlock (priv->lock); - } - } - out: GST_BIN_CLASS (empathy_audio_src_parent_class)->handle_message (bin, message); -- cgit v1.2.3 From d524cc36152688f8475f14eb2bfd17bcb1e34b3f Mon Sep 17 00:00:00 2001 From: Sjoerd Simons Date: Mon, 21 May 2012 12:16:49 +0200 Subject: call: Keep the toolbar around if muted It's not uncommon for people to forget that the put a call on mute, causing awkward situation while trying to talk while muted. To prevent this, keep the toolbar showhing while muted as a reminder. --- src/empathy-call-window.c | 28 ++++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/src/empathy-call-window.c b/src/empathy-call-window.c index 67b1aea0b..01181c40b 100644 --- a/src/empathy-call-window.c +++ b/src/empathy-call-window.c @@ -275,6 +275,8 @@ struct _EmpathyCallWindowPriv GSettings *settings; EmpathyMicMenu *mic_menu; EmpathyCameraMenu *camera_menu; + + gboolean muted; }; #define GET_PRIV(o) (EMPATHY_CALL_WINDOW (o)->priv) @@ -324,6 +326,8 @@ static void empathy_call_window_status_message (EmpathyCallWindow *window, static gboolean empathy_call_window_bus_message (GstBus *bus, GstMessage *message, gpointer user_data); +static gboolean empathy_call_window_update_timer (gpointer user_data); + static void make_background_transparent (GtkClutterActor *actor) { @@ -461,6 +465,20 @@ element_volume_to_audio_control (GBinding *binding, return TRUE; } +static void +audio_input_mute_notify_cb (GObject *obj, GParamSpec *spec, + EmpathyCallWindow *self) +{ + gboolean muted; + g_object_get (obj, "mute", &muted, NULL); + + self->priv->muted = muted; + if (muted && self->priv->transitions) + clutter_state_set_state (self->priv->transitions, "fade-in"); + + empathy_call_window_update_timer (self); +} + static void create_audio_input (EmpathyCallWindow *self) { @@ -470,10 +488,14 @@ create_audio_input (EmpathyCallWindow *self) priv->audio_input = empathy_audio_src_new (); gst_object_ref_sink (priv->audio_input); + g_signal_connect (priv->audio_input, "notify::mute", + G_CALLBACK (audio_input_mute_notify_cb), self); + g_object_bind_property (priv->mic_button, "active", priv->audio_input, "mute", G_BINDING_BIDIRECTIONAL | G_BINDING_INVERT_BOOLEAN | G_BINDING_SYNC_CREATE); + } static void @@ -1359,9 +1381,11 @@ empathy_call_window_toolbar_timeout (gpointer data) EmpathyCallWindow *self = data; /* We don't want to hide the toolbar if we're not in a call, as - * to show the call status all the time. */ + * to show the call status all the time. Also don't hide if we're muted + * to prevent the awkward, talking when muted situation */ if (self->priv->call_state != CONNECTING && - self->priv->call_state != DISCONNECTED) + self->priv->call_state != DISCONNECTED && + !self->priv->muted) clutter_state_set_state (self->priv->transitions, "fade-out"); return TRUE; -- cgit v1.2.3 From 108b3fa233660bdd0e88ac2d4642a75efa8f1eb7 Mon Sep 17 00:00:00 2001 From: Sjoerd Simons Date: Mon, 21 May 2012 13:44:06 +0200 Subject: audiosrc: Don't use stream volumes properties if the src doesn't support them --- src/empathy-audio-src.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/empathy-audio-src.c b/src/empathy-audio-src.c index 5a82979aa..ca086148f 100644 --- a/src/empathy-audio-src.c +++ b/src/empathy-audio-src.c @@ -75,6 +75,7 @@ struct _EmpathyGstAudioSrcPrivate gdouble volume; gboolean mute; + gboolean have_stream_volume; GMutex *lock; guint level_idle_id; @@ -97,7 +98,8 @@ empathy_audio_set_hw_mute (EmpathyGstAudioSrc *self, gboolean mute) if (mute == self->priv->mute) return; - g_object_set (self->priv->src, "mute", mute, NULL); + if (self->priv->have_stream_volume) + g_object_set (self->priv->src, "mute", mute, NULL); /* Belt and braces: If for some reason the underlying src doesn't mute * correctly or doesn't update us when it unmutes correctly enforce it using @@ -124,7 +126,8 @@ empathy_audio_src_set_hw_volume (EmpathyGstAudioSrc *self, if (volume == self->priv->volume) return; - g_object_set (self->priv->src, "volume", volume, NULL); + if (self->priv->have_stream_volume) + g_object_set (self->priv->src, "volume", volume, NULL); self->priv->volume = volume; } @@ -293,6 +296,8 @@ empathy_audio_src_init (EmpathyGstAudioSrc *obj) { gdouble volume; gboolean mute; + + priv->have_stream_volume = TRUE; /* We can't do a bidirection bind as the ::notify comes from another * thread, for other bits of empathy it's most simpler if it comes from * the main thread */ @@ -313,6 +318,11 @@ empathy_audio_src_init (EmpathyGstAudioSrc *obj) g_signal_connect (priv->src, "notify::mute", G_CALLBACK (empathy_audio_src_volume_changed), obj); } + else + { + g_message ("No stream volume available :(, mute will work though"); + priv->have_stream_volume = FALSE; + } gst_bin_add (GST_BIN (obj), priv->src); -- cgit v1.2.3 From a7feeae6d2028daa75a36e4a0f992877faabf1d9 Mon Sep 17 00:00:00 2001 From: Sjoerd Simons Date: Mon, 21 May 2012 13:52:34 +0200 Subject: call: Initialize the timer early --- src/empathy-call-window.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/empathy-call-window.c b/src/empathy-call-window.c index 01181c40b..bd2067865 100644 --- a/src/empathy-call-window.c +++ b/src/empathy-call-window.c @@ -1559,6 +1559,7 @@ empathy_call_window_init (EmpathyCallWindow *self) EMPATHY_TYPE_CALL_WINDOW, EmpathyCallWindowPriv); priv->settings = g_settings_new (EMPATHY_PREFS_CALL_SCHEMA); + priv->timer = g_timer_new (); filename = empathy_file_lookup ("empathy-call-window.ui", "src"); gui = empathy_builder_get_file (filename, @@ -1790,8 +1791,6 @@ empathy_call_window_init (EmpathyCallWindow *self) g_signal_connect (self, "motion-notify-event", G_CALLBACK (empathy_call_window_motion_notify_cb), self); - priv->timer = g_timer_new (); - g_object_ref (priv->ui_manager); g_object_unref (gui); -- cgit v1.2.3 From 71cab9b191860ec1208cc4b144be9409e16f780a Mon Sep 17 00:00:00 2001 From: Guillaume Desmottes Date: Mon, 21 May 2012 14:04:48 +0200 Subject: Prepare 3.4.2.1 --- NEWS | 14 ++++++++++++++ configure.ac | 4 ++-- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/NEWS b/NEWS index c2983c407..2c7845120 100644 --- a/NEWS +++ b/NEWS @@ -1,3 +1,17 @@ +NEW in 3.4.2.1 (21/05/2012) +============== + +This release fixes various issues in the call UI and a crash when taking +a picture from the avatar chooser dialog. + +Dependencies: + • clutter-gtk ≥ 1.1.2 + • cheese ≥ 3.4.0 (optional) + +Bugs fixed: + - Fixed #670874, floating toolbar not working (Sjoerd Simons) + - Fixed #674553, Take picture button in image change doesn't work. (Guillaume Desmottes) + NEW in 3.4.2 (14/05/2012) ============ diff --git a/configure.ac b/configure.ac index eebe69790..d343a0bf1 100644 --- a/configure.ac +++ b/configure.ac @@ -1,10 +1,10 @@ dnl If not 1, append datestamp to the version number -m4_define(empathy_released, 0) +m4_define(empathy_released, 1) m4_define([empathy_major_version], [3]) m4_define([empathy_minor_version], [4]) m4_define([empathy_micro_version], [2]) -m4_define([empathy_nano_version], [0]) +m4_define([empathy_nano_version], [1]) dnl Display the nano_version only if it's not '0' m4_define([empathy_base_version], -- cgit v1.2.3 From bf32eb7eb97820578b4f878e57ca9105fc7f5147 Mon Sep 17 00:00:00 2001 From: Guillaume Desmottes Date: Mon, 21 May 2012 14:20:20 +0200 Subject: remove released flag --- configure.ac | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index d343a0bf1..eae95ee01 100644 --- a/configure.ac +++ b/configure.ac @@ -1,5 +1,5 @@ dnl If not 1, append datestamp to the version number -m4_define(empathy_released, 1) +m4_define(empathy_released, 0) m4_define([empathy_major_version], [3]) m4_define([empathy_minor_version], [4]) -- cgit v1.2.3