2 * Copyright (c) 2011-2015 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the License);
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an AS IS BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
18 #include <system_info.h>
19 #include <cynara-client.h>
20 #include <cynara-error.h>
21 #include <cynara-session.h>
25 #include "vc_cmd_db.h"
26 #include "vc_config_mgr.h"
27 #include "vc_command.h"
28 #include "vc_info_parser.h"
29 #include "vc_json_parser.h"
31 #include "vc_mgr_core.h"
32 #include "vc_mgr_client.h"
33 #include "vc_mgr_tidl.h"
34 #include "vc_mgr_data.h"
35 #include "vc_mgr_ducking.h"
36 #include "voice_control_command.h"
37 #include "voice_control_command_expand.h"
38 #include "voice_control_common.h"
39 #include "voice_control_manager.h"
40 #include "voice_control_manager_internal.h"
43 #define VC_MANAGER_CONFIG_HANDLE 10000000
45 static Ecore_Timer* g_send_hello_timer = NULL;
46 static Ecore_Timer* g_request_init_timer = NULL;
47 static int g_tidl_send_hello_count = 0;
51 static int g_daemon_pid = 0;
53 static int g_feature_enabled = -1;
55 static bool g_privilege_allowed = false;
57 static cynara *p_cynara = NULL;
58 static pthread_mutex_t g_cynara_mutex = PTHREAD_MUTEX_INITIALIZER;
60 /* for TTS feedback */
61 static Ecore_Thread* g_feedback_thread = NULL;
63 static pthread_mutex_t g_feedback_streaming_cb_mutex = PTHREAD_MUTEX_INITIALIZER;
64 static pthread_mutex_t g_vc_tts_streaming_cb_mutex = PTHREAD_MUTEX_INITIALIZER;
66 static Eina_Bool __vc_mgr_notify_state_changed(void *data);
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";
88 static void __vc_mgr_lang_changed_cb(const char* previous_lang, const char* current_lang)
90 SLOG(LOG_INFO, TAG_VCM, "Lang changed : previous lang(%s) current lang(%s)",
91 previous_lang, current_lang);
93 vc_current_language_changed_cb callback = NULL;
95 vc_mgr_client_get_current_lang_changed_cb(&callback, &lang_user_data);
97 if (NULL != callback) {
98 vc_mgr_client_use_callback();
99 callback(previous_lang, current_lang, lang_user_data);
100 vc_mgr_client_not_use_callback();
101 SLOG(LOG_INFO, TAG_VCM, "Language changed callback is called");
103 SLOG(LOG_WARN, TAG_VCM, "[WARNING] Language changed callback is null");
107 static int __vc_mgr_get_feature_enabled()
109 if (0 == g_feature_enabled) {
111 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Voice control feature NOT supported");
112 return VC_ERROR_NOT_SUPPORTED;
114 } else if (-1 == g_feature_enabled) {
115 bool vc_mgr_supported = false;
116 bool mic_supported = false;
117 if (SYSTEM_INFO_ERROR_NONE != system_info_get_platform_bool(VC_MGR_FEATURE_PATH, &vc_mgr_supported)) {
119 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get feature value");
120 return VC_ERROR_NOT_SUPPORTED;
124 if (SYSTEM_INFO_ERROR_NONE != system_info_get_platform_bool(VC_MIC_FEATURE_PATH, &mic_supported)) {
126 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get feature value");
127 return VC_ERROR_NOT_SUPPORTED;
131 if (false == vc_mgr_supported || false == mic_supported) {
133 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Voice control feature NOT supported");
134 g_feature_enabled = 0;
135 return VC_ERROR_NOT_SUPPORTED;
139 g_feature_enabled = 1;
142 return VC_ERROR_NONE;
145 static int __check_privilege_initialize()
147 int ret = cynara_initialize(&p_cynara, NULL);
148 if (NULL == p_cynara || CYNARA_API_SUCCESS != ret) {
149 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] fail to initialize(%d)", ret); //LCOV_EXCL_LINE
153 return ret == CYNARA_API_SUCCESS;
156 static int __check_privilege(const char* uid, const char * privilege)
159 char label_path[1024] = "/proc/self/attr/current";
160 char smack_label[1024] = {'\0',};
163 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] p_cynara is NULL");
167 fp = fopen(label_path, "r");
169 if (fread(smack_label, 1, sizeof(smack_label), fp) <= 0)
170 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] fail to fread");
175 pid_t pid = getpid();
176 char *session = cynara_session_from_pid(pid);
177 int ret = cynara_check(p_cynara, smack_label, session, uid, privilege);
181 if (ret != CYNARA_API_ACCESS_ALLOWED) {
182 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);
189 static void __check_privilege_deinitialize()
192 int ret = cynara_finish(p_cynara);
193 if (ret != CYNARA_API_SUCCESS)
194 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] cynara finish %d", ret);
199 static int __vc_mgr_check_privilege()
201 pthread_mutex_lock(&g_cynara_mutex);
203 if (true == g_privilege_allowed) {
204 pthread_mutex_unlock(&g_cynara_mutex);
205 return VC_ERROR_NONE;
209 ret = __check_privilege_initialize();
212 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] privilege initialize is failed");
213 g_privilege_allowed = false;
214 pthread_mutex_unlock(&g_cynara_mutex);
215 return VC_ERROR_PERMISSION_DENIED;
220 snprintf(uid, 32, "%d", getuid());
222 ret = __check_privilege(uid, VC_PRIVILEGE_RECORDER);
225 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Permission is denied(%s)(%s)", VC_PRIVILEGE_RECORDER, uid);
226 __check_privilege_deinitialize();
227 g_privilege_allowed = false;
228 pthread_mutex_unlock(&g_cynara_mutex);
229 return VC_ERROR_PERMISSION_DENIED;
233 ret = __check_privilege(uid, VC_MGR_PRIVILEGE);
236 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Permission is denied(%s)(%s)", VC_MGR_PRIVILEGE, uid);
237 __check_privilege_deinitialize();
238 g_privilege_allowed = false;
239 pthread_mutex_unlock(&g_cynara_mutex);
240 return VC_ERROR_PERMISSION_DENIED;
244 __check_privilege_deinitialize();
246 g_privilege_allowed = true;
247 pthread_mutex_unlock(&g_cynara_mutex);
248 return VC_ERROR_NONE;
251 int __check_mgr_feature_privilege()
253 if (0 != __vc_mgr_get_feature_enabled()) {
254 SLOG(LOG_DEBUG, TAG_VCM, "@@@ [Manager] not supported");
255 return VC_ERROR_NOT_SUPPORTED;
258 if (0 != __vc_mgr_check_privilege()) {
259 return VC_ERROR_PERMISSION_DENIED;
262 return VC_ERROR_NONE;
265 int vc_mgr_initialize(void)
267 SLOG(LOG_ERROR, TAG_VCM, "@@@ [Manager] Initialize");
270 ret = __check_mgr_feature_privilege();
271 if (VC_ERROR_NONE != ret)
275 if (true == vc_mgr_client_is_valid()) {
276 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Already initialized");
277 return VC_ERROR_NONE;
280 if (0 != vc_mgr_tidl_open_connection()) {
281 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to open tidl connection");
282 return VC_ERROR_OPERATION_FAILED;
285 if (0 != vc_mgr_client_create()) {
286 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to create client!!!!!");
287 return VC_ERROR_OUT_OF_MEMORY;
291 ret = vc_config_mgr_initialize(g_pid + VC_MANAGER_CONFIG_HANDLE);
293 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to init config manager : %d", ret);
294 vc_mgr_client_destroy();
295 return VC_ERROR_OPERATION_FAILED;
298 ret = vc_config_mgr_set_lang_cb(g_pid + VC_MANAGER_CONFIG_HANDLE, __vc_mgr_lang_changed_cb);
300 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to set callback : %d", ret);
301 vc_config_mgr_finalize(g_pid + VC_MANAGER_CONFIG_HANDLE);
302 vc_mgr_client_destroy();
303 return VC_ERROR_OPERATION_FAILED;
306 ret = vc_mgr_client_set_audio_streaming_mode(VC_AUDIO_STREAMING_MODE_VC_SERVICE);
308 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to set audio streaming mode : %d", ret);
309 vc_config_mgr_finalize(g_pid + VC_MANAGER_CONFIG_HANDLE);
310 vc_mgr_client_destroy();
314 ret = vc_mgr_ducking_create();
315 if (VC_ERROR_NONE != ret) {
316 SLOG(LOG_INFO, TAG_VCM, "[INFO] Fail to ducking create : %d", ret);
319 SLOG(LOG_ERROR, TAG_VCM, "[Success] pid(%d)", g_pid);
321 SLOG(LOG_DEBUG, TAG_VCM, "@@@ [Manager] Initialize DONE");
323 return VC_ERROR_NONE;
326 static void __vc_mgr_internal_unprepare()
328 int ret = vc_mgr_tidl_request_finalize(g_pid);
330 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request finalize : %s", __vc_mgr_get_error_code(ret));
333 vc_mgr_client_set_internal_state(VC_INTERNAL_STATE_NONE);
336 int vc_mgr_deinitialize(void)
338 SLOG(LOG_ERROR, TAG_VCM, "@@@ [Manager] Deinitialize");
341 ret = __check_mgr_feature_privilege();
342 if (VC_ERROR_NONE != ret)
345 if (false == vc_mgr_client_is_valid()) {
346 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] NOT initialized");
347 return VC_ERROR_INVALID_STATE;
351 vc_mgr_client_get_client_state(&state);
356 __vc_mgr_internal_unprepare();
357 /* no break. need to next step*/
358 case VC_STATE_INITIALIZED:
359 if (NULL != g_send_hello_timer) {
360 SLOG(LOG_DEBUG, TAG_VCM, "Connect Timer is deleted");
361 ecore_timer_del(g_send_hello_timer);
362 g_send_hello_timer = NULL;
364 if (g_request_init_timer) {
365 SLOG(LOG_DEBUG, TAG_VCM, "Connect idler is deleted");
366 ecore_timer_del(g_request_init_timer);
367 g_request_init_timer = NULL;
370 vc_config_mgr_unset_lang_cb(g_pid + VC_MANAGER_CONFIG_HANDLE);
371 vc_config_mgr_finalize(g_pid + VC_MANAGER_CONFIG_HANDLE);
373 /* Free client resources */
374 vc_mgr_client_destroy();
381 SLOG(LOG_DEBUG, TAG_VCM, "Success: destroy");
383 int cnt = VC_COMMAND_TYPE_FOREGROUND;
385 ret = vc_cmd_parser_delete_file(getpid(), cnt);
387 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to delete file, type(%d), ret(%d)", cnt, ret);
388 } while (VC_COMMAND_TYPE_EXCLUSIVE >= ++cnt);
390 ret = vc_db_finalize();
392 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to finalize DB, ret(%d)", ret);
395 ret = vc_mgr_ducking_destroy();
396 if (VC_ERROR_NONE != ret) {
397 SLOG(LOG_INFO, TAG_VCM, "[INFO] Fail to ducking destroy : %d", ret);
400 if (0 != vc_mgr_tidl_close_connection()) {
401 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to close connection");
404 SLOG(LOG_ERROR, TAG_VCM, "@@@ [Manager] Deinitialize DONE");
406 return VC_ERROR_NONE;
410 static void __notify_error(void *data)
412 vc_mgr_core_notify_error();
416 static Eina_Bool __request_initialize(void *data)
418 /* request initialization */
420 int service_state = 0;
421 int foreground = VC_RUNTIME_INFO_NO_FOREGROUND;
425 if (true == vc_mgr_client_is_valid()) {
426 SLOG(LOG_DEBUG, TAG_VCM, "[DEBUG] is valid");
429 ret = vc_db_initialize();
431 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to initialize DB : %d", ret);
435 vc_audio_streaming_mode_e streaming_mode;
436 vc_mgr_client_get_audio_streaming_mode(&streaming_mode);
438 ret = vc_mgr_tidl_request_initialize(g_pid, (int)streaming_mode, &service_state, &foreground, &g_daemon_pid);
440 if (VC_ERROR_ENGINE_NOT_FOUND == ret) {
442 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to initialize : %s", __vc_mgr_get_error_code(ret));
444 vc_mgr_client_set_error(VC_ERROR_ENGINE_NOT_FOUND);
445 ecore_main_loop_thread_safe_call_async(__notify_error, NULL);
447 SLOG(LOG_DEBUG, TAG_VCM, "@@@");
448 g_request_init_timer = NULL;
452 } else if (0 != ret) {
453 SLOG(LOG_ERROR, TAG_VCM, "[WARNING] Fail to connection. Retry to connect : %s", __vc_mgr_get_error_code(ret));
454 ret = vc_db_finalize();
456 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to finalize DB : %d", ret);
460 /* Success to connect */
463 /* Set service state */
464 vc_service_state_e previous_service_state;
465 vc_mgr_client_get_service_state(&previous_service_state);
466 vc_mgr_client_set_service_state((vc_service_state_e)service_state);
468 vc_service_state_changed_cb service_changed_callback = NULL;
469 void* user_data = NULL;
470 vc_mgr_client_get_service_state_changed_cb(&service_changed_callback, &user_data);
472 if (NULL != service_changed_callback) {
473 vc_mgr_client_use_callback();
474 service_changed_callback(previous_service_state, service_state, user_data);
475 vc_mgr_client_not_use_callback();
476 SLOG(LOG_INFO, TAG_VCM, "Service state changed callback is called");
478 SLOG(LOG_WARN, TAG_VCM, "[WARNING] Service state changed callback is null");
482 vc_mgr_client_set_foreground(foreground, true);
484 SLOG(LOG_ERROR, TAG_VCM, "[SUCCESS] Connected daemon");
486 /* Set client state */
487 vc_mgr_client_set_client_state(VC_STATE_READY);
489 vc_state_changed_cb changed_callback = NULL;
491 vc_mgr_client_get_state_changed_cb(&changed_callback, &user_data);
493 vc_state_e current_state;
494 vc_state_e previous_state;
496 vc_mgr_client_get_previous_state(¤t_state, &previous_state);
498 if (NULL != changed_callback) {
499 vc_mgr_client_use_callback();
500 changed_callback(previous_state, current_state, user_data);
501 vc_mgr_client_not_use_callback();
502 SLOG(LOG_INFO, TAG_VCM, "State changed callback is called");
504 SLOG(LOG_WARN, TAG_VCM, "[WARNING] State changed callback is null");
507 SLOG(LOG_ERROR, TAG_VCM, "[Not ERROR] is not valid. It is destroyed."); //LCOV_EXCL_LINE
508 g_request_init_timer = NULL;
512 SLOG(LOG_ERROR, TAG_VCM, "@@@");
514 g_request_init_timer = NULL;
519 static Eina_Bool __send_hello_message(void *data)
522 if (0 != vc_mgr_tidl_request_hello()) {
523 if (g_tidl_send_hello_count == VCM_TIDL_RETRY_COUNT) {
524 g_tidl_send_hello_count = 0;
525 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request hello !! send error to manager");
526 vc_mgr_core_send_error(VC_ERROR_TIMED_OUT, -1, "voice_framework.error.vcfw.connect_engine_fail");
527 g_send_hello_timer = NULL;
530 g_tidl_send_hello_count++;
535 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Connect daemon");
537 if (NULL == g_request_init_timer) {
538 SLOG(LOG_INFO, TAG_VCM, "[DEBUG] Create a new idler for preparation");
539 g_request_init_timer = ecore_timer_add(0.0, __request_initialize, NULL);
541 SLOG(LOG_INFO, TAG_VCM, "[INFO] idler handle is already created");
544 g_send_hello_timer = NULL;
548 int vc_mgr_prepare(void)
550 SLOG(LOG_ERROR, TAG_VCM, "@@@ [Manager] Prepare");
553 ret = __check_mgr_feature_privilege();
554 if (VC_ERROR_NONE != ret)
558 if (0 != vc_mgr_client_get_client_state(&state)) {
559 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
560 return VC_ERROR_INVALID_STATE;
564 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
566 if (NULL == g_send_hello_timer) {
567 g_tidl_send_hello_count = 0;
568 SLOG(LOG_INFO, TAG_VCM, "[DEBUG] Create a new timer for preparation");
569 ecore_thread_main_loop_begin();
570 g_send_hello_timer = ecore_timer_add(0.1, __send_hello_message, NULL);
571 ecore_thread_main_loop_end();
573 SLOG(LOG_INFO, TAG_VCM, "[INFO] timer handle is already created");
576 SLOG(LOG_DEBUG, TAG_VCM, "@@@ [Manager] Calling Prepare DONE");
578 return VC_ERROR_NONE;
581 int vc_mgr_unprepare(void)
583 SLOG(LOG_ERROR, TAG_VCM, "@@@ [Manager] Unprepare");
586 ret = __check_mgr_feature_privilege();
587 if (VC_ERROR_NONE != ret)
591 if (0 != vc_mgr_client_get_client_state(&state)) {
592 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
593 return VC_ERROR_INVALID_STATE;
597 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Ready'", state);
599 __vc_mgr_internal_unprepare();
601 vc_mgr_client_set_client_state(VC_STATE_INITIALIZED);
602 ecore_timer_add(0, __vc_mgr_notify_state_changed, NULL);
604 SLOG(LOG_DEBUG, TAG_VCM, "@@@ [Manager] Unprepare DONE");
606 return VC_ERROR_NONE;
609 int vc_mgr_foreach_supported_languages(vc_supported_language_cb callback, void* user_data)
611 SLOG(LOG_INFO, TAG_VCM, "@@@ [Manager] Foreach Supported Language");
614 ret = __check_mgr_feature_privilege();
615 if (VC_ERROR_NONE != ret)
618 RETVM_IF(NULL == callback, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Input parameter is NULL");
621 if (0 != vc_mgr_client_get_client_state(&state)) {
622 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
623 return VC_ERROR_INVALID_STATE;
626 ret = vc_config_mgr_get_language_list(callback, user_data);
628 ret = vc_config_convert_error_code((vc_config_error_e)ret);
629 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get languages : %s", __vc_mgr_get_error_code(ret));
632 SLOG(LOG_DEBUG, TAG_VCM, "@@@ [Manager] Foreach Supported Language DONE");
634 return VC_ERROR_NONE;
637 int vc_mgr_get_current_language(char** language)
640 ret = __check_mgr_feature_privilege();
641 if (VC_ERROR_NONE != ret)
644 RETVM_IF(NULL == language, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Input parameter is NULL");
647 if (0 != vc_mgr_client_get_client_state(&state)) {
648 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
649 return VC_ERROR_INVALID_STATE;
652 ret = vc_config_mgr_get_default_language(language);
654 ret = vc_config_convert_error_code((vc_config_error_e)ret);
655 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get current languages : %s", __vc_mgr_get_error_code(ret));
657 SLOG(LOG_ERROR, TAG_VCM, "[Get current language] language : %s", *language);
663 int vc_mgr_get_state(vc_state_e* state)
665 SLOG(LOG_DEBUG, TAG_VCM, "@@@ [Manager] Get State");
668 ret = __check_mgr_feature_privilege();
669 if (VC_ERROR_NONE != ret)
672 RETVM_IF(NULL == state, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Input parameter is NULL");
675 if (0 != vc_mgr_client_get_client_state(&temp)) {
676 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
677 return VC_ERROR_INVALID_STATE;
683 case VC_STATE_NONE: SLOG(LOG_INFO, TAG_VCM, "Current state is 'None'"); break;
684 case VC_STATE_INITIALIZED: SLOG(LOG_INFO, TAG_VCM, "Current state is 'Created'"); break;
685 case VC_STATE_READY: SLOG(LOG_INFO, TAG_VCM, "Current state is 'Ready'"); break;
686 default: SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid state"); //LCOV_EXCL_LINE
689 SLOG(LOG_DEBUG, TAG_VCM, "@@@ [Manager] Get State DONE");
691 return VC_ERROR_NONE;
694 int vc_mgr_get_service_state(vc_service_state_e* state)
696 SLOG(LOG_DEBUG, TAG_VCM, "@@@ [Manager] Get Service State");
699 ret = __check_mgr_feature_privilege();
700 if (VC_ERROR_NONE != ret)
703 RETVM_IF(NULL == state, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Input parameter is NULL");
705 vc_state_e client_state;
706 if (0 != vc_mgr_client_get_client_state(&client_state)) {
707 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
708 return VC_ERROR_INVALID_STATE;
712 RETVM_IF(client_state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Current state is not 'READY'");
714 /* get service state */
715 vc_service_state_e service_state;
716 if (0 != vc_mgr_client_get_service_state(&service_state)) {
717 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get service state");
718 return VC_ERROR_OPERATION_FAILED;
721 *state = service_state;
724 case VC_SERVICE_STATE_NONE: SLOG(LOG_DEBUG, TAG_VCM, "Current service state is 'None'"); break;
725 case VC_SERVICE_STATE_READY: SLOG(LOG_DEBUG, TAG_VCM, "Current service state is 'Ready'"); break;
726 case VC_SERVICE_STATE_RECORDING: SLOG(LOG_DEBUG, TAG_VCM, "Current service state is 'Recording'"); break;
727 case VC_SERVICE_STATE_PROCESSING: SLOG(LOG_DEBUG, TAG_VCM, "Current service state is 'Processing'"); break;
728 default: SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid state"); //LCOV_EXCL_LINE
731 SLOG(LOG_DEBUG, TAG_VCM, "@@@ [Manager] Get Service State DONE");
733 return VC_ERROR_NONE;
736 int vc_mgr_set_demandable_client_rule(const char* rule)
738 SLOG(LOG_INFO, TAG_VCM, "@@@ [Manager] Set Demandable client rule(%s)", rule);
741 ret = __check_mgr_feature_privilege();
742 if (VC_ERROR_NONE != ret)
745 RETVM_IF(NULL == rule, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Input parameter is NULL");
748 if (0 != vc_mgr_client_get_client_state(&state)) {
749 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
750 return VC_ERROR_INVALID_STATE;
754 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Ready'", state);
756 ret = vc_mgr_core_set_demandable_client_rule(rule);
758 SLOG(LOG_DEBUG, TAG_VCM, "@@@ [Manager] Set Demandable client rule(%s) DONE", rule);
763 int vc_mgr_unset_demandable_client_rule(void)
765 SLOG(LOG_INFO, TAG_VCM, "@@@ [Manager] Unset Demandable client");
768 ret = __check_mgr_feature_privilege();
769 if (VC_ERROR_NONE != ret)
773 if (0 != vc_mgr_client_get_client_state(&state)) {
774 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
775 return VC_ERROR_INVALID_STATE;
779 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Ready'", state);
781 vc_info_parser_set_demandable_client(NULL);
783 ret = vc_mgr_tidl_request_demandable_client(g_pid);
785 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request unset client rule to daemon : %s", __vc_mgr_get_error_code(ret));
788 // TODO: check return value correct or not
789 return VC_ERROR_NONE;
792 int vc_mgr_is_command_format_supported(int format, bool* support)
794 SLOG(LOG_ERROR, TAG_VCM, "@@@ [Manager] Is command type supported");
797 ret = __check_mgr_feature_privilege();
798 if (VC_ERROR_NONE != ret)
801 RETVM_IF(NULL == support, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Input parameter is NULL");
804 if (0 != vc_mgr_client_get_client_state(&state)) {
805 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
806 return VC_ERROR_INVALID_STATE;
810 bool non_fixed_support = false;
811 if (0 != vc_config_mgr_get_nonfixed_support(&non_fixed_support)) {
812 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get nonfixed support info");
816 case VC_CMD_FORMAT_FIXED: *support = true; break;
817 case VC_CMD_FORMAT_FIXED_AND_VFIXED: *support = true; break;
818 case VC_CMD_FORMAT_VFIXED_AND_FIXED: *support = true; break;
819 case VC_CMD_FORMAT_FIXED_AND_NONFIXED: *support = non_fixed_support; break;
820 case VC_CMD_FORMAT_NONFIXED_AND_FIXED: *support = non_fixed_support; break;
821 default: *support = false; break;
824 SLOG(LOG_ERROR, TAG_VCM, "[DEBUG] Format(%d) support(%s)", format, *support ? "true" : "false");
826 SLOG(LOG_DEBUG, TAG_VCM, "@@@ [Manager] Is command type supported DONE");
828 return VC_ERROR_NONE;
831 int vc_mgr_enable_command_type(int cmd_type)
833 SLOG(LOG_ERROR, TAG_VCM, "@@@ [Manager] Enable Command Type, cmd_type(%d)", cmd_type);
836 ret = __check_mgr_feature_privilege();
837 if (VC_ERROR_NONE != ret)
840 if (VC_COMMAND_TYPE_FOREGROUND > cmd_type || VC_COMMAND_TYPE_EXCLUSIVE < cmd_type) {
841 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] cmd_type is not valid. (%d)", cmd_type);
842 return VC_ERROR_INVALID_PARAMETER;
846 if (0 != vc_mgr_client_get_client_state(&state)) {
847 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
848 return VC_ERROR_INVALID_STATE;
852 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Ready'", state);
854 /* Check service state */
855 vc_service_state_e service_state = -1;
856 vc_mgr_client_get_service_state(&service_state);
857 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);
859 ret = vc_mgr_client_enable_command_type((vc_cmd_type_e)cmd_type); // enable the cmd type
861 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to enable the command type(%d). ret(%d)", cmd_type, ret);
863 SLOG(LOG_DEBUG, TAG_VCM, "[DEBUG] Success to enable the command type(%d)", cmd_type);
866 SLOG(LOG_ERROR, TAG_VCM, "@@@ [Manager] Enable Command Type DONE, ret(%d)", ret);
871 int vc_mgr_disable_command_type(int cmd_type)
873 SLOG(LOG_ERROR, TAG_VCM, "@@@ [Manager] Disable Command Type, cmd_type(%d)", cmd_type);
876 ret = __check_mgr_feature_privilege();
877 if (VC_ERROR_NONE != ret)
880 if (VC_COMMAND_TYPE_FOREGROUND > cmd_type || VC_COMMAND_TYPE_EXCLUSIVE < cmd_type) {
881 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] cmd type is not valid, (%d)", cmd_type);
882 return VC_ERROR_INVALID_PARAMETER;
886 if (0 != vc_mgr_client_get_client_state(&state)) {
887 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
888 return VC_ERROR_INVALID_STATE;
892 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Ready'", state);
894 /* Check service state */
895 vc_service_state_e service_state = -1;
896 vc_mgr_client_get_service_state(&service_state);
897 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);
899 ret = vc_mgr_client_disable_command_type((vc_cmd_type_e)cmd_type); // enable the cmd type
901 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to disable the command type(%d). ret(%d)", cmd_type, ret);
903 SLOG(LOG_DEBUG, TAG_VCM, "[DEBUG] Success to disable the command type(%d)", cmd_type);
906 SLOG(LOG_ERROR, TAG_VCM, "@@@ [Manager] Disable Command Type DONE, ret(%d)", ret);
911 int vc_mgr_set_command_list(vc_cmd_list_h vc_cmd_list)
913 SLOG(LOG_ERROR, TAG_VCM, "@@@ [Manager] Set Command list");
916 ret = __check_mgr_feature_privilege();
917 if (VC_ERROR_NONE != ret)
921 if (0 != vc_mgr_client_get_client_state(&state)) {
922 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
923 return VC_ERROR_INVALID_STATE;
927 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
929 /* Check service state */
930 vc_service_state_e service_state = -1;
931 vc_mgr_client_get_service_state(&service_state);
932 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);
934 RETVM_IF(NULL == vc_cmd_list, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Input parameter is NULL");
936 vc_cmd_list_s* list = NULL;
937 list = (vc_cmd_list_s*)vc_cmd_list;
938 SLOG(LOG_INFO, TAG_VCM, "[List] (%p) (%p)", list, list->list);
940 RETVM_IF(NULL == list->list, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Input command list");
943 bool success_save = false;
944 for (i = VC_COMMAND_TYPE_FOREGROUND; i <= VC_COMMAND_TYPE_EXCLUSIVE; i++) {
945 ret = vc_cmd_parser_delete_file(getpid(), i);
947 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to delete file, type(%d), ret(%d)", i, ret);
949 ret = vc_cmd_parser_save_file(getpid(), i, list->list, NULL);
951 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to save file, type(%d), ret(%d)", i, ret);
953 SLOG(LOG_INFO, TAG_VCM, "[SUCCESS] Save file, type(%d)", i);
958 if (true != success_save) {
959 ret = VC_ERROR_INVALID_PARAMETER;
960 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to save command group : %s", __vc_mgr_get_error_code(ret));
962 ret = vc_mgr_tidl_request_set_command(g_pid);
964 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request set command to daemon : %s", __vc_mgr_get_error_code(ret));
968 SLOG(LOG_ERROR, TAG_VCM, "@@@ [Manager] Set Command list DONE, ret(%d)", ret);
973 int vc_mgr_unset_command_list(void)
975 SLOG(LOG_ERROR, TAG_VCM, "@@@ [Manager] Unset Command list");
978 ret = __check_mgr_feature_privilege();
979 if (VC_ERROR_NONE != ret)
983 if (0 != vc_mgr_client_get_client_state(&state)) {
984 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
985 return VC_ERROR_INVALID_STATE;
989 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
991 ret = vc_mgr_tidl_request_unset_command(g_pid);
993 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request unset command to daemon : %s", __vc_mgr_get_error_code(ret));
997 for (i = VC_COMMAND_TYPE_FOREGROUND; i <= VC_COMMAND_TYPE_EXCLUSIVE; i++) {
998 ret = vc_cmd_parser_delete_file(getpid(), i);
1000 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to delete file, type(%d), ret(%d)", i, ret);
1003 SLOG(LOG_ERROR, TAG_VCM, "@@@ [Manager] Unset Command list DONE");
1005 // TODO: check return value correct or not
1006 return VC_ERROR_NONE;
1009 int vc_mgr_set_command_list_from_file(const char* file_path, int type)
1011 SLOG(LOG_ERROR, TAG_VCM, "@@@ [Manager] Set Command list from file, type(%d)", type);
1014 ret = __check_mgr_feature_privilege();
1015 if (VC_ERROR_NONE != ret)
1018 RETVM_IF(NULL == file_path, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Invalid parameter");
1019 SLOG(LOG_INFO, TAG_VCM, "@@@ File path: %s", file_path);
1022 if (VC_COMMAND_TYPE_FOREGROUND > type || VC_COMMAND_TYPE_EXCLUSIVE < type) {
1023 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid command type: input type is %d", type);
1024 return VC_ERROR_INVALID_PARAMETER;
1028 if (0 != vc_mgr_client_get_client_state(&state)) {
1029 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1030 return VC_ERROR_INVALID_STATE;
1034 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
1036 /* Check service state */
1037 vc_service_state_e service_state = -1;
1038 vc_mgr_client_get_service_state(&service_state);
1039 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);
1041 ret = vc_cmd_parser_delete_file(getpid(), type);
1043 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to delete file, type(4), ret(%d)", ret);
1045 if (0 != vc_json_set_commands_from_file(file_path, type, NULL)) {
1046 ret = VC_ERROR_INVALID_PARAMETER;
1047 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to save command list (%d)", ret);
1049 ret = vc_mgr_tidl_request_set_command(g_pid);
1051 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request set command to daemon : %s", __vc_mgr_get_error_code(ret));
1055 SLOG(LOG_ERROR, TAG_VCM, "@@@ [Manager] Set Command list from file DONE, ret(%d)", ret);
1060 int vc_mgr_set_preloaded_commands_from_file(const char* file_path)
1062 SLOG(LOG_ERROR, TAG_VCM, "@@@ [Manager] Set preloaded command list");
1065 ret = __check_mgr_feature_privilege();
1066 if (VC_ERROR_NONE != ret)
1069 RETVM_IF(NULL == file_path, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Invalid parameter");
1070 SLOG(LOG_INFO, TAG_VCM, "@@@ File path: %s", file_path);
1073 if (0 != vc_mgr_client_get_client_state(&state)) {
1074 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1075 return VC_ERROR_INVALID_STATE;
1079 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
1081 /* Check service state */
1082 vc_service_state_e service_state = -1;
1083 vc_mgr_client_get_service_state(&service_state);
1084 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);
1086 /* Only support to set background commands for preloaded application */
1087 ret = vc_json_set_commands_from_file(file_path, VC_COMMAND_TYPE_BACKGROUND, NULL);
1089 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to insert preloaded commands into db");
1091 SLOG(LOG_ERROR, TAG_VCM, "@@@ [Manager] Set preloaded command list DONE, ret(%d)", ret);
1095 int vc_mgr_set_audio_type(const char* audio_id)
1097 SLOG(LOG_ERROR, TAG_VCM, "@@@ [Manager] Set audio type, audio_id(%s)", audio_id);
1100 ret = __check_mgr_feature_privilege();
1101 if (VC_ERROR_NONE != ret)
1104 if (NULL == audio_id || !strncmp(audio_id, "", strlen(audio_id))) {
1105 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Input parameter is NULL");
1106 return VC_ERROR_INVALID_PARAMETER;
1110 if (0 != vc_mgr_client_get_client_state(&state)) {
1111 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1112 return VC_ERROR_INVALID_STATE;
1116 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
1118 /* Check service state */
1119 vc_service_state_e service_state = -1;
1120 vc_mgr_client_get_service_state(&service_state);
1121 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);
1124 ret = vc_mgr_tidl_request_set_audio_type(g_pid, audio_id);
1126 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to set audio type : %s", __vc_mgr_get_error_code(ret));
1128 SLOG(LOG_INFO, TAG_VCM, "[SUCCESS] Set audio type");
1130 vc_mgr_client_set_audio_type(audio_id);
1133 SLOG(LOG_ERROR, TAG_VCM, "@@@ [Manager] Set audio type DONE, ret(%d)", ret);
1138 int vc_mgr_get_audio_type(char** audio_id)
1140 SLOG(LOG_ERROR, TAG_VCM, "@@@ [Manager] Get audio type");
1143 ret = __check_mgr_feature_privilege();
1144 if (VC_ERROR_NONE != ret)
1147 RETVM_IF(NULL == audio_id, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Invalid parameter");
1150 if (0 != vc_mgr_client_get_client_state(&state)) {
1151 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1152 return VC_ERROR_INVALID_STATE;
1156 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
1158 /* Check service state */
1159 vc_service_state_e service_state = -1;
1160 vc_mgr_client_get_service_state(&service_state);
1161 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);
1165 vc_mgr_client_get_audio_type(&temp);
1168 /* Not initiallized */
1171 ret = vc_mgr_tidl_request_get_audio_type(g_pid, &temp);
1173 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get audio type : %s", __vc_mgr_get_error_code(ret));
1175 SLOG(LOG_ERROR, TAG_VCM, "[SUCCESS] Get audio type : %s", temp);
1177 vc_mgr_client_set_audio_type(temp);
1183 *audio_id = strdup(temp);
1188 // TODO: check return value correct or not
1189 return VC_ERROR_NONE;
1192 int vc_mgr_get_current_commands(vc_cmd_list_h* vc_cmd_list)
1194 SLOG(LOG_ERROR, TAG_VCM, "@@@ [Manager] Foreach current commands");
1197 ret = __check_mgr_feature_privilege();
1198 if (VC_ERROR_NONE != ret)
1202 if (0 != vc_mgr_client_get_client_state(&state)) {
1203 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1204 return VC_ERROR_INVALID_STATE;
1208 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
1210 /* Check service state */
1211 vc_service_state_e service_state = -1;
1212 vc_mgr_client_get_service_state(&service_state);
1213 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);
1215 RETVM_IF(NULL == vc_cmd_list, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Invalid Parameter");
1217 vc_cmd_list_h temp_list = NULL;
1218 if (0 != vc_cmd_list_create(&temp_list)) {
1219 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to create list");
1220 return VC_ERROR_OUT_OF_MEMORY;
1223 *vc_cmd_list = temp_list;
1228 /* Get foreground pid */
1229 if (0 != vc_mgr_client_get_foreground(&fg_pid)) {
1230 /* There is no foreground app for voice control */
1231 SLOG(LOG_WARN, TAG_VCM, "[Manager WARNING] No foreground pid for voice control");
1233 SLOG(LOG_INFO, TAG_VCM, "[Manager] Foreground pid(%d)", fg_pid);
1236 if (0 != vc_mgr_client_get_pid(&mgr_pid)) {
1237 SLOG(LOG_ERROR, TAG_VCM, "[Manager] Fail to get manager pid");
1238 return VC_ERROR_OPERATION_FAILED;
1240 SLOG(LOG_INFO, TAG_VCM, "[Manager] Manager pid(%d)", mgr_pid);
1243 /* Get system command */
1244 ret = vc_cmd_parser_append_commands(mgr_pid, VC_COMMAND_TYPE_SYSTEM, temp_list);
1246 SLOG(LOG_INFO, TAG_VCM, "[Manager] No system commands");
1250 ret = vc_mgr_tidl_request_set_client_info(g_pid);
1252 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to set client info : %s", __vc_mgr_get_error_code(ret));
1254 SLOG(LOG_INFO, TAG_VCM, "[SUCCESS] Set client info");
1257 GSList *iter = NULL;
1258 GSList* client_info_list = NULL;
1259 vc_client_info_s *client_info = NULL;
1260 bool is_fgpid = false;
1262 if (0 != vc_info_parser_get_client_info(&client_info_list)) {
1263 SLOG(LOG_INFO, TAG_VCM, "[DEBUG] No client");
1264 return VC_ERROR_NONE;
1268 if (VC_NO_FOREGROUND_PID != fg_pid) {
1269 iter = g_slist_nth(client_info_list, 0);
1270 while (NULL != iter) {
1271 client_info = iter->data;
1272 if (NULL != client_info) {
1273 if (fg_pid == client_info->pid) {
1278 iter = g_slist_next(iter);
1282 /* Get foreground commands and widget */
1283 if (true == is_fgpid) {
1285 SLOG(LOG_INFO, TAG_VCM, "[Manager] fore cmd(%d)", client_info->fg_cmd);
1287 /* Get foreground command */
1288 if (true == client_info->fg_cmd) {
1289 ret = vc_cmd_parser_append_commands(fg_pid, VC_COMMAND_TYPE_FOREGROUND, temp_list);
1291 SLOG(LOG_ERROR, TAG_VCM, "[Client Data ERROR] Fail to get the fg command list");
1294 SLOG(LOG_INFO, TAG_VCM, "[Manager] No foreground commands");
1297 /* Check exclusive option */
1298 if (true == client_info->exclusive_cmd) {
1299 SLOG(LOG_INFO, TAG_VCM, "[Manager] Exclusive command is ON");
1301 /* Set background command for exclusive option */
1302 if (true == client_info->bg_cmd) {
1303 SLOG(LOG_INFO, TAG_VCM, "[Manager] Set background command");
1304 ret = vc_cmd_parser_append_commands(client_info->pid, VC_COMMAND_TYPE_BACKGROUND, temp_list);
1306 SLOG(LOG_ERROR, TAG_VCM, "[Client Data ERROR] Fail to get the bg command list : pid(%d)", client_info->pid);
1310 /* need to release client info */
1311 iter = g_slist_nth(client_info_list, 0);
1313 while (NULL != iter) {
1314 client_info = iter->data;
1316 client_info_list = g_slist_remove_link(client_info_list, iter);
1317 iter = g_slist_nth(client_info_list, 0);
1320 SLOG(LOG_DEBUG, TAG_VCM, "@@@ [Manager] Foreach current commands DONE");
1322 return VC_ERROR_NONE;
1325 SLOG(LOG_INFO, TAG_VCM, "[Manager] No foreground app");
1328 /* Get background commands */
1329 if (0 < g_slist_length(client_info_list)) {
1330 iter = g_slist_nth(client_info_list, 0);
1332 while (NULL != iter) {
1333 client_info = iter->data;
1335 if (NULL != client_info) {
1336 SLOG(LOG_INFO, TAG_VCM, "[Manager] Pid(%d) Back cmd(%d)", client_info->pid, client_info->bg_cmd);
1337 if (true == client_info->bg_cmd) {
1338 ret = vc_cmd_parser_append_commands(client_info->pid, VC_COMMAND_TYPE_BACKGROUND, temp_list);
1340 SLOG(LOG_ERROR, TAG_VCM, "[Client Data ERROR] Fail to get the bg command list : pid(%d)", client_info->pid);
1345 client_info_list = g_slist_remove_link(client_info_list, iter);
1347 iter = g_slist_nth(client_info_list, 0);
1351 SLOG(LOG_INFO, TAG_VCM, "[Manager] No background commands");
1354 SLOG(LOG_ERROR, TAG_VCM, "@@@ [Manager] Foreach current commands DONE");
1356 // TODO: check return value correct or not
1357 return VC_ERROR_NONE;
1361 int vc_mgr_set_recognition_mode(vc_recognition_mode_e mode)
1363 SLOG(LOG_INFO, TAG_VCM, "@@@ [Manager] Set recognition mode = %d", mode);
1366 ret = __check_mgr_feature_privilege();
1367 if (VC_ERROR_NONE != ret)
1370 /* check vc recognition mode */
1371 if (mode < VC_RECOGNITION_MODE_STOP_BY_SILENCE || mode > VC_RECOGNITION_MODE_MANUAL) {
1372 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] invalid parameter: 'mode' is not supported mode (%d)", mode);
1373 return VC_ERROR_INVALID_PARAMETER;
1377 if (0 != vc_mgr_client_get_client_state(&state)) {
1378 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1379 return VC_ERROR_INVALID_STATE;
1383 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
1385 /* Check service state */
1386 vc_service_state_e service_state = -1;
1387 vc_mgr_client_get_service_state(&service_state);
1388 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);
1390 vc_mgr_client_set_recognition_mode(mode);
1391 return VC_ERROR_NONE;
1394 int vc_mgr_get_recognition_mode(vc_recognition_mode_e* mode)
1397 ret = __check_mgr_feature_privilege();
1398 if (VC_ERROR_NONE != ret)
1401 RETVM_IF(NULL == mode, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Invalid parameter, mode is NULL ptr");
1404 if (0 != vc_mgr_client_get_client_state(&state)) {
1405 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1406 return VC_ERROR_INVALID_STATE;
1409 ret = vc_mgr_client_get_recognition_mode(mode);
1411 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get recognition mode");
1415 SLOG(LOG_INFO, TAG_VCM, "@@@ [Manager] Get recognition mode = %d", *mode);
1416 return VC_ERROR_NONE;
1419 int vc_mgr_set_private_data(const char* key, const char* data)
1421 SLOG(LOG_INFO, TAG_VCM, "@@@ [Manager] Set private data");
1424 ret = __check_mgr_feature_privilege();
1425 if (VC_ERROR_NONE != ret)
1428 RETVM_IF(NULL == key, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Invalid parameter");
1431 if (0 != vc_mgr_client_get_client_state(&state)) {
1432 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1433 return VC_ERROR_INVALID_STATE;
1437 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
1439 /* Check service state */
1440 vc_service_state_e service_state = -1;
1441 vc_mgr_client_get_service_state(&service_state);
1442 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);
1444 ret = vc_mgr_tidl_request_set_private_data(g_pid, key, data);
1446 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to set private data : %s", __vc_mgr_get_error_code(ret));
1449 SLOG(LOG_DEBUG, TAG_VCM, "[SUCCESS] Set private data");
1452 SLOG(LOG_DEBUG, TAG_VCM, "@@@ [Manager] Set private data DONE");
1454 return VC_ERROR_NONE;
1457 int vc_mgr_get_private_data(const char* key, char** data)
1459 SLOG(LOG_DEBUG, TAG_VCM, "@@@ [Manager] Get private data");
1462 ret = __check_mgr_feature_privilege();
1463 if (VC_ERROR_NONE != ret)
1466 if (NULL == key || NULL == data) {
1467 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid parameter");
1468 return VC_ERROR_INVALID_PARAMETER;
1472 if (0 != vc_mgr_client_get_client_state(&state)) {
1473 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1474 return VC_ERROR_INVALID_STATE;
1478 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
1480 /* Check service state */
1481 vc_service_state_e service_state = -1;
1482 vc_mgr_client_get_service_state(&service_state);
1483 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);
1486 ret = vc_mgr_tidl_request_get_private_data(g_pid, key, &temp);
1488 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get private data request : %s", __vc_mgr_get_error_code(ret));
1490 SLOG(LOG_INFO, TAG_VCM, "[SUCCESS] Get private data, key(%s), data(%s)", key, temp);
1494 *data = strdup(temp);
1499 SLOG(LOG_DEBUG, TAG_VCM, "@@@ [Manager] Get private data DONE");
1501 // TODO: check return value correct or not
1502 return VC_ERROR_NONE;
1505 int vc_mgr_set_domain(const char* domain)
1507 SLOG(LOG_DEBUG, TAG_VCM, "@@@ [Manager] Set domain");
1510 ret = __check_mgr_feature_privilege();
1511 if (VC_ERROR_NONE != ret)
1514 RETVM_IF(NULL == domain, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Invalid parameter");
1517 if (0 != vc_mgr_client_get_client_state(&state)) {
1518 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1519 return VC_ERROR_INVALID_STATE;
1523 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
1525 /* Check service state */
1526 vc_service_state_e service_state = -1;
1527 vc_mgr_client_get_service_state(&service_state);
1528 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);
1530 ret = vc_mgr_tidl_request_set_domain(g_pid, domain);
1532 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to set domain request : %s", __vc_mgr_get_error_code(ret));
1534 SLOG(LOG_INFO, TAG_VCM, "[SUCCESS] Set domain");
1537 SLOG(LOG_DEBUG, TAG_VCM, "@@@ [Manager] Set domain DONE");
1539 return VC_ERROR_NONE;
1542 int vc_mgr_do_action(vc_send_event_type_e type, char* send_event)
1544 SLOG(LOG_INFO, TAG_VCM, "@@@ [Manager] do action");
1547 ret = __check_mgr_feature_privilege();
1548 if (VC_ERROR_NONE != ret)
1551 if (type < VC_SEND_EVENT_TYPE_TEXT || VC_SEND_EVENT_TYPE_HAPTIC_EVENT < type) {
1552 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] send event type is not valid, (%d)", type);
1553 return VC_ERROR_INVALID_PARAMETER;
1556 RETVM_IF(NULL == send_event, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Invalid parameter");
1559 if (0 != vc_mgr_client_get_client_state(&state)) {
1560 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1561 return VC_ERROR_INVALID_STATE;
1565 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
1567 /* Check service state */
1568 vc_service_state_e service_state = -1;
1569 vc_mgr_client_get_service_state(&service_state);
1570 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);
1572 ret = vc_mgr_tidl_request_do_action(g_pid, type, send_event);
1574 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to do action request : %s", __vc_mgr_get_error_code(ret));
1577 SLOG(LOG_INFO, TAG_VCM, "[SUCCESS] do action");
1579 SLOG(LOG_DEBUG, TAG_VCM, "@@@ [Manager] do action DONE");
1581 return VC_ERROR_NONE;
1584 int vc_mgr_send_specific_engine_request(const char* engine_app_id, const char* event, const char* request)
1586 SLOG(LOG_INFO, TAG_VCM, "@@@ [Manager] send specific engine request");
1589 ret = __check_mgr_feature_privilege();
1590 if (VC_ERROR_NONE != ret)
1593 SLOG(LOG_INFO, TAG_VCM, "@@@ [Manager] specific engine request. engine app id(%s), event(%s), request(%s)", engine_app_id, event, request);
1595 if (NULL == engine_app_id || NULL == event) {
1596 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid parameter");
1597 return VC_ERROR_INVALID_PARAMETER;
1600 if (NULL == request) {
1601 SLOG(LOG_ERROR, TAG_VCM, "[INFO] Input parameter is NULL. (no request)");
1605 if (0 != vc_mgr_client_get_client_state(&state)) {
1606 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1607 return VC_ERROR_INVALID_STATE;
1611 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
1613 /* Check service state */
1614 vc_service_state_e service_state = -1;
1615 vc_mgr_client_get_service_state(&service_state);
1616 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);
1618 ret = vc_mgr_tidl_send_specific_engine_request(g_pid, engine_app_id, event, request);
1620 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to specific engine request : %s", __vc_mgr_get_error_code(ret));
1623 SLOG(LOG_INFO, TAG_VCM, "[SUCCESS] specific engine request");
1625 SLOG(LOG_DEBUG, TAG_VCM, "@@@ [Manager] send specific engine request DONE");
1627 return VC_ERROR_NONE;
1630 int vc_mgr_start(bool exclusive_command_option)
1632 SLOG(LOG_ERROR, TAG_VCM, "@@@ [Manager] Request start");
1635 ret = __check_mgr_feature_privilege();
1636 if (VC_ERROR_NONE != ret)
1640 if (0 != vc_mgr_client_get_client_state(&state)) {
1641 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1642 return VC_ERROR_INVALID_STATE;
1646 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
1648 /* Check service state */
1649 vc_service_state_e service_state = -1;
1650 vc_mgr_client_get_service_state(&service_state);
1651 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);
1653 /* Check internal state for async */
1654 vc_internal_state_e internal_state = -1;
1655 vc_mgr_client_get_internal_state(&internal_state);
1656 if (internal_state != VC_INTERNAL_STATE_NONE) {
1657 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State : Internal state is NOT none : %d", internal_state);
1658 return VC_ERROR_IN_PROGRESS_TO_RECORDING;
1661 vc_mgr_client_set_exclusive_command(exclusive_command_option);
1663 bool start_by_client = false;
1664 if (0 != vc_mgr_client_get_start_by_client(&start_by_client)) {
1665 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get start by client");
1668 int disabled_cmd_type = 0;
1669 if (0 != vc_mgr_client_get_disabled_command_type(&disabled_cmd_type)) {
1670 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get disabled command type");
1673 vc_recognition_mode_e recognition_mode = VC_RECOGNITION_MODE_STOP_BY_SILENCE;
1674 if (0 != vc_mgr_get_recognition_mode(&recognition_mode)) {
1675 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get recognition mode");
1680 vc_mgr_client_set_internal_state(VC_INTERNAL_STATE_STARTING);
1681 ret = vc_mgr_tidl_request_start(g_pid, (int)recognition_mode, exclusive_command_option, start_by_client, disabled_cmd_type);
1683 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to start request start : %s", __vc_mgr_get_error_code(ret));
1684 vc_mgr_client_set_internal_state(VC_INTERNAL_STATE_NONE);
1686 SLOG(LOG_INFO, TAG_VCM, "[SUCCESS] start recognition");
1689 vc_mgr_core_initialize_volume_variable();
1691 SLOG(LOG_ERROR, TAG_VCM, "@@@ [Manager] Request start DONE, ret(%d)", ret);
1696 int vc_mgr_stop(void)
1698 SLOG(LOG_ERROR, TAG_VCM, "@@@ [Manager] Request stop");
1701 ret = __check_mgr_feature_privilege();
1702 if (VC_ERROR_NONE != ret)
1706 if (0 != vc_mgr_client_get_client_state(&state)) {
1707 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1708 return VC_ERROR_INVALID_STATE;
1712 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
1714 /* Check service state */
1715 vc_service_state_e service_state = -1;
1716 vc_mgr_client_get_service_state(&service_state);
1717 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);
1719 /* Check internal state for async */
1720 vc_internal_state_e internal_state = -1;
1721 vc_mgr_client_get_internal_state(&internal_state);
1722 if (VC_INTERNAL_STATE_STOPPING == internal_state) {
1723 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State : Internal state is STOPPING");
1724 return VC_ERROR_IN_PROGRESS_TO_PROCESSING;
1725 } else if (VC_INTERNAL_STATE_CANCELING == internal_state) {
1726 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State : Internal state is CANCELING");
1727 return VC_ERROR_IN_PROGRESS_TO_READY;
1732 vc_mgr_client_set_internal_state(VC_INTERNAL_STATE_STOPPING);
1733 ret = vc_mgr_tidl_request_stop(g_pid);
1735 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to stop request : %s", __vc_mgr_get_error_code(ret));
1736 vc_mgr_client_set_internal_state(VC_INTERNAL_STATE_NONE);
1738 SLOG(LOG_INFO, TAG_VCM, "[SUCCESS] Stop recognition");
1741 SLOG(LOG_DEBUG, TAG_VCM, "@@@ [Manager] Request stop DONE");
1746 int vc_mgr_cancel(void)
1748 SLOG(LOG_INFO, TAG_VCM, "@@@ [Manager] Request cancel");
1751 ret = __check_mgr_feature_privilege();
1752 if (VC_ERROR_NONE != ret)
1756 if (0 != vc_mgr_client_get_client_state(&state)) {
1757 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1758 return VC_ERROR_INVALID_STATE;
1762 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
1764 /* Check service state */
1765 vc_service_state_e service_state = -1;
1766 vc_mgr_client_get_service_state(&service_state);
1767 RETVM_IF(service_state == VC_SERVICE_STATE_NONE, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state is NONE");
1769 vc_internal_state_e internal_state = -1;
1770 vc_mgr_client_get_internal_state(&internal_state);
1771 if (VC_INTERNAL_STATE_STARTING == internal_state) {
1772 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State : Internal state is STARTING");
1773 return VC_ERROR_IN_PROGRESS_TO_RECORDING;
1774 } else if (VC_INTERNAL_STATE_STOPPING == internal_state) {
1775 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State : Internal state is STOPPING");
1776 return VC_ERROR_IN_PROGRESS_TO_PROCESSING;
1777 } else if (VC_INTERNAL_STATE_CANCELING == internal_state) {
1778 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State : Internal state is CANCELING");
1779 return VC_ERROR_IN_PROGRESS_TO_READY;
1783 vc_mgr_client_set_internal_state(VC_INTERNAL_STATE_CANCELING);
1784 ret = vc_mgr_tidl_request_cancel(g_pid);
1786 SLOG(LOG_DEBUG, TAG_VCM, "[ERROR] Fail to cancel request : %s", __vc_mgr_get_error_code(ret));
1787 vc_mgr_client_set_internal_state(VC_INTERNAL_STATE_NONE);
1789 SLOG(LOG_INFO, TAG_VCM, "[SUCCESS] Cancel recognition");
1792 vc_mgr_client_set_exclusive_command(false);
1794 SLOG(LOG_DEBUG, TAG_VCM, "@@@ [Manager] Request cancel DONE");
1799 // TODO: check called by app direactly meaning
1800 int __vc_mgr_set_volume(float volume)
1802 // called by app directly
1803 vc_mgr_core_set_volume(volume);
1805 return VC_ERROR_NONE;
1808 int vc_mgr_get_recording_volume(float* volume)
1811 ret = __check_mgr_feature_privilege();
1812 if (VC_ERROR_NONE != ret)
1815 RETVM_IF(NULL == volume, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Invalid parameter");
1817 vc_service_state_e service_state = -1;
1818 if (0 != vc_mgr_client_get_service_state(&service_state)) {
1819 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1820 return VC_ERROR_INVALID_STATE;
1824 RETVM_IF(VC_SERVICE_STATE_RECORDING != service_state, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Service state is not 'RECORDING'");
1826 *volume = vc_mgr_core_get_volume();
1828 return VC_ERROR_NONE;
1831 int vc_mgr_set_selected_results(vc_cmd_list_h vc_cmd_list)
1833 SLOG(LOG_INFO, TAG_VCM, "@@@ [Manager] Select result");
1836 ret = __check_mgr_feature_privilege();
1837 if (VC_ERROR_NONE != ret)
1840 /* Do not check state for 'restart continuously' mode */
1842 vc_service_state_e service_state = -1;
1843 vc_mgr_client_get_service_state(&service_state);
1844 if (service_state != VC_SERVICE_STATE_PROCESSING) {
1845 vc_recognition_mode_e recognition_mode;
1846 vc_mgr_get_recognition_mode(&recognition_mode);
1848 if (VC_RECOGNITION_MODE_RESTART_CONTINUOUSLY != recognition_mode) {
1849 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: service state is not 'PROCESSING' and mode is not 'Restart continuously'");
1850 return VC_ERROR_INVALID_STATE;
1854 ret = vc_mgr_core_set_selected_results(vc_cmd_list, g_pid);
1859 int vc_mgr_set_all_result_cb(vc_mgr_all_result_cb callback, void* user_data)
1862 ret = __check_mgr_feature_privilege();
1863 if (VC_ERROR_NONE != ret)
1866 RETVM_IF(NULL == callback, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Invalid parameter");
1869 if (0 != vc_mgr_client_get_client_state(&state)) {
1870 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set result callback : A handle is not available");
1871 return VC_ERROR_INVALID_STATE;
1875 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
1877 vc_mgr_client_set_all_result_cb(callback, user_data);
1879 SLOG(LOG_INFO, TAG_VCM, "[SUCCESS] Set all result callback");
1881 return VC_ERROR_NONE;
1884 int vc_mgr_unset_all_result_cb(void)
1887 ret = __check_mgr_feature_privilege();
1888 if (VC_ERROR_NONE != ret)
1892 if (0 != vc_mgr_client_get_client_state(&state)) {
1893 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset result callback : A handle is not available");
1894 return VC_ERROR_INVALID_STATE;
1898 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
1900 vc_mgr_client_set_all_result_cb(NULL, NULL);
1902 return VC_ERROR_NONE;
1905 int vc_mgr_set_result_cb(vc_result_cb callback, void* user_data)
1908 ret = __check_mgr_feature_privilege();
1909 if (VC_ERROR_NONE != ret)
1912 RETVM_IF(NULL == callback, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Invalid parameter");
1915 if (0 != vc_mgr_client_get_client_state(&state)) {
1916 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set result callback : A handle is not available");
1917 return VC_ERROR_INVALID_STATE;
1921 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
1923 vc_mgr_client_set_result_cb(callback, user_data);
1925 return VC_ERROR_NONE;
1928 int vc_mgr_unset_result_cb(void)
1931 ret = __check_mgr_feature_privilege();
1932 if (VC_ERROR_NONE != ret)
1936 if (0 != vc_mgr_client_get_client_state(&state)) {
1937 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset result callback : A handle is not available");
1938 return VC_ERROR_INVALID_STATE;
1942 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
1944 vc_mgr_client_set_result_cb(NULL, NULL);
1946 return VC_ERROR_NONE;
1949 int vc_mgr_set_pre_result_cb(vc_mgr_pre_result_cb callback, void* user_data)
1952 ret = __check_mgr_feature_privilege();
1953 if (VC_ERROR_NONE != ret)
1956 RETVM_IF(NULL == callback, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Invalid parameter");
1959 if (0 != vc_mgr_client_get_client_state(&state)) {
1960 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set pre result callback : A handle is not available");
1961 return VC_ERROR_INVALID_STATE;
1965 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
1967 vc_mgr_client_set_pre_result_cb(callback, user_data);
1969 return VC_ERROR_NONE;
1972 int vc_mgr_unset_pre_result_cb(void)
1975 ret = __check_mgr_feature_privilege();
1976 if (VC_ERROR_NONE != ret)
1980 if (0 != vc_mgr_client_get_client_state(&state)) {
1981 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset pre result callback : A handle is not available");
1982 return VC_ERROR_INVALID_STATE;
1986 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
1988 vc_mgr_client_set_pre_result_cb(NULL, NULL);
1990 return VC_ERROR_NONE;
1993 int vc_mgr_get_error_message(char** err_msg)
1995 SLOG(LOG_DEBUG, TAG_VCM, "@@@ [Manager] Get error message");
1998 ret = __check_mgr_feature_privilege();
1999 if (VC_ERROR_NONE != ret)
2004 if (0 != vc_mgr_client_get_client_state(&state)) {
2005 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] vc_mgr handle is not available");
2006 return VC_ERROR_INVALID_STATE;
2009 RETVM_IF(NULL == err_msg, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Invalid parameter");
2011 ret = vc_mgr_core_get_error_message(err_msg);
2013 SLOG(LOG_DEBUG, TAG_VCM, "@@@ [Manager] Get error message DONE");
2018 static Eina_Bool __vc_mgr_notify_state_changed(void *data)
2020 vc_state_changed_cb changed_callback = NULL;
2023 vc_mgr_client_get_state_changed_cb(&changed_callback, &user_data);
2025 vc_state_e current_state;
2026 vc_state_e previous_state;
2028 vc_mgr_client_get_previous_state(¤t_state, &previous_state);
2030 if (NULL != changed_callback) {
2031 vc_mgr_client_use_callback();
2032 changed_callback(previous_state, current_state, user_data);
2033 vc_mgr_client_not_use_callback();
2034 SLOG(LOG_INFO, TAG_VCM, "State changed callback is called");
2036 SLOG(LOG_WARN, TAG_VCM, "[WARNING] State changed callback is null");
2042 int vc_mgr_set_state_changed_cb(vc_state_changed_cb callback, void* user_data)
2045 ret = __check_mgr_feature_privilege();
2046 if (VC_ERROR_NONE != ret)
2049 if (callback == NULL)
2050 return VC_ERROR_INVALID_PARAMETER;
2053 if (0 != vc_mgr_client_get_client_state(&state)) {
2054 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set state changed callback : A handle is not available");
2055 return VC_ERROR_INVALID_STATE;
2059 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
2061 vc_mgr_client_set_state_changed_cb(callback, user_data);
2063 SLOG(LOG_INFO, TAG_VCM, "[SUCCESS] Set state changed callback");
2064 return VC_ERROR_NONE;
2067 int vc_mgr_unset_state_changed_cb(void)
2070 ret = __check_mgr_feature_privilege();
2071 if (VC_ERROR_NONE != ret)
2075 if (0 != vc_mgr_client_get_client_state(&state)) {
2076 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset state changed callback : A handle is not available");
2077 return VC_ERROR_INVALID_STATE;
2081 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
2083 vc_mgr_client_set_state_changed_cb(NULL, NULL);
2085 return VC_ERROR_NONE;
2088 int vc_mgr_set_service_state_changed_cb(vc_service_state_changed_cb callback, void* user_data)
2091 ret = __check_mgr_feature_privilege();
2092 if (VC_ERROR_NONE != ret)
2095 if (callback == NULL)
2096 return VC_ERROR_INVALID_PARAMETER;
2099 if (0 != vc_mgr_client_get_client_state(&state)) {
2100 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set state changed callback : A handle is not available");
2101 return VC_ERROR_INVALID_STATE;
2105 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
2107 vc_mgr_client_set_service_state_changed_cb(callback, user_data);
2109 SLOG(LOG_INFO, TAG_VCM, "[SUCCESS] Set service state changed callback");
2110 return VC_ERROR_NONE;
2113 int vc_mgr_unset_service_state_changed_cb(void)
2116 ret = __check_mgr_feature_privilege();
2117 if (VC_ERROR_NONE != ret)
2121 if (0 != vc_mgr_client_get_client_state(&state)) {
2122 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset state changed callback : A handle is not available");
2123 return VC_ERROR_INVALID_STATE;
2127 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
2129 vc_mgr_client_set_service_state_changed_cb(NULL, NULL);
2130 return VC_ERROR_NONE;
2133 int vc_mgr_set_speech_detected_cb(vc_mgr_begin_speech_detected_cb callback, void* user_data)
2136 ret = __check_mgr_feature_privilege();
2137 if (VC_ERROR_NONE != ret)
2140 if (callback == NULL)
2141 return VC_ERROR_INVALID_PARAMETER;
2144 if (0 != vc_mgr_client_get_client_state(&state)) {
2145 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set state changed callback : A handle is not available");
2146 return VC_ERROR_INVALID_STATE;
2150 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
2152 vc_mgr_client_set_speech_detected_cb(callback, user_data);
2154 SLOG(LOG_INFO, TAG_VCM, "[SUCCESS] Set speech detected callback");
2155 return VC_ERROR_NONE;
2158 int vc_mgr_unset_speech_detected_cb(void)
2161 ret = __check_mgr_feature_privilege();
2162 if (VC_ERROR_NONE != ret)
2166 if (0 != vc_mgr_client_get_client_state(&state)) {
2167 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset state changed callback : A handle is not available");
2168 return VC_ERROR_INVALID_STATE;
2172 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
2174 vc_mgr_client_set_speech_detected_cb(NULL, NULL);
2175 return VC_ERROR_NONE;
2178 int vc_mgr_set_current_language_changed_cb(vc_current_language_changed_cb callback, void* user_data)
2181 ret = __check_mgr_feature_privilege();
2182 if (VC_ERROR_NONE != ret)
2185 RETVM_IF(NULL == callback, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Invalid parameter");
2188 if (0 != vc_mgr_client_get_client_state(&state)) {
2189 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set current language changed : A handle is not available");
2190 return VC_ERROR_INVALID_STATE;
2194 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
2196 vc_mgr_client_set_current_lang_changed_cb(callback, user_data);
2198 SLOG(LOG_INFO, TAG_VCM, "[SUCCESS] Set current language changed callback");
2199 return VC_ERROR_NONE;
2202 int vc_mgr_unset_current_language_changed_cb(void)
2205 ret = __check_mgr_feature_privilege();
2206 if (VC_ERROR_NONE != ret)
2210 if (0 != vc_mgr_client_get_client_state(&state)) {
2211 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset current language changed : A handle is not available");
2212 return VC_ERROR_INVALID_STATE;
2216 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
2218 vc_mgr_client_set_current_lang_changed_cb(NULL, NULL);
2220 return VC_ERROR_NONE;
2223 int vc_mgr_set_error_cb(vc_error_cb callback, void* user_data)
2226 ret = __check_mgr_feature_privilege();
2227 if (VC_ERROR_NONE != ret)
2230 RETVM_IF(NULL == callback, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Invalid parameter");
2233 if (0 != vc_mgr_client_get_client_state(&state)) {
2234 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set error callback : A handle is not available");
2235 return VC_ERROR_INVALID_STATE;
2239 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
2241 vc_mgr_client_set_error_cb(callback, user_data);
2243 return VC_ERROR_NONE;
2246 int vc_mgr_unset_error_cb(void)
2249 ret = __check_mgr_feature_privilege();
2250 if (VC_ERROR_NONE != ret)
2254 if (0 != vc_mgr_client_get_client_state(&state)) {
2255 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset error callback : A handle is not available");
2256 return VC_ERROR_INVALID_STATE;
2260 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
2262 vc_mgr_client_set_error_cb(NULL, NULL);
2264 return VC_ERROR_NONE;
2267 int vc_mgr_set_dialog_request_cb(vc_mgr_dialog_request_cb callback, void* user_data)
2270 ret = __check_mgr_feature_privilege();
2271 if (VC_ERROR_NONE != ret)
2274 RETVM_IF(NULL == callback, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Invalid parameter");
2277 if (0 != vc_mgr_client_get_client_state(&state)) {
2278 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set error callback : A handle is not available");
2279 return VC_ERROR_INVALID_STATE;
2283 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
2285 vc_mgr_client_set_dialog_request_cb(callback, user_data);
2287 return VC_ERROR_NONE;
2290 int vc_mgr_unset_dialog_request_cb(void)
2293 ret = __check_mgr_feature_privilege();
2294 if (VC_ERROR_NONE != ret)
2298 if (0 != vc_mgr_client_get_client_state(&state)) {
2299 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset error callback : A handle is not available");
2300 return VC_ERROR_INVALID_STATE;
2304 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
2306 vc_mgr_client_set_dialog_request_cb(NULL, NULL);
2308 return VC_ERROR_NONE;
2311 int vc_mgr_set_private_data_set_cb(vc_mgr_private_data_set_cb callback, void* user_data)
2314 ret = __check_mgr_feature_privilege();
2315 if (VC_ERROR_NONE != ret)
2318 RETVM_IF(NULL == callback, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Invalid parameter");
2321 if (0 != vc_mgr_client_get_client_state(&state)) {
2322 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set private data set callback : A handle is not available");
2323 return VC_ERROR_INVALID_STATE;
2327 RETVM_IF(VC_STATE_INITIALIZED != state, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Set private data set callback : Current state is not 'Initialized'");
2329 vc_mgr_client_set_private_data_set_cb(callback, user_data);
2331 return VC_ERROR_NONE;
2334 int vc_mgr_unset_private_data_set_cb(void)
2337 ret = __check_mgr_feature_privilege();
2338 if (VC_ERROR_NONE != ret)
2342 if (0 != vc_mgr_client_get_client_state(&state)) {
2343 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset private data set callback : A handle is not available");
2344 return VC_ERROR_INVALID_STATE;
2348 RETVM_IF(VC_STATE_INITIALIZED != state, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Unset private data set callback : Current state is not 'Initialized'");
2350 vc_mgr_client_set_private_data_set_cb(NULL, NULL);
2352 return VC_ERROR_NONE;
2355 int vc_mgr_set_private_data_requested_cb(vc_mgr_private_data_requested_cb callback, void* user_data)
2358 ret = __check_mgr_feature_privilege();
2359 if (VC_ERROR_NONE != ret)
2362 RETVM_IF(NULL == callback, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Invalid parameter");
2365 if (0 != vc_mgr_client_get_client_state(&state)) {
2366 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set private data requested callback : A handle is not available");
2367 return VC_ERROR_INVALID_STATE;
2371 RETVM_IF(VC_STATE_INITIALIZED != state, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Set private data requested callback : Current state is not 'Initialized'");
2373 vc_mgr_client_set_private_data_requested_cb(callback, user_data);
2375 return VC_ERROR_NONE;
2378 int vc_mgr_unset_private_data_requested_cb(void)
2381 ret = __check_mgr_feature_privilege();
2382 if (VC_ERROR_NONE != ret)
2386 if (0 != vc_mgr_client_get_client_state(&state)) {
2387 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset private data requested callback : A handle is not available");
2388 return VC_ERROR_INVALID_STATE;
2392 RETVM_IF(VC_STATE_INITIALIZED != state, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Unset private data requested callback : Current state is not 'Initialized'");
2394 vc_mgr_client_set_private_data_requested_cb(NULL, NULL);
2396 return VC_ERROR_NONE;
2399 int vc_mgr_set_specific_engine_result_cb(vc_mgr_specific_engine_result_cb callback, void* user_data)
2402 ret = __check_mgr_feature_privilege();
2403 if (VC_ERROR_NONE != ret)
2406 RETVM_IF(NULL == callback, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Invalid parameter");
2409 if (0 != vc_mgr_client_get_client_state(&state)) {
2410 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set specific engine result callback : A handle is not available");
2411 return VC_ERROR_INVALID_STATE;
2415 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
2417 vc_mgr_client_set_specific_engine_result_cb(callback, user_data);
2419 return VC_ERROR_NONE;
2421 int vc_mgr_unset_specific_engine_result_cb(void)
2423 if (0 != __vc_mgr_get_feature_enabled()) {
2424 return VC_ERROR_NOT_SUPPORTED;
2428 if (0 != vc_mgr_client_get_client_state(&state)) {
2429 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset specific engine result callback : A handle is not available");
2430 return VC_ERROR_INVALID_STATE;
2434 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
2436 vc_mgr_client_set_specific_engine_result_cb(NULL, NULL);
2438 return VC_ERROR_NONE;
2441 /* for TTS feedback */
2442 int vc_mgr_set_feedback_audio_format_cb(vc_mgr_feedback_audio_format_cb callback, void* user_data)
2444 SLOG(LOG_INFO, TAG_VCM, "@@@ [Manager] set feedback audio format");
2447 ret = __check_mgr_feature_privilege();
2448 if (VC_ERROR_NONE != ret)
2451 RETVM_IF(NULL == callback, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Invalid parameter");
2454 if (0 != vc_mgr_client_get_client_state(&state)) {
2455 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set feedback audio format callback : A handle is not available");
2456 return VC_ERROR_INVALID_STATE;
2460 RETVM_IF(VC_STATE_INITIALIZED != state, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Set feedback audio format callback : Current state is not 'Initialized'");
2462 vc_mgr_client_set_feedback_audio_format_cb(callback, user_data);
2464 SLOG(LOG_INFO, TAG_VCM, "[SUCCESS] Set feedback audio format callback");
2466 return VC_ERROR_NONE;
2469 int vc_mgr_unset_feedback_audio_format_cb()
2471 SLOG(LOG_INFO, TAG_VCM, "@@@ [Manager] unset feedback audio format");
2474 ret = __check_mgr_feature_privilege();
2475 if (VC_ERROR_NONE != ret)
2479 if (0 != vc_mgr_client_get_client_state(&state)) {
2480 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset feedback audio format callback : A handle is not available");
2481 return VC_ERROR_INVALID_STATE;
2485 RETVM_IF(VC_STATE_INITIALIZED != state, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Unset feedback audio format callback : Current state is not 'Initialized'");
2487 vc_mgr_client_set_feedback_audio_format_cb(NULL, NULL);
2489 SLOG(LOG_INFO, TAG_VCM, "[SUCCESS] Unset feedback audio format callback");
2491 return VC_ERROR_NONE;
2494 int vc_mgr_set_feedback_streaming_cb(vc_mgr_feedback_streaming_cb callback, void* user_data)
2496 SLOG(LOG_INFO, TAG_VCM, "@@@ [Manager] set feedback streaming");
2499 ret = __check_mgr_feature_privilege();
2500 if (VC_ERROR_NONE != ret)
2503 RETVM_IF(NULL == callback, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Invalid parameter");
2505 pthread_mutex_lock(&g_feedback_streaming_cb_mutex);
2508 if (0 != vc_mgr_client_get_client_state(&state)) {
2509 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set feedback streaming callback : A handle is not available");
2510 pthread_mutex_unlock(&g_feedback_streaming_cb_mutex);
2511 return VC_ERROR_INVALID_STATE;
2515 if (VC_STATE_INITIALIZED != state) {
2516 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set feedback streaming callback : Current state is not 'Initialized' (%d)", state);
2517 pthread_mutex_unlock(&g_feedback_streaming_cb_mutex);
2518 return VC_ERROR_INVALID_STATE;
2521 vc_mgr_client_set_feedback_streaming_cb(callback, user_data);
2523 pthread_mutex_unlock(&g_feedback_streaming_cb_mutex);
2525 SLOG(LOG_INFO, TAG_VCM, "[SUCCESS] Set feedback streaming callback");
2527 return VC_ERROR_NONE;
2530 int vc_mgr_unset_feedback_streaming_cb()
2532 SLOG(LOG_INFO, TAG_VCM, "@@@ [Manager] unset feedback streaming");
2535 ret = __check_mgr_feature_privilege();
2536 if (VC_ERROR_NONE != ret)
2539 pthread_mutex_lock(&g_feedback_streaming_cb_mutex);
2542 if (0 != vc_mgr_client_get_client_state(&state)) {
2543 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset feedback streaming callback : A handle is not available");
2544 pthread_mutex_unlock(&g_feedback_streaming_cb_mutex);
2545 return VC_ERROR_INVALID_STATE;
2549 if (VC_STATE_INITIALIZED != state) {
2550 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset feedback streaming callback : Current state is not 'Initialized' (%d)", state);
2551 pthread_mutex_unlock(&g_feedback_streaming_cb_mutex);
2552 return VC_ERROR_INVALID_STATE;
2555 vc_mgr_client_set_feedback_streaming_cb(NULL, NULL);
2557 pthread_mutex_unlock(&g_feedback_streaming_cb_mutex);
2559 SLOG(LOG_INFO, TAG_VCM, "[SUCCESS] Unset feedback streaming callback");
2561 return VC_ERROR_NONE;
2564 int vc_mgr_set_vc_tts_streaming_cb(vc_mgr_vc_tts_streaming_cb callback, void* user_data)
2566 SLOG(LOG_INFO, TAG_VCM, "@@@ [Manager] set vc tts streaming callback");
2569 ret = __check_mgr_feature_privilege();
2570 if (VC_ERROR_NONE != ret)
2573 RETVM_IF(NULL == callback, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Invalid parameter");
2575 pthread_mutex_lock(&g_vc_tts_streaming_cb_mutex);
2578 if (0 != vc_mgr_client_get_client_state(&state)) {
2579 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set feedback streaming callback : A handle is not available");
2580 pthread_mutex_unlock(&g_vc_tts_streaming_cb_mutex);
2581 return VC_ERROR_INVALID_STATE;
2585 if (VC_STATE_INITIALIZED != state) {
2586 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set feedback streaming callback : Current state is not 'Initialized' (%d)", state);
2587 pthread_mutex_unlock(&g_vc_tts_streaming_cb_mutex);
2588 return VC_ERROR_INVALID_STATE;
2591 vc_mgr_client_set_vc_tts_streaming_cb(callback, user_data);
2593 pthread_mutex_unlock(&g_vc_tts_streaming_cb_mutex);
2595 SLOG(LOG_INFO, TAG_VCM, "[SUCCESS] Set feedback streaming callback");
2597 return VC_ERROR_NONE;
2600 int vc_mgr_unset_vc_tts_streaming_cb()
2602 SLOG(LOG_INFO, TAG_VCM, "@@@ [Manager] unset vc tts streaming callback");
2605 ret = __check_mgr_feature_privilege();
2606 if (VC_ERROR_NONE != ret)
2609 pthread_mutex_lock(&g_vc_tts_streaming_cb_mutex);
2612 if (0 != vc_mgr_client_get_client_state(&state)) {
2613 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset feedback streaming callback : A handle is not available");
2614 pthread_mutex_unlock(&g_vc_tts_streaming_cb_mutex);
2615 return VC_ERROR_INVALID_STATE;
2619 if (VC_STATE_INITIALIZED != state) {
2620 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset feedback streaming callback : Current state is not 'Initialized' (%d)", state);
2621 pthread_mutex_unlock(&g_vc_tts_streaming_cb_mutex);
2622 return VC_ERROR_INVALID_STATE;
2625 vc_mgr_client_set_vc_tts_streaming_cb(NULL, NULL);
2627 pthread_mutex_unlock(&g_vc_tts_streaming_cb_mutex);
2629 SLOG(LOG_INFO, TAG_VCM, "[SUCCESS] Unset feedback streaming callback");
2631 return VC_ERROR_NONE;
2635 static void __tts_feedback_thread(void* data, Ecore_Thread* thread)
2637 SLOG(LOG_INFO, TAG_VCM, "[SUCCESS] Start thread");
2639 vc_feedback_data_s* feedback_data = NULL;
2645 /* get feedback data */
2646 ret = vc_mgr_data_get_feedback_data(&feedback_data);
2647 if (0 != ret || NULL == feedback_data) {
2649 SLOG(LOG_INFO, TAG_VCM, "[DEBUG] No feedback data. Waiting mode");
2653 if (ecore_thread_check(thread) == EINA_TRUE) {
2654 SLOG(LOG_INFO, TAG_VCM, "[INFO] Stop feedback is called");
2660 if (0 < vc_mgr_data_get_feedback_data_size()) {
2661 SLOG(LOG_INFO, TAG_VCM, "[INFO] Resume thread");
2665 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Wrong request, there's no pcm data");
2666 vc_mgr_data_clear_feedback_data(&feedback_data);
2671 SLOG(LOG_INFO, TAG_VCM, "[INFO] Finish to wait for new feedback data come");
2673 /* resume feedback thread */
2674 vc_mgr_data_clear_feedback_data(&feedback_data);
2678 if (NULL != feedback_data) {
2679 if (getpid() == feedback_data->pid) {
2680 vc_mgr_feedback_streaming_cb callback = NULL;
2681 void* user_data = NULL;
2683 pthread_mutex_lock(&g_feedback_streaming_cb_mutex);
2685 vc_mgr_client_get_feedback_streaming_cb(&callback, &user_data);
2686 if (NULL == callback) {
2687 SLOG(LOG_WARN, TAG_VCM, "[WARNING] TTS feedback streaming callback is null");
2688 vc_mgr_data_clear_feedback_data(&feedback_data);
2689 pthread_mutex_unlock(&g_feedback_streaming_cb_mutex);
2693 SLOG(LOG_DEBUG, TAG_VCM, "TTS feedback streaming callback is called");
2694 vc_mgr_client_use_callback();
2695 callback(feedback_data->event, feedback_data->data, feedback_data->data_size, user_data);
2696 vc_mgr_client_not_use_callback();
2698 pthread_mutex_unlock(&g_feedback_streaming_cb_mutex);
2700 vc_mgr_vc_tts_streaming_cb callback = NULL;
2701 void* user_data = NULL;
2703 pthread_mutex_lock(&g_vc_tts_streaming_cb_mutex);
2705 vc_mgr_client_get_vc_tts_streaming_cb(&callback, &user_data);
2706 if (NULL == callback) {
2707 SLOG(LOG_WARN, TAG_VCM, "[WARNING] vc tts streaming callback is null");
2708 vc_mgr_data_clear_feedback_data(&feedback_data);
2709 pthread_mutex_unlock(&g_vc_tts_streaming_cb_mutex);
2713 SLOG(LOG_DEBUG, TAG_VCM, "vc tts feedback streaming callback is called");
2714 vc_mgr_client_use_callback();
2715 callback(feedback_data->pid, feedback_data->utt_id, feedback_data->event, feedback_data->data, feedback_data->data_size, user_data);
2716 vc_mgr_client_not_use_callback();
2718 pthread_mutex_unlock(&g_vc_tts_streaming_cb_mutex);
2720 free(feedback_data);
2721 feedback_data = NULL;
2726 static void __end_tts_feedback_thread(void* data, Ecore_Thread* thread)
2728 SLOG(LOG_INFO, TAG_VCM, "[SUCCESS] End thread");
2729 g_feedback_thread = NULL;
2732 static void __cancel_tts_feedback_thread(void* data, Ecore_Thread* thread)
2734 SLOG(LOG_INFO, TAG_VCM, "[SUCCESS] Cancel thread");
2735 g_feedback_thread = NULL;
2739 int vc_mgr_start_feedback(void)
2741 SLOG(LOG_INFO, TAG_VCM, "@@@ [Manager] start feedback");
2744 ret = __check_mgr_feature_privilege();
2745 if (VC_ERROR_NONE != ret)
2748 SLOG(LOG_INFO, TAG_VCM, "@@@ [Manager] Request start TTS feedback");
2751 if (0 != vc_mgr_client_get_client_state(&state)) {
2752 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Start feedback : A handle is not available");
2753 return VC_ERROR_INVALID_STATE;
2757 RETVM_IF(VC_STATE_READY != state, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Start feedback : Current state is not 'Ready' (%d)", state);
2759 bool is_exist = ecore_thread_check(g_feedback_thread);
2760 if (NULL == g_feedback_thread || TRUE == is_exist) {
2761 SLOG(LOG_INFO, TAG_VCM, "[INFO] ecore thread run : __tts_feedback_thread");
2762 g_feedback_thread = ecore_thread_run(__tts_feedback_thread, __end_tts_feedback_thread, __cancel_tts_feedback_thread, NULL);
2765 return VC_ERROR_NONE;
2768 int vc_mgr_stop_feedback(void)
2770 SLOG(LOG_INFO, TAG_VCM, "@@@ [Manager] stop feedback");
2773 ret = __check_mgr_feature_privilege();
2774 if (VC_ERROR_NONE != ret)
2777 SLOG(LOG_INFO, TAG_VCM, "@@@ [Manager] Request stop TTS feedback");
2780 if (0 != vc_mgr_client_get_client_state(&state)) {
2781 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Stop feedback : A handle is not available");
2782 return VC_ERROR_INVALID_STATE;
2786 RETVM_IF(VC_STATE_READY != state, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Stop feedback : Current state is not 'Ready' (%d)", state);
2788 if (g_feedback_thread) {
2789 ecore_thread_cancel(g_feedback_thread);
2790 g_feedback_thread = NULL;
2795 vc_feedback_data_s* feedback_data = NULL;
2797 /* get feedback data */
2798 ret = vc_mgr_data_get_feedback_data(&feedback_data);
2799 if (0 != ret || NULL == feedback_data) {
2801 SLOG(LOG_INFO, TAG_VCM, "[INFO] No feedback data to stop any more");
2802 return VC_ERROR_NONE;
2804 ret = vc_mgr_data_clear_feedback_data(&feedback_data);
2806 SLOG(LOG_INFO, TAG_VCM, "[ERROR] Fail to clear data, ret(%d)", ret);
2814 int vc_mgr_send_utterance_status(int pid, int utt_id, vc_tts_utterance_status_e utt_status)
2816 SLOG(LOG_INFO, TAG_VCM, "@@@ [Manager] send utterance status, pid(%d), utt_id(%d), utt_status(%d)", pid, utt_id, utt_status);
2819 ret = __check_mgr_feature_privilege();
2820 if (VC_ERROR_NONE != ret)
2823 if (VC_TTS_UTTERANCE_NONE > utt_status || VC_TTS_UTTERANCE_CANCELED < utt_status || 0 == utt_status) {
2824 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] utt_status is not valid. (%d)", utt_status);
2825 return VC_ERROR_INVALID_PARAMETER;
2829 if (0 != vc_mgr_client_get_client_state(&state)) {
2830 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
2831 return VC_ERROR_INVALID_STATE;
2835 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Ready'", state);
2837 /* Check service state */
2838 vc_service_state_e service_state = -1;
2839 vc_mgr_client_get_service_state(&service_state);
2840 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);
2842 ret = vc_mgr_tidl_send_utterance_status(pid, utt_id, utt_status);
2844 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to send utterance status : %s", __vc_mgr_get_error_code(ret));
2846 SLOG(LOG_INFO, TAG_VCM, "[SUCCESS] Send utterance status");
2848 SLOG(LOG_DEBUG, TAG_VCM, "@@@ [Manager] send utterance status DONE");
2852 static float __get_volume_decibel(char* data, int size)
2854 #define MAX_AMPLITUDE_MEAN_16 32768
2861 unsigned long long square_sum = 0;
2866 for (i = 0; i < size; i += (depthByte<<1)) {
2868 memcpy(&pcm16, data + i, sizeof(short));
2869 square_sum += pcm16 * pcm16;
2873 if (0 == count || 0 == square_sum) {
2874 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] No data");
2877 rms = sqrt((float)square_sum/count);
2880 db = 20 * log10(rms/MAX_AMPLITUDE_MEAN_16);
2884 int vc_mgr_send_audio_streaming(vc_audio_streaming_event_e event, unsigned char* buffer, unsigned int len)
2886 SLOG(LOG_INFO, TAG_VCM, "[Manager] Send audio streaming to the engine service, event(%d)", event);
2889 ret = __check_mgr_feature_privilege();
2890 if (VC_ERROR_NONE != ret)
2893 if (VC_AUDIO_STREAMING_EVENT_FAIL > event || VC_AUDIO_STREAMING_EVENT_FINISH < event || 0 == event) {
2894 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] event is invalid parameter (%d)", event);
2895 return VC_ERROR_INVALID_PARAMETER;
2898 RETVM_IF(NULL == buffer, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Invalid parameter");
2900 vc_state_e state = VC_STATE_NONE;
2901 ret = vc_mgr_client_get_client_state(&state);
2903 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
2904 return VC_ERROR_INVALID_STATE;
2907 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Ready'", state);
2909 vc_service_state_e service_state = VC_SERVICE_STATE_NONE;
2910 ret = vc_mgr_client_get_service_state(&service_state);
2912 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
2913 return VC_ERROR_INVALID_STATE;
2916 if (VC_SERVICE_STATE_READY != service_state && VC_SERVICE_STATE_RECORDING != service_state) {
2917 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: service state is not 'READY' and 'RECORDING', state(%d)", service_state);
2918 return VC_ERROR_INVALID_STATE;
2921 float volume = __get_volume_decibel((char*)buffer, len);
2922 // TODO: check __vc_mgr_set_volume need to move
2923 __vc_mgr_set_volume(volume);
2925 ret = vc_mgr_tidl_send_audio_streaming(g_pid, event, buffer, len);
2927 SLOG(LOG_WARN, TAG_VCM, "[WARNING] retry to send audio streaming data");
2929 SLOG(LOG_INFO, TAG_VCM, "[DEBUG] Success to send");
2933 int vc_mgr_set_audio_streaming_mode(vc_audio_streaming_mode_e mode)
2935 SLOG(LOG_INFO, TAG_VCM, "[Manager] Set multi assistant mode, mode(%d)", mode);
2938 ret = __check_mgr_feature_privilege();
2939 if (VC_ERROR_NONE != ret)
2942 if (VC_AUDIO_STREAMING_MODE_VC_SERVICE > mode || VC_AUDIO_STREAMING_MODE_OUTSIDE < mode) {
2943 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] mode is invalid parameter (%d)", mode);
2944 return VC_ERROR_INVALID_PARAMETER;
2947 vc_state_e state = VC_STATE_NONE;
2948 ret = vc_mgr_client_get_client_state(&state);
2950 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
2951 return VC_ERROR_INVALID_STATE;
2954 vc_service_state_e service_state = VC_SERVICE_STATE_NONE;
2955 ret = vc_mgr_client_get_service_state(&service_state);
2957 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
2958 return VC_ERROR_INVALID_STATE;
2961 if (VC_STATE_INITIALIZED == state && VC_SERVICE_STATE_NONE == service_state) {
2962 ret = vc_mgr_client_set_audio_streaming_mode(mode);
2963 if (VC_ERROR_NONE != ret) {
2964 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to set multi assistant mode : %s", __vc_mgr_get_error_code(ret));
2965 return VC_ERROR_INVALID_STATE;
2967 SLOG(LOG_DEBUG, TAG_VCM, "[SUCCESS] Set audio streaming mode in vc mgr client");
2969 } else if (VC_STATE_READY == state && VC_SERVICE_STATE_READY == service_state) {
2970 ret = vc_mgr_client_set_audio_streaming_mode(mode);
2971 if (VC_ERROR_NONE != ret) {
2972 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to set multi assistant mode : %s", __vc_mgr_get_error_code(ret));
2973 return VC_ERROR_INVALID_STATE;
2975 SLOG(LOG_DEBUG, TAG_VCM, "[SUCCESS] Set audio streaming mode in vc mgr client");
2978 ret = vc_mgr_tidl_request_set_audio_streaming_mode(g_pid, mode);
2979 if (VC_ERROR_NONE != ret) {
2980 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to set audio streaming mode : %s", __vc_mgr_get_error_code(ret));
2981 return VC_ERROR_OPERATION_FAILED;
2983 SLOG(LOG_DEBUG, TAG_VCM, "[SUCCESS] Set audio streaming mode in vc mgr tidl");
2986 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: Current state is not 'INITIALIZED', state(%d)", state);
2987 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: Current service state is not 'READY', service_state(%d)", service_state);
2988 return VC_ERROR_INVALID_STATE;
2991 return VC_ERROR_NONE;
2995 //TODO it's internal api, so will remove it.
2996 int vc_mgr_change_system_volume(vc_system_volume_event_e event)
2998 return vc_mgr_change_background_volume(event);
3001 //TODO it's internal api, so will remove it.
3002 int vc_mgr_recover_system_volume(void)
3004 return vc_mgr_reset_background_volume();
3008 int vc_mgr_change_background_volume(vc_background_volume_event_e event)
3010 SLOG(LOG_INFO, TAG_VCM, "[Manager] Change background volume. event(%d)", event);
3013 ret = __check_mgr_feature_privilege();
3014 if (VC_ERROR_NONE != ret)
3017 if (VC_BACKGROUND_VOLUME_EVENT_CHANGE_FOR_NEARFIELD > event || VC_BACKGROUND_VOLUME_EVENT_CHANGE_FOR_FARFIELD < event) {
3018 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] event is invalid parameter (%d)", event);
3019 return VC_ERROR_INVALID_PARAMETER;
3022 vc_state_e state = VC_STATE_NONE;
3023 ret = vc_mgr_client_get_client_state(&state);
3024 if (VC_ERROR_NONE != ret) {
3025 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
3026 return VC_ERROR_INVALID_STATE;
3030 if (VC_BACKGROUND_VOLUME_EVENT_CHANGE_FOR_FARFIELD == event)
3031 ratio = VC_MGR_DEFAULT_FARFIELD_DUCKING_RATIO;
3032 else if (VC_BACKGROUND_VOLUME_EVENT_CHANGE_FOR_NEARFIELD == event)
3033 ratio = VC_MGR_DEFAULT_NEARFIELD_DUCKING_RATIO;
3035 ret = vc_mgr_ducking_activate(ratio);
3036 if (VC_ERROR_NONE != ret)
3037 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to change volume");
3039 SLOG(LOG_INFO, TAG_VCM, "[DEBUG] Success to change volume");
3043 int vc_mgr_change_background_volume_by_ratio(double ratio)
3045 SLOG(LOG_INFO, TAG_VCM, "[Manager] Change background volume. ratio(%f)", ratio);
3048 ret = __check_mgr_feature_privilege();
3049 if (VC_ERROR_NONE != ret)
3052 if (VC_MGR_MINIMUM_DUCKING_RATIO > ratio || VC_MGR_MAXIMUM_DUCKING_RATIO < ratio) {
3053 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] ratio is invalid parameter (%lf)", ratio);
3054 return VC_ERROR_INVALID_PARAMETER;
3057 vc_state_e state = VC_STATE_NONE;
3058 ret = vc_mgr_client_get_client_state(&state);
3059 if (VC_ERROR_NONE != ret) {
3060 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
3061 return VC_ERROR_INVALID_STATE;
3064 ret = vc_mgr_ducking_activate(ratio);
3065 if (VC_ERROR_NONE != ret)
3066 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to set ratio");
3068 SLOG(LOG_INFO, TAG_VCM, "[DEBUG] Success to set ratio");
3073 int vc_mgr_reset_background_volume(void)
3075 SLOG(LOG_INFO, TAG_VCM, "[Manager] Recover background volume");
3078 ret = __check_mgr_feature_privilege();
3079 if (VC_ERROR_NONE != ret)
3082 vc_state_e state = VC_STATE_NONE;
3083 ret = vc_mgr_client_get_client_state(&state);
3084 if (VC_ERROR_NONE != ret) {
3085 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
3086 return VC_ERROR_INVALID_STATE;
3089 ret = vc_mgr_ducking_deactivate();
3090 if (VC_ERROR_NONE != ret)
3091 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to recover volume");
3093 SLOG(LOG_INFO, TAG_VCM, "[DEBUG] Success to recover volume");