X-Git-Url: https://git.0d.be/?p=empathy.git;a=blobdiff_plain;f=libempathy-gtk%2Fempathy-call-utils.c;h=a235e7b999a25fed1a3200169481c715953bd8b2;hp=0926230ec742e7f45975ccabc9aa7d1c897ed385;hb=912bbee404f948ae85d8c5705857b7dde0595ea0;hpb=c6e11eb4767148a799ab565de508886ffa7fa86f diff --git a/libempathy-gtk/empathy-call-utils.c b/libempathy-gtk/empathy-call-utils.c index 0926230e..a235e7b9 100644 --- a/libempathy-gtk/empathy-call-utils.c +++ b/libempathy-gtk/empathy-call-utils.c @@ -19,23 +19,16 @@ */ #include "config.h" +#include "empathy-call-utils.h" -#include - +#include #include -#include - -#include - -#include - -#include "empathy-call-utils.h" +#include -#include -#include +#include "empathy-request-util.h" #define DEBUG_FLAG EMPATHY_DEBUG_OTHER -#include +#include "empathy-debug.h" static const gchar * get_error_display_message (GError *error) @@ -83,55 +76,25 @@ empathy_call_create_call_request (const gchar *contact, gboolean initial_audio, gboolean initial_video) { - return tp_asv_new ( + GHashTable *asv = tp_asv_new ( TP_PROP_CHANNEL_CHANNEL_TYPE, G_TYPE_STRING, - TPY_IFACE_CHANNEL_TYPE_CALL, + TP_IFACE_CHANNEL_TYPE_CALL, TP_PROP_CHANNEL_TARGET_HANDLE_TYPE, G_TYPE_UINT, TP_HANDLE_TYPE_CONTACT, TP_PROP_CHANNEL_TARGET_ID, G_TYPE_STRING, contact, - TPY_PROP_CHANNEL_TYPE_CALL_INITIAL_AUDIO, G_TYPE_BOOLEAN, - initial_audio, - TPY_PROP_CHANNEL_TYPE_CALL_INITIAL_VIDEO, G_TYPE_BOOLEAN, - initial_video, NULL); -} -GHashTable * -empathy_call_create_streamed_media_request (const gchar *contact, - gboolean initial_audio, - gboolean initial_video) -{ - return tp_asv_new ( - TP_PROP_CHANNEL_CHANNEL_TYPE, G_TYPE_STRING, - TP_IFACE_CHANNEL_TYPE_STREAMED_MEDIA, - TP_PROP_CHANNEL_TARGET_HANDLE_TYPE, G_TYPE_UINT, - TP_HANDLE_TYPE_CONTACT, - TP_PROP_CHANNEL_TARGET_ID, G_TYPE_STRING, - contact, - TP_PROP_CHANNEL_TYPE_STREAMED_MEDIA_INITIAL_AUDIO, G_TYPE_BOOLEAN, - initial_audio, - TP_PROP_CHANNEL_TYPE_STREAMED_MEDIA_INITIAL_VIDEO, G_TYPE_BOOLEAN, - initial_video, - NULL); -} - -static void -create_streamed_media_channel_cb (GObject *source, - GAsyncResult *result, - gpointer user_data) -{ - GError *error = NULL; + /* Only add InitialAudio or InitialVideo if they are true: it should work + * with genuinely voice-only CMs. */ + if (initial_audio) + tp_asv_set_boolean (asv, TP_PROP_CHANNEL_TYPE_CALL_INITIAL_AUDIO, + initial_audio); + if (initial_video) + tp_asv_set_boolean (asv, TP_PROP_CHANNEL_TYPE_CALL_INITIAL_VIDEO, + initial_video); - if (!tp_account_channel_request_create_channel_finish ( - TP_ACCOUNT_CHANNEL_REQUEST (source), - result, - &error)) - { - DEBUG ("Failed to create StreamedMedia channel: %s", error->message); - show_call_error (error); - g_error_free (error); - } + return asv; } static void @@ -139,30 +102,15 @@ create_call_channel_cb (GObject *source, GAsyncResult *result, gpointer user_data) { - TpAccountChannelRequest *streamed_media_req = user_data; GError *error = NULL; if (tp_account_channel_request_create_channel_finish ( TP_ACCOUNT_CHANNEL_REQUEST (source), result, &error)) - { - g_object_unref (streamed_media_req); - return; - } + return; DEBUG ("Failed to create Call channel: %s", error->message); - if (error->code != TP_ERROR_NOT_IMPLEMENTED) - { - show_call_error (error); - return; - } - - DEBUG ("Let's try with an StreamedMedia channel"); - g_error_free (error); - tp_account_channel_request_create_channel_async (streamed_media_req, - EMPATHY_AV_BUS_NAME, NULL, - create_streamed_media_channel_cb, - NULL); + show_call_error (error); } void @@ -172,56 +120,102 @@ empathy_call_new_with_streams (const gchar *contact, gboolean initial_video, gint64 timestamp) { - GHashTable *call_request, *streamed_media_request; - TpAccountChannelRequest *call_req, *streamed_media_req; + GHashTable *call_request; + TpAccountChannelRequest *call_req; + /* Call */ call_request = empathy_call_create_call_request (contact, initial_audio, initial_video); - streamed_media_request = empathy_call_create_streamed_media_request ( - contact, initial_audio, initial_video); - call_req = tp_account_channel_request_new (account, call_request, timestamp); - streamed_media_req = tp_account_channel_request_new (account, - streamed_media_request, - timestamp); + + g_hash_table_unref (call_request); tp_account_channel_request_create_channel_async (call_req, - EMPATHY_CALL_BUS_NAME, NULL, - create_call_channel_cb, - streamed_media_req); + EMPATHY_CALL_TP_BUS_NAME, NULL, create_call_channel_cb, NULL); - g_hash_table_unref (call_request); - g_hash_table_unref (streamed_media_request); g_object_unref (call_req); } +/* Copied from telepathy-yell call-channel.c */ void -empathy_call_set_stream_properties (GstElement *element) +empathy_call_channel_send_video (TpCallChannel *self, + gboolean send) { - GstStructure *props; - GSettings *gsettings_call; - gboolean echo_cancellation; - - gsettings_call = g_settings_new (EMPATHY_PREFS_CALL_SCHEMA); + GPtrArray *contents; + gboolean found = FALSE; + guint i; - echo_cancellation = g_settings_get_boolean (gsettings_call, - EMPATHY_PREFS_CALL_ECHO_CANCELLATION); + g_return_if_fail (TP_IS_CALL_CHANNEL (self)); - props = gst_structure_new ("props", - PA_PROP_MEDIA_ROLE, G_TYPE_STRING, "phone", - NULL); + /* Loop over all the contents, if some of them a video set all their + * streams to sending, otherwise request a video channel in case we want to + * sent */ + contents = tp_call_channel_get_contents (self); + for (i = 0 ; i < contents->len ; i++) + { + TpCallContent *content = g_ptr_array_index (contents, i); + + if (tp_call_content_get_media_type (content) == + TP_MEDIA_STREAM_TYPE_VIDEO) + { + GPtrArray *streams; + guint j; + + found = TRUE; + streams = tp_call_content_get_streams (content); + for (j = 0; j < streams->len; j++) + { + TpCallStream *stream = g_ptr_array_index (streams, j); + + tp_call_stream_set_sending_async (stream, send, NULL, NULL); + } + } + } - if (echo_cancellation) + if (send && !found) { - gst_structure_set (props, - "filter.want", G_TYPE_STRING, "echo-cancel", - NULL); + tp_call_channel_add_content_async (self, "video", + TP_MEDIA_STREAM_TYPE_VIDEO, TP_MEDIA_STREAM_DIRECTION_BIDIRECTIONAL, + NULL, NULL); } +} - g_object_set (element, "stream-properties", props, NULL); - gst_structure_free (props); +/* Copied from telepathy-yell call-channel.c */ +TpSendingState +empathy_call_channel_get_video_state (TpCallChannel *self) +{ + TpSendingState result = TP_SENDING_STATE_NONE; + GPtrArray *contents; + guint i; + + g_return_val_if_fail (TP_IS_CALL_CHANNEL (self), TP_SENDING_STATE_NONE); + + contents = tp_call_channel_get_contents (self); + for (i = 0 ; i < contents->len ; i++) + { + TpCallContent *content = g_ptr_array_index (contents, i); + + if (tp_call_content_get_media_type (content) == + TP_MEDIA_STREAM_TYPE_VIDEO) + { + GPtrArray *streams; + guint j; + + streams = tp_call_content_get_streams (content); + for (j = 0; j < streams->len; j++) + { + TpCallStream *stream = g_ptr_array_index (streams, j); + TpSendingState state; + + state = tp_call_stream_get_local_sending_state (stream); + if (state != TP_SENDING_STATE_PENDING_STOP_SENDING && + state > result) + result = state; + } + } + } - g_object_unref (gsettings_call); + return result; }