* 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>
#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
GstElement *video_tee;
GstElement *funnel;
- GstElement *liveadder;
FsElementAddedNotifier *fsnotifier;
}
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;
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);
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);
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);
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)
{
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);
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,
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);
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 ();
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),
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 ();
/* 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,
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);
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);
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
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;
{
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);
gtk_widget_destroy (priv->video_preview);
priv->video_preview = NULL;
- priv->liveadder = NULL;
priv->funnel = NULL;
create_pipeline (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
}
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;
}
}
}
{
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;
}
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 */
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 */
}
else
{
- g_debug ("Could not link real sink, linked fakesink instead");
+ DEBUG ("Could not link real sink, linked fakesink instead");
}
gst_object_unref (sinkpad);
}
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))
{