PLAYER_PRIVATE_DISPLAY_TYPE_NONE, /**< This disposes off buffers */
} player_private_display_type_e;
+typedef enum {
+ PLAYER_SEEK_CB_STATE_NONE,
+ PLAYER_SEEK_CB_STATE_DROP,
+ PLAYER_SEEK_CB_STATE_WAIT,
+} player_seek_cb_state_e;
+
typedef struct _ret_msg_s {
gint api;
gchar *msg;
GCond player_cond[MUSE_PLAYER_API_MAX];
GCond server_ack_cond;
GMutex data_mutex;
- gboolean block_seek_cb;
+ player_seek_cb_state_e seek_cb_state;
GMutex seek_cb_mutex;
msg_buff_s buff;
player_event_queue event_queue;
* Internal Implementation
*/
static int _player_deinit_memory_buffer(player_cli_s * pc);
+static void _player_event_queue_add(player_event_queue * ev, _player_cb_data * data);
int _player_media_packet_finalize(media_packet_h pkt, int error_code, void *user_data)
{
muse_player_event_e ev = MUSE_PLAYER_EVENT_TYPE_SEEK;
g_mutex_lock(&cb_info->seek_cb_mutex);
- if (cb_info->user_cb[ev] && cb_info->block_seek_cb == FALSE) {
+ if (cb_info->user_cb[ev] && cb_info->seek_cb_state == PLAYER_SEEK_CB_STATE_NONE) {
LOGD("call seek cb");
((player_seek_completed_cb) cb_info->user_cb[ev]) (cb_info->user_data[ev]);
set_null_user_cb(cb_info, ev);
} else {
- LOGW("ignored. seek cb %p, block %d", cb_info->user_cb[ev], cb_info->block_seek_cb);
+ LOGW("ignored. seek cb %p", cb_info->user_cb[ev]);
}
g_mutex_unlock(&cb_info->seek_cb_mutex);
}
event_data = (_player_cb_data *) g_queue_pop_head(ev->queue);
g_mutex_unlock(&ev->qlock);
if (event_data) {
+ muse_player_event_e event_type = ((_player_cb_data *)event_data)->int_data;
+
+ if (event_type == MUSE_PLAYER_EVENT_TYPE_SEEK) {
+ g_mutex_lock(&cb_info->seek_cb_mutex);
+ if (cb_info->seek_cb_state == PLAYER_SEEK_CB_STATE_WAIT) {
+ /* push event into queue again. */
+ _player_event_queue_add(ev, event_data);
+ g_mutex_unlock(&cb_info->seek_cb_mutex);
+ break;
+ }
+ g_mutex_unlock(&cb_info->seek_cb_mutex);
+ }
+
if (_player_need_sync_context(event_data->int_data)) {
g_mutex_lock(&ev->idle_ev_mutex);
ev->idle_ev_list = g_list_append(ev->idle_ev_list, (gpointer)event_data);
return PLAYER_ERROR_INVALID_OPERATION;
}
+ g_mutex_lock(&pc->cb_info->seek_cb_mutex);
if ((pc->push_media_stream == FALSE) &&
(pc->cb_info->user_cb[MUSE_PLAYER_EVENT_TYPE_SEEK])) {
LOGE("PLAYER_ERROR_SEEK_FAILED (0x%08x) : seeking...", PLAYER_ERROR_SEEK_FAILED);
+ g_mutex_unlock(&pc->cb_info->seek_cb_mutex);
return PLAYER_ERROR_SEEK_FAILED;
} else {
- g_mutex_lock(&pc->cb_info->seek_cb_mutex);
if (pc->push_media_stream == TRUE)
- pc->cb_info->block_seek_cb = TRUE;
+ pc->cb_info->seek_cb_state = PLAYER_SEEK_CB_STATE_DROP;
+ else
+ pc->cb_info->seek_cb_state = PLAYER_SEEK_CB_STATE_WAIT;
LOGI("Event type : %d, pos : %d, accurate : %d", MUSE_PLAYER_EVENT_TYPE_SEEK, millisecond, accurate);
pc->cb_info->user_cb[MUSE_PLAYER_EVENT_TYPE_SEEK] = callback;
pc->cb_info->user_data[MUSE_PLAYER_EVENT_TYPE_SEEK] = user_data;
- g_mutex_unlock(&pc->cb_info->seek_cb_mutex);
}
+ g_mutex_unlock(&pc->cb_info->seek_cb_mutex);
player_msg_send2(api, pc, ret_buf, ret, INT, pos, INT, accurate);
if (pc->push_media_stream == TRUE)
_player_event_queue_remove(&pc->cb_info->event_queue, MUSE_PLAYER_EVENT_TYPE_SEEK);
- pc->cb_info->block_seek_cb = FALSE;
g_free(ret_buf);
+ g_mutex_lock(&pc->cb_info->seek_cb_mutex);
+ pc->cb_info->seek_cb_state = PLAYER_SEEK_CB_STATE_NONE;
+ g_mutex_unlock(&pc->cb_info->seek_cb_mutex);
+
LOGD("LEAVE");
return ret;
}