]> git.0d.be Git - empathy.git/blobdiff - src/empathy-streamed-media-window.c
fix GTK_BOX casts
[empathy.git] / src / empathy-streamed-media-window.c
index bb6df685cebf58509a619ad1869788b1a8a8657a..df3fbab007c9b464c67154d29e7c5b42afc3bc66 100644 (file)
@@ -18,6 +18,7 @@
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  */
 
+#include "config.h"
 
 #include <stdio.h>
 #include <stdlib.h>
 #include <telepathy-glib/util.h>
 
 #include <gst/farsight/fs-element-added-notifier.h>
+#include <gst/farsight/fs-utils.h>
 
 #include <libempathy/empathy-tp-contact-factory.h>
 #include <libempathy/empathy-utils.h>
 #include <libempathy-gtk/empathy-avatar-image.h>
+#include <libempathy-gtk/empathy-dialpad-widget.h>
 #include <libempathy-gtk/empathy-ui-utils.h>
 #include <libempathy-gtk/empathy-sound-manager.h>
 #include <libempathy-gtk/empathy-geometry.h>
@@ -54,8 +57,6 @@
 #include "empathy-video-src.h"
 #include "ev-sidebar.h"
 
-#define BUTTON_ID "empathy-call-dtmf-button-id"
-
 #define CONTENT_HBOX_BORDER_WIDTH 6
 #define CONTENT_HBOX_SPACING 3
 #define CONTENT_HBOX_CHILDREN_PACKING_PADDING 3
@@ -188,7 +189,6 @@ struct _EmpathyStreamedMediaWindowPriv
   GstElement *video_tee;
 
   GstElement *funnel;
-  GstElement *liveadder;
 
   FsElementAddedNotifier *fsnotifier;
 
@@ -338,26 +338,24 @@ empathy_streamed_media_window_setup_toolbar (EmpathyStreamedMediaWindow *self)
 }
 
 static void
-dtmf_button_pressed_cb (GtkButton *button, EmpathyStreamedMediaWindow *window)
+dtmf_start_tone_cb (EmpathyDialpadWidget *dialpad,
+    TpDTMFEvent event,
+    EmpathyStreamedMediaWindow *window)
 {
   EmpathyStreamedMediaWindowPriv *priv = GET_PRIV (window);
   EmpathyTpStreamedMedia *call;
-  GQuark button_quark;
-  TpDTMFEvent event;
 
   g_object_get (priv->handler, "tp-call", &call, NULL);
 
-  button_quark = g_quark_from_static_string (BUTTON_ID);
-  event = GPOINTER_TO_UINT (g_object_get_qdata (G_OBJECT (button),
-    button_quark));
-
   empathy_tp_streamed_media_start_tone (call, event);
 
   g_object_unref (call);
 }
 
 static void
-dtmf_button_released_cb (GtkButton *button, EmpathyStreamedMediaWindow *window)
+dtmf_stop_tone_cb (EmpathyDialpadWidget *self,
+    TpDTMFEvent event,
+    EmpathyStreamedMediaWindow *window)
 {
   EmpathyStreamedMediaWindowPriv *priv = GET_PRIV (window);
   EmpathyTpStreamedMedia *call;
@@ -369,56 +367,11 @@ dtmf_button_released_cb (GtkButton *button, EmpathyStreamedMediaWindow *window)
   g_object_unref (call);
 }
 
