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;
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(&callback, &lang_user_data);
115 if (NULL != callback) {
116 vc_mgr_client_use_callback();
117 callback(previous_lang, current_lang, lang_user_data);
118 vc_mgr_client_not_use_callback();
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()) {
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()) {
287 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to create client!!!!!");
288 return VC_ERROR_OUT_OF_MEMORY;
292 ret = vc_config_mgr_initialize(g_pid + VC_MANAGER_CONFIG_HANDLE);
294 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to init config manager : %d", ret);
295 vc_mgr_client_destroy();
296 return VC_ERROR_OPERATION_FAILED;
299 ret = vc_config_mgr_set_lang_cb(g_pid + VC_MANAGER_CONFIG_HANDLE, __vc_mgr_lang_changed_cb);
301 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to set callback : %d", ret);
302 vc_config_mgr_finalize(g_pid + VC_MANAGER_CONFIG_HANDLE);
303 vc_mgr_client_destroy();
304 return VC_ERROR_OPERATION_FAILED;
307 ret = vc_mgr_client_set_audio_streaming_mode(VC_AUDIO_STREAMING_MODE_VC_SERVICE);
309 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to set audio streaming mode : %d", ret);
310 vc_config_mgr_finalize(g_pid + VC_MANAGER_CONFIG_HANDLE);
311 vc_mgr_client_destroy();
315 /* for TTS feedback */
316 /* ret = vc_mgr_player_init();
318 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to initialize VC mgr player : %d", ret);
322 ret = vc_mgr_ducking_create();
323 if (VC_ERROR_NONE != ret) {
324 SLOG(LOG_INFO, TAG_VCM, "[INFO] Fail to ducking create : %d", ret);
327 SLOG(LOG_ERROR, TAG_VCM, "[Success] pid(%d)", g_pid);
329 SLOG(LOG_DEBUG, TAG_VCM, "@@@ [Manager] Initialize DONE");
331 return VC_ERROR_NONE;
334 static void __vc_mgr_internal_unprepare()
336 int ret = vc_mgr_tidl_request_finalize(g_pid);
338 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request finalize : %s", __vc_mgr_get_error_code(ret));
341 vc_mgr_client_set_internal_state(VC_INTERNAL_STATE_NONE);
345 int vc_mgr_deinitialize(void)
347 SLOG(LOG_ERROR, TAG_VCM, "@@@ [Manager] Deinitialize");
350 ret = __check_mgr_feature_privilege();
351 if (VC_ERROR_NONE != ret)
354 if (false == vc_mgr_client_is_valid()) {
355 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] NOT initialized");
356 return VC_ERROR_INVALID_STATE;
360 vc_mgr_client_get_client_state(&state);
365 __vc_mgr_internal_unprepare();
366 /* no break. need to next step*/
367 case VC_STATE_INITIALIZED:
368 if (NULL != g_send_hello_timer) {
369 SLOG(LOG_DEBUG, TAG_VCM, "Connect Timer is deleted");
370 ecore_timer_del(g_send_hello_timer);
371 g_send_hello_timer = NULL;
373 if (g_request_init_timer) {
374 SLOG(LOG_DEBUG, TAG_VCM, "Connect idler is deleted");
375 ecore_timer_del(g_request_init_timer);
376 g_request_init_timer = NULL;
379 vc_config_mgr_unset_lang_cb(g_pid + VC_MANAGER_CONFIG_HANDLE);
380 vc_config_mgr_finalize(g_pid + VC_MANAGER_CONFIG_HANDLE);
382 /* Free client resources */
383 vc_mgr_client_destroy();
390 SLOG(LOG_DEBUG, TAG_VCM, "Success: destroy");
392 int cnt = VC_COMMAND_TYPE_FOREGROUND;
394 ret = vc_cmd_parser_delete_file(getpid(), cnt);
396 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to delete file, type(%d), ret(%d)", cnt, ret);
397 } while (VC_COMMAND_TYPE_EXCLUSIVE >= ++cnt);
399 ret = vc_db_finalize();
401 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to finalize DB, ret(%d)", ret);
404 /* for TTS feedback */
405 /* ret = vc_mgr_player_release();
407 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to release VC mgr player(%d)", ret);
411 ret = vc_mgr_ducking_destroy();
412 if (VC_ERROR_NONE != ret) {
413 SLOG(LOG_INFO, TAG_VCM, "[INFO] Fail to ducking destroy : %d", ret);
416 if (0 != vc_mgr_tidl_close_connection()) {
417 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to close connection");
420 SLOG(LOG_ERROR, TAG_VCM, "@@@ [Manager] Deinitialize DONE");
422 return VC_ERROR_NONE;
425 static Eina_Bool __request_initialize(void *data)
427 /* request initialization */
429 int service_state = 0;
430 int foreground = VC_RUNTIME_INFO_NO_FOREGROUND;
434 if (true == vc_mgr_client_is_valid()) {
435 SLOG(LOG_DEBUG, TAG_VCM, "[DEBUG] is valid");
438 ret = vc_db_initialize();
440 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to initialize DB : %d", ret);
444 vc_audio_streaming_mode_e streaming_mode;
445 vc_mgr_client_get_audio_streaming_mode(&streaming_mode);
447 ret = vc_mgr_tidl_request_initialize(g_pid, (int)streaming_mode, &service_state, &foreground, &g_daemon_pid);
449 if (VC_ERROR_ENGINE_NOT_FOUND == ret) {
450 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to initialize : %s", __vc_mgr_get_error_code(ret));
452 vc_mgr_client_set_error(VC_ERROR_ENGINE_NOT_FOUND);
453 ecore_main_loop_thread_safe_call_async(__vc_mgr_notify_error, NULL);
455 SLOG(LOG_DEBUG, TAG_VCM, "@@@");
456 g_request_init_timer = NULL;
459 } else if (0 != ret) {
460 SLOG(LOG_ERROR, TAG_VCM, "[WARNING] Fail to connection. Retry to connect : %s", __vc_mgr_get_error_code(ret));
461 ret = vc_db_finalize();
463 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to finalize DB : %d", ret);
467 /* Success to connect */
470 /* Set service state */
471 vc_service_state_e previous_service_state;
472 vc_mgr_client_get_service_state(&previous_service_state);
473 vc_mgr_client_set_service_state((vc_service_state_e)service_state);
475 vc_service_state_changed_cb service_changed_callback = NULL;
476 void* user_data = NULL;
477 vc_mgr_client_get_service_state_changed_cb(&service_changed_callback, &user_data);
479 if (NULL != service_changed_callback) {
480 vc_mgr_client_use_callback();
481 service_changed_callback(previous_service_state, service_state, user_data);
482 vc_mgr_client_not_use_callback();
483 SLOG(LOG_INFO, TAG_VCM, "Service state changed callback is called");
485 SLOG(LOG_WARN, TAG_VCM, "[WARNING] Service state changed callback is null");
489 vc_mgr_client_set_foreground(foreground, true);
491 SLOG(LOG_ERROR, TAG_VCM, "[SUCCESS] Connected daemon");
493 /* Set client state */
494 vc_mgr_client_set_client_state(VC_STATE_READY);
496 vc_state_changed_cb changed_callback = NULL;
498 vc_mgr_client_get_state_changed_cb(&changed_callback, &user_data);
500 vc_state_e current_state;
501 vc_state_e previous_state;
503 vc_mgr_client_get_previous_state(¤t_state, &previous_state);
505 if (NULL != changed_callback) {
506 vc_mgr_client_use_callback();
507 changed_callback(previous_state, current_state, user_data);
508 vc_mgr_client_not_use_callback();
509 SLOG(LOG_INFO, TAG_VCM, "State changed callback is called");
511 SLOG(LOG_WARN, TAG_VCM, "[WARNING] State changed callback is null");
514 SLOG(LOG_ERROR, TAG_VCM, "[Not ERROR] is not valid. It is destroyed."); //LCOV_EXCL_LINE
515 g_request_init_timer = NULL;
519 SLOG(LOG_ERROR, TAG_VCM, "@@@");
521 g_request_init_timer = NULL;
526 static Eina_Bool __send_hello_message(void *data)
529 if (0 != vc_mgr_tidl_request_hello()) {
530 if (g_tidl_send_hello_count == VCM_TIDL_RETRY_COUNT) {
531 g_tidl_send_hello_count = 0;
532 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request hello !! send error to manager");
533 __vc_mgr_cb_error(VC_ERROR_TIMED_OUT, -1, "voice_framework.error.vcfw.connect_engine_fail");
534 g_send_hello_timer = NULL;
537 g_tidl_send_hello_count++;
542 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Connect daemon");
544 if (NULL == g_request_init_timer) {
545 SLOG(LOG_INFO, TAG_VCM, "[DEBUG] Create a new idler for preparation");
546 g_request_init_timer = ecore_timer_add(0.0, __request_initialize, NULL);
548 SLOG(LOG_INFO, TAG_VCM, "[INFO] idler handle is already created");
551 g_send_hello_timer = NULL;
555 int vc_mgr_prepare(void)
557 SLOG(LOG_ERROR, TAG_VCM, "@@@ [Manager] Prepare");
560 ret = __check_mgr_feature_privilege();
561 if (VC_ERROR_NONE != ret)
565 if (0 != vc_mgr_client_get_client_state(&state)) {
566 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
567 return VC_ERROR_INVALID_STATE;
571 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
573 if (NULL == g_send_hello_timer) {
574 g_tidl_send_hello_count = 0;
575 SLOG(LOG_INFO, TAG_VCM, "[DEBUG] Create a new timer for preparation");
576 ecore_thread_main_loop_begin();
577 g_send_hello_timer = ecore_timer_add(0.1, __send_hello_message, NULL);
578 ecore_thread_main_loop_end();
580 SLOG(LOG_INFO, TAG_VCM, "[INFO] timer handle is already created");
583 SLOG(LOG_DEBUG, TAG_VCM, "@@@ [Manager] Calling Prepare DONE");
585 return VC_ERROR_NONE;
588 int vc_mgr_unprepare(void)
590 SLOG(LOG_ERROR, TAG_VCM, "@@@ [Manager] Unprepare");
593 ret = __check_mgr_feature_privilege();
594 if (VC_ERROR_NONE != ret)
598 if (0 != vc_mgr_client_get_client_state(&state)) {
599 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
600 return VC_ERROR_INVALID_STATE;
604 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Ready'", state);
606 __vc_mgr_internal_unprepare();
608 vc_mgr_client_set_client_state(VC_STATE_INITIALIZED);
609 ecore_timer_add(0, __vc_mgr_notify_state_changed, NULL);
611 SLOG(LOG_DEBUG, TAG_VCM, "@@@ [Manager] Unprepare DONE");
613 return VC_ERROR_NONE;
616 int vc_mgr_foreach_supported_languages(vc_supported_language_cb callback, void* user_data)
618 SLOG(LOG_INFO, TAG_VCM, "@@@ [Manager] Foreach Supported Language");
621 ret = __check_mgr_feature_privilege();
622 if (VC_ERROR_NONE != ret)
625 RETVM_IF(NULL == callback, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Input parameter is NULL");
628 if (0 != vc_mgr_client_get_client_state(&state)) {
629 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
630 return VC_ERROR_INVALID_STATE;
633 ret = vc_config_mgr_get_language_list(callback, user_data);
635 ret = vc_config_convert_error_code((vc_config_error_e)ret);
636 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get languages : %s", __vc_mgr_get_error_code(ret));
639 SLOG(LOG_DEBUG, TAG_VCM, "@@@ [Manager] Foreach Supported Language DONE");
641 return VC_ERROR_NONE;
644 int vc_mgr_get_current_language(char** language)
647 ret = __check_mgr_feature_privilege();
648 if (VC_ERROR_NONE != ret)
651 RETVM_IF(NULL == language, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Input parameter is NULL");
654 if (0 != vc_mgr_client_get_client_state(&state)) {
655 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
656 return VC_ERROR_INVALID_STATE;
659 ret = vc_config_mgr_get_default_language(language);
661 ret = vc_config_convert_error_code((vc_config_error_e)ret);
662 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get current languages : %s", __vc_mgr_get_error_code(ret));
664 SLOG(LOG_ERROR, TAG_VCM, "[Get current language] language : %s", *language);
670 int vc_mgr_get_state(vc_state_e* state)
672 SLOG(LOG_DEBUG, TAG_VCM, "@@@ [Manager] Get State");
675 ret = __check_mgr_feature_privilege();
676 if (VC_ERROR_NONE != ret)
679 RETVM_IF(NULL == state, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Input parameter is NULL");
682 if (0 != vc_mgr_client_get_client_state(&temp)) {
683 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
684 return VC_ERROR_INVALID_STATE;
690 case VC_STATE_NONE: SLOG(LOG_INFO, TAG_VCM, "Current state is 'None'"); break;
691 case VC_STATE_INITIALIZED: SLOG(LOG_INFO, TAG_VCM, "Current state is 'Created'"); break;
692 case VC_STATE_READY: SLOG(LOG_INFO, TAG_VCM, "Current state is 'Ready'"); break;
693 default: SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid state");
696 SLOG(LOG_DEBUG, TAG_VCM, "@@@ [Manager] Get State DONE");
698 return VC_ERROR_NONE;
701 int vc_mgr_get_service_state(vc_service_state_e* state)
703 SLOG(LOG_DEBUG, TAG_VCM, "@@@ [Manager] Get Service State");
706 ret = __check_mgr_feature_privilege();
707 if (VC_ERROR_NONE != ret)
710 RETVM_IF(NULL == state, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Input parameter is NULL");
712 vc_state_e client_state;
713 if (0 != vc_mgr_client_get_client_state(&client_state)) {
714 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
715 return VC_ERROR_INVALID_STATE;
719 RETVM_IF(client_state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Current state is not 'READY'");
721 /* get service state */
722 vc_service_state_e service_state;
723 if (0 != vc_mgr_client_get_service_state(&service_state)) {
724 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get service state");
725 return VC_ERROR_OPERATION_FAILED;
728 *state = service_state;
731 case VC_SERVICE_STATE_NONE: SLOG(LOG_DEBUG, TAG_VCM, "Current service state is 'None'"); break;
732 case VC_SERVICE_STATE_READY: SLOG(LOG_DEBUG, TAG_VCM, "Current service state is 'Ready'"); break;
733 case VC_SERVICE_STATE_RECORDING: SLOG(LOG_DEBUG, TAG_VCM, "Current service state is 'Recording'"); break;
734 case VC_SERVICE_STATE_PROCESSING: SLOG(LOG_DEBUG, TAG_VCM, "Current service state is 'Processing'"); break;
735 default: SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid state");
738 SLOG(LOG_DEBUG, TAG_VCM, "@@@ [Manager] Get Service State DONE");
740 return VC_ERROR_NONE;
743 int vc_mgr_set_demandable_client_rule(const char* rule)
745 SLOG(LOG_INFO, TAG_VCM, "@@@ [Manager] Set Demandable client rule(%s)", rule);
748 ret = __check_mgr_feature_privilege();
749 if (VC_ERROR_NONE != ret)
753 if (0 != vc_mgr_client_get_client_state(&state)) {
754 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
755 return VC_ERROR_INVALID_STATE;
759 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Ready'", state);
761 ret = vc_info_parser_set_demandable_client(rule);
763 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] rule is NOT valid");
764 SLOG(LOG_DEBUG, TAG_VCM, "@@@");
765 return VC_ERROR_INVALID_PARAMETER;
768 if (0 != vc_info_parser_get_demandable_clients(&g_demandable_client_list)) {
769 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get demandable clients");
770 return VC_ERROR_OPERATION_FAILED;
773 SLOG(LOG_DEBUG, TAG_VCM, "@@@ [Manager] Set Demandable client rule(%s) DONE", rule);
775 return VC_ERROR_NONE;
778 int vc_mgr_unset_demandable_client_rule(void)
780 SLOG(LOG_INFO, TAG_VCM, "@@@ [Manager] Unset Demandable client");
783 ret = __check_mgr_feature_privilege();
784 if (VC_ERROR_NONE != ret)
787 vc_info_parser_set_demandable_client(NULL);
789 ret = vc_mgr_tidl_request_demandable_client(g_pid);
791 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request unset client rule to daemon : %s", __vc_mgr_get_error_code(ret));
794 // TODO: check return value correct or not
795 return VC_ERROR_NONE;
798 int vc_mgr_is_command_format_supported(int format, bool* support)
800 SLOG(LOG_ERROR, TAG_VCM, "@@@ [Manager] Is command type supported");
803 ret = __check_mgr_feature_privilege();
804 if (VC_ERROR_NONE != ret)
807 RETVM_IF(NULL == support, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Input parameter is NULL");
810 if (0 != vc_mgr_client_get_client_state(&state)) {
811 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
812 return VC_ERROR_INVALID_STATE;
816 bool non_fixed_support = false;
817 if (0 != vc_config_mgr_get_nonfixed_support(&non_fixed_support)) {
818 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get nonfixed support info");
822 case VC_CMD_FORMAT_FIXED: *support = true; break;
823 case VC_CMD_FORMAT_FIXED_AND_VFIXED: *support = true; break;
824 case VC_CMD_FORMAT_VFIXED_AND_FIXED: *support = true; break;
825 case VC_CMD_FORMAT_FIXED_AND_NONFIXED: *support = non_fixed_support; break;
826 case VC_CMD_FORMAT_NONFIXED_AND_FIXED: *support = non_fixed_support; break;
827 default: *support = false; break;
830 SLOG(LOG_ERROR, TAG_VCM, "[DEBUG] Format(%d) support(%s)", format, *support ? "true" : "false");
832 SLOG(LOG_DEBUG, TAG_VCM, "@@@ [Manager] Is command type supported DONE");
834 return VC_ERROR_NONE;
837 int vc_mgr_enable_command_type(int cmd_type)
839 SLOG(LOG_ERROR, TAG_VCM, "@@@ [Manager] Enable Command Type, cmd_type(%d)", cmd_type);
842 ret = __check_mgr_feature_privilege();
843 if (VC_ERROR_NONE != ret)
846 if (VC_COMMAND_TYPE_FOREGROUND > cmd_type || VC_COMMAND_TYPE_EXCLUSIVE < cmd_type) {
847 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] cmd_type is not valid. (%d)", cmd_type);
848 return VC_ERROR_INVALID_PARAMETER;
852 if (0 != vc_mgr_client_get_client_state(&state)) {
853 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
854 return VC_ERROR_INVALID_STATE;
858 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Ready'", state);
860 /* Check service state */
861 vc_service_state_e service_state = -1;
862 vc_mgr_client_get_service_state(&service_state);
863 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);
865 ret = vc_mgr_client_enable_command_type((vc_cmd_type_e)cmd_type); // enable the cmd type
867 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to enable the command type(%d). ret(%d)", cmd_type, ret);
869 SLOG(LOG_DEBUG, TAG_VCM, "[DEBUG] Success to enable the command type(%d)", cmd_type);
872 SLOG(LOG_ERROR, TAG_VCM, "@@@ [Manager] Enable Command Type DONE, ret(%d)", ret);
877 int vc_mgr_disable_command_type(int cmd_type)
879 SLOG(LOG_ERROR, TAG_VCM, "@@@ [Manager] Disable Command Type, cmd_type(%d)", cmd_type);
882 ret = __check_mgr_feature_privilege();
883 if (VC_ERROR_NONE != ret)
886 if (VC_COMMAND_TYPE_FOREGROUND > cmd_type || VC_COMMAND_TYPE_EXCLUSIVE < cmd_type) {
887 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] cmd type is not valid, (%d)", cmd_type);
888 return VC_ERROR_INVALID_PARAMETER;
892 if (0 != vc_mgr_client_get_client_state(&state)) {
893 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
894 return VC_ERROR_INVALID_STATE;
898 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Ready'", state);
900 /* Check service state */
901 vc_service_state_e service_state = -1;
902 vc_mgr_client_get_service_state(&service_state);
903 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);
905 ret = vc_mgr_client_disable_command_type((vc_cmd_type_e)cmd_type); // enable the cmd type
907 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to disable the command type(%d). ret(%d)", cmd_type, ret);
909 SLOG(LOG_DEBUG, TAG_VCM, "[DEBUG] Success to disable the command type(%d)", cmd_type);
912 SLOG(LOG_ERROR, TAG_VCM, "@@@ [Manager] Disable Command Type DONE, ret(%d)", ret);
917 int vc_mgr_set_command_list(vc_cmd_list_h vc_cmd_list)
919 SLOG(LOG_ERROR, TAG_VCM, "@@@ [Manager] Set Command list");
922 ret = __check_mgr_feature_privilege();
923 if (VC_ERROR_NONE != ret)
927 if (0 != vc_mgr_client_get_client_state(&state)) {
928 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
929 return VC_ERROR_INVALID_STATE;
933 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
935 /* Check service state */
936 vc_service_state_e service_state = -1;
937 vc_mgr_client_get_service_state(&service_state);
938 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);
940 RETVM_IF(NULL == vc_cmd_list, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Input parameter is NULL");
942 vc_cmd_list_s* list = NULL;
943 list = (vc_cmd_list_s*)vc_cmd_list;
944 SLOG(LOG_INFO, TAG_VCM, "[List] (%p) (%p)", list, list->list);
946 RETVM_IF(NULL == list->list, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Input command list");
949 bool success_save = false;
950 for (i = VC_COMMAND_TYPE_FOREGROUND; i <= VC_COMMAND_TYPE_EXCLUSIVE; i++) {
951 ret = vc_cmd_parser_delete_file(getpid(), i);
953 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to delete file, type(%d), ret(%d)", i, ret);
955 ret = vc_cmd_parser_save_file(getpid(), i, list->list, NULL);
957 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to save file, type(%d), ret(%d)", i, ret);
959 SLOG(LOG_INFO, TAG_VCM, "[SUCCESS] Save file, type(%d)", i);
964 if (true != success_save) {
965 ret = VC_ERROR_INVALID_PARAMETER;
966 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to save command group : %s", __vc_mgr_get_error_code(ret));
968 ret = vc_mgr_tidl_request_set_command(g_pid);
970 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request set command to daemon : %s", __vc_mgr_get_error_code(ret));
974 SLOG(LOG_ERROR, TAG_VCM, "@@@ [Manager] Set Command list DONE, ret(%d)", ret);
979 int vc_mgr_unset_command_list(void)
981 SLOG(LOG_ERROR, TAG_VCM, "@@@ [Manager] Unset Command list");
984 ret = __check_mgr_feature_privilege();
985 if (VC_ERROR_NONE != ret)
989 if (0 != vc_mgr_client_get_client_state(&state)) {
990 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
991 return VC_ERROR_INVALID_STATE;
995 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
997 ret = vc_mgr_tidl_request_unset_command(g_pid);
999 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request unset command to daemon : %s", __vc_mgr_get_error_code(ret));
1003 for (i = VC_COMMAND_TYPE_FOREGROUND; i <= VC_COMMAND_TYPE_EXCLUSIVE; i++) {
1004 ret = vc_cmd_parser_delete_file(getpid(), i);
1006 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to delete file, type(%d), ret(%d)", i, ret);
1009 SLOG(LOG_ERROR, TAG_VCM, "@@@ [Manager] Unset Command list DONE");
1011 // TODO: check return value correct or not
1012 return VC_ERROR_NONE;
1015 int vc_mgr_set_command_list_from_file(const char* file_path, int type)
1017 SLOG(LOG_ERROR, TAG_VCM, "@@@ [Manager] Set Command list from file, type(%d)", type);
1020 ret = __check_mgr_feature_privilege();
1021 if (VC_ERROR_NONE != ret)
1024 RETVM_IF(NULL == file_path, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Invalid parameter");
1025 SLOG(LOG_INFO, TAG_VCM, "@@@ File path: %s", file_path);
1028 if (VC_COMMAND_TYPE_FOREGROUND > type || VC_COMMAND_TYPE_EXCLUSIVE < type) {
1029 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid command type: input type is %d", type);
1030 return VC_ERROR_INVALID_PARAMETER;
1034 if (0 != vc_mgr_client_get_client_state(&state)) {
1035 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1036 return VC_ERROR_INVALID_STATE;
1040 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
1042 /* Check service state */
1043 vc_service_state_e service_state = -1;
1044 vc_mgr_client_get_service_state(&service_state);
1045 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);
1047 ret = vc_cmd_parser_delete_file(getpid(), type);
1049 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to delete file, type(4), ret(%d)", ret);
1051 if (0 != vc_json_set_commands_from_file(file_path, type, NULL)) {
1052 ret = VC_ERROR_INVALID_PARAMETER;
1053 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to save command list (%d)", ret);
1055 ret = vc_mgr_tidl_request_set_command(g_pid);
1057 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request set command to daemon : %s", __vc_mgr_get_error_code(ret));
1061 SLOG(LOG_ERROR, TAG_VCM, "@@@ [Manager] Set Command list from file DONE, ret(%d)", ret);
1066 int vc_mgr_set_preloaded_commands_from_file(const char* file_path)
1068 SLOG(LOG_ERROR, TAG_VCM, "@@@ [Manager] Set preloaded command list");
1071 ret = __check_mgr_feature_privilege();
1072 if (VC_ERROR_NONE != ret)
1075 RETVM_IF(NULL == file_path, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Invalid parameter");
1076 SLOG(LOG_INFO, TAG_VCM, "@@@ File path: %s", file_path);
1079 if (0 != vc_mgr_client_get_client_state(&state)) {
1080 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1081 return VC_ERROR_INVALID_STATE;
1085 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
1087 /* Check service state */
1088 vc_service_state_e service_state = -1;
1089 vc_mgr_client_get_service_state(&service_state);
1090 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);
1092 /* Only support to set background commands for preloaded application */
1093 ret = vc_json_set_commands_from_file(file_path, VC_COMMAND_TYPE_BACKGROUND, NULL);
1095 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to insert preloaded commands into db");
1097 SLOG(LOG_ERROR, TAG_VCM, "@@@ [Manager] Set preloaded command list DONE, ret(%d)", ret);
1101 int vc_mgr_set_audio_type(const char* audio_id)
1103 SLOG(LOG_ERROR, TAG_VCM, "@@@ [Manager] Set audio type, audio_id(%s)", audio_id);
1106 ret = __check_mgr_feature_privilege();
1107 if (VC_ERROR_NONE != ret)
1110 if (NULL == audio_id || !strncmp(audio_id, "", strlen(audio_id))) {
1111 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Input parameter is NULL");
1112 return VC_ERROR_INVALID_PARAMETER;
1116 if (0 != vc_mgr_client_get_client_state(&state)) {
1117 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1118 return VC_ERROR_INVALID_STATE;
1122 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
1124 /* Check service state */
1125 vc_service_state_e service_state = -1;
1126 vc_mgr_client_get_service_state(&service_state);
1127 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);
1130 ret = vc_mgr_tidl_request_set_audio_type(g_pid, audio_id);
1132 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to set audio type : %s", __vc_mgr_get_error_code(ret));
1134 SLOG(LOG_INFO, TAG_VCM, "[SUCCESS] Set audio type");
1136 vc_mgr_client_set_audio_type(audio_id);
1139 SLOG(LOG_ERROR, TAG_VCM, "@@@ [Manager] Set audio type DONE, ret(%d)", ret);
1144 int vc_mgr_get_audio_type(char** audio_id)
1146 SLOG(LOG_ERROR, TAG_VCM, "@@@ [Manager] Get audio type");
1149 ret = __check_mgr_feature_privilege();
1150 if (VC_ERROR_NONE != ret)
1153 RETVM_IF(NULL == audio_id, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Invalid parameter");
1156 if (0 != vc_mgr_client_get_client_state(&state)) {
1157 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1158 return VC_ERROR_INVALID_STATE;
1162 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
1164 /* Check service state */
1165 vc_service_state_e service_state = -1;
1166 vc_mgr_client_get_service_state(&service_state);
1167 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);
1171 vc_mgr_client_get_audio_type(&temp);
1174 /* Not initiallized */
1177 ret = vc_mgr_tidl_request_get_audio_type(g_pid, &temp);
1179 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get audio type : %s", __vc_mgr_get_error_code(ret));
1181 SLOG(LOG_ERROR, TAG_VCM, "[SUCCESS] Get audio type : %s", temp);
1183 vc_mgr_client_set_audio_type(temp);
1189 *audio_id = strdup(temp);
1194 // TODO: check return value correct or not
1195 return VC_ERROR_NONE;
1198 int vc_mgr_get_current_commands(vc_cmd_list_h* vc_cmd_list)
1200 SLOG(LOG_ERROR, TAG_VCM, "@@@ [Manager] Foreach current commands");
1203 ret = __check_mgr_feature_privilege();
1204 if (VC_ERROR_NONE != ret)
1208 if (0 != vc_mgr_client_get_client_state(&state)) {
1209 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1210 return VC_ERROR_INVALID_STATE;
1214 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
1216 /* Check service state */
1217 vc_service_state_e service_state = -1;
1218 vc_mgr_client_get_service_state(&service_state);
1219 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);
1221 RETVM_IF(NULL == vc_cmd_list, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Invalid Parameter");
1223 vc_cmd_list_h temp_list = NULL;
1224 if (0 != vc_cmd_list_create(&temp_list)) {
1225 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to create list");
1226 return VC_ERROR_INVALID_PARAMETER;
1229 *vc_cmd_list = temp_list;
1234 /* Get foreground pid */
1235 if (0 != vc_mgr_client_get_foreground(&fg_pid)) {
1236 /* There is no foreground app for voice control */
1237 SLOG(LOG_WARN, TAG_VCM, "[Manager WARNING] No foreground pid for voice control");
1239 SLOG(LOG_INFO, TAG_VCM, "[Manager] Foreground pid(%d)", fg_pid);
1242 if (0 != vc_mgr_client_get_pid(&mgr_pid)) {
1243 SLOG(LOG_ERROR, TAG_VCM, "[Manager] Fail to get manager pid");
1244 return VC_ERROR_OPERATION_FAILED;
1246 SLOG(LOG_INFO, TAG_VCM, "[Manager] Manager pid(%d)", mgr_pid);
1249 /* Get system command */
1250 ret = vc_cmd_parser_append_commands(mgr_pid, VC_COMMAND_TYPE_SYSTEM, temp_list);
1252 SLOG(LOG_INFO, TAG_VCM, "[Manager] No system commands");
1256 ret = vc_mgr_tidl_request_set_client_info(g_pid);
1258 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to set client info : %s", __vc_mgr_get_error_code(ret));
1260 SLOG(LOG_INFO, TAG_VCM, "[SUCCESS] Set client info");
1263 GSList *iter = NULL;
1264 GSList* client_info_list = NULL;
1265 vc_client_info_s *client_info = NULL;
1266 bool is_fgpid = false;
1268 if (0 != vc_info_parser_get_client_info(&client_info_list)) {
1269 SLOG(LOG_INFO, TAG_VCM, "[DEBUG] No client");
1270 return VC_ERROR_NONE;
1273 if (VC_NO_FOREGROUND_PID != fg_pid) {
1274 iter = g_slist_nth(client_info_list, 0);
1275 while (NULL != iter) {
1276 client_info = iter->data;
1277 if (NULL != client_info) {
1278 if (fg_pid == client_info->pid) {
1283 iter = g_slist_next(iter);
1287 /* Get foreground commands and widget */
1288 if (true == is_fgpid) {
1290 SLOG(LOG_INFO, TAG_VCM, "[Manager] fore cmd(%d)", client_info->fg_cmd);
1292 /* Get foreground command */
1293 if (true == client_info->fg_cmd) {
1294 ret = vc_cmd_parser_append_commands(fg_pid, VC_COMMAND_TYPE_FOREGROUND, temp_list);
1296 SLOG(LOG_ERROR, TAG_VCM, "[Client Data ERROR] Fail to get the fg command list");
1299 SLOG(LOG_INFO, TAG_VCM, "[Manager] No foreground commands");
1302 /* Check exclusive option */
1303 if (true == client_info->exclusive_cmd) {
1304 SLOG(LOG_INFO, TAG_VCM, "[Manager] Exclusive command is ON");
1306 /* Set background command for exclusive option */
1307 if (true == client_info->bg_cmd) {
1308 SLOG(LOG_INFO, TAG_VCM, "[Manager] Set background command");
1309 ret = vc_cmd_parser_append_commands(client_info->pid, VC_COMMAND_TYPE_BACKGROUND, temp_list);
1311 SLOG(LOG_ERROR, TAG_VCM, "[Client Data ERROR] Fail to get the bg command list : pid(%d)", client_info->pid);
1315 /* need to release client info */
1316 iter = g_slist_nth(client_info_list, 0);
1318 while (NULL != iter) {
1319 client_info = iter->data;
1320 if (NULL != client_info) {
1323 client_info_list = g_slist_remove_link(client_info_list, iter);
1324 iter = g_slist_nth(client_info_list, 0);
1327 SLOG(LOG_DEBUG, TAG_VCM, "@@@ [Manager] Foreach current commands DONE");
1329 return VC_ERROR_NONE;
1332 SLOG(LOG_INFO, TAG_VCM, "[Manager] No foreground app");
1335 /* Get background commands */
1336 if (0 < g_slist_length(client_info_list)) {
1337 iter = g_slist_nth(client_info_list, 0);
1339 while (NULL != iter) {
1340 client_info = iter->data;
1342 if (NULL != client_info) {
1343 SLOG(LOG_INFO, TAG_VCM, "[Manager] Pid(%d) Back cmd(%d)", client_info->pid, client_info->bg_cmd);
1344 if (true == client_info->bg_cmd) {
1345 ret = vc_cmd_parser_append_commands(client_info->pid, VC_COMMAND_TYPE_BACKGROUND, temp_list);
1347 SLOG(LOG_ERROR, TAG_VCM, "[Client Data ERROR] Fail to get the bg command list : pid(%d)", client_info->pid);
1352 client_info_list = g_slist_remove_link(client_info_list, iter);
1354 iter = g_slist_nth(client_info_list, 0);
1358 SLOG(LOG_INFO, TAG_VCM, "[Manager] No background commands");
1361 SLOG(LOG_ERROR, TAG_VCM, "@@@ [Manager] Foreach current commands DONE");
1363 // TODO: check return value correct or not
1364 return VC_ERROR_NONE;
1367 int vc_mgr_set_recognition_mode(vc_recognition_mode_e mode)
1369 SLOG(LOG_INFO, TAG_VCM, "@@@ [Manager] Set recognition mode = %d", mode);
1372 ret = __check_mgr_feature_privilege();
1373 if (VC_ERROR_NONE != ret)
1376 /* check vc recognition mode */
1377 if (mode < VC_RECOGNITION_MODE_STOP_BY_SILENCE || mode > VC_RECOGNITION_MODE_MANUAL) {
1378 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] invalid parameter: 'mode' is not supported mode (%d)", mode);
1379 return VC_ERROR_INVALID_PARAMETER;
1383 if (0 != vc_mgr_client_get_client_state(&state)) {
1384 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1385 return VC_ERROR_INVALID_STATE;
1389 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
1391 /* Check service state */
1392 vc_service_state_e service_state = -1;
1393 vc_mgr_client_get_service_state(&service_state);
1394 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);
1396 vc_mgr_client_set_recognition_mode(mode);
1397 return VC_ERROR_NONE;
1400 int vc_mgr_get_recognition_mode(vc_recognition_mode_e* mode)
1403 ret = __check_mgr_feature_privilege();
1404 if (VC_ERROR_NONE != ret)
1407 RETVM_IF(NULL == mode, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Invalid parameter, mode is NULL ptr");
1410 if (0 != vc_mgr_client_get_client_state(&state)) {
1411 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1412 return VC_ERROR_INVALID_STATE;
1415 ret = vc_mgr_client_get_recognition_mode(mode);
1417 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get recognition mode");
1421 SLOG(LOG_INFO, TAG_VCM, "@@@ [Manager] Get recognition mode = %d", *mode);
1422 return VC_ERROR_NONE;
1425 int vc_mgr_set_private_data(const char* key, const char* data)
1427 SLOG(LOG_INFO, TAG_VCM, "@@@ [Manager] Set private data");
1430 ret = __check_mgr_feature_privilege();
1431 if (VC_ERROR_NONE != ret)
1434 RETVM_IF(NULL == key, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Invalid parameter");
1437 if (0 != vc_mgr_client_get_client_state(&state)) {
1438 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1439 return VC_ERROR_INVALID_STATE;
1443 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
1445 /* Check service state */
1446 vc_service_state_e service_state = -1;
1447 vc_mgr_client_get_service_state(&service_state);
1448 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);
1450 ret = vc_mgr_tidl_request_set_private_data(g_pid, key, data);
1452 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to set private data : %s", __vc_mgr_get_error_code(ret));
1455 SLOG(LOG_DEBUG, TAG_VCM, "[SUCCESS] Set private data");
1458 SLOG(LOG_DEBUG, TAG_VCM, "@@@ [Manager] Set private data DONE");
1460 return VC_ERROR_NONE;
1463 int vc_mgr_get_private_data(const char* key, char** data)
1465 SLOG(LOG_DEBUG, TAG_VCM, "@@@ [Manager] Get private data");
1468 ret = __check_mgr_feature_privilege();
1469 if (VC_ERROR_NONE != ret)
1472 if (NULL == key || NULL == data) {
1473 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid parameter");
1474 return VC_ERROR_INVALID_PARAMETER;
1478 if (0 != vc_mgr_client_get_client_state(&state)) {
1479 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1480 return VC_ERROR_INVALID_STATE;
1484 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
1486 /* Check service state */
1487 vc_service_state_e service_state = -1;
1488 vc_mgr_client_get_service_state(&service_state);
1489 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);
1492 ret = vc_mgr_tidl_request_get_private_data(g_pid, key, &temp);
1494 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get private data request : %s", __vc_mgr_get_error_code(ret));
1496 SLOG(LOG_INFO, TAG_VCM, "[SUCCESS] Get private data, key(%s), data(%s)", key, temp);
1500 *data = strdup(temp);
1505 SLOG(LOG_DEBUG, TAG_VCM, "@@@ [Manager] Get private data DONE");
1507 // TODO: check return value correct or not
1508 return VC_ERROR_NONE;
1511 int vc_mgr_set_domain(const char* domain)
1513 SLOG(LOG_DEBUG, TAG_VCM, "@@@ [Manager] Set domain");
1516 ret = __check_mgr_feature_privilege();
1517 if (VC_ERROR_NONE != ret)
1520 RETVM_IF(NULL == domain, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Invalid parameter");
1523 if (0 != vc_mgr_client_get_client_state(&state)) {
1524 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1525 return VC_ERROR_INVALID_STATE;
1529 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
1531 /* Check service state */
1532 vc_service_state_e service_state = -1;
1533 vc_mgr_client_get_service_state(&service_state);
1534 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);
1536 ret = vc_mgr_tidl_request_set_domain(g_pid, domain);
1538 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to set domain request : %s", __vc_mgr_get_error_code(ret));
1540 SLOG(LOG_INFO, TAG_VCM, "[SUCCESS] Set domain");
1543 SLOG(LOG_DEBUG, TAG_VCM, "@@@ [Manager] Set domain DONE");
1545 return VC_ERROR_NONE;
1548 int vc_mgr_do_action(vc_send_event_type_e type, char* send_event)
1550 SLOG(LOG_INFO, TAG_VCM, "@@@ [Manager] do action");
1553 ret = __check_mgr_feature_privilege();
1554 if (VC_ERROR_NONE != ret)
1557 if (type < VC_SEND_EVENT_TYPE_TEXT || VC_SEND_EVENT_TYPE_HAPTIC_EVENT < type) {
1558 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] send event type is not valid, (%d)", type);
1559 return VC_ERROR_INVALID_PARAMETER;
1562 RETVM_IF(NULL == send_event, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Invalid parameter");
1565 if (0 != vc_mgr_client_get_client_state(&state)) {
1566 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1567 return VC_ERROR_INVALID_STATE;
1571 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
1573 /* Check service state */
1574 vc_service_state_e service_state = -1;
1575 vc_mgr_client_get_service_state(&service_state);
1576 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);
1578 ret = vc_mgr_tidl_request_do_action(g_pid, type, send_event);
1580 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to do action request : %s", __vc_mgr_get_error_code(ret));
1583 SLOG(LOG_INFO, TAG_VCM, "[SUCCESS] do action");
1585 SLOG(LOG_DEBUG, TAG_VCM, "@@@ [Manager] do action DONE");
1587 return VC_ERROR_NONE;
1590 int vc_mgr_send_specific_engine_request(const char* engine_app_id, const char* event, const char* request)
1592 SLOG(LOG_INFO, TAG_VCM, "@@@ [Manager] send specific engine request");
1595 ret = __check_mgr_feature_privilege();
1596 if (VC_ERROR_NONE != ret)
1599 SLOG(LOG_INFO, TAG_VCM, "@@@ [Manager] specific engine request. engine app id(%s), event(%s), request(%s)", engine_app_id, event, request);
1601 if (NULL == engine_app_id || NULL == event) {
1602 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid parameter");
1603 return VC_ERROR_INVALID_PARAMETER;
1606 if (NULL == request) {
1607 SLOG(LOG_ERROR, TAG_VCM, "[INFO] Input parameter is NULL. (no request)");
1611 if (0 != vc_mgr_client_get_client_state(&state)) {
1612 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1613 return VC_ERROR_INVALID_STATE;
1617 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
1619 /* Check service state */
1620 vc_service_state_e service_state = -1;
1621 vc_mgr_client_get_service_state(&service_state);
1622 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);
1624 ret = vc_mgr_tidl_send_specific_engine_request(g_pid, engine_app_id, event, request);
1626 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to specific engine request : %s", __vc_mgr_get_error_code(ret));
1629 SLOG(LOG_INFO, TAG_VCM, "[SUCCESS] specific engine request");
1631 SLOG(LOG_DEBUG, TAG_VCM, "@@@ [Manager] send specific engine request DONE");
1633 return VC_ERROR_NONE;
1636 int vc_mgr_start(bool exclusive_command_option)
1638 SLOG(LOG_ERROR, TAG_VCM, "@@@ [Manager] Request start");
1641 ret = __check_mgr_feature_privilege();
1642 if (VC_ERROR_NONE != ret)
1646 if (0 != vc_mgr_client_get_client_state(&state)) {
1647 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1648 return VC_ERROR_INVALID_STATE;
1652 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
1654 /* Check service state */
1655 vc_service_state_e service_state = -1;
1656 vc_mgr_client_get_service_state(&service_state);
1657 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);
1659 /* Check internal state for async */
1660 vc_internal_state_e internal_state = -1;
1661 vc_mgr_client_get_internal_state(&internal_state);
1662 if (internal_state != VC_INTERNAL_STATE_NONE) {
1663 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State : Internal state is NOT none : %d", internal_state);
1664 return VC_ERROR_IN_PROGRESS_TO_RECORDING;
1667 vc_mgr_client_set_exclusive_command(exclusive_command_option);
1669 bool start_by_client = false;
1670 if (0 != vc_mgr_client_get_start_by_client(&start_by_client)) {
1671 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get start by client");
1674 int disabled_cmd_type = 0;
1675 if (0 != vc_mgr_client_get_disabled_command_type(&disabled_cmd_type)) {
1676 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get disabled command type");
1679 vc_recognition_mode_e recognition_mode = VC_RECOGNITION_MODE_STOP_BY_SILENCE;
1680 if (0 != vc_mgr_get_recognition_mode(&recognition_mode)) {
1681 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get recognition mode");
1686 vc_mgr_client_set_internal_state(VC_INTERNAL_STATE_STARTING);
1687 ret = vc_mgr_tidl_request_start(g_pid, (int)recognition_mode, exclusive_command_option, start_by_client, disabled_cmd_type);
1689 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to start request start : %s", __vc_mgr_get_error_code(ret));
1690 vc_mgr_client_set_internal_state(VC_INTERNAL_STATE_NONE);
1692 SLOG(LOG_INFO, TAG_VCM, "[SUCCESS] start recognition");
1696 g_prev_volume_db = 0;
1697 g_cur_volume_db = 0;
1699 SLOG(LOG_ERROR, TAG_VCM, "@@@ [Manager] Request start DONE, ret(%d)", ret);
1704 int vc_mgr_stop(void)
1706 SLOG(LOG_ERROR, TAG_VCM, "@@@ [Manager] Request stop");
1709 ret = __check_mgr_feature_privilege();
1710 if (VC_ERROR_NONE != ret)
1714 if (0 != vc_mgr_client_get_client_state(&state)) {
1715 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1716 return VC_ERROR_INVALID_STATE;
1720 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
1722 /* Check service state */
1723 vc_service_state_e service_state = -1;
1724 vc_mgr_client_get_service_state(&service_state);
1725 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);
1727 /* Check internal state for async */
1728 vc_internal_state_e internal_state = -1;
1729 vc_mgr_client_get_internal_state(&internal_state);
1730 if (VC_INTERNAL_STATE_STARTING == internal_state) {
1731 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State : Internal state is STARTING");
1732 return VC_ERROR_IN_PROGRESS_TO_RECORDING;
1733 } else if (VC_INTERNAL_STATE_STOPPING == internal_state) {
1734 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State : Internal state is STOPPING");
1735 return VC_ERROR_IN_PROGRESS_TO_PROCESSING;
1736 } else if (VC_INTERNAL_STATE_CANCELING == internal_state) {
1737 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State : Internal state is CANCELING");
1738 return VC_ERROR_IN_PROGRESS_TO_READY;
1743 vc_mgr_client_set_internal_state(VC_INTERNAL_STATE_STOPPING);
1744 ret = vc_mgr_tidl_request_stop(g_pid);
1746 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to stop request : %s", __vc_mgr_get_error_code(ret));
1747 vc_mgr_client_set_internal_state(VC_INTERNAL_STATE_NONE);
1749 SLOG(LOG_INFO, TAG_VCM, "[SUCCESS] Stop recognition");
1752 SLOG(LOG_DEBUG, TAG_VCM, "@@@ [Manager] Request stop DONE");
1757 int vc_mgr_cancel(void)
1759 SLOG(LOG_INFO, TAG_VCM, "@@@ [Manager] Request cancel");
1762 ret = __check_mgr_feature_privilege();
1763 if (VC_ERROR_NONE != ret)
1767 if (0 != vc_mgr_client_get_client_state(&state)) {
1768 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1769 return VC_ERROR_INVALID_STATE;
1773 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'READY'", state);
1775 /* Check service state */
1776 vc_service_state_e service_state = -1;
1777 vc_mgr_client_get_service_state(&service_state);
1778 RETVM_IF(service_state == VC_SERVICE_STATE_NONE, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state is NONE");
1780 vc_internal_state_e internal_state = -1;
1781 vc_mgr_client_get_internal_state(&internal_state);
1782 if (VC_INTERNAL_STATE_STARTING == internal_state) {
1783 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State : Internal state is STARTING");
1784 return VC_ERROR_IN_PROGRESS_TO_RECORDING;
1785 } else if (VC_INTERNAL_STATE_STOPPING == internal_state) {
1786 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State : Internal state is STOPPING");
1787 return VC_ERROR_IN_PROGRESS_TO_PROCESSING;
1788 } else if (VC_INTERNAL_STATE_CANCELING == internal_state) {
1789 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State : Internal state is CANCELING");
1790 return VC_ERROR_IN_PROGRESS_TO_READY;
1794 vc_mgr_client_set_internal_state(VC_INTERNAL_STATE_CANCELING);
1795 ret = vc_mgr_tidl_request_cancel(g_pid);
1797 SLOG(LOG_DEBUG, TAG_VCM, "[ERROR] Fail to cancel request : %s", __vc_mgr_get_error_code(ret));
1798 vc_mgr_client_set_internal_state(VC_INTERNAL_STATE_NONE);
1800 SLOG(LOG_INFO, TAG_VCM, "[SUCCESS] Cancel recognition");
1803 vc_mgr_client_set_exclusive_command(false);
1805 SLOG(LOG_DEBUG, TAG_VCM, "@@@ [Manager] Request cancel DONE");
1810 static int g_cnt = 0;
1811 static Eina_Bool __vc_mgr_set_volume_timer_cb(void* data)
1814 g_volume_db = g_prev_volume_db + (g_cur_volume_db - g_prev_volume_db) / 5 * g_cnt;
1816 SLOG(LOG_INFO, TAG_VCM, "Set volume (%f)(%f)", g_volume_db, g_cur_volume_db);
1818 if (0 == g_cnt % 5) {
1824 int __vc_mgr_cb_set_volume(float volume)
1826 // called in vc_mgr_tidl
1827 g_prev_volume_db = g_volume_db;
1828 g_cur_volume_db = volume;
1830 g_volume_db = g_prev_volume_db + (g_cur_volume_db - g_prev_volume_db) / 5;
1832 if (NULL != g_m_set_volume_timer) {
1833 ecore_timer_del(g_m_set_volume_timer);
1837 g_m_set_volume_timer = ecore_timer_add(0.05, __vc_mgr_set_volume_timer_cb, NULL);
1839 return VC_ERROR_NONE;
1842 int __vc_mgr_set_volume(float volume)
1844 // called by app directly
1845 g_volume_db = volume;
1847 return VC_ERROR_NONE;
1850 int vc_mgr_get_recording_volume(float* volume)
1853 ret = __check_mgr_feature_privilege();
1854 if (VC_ERROR_NONE != ret)
1857 RETVM_IF(NULL == volume, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Invalid parameter");
1859 vc_service_state_e service_state = -1;
1860 if (0 != vc_mgr_client_get_service_state(&service_state)) {
1861 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1862 return VC_ERROR_INVALID_STATE;
1866 RETVM_IF(VC_SERVICE_STATE_RECORDING != service_state, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Service state is not 'RECORDING'");
1868 *volume = g_volume_db;
1870 return VC_ERROR_NONE;
1873 int __vc_mgr_cb_set_foreground(int pid, bool value)
1875 vc_mgr_client_set_foreground(pid, value);
1877 /* get authorized valid app */
1879 if (0 != vc_mgr_client_get_valid_authorized_client(&tmp_pid)) {
1880 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get authorized valid app");
1881 return VC_ERROR_INVALID_PARAMETER;
1884 if (true == value) {
1885 /* compare & set valid */
1886 if (tmp_pid != pid) {
1887 SLOG(LOG_INFO, TAG_VCM, "Authority(%d) changed to invalid", tmp_pid);
1889 /* set authorized valid */
1890 if (true == vc_mgr_client_is_authorized_client(pid)) {
1891 SLOG(LOG_DEBUG, TAG_VCM, "Authority(%d) change to valid", pid);
1892 vc_mgr_client_set_valid_authorized_client(pid);
1894 SLOG(LOG_DEBUG, TAG_VCM, "No valid Authority");
1895 vc_mgr_client_set_valid_authorized_client(-1);
1899 if (tmp_pid == pid) {
1900 SLOG(LOG_INFO, TAG_VCM, "Authority(%d) changed to invalid", tmp_pid);
1901 vc_mgr_client_set_valid_authorized_client(-1);
1905 return VC_ERROR_NONE;
1908 int vc_mgr_set_selected_results(vc_cmd_list_h vc_cmd_list)
1910 SLOG(LOG_INFO, TAG_VCM, "@@@ [Manager] Select result");
1913 ret = __check_mgr_feature_privilege();
1914 if (VC_ERROR_NONE != ret)
1917 /* Do not check state for 'restart continuously' mode */
1919 vc_service_state_e service_state = -1;
1920 vc_mgr_client_get_service_state(&service_state);
1921 if (service_state != VC_SERVICE_STATE_PROCESSING) {
1922 vc_recognition_mode_e recognition_mode;
1923 vc_mgr_get_recognition_mode(&recognition_mode);
1925 if (VC_RECOGNITION_MODE_RESTART_CONTINUOUSLY != recognition_mode) {
1926 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: service state is not 'PROCESSING' and mode is not 'Restart continuously'");
1927 return VC_ERROR_INVALID_STATE;
1931 if (NULL != vc_cmd_list) {
1933 char* result_text = NULL;
1935 vc_mgr_client_get_all_result(&event, &result_text);
1937 vc_info_parser_set_result(result_text, event, NULL, vc_cmd_list, false);
1939 if (NULL != result_text) {
1946 ret = vc_mgr_tidl_send_result_selection(g_pid);
1948 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to send result selection : %s", __vc_mgr_get_error_code(ret));
1951 SLOG(LOG_INFO, TAG_VCM, "[SUCCESS] result selection");
1954 vc_mgr_client_unset_all_result();
1956 SLOG(LOG_DEBUG, TAG_VCM, "@@@ [Manager] Select result DONE");
1958 return VC_ERROR_NONE;
1961 static Eina_Bool __vc_mgr_set_select_result(void *data)
1963 vc_mgr_set_selected_results(NULL);
1967 static void __vc_mgr_notify_all_result(vc_result_type_e result_type)
1969 char* temp_text = NULL;
1971 char* temp_message = NULL;
1972 vc_cmd_list_h vc_cmd_list = NULL;
1974 vc_mgr_all_result_cb all_callback = NULL;
1975 void* all_user_data = NULL;
1977 vc_mgr_client_get_all_result_cb(&all_callback, &all_user_data);
1978 RETM_IF(NULL == all_callback, TAG_VCM, "[ERROR] All result callback is NULL");
1980 if (0 != vc_cmd_list_create(&vc_cmd_list)) {
1981 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to create command list");
1985 vc_info_parser_get_result(&temp_text, &event, &temp_message, -1, vc_cmd_list, vc_mgr_client_get_exclusive_command());
1987 SECURE_SLOG(LOG_INFO, TAG_VCM, "Result info : result type(%d) result text(%s) event(%d) result_message(%s)",
1988 result_type, temp_text, event, temp_message);
1990 vc_cmd_print_list(vc_cmd_list);
1992 bool cb_ret = false;
1994 vc_mgr_client_set_all_result(event, temp_text);
1996 vc_mgr_client_use_callback();
1997 cb_ret = all_callback(event, vc_cmd_list, temp_text, temp_message, all_user_data);
1998 vc_mgr_client_not_use_callback();
2000 if (true == vc_mgr_client_get_exclusive_command()) {
2002 vc_result_cb callback = NULL;
2003 void* user_data = NULL;
2005 vc_mgr_client_get_result_cb(&callback, &user_data);
2006 RETM_IF(NULL == callback, TAG_VCM, "[ERROR] Client result callback is NULL");
2008 vc_mgr_client_use_callback();
2009 callback(event, vc_cmd_list, temp_text, user_data);
2010 vc_mgr_client_not_use_callback();
2011 SLOG(LOG_DEBUG, TAG_VCM, "Exclusive result callback called");
2013 /* Release result */
2014 if (NULL != temp_text) {
2018 if (NULL != temp_message) {
2020 temp_message = NULL;
2025 vc_cmd_list_destroy(vc_cmd_list, true);
2028 vc_mgr_client_set_exclusive_command(false);
2034 vc_cmd_list_get_count(vc_cmd_list, &count);
2036 if (true == cb_ret) {
2037 SLOG(LOG_INFO, TAG_VCM, "Callback result is true");
2038 if (VC_RESULT_TYPE_NOTIFICATION != result_type)
2039 ecore_idler_add(__vc_mgr_set_select_result, NULL);
2041 SLOG(LOG_INFO, TAG_VCM, "Callback result is false");
2042 /* need to select conflicted result */
2045 if (VC_RESULT_TYPE_NOTIFICATION != result_type)
2046 ecore_idler_add(__vc_mgr_set_select_result, NULL);
2048 vc_mgr_client_set_exclusive_command(false);
2049 vc_mgr_client_unset_all_result();
2052 /* Release result */
2053 if (NULL != temp_text) {
2057 if (NULL != temp_message) {
2059 temp_message = NULL;
2064 vc_cmd_list_destroy(vc_cmd_list, true);
2070 static Eina_Bool __vc_mgr_notify_result(void *data)
2072 char* temp_text = NULL;
2074 vc_cmd_list_h vc_cmd_list = NULL;
2076 vc_result_cb callback = NULL;
2077 void* user_data = NULL;
2079 vc_mgr_client_get_result_cb(&callback, &user_data);
2080 RETVM_IF(NULL == callback, EINA_FALSE, TAG_VCM, "[ERROR] Client result callback is NULL");
2082 if (0 != vc_cmd_list_create(&vc_cmd_list)) {
2083 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to create command list");
2087 vc_info_parser_get_result(&temp_text, &event, NULL, getpid(), vc_cmd_list, false);
2089 SECURE_SLOG(LOG_INFO, TAG_VCM, "Result : result text(%s) event(%d)", temp_text, event);
2091 vc_cmd_print_list(vc_cmd_list);
2093 vc_mgr_client_use_callback();
2094 callback(event, vc_cmd_list, temp_text, user_data);
2095 vc_mgr_client_not_use_callback();
2096 SLOG(LOG_INFO, TAG_VCM, "Result callback called");
2099 vc_cmd_list_destroy(vc_cmd_list, true);
2102 /* Release result */
2110 void __vc_mgr_cb_all_result(vc_result_type_e type)
2112 if (false == vc_mgr_client_get_exclusive_command()) {
2113 __vc_mgr_notify_all_result(type);
2115 __vc_mgr_notify_result(0);
2121 void __vc_mgr_cb_pre_result(vc_pre_result_event_e event, const char* pre_result)
2123 vc_mgr_pre_result_cb callback = NULL;
2124 void* user_data = NULL;
2126 vc_mgr_client_get_pre_result_cb(&callback, &user_data);
2127 RETM_IF(NULL == callback, TAG_VCM, "[ERROR] Client pre result callback is NULL");
2129 vc_mgr_client_use_callback();
2130 callback(event, pre_result, user_data);
2131 vc_mgr_client_not_use_callback();
2132 SLOG(LOG_INFO, TAG_VCM, "Pre result callback is called");
2137 void __vc_mgr_cb_system_result()
2139 __vc_mgr_notify_result(NULL);
2143 static Eina_Bool __vc_mgr_speech_detected(void *data)
2145 vc_mgr_begin_speech_detected_cb callback = NULL;
2146 void* user_data = NULL;
2148 vc_mgr_client_get_speech_detected_cb(&callback, &user_data);
2149 RETVM_IF(NULL == callback, EINA_FALSE, TAG_VCM, "[ERROR] Client speech detected callback is NULL");
2151 vc_mgr_client_use_callback();
2152 callback(user_data);
2153 vc_mgr_client_not_use_callback();
2154 SLOG(LOG_INFO, TAG_VCM, "Speech detected callback called");
2159 void __vc_mgr_cb_speech_detected()
2161 __vc_mgr_speech_detected(NULL);
2166 int vc_mgr_set_all_result_cb(vc_mgr_all_result_cb callback, void* user_data)
2169 ret = __check_mgr_feature_privilege();
2170 if (VC_ERROR_NONE != ret)
2173 RETVM_IF(NULL == callback, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Invalid parameter");
2176 if (0 != vc_mgr_client_get_client_state(&state)) {
2177 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set result callback : A handle is not available");
2178 return VC_ERROR_INVALID_STATE;
2182 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
2184 vc_mgr_client_set_all_result_cb(callback, user_data);
2186 SLOG(LOG_INFO, TAG_VCM, "[SUCCESS] Set all result callback");
2188 return VC_ERROR_NONE;
2191 int vc_mgr_unset_all_result_cb(void)
2194 ret = __check_mgr_feature_privilege();
2195 if (VC_ERROR_NONE != ret)
2199 if (0 != vc_mgr_client_get_client_state(&state)) {
2200 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset result callback : A handle is not available");
2201 return VC_ERROR_INVALID_STATE;
2205 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
2207 vc_mgr_client_set_all_result_cb(NULL, NULL);
2209 return VC_ERROR_NONE;
2212 int vc_mgr_set_result_cb(vc_result_cb callback, void* user_data)
2215 ret = __check_mgr_feature_privilege();
2216 if (VC_ERROR_NONE != ret)
2219 RETVM_IF(NULL == callback, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Invalid parameter");
2222 if (0 != vc_mgr_client_get_client_state(&state)) {
2223 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set result callback : A handle is not available");
2224 return VC_ERROR_INVALID_STATE;
2228 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
2230 vc_mgr_client_set_result_cb(callback, user_data);
2232 return VC_ERROR_NONE;
2235 int vc_mgr_unset_result_cb(void)
2238 ret = __check_mgr_feature_privilege();
2239 if (VC_ERROR_NONE != ret)
2243 if (0 != vc_mgr_client_get_client_state(&state)) {
2244 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset result callback : A handle is not available");
2245 return VC_ERROR_INVALID_STATE;
2249 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
2251 vc_mgr_client_set_result_cb(NULL, NULL);
2253 return VC_ERROR_NONE;
2256 int vc_mgr_set_pre_result_cb(vc_mgr_pre_result_cb callback, void* user_data)
2259 ret = __check_mgr_feature_privilege();
2260 if (VC_ERROR_NONE != ret)
2263 RETVM_IF(NULL == callback, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Invalid parameter");
2266 if (0 != vc_mgr_client_get_client_state(&state)) {
2267 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set pre result callback : A handle is not available");
2268 return VC_ERROR_INVALID_STATE;
2272 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
2274 vc_mgr_client_set_pre_result_cb(callback, user_data);
2276 return VC_ERROR_NONE;
2279 int vc_mgr_unset_pre_result_cb(void)
2282 ret = __check_mgr_feature_privilege();
2283 if (VC_ERROR_NONE != ret)
2287 if (0 != vc_mgr_client_get_client_state(&state)) {
2288 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset pre result callback : A handle is not available");
2289 return VC_ERROR_INVALID_STATE;
2293 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
2295 vc_mgr_client_set_pre_result_cb(NULL, NULL);
2297 return VC_ERROR_NONE;
2300 int vc_mgr_get_error_message(char** err_msg)
2302 SLOG(LOG_DEBUG, TAG_VCM, "@@@ [Manager] Get error message");
2305 ret = __check_mgr_feature_privilege();
2306 if (VC_ERROR_NONE != ret)
2311 if (0 != vc_mgr_client_get_client_state(&state)) {
2312 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] vc_mgr handle is not available");
2313 return VC_ERROR_INVALID_STATE;
2316 RETVM_IF(NULL == err_msg, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Invalid parameter");
2318 if (false == g_err_callback_status) {
2319 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Not in error callback");
2320 return VC_ERROR_OPERATION_FAILED;
2323 ret = vc_mgr_client_get_error_message(err_msg);
2325 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get error message");
2328 SLOG(LOG_DEBUG, TAG_VCM, "@@@ [Manager] Get error message DONE");
2333 static void __vc_mgr_notify_error(void *data)
2335 vc_error_cb callback = NULL;
2336 void* user_data = NULL;
2339 vc_mgr_client_get_error_cb(&callback, &user_data);
2340 vc_mgr_client_get_error(&reason);
2342 if (NULL != callback) {
2343 vc_mgr_client_use_callback();
2344 g_err_callback_status = true;
2345 callback(reason, user_data);
2346 g_err_callback_status = false;
2347 vc_mgr_client_not_use_callback();
2348 SLOG(LOG_INFO, TAG_VCM, "Error callback is called");
2350 SLOG(LOG_WARN, TAG_VCM, "[WARNING] Error callback is null");
2354 int __vc_mgr_cb_error(int reason, int daemon_pid, char* msg)
2357 if (0 != vc_mgr_client_get_client_state(&state)) {
2358 SLOG(LOG_ERROR, TAG_VCM, "[WARNING] Invalid client");
2359 return VC_ERROR_INVALID_PARAMETER;
2363 if (state != VC_STATE_INITIALIZED && state != VC_STATE_READY) {
2364 SLOG(LOG_ERROR, TAG_VCM, "[WARNING] not connected client yet");
2365 return VC_ERROR_INVALID_STATE;
2368 vc_mgr_client_set_internal_state(VC_INTERNAL_STATE_NONE);
2370 if (VC_ERROR_SERVICE_RESET == reason) {
2371 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] VC daemon reset");
2373 vc_service_state_e service_state = -1;
2374 vc_mgr_client_get_service_state(&service_state);
2375 if (VC_SERVICE_STATE_UPDATING == service_state) {
2376 SLOG(LOG_INFO, TAG_VCM, "[INFO] VC daemon is terminated by update manager");
2377 return VC_ERROR_NONE;
2380 vc_mgr_client_set_client_state(VC_STATE_INITIALIZED);
2381 __vc_mgr_notify_state_changed(NULL);
2383 if (0 != vc_mgr_prepare()) {
2384 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to prepare");
2388 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Error reason(%d), msg(%s)", reason, msg);
2390 vc_mgr_client_set_error(reason);
2391 vc_mgr_client_set_error_message(msg);
2392 __vc_mgr_notify_error(NULL);
2394 return VC_ERROR_NONE;
2397 static Eina_Bool __vc_mgr_notify_state_changed(void *data)
2399 vc_state_changed_cb changed_callback = NULL;
2402 vc_mgr_client_get_state_changed_cb(&changed_callback, &user_data);
2404 vc_state_e current_state;
2405 vc_state_e previous_state;
2407 vc_mgr_client_get_previous_state(¤t_state, &previous_state);
2409 if (NULL != changed_callback) {
2410 vc_mgr_client_use_callback();
2411 changed_callback(previous_state, current_state, user_data);
2412 vc_mgr_client_not_use_callback();
2413 SLOG(LOG_INFO, TAG_VCM, "State changed callback is called");
2415 SLOG(LOG_WARN, TAG_VCM, "[WARNING] State changed callback is null");
2421 int vc_mgr_set_state_changed_cb(vc_state_changed_cb callback, void* user_data)
2424 ret = __check_mgr_feature_privilege();
2425 if (VC_ERROR_NONE != ret)
2428 if (callback == NULL)
2429 return VC_ERROR_INVALID_PARAMETER;
2432 if (0 != vc_mgr_client_get_client_state(&state)) {
2433 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set state changed callback : A handle is not available");
2434 return VC_ERROR_INVALID_STATE;
2438 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
2440 vc_mgr_client_set_state_changed_cb(callback, user_data);
2442 SLOG(LOG_INFO, TAG_VCM, "[SUCCESS] Set state changed callback");
2443 return VC_ERROR_NONE;
2446 int vc_mgr_unset_state_changed_cb(void)
2449 ret = __check_mgr_feature_privilege();
2450 if (VC_ERROR_NONE != ret)
2454 if (0 != vc_mgr_client_get_client_state(&state)) {
2455 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset state changed callback : A handle is not available");
2456 return VC_ERROR_INVALID_STATE;
2460 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
2462 vc_mgr_client_set_state_changed_cb(NULL, NULL);
2464 return VC_ERROR_NONE;
2467 int __vc_mgr_cb_service_state(int state)
2469 vc_service_state_e current_state = (vc_service_state_e)state;
2470 vc_service_state_e previous_state;
2471 vc_mgr_client_get_service_state(&previous_state);
2473 SLOG(LOG_INFO, TAG_VCM, "Service State changed : previous(%d) current(%d)",
2474 previous_state, current_state);
2476 vc_internal_state_e internal_state = -1;
2477 vc_mgr_client_get_internal_state(&internal_state);
2478 if ((VC_INTERNAL_STATE_STARTING == internal_state && VC_SERVICE_STATE_RECORDING == current_state) ||
2479 (VC_INTERNAL_STATE_STOPPING == internal_state && VC_SERVICE_STATE_PROCESSING == current_state) ||
2480 (VC_INTERNAL_STATE_CANCELING == internal_state && VC_SERVICE_STATE_READY == current_state)) {
2481 SLOG(LOG_INFO, TAG_VCM, "Internal state is changed to NONE");
2482 vc_mgr_client_set_internal_state(VC_INTERNAL_STATE_NONE);
2484 if (VC_SERVICE_STATE_UPDATING == current_state) {
2485 SLOG(LOG_INFO, TAG_VCM, "Internal state is changed to NONE by updating");
2486 vc_mgr_client_set_internal_state(VC_INTERNAL_STATE_NONE);
2489 if (current_state == previous_state) {
2490 SLOG(LOG_WARN, TAG_VCM, "Service State NOT changed : previous(%d) current(%d)",
2491 previous_state, current_state);
2492 return VC_ERROR_NONE;
2495 /* Save service state */
2496 vc_mgr_client_set_service_state(current_state);
2498 vc_service_state_changed_cb callback = NULL;
2499 void* service_user_data = NULL;
2500 vc_mgr_client_get_service_state_changed_cb(&callback, &service_user_data);
2502 if (NULL != callback) {
2503 vc_mgr_client_use_callback();
2504 callback(previous_state, current_state, service_user_data);
2505 vc_mgr_client_not_use_callback();
2506 SLOG(LOG_INFO, TAG_VCM, "Service state changed callback is called");
2508 SLOG(LOG_WARN, TAG_VCM, "[WARNING] Service state changed callback is null");
2511 return VC_ERROR_NONE;
2514 int vc_mgr_set_service_state_changed_cb(vc_service_state_changed_cb callback, void* user_data)
2517 ret = __check_mgr_feature_privilege();
2518 if (VC_ERROR_NONE != ret)
2521 if (callback == NULL)
2522 return VC_ERROR_INVALID_PARAMETER;
2525 if (0 != vc_mgr_client_get_client_state(&state)) {
2526 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set state changed callback : A handle is not available");
2527 return VC_ERROR_INVALID_STATE;
2531 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
2533 vc_mgr_client_set_service_state_changed_cb(callback, user_data);
2535 SLOG(LOG_INFO, TAG_VCM, "[SUCCESS] Set service state changed callback");
2536 return VC_ERROR_NONE;
2539 int vc_mgr_unset_service_state_changed_cb(void)
2542 ret = __check_mgr_feature_privilege();
2543 if (VC_ERROR_NONE != ret)
2547 if (0 != vc_mgr_client_get_client_state(&state)) {
2548 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset state changed callback : A handle is not available");
2549 return VC_ERROR_INVALID_STATE;
2553 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
2555 vc_mgr_client_set_service_state_changed_cb(NULL, NULL);
2556 return VC_ERROR_NONE;
2559 int vc_mgr_set_speech_detected_cb(vc_mgr_begin_speech_detected_cb callback, void* user_data)
2562 ret = __check_mgr_feature_privilege();
2563 if (VC_ERROR_NONE != ret)
2566 if (callback == NULL)
2567 return VC_ERROR_INVALID_PARAMETER;
2570 if (0 != vc_mgr_client_get_client_state(&state)) {
2571 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set state changed callback : A handle is not available");
2572 return VC_ERROR_INVALID_STATE;
2576 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
2578 vc_mgr_client_set_speech_detected_cb(callback, user_data);
2580 SLOG(LOG_INFO, TAG_VCM, "[SUCCESS] Set speech detected callback");
2581 return VC_ERROR_NONE;
2584 int vc_mgr_unset_speech_detected_cb(void)
2587 ret = __check_mgr_feature_privilege();
2588 if (VC_ERROR_NONE != ret)
2592 if (0 != vc_mgr_client_get_client_state(&state)) {
2593 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset state changed callback : A handle is not available");
2594 return VC_ERROR_INVALID_STATE;
2598 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
2600 vc_mgr_client_set_speech_detected_cb(NULL, NULL);
2601 return VC_ERROR_NONE;
2604 int vc_mgr_set_current_language_changed_cb(vc_current_language_changed_cb callback, void* user_data)
2607 ret = __check_mgr_feature_privilege();
2608 if (VC_ERROR_NONE != ret)
2611 RETVM_IF(NULL == callback, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Invalid parameter");
2614 if (0 != vc_mgr_client_get_client_state(&state)) {
2615 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set current language changed : A handle is not available");
2616 return VC_ERROR_INVALID_STATE;
2620 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
2622 vc_mgr_client_set_current_lang_changed_cb(callback, user_data);
2624 SLOG(LOG_INFO, TAG_VCM, "[SUCCESS] Set current language changed callback");
2625 return VC_ERROR_NONE;
2628 int vc_mgr_unset_current_language_changed_cb(void)
2631 ret = __check_mgr_feature_privilege();
2632 if (VC_ERROR_NONE != ret)
2636 if (0 != vc_mgr_client_get_client_state(&state)) {
2637 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset current language changed : A handle is not available");
2638 return VC_ERROR_INVALID_STATE;
2642 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
2644 vc_mgr_client_set_current_lang_changed_cb(NULL, NULL);
2646 return VC_ERROR_NONE;
2649 int vc_mgr_set_error_cb(vc_error_cb callback, void* user_data)
2652 ret = __check_mgr_feature_privilege();
2653 if (VC_ERROR_NONE != ret)
2656 RETVM_IF(NULL == callback, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Invalid parameter");
2659 if (0 != vc_mgr_client_get_client_state(&state)) {
2660 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set error callback : A handle is not available");
2661 return VC_ERROR_INVALID_STATE;
2665 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
2667 vc_mgr_client_set_error_cb(callback, user_data);
2669 return VC_ERROR_NONE;
2672 int vc_mgr_unset_error_cb(void)
2675 ret = __check_mgr_feature_privilege();
2676 if (VC_ERROR_NONE != ret)
2680 if (0 != vc_mgr_client_get_client_state(&state)) {
2681 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset error callback : A handle is not available");
2682 return VC_ERROR_INVALID_STATE;
2686 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
2688 vc_mgr_client_set_error_cb(NULL, NULL);
2690 return VC_ERROR_NONE;
2693 int __vc_mgr_cb_dialog(int pid, const char* disp_text, const char* utt_text, bool continuous)
2695 vc_mgr_dialog_request_cb callback = NULL;
2696 void* user_data = NULL;
2698 vc_mgr_client_get_dialog_request_cb(&callback, &user_data);
2700 if (NULL != callback) {
2701 vc_mgr_client_use_callback();
2702 callback(pid, disp_text, utt_text, continuous, user_data);
2703 vc_mgr_client_not_use_callback();
2704 SLOG(LOG_INFO, TAG_VCM, "Dialog callback is called, disp_text(%s), utt)text(%s), continuous(%d)", disp_text, utt_text, continuous);
2706 SLOG(LOG_WARN, TAG_VCM, "[WARNING] Error callback is null");
2709 return VC_ERROR_NONE;
2712 int __vc_mgr_cb_private_data_set(const char* key, const char* data)
2714 vc_mgr_private_data_set_cb callback = NULL;
2715 void* user_data = NULL;
2718 vc_mgr_client_get_private_data_set_cb(&callback, &user_data);
2720 if (NULL != callback) {
2721 vc_mgr_client_use_callback();
2722 ret = callback(key, data, user_data);
2723 vc_mgr_client_not_use_callback();
2724 SLOG(LOG_INFO, TAG_VCM, "Private data set callback is called");
2726 SLOG(LOG_WARN, TAG_VCM, "[WARNING] Private data set callback is null");
2732 int __vc_mgr_cb_private_data_requested(const char* key, char** data)
2734 vc_mgr_private_data_requested_cb callback = NULL;
2735 void* user_data = NULL;
2738 vc_mgr_client_get_private_data_requested_cb(&callback, &user_data);
2740 if (NULL != callback) {
2741 vc_mgr_client_use_callback();
2742 ret = callback(key, data, user_data);
2743 vc_mgr_client_not_use_callback();
2744 SLOG(LOG_INFO, TAG_VCM, "Private data requested callback is called");
2746 SLOG(LOG_WARN, TAG_VCM, "[WARNING] Private data requested callback is null");
2752 /* for TTS feedback */
2753 int __vc_mgr_cb_feedback_audio_format(int rate, vc_audio_channel_e channel, vc_audio_type_e audio_type)
2755 vc_mgr_feedback_audio_format_cb callback = NULL;
2756 void* user_data = NULL;
2758 /* set global audio formats */
2759 g_feedback_rate = rate;
2760 g_feedback_audio_channel = channel;
2761 g_feedback_audio_type = audio_type;
2763 vc_mgr_client_get_feedback_audio_format_cb(&callback, &user_data);
2765 if (NULL != callback) {
2766 vc_mgr_client_use_callback();
2767 callback(rate, channel, audio_type, user_data);
2768 vc_mgr_client_not_use_callback();
2769 SLOG(LOG_INFO, TAG_VCM, "TTS feedback audio format callback is called");
2771 SLOG(LOG_WARN, TAG_VCM, "[WARNING] TTS feedback audio format callback is null");
2774 return VC_ERROR_NONE;
2777 int __vc_mgr_cb_feedback_streaming(int pid, int utt_id, vc_feedback_event_e event, char* buffer, int len)
2779 /* add feedback data */
2780 vc_feedback_data_s* temp_feedback_data = NULL;
2781 temp_feedback_data = (vc_feedback_data_s*)calloc(1, sizeof(vc_feedback_data_s));
2782 RETVM_IF(NULL == temp_feedback_data, VC_ERROR_OUT_OF_MEMORY, TAG_VCM, "[ERROR] Out of memory");
2783 SLOG(LOG_INFO, TAG_VCM, "[INFO] feedback streaming before queing");
2785 temp_feedback_data->data = NULL;
2786 temp_feedback_data->rate = g_feedback_rate;
2787 temp_feedback_data->data_size = 0;
2790 temp_feedback_data->data = (char*)calloc(len + 5, sizeof(char));
2791 if (NULL != temp_feedback_data->data) {
2792 memcpy(temp_feedback_data->data, buffer, len);
2793 temp_feedback_data->data_size = len;
2794 SLOG(LOG_DEBUG, TAG_VCM, "[DEBUG][memcpy] data(%p) size(%d)",
2795 temp_feedback_data->data, temp_feedback_data->data_size);
2797 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] fail to allocate memory");
2800 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] feedback data is NULL");
2803 temp_feedback_data->pid = pid;
2804 temp_feedback_data->utt_id = utt_id;
2805 temp_feedback_data->event = event;
2806 temp_feedback_data->audio_type = g_feedback_audio_type;
2807 temp_feedback_data->channel = g_feedback_audio_channel;
2809 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);
2811 int ret = vc_mgr_data_add_feedback_data(temp_feedback_data);
2813 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to add feedback data");
2814 if (NULL != temp_feedback_data->data) {
2815 free(temp_feedback_data->data);
2816 temp_feedback_data->data = NULL;
2818 if (NULL != temp_feedback_data) {
2819 free(temp_feedback_data);
2820 temp_feedback_data = NULL;
2828 int vc_mgr_set_dialog_request_cb(vc_mgr_dialog_request_cb callback, void* user_data)
2831 ret = __check_mgr_feature_privilege();
2832 if (VC_ERROR_NONE != ret)
2835 RETVM_IF(NULL == callback, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Invalid parameter");
2838 if (0 != vc_mgr_client_get_client_state(&state)) {
2839 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set error callback : A handle is not available");
2840 return VC_ERROR_INVALID_STATE;
2844 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
2846 vc_mgr_client_set_dialog_request_cb(callback, user_data);
2848 return VC_ERROR_NONE;
2851 int vc_mgr_unset_dialog_request_cb(void)
2854 ret = __check_mgr_feature_privilege();
2855 if (VC_ERROR_NONE != ret)
2859 if (0 != vc_mgr_client_get_client_state(&state)) {
2860 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset error callback : A handle is not available");
2861 return VC_ERROR_INVALID_STATE;
2865 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
2867 vc_mgr_client_set_dialog_request_cb(NULL, NULL);
2869 return VC_ERROR_NONE;
2872 int vc_mgr_set_private_data_set_cb(vc_mgr_private_data_set_cb callback, void* user_data)
2875 ret = __check_mgr_feature_privilege();
2876 if (VC_ERROR_NONE != ret)
2879 RETVM_IF(NULL == callback, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Invalid parameter");
2882 if (0 != vc_mgr_client_get_client_state(&state)) {
2883 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set private data set callback : A handle is not available");
2884 return VC_ERROR_INVALID_STATE;
2888 RETVM_IF(VC_STATE_INITIALIZED != state, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Set private data set callback : Current state is not 'Initialized'");
2890 vc_mgr_client_set_private_data_set_cb(callback, user_data);
2892 return VC_ERROR_NONE;
2895 int vc_mgr_unset_private_data_set_cb(void)
2898 ret = __check_mgr_feature_privilege();
2899 if (VC_ERROR_NONE != ret)
2903 if (0 != vc_mgr_client_get_client_state(&state)) {
2904 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset private data set callback : A handle is not available");
2905 return VC_ERROR_INVALID_STATE;
2909 RETVM_IF(VC_STATE_INITIALIZED != state, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Unset private data set callback : Current state is not 'Initialized'");
2911 vc_mgr_client_set_private_data_set_cb(NULL, NULL);
2913 return VC_ERROR_NONE;
2916 int vc_mgr_set_private_data_requested_cb(vc_mgr_private_data_requested_cb callback, void* user_data)
2919 ret = __check_mgr_feature_privilege();
2920 if (VC_ERROR_NONE != ret)
2923 RETVM_IF(NULL == callback, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Invalid parameter");
2926 if (0 != vc_mgr_client_get_client_state(&state)) {
2927 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set private data requested callback : A handle is not available");
2928 return VC_ERROR_INVALID_STATE;
2932 RETVM_IF(VC_STATE_INITIALIZED != state, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Set private data requested callback : Current state is not 'Initialized'");
2934 vc_mgr_client_set_private_data_requested_cb(callback, user_data);
2936 return VC_ERROR_NONE;
2939 int vc_mgr_unset_private_data_requested_cb(void)
2942 ret = __check_mgr_feature_privilege();
2943 if (VC_ERROR_NONE != ret)
2947 if (0 != vc_mgr_client_get_client_state(&state)) {
2948 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset private data requested callback : A handle is not available");
2949 return VC_ERROR_INVALID_STATE;
2953 RETVM_IF(VC_STATE_INITIALIZED != state, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Unset private data requested callback : Current state is not 'Initialized'");
2955 vc_mgr_client_set_private_data_requested_cb(NULL, NULL);
2957 return VC_ERROR_NONE;
2960 static bool __vc_mgr_check_demandable_client(int pid)
2962 if (0 == g_slist_length(g_demandable_client_list)) {
2963 SLOG(LOG_WARN, TAG_VCM, "[WARNING] No demandable clients");
2967 char appid[1024] = {'\0', };
2968 if (0 != aul_app_get_appid_bypid(pid, appid, sizeof(appid) - 1)) {
2969 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get callee appid by pid");
2972 SLOG(LOG_INFO, TAG_VCM, "[CHECK] Appid - %s", appid);
2974 GSList *iter = NULL;
2975 vc_demandable_client_s* temp_client;
2976 iter = g_slist_nth(g_demandable_client_list, 0);
2978 while (NULL != iter) {
2979 temp_client = iter->data;
2981 if (NULL != temp_client) {
2982 if (NULL != temp_client->appid) {
2983 if (!strcmp(temp_client->appid, appid)) {
2984 SLOG(LOG_DEBUG, TAG_VCM, "pid(%d) is available", pid);
2990 iter = g_slist_next(iter);
2997 int __vc_mgr_request_auth_enable(int pid)
2999 if (false == __vc_mgr_check_demandable_client(pid)) {
3000 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Not demandable client");
3001 return VC_ERROR_INVALID_PARAMETER;
3004 /* check already authorized */
3005 if (true == vc_mgr_client_is_authorized_client(pid)) {
3006 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Already authorized");
3007 return VC_ERROR_INVALID_PARAMETER;
3010 /* add authorized list */
3011 if (0 != vc_mgr_client_add_authorized_client(pid)) {
3012 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to add authorized client");
3013 return VC_ERROR_OPERATION_FAILED;
3016 /* foreground check */
3018 if (0 != vc_mgr_client_get_foreground(&fore_pid)) {
3019 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get foreground");
3020 return VC_ERROR_OPERATION_FAILED;
3023 if (pid == fore_pid) {
3024 vc_mgr_client_set_valid_authorized_client(pid);
3027 return VC_ERROR_NONE;
3030 int __vc_mgr_request_auth_disable(int pid)
3032 /* check authorized */
3033 if (false == vc_mgr_client_is_authorized_client(pid)) {
3034 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] No authorized");
3035 return VC_ERROR_INVALID_PARAMETER;
3038 /* remove authorized list */
3039 if (0 != vc_mgr_client_remove_authorized_client(pid)) {
3040 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to remove authorized client");
3041 return VC_ERROR_OPERATION_FAILED;
3044 /* check authority valid */
3045 if (true == vc_mgr_client_is_valid_authorized_client(pid)) {
3046 SLOG(LOG_DEBUG, TAG_VCM, "Valid authorized client is removed");
3047 if (0 != vc_mgr_client_set_valid_authorized_client(-1)) {
3048 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to set valid authorized client");
3049 return VC_ERROR_OPERATION_FAILED;
3053 return VC_ERROR_NONE;
3056 static Eina_Bool __request_auth_start(void* data)
3058 SLOG(LOG_INFO, TAG_VCM, "Request Start");
3060 if (0 != vc_mgr_client_set_start_by_client(true)) {
3061 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to set start by client");
3064 if (0 != vc_mgr_start(false)) {
3065 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Request start is failed");
3066 /* TODO - Error handling? */
3069 if (0 != vc_mgr_client_set_start_by_client(false)) {
3070 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to set start by client");
3077 int __vc_mgr_request_auth_start(int pid)
3079 /* check authorized */
3080 if (false == vc_mgr_client_is_valid_authorized_client(pid)) {
3081 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] No valid authorized client");
3082 return VC_ERROR_INVALID_PARAMETER;
3085 /* add timer for start recording */
3086 ecore_timer_add(0, __request_auth_start, NULL);
3088 return VC_ERROR_NONE;
3091 static Eina_Bool __request_auth_stop(void* data)
3093 SLOG(LOG_INFO, TAG_VCM, "Request Stop");
3095 if (0 != vc_mgr_stop()) {
3096 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Request stop is failed");
3097 /* TODO - Error handling? */
3103 int __vc_mgr_request_auth_stop(int pid)
3105 /* check authorized */
3106 if (false == vc_mgr_client_is_valid_authorized_client(pid)) {
3107 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] No valid authorized client");
3108 return VC_ERROR_INVALID_PARAMETER;
3111 /* add timer for start recording */
3112 ecore_timer_add(0, __request_auth_stop, NULL);
3114 return VC_ERROR_NONE;
3117 static Eina_Bool __request_auth_cancel(void* data)
3119 SLOG(LOG_INFO, TAG_VCM, "Request Cancel");
3121 if (0 != vc_mgr_cancel()) {
3122 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Request cancel is failed");
3123 /* TODO - Error handling? */
3129 int __vc_mgr_request_auth_cancel(int pid)
3131 /* check authorized */
3132 if (false == vc_mgr_client_is_valid_authorized_client(pid)) {
3133 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] No valid authorized client");
3134 return VC_ERROR_INVALID_PARAMETER;
3137 /* add timer for start recording */
3138 ecore_timer_add(0, __request_auth_cancel, NULL);
3140 return VC_ERROR_NONE;
3143 int vc_mgr_set_specific_engine_result_cb(vc_mgr_specific_engine_result_cb callback, void* user_data)
3146 ret = __check_mgr_feature_privilege();
3147 if (VC_ERROR_NONE != ret)
3150 RETVM_IF(NULL == callback, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Invalid parameter");
3153 if (0 != vc_mgr_client_get_client_state(&state)) {
3154 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set specific engine result callback : A handle is not available");
3155 return VC_ERROR_INVALID_STATE;
3159 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
3161 vc_mgr_client_set_specific_engine_result_cb(callback, user_data);
3163 return VC_ERROR_NONE;
3165 int vc_mgr_unset_specific_engine_result_cb(void)
3167 if (0 != __vc_mgr_get_feature_enabled()) {
3168 return VC_ERROR_NOT_SUPPORTED;
3172 if (0 != vc_mgr_client_get_client_state(&state)) {
3173 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset specific engine result callback : A handle is not available");
3174 return VC_ERROR_INVALID_STATE;
3178 RETVM_IF(state != VC_STATE_INITIALIZED, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Initialized'", state);
3180 vc_mgr_client_set_specific_engine_result_cb(NULL, NULL);
3182 return VC_ERROR_NONE;
3185 void __vc_mgr_cb_specific_engine_result(const char* engine_app_id, const char* event, const char* result)
3187 vc_mgr_specific_engine_result_cb callback = NULL;
3188 void* user_data = NULL;
3190 vc_mgr_client_get_specific_engine_result_cb(&callback, &user_data);
3191 RETM_IF(NULL == callback, TAG_VCM, "[ERROR] Client specific engine result callback is NULL");
3193 vc_mgr_client_use_callback();
3194 callback(engine_app_id, event, result, user_data);
3195 vc_mgr_client_not_use_callback();
3196 SLOG(LOG_INFO, TAG_VCM, "Specific engine result callback is called, engine app id(%s), event(%s), result(%s)", engine_app_id, event, result);
3201 /* for TTS feedback */
3202 int vc_mgr_set_feedback_audio_format_cb(vc_mgr_feedback_audio_format_cb callback, void* user_data)
3204 SLOG(LOG_INFO, TAG_VCM, "@@@ [Manager] set feedback audio format");
3207 ret = __check_mgr_feature_privilege();
3208 if (VC_ERROR_NONE != ret)
3211 RETVM_IF(NULL == callback, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Invalid parameter");
3214 if (0 != vc_mgr_client_get_client_state(&state)) {
3215 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set feedback audio format callback : A handle is not available");
3216 return VC_ERROR_INVALID_STATE;
3220 RETVM_IF(VC_STATE_INITIALIZED != state, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Set feedback audio format callback : Current state is not 'Initialized'");
3222 vc_mgr_client_set_feedback_audio_format_cb(callback, user_data);
3224 SLOG(LOG_INFO, TAG_VCM, "[SUCCESS] Set feedback audio format callback");
3226 return VC_ERROR_NONE;
3229 int vc_mgr_unset_feedback_audio_format_cb()
3231 SLOG(LOG_INFO, TAG_VCM, "@@@ [Manager] unset feedback audio format");
3234 ret = __check_mgr_feature_privilege();
3235 if (VC_ERROR_NONE != ret)
3239 if (0 != vc_mgr_client_get_client_state(&state)) {
3240 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset feedback audio format callback : A handle is not available");
3241 return VC_ERROR_INVALID_STATE;
3245 RETVM_IF(VC_STATE_INITIALIZED != state, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Unset feedback audio format callback : Current state is not 'Initialized'");
3247 vc_mgr_client_set_feedback_audio_format_cb(NULL, NULL);
3249 SLOG(LOG_INFO, TAG_VCM, "[SUCCESS] Unset feedback audio format callback");
3251 return VC_ERROR_NONE;
3254 int vc_mgr_set_feedback_streaming_cb(vc_mgr_feedback_streaming_cb callback, void* user_data)
3256 SLOG(LOG_INFO, TAG_VCM, "@@@ [Manager] set feedback streaming");
3259 ret = __check_mgr_feature_privilege();
3260 if (VC_ERROR_NONE != ret)
3263 RETVM_IF(NULL == callback, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Invalid parameter");
3265 pthread_mutex_lock(&g_feedback_streaming_cb_mutex);
3268 if (0 != vc_mgr_client_get_client_state(&state)) {
3269 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set feedback streaming callback : A handle is not available");
3270 pthread_mutex_unlock(&g_feedback_streaming_cb_mutex);
3271 return VC_ERROR_INVALID_STATE;
3275 if (VC_STATE_INITIALIZED != state) {
3276 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set feedback streaming callback : Current state is not 'Initialized' (%d)", state);
3277 pthread_mutex_unlock(&g_feedback_streaming_cb_mutex);
3278 return VC_ERROR_INVALID_STATE;
3281 vc_mgr_client_set_feedback_streaming_cb(callback, user_data);
3283 pthread_mutex_unlock(&g_feedback_streaming_cb_mutex);
3285 SLOG(LOG_INFO, TAG_VCM, "[SUCCESS] Set feedback streaming callback");
3287 return VC_ERROR_NONE;
3290 int vc_mgr_unset_feedback_streaming_cb()
3292 SLOG(LOG_INFO, TAG_VCM, "@@@ [Manager] unset feedback streaming");
3295 ret = __check_mgr_feature_privilege();
3296 if (VC_ERROR_NONE != ret)
3299 pthread_mutex_lock(&g_feedback_streaming_cb_mutex);
3302 if (0 != vc_mgr_client_get_client_state(&state)) {
3303 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset feedback streaming callback : A handle is not available");
3304 pthread_mutex_unlock(&g_feedback_streaming_cb_mutex);
3305 return VC_ERROR_INVALID_STATE;
3309 if (VC_STATE_INITIALIZED != state) {
3310 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset feedback streaming callback : Current state is not 'Initialized' (%d)", state);
3311 pthread_mutex_unlock(&g_feedback_streaming_cb_mutex);
3312 return VC_ERROR_INVALID_STATE;
3315 vc_mgr_client_set_feedback_streaming_cb(NULL, NULL);
3317 pthread_mutex_unlock(&g_feedback_streaming_cb_mutex);
3319 SLOG(LOG_INFO, TAG_VCM, "[SUCCESS] Unset feedback streaming callback");
3321 return VC_ERROR_NONE;
3324 int vc_mgr_set_vc_tts_streaming_cb(vc_mgr_vc_tts_streaming_cb callback, void* user_data)
3326 SLOG(LOG_INFO, TAG_VCM, "@@@ [Manager] set vc tts streaming callback");
3329 ret = __check_mgr_feature_privilege();
3330 if (VC_ERROR_NONE != ret)
3333 RETVM_IF(NULL == callback, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Invalid parameter");
3335 pthread_mutex_lock(&g_vc_tts_streaming_cb_mutex);
3338 if (0 != vc_mgr_client_get_client_state(&state)) {
3339 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set feedback streaming callback : A handle is not available");
3340 pthread_mutex_unlock(&g_vc_tts_streaming_cb_mutex);
3341 return VC_ERROR_INVALID_STATE;
3345 if (VC_STATE_INITIALIZED != state) {
3346 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set feedback streaming callback : Current state is not 'Initialized' (%d)", state);
3347 pthread_mutex_unlock(&g_vc_tts_streaming_cb_mutex);
3348 return VC_ERROR_INVALID_STATE;
3351 vc_mgr_client_set_vc_tts_streaming_cb(callback, user_data);
3353 pthread_mutex_unlock(&g_vc_tts_streaming_cb_mutex);
3355 SLOG(LOG_INFO, TAG_VCM, "[SUCCESS] Set feedback streaming callback");
3357 return VC_ERROR_NONE;
3360 int vc_mgr_unset_vc_tts_streaming_cb()
3362 SLOG(LOG_INFO, TAG_VCM, "@@@ [Manager] unset vc tts streaming callback");
3365 ret = __check_mgr_feature_privilege();
3366 if (VC_ERROR_NONE != ret)
3369 pthread_mutex_lock(&g_vc_tts_streaming_cb_mutex);
3372 if (0 != vc_mgr_client_get_client_state(&state)) {
3373 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset feedback streaming callback : A handle is not available");
3374 pthread_mutex_unlock(&g_vc_tts_streaming_cb_mutex);
3375 return VC_ERROR_INVALID_STATE;
3379 if (VC_STATE_INITIALIZED != state) {
3380 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset feedback streaming callback : Current state is not 'Initialized' (%d)", state);
3381 pthread_mutex_unlock(&g_vc_tts_streaming_cb_mutex);
3382 return VC_ERROR_INVALID_STATE;
3385 vc_mgr_client_set_vc_tts_streaming_cb(NULL, NULL);
3387 pthread_mutex_unlock(&g_vc_tts_streaming_cb_mutex);
3389 SLOG(LOG_INFO, TAG_VCM, "[SUCCESS] Unset feedback streaming callback");
3391 return VC_ERROR_NONE;
3394 static void __tts_feedback_thread(void* data, Ecore_Thread* thread)
3396 SLOG(LOG_INFO, TAG_VCM, "[SUCCESS] Start thread");
3398 vc_feedback_data_s* feedback_data = NULL;
3404 /* get feedback data */
3405 ret = vc_mgr_data_get_feedback_data(&feedback_data);
3406 if (0 != ret || NULL == feedback_data) {
3408 SLOG(LOG_INFO, TAG_VCM, "[DEBUG] No feedback data. Waiting mode");
3412 if (ecore_thread_check(thread) == EINA_TRUE) {
3413 SLOG(LOG_INFO, TAG_VCM, "[INFO] Stop feedback is called");
3419 if (0 < vc_mgr_data_get_feedback_data_size()) {
3420 SLOG(LOG_INFO, TAG_VCM, "[INFO] Resume thread");
3424 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Wrong request, there's no pcm data");
3425 vc_mgr_data_clear_feedback_data(&feedback_data);
3430 SLOG(LOG_INFO, TAG_VCM, "[INFO] Finish to wait for new feedback data come");
3432 /* resume feedback thread */
3433 vc_mgr_data_clear_feedback_data(&feedback_data);
3437 if (NULL != feedback_data) {
3438 if (getpid() == feedback_data->pid) {
3439 vc_mgr_feedback_streaming_cb callback = NULL;
3440 void* user_data = NULL;
3442 pthread_mutex_lock(&g_feedback_streaming_cb_mutex);
3444 vc_mgr_client_get_feedback_streaming_cb(&callback, &user_data);
3445 if (NULL == callback) {
3446 SLOG(LOG_WARN, TAG_VCM, "[WARNING] TTS feedback streaming callback is null");
3447 vc_mgr_data_clear_feedback_data(&feedback_data);
3448 pthread_mutex_unlock(&g_feedback_streaming_cb_mutex);
3452 SLOG(LOG_DEBUG, TAG_VCM, "TTS feedback streaming callback is called");
3453 vc_mgr_client_use_callback();
3454 callback(feedback_data->event, feedback_data->data, feedback_data->data_size, user_data);
3455 vc_mgr_client_not_use_callback();
3457 pthread_mutex_unlock(&g_feedback_streaming_cb_mutex);
3459 vc_mgr_vc_tts_streaming_cb callback = NULL;
3460 void* user_data = NULL;
3462 pthread_mutex_lock(&g_vc_tts_streaming_cb_mutex);
3464 vc_mgr_client_get_vc_tts_streaming_cb(&callback, &user_data);
3465 if (NULL == callback) {
3466 SLOG(LOG_WARN, TAG_VCM, "[WARNING] vc tts streaming callback is null");
3467 vc_mgr_data_clear_feedback_data(&feedback_data);
3468 pthread_mutex_unlock(&g_vc_tts_streaming_cb_mutex);
3472 SLOG(LOG_DEBUG, TAG_VCM, "vc tts feedback streaming callback is called");
3473 vc_mgr_client_use_callback();
3474 callback(feedback_data->pid, feedback_data->utt_id, feedback_data->event, feedback_data->data, feedback_data->data_size, user_data);
3475 vc_mgr_client_not_use_callback();
3477 pthread_mutex_unlock(&g_vc_tts_streaming_cb_mutex);
3479 free(feedback_data);
3480 feedback_data = NULL;
3485 static void __end_tts_feedback_thread(void* data, Ecore_Thread* thread)
3487 SLOG(LOG_INFO, TAG_VCM, "[SUCCESS] End thread");
3488 g_feedback_thread = NULL;
3491 static void __cancel_tts_feedback_thread(void* data, Ecore_Thread* thread)
3493 SLOG(LOG_INFO, TAG_VCM, "[SUCCESS] Cancel thread");
3494 g_feedback_thread = NULL;
3497 int vc_mgr_start_feedback(void)
3499 SLOG(LOG_INFO, TAG_VCM, "@@@ [Manager] start feedback");
3502 ret = __check_mgr_feature_privilege();
3503 if (VC_ERROR_NONE != ret)
3506 SLOG(LOG_INFO, TAG_VCM, "@@@ [Manager] Request start TTS feedback");
3509 if (0 != vc_mgr_client_get_client_state(&state)) {
3510 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Start feedback : A handle is not available");
3511 return VC_ERROR_INVALID_STATE;
3515 RETVM_IF(VC_STATE_READY != state, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Start feedback : Current state is not 'Ready' (%d)", state);
3518 bool is_exist = ecore_thread_check(g_feedback_thread);
3519 if (NULL == g_feedback_thread || TRUE == is_exist) {
3520 SLOG(LOG_INFO, TAG_VCM, "[INFO] ecore thread run : __tts_feedback_thread");
3521 g_feedback_thread = ecore_thread_run(__tts_feedback_thread, __end_tts_feedback_thread, __cancel_tts_feedback_thread, NULL);
3524 /* start playing TTS feedback */
3526 ret = vc_mgr_player_play();
3528 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to player play, ret(%d)", ret);
3531 return VC_ERROR_NONE;
3534 int vc_mgr_stop_feedback(void)
3536 SLOG(LOG_INFO, TAG_VCM, "@@@ [Manager] stop feedback");
3539 ret = __check_mgr_feature_privilege();
3540 if (VC_ERROR_NONE != ret)
3543 SLOG(LOG_INFO, TAG_VCM, "@@@ [Manager] Request stop TTS feedback");
3546 if (0 != vc_mgr_client_get_client_state(&state)) {
3547 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Stop feedback : A handle is not available");
3548 return VC_ERROR_INVALID_STATE;
3552 RETVM_IF(VC_STATE_READY != state, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Stop feedback : Current state is not 'Ready' (%d)", state);
3555 if (g_feedback_thread) {
3556 ecore_thread_cancel(g_feedback_thread);
3557 g_feedback_thread = NULL;
3562 vc_feedback_data_s* feedback_data = NULL;
3564 /* get feedback data */
3565 ret = vc_mgr_data_get_feedback_data(&feedback_data);
3566 if (0 != ret || NULL == feedback_data) {
3568 SLOG(LOG_INFO, TAG_VCM, "[INFO] No feedback data to stop any more");
3569 return VC_ERROR_NONE;
3571 ret = vc_mgr_data_clear_feedback_data(&feedback_data);
3573 SLOG(LOG_INFO, TAG_VCM, "[ERROR] Fail to clear data, ret(%d)", ret);
3578 /* request to stop playing TTS feedback */
3580 ret = vc_mgr_player_stop();
3582 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to player stop, ret(%d)", ret);
3588 int vc_mgr_send_utterance_status(int pid, int utt_id, vc_tts_utterance_status_e utt_status)
3590 SLOG(LOG_INFO, TAG_VCM, "@@@ [Manager] send utterance status, pid(%d), utt_id(%d), utt_status(%d)", pid, utt_id, utt_status);
3593 ret = __check_mgr_feature_privilege();
3594 if (VC_ERROR_NONE != ret)
3597 if (VC_TTS_UTTERANCE_NONE > utt_status || VC_TTS_UTTERANCE_CANCELED < utt_status || 0 == utt_status) {
3598 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] utt_status is not valid. (%d)", utt_status);
3599 return VC_ERROR_INVALID_PARAMETER;
3603 if (0 != vc_mgr_client_get_client_state(&state)) {
3604 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
3605 return VC_ERROR_INVALID_STATE;
3609 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Ready'", state);
3611 /* Check service state */
3612 vc_service_state_e service_state = -1;
3613 vc_mgr_client_get_service_state(&service_state);
3614 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);
3616 ret = vc_mgr_tidl_send_utterance_status(pid, utt_id, utt_status);
3618 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to send utterance status : %s", __vc_mgr_get_error_code(ret));
3620 SLOG(LOG_INFO, TAG_VCM, "[SUCCESS] Send utterance status");
3622 SLOG(LOG_DEBUG, TAG_VCM, "@@@ [Manager] send utterance status DONE");
3626 static float __get_volume_decibel(char* data, int size)
3628 #define MAX_AMPLITUDE_MEAN_16 32768
3635 unsigned long long square_sum = 0;
3640 for (i = 0; i < size; i += (depthByte<<1)) {
3642 memcpy(&pcm16, data + i, sizeof(short));
3643 square_sum += pcm16 * pcm16;
3647 if (0 == count || 0 == square_sum) {
3648 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] No data");
3651 rms = sqrt((float)square_sum/count);
3654 db = 20 * log10(rms/MAX_AMPLITUDE_MEAN_16);
3658 int vc_mgr_send_audio_streaming(vc_audio_streaming_event_e event, unsigned char* buffer, unsigned int len)
3660 SLOG(LOG_INFO, TAG_VCM, "[Manager] Send audio streaming to the engine service, event(%d)", event);
3663 ret = __check_mgr_feature_privilege();
3664 if (VC_ERROR_NONE != ret)
3667 if (VC_AUDIO_STREAMING_EVENT_FAIL > event || VC_AUDIO_STREAMING_EVENT_FINISH < event || 0 == event) {
3668 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] event is invalid parameter (%d)", event);
3669 return VC_ERROR_INVALID_PARAMETER;
3672 RETVM_IF(NULL == buffer, VC_ERROR_INVALID_PARAMETER, TAG_VCM, "[ERROR] Invalid parameter");
3674 vc_state_e state = VC_STATE_NONE;
3675 ret = vc_mgr_client_get_client_state(&state);
3677 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
3678 return VC_ERROR_INVALID_STATE;
3681 RETVM_IF(state != VC_STATE_READY, VC_ERROR_INVALID_STATE, TAG_VCM, "[ERROR] Invalid State: Current state(%d) is not 'Ready'", state);
3683 vc_service_state_e service_state = VC_SERVICE_STATE_NONE;
3684 ret = vc_mgr_client_get_service_state(&service_state);
3686 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
3687 return VC_ERROR_INVALID_STATE;
3690 if (VC_SERVICE_STATE_READY != service_state && VC_SERVICE_STATE_RECORDING != service_state) {
3691 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: service state is not 'READY' and 'RECORDING', state(%d)", service_state);
3692 return VC_ERROR_INVALID_STATE;
3695 float volume = __get_volume_decibel((char*)buffer, len);
3696 __vc_mgr_set_volume(volume);
3698 ret = vc_mgr_tidl_send_audio_streaming(g_pid, event, buffer, len);
3700 SLOG(LOG_WARN, TAG_VCM, "[WARNING] retry to send audio streaming data");
3702 SLOG(LOG_INFO, TAG_VCM, "[DEBUG] Success to send");
3706 int vc_mgr_set_audio_streaming_mode(vc_audio_streaming_mode_e mode)
3708 SLOG(LOG_INFO, TAG_VCM, "[Manager] Set multi assistant mode, mode(%d)", mode);
3711 ret = __check_mgr_feature_privilege();
3712 if (VC_ERROR_NONE != ret)
3715 if (VC_AUDIO_STREAMING_MODE_VC_SERVICE > mode || VC_AUDIO_STREAMING_MODE_OUTSIDE < mode) {
3716 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] mode is invalid parameter (%d)", mode);
3717 return VC_ERROR_INVALID_PARAMETER;
3720 vc_state_e state = VC_STATE_NONE;
3721 ret = vc_mgr_client_get_client_state(&state);
3723 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
3724 return VC_ERROR_INVALID_STATE;
3727 vc_service_state_e service_state = VC_SERVICE_STATE_NONE;
3728 ret = vc_mgr_client_get_service_state(&service_state);
3730 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
3731 return VC_ERROR_INVALID_STATE;
3734 if (VC_STATE_INITIALIZED == state && VC_SERVICE_STATE_NONE == service_state) {
3735 ret = vc_mgr_client_set_audio_streaming_mode(mode);
3736 if (VC_ERROR_NONE != ret) {
3737 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to set multi assistant mode : %s", __vc_mgr_get_error_code(ret));
3738 return VC_ERROR_INVALID_STATE;
3740 SLOG(LOG_DEBUG, TAG_VCM, "[SUCCESS] Set audio streaming mode in vc mgr client");
3742 } else if (VC_STATE_READY == state && VC_SERVICE_STATE_READY == service_state) {
3743 ret = vc_mgr_client_set_audio_streaming_mode(mode);
3744 if (VC_ERROR_NONE != ret) {
3745 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to set multi assistant mode : %s", __vc_mgr_get_error_code(ret));
3746 return VC_ERROR_INVALID_STATE;
3748 SLOG(LOG_DEBUG, TAG_VCM, "[SUCCESS] Set audio streaming mode in vc mgr client");
3751 ret = vc_mgr_tidl_request_set_audio_streaming_mode(g_pid, mode);
3752 if (VC_ERROR_NONE != ret) {
3753 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to set audio streaming mode : %s", __vc_mgr_get_error_code(ret));
3754 return VC_ERROR_OPERATION_FAILED;
3756 SLOG(LOG_DEBUG, TAG_VCM, "[SUCCESS] Set audio streaming mode in vc mgr tidl");
3759 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: Current state is not 'INITIALIZED', state(%d)", state);
3760 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: Current service state is not 'READY', service_state(%d)", service_state);
3761 return VC_ERROR_INVALID_STATE;
3764 return VC_ERROR_NONE;
3767 //TODO it's internal api, so will remove it.
3768 int vc_mgr_change_system_volume(vc_system_volume_event_e event)
3770 return vc_mgr_change_background_volume(event);
3773 //TODO it's internal api, so will remove it.
3774 int vc_mgr_recover_system_volume(void)
3776 return vc_mgr_reset_background_volume();
3779 int vc_mgr_change_background_volume(vc_background_volume_event_e event)
3781 SLOG(LOG_INFO, TAG_VCM, "[Manager] Change background volume. event(%d)", event);
3784 ret = __check_mgr_feature_privilege();
3785 if (VC_ERROR_NONE != ret)
3788 if (VC_BACKGROUND_VOLUME_EVENT_CHANGE_FOR_NEARFIELD > event || VC_BACKGROUND_VOLUME_EVENT_CHANGE_FOR_FARFIELD < event) {
3789 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] event is invalid parameter (%d)", event);
3790 return VC_ERROR_INVALID_PARAMETER;
3793 vc_state_e state = VC_STATE_NONE;
3794 ret = vc_mgr_client_get_client_state(&state);
3795 if (VC_ERROR_NONE != ret) {
3796 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
3797 return VC_ERROR_INVALID_STATE;
3800 if (state != VC_STATE_READY && state != VC_STATE_INITIALIZED) {
3801 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: Current state is not 'READY' and not 'INITIALIZED', state(%d)", state);
3802 return VC_ERROR_INVALID_STATE;
3806 if (VC_BACKGROUND_VOLUME_EVENT_CHANGE_FOR_FARFIELD == event)
3807 ratio = VC_MGR_DEFAULT_FARFIELD_DUCKING_RATIO;
3808 else if (VC_BACKGROUND_VOLUME_EVENT_CHANGE_FOR_NEARFIELD == event)
3809 ratio = VC_MGR_DEFAULT_NEARFIELD_DUCKING_RATIO;
3811 ret = vc_mgr_ducking_activate(ratio);
3812 if (VC_ERROR_NONE != ret)
3813 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to change volume");
3815 SLOG(LOG_INFO, TAG_VCM, "[DEBUG] Success to change volume");
3819 int vc_mgr_change_background_volume_by_ratio(double ratio)
3821 SLOG(LOG_INFO, TAG_VCM, "[Manager] Change background volume. ratio(%f)", ratio);
3824 ret = __check_mgr_feature_privilege();
3825 if (VC_ERROR_NONE != ret)
3828 if (VC_MGR_MINIMUM_DUCKING_RATIO > ratio || VC_MGR_MAXIMUM_DUCKING_RATIO < ratio) {
3829 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] ratio is invalid parameter (%lf)", ratio);
3830 return VC_ERROR_INVALID_PARAMETER;
3833 vc_state_e state = VC_STATE_NONE;
3834 ret = vc_mgr_client_get_client_state(&state);
3835 if (VC_ERROR_NONE != ret) {
3836 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
3837 return VC_ERROR_INVALID_STATE;
3840 if (state != VC_STATE_READY && state != VC_STATE_INITIALIZED) {
3841 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: Current state is not 'READY' and not 'INITIALIZED', state(%d)", state);
3842 return VC_ERROR_INVALID_STATE;
3845 ret = vc_mgr_ducking_activate(ratio);
3846 if (VC_ERROR_NONE != ret)
3847 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to set ratio");
3849 SLOG(LOG_INFO, TAG_VCM, "[DEBUG] Success to set ratio");
3854 int vc_mgr_reset_background_volume(void)
3856 SLOG(LOG_INFO, TAG_VCM, "[Manager] Recover background volume");
3859 ret = __check_mgr_feature_privilege();
3860 if (VC_ERROR_NONE != ret)
3863 vc_state_e state = VC_STATE_NONE;
3864 ret = vc_mgr_client_get_client_state(&state);
3865 if (VC_ERROR_NONE != ret) {
3866 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
3867 return VC_ERROR_INVALID_STATE;
3870 if (state != VC_STATE_READY && state != VC_STATE_INITIALIZED) {
3871 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: Current state is not 'READY' and not 'INITIALIZED', state(%d)", state);
3872 return VC_ERROR_INVALID_STATE;
3875 ret = vc_mgr_ducking_deactivate();
3876 if (VC_ERROR_NONE != ret)
3877 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to recover volume");
3879 SLOG(LOG_INFO, TAG_VCM, "[DEBUG] Success to recover volume");