Deactivate ducking after the activation is completed 36/260636/1
authorSuyeon Hwang <stom.hwang@samsung.com>
Thu, 3 Jun 2021 01:43:22 +0000 (10:43 +0900)
committerSuyeon Hwang <stom.hwang@samsung.com>
Wed, 30 Jun 2021 05:19:50 +0000 (05:19 +0000)
Change-Id: Iafaecc214467a4e4268b8daf56a0f9c5b9d2ab2b
Signed-off-by: Suyeon Hwang <stom.hwang@samsung.com>
(cherry picked from commit 3d554b32acd26b6c45bfee1903cb34107742e69b)

server/ttsd_player.c

index e065150..8f3ca34 100644 (file)
@@ -16,6 +16,7 @@
 #include <sound_manager.h>
 #include <sound_manager_internal.h>
 #include <pthread.h>
+#include <time.h>
 
 #include "ttsd_main.h"
 #include "ttsd_player.h"
@@ -95,6 +96,10 @@ static bool g_is_set_policy;
 
 #define SND_MGR_DUCKING_DURATION 500
 
+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;
 
 static double g_bg_volume_ratio;
@@ -415,6 +420,12 @@ static void __end_play_thread(void *data, Ecore_Thread *thread)
 
 static void __set_policy_for_playing(int volume)
 {
+       pthread_mutex_lock(&g_delayed_unset_policy_mutex);
+       if (NULL != g_delayed_unset_policy_timer) {
+               ecore_timer_del(g_delayed_unset_policy_timer);
+               g_delayed_unset_policy_timer = NULL;
+       }
+       pthread_mutex_unlock(&g_delayed_unset_policy_mutex);
 
        __change_background_volume();
 
@@ -444,11 +455,31 @@ static void __set_policy_for_playing(int volume)
 
        g_is_set_policy = true;
 
+       clock_gettime(CLOCK_MONOTONIC, &g_policy_set_time);
+
        SLOG(LOG_DEBUG, tts_tag(), "[Player DEBUG] set policy for playing");
 
        return;
 }
 
+static Eina_Bool __delay_unset_policy(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_unset(void* data)
+{
+       g_delayed_unset_policy_timer = ecore_timer_add(0.5, __delay_unset_policy, NULL);
+       SLOG(LOG_INFO, tts_tag(), "[BG] Delayed unset policy (%p)", g_delayed_unset_policy_timer);
+       return 0;
+}
+
 static void __unset_policy_for_playing()
 {
        int ret;
@@ -473,6 +504,24 @@ static void __unset_policy_for_playing()
                }
        }
 
+       struct timespec current_time;
+       clock_gettime(CLOCK_MONOTONIC, &current_time);
+
+       long long int diff = ((long long int)current_time.tv_sec - (long long int)g_policy_set_time.tv_sec) * 1000
+                       + ((long long int)current_time.tv_nsec - (long long int)g_policy_set_time.tv_nsec) / 1000000;
+       SLOG(LOG_INFO, tts_tag(), "[BG] Time Diff(%lld)", diff);
+
+       pthread_mutex_lock(&g_delayed_unset_policy_mutex);
+       if (NULL == g_delayed_unset_policy_timer) {
+               if (diff > SND_MGR_DUCKING_DURATION) {
+                       SLOG(LOG_INFO, tts_tag(), "[BG] Direct unset policy");
+                       __recover_background_volume();
+               } else {
+                       ecore_main_loop_thread_safe_call_sync(__set_timer_for_unset, NULL);
+               }
+       }
+       pthread_mutex_unlock(&g_delayed_unset_policy_mutex);
+
        __recover_background_volume();
 
        g_is_set_policy = false;