-static GtkWidget *
-empathy_streamed_media_window_create_dtmf (EmpathyStreamedMediaWindow *self)
-{
-  GtkWidget *table;
-  int i;
-  GQuark button_quark;
-  struct {
-    const gchar *label;
-    TpDTMFEvent event;
-  } dtmfbuttons[] = { { "1", TP_DTMF_EVENT_DIGIT_1 },
-                      { "2", TP_DTMF_EVENT_DIGIT_2 },
-                      { "3", TP_DTMF_EVENT_DIGIT_3 },
-                      { "4", TP_DTMF_EVENT_DIGIT_4 },
-                      { "5", TP_DTMF_EVENT_DIGIT_5 },
-                      { "6", TP_DTMF_EVENT_DIGIT_6 },
-                      { "7", TP_DTMF_EVENT_DIGIT_7 },
-                      { "8", TP_DTMF_EVENT_DIGIT_8 },
-                      { "9", TP_DTMF_EVENT_DIGIT_9 },
-                      { "#", TP_DTMF_EVENT_HASH },
-                      { "0", TP_DTMF_EVENT_DIGIT_0 },
-                      { "*", TP_DTMF_EVENT_ASTERISK },
-                      { NULL, } };
-
-  button_quark = g_quark_from_static_string (BUTTON_ID);
-
-  table = gtk_table_new (4, 3, TRUE);
-
-  for (i = 0; dtmfbuttons[i].label != NULL; i++)
-    {
-      GtkWidget *button = gtk_button_new_with_label (dtmfbuttons[i].label);
-      gtk_table_attach (GTK_TABLE (table), button, i % 3, i % 3 + 1,
-        i/3, i/3 + 1, GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 1, 1);
-
-      g_object_set_qdata (G_OBJECT (button), button_quark,
-        GUINT_TO_POINTER (dtmfbuttons[i].event));
-
-      g_signal_connect (G_OBJECT (button), "pressed",
-        G_CALLBACK (dtmf_button_pressed_cb), self);
-      g_signal_connect (G_OBJECT (button), "released",
-        G_CALLBACK (dtmf_button_released_cb), self);
-    }
-
-  return table;
-}
-
 static GtkWidget *
 empathy_streamed_media_window_create_video_input_add_slider (EmpathyStreamedMediaWindow *self,
   gchar *label_text, GtkWidget *bin)
 {
-   GtkWidget *vbox = gtk_vbox_new (FALSE, 2);
+   GtkWidget *vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 2);
    GtkWidget *scale = gtk_vscale_new_with_range (0, 100, 10);
    GtkWidget *label = gtk_label_new (label_text);
 
@@ -473,7 +426,8 @@ empathy_streamed_media_window_create_video_input (EmpathyStreamedMediaWindow *se
   EmpathyStreamedMediaWindowPriv *priv = GET_PRIV (self);
   GtkWidget *hbox;
 
-  hbox = gtk_hbox_new (TRUE, 3);
+  hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 3);
+  gtk_box_set_homogeneous (GTK_BOX (hbox), TRUE);
 
   priv->video_contrast = empathy_streamed_media_window_create_video_input_add_slider (
     self,  _("Contrast"), hbox);
@@ -580,9 +534,10 @@ empathy_streamed_media_window_create_audio_input (EmpathyStreamedMediaWindow *se
   EmpathyStreamedMediaWindowPriv *priv = GET_PRIV (self);
   GtkWidget *hbox, *vbox, *label;
 
-  hbox = gtk_hbox_new (TRUE, 3);
+  hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 3);
+  gtk_box_set_homogeneous (GTK_BOX (hbox), TRUE);
 
-  vbox = gtk_vbox_new (FALSE, 3);
+  vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 3);
   gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 3);
 
   priv->volume_scale = gtk_vscale_new_with_range (0, 150, 100);
@@ -638,17 +593,6 @@ create_video_output_widget (EmpathyStreamedMediaWindow *self)
   g_object_unref (bus);
 }
 
