ev = data->int_data;
if ((ev != MUSE_PLAYER_EVENT_TYPE_MEDIA_PACKET_VIDEO_FRAME) &&
(ev != MUSE_PLAYER_EVENT_TYPE_MEDIA_PACKET_AUDIO_FRAME))
- LOGD("enter ev:%d", ev);
+ LOGD("enter ev:%d(%p)", ev, data);
g_mutex_lock(&data->event_mutex);
/* unlock and release event */
g_mutex_unlock(&data->event_mutex);
g_mutex_clear(&data->event_mutex);
-
if (data->recv_data) {
g_free(data->recv_data->buffer);
+ data->recv_data->buffer = NULL;
g_free(data->recv_data);
+ data->recv_data = NULL;
}
g_free(data);
gboolean ret = FALSE;
if (remove_all || (event_data->int_data == event_type)) {
+ GSource *source = NULL;
+ gboolean check_in_call = FALSE;
LOGD("remove idle event [%p:%d]", event_data, event_data->int_data);
-
+ source = g_main_context_find_source_by_user_data (
+ g_main_context_default (), event_data);
ret = g_idle_remove_by_data(event_data);
- if (ret == FALSE) {
+ if (source)
+ check_in_call = source->flags & G_HOOK_FLAG_IN_CALL;
+
+ if (!ret || check_in_call) {
/* will be handled at _player_event_job_function() as an exception */
event_data->cb_info = NULL;
LOGW("failed to remove, idle callback will be called later");
}
/* set cb to null */
- set_null_user_cb(cb_info, event_data->int_data);
+ if (remove_all)
+ set_null_user_cb(cb_info, event_data->int_data);
+
ev->idle_ev_list = g_list_remove(ev->idle_ev_list, (gpointer)event_data);
g_mutex_unlock(&event_data->event_mutex);
- if (ret == TRUE) {
+ if (ret && !check_in_call) {
g_mutex_clear(&event_data->event_mutex);
if (event_data->recv_data) {
g_free(event_data->recv_data->buffer);
+ event_data->recv_data->buffer = NULL;
g_free(event_data->recv_data);
+ event_data->recv_data = NULL;
}
g_free(event_data);
event_data = NULL;