Recover background volume when engine is terminated 99/263199/1
authorSuyeon Hwang <stom.hwang@samsung.com>
Fri, 27 Aug 2021 11:15:38 +0000 (20:15 +0900)
committerSuyeon Hwang <stom.hwang@samsung.com>
Fri, 27 Aug 2021 11:15:38 +0000 (20:15 +0900)
Change-Id: I2d3ba1f1e26cf2e797ffd62c99addd3a62025dcb
Signed-off-by: Suyeon Hwang <stom.hwang@samsung.com>
server/ttsd_player.c

index fbb8bd6..bc03d13 100644 (file)
@@ -485,6 +485,18 @@ static void __set_timer_for_delay_recover(void* data)
        SLOG(LOG_INFO, tts_tag(), "[BG] Delayed unset policy (%p), delay(%f)", g_delayed_unset_policy_timer, delay);
 }
 
+static long long int __get_duration_from_last_volume_change()
+{
+       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);
+
+       return diff;
+}
+
 static void __unset_policy_for_playing()
 {
        int ret;
@@ -509,15 +521,9 @@ 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) {
+               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();
@@ -1111,45 +1117,39 @@ int ttsd_player_init()
        return 0;
 }
 
-int __destroy_ducking_handle(void)
+static void __destroy_all_ducking_handles()
 {
+       SLOG(LOG_INFO, tts_tag(), "[Player] Destroy stream ducking");
+       if (__get_duration_from_last_volume_change() <= SND_MGR_DUCKING_DURATION) {
+               usleep(500000);
+       }
+
+       __recover_background_volume();
+
        int ret = -1;
-       if (g_media_stream_ducking) {
-               ret = sound_manager_destroy_stream_ducking(g_media_stream_ducking);
-               if (SOUND_MANAGER_ERROR_NONE != ret)
-                       SLOG(LOG_WARN, tts_tag(), "[Player WARNING] Fail to destroy media stream ducking, ret(%d)", ret);
-               g_media_stream_ducking = NULL;
-       } else {
-               SLOG(LOG_INFO, tts_tag(), "[Player INFO] Ducking handle for media stream is already created");
+       ret = sound_manager_destroy_stream_ducking(g_media_stream_ducking);
+       if (SOUND_MANAGER_ERROR_NONE != ret) {
+               SLOG(LOG_WARN, tts_tag(), "[Player WARNING] Fail to destroy ducking handle, ret(%d)", ret);
        }
+       g_media_stream_ducking = NULL;
 
-       if (g_system_stream_ducking) {
-               ret = sound_manager_destroy_stream_ducking(g_system_stream_ducking);
-               if (SOUND_MANAGER_ERROR_NONE != ret)
-                       SLOG(LOG_WARN, tts_tag(), "[Player WARNING] Fail to destroy system stream ducking, ret(%d)", ret);
-               g_system_stream_ducking = NULL;
-       } else {
-               SLOG(LOG_INFO, tts_tag(), "[Player INFO] Ducking handle for system stream is already created");
+       ret = sound_manager_destroy_stream_ducking(g_system_stream_ducking);
+       if (SOUND_MANAGER_ERROR_NONE != ret) {
+               SLOG(LOG_WARN, tts_tag(), "[Player WARNING] Fail to destroy ducking handle, ret(%d)", ret);
        }
+       g_system_stream_ducking = NULL;
 
-       if (g_notification_stream_ducking) {
-               ret = sound_manager_destroy_stream_ducking(g_notification_stream_ducking);
-               if (SOUND_MANAGER_ERROR_NONE != ret)
-                       SLOG(LOG_WARN, tts_tag(), "[Player WARNING] Fail to destroy notification stream ducking, ret(%d)", ret);
-               g_notification_stream_ducking = NULL;
-       } else {
-               SLOG(LOG_INFO, tts_tag(), "[Player INFO] Ducking handle for notification stream is already created");
+       ret = sound_manager_destroy_stream_ducking(g_notification_stream_ducking);
+       if (SOUND_MANAGER_ERROR_NONE != ret) {
+               SLOG(LOG_WARN, tts_tag(), "[Player WARNING] Fail to destroy ducking handle, ret(%d)", ret);
        }
+       g_notification_stream_ducking = NULL;
 
-       if (g_alarm_stream_ducking) {
-               ret = sound_manager_destroy_stream_ducking(g_alarm_stream_ducking);
-               if (SOUND_MANAGER_ERROR_NONE != ret)
-                       SLOG(LOG_WARN, tts_tag(), "[Player WARNING] Fail to destroy alarm stream ducking, ret(%d)", ret);
-               g_alarm_stream_ducking = NULL;
-       } else {
-               SLOG(LOG_INFO, tts_tag(), "[Player INFO] Ducking handle for alarm stream is already created");
+       ret = sound_manager_destroy_stream_ducking(g_alarm_stream_ducking);
+       if (SOUND_MANAGER_ERROR_NONE != ret) {
+               SLOG(LOG_WARN, tts_tag(), "[Player WARNING] Fail to destroy ducking handle, ret(%d)", ret);
        }
-       return ret;
+       g_alarm_stream_ducking = NULL;
 }
 
 int ttsd_player_release(void)
@@ -1205,11 +1205,7 @@ int ttsd_player_release(void)
                SLOG(LOG_DEBUG, tts_tag(), "[Player SUCCESS] Remove the focus state watch cb");
        }
 
-       ret = __destroy_ducking_handle();
-       if (SOUND_MANAGER_ERROR_NONE != ret)
-               SLOG(LOG_WARN, tts_tag(), "[Player WARNING] Fail to destroy stream ducking, ret(%d)", ret);
-       else
-               SLOG(LOG_DEBUG, tts_tag(), "[Player SUCCESS] Destroy stream ducking");
+       __destroy_all_ducking_handles();
 
        /* clear g_player_list */
        g_playing_info = NULL;