-static void
-create_audio_output (EmpathyStreamedMediaWindow *self)
-{
-  EmpathyStreamedMediaWindowPriv *priv = GET_PRIV (self);
-
-  g_assert (priv->audio_output == NULL);
-  priv->audio_output = empathy_audio_sink_new ();
-  gst_object_ref (priv->audio_output);
-  gst_object_sink (priv->audio_output);
-}
-
 static void
 create_video_input (EmpathyStreamedMediaWindow *self)
 {
@@ -733,7 +677,11 @@ create_video_preview (EmpathyStreamedMediaWindow *self)
 
   priv->video_preview = empathy_video_widget_new_with_size (bus,
       SELF_VIDEO_SECTION_WIDTH, SELF_VIDEO_SECTION_HEIGTH);
-  g_object_set (priv->video_preview, "sync", FALSE, "async", TRUE, NULL);
+  g_object_set (priv->video_preview,
+      "sync", FALSE,
+      "async", TRUE,
+      "flip-video", TRUE,
+      NULL);
 
   gtk_box_pack_start (GTK_BOX (priv->self_user_output_hbox),
       priv->video_preview, TRUE, TRUE, 0);
@@ -1036,11 +984,9 @@ empathy_streamed_media_window_init (EmpathyStreamedMediaWindow *self)
   GtkWidget *arrow;
   GtkWidget *page;
   gchar *filename;
-  GKeyFile *keyfile;
-  GError *error = NULL;
   GtkWidget *scroll;
 
-  filename = empathy_file_lookup ("empathy-call-window.ui", "src");
+  filename = empathy_file_lookup ("empathy-streamed-media-window.ui", "src");
   gui = empathy_builder_get_file (filename,
     "call_window_vbox", &top_vbox,
     "errors_vbox", &priv->errors_vbox,
@@ -1091,7 +1037,8 @@ empathy_streamed_media_window_init (EmpathyStreamedMediaWindow *self)
 
   gtk_container_add (GTK_CONTAINER (self), top_vbox);
 
-  priv->content_hbox = gtk_hbox_new (FALSE, CONTENT_HBOX_SPACING);
+  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_paned_pack1 (GTK_PANED (priv->pane), priv->content_hbox, TRUE, FALSE);
@@ -1104,7 +1051,7 @@ empathy_streamed_media_window_init (EmpathyStreamedMediaWindow *self)
       priv->remote_user_output_frame, TRUE, TRUE,
       CONTENT_HBOX_CHILDREN_PACKING_PADDING);
 
-  priv->remote_user_output_hbox = gtk_hbox_new (FALSE, 0);
+  priv->remote_user_output_hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
 
   priv->remote_user_avatar_widget = gtk_image_new ();
 
@@ -1119,7 +1066,7 @@ empathy_streamed_media_window_init (EmpathyStreamedMediaWindow *self)
   gtk_widget_set_size_request (priv->self_user_output_frame,
       SELF_VIDEO_SECTION_WIDTH, SELF_VIDEO_SECTION_HEIGTH);
 
-  priv->self_user_output_hbox = gtk_hbox_new (FALSE, 0);
+  priv->self_user_output_hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
 
   priv->self_user_avatar_widget = gtk_image_new ();
   gtk_box_pack_start (GTK_BOX (priv->self_user_output_hbox),
@@ -1131,7 +1078,6 @@ empathy_streamed_media_window_init (EmpathyStreamedMediaWindow *self)
   create_pipeline (self);
   create_video_output_widget (self);
   create_audio_input (self);
-  create_audio_output (self);
   create_video_input (self);
 
   priv->fsnotifier = fs_element_added_notifier_new ();
@@ -1140,22 +1086,7 @@ empathy_streamed_media_window_init (EmpathyStreamedMediaWindow *self)
   /* The call will be started as soon the pipeline is playing */
   priv->start_call_when_playing = TRUE;
 
-  keyfile = g_key_file_new ();
-  filename = empathy_file_lookup ("element-properties", "data");
-  if (g_key_file_load_from_file (keyfile, filename, G_KEY_FILE_NONE, &error))
-    {
-      fs_element_added_notifier_set_properties_from_keyfile (priv->fsnotifier,
-          keyfile);
-    }
-  else
-    {
-      g_warning ("Could not load element-properties file: %s", error->message);
-      g_key_file_free (keyfile);
-      g_clear_error (&error);
-    }
-  g_free (filename);
-
-  priv->vbox = gtk_vbox_new (FALSE, 3);
+  priv->vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 3);
   gtk_box_pack_start (GTK_BOX (priv->content_hbox), priv->vbox,
       FALSE, FALSE, CONTENT_HBOX_CHILDREN_PACKING_PADDING);
   gtk_box_pack_start (GTK_BOX (priv->vbox), priv->self_user_output_frame,
@@ -1170,7 +1101,7 @@ empathy_streamed_media_window_init (EmpathyStreamedMediaWindow *self)
 
   gtk_button_set_image (GTK_BUTTON (priv->sidebar_button), arrow);
 
-  h = gtk_hbox_new (FALSE, 3);
+  h = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 3);
   gtk_box_pack_end (GTK_BOX (priv->vbox), h, FALSE, FALSE, 3);
   gtk_box_pack_end (GTK_BOX (h), priv->sidebar_button, FALSE, FALSE, 3);
 
@@ -1189,7 +1120,11 @@ empathy_streamed_media_window_init (EmpathyStreamedMediaWindow *self)
   ev_sidebar_add_page (EV_SIDEBAR (priv->sidebar), "video-input",
       _("Video input"), page);
 
-  priv->dtmf_panel = empathy_streamed_media_window_create_dtmf (self);
+  priv->dtmf_panel = empathy_dialpad_widget_new ();
+  g_signal_connect (priv->dtmf_panel, "start-tone",
+      G_CALLBACK (dtmf_start_tone_cb), self);
+  g_signal_connect (priv->dtmf_panel, "stop-tone",
+      G_CALLBACK (dtmf_stop_tone_cb), self);
   ev_sidebar_add_page (EV_SIDEBAR (priv->sidebar), "dialpad",
       _("Dialpad"), priv->dtmf_panel);
 
@@ -1233,7 +1168,7 @@ empathy_streamed_media_window_init (EmpathyStreamedMediaWindow *self)
 
   priv->sound_mgr = empathy_sound_manager_dup_singleton ();
 
-  empathy_geometry_bind (GTK_WINDOW (self), "call-window");
+  empathy_geometry_bind (GTK_WINDOW (self), "av-window");
 }
 
 /* Instead of specifying a width and a height, we specify only one size. That's
@@ -1733,18 +1668,10 @@ empathy_streamed_media_window_dispose (GObject *object)
     g_object_unref (priv->audio_input);
   priv->audio_input = NULL;
 
-  if (priv->audio_output != NULL)
-    g_object_unref (priv->audio_output);
-  priv->audio_output = NULL;
-
   if (priv->video_tee != NULL)
     g_object_unref (priv->video_tee);
   priv->video_tee = NULL;
 
-  if (priv->liveadder != NULL)
-    gst_object_unref (priv->liveadder);
-  priv->liveadder = NULL;
-
   if (priv->fsnotifier != NULL)
     g_object_unref (priv->fsnotifier);
   priv->fsnotifier = NULL;
@@ -1819,6 +1746,12 @@ empathy_streamed_media_window_conference_added_cb (EmpathyStreamedMediaHandler *
 {
   EmpathyStreamedMediaWindow *self = EMPATHY_STREAMED_MEDIA_WINDOW (user_data);
   EmpathyStreamedMediaWindowPriv *priv = GET_PRIV (self);
+  GKeyFile *keyfile;
+
+  keyfile = fs_utils_get_default_element_properties (conference);
+  if (keyfile != NULL)
+    fs_element_added_notifier_set_properties_from_keyfile (priv->fsnotifier,
+        keyfile);
 
   gst_bin_add (GST_BIN (priv->pipeline), conference);
 
@@ -1877,7 +1810,6 @@ empathy_streamed_media_window_reset_pipeline (EmpathyStreamedMediaWindow *self)
         gtk_widget_destroy (priv->video_preview);
       priv->video_preview = NULL;
 
-      priv->liveadder = NULL;
       priv->funnel = NULL;
 
       create_pipeline (self);
@@ -1902,13 +1834,17 @@ reset_details_pane (EmpathyStreamedMediaWindow *self)
   EmpathyStreamedMediaWindowPriv *priv = GET_PRIV (self);
 
   /* translators: encoding video codec is unknown */
