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_client.h"
32 #include "vc_mgr_tidl.h"
33 #include "vc_mgr_data.h"
34 #include "vc_mgr_player.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;
49 static Ecore_Timer* g_m_set_volume_timer = NULL;
51 static vc_h g_vc_m = NULL;
53 static GSList* g_demandable_client_list = NULL;
55 static float g_volume_db = 0;
57 static float g_prev_volume_db = 0;
59 static float g_cur_volume_db = 0;
61 static int g_daemon_pid = 0;
63 static int g_feature_enabled = -1;
65 static bool g_privilege_allowed = false;
67 static cynara *p_cynara = NULL;
68 static pthread_mutex_t g_cynara_mutex = PTHREAD_MUTEX_INITIALIZER;
70 static bool g_err_callback_status = false;
72 /* for TTS feedback */
73 static int g_feedback_rate = 16000;
74 static vc_audio_channel_e g_feedback_audio_channel = 0;
75 static vc_audio_type_e g_feedback_audio_type = 0;
76 static Ecore_Thread* g_feedback_thread = NULL;
78 static pthread_mutex_t g_feedback_streaming_cb_mutex = PTHREAD_MUTEX_INITIALIZER;
79 static pthread_mutex_t g_vc_tts_streaming_cb_mutex = PTHREAD_MUTEX_INITIALIZER;
81 static Eina_Bool __vc_mgr_notify_state_changed(void *data);
82 static void __vc_mgr_notify_error(void *data);
83 static Eina_Bool __vc_mgr_notify_result(void *data);
85 int __vc_mgr_cb_error(int reason, int daemon_pid, char* msg);
88 static const char* __vc_mgr_get_error_code(vc_error_e err)
91 case VC_ERROR_NONE: return "VC_ERROR_NONE";
92 case VC_ERROR_OUT_OF_MEMORY: return "VC_ERROR_OUT_OF_MEMORY";
93 case VC_ERROR_IO_ERROR: return "VC_ERROR_IO_ERROR";
94 case VC_ERROR_INVALID_PARAMETER: return "VC_ERROR_INVALID_PARAMETER";
95 case VC_ERROR_TIMED_OUT: return "VC_ERROR_TIMED_OUT";
96 case VC_ERROR_RECORDER_BUSY: return "VC_ERROR_RECORDER_BUSY";
97 case VC_ERROR_INVALID_STATE: return "VC_ERROR_INVALID_STATE";
98 case VC_ERROR_INVALID_LANGUAGE: return "VC_ERROR_INVALID_LANGUAGE";
99 case VC_ERROR_ENGINE_NOT_FOUND: return "VC_ERROR_ENGINE_NOT_FOUND";
100 case VC_ERROR_OPERATION_FAILED: return "VC_ERROR_OPERATION_FAILED";
101 default: return "Invalid error code";
106 static void __vc_mgr_lang_changed_cb(const char* previous_lang, const char* current_lang)
108 SLOG(LOG_INFO, TAG_VCM, "Lang changed : previous lang(%s) current lang(%s)",
109 previous_lang, current_lang);
111 vc_current_language_changed_cb callback = NULL;
112 void* lang_user_data;
113 vc_mgr_client_get_current_lang_changed_cb(g_vc_m, &callback, &lang_user_data);
115 if (NULL != callback) {
116 vc_mgr_client_use_callback(g_vc_m);
117 callback(previous_lang, current_lang, lang_user_data);
118 vc_mgr_client_not_use_callback(g_vc_m);
119 SLOG(LOG_INFO, TAG_VCM, "Language changed callback is called");
121 SLOG(LOG_WARN, TAG_VCM, "[WARNING] Language changed callback is null");
127 static int __vc_mgr_get_feature_enabled()
129 if (0 == g_feature_enabled) {
130 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Voice control feature NOT supported");
131 return VC_ERROR_NOT_SUPPORTED;
132 } else if (-1 == g_feature_enabled) {
133 bool vc_supported = false;
134 bool mic_supported = false;
135 if (0 == system_info_get_platform_bool(VC_MGR_FEATURE_PATH, &vc_supported)) {
136 if (0 == system_info_get_platform_bool(VC_MIC_FEATURE_PATH, &mic_supported)) {
137 if (false == vc_supported || false == mic_supported) {
138 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Voice control feature NOT supported");
139 g_feature_enabled = 0;
140 return VC_ERROR_NOT_SUPPORTED;
143 g_feature_enabled = 1;
148 return VC_ERROR_NONE;
151 static int __check_privilege_initialize()
153 int ret = cynara_initialize(&p_cynara, NULL);
154 if (NULL == p_cynara || CYNARA_API_SUCCESS != ret) {
155 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] fail to initialize(%d)", ret);
159 return ret == CYNARA_API_SUCCESS;
162 static int __check_privilege(const char* uid, const char * privilege)
165 char label_path[1024] = "/proc/self/attr/current";
166 char smack_label[1024] = {'\0',};
169 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] p_cynara is NULL");
173 fp = fopen(label_path, "r");
175 if (fread(smack_label, 1, sizeof(smack_label), fp) <= 0)
176 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] fail to fread");
181 pid_t pid = getpid();
182 char *session = cynara_session_from_pid(pid);
183 int ret = cynara_check(p_cynara, smack_label, session, uid, privilege);
188 if (ret != CYNARA_API_ACCESS_ALLOWED) {
189 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);
196 static void __check_privilege_deinitialize()
199 int ret = cynara_finish(p_cynara);
200 if (ret != CYNARA_API_SUCCESS)
201 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] cynara finish %d", ret);
206 static int __vc_mgr_check_privilege()
208 if (true == g_privilege_allowed)
209 return VC_ERROR_NONE;
211 pthread_mutex_lock(&g_cynara_mutex);
213 if (false == g_privilege_allowed) {
215 ret = __check_privilege_initialize();
217 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] privilege initialize is failed");
218 g_privilege_allowed = false;
219 pthread_mutex_unlock(&g_cynara_mutex);
220 return VC_ERROR_PERMISSION_DENIED;
224 snprintf(uid, 32, "%d", getuid());
226 ret = __check_privilege(uid, VC_PRIVILEGE_RECORDER);
228 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Permission is denied(%s)(%s)", VC_PRIVILEGE_RECORDER, uid);
229 __check_privilege_deinitialize();
230 g_privilege_allowed = false;
231 pthread_mutex_unlock(&g_cynara_mutex);
232 return VC_ERROR_PERMISSION_DENIED;
235 ret = __check_privilege(uid, VC_MGR_PRIVILEGE);
237 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Permission is denied(%s)(%s)", VC_MGR_PRIVILEGE, uid);
238 __check_privilege_deinitialize();
239 g_privilege_allowed = false;
240 pthread_mutex_unlock(&g_cynara_mutex);
241 return VC_ERROR_PERMISSION_DENIED;
244 __check_privilege_deinitialize();
247 g_privilege_allowed = true;
248 pthread_mutex_unlock(&g_cynara_mutex);
249 return VC_ERROR_NONE;
252 int __check_mgr_feature_privilege()
254 if (0 != __vc_mgr_get_feature_enabled()) {
255 SLOG(LOG_DEBUG, TAG_VCM, "@@@ [Manager] not supported");
256 return VC_ERROR_NOT_SUPPORTED;
259 if (0 != __vc_mgr_check_privilege()) {
260 return VC_ERROR_PERMISSION_DENIED;
263 return VC_ERROR_NONE;
266 int vc_mgr_initialize(void)
268 SLOG(LOG_ERROR, TAG_VCM, "@@@ [Manager] Initialize");
271 ret = __check_mgr_feature_privilege();
272 if (VC_ERROR_NONE != ret)
276 if (true == vc_mgr_client_is_valid(g_vc_m)) {
277 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Already initialized");
278 return VC_ERROR_NONE;
281 if (0 != vc_mgr_tidl_open_connection()) {
282 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to open tidl connection");
283 return VC_ERROR_OPERATION_FAILED;
286 if (0 != vc_mgr_client_create(&g_vc_m)) {
287 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to create client!!!!!");
288 return VC_ERROR_OUT_OF_MEMORY;
291 ret = vc_config_mgr_initialize(g_vc_m->handle + VC_MANAGER_CONFIG_HANDLE);
293 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to init config manager : %d", ret);
294 vc_mgr_client_destroy(g_vc_m);
295 return VC_ERROR_OPERATION_FAILED;
298 ret = vc_config_mgr_set_lang_cb(g_vc_m->handle + 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_vc_m->handle + VC_MANAGER_CONFIG_HANDLE);
302 vc_mgr_client_destroy(g_vc_m);
303 return VC_ERROR_OPERATION_FAILED;
306 ret = vc_mgr_client_set_audio_streaming_mode(g_vc_m, 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_vc_m->handle + VC_MANAGER_CONFIG_HANDLE);
310 vc_mgr_client_destroy(g_vc_m);
314 /* for TTS feedback */
315 /* ret = vc_mgr_player_init();
317 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to initialize VC mgr player : %d", ret);
321 ret = vc_mgr_ducking_create();
322 if (VC_ERROR_NONE != ret) {
323 SLOG(LOG_INFO, TAG_VCM, "[INFO] Fail to ducking create : %d", ret);
326 SLOG(LOG_ERROR, TAG_VCM, "[Success] pid(%d)", g_vc_m->handle);
328 SLOG(LOG_DEBUG, TAG_VCM, "@@@ [Manager] Initialize DONE");
330 return VC_ERROR_NONE;
333 static void __vc_mgr_internal_unprepare()
335 int ret = vc_mgr_tidl_request_finalize(g_vc_m->handle);
337 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request finalize : %s", __vc_mgr_get_error_code(ret));
340 vc_mgr_client_set_internal_state(g_vc_m, VC_INTERNAL_STATE_NONE);
344 int vc_mgr_deinitialize(void)
346 SLOG(LOG_ERROR, TAG_VCM, "@@@ [Manager] Deinitialize");
349 ret = __check_mgr_feature_privilege();
350 if (VC_ERROR_NONE != ret)
353 if (false == vc_mgr_client_is_valid(g_vc_m)) {
354 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] NOT initialized");
355 return VC_ERROR_INVALID_STATE;
359 vc_mgr_client_get_client_state(g_vc_m, &state);
364 __vc_mgr_internal_unprepare();
365 /* no break. need to next step*/
366 case VC_STATE_INITIALIZED:
367 if (NULL != g_send_hello_timer) {
368 SLOG(LOG_DEBUG, TAG_VCM, "Connect Timer is deleted");
369 ecore_timer_del(g_send_hello_timer);
370 g_send_hello_timer = NULL;
372 if (g_request_init_timer) {
373 SLOG(LOG_DEBUG, TAG_VCM, "Connect idler is deleted");
374 ecore_timer_del(g_request_init_timer);
375 g_request_init_timer = NULL;
378 vc_config_mgr_unset_lang_cb(g_vc_m->handle + VC_MANAGER_CONFIG_HANDLE);
379 vc_config_mgr_finalize(g_vc_m->handle + VC_MANAGER_CONFIG_HANDLE);
381 /* Free client resources */
382 vc_mgr_client_destroy(g_vc_m);
389 SLOG(LOG_DEBUG, TAG_VCM, "Success: destroy");
391 int cnt = VC_COMMAND_TYPE_FOREGROUND;
393 ret = vc_cmd_parser_delete_file(getpid(), cnt);
395 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to delete file, type(%d), ret(%d)", cnt, ret);
396 } while (VC_COMMAND_TYPE_EXCLUSIVE >= ++cnt);
398 ret = vc_db_finalize();
400 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to finalize DB, ret(%d)", ret);
403 /* for TTS feedback */
404 /* ret = vc_mgr_player_release();
406 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to release VC mgr player(%d)", ret);
410 ret = vc_mgr_ducking_destroy();
411 if (VC_ERROR_NONE != ret) {
412 SLOG(LOG_INFO, TAG_VCM, "[INFO] Fail to ducking destroy : %d", ret);
415 if (0 != vc_mgr_tidl_close_connection()) {
416 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to close connection");
419 SLOG(LOG_ERROR, TAG_VCM, "@@@ [Manager] Deinitialize DONE");
421 return VC_ERROR_NONE;
424 static Eina_Bool __request_initialize(void *data)
426 /* request initialization */
428 int service_state = 0;
429 int foreground = VC_RUNTIME_INFO_NO_FOREGROUND;
433 if (true == vc_mgr_client_is_valid(g_vc_m)) {
434 SLOG(LOG_DEBUG, TAG_VCM, "[DEBUG] g_vc_m is valid");
437 ret = vc_db_initialize();
439 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to initialize DB : %d", ret);
443 vc_audio_streaming_mode_e streaming_mode;
444 vc_mgr_client_get_audio_streaming_mode(g_vc_m, &streaming_mode);
446 ret = vc_mgr_tidl_request_initialize(g_vc_m->handle, (int)streaming_mode, &service_state, &foreground, &g_daemon_pid);
448 if (VC_ERROR_ENGINE_NOT_FOUND == ret) {
449 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to initialize : %s", __vc_mgr_get_error_code(ret));
451 vc_mgr_client_set_error(g_vc_m, VC_ERROR_ENGINE_NOT_FOUND);
452 ecore_main_loop_thread_safe_call_async(__vc_mgr_notify_error, (void*)g_vc_m);
454 SLOG(LOG_DEBUG, TAG_VCM, "@@@");
455 g_request_init_timer = NULL;
458 } else if (0 != ret) {
459 SLOG(LOG_ERROR, TAG_VCM, "[WARNING] Fail to connection. Retry to connect : %s", __vc_mgr_get_error_code(ret));
460 ret = vc_db_finalize();
462 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to finalize DB : %d", ret);
466 /* Success to connect */
469 /* Set service state */
470 vc_service_state_e previous_service_state;
471 vc_mgr_client_get_service_state(g_vc_m, &previous_service_state);
472 vc_mgr_client_set_service_state(g_vc_m, (vc_service_state_e)service_state);
474 vc_service_state_changed_cb service_changed_callback = NULL;
475 void* user_data = NULL;
476 vc_mgr_client_get_service_state_changed_cb(g_vc_m, &service_changed_callback, &user_data);
478 if (NULL != service_changed_callback) {
479 vc_mgr_client_use_callback(g_vc_m);
480 service_changed_callback(previous_service_state, service_state, user_data);
481 vc_mgr_client_not_use_callback(g_vc_m);
482 SLOG(LOG_INFO, TAG_VCM, "Service state changed callback is called");
484 SLOG(LOG_WARN, TAG_VCM, "[WARNING] Service state changed callback is null");
488 vc_mgr_client_set_foreground(g_vc_m, foreground, true);
490 SLOG(LOG_ERROR, TAG_VCM, "[SUCCESS] Connected daemon");
492 /* Set client state */
493 vc_mgr_client_set_client_state(g_vc_m, VC_STATE_READY);
495 vc_state_changed_cb changed_callback = NULL;
497 vc_mgr_client_get_state_changed_cb(g_vc_m, &changed_callback, &user_data);
499 vc_state_e current_state;
500 vc_state_e previous_state;
502 vc_mgr_client_get_previous_state(g_vc_m, ¤t_state, &previous_state);
504 if (NULL != changed_callback) {
505 vc_mgr_client_use_callback(g_vc_m);
506 changed_callback(previous_state, current_state, user_data);
507 vc_mgr_client_not_use_callback(g_vc_m);
508 SLOG(LOG_INFO, TAG_VCM, "State changed callback is called");
510 SLOG(LOG_WARN, TAG_VCM, "[WARNING] State changed callback is null");
513 SLOG(LOG_ERROR, TAG_VCM, "[Not ERROR] g_vc_m is not valid. It is destroyed."); //LCOV_EXCL_LINE
514 g_request_init_timer = NULL;
518 SLOG(LOG_ERROR, TAG_VCM, "@@@");
520 g_request_init_timer = NULL;
525 static Eina_Bool __send_hello_message(void *data)
528 if (0 != vc_mgr_tidl_request_hello()) {
529 if (g_tidl_send_hello_count == VCM_TIDL_RETRY_COUNT) {
530 g_tidl_send_hello_count = 0;
531 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request hello !! send error to manager");
532 __vc_mgr_cb_error(VC_ERROR_TIMED_OUT, -1, "voice_framework.error.vcfw.connect_engine_fail");
533 g_send_hello_timer = NULL;
536 g_tidl_send_hello_count++;
541 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Connect daemon");
543 if (NULL == g_request_init_timer) {
544 SLOG(LOG_INFO, TAG_VCM, "[DEBUG] Create a new idler for preparation");
545 g_request_init_timer = ecore_timer_add(0.0, __request_initialize, NULL);
547 SLOG(LOG_INFO, TAG_VCM, "[INFO] idler handle is already created");
550 g_send_hello_timer = NULL;
554 int vc_mgr_prepare(void)
556 SLOG(LOG_ERROR, TAG_VCM, "@@@ [Manager] Prepare");
559 ret = __check_mgr_feature_privilege();
560 if (VC_ERROR_NONE != ret)
564 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
565 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
566 return VC_ERROR_INVALID_STATE;
570 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
572 if (NULL == g_send_hello_timer) {
573 g_tidl_send_hello_count = 0;
574 SLOG(LOG_INFO, TAG_VCM, "[DEBUG] Create a new timer for preparation");
575 ecore_thread_main_loop_begin();
576 g_send_hello_timer = ecore_timer_add(0.1, __send_hello_message, NULL);
577 ecore_thread_main_loop_end();
579 SLOG(LOG_INFO, TAG_VCM, "[INFO] timer handle is already created");
582 SLOG(LOG_DEBUG, TAG_VCM, "@@@ [Manager] Calling Prepare DONE");
584 return VC_ERROR_NONE;
587 int vc_mgr_unprepare(void)
589 SLOG(LOG_ERROR, TAG_VCM, "@@@ [Manager] Unprepare");
592 ret = __check_mgr_feature_privilege();
593 if (VC_ERROR_NONE != ret)
597 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
598 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
599 return VC_ERROR_INVALID_STATE;
603 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Ready'", state);
605 __vc_mgr_internal_unprepare();
607 vc_mgr_client_set_client_state(g_vc_m, VC_STATE_INITIALIZED);
608 ecore_timer_add(0, __vc_mgr_notify_state_changed, g_vc_m);
610 SLOG(LOG_DEBUG, TAG_VCM, "@@@ [Manager] Unprepare DONE");
612 return VC_ERROR_NONE;
615 int vc_mgr_foreach_supported_languages(vc_supported_language_cb callback, void* user_data)
617 SLOG(LOG_INFO, TAG_VCM, "@@@ [Manager] Foreach Supported Language");
620 ret = __check_mgr_feature_privilege();
621 if (VC_ERROR_NONE != ret)
624 RETVM_IF(NULL == callback, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Input parameter is NULL");
627 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
628 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
629 return VC_ERROR_INVALID_STATE;
632 ret = vc_config_mgr_get_language_list(callback, user_data);
634 ret = vc_config_convert_error_code((vc_config_error_e)ret);
635 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get languages : %s", __vc_mgr_get_error_code(ret));
638 SLOG(LOG_DEBUG, TAG_VCM, "@@@ [Manager] Foreach Supported Language DONE");
640 return VC_ERROR_NONE;
643 int vc_mgr_get_current_language(char** language)
646 ret = __check_mgr_feature_privilege();
647 if (VC_ERROR_NONE != ret)
650 RETVM_IF(NULL == language, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Input parameter is NULL");
653 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
654 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
655 return VC_ERROR_INVALID_STATE;
658 ret = vc_config_mgr_get_default_language(language);
660 ret = vc_config_convert_error_code((vc_config_error_e)ret);
661 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get current languages : %s", __vc_mgr_get_error_code(ret));
663 SLOG(LOG_ERROR, TAG_VCM, "[Get current language] language : %s", *language);
669 int vc_mgr_get_state(vc_state_e* state)
671 SLOG(LOG_DEBUG, TAG_VCM, "@@@ [Manager] Get State");
674 ret = __check_mgr_feature_privilege();
675 if (VC_ERROR_NONE != ret)
678 RETVM_IF(NULL == state, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Input parameter is NULL");
681 if (NULL == g_vc_m) {
682 temp = VC_STATE_NONE;
683 } else if (0 != vc_mgr_client_get_client_state(g_vc_m, &temp)) {
684 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
685 return VC_ERROR_INVALID_STATE;
691 case VC_STATE_NONE: SLOG(LOG_INFO, TAG_VCM, "Current state is 'None'"); break;
692 case VC_STATE_INITIALIZED: SLOG(LOG_INFO, TAG_VCM, "Current state is 'Created'"); break;
693 case VC_STATE_READY: SLOG(LOG_INFO, TAG_VCM, "Current state is 'Ready'"); break;
694 default: SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid state");
697 SLOG(LOG_DEBUG, TAG_VCM, "@@@ [Manager] Get State DONE");
699 return VC_ERROR_NONE;
702 int vc_mgr_get_service_state(vc_service_state_e* state)
704 SLOG(LOG_DEBUG, TAG_VCM, "@@@ [Manager] Get Service State");
707 ret = __check_mgr_feature_privilege();
708 if (VC_ERROR_NONE != ret)
711 RETVM_IF(NULL == state, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Input parameter is NULL");
713 vc_state_e client_state;
714 if (0 != vc_mgr_client_get_client_state(g_vc_m, &client_state)) {
715 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
716 return VC_ERROR_INVALID_STATE;
720 RETVM_IF(client_state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Current state is not 'READY'");
722 /* get service state */
723 vc_service_state_e service_state;
724 if (0 != vc_mgr_client_get_service_state(g_vc_m, &service_state)) {
725 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get service state");
726 return VC_ERROR_OPERATION_FAILED;
729 *state = service_state;
732 case VC_SERVICE_STATE_NONE: SLOG(LOG_DEBUG, TAG_VCM, "Current service state is 'None'"); break;
733 case VC_SERVICE_STATE_READY: SLOG(LOG_DEBUG, TAG_VCM, "Current service state is 'Ready'"); break;
734 case VC_SERVICE_STATE_RECORDING: SLOG(LOG_DEBUG, TAG_VCM, "Current service state is 'Recording'"); break;
735 case VC_SERVICE_STATE_PROCESSING: SLOG(LOG_DEBUG, TAG_VCM, "Current service state is 'Processing'"); break;
736 default: SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid state");
739 SLOG(LOG_DEBUG, TAG_VCM, "@@@ [Manager] Get Service State DONE");
741 return VC_ERROR_NONE;
744 int vc_mgr_set_demandable_client_rule(const char* rule)
746 SLOG(LOG_INFO, TAG_VCM, "@@@ [Manager] Set Demandable client rule(%s)", rule);
749 ret = __check_mgr_feature_privilege();
750 if (VC_ERROR_NONE != ret)
754 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
755 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
756 return VC_ERROR_INVALID_STATE;
760 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Ready'", state);
762 ret = vc_info_parser_set_demandable_client(rule);
764 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] rule is NOT valid");
765 SLOG(LOG_DEBUG, TAG_VCM, "@@@");
766 return VC_ERROR_INVALID_PARAMETER;
769 if (0 != vc_info_parser_get_demandable_clients(&g_demandable_client_list)) {
770 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get demandable clients");
771 return VC_ERROR_OPERATION_FAILED;
774 SLOG(LOG_DEBUG, TAG_VCM, "@@@ [Manager] Set Demandable client rule(%s) DONE", rule);
776 return VC_ERROR_NONE;
779 int vc_mgr_unset_demandable_client_rule(void)
781 SLOG(LOG_INFO, TAG_VCM, "@@@ [Manager] Unset Demandable client");
784 ret = __check_mgr_feature_privilege();
785 if (VC_ERROR_NONE != ret)
788 vc_info_parser_set_demandable_client(NULL);
790 ret = vc_mgr_tidl_request_demandable_client(g_vc_m->handle);
792 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request unset client rule to daemon : %s", __vc_mgr_get_error_code(ret));
795 // TODO: check return value correct or not
796 return VC_ERROR_NONE;
799 int vc_mgr_is_command_format_supported(int format, bool* support)
801 SLOG(LOG_ERROR, TAG_VCM, "@@@ [Manager] Is command type supported");
804 ret = __check_mgr_feature_privilege();
805 if (VC_ERROR_NONE != ret)
808 RETVM_IF(NULL == support, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Input parameter is NULL");
811 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
812 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
813 return VC_ERROR_INVALID_STATE;
817 bool non_fixed_support = false;
818 if (0 != vc_config_mgr_get_nonfixed_support(&non_fixed_support)) {
819 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get nonfixed support info");
823 case VC_CMD_FORMAT_FIXED: *support = true; break;
824 case VC_CMD_FORMAT_FIXED_AND_VFIXED: *support = true; break;
825 case VC_CMD_FORMAT_VFIXED_AND_FIXED: *support = true; break;
826 case VC_CMD_FORMAT_FIXED_AND_NONFIXED: *support = non_fixed_support; break;
827 case VC_CMD_FORMAT_NONFIXED_AND_FIXED: *support = non_fixed_support; break;
828 default: *support = false; break;
831 SLOG(LOG_ERROR, TAG_VCM, "[DEBUG] Format(%d) support(%s)", format, *support ? "true" : "false");
833 SLOG(LOG_DEBUG, TAG_VCM, "@@@ [Manager] Is command type supported DONE");
835 return VC_ERROR_NONE;
838 int vc_mgr_enable_command_type(int cmd_type)
840 SLOG(LOG_ERROR, TAG_VCM, "@@@ [Manager] Enable Command Type, cmd_type(%d)", cmd_type);
843 ret = __check_mgr_feature_privilege();
844 if (VC_ERROR_NONE != ret)
847 if (VC_COMMAND_TYPE_FOREGROUND > cmd_type || VC_COMMAND_TYPE_EXCLUSIVE < cmd_type) {
848 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] cmd_type is not valid. (%d)", cmd_type);
849 return VC_ERROR_INVALID_PARAMETER;
853 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
854 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
855 return VC_ERROR_INVALID_STATE;
859 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Ready'", state);
861 /* Check service state */
862 vc_service_state_e service_state = -1;
863 vc_mgr_client_get_service_state(g_vc_m, &service_state);
864 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);
866 ret = vc_mgr_client_enable_command_type(g_vc_m, (vc_cmd_type_e)cmd_type); // enable the cmd type
868 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to enable the command type(%d). ret(%d)", cmd_type, ret);
870 SLOG(LOG_DEBUG, TAG_VCM, "[DEBUG] Success to enable the command type(%d)", cmd_type);
873 SLOG(LOG_ERROR, TAG_VCM, "@@@ [Manager] Enable Command Type DONE, ret(%d)", ret);
878 int vc_mgr_disable_command_type(int cmd_type)
880 SLOG(LOG_ERROR, TAG_VCM, "@@@ [Manager] Disable Command Type, cmd_type(%d)", cmd_type);
883 ret = __check_mgr_feature_privilege();
884 if (VC_ERROR_NONE != ret)
887 if (VC_COMMAND_TYPE_FOREGROUND > cmd_type || VC_COMMAND_TYPE_EXCLUSIVE < cmd_type) {
888 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] cmd type is not valid, (%d)", cmd_type);
889 return VC_ERROR_INVALID_PARAMETER;
893 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
894 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
895 return VC_ERROR_INVALID_STATE;
899 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Ready'", state);
901 /* Check service state */
902 vc_service_state_e service_state = -1;
903 vc_mgr_client_get_service_state(g_vc_m, &service_state);
904 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);
906 ret = vc_mgr_client_disable_command_type(g_vc_m, (vc_cmd_type_e)cmd_type); // enable the cmd type
908 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to disable the command type(%d). ret(%d)", cmd_type, ret);
910 SLOG(LOG_DEBUG, TAG_VCM, "[DEBUG] Success to disable the command type(%d)", cmd_type);
913 SLOG(LOG_ERROR, TAG_VCM, "@@@ [Manager] Disable Command Type DONE, ret(%d)", ret);
918 int vc_mgr_set_command_list(vc_cmd_list_h vc_cmd_list)
920 SLOG(LOG_ERROR, TAG_VCM, "@@@ [Manager] Set Command list");
923 ret = __check_mgr_feature_privilege();
924 if (VC_ERROR_NONE != ret)
928 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
929 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
930 return VC_ERROR_INVALID_STATE;
934 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
936 /* Check service state */
937 vc_service_state_e service_state = -1;
938 vc_mgr_client_get_service_state(g_vc_m, &service_state);
939 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);
941 RETVM_IF(NULL == vc_cmd_list, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Input parameter is NULL");
943 vc_cmd_list_s* list = NULL;
944 list = (vc_cmd_list_s*)vc_cmd_list;
945 SLOG(LOG_INFO, TAG_VCM, "[List] (%p) (%p)", list, list->list);
947 RETVM_IF(NULL == list->list, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Input command list");
950 bool success_save = false;
951 for (i = VC_COMMAND_TYPE_FOREGROUND; i <= VC_COMMAND_TYPE_EXCLUSIVE; i++) {
952 ret = vc_cmd_parser_delete_file(getpid(), i);
954 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to delete file, type(%d), ret(%d)", i, ret);
956 ret = vc_cmd_parser_save_file(getpid(), i, list->list, NULL);
958 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to save file, type(%d), ret(%d)", i, ret);
960 SLOG(LOG_INFO, TAG_VCM, "[SUCCESS] Save file, type(%d)", i);
965 if (true != success_save) {
966 ret = VC_ERROR_INVALID_PARAMETER;
967 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to save command group : %s", __vc_mgr_get_error_code(ret));
969 ret = vc_mgr_tidl_request_set_command(g_vc_m->handle);
971 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request set command to daemon : %s", __vc_mgr_get_error_code(ret));
975 SLOG(LOG_ERROR, TAG_VCM, "@@@ [Manager] Set Command list DONE, ret(%d)", ret);
980 int vc_mgr_unset_command_list(void)
982 SLOG(LOG_ERROR, TAG_VCM, "@@@ [Manager] Unset Command list");
985 ret = __check_mgr_feature_privilege();
986 if (VC_ERROR_NONE != ret)
990 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
991 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
992 return VC_ERROR_INVALID_STATE;
996 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
998 ret = vc_mgr_tidl_request_unset_command(g_vc_m->handle);
1000 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request unset command to daemon : %s", __vc_mgr_get_error_code(ret));
1004 for (i = VC_COMMAND_TYPE_FOREGROUND; i <= VC_COMMAND_TYPE_EXCLUSIVE; i++) {
1005 ret = vc_cmd_parser_delete_file(getpid(), i);
1007 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to delete file, type(%d), ret(%d)", i, ret);
1010 SLOG(LOG_ERROR, TAG_VCM, "@@@ [Manager] Unset Command list DONE");
1012 // TODO: check return value correct or not
1013 return VC_ERROR_NONE;
1016 int vc_mgr_set_command_list_from_file(const char* file_path, int type)
1018 SLOG(LOG_ERROR, TAG_VCM, "@@@ [Manager] Set Command list from file, type(%d)", type);
1021 ret = __check_mgr_feature_privilege();
1022 if (VC_ERROR_NONE != ret)
1025 RETVM_IF(NULL == file_path, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Invalid parameter");
1026 SLOG(LOG_INFO, TAG_VCM, "@@@ File path: %s", file_path);
1029 if (VC_COMMAND_TYPE_FOREGROUND > type || VC_COMMAND_TYPE_EXCLUSIVE < type) {
1030 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid command type: input type is %d", type);
1031 return VC_ERROR_INVALID_PARAMETER;
1035 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
1036 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1037 return VC_ERROR_INVALID_STATE;
1041 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
1043 /* Check service state */
1044 vc_service_state_e service_state = -1;
1045 vc_mgr_client_get_service_state(g_vc_m, &service_state);
1046 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);
1048 ret = vc_cmd_parser_delete_file(getpid(), type);
1050 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to delete file, type(4), ret(%d)", ret);
1052 if (0 != vc_json_set_commands_from_file(file_path, type, NULL)) {
1053 ret = VC_ERROR_INVALID_PARAMETER;
1054 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to save command list (%d)", ret);
1056 ret = vc_mgr_tidl_request_set_command(g_vc_m->handle);
1058 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request set command to daemon : %s", __vc_mgr_get_error_code(ret));
1062 SLOG(LOG_ERROR, TAG_VCM, "@@@ [Manager] Set Command list from file DONE, ret(%d)", ret);
1067 int vc_mgr_set_preloaded_commands_from_file(const char* file_path)
1069 SLOG(LOG_ERROR, TAG_VCM, "@@@ [Manager] Set preloaded command list");
1072 ret = __check_mgr_feature_privilege();
1073 if (VC_ERROR_NONE != ret)
1076 RETVM_IF(NULL == file_path, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Invalid parameter");
1077 SLOG(LOG_INFO, TAG_VCM, "@@@ File path: %s", file_path);
1080 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
1081 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1082 return VC_ERROR_INVALID_STATE;
1086 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
1088 /* Check service state */
1089 vc_service_state_e service_state = -1;
1090 vc_mgr_client_get_service_state(g_vc_m, &service_state);
1091 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);
1093 /* Only support to set background commands for preloaded application */
1094 ret = vc_json_set_commands_from_file(file_path, VC_COMMAND_TYPE_BACKGROUND, NULL);
1096 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to insert preloaded commands into db");
1098 SLOG(LOG_ERROR, TAG_VCM, "@@@ [Manager] Set preloaded command list DONE, ret(%d)", ret);
1102 int vc_mgr_set_audio_type(const char* audio_id)
1104 SLOG(LOG_ERROR, TAG_VCM, "@@@ [Manager] Set audio type, audio_id(%s)", audio_id);
1107 ret = __check_mgr_feature_privilege();
1108 if (VC_ERROR_NONE != ret)
1111 if (NULL == audio_id || !strncmp(audio_id, "", strlen(audio_id))) {
1112 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Input parameter is NULL");
1113 return VC_ERROR_INVALID_PARAMETER;
1117 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
1118 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1119 return VC_ERROR_INVALID_STATE;
1123 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
1125 /* Check service state */
1126 vc_service_state_e service_state = -1;
1127 vc_mgr_client_get_service_state(g_vc_m, &service_state);
1128 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);
1131 ret = vc_mgr_tidl_request_set_audio_type(g_vc_m->handle, audio_id);
1133 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to set audio type : %s", __vc_mgr_get_error_code(ret));
1135 SLOG(LOG_INFO, TAG_VCM, "[SUCCESS] Set audio type");
1137 vc_mgr_client_set_audio_type(g_vc_m, audio_id);
1140 SLOG(LOG_ERROR, TAG_VCM, "@@@ [Manager] Set audio type DONE, ret(%d)", ret);
1145 int vc_mgr_get_audio_type(char** audio_id)
1147 SLOG(LOG_ERROR, TAG_VCM, "@@@ [Manager] Get audio type");
1150 ret = __check_mgr_feature_privilege();
1151 if (VC_ERROR_NONE != ret)
1154 RETVM_IF(NULL == audio_id, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Invalid parameter");
1157 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
1158 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1159 return VC_ERROR_INVALID_STATE;
1163 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
1165 /* Check service state */
1166 vc_service_state_e service_state = -1;
1167 vc_mgr_client_get_service_state(g_vc_m, &service_state);
1168 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);
1172 vc_mgr_client_get_audio_type(g_vc_m, &temp);
1175 /* Not initiallized */
1178 ret = vc_mgr_tidl_request_get_audio_type(g_vc_m->handle, &temp);
1180 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get audio type : %s", __vc_mgr_get_error_code(ret));
1182 SLOG(LOG_ERROR, TAG_VCM, "[SUCCESS] Get audio type : %s", temp);
1184 vc_mgr_client_set_audio_type(g_vc_m, temp);
1190 *audio_id = strdup(temp);
1195 // TODO: check return value correct or not
1196 return VC_ERROR_NONE;
1199 int vc_mgr_get_current_commands(vc_cmd_list_h* vc_cmd_list)
1201 SLOG(LOG_ERROR, TAG_VCM, "@@@ [Manager] Foreach current commands");
1204 ret = __check_mgr_feature_privilege();
1205 if (VC_ERROR_NONE != ret)
1209 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
1210 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1211 return VC_ERROR_INVALID_STATE;
1215 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
1217 /* Check service state */
1218 vc_service_state_e service_state = -1;
1219 vc_mgr_client_get_service_state(g_vc_m, &service_state);
1220 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);
1222 RETVM_IF(NULL == vc_cmd_list, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Invalid Parameter");
1224 vc_cmd_list_h temp_list = NULL;
1225 if (0 != vc_cmd_list_create(&temp_list)) {
1226 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to create list");
1227 return VC_ERROR_INVALID_PARAMETER;
1230 *vc_cmd_list = temp_list;
1235 /* Get foreground pid */
1236 if (0 != vc_mgr_client_get_foreground(g_vc_m, &fg_pid)) {
1237 /* There is no foreground app for voice control */
1238 SLOG(LOG_WARN, TAG_VCM, "[Manager WARNING] No foreground pid for voice control");
1240 SLOG(LOG_INFO, TAG_VCM, "[Manager] Foreground pid(%d)", fg_pid);
1243 if (0 != vc_mgr_client_get_pid(g_vc_m, &mgr_pid)) {
1244 SLOG(LOG_ERROR, TAG_VCM, "[Manager] Fail to get manager pid");
1245 return VC_ERROR_OPERATION_FAILED;
1247 SLOG(LOG_INFO, TAG_VCM, "[Manager] Manager pid(%d)", mgr_pid);
1250 /* Get system command */
1251 ret = vc_cmd_parser_append_commands(mgr_pid, VC_COMMAND_TYPE_SYSTEM, temp_list);
1253 SLOG(LOG_INFO, TAG_VCM, "[Manager] No system commands");
1257 ret = vc_mgr_tidl_request_set_client_info(g_vc_m->handle);
1259 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to set client info : %s", __vc_mgr_get_error_code(ret));
1261 SLOG(LOG_INFO, TAG_VCM, "[SUCCESS] Set client info");
1264 GSList *iter = NULL;
1265 GSList* client_info_list = NULL;
1266 vc_client_info_s *client_info = NULL;
1267 bool is_fgpid = false;
1269 if (0 != vc_info_parser_get_client_info(&client_info_list)) {
1270 SLOG(LOG_INFO, TAG_VCM, "[DEBUG] No client");
1271 return VC_ERROR_NONE;
1274 if (VC_NO_FOREGROUND_PID != fg_pid) {
1275 iter = g_slist_nth(client_info_list, 0);
1276 while (NULL != iter) {
1277 client_info = iter->data;
1278 if (NULL != client_info) {
1279 if (fg_pid == client_info->pid) {
1284 iter = g_slist_next(iter);
1288 /* Get foreground commands and widget */
1289 if (true == is_fgpid) {
1291 SLOG(LOG_INFO, TAG_VCM, "[Manager] fore cmd(%d)", client_info->fg_cmd);
1293 /* Get foreground command */
1294 if (true == client_info->fg_cmd) {
1295 ret = vc_cmd_parser_append_commands(fg_pid, VC_COMMAND_TYPE_FOREGROUND, temp_list);
1297 SLOG(LOG_ERROR, TAG_VCM, "[Client Data ERROR] Fail to get the fg command list");
1300 SLOG(LOG_INFO, TAG_VCM, "[Manager] No foreground commands");
1303 /* Check exclusive option */
1304 if (true == client_info->exclusive_cmd) {
1305 SLOG(LOG_INFO, TAG_VCM, "[Manager] Exclusive command is ON");
1307 /* Set background command for exclusive option */
1308 if (true == client_info->bg_cmd) {
1309 SLOG(LOG_INFO, TAG_VCM, "[Manager] Set background command");
1310 ret = vc_cmd_parser_append_commands(client_info->pid, VC_COMMAND_TYPE_BACKGROUND, temp_list);
1312 SLOG(LOG_ERROR, TAG_VCM, "[Client Data ERROR] Fail to get the bg command list : pid(%d)", client_info->pid);
1316 /* need to release client info */
1317 iter = g_slist_nth(client_info_list, 0);
1319 while (NULL != iter) {
1320 client_info = iter->data;
1321 if (NULL != client_info) {
1324 client_info_list = g_slist_remove_link(client_info_list, iter);
1325 iter = g_slist_nth(client_info_list, 0);
1328 SLOG(LOG_DEBUG, TAG_VCM, "@@@ [Manager] Foreach current commands DONE");
1330 return VC_ERROR_NONE;
1333 SLOG(LOG_INFO, TAG_VCM, "[Manager] No foreground app");
1336 /* Get background commands */
1337 if (0 < g_slist_length(client_info_list)) {
1338 iter = g_slist_nth(client_info_list, 0);
1340 while (NULL != iter) {
1341 client_info = iter->data;
1343 if (NULL != client_info) {
1344 SLOG(LOG_INFO, TAG_VCM, "[Manager] Pid(%d) Back cmd(%d)", client_info->pid, client_info->bg_cmd);
1345 if (true == client_info->bg_cmd) {
1346 ret = vc_cmd_parser_append_commands(client_info->pid, VC_COMMAND_TYPE_BACKGROUND, temp_list);
1348 SLOG(LOG_ERROR, TAG_VCM, "[Client Data ERROR] Fail to get the bg command list : pid(%d)", client_info->pid);
1353 client_info_list = g_slist_remove_link(client_info_list, iter);
1355 iter = g_slist_nth(client_info_list, 0);
1359 SLOG(LOG_INFO, TAG_VCM, "[Manager] No background commands");
1362 SLOG(LOG_ERROR, TAG_VCM, "@@@ [Manager] Foreach current commands DONE");
1364 // TODO: check return value correct or not
1365 return VC_ERROR_NONE;
1368 int vc_mgr_set_recognition_mode(vc_recognition_mode_e mode)
1370 SLOG(LOG_INFO, TAG_VCM, "@@@ [Manager] Set recognition mode = %d", mode);
1373 ret = __check_mgr_feature_privilege();
1374 if (VC_ERROR_NONE != ret)
1377 /* check vc recognition mode */
1378 if (mode < VC_RECOGNITION_MODE_STOP_BY_SILENCE || mode > VC_RECOGNITION_MODE_MANUAL) {
1379 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] invalid parameter: 'mode' is not supported mode (%d)", mode);
1380 return VC_ERROR_INVALID_PARAMETER;
1384 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
1385 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1386 return VC_ERROR_INVALID_STATE;
1390 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
1392 /* Check service state */
1393 vc_service_state_e service_state = -1;
1394 vc_mgr_client_get_service_state(g_vc_m, &service_state);
1395 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);
1397 vc_mgr_client_set_recognition_mode(g_vc_m, mode);
1398 return VC_ERROR_NONE;
1401 int vc_mgr_get_recognition_mode(vc_recognition_mode_e* mode)
1404 ret = __check_mgr_feature_privilege();
1405 if (VC_ERROR_NONE != ret)
1408 RETVM_IF(NULL == mode, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Invalid parameter, mode is NULL ptr");
1411 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
1412 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1413 return VC_ERROR_INVALID_STATE;
1416 ret = vc_mgr_client_get_recognition_mode(g_vc_m, mode);
1418 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get recognition mode");
1422 SLOG(LOG_INFO, TAG_VCM, "@@@ [Manager] Get recognition mode = %d", *mode);
1423 return VC_ERROR_NONE;
1426 int vc_mgr_set_private_data(const char* key, const char* data)
1428 SLOG(LOG_INFO, TAG_VCM, "@@@ [Manager] Set private data");
1431 ret = __check_mgr_feature_privilege();
1432 if (VC_ERROR_NONE != ret)
1435 RETVM_IF(NULL == key, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Invalid parameter");
1438 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
1439 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1440 return VC_ERROR_INVALID_STATE;
1444 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
1446 /* Check service state */
1447 vc_service_state_e service_state = -1;
1448 vc_mgr_client_get_service_state(g_vc_m, &service_state);
1449 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);
1451 ret = vc_mgr_tidl_request_set_private_data(g_vc_m->handle, key, data);
1453 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to set private data : %s", __vc_mgr_get_error_code(ret));
1456 SLOG(LOG_DEBUG, TAG_VCM, "[SUCCESS] Set private data");
1459 SLOG(LOG_DEBUG, TAG_VCM, "@@@ [Manager] Set private data DONE");
1461 return VC_ERROR_NONE;
1464 int vc_mgr_get_private_data(const char* key, char** data)
1466 SLOG(LOG_DEBUG, TAG_VCM, "@@@ [Manager] Get private data");
1469 ret = __check_mgr_feature_privilege();
1470 if (VC_ERROR_NONE != ret)
1473 if (NULL == key || NULL == data) {
1474 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid parameter");
1475 return VC_ERROR_INVALID_PARAMETER;
1479 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
1480 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1481 return VC_ERROR_INVALID_STATE;
1485 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
1487 /* Check service state */
1488 vc_service_state_e service_state = -1;
1489 vc_mgr_client_get_service_state(g_vc_m, &service_state);
1490 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);
1493 ret = vc_mgr_tidl_request_get_private_data(g_vc_m->handle, key, &temp);
1495 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get private data request : %s", __vc_mgr_get_error_code(ret));
1497 SLOG(LOG_INFO, TAG_VCM, "[SUCCESS] Get private data, key(%s), data(%s)", key, temp);
1501 *data = strdup(temp);
1506 SLOG(LOG_DEBUG, TAG_VCM, "@@@ [Manager] Get private data DONE");
1508 // TODO: check return value correct or not
1509 return VC_ERROR_NONE;
1512 int vc_mgr_set_domain(const char* domain)
1514 SLOG(LOG_DEBUG, TAG_VCM, "@@@ [Manager] Set domain");
1517 ret = __check_mgr_feature_privilege();
1518 if (VC_ERROR_NONE != ret)
1521 RETVM_IF(NULL == domain, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Invalid parameter");
1524 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
1525 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1526 return VC_ERROR_INVALID_STATE;
1530 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
1532 /* Check service state */
1533 vc_service_state_e service_state = -1;
1534 vc_mgr_client_get_service_state(g_vc_m, &service_state);
1535 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);
1537 ret = vc_mgr_tidl_request_set_domain(g_vc_m->handle, domain);
1539 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to set domain request : %s", __vc_mgr_get_error_code(ret));
1541 SLOG(LOG_INFO, TAG_VCM, "[SUCCESS] Set domain");
1544 SLOG(LOG_DEBUG, TAG_VCM, "@@@ [Manager] Set domain DONE");
1546 return VC_ERROR_NONE;
1549 int vc_mgr_do_action(vc_send_event_type_e type, char* send_event)
1551 SLOG(LOG_INFO, TAG_VCM, "@@@ [Manager] do action");
1554 ret = __check_mgr_feature_privilege();
1555 if (VC_ERROR_NONE != ret)
1558 if (type < VC_SEND_EVENT_TYPE_TEXT || VC_SEND_EVENT_TYPE_HAPTIC_EVENT < type) {
1559 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] send event type is not valid, (%d)", type);
1560 return VC_ERROR_INVALID_PARAMETER;
1563 RETVM_IF(NULL == send_event, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Invalid parameter");
1566 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
1567 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1568 return VC_ERROR_INVALID_STATE;
1572 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
1574 /* Check service state */
1575 vc_service_state_e service_state = -1;
1576 vc_mgr_client_get_service_state(g_vc_m, &service_state);
1577 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);
1579 ret = vc_mgr_tidl_request_do_action(g_vc_m->handle, type, send_event);
1581 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to do action request : %s", __vc_mgr_get_error_code(ret));
1584 SLOG(LOG_INFO, TAG_VCM, "[SUCCESS] do action");
1586 SLOG(LOG_DEBUG, TAG_VCM, "@@@ [Manager] do action DONE");
1588 return VC_ERROR_NONE;
1591 int vc_mgr_send_specific_engine_request(const char* engine_app_id, const char* event, const char* request)
1593 SLOG(LOG_INFO, TAG_VCM, "@@@ [Manager] send specific engine request");
1596 ret = __check_mgr_feature_privilege();
1597 if (VC_ERROR_NONE != ret)
1600 SLOG(LOG_INFO, TAG_VCM, "@@@ [Manager] specific engine request. engine app id(%s), event(%s), request(%s)", engine_app_id, event, request);
1602 if (NULL == engine_app_id || NULL == event) {
1603 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid parameter");
1604 return VC_ERROR_INVALID_PARAMETER;
1607 if (NULL == request) {
1608 SLOG(LOG_ERROR, TAG_VCM, "[INFO] Input parameter is NULL. (no request)");
1612 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
1613 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1614 return VC_ERROR_INVALID_STATE;
1618 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
1620 /* Check service state */
1621 vc_service_state_e service_state = -1;
1622 vc_mgr_client_get_service_state(g_vc_m, &service_state);
1623 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);
1625 ret = vc_mgr_tidl_send_specific_engine_request(g_vc_m->handle, engine_app_id, event, request);
1627 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to specific engine request : %s", __vc_mgr_get_error_code(ret));
1630 SLOG(LOG_INFO, TAG_VCM, "[SUCCESS] specific engine request");
1632 SLOG(LOG_DEBUG, TAG_VCM, "@@@ [Manager] send specific engine request DONE");
1634 return VC_ERROR_NONE;
1637 int vc_mgr_start(bool exclusive_command_option)
1639 SLOG(LOG_ERROR, TAG_VCM, "@@@ [Manager] Request start");
1642 ret = __check_mgr_feature_privilege();
1643 if (VC_ERROR_NONE != ret)
1647 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
1648 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1649 return VC_ERROR_INVALID_STATE;
1653 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
1655 /* Check service state */
1656 vc_service_state_e service_state = -1;
1657 vc_mgr_client_get_service_state(g_vc_m, &service_state);
1658 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);
1660 /* Check internal state for async */
1661 vc_internal_state_e internal_state = -1;
1662 vc_mgr_client_get_internal_state(g_vc_m, &internal_state);
1663 if (internal_state != VC_INTERNAL_STATE_NONE) {
1664 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State : Internal state is NOT none : %d", internal_state);
1665 return VC_ERROR_IN_PROGRESS_TO_RECORDING;
1668 vc_mgr_client_set_exclusive_command(g_vc_m, exclusive_command_option);
1670 bool start_by_client = false;
1671 if (0 != vc_mgr_client_get_start_by_client(g_vc_m, &start_by_client)) {
1672 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get start by client");
1675 int disabled_cmd_type = 0;
1676 if (0 != vc_mgr_client_get_disabled_command_type(g_vc_m, &disabled_cmd_type)) {
1677 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get disabled command type");
1680 vc_recognition_mode_e recognition_mode = VC_RECOGNITION_MODE_STOP_BY_SILENCE;
1681 if (0 != vc_mgr_get_recognition_mode(&recognition_mode)) {
1682 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get recognition mode");
1687 vc_mgr_client_set_internal_state(g_vc_m, VC_INTERNAL_STATE_STARTING);
1688 ret = vc_mgr_tidl_request_start(g_vc_m->handle, (int)recognition_mode, exclusive_command_option, start_by_client, disabled_cmd_type);
1690 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to start request start : %s", __vc_mgr_get_error_code(ret));
1691 vc_mgr_client_set_internal_state(g_vc_m, VC_INTERNAL_STATE_NONE);
1693 SLOG(LOG_INFO, TAG_VCM, "[SUCCESS] start recognition");
1697 g_prev_volume_db = 0;
1698 g_cur_volume_db = 0;
1700 SLOG(LOG_ERROR, TAG_VCM, "@@@ [Manager] Request start DONE, ret(%d)", ret);
1705 int vc_mgr_stop(void)
1707 SLOG(LOG_ERROR, TAG_VCM, "@@@ [Manager] Request stop");
1710 ret = __check_mgr_feature_privilege();
1711 if (VC_ERROR_NONE != ret)
1715 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
1716 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1717 return VC_ERROR_INVALID_STATE;
1721 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
1723 /* Check service state */
1724 vc_service_state_e service_state = -1;
1725 vc_mgr_client_get_service_state(g_vc_m, &service_state);
1726 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);
1728 /* Check internal state for async */
1729 vc_internal_state_e internal_state = -1;
1730 vc_mgr_client_get_internal_state(g_vc_m, &internal_state);
1731 if (VC_INTERNAL_STATE_STARTING == internal_state) {
1732 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State : Internal state is STARTING");
1733 return VC_ERROR_IN_PROGRESS_TO_RECORDING;
1734 } else if (VC_INTERNAL_STATE_STOPPING == internal_state) {
1735 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State : Internal state is STOPPING");
1736 return VC_ERROR_IN_PROGRESS_TO_PROCESSING;
1737 } else if (VC_INTERNAL_STATE_CANCELING == internal_state) {
1738 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State : Internal state is CANCELING");
1739 return VC_ERROR_IN_PROGRESS_TO_READY;
1744 vc_mgr_client_set_internal_state(g_vc_m, VC_INTERNAL_STATE_STOPPING);
1745 ret = vc_mgr_tidl_request_stop(g_vc_m->handle);
1747 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to stop request : %s", __vc_mgr_get_error_code(ret));
1748 vc_mgr_client_set_internal_state(g_vc_m, VC_INTERNAL_STATE_NONE);
1750 SLOG(LOG_INFO, TAG_VCM, "[SUCCESS] Stop recognition");
1753 SLOG(LOG_DEBUG, TAG_VCM, "@@@ [Manager] Request stop DONE");
1758 int vc_mgr_cancel(void)
1760 SLOG(LOG_INFO, TAG_VCM, "@@@ [Manager] Request cancel");
1763 ret = __check_mgr_feature_privilege();
1764 if (VC_ERROR_NONE != ret)
1768 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
1769 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1770 return VC_ERROR_INVALID_STATE;
1774 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
1776 /* Check service state */
1777 vc_service_state_e service_state = -1;
1778 vc_mgr_client_get_service_state(g_vc_m, &service_state);
1779 RETVM_IF(service_state == VC_SERVICE_STATE_NONE, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state is NONE");
1781 vc_internal_state_e internal_state = -1;
1782 vc_mgr_client_get_internal_state(g_vc_m, &internal_state);
1783 if (VC_INTERNAL_STATE_STARTING == internal_state) {
1784 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State : Internal state is STARTING");
1785 return VC_ERROR_IN_PROGRESS_TO_RECORDING;
1786 } else if (VC_INTERNAL_STATE_STOPPING == internal_state) {
1787 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State : Internal state is STOPPING");
1788 return VC_ERROR_IN_PROGRESS_TO_PROCESSING;
1789 } else if (VC_INTERNAL_STATE_CANCELING == internal_state) {
1790 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State : Internal state is CANCELING");
1791 return VC_ERROR_IN_PROGRESS_TO_READY;
1795 vc_mgr_client_set_internal_state(g_vc_m, VC_INTERNAL_STATE_CANCELING);
1796 ret = vc_mgr_tidl_request_cancel(g_vc_m->handle);
1798 SLOG(LOG_DEBUG, TAG_VCM, "[ERROR] Fail to cancel request : %s", __vc_mgr_get_error_code(ret));
1799 vc_mgr_client_set_internal_state(g_vc_m, VC_INTERNAL_STATE_NONE);
1801 SLOG(LOG_INFO, TAG_VCM, "[SUCCESS] Cancel recognition");
1804 vc_mgr_client_set_exclusive_command(g_vc_m, false);
1806 SLOG(LOG_DEBUG, TAG_VCM, "@@@ [Manager] Request cancel DONE");
1811 static int g_cnt = 0;
1812 static Eina_Bool __vc_mgr_set_volume_timer_cb(void* data)
1815 g_volume_db = g_prev_volume_db + (g_cur_volume_db - g_prev_volume_db) / 5 * g_cnt;
1817 SLOG(LOG_INFO, TAG_VCM, "Set volume (%f)(%f)", g_volume_db, g_cur_volume_db);
1819 if (0 == g_cnt % 5) {
1825 int __vc_mgr_cb_set_volume(float volume)
1827 // called in vc_mgr_tidl
1828 g_prev_volume_db = g_volume_db;
1829 g_cur_volume_db = volume;
1831 g_volume_db = g_prev_volume_db + (g_cur_volume_db - g_prev_volume_db) / 5;
1833 if (NULL != g_m_set_volume_timer) {
1834 ecore_timer_del(g_m_set_volume_timer);
1838 g_m_set_volume_timer = ecore_timer_add(0.05, __vc_mgr_set_volume_timer_cb, NULL);
1840 return VC_ERROR_NONE;
1843 int __vc_mgr_set_volume(float volume)
1845 // called by app directly
1846 g_volume_db = volume;
1848 return VC_ERROR_NONE;
1851 int vc_mgr_get_recording_volume(float* volume)
1854 ret = __check_mgr_feature_privilege();
1855 if (VC_ERROR_NONE != ret)
1858 RETVM_IF(NULL == volume, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Invalid parameter");
1860 vc_service_state_e service_state = -1;
1861 if (0 != vc_mgr_client_get_service_state(g_vc_m, &service_state)) {
1862 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1863 return VC_ERROR_INVALID_STATE;
1867 RETVM_IF(VC_SERVICE_STATE_RECORDING != service_state, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Service state is not 'RECORDING'");
1869 *volume = g_volume_db;
1871 return VC_ERROR_NONE;
1874 int __vc_mgr_cb_set_foreground(int pid, bool value)
1876 vc_mgr_client_set_foreground(g_vc_m, pid, value);
1878 /* get authorized valid app */
1880 if (0 != vc_mgr_client_get_valid_authorized_client(g_vc_m, &tmp_pid)) {
1881 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get authorized valid app");
1882 return VC_ERROR_INVALID_PARAMETER;
1885 if (true == value) {
1886 /* compare & set valid */
1887 if (tmp_pid != pid) {
1888 SLOG(LOG_INFO, TAG_VCM, "Authority(%d) changed to invalid", tmp_pid);
1890 /* set authorized valid */
1891 if (true == vc_mgr_client_is_authorized_client(g_vc_m, pid)) {
1892 SLOG(LOG_DEBUG, TAG_VCM, "Authority(%d) change to valid", pid);
1893 vc_mgr_client_set_valid_authorized_client(g_vc_m, pid);
1895 SLOG(LOG_DEBUG, TAG_VCM, "No valid Authority");
1896 vc_mgr_client_set_valid_authorized_client(g_vc_m, -1);
1900 if (tmp_pid == pid) {
1901 SLOG(LOG_INFO, TAG_VCM, "Authority(%d) changed to invalid", tmp_pid);
1902 vc_mgr_client_set_valid_authorized_client(g_vc_m, -1);
1906 return VC_ERROR_NONE;
1909 int vc_mgr_set_selected_results(vc_cmd_list_h vc_cmd_list)
1911 SLOG(LOG_INFO, TAG_VCM, "@@@ [Manager] Select result");
1914 ret = __check_mgr_feature_privilege();
1915 if (VC_ERROR_NONE != ret)
1918 /* Do not check state for 'restart continuously' mode */
1920 vc_service_state_e service_state = -1;
1921 vc_mgr_client_get_service_state(g_vc_m, &service_state);
1922 if (service_state != VC_SERVICE_STATE_PROCESSING) {
1923 vc_recognition_mode_e recognition_mode;
1924 vc_mgr_get_recognition_mode(&recognition_mode);
1926 if (VC_RECOGNITION_MODE_RESTART_CONTINUOUSLY != recognition_mode) {
1927 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: service state is not 'PROCESSING' and mode is not 'Restart continuously'");
1928 return VC_ERROR_INVALID_STATE;
1932 if (NULL != vc_cmd_list) {
1934 char* result_text = NULL;
1936 vc_mgr_client_get_all_result(g_vc_m, &event, &result_text);
1938 vc_info_parser_set_result(result_text, event, NULL, vc_cmd_list, false);
1940 if (NULL != result_text) {
1947 ret = vc_mgr_tidl_send_result_selection(g_vc_m->handle);
1949 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to send result selection : %s", __vc_mgr_get_error_code(ret));
1952 SLOG(LOG_INFO, TAG_VCM, "[SUCCESS] result selection");
1955 vc_mgr_client_unset_all_result(g_vc_m);
1957 SLOG(LOG_DEBUG, TAG_VCM, "@@@ [Manager] Select result DONE");
1959 return VC_ERROR_NONE;
1962 static Eina_Bool __vc_mgr_set_select_result(void *data)
1964 vc_mgr_set_selected_results(NULL);
1968 static void __vc_mgr_notify_all_result(vc_result_type_e result_type)
1970 char* temp_text = NULL;
1972 char* temp_message = NULL;
1973 vc_cmd_list_h vc_cmd_list = NULL;
1975 vc_mgr_all_result_cb all_callback = NULL;
1976 void* all_user_data = NULL;
1978 vc_mgr_client_get_all_result_cb(g_vc_m, &all_callback, &all_user_data);
1979 RETM_IF(NULL == all_callback, TAG_VCM, "[ERROR] All result callback is NULL");
1981 if (0 != vc_cmd_list_create(&vc_cmd_list)) {
1982 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to create command list");
1986 vc_info_parser_get_result(&temp_text, &event, &temp_message, -1, vc_cmd_list, vc_mgr_client_get_exclusive_command(g_vc_m));
1988 SECURE_SLOG(LOG_INFO, TAG_VCM, "Result info : result type(%d) result text(%s) event(%d) result_message(%s)",
1989 result_type, temp_text, event, temp_message);
1991 vc_cmd_print_list(vc_cmd_list);
1993 bool cb_ret = false;
1995 vc_mgr_client_set_all_result(g_vc_m, event, temp_text);
1997 vc_mgr_client_use_callback(g_vc_m);
1998 cb_ret = all_callback(event, vc_cmd_list, temp_text, temp_message, all_user_data);
1999 vc_mgr_client_not_use_callback(g_vc_m);
2001 if (true == vc_mgr_client_get_exclusive_command(g_vc_m)) {
2003 vc_result_cb callback = NULL;
2004 void* user_data = NULL;
2006 vc_mgr_client_get_result_cb(g_vc_m, &callback, &user_data);
2007 RETM_IF(NULL == callback, TAG_VCM, "[ERROR] Client result callback is NULL");
2009 vc_mgr_client_use_callback(g_vc_m);
2010 callback(event, vc_cmd_list, temp_text, user_data);
2011 vc_mgr_client_not_use_callback(g_vc_m);
2012 SLOG(LOG_DEBUG, TAG_VCM, "Exclusive result callback called");
2014 /* Release result */
2015 if (NULL != temp_text) {
2019 if (NULL != temp_message) {
2021 temp_message = NULL;
2026 vc_cmd_list_destroy(vc_cmd_list, true);
2029 vc_mgr_client_set_exclusive_command(g_vc_m, false);
2035 vc_cmd_list_get_count(vc_cmd_list, &count);
2037 if (true == cb_ret) {
2038 SLOG(LOG_INFO, TAG_VCM, "Callback result is true");
2039 if (VC_RESULT_TYPE_NOTIFICATION != result_type)
2040 ecore_idler_add(__vc_mgr_set_select_result, NULL);
2042 SLOG(LOG_INFO, TAG_VCM, "Callback result is false");
2043 /* need to select conflicted result */
2046 if (VC_RESULT_TYPE_NOTIFICATION != result_type)
2047 ecore_idler_add(__vc_mgr_set_select_result, NULL);
2049 vc_mgr_client_set_exclusive_command(g_vc_m, false);
2050 vc_mgr_client_unset_all_result(g_vc_m);
2053 /* Release result */
2054 if (NULL != temp_text) {
2058 if (NULL != temp_message) {
2060 temp_message = NULL;
2065 vc_cmd_list_destroy(vc_cmd_list, true);
2071 static Eina_Bool __vc_mgr_notify_result(void *data)
2073 char* temp_text = NULL;
2075 vc_cmd_list_h vc_cmd_list = NULL;
2077 vc_result_cb callback = NULL;
2078 void* user_data = NULL;
2080 vc_mgr_client_get_result_cb(g_vc_m, &callback, &user_data);
2081 RETVM_IF(NULL == callback, EINA_FALSE, TAG_VCM, "[ERROR] Client result callback is NULL");
2083 if (0 != vc_cmd_list_create(&vc_cmd_list)) {
2084 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to create command list");
2088 vc_info_parser_get_result(&temp_text, &event, NULL, getpid(), vc_cmd_list, false);
2090 SECURE_SLOG(LOG_INFO, TAG_VCM, "Result : result text(%s) event(%d)", temp_text, event);
2092 vc_cmd_print_list(vc_cmd_list);
2094 vc_mgr_client_use_callback(g_vc_m);
2095 callback(event, vc_cmd_list, temp_text, user_data);
2096 vc_mgr_client_not_use_callback(g_vc_m);
2097 SLOG(LOG_INFO, TAG_VCM, "Result callback called");
2100 vc_cmd_list_destroy(vc_cmd_list, true);
2103 /* Release result */
2111 void __vc_mgr_cb_all_result(vc_result_type_e type)
2113 if (false == vc_mgr_client_get_exclusive_command(g_vc_m)) {
2114 __vc_mgr_notify_all_result(type);
2116 __vc_mgr_notify_result(0);
2122 void __vc_mgr_cb_pre_result(vc_pre_result_event_e event, const char* pre_result)
2124 vc_mgr_pre_result_cb callback = NULL;
2125 void* user_data = NULL;
2127 vc_mgr_client_get_pre_result_cb(g_vc_m, &callback, &user_data);
2128 RETM_IF(NULL == callback, TAG_VCM, "[ERROR] Client pre result callback is NULL");
2130 vc_mgr_client_use_callback(g_vc_m);
2131 callback(event, pre_result, user_data);
2132 vc_mgr_client_not_use_callback(g_vc_m);
2133 SLOG(LOG_INFO, TAG_VCM, "Pre result callback is called");
2138 void __vc_mgr_cb_system_result()
2140 __vc_mgr_notify_result(NULL);
2144 static Eina_Bool __vc_mgr_speech_detected(void *data)
2146 vc_mgr_begin_speech_detected_cb callback = NULL;
2147 void* user_data = NULL;
2149 vc_mgr_client_get_speech_detected_cb(g_vc_m, &callback, &user_data);
2150 RETVM_IF(NULL == callback, EINA_FALSE, TAG_VCM, "[ERROR] Client speech detected callback is NULL");
2152 vc_mgr_client_use_callback(g_vc_m);
2153 callback(user_data);
2154 vc_mgr_client_not_use_callback(g_vc_m);
2155 SLOG(LOG_INFO, TAG_VCM, "Speech detected callback called");
2160 void __vc_mgr_cb_speech_detected()
2162 __vc_mgr_speech_detected(NULL);
2167 int vc_mgr_set_all_result_cb(vc_mgr_all_result_cb callback, void* user_data)
2170 ret = __check_mgr_feature_privilege();
2171 if (VC_ERROR_NONE != ret)
2174 RETVM_IF(NULL == callback, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Invalid parameter");
2177 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
2178 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set result callback : A handle is not available");
2179 return VC_ERROR_INVALID_STATE;
2183 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
2185 vc_mgr_client_set_all_result_cb(g_vc_m, callback, user_data);
2187 SLOG(LOG_INFO, TAG_VCM, "[SUCCESS] Set all result callback");
2189 return VC_ERROR_NONE;
2192 int vc_mgr_unset_all_result_cb(void)
2195 ret = __check_mgr_feature_privilege();
2196 if (VC_ERROR_NONE != ret)
2200 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
2201 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset result callback : A handle is not available");
2202 return VC_ERROR_INVALID_STATE;
2206 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
2208 vc_mgr_client_set_all_result_cb(g_vc_m, NULL, NULL);
2210 return VC_ERROR_NONE;
2213 int vc_mgr_set_result_cb(vc_result_cb callback, void* user_data)
2216 ret = __check_mgr_feature_privilege();
2217 if (VC_ERROR_NONE != ret)
2220 RETVM_IF(NULL == callback, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Invalid parameter");
2223 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
2224 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set result callback : A handle is not available");
2225 return VC_ERROR_INVALID_STATE;
2229 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
2231 vc_mgr_client_set_result_cb(g_vc_m, callback, user_data);
2233 return VC_ERROR_NONE;
2236 int vc_mgr_unset_result_cb(void)
2239 ret = __check_mgr_feature_privilege();
2240 if (VC_ERROR_NONE != ret)
2244 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
2245 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset result callback : A handle is not available");
2246 return VC_ERROR_INVALID_STATE;
2250 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
2252 vc_mgr_client_set_result_cb(g_vc_m, NULL, NULL);
2254 return VC_ERROR_NONE;
2257 int vc_mgr_set_pre_result_cb(vc_mgr_pre_result_cb callback, void* user_data)
2260 ret = __check_mgr_feature_privilege();
2261 if (VC_ERROR_NONE != ret)
2264 RETVM_IF(NULL == callback, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Invalid parameter");
2267 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
2268 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set pre result callback : A handle is not available");
2269 return VC_ERROR_INVALID_STATE;
2273 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
2275 vc_mgr_client_set_pre_result_cb(g_vc_m, callback, user_data);
2277 return VC_ERROR_NONE;
2280 int vc_mgr_unset_pre_result_cb(void)
2283 ret = __check_mgr_feature_privilege();
2284 if (VC_ERROR_NONE != ret)
2288 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
2289 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset pre result callback : A handle is not available");
2290 return VC_ERROR_INVALID_STATE;
2294 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
2296 vc_mgr_client_set_pre_result_cb(g_vc_m, NULL, NULL);
2298 return VC_ERROR_NONE;
2301 int vc_mgr_get_error_message(char** err_msg)
2303 SLOG(LOG_DEBUG, TAG_VCM, "@@@ [Manager] Get error message");
2306 ret = __check_mgr_feature_privilege();
2307 if (VC_ERROR_NONE != ret)
2312 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
2313 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] vc_mgr handle is not available");
2314 return VC_ERROR_INVALID_STATE;
2317 RETVM_IF(NULL == err_msg, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Invalid parameter");
2319 if (false == g_err_callback_status) {
2320 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Not in error callback");
2321 return VC_ERROR_OPERATION_FAILED;
2324 ret = vc_mgr_client_get_error_message(g_vc_m, err_msg);
2326 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get error message");
2329 SLOG(LOG_DEBUG, TAG_VCM, "@@@ [Manager] Get error message DONE");
2334 static void __vc_mgr_notify_error(void *data)
2336 vc_h vc_m = (vc_h)data;
2338 vc_error_cb callback = NULL;
2339 void* user_data = NULL;
2342 vc_mgr_client_get_error_cb(vc_m, &callback, &user_data);
2343 vc_mgr_client_get_error(vc_m, &reason);
2345 if (NULL != callback) {
2346 vc_mgr_client_use_callback(vc_m);
2347 g_err_callback_status = true;
2348 callback(reason, user_data);
2349 g_err_callback_status = false;
2350 vc_mgr_client_not_use_callback(vc_m);
2351 SLOG(LOG_INFO, TAG_VCM, "Error callback is called");
2353 SLOG(LOG_WARN, TAG_VCM, "[WARNING] Error callback is null");
2357 int __vc_mgr_cb_error(int reason, int daemon_pid, char* msg)
2360 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
2361 SLOG(LOG_ERROR, TAG_VCM, "[WARNING] Invalid client");
2362 return VC_ERROR_INVALID_PARAMETER;
2366 if (state != VC_STATE_INITIALIZED && state != VC_STATE_READY) {
2367 SLOG(LOG_ERROR, TAG_VCM, "[WARNING] not connected client yet");
2368 return VC_ERROR_INVALID_STATE;
2371 vc_mgr_client_set_internal_state(g_vc_m, VC_INTERNAL_STATE_NONE);
2373 if (VC_ERROR_SERVICE_RESET == reason) {
2374 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] VC daemon reset");
2376 vc_service_state_e service_state = -1;
2377 vc_mgr_client_get_service_state(g_vc_m, &service_state);
2378 if (VC_SERVICE_STATE_UPDATING == service_state) {
2379 SLOG(LOG_INFO, TAG_VCM, "[INFO] VC daemon is terminated by update manager");
2380 return VC_ERROR_NONE;
2383 vc_mgr_client_set_client_state(g_vc_m, VC_STATE_INITIALIZED);
2384 __vc_mgr_notify_state_changed(g_vc_m);
2386 if (0 != vc_mgr_prepare()) {
2387 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to prepare");
2391 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Error reason(%d), msg(%s)", reason, msg);
2393 vc_mgr_client_set_error(g_vc_m, reason);
2394 vc_mgr_client_set_error_message(g_vc_m, msg);
2395 __vc_mgr_notify_error(g_vc_m);
2397 return VC_ERROR_NONE;
2400 static Eina_Bool __vc_mgr_notify_state_changed(void *data)
2402 vc_state_changed_cb changed_callback = NULL;
2405 vc_mgr_client_get_state_changed_cb(g_vc_m, &changed_callback, &user_data);
2407 vc_state_e current_state;
2408 vc_state_e previous_state;
2410 vc_mgr_client_get_previous_state(g_vc_m, ¤t_state, &previous_state);
2412 if (NULL != changed_callback) {
2413 vc_mgr_client_use_callback(g_vc_m);
2414 changed_callback(previous_state, current_state, user_data);
2415 vc_mgr_client_not_use_callback(g_vc_m);
2416 SLOG(LOG_INFO, TAG_VCM, "State changed callback is called");
2418 SLOG(LOG_WARN, TAG_VCM, "[WARNING] State changed callback is null");
2424 int vc_mgr_set_state_changed_cb(vc_state_changed_cb callback, void* user_data)
2427 ret = __check_mgr_feature_privilege();
2428 if (VC_ERROR_NONE != ret)
2431 if (callback == NULL)
2432 return VC_ERROR_INVALID_PARAMETER;
2435 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
2436 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set state changed callback : A handle is not available");
2437 return VC_ERROR_INVALID_STATE;
2441 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
2443 vc_mgr_client_set_state_changed_cb(g_vc_m, callback, user_data);
2445 SLOG(LOG_INFO, TAG_VCM, "[SUCCESS] Set state changed callback");
2446 return VC_ERROR_NONE;
2449 int vc_mgr_unset_state_changed_cb(void)
2452 ret = __check_mgr_feature_privilege();
2453 if (VC_ERROR_NONE != ret)
2457 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
2458 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset state changed callback : A handle is not available");
2459 return VC_ERROR_INVALID_STATE;
2463 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
2465 vc_mgr_client_set_state_changed_cb(g_vc_m, NULL, NULL);
2467 return VC_ERROR_NONE;
2470 int __vc_mgr_cb_service_state(int state)
2472 vc_service_state_e current_state = (vc_service_state_e)state;
2473 vc_service_state_e previous_state;
2474 vc_mgr_client_get_service_state(g_vc_m, &previous_state);
2476 SLOG(LOG_INFO, TAG_VCM, "Service State changed : previous(%d) current(%d)",
2477 previous_state, current_state);
2479 vc_internal_state_e internal_state = -1;
2480 vc_mgr_client_get_internal_state(g_vc_m, &internal_state);
2481 if ((VC_INTERNAL_STATE_STARTING == internal_state && VC_SERVICE_STATE_RECORDING == current_state) ||
2482 (VC_INTERNAL_STATE_STOPPING == internal_state && VC_SERVICE_STATE_PROCESSING == current_state) ||
2483 (VC_INTERNAL_STATE_CANCELING == internal_state && VC_SERVICE_STATE_READY == current_state)) {
2484 SLOG(LOG_INFO, TAG_VCM, "Internal state is changed to NONE");
2485 vc_mgr_client_set_internal_state(g_vc_m, VC_INTERNAL_STATE_NONE);
2487 if (VC_SERVICE_STATE_UPDATING == current_state) {
2488 SLOG(LOG_INFO, TAG_VCM, "Internal state is changed to NONE by updating");
2489 vc_mgr_client_set_internal_state(g_vc_m, VC_INTERNAL_STATE_NONE);
2492 if (current_state == previous_state) {
2493 SLOG(LOG_WARN, TAG_VCM, "Service State NOT changed : previous(%d) current(%d)",
2494 previous_state, current_state);
2495 return VC_ERROR_NONE;
2498 /* Save service state */
2499 vc_mgr_client_set_service_state(g_vc_m, current_state);
2501 vc_service_state_changed_cb callback = NULL;
2502 void* service_user_data = NULL;
2503 vc_mgr_client_get_service_state_changed_cb(g_vc_m, &callback, &service_user_data);
2505 if (NULL != callback) {
2506 vc_mgr_client_use_callback(g_vc_m);
2507 callback(previous_state, current_state, service_user_data);
2508 vc_mgr_client_not_use_callback(g_vc_m);
2509 SLOG(LOG_INFO, TAG_VCM, "Service state changed callback is called");
2511 SLOG(LOG_WARN, TAG_VCM, "[WARNING] Service state changed callback is null");
2514 return VC_ERROR_NONE;
2517 int vc_mgr_set_service_state_changed_cb(vc_service_state_changed_cb callback, void* user_data)
2520 ret = __check_mgr_feature_privilege();
2521 if (VC_ERROR_NONE != ret)
2524 if (callback == NULL)
2525 return VC_ERROR_INVALID_PARAMETER;
2528 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
2529 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set state changed callback : A handle is not available");
2530 return VC_ERROR_INVALID_STATE;
2534 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
2536 vc_mgr_client_set_service_state_changed_cb(g_vc_m, callback, user_data);
2538 SLOG(LOG_INFO, TAG_VCM, "[SUCCESS] Set service state changed callback");
2539 return VC_ERROR_NONE;
2542 int vc_mgr_unset_service_state_changed_cb(void)
2545 ret = __check_mgr_feature_privilege();
2546 if (VC_ERROR_NONE != ret)
2550 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
2551 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset state changed callback : A handle is not available");
2552 return VC_ERROR_INVALID_STATE;
2556 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
2558 vc_mgr_client_set_service_state_changed_cb(g_vc_m, NULL, NULL);
2559 return VC_ERROR_NONE;
2562 int vc_mgr_set_speech_detected_cb(vc_mgr_begin_speech_detected_cb callback, void* user_data)
2565 ret = __check_mgr_feature_privilege();
2566 if (VC_ERROR_NONE != ret)
2569 if (callback == NULL)
2570 return VC_ERROR_INVALID_PARAMETER;
2573 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
2574 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set state changed callback : A handle is not available");
2575 return VC_ERROR_INVALID_STATE;
2579 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
2581 vc_mgr_client_set_speech_detected_cb(g_vc_m, callback, user_data);
2583 SLOG(LOG_INFO, TAG_VCM, "[SUCCESS] Set speech detected callback");
2584 return VC_ERROR_NONE;
2587 int vc_mgr_unset_speech_detected_cb(void)
2590 ret = __check_mgr_feature_privilege();
2591 if (VC_ERROR_NONE != ret)
2595 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
2596 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset state changed callback : A handle is not available");
2597 return VC_ERROR_INVALID_STATE;
2601 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
2603 vc_mgr_client_set_speech_detected_cb(g_vc_m, NULL, NULL);
2604 return VC_ERROR_NONE;
2607 int vc_mgr_set_current_language_changed_cb(vc_current_language_changed_cb callback, void* user_data)
2610 ret = __check_mgr_feature_privilege();
2611 if (VC_ERROR_NONE != ret)
2614 RETVM_IF(NULL == callback, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Invalid parameter");
2617 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
2618 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set current language changed : A handle is not available");
2619 return VC_ERROR_INVALID_STATE;
2623 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
2625 vc_mgr_client_set_current_lang_changed_cb(g_vc_m, callback, user_data);
2627 SLOG(LOG_INFO, TAG_VCM, "[SUCCESS] Set current language changed callback");
2628 return VC_ERROR_NONE;
2631 int vc_mgr_unset_current_language_changed_cb(void)
2634 ret = __check_mgr_feature_privilege();
2635 if (VC_ERROR_NONE != ret)
2639 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
2640 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset current language changed : A handle is not available");
2641 return VC_ERROR_INVALID_STATE;
2645 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
2647 vc_mgr_client_set_current_lang_changed_cb(g_vc_m, NULL, NULL);
2649 return VC_ERROR_NONE;
2652 int vc_mgr_set_error_cb(vc_error_cb callback, void* user_data)
2655 ret = __check_mgr_feature_privilege();
2656 if (VC_ERROR_NONE != ret)
2659 RETVM_IF(NULL == callback, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Invalid parameter");
2662 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
2663 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set error callback : A handle is not available");
2664 return VC_ERROR_INVALID_STATE;
2668 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
2670 vc_mgr_client_set_error_cb(g_vc_m, callback, user_data);
2672 return VC_ERROR_NONE;
2675 int vc_mgr_unset_error_cb(void)
2678 ret = __check_mgr_feature_privilege();
2679 if (VC_ERROR_NONE != ret)
2683 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
2684 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset error callback : A handle is not available");
2685 return VC_ERROR_INVALID_STATE;
2689 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
2691 vc_mgr_client_set_error_cb(g_vc_m, NULL, NULL);
2693 return VC_ERROR_NONE;
2696 int __vc_mgr_cb_dialog(int pid, const char* disp_text, const char* utt_text, bool continuous)
2698 vc_mgr_dialog_request_cb callback = NULL;
2699 void* user_data = NULL;
2701 vc_mgr_client_get_dialog_request_cb(g_vc_m, &callback, &user_data);
2703 if (NULL != callback) {
2704 vc_mgr_client_use_callback(g_vc_m);
2705 callback(pid, disp_text, utt_text, continuous, user_data);
2706 vc_mgr_client_not_use_callback(g_vc_m);
2707 SLOG(LOG_INFO, TAG_VCM, "Dialog callback is called, disp_text(%s), utt)text(%s), continuous(%d)", disp_text, utt_text, continuous);
2709 SLOG(LOG_WARN, TAG_VCM, "[WARNING] Error callback is null");
2712 return VC_ERROR_NONE;
2715 int __vc_mgr_cb_private_data_set(const char* key, const char* data)
2717 vc_mgr_private_data_set_cb callback = NULL;
2718 void* user_data = NULL;
2721 vc_mgr_client_get_private_data_set_cb(g_vc_m, &callback, &user_data);
2723 if (NULL != callback) {
2724 vc_mgr_client_use_callback(g_vc_m);
2725 ret = callback(key, data, user_data);
2726 vc_mgr_client_not_use_callback(g_vc_m);
2727 SLOG(LOG_INFO, TAG_VCM, "Private data set callback is called");
2729 SLOG(LOG_WARN, TAG_VCM, "[WARNING] Private data set callback is null");
2735 int __vc_mgr_cb_private_data_requested(const char* key, char** data)
2737 vc_mgr_private_data_requested_cb callback = NULL;
2738 void* user_data = NULL;
2741 vc_mgr_client_get_private_data_requested_cb(g_vc_m, &callback, &user_data);
2743 if (NULL != callback) {
2744 vc_mgr_client_use_callback(g_vc_m);
2745 ret = callback(key, data, user_data);
2746 vc_mgr_client_not_use_callback(g_vc_m);
2747 SLOG(LOG_INFO, TAG_VCM, "Private data requested callback is called");
2749 SLOG(LOG_WARN, TAG_VCM, "[WARNING] Private data requested callback is null");
2755 /* for TTS feedback */
2756 int __vc_mgr_cb_feedback_audio_format(int rate, vc_audio_channel_e channel, vc_audio_type_e audio_type)
2758 vc_mgr_feedback_audio_format_cb callback = NULL;
2759 void* user_data = NULL;
2761 /* set global audio formats */
2762 g_feedback_rate = rate;
2763 g_feedback_audio_channel = channel;
2764 g_feedback_audio_type = audio_type;
2766 vc_mgr_client_get_feedback_audio_format_cb(g_vc_m, &callback, &user_data);
2768 if (NULL != callback) {
2769 vc_mgr_client_use_callback(g_vc_m);
2770 callback(rate, channel, audio_type, user_data);
2771 vc_mgr_client_not_use_callback(g_vc_m);
2772 SLOG(LOG_INFO, TAG_VCM, "TTS feedback audio format callback is called");
2774 SLOG(LOG_WARN, TAG_VCM, "[WARNING] TTS feedback audio format callback is null");
2777 return VC_ERROR_NONE;
2780 int __vc_mgr_cb_feedback_streaming(int pid, int utt_id, vc_feedback_event_e event, char* buffer, int len)
2782 /* add feedback data */
2783 vc_feedback_data_s* temp_feedback_data = NULL;
2784 temp_feedback_data = (vc_feedback_data_s*)calloc(1, sizeof(vc_feedback_data_s));
2785 RETVM_IF(NULL == temp_feedback_data, VC_ERROR_OUT_OF_MEMORY, TAG_VCM, "[ERROR] Out of memory");
2786 SLOG(LOG_INFO, TAG_VCM, "[INFO] feedback streaming before queing");
2788 temp_feedback_data->data = NULL;
2789 temp_feedback_data->rate = g_feedback_rate;
2790 temp_feedback_data->data_size = 0;
2793 temp_feedback_data->data = (char*)calloc(len + 5, sizeof(char));
2794 if (NULL != temp_feedback_data->data) {
2795 memcpy(temp_feedback_data->data, buffer, len);
2796 temp_feedback_data->data_size = len;
2797 SLOG(LOG_DEBUG, TAG_VCM, "[DEBUG][memcpy] data(%p) size(%d)",
2798 temp_feedback_data->data, temp_feedback_data->data_size);
2800 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] fail to allocate memory");
2803 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] feedback data is NULL");
2806 temp_feedback_data->pid = pid;
2807 temp_feedback_data->utt_id = utt_id;
2808 temp_feedback_data->event = event;
2809 temp_feedback_data->audio_type = g_feedback_audio_type;
2810 temp_feedback_data->channel = g_feedback_audio_channel;
2812 SLOG(LOG_INFO, TAG_VCM, "[INFO] add feedback data, pid(%d), utt_id(%d), event(%d), audio_type(%d), channel(%d)", pid, utt_id, event, g_feedback_audio_type, g_feedback_audio_channel);
2814 int ret = vc_mgr_data_add_feedback_data(temp_feedback_data);
2816 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to add feedback data");
2817 if (NULL != temp_feedback_data->data) {
2818 free(temp_feedback_data->data);
2819 temp_feedback_data->data = NULL;
2821 if (NULL != temp_feedback_data) {
2822 free(temp_feedback_data);
2823 temp_feedback_data = NULL;
2831 int vc_mgr_set_dialog_request_cb(vc_mgr_dialog_request_cb callback, void* user_data)
2834 ret = __check_mgr_feature_privilege();
2835 if (VC_ERROR_NONE != ret)
2838 RETVM_IF(NULL == callback, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Invalid parameter");
2841 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
2842 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set error callback : A handle is not available");
2843 return VC_ERROR_INVALID_STATE;
2847 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
2849 vc_mgr_client_set_dialog_request_cb(g_vc_m, callback, user_data);
2851 return VC_ERROR_NONE;
2854 int vc_mgr_unset_dialog_request_cb(void)
2857 ret = __check_mgr_feature_privilege();
2858 if (VC_ERROR_NONE != ret)
2862 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
2863 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset error callback : A handle is not available");
2864 return VC_ERROR_INVALID_STATE;
2868 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
2870 vc_mgr_client_set_dialog_request_cb(g_vc_m, NULL, NULL);
2872 return VC_ERROR_NONE;
2875 int vc_mgr_set_private_data_set_cb(vc_mgr_private_data_set_cb callback, void* user_data)
2878 ret = __check_mgr_feature_privilege();
2879 if (VC_ERROR_NONE != ret)
2882 RETVM_IF(NULL == callback, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Invalid parameter");
2885 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
2886 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set private data set callback : A handle is not available");
2887 return VC_ERROR_INVALID_STATE;
2891 RETVM_IF(VC_STATE_INITIALIZED != state, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Set private data set callback : Current state is not 'Initialized'");
2893 vc_mgr_client_set_private_data_set_cb(g_vc_m, callback, user_data);
2895 return VC_ERROR_NONE;
2898 int vc_mgr_unset_private_data_set_cb(void)
2901 ret = __check_mgr_feature_privilege();
2902 if (VC_ERROR_NONE != ret)
2906 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
2907 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset private data set callback : A handle is not available");
2908 return VC_ERROR_INVALID_STATE;
2912 RETVM_IF(VC_STATE_INITIALIZED != state, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Unset private data set callback : Current state is not 'Initialized'");
2914 vc_mgr_client_set_private_data_set_cb(g_vc_m, NULL, NULL);
2916 return VC_ERROR_NONE;
2919 int vc_mgr_set_private_data_requested_cb(vc_mgr_private_data_requested_cb callback, void* user_data)
2922 ret = __check_mgr_feature_privilege();
2923 if (VC_ERROR_NONE != ret)
2926 RETVM_IF(NULL == callback, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Invalid parameter");
2929 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
2930 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set private data requested callback : A handle is not available");
2931 return VC_ERROR_INVALID_STATE;
2935 RETVM_IF(VC_STATE_INITIALIZED != state, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Set private data requested callback : Current state is not 'Initialized'");
2937 vc_mgr_client_set_private_data_requested_cb(g_vc_m, callback, user_data);
2939 return VC_ERROR_NONE;
2942 int vc_mgr_unset_private_data_requested_cb(void)
2945 ret = __check_mgr_feature_privilege();
2946 if (VC_ERROR_NONE != ret)
2950 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
2951 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset private data requested callback : A handle is not available");
2952 return VC_ERROR_INVALID_STATE;
2956 RETVM_IF(VC_STATE_INITIALIZED != state, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Unset private data requested callback : Current state is not 'Initialized'");
2958 vc_mgr_client_set_private_data_requested_cb(g_vc_m, NULL, NULL);
2960 return VC_ERROR_NONE;
2963 static bool __vc_mgr_check_demandable_client(int pid)
2965 if (0 == g_slist_length(g_demandable_client_list)) {
2966 SLOG(LOG_WARN, TAG_VCM, "[WARNING] No demandable clients");
2970 char appid[1024] = {'\0', };
2971 if (0 != aul_app_get_appid_bypid(pid, appid, sizeof(appid) - 1)) {
2972 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get callee appid by pid");
2975 SLOG(LOG_INFO, TAG_VCM, "[CHECK] Appid - %s", appid);
2977 GSList *iter = NULL;
2978 vc_demandable_client_s* temp_client;
2979 iter = g_slist_nth(g_demandable_client_list, 0);
2981 while (NULL != iter) {
2982 temp_client = iter->data;
2984 if (NULL != temp_client) {
2985 if (NULL != temp_client->appid) {
2986 if (!strcmp(temp_client->appid, appid)) {
2987 SLOG(LOG_DEBUG, TAG_VCM, "pid(%d) is available", pid);
2993 iter = g_slist_next(iter);
3000 int __vc_mgr_request_auth_enable(int pid)
3002 if (false == __vc_mgr_check_demandable_client(pid)) {
3003 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Not demandable client");
3004 return VC_ERROR_INVALID_PARAMETER;
3007 /* check already authorized */
3008 if (true == vc_mgr_client_is_authorized_client(g_vc_m, pid)) {
3009 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Already authorized");
3010 return VC_ERROR_INVALID_PARAMETER;
3013 /* add authorized list */
3014 if (0 != vc_mgr_client_add_authorized_client(g_vc_m, pid)) {
3015 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to add authorized client");
3016 return VC_ERROR_OPERATION_FAILED;
3019 /* foreground check */
3021 if (0 != vc_mgr_client_get_foreground(g_vc_m, &fore_pid)) {
3022 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get foreground");
3023 return VC_ERROR_OPERATION_FAILED;
3026 if (pid == fore_pid) {
3027 vc_mgr_client_set_valid_authorized_client(g_vc_m, pid);
3030 return VC_ERROR_NONE;
3033 int __vc_mgr_request_auth_disable(int pid)
3035 /* check authorized */
3036 if (false == vc_mgr_client_is_authorized_client(g_vc_m, pid)) {
3037 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] No authorized");
3038 return VC_ERROR_INVALID_PARAMETER;
3041 /* remove authorized list */
3042 if (0 != vc_mgr_client_remove_authorized_client(g_vc_m, pid)) {
3043 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to remove authorized client");
3044 return VC_ERROR_OPERATION_FAILED;
3047 /* check authority valid */
3048 if (true == vc_mgr_client_is_valid_authorized_client(g_vc_m, pid)) {
3049 SLOG(LOG_DEBUG, TAG_VCM, "Valid authorized client is removed");
3050 if (0 != vc_mgr_client_set_valid_authorized_client(g_vc_m, -1)) {
3051 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to set valid authorized client");
3052 return VC_ERROR_OPERATION_FAILED;
3056 return VC_ERROR_NONE;
3059 static Eina_Bool __request_auth_start(void* data)
3061 SLOG(LOG_INFO, TAG_VCM, "Request Start");
3063 if (0 != vc_mgr_client_set_start_by_client(g_vc_m, true)) {
3064 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to set start by client");
3067 if (0 != vc_mgr_start(false)) {
3068 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Request start is failed");
3069 /* TODO - Error handling? */
3072 if (0 != vc_mgr_client_set_start_by_client(g_vc_m, false)) {
3073 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to set start by client");
3080 int __vc_mgr_request_auth_start(int pid)
3082 /* check authorized */
3083 if (false == vc_mgr_client_is_valid_authorized_client(g_vc_m, pid)) {
3084 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] No valid authorized client");
3085 return VC_ERROR_INVALID_PARAMETER;
3088 /* add timer for start recording */
3089 ecore_timer_add(0, __request_auth_start, NULL);
3091 return VC_ERROR_NONE;
3094 static Eina_Bool __request_auth_stop(void* data)
3096 SLOG(LOG_INFO, TAG_VCM, "Request Stop");
3098 if (0 != vc_mgr_stop()) {
3099 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Request stop is failed");
3100 /* TODO - Error handling? */
3106 int __vc_mgr_request_auth_stop(int pid)
3108 /* check authorized */
3109 if (false == vc_mgr_client_is_valid_authorized_client(g_vc_m, pid)) {
3110 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] No valid authorized client");
3111 return VC_ERROR_INVALID_PARAMETER;
3114 /* add timer for start recording */
3115 ecore_timer_add(0, __request_auth_stop, NULL);
3117 return VC_ERROR_NONE;
3120 static Eina_Bool __request_auth_cancel(void* data)
3122 SLOG(LOG_INFO, TAG_VCM, "Request Cancel");
3124 if (0 != vc_mgr_cancel()) {
3125 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Request cancel is failed");
3126 /* TODO - Error handling? */
3132 int __vc_mgr_request_auth_cancel(int pid)
3134 /* check authorized */
3135 if (false == vc_mgr_client_is_valid_authorized_client(g_vc_m, pid)) {
3136 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] No valid authorized client");
3137 return VC_ERROR_INVALID_PARAMETER;
3140 /* add timer for start recording */
3141 ecore_timer_add(0, __request_auth_cancel, NULL);
3143 return VC_ERROR_NONE;
3146 int vc_mgr_set_specific_engine_result_cb(vc_mgr_specific_engine_result_cb callback, void* user_data)
3149 ret = __check_mgr_feature_privilege();
3150 if (VC_ERROR_NONE != ret)
3153 RETVM_IF(NULL == callback, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Invalid parameter");
3156 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
3157 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set specific engine result callback : A handle is not available");
3158 return VC_ERROR_INVALID_STATE;
3162 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
3164 vc_mgr_client_set_specific_engine_result_cb(g_vc_m, callback, user_data);
3166 return VC_ERROR_NONE;
3168 int vc_mgr_unset_specific_engine_result_cb(void)
3170 if (0 != __vc_mgr_get_feature_enabled()) {
3171 return VC_ERROR_NOT_SUPPORTED;
3175 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
3176 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset specific engine result callback : A handle is not available");
3177 return VC_ERROR_INVALID_STATE;
3181 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
3183 vc_mgr_client_set_specific_engine_result_cb(g_vc_m, NULL, NULL);
3185 return VC_ERROR_NONE;
3188 void __vc_mgr_cb_specific_engine_result(const char* engine_app_id, const char* event, const char* result)
3190 vc_mgr_specific_engine_result_cb callback = NULL;
3191 void* user_data = NULL;
3193 vc_mgr_client_get_specific_engine_result_cb(g_vc_m, &callback, &user_data);
3194 RETM_IF(NULL == callback, TAG_VCM, "[ERROR] Client specific engine result callback is NULL");
3196 vc_mgr_client_use_callback(g_vc_m);
3197 callback(engine_app_id, event, result, user_data);
3198 vc_mgr_client_not_use_callback(g_vc_m);
3199 SLOG(LOG_INFO, TAG_VCM, "Specific engine result callback is called, engine app id(%s), event(%s), result(%s)", engine_app_id, event, result);
3204 /* for TTS feedback */
3205 int vc_mgr_set_feedback_audio_format_cb(vc_mgr_feedback_audio_format_cb callback, void* user_data)
3207 SLOG(LOG_INFO, TAG_VCM, "@@@ [Manager] set feedback audio format");
3210 ret = __check_mgr_feature_privilege();
3211 if (VC_ERROR_NONE != ret)
3214 RETVM_IF(NULL == callback, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Invalid parameter");
3217 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
3218 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set feedback audio format callback : A handle is not available");
3219 return VC_ERROR_INVALID_STATE;
3223 RETVM_IF(VC_STATE_INITIALIZED != state, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Set feedback audio format callback : Current state is not 'Initialized'");
3225 vc_mgr_client_set_feedback_audio_format_cb(g_vc_m, callback, user_data);
3227 SLOG(LOG_INFO, TAG_VCM, "[SUCCESS] Set feedback audio format callback");
3229 return VC_ERROR_NONE;
3232 int vc_mgr_unset_feedback_audio_format_cb()
3234 SLOG(LOG_INFO, TAG_VCM, "@@@ [Manager] unset feedback audio format");
3237 ret = __check_mgr_feature_privilege();
3238 if (VC_ERROR_NONE != ret)
3242 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
3243 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset feedback audio format callback : A handle is not available");
3244 return VC_ERROR_INVALID_STATE;
3248 RETVM_IF(VC_STATE_INITIALIZED != state, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Unset feedback audio format callback : Current state is not 'Initialized'");
3250 vc_mgr_client_set_feedback_audio_format_cb(g_vc_m, NULL, NULL);
3252 SLOG(LOG_INFO, TAG_VCM, "[SUCCESS] Unset feedback audio format callback");
3254 return VC_ERROR_NONE;
3257 int vc_mgr_set_feedback_streaming_cb(vc_mgr_feedback_streaming_cb callback, void* user_data)
3259 SLOG(LOG_INFO, TAG_VCM, "@@@ [Manager] set feedback streaming");
3262 ret = __check_mgr_feature_privilege();
3263 if (VC_ERROR_NONE != ret)
3266 RETVM_IF(NULL == callback, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Invalid parameter");
3268 pthread_mutex_lock(&g_feedback_streaming_cb_mutex);
3271 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
3272 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set feedback streaming callback : A handle is not available");
3273 pthread_mutex_unlock(&g_feedback_streaming_cb_mutex);
3274 return VC_ERROR_INVALID_STATE;
3278 if (VC_STATE_INITIALIZED != state) {
3279 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set feedback streaming callback : Current state is not 'Initialized' (%d)", state);
3280 pthread_mutex_unlock(&g_feedback_streaming_cb_mutex);
3281 return VC_ERROR_INVALID_STATE;
3284 vc_mgr_client_set_feedback_streaming_cb(g_vc_m, callback, user_data);
3286 pthread_mutex_unlock(&g_feedback_streaming_cb_mutex);
3288 SLOG(LOG_INFO, TAG_VCM, "[SUCCESS] Set feedback streaming callback");
3290 return VC_ERROR_NONE;
3293 int vc_mgr_unset_feedback_streaming_cb()
3295 SLOG(LOG_INFO, TAG_VCM, "@@@ [Manager] unset feedback streaming");
3298 ret = __check_mgr_feature_privilege();
3299 if (VC_ERROR_NONE != ret)
3302 pthread_mutex_lock(&g_feedback_streaming_cb_mutex);
3305 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
3306 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset feedback streaming callback : A handle is not available");
3307 pthread_mutex_unlock(&g_feedback_streaming_cb_mutex);
3308 return VC_ERROR_INVALID_STATE;
3312 if (VC_STATE_INITIALIZED != state) {
3313 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset feedback streaming callback : Current state is not 'Initialized' (%d)", state);
3314 pthread_mutex_unlock(&g_feedback_streaming_cb_mutex);
3315 return VC_ERROR_INVALID_STATE;
3318 vc_mgr_client_set_feedback_streaming_cb(g_vc_m, NULL, NULL);
3320 pthread_mutex_unlock(&g_feedback_streaming_cb_mutex);
3322 SLOG(LOG_INFO, TAG_VCM, "[SUCCESS] Unset feedback streaming callback");
3324 return VC_ERROR_NONE;
3327 int vc_mgr_set_vc_tts_streaming_cb(vc_mgr_vc_tts_streaming_cb callback, void* user_data)
3329 SLOG(LOG_INFO, TAG_VCM, "@@@ [Manager] set vc tts streaming callback");
3332 ret = __check_mgr_feature_privilege();
3333 if (VC_ERROR_NONE != ret)
3336 RETVM_IF(NULL == callback, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Invalid parameter");
3338 pthread_mutex_lock(&g_vc_tts_streaming_cb_mutex);
3341 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
3342 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set feedback streaming callback : A handle is not available");
3343 pthread_mutex_unlock(&g_vc_tts_streaming_cb_mutex);
3344 return VC_ERROR_INVALID_STATE;
3348 if (VC_STATE_INITIALIZED != state) {
3349 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set feedback streaming callback : Current state is not 'Initialized' (%d)", state);
3350 pthread_mutex_unlock(&g_vc_tts_streaming_cb_mutex);
3351 return VC_ERROR_INVALID_STATE;
3354 vc_mgr_client_set_vc_tts_streaming_cb(g_vc_m, callback, user_data);
3356 pthread_mutex_unlock(&g_vc_tts_streaming_cb_mutex);
3358 SLOG(LOG_INFO, TAG_VCM, "[SUCCESS] Set feedback streaming callback");
3360 return VC_ERROR_NONE;
3363 int vc_mgr_unset_vc_tts_streaming_cb()
3365 SLOG(LOG_INFO, TAG_VCM, "@@@ [Manager] unset vc tts streaming callback");
3368 ret = __check_mgr_feature_privilege();
3369 if (VC_ERROR_NONE != ret)
3372 pthread_mutex_lock(&g_vc_tts_streaming_cb_mutex);
3375 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
3376 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset feedback streaming callback : A handle is not available");
3377 pthread_mutex_unlock(&g_vc_tts_streaming_cb_mutex);
3378 return VC_ERROR_INVALID_STATE;
3382 if (VC_STATE_INITIALIZED != state) {
3383 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset feedback streaming callback : Current state is not 'Initialized' (%d)", state);
3384 pthread_mutex_unlock(&g_vc_tts_streaming_cb_mutex);
3385 return VC_ERROR_INVALID_STATE;
3388 vc_mgr_client_set_vc_tts_streaming_cb(g_vc_m, NULL, NULL);
3390 pthread_mutex_unlock(&g_vc_tts_streaming_cb_mutex);
3392 SLOG(LOG_INFO, TAG_VCM, "[SUCCESS] Unset feedback streaming callback");
3394 return VC_ERROR_NONE;
3397 static void __tts_feedback_thread(void* data, Ecore_Thread* thread)
3399 SLOG(LOG_INFO, TAG_VCM, "[SUCCESS] Start thread");
3401 vc_feedback_data_s* feedback_data = NULL;
3407 /* get feedback data */
3408 ret = vc_mgr_data_get_feedback_data(&feedback_data);
3409 if (0 != ret || NULL == feedback_data) {
3411 SLOG(LOG_INFO, TAG_VCM, "[DEBUG] No feedback data. Waiting mode");
3416 if (0 < vc_mgr_data_get_feedback_data_size()) {
3417 SLOG(LOG_INFO, TAG_VCM, "[INFO] Resume thread");
3421 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Wrong request, there's no pcm data");
3422 vc_mgr_data_clear_feedback_data(&feedback_data);
3427 SLOG(LOG_INFO, TAG_VCM, "[INFO] Finish to wait for new feedback data come");
3429 /* resume feedback thread */
3430 vc_mgr_data_clear_feedback_data(&feedback_data);
3434 if (NULL != feedback_data) {
3435 if (getpid() == feedback_data->pid) {
3436 vc_mgr_feedback_streaming_cb callback = NULL;
3437 void* user_data = NULL;
3439 pthread_mutex_lock(&g_feedback_streaming_cb_mutex);
3441 vc_mgr_client_get_feedback_streaming_cb(g_vc_m, &callback, &user_data);
3442 if (NULL == callback) {
3443 SLOG(LOG_WARN, TAG_VCM, "[WARNING] TTS feedback streaming callback is null");
3444 vc_mgr_data_clear_feedback_data(&feedback_data);
3445 pthread_mutex_unlock(&g_feedback_streaming_cb_mutex);
3449 SLOG(LOG_DEBUG, TAG_VCM, "TTS feedback streaming callback is called");
3450 vc_mgr_client_use_callback(g_vc_m);
3451 callback(feedback_data->event, feedback_data->data, feedback_data->data_size, user_data);
3452 vc_mgr_client_not_use_callback(g_vc_m);
3454 pthread_mutex_unlock(&g_feedback_streaming_cb_mutex);
3456 /* If no feedback data and EVENT_FINISH */
3457 if (0 >= vc_mgr_data_get_feedback_data_size() && VC_FEEDBACK_EVENT_FINISH == feedback_data->event) {
3458 SLOG(LOG_INFO, TAG_VCM, "[INFO] Finish feedback");
3459 if (feedback_data) {
3460 free(feedback_data);
3461 feedback_data = NULL;
3466 vc_mgr_vc_tts_streaming_cb callback = NULL;
3467 void* user_data = NULL;
3469 pthread_mutex_lock(&g_vc_tts_streaming_cb_mutex);
3471 vc_mgr_client_get_vc_tts_streaming_cb(g_vc_m, &callback, &user_data);
3472 if (NULL == callback) {
3473 SLOG(LOG_WARN, TAG_VCM, "[WARNING] vc tts streaming callback is null");
3474 vc_mgr_data_clear_feedback_data(&feedback_data);
3475 pthread_mutex_unlock(&g_vc_tts_streaming_cb_mutex);
3479 SLOG(LOG_DEBUG, TAG_VCM, "vc tts feedback streaming callback is called");
3480 vc_mgr_client_use_callback(g_vc_m);
3481 callback(feedback_data->pid, feedback_data->utt_id, feedback_data->event, feedback_data->data, feedback_data->data_size, user_data);
3482 vc_mgr_client_not_use_callback(g_vc_m);
3484 pthread_mutex_unlock(&g_vc_tts_streaming_cb_mutex);
3486 /* If no feedback data and EVENT_FINISH */
3487 if (0 >= vc_mgr_data_get_feedback_data_size() && VC_FEEDBACK_EVENT_FINISH == feedback_data->event) {
3488 SLOG(LOG_INFO, TAG_VCM, "[INFO] Finish vc tts feedback");
3489 if (feedback_data) {
3490 free(feedback_data);
3491 feedback_data = NULL;
3496 free(feedback_data);
3497 feedback_data = NULL;
3502 static void __end_tts_feedback_thread(void* data, Ecore_Thread* thread)
3504 SLOG(LOG_INFO, TAG_VCM, "[SUCCESS] End thread");
3505 g_feedback_thread = NULL;
3508 int vc_mgr_start_feedback(void)
3510 SLOG(LOG_INFO, TAG_VCM, "@@@ [Manager] start feedback");
3513 ret = __check_mgr_feature_privilege();
3514 if (VC_ERROR_NONE != ret)
3517 SLOG(LOG_INFO, TAG_VCM, "@@@ [Manager] Request start TTS feedback");
3520 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
3521 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Start feedback : A handle is not available");
3522 return VC_ERROR_INVALID_STATE;
3526 RETVM_IF(VC_STATE_READY != state, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Start feedback : Current state is not 'Ready' (%d)", state);
3529 bool is_exist = ecore_thread_check(g_feedback_thread);
3530 if (NULL == g_feedback_thread || TRUE == is_exist) {
3531 SLOG(LOG_INFO, TAG_VCM, "[INFO] ecore thread run : __tts_feedback_thread");
3532 g_feedback_thread = ecore_thread_run(__tts_feedback_thread, __end_tts_feedback_thread, NULL, NULL);
3535 /* start playing TTS feedback */
3537 ret = vc_mgr_player_play();
3539 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to player play, ret(%d)", ret);
3542 return VC_ERROR_NONE;
3545 int vc_mgr_stop_feedback(void)
3547 SLOG(LOG_INFO, TAG_VCM, "@@@ [Manager] stop feedback");
3550 ret = __check_mgr_feature_privilege();
3551 if (VC_ERROR_NONE != ret)
3554 SLOG(LOG_INFO, TAG_VCM, "@@@ [Manager] Request stop TTS feedback");
3557 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
3558 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Stop feedback : A handle is not available");
3559 return VC_ERROR_INVALID_STATE;
3563 RETVM_IF(VC_STATE_READY != state, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Stop feedback : Current state is not 'Ready' (%d)", state);
3569 vc_feedback_data_s* feedback_data = NULL;
3571 /* get feedback data */
3572 ret = vc_mgr_data_get_feedback_data(&feedback_data);
3573 if (0 != ret || NULL == feedback_data) {
3575 SLOG(LOG_INFO, TAG_VCM, "[INFO] No feedback data to stop any more");
3576 return VC_ERROR_NONE;
3578 ret = vc_mgr_data_clear_feedback_data(&feedback_data);
3580 SLOG(LOG_INFO, TAG_VCM, "[ERROR] Fail to clear data, ret(%d)", ret);
3585 /* request to stop playing TTS feedback */
3587 ret = vc_mgr_player_stop();
3589 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to player stop, ret(%d)", ret);
3595 int vc_mgr_send_utterance_status(int pid, int utt_id, vc_tts_utterance_status_e utt_status)
3597 SLOG(LOG_INFO, TAG_VCM, "@@@ [Manager] send utterance status, pid(%d), utt_id(%d), utt_status(%d)", pid, utt_id, utt_status);
3600 ret = __check_mgr_feature_privilege();
3601 if (VC_ERROR_NONE != ret)
3604 if (VC_TTS_UTTERANCE_NONE > utt_status || VC_TTS_UTTERANCE_CANCELED < utt_status || 0 == utt_status) {
3605 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] utt_status is not valid. (%d)", utt_status);
3606 return VC_ERROR_INVALID_PARAMETER;
3610 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
3611 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
3612 return VC_ERROR_INVALID_STATE;
3616 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Ready'", state);
3618 /* Check service state */
3619 vc_service_state_e service_state = -1;
3620 vc_mgr_client_get_service_state(g_vc_m, &service_state);
3621 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);
3623 ret = vc_mgr_tidl_send_utterance_status(pid, utt_id, utt_status);
3625 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to send utterance status : %s", __vc_mgr_get_error_code(ret));
3627 SLOG(LOG_INFO, TAG_VCM, "[SUCCESS] Send utterance status");
3629 SLOG(LOG_DEBUG, TAG_VCM, "@@@ [Manager] send utterance status DONE");
3633 static float __get_volume_decibel(char* data, int size)
3635 #define MAX_AMPLITUDE_MEAN_16 32768
3642 unsigned long long square_sum = 0;
3647 for (i = 0; i < size; i += (depthByte<<1)) {
3649 memcpy(&pcm16, data + i, sizeof(short));
3650 square_sum += pcm16 * pcm16;
3654 if (0 == count || 0 == square_sum) {
3655 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] No data");
3658 rms = sqrt((float)square_sum/count);
3661 db = 20 * log10(rms/MAX_AMPLITUDE_MEAN_16);
3665 int vc_mgr_send_audio_streaming(vc_audio_streaming_event_e event, unsigned char* buffer, unsigned int len)
3667 SLOG(LOG_INFO, TAG_VCM, "[Manager] Send audio streaming to the engine service, event(%d)", event);
3670 ret = __check_mgr_feature_privilege();
3671 if (VC_ERROR_NONE != ret)
3674 if (VC_AUDIO_STREAMING_EVENT_FAIL > event || VC_AUDIO_STREAMING_EVENT_FINISH < event || 0 == event) {
3675 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] event is invalid parameter (%d)", event);
3676 return VC_ERROR_INVALID_PARAMETER;
3679 RETVM_IF(NULL == buffer, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Invalid parameter");
3681 vc_state_e state = VC_STATE_NONE;
3682 ret = vc_mgr_client_get_client_state(g_vc_m, &state);
3684 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
3685 return VC_ERROR_INVALID_STATE;
3688 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Ready'", state);
3690 vc_service_state_e service_state = VC_SERVICE_STATE_NONE;
3691 ret = vc_mgr_client_get_service_state(g_vc_m, &service_state);
3693 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
3694 return VC_ERROR_INVALID_STATE;
3697 if (VC_SERVICE_STATE_READY != service_state && VC_SERVICE_STATE_RECORDING != service_state) {
3698 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: service state is not 'READY' and 'RECORDING', state(%d)", service_state);
3699 return VC_ERROR_INVALID_STATE;
3702 float volume = __get_volume_decibel((char*)buffer, len);
3703 __vc_mgr_set_volume(volume);
3705 ret = vc_mgr_tidl_send_audio_streaming(g_vc_m->handle, event, buffer, len);
3707 SLOG(LOG_WARN, TAG_VCM, "[WARNING] retry to send audio streaming data");
3709 SLOG(LOG_INFO, TAG_VCM, "[DEBUG] Success to send");
3713 int vc_mgr_set_audio_streaming_mode(vc_audio_streaming_mode_e mode)
3715 SLOG(LOG_INFO, TAG_VCM, "[Manager] Set multi assistant mode, mode(%d)", mode);
3718 ret = __check_mgr_feature_privilege();
3719 if (VC_ERROR_NONE != ret)
3722 if (VC_AUDIO_STREAMING_MODE_VC_SERVICE > mode || VC_AUDIO_STREAMING_MODE_OUTSIDE < mode) {
3723 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] mode is invalid parameter (%d)", mode);
3724 return VC_ERROR_INVALID_PARAMETER;
3727 vc_state_e state = VC_STATE_NONE;
3728 ret = vc_mgr_client_get_client_state(g_vc_m, &state);
3730 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
3731 return VC_ERROR_INVALID_STATE;
3734 vc_service_state_e service_state = VC_SERVICE_STATE_NONE;
3735 ret = vc_mgr_client_get_service_state(g_vc_m, &service_state);
3737 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
3738 return VC_ERROR_INVALID_STATE;
3741 if (VC_STATE_INITIALIZED == state && VC_SERVICE_STATE_NONE == service_state) {
3742 ret = vc_mgr_client_set_audio_streaming_mode(g_vc_m, mode);
3743 if (VC_ERROR_NONE != ret) {
3744 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to set multi assistant mode : %s", __vc_mgr_get_error_code(ret));
3745 return VC_ERROR_INVALID_STATE;
3747 SLOG(LOG_DEBUG, TAG_VCM, "[SUCCESS] Set audio streaming mode in vc mgr client");
3749 } else if (VC_STATE_READY == state && VC_SERVICE_STATE_READY == service_state) {
3750 ret = vc_mgr_client_set_audio_streaming_mode(g_vc_m, mode);
3751 if (VC_ERROR_NONE != ret) {
3752 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to set multi assistant mode : %s", __vc_mgr_get_error_code(ret));
3753 return VC_ERROR_INVALID_STATE;
3755 SLOG(LOG_DEBUG, TAG_VCM, "[SUCCESS] Set audio streaming mode in vc mgr client");
3758 ret = vc_mgr_tidl_request_set_audio_streaming_mode(g_vc_m->handle, mode);
3759 if (VC_ERROR_NONE != ret) {
3760 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to set audio streaming mode : %s", __vc_mgr_get_error_code(ret));
3761 return VC_ERROR_OPERATION_FAILED;
3763 SLOG(LOG_DEBUG, TAG_VCM, "[SUCCESS] Set audio streaming mode in vc mgr tidl");
3766 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: Current state is not 'INITIALIZED', state(%d)", state);
3767 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: Current service state is not 'READY', service_state(%d)", service_state);
3768 return VC_ERROR_INVALID_STATE;
3771 return VC_ERROR_NONE;
3774 //TODO it's internal api, so will remove it.
3775 int vc_mgr_change_system_volume(vc_system_volume_event_e event)
3777 return vc_mgr_change_background_volume(event);
3780 //TODO it's internal api, so will remove it.
3781 int vc_mgr_recover_system_volume(void)
3783 return vc_mgr_reset_background_volume();
3786 int vc_mgr_change_background_volume(vc_background_volume_event_e event)
3788 SLOG(LOG_INFO, TAG_VCM, "[Manager] Change background volume. event(%d)", event);
3791 ret = __check_mgr_feature_privilege();
3792 if (VC_ERROR_NONE != ret)
3795 if (VC_BACKGROUND_VOLUME_EVENT_CHANGE_FOR_NEARFIELD > event || VC_BACKGROUND_VOLUME_EVENT_CHANGE_FOR_FARFIELD < event) {
3796 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] event is invalid parameter (%d)", event);
3797 return VC_ERROR_INVALID_PARAMETER;
3800 vc_state_e state = VC_STATE_NONE;
3801 ret = vc_mgr_client_get_client_state(g_vc_m, &state);
3802 if (VC_ERROR_NONE != ret) {
3803 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
3804 return VC_ERROR_INVALID_STATE;
3807 if (state != VC_STATE_READY && state != VC_STATE_INITIALIZED) {
3808 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: Current state is not 'READY' and not 'INITIALIZED', state(%d)", state);
3809 return VC_ERROR_INVALID_STATE;
3813 if (VC_BACKGROUND_VOLUME_EVENT_CHANGE_FOR_FARFIELD == event)
3814 ratio = VC_MGR_DEFAULT_FARFIELD_DUCKING_RATIO;
3815 else if (VC_BACKGROUND_VOLUME_EVENT_CHANGE_FOR_NEARFIELD == event)
3816 ratio = VC_MGR_DEFAULT_NEARFIELD_DUCKING_RATIO;
3818 ret = vc_mgr_ducking_activate(ratio);
3819 if (VC_ERROR_NONE != ret)
3820 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to change volume");
3822 SLOG(LOG_INFO, TAG_VCM, "[DEBUG] Success to change volume");
3826 int vc_mgr_change_background_volume_by_ratio(double ratio)
3828 SLOG(LOG_INFO, TAG_VCM, "[Manager] Change background volume. ratio(%f)", ratio);
3831 ret = __check_mgr_feature_privilege();
3832 if (VC_ERROR_NONE != ret)
3835 if (VC_MGR_MINIMUM_DUCKING_RATIO > ratio || VC_MGR_MAXIMUM_DUCKING_RATIO < ratio) {
3836 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] ratio is invalid parameter (%lf)", ratio);
3837 return VC_ERROR_INVALID_PARAMETER;
3840 vc_state_e state = VC_STATE_NONE;
3841 ret = vc_mgr_client_get_client_state(g_vc_m, &state);
3842 if (VC_ERROR_NONE != ret) {
3843 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
3844 return VC_ERROR_INVALID_STATE;
3847 if (state != VC_STATE_READY && state != VC_STATE_INITIALIZED) {
3848 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: Current state is not 'READY' and not 'INITIALIZED', state(%d)", state);
3849 return VC_ERROR_INVALID_STATE;
3852 ret = vc_mgr_ducking_activate(ratio);
3853 if (VC_ERROR_NONE != ret)
3854 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to set ratio");
3856 SLOG(LOG_INFO, TAG_VCM, "[DEBUG] Success to set ratio");
3861 int vc_mgr_reset_background_volume(void)
3863 SLOG(LOG_INFO, TAG_VCM, "[Manager] Recover background volume");
3866 ret = __check_mgr_feature_privilege();
3867 if (VC_ERROR_NONE != ret)
3870 vc_state_e state = VC_STATE_NONE;
3871 ret = vc_mgr_client_get_client_state(g_vc_m, &state);
3872 if (VC_ERROR_NONE != ret) {
3873 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
3874 return VC_ERROR_INVALID_STATE;
3877 if (state != VC_STATE_READY && state != VC_STATE_INITIALIZED) {
3878 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: Current state is not 'READY' and not 'INITIALIZED', state(%d)", state);
3879 return VC_ERROR_INVALID_STATE;
3882 ret = vc_mgr_ducking_deactivate();
3883 if (VC_ERROR_NONE != ret)
3884 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to recover volume");
3886 SLOG(LOG_INFO, TAG_VCM, "[DEBUG] Success to recover volume");