From: Suyeon Hwang Date: Fri, 24 Sep 2021 06:26:26 +0000 (+0900) Subject: Add and delete timer on main thread for safe handling X-Git-Tag: submit/fixVD/20210927.111930~1 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=refs%2Fchanges%2F36%2F264536%2F2;p=platform%2Fcore%2Fuifw%2Ftts.git Add and delete timer on main thread for safe handling Change-Id: I8eb75373d4c23d846fe8035bd6b9bc84f79c162c Signed-off-by: Suyeon Hwang --- diff --git a/server/ttsd_player.c b/server/ttsd_player.c index 2b60c956..25650e6d 100644 --- a/server/ttsd_player.c +++ b/server/ttsd_player.c @@ -53,6 +53,8 @@ typedef struct { #define SOUND_BUFFER_LENGTH 2048 #define FOCUS_SERVER_READY "/tmp/.sound_server_ready" +static const intptr_t CHECK_TIMER_DELETE = 1; + /* Sound buf save for test */ /* #define BUF_SAVE_MODE @@ -102,7 +104,6 @@ If you choose too big value, it may cause integer overflow issue. static struct timespec g_policy_set_time; static Ecore_Timer* g_delayed_unset_policy_timer = NULL; -static pthread_mutex_t g_delayed_unset_policy_mutex = PTHREAD_MUTEX_INITIALIZER; static int g_focus_watch_id = -1; @@ -422,14 +423,18 @@ static void __end_play_thread(void *data, Ecore_Thread *thread) #endif } -static void __set_policy_for_playing(int volume) +static void __del_timer_for_delayed_recover(void* data) { - pthread_mutex_lock(&g_delayed_unset_policy_mutex); if (NULL != g_delayed_unset_policy_timer) { - ecore_timer_del(g_delayed_unset_policy_timer); + int result = (intptr_t)ecore_timer_del(g_delayed_unset_policy_timer); g_delayed_unset_policy_timer = NULL; + SLOG(LOG_ERROR, tts_tag(), "[BG] Remove timer (%d)", result); } - pthread_mutex_unlock(&g_delayed_unset_policy_mutex); +} + +static void __set_policy_for_playing(int volume) +{ + ecore_main_loop_thread_safe_call_async(__del_timer_for_delayed_recover, NULL); /* Set stream info */ int ret; @@ -468,21 +473,11 @@ static void __set_policy_for_playing(int volume) static Eina_Bool __delay_recover_background_volume(void* data) { - pthread_mutex_lock(&g_delayed_unset_policy_mutex); __recover_background_volume(); - g_delayed_unset_policy_timer = NULL; - SLOG(LOG_INFO, tts_tag(), "[BG] Delayed unset policy success"); - pthread_mutex_unlock(&g_delayed_unset_policy_mutex); - return EINA_FALSE; -} -static void __set_timer_for_delay_recover(void* data) -{ - long long int diff = (intptr_t)data; - double delay = (double)(SND_MGR_DUCKING_DURATION - diff) / 1000.0; - g_delayed_unset_policy_timer = ecore_timer_add(delay, __delay_recover_background_volume, NULL); - SLOG(LOG_INFO, tts_tag(), "[BG] Delayed unset policy (%p), delay(%f)", g_delayed_unset_policy_timer, delay); + g_delayed_unset_policy_timer = NULL; + return EINA_FALSE; } static long long int __get_duration_from_last_volume_change() @@ -497,6 +492,23 @@ static long long int __get_duration_from_last_volume_change() return diff; } +static void __set_timer_for_delay_recover(void* data) +{ + if (NULL != g_delayed_unset_policy_timer) { + return; + } + + long long int diff = __get_duration_from_last_volume_change(); + if (diff > SND_MGR_DUCKING_DURATION) { + SLOG(LOG_INFO, tts_tag(), "[BG] Direct unset policy"); + __recover_background_volume(); + } else { + double delay = (double)(SND_MGR_DUCKING_DURATION - diff) / 1000.0; + g_delayed_unset_policy_timer = ecore_timer_add(delay, __delay_recover_background_volume, (void*)CHECK_TIMER_DELETE); + SLOG(LOG_INFO, tts_tag(), "[BG] Delayed unset policy (%p), delay(%f)", g_delayed_unset_policy_timer, delay); + } +} + static void __unset_policy_for_playing() { int ret; @@ -521,23 +533,10 @@ static void __unset_policy_for_playing() } } - pthread_mutex_lock(&g_delayed_unset_policy_mutex); - if (NULL == g_delayed_unset_policy_timer) { - long long int diff = __get_duration_from_last_volume_change(); - if (diff > SND_MGR_DUCKING_DURATION) { - SLOG(LOG_INFO, tts_tag(), "[BG] Direct unset policy"); - __recover_background_volume(); - } else { - intptr_t ptr_diff = diff; - ecore_main_loop_thread_safe_call_async(__set_timer_for_delay_recover, (void*)ptr_diff); - } - } - pthread_mutex_unlock(&g_delayed_unset_policy_mutex); + ecore_main_loop_thread_safe_call_async(__set_timer_for_delay_recover, NULL); g_is_set_policy = false; SLOG(LOG_ERROR, tts_tag(), "[BG] g_is_set_policy(%d)", g_is_set_policy); - - SLOG(LOG_DEBUG, tts_tag(), "[Player DEBUG] unset policy for playing"); return;