-  gtk_label_set_text (GTK_LABEL (priv->vcodec_encoding_label), _("Unknown"));
+  gtk_label_set_text (GTK_LABEL (priv->vcodec_encoding_label),
+      C_("codec", "Unknown"));
   /* translators: encoding audio codec is unknown */
-  gtk_label_set_text (GTK_LABEL (priv->acodec_encoding_label), _("Unknown"));
+  gtk_label_set_text (GTK_LABEL (priv->acodec_encoding_label),
+      C_("codec", "Unknown"));
   /* translators: decoding video codec is unknown */
-  gtk_label_set_text (GTK_LABEL (priv->vcodec_decoding_label), _("Unknown"));
+  gtk_label_set_text (GTK_LABEL (priv->vcodec_decoding_label),
+      C_("codec", "Unknown"));
   /* translators: decoding audio codec is unknown */
-  gtk_label_set_text (GTK_LABEL (priv->acodec_decoding_label), _("Unknown"));
+  gtk_label_set_text (GTK_LABEL (priv->acodec_decoding_label),
+      C_("codec", "Unknown"));
 }
 
 static gboolean
@@ -2047,14 +1983,12 @@ empathy_streamed_media_window_channel_stream_closed_cb (EmpathyStreamedMediaHand
     }
   else if (media_type == TP_MEDIA_STREAM_TYPE_AUDIO)
     {
-      if (priv->liveadder != NULL)
+      if (priv->audio_output != NULL)
         {
           gst_element_set_state (priv->audio_output, GST_STATE_NULL);
-          gst_element_set_state (priv->liveadder, GST_STATE_NULL);
 
           gst_bin_remove (GST_BIN (priv->pipeline), priv->audio_output);
-          gst_bin_remove (GST_BIN (priv->pipeline), priv->liveadder);
-          priv->liveadder = NULL;
+          priv->audio_output = NULL;
         }
     }
 }
