pidgin/pidgin

Handle unplug and replug of selected media device
release-2.x.y
2020-05-18, David Woodhouse
9370dfa3e9ee
Parents 0ff0248b4928
Children f89008fda181
Handle unplug and replug of selected media device
--- a/libpurple/mediamanager.c Thu May 14 03:20:38 2020 -0500
+++ b/libpurple/mediamanager.c Mon May 18 12:06:29 2020 +0100
@@ -97,6 +97,10 @@
GType backend_type;
GstCaps *video_caps;
+ gchar *video_src_id;
+ gchar *video_sink_id;
+ gchar *audio_src_id;
+ gchar *audio_sink_id;
PurpleMediaElementInfo *video_src;
PurpleMediaElementInfo *video_sink;
PurpleMediaElementInfo *audio_src;
@@ -294,6 +298,12 @@
g_list_delete_link(priv->elements, priv->elements)) {
g_object_unref(priv->elements->data);
}
+
+ g_free(priv->audio_src_id);
+ g_free(priv->video_src_id);
+ g_free(priv->audio_sink_id);
+ g_free(priv->video_sink_id);
+
if (priv->video_caps)
gst_caps_unref(priv->video_caps);
#ifdef HAVE_MEDIA_APPLICATION
@@ -1362,6 +1372,7 @@
{
#ifdef USE_VV
PurpleMediaElementInfo *info2;
+ PurpleMediaElementType type;
gchar *id;
GQuark detail;
@@ -1370,9 +1381,9 @@
id = purple_media_element_info_get_id(info);
info2 = purple_media_manager_get_element_info(manager, id);
- g_free(id);
if (info2 != NULL) {
+ g_free(id);
g_object_unref(info2);
return FALSE;
}
@@ -1387,6 +1398,31 @@
detail);
}
+ /* Restore previously active src/sink elements if they were replugged */
+ type = purple_media_element_info_get_element_type(info);
+ if (type & PURPLE_MEDIA_ELEMENT_SRC) {
+ if (type & PURPLE_MEDIA_ELEMENT_AUDIO &&
+ purple_strequal(manager->priv->audio_src_id, id)) {
+ manager->priv->audio_src = info;
+ }
+ if (type & PURPLE_MEDIA_ELEMENT_VIDEO &&
+ purple_strequal(manager->priv->video_src_id, id)) {
+ manager->priv->video_src = info;
+ }
+ }
+ if (type & PURPLE_MEDIA_ELEMENT_SINK) {
+ if (type & PURPLE_MEDIA_ELEMENT_AUDIO &&
+ purple_strequal(manager->priv->audio_sink_id, id)) {
+ manager->priv->audio_sink = info;
+ }
+ if (type & PURPLE_MEDIA_ELEMENT_VIDEO &&
+ purple_strequal(manager->priv->video_sink_id, id)) {
+ manager->priv->video_sink = info;
+ }
+ }
+
+ g_free(id);
+
return TRUE;
#else
return FALSE;
@@ -1452,7 +1488,6 @@
id = purple_media_element_info_get_id(info);
info2 = purple_media_manager_get_element_info(manager, id);
- g_free(id);
if (info2 == NULL)
purple_media_manager_register_element(manager, info);
@@ -1464,24 +1499,37 @@
if (type & PURPLE_MEDIA_ELEMENT_SRC) {
if (type & PURPLE_MEDIA_ELEMENT_AUDIO) {
manager->priv->audio_src = info;
+ g_free(manager->priv->audio_src_id);
+ manager->priv->audio_src_id = id;
+ id = NULL;
ret = TRUE;
}
if (type & PURPLE_MEDIA_ELEMENT_VIDEO) {
manager->priv->video_src = info;
+ g_free(manager->priv->video_src_id);
+ manager->priv->video_src_id = id;
+ id = NULL;
ret = TRUE;
}
}
if (type & PURPLE_MEDIA_ELEMENT_SINK) {
if (type & PURPLE_MEDIA_ELEMENT_AUDIO) {
manager->priv->audio_sink = info;
+ g_free(manager->priv->audio_sink_id);
+ manager->priv->audio_sink_id = id;
+ id = NULL;
ret = TRUE;
}
if (type & PURPLE_MEDIA_ELEMENT_VIDEO) {
manager->priv->video_sink = info;
+ g_free(manager->priv->video_sink_id);
+ manager->priv->video_sink_id = id;
+ id = NULL;
ret = TRUE;
}
}
+ g_free(id);
return ret;
#else
return FALSE;