# HG changeset patch # User Mike Ruprecht # Date 1233739647 0 # Node ID 0e8814c437b29a63f391fe58b840b216cb4d5d3d # Parent fc100e71de5d3611d699ecae621ced6f419e7a56 Add active elements to PurpleMediaManager. These are the elements that will be created when media sessions require new srcs or sinks. diff -r fc100e71de5d -r 0e8814c437b2 libpurple/mediamanager.c --- a/libpurple/mediamanager.c Tue Feb 03 23:34:53 2009 +0000 +++ b/libpurple/mediamanager.c Wed Feb 04 09:27:27 2009 +0000 @@ -40,6 +40,11 @@ { GList *medias; GList *elements; + + PurpleMediaElementInfo *video_src; + PurpleMediaElementInfo *video_sink; + PurpleMediaElementInfo *audio_src; + PurpleMediaElementInfo *audio_sink; }; #define PURPLE_MEDIA_MANAGER_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE((obj), PURPLE_TYPE_MEDIA_MANAGER, PurpleMediaManagerPrivate)) @@ -208,19 +213,22 @@ PurpleMediaSessionType type) { GstElement *ret = NULL; - GstElement *level = NULL; /* TODO: If src, retrieve current src */ /* TODO: Send a signal here to allow for overriding the source/sink */ - if (type & PURPLE_MEDIA_SEND_AUDIO) - purple_media_audio_init_src(&ret, &level); - else if (type & PURPLE_MEDIA_RECV_AUDIO) - purple_media_audio_init_recv(&ret, &level); - else if (type & PURPLE_MEDIA_SEND_VIDEO) - purple_media_video_init_src(&ret); - else if (type & PURPLE_MEDIA_RECV_VIDEO) - purple_media_video_init_recv(&ret); + if (type & PURPLE_MEDIA_SEND_AUDIO + && manager->priv->audio_src != NULL) + ret = manager->priv->audio_src->create(); + else if (type & PURPLE_MEDIA_RECV_AUDIO + && manager->priv->audio_sink != NULL) + ret = manager->priv->audio_sink->create(); + else if (type & PURPLE_MEDIA_SEND_VIDEO + && manager->priv->video_src != NULL) + ret = manager->priv->video_src->create(); + else if (type & PURPLE_MEDIA_RECV_VIDEO + && manager->priv->video_sink != NULL) + ret = manager->priv->video_sink->create(); if (ret == NULL) purple_debug_error("media", "Error creating source or sink\n"); @@ -275,9 +283,75 @@ if (info == NULL) return FALSE; + if (manager->priv->audio_src == info) + manager->priv->audio_src = NULL; + if (manager->priv->audio_sink == info) + manager->priv->audio_sink = NULL; + if (manager->priv->video_src == info) + manager->priv->video_src = NULL; + if (manager->priv->video_sink == info) + manager->priv->video_sink = NULL; + manager->priv->elements = g_list_remove( manager->priv->elements, info); return TRUE; } +gboolean +purple_media_manager_set_active_element(PurpleMediaManager *manager, + PurpleMediaElementInfo *info) +{ + gboolean ret = FALSE; + + g_return_val_if_fail(PURPLE_IS_MEDIA_MANAGER(manager), FALSE); + g_return_val_if_fail(info != NULL, FALSE); + + if (purple_media_manager_get_element_info(manager, info->id) == NULL) + purple_media_manager_register_element(manager, info); + + if (info->type & PURPLE_MEDIA_ELEMENT_SRC) { + if (info->type & PURPLE_MEDIA_ELEMENT_AUDIO) { + manager->priv->audio_src = info; + ret = TRUE; + } + if (info->type & PURPLE_MEDIA_ELEMENT_VIDEO) { + manager->priv->video_src = info; + ret = TRUE; + } + } + if (info->type & PURPLE_MEDIA_ELEMENT_SINK) { + if (info->type & PURPLE_MEDIA_ELEMENT_AUDIO) { + manager->priv->audio_sink = info; + ret = TRUE; + } + if (info->type & PURPLE_MEDIA_ELEMENT_VIDEO) { + manager->priv->video_sink = info; + ret = TRUE; + } + } + + return ret; +} + +PurpleMediaElementInfo * +purple_media_manager_get_active_element(PurpleMediaManager *manager, + PurpleMediaElementType type) +{ + g_return_val_if_fail(PURPLE_IS_MEDIA_MANAGER(manager), NULL); + + if (type & PURPLE_MEDIA_ELEMENT_SRC) { + if (type & PURPLE_MEDIA_ELEMENT_AUDIO) + return manager->priv->audio_src; + else if (type & PURPLE_MEDIA_ELEMENT_VIDEO) + return manager->priv->video_src; + } else if (type & PURPLE_MEDIA_ELEMENT_SINK) { + if (type & PURPLE_MEDIA_ELEMENT_AUDIO) + return manager->priv->audio_sink; + else if (type & PURPLE_MEDIA_ELEMENT_VIDEO) + return manager->priv->video_sink; + } + + return NULL; +} + #endif /* USE_VV */ diff -r fc100e71de5d -r 0e8814c437b2 libpurple/mediamanager.h --- a/libpurple/mediamanager.h Tue Feb 03 23:34:53 2009 +0000 +++ b/libpurple/mediamanager.h Wed Feb 04 09:27:27 2009 +0000 @@ -85,12 +85,16 @@ PURPLE_MEDIA_ELEMENT_UNIQUE = 1 << 8, /** This element is unique and only one instance of it should be created at a time */ + + PURPLE_MEDIA_ELEMENT_SRC = 1 << 9, /** can be set as an active src */ + PURPLE_MEDIA_ELEMENT_SINK = 1 << 10, /** can be set as an active sink */ } PurpleMediaElementType; struct _PurpleMediaElementInfo { const gchar *id; PurpleMediaElementType type; + GstElement *(*create)(void); }; #ifdef __cplusplus @@ -166,6 +170,10 @@ PurpleMediaElementInfo *info); gboolean purple_media_manager_unregister_element(PurpleMediaManager *manager, const gchar *name); +gboolean purple_media_manager_set_active_element(PurpleMediaManager *manager, + PurpleMediaElementInfo *info); +PurpleMediaElementInfo *purple_media_manager_get_active_element( + PurpleMediaManager *manager, PurpleMediaElementType type); /*}@*/ #ifdef __cplusplus diff -r fc100e71de5d -r 0e8814c437b2 pidgin/gtkmedia.c --- a/pidgin/gtkmedia.c Tue Feb 03 23:34:53 2009 +0000 +++ b/pidgin/gtkmedia.c Wed Feb 04 09:27:27 2009 +0000 @@ -785,34 +785,74 @@ return TRUE; } +static GstElement * +create_default_video_src(void) +{ + GstElement *ret = NULL; + purple_media_video_init_src(&ret); + return ret; +} + +static GstElement * +create_default_video_sink(void) +{ + GstElement *ret = NULL; + purple_media_video_init_recv(&ret); + return ret; +} + +static GstElement * +create_default_audio_src(void) +{ + GstElement *ret = NULL, *level = NULL; + purple_media_audio_init_src(&ret, &level); + return ret; +} + +static GstElement * +create_default_audio_sink(void) +{ + GstElement *ret = NULL, *level = NULL; + purple_media_audio_init_recv(&ret, &level); + return ret; +} + static PurpleMediaElementInfo default_video_src = { "pidgindefaultvideosrc", /* id */ PURPLE_MEDIA_ELEMENT_VIDEO /* type */ + | PURPLE_MEDIA_ELEMENT_SRC | PURPLE_MEDIA_ELEMENT_ONE_SRC | PURPLE_MEDIA_ELEMENT_UNIQUE, + create_default_video_src, /* create */ }; static PurpleMediaElementInfo default_video_sink = { "pidgindefaultvideosink", /* id */ PURPLE_MEDIA_ELEMENT_VIDEO /* type */ + | PURPLE_MEDIA_ELEMENT_SINK | PURPLE_MEDIA_ELEMENT_ONE_SINK, + create_default_video_sink, /* create */ }; static PurpleMediaElementInfo default_audio_src = { "pidgindefaultaudiosrc", /* id */ PURPLE_MEDIA_ELEMENT_AUDIO /* type */ + | PURPLE_MEDIA_ELEMENT_SRC | PURPLE_MEDIA_ELEMENT_ONE_SRC | PURPLE_MEDIA_ELEMENT_UNIQUE, + create_default_audio_src, /* create */ }; static PurpleMediaElementInfo default_audio_sink = { "pidgindefaultaudiosink", /* id */ PURPLE_MEDIA_ELEMENT_AUDIO /* type */ + | PURPLE_MEDIA_ELEMENT_SINK | PURPLE_MEDIA_ELEMENT_ONE_SINK, + create_default_audio_sink, /* create */ }; void @@ -823,10 +863,10 @@ G_CALLBACK(pidgin_media_new_cb), NULL); purple_debug_info("gtkmedia", "Registering media element types\n"); - purple_media_manager_register_element(manager, &default_video_src); - purple_media_manager_register_element(manager, &default_video_sink); - purple_media_manager_register_element(manager, &default_audio_src); - purple_media_manager_register_element(manager, &default_audio_sink); + purple_media_manager_set_active_element(manager, &default_video_src); + purple_media_manager_set_active_element(manager, &default_video_sink); + purple_media_manager_set_active_element(manager, &default_audio_src); + purple_media_manager_set_active_element(manager, &default_audio_sink); } #endif /* USE_VV */