#include <sound_manager.h>
#include <sound_manager_internal.h>
#include <pthread.h>
+#include <time.h>
#include "ttsd_main.h"
#include "ttsd_player.h"
#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;
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();
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;
}
}
+ struct timespec current_time;
+ clock_gettime(CLOCK_MONOTONIC, ¤t_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;