2 * Copyright (c) 2011-2015 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the License);
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an AS IS BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
18 #include <system_info.h>
19 #include <cynara-client.h>
20 #include <cynara-error.h>
21 #include <cynara-session.h>
25 #include "vc_cmd_db.h"
26 #include "vc_config_mgr.h"
27 #include "vc_command.h"
28 #include "vc_info_parser.h"
29 #include "vc_json_parser.h"
31 #include "vc_mgr_core.h"
32 #include "vc_mgr_client.h"
33 #include "vc_mgr_tidl.h"
34 #include "vc_mgr_data.h"
35 #include "vc_mgr_ducking.h"
36 #include "voice_control_command.h"
37 #include "voice_control_command_expand.h"
38 #include "voice_control_common.h"
39 #include "voice_control_manager.h"
40 #include "voice_control_manager_internal.h"
43 #define VC_MANAGER_CONFIG_HANDLE 10000000
45 static Ecore_Timer* g_send_hello_timer = NULL;
46 static Ecore_Timer* g_request_init_timer = NULL;
47 static int g_tidl_send_hello_count = 0;
51 static int g_daemon_pid = 0;
53 static int g_feature_enabled = -1;
55 static bool g_privilege_allowed = false;
57 static cynara *p_cynara = NULL;
58 static pthread_mutex_t g_cynara_mutex = PTHREAD_MUTEX_INITIALIZER;
60 /* for TTS feedback */
61 static Ecore_Thread* g_feedback_thread = NULL;
63 static pthread_mutex_t g_feedback_streaming_cb_mutex = PTHREAD_MUTEX_INITIALIZER;
64 static pthread_mutex_t g_vc_tts_streaming_cb_mutex = PTHREAD_MUTEX_INITIALIZER;
66 static Eina_Bool __vc_mgr_notify_state_changed(void *data);
68 static const char* __vc_mgr_get_error_code(vc_error_e err)
71 case VC_ERROR_NONE: return "VC_ERROR_NONE";
72 case VC_ERROR_OUT_OF_MEMORY: return "VC_ERROR_OUT_OF_MEMORY";
73 case VC_ERROR_IO_ERROR: return "VC_ERROR_IO_ERROR";
74 case VC_ERROR_INVALID_PARAMETER: return "VC_ERROR_INVALID_PARAMETER";
75 case VC_ERROR_TIMED_OUT: return "VC_ERROR_TIMED_OUT";
76 case VC_ERROR_RECORDER_BUSY: return "VC_ERROR_RECORDER_BUSY";
77 case VC_ERROR_INVALID_STATE: return "VC_ERROR_INVALID_STATE";
78 case VC_ERROR_INVALID_LANGUAGE: return "VC_ERROR_INVALID_LANGUAGE";
79 case VC_ERROR_ENGINE_NOT_FOUND: return "VC_ERROR_ENGINE_NOT_FOUND";
80 case VC_ERROR_OPERATION_FAILED: return "VC_ERROR_OPERATION_FAILED";
81 default: return "Invalid error code";
86 static void __vc_mgr_lang_changed_cb(const char* previous_lang, const char* current_lang)
88 SLOG(LOG_INFO, TAG_VCM, "Lang changed : previous lang(%s) current lang(%s)",
89 previous_lang, current_lang);
91 vc_current_language_changed_cb callback = NULL;
93 vc_mgr_client_get_current_lang_changed_cb(&callback, &lang_user_data);
95 if (NULL != callback) {
96 vc_mgr_client_use_callback();
97 callback(previous_lang, current_lang, lang_user_data);
98 vc_mgr_client_not_use_callback();
99 SLOG(LOG_INFO, TAG_VCM, "Language changed callback is called");
101 SLOG(LOG_WARN, TAG_VCM, "[WARNING] Language changed callback is null");
107 static int __vc_mgr_get_feature_enabled()
109 if (0 == g_feature_enabled) {
110 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Voice control feature NOT supported");
111 return VC_ERROR_NOT_SUPPORTED;
112 } else if (-1 == g_feature_enabled) {
113 bool vc_supported = false;
114 bool mic_supported = false;
115 if (0 == system_info_get_platform_bool(VC_MGR_FEATURE_PATH, &vc_supported)) {
116 if (0 == system_info_get_platform_bool(VC_MIC_FEATURE_PATH, &mic_supported)) {
117 if (false == vc_supported || false == mic_supported) {
118 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Voice control feature NOT supported");
119 g_feature_enabled = 0;
120 return VC_ERROR_NOT_SUPPORTED;
123 g_feature_enabled = 1;
128 return VC_ERROR_NONE;
131 static int __check_privilege_initialize()
133 int ret = cynara_initialize(&p_cynara, NULL);
134 if (NULL == p_cynara || CYNARA_API_SUCCESS != ret) {
135 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] fail to initialize(%d)", ret);
139 return ret == CYNARA_API_SUCCESS;
142 static int __check_privilege(const char* uid, const char * privilege)
145 char label_path[1024] = "/proc/self/attr/current";
146 char smack_label[1024] = {'\0',};
149 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] p_cynara is NULL");
153 fp = fopen(label_path, "r");
155 if (fread(smack_label, 1, sizeof(smack_label), fp) <= 0)
156 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] fail to fread");
161 pid_t pid = getpid();
162 char *session = cynara_session_from_pid(pid);
163 int ret = cynara_check(p_cynara, smack_label, session, uid, privilege);
168 if (ret != CYNARA_API_ACCESS_ALLOWED) {
169 SLOG(LOG_INFO, TAG_VCM, "[Client]cynara_check returned %d(Denied), p_cynara(%p), label(%s), session(%s), uid(%s), priv(%s)", ret, p_cynara, smack_label, session, uid, privilege);
176 static void __check_privilege_deinitialize()
179 int ret = cynara_finish(p_cynara);
180 if (ret != CYNARA_API_SUCCESS)
181 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] cynara finish %d", ret);
186 static int __vc_mgr_check_privilege()
188 if (true == g_privilege_allowed)
189 return VC_ERROR_NONE;
191 pthread_mutex_lock(&g_cynara_mutex);
193 if (false == g_privilege_allowed) {
195 ret = __check_privilege_initialize();
197 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] privilege initialize is failed");
198 g_privilege_allowed = false;
199 pthread_mutex_unlock(&g_cynara_mutex);
200 return VC_ERROR_PERMISSION_DENIED;
204 snprintf(uid, 32, "%d", getuid());
206 ret = __check_privilege(uid, VC_PRIVILEGE_RECORDER);
208 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Permission is denied(%s)(%s)", VC_PRIVILEGE_RECORDER, uid);
209 __check_privilege_deinitialize();
210 g_privilege_allowed = false;
211 pthread_mutex_unlock(&g_cynara_mutex);
212 return VC_ERROR_PERMISSION_DENIED;
215 ret = __check_privilege(uid, VC_MGR_PRIVILEGE);
217 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Permission is denied(%s)(%s)", VC_MGR_PRIVILEGE, uid);
218 __check_privilege_deinitialize();
219 g_privilege_allowed = false;
220 pthread_mutex_unlock(&g_cynara_mutex);
221 return VC_ERROR_PERMISSION_DENIED;
224 __check_privilege_deinitialize();
227 g_privilege_allowed = true;
228 pthread_mutex_unlock(&g_cynara_mutex);
229 return VC_ERROR_NONE;
232 int __check_mgr_feature_privilege()
234 if (0 != __vc_mgr_get_feature_enabled()) {
235 SLOG(LOG_DEBUG, TAG_VCM, "@@@ [Manager] not supported");
236 return VC_ERROR_NOT_SUPPORTED;
239 if (0 != __vc_mgr_check_privilege()) {
240 return VC_ERROR_PERMISSION_DENIED;
243 return VC_ERROR_NONE;
246 int vc_mgr_initialize(void)
248 SLOG(LOG_ERROR, TAG_VCM, "@@@ [Manager] Initialize");
251 ret = __check_mgr_feature_privilege();
252 if (VC_ERROR_NONE != ret)
256 if (true == vc_mgr_client_is_valid()) {
257 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Already initialized");
258 return VC_ERROR_NONE;
261 if (0 != vc_mgr_tidl_open_connection()) {
262 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to open tidl connection");
263 return VC_ERROR_OPERATION_FAILED;
266 if (0 != vc_mgr_client_create()) {
267 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to create client!!!!!");
268 return VC_ERROR_OUT_OF_MEMORY;
272 ret = vc_config_mgr_initialize(g_pid + VC_MANAGER_CONFIG_HANDLE);
274 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to init config manager : %d", ret);
275 vc_mgr_client_destroy();
276 return VC_ERROR_OPERATION_FAILED;
279 ret = vc_config_mgr_set_lang_cb(g_pid + VC_MANAGER_CONFIG_HANDLE, __vc_mgr_lang_changed_cb);
281 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to set callback : %d", ret);
282 vc_config_mgr_finalize(g_pid + VC_MANAGER_CONFIG_HANDLE);
283 vc_mgr_client_destroy();
284 return VC_ERROR_OPERATION_FAILED;
287 ret = vc_mgr_client_set_audio_streaming_mode(VC_AUDIO_STREAMING_MODE_VC_SERVICE);
289 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to set audio streaming mode : %d", ret);
290 vc_config_mgr_finalize(g_pid + VC_MANAGER_CONFIG_HANDLE);
291 vc_mgr_client_destroy();
295 ret = vc_mgr_ducking_create();
296 if (VC_ERROR_NONE != ret) {
297 SLOG(LOG_INFO, TAG_VCM, "[INFO] Fail to ducking create : %d", ret);
300 SLOG(LOG_ERROR, TAG_VCM, "[Success] pid(%d)", g_pid);
302 SLOG(LOG_DEBUG, TAG_VCM, "@@@ [Manager] Initialize DONE");
304 return VC_ERROR_NONE;
307 static void __vc_mgr_internal_unprepare()
309 int ret = vc_mgr_tidl_request_finalize(g_pid);
311 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request finalize : %s", __vc_mgr_get_error_code(ret));
314 vc_mgr_client_set_internal_state(VC_INTERNAL_STATE_NONE);
318 int vc_mgr_deinitialize(void)
320 SLOG(LOG_ERROR, TAG_VCM, "@@@ [Manager] Deinitialize");
323 ret = __check_mgr_feature_privilege();
324 if (VC_ERROR_NONE != ret)
327 if (false == vc_mgr_client_is_valid()) {
328 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] NOT initialized");
329 return VC_ERROR_INVALID_STATE;
333 vc_mgr_client_get_client_state(&state);
338 __vc_mgr_internal_unprepare();
339 /* no break. need to next step*/
340 case VC_STATE_INITIALIZED:
341 if (NULL != g_send_hello_timer) {
342 SLOG(LOG_DEBUG, TAG_VCM, "Connect Timer is deleted");
343 ecore_timer_del(g_send_hello_timer);
344 g_send_hello_timer = NULL;
346 if (g_request_init_timer) {
347 SLOG(LOG_DEBUG, TAG_VCM, "Connect idler is deleted");
348 ecore_timer_del(g_request_init_timer);
349 g_request_init_timer = NULL;
352 vc_config_mgr_unset_lang_cb(g_pid + VC_MANAGER_CONFIG_HANDLE);
353 vc_config_mgr_finalize(g_pid + VC_MANAGER_CONFIG_HANDLE);
355 /* Free client resources */
356 vc_mgr_client_destroy();
363 SLOG(LOG_DEBUG, TAG_VCM, "Success: destroy");
365 int cnt = VC_COMMAND_TYPE_FOREGROUND;
367 ret = vc_cmd_parser_delete_file(getpid(), cnt);
369 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to delete file, type(%d), ret(%d)", cnt, ret);
370 } while (VC_COMMAND_TYPE_EXCLUSIVE >= ++cnt);
372 ret = vc_db_finalize();
374 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to finalize DB, ret(%d)", ret);
377 ret = vc_mgr_ducking_destroy();
378 if (VC_ERROR_NONE != ret) {
379 SLOG(LOG_INFO, TAG_VCM, "[INFO] Fail to ducking destroy : %d", ret);
382 if (0 != vc_mgr_tidl_close_connection()) {
383 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to close connection");
386 SLOG(LOG_ERROR, TAG_VCM, "@@@ [Manager] Deinitialize DONE");
388 return VC_ERROR_NONE;
391 static void __notify_error(void *data)
393 vc_mgr_core_notify_error();
396 static Eina_Bool __request_initialize(void *data)
398 /* request initialization */
400 int service_state = 0;
401 int foreground = VC_RUNTIME_INFO_NO_FOREGROUND;
405 if (true == vc_mgr_client_is_valid()) {
406 SLOG(LOG_DEBUG, TAG_VCM, "[DEBUG] is valid");
409 ret = vc_db_initialize();
411 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to initialize DB : %d", ret);
415 vc_audio_streaming_mode_e streaming_mode;
416 vc_mgr_client_get_audio_streaming_mode(&streaming_mode);
418 ret = vc_mgr_tidl_request_initialize(g_pid, (int)streaming_mode, &service_state, &foreground, &g_daemon_pid);
420 if (VC_ERROR_ENGINE_NOT_FOUND == ret) {
421 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to initialize : %s", __vc_mgr_get_error_code(ret));
423 vc_mgr_client_set_error(VC_ERROR_ENGINE_NOT_FOUND);
424 ecore_main_loop_thread_safe_call_async(__notify_error, NULL);
426 SLOG(LOG_DEBUG, TAG_VCM, "@@@");
427 g_request_init_timer = NULL;
430 } else if (0 != ret) {
431 SLOG(LOG_ERROR, TAG_VCM, "[WARNING] Fail to connection. Retry to connect : %s", __vc_mgr_get_error_code(ret));
432 ret = vc_db_finalize();
434 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to finalize DB : %d", ret);
438 /* Success to connect */
441 /* Set service state */
442 vc_service_state_e previous_service_state;
443 vc_mgr_client_get_service_state(&previous_service_state);
444 vc_mgr_client_set_service_state((vc_service_state_e)service_state);
446 vc_service_state_changed_cb service_changed_callback = NULL;
447 void* user_data = NULL;
448 vc_mgr_client_get_service_state_changed_cb(&service_changed_callback, &user_data);
450 if (NULL != service_changed_callback) {
451 vc_mgr_client_use_callback();
452 service_changed_callback(previous_service_state, service_state, user_data);
453 vc_mgr_client_not_use_callback();
454 SLOG(LOG_INFO, TAG_VCM, "Service state changed callback is called");
456 SLOG(LOG_WARN, TAG_VCM, "[WARNING] Service state changed callback is null");
460 vc_mgr_client_set_foreground(foreground, true);
462 SLOG(LOG_ERROR, TAG_VCM, "[SUCCESS] Connected daemon");
464 /* Set client state */
465 vc_mgr_client_set_client_state(VC_STATE_READY);
467 vc_state_changed_cb changed_callback = NULL;
469 vc_mgr_client_get_state_changed_cb(&changed_callback, &user_data);
471 vc_state_e current_state;
472 vc_state_e previous_state;
474 vc_mgr_client_get_previous_state(¤t_state, &previous_state);
476 if (NULL != changed_callback) {
477 vc_mgr_client_use_callback();
478 changed_callback(previous_state, current_state, user_data);
479 vc_mgr_client_not_use_callback();
480 SLOG(LOG_INFO, TAG_VCM, "State changed callback is called");
482 SLOG(LOG_WARN, TAG_VCM, "[WARNING] State changed callback is null");
485 SLOG(LOG_ERROR, TAG_VCM, "[Not ERROR] is not valid. It is destroyed."); //LCOV_EXCL_LINE
486 g_request_init_timer = NULL;
490 SLOG(LOG_ERROR, TAG_VCM, "@@@");
492 g_request_init_timer = NULL;
497 static Eina_Bool __send_hello_message(void *data)
500 if (0 != vc_mgr_tidl_request_hello()) {
501 if (g_tidl_send_hello_count == VCM_TIDL_RETRY_COUNT) {
502 g_tidl_send_hello_count = 0;
503 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request hello !! send error to manager");
504 vc_mgr_core_send_error(VC_ERROR_TIMED_OUT, -1, "voice_framework.error.vcfw.connect_engine_fail");
505 g_send_hello_timer = NULL;
508 g_tidl_send_hello_count++;
513 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Connect daemon");
515 if (NULL == g_request_init_timer) {
516 SLOG(LOG_INFO, TAG_VCM, "[DEBUG] Create a new idler for preparation");
517 g_request_init_timer = ecore_timer_add(0.0, __request_initialize, NULL);
519 SLOG(LOG_INFO, TAG_VCM, "[INFO] idler handle is already created");
522 g_send_hello_timer = NULL;
526 int vc_mgr_prepare(void)
528 SLOG(LOG_ERROR, TAG_VCM, "@@@ [Manager] Prepare");
531 ret = __check_mgr_feature_privilege();
532 if (VC_ERROR_NONE != ret)
536 if (0 != vc_mgr_client_get_client_state(&state)) {
537 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
538 return VC_ERROR_INVALID_STATE;
542 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
544 if (NULL == g_send_hello_timer) {
545 g_tidl_send_hello_count = 0;
546 SLOG(LOG_INFO, TAG_VCM, "[DEBUG] Create a new timer for preparation");
547 ecore_thread_main_loop_begin();
548 g_send_hello_timer = ecore_timer_add(0.1, __send_hello_message, NULL);
549 ecore_thread_main_loop_end();
551 SLOG(LOG_INFO, TAG_VCM, "[INFO] timer handle is already created");
554 SLOG(LOG_DEBUG, TAG_VCM, "@@@ [Manager] Calling Prepare DONE");
556 return VC_ERROR_NONE;
559 int vc_mgr_unprepare(void)
561 SLOG(LOG_ERROR, TAG_VCM, "@@@ [Manager] Unprepare");
564 ret = __check_mgr_feature_privilege();
565 if (VC_ERROR_NONE != ret)
569 if (0 != vc_mgr_client_get_client_state(&state)) {
570 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
571 return VC_ERROR_INVALID_STATE;
575 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Ready'", state);
577 __vc_mgr_internal_unprepare();
579 vc_mgr_client_set_client_state(VC_STATE_INITIALIZED);
580 ecore_timer_add(0, __vc_mgr_notify_state_changed, NULL);
582 SLOG(LOG_DEBUG, TAG_VCM, "@@@ [Manager] Unprepare DONE");
584 return VC_ERROR_NONE;
587 int vc_mgr_foreach_supported_languages(vc_supported_language_cb callback, void* user_data)
589 SLOG(LOG_INFO, TAG_VCM, "@@@ [Manager] Foreach Supported Language");
592 ret = __check_mgr_feature_privilege();
593 if (VC_ERROR_NONE != ret)
596 RETVM_IF(NULL == callback, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Input parameter is NULL");
599 if (0 != vc_mgr_client_get_client_state(&state)) {
600 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
601 return VC_ERROR_INVALID_STATE;
604 ret = vc_config_mgr_get_language_list(callback, user_data);
606 ret = vc_config_convert_error_code((vc_config_error_e)ret);
607 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get languages : %s", __vc_mgr_get_error_code(ret));
610 SLOG(LOG_DEBUG, TAG_VCM, "@@@ [Manager] Foreach Supported Language DONE");
612 return VC_ERROR_NONE;
615 int vc_mgr_get_current_language(char** language)
618 ret = __check_mgr_feature_privilege();
619 if (VC_ERROR_NONE != ret)
622 RETVM_IF(NULL == language, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Input parameter is NULL");
625 if (0 != vc_mgr_client_get_client_state(&state)) {
626 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
627 return VC_ERROR_INVALID_STATE;
630 ret = vc_config_mgr_get_default_language(language);
632 ret = vc_config_convert_error_code((vc_config_error_e)ret);
633 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get current languages : %s", __vc_mgr_get_error_code(ret));
635 SLOG(LOG_ERROR, TAG_VCM, "[Get current language] language : %s", *language);
641 int vc_mgr_get_state(vc_state_e* state)
643 SLOG(LOG_DEBUG, TAG_VCM, "@@@ [Manager] Get State");
646 ret = __check_mgr_feature_privilege();
647 if (VC_ERROR_NONE != ret)
650 RETVM_IF(NULL == state, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Input parameter is NULL");
653 if (0 != vc_mgr_client_get_client_state(&temp)) {
654 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
655 return VC_ERROR_INVALID_STATE;
661 case VC_STATE_NONE: SLOG(LOG_INFO, TAG_VCM, "Current state is 'None'"); break;
662 case VC_STATE_INITIALIZED: SLOG(LOG_INFO, TAG_VCM, "Current state is 'Created'"); break;
663 case VC_STATE_READY: SLOG(LOG_INFO, TAG_VCM, "Current state is 'Ready'"); break;
664 default: SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid state");
667 SLOG(LOG_DEBUG, TAG_VCM, "@@@ [Manager] Get State DONE");
669 return VC_ERROR_NONE;
672 int vc_mgr_get_service_state(vc_service_state_e* state)
674 SLOG(LOG_DEBUG, TAG_VCM, "@@@ [Manager] Get Service State");
677 ret = __check_mgr_feature_privilege();
678 if (VC_ERROR_NONE != ret)
681 RETVM_IF(NULL == state, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Input parameter is NULL");
683 vc_state_e client_state;
684 if (0 != vc_mgr_client_get_client_state(&client_state)) {
685 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
686 return VC_ERROR_INVALID_STATE;
690 RETVM_IF(client_state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Current state is not 'READY'");
692 /* get service state */
693 vc_service_state_e service_state;
694 if (0 != vc_mgr_client_get_service_state(&service_state)) {
695 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get service state");
696 return VC_ERROR_OPERATION_FAILED;
699 *state = service_state;
702 case VC_SERVICE_STATE_NONE: SLOG(LOG_DEBUG, TAG_VCM, "Current service state is 'None'"); break;
703 case VC_SERVICE_STATE_READY: SLOG(LOG_DEBUG, TAG_VCM, "Current service state is 'Ready'"); break;
704 case VC_SERVICE_STATE_RECORDING: SLOG(LOG_DEBUG, TAG_VCM, "Current service state is 'Recording'"); break;
705 case VC_SERVICE_STATE_PROCESSING: SLOG(LOG_DEBUG, TAG_VCM, "Current service state is 'Processing'"); break;
706 default: SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid state");
709 SLOG(LOG_DEBUG, TAG_VCM, "@@@ [Manager] Get Service State DONE");
711 return VC_ERROR_NONE;
714 int vc_mgr_set_demandable_client_rule(const char* rule)
716 SLOG(LOG_INFO, TAG_VCM, "@@@ [Manager] Set Demandable client rule(%s)", rule);
719 ret = __check_mgr_feature_privilege();
720 if (VC_ERROR_NONE != ret)
723 RETVM_IF(NULL == rule, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Input parameter is NULL");
726 if (0 != vc_mgr_client_get_client_state(&state)) {
727 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
728 return VC_ERROR_INVALID_STATE;
732 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Ready'", state);
734 ret = vc_mgr_core_set_demandable_client_rule(rule);
736 SLOG(LOG_DEBUG, TAG_VCM, "@@@ [Manager] Set Demandable client rule(%s) DONE", rule);
741 int vc_mgr_unset_demandable_client_rule(void)
743 SLOG(LOG_INFO, TAG_VCM, "@@@ [Manager] Unset Demandable client");
746 ret = __check_mgr_feature_privilege();
747 if (VC_ERROR_NONE != ret)
751 if (0 != vc_mgr_client_get_client_state(&state)) {
752 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
753 return VC_ERROR_INVALID_STATE;
757 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Ready'", state);
759 vc_info_parser_set_demandable_client(NULL);
761 ret = vc_mgr_tidl_request_demandable_client(g_pid);
763 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request unset client rule to daemon : %s", __vc_mgr_get_error_code(ret));
766 // TODO: check return value correct or not
767 return VC_ERROR_NONE;
770 int vc_mgr_is_command_format_supported(int format, bool* support)
772 SLOG(LOG_ERROR, TAG_VCM, "@@@ [Manager] Is command type supported");
775 ret = __check_mgr_feature_privilege();
776 if (VC_ERROR_NONE != ret)
779 RETVM_IF(NULL == support, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Input parameter is NULL");
782 if (0 != vc_mgr_client_get_client_state(&state)) {
783 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
784 return VC_ERROR_INVALID_STATE;
788 bool non_fixed_support = false;
789 if (0 != vc_config_mgr_get_nonfixed_support(&non_fixed_support)) {
790 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get nonfixed support info");
794 case VC_CMD_FORMAT_FIXED: *support = true; break;
795 case VC_CMD_FORMAT_FIXED_AND_VFIXED: *support = true; break;
796 case VC_CMD_FORMAT_VFIXED_AND_FIXED: *support = true; break;
797 case VC_CMD_FORMAT_FIXED_AND_NONFIXED: *support = non_fixed_support; break;
798 case VC_CMD_FORMAT_NONFIXED_AND_FIXED: *support = non_fixed_support; break;
799 default: *support = false; break;
802 SLOG(LOG_ERROR, TAG_VCM, "[DEBUG] Format(%d) support(%s)", format, *support ? "true" : "false");
804 SLOG(LOG_DEBUG, TAG_VCM, "@@@ [Manager] Is command type supported DONE");
806 return VC_ERROR_NONE;
809 int vc_mgr_enable_command_type(int cmd_type)
811 SLOG(LOG_ERROR, TAG_VCM, "@@@ [Manager] Enable Command Type, cmd_type(%d)", cmd_type);
814 ret = __check_mgr_feature_privilege();
815 if (VC_ERROR_NONE != ret)
818 if (VC_COMMAND_TYPE_FOREGROUND > cmd_type || VC_COMMAND_TYPE_EXCLUSIVE < cmd_type) {
819 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] cmd_type is not valid. (%d)", cmd_type);
820 return VC_ERROR_INVALID_PARAMETER;
824 if (0 != vc_mgr_client_get_client_state(&state)) {
825 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
826 return VC_ERROR_INVALID_STATE;
830 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Ready'", state);
832 /* Check service state */
833 vc_service_state_e service_state = -1;
834 vc_mgr_client_get_service_state(&service_state);
835 RETVM_IF(service_state != VC_SERVICE_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current service state(%d) is not 'READY'", service_state);
837 ret = vc_mgr_client_enable_command_type((vc_cmd_type_e)cmd_type); // enable the cmd type
839 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to enable the command type(%d). ret(%d)", cmd_type, ret);
841 SLOG(LOG_DEBUG, TAG_VCM, "[DEBUG] Success to enable the command type(%d)", cmd_type);
844 SLOG(LOG_ERROR, TAG_VCM, "@@@ [Manager] Enable Command Type DONE, ret(%d)", ret);
849 int vc_mgr_disable_command_type(int cmd_type)
851 SLOG(LOG_ERROR, TAG_VCM, "@@@ [Manager] Disable Command Type, cmd_type(%d)", cmd_type);
854 ret = __check_mgr_feature_privilege();
855 if (VC_ERROR_NONE != ret)
858 if (VC_COMMAND_TYPE_FOREGROUND > cmd_type || VC_COMMAND_TYPE_EXCLUSIVE < cmd_type) {
859 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] cmd type is not valid, (%d)", cmd_type);
860 return VC_ERROR_INVALID_PARAMETER;
864 if (0 != vc_mgr_client_get_client_state(&state)) {
865 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
866 return VC_ERROR_INVALID_STATE;
870 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Ready'", state);
872 /* Check service state */
873 vc_service_state_e service_state = -1;
874 vc_mgr_client_get_service_state(&service_state);
875 RETVM_IF(service_state != VC_SERVICE_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current service state(%d) is not 'READY'", service_state);
877 ret = vc_mgr_client_disable_command_type((vc_cmd_type_e)cmd_type); // enable the cmd type
879 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to disable the command type(%d). ret(%d)", cmd_type, ret);
881 SLOG(LOG_DEBUG, TAG_VCM, "[DEBUG] Success to disable the command type(%d)", cmd_type);
884 SLOG(LOG_ERROR, TAG_VCM, "@@@ [Manager] Disable Command Type DONE, ret(%d)", ret);
889 int vc_mgr_set_command_list(vc_cmd_list_h vc_cmd_list)
891 SLOG(LOG_ERROR, TAG_VCM, "@@@ [Manager] Set Command list");
894 ret = __check_mgr_feature_privilege();
895 if (VC_ERROR_NONE != ret)
899 if (0 != vc_mgr_client_get_client_state(&state)) {
900 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
901 return VC_ERROR_INVALID_STATE;
905 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
907 /* Check service state */
908 vc_service_state_e service_state = -1;
909 vc_mgr_client_get_service_state(&service_state);
910 RETVM_IF(service_state != VC_SERVICE_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: service state(%d) is not 'READY'", service_state);
912 RETVM_IF(NULL == vc_cmd_list, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Input parameter is NULL");
914 vc_cmd_list_s* list = NULL;
915 list = (vc_cmd_list_s*)vc_cmd_list;
916 SLOG(LOG_INFO, TAG_VCM, "[List] (%p) (%p)", list, list->list);
918 RETVM_IF(NULL == list->list, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Input command list");
921 bool success_save = false;
922 for (i = VC_COMMAND_TYPE_FOREGROUND; i <= VC_COMMAND_TYPE_EXCLUSIVE; i++) {
923 ret = vc_cmd_parser_delete_file(getpid(), i);
925 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to delete file, type(%d), ret(%d)", i, ret);
927 ret = vc_cmd_parser_save_file(getpid(), i, list->list, NULL);
929 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to save file, type(%d), ret(%d)", i, ret);
931 SLOG(LOG_INFO, TAG_VCM, "[SUCCESS] Save file, type(%d)", i);
936 if (true != success_save) {
937 ret = VC_ERROR_INVALID_PARAMETER;
938 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to save command group : %s", __vc_mgr_get_error_code(ret));
940 ret = vc_mgr_tidl_request_set_command(g_pid);
942 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request set command to daemon : %s", __vc_mgr_get_error_code(ret));
946 SLOG(LOG_ERROR, TAG_VCM, "@@@ [Manager] Set Command list DONE, ret(%d)", ret);
951 int vc_mgr_unset_command_list(void)
953 SLOG(LOG_ERROR, TAG_VCM, "@@@ [Manager] Unset Command list");
956 ret = __check_mgr_feature_privilege();
957 if (VC_ERROR_NONE != ret)
961 if (0 != vc_mgr_client_get_client_state(&state)) {
962 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
963 return VC_ERROR_INVALID_STATE;
967 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
969 ret = vc_mgr_tidl_request_unset_command(g_pid);
971 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request unset command to daemon : %s", __vc_mgr_get_error_code(ret));
975 for (i = VC_COMMAND_TYPE_FOREGROUND; i <= VC_COMMAND_TYPE_EXCLUSIVE; i++) {
976 ret = vc_cmd_parser_delete_file(getpid(), i);
978 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to delete file, type(%d), ret(%d)", i, ret);
981 SLOG(LOG_ERROR, TAG_VCM, "@@@ [Manager] Unset Command list DONE");
983 // TODO: check return value correct or not
984 return VC_ERROR_NONE;
987 int vc_mgr_set_command_list_from_file(const char* file_path, int type)
989 SLOG(LOG_ERROR, TAG_VCM, "@@@ [Manager] Set Command list from file, type(%d)", type);
992 ret = __check_mgr_feature_privilege();
993 if (VC_ERROR_NONE != ret)
996 RETVM_IF(NULL == file_path, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Invalid parameter");
997 SLOG(LOG_INFO, TAG_VCM, "@@@ File path: %s", file_path);
1000 if (VC_COMMAND_TYPE_FOREGROUND > type || VC_COMMAND_TYPE_EXCLUSIVE < type) {
1001 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid command type: input type is %d", type);
1002 return VC_ERROR_INVALID_PARAMETER;
1006 if (0 != vc_mgr_client_get_client_state(&state)) {
1007 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1008 return VC_ERROR_INVALID_STATE;
1012 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
1014 /* Check service state */
1015 vc_service_state_e service_state = -1;
1016 vc_mgr_client_get_service_state(&service_state);
1017 RETVM_IF(service_state != VC_SERVICE_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current service state(%d) is not 'READY'", service_state);
1019 ret = vc_cmd_parser_delete_file(getpid(), type);
1021 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to delete file, type(4), ret(%d)", ret);
1023 if (0 != vc_json_set_commands_from_file(file_path, type, NULL)) {
1024 ret = VC_ERROR_INVALID_PARAMETER;
1025 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to save command list (%d)", ret);
1027 ret = vc_mgr_tidl_request_set_command(g_pid);
1029 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request set command to daemon : %s", __vc_mgr_get_error_code(ret));
1033 SLOG(LOG_ERROR, TAG_VCM, "@@@ [Manager] Set Command list from file DONE, ret(%d)", ret);
1038 int vc_mgr_set_preloaded_commands_from_file(const char* file_path)
1040 SLOG(LOG_ERROR, TAG_VCM, "@@@ [Manager] Set preloaded command list");
1043 ret = __check_mgr_feature_privilege();
1044 if (VC_ERROR_NONE != ret)
1047 RETVM_IF(NULL == file_path, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Invalid parameter");
1048 SLOG(LOG_INFO, TAG_VCM, "@@@ File path: %s", file_path);
1051 if (0 != vc_mgr_client_get_client_state(&state)) {
1052 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1053 return VC_ERROR_INVALID_STATE;
1057 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
1059 /* Check service state */
1060 vc_service_state_e service_state = -1;
1061 vc_mgr_client_get_service_state(&service_state);
1062 RETVM_IF(service_state != VC_SERVICE_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current service state(%d) is not 'READY'", service_state);
1064 /* Only support to set background commands for preloaded application */
1065 ret = vc_json_set_commands_from_file(file_path, VC_COMMAND_TYPE_BACKGROUND, NULL);
1067 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to insert preloaded commands into db");
1069 SLOG(LOG_ERROR, TAG_VCM, "@@@ [Manager] Set preloaded command list DONE, ret(%d)", ret);
1073 int vc_mgr_set_audio_type(const char* audio_id)
1075 SLOG(LOG_ERROR, TAG_VCM, "@@@ [Manager] Set audio type, audio_id(%s)", audio_id);
1078 ret = __check_mgr_feature_privilege();
1079 if (VC_ERROR_NONE != ret)
1082 if (NULL == audio_id || !strncmp(audio_id, "", strlen(audio_id))) {
1083 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Input parameter is NULL");
1084 return VC_ERROR_INVALID_PARAMETER;
1088 if (0 != vc_mgr_client_get_client_state(&state)) {
1089 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1090 return VC_ERROR_INVALID_STATE;
1094 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
1096 /* Check service state */
1097 vc_service_state_e service_state = -1;
1098 vc_mgr_client_get_service_state(&service_state);
1099 RETVM_IF(service_state != VC_SERVICE_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current service state(%d) is not 'READY'", service_state);
1102 ret = vc_mgr_tidl_request_set_audio_type(g_pid, audio_id);
1104 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to set audio type : %s", __vc_mgr_get_error_code(ret));
1106 SLOG(LOG_INFO, TAG_VCM, "[SUCCESS] Set audio type");
1108 vc_mgr_client_set_audio_type(audio_id);
1111 SLOG(LOG_ERROR, TAG_VCM, "@@@ [Manager] Set audio type DONE, ret(%d)", ret);
1116 int vc_mgr_get_audio_type(char** audio_id)
1118 SLOG(LOG_ERROR, TAG_VCM, "@@@ [Manager] Get audio type");
1121 ret = __check_mgr_feature_privilege();
1122 if (VC_ERROR_NONE != ret)
1125 RETVM_IF(NULL == audio_id, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Invalid parameter");
1128 if (0 != vc_mgr_client_get_client_state(&state)) {
1129 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1130 return VC_ERROR_INVALID_STATE;
1134 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
1136 /* Check service state */
1137 vc_service_state_e service_state = -1;
1138 vc_mgr_client_get_service_state(&service_state);
1139 RETVM_IF(service_state != VC_SERVICE_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current service state(%d) is not 'READY'", service_state);
1143 vc_mgr_client_get_audio_type(&temp);
1146 /* Not initiallized */
1149 ret = vc_mgr_tidl_request_get_audio_type(g_pid, &temp);
1151 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get audio type : %s", __vc_mgr_get_error_code(ret));
1153 SLOG(LOG_ERROR, TAG_VCM, "[SUCCESS] Get audio type : %s", temp);
1155 vc_mgr_client_set_audio_type(temp);
1161 *audio_id = strdup(temp);
1166 // TODO: check return value correct or not
1167 return VC_ERROR_NONE;
1170 int vc_mgr_get_current_commands(vc_cmd_list_h* vc_cmd_list)
1172 SLOG(LOG_ERROR, TAG_VCM, "@@@ [Manager] Foreach current commands");
1175 ret = __check_mgr_feature_privilege();
1176 if (VC_ERROR_NONE != ret)
1180 if (0 != vc_mgr_client_get_client_state(&state)) {
1181 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1182 return VC_ERROR_INVALID_STATE;
1186 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
1188 /* Check service state */
1189 vc_service_state_e service_state = -1;
1190 vc_mgr_client_get_service_state(&service_state);
1191 RETVM_IF(service_state != VC_SERVICE_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: service state(%d) is not 'READY'", service_state);
1193 RETVM_IF(NULL == vc_cmd_list, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Invalid Parameter");
1195 vc_cmd_list_h temp_list = NULL;
1196 if (0 != vc_cmd_list_create(&temp_list)) {
1197 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to create list");
1198 return VC_ERROR_INVALID_PARAMETER;
1201 *vc_cmd_list = temp_list;
1206 /* Get foreground pid */
1207 if (0 != vc_mgr_client_get_foreground(&fg_pid)) {
1208 /* There is no foreground app for voice control */
1209 SLOG(LOG_WARN, TAG_VCM, "[Manager WARNING] No foreground pid for voice control");
1211 SLOG(LOG_INFO, TAG_VCM, "[Manager] Foreground pid(%d)", fg_pid);
1214 if (0 != vc_mgr_client_get_pid(&mgr_pid)) {
1215 SLOG(LOG_ERROR, TAG_VCM, "[Manager] Fail to get manager pid");
1216 return VC_ERROR_OPERATION_FAILED;
1218 SLOG(LOG_INFO, TAG_VCM, "[Manager] Manager pid(%d)", mgr_pid);
1221 /* Get system command */
1222 ret = vc_cmd_parser_append_commands(mgr_pid, VC_COMMAND_TYPE_SYSTEM, temp_list);
1224 SLOG(LOG_INFO, TAG_VCM, "[Manager] No system commands");
1228 ret = vc_mgr_tidl_request_set_client_info(g_pid);
1230 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to set client info : %s", __vc_mgr_get_error_code(ret));
1232 SLOG(LOG_INFO, TAG_VCM, "[SUCCESS] Set client info");
1235 GSList *iter = NULL;
1236 GSList* client_info_list = NULL;
1237 vc_client_info_s *client_info = NULL;
1238 bool is_fgpid = false;
1240 if (0 != vc_info_parser_get_client_info(&client_info_list)) {
1241 SLOG(LOG_INFO, TAG_VCM, "[DEBUG] No client");
1242 return VC_ERROR_NONE;
1245 if (VC_NO_FOREGROUND_PID != fg_pid) {
1246 iter = g_slist_nth(client_info_list, 0);
1247 while (NULL != iter) {
1248 client_info = iter->data;
1249 if (NULL != client_info) {
1250 if (fg_pid == client_info->pid) {
1255 iter = g_slist_next(iter);
1259 /* Get foreground commands and widget */
1260 if (true == is_fgpid) {
1262 SLOG(LOG_INFO, TAG_VCM, "[Manager] fore cmd(%d)", client_info->fg_cmd);
1264 /* Get foreground command */
1265 if (true == client_info->fg_cmd) {
1266 ret = vc_cmd_parser_append_commands(fg_pid, VC_COMMAND_TYPE_FOREGROUND, temp_list);
1268 SLOG(LOG_ERROR, TAG_VCM, "[Client Data ERROR] Fail to get the fg command list");
1271 SLOG(LOG_INFO, TAG_VCM, "[Manager] No foreground commands");
1274 /* Check exclusive option */
1275 if (true == client_info->exclusive_cmd) {
1276 SLOG(LOG_INFO, TAG_VCM, "[Manager] Exclusive command is ON");
1278 /* Set background command for exclusive option */
1279 if (true == client_info->bg_cmd) {
1280 SLOG(LOG_INFO, TAG_VCM, "[Manager] Set background command");
1281 ret = vc_cmd_parser_append_commands(client_info->pid, VC_COMMAND_TYPE_BACKGROUND, temp_list);
1283 SLOG(LOG_ERROR, TAG_VCM, "[Client Data ERROR] Fail to get the bg command list : pid(%d)", client_info->pid);
1287 /* need to release client info */
1288 iter = g_slist_nth(client_info_list, 0);
1290 while (NULL != iter) {
1291 client_info = iter->data;
1292 if (NULL != client_info) {
1295 client_info_list = g_slist_remove_link(client_info_list, iter);
1296 iter = g_slist_nth(client_info_list, 0);
1299 SLOG(LOG_DEBUG, TAG_VCM, "@@@ [Manager] Foreach current commands DONE");
1301 return VC_ERROR_NONE;
1304 SLOG(LOG_INFO, TAG_VCM, "[Manager] No foreground app");
1307 /* Get background commands */
1308 if (0 < g_slist_length(client_info_list)) {
1309 iter = g_slist_nth(client_info_list, 0);
1311 while (NULL != iter) {
1312 client_info = iter->data;
1314 if (NULL != client_info) {
1315 SLOG(LOG_INFO, TAG_VCM, "[Manager] Pid(%d) Back cmd(%d)", client_info->pid, client_info->bg_cmd);
1316 if (true == client_info->bg_cmd) {
1317 ret = vc_cmd_parser_append_commands(client_info->pid, VC_COMMAND_TYPE_BACKGROUND, temp_list);
1319 SLOG(LOG_ERROR, TAG_VCM, "[Client Data ERROR] Fail to get the bg command list : pid(%d)", client_info->pid);
1324 client_info_list = g_slist_remove_link(client_info_list, iter);
1326 iter = g_slist_nth(client_info_list, 0);
1330 SLOG(LOG_INFO, TAG_VCM, "[Manager] No background commands");
1333 SLOG(LOG_ERROR, TAG_VCM, "@@@ [Manager] Foreach current commands DONE");
1335 // TODO: check return value correct or not
1336 return VC_ERROR_NONE;
1339 int vc_mgr_set_recognition_mode(vc_recognition_mode_e mode)
1341 SLOG(LOG_INFO, TAG_VCM, "@@@ [Manager] Set recognition mode = %d", mode);
1344 ret = __check_mgr_feature_privilege();
1345 if (VC_ERROR_NONE != ret)
1348 /* check vc recognition mode */
1349 if (mode < VC_RECOGNITION_MODE_STOP_BY_SILENCE || mode > VC_RECOGNITION_MODE_MANUAL) {
1350 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] invalid parameter: 'mode' is not supported mode (%d)", mode);
1351 return VC_ERROR_INVALID_PARAMETER;
1355 if (0 != vc_mgr_client_get_client_state(&state)) {
1356 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1357 return VC_ERROR_INVALID_STATE;
1361 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
1363 /* Check service state */
1364 vc_service_state_e service_state = -1;
1365 vc_mgr_client_get_service_state(&service_state);
1366 RETVM_IF(service_state != VC_SERVICE_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current service state(%d) is not 'READY'", service_state);
1368 vc_mgr_client_set_recognition_mode(mode);
1369 return VC_ERROR_NONE;
1372 int vc_mgr_get_recognition_mode(vc_recognition_mode_e* mode)
1375 ret = __check_mgr_feature_privilege();
1376 if (VC_ERROR_NONE != ret)
1379 RETVM_IF(NULL == mode, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Invalid parameter, mode is NULL ptr");
1382 if (0 != vc_mgr_client_get_client_state(&state)) {
1383 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1384 return VC_ERROR_INVALID_STATE;
1387 ret = vc_mgr_client_get_recognition_mode(mode);
1389 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get recognition mode");
1393 SLOG(LOG_INFO, TAG_VCM, "@@@ [Manager] Get recognition mode = %d", *mode);
1394 return VC_ERROR_NONE;
1397 int vc_mgr_set_private_data(const char* key, const char* data)
1399 SLOG(LOG_INFO, TAG_VCM, "@@@ [Manager] Set private data");
1402 ret = __check_mgr_feature_privilege();
1403 if (VC_ERROR_NONE != ret)
1406 RETVM_IF(NULL == key, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Invalid parameter");
1409 if (0 != vc_mgr_client_get_client_state(&state)) {
1410 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1411 return VC_ERROR_INVALID_STATE;
1415 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
1417 /* Check service state */
1418 vc_service_state_e service_state = -1;
1419 vc_mgr_client_get_service_state(&service_state);
1420 RETVM_IF(service_state != VC_SERVICE_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current service state(%d) is not 'READY'", service_state);
1422 ret = vc_mgr_tidl_request_set_private_data(g_pid, key, data);
1424 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to set private data : %s", __vc_mgr_get_error_code(ret));
1427 SLOG(LOG_DEBUG, TAG_VCM, "[SUCCESS] Set private data");
1430 SLOG(LOG_DEBUG, TAG_VCM, "@@@ [Manager] Set private data DONE");
1432 return VC_ERROR_NONE;
1435 int vc_mgr_get_private_data(const char* key, char** data)
1437 SLOG(LOG_DEBUG, TAG_VCM, "@@@ [Manager] Get private data");
1440 ret = __check_mgr_feature_privilege();
1441 if (VC_ERROR_NONE != ret)
1444 if (NULL == key || NULL == data) {
1445 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid parameter");
1446 return VC_ERROR_INVALID_PARAMETER;
1450 if (0 != vc_mgr_client_get_client_state(&state)) {
1451 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1452 return VC_ERROR_INVALID_STATE;
1456 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
1458 /* Check service state */
1459 vc_service_state_e service_state = -1;
1460 vc_mgr_client_get_service_state(&service_state);
1461 RETVM_IF(service_state != VC_SERVICE_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current service state(%d) is not 'READY'", service_state);
1464 ret = vc_mgr_tidl_request_get_private_data(g_pid, key, &temp);
1466 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get private data request : %s", __vc_mgr_get_error_code(ret));
1468 SLOG(LOG_INFO, TAG_VCM, "[SUCCESS] Get private data, key(%s), data(%s)", key, temp);
1472 *data = strdup(temp);
1477 SLOG(LOG_DEBUG, TAG_VCM, "@@@ [Manager] Get private data DONE");
1479 // TODO: check return value correct or not
1480 return VC_ERROR_NONE;
1483 int vc_mgr_set_domain(const char* domain)
1485 SLOG(LOG_DEBUG, TAG_VCM, "@@@ [Manager] Set domain");
1488 ret = __check_mgr_feature_privilege();
1489 if (VC_ERROR_NONE != ret)
1492 RETVM_IF(NULL == domain, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Invalid parameter");
1495 if (0 != vc_mgr_client_get_client_state(&state)) {
1496 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1497 return VC_ERROR_INVALID_STATE;
1501 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
1503 /* Check service state */
1504 vc_service_state_e service_state = -1;
1505 vc_mgr_client_get_service_state(&service_state);
1506 RETVM_IF(service_state != VC_SERVICE_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current service state(%d) is not 'READY'", service_state);
1508 ret = vc_mgr_tidl_request_set_domain(g_pid, domain);
1510 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to set domain request : %s", __vc_mgr_get_error_code(ret));
1512 SLOG(LOG_INFO, TAG_VCM, "[SUCCESS] Set domain");
1515 SLOG(LOG_DEBUG, TAG_VCM, "@@@ [Manager] Set domain DONE");
1517 return VC_ERROR_NONE;
1520 int vc_mgr_do_action(vc_send_event_type_e type, char* send_event)
1522 SLOG(LOG_INFO, TAG_VCM, "@@@ [Manager] do action");
1525 ret = __check_mgr_feature_privilege();
1526 if (VC_ERROR_NONE != ret)
1529 if (type < VC_SEND_EVENT_TYPE_TEXT || VC_SEND_EVENT_TYPE_HAPTIC_EVENT < type) {
1530 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] send event type is not valid, (%d)", type);
1531 return VC_ERROR_INVALID_PARAMETER;
1534 RETVM_IF(NULL == send_event, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Invalid parameter");
1537 if (0 != vc_mgr_client_get_client_state(&state)) {
1538 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1539 return VC_ERROR_INVALID_STATE;
1543 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
1545 /* Check service state */
1546 vc_service_state_e service_state = -1;
1547 vc_mgr_client_get_service_state(&service_state);
1548 RETVM_IF(service_state != VC_SERVICE_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current service state(%d) is not 'READY'", service_state);
1550 ret = vc_mgr_tidl_request_do_action(g_pid, type, send_event);
1552 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to do action request : %s", __vc_mgr_get_error_code(ret));
1555 SLOG(LOG_INFO, TAG_VCM, "[SUCCESS] do action");
1557 SLOG(LOG_DEBUG, TAG_VCM, "@@@ [Manager] do action DONE");
1559 return VC_ERROR_NONE;
1562 int vc_mgr_send_specific_engine_request(const char* engine_app_id, const char* event, const char* request)
1564 SLOG(LOG_INFO, TAG_VCM, "@@@ [Manager] send specific engine request");
1567 ret = __check_mgr_feature_privilege();
1568 if (VC_ERROR_NONE != ret)
1571 SLOG(LOG_INFO, TAG_VCM, "@@@ [Manager] specific engine request. engine app id(%s), event(%s), request(%s)", engine_app_id, event, request);
1573 if (NULL == engine_app_id || NULL == event) {
1574 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid parameter");
1575 return VC_ERROR_INVALID_PARAMETER;
1578 if (NULL == request) {
1579 SLOG(LOG_ERROR, TAG_VCM, "[INFO] Input parameter is NULL. (no request)");
1583 if (0 != vc_mgr_client_get_client_state(&state)) {
1584 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1585 return VC_ERROR_INVALID_STATE;
1589 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
1591 /* Check service state */
1592 vc_service_state_e service_state = -1;
1593 vc_mgr_client_get_service_state(&service_state);
1594 RETVM_IF(service_state != VC_SERVICE_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current service state(%d) is not 'READY'", service_state);
1596 ret = vc_mgr_tidl_send_specific_engine_request(g_pid, engine_app_id, event, request);
1598 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to specific engine request : %s", __vc_mgr_get_error_code(ret));
1601 SLOG(LOG_INFO, TAG_VCM, "[SUCCESS] specific engine request");
1603 SLOG(LOG_DEBUG, TAG_VCM, "@@@ [Manager] send specific engine request DONE");
1605 return VC_ERROR_NONE;
1608 int vc_mgr_start(bool exclusive_command_option)
1610 SLOG(LOG_ERROR, TAG_VCM, "@@@ [Manager] Request start");
1613 ret = __check_mgr_feature_privilege();
1614 if (VC_ERROR_NONE != ret)
1618 if (0 != vc_mgr_client_get_client_state(&state)) {
1619 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1620 return VC_ERROR_INVALID_STATE;
1624 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
1626 /* Check service state */
1627 vc_service_state_e service_state = -1;
1628 vc_mgr_client_get_service_state(&service_state);
1629 RETVM_IF(service_state != VC_SERVICE_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current service state(%d) is not 'READY'", service_state);
1631 /* Check internal state for async */
1632 vc_internal_state_e internal_state = -1;
1633 vc_mgr_client_get_internal_state(&internal_state);
1634 if (internal_state != VC_INTERNAL_STATE_NONE) {
1635 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State : Internal state is NOT none : %d", internal_state);
1636 return VC_ERROR_IN_PROGRESS_TO_RECORDING;
1639 vc_mgr_client_set_exclusive_command(exclusive_command_option);
1641 bool start_by_client = false;
1642 if (0 != vc_mgr_client_get_start_by_client(&start_by_client)) {
1643 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get start by client");
1646 int disabled_cmd_type = 0;
1647 if (0 != vc_mgr_client_get_disabled_command_type(&disabled_cmd_type)) {
1648 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get disabled command type");
1651 vc_recognition_mode_e recognition_mode = VC_RECOGNITION_MODE_STOP_BY_SILENCE;
1652 if (0 != vc_mgr_get_recognition_mode(&recognition_mode)) {
1653 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get recognition mode");
1658 vc_mgr_client_set_internal_state(VC_INTERNAL_STATE_STARTING);
1659 ret = vc_mgr_tidl_request_start(g_pid, (int)recognition_mode, exclusive_command_option, start_by_client, disabled_cmd_type);
1661 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to start request start : %s", __vc_mgr_get_error_code(ret));
1662 vc_mgr_client_set_internal_state(VC_INTERNAL_STATE_NONE);
1664 SLOG(LOG_INFO, TAG_VCM, "[SUCCESS] start recognition");
1667 vc_mgr_core_initialize_volume_variable();
1669 SLOG(LOG_ERROR, TAG_VCM, "@@@ [Manager] Request start DONE, ret(%d)", ret);
1674 int vc_mgr_stop(void)
1676 SLOG(LOG_ERROR, TAG_VCM, "@@@ [Manager] Request stop");
1679 ret = __check_mgr_feature_privilege();
1680 if (VC_ERROR_NONE != ret)
1684 if (0 != vc_mgr_client_get_client_state(&state)) {
1685 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1686 return VC_ERROR_INVALID_STATE;
1690 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
1692 /* Check service state */
1693 vc_service_state_e service_state = -1;
1694 vc_mgr_client_get_service_state(&service_state);
1695 RETVM_IF(service_state != VC_SERVICE_STATE_RECORDING, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current service state(%d) is not 'RECORDING'", service_state);
1697 /* Check internal state for async */
1698 vc_internal_state_e internal_state = -1;
1699 vc_mgr_client_get_internal_state(&internal_state);
1700 if (VC_INTERNAL_STATE_STARTING == internal_state) {
1701 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State : Internal state is STARTING");
1702 return VC_ERROR_IN_PROGRESS_TO_RECORDING;
1703 } else if (VC_INTERNAL_STATE_STOPPING == internal_state) {
1704 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State : Internal state is STOPPING");
1705 return VC_ERROR_IN_PROGRESS_TO_PROCESSING;
1706 } else if (VC_INTERNAL_STATE_CANCELING == internal_state) {
1707 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State : Internal state is CANCELING");
1708 return VC_ERROR_IN_PROGRESS_TO_READY;
1713 vc_mgr_client_set_internal_state(VC_INTERNAL_STATE_STOPPING);
1714 ret = vc_mgr_tidl_request_stop(g_pid);
1716 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to stop request : %s", __vc_mgr_get_error_code(ret));
1717 vc_mgr_client_set_internal_state(VC_INTERNAL_STATE_NONE);
1719 SLOG(LOG_INFO, TAG_VCM, "[SUCCESS] Stop recognition");
1722 SLOG(LOG_DEBUG, TAG_VCM, "@@@ [Manager] Request stop DONE");
1727 int vc_mgr_cancel(void)
1729 SLOG(LOG_INFO, TAG_VCM, "@@@ [Manager] Request cancel");
1732 ret = __check_mgr_feature_privilege();
1733 if (VC_ERROR_NONE != ret)
1737 if (0 != vc_mgr_client_get_client_state(&state)) {
1738 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1739 return VC_ERROR_INVALID_STATE;
1743 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
1745 /* Check service state */
1746 vc_service_state_e service_state = -1;
1747 vc_mgr_client_get_service_state(&service_state);
1748 RETVM_IF(service_state == VC_SERVICE_STATE_NONE, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state is NONE");
1750 vc_internal_state_e internal_state = -1;
1751 vc_mgr_client_get_internal_state(&internal_state);
1752 if (VC_INTERNAL_STATE_STARTING == internal_state) {
1753 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State : Internal state is STARTING");
1754 return VC_ERROR_IN_PROGRESS_TO_RECORDING;
1755 } else if (VC_INTERNAL_STATE_STOPPING == internal_state) {
1756 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State : Internal state is STOPPING");
1757 return VC_ERROR_IN_PROGRESS_TO_PROCESSING;
1758 } else if (VC_INTERNAL_STATE_CANCELING == internal_state) {
1759 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State : Internal state is CANCELING");
1760 return VC_ERROR_IN_PROGRESS_TO_READY;
1764 vc_mgr_client_set_internal_state(VC_INTERNAL_STATE_CANCELING);
1765 ret = vc_mgr_tidl_request_cancel(g_pid);
1767 SLOG(LOG_DEBUG, TAG_VCM, "[ERROR] Fail to cancel request : %s", __vc_mgr_get_error_code(ret));
1768 vc_mgr_client_set_internal_state(VC_INTERNAL_STATE_NONE);
1770 SLOG(LOG_INFO, TAG_VCM, "[SUCCESS] Cancel recognition");
1773 vc_mgr_client_set_exclusive_command(false);
1775 SLOG(LOG_DEBUG, TAG_VCM, "@@@ [Manager] Request cancel DONE");
1780 // TODO: check called by app direactly meaning
1781 int __vc_mgr_set_volume(float volume)
1783 // called by app directly
1784 vc_mgr_core_set_volume(volume);
1786 return VC_ERROR_NONE;
1789 int vc_mgr_get_recording_volume(float* volume)
1792 ret = __check_mgr_feature_privilege();
1793 if (VC_ERROR_NONE != ret)
1796 RETVM_IF(NULL == volume, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Invalid parameter");
1798 vc_service_state_e service_state = -1;
1799 if (0 != vc_mgr_client_get_service_state(&service_state)) {
1800 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1801 return VC_ERROR_INVALID_STATE;
1805 RETVM_IF(VC_SERVICE_STATE_RECORDING != service_state, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Service state is not 'RECORDING'");
1807 *volume = vc_mgr_core_get_volume();
1809 return VC_ERROR_NONE;
1812 int vc_mgr_set_selected_results(vc_cmd_list_h vc_cmd_list)
1814 SLOG(LOG_INFO, TAG_VCM, "@@@ [Manager] Select result");
1817 ret = __check_mgr_feature_privilege();
1818 if (VC_ERROR_NONE != ret)
1821 /* Do not check state for 'restart continuously' mode */
1823 vc_service_state_e service_state = -1;
1824 vc_mgr_client_get_service_state(&service_state);
1825 if (service_state != VC_SERVICE_STATE_PROCESSING) {
1826 vc_recognition_mode_e recognition_mode;
1827 vc_mgr_get_recognition_mode(&recognition_mode);
1829 if (VC_RECOGNITION_MODE_RESTART_CONTINUOUSLY != recognition_mode) {
1830 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: service state is not 'PROCESSING' and mode is not 'Restart continuously'");
1831 return VC_ERROR_INVALID_STATE;
1835 ret = vc_mgr_core_set_selected_results(vc_cmd_list, g_pid);
1840 int vc_mgr_set_all_result_cb(vc_mgr_all_result_cb callback, void* user_data)
1843 ret = __check_mgr_feature_privilege();
1844 if (VC_ERROR_NONE != ret)
1847 RETVM_IF(NULL == callback, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Invalid parameter");
1850 if (0 != vc_mgr_client_get_client_state(&state)) {
1851 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set result callback : A handle is not available");
1852 return VC_ERROR_INVALID_STATE;
1856 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
1858 vc_mgr_client_set_all_result_cb(callback, user_data);
1860 SLOG(LOG_INFO, TAG_VCM, "[SUCCESS] Set all result callback");
1862 return VC_ERROR_NONE;
1865 int vc_mgr_unset_all_result_cb(void)
1868 ret = __check_mgr_feature_privilege();
1869 if (VC_ERROR_NONE != ret)
1873 if (0 != vc_mgr_client_get_client_state(&state)) {
1874 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset result callback : A handle is not available");
1875 return VC_ERROR_INVALID_STATE;
1879 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
1881 vc_mgr_client_set_all_result_cb(NULL, NULL);
1883 return VC_ERROR_NONE;
1886 int vc_mgr_set_result_cb(vc_result_cb callback, void* user_data)
1889 ret = __check_mgr_feature_privilege();
1890 if (VC_ERROR_NONE != ret)
1893 RETVM_IF(NULL == callback, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Invalid parameter");
1896 if (0 != vc_mgr_client_get_client_state(&state)) {
1897 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set result callback : A handle is not available");
1898 return VC_ERROR_INVALID_STATE;
1902 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
1904 vc_mgr_client_set_result_cb(callback, user_data);
1906 return VC_ERROR_NONE;
1909 int vc_mgr_unset_result_cb(void)
1912 ret = __check_mgr_feature_privilege();
1913 if (VC_ERROR_NONE != ret)
1917 if (0 != vc_mgr_client_get_client_state(&state)) {
1918 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset result callback : A handle is not available");
1919 return VC_ERROR_INVALID_STATE;
1923 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
1925 vc_mgr_client_set_result_cb(NULL, NULL);
1927 return VC_ERROR_NONE;
1930 int vc_mgr_set_pre_result_cb(vc_mgr_pre_result_cb callback, void* user_data)
1933 ret = __check_mgr_feature_privilege();
1934 if (VC_ERROR_NONE != ret)
1937 RETVM_IF(NULL == callback, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Invalid parameter");
1940 if (0 != vc_mgr_client_get_client_state(&state)) {
1941 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set pre result callback : A handle is not available");
1942 return VC_ERROR_INVALID_STATE;
1946 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
1948 vc_mgr_client_set_pre_result_cb(callback, user_data);
1950 return VC_ERROR_NONE;
1953 int vc_mgr_unset_pre_result_cb(void)
1956 ret = __check_mgr_feature_privilege();
1957 if (VC_ERROR_NONE != ret)
1961 if (0 != vc_mgr_client_get_client_state(&state)) {
1962 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset pre result callback : A handle is not available");
1963 return VC_ERROR_INVALID_STATE;
1967 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
1969 vc_mgr_client_set_pre_result_cb(NULL, NULL);
1971 return VC_ERROR_NONE;
1974 int vc_mgr_get_error_message(char** err_msg)
1976 SLOG(LOG_DEBUG, TAG_VCM, "@@@ [Manager] Get error message");
1979 ret = __check_mgr_feature_privilege();
1980 if (VC_ERROR_NONE != ret)
1985 if (0 != vc_mgr_client_get_client_state(&state)) {
1986 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] vc_mgr handle is not available");
1987 return VC_ERROR_INVALID_STATE;
1990 RETVM_IF(NULL == err_msg, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Invalid parameter");
1992 ret = vc_mgr_core_get_error_message(err_msg);
1994 SLOG(LOG_DEBUG, TAG_VCM, "@@@ [Manager] Get error message DONE");
1999 static Eina_Bool __vc_mgr_notify_state_changed(void *data)
2001 vc_state_changed_cb changed_callback = NULL;
2004 vc_mgr_client_get_state_changed_cb(&changed_callback, &user_data);
2006 vc_state_e current_state;
2007 vc_state_e previous_state;
2009 vc_mgr_client_get_previous_state(¤t_state, &previous_state);
2011 if (NULL != changed_callback) {
2012 vc_mgr_client_use_callback();
2013 changed_callback(previous_state, current_state, user_data);
2014 vc_mgr_client_not_use_callback();
2015 SLOG(LOG_INFO, TAG_VCM, "State changed callback is called");
2017 SLOG(LOG_WARN, TAG_VCM, "[WARNING] State changed callback is null");
2023 int vc_mgr_set_state_changed_cb(vc_state_changed_cb callback, void* user_data)
2026 ret = __check_mgr_feature_privilege();
2027 if (VC_ERROR_NONE != ret)
2030 if (callback == NULL)
2031 return VC_ERROR_INVALID_PARAMETER;
2034 if (0 != vc_mgr_client_get_client_state(&state)) {
2035 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set state changed callback : A handle is not available");
2036 return VC_ERROR_INVALID_STATE;
2040 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
2042 vc_mgr_client_set_state_changed_cb(callback, user_data);
2044 SLOG(LOG_INFO, TAG_VCM, "[SUCCESS] Set state changed callback");
2045 return VC_ERROR_NONE;
2048 int vc_mgr_unset_state_changed_cb(void)
2051 ret = __check_mgr_feature_privilege();
2052 if (VC_ERROR_NONE != ret)
2056 if (0 != vc_mgr_client_get_client_state(&state)) {
2057 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset state changed callback : A handle is not available");
2058 return VC_ERROR_INVALID_STATE;
2062 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
2064 vc_mgr_client_set_state_changed_cb(NULL, NULL);
2066 return VC_ERROR_NONE;
2069 int vc_mgr_set_service_state_changed_cb(vc_service_state_changed_cb callback, void* user_data)
2072 ret = __check_mgr_feature_privilege();
2073 if (VC_ERROR_NONE != ret)
2076 if (callback == NULL)
2077 return VC_ERROR_INVALID_PARAMETER;
2080 if (0 != vc_mgr_client_get_client_state(&state)) {
2081 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set state changed callback : A handle is not available");
2082 return VC_ERROR_INVALID_STATE;
2086 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
2088 vc_mgr_client_set_service_state_changed_cb(callback, user_data);
2090 SLOG(LOG_INFO, TAG_VCM, "[SUCCESS] Set service state changed callback");
2091 return VC_ERROR_NONE;
2094 int vc_mgr_unset_service_state_changed_cb(void)
2097 ret = __check_mgr_feature_privilege();
2098 if (VC_ERROR_NONE != ret)
2102 if (0 != vc_mgr_client_get_client_state(&state)) {
2103 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset state changed callback : A handle is not available");
2104 return VC_ERROR_INVALID_STATE;
2108 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
2110 vc_mgr_client_set_service_state_changed_cb(NULL, NULL);
2111 return VC_ERROR_NONE;
2114 int vc_mgr_set_speech_detected_cb(vc_mgr_begin_speech_detected_cb callback, void* user_data)
2117 ret = __check_mgr_feature_privilege();
2118 if (VC_ERROR_NONE != ret)
2121 if (callback == NULL)
2122 return VC_ERROR_INVALID_PARAMETER;
2125 if (0 != vc_mgr_client_get_client_state(&state)) {
2126 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set state changed callback : A handle is not available");
2127 return VC_ERROR_INVALID_STATE;
2131 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
2133 vc_mgr_client_set_speech_detected_cb(callback, user_data);
2135 SLOG(LOG_INFO, TAG_VCM, "[SUCCESS] Set speech detected callback");
2136 return VC_ERROR_NONE;
2139 int vc_mgr_unset_speech_detected_cb(void)
2142 ret = __check_mgr_feature_privilege();
2143 if (VC_ERROR_NONE != ret)
2147 if (0 != vc_mgr_client_get_client_state(&state)) {
2148 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset state changed callback : A handle is not available");
2149 return VC_ERROR_INVALID_STATE;
2153 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
2155 vc_mgr_client_set_speech_detected_cb(NULL, NULL);
2156 return VC_ERROR_NONE;
2159 int vc_mgr_set_current_language_changed_cb(vc_current_language_changed_cb callback, void* user_data)
2162 ret = __check_mgr_feature_privilege();
2163 if (VC_ERROR_NONE != ret)
2166 RETVM_IF(NULL == callback, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Invalid parameter");
2169 if (0 != vc_mgr_client_get_client_state(&state)) {
2170 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set current language changed : A handle is not available");
2171 return VC_ERROR_INVALID_STATE;
2175 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
2177 vc_mgr_client_set_current_lang_changed_cb(callback, user_data);
2179 SLOG(LOG_INFO, TAG_VCM, "[SUCCESS] Set current language changed callback");
2180 return VC_ERROR_NONE;
2183 int vc_mgr_unset_current_language_changed_cb(void)
2186 ret = __check_mgr_feature_privilege();
2187 if (VC_ERROR_NONE != ret)
2191 if (0 != vc_mgr_client_get_client_state(&state)) {
2192 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset current language changed : A handle is not available");
2193 return VC_ERROR_INVALID_STATE;
2197 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
2199 vc_mgr_client_set_current_lang_changed_cb(NULL, NULL);
2201 return VC_ERROR_NONE;
2204 int vc_mgr_set_error_cb(vc_error_cb callback, void* user_data)
2207 ret = __check_mgr_feature_privilege();
2208 if (VC_ERROR_NONE != ret)
2211 RETVM_IF(NULL == callback, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Invalid parameter");
2214 if (0 != vc_mgr_client_get_client_state(&state)) {
2215 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set error callback : A handle is not available");
2216 return VC_ERROR_INVALID_STATE;
2220 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
2222 vc_mgr_client_set_error_cb(callback, user_data);
2224 return VC_ERROR_NONE;
2227 int vc_mgr_unset_error_cb(void)
2230 ret = __check_mgr_feature_privilege();
2231 if (VC_ERROR_NONE != ret)
2235 if (0 != vc_mgr_client_get_client_state(&state)) {
2236 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset error callback : A handle is not available");
2237 return VC_ERROR_INVALID_STATE;
2241 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
2243 vc_mgr_client_set_error_cb(NULL, NULL);
2245 return VC_ERROR_NONE;
2248 int vc_mgr_set_dialog_request_cb(vc_mgr_dialog_request_cb callback, void* user_data)
2251 ret = __check_mgr_feature_privilege();
2252 if (VC_ERROR_NONE != ret)
2255 RETVM_IF(NULL == callback, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Invalid parameter");
2258 if (0 != vc_mgr_client_get_client_state(&state)) {
2259 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set error callback : A handle is not available");
2260 return VC_ERROR_INVALID_STATE;
2264 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
2266 vc_mgr_client_set_dialog_request_cb(callback, user_data);
2268 return VC_ERROR_NONE;
2271 int vc_mgr_unset_dialog_request_cb(void)
2274 ret = __check_mgr_feature_privilege();
2275 if (VC_ERROR_NONE != ret)
2279 if (0 != vc_mgr_client_get_client_state(&state)) {
2280 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset error callback : A handle is not available");
2281 return VC_ERROR_INVALID_STATE;
2285 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
2287 vc_mgr_client_set_dialog_request_cb(NULL, NULL);
2289 return VC_ERROR_NONE;
2292 int vc_mgr_set_private_data_set_cb(vc_mgr_private_data_set_cb callback, void* user_data)
2295 ret = __check_mgr_feature_privilege();
2296 if (VC_ERROR_NONE != ret)
2299 RETVM_IF(NULL == callback, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Invalid parameter");
2302 if (0 != vc_mgr_client_get_client_state(&state)) {
2303 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set private data set callback : A handle is not available");
2304 return VC_ERROR_INVALID_STATE;
2308 RETVM_IF(VC_STATE_INITIALIZED != state, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Set private data set callback : Current state is not 'Initialized'");
2310 vc_mgr_client_set_private_data_set_cb(callback, user_data);
2312 return VC_ERROR_NONE;
2315 int vc_mgr_unset_private_data_set_cb(void)
2318 ret = __check_mgr_feature_privilege();
2319 if (VC_ERROR_NONE != ret)
2323 if (0 != vc_mgr_client_get_client_state(&state)) {
2324 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset private data set callback : A handle is not available");
2325 return VC_ERROR_INVALID_STATE;
2329 RETVM_IF(VC_STATE_INITIALIZED != state, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Unset private data set callback : Current state is not 'Initialized'");
2331 vc_mgr_client_set_private_data_set_cb(NULL, NULL);
2333 return VC_ERROR_NONE;
2336 int vc_mgr_set_private_data_requested_cb(vc_mgr_private_data_requested_cb callback, void* user_data)
2339 ret = __check_mgr_feature_privilege();
2340 if (VC_ERROR_NONE != ret)
2343 RETVM_IF(NULL == callback, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Invalid parameter");
2346 if (0 != vc_mgr_client_get_client_state(&state)) {
2347 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set private data requested callback : A handle is not available");
2348 return VC_ERROR_INVALID_STATE;
2352 RETVM_IF(VC_STATE_INITIALIZED != state, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Set private data requested callback : Current state is not 'Initialized'");
2354 vc_mgr_client_set_private_data_requested_cb(callback, user_data);
2356 return VC_ERROR_NONE;
2359 int vc_mgr_unset_private_data_requested_cb(void)
2362 ret = __check_mgr_feature_privilege();
2363 if (VC_ERROR_NONE != ret)
2367 if (0 != vc_mgr_client_get_client_state(&state)) {
2368 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset private data requested callback : A handle is not available");
2369 return VC_ERROR_INVALID_STATE;
2373 RETVM_IF(VC_STATE_INITIALIZED != state, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Unset private data requested callback : Current state is not 'Initialized'");
2375 vc_mgr_client_set_private_data_requested_cb(NULL, NULL);
2377 return VC_ERROR_NONE;
2380 int vc_mgr_set_specific_engine_result_cb(vc_mgr_specific_engine_result_cb callback, void* user_data)
2383 ret = __check_mgr_feature_privilege();
2384 if (VC_ERROR_NONE != ret)
2387 RETVM_IF(NULL == callback, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Invalid parameter");
2390 if (0 != vc_mgr_client_get_client_state(&state)) {
2391 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set specific engine result callback : A handle is not available");
2392 return VC_ERROR_INVALID_STATE;
2396 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
2398 vc_mgr_client_set_specific_engine_result_cb(callback, user_data);
2400 return VC_ERROR_NONE;
2402 int vc_mgr_unset_specific_engine_result_cb(void)
2404 if (0 != __vc_mgr_get_feature_enabled()) {
2405 return VC_ERROR_NOT_SUPPORTED;
2409 if (0 != vc_mgr_client_get_client_state(&state)) {
2410 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset specific engine result callback : A handle is not available");
2411 return VC_ERROR_INVALID_STATE;
2415 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
2417 vc_mgr_client_set_specific_engine_result_cb(NULL, NULL);
2419 return VC_ERROR_NONE;
2422 /* for TTS feedback */
2423 int vc_mgr_set_feedback_audio_format_cb(vc_mgr_feedback_audio_format_cb callback, void* user_data)
2425 SLOG(LOG_INFO, TAG_VCM, "@@@ [Manager] set feedback audio format");
2428 ret = __check_mgr_feature_privilege();
2429 if (VC_ERROR_NONE != ret)
2432 RETVM_IF(NULL == callback, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Invalid parameter");
2435 if (0 != vc_mgr_client_get_client_state(&state)) {
2436 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set feedback audio format callback : A handle is not available");
2437 return VC_ERROR_INVALID_STATE;
2441 RETVM_IF(VC_STATE_INITIALIZED != state, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Set feedback audio format callback : Current state is not 'Initialized'");
2443 vc_mgr_client_set_feedback_audio_format_cb(callback, user_data);
2445 SLOG(LOG_INFO, TAG_VCM, "[SUCCESS] Set feedback audio format callback");
2447 return VC_ERROR_NONE;
2450 int vc_mgr_unset_feedback_audio_format_cb()
2452 SLOG(LOG_INFO, TAG_VCM, "@@@ [Manager] unset feedback audio format");
2455 ret = __check_mgr_feature_privilege();
2456 if (VC_ERROR_NONE != ret)
2460 if (0 != vc_mgr_client_get_client_state(&state)) {
2461 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset feedback audio format callback : A handle is not available");
2462 return VC_ERROR_INVALID_STATE;
2466 RETVM_IF(VC_STATE_INITIALIZED != state, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Unset feedback audio format callback : Current state is not 'Initialized'");
2468 vc_mgr_client_set_feedback_audio_format_cb(NULL, NULL);
2470 SLOG(LOG_INFO, TAG_VCM, "[SUCCESS] Unset feedback audio format callback");
2472 return VC_ERROR_NONE;
2475 int vc_mgr_set_feedback_streaming_cb(vc_mgr_feedback_streaming_cb callback, void* user_data)
2477 SLOG(LOG_INFO, TAG_VCM, "@@@ [Manager] set feedback streaming");
2480 ret = __check_mgr_feature_privilege();
2481 if (VC_ERROR_NONE != ret)
2484 RETVM_IF(NULL == callback, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Invalid parameter");
2486 pthread_mutex_lock(&g_feedback_streaming_cb_mutex);
2489 if (0 != vc_mgr_client_get_client_state(&state)) {
2490 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set feedback streaming callback : A handle is not available");
2491 pthread_mutex_unlock(&g_feedback_streaming_cb_mutex);
2492 return VC_ERROR_INVALID_STATE;
2496 if (VC_STATE_INITIALIZED != state) {
2497 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set feedback streaming callback : Current state is not 'Initialized' (%d)", state);
2498 pthread_mutex_unlock(&g_feedback_streaming_cb_mutex);
2499 return VC_ERROR_INVALID_STATE;
2502 vc_mgr_client_set_feedback_streaming_cb(callback, user_data);
2504 pthread_mutex_unlock(&g_feedback_streaming_cb_mutex);
2506 SLOG(LOG_INFO, TAG_VCM, "[SUCCESS] Set feedback streaming callback");
2508 return VC_ERROR_NONE;
2511 int vc_mgr_unset_feedback_streaming_cb()
2513 SLOG(LOG_INFO, TAG_VCM, "@@@ [Manager] unset feedback streaming");
2516 ret = __check_mgr_feature_privilege();
2517 if (VC_ERROR_NONE != ret)
2520 pthread_mutex_lock(&g_feedback_streaming_cb_mutex);
2523 if (0 != vc_mgr_client_get_client_state(&state)) {
2524 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset feedback streaming callback : A handle is not available");
2525 pthread_mutex_unlock(&g_feedback_streaming_cb_mutex);
2526 return VC_ERROR_INVALID_STATE;
2530 if (VC_STATE_INITIALIZED != state) {
2531 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset feedback streaming callback : Current state is not 'Initialized' (%d)", state);
2532 pthread_mutex_unlock(&g_feedback_streaming_cb_mutex);
2533 return VC_ERROR_INVALID_STATE;
2536 vc_mgr_client_set_feedback_streaming_cb(NULL, NULL);
2538 pthread_mutex_unlock(&g_feedback_streaming_cb_mutex);
2540 SLOG(LOG_INFO, TAG_VCM, "[SUCCESS] Unset feedback streaming callback");
2542 return VC_ERROR_NONE;
2545 int vc_mgr_set_vc_tts_streaming_cb(vc_mgr_vc_tts_streaming_cb callback, void* user_data)
2547 SLOG(LOG_INFO, TAG_VCM, "@@@ [Manager] set vc tts streaming callback");
2550 ret = __check_mgr_feature_privilege();
2551 if (VC_ERROR_NONE != ret)
2554 RETVM_IF(NULL == callback, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Invalid parameter");
2556 pthread_mutex_lock(&g_vc_tts_streaming_cb_mutex);
2559 if (0 != vc_mgr_client_get_client_state(&state)) {
2560 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set feedback streaming callback : A handle is not available");
2561 pthread_mutex_unlock(&g_vc_tts_streaming_cb_mutex);
2562 return VC_ERROR_INVALID_STATE;
2566 if (VC_STATE_INITIALIZED != state) {
2567 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set feedback streaming callback : Current state is not 'Initialized' (%d)", state);
2568 pthread_mutex_unlock(&g_vc_tts_streaming_cb_mutex);
2569 return VC_ERROR_INVALID_STATE;
2572 vc_mgr_client_set_vc_tts_streaming_cb(callback, user_data);
2574 pthread_mutex_unlock(&g_vc_tts_streaming_cb_mutex);
2576 SLOG(LOG_INFO, TAG_VCM, "[SUCCESS] Set feedback streaming callback");
2578 return VC_ERROR_NONE;
2581 int vc_mgr_unset_vc_tts_streaming_cb()
2583 SLOG(LOG_INFO, TAG_VCM, "@@@ [Manager] unset vc tts streaming callback");
2586 ret = __check_mgr_feature_privilege();
2587 if (VC_ERROR_NONE != ret)
2590 pthread_mutex_lock(&g_vc_tts_streaming_cb_mutex);
2593 if (0 != vc_mgr_client_get_client_state(&state)) {
2594 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset feedback streaming callback : A handle is not available");
2595 pthread_mutex_unlock(&g_vc_tts_streaming_cb_mutex);
2596 return VC_ERROR_INVALID_STATE;
2600 if (VC_STATE_INITIALIZED != state) {
2601 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset feedback streaming callback : Current state is not 'Initialized' (%d)", state);
2602 pthread_mutex_unlock(&g_vc_tts_streaming_cb_mutex);
2603 return VC_ERROR_INVALID_STATE;
2606 vc_mgr_client_set_vc_tts_streaming_cb(NULL, NULL);
2608 pthread_mutex_unlock(&g_vc_tts_streaming_cb_mutex);
2610 SLOG(LOG_INFO, TAG_VCM, "[SUCCESS] Unset feedback streaming callback");
2612 return VC_ERROR_NONE;
2615 static void __tts_feedback_thread(void* data, Ecore_Thread* thread)
2617 SLOG(LOG_INFO, TAG_VCM, "[SUCCESS] Start thread");
2619 vc_feedback_data_s* feedback_data = NULL;
2625 /* get feedback data */
2626 ret = vc_mgr_data_get_feedback_data(&feedback_data);
2627 if (0 != ret || NULL == feedback_data) {
2629 SLOG(LOG_INFO, TAG_VCM, "[DEBUG] No feedback data. Waiting mode");
2633 if (ecore_thread_check(thread) == EINA_TRUE) {
2634 SLOG(LOG_INFO, TAG_VCM, "[INFO] Stop feedback is called");
2640 if (0 < vc_mgr_data_get_feedback_data_size()) {
2641 SLOG(LOG_INFO, TAG_VCM, "[INFO] Resume thread");
2645 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Wrong request, there's no pcm data");
2646 vc_mgr_data_clear_feedback_data(&feedback_data);
2651 SLOG(LOG_INFO, TAG_VCM, "[INFO] Finish to wait for new feedback data come");
2653 /* resume feedback thread */
2654 vc_mgr_data_clear_feedback_data(&feedback_data);
2658 if (NULL != feedback_data) {
2659 if (getpid() == feedback_data->pid) {
2660 vc_mgr_feedback_streaming_cb callback = NULL;
2661 void* user_data = NULL;
2663 pthread_mutex_lock(&g_feedback_streaming_cb_mutex);
2665 vc_mgr_client_get_feedback_streaming_cb(&callback, &user_data);
2666 if (NULL == callback) {
2667 SLOG(LOG_WARN, TAG_VCM, "[WARNING] TTS feedback streaming callback is null");
2668 vc_mgr_data_clear_feedback_data(&feedback_data);
2669 pthread_mutex_unlock(&g_feedback_streaming_cb_mutex);
2673 SLOG(LOG_DEBUG, TAG_VCM, "TTS feedback streaming callback is called");
2674 vc_mgr_client_use_callback();
2675 callback(feedback_data->event, feedback_data->data, feedback_data->data_size, user_data);
2676 vc_mgr_client_not_use_callback();
2678 pthread_mutex_unlock(&g_feedback_streaming_cb_mutex);
2680 vc_mgr_vc_tts_streaming_cb callback = NULL;
2681 void* user_data = NULL;
2683 pthread_mutex_lock(&g_vc_tts_streaming_cb_mutex);
2685 vc_mgr_client_get_vc_tts_streaming_cb(&callback, &user_data);
2686 if (NULL == callback) {
2687 SLOG(LOG_WARN, TAG_VCM, "[WARNING] vc tts streaming callback is null");
2688 vc_mgr_data_clear_feedback_data(&feedback_data);
2689 pthread_mutex_unlock(&g_vc_tts_streaming_cb_mutex);
2693 SLOG(LOG_DEBUG, TAG_VCM, "vc tts feedback streaming callback is called");
2694 vc_mgr_client_use_callback();
2695 callback(feedback_data->pid, feedback_data->utt_id, feedback_data->event, feedback_data->data, feedback_data->data_size, user_data);
2696 vc_mgr_client_not_use_callback();
2698 pthread_mutex_unlock(&g_vc_tts_streaming_cb_mutex);
2700 free(feedback_data);
2701 feedback_data = NULL;
2706 static void __end_tts_feedback_thread(void* data, Ecore_Thread* thread)
2708 SLOG(LOG_INFO, TAG_VCM, "[SUCCESS] End thread");
2709 g_feedback_thread = NULL;
2712 static void __cancel_tts_feedback_thread(void* data, Ecore_Thread* thread)
2714 SLOG(LOG_INFO, TAG_VCM, "[SUCCESS] Cancel thread");
2715 g_feedback_thread = NULL;
2718 int vc_mgr_start_feedback(void)
2720 SLOG(LOG_INFO, TAG_VCM, "@@@ [Manager] start feedback");
2723 ret = __check_mgr_feature_privilege();
2724 if (VC_ERROR_NONE != ret)
2727 SLOG(LOG_INFO, TAG_VCM, "@@@ [Manager] Request start TTS feedback");
2730 if (0 != vc_mgr_client_get_client_state(&state)) {
2731 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Start feedback : A handle is not available");
2732 return VC_ERROR_INVALID_STATE;
2736 RETVM_IF(VC_STATE_READY != state, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Start feedback : Current state is not 'Ready' (%d)", state);
2738 bool is_exist = ecore_thread_check(g_feedback_thread);
2739 if (NULL == g_feedback_thread || TRUE == is_exist) {
2740 SLOG(LOG_INFO, TAG_VCM, "[INFO] ecore thread run : __tts_feedback_thread");
2741 g_feedback_thread = ecore_thread_run(__tts_feedback_thread, __end_tts_feedback_thread, __cancel_tts_feedback_thread, NULL);
2744 return VC_ERROR_NONE;
2747 int vc_mgr_stop_feedback(void)
2749 SLOG(LOG_INFO, TAG_VCM, "@@@ [Manager] stop feedback");
2752 ret = __check_mgr_feature_privilege();
2753 if (VC_ERROR_NONE != ret)
2756 SLOG(LOG_INFO, TAG_VCM, "@@@ [Manager] Request stop TTS feedback");
2759 if (0 != vc_mgr_client_get_client_state(&state)) {
2760 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Stop feedback : A handle is not available");
2761 return VC_ERROR_INVALID_STATE;
2765 RETVM_IF(VC_STATE_READY != state, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Stop feedback : Current state is not 'Ready' (%d)", state);
2767 if (g_feedback_thread) {
2768 ecore_thread_cancel(g_feedback_thread);
2769 g_feedback_thread = NULL;
2774 vc_feedback_data_s* feedback_data = NULL;
2776 /* get feedback data */
2777 ret = vc_mgr_data_get_feedback_data(&feedback_data);
2778 if (0 != ret || NULL == feedback_data) {
2780 SLOG(LOG_INFO, TAG_VCM, "[INFO] No feedback data to stop any more");
2781 return VC_ERROR_NONE;
2783 ret = vc_mgr_data_clear_feedback_data(&feedback_data);
2785 SLOG(LOG_INFO, TAG_VCM, "[ERROR] Fail to clear data, ret(%d)", ret);
2793 int vc_mgr_send_utterance_status(int pid, int utt_id, vc_tts_utterance_status_e utt_status)
2795 SLOG(LOG_INFO, TAG_VCM, "@@@ [Manager] send utterance status, pid(%d), utt_id(%d), utt_status(%d)", pid, utt_id, utt_status);
2798 ret = __check_mgr_feature_privilege();
2799 if (VC_ERROR_NONE != ret)
2802 if (VC_TTS_UTTERANCE_NONE > utt_status || VC_TTS_UTTERANCE_CANCELED < utt_status || 0 == utt_status) {
2803 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] utt_status is not valid. (%d)", utt_status);
2804 return VC_ERROR_INVALID_PARAMETER;
2808 if (0 != vc_mgr_client_get_client_state(&state)) {
2809 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
2810 return VC_ERROR_INVALID_STATE;
2814 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Ready'", state);
2816 /* Check service state */
2817 vc_service_state_e service_state = -1;
2818 vc_mgr_client_get_service_state(&service_state);
2819 RETVM_IF(service_state != VC_SERVICE_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current service state(%d) is not 'READY'", service_state);
2821 ret = vc_mgr_tidl_send_utterance_status(pid, utt_id, utt_status);
2823 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to send utterance status : %s", __vc_mgr_get_error_code(ret));
2825 SLOG(LOG_INFO, TAG_VCM, "[SUCCESS] Send utterance status");
2827 SLOG(LOG_DEBUG, TAG_VCM, "@@@ [Manager] send utterance status DONE");
2831 static float __get_volume_decibel(char* data, int size)
2833 #define MAX_AMPLITUDE_MEAN_16 32768
2840 unsigned long long square_sum = 0;
2845 for (i = 0; i < size; i += (depthByte<<1)) {
2847 memcpy(&pcm16, data + i, sizeof(short));
2848 square_sum += pcm16 * pcm16;
2852 if (0 == count || 0 == square_sum) {
2853 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] No data");
2856 rms = sqrt((float)square_sum/count);
2859 db = 20 * log10(rms/MAX_AMPLITUDE_MEAN_16);
2863 int vc_mgr_send_audio_streaming(vc_audio_streaming_event_e event, unsigned char* buffer, unsigned int len)
2865 SLOG(LOG_INFO, TAG_VCM, "[Manager] Send audio streaming to the engine service, event(%d)", event);
2868 ret = __check_mgr_feature_privilege();
2869 if (VC_ERROR_NONE != ret)
2872 if (VC_AUDIO_STREAMING_EVENT_FAIL > event || VC_AUDIO_STREAMING_EVENT_FINISH < event || 0 == event) {
2873 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] event is invalid parameter (%d)", event);
2874 return VC_ERROR_INVALID_PARAMETER;
2877 RETVM_IF(NULL == buffer, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Invalid parameter");
2879 vc_state_e state = VC_STATE_NONE;
2880 ret = vc_mgr_client_get_client_state(&state);
2882 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
2883 return VC_ERROR_INVALID_STATE;
2886 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Ready'", state);
2888 vc_service_state_e service_state = VC_SERVICE_STATE_NONE;
2889 ret = vc_mgr_client_get_service_state(&service_state);
2891 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
2892 return VC_ERROR_INVALID_STATE;
2895 if (VC_SERVICE_STATE_READY != service_state && VC_SERVICE_STATE_RECORDING != service_state) {
2896 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: service state is not 'READY' and 'RECORDING', state(%d)", service_state);
2897 return VC_ERROR_INVALID_STATE;
2900 float volume = __get_volume_decibel((char*)buffer, len);
2901 // TODO: check __vc_mgr_set_volume need to move
2902 __vc_mgr_set_volume(volume);
2904 ret = vc_mgr_tidl_send_audio_streaming(g_pid, event, buffer, len);
2906 SLOG(LOG_WARN, TAG_VCM, "[WARNING] retry to send audio streaming data");
2908 SLOG(LOG_INFO, TAG_VCM, "[DEBUG] Success to send");
2912 int vc_mgr_set_audio_streaming_mode(vc_audio_streaming_mode_e mode)
2914 SLOG(LOG_INFO, TAG_VCM, "[Manager] Set multi assistant mode, mode(%d)", mode);
2917 ret = __check_mgr_feature_privilege();
2918 if (VC_ERROR_NONE != ret)
2921 if (VC_AUDIO_STREAMING_MODE_VC_SERVICE > mode || VC_AUDIO_STREAMING_MODE_OUTSIDE < mode) {
2922 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] mode is invalid parameter (%d)", mode);
2923 return VC_ERROR_INVALID_PARAMETER;
2926 vc_state_e state = VC_STATE_NONE;
2927 ret = vc_mgr_client_get_client_state(&state);
2929 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
2930 return VC_ERROR_INVALID_STATE;
2933 vc_service_state_e service_state = VC_SERVICE_STATE_NONE;
2934 ret = vc_mgr_client_get_service_state(&service_state);
2936 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
2937 return VC_ERROR_INVALID_STATE;
2940 if (VC_STATE_INITIALIZED == state && VC_SERVICE_STATE_NONE == service_state) {
2941 ret = vc_mgr_client_set_audio_streaming_mode(mode);
2942 if (VC_ERROR_NONE != ret) {
2943 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to set multi assistant mode : %s", __vc_mgr_get_error_code(ret));
2944 return VC_ERROR_INVALID_STATE;
2946 SLOG(LOG_DEBUG, TAG_VCM, "[SUCCESS] Set audio streaming mode in vc mgr client");
2948 } else if (VC_STATE_READY == state && VC_SERVICE_STATE_READY == service_state) {
2949 ret = vc_mgr_client_set_audio_streaming_mode(mode);
2950 if (VC_ERROR_NONE != ret) {
2951 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to set multi assistant mode : %s", __vc_mgr_get_error_code(ret));
2952 return VC_ERROR_INVALID_STATE;
2954 SLOG(LOG_DEBUG, TAG_VCM, "[SUCCESS] Set audio streaming mode in vc mgr client");
2957 ret = vc_mgr_tidl_request_set_audio_streaming_mode(g_pid, mode);
2958 if (VC_ERROR_NONE != ret) {
2959 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to set audio streaming mode : %s", __vc_mgr_get_error_code(ret));
2960 return VC_ERROR_OPERATION_FAILED;
2962 SLOG(LOG_DEBUG, TAG_VCM, "[SUCCESS] Set audio streaming mode in vc mgr tidl");
2965 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: Current state is not 'INITIALIZED', state(%d)", state);
2966 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: Current service state is not 'READY', service_state(%d)", service_state);
2967 return VC_ERROR_INVALID_STATE;
2970 return VC_ERROR_NONE;
2973 //TODO it's internal api, so will remove it.
2974 int vc_mgr_change_system_volume(vc_system_volume_event_e event)
2976 return vc_mgr_change_background_volume(event);
2979 //TODO it's internal api, so will remove it.
2980 int vc_mgr_recover_system_volume(void)
2982 return vc_mgr_reset_background_volume();
2985 int vc_mgr_change_background_volume(vc_background_volume_event_e event)
2987 SLOG(LOG_INFO, TAG_VCM, "[Manager] Change background volume. event(%d)", event);
2990 ret = __check_mgr_feature_privilege();
2991 if (VC_ERROR_NONE != ret)
2994 if (VC_BACKGROUND_VOLUME_EVENT_CHANGE_FOR_NEARFIELD > event || VC_BACKGROUND_VOLUME_EVENT_CHANGE_FOR_FARFIELD < event) {
2995 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] event is invalid parameter (%d)", event);
2996 return VC_ERROR_INVALID_PARAMETER;
2999 vc_state_e state = VC_STATE_NONE;
3000 ret = vc_mgr_client_get_client_state(&state);
3001 if (VC_ERROR_NONE != ret) {
3002 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
3003 return VC_ERROR_INVALID_STATE;
3006 if (state != VC_STATE_READY && state != VC_STATE_INITIALIZED) {
3007 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: Current state is not 'READY' and not 'INITIALIZED', state(%d)", state);
3008 return VC_ERROR_INVALID_STATE;
3012 if (VC_BACKGROUND_VOLUME_EVENT_CHANGE_FOR_FARFIELD == event)
3013 ratio = VC_MGR_DEFAULT_FARFIELD_DUCKING_RATIO;
3014 else if (VC_BACKGROUND_VOLUME_EVENT_CHANGE_FOR_NEARFIELD == event)
3015 ratio = VC_MGR_DEFAULT_NEARFIELD_DUCKING_RATIO;
3017 ret = vc_mgr_ducking_activate(ratio);
3018 if (VC_ERROR_NONE != ret)
3019 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to change volume");
3021 SLOG(LOG_INFO, TAG_VCM, "[DEBUG] Success to change volume");
3025 int vc_mgr_change_background_volume_by_ratio(double ratio)
3027 SLOG(LOG_INFO, TAG_VCM, "[Manager] Change background volume. ratio(%f)", ratio);
3030 ret = __check_mgr_feature_privilege();
3031 if (VC_ERROR_NONE != ret)
3034 if (VC_MGR_MINIMUM_DUCKING_RATIO > ratio || VC_MGR_MAXIMUM_DUCKING_RATIO < ratio) {
3035 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] ratio is invalid parameter (%lf)", ratio);
3036 return VC_ERROR_INVALID_PARAMETER;
3039 vc_state_e state = VC_STATE_NONE;
3040 ret = vc_mgr_client_get_client_state(&state);
3041 if (VC_ERROR_NONE != ret) {
3042 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
3043 return VC_ERROR_INVALID_STATE;
3046 if (state != VC_STATE_READY && state != VC_STATE_INITIALIZED) {
3047 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: Current state is not 'READY' and not 'INITIALIZED', state(%d)", state);
3048 return VC_ERROR_INVALID_STATE;
3051 ret = vc_mgr_ducking_activate(ratio);
3052 if (VC_ERROR_NONE != ret)
3053 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to set ratio");
3055 SLOG(LOG_INFO, TAG_VCM, "[DEBUG] Success to set ratio");
3060 int vc_mgr_reset_background_volume(void)
3062 SLOG(LOG_INFO, TAG_VCM, "[Manager] Recover background volume");
3065 ret = __check_mgr_feature_privilege();
3066 if (VC_ERROR_NONE != ret)
3069 vc_state_e state = VC_STATE_NONE;
3070 ret = vc_mgr_client_get_client_state(&state);
3071 if (VC_ERROR_NONE != ret) {
3072 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
3073 return VC_ERROR_INVALID_STATE;
3076 if (state != VC_STATE_READY && state != VC_STATE_INITIALIZED) {
3077 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: Current state is not 'READY' and not 'INITIALIZED', state(%d)", state);
3078 return VC_ERROR_INVALID_STATE;
3081 ret = vc_mgr_ducking_deactivate();
3082 if (VC_ERROR_NONE != ret)
3083 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to recover volume");
3085 SLOG(LOG_INFO, TAG_VCM, "[DEBUG] Success to recover volume");