#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"
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;
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");
}
/* 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;
}
}
/* 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;
-
}