return len;
}
+static void set_null_user_cb(callback_cb_info_s *cb_info, _player_event_e event)
+{
+ if(event < _PLAYER_EVENT_TYPE_NUM){
+ cb_info->user_cb[event] = NULL;
+ cb_info->user_data[event] = NULL;
+ }
+}
+
+static void set_null_user_cb_lock(callback_cb_info_s *cb_info, _player_event_e event)
+{
+ bool lock = g_thread_self() != cb_info->event_queue.thread;
+
+ if(lock)
+ g_mutex_lock(&cb_info->event_queue.mutex);
+
+ set_null_user_cb(cb_info, event);
+
+ if(lock)
+ g_mutex_unlock(&cb_info->event_queue.mutex);
+}
+
static int __set_callback(_player_event_e type, player_h player, void *callback,
void *user_data)
{
int set = 0;
LOGI("Event type : %d ", type);
- handle->cb_info->user_cb[type] = NULL;
- handle->cb_info->user_data[type] = NULL;
+ set_null_user_cb_lock(handle->cb_info, type);
player_msg_callback(api, EXT_HANDLE(handle), sock_fd, ret, type, set);
ret = PLAYER_ERROR_NONE;
return ret;
}
-static void set_null_user_cb(callback_cb_info_s *cb_info, _player_event_e event)
-{
- if(event < _PLAYER_EVENT_TYPE_NUM){
- cb_info->user_cb[event] = NULL;
- cb_info->user_data[event] = NULL;
- }
-}
-
static void __prepare_cb_handler(callback_cb_info_s * cb_info, char *recvMsg)
{
char caps[MM_MSG_MAX_LENGTH] = {0};
static void _player_event_job_function(_player_cb_data *data)
{
- _user_callbacks[data->int_data](data->cb_info, data->buf);
+ _player_event_e ev = data->int_data;
+ if(data->cb_info->user_cb[ev])
+ _user_callbacks[ev](data->cb_info, data->buf);
+ else
+ LOGW("user callback is unset. type : %d", ev);
g_free(data->buf);
g_free(data);
}
while(1) {
event_data = (_player_cb_data *)g_queue_pop_head(ev->queue);
- g_mutex_unlock(&ev->mutex);
if(event_data)
_player_event_job_function(event_data);
else {
- g_mutex_lock(&ev->mutex);
break;
}
- g_mutex_lock(&ev->mutex);
}
}
g_mutex_unlock(&ev->mutex);
player_msg_send(api, EXT_HANDLE(pc), sock_fd, pc->cb_info, ret_buf, ret);
if(ret == PLAYER_ERROR_NONE){
- set_null_user_cb(pc->cb_info, _PLAYER_EVENT_TYPE_SEEK);
- set_null_user_cb(pc->cb_info, _PLAYER_EVENT_TYPE_PREPARE);
+ set_null_user_cb_lock(pc->cb_info, _PLAYER_EVENT_TYPE_SEEK);
+ set_null_user_cb_lock(pc->cb_info, _PLAYER_EVENT_TYPE_PREPARE);
_del_mem(pc);
_player_deinit_memory_buffer(pc);
}
player_msg_send(api, EXT_HANDLE(pc), sock_fd, pc->cb_info, ret_buf, ret);
if(ret == PLAYER_ERROR_NONE) {
- set_null_user_cb(pc->cb_info, _PLAYER_EVENT_TYPE_SEEK);
+ set_null_user_cb_lock(pc->cb_info, _PLAYER_EVENT_TYPE_SEEK);
}
g_free(ret_buf);
player_msg_send2(api, EXT_HANDLE(pc), sock_fd, pc->cb_info, ret_buf, ret,
INT, pos, INT, accurate);
- if (ret != PLAYER_ERROR_NONE) {
- pc->cb_info->user_cb[_PLAYER_EVENT_TYPE_SEEK] = NULL;
- pc->cb_info->user_data[_PLAYER_EVENT_TYPE_SEEK] = NULL;
- }
+ if (ret != PLAYER_ERROR_NONE)
+ set_null_user_cb(pc->cb_info, _PLAYER_EVENT_TYPE_SEEK);
g_free(ret_buf);
return ret;
LOGD("ENTER");
- set_null_user_cb(pc->cb_info, type);
+ set_null_user_cb_lock(pc->cb_info, type);
player_msg_send2(api, EXT_HANDLE(pc), sock_fd, pc->cb_info, ret_buf, ret,
INT, type, INT, set);
LOGD("ENTER");
- set_null_user_cb(pc->cb_info, type);
+ set_null_user_cb_lock(pc->cb_info, type);
player_msg_send2(api, EXT_HANDLE(pc), sock_fd, pc->cb_info, ret_buf, ret,
INT, type, INT, set);
return PLAYER_ERROR_INVALID_PARAMETER;
}
- set_null_user_cb(pc->cb_info, type);
+ set_null_user_cb_lock(pc->cb_info, type);
player_msg_send2(api, EXT_HANDLE(pc), sock_fd, pc->cb_info, ret_buf, ret,
INT, type, INT, set);
return PLAYER_ERROR_INVALID_PARAMETER;
}
- set_null_user_cb(pc->cb_info, type);
+ set_null_user_cb_lock(pc->cb_info, type);
player_msg_send2(api, EXT_HANDLE(pc), sock_fd, pc->cb_info, ret_buf, ret,
INT, type, INT, set);