From: Gilbok Lee Date: Mon, 7 Oct 2019 08:58:50 +0000 (+0900) Subject: Use the loop for the cond_wait X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=refs%2Fheads%2Ftizen;p=platform%2Fcore%2Fapi%2Frose-tizen.git Use the loop for the cond_wait - cond_wait can be a spurious wakeup - cond_wait can be called after the signal Change-Id: I7025a52ba572d73f86db1fffbecdefd2dd4688ea --- diff --git a/include/rose_tizen_priv.h b/include/rose_tizen_priv.h index f8715f0..a10e4cc 100644 --- a/include/rose_tizen_priv.h +++ b/include/rose_tizen_priv.h @@ -127,6 +127,7 @@ do { \ typedef struct _rose_render { GMutex mutex; + gboolean cond_signaled; GCond cond; GMutex pause_mutex; diff --git a/packaging/capi-media-rose-tizen.spec b/packaging/capi-media-rose-tizen.spec index cda1417..b6c9d38 100644 --- a/packaging/capi-media-rose-tizen.spec +++ b/packaging/capi-media-rose-tizen.spec @@ -1,6 +1,6 @@ Name: capi-media-rose-tizen Summary: For RoSE(Representation Of Sensory Effect) APIs -Version: 0.0.7 +Version: 0.0.8 Release: 0 Group: Multimedia/API License: Apache-2.0 diff --git a/src/rose_tizen.c b/src/rose_tizen.c index dd5bbda..cb9efd0 100644 --- a/src/rose_tizen.c +++ b/src/rose_tizen.c @@ -19,13 +19,17 @@ #include "rose_tizen_priv.h" static gpointer _rose_render_thread(gpointer data); -static gint _wait_to_render(gpointer data); static gboolean _create_render_thread(rose_s *handle); static void _destroy_render_thread(rose_s *handle); + +static void _start_mplayer(rose_s *handle); + static gint64 _get_running_time(rose_render *renderer); static void _rose_apply_delay(rose_s *handle); -static void _start_mplayer(rose_s *handle); + +static gint _wait_render_timer(gpointer data); static guint _calc_wait_time(gint64 next_pts, gint64 cur_pts); +static void _wait_render_time_out(rose_s *handle, guint wait_time); int rose_create(rose_h *rose) { @@ -351,6 +355,7 @@ int rose_stop(rose_h rose) } renderer->cur_sem_list = NULL; renderer->last_sem_list = NULL; + renderer->cond_signaled = TRUE; _RENDER_COND_SIGNAL(renderer); if (renderer->mplayer_is_started) { ret = _rose_mplayer_stop(handle->mplayer_intf); @@ -384,6 +389,7 @@ int rose_pause(rose_h rose) g_source_remove(renderer->wait_timer); renderer->wait_timer = 0; } + renderer->cond_signaled = TRUE; _RENDER_COND_SIGNAL(renderer); if (renderer->mplayer_is_started) { ret = _rose_mplayer_pause(handle->mplayer_intf); @@ -508,9 +514,7 @@ static gpointer _rose_render_thread(gpointer data) if (cur_pts <= 0 && next_pts >= 0 && !renderer->mplayer_is_started) { wait_time = _calc_wait_time(0, cur_pts); LOGD("Need to mplayer start"); - LOGD("add wait timer %u ms", wait_time); - renderer->wait_timer = g_timeout_add(wait_time, (GSourceFunc)_wait_to_render, handle); - _RENDER_COND_WAIT(renderer); + _wait_render_time_out(handle, wait_time); _start_mplayer(handle); cur_pts = 0; if (renderer->thread_pause || renderer->thread_exit) @@ -518,10 +522,8 @@ static gpointer _rose_render_thread(gpointer data) } wait_time = _calc_wait_time(next_pts, cur_pts); - LOGD("add wait timer %u ms", wait_time); renderer->cur_sem_list = next_list; - renderer->wait_timer = g_timeout_add(wait_time, (GSourceFunc)_wait_to_render, handle); - _RENDER_COND_WAIT(renderer); + _wait_render_time_out(handle, wait_time); if (renderer->thread_pause || renderer->thread_exit) continue; @@ -534,6 +536,7 @@ static gpointer _rose_render_thread(gpointer data) ret = _rose_device_ctl_activate(handle->device_ctl_intf, cur_list->data); if (ret) LOGW("Error activate device control"); + cur_list = cur_list->next; } @@ -543,7 +546,7 @@ static gpointer _rose_render_thread(gpointer data) return NULL; } -static gint _wait_to_render(gpointer data) +static gint _wait_render_timer(gpointer data) { rose_s *handle = (rose_s *)data; gint64 render_time = 0; @@ -558,9 +561,7 @@ static gint _wait_to_render(gpointer data) sem = ROSE_GET_SEM(handle); renderer = ROSE_GET_RENDERER(handle); - LOGD("Called wait_render timer"); - g_usleep(1000); if (!renderer->mplayer_is_started) render_time = 0; @@ -575,8 +576,10 @@ static gint _wait_to_render(gpointer data) } ERROR: - _RENDER_COND_SIGNAL(renderer); - + if (!renderer->cond_signaled) { + renderer->cond_signaled = TRUE; + _RENDER_COND_SIGNAL(renderer); + } return FALSE; } @@ -626,6 +629,7 @@ static void _destroy_render_thread(rose_s *handle) g_source_remove(renderer->wait_timer); renderer->wait_timer = 0; } + renderer->cond_signaled = TRUE; _RENDER_COND_SIGNAL(renderer); _RENDER_PAUSE_COND_SIGNAL(renderer); g_thread_join(renderer->thread); @@ -700,5 +704,18 @@ static guint _calc_wait_time(gint64 next_pts, gint64 cur_pts) if ((next_pts - cur_pts - DEFAULT_CHECK_TIME_MS) > 0) wait_time = next_pts - cur_pts - DEFAULT_CHECK_TIME_MS; + LOGD("add wait timer %u ms", wait_time); return wait_time; } + +static void _wait_render_time_out(rose_s *handle, guint wait_time) +{ + ROSE_CHECK_NULL_VOID(handle); + rose_render *renderer = ROSE_GET_RENDERER(handle); + ROSE_CHECK_NULL_VOID(renderer); + + renderer->cond_signaled = FALSE; + renderer->wait_timer = g_timeout_add(wait_time, (GSourceFunc)_wait_render_timer, handle); + while (!renderer->cond_signaled) + _RENDER_COND_WAIT(renderer); +} \ No newline at end of file diff --git a/src/rose_tizen_sem_parse.c b/src/rose_tizen_sem_parse.c index 485b66e..fac6f82 100644 --- a/src/rose_tizen_sem_parse.c +++ b/src/rose_tizen_sem_parse.c @@ -377,7 +377,8 @@ static gboolean _parse_effect_base_attr(xmlNode *node, rose_sem_base_attr **attr static void _save_effect_base_attr(rose_sem_effect_elements *effect, rose_sem_base_attr *attr) { - ROSE_CHECK_NULL_VOID(effect && attr); + ROSE_CHECK_NULL_VOID(effect); + ROSE_CHECK_NULL_VOID(attr); if (!effect->base_attr) { LOGD("copy parent base attr"); @@ -413,7 +414,8 @@ static void _save_effect_base_attr(rose_sem_effect_elements *effect, rose_sem_ba static void _save_si_attr(rose_sem_effect_elements *effect, rose_sem_si_attr *attr) { - ROSE_CHECK_NULL_VOID(effect && attr); + ROSE_CHECK_NULL_VOID(effect); + ROSE_CHECK_NULL_VOID(attr); if (!effect->si_attr) { LOGD("copy parent si attr"); diff --git a/test/rose_tizen_test.c b/test/rose_tizen_test.c index ac229c3..d7c86de 100644 --- a/test/rose_tizen_test.c +++ b/test/rose_tizen_test.c @@ -277,6 +277,7 @@ int test_rose_destroy() int ret = 0; LOGD("test_rose_destroy"); ret = rose_destroy(rose); + rose = NULL; return ret; } @@ -420,6 +421,12 @@ void _interpret_main_menu(char *cmd) test_rose_destroy(); } else if (strncmp(cmd, "ds", 2) == 0) { g_menu_state = CURRENT_STATUS_DISPLAY_SURFACE_CHANGE; + } else if (strncmp(cmd, "aa", 2) == 0) { + test_rose_create(); + test_rose_set_media_path("/home/owner/e.mp4"); + test_rose_set_sem_path("/home/owner/e.xml"); + test_rose_set_control_info_path("/home/owner/c.xml"); + test_rose_prepare(); } } return;