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_player.h"
36 #include "vc_mgr_ducking.h"
37 #include "voice_control_command.h"
38 #include "voice_control_command_expand.h"
39 #include "voice_control_common.h"
40 #include "voice_control_manager.h"
41 #include "voice_control_manager_internal.h"
44 #define VC_MANAGER_CONFIG_HANDLE 10000000
46 static Ecore_Timer* g_send_hello_timer = NULL;
47 static Ecore_Timer* g_request_init_timer = NULL;
48 static int g_tidl_send_hello_count = 0;
52 static int g_daemon_pid = 0;
54 static int g_feature_enabled = -1;
56 static bool g_privilege_allowed = false;
58 static cynara *p_cynara = NULL;
59 static pthread_mutex_t g_cynara_mutex = PTHREAD_MUTEX_INITIALIZER;
61 /* for TTS feedback */
62 static Ecore_Thread* g_feedback_thread = NULL;
64 static pthread_mutex_t g_feedback_streaming_cb_mutex = PTHREAD_MUTEX_INITIALIZER;
65 static pthread_mutex_t g_vc_tts_streaming_cb_mutex = PTHREAD_MUTEX_INITIALIZER;
67 static Eina_Bool __vc_mgr_notify_state_changed(void *data);
69 static const char* __vc_mgr_get_error_code(vc_error_e err)
72 case VC_ERROR_NONE: return "VC_ERROR_NONE";
73 case VC_ERROR_OUT_OF_MEMORY: return "VC_ERROR_OUT_OF_MEMORY";
74 case VC_ERROR_IO_ERROR: return "VC_ERROR_IO_ERROR";
75 case VC_ERROR_INVALID_PARAMETER: return "VC_ERROR_INVALID_PARAMETER";
76 case VC_ERROR_TIMED_OUT: return "VC_ERROR_TIMED_OUT";
77 case VC_ERROR_RECORDER_BUSY: return "VC_ERROR_RECORDER_BUSY";
78 case VC_ERROR_INVALID_STATE: return "VC_ERROR_INVALID_STATE";
79 case VC_ERROR_INVALID_LANGUAGE: return "VC_ERROR_INVALID_LANGUAGE";
80 case VC_ERROR_ENGINE_NOT_FOUND: return "VC_ERROR_ENGINE_NOT_FOUND";
81 case VC_ERROR_OPERATION_FAILED: return "VC_ERROR_OPERATION_FAILED";
82 default: return "Invalid error code";
87 static void __vc_mgr_lang_changed_cb(const char* previous_lang, const char* current_lang)
89 SLOG(LOG_INFO, TAG_VCM, "Lang changed : previous lang(%s) current lang(%s)",
90 previous_lang, current_lang);
92 vc_current_language_changed_cb callback = NULL;
94 vc_mgr_client_get_current_lang_changed_cb(&callback, &lang_user_data);
96 if (NULL != callback) {
97 vc_mgr_client_use_callback();
98 callback(previous_lang, current_lang, lang_user_data);
99 vc_mgr_client_not_use_callback();
100 SLOG(LOG_INFO, TAG_VCM, "Language changed callback is called");
102 SLOG(LOG_WARN, TAG_VCM, "[WARNING] Language changed callback is null");
108 static int __vc_mgr_get_feature_enabled()
110 if (0 == g_feature_enabled) {
111 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Voice control feature NOT supported");
112 return VC_ERROR_NOT_SUPPORTED;
113 } else if (-1 == g_feature_enabled) {
114 bool vc_supported = false;
115 bool mic_supported = false;
116 if (0 == system_info_get_platform_bool(VC_MGR_FEATURE_PATH, &vc_supported)) {
117 if (0 == system_info_get_platform_bool(VC_MIC_FEATURE_PATH, &mic_supported)) {
118 if (false == vc_supported || false == mic_supported) {
119 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Voice control feature NOT supported");
120 g_feature_enabled = 0;
121 return VC_ERROR_NOT_SUPPORTED;
124 g_feature_enabled = 1;
129 return VC_ERROR_NONE;
132 static int __check_privilege_initialize()
134 int ret = cynara_initialize(&p_cynara, NULL);
135 if (NULL == p_cynara || CYNARA_API_SUCCESS != ret) {
136 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] fail to initialize(%d)", ret);
140 return ret == CYNARA_API_SUCCESS;
143 static int __check_privilege(const char* uid, const char * privilege)
146 char label_path[1024] = "/proc/self/attr/current";
147 char smack_label[1024] = {'\0',};
150 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] p_cynara is NULL");
154 fp = fopen(label_path, "r");
156 if (fread(smack_label, 1, sizeof(smack_label), fp) <= 0)
157 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] fail to fread");
162 pid_t pid = getpid();
163 char *session = cynara_session_from_pid(pid);
164 int ret = cynara_check(p_cynara, smack_label, session, uid, privilege);
169 if (ret != CYNARA_API_ACCESS_ALLOWED) {
170 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);
177 static void __check_privilege_deinitialize()
180 int ret = cynara_finish(p_cynara);
181 if (ret != CYNARA_API_SUCCESS)
182 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] cynara finish %d", ret);
187 static int __vc_mgr_check_privilege()
189 if (true == g_privilege_allowed)
190 return VC_ERROR_NONE;
192 pthread_mutex_lock(&g_cynara_mutex);
194 if (false == g_privilege_allowed) {
196 ret = __check_privilege_initialize();
198 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] privilege initialize is failed");
199 g_privilege_allowed = false;
200 pthread_mutex_unlock(&g_cynara_mutex);
201 return VC_ERROR_PERMISSION_DENIED;
205 snprintf(uid, 32, "%d", getuid());
207 ret = __check_privilege(uid, VC_PRIVILEGE_RECORDER);
209 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Permission is denied(%s)(%s)", VC_PRIVILEGE_RECORDER, uid);
210 __check_privilege_deinitialize();
211 g_privilege_allowed = false;
212 pthread_mutex_unlock(&g_cynara_mutex);
213 return VC_ERROR_PERMISSION_DENIED;
216 ret = __check_privilege(uid, VC_MGR_PRIVILEGE);
218 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Permission is denied(%s)(%s)", VC_MGR_PRIVILEGE, uid);
219 __check_privilege_deinitialize();
220 g_privilege_allowed = false;
221 pthread_mutex_unlock(&g_cynara_mutex);
222 return VC_ERROR_PERMISSION_DENIED;
225 __check_privilege_deinitialize();
228 g_privilege_allowed = true;
229 pthread_mutex_unlock(&g_cynara_mutex);
230 return VC_ERROR_NONE;
233 int __check_mgr_feature_privilege()
235 if (0 != __vc_mgr_get_feature_enabled()) {
236 SLOG(LOG_DEBUG, TAG_VCM, "@@@ [Manager] not supported");
237 return VC_ERROR_NOT_SUPPORTED;
240 if (0 != __vc_mgr_check_privilege()) {
241 return VC_ERROR_PERMISSION_DENIED;
244 return VC_ERROR_NONE;
247 int vc_mgr_initialize(void)
249 SLOG(LOG_ERROR, TAG_VCM, "@@@ [Manager] Initialize");
252 ret = __check_mgr_feature_privilege();
253 if (VC_ERROR_NONE != ret)
257 if (true == vc_mgr_client_is_valid()) {
258 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Already initialized");
259 return VC_ERROR_NONE;
262 if (0 != vc_mgr_tidl_open_connection()) {
263 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to open tidl connection");
264 return VC_ERROR_OPERATION_FAILED;
267 if (0 != vc_mgr_client_create()) {
268 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to create client!!!!!");
269 return VC_ERROR_OUT_OF_MEMORY;
273 ret = vc_config_mgr_initialize(g_pid + VC_MANAGER_CONFIG_HANDLE);
275 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to init config manager : %d", ret);
276 vc_mgr_client_destroy();
277 return VC_ERROR_OPERATION_FAILED;
280 ret = vc_config_mgr_set_lang_cb(g_pid + VC_MANAGER_CONFIG_HANDLE, __vc_mgr_lang_changed_cb);
282 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to set callback : %d", ret);
283 vc_config_mgr_finalize(g_pid + VC_MANAGER_CONFIG_HANDLE);
284 vc_mgr_client_destroy();
285 return VC_ERROR_OPERATION_FAILED;
288 ret = vc_mgr_client_set_audio_streaming_mode(VC_AUDIO_STREAMING_MODE_VC_SERVICE);
290 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to set audio streaming mode : %d", ret);
291 vc_config_mgr_finalize(g_pid + VC_MANAGER_CONFIG_HANDLE);
292 vc_mgr_client_destroy();
296 /* for TTS feedback */
297 /* ret = vc_mgr_player_init();
299 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to initialize VC mgr player : %d", ret);
303 ret = vc_mgr_ducking_create();
304 if (VC_ERROR_NONE != ret) {
305 SLOG(LOG_INFO, TAG_VCM, "[INFO] Fail to ducking create : %d", ret);
308 SLOG(LOG_ERROR, TAG_VCM, "[Success] pid(%d)", g_pid);
310 SLOG(LOG_DEBUG, TAG_VCM, "@@@ [Manager] Initialize DONE");
312 return VC_ERROR_NONE;
315 static void __vc_mgr_internal_unprepare()
317 int ret = vc_mgr_tidl_request_finalize(g_pid);
319 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request finalize : %s", __vc_mgr_get_error_code(ret));
322 vc_mgr_client_set_internal_state(VC_INTERNAL_STATE_NONE);
326 int vc_mgr_deinitialize(void)
328 SLOG(LOG_ERROR, TAG_VCM, "@@@ [Manager] Deinitialize");
331 ret = __check_mgr_feature_privilege();
332 if (VC_ERROR_NONE != ret)
335 if (false == vc_mgr_client_is_valid()) {
336 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] NOT initialized");
337 return VC_ERROR_INVALID_STATE;
341 vc_mgr_client_get_client_state(&state);
346 __vc_mgr_internal_unprepare();
347 /* no break. need to next step*/
348 case VC_STATE_INITIALIZED:
349 if (NULL != g_send_hello_timer) {
350 SLOG(LOG_DEBUG, TAG_VCM, "Connect Timer is deleted");
351 ecore_timer_del(g_send_hello_timer);
352 g_send_hello_timer = NULL;
354 if (g_request_init_timer) {
355 SLOG(LOG_DEBUG, TAG_VCM, "Connect idler is deleted");
356 ecore_timer_del(g_request_init_timer);
357 g_request_init_timer = NULL;
360 vc_config_mgr_unset_lang_cb(g_pid + VC_MANAGER_CONFIG_HANDLE);
361 vc_config_mgr_finalize(g_pid + VC_MANAGER_CONFIG_HANDLE);
363 /* Free client resources */
364 vc_mgr_client_destroy();
371 SLOG(LOG_DEBUG, TAG_VCM, "Success: destroy");
373 int cnt = VC_COMMAND_TYPE_FOREGROUND;
375 ret = vc_cmd_parser_delete_file(getpid(), cnt);
377 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to delete file, type(%d), ret(%d)", cnt, ret);
378 } while (VC_COMMAND_TYPE_EXCLUSIVE >= ++cnt);
380 ret = vc_db_finalize();
382 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to finalize DB, ret(%d)", ret);
385 /* for TTS feedback */
386 /* ret = vc_mgr_player_release();
388 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to release VC mgr player(%d)", ret);
392 ret = vc_mgr_ducking_destroy();
393 if (VC_ERROR_NONE != ret) {
394 SLOG(LOG_INFO, TAG_VCM, "[INFO] Fail to ducking destroy : %d", ret);
397 if (0 != vc_mgr_tidl_close_connection()) {
398 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to close connection");
401 SLOG(LOG_ERROR, TAG_VCM, "@@@ [Manager] Deinitialize DONE");
403 return VC_ERROR_NONE;
406 static void __notify_error(void *data)
408 vc_mgr_core_notify_error();
411 static Eina_Bool __request_initialize(void *data)
413 /* request initialization */
415 int service_state = 0;
416 int foreground = VC_RUNTIME_INFO_NO_FOREGROUND;
420 if (true == vc_mgr_client_is_valid()) {
421 SLOG(LOG_DEBUG, TAG_VCM, "[DEBUG] is valid");
424 ret = vc_db_initialize();
426 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to initialize DB : %d", ret);
430 vc_audio_streaming_mode_e streaming_mode;
431 vc_mgr_client_get_audio_streaming_mode(&streaming_mode);
433 ret = vc_mgr_tidl_request_initialize(g_pid, (int)streaming_mode, &service_state, &foreground, &g_daemon_pid);
435 if (VC_ERROR_ENGINE_NOT_FOUND == ret) {
436 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to initialize : %s", __vc_mgr_get_error_code(ret));
438 vc_mgr_client_set_error(VC_ERROR_ENGINE_NOT_FOUND);
439 ecore_main_loop_thread_safe_call_async(__notify_error, NULL);
441 SLOG(LOG_DEBUG, TAG_VCM, "@@@");
442 g_request_init_timer = NULL;
445 } else if (0 != ret) {
446 SLOG(LOG_ERROR, TAG_VCM, "[WARNING] Fail to connection. Retry to connect : %s", __vc_mgr_get_error_code(ret));
447 ret = vc_db_finalize();
449 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to finalize DB : %d", ret);
453 /* Success to connect */
456 /* Set service state */
457 vc_service_state_e previous_service_state;
458 vc_mgr_client_get_service_state(&previous_service_state);
459 vc_mgr_client_set_service_state((vc_service_state_e)service_state);
461 vc_service_state_changed_cb service_changed_callback = NULL;
462 void* user_data = NULL;
463 vc_mgr_client_get_service_state_changed_cb(&service_changed_callback, &user_data);
465 if (NULL != service_changed_callback) {
466 vc_mgr_client_use_callback();
467 service_changed_callback(previous_service_state, service_state, user_data);
468 vc_mgr_client_not_use_callback();
469 SLOG(LOG_INFO, TAG_VCM, "Service state changed callback is called");
471 SLOG(LOG_WARN, TAG_VCM, "[WARNING] Service state changed callback is null");
475 vc_mgr_client_set_foreground(foreground, true);
477 SLOG(LOG_ERROR, TAG_VCM, "[SUCCESS] Connected daemon");
479 /* Set client state */
480 vc_mgr_client_set_client_state(VC_STATE_READY);
482 vc_state_changed_cb changed_callback = NULL;
484 vc_mgr_client_get_state_changed_cb(&changed_callback, &user_data);
486 vc_state_e current_state;
487 vc_state_e previous_state;
489 vc_mgr_client_get_previous_state(¤t_state, &previous_state);
491 if (NULL != changed_callback) {
492 vc_mgr_client_use_callback();
493 changed_callback(previous_state, current_state, user_data);
494 vc_mgr_client_not_use_callback();
495 SLOG(LOG_INFO, TAG_VCM, "State changed callback is called");
497 SLOG(LOG_WARN, TAG_VCM, "[WARNING] State changed callback is null");
500 SLOG(LOG_ERROR, TAG_VCM, "[Not ERROR] is not valid. It is destroyed."); //LCOV_EXCL_LINE
501 g_request_init_timer = NULL;
505 SLOG(LOG_ERROR, TAG_VCM, "@@@");
507 g_request_init_timer = NULL;
512 static Eina_Bool __send_hello_message(void *data)
515 if (0 != vc_mgr_tidl_request_hello()) {
516 if (g_tidl_send_hello_count == VCM_TIDL_RETRY_COUNT) {
517 g_tidl_send_hello_count = 0;
518 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request hello !! send error to manager");
519 vc_mgr_core_send_error(VC_ERROR_TIMED_OUT, -1, "voice_framework.error.vcfw.connect_engine_fail");
520 g_send_hello_timer = NULL;
523 g_tidl_send_hello_count++;
528 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Connect daemon");
530 if (NULL == g_request_init_timer) {
531 SLOG(LOG_INFO, TAG_VCM, "[DEBUG] Create a new idler for preparation");
532 g_request_init_timer = ecore_timer_add(0.0, __request_initialize, NULL);
534 SLOG(LOG_INFO, TAG_VCM, "[INFO] idler handle is already created");
537 g_send_hello_timer = NULL;
541 int vc_mgr_prepare(void)
543 SLOG(LOG_ERROR, TAG_VCM, "@@@ [Manager] Prepare");
546 ret = __check_mgr_feature_privilege();
547 if (VC_ERROR_NONE != ret)
551 if (0 != vc_mgr_client_get_client_state(&state)) {
552 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
553 return VC_ERROR_INVALID_STATE;
557 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
559 if (NULL == g_send_hello_timer) {
560 g_tidl_send_hello_count = 0;
561 SLOG(LOG_INFO, TAG_VCM, "[DEBUG] Create a new timer for preparation");
562 ecore_thread_main_loop_begin();
563 g_send_hello_timer = ecore_timer_add(0.1, __send_hello_message, NULL);
564 ecore_thread_main_loop_end();
566 SLOG(LOG_INFO, TAG_VCM, "[INFO] timer handle is already created");
569 SLOG(LOG_DEBUG, TAG_VCM, "@@@ [Manager] Calling Prepare DONE");
571 return VC_ERROR_NONE;
574 int vc_mgr_unprepare(void)
576 SLOG(LOG_ERROR, TAG_VCM, "@@@ [Manager] Unprepare");
579 ret = __check_mgr_feature_privilege();
580 if (VC_ERROR_NONE != ret)
584 if (0 != vc_mgr_client_get_client_state(&state)) {
585 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
586 return VC_ERROR_INVALID_STATE;
590 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Ready'", state);
592 __vc_mgr_internal_unprepare();
594 vc_mgr_client_set_client_state(VC_STATE_INITIALIZED);
595 ecore_timer_add(0, __vc_mgr_notify_state_changed, NULL);
597 SLOG(LOG_DEBUG, TAG_VCM, "@@@ [Manager] Unprepare DONE");
599 return VC_ERROR_NONE;
602 int vc_mgr_foreach_supported_languages(vc_supported_language_cb callback, void* user_data)
604 SLOG(LOG_INFO, TAG_VCM, "@@@ [Manager] Foreach Supported Language");
607 ret = __check_mgr_feature_privilege();
608 if (VC_ERROR_NONE != ret)
611 RETVM_IF(NULL == callback, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Input parameter is NULL");
614 if (0 != vc_mgr_client_get_client_state(&state)) {
615 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
616 return VC_ERROR_INVALID_STATE;
619 ret = vc_config_mgr_get_language_list(callback, user_data);
621 ret = vc_config_convert_error_code((vc_config_error_e)ret);
622 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get languages : %s", __vc_mgr_get_error_code(ret));
625 SLOG(LOG_DEBUG, TAG_VCM, "@@@ [Manager] Foreach Supported Language DONE");
627 return VC_ERROR_NONE;
630 int vc_mgr_get_current_language(char** language)
633 ret = __check_mgr_feature_privilege();
634 if (VC_ERROR_NONE != ret)
637 RETVM_IF(NULL == language, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Input parameter is NULL");
640 if (0 != vc_mgr_client_get_client_state(&state)) {
641 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
642 return VC_ERROR_INVALID_STATE;
645 ret = vc_config_mgr_get_default_language(language);
647 ret = vc_config_convert_error_code((vc_config_error_e)ret);
648 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get current languages : %s", __vc_mgr_get_error_code(ret));
650 SLOG(LOG_ERROR, TAG_VCM, "[Get current language] language : %s", *language);
656 int vc_mgr_get_state(vc_state_e* state)
658 SLOG(LOG_DEBUG, TAG_VCM, "@@@ [Manager] Get State");
661 ret = __check_mgr_feature_privilege();
662 if (VC_ERROR_NONE != ret)
665 RETVM_IF(NULL == state, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Input parameter is NULL");
668 if (0 != vc_mgr_client_get_client_state(&temp)) {
669 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
670 return VC_ERROR_INVALID_STATE;
676 case VC_STATE_NONE: SLOG(LOG_INFO, TAG_VCM, "Current state is 'None'"); break;
677 case VC_STATE_INITIALIZED: SLOG(LOG_INFO, TAG_VCM, "Current state is 'Created'"); break;
678 case VC_STATE_READY: SLOG(LOG_INFO, TAG_VCM, "Current state is 'Ready'"); break;
679 default: SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid state");
682 SLOG(LOG_DEBUG, TAG_VCM, "@@@ [Manager] Get State DONE");
684 return VC_ERROR_NONE;
687 int vc_mgr_get_service_state(vc_service_state_e* state)
689 SLOG(LOG_DEBUG, TAG_VCM, "@@@ [Manager] Get Service State");
692 ret = __check_mgr_feature_privilege();
693 if (VC_ERROR_NONE != ret)
696 RETVM_IF(NULL == state, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Input parameter is NULL");
698 vc_state_e client_state;
699 if (0 != vc_mgr_client_get_client_state(&client_state)) {
700 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
701 return VC_ERROR_INVALID_STATE;
705 RETVM_IF(client_state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Current state is not 'READY'");
707 /* get service state */
708 vc_service_state_e service_state;
709 if (0 != vc_mgr_client_get_service_state(&service_state)) {
710 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get service state");
711 return VC_ERROR_OPERATION_FAILED;
714 *state = service_state;
717 case VC_SERVICE_STATE_NONE: SLOG(LOG_DEBUG, TAG_VCM, "Current service state is 'None'"); break;
718 case VC_SERVICE_STATE_READY: SLOG(LOG_DEBUG, TAG_VCM, "Current service state is 'Ready'"); break;
719 case VC_SERVICE_STATE_RECORDING: SLOG(LOG_DEBUG, TAG_VCM, "Current service state is 'Recording'"); break;
720 case VC_SERVICE_STATE_PROCESSING: SLOG(LOG_DEBUG, TAG_VCM, "Current service state is 'Processing'"); break;
721 default: SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid state");
724 SLOG(LOG_DEBUG, TAG_VCM, "@@@ [Manager] Get Service State DONE");
726 return VC_ERROR_NONE;
729 int vc_mgr_set_demandable_client_rule(const char* rule)
731 SLOG(LOG_INFO, TAG_VCM, "@@@ [Manager] Set Demandable client rule(%s)", rule);
734 ret = __check_mgr_feature_privilege();
735 if (VC_ERROR_NONE != ret)
738 RETVM_IF(NULL == rule, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Input parameter is NULL");
741 if (0 != vc_mgr_client_get_client_state(&state)) {
742 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
743 return VC_ERROR_INVALID_STATE;
747 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Ready'", state);
749 ret = vc_mgr_core_set_demandable_client_rule(rule);
751 SLOG(LOG_DEBUG, TAG_VCM, "@@@ [Manager] Set Demandable client rule(%s) DONE", rule);
753 return VC_ERROR_NONE;
756 int vc_mgr_unset_demandable_client_rule(void)
758 SLOG(LOG_INFO, TAG_VCM, "@@@ [Manager] Unset Demandable client");
761 ret = __check_mgr_feature_privilege();
762 if (VC_ERROR_NONE != ret)
766 if (0 != vc_mgr_client_get_client_state(&state)) {
767 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
768 return VC_ERROR_INVALID_STATE;
772 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Ready'", state);
774 vc_info_parser_set_demandable_client(NULL);
776 ret = vc_mgr_tidl_request_demandable_client(g_pid);
778 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request unset client rule to daemon : %s", __vc_mgr_get_error_code(ret));
781 // TODO: check return value correct or not
782 return VC_ERROR_NONE;
785 int vc_mgr_is_command_format_supported(int format, bool* support)
787 SLOG(LOG_ERROR, TAG_VCM, "@@@ [Manager] Is command type supported");
790 ret = __check_mgr_feature_privilege();
791 if (VC_ERROR_NONE != ret)
794 RETVM_IF(NULL == support, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Input parameter is NULL");
797 if (0 != vc_mgr_client_get_client_state(&state)) {
798 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
799 return VC_ERROR_INVALID_STATE;
803 bool non_fixed_support = false;
804 if (0 != vc_config_mgr_get_nonfixed_support(&non_fixed_support)) {
805 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get nonfixed support info");
809 case VC_CMD_FORMAT_FIXED: *support = true; break;
810 case VC_CMD_FORMAT_FIXED_AND_VFIXED: *support = true; break;
811 case VC_CMD_FORMAT_VFIXED_AND_FIXED: *support = true; break;
812 case VC_CMD_FORMAT_FIXED_AND_NONFIXED: *support = non_fixed_support; break;
813 case VC_CMD_FORMAT_NONFIXED_AND_FIXED: *support = non_fixed_support; break;
814 default: *support = false; break;
817 SLOG(LOG_ERROR, TAG_VCM, "[DEBUG] Format(%d) support(%s)", format, *support ? "true" : "false");
819 SLOG(LOG_DEBUG, TAG_VCM, "@@@ [Manager] Is command type supported DONE");
821 return VC_ERROR_NONE;
824 int vc_mgr_enable_command_type(int cmd_type)
826 SLOG(LOG_ERROR, TAG_VCM, "@@@ [Manager] Enable Command Type, cmd_type(%d)", cmd_type);
829 ret = __check_mgr_feature_privilege();
830 if (VC_ERROR_NONE != ret)
833 if (VC_COMMAND_TYPE_FOREGROUND > cmd_type || VC_COMMAND_TYPE_EXCLUSIVE < cmd_type) {
834 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] cmd_type is not valid. (%d)", cmd_type);
835 return VC_ERROR_INVALID_PARAMETER;
839 if (0 != vc_mgr_client_get_client_state(&state)) {
840 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
841 return VC_ERROR_INVALID_STATE;
845 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Ready'", state);
847 /* Check service state */
848 vc_service_state_e service_state = -1;
849 vc_mgr_client_get_service_state(&service_state);
850 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);
852 ret = vc_mgr_client_enable_command_type((vc_cmd_type_e)cmd_type); // enable the cmd type
854 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to enable the command type(%d). ret(%d)", cmd_type, ret);
856 SLOG(LOG_DEBUG, TAG_VCM, "[DEBUG] Success to enable the command type(%d)", cmd_type);
859 SLOG(LOG_ERROR, TAG_VCM, "@@@ [Manager] Enable Command Type DONE, ret(%d)", ret);
864 int vc_mgr_disable_command_type(int cmd_type)
866 SLOG(LOG_ERROR, TAG_VCM, "@@@ [Manager] Disable Command Type, cmd_type(%d)", cmd_type);
869 ret = __check_mgr_feature_privilege();
870 if (VC_ERROR_NONE != ret)
873 if (VC_COMMAND_TYPE_FOREGROUND > cmd_type || VC_COMMAND_TYPE_EXCLUSIVE < cmd_type) {
874 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] cmd type is not valid, (%d)", cmd_type);
875 return VC_ERROR_INVALID_PARAMETER;
879 if (0 != vc_mgr_client_get_client_state(&state)) {
880 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
881 return VC_ERROR_INVALID_STATE;
885 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Ready'", state);
887 /* Check service state */
888 vc_service_state_e service_state = -1;
889 vc_mgr_client_get_service_state(&service_state);
890 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);
892 ret = vc_mgr_client_disable_command_type((vc_cmd_type_e)cmd_type); // enable the cmd type
894 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to disable the command type(%d). ret(%d)", cmd_type, ret);
896 SLOG(LOG_DEBUG, TAG_VCM, "[DEBUG] Success to disable the command type(%d)", cmd_type);
899 SLOG(LOG_ERROR, TAG_VCM, "@@@ [Manager] Disable Command Type DONE, ret(%d)", ret);
904 int vc_mgr_set_command_list(vc_cmd_list_h vc_cmd_list)
906 SLOG(LOG_ERROR, TAG_VCM, "@@@ [Manager] Set Command list");
909 ret = __check_mgr_feature_privilege();
910 if (VC_ERROR_NONE != ret)
914 if (0 != vc_mgr_client_get_client_state(&state)) {
915 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
916 return VC_ERROR_INVALID_STATE;
920 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
922 /* Check service state */
923 vc_service_state_e service_state = -1;
924 vc_mgr_client_get_service_state(&service_state);
925 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);
927 RETVM_IF(NULL == vc_cmd_list, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Input parameter is NULL");
929 vc_cmd_list_s* list = NULL;
930 list = (vc_cmd_list_s*)vc_cmd_list;
931 SLOG(LOG_INFO, TAG_VCM, "[List] (%p) (%p)", list, list->list);
933 RETVM_IF(NULL == list->list, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Input command list");
936 bool success_save = false;
937 for (i = VC_COMMAND_TYPE_FOREGROUND; i <= VC_COMMAND_TYPE_EXCLUSIVE; i++) {
938 ret = vc_cmd_parser_delete_file(getpid(), i);
940 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to delete file, type(%d), ret(%d)", i, ret);
942 ret = vc_cmd_parser_save_file(getpid(), i, list->list, NULL);
944 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to save file, type(%d), ret(%d)", i, ret);
946 SLOG(LOG_INFO, TAG_VCM, "[SUCCESS] Save file, type(%d)", i);
951 if (true != success_save) {
952 ret = VC_ERROR_INVALID_PARAMETER;
953 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to save command group : %s", __vc_mgr_get_error_code(ret));
955 ret = vc_mgr_tidl_request_set_command(g_pid);
957 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request set command to daemon : %s", __vc_mgr_get_error_code(ret));
961 SLOG(LOG_ERROR, TAG_VCM, "@@@ [Manager] Set Command list DONE, ret(%d)", ret);
966 int vc_mgr_unset_command_list(void)
968 SLOG(LOG_ERROR, TAG_VCM, "@@@ [Manager] Unset Command list");
971 ret = __check_mgr_feature_privilege();
972 if (VC_ERROR_NONE != ret)
976 if (0 != vc_mgr_client_get_client_state(&state)) {
977 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
978 return VC_ERROR_INVALID_STATE;
982 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
984 ret = vc_mgr_tidl_request_unset_command(g_pid);
986 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request unset command to daemon : %s", __vc_mgr_get_error_code(ret));
990 for (i = VC_COMMAND_TYPE_FOREGROUND; i <= VC_COMMAND_TYPE_EXCLUSIVE; i++) {
991 ret = vc_cmd_parser_delete_file(getpid(), i);
993 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to delete file, type(%d), ret(%d)", i, ret);
996 SLOG(LOG_ERROR, TAG_VCM, "@@@ [Manager] Unset Command list DONE");
998 // TODO: check return value correct or not
999 return VC_ERROR_NONE;
1002 int vc_mgr_set_command_list_from_file(const char* file_path, int type)
1004 SLOG(LOG_ERROR, TAG_VCM, "@@@ [Manager] Set Command list from file, type(%d)", type);
1007 ret = __check_mgr_feature_privilege();
1008 if (VC_ERROR_NONE != ret)
1011 RETVM_IF(NULL == file_path, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Invalid parameter");
1012 SLOG(LOG_INFO, TAG_VCM, "@@@ File path: %s", file_path);
1015 if (VC_COMMAND_TYPE_FOREGROUND > type || VC_COMMAND_TYPE_EXCLUSIVE < type) {
1016 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid command type: input type is %d", type);
1017 return VC_ERROR_INVALID_PARAMETER;
1021 if (0 != vc_mgr_client_get_client_state(&state)) {
1022 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1023 return VC_ERROR_INVALID_STATE;
1027 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
1029 /* Check service state */
1030 vc_service_state_e service_state = -1;
1031 vc_mgr_client_get_service_state(&service_state);
1032 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);
1034 ret = vc_cmd_parser_delete_file(getpid(), type);
1036 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to delete file, type(4), ret(%d)", ret);
1038 if (0 != vc_json_set_commands_from_file(file_path, type, NULL)) {
1039 ret = VC_ERROR_INVALID_PARAMETER;
1040 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to save command list (%d)", ret);
1042 ret = vc_mgr_tidl_request_set_command(g_pid);
1044 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request set command to daemon : %s", __vc_mgr_get_error_code(ret));
1048 SLOG(LOG_ERROR, TAG_VCM, "@@@ [Manager] Set Command list from file DONE, ret(%d)", ret);
1053 int vc_mgr_set_preloaded_commands_from_file(const char* file_path)
1055 SLOG(LOG_ERROR, TAG_VCM, "@@@ [Manager] Set preloaded command list");
1058 ret = __check_mgr_feature_privilege();
1059 if (VC_ERROR_NONE != ret)
1062 RETVM_IF(NULL == file_path, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Invalid parameter");
1063 SLOG(LOG_INFO, TAG_VCM, "@@@ File path: %s", file_path);
1066 if (0 != vc_mgr_client_get_client_state(&state)) {
1067 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1068 return VC_ERROR_INVALID_STATE;
1072 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
1074 /* Check service state */
1075 vc_service_state_e service_state = -1;
1076 vc_mgr_client_get_service_state(&service_state);
1077 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);
1079 /* Only support to set background commands for preloaded application */
1080 ret = vc_json_set_commands_from_file(file_path, VC_COMMAND_TYPE_BACKGROUND, NULL);
1082 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to insert preloaded commands into db");
1084 SLOG(LOG_ERROR, TAG_VCM, "@@@ [Manager] Set preloaded command list DONE, ret(%d)", ret);
1088 int vc_mgr_set_audio_type(const char* audio_id)
1090 SLOG(LOG_ERROR, TAG_VCM, "@@@ [Manager] Set audio type, audio_id(%s)", audio_id);
1093 ret = __check_mgr_feature_privilege();
1094 if (VC_ERROR_NONE != ret)
1097 if (NULL == audio_id || !strncmp(audio_id, "", strlen(audio_id))) {
1098 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Input parameter is NULL");
1099 return VC_ERROR_INVALID_PARAMETER;
1103 if (0 != vc_mgr_client_get_client_state(&state)) {
1104 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1105 return VC_ERROR_INVALID_STATE;
1109 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
1111 /* Check service state */
1112 vc_service_state_e service_state = -1;
1113 vc_mgr_client_get_service_state(&service_state);
1114 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);
1117 ret = vc_mgr_tidl_request_set_audio_type(g_pid, audio_id);
1119 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to set audio type : %s", __vc_mgr_get_error_code(ret));
1121 SLOG(LOG_INFO, TAG_VCM, "[SUCCESS] Set audio type");
1123 vc_mgr_client_set_audio_type(audio_id);
1126 SLOG(LOG_ERROR, TAG_VCM, "@@@ [Manager] Set audio type DONE, ret(%d)", ret);
1131 int vc_mgr_get_audio_type(char** audio_id)
1133 SLOG(LOG_ERROR, TAG_VCM, "@@@ [Manager] Get audio type");
1136 ret = __check_mgr_feature_privilege();
1137 if (VC_ERROR_NONE != ret)
1140 RETVM_IF(NULL == audio_id, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Invalid parameter");
1143 if (0 != vc_mgr_client_get_client_state(&state)) {
1144 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1145 return VC_ERROR_INVALID_STATE;
1149 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
1151 /* Check service state */
1152 vc_service_state_e service_state = -1;
1153 vc_mgr_client_get_service_state(&service_state);
1154 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);
1158 vc_mgr_client_get_audio_type(&temp);
1161 /* Not initiallized */
1164 ret = vc_mgr_tidl_request_get_audio_type(g_pid, &temp);
1166 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get audio type : %s", __vc_mgr_get_error_code(ret));
1168 SLOG(LOG_ERROR, TAG_VCM, "[SUCCESS] Get audio type : %s", temp);
1170 vc_mgr_client_set_audio_type(temp);
1176 *audio_id = strdup(temp);
1181 // TODO: check return value correct or not
1182 return VC_ERROR_NONE;
1185 int vc_mgr_get_current_commands(vc_cmd_list_h* vc_cmd_list)
1187 SLOG(LOG_ERROR, TAG_VCM, "@@@ [Manager] Foreach current commands");
1190 ret = __check_mgr_feature_privilege();
1191 if (VC_ERROR_NONE != ret)
1195 if (0 != vc_mgr_client_get_client_state(&state)) {
1196 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1197 return VC_ERROR_INVALID_STATE;
1201 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
1203 /* Check service state */
1204 vc_service_state_e service_state = -1;
1205 vc_mgr_client_get_service_state(&service_state);
1206 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);
1208 RETVM_IF(NULL == vc_cmd_list, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Invalid Parameter");
1210 vc_cmd_list_h temp_list = NULL;
1211 if (0 != vc_cmd_list_create(&temp_list)) {
1212 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to create list");
1213 return VC_ERROR_INVALID_PARAMETER;
1216 *vc_cmd_list = temp_list;
1221 /* Get foreground pid */
1222 if (0 != vc_mgr_client_get_foreground(&fg_pid)) {
1223 /* There is no foreground app for voice control */
1224 SLOG(LOG_WARN, TAG_VCM, "[Manager WARNING] No foreground pid for voice control");
1226 SLOG(LOG_INFO, TAG_VCM, "[Manager] Foreground pid(%d)", fg_pid);
1229 if (0 != vc_mgr_client_get_pid(&mgr_pid)) {
1230 SLOG(LOG_ERROR, TAG_VCM, "[Manager] Fail to get manager pid");
1231 return VC_ERROR_OPERATION_FAILED;
1233 SLOG(LOG_INFO, TAG_VCM, "[Manager] Manager pid(%d)", mgr_pid);
1236 /* Get system command */
1237 ret = vc_cmd_parser_append_commands(mgr_pid, VC_COMMAND_TYPE_SYSTEM, temp_list);
1239 SLOG(LOG_INFO, TAG_VCM, "[Manager] No system commands");
1243 ret = vc_mgr_tidl_request_set_client_info(g_pid);
1245 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to set client info : %s", __vc_mgr_get_error_code(ret));
1247 SLOG(LOG_INFO, TAG_VCM, "[SUCCESS] Set client info");
1250 GSList *iter = NULL;
1251 GSList* client_info_list = NULL;
1252 vc_client_info_s *client_info = NULL;
1253 bool is_fgpid = false;
1255 if (0 != vc_info_parser_get_client_info(&client_info_list)) {
1256 SLOG(LOG_INFO, TAG_VCM, "[DEBUG] No client");
1257 return VC_ERROR_NONE;
1260 if (VC_NO_FOREGROUND_PID != fg_pid) {
1261 iter = g_slist_nth(client_info_list, 0);
1262 while (NULL != iter) {
1263 client_info = iter->data;
1264 if (NULL != client_info) {
1265 if (fg_pid == client_info->pid) {
1270 iter = g_slist_next(iter);
1274 /* Get foreground commands and widget */
1275 if (true == is_fgpid) {
1277 SLOG(LOG_INFO, TAG_VCM, "[Manager] fore cmd(%d)", client_info->fg_cmd);
1279 /* Get foreground command */
1280 if (true == client_info->fg_cmd) {
1281 ret = vc_cmd_parser_append_commands(fg_pid, VC_COMMAND_TYPE_FOREGROUND, temp_list);
1283 SLOG(LOG_ERROR, TAG_VCM, "[Client Data ERROR] Fail to get the fg command list");
1286 SLOG(LOG_INFO, TAG_VCM, "[Manager] No foreground commands");
1289 /* Check exclusive option */
1290 if (true == client_info->exclusive_cmd) {
1291 SLOG(LOG_INFO, TAG_VCM, "[Manager] Exclusive command is ON");
1293 /* Set background command for exclusive option */
1294 if (true == client_info->bg_cmd) {
1295 SLOG(LOG_INFO, TAG_VCM, "[Manager] Set background command");
1296 ret = vc_cmd_parser_append_commands(client_info->pid, VC_COMMAND_TYPE_BACKGROUND, temp_list);
1298 SLOG(LOG_ERROR, TAG_VCM, "[Client Data ERROR] Fail to get the bg command list : pid(%d)", client_info->pid);
1302 /* need to release client info */
1303 iter = g_slist_nth(client_info_list, 0);
1305 while (NULL != iter) {
1306 client_info = iter->data;
1307 if (NULL != client_info) {
1310 client_info_list = g_slist_remove_link(client_info_list, iter);
1311 iter = g_slist_nth(client_info_list, 0);
1314 SLOG(LOG_DEBUG, TAG_VCM, "@@@ [Manager] Foreach current commands DONE");
1316 return VC_ERROR_NONE;
1319 SLOG(LOG_INFO, TAG_VCM, "[Manager] No foreground app");
1322 /* Get background commands */
1323 if (0 < g_slist_length(client_info_list)) {
1324 iter = g_slist_nth(client_info_list, 0);
1326 while (NULL != iter) {
1327 client_info = iter->data;
1329 if (NULL != client_info) {
1330 SLOG(LOG_INFO, TAG_VCM, "[Manager] Pid(%d) Back cmd(%d)", client_info->pid, client_info->bg_cmd);
1331 if (true == client_info->bg_cmd) {
1332 ret = vc_cmd_parser_append_commands(client_info->pid, VC_COMMAND_TYPE_BACKGROUND, temp_list);
1334 SLOG(LOG_ERROR, TAG_VCM, "[Client Data ERROR] Fail to get the bg command list : pid(%d)", client_info->pid);
1339 client_info_list = g_slist_remove_link(client_info_list, iter);
1341 iter = g_slist_nth(client_info_list, 0);
1345 SLOG(LOG_INFO, TAG_VCM, "[Manager] No background commands");
1348 SLOG(LOG_ERROR, TAG_VCM, "@@@ [Manager] Foreach current commands DONE");
1350 // TODO: check return value correct or not
1351 return VC_ERROR_NONE;
1354 int vc_mgr_set_recognition_mode(vc_recognition_mode_e mode)
1356 SLOG(LOG_INFO, TAG_VCM, "@@@ [Manager] Set recognition mode = %d", mode);
1359 ret = __check_mgr_feature_privilege();
1360 if (VC_ERROR_NONE != ret)
1363 /* check vc recognition mode */
1364 if (mode < VC_RECOGNITION_MODE_STOP_BY_SILENCE || mode > VC_RECOGNITION_MODE_MANUAL) {
1365 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] invalid parameter: 'mode' is not supported mode (%d)", mode);
1366 return VC_ERROR_INVALID_PARAMETER;
1370 if (0 != vc_mgr_client_get_client_state(&state)) {
1371 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1372 return VC_ERROR_INVALID_STATE;
1376 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
1378 /* Check service state */
1379 vc_service_state_e service_state = -1;
1380 vc_mgr_client_get_service_state(&service_state);
1381 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);
1383 vc_mgr_client_set_recognition_mode(mode);
1384 return VC_ERROR_NONE;
1387 int vc_mgr_get_recognition_mode(vc_recognition_mode_e* mode)
1390 ret = __check_mgr_feature_privilege();
1391 if (VC_ERROR_NONE != ret)
1394 RETVM_IF(NULL == mode, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Invalid parameter, mode is NULL ptr");
1397 if (0 != vc_mgr_client_get_client_state(&state)) {
1398 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1399 return VC_ERROR_INVALID_STATE;
1402 ret = vc_mgr_client_get_recognition_mode(mode);
1404 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get recognition mode");
1408 SLOG(LOG_INFO, TAG_VCM, "@@@ [Manager] Get recognition mode = %d", *mode);
1409 return VC_ERROR_NONE;
1412 int vc_mgr_set_private_data(const char* key, const char* data)
1414 SLOG(LOG_INFO, TAG_VCM, "@@@ [Manager] Set private data");
1417 ret = __check_mgr_feature_privilege();
1418 if (VC_ERROR_NONE != ret)
1421 RETVM_IF(NULL == key, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Invalid parameter");
1424 if (0 != vc_mgr_client_get_client_state(&state)) {
1425 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1426 return VC_ERROR_INVALID_STATE;
1430 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
1432 /* Check service state */
1433 vc_service_state_e service_state = -1;
1434 vc_mgr_client_get_service_state(&service_state);
1435 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);
1437 ret = vc_mgr_tidl_request_set_private_data(g_pid, key, data);
1439 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to set private data : %s", __vc_mgr_get_error_code(ret));
1442 SLOG(LOG_DEBUG, TAG_VCM, "[SUCCESS] Set private data");
1445 SLOG(LOG_DEBUG, TAG_VCM, "@@@ [Manager] Set private data DONE");
1447 return VC_ERROR_NONE;
1450 int vc_mgr_get_private_data(const char* key, char** data)
1452 SLOG(LOG_DEBUG, TAG_VCM, "@@@ [Manager] Get private data");
1455 ret = __check_mgr_feature_privilege();
1456 if (VC_ERROR_NONE != ret)
1459 if (NULL == key || NULL == data) {
1460 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid parameter");
1461 return VC_ERROR_INVALID_PARAMETER;
1465 if (0 != vc_mgr_client_get_client_state(&state)) {
1466 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1467 return VC_ERROR_INVALID_STATE;
1471 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
1473 /* Check service state */
1474 vc_service_state_e service_state = -1;
1475 vc_mgr_client_get_service_state(&service_state);
1476 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);
1479 ret = vc_mgr_tidl_request_get_private_data(g_pid, key, &temp);
1481 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get private data request : %s", __vc_mgr_get_error_code(ret));
1483 SLOG(LOG_INFO, TAG_VCM, "[SUCCESS] Get private data, key(%s), data(%s)", key, temp);
1487 *data = strdup(temp);
1492 SLOG(LOG_DEBUG, TAG_VCM, "@@@ [Manager] Get private data DONE");
1494 // TODO: check return value correct or not
1495 return VC_ERROR_NONE;
1498 int vc_mgr_set_domain(const char* domain)
1500 SLOG(LOG_DEBUG, TAG_VCM, "@@@ [Manager] Set domain");
1503 ret = __check_mgr_feature_privilege();
1504 if (VC_ERROR_NONE != ret)
1507 RETVM_IF(NULL == domain, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Invalid parameter");
1510 if (0 != vc_mgr_client_get_client_state(&state)) {
1511 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1512 return VC_ERROR_INVALID_STATE;
1516 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
1518 /* Check service state */
1519 vc_service_state_e service_state = -1;
1520 vc_mgr_client_get_service_state(&service_state);
1521 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);
1523 ret = vc_mgr_tidl_request_set_domain(g_pid, domain);
1525 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to set domain request : %s", __vc_mgr_get_error_code(ret));
1527 SLOG(LOG_INFO, TAG_VCM, "[SUCCESS] Set domain");
1530 SLOG(LOG_DEBUG, TAG_VCM, "@@@ [Manager] Set domain DONE");
1532 return VC_ERROR_NONE;
1535 int vc_mgr_do_action(vc_send_event_type_e type, char* send_event)
1537 SLOG(LOG_INFO, TAG_VCM, "@@@ [Manager] do action");
1540 ret = __check_mgr_feature_privilege();
1541 if (VC_ERROR_NONE != ret)
1544 if (type < VC_SEND_EVENT_TYPE_TEXT || VC_SEND_EVENT_TYPE_HAPTIC_EVENT < type) {
1545 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] send event type is not valid, (%d)", type);
1546 return VC_ERROR_INVALID_PARAMETER;
1549 RETVM_IF(NULL == send_event, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Invalid parameter");
1552 if (0 != vc_mgr_client_get_client_state(&state)) {
1553 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1554 return VC_ERROR_INVALID_STATE;
1558 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
1560 /* Check service state */
1561 vc_service_state_e service_state = -1;
1562 vc_mgr_client_get_service_state(&service_state);
1563 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);
1565 ret = vc_mgr_tidl_request_do_action(g_pid, type, send_event);
1567 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to do action request : %s", __vc_mgr_get_error_code(ret));
1570 SLOG(LOG_INFO, TAG_VCM, "[SUCCESS] do action");
1572 SLOG(LOG_DEBUG, TAG_VCM, "@@@ [Manager] do action DONE");
1574 return VC_ERROR_NONE;
1577 int vc_mgr_send_specific_engine_request(const char* engine_app_id, const char* event, const char* request)
1579 SLOG(LOG_INFO, TAG_VCM, "@@@ [Manager] send specific engine request");
1582 ret = __check_mgr_feature_privilege();
1583 if (VC_ERROR_NONE != ret)
1586 SLOG(LOG_INFO, TAG_VCM, "@@@ [Manager] specific engine request. engine app id(%s), event(%s), request(%s)", engine_app_id, event, request);
1588 if (NULL == engine_app_id || NULL == event) {
1589 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid parameter");
1590 return VC_ERROR_INVALID_PARAMETER;
1593 if (NULL == request) {
1594 SLOG(LOG_ERROR, TAG_VCM, "[INFO] Input parameter is NULL. (no request)");
1598 if (0 != vc_mgr_client_get_client_state(&state)) {
1599 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1600 return VC_ERROR_INVALID_STATE;
1604 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
1606 /* Check service state */
1607 vc_service_state_e service_state = -1;
1608 vc_mgr_client_get_service_state(&service_state);
1609 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);
1611 ret = vc_mgr_tidl_send_specific_engine_request(g_pid, engine_app_id, event, request);
1613 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to specific engine request : %s", __vc_mgr_get_error_code(ret));
1616 SLOG(LOG_INFO, TAG_VCM, "[SUCCESS] specific engine request");
1618 SLOG(LOG_DEBUG, TAG_VCM, "@@@ [Manager] send specific engine request DONE");
1620 return VC_ERROR_NONE;
1623 int vc_mgr_start(bool exclusive_command_option)
1625 SLOG(LOG_ERROR, TAG_VCM, "@@@ [Manager] Request start");
1628 ret = __check_mgr_feature_privilege();
1629 if (VC_ERROR_NONE != ret)
1633 if (0 != vc_mgr_client_get_client_state(&state)) {
1634 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1635 return VC_ERROR_INVALID_STATE;
1639 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
1641 /* Check service state */
1642 vc_service_state_e service_state = -1;
1643 vc_mgr_client_get_service_state(&service_state);
1644 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);
1646 /* Check internal state for async */
1647 vc_internal_state_e internal_state = -1;
1648 vc_mgr_client_get_internal_state(&internal_state);
1649 if (internal_state != VC_INTERNAL_STATE_NONE) {
1650 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State : Internal state is NOT none : %d", internal_state);
1651 return VC_ERROR_IN_PROGRESS_TO_RECORDING;
1654 vc_mgr_client_set_exclusive_command(exclusive_command_option);
1656 bool start_by_client = false;
1657 if (0 != vc_mgr_client_get_start_by_client(&start_by_client)) {
1658 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get start by client");
1661 int disabled_cmd_type = 0;
1662 if (0 != vc_mgr_client_get_disabled_command_type(&disabled_cmd_type)) {
1663 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get disabled command type");
1666 vc_recognition_mode_e recognition_mode = VC_RECOGNITION_MODE_STOP_BY_SILENCE;
1667 if (0 != vc_mgr_get_recognition_mode(&recognition_mode)) {
1668 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get recognition mode");
1673 vc_mgr_client_set_internal_state(VC_INTERNAL_STATE_STARTING);
1674 ret = vc_mgr_tidl_request_start(g_pid, (int)recognition_mode, exclusive_command_option, start_by_client, disabled_cmd_type);
1676 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to start request start : %s", __vc_mgr_get_error_code(ret));
1677 vc_mgr_client_set_internal_state(VC_INTERNAL_STATE_NONE);
1679 SLOG(LOG_INFO, TAG_VCM, "[SUCCESS] start recognition");
1682 vc_mgr_core_initialize_volume_variable();
1684 SLOG(LOG_ERROR, TAG_VCM, "@@@ [Manager] Request start DONE, ret(%d)", ret);
1689 int vc_mgr_stop(void)
1691 SLOG(LOG_ERROR, TAG_VCM, "@@@ [Manager] Request stop");
1694 ret = __check_mgr_feature_privilege();
1695 if (VC_ERROR_NONE != ret)
1699 if (0 != vc_mgr_client_get_client_state(&state)) {
1700 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1701 return VC_ERROR_INVALID_STATE;
1705 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
1707 /* Check service state */
1708 vc_service_state_e service_state = -1;
1709 vc_mgr_client_get_service_state(&service_state);
1710 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);
1712 /* Check internal state for async */
1713 vc_internal_state_e internal_state = -1;
1714 vc_mgr_client_get_internal_state(&internal_state);
1715 if (VC_INTERNAL_STATE_STARTING == internal_state) {
1716 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State : Internal state is STARTING");
1717 return VC_ERROR_IN_PROGRESS_TO_RECORDING;
1718 } else if (VC_INTERNAL_STATE_STOPPING == internal_state) {
1719 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State : Internal state is STOPPING");
1720 return VC_ERROR_IN_PROGRESS_TO_PROCESSING;
1721 } else if (VC_INTERNAL_STATE_CANCELING == internal_state) {
1722 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State : Internal state is CANCELING");
1723 return VC_ERROR_IN_PROGRESS_TO_READY;
1728 vc_mgr_client_set_internal_state(VC_INTERNAL_STATE_STOPPING);
1729 ret = vc_mgr_tidl_request_stop(g_pid);
1731 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to stop request : %s", __vc_mgr_get_error_code(ret));
1732 vc_mgr_client_set_internal_state(VC_INTERNAL_STATE_NONE);
1734 SLOG(LOG_INFO, TAG_VCM, "[SUCCESS] Stop recognition");
1737 SLOG(LOG_DEBUG, TAG_VCM, "@@@ [Manager] Request stop DONE");
1742 int vc_mgr_cancel(void)
1744 SLOG(LOG_INFO, TAG_VCM, "@@@ [Manager] Request cancel");
1747 ret = __check_mgr_feature_privilege();
1748 if (VC_ERROR_NONE != ret)
1752 if (0 != vc_mgr_client_get_client_state(&state)) {
1753 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1754 return VC_ERROR_INVALID_STATE;
1758 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
1760 /* Check service state */
1761 vc_service_state_e service_state = -1;
1762 vc_mgr_client_get_service_state(&service_state);
1763 RETVM_IF(service_state == VC_SERVICE_STATE_NONE, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state is NONE");
1765 vc_internal_state_e internal_state = -1;
1766 vc_mgr_client_get_internal_state(&internal_state);
1767 if (VC_INTERNAL_STATE_STARTING == internal_state) {
1768 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State : Internal state is STARTING");
1769 return VC_ERROR_IN_PROGRESS_TO_RECORDING;
1770 } else if (VC_INTERNAL_STATE_STOPPING == internal_state) {
1771 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State : Internal state is STOPPING");
1772 return VC_ERROR_IN_PROGRESS_TO_PROCESSING;
1773 } else if (VC_INTERNAL_STATE_CANCELING == internal_state) {
1774 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State : Internal state is CANCELING");
1775 return VC_ERROR_IN_PROGRESS_TO_READY;
1779 vc_mgr_client_set_internal_state(VC_INTERNAL_STATE_CANCELING);
1780 ret = vc_mgr_tidl_request_cancel(g_pid);
1782 SLOG(LOG_DEBUG, TAG_VCM, "[ERROR] Fail to cancel request : %s", __vc_mgr_get_error_code(ret));
1783 vc_mgr_client_set_internal_state(VC_INTERNAL_STATE_NONE);
1785 SLOG(LOG_INFO, TAG_VCM, "[SUCCESS] Cancel recognition");
1788 vc_mgr_client_set_exclusive_command(false);
1790 SLOG(LOG_DEBUG, TAG_VCM, "@@@ [Manager] Request cancel DONE");
1795 // TODO: check called by app direactly meaning
1796 int __vc_mgr_set_volume(float volume)
1798 // called by app directly
1799 vc_mgr_core_set_volume(volume);
1801 return VC_ERROR_NONE;
1804 int vc_mgr_get_recording_volume(float* volume)
1807 ret = __check_mgr_feature_privilege();
1808 if (VC_ERROR_NONE != ret)
1811 RETVM_IF(NULL == volume, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Invalid parameter");
1813 vc_service_state_e service_state = -1;
1814 if (0 != vc_mgr_client_get_service_state(&service_state)) {
1815 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1816 return VC_ERROR_INVALID_STATE;
1820 RETVM_IF(VC_SERVICE_STATE_RECORDING != service_state, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Service state is not 'RECORDING'");
1822 *volume = vc_mgr_core_get_volume();
1824 return VC_ERROR_NONE;
1827 int vc_mgr_set_selected_results(vc_cmd_list_h vc_cmd_list)
1829 SLOG(LOG_INFO, TAG_VCM, "@@@ [Manager] Select result");
1832 ret = __check_mgr_feature_privilege();
1833 if (VC_ERROR_NONE != ret)
1836 /* Do not check state for 'restart continuously' mode */
1838 vc_service_state_e service_state = -1;
1839 vc_mgr_client_get_service_state(&service_state);
1840 if (service_state != VC_SERVICE_STATE_PROCESSING) {
1841 vc_recognition_mode_e recognition_mode;
1842 vc_mgr_get_recognition_mode(&recognition_mode);
1844 if (VC_RECOGNITION_MODE_RESTART_CONTINUOUSLY != recognition_mode) {
1845 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: service state is not 'PROCESSING' and mode is not 'Restart continuously'");
1846 return VC_ERROR_INVALID_STATE;
1850 ret = vc_mgr_core_set_selected_results(vc_cmd_list, g_pid);
1855 int vc_mgr_set_all_result_cb(vc_mgr_all_result_cb callback, void* user_data)
1858 ret = __check_mgr_feature_privilege();
1859 if (VC_ERROR_NONE != ret)
1862 RETVM_IF(NULL == callback, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Invalid parameter");
1865 if (0 != vc_mgr_client_get_client_state(&state)) {
1866 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set result callback : A handle is not available");
1867 return VC_ERROR_INVALID_STATE;
1871 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
1873 vc_mgr_client_set_all_result_cb(callback, user_data);
1875 SLOG(LOG_INFO, TAG_VCM, "[SUCCESS] Set all result callback");
1877 return VC_ERROR_NONE;
1880 int vc_mgr_unset_all_result_cb(void)
1883 ret = __check_mgr_feature_privilege();
1884 if (VC_ERROR_NONE != ret)
1888 if (0 != vc_mgr_client_get_client_state(&state)) {
1889 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset result callback : A handle is not available");
1890 return VC_ERROR_INVALID_STATE;
1894 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
1896 vc_mgr_client_set_all_result_cb(NULL, NULL);
1898 return VC_ERROR_NONE;
1901 int vc_mgr_set_result_cb(vc_result_cb callback, void* user_data)
1904 ret = __check_mgr_feature_privilege();
1905 if (VC_ERROR_NONE != ret)
1908 RETVM_IF(NULL == callback, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Invalid parameter");
1911 if (0 != vc_mgr_client_get_client_state(&state)) {
1912 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set result callback : A handle is not available");
1913 return VC_ERROR_INVALID_STATE;
1917 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
1919 vc_mgr_client_set_result_cb(callback, user_data);
1921 return VC_ERROR_NONE;
1924 int vc_mgr_unset_result_cb(void)
1927 ret = __check_mgr_feature_privilege();
1928 if (VC_ERROR_NONE != ret)
1932 if (0 != vc_mgr_client_get_client_state(&state)) {
1933 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset result callback : A handle is not available");
1934 return VC_ERROR_INVALID_STATE;
1938 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
1940 vc_mgr_client_set_result_cb(NULL, NULL);
1942 return VC_ERROR_NONE;
1945 int vc_mgr_set_pre_result_cb(vc_mgr_pre_result_cb callback, void* user_data)
1948 ret = __check_mgr_feature_privilege();
1949 if (VC_ERROR_NONE != ret)
1952 RETVM_IF(NULL == callback, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Invalid parameter");
1955 if (0 != vc_mgr_client_get_client_state(&state)) {
1956 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set pre result callback : A handle is not available");
1957 return VC_ERROR_INVALID_STATE;
1961 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
1963 vc_mgr_client_set_pre_result_cb(callback, user_data);
1965 return VC_ERROR_NONE;
1968 int vc_mgr_unset_pre_result_cb(void)
1971 ret = __check_mgr_feature_privilege();
1972 if (VC_ERROR_NONE != ret)
1976 if (0 != vc_mgr_client_get_client_state(&state)) {
1977 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset pre result callback : A handle is not available");
1978 return VC_ERROR_INVALID_STATE;
1982 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
1984 vc_mgr_client_set_pre_result_cb(NULL, NULL);
1986 return VC_ERROR_NONE;
1989 int vc_mgr_get_error_message(char** err_msg)
1991 SLOG(LOG_DEBUG, TAG_VCM, "@@@ [Manager] Get error message");
1994 ret = __check_mgr_feature_privilege();
1995 if (VC_ERROR_NONE != ret)
2000 if (0 != vc_mgr_client_get_client_state(&state)) {
2001 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] vc_mgr handle is not available");
2002 return VC_ERROR_INVALID_STATE;
2005 RETVM_IF(NULL == err_msg, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Invalid parameter");
2007 ret = vc_mgr_core_get_error_message(err_msg);
2009 SLOG(LOG_DEBUG, TAG_VCM, "@@@ [Manager] Get error message DONE");
2014 static Eina_Bool __vc_mgr_notify_state_changed(void *data)
2016 vc_state_changed_cb changed_callback = NULL;
2019 vc_mgr_client_get_state_changed_cb(&changed_callback, &user_data);
2021 vc_state_e current_state;
2022 vc_state_e previous_state;
2024 vc_mgr_client_get_previous_state(¤t_state, &previous_state);
2026 if (NULL != changed_callback) {
2027 vc_mgr_client_use_callback();
2028 changed_callback(previous_state, current_state, user_data);
2029 vc_mgr_client_not_use_callback();
2030 SLOG(LOG_INFO, TAG_VCM, "State changed callback is called");
2032 SLOG(LOG_WARN, TAG_VCM, "[WARNING] State changed callback is null");
2038 int vc_mgr_set_state_changed_cb(vc_state_changed_cb callback, void* user_data)
2041 ret = __check_mgr_feature_privilege();
2042 if (VC_ERROR_NONE != ret)
2045 if (callback == NULL)
2046 return VC_ERROR_INVALID_PARAMETER;
2049 if (0 != vc_mgr_client_get_client_state(&state)) {
2050 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set state changed callback : A handle is not available");
2051 return VC_ERROR_INVALID_STATE;
2055 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
2057 vc_mgr_client_set_state_changed_cb(callback, user_data);
2059 SLOG(LOG_INFO, TAG_VCM, "[SUCCESS] Set state changed callback");
2060 return VC_ERROR_NONE;
2063 int vc_mgr_unset_state_changed_cb(void)
2066 ret = __check_mgr_feature_privilege();
2067 if (VC_ERROR_NONE != ret)
2071 if (0 != vc_mgr_client_get_client_state(&state)) {
2072 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset state changed callback : A handle is not available");
2073 return VC_ERROR_INVALID_STATE;
2077 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
2079 vc_mgr_client_set_state_changed_cb(NULL, NULL);
2081 return VC_ERROR_NONE;
2084 int vc_mgr_set_service_state_changed_cb(vc_service_state_changed_cb callback, void* user_data)
2087 ret = __check_mgr_feature_privilege();
2088 if (VC_ERROR_NONE != ret)
2091 if (callback == NULL)
2092 return VC_ERROR_INVALID_PARAMETER;
2095 if (0 != vc_mgr_client_get_client_state(&state)) {
2096 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set state changed callback : A handle is not available");
2097 return VC_ERROR_INVALID_STATE;
2101 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
2103 vc_mgr_client_set_service_state_changed_cb(callback, user_data);
2105 SLOG(LOG_INFO, TAG_VCM, "[SUCCESS] Set service state changed callback");
2106 return VC_ERROR_NONE;
2109 int vc_mgr_unset_service_state_changed_cb(void)
2112 ret = __check_mgr_feature_privilege();
2113 if (VC_ERROR_NONE != ret)
2117 if (0 != vc_mgr_client_get_client_state(&state)) {
2118 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset state changed callback : A handle is not available");
2119 return VC_ERROR_INVALID_STATE;
2123 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
2125 vc_mgr_client_set_service_state_changed_cb(NULL, NULL);
2126 return VC_ERROR_NONE;
2129 int vc_mgr_set_speech_detected_cb(vc_mgr_begin_speech_detected_cb callback, void* user_data)
2132 ret = __check_mgr_feature_privilege();
2133 if (VC_ERROR_NONE != ret)
2136 if (callback == NULL)
2137 return VC_ERROR_INVALID_PARAMETER;
2140 if (0 != vc_mgr_client_get_client_state(&state)) {
2141 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set state changed callback : A handle is not available");
2142 return VC_ERROR_INVALID_STATE;
2146 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
2148 vc_mgr_client_set_speech_detected_cb(callback, user_data);
2150 SLOG(LOG_INFO, TAG_VCM, "[SUCCESS] Set speech detected callback");
2151 return VC_ERROR_NONE;
2154 int vc_mgr_unset_speech_detected_cb(void)
2157 ret = __check_mgr_feature_privilege();
2158 if (VC_ERROR_NONE != ret)
2162 if (0 != vc_mgr_client_get_client_state(&state)) {
2163 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset state changed callback : A handle is not available");
2164 return VC_ERROR_INVALID_STATE;
2168 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
2170 vc_mgr_client_set_speech_detected_cb(NULL, NULL);
2171 return VC_ERROR_NONE;
2174 int vc_mgr_set_current_language_changed_cb(vc_current_language_changed_cb callback, void* user_data)
2177 ret = __check_mgr_feature_privilege();
2178 if (VC_ERROR_NONE != ret)
2181 RETVM_IF(NULL == callback, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Invalid parameter");
2184 if (0 != vc_mgr_client_get_client_state(&state)) {
2185 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set current language changed : A handle is not available");
2186 return VC_ERROR_INVALID_STATE;
2190 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
2192 vc_mgr_client_set_current_lang_changed_cb(callback, user_data);
2194 SLOG(LOG_INFO, TAG_VCM, "[SUCCESS] Set current language changed callback");
2195 return VC_ERROR_NONE;
2198 int vc_mgr_unset_current_language_changed_cb(void)
2201 ret = __check_mgr_feature_privilege();
2202 if (VC_ERROR_NONE != ret)
2206 if (0 != vc_mgr_client_get_client_state(&state)) {
2207 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset current language changed : A handle is not available");
2208 return VC_ERROR_INVALID_STATE;
2212 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
2214 vc_mgr_client_set_current_lang_changed_cb(NULL, NULL);
2216 return VC_ERROR_NONE;
2219 int vc_mgr_set_error_cb(vc_error_cb callback, void* user_data)
2222 ret = __check_mgr_feature_privilege();
2223 if (VC_ERROR_NONE != ret)
2226 RETVM_IF(NULL == callback, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Invalid parameter");
2229 if (0 != vc_mgr_client_get_client_state(&state)) {
2230 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set error callback : A handle is not available");
2231 return VC_ERROR_INVALID_STATE;
2235 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
2237 vc_mgr_client_set_error_cb(callback, user_data);
2239 return VC_ERROR_NONE;
2242 int vc_mgr_unset_error_cb(void)
2245 ret = __check_mgr_feature_privilege();
2246 if (VC_ERROR_NONE != ret)
2250 if (0 != vc_mgr_client_get_client_state(&state)) {
2251 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset error callback : A handle is not available");
2252 return VC_ERROR_INVALID_STATE;
2256 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
2258 vc_mgr_client_set_error_cb(NULL, NULL);
2260 return VC_ERROR_NONE;
2263 int vc_mgr_set_dialog_request_cb(vc_mgr_dialog_request_cb callback, void* user_data)
2266 ret = __check_mgr_feature_privilege();
2267 if (VC_ERROR_NONE != ret)
2270 RETVM_IF(NULL == callback, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Invalid parameter");
2273 if (0 != vc_mgr_client_get_client_state(&state)) {
2274 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set error callback : A handle is not available");
2275 return VC_ERROR_INVALID_STATE;
2279 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
2281 vc_mgr_client_set_dialog_request_cb(callback, user_data);
2283 return VC_ERROR_NONE;
2286 int vc_mgr_unset_dialog_request_cb(void)
2289 ret = __check_mgr_feature_privilege();
2290 if (VC_ERROR_NONE != ret)
2294 if (0 != vc_mgr_client_get_client_state(&state)) {
2295 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset error callback : A handle is not available");
2296 return VC_ERROR_INVALID_STATE;
2300 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
2302 vc_mgr_client_set_dialog_request_cb(NULL, NULL);
2304 return VC_ERROR_NONE;
2307 int vc_mgr_set_private_data_set_cb(vc_mgr_private_data_set_cb callback, void* user_data)
2310 ret = __check_mgr_feature_privilege();
2311 if (VC_ERROR_NONE != ret)
2314 RETVM_IF(NULL == callback, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Invalid parameter");
2317 if (0 != vc_mgr_client_get_client_state(&state)) {
2318 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set private data set callback : A handle is not available");
2319 return VC_ERROR_INVALID_STATE;
2323 RETVM_IF(VC_STATE_INITIALIZED != state, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Set private data set callback : Current state is not 'Initialized'");
2325 vc_mgr_client_set_private_data_set_cb(callback, user_data);
2327 return VC_ERROR_NONE;
2330 int vc_mgr_unset_private_data_set_cb(void)
2333 ret = __check_mgr_feature_privilege();
2334 if (VC_ERROR_NONE != ret)
2338 if (0 != vc_mgr_client_get_client_state(&state)) {
2339 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset private data set callback : A handle is not available");
2340 return VC_ERROR_INVALID_STATE;
2344 RETVM_IF(VC_STATE_INITIALIZED != state, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Unset private data set callback : Current state is not 'Initialized'");
2346 vc_mgr_client_set_private_data_set_cb(NULL, NULL);
2348 return VC_ERROR_NONE;
2351 int vc_mgr_set_private_data_requested_cb(vc_mgr_private_data_requested_cb callback, void* user_data)
2354 ret = __check_mgr_feature_privilege();
2355 if (VC_ERROR_NONE != ret)
2358 RETVM_IF(NULL == callback, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Invalid parameter");
2361 if (0 != vc_mgr_client_get_client_state(&state)) {
2362 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set private data requested callback : A handle is not available");
2363 return VC_ERROR_INVALID_STATE;
2367 RETVM_IF(VC_STATE_INITIALIZED != state, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Set private data requested callback : Current state is not 'Initialized'");
2369 vc_mgr_client_set_private_data_requested_cb(callback, user_data);
2371 return VC_ERROR_NONE;
2374 int vc_mgr_unset_private_data_requested_cb(void)
2377 ret = __check_mgr_feature_privilege();
2378 if (VC_ERROR_NONE != ret)
2382 if (0 != vc_mgr_client_get_client_state(&state)) {
2383 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset private data requested callback : A handle is not available");
2384 return VC_ERROR_INVALID_STATE;
2388 RETVM_IF(VC_STATE_INITIALIZED != state, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Unset private data requested callback : Current state is not 'Initialized'");
2390 vc_mgr_client_set_private_data_requested_cb(NULL, NULL);
2392 return VC_ERROR_NONE;
2395 int vc_mgr_set_specific_engine_result_cb(vc_mgr_specific_engine_result_cb callback, void* user_data)
2398 ret = __check_mgr_feature_privilege();
2399 if (VC_ERROR_NONE != ret)
2402 RETVM_IF(NULL == callback, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Invalid parameter");
2405 if (0 != vc_mgr_client_get_client_state(&state)) {
2406 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set specific engine result callback : A handle is not available");
2407 return VC_ERROR_INVALID_STATE;
2411 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
2413 vc_mgr_client_set_specific_engine_result_cb(callback, user_data);
2415 return VC_ERROR_NONE;
2417 int vc_mgr_unset_specific_engine_result_cb(void)
2419 if (0 != __vc_mgr_get_feature_enabled()) {
2420 return VC_ERROR_NOT_SUPPORTED;
2424 if (0 != vc_mgr_client_get_client_state(&state)) {
2425 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset specific engine result callback : A handle is not available");
2426 return VC_ERROR_INVALID_STATE;
2430 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
2432 vc_mgr_client_set_specific_engine_result_cb(NULL, NULL);
2434 return VC_ERROR_NONE;
2437 /* for TTS feedback */
2438 int vc_mgr_set_feedback_audio_format_cb(vc_mgr_feedback_audio_format_cb callback, void* user_data)
2440 SLOG(LOG_INFO, TAG_VCM, "@@@ [Manager] set feedback audio format");
2443 ret = __check_mgr_feature_privilege();
2444 if (VC_ERROR_NONE != ret)
2447 RETVM_IF(NULL == callback, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Invalid parameter");
2450 if (0 != vc_mgr_client_get_client_state(&state)) {
2451 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set feedback audio format callback : A handle is not available");
2452 return VC_ERROR_INVALID_STATE;
2456 RETVM_IF(VC_STATE_INITIALIZED != state, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Set feedback audio format callback : Current state is not 'Initialized'");
2458 vc_mgr_client_set_feedback_audio_format_cb(callback, user_data);
2460 SLOG(LOG_INFO, TAG_VCM, "[SUCCESS] Set feedback audio format callback");
2462 return VC_ERROR_NONE;
2465 int vc_mgr_unset_feedback_audio_format_cb()
2467 SLOG(LOG_INFO, TAG_VCM, "@@@ [Manager] unset feedback audio format");
2470 ret = __check_mgr_feature_privilege();
2471 if (VC_ERROR_NONE != ret)
2475 if (0 != vc_mgr_client_get_client_state(&state)) {
2476 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset feedback audio format callback : A handle is not available");
2477 return VC_ERROR_INVALID_STATE;
2481 RETVM_IF(VC_STATE_INITIALIZED != state, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Unset feedback audio format callback : Current state is not 'Initialized'");
2483 vc_mgr_client_set_feedback_audio_format_cb(NULL, NULL);
2485 SLOG(LOG_INFO, TAG_VCM, "[SUCCESS] Unset feedback audio format callback");
2487 return VC_ERROR_NONE;
2490 int vc_mgr_set_feedback_streaming_cb(vc_mgr_feedback_streaming_cb callback, void* user_data)
2492 SLOG(LOG_INFO, TAG_VCM, "@@@ [Manager] set feedback streaming");
2495 ret = __check_mgr_feature_privilege();
2496 if (VC_ERROR_NONE != ret)
2499 RETVM_IF(NULL == callback, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Invalid parameter");
2501 pthread_mutex_lock(&g_feedback_streaming_cb_mutex);
2504 if (0 != vc_mgr_client_get_client_state(&state)) {
2505 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set feedback streaming callback : A handle is not available");
2506 pthread_mutex_unlock(&g_feedback_streaming_cb_mutex);
2507 return VC_ERROR_INVALID_STATE;
2511 if (VC_STATE_INITIALIZED != state) {
2512 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set feedback streaming callback : Current state is not 'Initialized' (%d)", state);
2513 pthread_mutex_unlock(&g_feedback_streaming_cb_mutex);
2514 return VC_ERROR_INVALID_STATE;
2517 vc_mgr_client_set_feedback_streaming_cb(callback, user_data);
2519 pthread_mutex_unlock(&g_feedback_streaming_cb_mutex);
2521 SLOG(LOG_INFO, TAG_VCM, "[SUCCESS] Set feedback streaming callback");
2523 return VC_ERROR_NONE;
2526 int vc_mgr_unset_feedback_streaming_cb()
2528 SLOG(LOG_INFO, TAG_VCM, "@@@ [Manager] unset feedback streaming");
2531 ret = __check_mgr_feature_privilege();
2532 if (VC_ERROR_NONE != ret)
2535 pthread_mutex_lock(&g_feedback_streaming_cb_mutex);
2538 if (0 != vc_mgr_client_get_client_state(&state)) {
2539 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset feedback streaming callback : A handle is not available");
2540 pthread_mutex_unlock(&g_feedback_streaming_cb_mutex);
2541 return VC_ERROR_INVALID_STATE;
2545 if (VC_STATE_INITIALIZED != state) {
2546 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset feedback streaming callback : Current state is not 'Initialized' (%d)", state);
2547 pthread_mutex_unlock(&g_feedback_streaming_cb_mutex);
2548 return VC_ERROR_INVALID_STATE;
2551 vc_mgr_client_set_feedback_streaming_cb(NULL, NULL);
2553 pthread_mutex_unlock(&g_feedback_streaming_cb_mutex);
2555 SLOG(LOG_INFO, TAG_VCM, "[SUCCESS] Unset feedback streaming callback");
2557 return VC_ERROR_NONE;
2560 int vc_mgr_set_vc_tts_streaming_cb(vc_mgr_vc_tts_streaming_cb callback, void* user_data)
2562 SLOG(LOG_INFO, TAG_VCM, "@@@ [Manager] set vc tts streaming callback");
2565 ret = __check_mgr_feature_privilege();
2566 if (VC_ERROR_NONE != ret)
2569 RETVM_IF(NULL == callback, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Invalid parameter");
2571 pthread_mutex_lock(&g_vc_tts_streaming_cb_mutex);
2574 if (0 != vc_mgr_client_get_client_state(&state)) {
2575 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set feedback streaming callback : A handle is not available");
2576 pthread_mutex_unlock(&g_vc_tts_streaming_cb_mutex);
2577 return VC_ERROR_INVALID_STATE;
2581 if (VC_STATE_INITIALIZED != state) {
2582 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set feedback streaming callback : Current state is not 'Initialized' (%d)", state);
2583 pthread_mutex_unlock(&g_vc_tts_streaming_cb_mutex);
2584 return VC_ERROR_INVALID_STATE;
2587 vc_mgr_client_set_vc_tts_streaming_cb(callback, user_data);
2589 pthread_mutex_unlock(&g_vc_tts_streaming_cb_mutex);
2591 SLOG(LOG_INFO, TAG_VCM, "[SUCCESS] Set feedback streaming callback");
2593 return VC_ERROR_NONE;
2596 int vc_mgr_unset_vc_tts_streaming_cb()
2598 SLOG(LOG_INFO, TAG_VCM, "@@@ [Manager] unset vc tts streaming callback");
2601 ret = __check_mgr_feature_privilege();
2602 if (VC_ERROR_NONE != ret)
2605 pthread_mutex_lock(&g_vc_tts_streaming_cb_mutex);
2608 if (0 != vc_mgr_client_get_client_state(&state)) {
2609 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset feedback streaming callback : A handle is not available");
2610 pthread_mutex_unlock(&g_vc_tts_streaming_cb_mutex);
2611 return VC_ERROR_INVALID_STATE;
2615 if (VC_STATE_INITIALIZED != state) {
2616 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset feedback streaming callback : Current state is not 'Initialized' (%d)", state);
2617 pthread_mutex_unlock(&g_vc_tts_streaming_cb_mutex);
2618 return VC_ERROR_INVALID_STATE;
2621 vc_mgr_client_set_vc_tts_streaming_cb(NULL, NULL);
2623 pthread_mutex_unlock(&g_vc_tts_streaming_cb_mutex);
2625 SLOG(LOG_INFO, TAG_VCM, "[SUCCESS] Unset feedback streaming callback");
2627 return VC_ERROR_NONE;
2630 static void __tts_feedback_thread(void* data, Ecore_Thread* thread)
2632 SLOG(LOG_INFO, TAG_VCM, "[SUCCESS] Start thread");
2634 vc_feedback_data_s* feedback_data = NULL;
2640 /* get feedback data */
2641 ret = vc_mgr_data_get_feedback_data(&feedback_data);
2642 if (0 != ret || NULL == feedback_data) {
2644 SLOG(LOG_INFO, TAG_VCM, "[DEBUG] No feedback data. Waiting mode");
2649 if (0 < vc_mgr_data_get_feedback_data_size()) {
2650 SLOG(LOG_INFO, TAG_VCM, "[INFO] Resume thread");
2654 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Wrong request, there's no pcm data");
2655 vc_mgr_data_clear_feedback_data(&feedback_data);
2660 SLOG(LOG_INFO, TAG_VCM, "[INFO] Finish to wait for new feedback data come");
2662 /* resume feedback thread */
2663 vc_mgr_data_clear_feedback_data(&feedback_data);
2667 if (NULL != feedback_data) {
2668 if (getpid() == feedback_data->pid) {
2669 vc_mgr_feedback_streaming_cb callback = NULL;
2670 void* user_data = NULL;
2672 pthread_mutex_lock(&g_feedback_streaming_cb_mutex);
2674 vc_mgr_client_get_feedback_streaming_cb(&callback, &user_data);
2675 if (NULL == callback) {
2676 SLOG(LOG_WARN, TAG_VCM, "[WARNING] TTS feedback streaming callback is null");
2677 vc_mgr_data_clear_feedback_data(&feedback_data);
2678 pthread_mutex_unlock(&g_feedback_streaming_cb_mutex);
2682 SLOG(LOG_DEBUG, TAG_VCM, "TTS feedback streaming callback is called");
2683 vc_mgr_client_use_callback();
2684 callback(feedback_data->event, feedback_data->data, feedback_data->data_size, user_data);
2685 vc_mgr_client_not_use_callback();
2687 pthread_mutex_unlock(&g_feedback_streaming_cb_mutex);
2689 /* If no feedback data and EVENT_FINISH */
2690 if (0 >= vc_mgr_data_get_feedback_data_size() && VC_FEEDBACK_EVENT_FINISH == feedback_data->event) {
2691 SLOG(LOG_INFO, TAG_VCM, "[INFO] Finish feedback");
2692 if (feedback_data) {
2693 free(feedback_data);
2694 feedback_data = NULL;
2699 vc_mgr_vc_tts_streaming_cb callback = NULL;
2700 void* user_data = NULL;
2702 pthread_mutex_lock(&g_vc_tts_streaming_cb_mutex);
2704 vc_mgr_client_get_vc_tts_streaming_cb(&callback, &user_data);
2705 if (NULL == callback) {
2706 SLOG(LOG_WARN, TAG_VCM, "[WARNING] vc tts streaming callback is null");
2707 vc_mgr_data_clear_feedback_data(&feedback_data);
2708 pthread_mutex_unlock(&g_vc_tts_streaming_cb_mutex);
2712 SLOG(LOG_DEBUG, TAG_VCM, "vc tts feedback streaming callback is called");
2713 vc_mgr_client_use_callback();
2714 callback(feedback_data->pid, feedback_data->utt_id, feedback_data->event, feedback_data->data, feedback_data->data_size, user_data);
2715 vc_mgr_client_not_use_callback();
2717 pthread_mutex_unlock(&g_vc_tts_streaming_cb_mutex);
2719 /* If no feedback data and EVENT_FINISH */
2720 if (0 >= vc_mgr_data_get_feedback_data_size() && VC_FEEDBACK_EVENT_FINISH == feedback_data->event) {
2721 SLOG(LOG_INFO, TAG_VCM, "[INFO] Finish vc tts feedback");
2722 if (feedback_data) {
2723 free(feedback_data);
2724 feedback_data = NULL;
2729 free(feedback_data);
2730 feedback_data = NULL;
2735 static void __end_tts_feedback_thread(void* data, Ecore_Thread* thread)
2737 SLOG(LOG_INFO, TAG_VCM, "[SUCCESS] End thread");
2738 g_feedback_thread = NULL;
2741 static void __cancel_tts_feedback_thread(void* data, Ecore_Thread* thread)
2743 SLOG(LOG_INFO, TAG_VCM, "[SUCCESS] Cancel thread");
2744 g_feedback_thread = NULL;
2747 int vc_mgr_start_feedback(void)
2749 SLOG(LOG_INFO, TAG_VCM, "@@@ [Manager] start feedback");
2752 ret = __check_mgr_feature_privilege();
2753 if (VC_ERROR_NONE != ret)
2756 SLOG(LOG_INFO, TAG_VCM, "@@@ [Manager] Request start TTS feedback");
2759 if (0 != vc_mgr_client_get_client_state(&state)) {
2760 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Start 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] Start feedback : Current state is not 'Ready' (%d)", state);
2768 bool is_exist = ecore_thread_check(g_feedback_thread);
2769 if (NULL == g_feedback_thread || TRUE == is_exist) {
2770 SLOG(LOG_INFO, TAG_VCM, "[INFO] ecore thread run : __tts_feedback_thread");
2771 g_feedback_thread = ecore_thread_run(__tts_feedback_thread, __end_tts_feedback_thread, __cancel_tts_feedback_thread, NULL);
2774 /* start playing TTS feedback */
2776 ret = vc_mgr_player_play();
2778 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to player play, ret(%d)", ret);
2781 return VC_ERROR_NONE;
2784 int vc_mgr_stop_feedback(void)
2786 SLOG(LOG_INFO, TAG_VCM, "@@@ [Manager] stop feedback");
2789 ret = __check_mgr_feature_privilege();
2790 if (VC_ERROR_NONE != ret)
2793 SLOG(LOG_INFO, TAG_VCM, "@@@ [Manager] Request stop TTS feedback");
2796 if (0 != vc_mgr_client_get_client_state(&state)) {
2797 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Stop feedback : A handle is not available");
2798 return VC_ERROR_INVALID_STATE;
2802 RETVM_IF(VC_STATE_READY != state, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Stop feedback : Current state is not 'Ready' (%d)", state);
2808 vc_feedback_data_s* feedback_data = NULL;
2810 /* get feedback data */
2811 ret = vc_mgr_data_get_feedback_data(&feedback_data);
2812 if (0 != ret || NULL == feedback_data) {
2814 SLOG(LOG_INFO, TAG_VCM, "[INFO] No feedback data to stop any more");
2815 return VC_ERROR_NONE;
2817 ret = vc_mgr_data_clear_feedback_data(&feedback_data);
2819 SLOG(LOG_INFO, TAG_VCM, "[ERROR] Fail to clear data, ret(%d)", ret);
2824 /* request to stop playing TTS feedback */
2826 ret = vc_mgr_player_stop();
2828 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to player stop, ret(%d)", ret);
2834 int vc_mgr_send_utterance_status(int pid, int utt_id, vc_tts_utterance_status_e utt_status)
2836 SLOG(LOG_INFO, TAG_VCM, "@@@ [Manager] send utterance status, pid(%d), utt_id(%d), utt_status(%d)", pid, utt_id, utt_status);
2839 ret = __check_mgr_feature_privilege();
2840 if (VC_ERROR_NONE != ret)
2843 if (VC_TTS_UTTERANCE_NONE > utt_status || VC_TTS_UTTERANCE_CANCELED < utt_status || 0 == utt_status) {
2844 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] utt_status is not valid. (%d)", utt_status);
2845 return VC_ERROR_INVALID_PARAMETER;
2849 if (0 != vc_mgr_client_get_client_state(&state)) {
2850 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
2851 return VC_ERROR_INVALID_STATE;
2855 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Ready'", state);
2857 /* Check service state */
2858 vc_service_state_e service_state = -1;
2859 vc_mgr_client_get_service_state(&service_state);
2860 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);
2862 ret = vc_mgr_tidl_send_utterance_status(pid, utt_id, utt_status);
2864 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to send utterance status : %s", __vc_mgr_get_error_code(ret));
2866 SLOG(LOG_INFO, TAG_VCM, "[SUCCESS] Send utterance status");
2868 SLOG(LOG_DEBUG, TAG_VCM, "@@@ [Manager] send utterance status DONE");
2872 static float __get_volume_decibel(char* data, int size)
2874 #define MAX_AMPLITUDE_MEAN_16 32768
2881 unsigned long long square_sum = 0;
2886 for (i = 0; i < size; i += (depthByte<<1)) {
2888 memcpy(&pcm16, data + i, sizeof(short));
2889 square_sum += pcm16 * pcm16;
2893 if (0 == count || 0 == square_sum) {
2894 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] No data");
2897 rms = sqrt((float)square_sum/count);
2900 db = 20 * log10(rms/MAX_AMPLITUDE_MEAN_16);
2904 int vc_mgr_send_audio_streaming(vc_audio_streaming_event_e event, unsigned char* buffer, unsigned int len)
2906 SLOG(LOG_INFO, TAG_VCM, "[Manager] Send audio streaming to the engine service, event(%d)", event);
2909 ret = __check_mgr_feature_privilege();
2910 if (VC_ERROR_NONE != ret)
2913 if (VC_AUDIO_STREAMING_EVENT_FAIL > event || VC_AUDIO_STREAMING_EVENT_FINISH < event || 0 == event) {
2914 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] event is invalid parameter (%d)", event);
2915 return VC_ERROR_INVALID_PARAMETER;
2918 RETVM_IF(NULL == buffer, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Invalid parameter");
2920 vc_state_e state = VC_STATE_NONE;
2921 ret = vc_mgr_client_get_client_state(&state);
2923 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
2924 return VC_ERROR_INVALID_STATE;
2927 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Ready'", state);
2929 vc_service_state_e service_state = VC_SERVICE_STATE_NONE;
2930 ret = vc_mgr_client_get_service_state(&service_state);
2932 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
2933 return VC_ERROR_INVALID_STATE;
2936 if (VC_SERVICE_STATE_READY != service_state && VC_SERVICE_STATE_RECORDING != service_state) {
2937 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: service state is not 'READY' and 'RECORDING', state(%d)", service_state);
2938 return VC_ERROR_INVALID_STATE;
2941 float volume = __get_volume_decibel((char*)buffer, len);
2942 // TODO: check __vc_mgr_set_volume need to move
2943 __vc_mgr_set_volume(volume);
2945 ret = vc_mgr_tidl_send_audio_streaming(g_pid, event, buffer, len);
2947 SLOG(LOG_WARN, TAG_VCM, "[WARNING] retry to send audio streaming data");
2949 SLOG(LOG_INFO, TAG_VCM, "[DEBUG] Success to send");
2953 int vc_mgr_set_audio_streaming_mode(vc_audio_streaming_mode_e mode)
2955 SLOG(LOG_INFO, TAG_VCM, "[Manager] Set multi assistant mode, mode(%d)", mode);
2958 ret = __check_mgr_feature_privilege();
2959 if (VC_ERROR_NONE != ret)
2962 if (VC_AUDIO_STREAMING_MODE_VC_SERVICE > mode || VC_AUDIO_STREAMING_MODE_OUTSIDE < mode) {
2963 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] mode is invalid parameter (%d)", mode);
2964 return VC_ERROR_INVALID_PARAMETER;
2967 vc_state_e state = VC_STATE_NONE;
2968 ret = vc_mgr_client_get_client_state(&state);
2970 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
2971 return VC_ERROR_INVALID_STATE;
2974 vc_service_state_e service_state = VC_SERVICE_STATE_NONE;
2975 ret = vc_mgr_client_get_service_state(&service_state);
2977 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
2978 return VC_ERROR_INVALID_STATE;
2981 if (VC_STATE_INITIALIZED == state && VC_SERVICE_STATE_NONE == service_state) {
2982 ret = vc_mgr_client_set_audio_streaming_mode(mode);
2983 if (VC_ERROR_NONE != ret) {
2984 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to set multi assistant mode : %s", __vc_mgr_get_error_code(ret));
2985 return VC_ERROR_INVALID_STATE;
2987 SLOG(LOG_DEBUG, TAG_VCM, "[SUCCESS] Set audio streaming mode in vc mgr client");
2989 } else if (VC_STATE_READY == state && VC_SERVICE_STATE_READY == service_state) {
2990 ret = vc_mgr_client_set_audio_streaming_mode(mode);
2991 if (VC_ERROR_NONE != ret) {
2992 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to set multi assistant mode : %s", __vc_mgr_get_error_code(ret));
2993 return VC_ERROR_INVALID_STATE;
2995 SLOG(LOG_DEBUG, TAG_VCM, "[SUCCESS] Set audio streaming mode in vc mgr client");
2998 ret = vc_mgr_tidl_request_set_audio_streaming_mode(g_pid, mode);
2999 if (VC_ERROR_NONE != ret) {
3000 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to set audio streaming mode : %s", __vc_mgr_get_error_code(ret));
3001 return VC_ERROR_OPERATION_FAILED;
3003 SLOG(LOG_DEBUG, TAG_VCM, "[SUCCESS] Set audio streaming mode in vc mgr tidl");
3006 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: Current state is not 'INITIALIZED', state(%d)", state);
3007 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: Current service state is not 'READY', service_state(%d)", service_state);
3008 return VC_ERROR_INVALID_STATE;
3011 return VC_ERROR_NONE;
3014 //TODO it's internal api, so will remove it.
3015 int vc_mgr_change_system_volume(vc_system_volume_event_e event)
3017 return vc_mgr_change_background_volume(event);
3020 //TODO it's internal api, so will remove it.
3021 int vc_mgr_recover_system_volume(void)
3023 return vc_mgr_reset_background_volume();
3026 int vc_mgr_change_background_volume(vc_background_volume_event_e event)
3028 SLOG(LOG_INFO, TAG_VCM, "[Manager] Change background volume. event(%d)", event);
3031 ret = __check_mgr_feature_privilege();
3032 if (VC_ERROR_NONE != ret)
3035 if (VC_BACKGROUND_VOLUME_EVENT_CHANGE_FOR_NEARFIELD > event || VC_BACKGROUND_VOLUME_EVENT_CHANGE_FOR_FARFIELD < event) {
3036 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] event is invalid parameter (%d)", event);
3037 return VC_ERROR_INVALID_PARAMETER;
3040 vc_state_e state = VC_STATE_NONE;
3041 ret = vc_mgr_client_get_client_state(&state);
3042 if (VC_ERROR_NONE != ret) {
3043 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
3044 return VC_ERROR_INVALID_STATE;
3047 if (state != VC_STATE_READY && state != VC_STATE_INITIALIZED) {
3048 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: Current state is not 'READY' and not 'INITIALIZED', state(%d)", state);
3049 return VC_ERROR_INVALID_STATE;
3053 if (VC_BACKGROUND_VOLUME_EVENT_CHANGE_FOR_FARFIELD == event)
3054 ratio = VC_MGR_DEFAULT_FARFIELD_DUCKING_RATIO;
3055 else if (VC_BACKGROUND_VOLUME_EVENT_CHANGE_FOR_NEARFIELD == event)
3056 ratio = VC_MGR_DEFAULT_NEARFIELD_DUCKING_RATIO;
3058 ret = vc_mgr_ducking_activate(ratio);
3059 if (VC_ERROR_NONE != ret)
3060 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to change volume");
3062 SLOG(LOG_INFO, TAG_VCM, "[DEBUG] Success to change volume");
3066 int vc_mgr_change_background_volume_by_ratio(double ratio)
3068 SLOG(LOG_INFO, TAG_VCM, "[Manager] Change background volume. ratio(%f)", ratio);
3071 ret = __check_mgr_feature_privilege();
3072 if (VC_ERROR_NONE != ret)
3075 if (VC_MGR_MINIMUM_DUCKING_RATIO > ratio || VC_MGR_MAXIMUM_DUCKING_RATIO < ratio) {
3076 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] ratio is invalid parameter (%lf)", ratio);
3077 return VC_ERROR_INVALID_PARAMETER;
3080 vc_state_e state = VC_STATE_NONE;
3081 ret = vc_mgr_client_get_client_state(&state);
3082 if (VC_ERROR_NONE != ret) {
3083 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
3084 return VC_ERROR_INVALID_STATE;
3087 if (state != VC_STATE_READY && state != VC_STATE_INITIALIZED) {
3088 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: Current state is not 'READY' and not 'INITIALIZED', state(%d)", state);
3089 return VC_ERROR_INVALID_STATE;
3092 ret = vc_mgr_ducking_activate(ratio);
3093 if (VC_ERROR_NONE != ret)
3094 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to set ratio");
3096 SLOG(LOG_INFO, TAG_VCM, "[DEBUG] Success to set ratio");
3101 int vc_mgr_reset_background_volume(void)
3103 SLOG(LOG_INFO, TAG_VCM, "[Manager] Recover background volume");
3106 ret = __check_mgr_feature_privilege();
3107 if (VC_ERROR_NONE != ret)
3110 vc_state_e state = VC_STATE_NONE;
3111 ret = vc_mgr_client_get_client_state(&state);
3112 if (VC_ERROR_NONE != ret) {
3113 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
3114 return VC_ERROR_INVALID_STATE;
3117 if (state != VC_STATE_READY && state != VC_STATE_INITIALIZED) {
3118 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: Current state is not 'READY' and not 'INITIALIZED', state(%d)", state);
3119 return VC_ERROR_INVALID_STATE;
3122 ret = vc_mgr_ducking_deactivate();
3123 if (VC_ERROR_NONE != ret)
3124 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to recover volume");
3126 SLOG(LOG_INFO, TAG_VCM, "[DEBUG] Success to recover volume");