commit 3df72066c4e0ad603ad4d0098790a97561277ff7
parent bfd57e85196080bb73fd21416888b972cbf44e3b
Author: Jacki <jacki@thejackimonster.de>
Date: Fri, 9 Aug 2024 14:29:04 +0200
Fix switching between video stream and contact profile icon in discourse
Signed-off-by: Jacki <jacki@thejackimonster.de>
Diffstat:
3 files changed, 109 insertions(+), 30 deletions(-)
diff --git a/src/discourse.c b/src/discourse.c
@@ -217,6 +217,10 @@ discourse_subscription_create_info(MESSENGER_DiscourseInfo *discourse,
info->position = 0;
info->last_timestamp = 0;
+ pthread_mutex_init(&(info->mutex), NULL);
+
+ info->end_datetime = NULL;
+
const struct GNUNET_ShortHashCode *id = GNUNET_CHAT_discourse_get_id(
info->discourse->discourse
);
@@ -289,6 +293,17 @@ discourse_subscription_destroy_info(MESSENGER_DiscourseSubscriptionInfo *info)
gst_element_set_state(info->discourse->audio_mix_pipeline, GST_STATE_PLAYING);
}
+ pthread_mutex_lock(&(info->mutex));
+
+ if (info->end_datetime)
+ {
+ g_date_time_unref(info->end_datetime);
+ info->end_datetime = NULL;
+ }
+
+ pthread_mutex_unlock(&(info->mutex));
+ pthread_mutex_destroy(&(info->mutex));
+
g_free(info);
}
@@ -405,6 +420,23 @@ discourse_subscription_stream_message(MESSENGER_DiscourseSubscriptionInfo *info,
info->position += duration;
+ GDateTime *dt = g_date_time_new_now_local();
+ pthread_mutex_lock(&(info->mutex));
+
+ if (info->end_datetime)
+ {
+ g_date_time_unref(info->end_datetime);
+ info->end_datetime = NULL;
+ }
+
+ if (dt)
+ {
+ info->end_datetime = g_date_time_add_seconds(dt, (gdouble) duration / clockrate);
+ g_date_time_unref(dt);
+ }
+
+ pthread_mutex_unlock(&(info->mutex));
+
skip_buffer:
info->last_timestamp = timestamp;
@@ -599,10 +631,8 @@ discourse_create_info(struct GNUNET_CHAT_Discourse *discourse)
info->audio_mix_element = NULL;
info->audio_volume_element = NULL;
- info->sending_task = 0;
pthread_mutex_init(&(info->mutex), NULL);
- info->samples = NULL;
info->subscriptions = NULL;
const struct GNUNET_ShortHashCode *id = GNUNET_CHAT_discourse_get_id(
@@ -628,6 +658,8 @@ discourse_destroy_info(struct GNUNET_CHAT_Discourse *discourse)
if (!info)
return;
+ pthread_mutex_lock(&(info->mutex));
+
if (info->subscriptions)
{
MESSENGER_DiscourseSubscriptionInfo *sub_info;
@@ -642,6 +674,8 @@ discourse_destroy_info(struct GNUNET_CHAT_Discourse *discourse)
g_list_free(info->subscriptions);
}
+ pthread_mutex_unlock(&(info->mutex));
+
if (info->video_record_pipeline)
{
gst_element_set_state(info->video_record_pipeline, GST_STATE_NULL);
@@ -660,26 +694,6 @@ discourse_destroy_info(struct GNUNET_CHAT_Discourse *discourse)
gst_object_unref(GST_OBJECT(info->audio_record_pipeline));
}
- pthread_mutex_lock(&(info->mutex));
-
- if (info->samples)
- {
- GArray *array;
- GList *list = info->samples;
- while (list)
- {
- array = (GArray*) (list->data);
- g_array_free(array, TRUE);
- list = g_list_next(list);
- }
-
- g_list_free(info->samples);
- }
-
- if (info->sending_task)
- util_source_remove(info->sending_task);
-
- pthread_mutex_unlock(&(info->mutex));
pthread_mutex_destroy(&(info->mutex));
g_free(info);
@@ -716,6 +730,8 @@ discourse_update_subscriptions(struct GNUNET_CHAT_Discourse *discourse)
&list
);
+ pthread_mutex_lock(&(info->mutex));
+
GList *sub = info->subscriptions;
MESSENGER_DiscourseSubscriptionInfo *sub_info;
@@ -772,6 +788,8 @@ discourse_update_subscriptions(struct GNUNET_CHAT_Discourse *discourse)
sub = g_list_next(sub);
}
+ pthread_mutex_unlock(&(info->mutex));
+
if (list)
g_list_free(list);
}
@@ -787,6 +805,8 @@ discourse_stream_message(struct GNUNET_CHAT_Discourse *discourse,
if (!info)
return;
+ pthread_mutex_lock(&(info->mutex));
+
GList *sub = info->subscriptions;
MESSENGER_DiscourseSubscriptionInfo *sub_info = NULL;
@@ -799,10 +819,10 @@ discourse_stream_message(struct GNUNET_CHAT_Discourse *discourse,
sub = g_list_next(sub);
}
- if (!sub_info)
- return;
+ if (sub_info)
+ discourse_subscription_stream_message(sub_info, message);
- discourse_subscription_stream_message(sub_info, message);
+ pthread_mutex_unlock(&(info->mutex));
}
bool
@@ -912,6 +932,8 @@ discourse_link_widget(const struct GNUNET_CHAT_Discourse *discourse,
if (!info)
return FALSE;
+ pthread_mutex_lock(&(info->mutex));
+
GList *sub = info->subscriptions;
MESSENGER_DiscourseSubscriptionInfo *sub_info = NULL;
@@ -925,8 +947,59 @@ discourse_link_widget(const struct GNUNET_CHAT_Discourse *discourse,
sub = g_list_next(sub);
}
- if (!sub_info)
+ gboolean linked = FALSE;
+ if (sub_info)
+ linked = discourse_subscription_link_widget(sub_info, container);
+
+ pthread_mutex_unlock(&(info->mutex));
+ return linked;
+}
+
+gboolean
+discourse_is_active(const struct GNUNET_CHAT_Discourse *discourse,
+ const struct GNUNET_CHAT_Contact *contact)
+{
+ MESSENGER_DiscourseInfo* info = GNUNET_CHAT_discourse_get_user_pointer(discourse);
+
+ if (!info)
return FALSE;
- return discourse_subscription_link_widget(sub_info, container);
+ pthread_mutex_lock(&(info->mutex));
+
+ GList *sub = info->subscriptions;
+ MESSENGER_DiscourseSubscriptionInfo *sub_info = NULL;
+
+ while (sub)
+ {
+ sub_info = (MESSENGER_DiscourseSubscriptionInfo*) (sub->data);
+ if ((sub_info) && (contact == sub_info->contact))
+ break;
+
+ sub_info = NULL;
+ sub = g_list_next(sub);
+ }
+
+ gboolean active = FALSE;
+ if (!sub_info)
+ goto unlock_info_mutex;
+
+ pthread_mutex_lock(&(sub_info->mutex));
+
+ if (!(sub_info->end_datetime))
+ goto unlock_sub_info_mutex;
+
+ GDateTime *dt = g_date_time_new_now_local();
+ if (dt)
+ {
+ GTimeSpan ts = g_date_time_difference(sub_info->end_datetime, dt);
+ g_date_time_unref(dt);
+ active = (ts >= 0);
+ }
+
+unlock_sub_info_mutex:
+ pthread_mutex_unlock(&(sub_info->mutex));
+
+unlock_info_mutex:
+ pthread_mutex_unlock(&(info->mutex));
+ return active;
}
diff --git a/src/discourse.h b/src/discourse.h
@@ -71,10 +71,8 @@ typedef struct MESSENGER_DiscourseInfo
GstElement *audio_mix_element;
GstElement *audio_volume_element;
- guint sending_task;
pthread_mutex_t mutex;
- GList *samples;
GList *subscriptions;
} MESSENGER_DiscourseInfo;
@@ -96,6 +94,10 @@ typedef struct MESSENGER_DiscourseSubscriptionInfo
uint64_t position;
uint64_t last_timestamp;
+
+ pthread_mutex_t mutex;
+
+ GDateTime *end_datetime;
} MESSENGER_DiscourseSubscriptionInfo;
/**
@@ -203,4 +205,8 @@ discourse_link_widget(const struct GNUNET_CHAT_Discourse *discourse,
const struct GNUNET_CHAT_Contact *contact,
GtkContainer *container);
+gboolean
+discourse_is_active(const struct GNUNET_CHAT_Discourse *discourse,
+ const struct GNUNET_CHAT_Contact *contact);
+
#endif /* DISCOURSE_H_ */
diff --git a/src/ui/discourse.c b/src/ui/discourse.c
@@ -541,7 +541,7 @@ iterate_ui_discourse_update_discourse_video(void *cls,
GTK_CONTAINER(panel->video_box)
);
- if ((linked) && (!discourse_is_mute(discourse)))
+ if ((linked) && (discourse_is_active(discourse, contact)))
gtk_stack_set_visible_child(panel->panel_stack, panel->video_box);
else
gtk_stack_set_visible_child(panel->panel_stack, panel->avatar_box);