From b86971996f32c7f1399598a027c4dc9de638be20 Mon Sep 17 00:00:00 2001 From: Minkyu Kang Date: Tue, 3 Mar 2015 14:34:53 +0900 Subject: [PATCH 01/16] exception handling for prevent crash This patch is for fixing jira issue TT-16 [Videoplayer] Crash when playlist or uri are wrong Change-Id: I622eb96ac2c84141daf03fd23b26c66e83c59e28 Signed-off-by: Minkyu Kang --- include/view_player.h | 1 + src/main.cpp | 15 ++++++++++++--- src/view_player.cpp | 32 ++++++++++++++++++++++++-------- 3 files changed, 37 insertions(+), 11 deletions(-) diff --git a/include/view_player.h b/include/view_player.h index 64c4195..d21c226 100644 --- a/include/view_player.h +++ b/include/view_player.h @@ -45,6 +45,7 @@ private: bool m_PlayerInit(void); void m_ShowBar(void); void m_HideBar(void); + void m_Fini(void); private: static Eina_Bool sm_CbDrawAnimation(void *dt); diff --git a/src/main.cpp b/src/main.cpp index a22e5ce..5c6c013 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -128,7 +128,10 @@ void CVideoPlayerApp::OnTerminate(void) { ASSERT(m_pApp); - CViewMgr::Finalize(); + if (m_pVmgr) { + CViewMgr::Finalize(); + m_pVmgr = NULL; + } if (m_pApp->win) evas_object_del(m_pApp->win); @@ -138,14 +141,16 @@ void CVideoPlayerApp::OnPause(void) { ASSERT(m_pApp); - m_pVmgr->Pause(); + if (m_pVmgr) + m_pVmgr->Pause(); } void CVideoPlayerApp::OnResume(void) { ASSERT(m_pApp); - m_pVmgr->Resume(); + if (m_pVmgr) + m_pVmgr->Resume(); } void CVideoPlayerApp::OnAppControl(app_control_h app_control) @@ -174,11 +179,15 @@ void CVideoPlayerApp::OnAppControl(app_control_h app_control) if (!m_pVmgr->PushView(VIEW_ID_PLAYER, ¶m)) { _ERR("View push failed"); + CViewMgr::Finalize(); + m_pVmgr = NULL; + free(uri); free(playlist); elm_exit(); + return; } free(uri); diff --git a/src/view_player.cpp b/src/view_player.cpp index 0ab0460..30a2895 100644 --- a/src/view_player.cpp +++ b/src/view_player.cpp @@ -335,8 +335,10 @@ void CPlayerView::sm_CbPlayComplete(void *dt) else if (data->repeat == E_REPEAT_ALL) r = playermgr_set_next_video(data->player, EINA_TRUE); - if (!r) + if (!r) { elm_exit(); + return; + } action = ACTION_INIT; CViewMgr::GetInstance()->UpdateView(data->id, (void *)&action); @@ -585,13 +587,14 @@ bool CPlayerView::Create(void *data) r = m_UiInit(); if (!r) { - delete m; - m = NULL; + _ERR("failed to init UI"); + m_Fini(); return false; } if (!m_PlayerInit()) { _ERR("failed to play video"); + m_Fini(); return false; } @@ -603,6 +606,7 @@ bool CPlayerView::Create(void *data) m->drawanim_timer = ecore_timer_add(0.8, sm_CbDrawAnimation, m); if (!m->drawanim_timer) { _ERR("failed to add draw timer"); + m_Fini(); return false; } @@ -611,37 +615,49 @@ bool CPlayerView::Create(void *data) return true; } -void CPlayerView::Destroy(void) +void CPlayerView::m_Fini(void) { - ASSERT(m); - - CBaseView::Destroy(); - if (m->drawanim_timer) ecore_timer_del(m->drawanim_timer); + m->drawanim_timer = NULL; delete m->mediadata; m->mediadata = NULL; playermgr_fini(m->player); + m->player = NULL; timeout_handler_fini(m->timeout_handle); + m->timeout_handle = NULL; free(m->id); + m->id = NULL; m->volume->Destroy(); delete m->volume; + m->volume = NULL; m->control->Destroy(); delete m->control; + m->control = NULL; m->slider->Destroy(); delete m->slider; + m->slider = NULL; delete m; m = NULL; } +void CPlayerView::Destroy(void) +{ + ASSERT(m); + + CBaseView::Destroy(); + + m_Fini(); +} + Evas_Object *CPlayerView::Base(void) { ASSERT(m); -- 2.7.4 From ed9b3c3568de4158e959ee526a92b41ede723d31 Mon Sep 17 00:00:00 2001 From: Minkyu Kang Date: Tue, 3 Mar 2015 16:21:01 +0900 Subject: [PATCH 02/16] add volume key define volume related key strings temporary Change-Id: Ic15debd1b1fe2ced12a28b98c35087f9ee708d21 Signed-off-by: Minkyu Kang --- src/view_player.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/view_player.cpp b/src/view_player.cpp index 30a2895..d828a71 100644 --- a/src/view_player.cpp +++ b/src/view_player.cpp @@ -43,6 +43,10 @@ #define CONTROL_BTNS 7 +/* Workaround */ +#define KEY_VOLUMEUP_REMOTE "XF86AudioRaiseVolume" +#define KEY_VOLUMEDOWN_REMOTE "XF86AudioLowerVolume" + static const char *_control_name[] = { "prev", "rew", @@ -440,9 +444,11 @@ void CPlayerView::sm_CbEcoreEvent(void *dt, int type, void *ei) if (!ev) return; - if (!strcmp(ev->keyname, KEY_VOLUMEUP)) + if (!strcmp(ev->keyname, KEY_VOLUMEUP) || + !strcmp(ev->keyname, KEY_VOLUMEUP_REMOTE)) sm_EvtVolume(data, E_VOLUME_UP); - else if (!strcmp(ev->keyname, KEY_VOLUMEDOWN)) + else if (!strcmp(ev->keyname, KEY_VOLUMEDOWN) || + !strcmp(ev->keyname, KEY_VOLUMEDOWN_REMOTE)) sm_EvtVolume(data, E_VOLUME_DOWN); else if (!strcmp(ev->keyname, KEY_MUTE)) sm_EvtVolume(data, E_VOLUME_MUTE); -- 2.7.4 From 19bc64437113a65b55d7a0daf584e62ab67631b2 Mon Sep 17 00:00:00 2001 From: Minkyu Kang Date: Tue, 3 Mar 2015 17:53:46 +0900 Subject: [PATCH 03/16] remove unused codes Change-Id: Ib9ea41906c404e0044478dd1f1df1129d277cc52 Signed-off-by: Minkyu Kang --- include/playermgr.h | 6 ------ src/playermgr.cpp | 56 ----------------------------------------------------- src/videodata.cpp | 17 ++++++++-------- src/view_player.cpp | 13 +++++++------ 4 files changed, 15 insertions(+), 77 deletions(-) diff --git a/include/playermgr.h b/include/playermgr.h index 9812f43..90dc6c6 100644 --- a/include/playermgr.h +++ b/include/playermgr.h @@ -52,10 +52,6 @@ int playermgr_get_position(struct playermgr *mgr, int *position); int playermgr_set_position(struct playermgr *mgr, int sec, player_seek_completed_cb cb, void *data); -int playermgr_set_playback_rate(struct playermgr *mgr, float speed); - -int playermgr_get_playback_rate(struct playermgr *mgr, float *speed); - int playermgr_set_ff(struct playermgr *mgr, int duration); int playermgr_set_rew(struct playermgr *mgr, int duration); @@ -64,8 +60,6 @@ bool playermgr_get_ffrew(struct playermgr *mgr); void playermgr_stop_ffrew(struct playermgr *mgr); -int playermgr_set_looping(struct playermgr *mgr, bool value); - int playermgr_set_audio_effect(struct playermgr *mgr, int value); int playermgr_set_display_mode(struct playermgr *mgr, int value); diff --git a/src/playermgr.cpp b/src/playermgr.cpp index 2dbb52c..c4f307a 100644 --- a/src/playermgr.cpp +++ b/src/playermgr.cpp @@ -40,7 +40,6 @@ struct playermgr { Evas_Object *win; Eina_List *media_list; - float speed; int display_mode; int audio_effect; int current; @@ -373,61 +372,6 @@ int playermgr_set_position(struct playermgr *mgr, return 0; } -int playermgr_set_playback_rate(struct playermgr *mgr, float speed) -{ - int r; - - if (!mgr || !mgr->player) { - _ERR("invalid parameter"); - return -1; - } - - if (speed > RATE_MAX) - speed = RATE_MAX; - else if (speed < RATE_MIN) - speed = RATE_MIN; - - r = player_set_playback_rate(mgr->player, speed); - if (r != PLAYER_ERROR_NONE) { - _ERR("Player set playback error"); - return -1; - } - - mgr->speed = speed; - - return 0; -} - -int playermgr_get_playback_rate(struct playermgr *mgr, float *speed) -{ - if (!mgr) { - _ERR("invalid parameter"); - return -1; - } - - *speed = mgr->speed; - - return 0; -} - -int playermgr_set_looping(struct playermgr *mgr, bool value) -{ - int r; - - if (!mgr || !mgr->player) { - _ERR("invalid parameter"); - return -1; - } - - r = player_set_looping(mgr->player, value); - if (r != PLAYER_ERROR_NONE) { - _ERR("Player set looping error"); - return -1; - } - - return 0; -} - int playermgr_set_audio_effect(struct playermgr *mgr, int value) { /* audio_effect not supported, just return 0 */ diff --git a/src/videodata.cpp b/src/videodata.cpp index 1dd053c..74661e6 100644 --- a/src/videodata.cpp +++ b/src/videodata.cpp @@ -46,34 +46,33 @@ bool CVideoData::Update(media_info_h media_h) r = video_meta_get_duration(video_h, &duration); if (r != MEDIA_CONTENT_ERROR_NONE) { _ERR("video meta get duration error"); - video_meta_destroy(video_h); - return false; + goto err; } r = video_meta_get_width(video_h, &width); if (r != MEDIA_CONTENT_ERROR_NONE) { _ERR("video meta get width error"); - video_meta_destroy(video_h); - return false; + goto err; } r = video_meta_get_height(video_h, &height); if (r != MEDIA_CONTENT_ERROR_NONE) { _ERR("video meta get width error"); - video_meta_destroy(video_h); - return false; + goto err; } r = video_meta_get_played_position(video_h, &position); if (r != MEDIA_CONTENT_ERROR_NONE) { _ERR("video meta get played position error"); - video_meta_destroy(video_h); - return false; + goto err; } video_meta_destroy(video_h); - return true; + +err: + video_meta_destroy(video_h); + return false; } int CVideoData::GetDuration(void) diff --git a/src/view_player.cpp b/src/view_player.cpp index d828a71..806cf48 100644 --- a/src/view_player.cpp +++ b/src/view_player.cpp @@ -594,14 +594,12 @@ bool CPlayerView::Create(void *data) r = m_UiInit(); if (!r) { _ERR("failed to init UI"); - m_Fini(); - return false; + goto err; } if (!m_PlayerInit()) { _ERR("failed to play video"); - m_Fini(); - return false; + goto err; } playermgr_set_completed_cb(m->player, sm_CbPlayComplete, m); @@ -612,13 +610,16 @@ bool CPlayerView::Create(void *data) m->drawanim_timer = ecore_timer_add(0.8, sm_CbDrawAnimation, m); if (!m->drawanim_timer) { _ERR("failed to add draw timer"); - m_Fini(); - return false; + goto err; } CBaseView::Create(NULL); return true; + +err: + m_Fini(); + return false; } void CPlayerView::m_Fini(void) -- 2.7.4 From 7d81294f4cb85d066e042037546d6586e4594936 Mon Sep 17 00:00:00 2001 From: Minkyu Kang Date: Wed, 4 Mar 2015 15:04:30 +0900 Subject: [PATCH 04/16] Set video position when slider reset Change-Id: I23cc8cdfb0d4b866abac259cffd0b31185551b0f Signed-off-by: Minkyu Kang --- include/slider.h | 3 ++- src/slider.cpp | 4 ++-- src/view_player.cpp | 21 +++++++++++++++------ 3 files changed, 19 insertions(+), 9 deletions(-) diff --git a/include/slider.h b/include/slider.h index a89da17..181c977 100644 --- a/include/slider.h +++ b/include/slider.h @@ -65,8 +65,9 @@ public: * Reset the slider * * @param duration duration time of video file + * @param position start position of video file */ - void Reset(int duration); + void Reset(int duration, int position); /** * Resume the slider timer diff --git a/src/slider.cpp b/src/slider.cpp index 0f34fa3..20d498c 100644 --- a/src/slider.cpp +++ b/src/slider.cpp @@ -129,7 +129,7 @@ void CVideoSlider::Resume(void) ecore_timer_thaw(m->timer); } -void CVideoSlider::Reset(int duration) +void CVideoSlider::Reset(int duration, int position) { ASSERT(m); @@ -138,7 +138,7 @@ void CVideoSlider::Reset(int duration) ecore_timer_del(m->timer); m->timer = ecore_timer_add(TIME_INTERVAL, sm_CbTimer, m); - elm_slider_value_set(m->slider, 0); + elm_slider_value_set(m->slider, position); elm_slider_min_max_set(m->slider, 0, duration); _get_timestr(str, sizeof(str), duration); diff --git a/src/view_player.cpp b/src/view_player.cpp index 806cf48..3d5d11f 100644 --- a/src/view_player.cpp +++ b/src/view_player.cpp @@ -36,10 +36,12 @@ #define BTN_ID "BTN_ID" -#define TEXT_NOVIDEO N_("No Video") -#define TEXT_NORES N_("---- x ----") #define TEXT_NODATE N_("----.--.--") -#define TEXT_NOSOURCE N_("-") + +#define SOURCE_PATH_LEN 6 +#define SOURCE_TV_PATH "/home/" +#define SOURCE_TV N_("TV") +#define SOURCE_USB N_("USB") #define CONTROL_BTNS 7 @@ -77,6 +79,7 @@ struct SPlayerView { Ecore_Timer *drawanim_timer; int duration; int repeat; + int position; }; enum _control_btn { @@ -98,6 +101,7 @@ enum _repeat_option { void CPlayerView::m_UpdateInfoBar(void) { const char *name; + const char *source; char buf[32]; time_t video_time; struct tm tm; @@ -120,8 +124,12 @@ void CPlayerView::m_UpdateInfoBar(void) elm_object_part_text_set(m->base, PART_DATETEXT, buf); /* Source */ - /* TODO: temporary, get actual values and set */ - elm_object_part_text_set(m->base, PART_SOURCETEXT, _("TV")); + /* FIXME: when usb path is decided, this logic should be changed */ + if (!strncmp(m->mediadata->GetPath(), SOURCE_TV_PATH, SOURCE_PATH_LEN)) + source = SOURCE_TV; + else + source = SOURCE_USB; + elm_object_part_text_set(m->base, PART_SOURCETEXT, _(source)); /* Playlist Count */ playermgr_get_play_count(m->player, buf, sizeof(buf)); @@ -132,6 +140,7 @@ void CPlayerView::m_UpdateInfoBar(void) m->mediadata->GetHeight()); m->duration = m->mediadata->GetDuration(); + m->position = m->mediadata->GetPosition(); elm_object_part_text_set(m->base, PART_RESOLUTIONTEXT, buf); } @@ -151,7 +160,7 @@ bool CPlayerView::m_PlayerInit(void) m_UpdateInfoBar(); m->mediadata->Destroy(); - m->slider->Reset(m->duration); + m->slider->Reset(m->duration, m->position); m->control->Signal(E_PLAYPAUSE_BTN, SIG_SET_PAUSE, ""); if (m->bar_hidden) { -- 2.7.4 From ff13d967628da82c368c9dc7e4fba6ccdc39ac88 Mon Sep 17 00:00:00 2001 From: Minkyu Kang Date: Wed, 4 Mar 2015 15:34:38 +0900 Subject: [PATCH 05/16] remove unnecessary codes and functions Change-Id: I11422400e8ddc66edfc450e0e1688facd77a0040 Signed-off-by: Minkyu Kang --- include/control.h | 1 - include/slider.h | 1 - src/control.cpp | 7 +------ src/mediadata.cpp | 8 +------- src/playermgr.cpp | 10 ++-------- src/slider.cpp | 9 ++------- 6 files changed, 6 insertions(+), 30 deletions(-) diff --git a/include/control.h b/include/control.h index 506294a..9fd30f5 100644 --- a/include/control.h +++ b/include/control.h @@ -30,7 +30,6 @@ private: int m_AddControls(const char **btns, int count); Evas_Object *m_AddButton(const char *style); void m_SetFocusDirection(Evas_Object **btn, int count); - int m_GetEventTypes(void); private: static void sm_CbEvent(void *dt, Evas_Object *obj, diff --git a/include/slider.h b/include/slider.h index 181c977..e5cbc93 100644 --- a/include/slider.h +++ b/include/slider.h @@ -32,7 +32,6 @@ private: private: void m_SetTimer(void); - int m_GetEventTypes(void); private: static Eina_Bool sm_CbTimer(void *dt); diff --git a/src/control.cpp b/src/control.cpp index c0fbc82..010fac2 100644 --- a/src/control.cpp +++ b/src/control.cpp @@ -119,7 +119,7 @@ int CVideoController::m_AddControls(const char **btns, int count) break; } - Connect(m->btn[i], -1, m_GetEventTypes()); + Connect(m->btn[i], -1, TYPE_MOUSE_MOVE | TYPE_CLICKED); elm_object_signal_callback_add(m->btn[i], SIG_BTN_ANI_FIN, btns[i], @@ -233,8 +233,3 @@ void CVideoController::OnMouseClicked(int id, Evas_Object *obj) { elm_object_signal_emit(obj, SIG_BTN_ANI_START, ""); } - -int CVideoController::m_GetEventTypes(void) -{ - return TYPE_MOUSE_MOVE | TYPE_CLICKED; -} diff --git a/src/mediadata.cpp b/src/mediadata.cpp index d91a082..94dcbfa 100644 --- a/src/mediadata.cpp +++ b/src/mediadata.cpp @@ -89,13 +89,7 @@ bool CMediaData::Create(const char *path) r = media_info_foreach_media_from_db(filter, sm_GetMediaInfo, m); if (r != MEDIA_CONTENT_ERROR_NONE) { - if (r == MEDIA_CONTENT_ERROR_DB_FAILED) - _ERR("MEDIA CONTENT ERROR DB FAILED"); - else if (r == MEDIA_CONTENT_ERROR_DB_BUSY) - _ERR("MEDIA CONTENT ERROR DB BUSY"); - else - _ERR("MEDIA CONTENT ERROR"); - + _ERR("MEDIA CONTENT ERROR: %d", r); media_filter_destroy(filter); delete m; diff --git a/src/playermgr.cpp b/src/playermgr.cpp index c4f307a..141c561 100644 --- a/src/playermgr.cpp +++ b/src/playermgr.cpp @@ -165,19 +165,13 @@ static int _play_video(struct playermgr *mgr, const char *path) r = player_prepare(mgr->player); if (r != PLAYER_ERROR_NONE) { - if (r == PLAYER_ERROR_NOT_SUPPORTED_FILE) - _ERR("PLAYER PREPARE ERROR NOT SUPPORTED FILE %d", r); - else if (r == PLAYER_ERROR_INVALID_URI) - _ERR("PLAYER PREPARE ERROR INVALID URI %d", r); - else - _ERR("PLAYER PREPARE ERROR"); - + _ERR("PLAYER PREPARE ERROR: %d", r); return -1; } r = player_start(mgr->player); if (r != PLAYER_ERROR_NONE) { - _ERR("PLAYER START ERROR"); + _ERR("PLAYER START ERROR: %d", r); return -1; } diff --git a/src/slider.cpp b/src/slider.cpp index 20d498c..9355c14 100644 --- a/src/slider.cpp +++ b/src/slider.cpp @@ -175,7 +175,8 @@ bool CVideoSlider::Create(Evas_Object *base, playermgr *player) elm_slider_horizontal_set(slider, EINA_TRUE); elm_slider_step_set(slider, SLIDER_STEP); - Connect(slider, -1, m_GetEventTypes()); + Connect(slider, -1, TYPE_MOUSE_MOVE | TYPE_MOUSE_DOWN | TYPE_MOUSE_UP | + TYPE_FOCUSED | TYPE_UNFOCUSED | TYPE_CHANGED); elm_object_part_content_set(base, PART_SLIDER, slider); @@ -240,9 +241,3 @@ void CVideoSlider::OnUnfocused(int id, Evas_Object *obj, Elm_Object_Item *item) void CVideoSlider::OnChanged(int id, Evas_Object *obj) { } - -int CVideoSlider::m_GetEventTypes(void) -{ - return TYPE_MOUSE_MOVE | TYPE_MOUSE_DOWN | TYPE_MOUSE_UP | - TYPE_FOCUSED | TYPE_UNFOCUSED | TYPE_CHANGED; -} -- 2.7.4 From 6a5019e48dbb582d67083dd09ff5d1412510029d Mon Sep 17 00:00:00 2001 From: Minkyu Kang Date: Wed, 4 Mar 2015 17:39:36 +0900 Subject: [PATCH 06/16] delete the view at terminate Change-Id: Id41c1e05eb02b29232b05bcf5341dee22224a344 Signed-off-by: Minkyu Kang --- src/main.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main.cpp b/src/main.cpp index 5c6c013..ffaa55f 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -135,6 +135,11 @@ void CVideoPlayerApp::OnTerminate(void) if (m_pApp->win) evas_object_del(m_pApp->win); + + if (m_pPlayerView) { + delete m_pPlayerView; + m_pPlayerView = NULL; + } } void CVideoPlayerApp::OnPause(void) -- 2.7.4 From e5a4dfb672bc0a6a28ef30083a7a906aa6a5a2b4 Mon Sep 17 00:00:00 2001 From: Hyojung Jo Date: Mon, 9 Mar 2015 16:54:31 +0900 Subject: [PATCH 07/16] Deleted the x, utilX, ecore-x dependency for wayland. Change-Id: Ia277d0d646d21e335d94adacc873225ef03fe244 Signed-off-by: Hyojung Jo --- CMakeLists.txt | 3 --- include/define.h | 5 +++++ packaging/org.tizen.video-player-tv-ref.spec | 4 ---- src/view_player.cpp | 1 - 4 files changed, 5 insertions(+), 8 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index c914759..bbc1311 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -21,12 +21,9 @@ pkg_check_modules(PKGS REQUIRED elementary capi-appfw-application dlog - ecore-x efl-extension edje evas - utilX - x11 application-common mm-player capi-media-player diff --git a/include/define.h b/include/define.h index 7336fcd..b11ad5c 100644 --- a/include/define.h +++ b/include/define.h @@ -14,6 +14,11 @@ * limitations under the License. */ +/* Key definitions */ +#define KEY_VOLUMEUP "F9" +#define KEY_VOLUMEDOWN "F10" +#define KEY_MUTE "Mute" + /* View definitions */ #define VIEW_ID_PLAYER "VIEW_PLAYER" diff --git a/packaging/org.tizen.video-player-tv-ref.spec b/packaging/org.tizen.video-player-tv-ref.spec index 2c72229..9a85847 100644 --- a/packaging/org.tizen.video-player-tv-ref.spec +++ b/packaging/org.tizen.video-player-tv-ref.spec @@ -10,17 +10,13 @@ Source1: %{name}.manifest BuildRequires: cmake BuildRequires: pkgconfig(capi-appfw-application) BuildRequires: pkgconfig(elementary) -BuildRequires: pkgconfig(ecore-x) BuildRequires: pkgconfig(efl-extension) BuildRequires: pkgconfig(dlog) BuildRequires: pkgconfig(edje) -BuildRequires: pkgconfig(utilX) BuildRequires: pkgconfig(capi-media-player) BuildRequires: pkgconfig(capi-media-sound-manager) BuildRequires: pkgconfig(capi-content-media-content) BuildRequires: pkgconfig(mm-player) -BuildRequires: pkgconfig(utilX) -BuildRequires: pkgconfig(x11) BuildRequires: pkgconfig(application-common) BuildRequires: gettext-devel BuildRequires: edje-bin diff --git a/src/view_player.cpp b/src/view_player.cpp index 3d5d11f..d75bc1a 100644 --- a/src/view_player.cpp +++ b/src/view_player.cpp @@ -16,7 +16,6 @@ #include #include -#include #include #include #include -- 2.7.4 From 0e17f79ec8b397b6cfe24f60d3eb50df1fe15140 Mon Sep 17 00:00:00 2001 From: Hyojung Jo Date: Thu, 12 Mar 2015 19:48:47 +0900 Subject: [PATCH 08/16] Deleted the unnecessary setting button. Change-Id: I8b6385cd0c7e6469c45d617b5a8bb36201f4f707 Signed-off-by: Hyojung Jo --- include/define.h | 3 - res/edc/images/btn_video_setting_foc.png | Bin 20824 -> 0 bytes res/edc/images/btn_video_setting_high.png | Bin 21104 -> 0 bytes res/edc/images/btn_video_setting_nor.png | Bin 21934 -> 0 bytes res/edc/widgets/button.edc | 119 ------------------------------ src/control.cpp | 8 +- src/view_player.cpp | 4 +- 7 files changed, 2 insertions(+), 132 deletions(-) delete mode 100644 res/edc/images/btn_video_setting_foc.png delete mode 100644 res/edc/images/btn_video_setting_high.png delete mode 100644 res/edc/images/btn_video_setting_nor.png diff --git a/include/define.h b/include/define.h index b11ad5c..1ce067a 100644 --- a/include/define.h +++ b/include/define.h @@ -81,9 +81,6 @@ #define IMAGE_VIDEO_BTN_PAUSE_FOCUS "btn_video_pause_foc.png" #define IMAGE_VIDEO_BTN_PLAY_NORMAL "btn_video_play_nor.png" #define IMAGE_VIDEO_BTN_PLAY_FOCUS "btn_video_play_foc.png" -#define IMAGE_VIDEO_BTN_SETTING_NORMAL "btn_video_setting_nor.png" -#define IMAGE_VIDEO_BTN_SETTING_FOCUS "btn_video_setting_foc.png" -#define IMAGE_VIDEO_BTN_SETTING_HIGHLIGHT "btn_video_setting_high.png" #define IMAGE_VIDEO_BTN_REPEATOFF_NORMAL "btn_video_offrepeat_nor.png" #define IMAGE_VIDEO_BTN_REPEATOFF_FOCUS "btn_video_offrepeat_foc.png" #define IMAGE_VIDEO_BTN_REPEATALL_NORMAL "btn_video_repeatall_nor.png" diff --git a/res/edc/images/btn_video_setting_foc.png b/res/edc/images/btn_video_setting_foc.png deleted file mode 100644 index 3cca0b649bc550c47a96508311293c113f3a785a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20824 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 lz^AIXe8Qsq^VJD(y`DxNEZa9 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, buf, m->btn[i]); - /* FIXME: disable setting button temporary */ - if (i == count - 1) { - elm_object_focus_allow_set(m->btn[i], EINA_FALSE); - break; - } - Connect(m->btn[i], -1, TYPE_MOUSE_MOVE | TYPE_CLICKED); elm_object_signal_callback_add(m->btn[i], diff --git a/src/view_player.cpp b/src/view_player.cpp index d75bc1a..a21a077 100644 --- a/src/view_player.cpp +++ b/src/view_player.cpp @@ -42,7 +42,7 @@ #define SOURCE_TV N_("TV") #define SOURCE_USB N_("USB") -#define CONTROL_BTNS 7 +#define CONTROL_BTNS 6 /* Workaround */ #define KEY_VOLUMEUP_REMOTE "XF86AudioRaiseVolume" @@ -55,7 +55,6 @@ static const char *_control_name[] = { "ff", "next", "repeat", - "settings" }; typedef void (*btn_event_cb)(void *dt); @@ -88,7 +87,6 @@ enum _control_btn { E_FF_BTN, E_NEXT_BTN, E_REPEAT_BTN, - E_SETTINGS_BTN }; enum _repeat_option { -- 2.7.4 From 9e33567bd60e2a7f6afa146126f1d03c272129c7 Mon Sep 17 00:00:00 2001 From: Minkyu Kang Date: Tue, 7 Apr 2015 15:53:56 +0900 Subject: [PATCH 09/16] remove unused function sm_EvtSettingBtn is not used anymore. Change-Id: I62d55cdfd6b26ed59a8a6726d89e34573cfdcfe6 Signed-off-by: Minkyu Kang --- include/view_player.h | 1 - src/view_player.cpp | 5 ----- 2 files changed, 6 deletions(-) diff --git a/include/view_player.h b/include/view_player.h index d21c226..49586ee 100644 --- a/include/view_player.h +++ b/include/view_player.h @@ -65,7 +65,6 @@ private: static void sm_EvtForwardBtn(void *dt); static void sm_EvtNextBtn(void *dt); static void sm_EvtReapeatBtn(void *dt); - static void sm_EvtSettingBtn(void *dt); protected: virtual void t_OnShow(void); diff --git a/src/view_player.cpp b/src/view_player.cpp index a21a077..ea54b44 100644 --- a/src/view_player.cpp +++ b/src/view_player.cpp @@ -262,10 +262,6 @@ void CPlayerView::sm_EvtReapeatBtn(void *dt) } } -void CPlayerView::sm_EvtSettingBtn(void *dt) -{ -} - void CPlayerView::sm_EvtPlayBtn(void *dt) { SPlayerView *data; @@ -313,7 +309,6 @@ void CPlayerView::sm_EvtControlBtn(void *dt, const char *ev) sm_EvtForwardBtn, sm_EvtNextBtn, sm_EvtReapeatBtn, - sm_EvtSettingBtn, }; int i; -- 2.7.4 From 50db2d88111fd196ec7c2e356d5e5e19ab0190da Mon Sep 17 00:00:00 2001 From: Minkyu Kang Date: Wed, 8 Apr 2015 12:04:25 +0900 Subject: [PATCH 10/16] allocate the app instance as dymanically Change-Id: Ied1cbc2b5c9c23d50b1a064d954ea7e4644d9f15 Signed-off-by: Minkyu Kang --- src/main.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index ffaa55f..40b741c 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -210,9 +210,10 @@ int CVideoPlayerApp::Run(int argc, char **argv) int main(int argc, char **argv) { - CVideoPlayerApp app; + CVideoPlayerApp *app = new CVideoPlayerApp; - app.Run(argc, argv); + app->Run(argc, argv); + delete app; return 0; } -- 2.7.4 From 7ae8d5a0a2f6e7db141691c3415c95a00fa91056 Mon Sep 17 00:00:00 2001 From: Minkyu Kang Date: Wed, 8 Apr 2015 16:15:18 +0900 Subject: [PATCH 11/16] playermgr: convert to class Change-Id: I7061ce9f64f9873c7a6c9d9698cc7c64544883ad Signed-off-by: Minkyu Kang --- include/playermgr.h | 68 ++++---- include/slider.h | 2 +- src/playermgr.cpp | 485 ++++++++++++++++++++++++---------------------------- src/slider.cpp | 20 ++- src/view_player.cpp | 76 ++++---- 5 files changed, 311 insertions(+), 340 deletions(-) diff --git a/include/playermgr.h b/include/playermgr.h index 90dc6c6..01c66a6 100644 --- a/include/playermgr.h +++ b/include/playermgr.h @@ -24,49 +24,49 @@ enum display_mode { E_ORIGINAL }; -struct playermgr; +struct SPlayerData; -struct playermgr *playermgr_init(Evas_Object *win, - const char *path, const char *playlist); +class CPlayer { +private: + SPlayerData *m; -int playermgr_play_video(struct playermgr *mgr); +private: + bool m_Play(const char *path); + void m_StartFFRew(void); -int playermgr_stop_video(struct playermgr *mgr); +private: + static Eina_Bool sm_CbFFRew(void *dt); -void playermgr_fini(struct playermgr *mgr); +public: + CPlayer(void) : m(0) {} + virtual ~CPlayer(void) {} -int playermgr_pause(struct playermgr *mgr); + bool Create(Evas_Object *win, const char *path, const char *playlist); + void Destroy(void); -int playermgr_resume(struct playermgr *mgr); + bool Play(void); + bool Stop(void); + bool Pause(void); + bool Resume(void); + bool Prev(void); + bool Next(bool repeat); -void playermgr_set_prev_video(struct playermgr *mgr); + bool SetFF(int duration); + bool SetRew(int duration); + bool GetFFRew(void); + void StopFFRew(void); -Eina_Bool playermgr_set_next_video(struct playermgr *mgr, Eina_Bool repeat); + bool SetCompletedCb(player_completed_cb cb, void *data); -const char *playermgr_get_video_path(struct playermgr *mgr); + const char *GetPath(void); + bool GetState(player_state_e *state); + bool GetPosition(int *ms); + bool SetPosition(int ms, player_seek_completed_cb cb, void *data); + int GetTotal(void); + int GetCurrent(void); -int playermgr_get_state(struct playermgr *mgr, player_state_e *state); - -int playermgr_get_position(struct playermgr *mgr, int *position); - -int playermgr_set_position(struct playermgr *mgr, - int sec, player_seek_completed_cb cb, void *data); - -int playermgr_set_ff(struct playermgr *mgr, int duration); - -int playermgr_set_rew(struct playermgr *mgr, int duration); - -bool playermgr_get_ffrew(struct playermgr *mgr); - -void playermgr_stop_ffrew(struct playermgr *mgr); - -int playermgr_set_audio_effect(struct playermgr *mgr, int value); - -int playermgr_set_display_mode(struct playermgr *mgr, int value); - -int playermgr_set_completed_cb(struct playermgr *mgr, - player_completed_cb cb, void *data); - -void playermgr_get_play_count(struct playermgr *mgr, char *str, int len); + bool SetAudioEffect(int value); + bool SetDisplayMode(int value); +}; #endif diff --git a/include/slider.h b/include/slider.h index e5cbc93..a4f9416 100644 --- a/include/slider.h +++ b/include/slider.h @@ -53,7 +53,7 @@ public: * @param player the pointer of playermgr struct * @return if success true is returned otherwise will return false */ - bool Create(Evas_Object *base, playermgr *player); + bool Create(Evas_Object *base, CPlayer *player); /** * Destroy the slider diff --git a/src/playermgr.cpp b/src/playermgr.cpp index 141c561..3609aad 100644 --- a/src/playermgr.cpp +++ b/src/playermgr.cpp @@ -16,6 +16,7 @@ #include #include +#include #include #include "define.h" #include "playermgr.h" @@ -35,7 +36,7 @@ static int _speed[] = { 8000 }; -struct playermgr { +struct SPlayerData { player_h player; Evas_Object *win; Eina_List *media_list; @@ -56,9 +57,6 @@ static void _destroy_list(Eina_List *list) char *buf; void *o; - if (!list) - return; - EINA_LIST_FREE(list, o) { buf = (char *)o; free(buf); @@ -108,469 +106,434 @@ static int _get_current(Eina_List *list, const char *path) return cur; } -struct playermgr *playermgr_init(Evas_Object *win, - const char *path, const char *playlist) +bool CPlayer::Create(Evas_Object *win, const char *path, const char *playlist) { - struct playermgr *mgr; + ASSERT(!m); - mgr = (playermgr *)calloc(1, sizeof(*mgr)); - if (!mgr) { - _ERR("Allocation fail"); - return NULL; + m = new SPlayerData; + if (!m) { + _ERR("allocation fail"); + return false; } - mgr->win = win; - mgr->display_mode = E_FULL_SCREEN; - mgr->audio_effect = 0; - mgr->rew_speed = 0; - mgr->ff_speed = 0; + m->win = win; + m->display_mode = E_FULL_SCREEN; + m->audio_effect = 0; + m->rew_speed = 0; + m->ff_speed = 0; - mgr->media_list = _create_list(playlist); - if (!mgr->media_list) { + m->media_list = _create_list(playlist); + if (!m->media_list) { _ERR("play list is null"); - free(mgr); - return NULL; + delete m; + return false; } - mgr->current = _get_current(mgr->media_list, path); - mgr->total = eina_list_count(mgr->media_list); + m->current = _get_current(m->media_list, path); + m->total = eina_list_count(m->media_list); - if (player_create(&mgr->player) != PLAYER_ERROR_NONE) { + if (player_create(&m->player) != PLAYER_ERROR_NONE) { _ERR("PLAYER CREATION ERROR"); - free(mgr); - return NULL; + delete m; + return false; } + return true; +} + +void CPlayer::Destroy(void) +{ + ASSERT(m); + + ecore_timer_del(m->ffrew_timer); + + if (m->media_list) + _destroy_list(m->media_list); + + if (m->player) { + player_pause(m->player); + player_stop(m->player); + player_unprepare(m->player); + player_destroy(m->player); + } - return mgr; + delete m; + m = NULL; } -static int _play_video(struct playermgr *mgr, const char *path) +bool CPlayer::m_Play(const char *path) { + ASSERT(m); + ASSERT(m->player); + int r; - if (player_set_uri(mgr->player, path) != PLAYER_ERROR_NONE) { + if (player_set_uri(m->player, path) != PLAYER_ERROR_NONE) { _ERR("PLAYER SET URI ERROR"); - return -1; + return false; } - r = player_set_display(mgr->player, PLAYER_DISPLAY_TYPE_OVERLAY, - GET_DISPLAY(mgr->win)); + r = player_set_display(m->player, PLAYER_DISPLAY_TYPE_OVERLAY, + GET_DISPLAY(m->win)); if (r != PLAYER_ERROR_NONE) { _ERR("SETTING DISPLAY ERROR: %d", r); - return -1; + return false; } - playermgr_set_display_mode(mgr, mgr->display_mode); + SetDisplayMode(m->display_mode); + SetAudioEffect(m->audio_effect); - r = player_prepare(mgr->player); + r = player_prepare(m->player); if (r != PLAYER_ERROR_NONE) { _ERR("PLAYER PREPARE ERROR: %d", r); - return -1; + return false; } - r = player_start(mgr->player); + r = player_start(m->player); if (r != PLAYER_ERROR_NONE) { _ERR("PLAYER START ERROR: %d", r); - return -1; + return false; } - playermgr_set_audio_effect(mgr, mgr->audio_effect); - - return 0; + return true; } -int playermgr_stop_video(struct playermgr *mgr) +bool CPlayer::Stop(void) { - if (!mgr || !mgr->player) { - _ERR("invalid parameter"); - return -1; - } + ASSERT(m); + ASSERT(m->player); - player_pause(mgr->player); - player_stop(mgr->player); - player_unprepare(mgr->player); + player_pause(m->player); + player_stop(m->player); + player_unprepare(m->player); - return 0; + return true; } -int playermgr_play_video(struct playermgr *mgr) +bool CPlayer::Play(void) { - const char *path; - int r; + ASSERT(m); - if (!mgr || !mgr->media_list) { - _ERR("invalid parameter"); - return -1; - } + const char *path; + bool r; - r = playermgr_stop_video(mgr); - if (r < 0) + r = Stop(); + if (!r) return r; - path = playermgr_get_video_path(mgr); - r = _play_video(mgr, path); + path = GetPath(); + if (!path) { + _ERR("video path is NULL"); + return false; + } + + r = m_Play(path); return r; } -void playermgr_set_prev_video(struct playermgr *mgr) +bool CPlayer::Prev(void) { - if (!mgr) { - _ERR("invalid parameter"); - return; - } + ASSERT(m); - if (mgr->current == 0) - mgr->current = mgr->total - 1; + if (m->current == 0) + m->current = m->total - 1; else - mgr->current--; + m->current--; + + return true; } -Eina_Bool playermgr_set_next_video(struct playermgr *mgr, Eina_Bool repeat) +bool CPlayer::Next(bool repeat) { - if (!mgr) { - _ERR("invalid parameter"); - return EINA_FALSE; - } + ASSERT(m); - if (mgr->current == mgr->total - 1) { - mgr->current = 0; + if (m->current == m->total - 1) { + m->current = 0; if (!repeat) - return EINA_FALSE; + return false; } else { - mgr->current++; + m->current++; } - return EINA_TRUE; + return true; } -const char *playermgr_get_video_path(struct playermgr *mgr) +const char *CPlayer::GetPath(void) { + ASSERT(m); + const char *path; - if (!mgr || !mgr->media_list) { + if (!m->media_list) { _ERR("invalid parameter"); return NULL; } - path = (const char *)eina_list_nth(mgr->media_list, mgr->current); + path = (const char *)eina_list_nth(m->media_list, m->current); return path; } -void playermgr_fini(struct playermgr *mgr) +bool CPlayer::Pause(void) { - if (!mgr) - return; - - if (mgr->ffrew_timer) - ecore_timer_del(mgr->ffrew_timer); - - if (mgr->media_list) - _destroy_list(mgr->media_list); - - if (mgr->player) { - player_pause(mgr->player); - player_stop(mgr->player); - player_unprepare(mgr->player); - player_destroy(mgr->player); - } + ASSERT(m); + ASSERT(m->player); - free(mgr); -} - -int playermgr_pause(struct playermgr *mgr) -{ - if (!mgr || !mgr->player) { - _ERR("invalid parameter"); - return -1; - } - - if (player_pause(mgr->player) != PLAYER_ERROR_NONE) { + if (player_pause(m->player) != PLAYER_ERROR_NONE) { _ERR("Player pause error"); - return -1; + return false; } - return 0; + return true; } -int playermgr_resume(struct playermgr *mgr) +bool CPlayer::Resume(void) { - if (!mgr || !mgr->player) { - _ERR("invalid parameter"); - return -1; - } + ASSERT(m); + ASSERT(m->player); - if (player_start(mgr->player) != PLAYER_ERROR_NONE) { + if (player_start(m->player) != PLAYER_ERROR_NONE) { _ERR("Player resume error"); - return -1; + return false; } - return 0; + return true; } -int playermgr_get_state(struct playermgr *mgr, player_state_e *state) +bool CPlayer::GetState(player_state_e *state) { - int r; + ASSERT(m); + ASSERT(m->player); - if (!mgr || !mgr->player) { - _ERR("invalid parameter"); - return -1; - } + int r; - r = player_get_state(mgr->player, state); + r = player_get_state(m->player, state); if (r != PLAYER_ERROR_NONE) { _ERR("Player get state error"); - return -1; + return false; } - return 0; + return true; } -int playermgr_get_position(struct playermgr *mgr, int *position) +bool CPlayer::GetPosition(int *ms) { - int r; + ASSERT(m); + ASSERT(m->player); - if (!mgr || !mgr->player) { - _ERR("invalid parameter"); - return -1; - } + int r; - r = player_get_play_position(mgr->player, position); + r = player_get_play_position(m->player, ms); if (r != PLAYER_ERROR_NONE) { _ERR("Player get position error"); - return -1; + return false; } - return 0; + return true; } -int playermgr_set_position(struct playermgr *mgr, - int sec, player_seek_completed_cb cb, void *data) +bool CPlayer::SetPosition(int ms, player_seek_completed_cb cb, void *data) { - int r; + ASSERT(m); + ASSERT(m->player); - if (!mgr || !mgr->player) { - _ERR("invalid parameter"); - return -1; - } + int r; - r = player_set_play_position(mgr->player, sec, false, cb, data); + r = player_set_play_position(m->player, ms, false, cb, data); if (r != PLAYER_ERROR_NONE) { _ERR("Player set position error"); - return -1; + return false; } - return 0; + return true; } -int playermgr_set_audio_effect(struct playermgr *mgr, int value) +bool CPlayer::SetAudioEffect(int value) { + ASSERT(m); + /* audio_effect not supported, just return 0 */ - mgr->audio_effect = value; + m->audio_effect = value; - return 0; + return true; } -int playermgr_set_display_mode(struct playermgr *mgr, int value) +bool CPlayer::SetDisplayMode(int value) { + ASSERT(m); + ASSERT(m->player); + int r; player_display_mode_e mode; - if (!mgr || !mgr->player) { - _ERR("invalid parameter"); - return -1; - } - - switch (value) { - case E_FULL_SCREEN: - mode = PLAYER_DISPLAY_MODE_FULL_SCREEN; - break; - case E_ORIGINAL: - mode = PLAYER_DISPLAY_MODE_ORIGIN_SIZE; - break; - default: - _ERR("Invalid value"); - return -1; - } + /* display mode not supported, set to full screen forced */ + mode = PLAYER_DISPLAY_MODE_FULL_SCREEN; - r = player_set_display_mode(mgr->player, mode); + r = player_set_display_mode(m->player, mode); if (r != PLAYER_ERROR_NONE) { _ERR("Player display mode set error"); - return -1; + return false; } - mgr->display_mode = value; + m->display_mode = value; - return 0; + return true; } -int playermgr_set_completed_cb(struct playermgr *mgr, - player_completed_cb cb, void *data) +bool CPlayer::SetCompletedCb(player_completed_cb cb, void *data) { - int r; + ASSERT(m); + ASSERT(m->player); - if (!mgr || !mgr->player) { - _ERR("invalid parameter"); - return -1; - } + int r; - r = player_set_completed_cb(mgr->player, cb, data); + r = player_set_completed_cb(m->player, cb, data); if (r != PLAYER_ERROR_NONE) { _ERR("Player set completed cb error"); - return -1; + return false; } - return 0; + return true; } -void playermgr_get_play_count(struct playermgr *mgr, char *str, int len) +int CPlayer::GetTotal(void) { - if (!mgr) { - _ERR("invalid parameter"); - return; - } + ASSERT(m); + + return m->total; +} - snprintf(str, len, "%d/%d", mgr->current + 1, mgr->total); +int CPlayer::GetCurrent(void) +{ + ASSERT(m); + + return m->current; } -static Eina_Bool _ffrew_timer_cb(void *dt) +Eina_Bool CPlayer::sm_CbFFRew(void *dt) { - struct playermgr *mgr; + CPlayer *p; + SPlayerData *m; int pos; - int r; if (!dt) return ECORE_CALLBACK_CANCEL; - mgr = (struct playermgr *)dt; + p = (CPlayer *)dt; + m = p->m; - if (!mgr->player) + ASSERT(m); + + if (!m->player) return ECORE_CALLBACK_CANCEL; - playermgr_get_position(mgr, &pos); + p->GetPosition(&pos); - if (mgr->ff_speed) { - pos = pos + _speed[mgr->ff_speed]; - if (pos > mgr->duration) - pos = mgr->duration; - } else if (mgr->rew_speed) { - pos = pos - _speed[mgr->rew_speed]; + if (m->ff_speed) { + pos = pos + _speed[m->ff_speed]; + if (pos > m->duration) + pos = m->duration; + } else if (m->rew_speed) { + pos = pos - _speed[m->rew_speed]; if (pos < 0) pos = 0; - } else { - r = playermgr_resume(mgr); - if (r < 0) - return ECORE_CALLBACK_RENEW; - - return ECORE_CALLBACK_CANCEL; } - playermgr_set_position(mgr, pos, NULL, NULL); + p->SetPosition(pos, NULL, NULL); - if (mgr->rew_speed && pos <= 0) { - mgr->rew_speed = SPEED_MIN; + if (m->rew_speed && pos <= 0) { + m->rew_speed = SPEED_MIN; return ECORE_CALLBACK_CANCEL; } - if (mgr->ff_speed && pos >= mgr->duration) { - mgr->ff_speed = SPEED_MIN; + if (m->ff_speed && pos >= m->duration) { + m->ff_speed = SPEED_MIN; return ECORE_CALLBACK_CANCEL; } - if (ecore_timer_interval_get(mgr->ffrew_timer) != TIME_INTERVAL) - ecore_timer_interval_set(mgr->ffrew_timer, TIME_INTERVAL); + if (ecore_timer_interval_get(m->ffrew_timer) != TIME_INTERVAL) + ecore_timer_interval_set(m->ffrew_timer, TIME_INTERVAL); return ECORE_CALLBACK_RENEW; } -static void _start_ffrew_timer(struct playermgr *mgr) +void CPlayer::m_StartFFRew(void) { - playermgr_pause(mgr); + Pause(); - if (!mgr->ffrew_timer) { - mgr->ffrew_timer = ecore_timer_add(0.0, - _ffrew_timer_cb, mgr); - if (!mgr->ffrew_timer) - return; + if (!m->ffrew_timer) { + m->ffrew_timer = ecore_timer_add(0.0, sm_CbFFRew, this); } else { - ecore_timer_interval_set(mgr->ffrew_timer, 0.0); - ecore_timer_reset(mgr->ffrew_timer); + ecore_timer_interval_set(m->ffrew_timer, 0.0); + ecore_timer_reset(m->ffrew_timer); } } -int playermgr_set_ff(struct playermgr *mgr, int duration) +bool CPlayer::SetFF(int duration) { - int r; + ASSERT(m); - if (!mgr) { - _ERR("invalid parameter"); - return -1; - } + bool r; - r = 0; - mgr->duration = duration; - mgr->rew_speed = SPEED_MIN; + m->duration = duration; + m->rew_speed = SPEED_MIN; - if (mgr->ff_speed == SPEED_MAX) - return r; + if (m->ff_speed == SPEED_MAX) + return false; - if (mgr->ff_speed == SPEED_MIN) { - _start_ffrew_timer(mgr); - r = 1; + r = false; + if (m->ff_speed == SPEED_MIN) { + m_StartFFRew(); + r = true; } - mgr->ff_speed++; + m->ff_speed++; return r; } -int playermgr_set_rew(struct playermgr *mgr, int duration) +bool CPlayer::SetRew(int duration) { - int r; + ASSERT(m); - if (!mgr) { - _ERR("invalid parameter"); - return -1; - } + bool r; - r = 0; - mgr->duration = duration; - mgr->ff_speed = SPEED_MIN; + m->duration = duration; + m->ff_speed = SPEED_MIN; - if (mgr->rew_speed == SPEED_MAX) - return r; + if (m->rew_speed == SPEED_MAX) + return false; - if (mgr->rew_speed == SPEED_MIN) { - _start_ffrew_timer(mgr); - r = 1; + r = false; + if (m->rew_speed == SPEED_MIN) { + m_StartFFRew(); + r = true; } - mgr->rew_speed++; + m->rew_speed++; return r; } -bool playermgr_get_ffrew(struct playermgr *mgr) +bool CPlayer::GetFFRew(void) { - if (mgr->ff_speed || mgr->rew_speed) + ASSERT(m); + + if (m->ff_speed || m->rew_speed) return true; return false; } -void playermgr_stop_ffrew(struct playermgr *mgr) +void CPlayer::StopFFRew(void) { - if (!mgr) - _ERR("invalid parameter"); + ASSERT(m); - mgr->ff_speed = SPEED_MIN; - mgr->rew_speed = SPEED_MIN; + m->ff_speed = SPEED_MIN; + m->rew_speed = SPEED_MIN; - if (mgr->ffrew_timer) { - ecore_timer_del(mgr->ffrew_timer); - mgr->ffrew_timer = NULL; - } + ecore_timer_del(m->ffrew_timer); + m->ffrew_timer = NULL; } diff --git a/src/slider.cpp b/src/slider.cpp index 9355c14..cabacdb 100644 --- a/src/slider.cpp +++ b/src/slider.cpp @@ -34,7 +34,7 @@ struct SSliderData { Evas_Object *base; Evas_Object *slider; Ecore_Timer *timer; - struct playermgr *player; + CPlayer *player; }; static void _get_timestr(char *str, int size, unsigned int ms) @@ -51,7 +51,8 @@ static void _slider_seek_completed(void *dt) { SSliderData *data; char str[32]; - int pos, r; + int pos; + bool r; update_action action; if (!dt) @@ -59,8 +60,8 @@ static void _slider_seek_completed(void *dt) data = (SSliderData *)dt; - r = playermgr_get_position(data->player, &pos); - if (r < 0) { + r = data->player->GetPosition(&pos); + if (!r) { _ERR("Get Position Failed"); return; } @@ -75,7 +76,8 @@ static void _slider_seek_completed(void *dt) Eina_Bool CVideoSlider::sm_CbTimer(void *dt) { SSliderData *data; - int pos, r; + int pos; + bool r; char str[32]; if (!dt) @@ -86,8 +88,8 @@ Eina_Bool CVideoSlider::sm_CbTimer(void *dt) if (!data->player) goto error; - r = playermgr_get_position(data->player, &pos); - if (r < 0) + r = data->player->GetPosition(&pos); + if (!r) goto error; elm_slider_value_set(data->slider, pos); @@ -146,7 +148,7 @@ void CVideoSlider::Reset(int duration, int position) elm_object_part_text_set(m->base, PART_TOTALTIME_TEXT, str); } -bool CVideoSlider::Create(Evas_Object *base, playermgr *player) +bool CVideoSlider::Create(Evas_Object *base, CPlayer *player) { ASSERT(!m); @@ -215,7 +217,7 @@ void CVideoSlider::OnMouseUp(int id, Evas *e, Evas_Object *obj, int v; v = elm_slider_value_get(obj); - playermgr_set_position(m->player, v, _slider_seek_completed, m); + m->player->SetPosition(v, _slider_seek_completed, m); } void CVideoSlider::OnMouseMove(int id, Evas *e, Evas_Object *obj, diff --git a/src/view_player.cpp b/src/view_player.cpp index ea54b44..20c303a 100644 --- a/src/view_player.cpp +++ b/src/view_player.cpp @@ -47,6 +47,7 @@ /* Workaround */ #define KEY_VOLUMEUP_REMOTE "XF86AudioRaiseVolume" #define KEY_VOLUMEDOWN_REMOTE "XF86AudioLowerVolume" +#define KEY_MUTE_REMOTE "XF86AudioMute" static const char *_control_name[] = { "prev", @@ -64,8 +65,7 @@ struct SPlayerView { Evas_Object *base; char *id; - playermgr *player; - + CPlayer *player; CVolume *volume; CVideoController *control; CVideoSlider *slider; @@ -129,7 +129,8 @@ void CPlayerView::m_UpdateInfoBar(void) elm_object_part_text_set(m->base, PART_SOURCETEXT, _(source)); /* Playlist Count */ - playermgr_get_play_count(m->player, buf, sizeof(buf)); + snprintf(buf, sizeof(buf), "%d/%d", + m->player->GetCurrent() + 1, m->player->GetTotal()); elm_object_part_text_set(m->base, PART_CURRENTTEXT, buf); /* Resolution */ @@ -145,13 +146,13 @@ void CPlayerView::m_UpdateInfoBar(void) bool CPlayerView::m_PlayerInit(void) { const char *path; - int r; + bool r; - r = playermgr_play_video(m->player); + r = m->player->Play(); if (r < 0) return false; - path = playermgr_get_video_path(m->player); + path = m->player->GetPath(); m->mediadata->Create(path); m_UpdateInfoBar(); @@ -171,14 +172,14 @@ bool CPlayerView::m_PlayerInit(void) void CPlayerView::sm_EvtRewindBtn(void *dt) { SPlayerView *data; - int r; + bool r; if (!dt) return; data = (SPlayerView *)dt; - r = playermgr_set_rew(data->player, data->duration); + r = data->player->SetRew(data->duration); if (r > 0) { data->slider->Pause(); @@ -189,14 +190,14 @@ void CPlayerView::sm_EvtRewindBtn(void *dt) void CPlayerView::sm_EvtForwardBtn(void *dt) { SPlayerView *data; - int r; + bool r; if (!dt) return; data = (SPlayerView *)dt; - r = playermgr_set_ff(data->player, data->duration); + r = data->player->SetFF(data->duration); if (r > 0) { data->slider->Pause(); @@ -214,8 +215,8 @@ void CPlayerView::sm_EvtPrevBtn(void *dt) data = (SPlayerView *)dt; - playermgr_stop_ffrew(data->player); - playermgr_set_prev_video(data->player); + data->player->StopFFRew(); + data->player->Prev(); action = ACTION_INIT; CViewMgr::GetInstance()->UpdateView(data->id, (void *)&action); @@ -231,8 +232,8 @@ void CPlayerView::sm_EvtNextBtn(void *dt) data = (SPlayerView *)dt; - playermgr_stop_ffrew(data->player); - playermgr_set_next_video(data->player, EINA_TRUE); + data->player->StopFFRew(); + data->player->Next(true); action = ACTION_INIT; CViewMgr::GetInstance()->UpdateView(data->id, (void *)&action); @@ -266,32 +267,32 @@ void CPlayerView::sm_EvtPlayBtn(void *dt) { SPlayerView *data; player_state_e state; - int r; + bool r; if (!dt) return; data = (SPlayerView *)dt; - if (playermgr_get_ffrew(data->player)) { - playermgr_stop_ffrew(data->player); - playermgr_resume(data->player); + if (data->player->GetFFRew()) { + data->player->StopFFRew(); + data->player->Resume(); data->slider->Resume(); return; } - r = playermgr_get_state(data->player, &state); - if (r < 0) + r = data->player->GetState(&state); + if (!r) return; switch (state) { case PLAYER_STATE_PLAYING: - playermgr_pause(data->player); + data->player->Pause(); data->slider->Pause(); break; case PLAYER_STATE_PAUSED: - playermgr_resume(data->player); + data->player->Resume(); data->slider->Resume(); break; default: @@ -327,7 +328,7 @@ void CPlayerView::sm_CbPlayComplete(void *dt) { SPlayerView *data; update_action action; - Eina_Bool r; + bool r; if (!dt) return; @@ -335,10 +336,8 @@ void CPlayerView::sm_CbPlayComplete(void *dt) data = (SPlayerView *)dt; r = EINA_TRUE; - if (data->repeat == E_REPEAT_NONE) - r = playermgr_set_next_video(data->player, EINA_FALSE); - else if (data->repeat == E_REPEAT_ALL) - r = playermgr_set_next_video(data->player, EINA_TRUE); + if (data->repeat != E_REPEAT_ONE) + r = data->player->Next(!data->repeat); if (!r) { elm_exit(); @@ -451,7 +450,8 @@ void CPlayerView::sm_CbEcoreEvent(void *dt, int type, void *ei) else if (!strcmp(ev->keyname, KEY_VOLUMEDOWN) || !strcmp(ev->keyname, KEY_VOLUMEDOWN_REMOTE)) sm_EvtVolume(data, E_VOLUME_DOWN); - else if (!strcmp(ev->keyname, KEY_MUTE)) + else if (!strcmp(ev->keyname, KEY_MUTE) || + !strcmp(ev->keyname, KEY_MUTE_REMOTE)) sm_EvtVolume(data, E_VOLUME_MUTE); else update = true; @@ -513,6 +513,8 @@ Eina_Bool CPlayerView::sm_CbDrawAnimation(void *dt) void CPlayerView::m_ControlInit(SPlayerParam *param) { + bool r; + m->mediadata = new CMediaData; if (!m->mediadata) _ERR("mediadata init failed"); @@ -520,10 +522,14 @@ void CPlayerView::m_ControlInit(SPlayerParam *param) if (param->id) m->id = strdup(param->id); - m->player = playermgr_init(m->win, param->filepath, param->playlist); + m->player = new CPlayer; if (!m->player) _ERR("player init failed"); + r = m->player->Create(m->win, param->filepath, param->playlist); + if (!r) + _ERR("player creation failed"); + m->control = new CVideoController; if (!m->control) _ERR("control init failed"); @@ -603,7 +609,7 @@ bool CPlayerView::Create(void *data) goto err; } - playermgr_set_completed_cb(m->player, sm_CbPlayComplete, m); + m->player->SetCompletedCb(sm_CbPlayComplete, m); elm_object_signal_callback_add(m->base, "show,view,finish", "", sm_CbShowViewFinish, m); @@ -625,14 +631,14 @@ err: void CPlayerView::m_Fini(void) { - if (m->drawanim_timer) - ecore_timer_del(m->drawanim_timer); + ecore_timer_del(m->drawanim_timer); m->drawanim_timer = NULL; delete m->mediadata; m->mediadata = NULL; - playermgr_fini(m->player); + m->player->Destroy(); + delete m->player; m->player = NULL; timeout_handler_fini(m->timeout_handle); @@ -707,11 +713,11 @@ void CPlayerView::t_OnUpdate(void *dt) m_ShowBar(); break; case ACTION_RESUME: - playermgr_resume(m->player); + m->player->Resume(); m->slider->Resume(); break; case ACTION_PAUSE: - playermgr_pause(m->player); + m->player->Pause(); m->slider->Pause(); break; case ACTION_INIT: -- 2.7.4 From 0561f835e9139e57ef2bbd5ee6b011168bb13b11 Mon Sep 17 00:00:00 2001 From: Minkyu Kang Date: Wed, 8 Apr 2015 21:22:55 +0900 Subject: [PATCH 12/16] codes cleanup remove unused codes remove unnecessary exception check codes Change-Id: I4452ca2eaab29a2984394efa50b39b4d087a1969 Signed-off-by: Minkyu Kang --- include/slider.h | 3 --- include/view_player.h | 1 - src/control.cpp | 7 ++----- src/main.cpp | 16 +++++----------- src/slider.cpp | 24 ++++-------------------- src/timeout_handler.cpp | 6 ++---- src/view_player.cpp | 5 ----- src/volume.cpp | 6 ++---- 8 files changed, 15 insertions(+), 53 deletions(-) diff --git a/include/slider.h b/include/slider.h index a4f9416..7dc00fd 100644 --- a/include/slider.h +++ b/include/slider.h @@ -31,9 +31,6 @@ private: SSliderData *m; private: - void m_SetTimer(void); - -private: static Eina_Bool sm_CbTimer(void *dt); public: diff --git a/include/view_player.h b/include/view_player.h index 49586ee..1a3b2f3 100644 --- a/include/view_player.h +++ b/include/view_player.h @@ -68,7 +68,6 @@ private: protected: virtual void t_OnShow(void); - virtual void t_OnHide(void); virtual void t_OnPause(void); virtual void t_OnUpdate(void *dt); diff --git a/src/control.cpp b/src/control.cpp index c87ce16..583ca56 100644 --- a/src/control.cpp +++ b/src/control.cpp @@ -97,17 +97,14 @@ int CVideoController::m_AddControls(const char **btns, int count) { ASSERT(m); - int i, j; + int i; char buf[32]; for (i = 0; i < count; i++) { snprintf(buf, sizeof(buf), "video_btn_%s", btns[i]); m->btn[i] = m_AddButton(buf); - if (!m->btn[i]) { - for (j = 0; j < i; j++) - m->btn[j] = NULL; + if (!m->btn[i]) return -1; - } snprintf(buf, sizeof(buf), "part_btn%d", i); elm_object_part_content_set(m->base, diff --git a/src/main.cpp b/src/main.cpp index 40b741c..2fe1715 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -182,21 +182,15 @@ void CVideoPlayerApp::OnAppControl(app_control_h app_control) m_pPlayerView = new CPlayerView(VIEW_ID_PLAYER); m_pVmgr->AddView(m_pPlayerView); - if (!m_pVmgr->PushView(VIEW_ID_PLAYER, ¶m)) { - _ERR("View push failed"); + r = m_pVmgr->PushView(VIEW_ID_PLAYER, ¶m); - CViewMgr::Finalize(); - m_pVmgr = NULL; - - free(uri); - free(playlist); + free(uri); + free(playlist); + if (!r) { + _ERR("View push failed"); elm_exit(); - return; } - - free(uri); - free(playlist); } int CVideoPlayerApp::Run(int argc, char **argv) diff --git a/src/slider.cpp b/src/slider.cpp index cabacdb..f74e554 100644 --- a/src/slider.cpp +++ b/src/slider.cpp @@ -105,16 +105,6 @@ error: return ECORE_CALLBACK_CANCEL; } -void CVideoSlider::m_SetTimer(void) -{ - ASSERT(m); - - if (m->timer) - ecore_timer_reset(m->timer); - else - m->timer = ecore_timer_add(TIME_INTERVAL, sm_CbTimer, m); -} - void CVideoSlider::Pause(void) { ASSERT(m); @@ -151,14 +141,11 @@ void CVideoSlider::Reset(int duration, int position) bool CVideoSlider::Create(Evas_Object *base, CPlayer *player) { ASSERT(!m); + ASSERT(base); + ASSERT(player); Evas_Object *slider; - if (!base) { - _ERR("invalid parameter"); - return false; - } - m = new SSliderData; if (!m) { _ERR("failed to add slider"); @@ -186,16 +173,13 @@ bool CVideoSlider::Create(Evas_Object *base, CPlayer *player) m->slider = slider; m->player = player; - if (player) - m_SetTimer(); - else - elm_object_focus_allow_set(slider, EINA_FALSE); - return true; } void CVideoSlider::Destroy(void) { + ASSERT(m); + ecore_timer_del(m->timer); delete m; diff --git a/src/timeout_handler.cpp b/src/timeout_handler.cpp index 3d8305a..bdac234 100644 --- a/src/timeout_handler.cpp +++ b/src/timeout_handler.cpp @@ -143,10 +143,8 @@ void timeout_handler_fini(struct timeout_handler *handle) ecore_event_handler_del(event_handler); } - if (handle->timer) { - ecore_timer_del(handle->timer); - handle->timer = NULL; - } + ecore_timer_del(handle->timer); + handle->timer = NULL; free(handle); } diff --git a/src/view_player.cpp b/src/view_player.cpp index 20c303a..a5e73c7 100644 --- a/src/view_player.cpp +++ b/src/view_player.cpp @@ -686,11 +686,6 @@ void CPlayerView::t_OnShow(void) evas_object_show(m->base); } -void CPlayerView::t_OnHide(void) -{ - evas_object_hide(m->base); -} - void CPlayerView::t_OnPause(void) { elm_exit(); diff --git a/src/volume.cpp b/src/volume.cpp index 2ac0fc0..6064006 100644 --- a/src/volume.cpp +++ b/src/volume.cpp @@ -149,10 +149,8 @@ void CVolume::Hide(void) evas_object_hide(m->ly); - if (m->timer) { - ecore_timer_del(m->timer); - m->timer = NULL; - } + ecore_timer_del(m->timer); + m->timer = NULL; } bool CVolume::Create(Evas_Object *base) -- 2.7.4 From 50fcc43a08be2f378cccf6ac19848e15c4409249 Mon Sep 17 00:00:00 2001 From: Minkyu Kang Date: Thu, 9 Apr 2015 11:20:49 +0900 Subject: [PATCH 13/16] set the media path when getting correct path Change-Id: I42df6d047d9ee050c82f8cf7ab40c65da811a798 Signed-off-by: Minkyu Kang --- src/view_player.cpp | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/view_player.cpp b/src/view_player.cpp index a5e73c7..11db253 100644 --- a/src/view_player.cpp +++ b/src/view_player.cpp @@ -99,6 +99,7 @@ void CPlayerView::m_UpdateInfoBar(void) { const char *name; const char *source; + const char *path; char buf[32]; time_t video_time; struct tm tm; @@ -122,11 +123,14 @@ void CPlayerView::m_UpdateInfoBar(void) /* Source */ /* FIXME: when usb path is decided, this logic should be changed */ - if (!strncmp(m->mediadata->GetPath(), SOURCE_TV_PATH, SOURCE_PATH_LEN)) - source = SOURCE_TV; - else - source = SOURCE_USB; - elm_object_part_text_set(m->base, PART_SOURCETEXT, _(source)); + path = m->mediadata->GetPath(); + if (path) { + if (!strncmp(path, SOURCE_TV_PATH, SOURCE_PATH_LEN)) + source = SOURCE_TV; + else + source = SOURCE_USB; + elm_object_part_text_set(m->base, PART_SOURCETEXT, _(source)); + } /* Playlist Count */ snprintf(buf, sizeof(buf), "%d/%d", -- 2.7.4 From 66b1b4fc899fbb4b4dbfc46fe5e11bb4b2ec1e30 Mon Sep 17 00:00:00 2001 From: Minkyu Kang Date: Fri, 10 Apr 2015 16:29:51 +0900 Subject: [PATCH 14/16] remove KEY definitions Change-Id: I9139294a29c487731161aa8c63785df3d2357231 Signed-off-by: Minkyu Kang --- include/define.h | 5 ----- src/view_player.cpp | 5 ----- 2 files changed, 10 deletions(-) diff --git a/include/define.h b/include/define.h index 1ce067a..19ee97d 100644 --- a/include/define.h +++ b/include/define.h @@ -14,11 +14,6 @@ * limitations under the License. */ -/* Key definitions */ -#define KEY_VOLUMEUP "F9" -#define KEY_VOLUMEDOWN "F10" -#define KEY_MUTE "Mute" - /* View definitions */ #define VIEW_ID_PLAYER "VIEW_PLAYER" diff --git a/src/view_player.cpp b/src/view_player.cpp index 11db253..fe1034b 100644 --- a/src/view_player.cpp +++ b/src/view_player.cpp @@ -44,11 +44,6 @@ #define CONTROL_BTNS 6 -/* Workaround */ -#define KEY_VOLUMEUP_REMOTE "XF86AudioRaiseVolume" -#define KEY_VOLUMEDOWN_REMOTE "XF86AudioLowerVolume" -#define KEY_MUTE_REMOTE "XF86AudioMute" - static const char *_control_name[] = { "prev", "rew", -- 2.7.4 From ba7e9035540410767737e93a11f974065c89b3f2 Mon Sep 17 00:00:00 2001 From: Minkyu Kang Date: Fri, 10 Apr 2015 21:12:31 +0900 Subject: [PATCH 15/16] mediadata: don't use mediadata when failed to create Change-Id: Idc3f956c18cfe065096bb94e74eed01f6a9937ac Signed-off-by: Minkyu Kang --- src/view_player.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/view_player.cpp b/src/view_player.cpp index fe1034b..b371223 100644 --- a/src/view_player.cpp +++ b/src/view_player.cpp @@ -153,9 +153,11 @@ bool CPlayerView::m_PlayerInit(void) path = m->player->GetPath(); - m->mediadata->Create(path); - m_UpdateInfoBar(); - m->mediadata->Destroy(); + r = m->mediadata->Create(path); + if (r) { + m_UpdateInfoBar(); + m->mediadata->Destroy(); + } m->slider->Reset(m->duration, m->position); m->control->Signal(E_PLAYPAUSE_BTN, SIG_SET_PAUSE, ""); -- 2.7.4 From ecb92cf4e78320c57e401bd67956cf3c598c83fc Mon Sep 17 00:00:00 2001 From: Minkyu Kang Date: Mon, 13 Apr 2015 21:23:14 +0900 Subject: [PATCH 16/16] slider: add key up/down handlers for seek from slider bar using keys Change-Id: Ic8840a595dd83738f467d3e0130660aeb44466f8 Signed-off-by: Minkyu Kang --- include/slider.h | 13 ++++++++++++ src/playermgr.cpp | 12 +++++++++++ src/slider.cpp | 57 ++++++++++++++++++++++++++++++++++++++++++++--------- src/view_player.cpp | 4 ++++ 4 files changed, 77 insertions(+), 9 deletions(-) diff --git a/include/slider.h b/include/slider.h index 7dc00fd..f338b0b 100644 --- a/include/slider.h +++ b/include/slider.h @@ -21,6 +21,8 @@ struct SSliderData; class CVideoSlider : public CListenerMgr, + public IKeyDownListener, + public IKeyUpListener, public IMouseMoveListener, public IMouseDownListener, public IMouseUpListener, @@ -31,10 +33,17 @@ private: SSliderData *m; private: + void m_SeekStart(Evas_Object *obj); + void m_SeekEnd(Evas_Object *obj); + +private: static Eina_Bool sm_CbTimer(void *dt); + static void sm_SeekCb(void *dt); public: CVideoSlider(void) : + IKeyDownListener(this), + IKeyUpListener(this), IMouseMoveListener(this), IMouseDownListener(this), IMouseUpListener(this), @@ -76,6 +85,10 @@ public: void Pause(void); /* Listeners */ + virtual void OnKeyDown(int id, Evas *e, Evas_Object *obj, + Evas_Event_Key_Down *ev); + virtual void OnKeyUp(int id, Evas *e, Evas_Object *obj, + Evas_Event_Key_Up *ev); virtual void OnMouseMove(int id, Evas *e, Evas_Object *obj, Evas_Event_Mouse_Move *ev); virtual void OnMouseDown(int id, Evas *e, Evas_Object *obj, diff --git a/src/playermgr.cpp b/src/playermgr.cpp index 3609aad..b18aab2 100644 --- a/src/playermgr.cpp +++ b/src/playermgr.cpp @@ -278,9 +278,15 @@ const char *CPlayer::GetPath(void) bool CPlayer::Pause(void) { + player_state_e state; + ASSERT(m); ASSERT(m->player); + GetState(&state); + if (state == PLAYER_STATE_PAUSED) + return true; + if (player_pause(m->player) != PLAYER_ERROR_NONE) { _ERR("Player pause error"); return false; @@ -291,9 +297,15 @@ bool CPlayer::Pause(void) bool CPlayer::Resume(void) { + player_state_e state; + ASSERT(m); ASSERT(m->player); + GetState(&state); + if (state == PLAYER_STATE_PLAYING) + return true; + if (player_start(m->player) != PLAYER_ERROR_NONE) { _ERR("Player resume error"); return false; diff --git a/src/slider.cpp b/src/slider.cpp index f74e554..c4f44d0 100644 --- a/src/slider.cpp +++ b/src/slider.cpp @@ -28,7 +28,8 @@ #define TIME_STR_START "00:00:00" #define TIME_INTERVAL 0.1 -#define SLIDER_STEP 0.05 +#define SLIDER_DEFAULT 0.05 +#define SLIDER_STEP 0.03 struct SSliderData { Evas_Object *base; @@ -47,7 +48,7 @@ static void _get_timestr(char *str, int size, unsigned int ms) sec / 3600, (sec % 3600) / 60, sec % 60); } -static void _slider_seek_completed(void *dt) +void CVideoSlider::sm_SeekCb(void *dt) { SSliderData *data; char str[32]; @@ -132,6 +133,7 @@ void CVideoSlider::Reset(int duration, int position) elm_slider_value_set(m->slider, position); elm_slider_min_max_set(m->slider, 0, duration); + elm_slider_step_set(m->slider, SLIDER_STEP); _get_timestr(str, sizeof(str), duration); elm_object_part_text_set(m->base, PART_CURTIME_TEXT, TIME_STR_START); @@ -162,9 +164,10 @@ bool CVideoSlider::Create(Evas_Object *base, CPlayer *player) elm_slider_indicator_show_on_focus_set(slider, EINA_FALSE); elm_object_style_set(slider, STYLE_SLIDER); elm_slider_horizontal_set(slider, EINA_TRUE); - elm_slider_step_set(slider, SLIDER_STEP); + elm_slider_step_set(slider, SLIDER_DEFAULT); - Connect(slider, -1, TYPE_MOUSE_MOVE | TYPE_MOUSE_DOWN | TYPE_MOUSE_UP | + Connect(slider, -1, TYPE_KEY_DOWN | TYPE_KEY_UP | + TYPE_MOUSE_MOVE | TYPE_MOUSE_DOWN | TYPE_MOUSE_UP | TYPE_FOCUSED | TYPE_UNFOCUSED | TYPE_CHANGED); elm_object_part_content_set(base, PART_SLIDER, slider); @@ -186,8 +189,7 @@ void CVideoSlider::Destroy(void) m = NULL; } -void CVideoSlider::OnMouseDown(int id, Evas *e, Evas_Object *obj, - Evas_Event_Mouse_Down *ev) +void CVideoSlider::m_SeekStart(Evas_Object *obj) { update_action action; @@ -195,13 +197,44 @@ void CVideoSlider::OnMouseDown(int id, Evas *e, Evas_Object *obj, CViewMgr::GetInstance()->UpdateView(VIEW_ID_PLAYER, (void *)&action); } -void CVideoSlider::OnMouseUp(int id, Evas *e, Evas_Object *obj, - Evas_Event_Mouse_Up *ev) +void CVideoSlider::m_SeekEnd(Evas_Object *obj) { int v; v = elm_slider_value_get(obj); - m->player->SetPosition(v, _slider_seek_completed, m); + m->player->SetPosition(v, sm_SeekCb, m); +} + +void CVideoSlider::OnKeyDown(int id, Evas *e, Evas_Object *obj, + Evas_Event_Key_Down *ev) +{ + if (strcmp(ev->keyname, KEY_RIGHT) && + strcmp(ev->keyname, KEY_LEFT)) + return; + + m_SeekStart(obj); +} + +void CVideoSlider::OnKeyUp(int id, Evas *e, Evas_Object *obj, + Evas_Event_Key_Up *ev) +{ + if (strcmp(ev->keyname, KEY_RIGHT) && + strcmp(ev->keyname, KEY_LEFT)) + return; + + m_SeekEnd(obj); +} + +void CVideoSlider::OnMouseDown(int id, Evas *e, Evas_Object *obj, + Evas_Event_Mouse_Down *ev) +{ + m_SeekStart(obj); +} + +void CVideoSlider::OnMouseUp(int id, Evas *e, Evas_Object *obj, + Evas_Event_Mouse_Up *ev) +{ + m_SeekEnd(obj); } void CVideoSlider::OnMouseMove(int id, Evas *e, Evas_Object *obj, @@ -226,4 +259,10 @@ void CVideoSlider::OnUnfocused(int id, Evas_Object *obj, Elm_Object_Item *item) void CVideoSlider::OnChanged(int id, Evas_Object *obj) { + char str[32]; + int v; + + v = elm_slider_value_get(obj); + _get_timestr(str, sizeof(str), v); + elm_object_part_text_set(m->base, PART_CURTIME_TEXT, str); } diff --git a/src/view_player.cpp b/src/view_player.cpp index b371223..1537620 100644 --- a/src/view_player.cpp +++ b/src/view_player.cpp @@ -711,10 +711,14 @@ void CPlayerView::t_OnUpdate(void *dt) case ACTION_RESUME: m->player->Resume(); m->slider->Resume(); + m->control->Signal(E_PLAYPAUSE_BTN, SIG_SET_PAUSE, ""); + timeout_handler_reset(m->timeout_handle); break; case ACTION_PAUSE: m->player->Pause(); m->slider->Pause(); + m->control->Signal(E_PLAYPAUSE_BTN, SIG_SET_PLAY, ""); + timeout_handler_reset(m->timeout_handle); break; case ACTION_INIT: m_PlayerInit(); -- 2.7.4