@@ -2146,112 +2080,47 @@ empathy_streamed_media_window_get_audio_sink_pad (EmpathyStreamedMediaWindow *se
 {
   EmpathyStreamedMediaWindowPriv *priv = GET_PRIV (self);
   GstPad *pad;
-  GstElement *filter;
-  GError *gerror = NULL;
+  GstPadTemplate *template;
 
-  if (priv->liveadder == NULL)
+  if (priv->audio_output == NULL)
     {
-      priv->liveadder = gst_element_factory_make ("liveadder", NULL);
+      priv->audio_output = empathy_audio_sink_new ();
 
-      if (!gst_bin_add (GST_BIN (priv->pipeline), priv->liveadder))
-        {
-          g_warning ("Could not add liveadder to the pipeline");
-          goto error_add_liveadder;
-        }
       if (!gst_bin_add (GST_BIN (priv->pipeline), priv->audio_output))
         {
           g_warning ("Could not add audio sink to pipeline");
+          g_object_unref (priv->audio_output);
           goto error_add_output;
         }
 
-      if (gst_element_set_state (priv->liveadder, GST_STATE_PLAYING) == GST_STATE_CHANGE_FAILURE)
-        {
-          g_warning ("Could not start liveadder");
-          goto error;
-        }
-
       if (gst_element_set_state (priv->audio_output, GST_STATE_PLAYING) == GST_STATE_CHANGE_FAILURE)
         {
           g_warning ("Could not start audio sink");
           goto error;
         }
-
-      if (GST_PAD_LINK_FAILED (
-              gst_element_link (priv->liveadder, priv->audio_output)))
-        {
-          g_warning ("Could not link liveadder to audio output");
-          goto error;
-        }
     }
 
-  filter = gst_parse_bin_from_description (
-      "audioconvert ! audioresample ! audioconvert", TRUE, &gerror);
-  if (filter == NULL)
-    {
-      g_warning ("Could not make audio conversion filter: %s", gerror->message);
-      g_clear_error (&gerror);
-      goto error;
-    }
+  template = gst_element_class_get_pad_template (
+    GST_ELEMENT_GET_CLASS (priv->audio_output), "sink%d");
 
-  if (!gst_bin_add (GST_BIN (priv->pipeline), filter))
-    {
-      g_warning ("Could not add audio conversion filter to pipeline");
-      gst_object_unref (filter);
-      goto error;
-    }
-
-  if (gst_element_set_state (filter, GST_STATE_PLAYING) == GST_STATE_CHANGE_FAILURE)
-    {
-      g_warning ("Could not start audio conversion filter");
-      goto error_filter;
-    }
-
-  if (!gst_element_link (filter, priv->liveadder))
-    {
-      g_warning ("Could not link audio conversion filter to liveadder");
-      goto error_filter;
-    }
-
-  pad = gst_element_get_static_pad (filter, "sink");
+  pad = gst_element_request_pad (priv->audio_output,
+    template, NULL, NULL);
 
   if (pad == NULL)
     {
-      g_warning ("Could not get sink pad from filter");
-      goto error_filter;
+      g_warning ("Could not get sink pad from sink");
+      return NULL;
     }
 
   return pad;
 
- error_filter:
-
-  gst_element_set_locked_state (filter, TRUE);
-  gst_element_set_state (filter, GST_STATE_NULL);
-  gst_bin_remove (GST_BIN (priv->pipeline), filter);
-
- error:
-
-  gst_element_set_locked_state (priv->liveadder, TRUE);
+error:
   gst_element_set_locked_state (priv->audio_output, TRUE);
-
-  gst_element_set_state (priv->liveadder, GST_STATE_NULL);
   gst_element_set_state (priv->audio_output, GST_STATE_NULL);
-
   gst_bin_remove (GST_BIN (priv->pipeline), priv->audio_output);
+  priv->audio_output = NULL;
 
- error_add_output:
-
-  gst_bin_remove (GST_BIN (priv->pipeline), priv->liveadder);
-
-  gst_element_set_locked_state (priv->liveadder, FALSE);
-  gst_element_set_locked_state (priv->audio_output, FALSE);
-
- error_add_liveadder:
-
-  if (priv->liveadder != NULL)
-    {
-      gst_object_unref (priv->liveadder);
-      priv->liveadder = NULL;
-    }
+error_add_output:
 
   return NULL;
 }
@@ -2301,7 +2170,7 @@ display_error (EmpathyStreamedMediaWindow *self,
   content_area = gtk_info_bar_get_content_area (GTK_INFO_BAR (info_bar));
 
   /* hbox containing the image and the messages vbox */
-  hbox = gtk_hbox_new (FALSE, 3);
+  hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 3);
   gtk_container_add (GTK_CONTAINER (content_area), hbox);
 
   /* Add image */
@@ -2309,7 +2178,7 @@ display_error (EmpathyStreamedMediaWindow *self,
   gtk_box_pack_start (GTK_BOX (hbox), image, FALSE, FALSE, 0);
 
   /* vbox containing the main message and the details expander */
-  vbox = gtk_vbox_new (FALSE, 3);
+  vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 3);
   gtk_box_pack_start (GTK_BOX (hbox), vbox, TRUE, TRUE, 0);
 
   /* Add text */
@@ -2588,7 +2457,7 @@ empathy_streamed_media_window_src_added_cb (EmpathyStreamedMediaHandler *handler
             }
           else
             {
-              g_debug ("Could not link real sink, linked fakesink instead");
+              DEBUG ("Could not link real sink, linked fakesink instead");
             }
           gst_object_unref (sinkpad);
         }
@@ -2709,7 +2578,7 @@ start_call (EmpathyStreamedMediaWindow *self)
 
   priv->call_started = TRUE;
   empathy_streamed_media_handler_start_call (priv->handler,
-      gtk_get_current_event_time ());
+      empathy_get_current_action_time ());
 
   if (empathy_streamed_media_handler_has_initial_video (priv->handler))
     {