slider: set last position when request the position continuously 04/38204/1
authorMinkyu Kang <mk7.kang@samsung.com>
Tue, 14 Apr 2015 11:05:16 +0000 (20:05 +0900)
committerMinkyu Kang <mk7.kang@samsung.com>
Tue, 14 Apr 2015 11:05:16 +0000 (20:05 +0900)
Change-Id: I75189eecea3f05b561b9c9a9e7a2a842503c7bbe
Signed-off-by: Minkyu Kang <mk7.kang@samsung.com>
include/slider.h
src/slider.cpp

index f338b0b..d0b5e43 100644 (file)
@@ -38,7 +38,8 @@ private:
 
 private:
        static Eina_Bool sm_CbTimer(void *dt);
-       static void sm_SeekCb(void *dt);
+       static Eina_Bool sm_CbSeekSet(void *dt);
+       static void sm_CbSeekComplete(void *dt);
 
 public:
        CVideoSlider(void) :
index c4f44d0..8a873b1 100644 (file)
@@ -35,7 +35,10 @@ struct SSliderData {
        Evas_Object *base;
        Evas_Object *slider;
        Ecore_Timer *timer;
+       Ecore_Timer *seek;
        CPlayer *player;
+       int pos;
+       bool seeking;
 };
 
 static void _get_timestr(char *str, int size, unsigned int ms)
@@ -48,7 +51,23 @@ static void _get_timestr(char *str, int size, unsigned int ms)
                        sec / 3600, (sec % 3600) / 60, sec % 60);
 }
 
-void CVideoSlider::sm_SeekCb(void *dt)
+Eina_Bool CVideoSlider::sm_CbSeekSet(void *dt)
+{
+       SSliderData *data;
+
+       if (!dt)
+               return ECORE_CALLBACK_CANCEL;
+
+       data = (SSliderData *)dt;
+
+       data->player->SetPosition(data->pos, sm_CbSeekComplete, data);
+       data->pos = -1;
+       data->seek = NULL;
+
+       return ECORE_CALLBACK_CANCEL;
+}
+
+void CVideoSlider::sm_CbSeekComplete(void *dt)
 {
        SSliderData *data;
        char str[32];
@@ -61,6 +80,14 @@ void CVideoSlider::sm_SeekCb(void *dt)
 
        data = (SSliderData *)dt;
 
+       if (data->pos != -1) {
+               if (!data->seek) {
+                       data->seek = ecore_timer_add(TIME_INTERVAL,
+                                       sm_CbSeekSet, data);
+               }
+               return;
+       }
+
        r = data->player->GetPosition(&pos);
        if (!r) {
                _ERR("Get Position Failed");
@@ -72,6 +99,9 @@ void CVideoSlider::sm_SeekCb(void *dt)
 
        action = ACTION_RESUME;
        CViewMgr::GetInstance()->UpdateView(VIEW_ID_PLAYER, (void *)&action);
+
+       data->pos = -1;
+       data->seeking = false;
 }
 
 Eina_Bool CVideoSlider::sm_CbTimer(void *dt)
@@ -128,6 +158,7 @@ void CVideoSlider::Reset(int duration, int position)
 
        char str[32];
 
+       ecore_timer_del(m->seek);
        ecore_timer_del(m->timer);
        m->timer = ecore_timer_add(TIME_INTERVAL, sm_CbTimer, m);
 
@@ -175,6 +206,10 @@ bool CVideoSlider::Create(Evas_Object *base, CPlayer *player)
        m->base = base;
        m->slider = slider;
        m->player = player;
+       m->timer = NULL;
+       m->pos = -1;
+       m->seeking = false;
+       m->seek = NULL;
 
        return true;
 }
@@ -184,6 +219,7 @@ void CVideoSlider::Destroy(void)
        ASSERT(m);
 
        ecore_timer_del(m->timer);
+       ecore_timer_del(m->seek);
 
        delete m;
        m = NULL;
@@ -202,7 +238,13 @@ void CVideoSlider::m_SeekEnd(Evas_Object *obj)
        int v;
 
        v = elm_slider_value_get(obj);
-       m->player->SetPosition(v, sm_SeekCb, m);
+
+       if (m->seeking) {
+               m->pos = v;
+       } else {
+               m->player->SetPosition(v, sm_CbSeekComplete, m);
+               m->seeking = true;
+       }
 }
 
 void CVideoSlider::OnKeyDown(int id, Evas *e, Evas_Object *obj,