--- 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 @@
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); gst_caps_unref(priv->video_caps);
#ifdef HAVE_MEDIA_APPLICATION
@@ -1362,6 +1372,7 @@
PurpleMediaElementInfo *info2;
+ PurpleMediaElementType type; @@ -1370,9 +1381,9 @@
id = purple_media_element_info_get_id(info);
info2 = purple_media_manager_get_element_info(manager, id);
@@ -1387,6 +1398,31 @@
+ /* 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; @@ -1452,7 +1488,6 @@
id = purple_media_element_info_get_id(info);
info2 = purple_media_manager_get_element_info(manager, id);
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; if (type & PURPLE_MEDIA_ELEMENT_VIDEO) {
manager->priv->video_src = info;
+ g_free(manager->priv->video_src_id); + manager->priv->video_src_id = id; 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; if (type & PURPLE_MEDIA_ELEMENT_VIDEO) {
manager->priv->video_sink = info;
+ g_free(manager->priv->video_sink_id); + manager->priv->video_sink_id = id;