From ea8e151a9398186798b7597552174fe6ddcae7c4 Mon Sep 17 00:00:00 2001 From: Wonnam Jang Date: Thu, 28 Feb 2019 14:34:11 +0900 Subject: [PATCH] Add parameter to change system volume Change-Id: Ie19282c085c9ffb6a07b2a664cecbcff2b86b063 Signed-off-by: Wonnam Jang --- client/vc_mgr.c | 141 +++++++++++++++++++++++++++---- include/voice_control_manager_internal.h | 5 +- 2 files changed, 129 insertions(+), 17 deletions(-) diff --git a/client/vc_mgr.c b/client/vc_mgr.c index b65a48f..76d7c12 100644 --- a/client/vc_mgr.c +++ b/client/vc_mgr.c @@ -20,6 +20,8 @@ #include #include #include +#include +#include #include "vc_cmd_db.h" #include "vc_config_mgr.h" @@ -65,6 +67,10 @@ static pthread_mutex_t g_cynara_mutex = PTHREAD_MUTEX_INITIALIZER; static bool g_err_callback_status = false; +/* for changing volume on each sound stream */ +static sound_stream_info_h g_stream_for_volume_h = NULL; +static virtual_sound_stream_h g_virtual_sound_stream_h = NULL; + /* for TTS feedback */ static int g_feedback_rate = 16000; static vc_audio_channel_e g_feedback_audio_channel = 0; @@ -4420,9 +4426,115 @@ int vc_mgr_set_audio_streaming_mode(vc_audio_streaming_mode_e streaming_mode) return ret; } -int vc_mgr_change_system_volume() +int __vc_change_system_volume(vc_system_volume_event_e volume_event) { - SLOG(LOG_DEBUG, TAG_VCM, "[Manager] Change system volume"); + int stream_type = -1; + if (VC_SYSTEM_VOLUME_EVENT_CHANGE_FOR_FARFIELD == volume_event) { + stream_type = SOUND_STREAM_TYPE_VOICE_RECOGNITION; + } else if (VC_SYSTEM_VOLUME_EVENT_CHANGE_FOR_NEARFIELD == volume_event) { + stream_type = SOUND_STREAM_TYPE_VOICE_RECOGNITION_SERVICE; + } else { + SLOG(LOG_ERROR, TAG_VCM, "[ERROR] volume type is invalid, type(%d)", volume_event); + return VC_ERROR_INVALID_PARAMETER; + } + + SLOG(LOG_INFO, TAG_VCM, "[INFO] Change system volume, volume_type(%d)", volume_event); + + int ret = VC_ERROR_NONE; + if (g_stream_for_volume_h) { + SLOG(LOG_INFO, TAG_VCM, "[INFO] Stream is already created, destroy stream)"); + ret = sound_manager_destroy_stream_information(g_stream_for_volume_h); + if (0 != ret) { + SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to destroy stream information, ret(%d)", ret); + } + g_stream_for_volume_h = NULL; + } + + ret = sound_manager_create_stream_information_internal(stream_type, NULL, NULL, &g_stream_for_volume_h); + if (0 != ret) { + SLOG(LOG_DEBUG, TAG_VCM, "[ERROR] Fail to create stream information, ret(%d)", ret); + return VC_ERROR_OPERATION_FAILED; + } + + if (g_virtual_sound_stream_h) { + SLOG(LOG_INFO, TAG_VCM, "[INFO] Virtual stream is already created, destroy virtual stream)"); + ret = sound_manager_destroy_virtual_stream(g_virtual_sound_stream_h); + if (0 != ret) { + SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to destroy virtual stream, ret(%d)", ret); + return VC_ERROR_OPERATION_FAILED; + } + g_virtual_sound_stream_h = NULL; + } + + ret = sound_manager_create_virtual_stream(g_stream_for_volume_h, &g_virtual_sound_stream_h); + if (0 != ret) { + SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to create virtual stream, ret(%d)", ret); + ret = sound_manager_destroy_stream_information(g_stream_for_volume_h); + if (0 != ret) { + SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to destroy stream information, ret(%d)", ret); + } + g_stream_for_volume_h = NULL; + return VC_ERROR_OPERATION_FAILED; + } + + ret = sound_manager_start_virtual_stream(g_virtual_sound_stream_h); + if (0 != ret) { + SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to start virtual stream, ret(%d)", ret); + ret = sound_manager_destroy_virtual_stream(g_virtual_sound_stream_h); + if (0 != ret) { + SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to destroy virtual stream, ret(%d)", ret); + } + g_virtual_sound_stream_h = NULL; + + ret = sound_manager_destroy_stream_information(g_stream_for_volume_h); + if (0 != ret) { + SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to destroy stream information, ret(%d)", ret); + } + g_stream_for_volume_h = NULL; + + return VC_ERROR_OPERATION_FAILED; + } + + SLOG(LOG_INFO, TAG_VCM, "[SUCCESS] Change system volume"); + return 0; +} + +int __vc_recover_system_volume() +{ + SLOG(LOG_INFO, TAG_VCM, "[INFO] Recover system volume"); + + int ret = VC_ERROR_NONE; + + if (g_virtual_sound_stream_h) { + ret = sound_manager_stop_virtual_stream(g_virtual_sound_stream_h); + if (0 != ret) { + SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to stop virtual stream, ret(%d)", ret); + return VC_ERROR_OPERATION_FAILED; + } + ret = sound_manager_destroy_virtual_stream(g_virtual_sound_stream_h); + if (0 != ret) { + SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to destroy virtual stream, ret(%d)", ret); + return VC_ERROR_OPERATION_FAILED; + } + g_virtual_sound_stream_h = NULL; + } + + if (g_stream_for_volume_h) { + ret = sound_manager_destroy_stream_information(g_stream_for_volume_h); + if (0 != ret) { + SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to destroy stream information, ret(%d)", ret); + return VC_ERROR_OPERATION_FAILED; + } + g_stream_for_volume_h = NULL; + } + + SLOG(LOG_INFO, TAG_VCM, "[SUCCESS] Recover system volume"); + return 0; +} + +int vc_mgr_change_system_volume(vc_system_volume_event_e volume_event) +{ + SLOG(LOG_DEBUG, TAG_VCM, "[Manager] Change system volume, volume_event(%d)", volume_event); if (0 != __vc_mgr_get_feature_enabled()) { SLOG(LOG_DEBUG, TAG_VCM, "@@@ [Manager] not supported"); @@ -4441,18 +4553,18 @@ int vc_mgr_change_system_volume() } /* check state */ - if (state != VC_STATE_READY) { - SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: Current state is not 'READY', state(%d)", state); + if (state != VC_STATE_READY && state != VC_STATE_INITIALIZED) { + SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: Current state is not 'READY' and not 'INITIALIZED', state(%d)", state); SLOG(LOG_DEBUG, TAG_VCM, "@@@"); return VC_ERROR_INVALID_STATE; } - /* send audio streaming */ - int ret = vc_mgr_dbus_change_system_volume(g_vc_m->handle, VC_SYSTEM_VOLUME_EVENT_CHANGE); + /* change system volume */ + int ret = __vc_change_system_volume(volume_event); if (0 != ret) { - SLOG(LOG_WARN, TAG_VCM, "[WARNING] retry to change volume"); + SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to change volume"); } else { - SLOG(LOG_DEBUG, TAG_VCM, "[DEBUG] Success to send"); + SLOG(LOG_DEBUG, TAG_VCM, "[DEBUG] Success to change volume"); } return ret; } @@ -4478,19 +4590,18 @@ int vc_mgr_recover_system_volume() } /* check state */ - if (state != VC_STATE_READY) { - SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: Current state is not 'READY', state(%d)", state); + if (state != VC_STATE_READY && state != VC_STATE_INITIALIZED) { + SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: Current state is not 'READY' and not 'INITIALIZED', state(%d)", state); SLOG(LOG_DEBUG, TAG_VCM, "@@@"); return VC_ERROR_INVALID_STATE; } - /* send audio streaming */ - int ret = vc_mgr_dbus_change_system_volume(g_vc_m->handle, VC_SYSTEM_VOLUME_EVENT_RECOVER); + /* recover volume */ + int ret = __vc_recover_system_volume(); if (0 != ret) { - SLOG(LOG_WARN, TAG_VCM, "[WARNING] retry to recover volume"); + SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to recover volume"); } else { - SLOG(LOG_DEBUG, TAG_VCM, "[DEBUG] Success to send"); + SLOG(LOG_DEBUG, TAG_VCM, "[DEBUG] Success to recover volume"); } return ret; - } diff --git a/include/voice_control_manager_internal.h b/include/voice_control_manager_internal.h index e50011f..2a887ef 100644 --- a/include/voice_control_manager_internal.h +++ b/include/voice_control_manager_internal.h @@ -41,7 +41,8 @@ typedef enum { } vc_audio_streaming_mode_e; typedef enum { - VC_SYSTEM_VOLUME_EVENT_CHANGE, + VC_SYSTEM_VOLUME_EVENT_CHANGE_FOR_NEARFIELD, + VC_SYSTEM_VOLUME_EVENT_CHANGE_FOR_FARFIELD, VC_SYSTEM_VOLUME_EVENT_RECOVER } vc_system_volume_event_e; @@ -113,7 +114,7 @@ int vc_mgr_set_audio_streaming_mode(vc_audio_streaming_mode_e streaming_mode); * @since_tizen 5.0 * */ -int vc_mgr_change_system_volume(); +int vc_mgr_change_system_volume(vc_system_volume_event_e volume_event); /** * @brief Recover system volume. -- 2.7.4