Add parameter to change system volume 95/200695/1
authorWonnam Jang <wn.jang@samsung.com>
Thu, 28 Feb 2019 05:34:11 +0000 (14:34 +0900)
committerWonnam Jang <wn.jang@samsung.com>
Thu, 28 Feb 2019 08:51:45 +0000 (08:51 +0000)
Change-Id: Ie19282c085c9ffb6a07b2a664cecbcff2b86b063
Signed-off-by: Wonnam Jang <wn.jang@samsung.com>
client/vc_mgr.c
include/voice_control_manager_internal.h

index b65a48f..76d7c12 100644 (file)
@@ -20,6 +20,8 @@
 #include <cynara-error.h>
 #include <cynara-session.h>
 #include <pthread.h>
+#include <sound_manager.h>
+#include <sound_manager_internal.h>
 
 #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;
-
 }
index e50011f..2a887ef 100644 (file)
@@ -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.