/pidgin/main: fa361c7394a2: Merged in xhaakon/pidgin (pull reque...
Gary Kramlich <[email protected]> Mon, 18 Jul 2016 00:33:09 -0400
| Newsgroups | gmane.comp.gnome.gaim.cvs |
|---|---|
| Message-ID | <[email protected]> |
Changeset: fa361c7394a259510beaefe6134211aa3ba2c3fb Author: Gary Kramlich <[email protected]> Date: 2016-07-07 22:56 -0500 Branch: default URL: https://hg.pidgin.im/pidgin/main/rev/fa361c7394a2 Description: Merged in xhaakon/pidgin (pull request #86) GStreamer 1.0 media device management diffstat: ChangeLog.API | 1 + finch/gntmedia.c | 45 +++- libpurple/media-gst.h | 16 +- libpurple/mediamanager.c | 533 ++++++++++++++++++++++++++++++++++++++++++++++- pidgin/gtkmedia.c | 83 +++++- pidgin/gtkprefs.c | 350 ++++++++++++------------------ 6 files changed, 787 insertions(+), 241 deletions(-) diffs (truncated from 1412 to 300 lines): diff --git a/ChangeLog.API b/ChangeLog.API --- a/ChangeLog.API +++ b/ChangeLog.API @@ -71,6 +71,7 @@ version 3.0.0 (??/??/????): * purple_notify_searchresult_column_set_visible * purple_notify_user_info_entry_destroy * purple_notify_user_info_prepend_pair_plaintext + * purple_media_manager_enumerate_elements * purple_menu_action_get_callback * purple_menu_action_get_children * purple_menu_action_get_data diff --git a/finch/gntmedia.c b/finch/gntmedia.c --- a/finch/gntmedia.c +++ b/finch/gntmedia.c @@ -408,8 +408,10 @@ call_cmd_cb(PurpleConversation *conv, co return PURPLE_CMD_RET_OK; } +#ifndef USE_GSTREAMER + static GstElement * -create_default_audio_src(PurpleMedia *media, +create_default_audio_src(PurpleMediaElementInfo *info, PurpleMedia *media, const gchar *session_id, const gchar *participant) { GstElement *src; @@ -432,7 +434,7 @@ create_default_audio_src(PurpleMedia *me } static GstElement * -create_default_audio_sink(PurpleMedia *media, +create_default_audio_sink(PurpleMediaElementInfo *info, PurpleMedia *media, const gchar *session_id, const gchar *participant) { GstElement *sink; @@ -446,14 +448,41 @@ create_default_audio_sink(PurpleMedia *m } return sink; } +#endif /* USE_GSTREAMER */ #endif /* USE_VV */ void finch_media_manager_init(void) { #ifdef USE_VV PurpleMediaManager *manager = purple_media_manager_get(); - PurpleMediaElementInfo *default_audio_src = - g_object_new(PURPLE_TYPE_MEDIA_ELEMENT_INFO, + PurpleMediaElementInfo *audio_src; + PurpleMediaElementInfo *audio_sink; +#ifdef USE_GSTREAMER + const char *pref; + + pref = purple_prefs_get_string( + FINCH_PREFS_ROOT "/vvconfig/audio/src/device"); + audio_src = purple_media_manager_get_element_info(manager, pref); + if (!audio_src) { + pref = "autoaudiosrc"; + purple_prefs_set_string( + FINCH_PREFS_ROOT "/vvconfig/audio/src/device", pref); + audio_src = purple_media_manager_get_element_info(manager, + pref); + } + + pref = purple_prefs_get_string( + FINCH_PREFS_ROOT "/vvconfig/audio/sink/device"); + audio_sink = purple_media_manager_get_element_info(manager, pref); + if (!audio_sink) { + pref = "autoaudiosink"; + purple_prefs_set_string( + FINCH_PREFS_ROOT "/vvconfig/audio/sink/device", pref); + audio_sink = purple_media_manager_get_element_info(manager, + pref); + } +#else + audio_src = g_object_new(PURPLE_TYPE_MEDIA_ELEMENT_INFO, "id", "finchdefaultaudiosrc", "name", "Finch Default Audio Source", "type", PURPLE_MEDIA_ELEMENT_AUDIO @@ -461,14 +490,14 @@ void finch_media_manager_init(void) | PURPLE_MEDIA_ELEMENT_ONE_SRC | PURPLE_MEDIA_ELEMENT_UNIQUE, "create-cb", create_default_audio_src, NULL); - PurpleMediaElementInfo *default_audio_sink = - g_object_new(PURPLE_TYPE_MEDIA_ELEMENT_INFO, + audio_sink = g_object_new(PURPLE_TYPE_MEDIA_ELEMENT_INFO, "id", "finchdefaultaudiosink", "name", "Finch Default Audio Sink", "type", PURPLE_MEDIA_ELEMENT_AUDIO | PURPLE_MEDIA_ELEMENT_SINK | PURPLE_MEDIA_ELEMENT_ONE_SINK, "create-cb", create_default_audio_sink, NULL); +#endif /* USE_GSTREAMER */ g_signal_connect(G_OBJECT(manager), "init-media", G_CALLBACK(finch_new_media), NULL); purple_cmd_register("call", "", PURPLE_CMD_P_DEFAULT, @@ -480,8 +509,8 @@ void finch_media_manager_init(void) PURPLE_MEDIA_CAPS_AUDIO_SINGLE_DIRECTION); purple_debug_info("gntmedia", "Registering media element types\n"); - purple_media_manager_set_active_element(manager, default_audio_src); - purple_media_manager_set_active_element(manager, default_audio_sink); + purple_media_manager_set_active_element(manager, audio_src); + purple_media_manager_set_active_element(manager, audio_sink); #endif } diff --git a/libpurple/media-gst.h b/libpurple/media-gst.h --- a/libpurple/media-gst.h +++ b/libpurple/media-gst.h @@ -49,8 +49,9 @@ typedef struct _PurpleMediaElementInfo PurpleMediaElementInfo; typedef struct _PurpleMediaElementInfoClass PurpleMediaElementInfoClass; -typedef GstElement *(*PurpleMediaElementCreateCallback)(PurpleMedia *media, - const gchar *session_id, const gchar *participant); +typedef GstElement *(*PurpleMediaElementCreateCallback)( + PurpleMediaElementInfo *info, PurpleMedia *media, + const gchar *session_id, const gchar *participant); /** * PurpleMediaElementType: @@ -162,6 +163,17 @@ GstElement *purple_media_manager_get_ele PurpleMediaSessionType type, PurpleMedia *media, const gchar *session_id, const gchar *participant); +/** + * purple_media_manager_enumerate_elements: + * @manager: The media manager to use to obtain the element infos. + * @type: The type of element infos to get. + * + * Returns: A #GList of registered #PurpleMediaElementInfo instances that match + * @type. + */ +GList *purple_media_manager_enumerate_elements(PurpleMediaManager *manager, + PurpleMediaElementType type); + PurpleMediaElementInfo *purple_media_manager_get_element_info( PurpleMediaManager *manager, const gchar *name); gboolean purple_media_manager_register_element(PurpleMediaManager *manager, diff --git a/libpurple/mediamanager.c b/libpurple/mediamanager.c --- a/libpurple/mediamanager.c +++ b/libpurple/mediamanager.c @@ -72,6 +72,12 @@ struct _PurpleMediaManagerPrivate PurpleMediaElementInfo *audio_src; PurpleMediaElementInfo *audio_sink; +#ifdef USE_GSTREAMER +#if GST_CHECK_VERSION(1, 4, 0) + GstDeviceMonitor *device_monitor; +#endif /* GST_CHECK_VERSION(1, 4, 0) */ +#endif /* USE_GSTREAMER */ + #ifdef HAVE_MEDIA_APPLICATION /* Application data streams */ GList *appdata_info; /* holds PurpleMediaAppDataInfo */ @@ -113,6 +119,10 @@ static void purple_media_manager_finaliz #ifdef HAVE_MEDIA_APPLICATION static void free_appdata_info_locked (PurpleMediaAppDataInfo *info); #endif +#ifdef USE_GSTREAMER +static void purple_media_manager_init_device_monitor(PurpleMediaManager *manager); +static void purple_media_manager_register_static_elements(PurpleMediaManager *manager); +#endif static GObjectClass *parent_class = NULL; @@ -122,6 +132,7 @@ enum { INIT_MEDIA, INIT_PRIVATE_MEDIA, UI_CAPS_CHANGED, + ELEMENTS_CHANGED, LAST_SIGNAL }; static guint purple_media_manager_signals[LAST_SIGNAL] = {0}; @@ -188,12 +199,24 @@ purple_media_manager_class_init (PurpleM G_TYPE_NONE, 2, PURPLE_MEDIA_TYPE_CAPS, PURPLE_MEDIA_TYPE_CAPS); + purple_media_manager_signals[ELEMENTS_CHANGED] = + g_signal_new("elements-changed", + G_TYPE_FROM_CLASS(klass), + G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED, + 0, NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); + g_type_class_add_private(klass, sizeof(PurpleMediaManagerPrivate)); } static void purple_media_manager_init (PurpleMediaManager *media) { +#ifdef USE_GSTREAMER + GError *error; +#endif /* USE_GSTREAMER */ + media->priv = PURPLE_MEDIA_MANAGER_GET_PRIVATE(media); media->priv->medias = NULL; media->priv->private_medias = NULL; @@ -203,6 +226,19 @@ purple_media_manager_init (PurpleMediaMa media->priv->appdata_info = NULL; g_mutex_init (&media->priv->appdata_mutex); #endif +#ifdef USE_GSTREAMER + if (gst_init_check(NULL, NULL, &error)) { + purple_media_manager_register_static_elements(media); + purple_media_manager_init_device_monitor(media); + } else { + purple_debug_error("mediamanager", + "GStreamer failed to initialize: %s.", + error ? error->message : ""); + if (error) { + g_error_free(error); + } + } +#endif /* USE_GSTREAMER */ purple_prefs_add_none("/purple/media"); purple_prefs_add_none("/purple/media/audio"); @@ -236,6 +272,14 @@ purple_media_manager_finalize (GObject * (GDestroyNotify) free_appdata_info_locked); g_mutex_clear (&priv->appdata_mutex); #endif +#ifdef USE_GSTREAMER +#if GST_CHECK_VERSION(1, 4, 0) + if (priv->device_monitor) { + gst_device_monitor_stop(priv->device_monitor); + g_object_unref(priv->device_monitor); + } +#endif /* GST_CHECK_VERSION(1, 4, 0) */ +#endif /* USE_GSTREAMER */ parent_class->finalize(media); } @@ -876,7 +920,7 @@ media_established_cb (PurpleMedia *media } static GstElement * -create_send_appsrc(PurpleMedia *media, +create_send_appsrc(PurpleMediaElementInfo *element_info, PurpleMedia *media, const gchar *session_id, const gchar *participant) { PurpleMediaManager *manager = purple_media_manager_get (); @@ -1022,7 +1066,7 @@ appsink_destroyed (PurpleMediaAppDataInf } static GstElement * -create_recv_appsink(PurpleMedia *media, +create_recv_appsink(PurpleMediaElementInfo *element_info, PurpleMedia *media, const gchar *session_id, const gchar *participant) { PurpleMediaManager *manager = purple_media_manager_get (); @@ -1233,6 +1277,30 @@ purple_media_manager_get_element_info(Pu return NULL; } +static GQuark +element_info_to_detail(PurpleMediaElementInfo *info) +{ + PurpleMediaElementType type; + + type = purple_media_element_info_get_element_type(info); + + if (type & PURPLE_MEDIA_ELEMENT_AUDIO) { + if (type & PURPLE_MEDIA_ELEMENT_SRC) { + return g_quark_from_string("audiosrc"); + } else if (type & PURPLE_MEDIA_ELEMENT_SINK) { + return g_quark_from_string("audiosink"); + } + } else if (type & PURPLE_MEDIA_ELEMENT_VIDEO) { + if (type & PURPLE_MEDIA_ELEMENT_SRC) { + return g_quark_from_string("videosrc"); + } else if (type & PURPLE_MEDIA_ELEMENT_SINK) { + return g_quark_from_string("videosink"); + } + } + + return 0; +} + gboolean purple_media_manager_register_element(PurpleMediaManager *manager, PurpleMediaElementInfo *info) @@ -1240,6 +1308,7 @@ purple_media_manager_register_element(Pu #ifdef USE_VV PurpleMediaElementInfo *info2; gchar *id; + GQuark detail; g_return_val_if_fail(PURPLE_IS_MEDIA_MANAGER(manager), FALSE); g_return_val_if_fail(info != NULL, FALSE); @@ -1255,6 +1324,14 @@ purple_media_manager_register_element(Pu manager->priv->elements = g_list_prepend(manager->priv->elements, info); + + detail = element_info_to_detail(info); + if (detail != 0) { + g_signal_emit(manager, _______________________________________________ Commits mailing list [email protected] https://pidgin.im/cgi-bin/mailman/listinfo/commits