[v0.3.37] check seek cb state before calling seek cb 69/102369/2 accepted/tizen/common/20161207.184508 accepted/tizen/ivi/20161208.012203 accepted/tizen/mobile/20161208.011806 accepted/tizen/tv/20161208.012008 accepted/tizen/wearable/20161208.012110 submit/tizen/20161207.075356
authorEunhae Choi <eunhae1.choi@samsung.com>
Mon, 5 Dec 2016 12:04:39 +0000 (21:04 +0900)
committerEunhae Choi <eunhae1.choi@samsung.com>
Mon, 5 Dec 2016 12:09:51 +0000 (21:09 +0900)
Change-Id: I8eb52699b6cce45458df4bb7114ffb2176d890bf

include/player_private.h
packaging/capi-media-player.spec
src/player.c

index 9379a00..ea053f1 100644 (file)
@@ -61,6 +61,12 @@ typedef enum {
        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;
@@ -126,7 +132,7 @@ typedef struct _callback_cb_info {
        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;
index 23a73ab..6c723d9 100644 (file)
@@ -1,6 +1,6 @@
 Name:       capi-media-player
 Summary:    A Media Player API
-Version:    0.3.36
+Version:    0.3.37
 Release:    0
 Group:      Multimedia/API
 License:    Apache-2.0
index b1c8cb9..41f0946 100644 (file)
@@ -74,6 +74,7 @@ typedef struct {
 * 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)
 {
@@ -605,12 +606,12 @@ static void __seek_cb_handler(callback_cb_info_s * cb_info, _player_recv_data *r
        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);
 }
@@ -1142,6 +1143,19 @@ static void *_player_event_queue_loop(void *param)
                        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);
@@ -2196,19 +2210,22 @@ int player_set_play_position(player_h player, int millisecond, bool accurate, pl
                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);
 
@@ -2221,9 +2238,12 @@ int player_set_play_position(player_h player, int millisecond, bool accurate, pl
        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;
 }