#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)
{
}
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);
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);
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)
}
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;
ret = _rose_device_ctl_activate(handle->device_ctl_intf, cur_list->data);
if (ret)
LOGW("Error activate device control");
+
cur_list = cur_list->next;
}
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;
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;
}
ERROR:
- _RENDER_COND_SIGNAL(renderer);
-
+ if (!renderer->cond_signaled) {
+ renderer->cond_signaled = TRUE;
+ _RENDER_COND_SIGNAL(renderer);
+ }
return FALSE;
}
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);
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