static struct timespec g_policy_set_time;
static Ecore_Timer* g_delayed_unset_policy_timer = NULL;
+static Ecore_Timer* g_modify_background_volume = NULL;
static double g_bg_volume_ratio;
return "Non matched stream";
}
-static int __activate_ducking_sound_stream(sound_stream_type_e stream_type, sound_stream_ducking_h stream_ducking_h)
+static int __activate_ducking_sound_stream(sound_stream_type_e stream_type, sound_stream_ducking_h stream_ducking_h, unsigned int duration)
{
bool is_ducked = false;
int ret = sound_manager_is_ducked(stream_ducking_h, &is_ducked);
if (is_ducked) {
SLOG(LOG_DEBUG, tts_tag(), "[Player] The %s is already ducked", __get_ducking_stream(stream_type));
} else {
- ret = sound_manager_activate_ducking(stream_ducking_h, SND_MGR_DUCKING_DURATION, g_bg_volume_ratio);
+ ret = sound_manager_activate_ducking(stream_ducking_h, duration, g_bg_volume_ratio);
if (SOUND_MANAGER_ERROR_NONE != ret) {
SLOG(LOG_WARN, tts_tag(), "[Player WARNING] Fail to activate ducking for %s", __get_ducking_stream(stream_type));
} else {
return ret;
}
-static void __change_background_volume(void* data)
+static void __change_background_volume(unsigned int duration)
{
SLOG(LOG_INFO, tts_tag(), "[BG] Change background volume");
SLOG(LOG_INFO, tts_tag(), "[Player] volume ratio(%lf)", g_bg_volume_ratio);
if (1.0 > g_bg_volume_ratio) {
- __activate_ducking_sound_stream(SOUND_STREAM_TYPE_MEDIA, g_media_stream_ducking);
-// __activate_ducking_sound_stream(SOUND_STREAM_TYPE_SYSTEM, g_system_stream_ducking);
- __activate_ducking_sound_stream(SOUND_STREAM_TYPE_NOTIFICATION, g_notification_stream_ducking);
- __activate_ducking_sound_stream(SOUND_STREAM_TYPE_ALARM, g_alarm_stream_ducking);
+ __activate_ducking_sound_stream(SOUND_STREAM_TYPE_MEDIA, g_media_stream_ducking, duration);
+// __activate_ducking_sound_stream(SOUND_STREAM_TYPE_SYSTEM, g_system_stream_ducking, duration);
+ __activate_ducking_sound_stream(SOUND_STREAM_TYPE_NOTIFICATION, g_notification_stream_ducking, duration);
+ __activate_ducking_sound_stream(SOUND_STREAM_TYPE_ALARM, g_alarm_stream_ducking, duration);
}
}
+static void __change_background_volume_async(void* data)
+{
+ __change_background_volume(SND_MGR_DUCKING_DURATION);
+}
+
static int __deactivate_ducking_sound_stream(sound_stream_type_e stream_type, sound_stream_ducking_h stream_ducking_h)
{
bool is_ducked = false;
SLOG(LOG_WARN, tts_tag(), "[Player WARNING] Fail to set stream info");
}
- ecore_main_loop_thread_safe_call_async(__change_background_volume, NULL);
+ ecore_main_loop_thread_safe_call_async(__change_background_volume_async, NULL);
g_is_set_policy = true;
SLOG(LOG_ERROR, tts_tag(), "[BG] g_is_set_policy(%d)", g_is_set_policy);
return TTSD_ERROR_NONE;
}
+static Eina_Bool __modify_background_volume_async(void* data)
+{
+ __recover_background_volume();
+ __change_background_volume(0);
+ SLOG(LOG_INFO, tts_tag(), "[BG] Modify background volume with delay");
+
+ g_modify_background_volume = NULL;
+ return EINA_FALSE;
+}
+
+static void __modify_background_volume(void* data)
+{
+ if (NULL != g_delayed_unset_policy_timer) {
+ SLOG(LOG_INFO, tts_tag(), "[BG] Background volume is going to recover soon. Skip modification");
+ return;
+ }
+
+ if (NULL != g_modify_background_volume) {
+ int result = (intptr_t)ecore_timer_del(g_modify_background_volume);
+ g_modify_background_volume = NULL;
+ SLOG(LOG_ERROR, tts_tag(), "[BG] Remove modify background volume timer (%d)", result);
+ }
+
+ long long int diff = __get_duration_from_last_volume_change();
+ if (diff > SND_MGR_DUCKING_DURATION) {
+ __recover_background_volume();
+ __change_background_volume(0);
+ SLOG(LOG_INFO, tts_tag(), "[BG] Direct modify background volume");
+ } else {
+ double delay = (double)(SND_MGR_DUCKING_DURATION - diff) / 1000.0;
+ g_modify_background_volume = ecore_timer_add(delay, __modify_background_volume_async, (void*)CHECK_TIMER_DELETE);
+ SLOG(LOG_INFO, tts_tag(), "[BG] Delay modifying background volume (%p), delay(%f)", g_modify_background_volume, delay);
+ }
+}
+
int ttsd_player_set_background_volume_ratio(double ratio)
{
SLOG(LOG_INFO, tts_tag(), "[Player DEBUG] ttsd_player_set_background_volume_ratio : %lf", ratio);
g_bg_volume_ratio = ratio;
SLOG(LOG_DEBUG, tts_tag(), "[Player DEBUG] Check whether sound is ducked and Change volume. as-is(%lf), to-be(%lf)", prev_ratio, g_bg_volume_ratio);
+ if (prev_ratio == g_bg_volume_ratio) {
+ return TTSD_ERROR_NONE;
+ }
+ if (g_is_set_policy) {
+ SLOG(LOG_INFO, tts_tag(), "[BG] Direct modify background volume");
+ ecore_main_loop_thread_safe_call_async(__modify_background_volume, NULL);
+ }
return TTSD_ERROR_NONE;
}