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>
20 #include "vc_info_parser.h"
21 #include "vc_config_mgr.h"
22 #include "vc_command.h"
24 #include "vc_mgr_client.h"
25 #include "vc_mgr_dbus.h"
26 #include "voice_control.h"
27 #include "voice_control_command.h"
28 #include "voice_control_command_expand.h"
29 #include "voice_control_common.h"
30 #include "voice_control_manager.h"
33 #define VC_MANAGER_CONFIG_HANDLE 100000
35 static Ecore_Timer* g_m_connect_timer = NULL;
37 static vc_h g_vc_m = NULL;
39 static GSList* g_demandable_client_list = NULL;
41 static float g_volume_db = 0;
43 static int g_daemon_pid = 0;
45 static int g_feature_enabled = -1;
47 static Eina_Bool __vc_mgr_notify_state_changed(void *data);
48 static Eina_Bool __vc_mgr_notify_error(void *data);
49 static Eina_Bool __vc_mgr_notify_result(void *data);
51 static const char* __vc_mgr_get_error_code(vc_error_e err)
54 case VC_ERROR_NONE: return "VC_ERROR_NONE";
55 case VC_ERROR_OUT_OF_MEMORY: return "VC_ERROR_OUT_OF_MEMORY";
56 case VC_ERROR_IO_ERROR: return "VC_ERROR_IO_ERROR";
57 case VC_ERROR_INVALID_PARAMETER: return "VC_ERROR_INVALID_PARAMETER";
58 case VC_ERROR_TIMED_OUT: return "VC_ERROR_TIMED_OUT";
59 case VC_ERROR_RECORDER_BUSY: return "VC_ERROR_RECORDER_BUSY";
60 case VC_ERROR_INVALID_STATE: return "VC_ERROR_INVALID_STATE";
61 case VC_ERROR_INVALID_LANGUAGE: return "VC_ERROR_INVALID_LANGUAGE";
62 case VC_ERROR_ENGINE_NOT_FOUND: return "VC_ERROR_ENGINE_NOT_FOUND";
63 case VC_ERROR_OPERATION_FAILED: return "VC_ERROR_OPERATION_FAILED";
64 default: return "Invalid error code";
69 static void __vc_mgr_lang_changed_cb(const char* before_lang, const char* current_lang)
71 SLOG(LOG_DEBUG, TAG_VCM, "Lang changed : Before lang(%s) Current lang(%s)",
72 before_lang, current_lang);
74 vc_current_language_changed_cb callback = NULL;
76 vc_mgr_client_get_current_lang_changed_cb(g_vc_m, &callback, &lang_user_data);
78 if (NULL != callback) {
79 vc_mgr_client_use_callback(g_vc_m);
80 callback(before_lang, current_lang, lang_user_data);
81 vc_mgr_client_not_use_callback(g_vc_m);
82 SLOG(LOG_DEBUG, TAG_VCM, "Language changed callback is called");
84 SLOG(LOG_WARN, TAG_VCM, "[WARNING] Language changed callback is null");
90 static int __vc_mgr_get_feature_enabled()
92 if (0 == g_feature_enabled) {
93 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Voice control feature NOT supported");
94 return VC_ERROR_NOT_SUPPORTED;
95 } else if (-1 == g_feature_enabled) {
96 bool vc_supported = false;
97 bool mic_supported = false;
98 if (0 == system_info_get_platform_bool(VC_FEATURE_PATH, &vc_supported)) {
99 if (0 == system_info_get_platform_bool(VC_MIC_FEATURE_PATH, &mic_supported)) {
100 if (false == vc_supported || false == mic_supported) {
101 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Voice control feature NOT supported");
102 g_feature_enabled = 0;
103 return VC_ERROR_NOT_SUPPORTED;
106 g_feature_enabled = 1;
114 int vc_mgr_initialize()
116 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Initialize");
119 if (0 != __vc_mgr_get_feature_enabled()) {
120 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] not supported");
121 return VC_ERROR_NOT_SUPPORTED;
125 if (true == vc_mgr_client_is_valid(g_vc_m)) {
126 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Already initialized");
127 return VC_ERROR_NONE;
130 if (0 != vc_mgr_dbus_open_connection()) {
131 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to open connection");
132 return VC_ERROR_OPERATION_FAILED;
135 if (0 != vc_mgr_client_create(&g_vc_m)) {
136 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to create client!!!!!");
137 return VC_ERROR_OUT_OF_MEMORY;
140 int ret = vc_config_mgr_initialize(g_vc_m->handle + VC_MANAGER_CONFIG_HANDLE);
142 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to init config manager : %d", ret);
143 vc_mgr_client_destroy(g_vc_m);
144 return VC_ERROR_OPERATION_FAILED;
147 ret = vc_config_mgr_set_lang_cb(g_vc_m->handle + VC_MANAGER_CONFIG_HANDLE, __vc_mgr_lang_changed_cb);
149 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to set callback : %d", ret);
150 vc_config_mgr_finalize(g_vc_m->handle + VC_MANAGER_CONFIG_HANDLE);
151 vc_mgr_client_destroy(g_vc_m);
152 return VC_ERROR_OPERATION_FAILED;
155 SLOG(LOG_DEBUG, TAG_VCM, "[Success] pid(%d)", g_vc_m->handle);
157 SLOG(LOG_DEBUG, TAG_VCM, "=====");
158 SLOG(LOG_DEBUG, TAG_VCM, " ");
160 return VC_ERROR_NONE;
163 static void __vc_mgr_internal_unprepare()
165 int ret = vc_mgr_dbus_request_finalize(g_vc_m->handle);
167 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request finalize : %s", __vc_mgr_get_error_code(ret));
170 vc_cmd_parser_delete_file(getpid(), VC_COMMAND_TYPE_SYSTEM);
171 vc_cmd_parser_delete_file(getpid(), VC_COMMAND_TYPE_EXCLUSIVE);
176 int vc_mgr_deinitialize()
178 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Deinitialize");
180 if (false == vc_mgr_client_is_valid(g_vc_m)) {
181 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] NOT initialized");
182 SLOG(LOG_DEBUG, TAG_VCM, "=====");
183 SLOG(LOG_DEBUG, TAG_VCM, " ");
184 return VC_ERROR_INVALID_STATE;
188 vc_mgr_client_get_client_state(g_vc_m, &state);
193 __vc_mgr_internal_unprepare();
194 /* no break. need to next step*/
195 case VC_STATE_INITIALIZED:
196 if (NULL != g_m_connect_timer) {
197 SLOG(LOG_DEBUG, TAG_VCM, "Connect Timer is deleted");
198 ecore_timer_del(g_m_connect_timer);
201 vc_config_mgr_unset_lang_cb(g_vc_m->handle + VC_MANAGER_CONFIG_HANDLE);
202 vc_config_mgr_finalize(g_vc_m->handle + VC_MANAGER_CONFIG_HANDLE);
204 /* Free client resources */
205 vc_mgr_client_destroy(g_vc_m);
214 SLOG(LOG_DEBUG, TAG_VCM, "Success: destroy");
216 if (0 != vc_mgr_dbus_close_connection()) {
217 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to close connection");
220 SLOG(LOG_DEBUG, TAG_VCM, "=====");
221 SLOG(LOG_DEBUG, TAG_VCM, " ");
223 return VC_ERROR_NONE;
226 static Eina_Bool __vc_mgr_connect_daemon(void *data)
228 /* request initialization */
230 int service_state = 0;
231 int foreground = VC_RUNTIME_INFO_NO_FOREGROUND;
233 g_m_connect_timer = NULL;
235 ret = vc_mgr_dbus_request_initialize(g_vc_m->handle, &service_state, &foreground, &g_daemon_pid);
237 if (VC_ERROR_ENGINE_NOT_FOUND == ret) {
238 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to initialize : %s", __vc_mgr_get_error_code(ret));
240 vc_mgr_client_set_error(g_vc_m, VC_ERROR_ENGINE_NOT_FOUND);
241 ecore_timer_add(0, __vc_mgr_notify_error, g_vc_m);
243 SLOG(LOG_DEBUG, TAG_VCM, "=====");
244 SLOG(LOG_DEBUG, TAG_VCM, " ");
247 } else if (0 != ret) {
248 SLOG(LOG_ERROR, TAG_VCM, "[WARNING] Fail to connection. Retry to connect : %s", __vc_mgr_get_error_code(ret));
251 /* Success to connect */
254 /* Set service state */
255 vc_mgr_client_set_service_state(g_vc_m, (vc_service_state_e)service_state);
258 vc_mgr_client_set_foreground(g_vc_m, foreground, true);
260 SLOG(LOG_DEBUG, TAG_VCM, "[SUCCESS] Connected daemon");
262 vc_mgr_client_set_client_state(g_vc_m, VC_STATE_READY);
264 vc_state_changed_cb changed_callback = NULL;
265 void* user_data = NULL;
267 vc_mgr_client_get_state_changed_cb(g_vc_m, &changed_callback, &user_data);
269 vc_state_e current_state;
270 vc_state_e before_state;
272 vc_mgr_client_get_before_state(g_vc_m, ¤t_state, &before_state);
274 if (NULL != changed_callback) {
275 vc_mgr_client_use_callback(g_vc_m);
276 changed_callback(before_state, current_state, user_data);
277 vc_mgr_client_not_use_callback(g_vc_m);
278 SLOG(LOG_DEBUG, TAG_VCM, "State changed callback is called");
280 SLOG(LOG_WARN, TAG_VCM, "[WARNING] State changed callback is null");
283 SLOG(LOG_DEBUG, TAG_VCM, "=====");
284 SLOG(LOG_DEBUG, TAG_VCM, " ");
289 static Eina_Bool __vc_mgr_prepare_daemon(void *data)
292 if (0 != vc_mgr_dbus_request_hello()) {
296 g_m_connect_timer = NULL;
297 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Connect daemon");
299 g_m_connect_timer = ecore_idler_add(__vc_mgr_connect_daemon, data);
302 /* request initialization */
304 int service_state = 0;
305 int foreground = VC_RUNTIME_INFO_NO_FOREGROUND;
306 ret = vc_mgr_dbus_request_initialize(g_vc_m->handle, &service_state, &foreground, &g_daemon_pid);
308 if (VC_ERROR_ENGINE_NOT_FOUND == ret) {
309 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to initialize : %s", __vc_mgr_get_error_code(ret));
311 vc_mgr_client_set_error(g_vc_m, VC_ERROR_ENGINE_NOT_FOUND);
312 ecore_timer_add(0, __vc_mgr_notify_error, g_vc_m);
314 SLOG(LOG_DEBUG, TAG_VCM, "=====");
315 SLOG(LOG_DEBUG, TAG_VCM, " ");
318 } else if (0 != ret) {
319 SLOG(LOG_ERROR, TAG_VCM, "[WARNING] Fail to connection. Retry to connect : %s", __vc_mgr_get_error_code(ret));
322 /* Success to connect */
325 /* Set service state */
326 vc_mgr_client_set_service_state(g_vc_m, (vc_service_state_e)service_state);
329 vc_mgr_client_set_foreground(g_vc_m, foreground, true);
331 SLOG(LOG_DEBUG, TAG_VCM, "[SUCCESS] Connected daemon");
333 vc_mgr_client_set_client_state(g_vc_m, VC_STATE_READY);
335 vc_state_changed_cb changed_callback = NULL;
336 void* user_data = NULL;
338 vc_mgr_client_get_state_changed_cb(g_vc_m, &changed_callback, &user_data);
340 vc_state_e current_state;
341 vc_state_e before_state;
343 vc_mgr_client_get_before_state(g_vc_m, ¤t_state, &before_state);
345 if (NULL != changed_callback) {
346 vc_mgr_client_use_callback(g_vc_m);
347 changed_callback(before_state, current_state, user_data);
348 vc_mgr_client_not_use_callback(g_vc_m);
349 SLOG(LOG_DEBUG, TAG_VCM, "State changed callback is called");
351 SLOG(LOG_WARN, TAG_VCM, "[WARNING] State changed callback is null");
354 SLOG(LOG_DEBUG, TAG_VCM, "=====");
355 SLOG(LOG_DEBUG, TAG_VCM, " ");
362 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Prepare");
365 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
366 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
367 SLOG(LOG_DEBUG, TAG_VCM, "=====");
368 SLOG(LOG_DEBUG, TAG_VCM, " ");
369 return VC_ERROR_INVALID_STATE;
373 if (state != VC_STATE_INITIALIZED) {
374 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: Current state is not 'CREATED'");
375 SLOG(LOG_DEBUG, TAG_VCM, "=====");
376 SLOG(LOG_DEBUG, TAG_VCM, " ");
377 return VC_ERROR_INVALID_STATE;
380 g_m_connect_timer = ecore_timer_add(0, __vc_mgr_prepare_daemon, NULL);
382 SLOG(LOG_DEBUG, TAG_VCM, "=====");
383 SLOG(LOG_DEBUG, TAG_VCM, " ");
385 return VC_ERROR_NONE;
388 int vc_mgr_unprepare()
390 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Unprepare");
393 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
394 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
395 SLOG(LOG_DEBUG, TAG_VCM, "=====");
396 SLOG(LOG_DEBUG, TAG_VCM, " ");
397 return VC_ERROR_INVALID_STATE;
401 if (state != VC_STATE_READY) {
402 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: Current state is not 'READY'");
403 SLOG(LOG_DEBUG, TAG_VCM, "=====");
404 SLOG(LOG_DEBUG, TAG_VCM, " ");
405 return VC_ERROR_INVALID_STATE;
408 __vc_mgr_internal_unprepare();
410 vc_mgr_client_set_client_state(g_vc_m, VC_STATE_INITIALIZED);
411 ecore_timer_add(0, __vc_mgr_notify_state_changed, g_vc_m);
413 SLOG(LOG_DEBUG, TAG_VCM, "=====");
414 SLOG(LOG_DEBUG, TAG_VCM, " ");
416 return VC_ERROR_NONE;
419 int vc_mgr_foreach_supported_languages(vc_supported_language_cb callback, void* user_data)
421 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Foreach Supported Language");
423 if (NULL == callback) {
424 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Input parameter is NULL");
425 SLOG(LOG_DEBUG, TAG_VCM, "=====");
426 SLOG(LOG_DEBUG, TAG_VCM, " ");
427 return VC_ERROR_INVALID_PARAMETER;
431 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
432 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
433 SLOG(LOG_DEBUG, TAG_VCM, "=====");
434 SLOG(LOG_DEBUG, TAG_VCM, " ");
435 return VC_ERROR_INVALID_STATE;
439 ret = vc_config_mgr_get_language_list(callback, user_data);
441 ret = vc_config_convert_error_code((vc_config_error_e)ret);
442 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get languages : %s", __vc_mgr_get_error_code(ret));
445 SLOG(LOG_DEBUG, TAG_VCM, "=====");
446 SLOG(LOG_DEBUG, TAG_VCM, " ");
448 return VC_ERROR_NONE;
451 int vc_mgr_get_current_language(char** language)
453 if (NULL == language) {
454 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Input parameter is NULL");
455 return VC_ERROR_INVALID_PARAMETER;
459 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
460 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
461 return VC_ERROR_INVALID_STATE;
465 ret = vc_config_mgr_get_default_language(language);
467 ret = vc_config_convert_error_code((vc_config_error_e)ret);
468 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get current languages : %s", __vc_mgr_get_error_code(ret));
470 SLOG(LOG_DEBUG, TAG_VCM, "[Get current language] language : %s", *language);
476 int vc_mgr_get_state(vc_state_e* state)
478 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Get State");
481 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Input parameter is NULL");
482 return VC_ERROR_INVALID_PARAMETER;
486 if (0 != vc_mgr_client_get_client_state(g_vc_m, &temp)) {
487 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
488 SLOG(LOG_DEBUG, TAG_VCM, "=====");
489 SLOG(LOG_DEBUG, TAG_VCM, " ");
490 return VC_ERROR_INVALID_STATE;
496 case VC_STATE_NONE: SLOG(LOG_DEBUG, TAG_VCM, "Current state is 'None'"); break;
497 case VC_STATE_INITIALIZED: SLOG(LOG_DEBUG, TAG_VCM, "Current state is 'Created'"); break;
498 case VC_STATE_READY: SLOG(LOG_DEBUG, TAG_VCM, "Current state is 'Ready'"); break;
499 default: SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid state");
502 SLOG(LOG_DEBUG, TAG_VCM, "=====");
503 SLOG(LOG_DEBUG, TAG_VCM, " ");
505 return VC_ERROR_NONE;
508 int vc_mgr_get_service_state(vc_service_state_e* state)
510 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Get Service State");
513 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Input parameter is NULL");
514 return VC_ERROR_INVALID_PARAMETER;
517 vc_state_e client_state;
518 if (0 != vc_mgr_client_get_client_state(g_vc_m, &client_state)) {
519 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
520 return VC_ERROR_INVALID_STATE;
524 if (client_state != VC_STATE_READY) {
525 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Current state is not 'READY'");
526 return VC_ERROR_INVALID_STATE;
529 /* get service state */
530 vc_service_state_e service_state;
531 if (0 != vc_mgr_client_get_service_state(g_vc_m, &service_state)) {
532 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get service state");
533 return VC_ERROR_OPERATION_FAILED;
536 *state = service_state;
539 case VC_SERVICE_STATE_NONE: SLOG(LOG_DEBUG, TAG_VCM, "Current service state is 'None'"); break;
540 case VC_SERVICE_STATE_READY: SLOG(LOG_DEBUG, TAG_VCM, "Current service state is 'Ready'"); break;
541 case VC_SERVICE_STATE_RECORDING: SLOG(LOG_DEBUG, TAG_VCM, "Current service state is 'Recording'"); break;
542 case VC_SERVICE_STATE_PROCESSING: SLOG(LOG_DEBUG, TAG_VCM, "Current service state is 'Processing'"); break;
543 default: SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid state");
546 SLOG(LOG_DEBUG, TAG_VCM, "=====");
547 SLOG(LOG_DEBUG, TAG_VCM, " ");
549 return VC_ERROR_NONE;
552 int vc_mgr_set_demandable_client_rule(const char* rule)
554 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Set Demandable client rule");
557 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
558 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
559 SLOG(LOG_DEBUG, TAG_VCM, "=====");
560 SLOG(LOG_DEBUG, TAG_VCM, " ");
561 return VC_ERROR_INVALID_STATE;
565 if (state != VC_STATE_READY) {
566 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: Current state is not 'READY'");
567 SLOG(LOG_DEBUG, TAG_VCM, "=====");
568 SLOG(LOG_DEBUG, TAG_VCM, " ");
569 return VC_ERROR_INVALID_STATE;
573 ret = vc_info_parser_set_demandable_client(rule);
575 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] rule is NOT valid");
576 SLOG(LOG_DEBUG, TAG_VCM, "=====");
577 SLOG(LOG_DEBUG, TAG_VCM, " ");
578 return VC_ERROR_INVALID_PARAMETER;
581 if (0 != vc_info_parser_get_demandable_clients(&g_demandable_client_list)) {
582 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get demandable clients");
583 return VC_ERROR_OPERATION_FAILED;
586 SLOG(LOG_DEBUG, TAG_VCM, "=====");
587 SLOG(LOG_DEBUG, TAG_VCM, " ");
595 ret = vc_mgr_dbus_request_demandable_client(g_vc_m->handle);
597 if (VC_ERROR_TIMED_OUT != ret) {
598 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request set client rule to daemon : %s", __vc_mgr_get_error_code(ret));
601 SLOG(LOG_WARN, TAG_VCM, "[WARNING] retry request set client rule : %s", __vc_mgr_get_error_code(ret));
604 if (VC_RETRY_COUNT == count) {
605 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request");
612 SLOG(LOG_DEBUG, TAG_VCM, "=====");
613 SLOG(LOG_DEBUG, TAG_VCM, " ");
619 int vc_mgr_unset_demandable_client_rule()
621 vc_info_parser_set_demandable_client(NULL);
626 ret = vc_mgr_dbus_request_demandable_client(g_vc_m->handle);
628 if (VC_ERROR_TIMED_OUT != ret) {
629 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request unset client rule to daemon : %s", __vc_mgr_get_error_code(ret));
632 SLOG(LOG_WARN, TAG_VCM, "[WARNING] retry request unset client rule : %s", __vc_mgr_get_error_code(ret));
635 if (VC_RETRY_COUNT == count) {
636 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request");
646 int vc_mgr_is_command_format_supported(vc_cmd_format_e format, bool* support)
648 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Is command type supported");
651 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
652 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
653 SLOG(LOG_DEBUG, TAG_VCM, "=====");
654 SLOG(LOG_DEBUG, TAG_VCM, " ");
655 return VC_ERROR_INVALID_STATE;
659 bool non_fixed_support = false;
660 if (0 != vc_config_mgr_get_nonfixed_support(&non_fixed_support)) {
661 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get nonfixed support info");
665 case VC_CMD_FORMAT_FIXED: *support = true; break;
666 case VC_CMD_FORMAT_FIXED_AND_EXTRA: *support = non_fixed_support; break;
667 case VC_CMD_FORMAT_EXTRA_AND_FIXED: *support = non_fixed_support; break;
668 default: *support = false;
671 SLOG(LOG_ERROR, TAG_VCM, "[DEBUG] Format(%d) support(%s)", format, *support ? "true" : "false");
673 SLOG(LOG_DEBUG, TAG_VCM, "=====");
674 SLOG(LOG_DEBUG, TAG_VCM, " ");
676 return VC_ERROR_NONE;
679 int vc_mgr_set_command_list(vc_cmd_list_h vc_cmd_list)
681 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Set Command list");
684 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
685 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
686 SLOG(LOG_DEBUG, TAG_VCM, "=====");
687 SLOG(LOG_DEBUG, TAG_VCM, " ");
688 return VC_ERROR_INVALID_STATE;
692 if (state != VC_STATE_READY) {
693 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: Current state is not 'READY'");
694 SLOG(LOG_DEBUG, TAG_VCM, "=====");
695 SLOG(LOG_DEBUG, TAG_VCM, " ");
696 return VC_ERROR_INVALID_STATE;
699 /* Check service state */
700 vc_service_state_e service_state = -1;
701 vc_mgr_client_get_service_state(g_vc_m, &service_state);
702 if (service_state != VC_SERVICE_STATE_READY) {
703 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: service state is not 'READY'");
704 SLOG(LOG_DEBUG, TAG_VCM, "=====");
705 SLOG(LOG_DEBUG, TAG_VCM, " ");
706 return VC_ERROR_INVALID_STATE;
709 vc_cmd_list_s* list = NULL;
710 list = (vc_cmd_list_s*)vc_cmd_list;
712 int system_ret = vc_cmd_parser_save_file(getpid(), VC_COMMAND_TYPE_SYSTEM, list->list);
713 int exclsive_ret = vc_cmd_parser_save_file(getpid(), VC_COMMAND_TYPE_EXCLUSIVE, list->list);
716 if (0 != system_ret && 0 != exclsive_ret) {
717 ret = VC_ERROR_INVALID_PARAMETER;
718 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to save command group : %s", __vc_mgr_get_error_code(ret));
722 ret = vc_mgr_dbus_request_set_command(g_vc_m->handle);
724 if (VC_ERROR_TIMED_OUT != ret) {
725 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request set command to daemon : %s", __vc_mgr_get_error_code(ret));
728 SLOG(LOG_WARN, TAG_VCM, "[WARNING] retry request set command : %s", __vc_mgr_get_error_code(ret));
731 if (VC_RETRY_COUNT == count) {
732 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request");
740 SLOG(LOG_DEBUG, TAG_VCM, "=====");
741 SLOG(LOG_DEBUG, TAG_VCM, " ");
746 int vc_mgr_unset_command_list()
748 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Unset Command list");
751 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
752 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
753 return VC_ERROR_INVALID_STATE;
757 if (state != VC_STATE_READY) {
758 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Current state is not 'READY'");
759 return VC_ERROR_INVALID_STATE;
765 ret = vc_mgr_dbus_request_unset_command(g_vc_m->handle);
767 if (VC_ERROR_TIMED_OUT != ret) {
768 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request unset command to daemon : %s", __vc_mgr_get_error_code(ret));
771 SLOG(LOG_WARN, TAG_VCM, "[WARNING] retry request unset command : %s", __vc_mgr_get_error_code(ret));
774 if (VC_RETRY_COUNT == count) {
775 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request");
782 vc_cmd_parser_delete_file(getpid(), VC_COMMAND_TYPE_SYSTEM);
783 vc_cmd_parser_delete_file(getpid(), VC_COMMAND_TYPE_EXCLUSIVE);
785 SLOG(LOG_DEBUG, TAG_VCM, "=====");
786 SLOG(LOG_DEBUG, TAG_VCM, " ");
791 int vc_mgr_set_audio_type(const char* audio_id)
793 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Set audio type");
795 if (NULL == audio_id) {
796 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Input parameter is NULL");
797 return VC_ERROR_INVALID_PARAMETER;
801 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
802 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
803 SLOG(LOG_DEBUG, TAG_VCM, "=====");
804 SLOG(LOG_DEBUG, TAG_VCM, " ");
805 return VC_ERROR_INVALID_STATE;
809 if (state != VC_STATE_READY) {
810 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: Current state is not 'READY'");
811 SLOG(LOG_DEBUG, TAG_VCM, "=====");
812 SLOG(LOG_DEBUG, TAG_VCM, " ");
813 return VC_ERROR_INVALID_STATE;
816 /* Check service state */
817 vc_service_state_e service_state = -1;
818 vc_mgr_client_get_service_state(g_vc_m, &service_state);
819 if (service_state != VC_SERVICE_STATE_READY) {
820 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: service state is not 'READY'");
821 SLOG(LOG_DEBUG, TAG_VCM, "=====");
822 SLOG(LOG_DEBUG, TAG_VCM, " ");
823 return VC_ERROR_INVALID_STATE;
833 ret = vc_mgr_dbus_request_set_audio_type(g_vc_m->handle, audio_id);
835 if (VC_ERROR_TIMED_OUT != ret) {
836 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to set audio type : %s", __vc_mgr_get_error_code(ret));
839 SLOG(LOG_WARN, TAG_VCM, "[WARNING] retry to set audio type : %s", __vc_mgr_get_error_code(ret));
842 if (VC_RETRY_COUNT == count) {
843 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request");
848 SLOG(LOG_DEBUG, TAG_VCM, "[SUCCESS] Set audio type");
850 vc_mgr_client_set_audio_type(g_vc_m, audio_id);
854 SLOG(LOG_DEBUG, TAG_VCM, "=====");
855 SLOG(LOG_DEBUG, TAG_VCM, " ");
860 int vc_mgr_get_audio_type(char** audio_id)
862 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Get audio type");
864 if (NULL == audio_id) {
865 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Input parameter is NULL");
866 return VC_ERROR_INVALID_PARAMETER;
870 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
871 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
872 SLOG(LOG_DEBUG, TAG_VCM, "=====");
873 SLOG(LOG_DEBUG, TAG_VCM, " ");
874 return VC_ERROR_INVALID_STATE;
878 if (state != VC_STATE_READY) {
879 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: Current state is not 'READY'");
880 SLOG(LOG_DEBUG, TAG_VCM, "=====");
881 SLOG(LOG_DEBUG, TAG_VCM, " ");
882 return VC_ERROR_INVALID_STATE;
885 /* Check service state */
886 vc_service_state_e service_state = -1;
887 vc_mgr_client_get_service_state(g_vc_m, &service_state);
888 if (service_state != VC_SERVICE_STATE_READY) {
889 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: service state is not 'READY'");
890 SLOG(LOG_DEBUG, TAG_VCM, "=====");
891 SLOG(LOG_DEBUG, TAG_VCM, " ");
892 return VC_ERROR_INVALID_STATE;
897 vc_mgr_client_get_audio_type(g_vc_m, &temp);
905 /* Not initiallized */
909 ret = vc_mgr_dbus_request_get_audio_type(g_vc_m->handle, &temp);
911 if (VC_ERROR_TIMED_OUT != ret) {
912 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get audio type : %s", __vc_mgr_get_error_code(ret));
915 SLOG(LOG_WARN, TAG_VCM, "[WARNING] retry to get audio type : %s", __vc_mgr_get_error_code(ret));
918 if (VC_RETRY_COUNT == count) {
919 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request");
924 SLOG(LOG_DEBUG, TAG_VCM, "[SUCCESS] Get audio type : %s", temp);
926 vc_mgr_client_set_audio_type(g_vc_m, temp);
932 *audio_id = strdup(temp);
940 int vc_mgr_get_current_commands(vc_cmd_list_h* vc_cmd_list)
942 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Foreach current commands");
945 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
946 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
947 SLOG(LOG_DEBUG, TAG_VCM, "=====");
948 SLOG(LOG_DEBUG, TAG_VCM, " ");
949 return VC_ERROR_INVALID_STATE;
953 if (state != VC_STATE_READY) {
954 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: Current state is not 'READY'");
955 SLOG(LOG_DEBUG, TAG_VCM, "=====");
956 SLOG(LOG_DEBUG, TAG_VCM, " ");
957 return VC_ERROR_INVALID_STATE;
960 /* Check service state */
961 vc_service_state_e service_state = -1;
962 vc_mgr_client_get_service_state(g_vc_m, &service_state);
963 if (service_state != VC_SERVICE_STATE_READY) {
964 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: service state is not 'READY'");
965 SLOG(LOG_DEBUG, TAG_VCM, "=====");
966 SLOG(LOG_DEBUG, TAG_VCM, " ");
967 return VC_ERROR_INVALID_STATE;
970 if (NULL == vc_cmd_list) {
971 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid Parameter");
972 SLOG(LOG_DEBUG, TAG_VCM, "=====");
973 SLOG(LOG_DEBUG, TAG_VCM, " ");
974 return VC_ERROR_INVALID_PARAMETER;
977 vc_cmd_list_h temp_list = NULL;
978 if (0 != vc_cmd_list_create(&temp_list)) {
979 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to create list");
980 return VC_ERROR_INVALID_PARAMETER;
983 *vc_cmd_list = temp_list;
990 /* Get foreground pid */
991 if (0 != vc_mgr_client_get_foreground(g_vc_m, &fg_pid)) {
992 /* There is no foreground app for voice control */
993 SLOG(LOG_WARN, TAG_VCM, "[Manager WARNING] No foreground pid for voice control");
995 SLOG(LOG_DEBUG, TAG_VCM, "[Manager] Foreground pid(%d)", fg_pid);
998 if (0 != vc_mgr_client_get_pid(g_vc_m, &mgr_pid)) {
999 SLOG(LOG_DEBUG, TAG_VCM, "[Manager] Fail to get manager pid");
1000 return VC_ERROR_OPERATION_FAILED;
1002 SLOG(LOG_DEBUG, TAG_VCM, "[Manager] Manager pid(%d)", mgr_pid);
1005 /* Get system command */
1006 ret = vc_cmd_parser_append_commands(mgr_pid, VC_COMMAND_TYPE_SYSTEM, temp_list);
1008 SLOG(LOG_DEBUG, TAG_VCM, "[Manager] No system commands");
1015 ret = vc_mgr_dbus_request_set_client_info(g_vc_m->handle);
1017 if (VC_ERROR_TIMED_OUT != ret) {
1018 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to set client info : %s", __vc_mgr_get_error_code(ret));
1021 SLOG(LOG_WARN, TAG_VCM, "[WARNING] retry to set client info : %s", __vc_mgr_get_error_code(ret));
1024 if (VC_RETRY_COUNT == count) {
1025 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request");
1030 SLOG(LOG_DEBUG, TAG_VCM, "[SUCCESS] Set client info");
1034 GSList *iter = NULL;
1035 GSList* client_info_list = NULL;
1036 vc_client_info_s *client_info = NULL;
1037 bool is_fgpid = false;
1039 if (0 != vc_info_parser_get_client_info(&client_info_list)) {
1040 SLOG(LOG_DEBUG, TAG_VCM, "[DEBUG] No client");
1044 if (VC_NO_FOREGROUND_PID != fg_pid) {
1045 iter = g_slist_nth(client_info_list, 0);
1046 while (NULL != iter) {
1047 client_info = iter->data;
1048 if (NULL != client_info) {
1049 if (fg_pid == client_info->pid) {
1054 iter = g_slist_next(iter);
1058 /* Get foreground commands and widget */
1059 if (true == is_fgpid) {
1061 SLOG(LOG_DEBUG, TAG_VCM, "[Manager] fore cmd(%d)", client_info->fg_cmd);
1063 /* Get foreground command */
1064 if (true == client_info->fg_cmd) {
1065 ret = vc_cmd_parser_append_commands(fg_pid, VC_COMMAND_TYPE_FOREGROUND, temp_list);
1067 SLOG(LOG_ERROR, TAG_VCM, "[Client Data ERROR] Fail to get the fg command list");
1070 SLOG(LOG_DEBUG, TAG_VCM, "[Manager] No foreground commands");
1073 /* Check exclusive option */
1074 if (true == client_info->exclusive_cmd) {
1075 SLOG(LOG_DEBUG, TAG_VCM, "[Manager] Exclusive command is ON");
1077 /* Set background command for exclusive option */
1078 if (true == client_info->bg_cmd) {
1079 SLOG(LOG_DEBUG, TAG_VCM, "[Manager] Set background command");
1080 ret = vc_cmd_parser_append_commands(client_info->pid, VC_COMMAND_TYPE_BACKGROUND, temp_list);
1082 SLOG(LOG_ERROR, TAG_VCM, "[Client Data ERROR] Fail to get the bg command list : pid(%d)", client_info->pid);
1086 /* need to release client info */
1087 iter = g_slist_nth(client_info_list, 0);
1089 while (NULL != iter) {
1090 client_info = iter->data;
1091 if (NULL != client_info) {
1094 client_info_list = g_slist_remove_link(client_info_list, iter);
1095 iter = g_slist_nth(client_info_list, 0);
1098 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1099 SLOG(LOG_DEBUG, TAG_VCM, " ");
1104 SLOG(LOG_DEBUG, TAG_VCM, "[Manager] No foreground app");
1107 /* Get background commands */
1108 if (0 < g_slist_length(client_info_list)) {
1109 iter = g_slist_nth(client_info_list, 0);
1111 while (NULL != iter) {
1112 client_info = iter->data;
1114 if (NULL != client_info) {
1115 SLOG(LOG_DEBUG, TAG_VCM, "[Manager] Pid(%d) Back cmd(%d)", client_info->pid, client_info->bg_cmd);
1116 if (true == client_info->bg_cmd) {
1117 ret = vc_cmd_parser_append_commands(client_info->pid, VC_COMMAND_TYPE_BACKGROUND, temp_list);
1119 SLOG(LOG_ERROR, TAG_VCM, "[Client Data ERROR] Fail to get the bg command list : pid(%d)", client_info->pid);
1124 client_info_list = g_slist_remove_link(client_info_list, iter);
1126 iter = g_slist_nth(client_info_list, 0);
1130 SLOG(LOG_DEBUG, TAG_VCM, "[Manager] No background commands");
1133 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1134 SLOG(LOG_DEBUG, TAG_VCM, " ");
1139 int vc_mgr_set_recognition_mode(vc_recognition_mode_e mode)
1141 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Set recognition mode = %d", mode);
1144 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
1145 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1146 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1147 SLOG(LOG_DEBUG, TAG_VCM, " ");
1148 return VC_ERROR_INVALID_STATE;
1152 if (state != VC_STATE_READY) {
1153 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: Current state is not 'READY'");
1154 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1155 SLOG(LOG_DEBUG, TAG_VCM, " ");
1156 return VC_ERROR_INVALID_STATE;
1159 /* Check service state */
1160 vc_service_state_e service_state = -1;
1161 vc_mgr_client_get_service_state(g_vc_m, &service_state);
1162 if (service_state != VC_SERVICE_STATE_READY) {
1163 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: service state is not 'READY'");
1164 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1165 SLOG(LOG_DEBUG, TAG_VCM, " ");
1166 return VC_ERROR_INVALID_STATE;
1169 vc_mgr_client_set_recognition_mode(g_vc_m, mode);
1173 int vc_mgr_get_recognition_mode(vc_recognition_mode_e* mode)
1177 ret = vc_mgr_client_get_recognition_mode(g_vc_m, mode);
1179 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get recognition mode");
1183 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Get recognition mode = %d", *mode);
1187 int vc_mgr_start(bool exclusive_command_option)
1189 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Request start");
1192 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
1193 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1194 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1195 SLOG(LOG_DEBUG, TAG_VCM, " ");
1196 return VC_ERROR_INVALID_STATE;
1200 if (state != VC_STATE_READY) {
1201 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: Current state is not 'READY'");
1202 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1203 SLOG(LOG_DEBUG, TAG_VCM, " ");
1204 return VC_ERROR_INVALID_STATE;
1207 /* Check service state */
1208 vc_service_state_e service_state = -1;
1209 vc_mgr_client_get_service_state(g_vc_m, &service_state);
1210 if (service_state != VC_SERVICE_STATE_READY) {
1211 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: service state is not 'READY'");
1212 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1213 SLOG(LOG_DEBUG, TAG_VCM, " ");
1214 return VC_ERROR_INVALID_STATE;
1217 vc_mgr_client_set_exclusive_command(g_vc_m, exclusive_command_option);
1219 bool start_by_client = false;
1220 if (0 != vc_mgr_client_get_start_by_client(g_vc_m, &start_by_client)) {
1221 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get start by client");
1226 vc_recognition_mode_e recognition_mode = VC_RECOGNITION_MODE_STOP_BY_SILENCE;
1227 if (0 != vc_mgr_get_recognition_mode(&recognition_mode)) {
1228 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get recognition mode");
1235 ret = vc_mgr_dbus_request_start(g_vc_m->handle, (int)recognition_mode, exclusive_command_option, start_by_client);
1237 if (VC_ERROR_TIMED_OUT != ret) {
1238 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to start request start : %s", __vc_mgr_get_error_code(ret));
1241 SLOG(LOG_WARN, TAG_VCM, "[WARNING] retry start request start : %s", __vc_mgr_get_error_code(ret));
1244 if (VC_RETRY_COUNT == count) {
1245 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request");
1246 vc_mgr_client_set_exclusive_command(g_vc_m, false);
1251 SLOG(LOG_DEBUG, TAG_VCM, "[SUCCESS] start recognition");
1255 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1256 SLOG(LOG_DEBUG, TAG_VCM, " ");
1263 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Request stop");
1266 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
1267 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1268 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1269 SLOG(LOG_DEBUG, TAG_VCM, " ");
1270 return VC_ERROR_INVALID_STATE;
1274 if (state != VC_STATE_READY) {
1275 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: client state is not 'READY'");
1276 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1277 SLOG(LOG_DEBUG, TAG_VCM, " ");
1278 return VC_ERROR_INVALID_STATE;
1281 /* Check service state */
1282 vc_service_state_e service_state = -1;
1283 vc_mgr_client_get_service_state(g_vc_m, &service_state);
1284 if (service_state != VC_SERVICE_STATE_RECORDING) {
1285 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: service state is not 'RECORDING'");
1286 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1287 SLOG(LOG_DEBUG, TAG_VCM, " ");
1288 return VC_ERROR_INVALID_STATE;
1295 ret = vc_mgr_dbus_request_stop(g_vc_m->handle);
1297 if (VC_ERROR_TIMED_OUT != ret) {
1298 SLOG(LOG_DEBUG, TAG_VCM, "[ERROR] Fail to stop request : %s", __vc_mgr_get_error_code(ret));
1301 SLOG(LOG_WARN, TAG_VCM, "[WARNING] retry stop request : %s", __vc_mgr_get_error_code(ret));
1304 if (VC_RETRY_COUNT == count) {
1305 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request");
1310 SLOG(LOG_DEBUG, TAG_VCM, "[SUCCESS] Stop recognition");
1314 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1315 SLOG(LOG_DEBUG, TAG_VCM, " ");
1322 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Request cancel");
1325 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
1326 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1327 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1328 SLOG(LOG_DEBUG, TAG_VCM, " ");
1329 return VC_ERROR_INVALID_STATE;
1333 if (state != VC_STATE_READY) {
1334 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: client state is not 'READY'");
1335 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1336 SLOG(LOG_DEBUG, TAG_VCM, " ");
1337 return VC_ERROR_INVALID_STATE;
1340 /* Check service state */
1341 vc_service_state_e service_state = -1;
1342 vc_mgr_client_get_service_state(g_vc_m, &service_state);
1343 if (service_state != VC_SERVICE_STATE_RECORDING && service_state != VC_SERVICE_STATE_PROCESSING) {
1344 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: service state is not 'RECORDING' or 'PROCESSING'");
1345 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1346 SLOG(LOG_DEBUG, TAG_VCM, " ");
1347 return VC_ERROR_INVALID_STATE;
1353 ret = vc_mgr_dbus_request_cancel(g_vc_m->handle);
1355 if (VC_ERROR_TIMED_OUT != ret) {
1356 SLOG(LOG_DEBUG, TAG_VCM, "[ERROR] Fail to cancel request : %s", __vc_mgr_get_error_code(ret));
1359 SLOG(LOG_WARN, TAG_VCM, "[WARNING] retry cancel request : %s", __vc_mgr_get_error_code(ret));
1362 if (VC_RETRY_COUNT == count) {
1363 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request");
1368 SLOG(LOG_DEBUG, TAG_VCM, "[SUCCESS] Cancel recognition");
1372 vc_mgr_client_set_exclusive_command(g_vc_m, false);
1374 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1375 SLOG(LOG_DEBUG, TAG_VCM, " ");
1380 int __vc_mgr_cb_set_volume(float volume)
1382 g_volume_db = volume;
1383 SLOG(LOG_DEBUG, TAG_VCM, "Set volume (%f)", g_volume_db);
1388 int vc_mgr_get_recording_volume(float* volume)
1390 if (NULL == volume) {
1391 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Input parameter is NULL");
1392 return VC_ERROR_INVALID_PARAMETER;
1395 vc_service_state_e service_state = -1;
1396 if (0 != vc_mgr_client_get_service_state(g_vc_m, &service_state)) {
1397 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1398 return VC_ERROR_INVALID_STATE;
1402 if (VC_SERVICE_STATE_RECORDING != service_state) {
1403 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: Service state is not 'RECORDING'");
1404 return VC_ERROR_INVALID_STATE;
1407 *volume = g_volume_db;
1412 int __vc_mgr_cb_set_foreground(int pid, bool value)
1414 vc_mgr_client_set_foreground(g_vc_m, pid, value);
1416 /* get authorized valid app */
1418 if (0 != vc_mgr_client_get_valid_authorized_client(g_vc_m, &tmp_pid)) {
1419 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get authorized valid app");
1420 return VC_ERROR_INVALID_PARAMETER;
1423 if (true == value) {
1424 /* compare & set valid */
1425 if (tmp_pid != pid) {
1426 SLOG(LOG_DEBUG, TAG_VCM, "Authority(%d) changed to invalid", tmp_pid);
1428 /* set authorized valid */
1429 if (true == vc_mgr_client_is_authorized_client(g_vc_m, pid)) {
1430 SLOG(LOG_DEBUG, TAG_VCM, "Authority(%d) change to valid", pid);
1431 vc_mgr_client_set_valid_authorized_client(g_vc_m, pid);
1433 SLOG(LOG_DEBUG, TAG_VCM, "No valid Authority");
1434 vc_mgr_client_set_valid_authorized_client(g_vc_m, -1);
1438 if (tmp_pid == pid) {
1439 SLOG(LOG_DEBUG, TAG_VCM, "Authority(%d) changed to invalid", tmp_pid);
1440 vc_mgr_client_set_valid_authorized_client(g_vc_m, -1);
1447 int vc_mgr_set_selected_results(vc_cmd_list_h vc_cmd_list)
1449 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Select result");
1451 /* Do not check state for 'restart continusly' mode */
1453 vc_service_state_e service_state = -1;
1454 vc_mgr_client_get_service_state(g_vc_m, &service_state);
1455 if (service_state != VC_SERVICE_STATE_PROCESSING) {
1456 vc_recognition_mode_e recognition_mode;
1457 vc_mgr_get_recognition_mode(&recognition_mode);
1459 if (VC_RECOGNITION_MODE_RESTART_CONTINUOUSLY != recognition_mode) {
1460 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: service state is not 'PROCESSING' and mode is not 'Restart continously'");
1461 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1462 SLOG(LOG_DEBUG, TAG_VCM, " ");
1463 return VC_ERROR_INVALID_STATE;
1467 if (NULL != vc_cmd_list) {
1469 char* result_text = NULL;
1471 vc_mgr_client_get_all_result(g_vc_m, &event, &result_text);
1473 vc_info_parser_set_result(result_text, event, NULL, vc_cmd_list, false);
1475 if (NULL != result_text) {
1488 ret = vc_mgr_dbus_send_result_selection(g_vc_m->handle);
1490 if (VC_ERROR_TIMED_OUT != ret) {
1491 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to send result selection : %s", __vc_mgr_get_error_code(ret));
1494 SLOG(LOG_WARN, TAG_VCM, "[WARNING] retry send result selection : %s", __vc_mgr_get_error_code(ret));
1497 if (VC_RETRY_COUNT == count) {
1498 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request");
1503 SLOG(LOG_DEBUG, TAG_VCM, "[SUCCESS] result selection");
1507 vc_mgr_client_unset_all_result(g_vc_m);
1509 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1510 SLOG(LOG_DEBUG, TAG_VCM, " ");
1515 static Eina_Bool __vc_mgr_set_select_result(void *data)
1517 vc_mgr_set_selected_results(NULL);
1521 int vc_mgr_set_nlp_info(const char* info)
1526 int vc_mgr_get_nlp_info(char** info)
1528 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Get nlp info");
1530 vc_service_state_e service_state = -1;
1531 vc_mgr_client_get_service_state(g_vc_m, &service_state);
1532 if (service_state != VC_SERVICE_STATE_PROCESSING) {
1533 vc_recognition_mode_e recognition_mode;
1534 vc_mgr_get_recognition_mode(&recognition_mode);
1536 if (VC_RECOGNITION_MODE_RESTART_CONTINUOUSLY != recognition_mode) {
1537 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: service state is not 'PROCESSING' and mode is not 'Restart continously'");
1538 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1539 SLOG(LOG_DEBUG, TAG_VCM, " ");
1540 return VC_ERROR_INVALID_STATE;
1545 ret = vc_info_parser_get_nlp_info(info);
1547 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get nlp_info");
1550 if (0 == strncmp(*info, "null", strlen("null"))) {
1551 SLOG(LOG_DEBUG, TAG_VCM, "Get nlp info (NULL)");
1555 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1556 SLOG(LOG_DEBUG, TAG_VCM, " ");
1561 int vc_mgr_set_pre_result_cb(vc_mgr_pre_result_cb callback, void* user_data)
1563 if (NULL == callback){
1564 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set error callback : callback is NULL");
1565 return VC_ERROR_INVALID_PARAMETER;
1569 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
1570 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set error callback : A handle is not available");
1571 return VC_ERROR_INVALID_STATE;
1575 if (state != VC_STATE_INITIALIZED) {
1576 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set error callback : Current state is not 'Initialized'");
1577 return VC_ERROR_INVALID_STATE;
1580 vc_mgr_client_set_pre_result_cb(g_vc_m, callback, user_data);
1582 SLOG(LOG_DEBUG, TAG_VCM, "[SUCCESS] Set pre result callback");
1586 int vc_mgr_unset_pre_result_cb()
1589 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
1590 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset error callback : A handle is not available");
1591 return VC_ERROR_INVALID_STATE;
1595 if (state != VC_STATE_INITIALIZED) {
1596 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset error callback : Current state is not 'Initialized'");
1597 return VC_ERROR_INVALID_STATE;
1600 vc_mgr_client_set_pre_result_cb(g_vc_m, NULL, NULL);
1605 static void __vc_mgr_notify_all_result(vc_result_type_e result_type)
1607 char* temp_text = NULL;
1609 char* temp_message = NULL;
1610 vc_cmd_list_h vc_cmd_list = NULL;
1612 vc_mgr_all_result_cb all_callback = NULL;
1613 void* all_user_data = NULL;
1615 vc_mgr_client_get_all_result_cb(g_vc_m, &all_callback, &all_user_data);
1616 if (NULL == all_callback) {
1617 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] All result callback is NULL");
1621 if (0 != vc_cmd_list_create(&vc_cmd_list)) {
1622 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to create command list");
1626 vc_info_parser_get_result(&temp_text, &event, &temp_message, -1, vc_cmd_list, vc_mgr_client_get_exclusive_command(g_vc_m));
1628 SLOG(LOG_DEBUG, TAG_VCM, "Result info : result type(%d) result text(%s) event(%d) result_message(%s)",
1629 result_type, temp_text, event, temp_message);
1631 vc_cmd_print_list(vc_cmd_list);
1635 vc_mgr_client_use_callback(g_vc_m);
1636 cb_ret = all_callback(event, vc_cmd_list, temp_text, temp_message, all_user_data);
1637 vc_mgr_client_not_use_callback(g_vc_m);
1639 if (true == vc_mgr_client_get_exclusive_command(g_vc_m)) {
1641 vc_result_cb callback = NULL;
1642 void* user_data = NULL;
1644 vc_mgr_client_get_result_cb(g_vc_m, &callback, &user_data);
1645 if (NULL == callback) {
1646 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Client result callback is NULL");
1650 vc_mgr_client_use_callback(g_vc_m);
1651 callback(event, vc_cmd_list, temp_text, user_data);
1652 vc_mgr_client_not_use_callback(g_vc_m);
1653 SLOG(LOG_DEBUG, TAG_VCM, "Exclusive result callback called");
1655 /* Release result */
1656 if (NULL != temp_text) free(temp_text);
1659 vc_cmd_list_destroy(vc_cmd_list, true);
1661 vc_mgr_client_set_exclusive_command(g_vc_m, false);
1667 vc_cmd_list_get_count(vc_cmd_list, &count);
1669 if (true == cb_ret) {
1670 SLOG(LOG_DEBUG, TAG_VCM, "Callback result is true");
1671 if (VC_RESULT_TYPE_NOTIFICATION != result_type)
1672 ecore_idler_add(__vc_mgr_set_select_result, NULL);
1674 SLOG(LOG_DEBUG, TAG_VCM, "Callback result is false");
1675 /* need to select conflicted result */
1677 vc_mgr_client_set_all_result(g_vc_m, event, temp_text);
1680 if (VC_RESULT_TYPE_NOTIFICATION != result_type)
1681 ecore_idler_add(__vc_mgr_set_select_result, NULL);
1683 vc_mgr_client_set_exclusive_command(g_vc_m, false);
1684 vc_mgr_client_unset_all_result(g_vc_m);
1687 /* Release result */
1688 if (NULL != temp_text) free(temp_text);
1691 vc_cmd_list_destroy(vc_cmd_list, true);
1696 static Eina_Bool __vc_mgr_notify_result(void *data)
1700 vc_cmd_list_h vc_cmd_list = NULL;
1702 vc_result_cb callback = NULL;
1703 void* user_data = NULL;
1705 vc_mgr_client_get_result_cb(g_vc_m, &callback, &user_data);
1706 if (NULL == callback) {
1707 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Client result callback is NULL");
1711 if (0 != vc_cmd_list_create(&vc_cmd_list)) {
1712 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to create command list");
1716 vc_info_parser_get_result(&temp_text, &event, NULL, getpid(), vc_cmd_list, false);
1718 SLOG(LOG_DEBUG, TAG_VCM, "Result : result text(%s) event(%d)", temp_text, event);
1720 vc_cmd_print_list(vc_cmd_list);
1722 vc_mgr_client_use_callback(g_vc_m);
1723 callback(event, vc_cmd_list, temp_text, user_data);
1724 vc_mgr_client_not_use_callback(g_vc_m);
1725 SLOG(LOG_DEBUG, TAG_VCM, "Result callback called");
1727 vc_cmd_list_destroy(vc_cmd_list, true);
1729 /* Release result */
1730 if (NULL != temp_text) free(temp_text);
1735 static Eina_Bool __vc_mgr_notify_pre_result(void *data)
1737 vc_mgr_pre_result_cb callback = NULL;
1738 void* user_data = NULL;
1740 char* pre_result = NULL;
1742 vc_mgr_client_get_pre_resut_cb(g_vc_m, &callback, &user_data);
1743 if (NULL == callback) {
1744 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Client speech detected callback is NULL");
1748 vc_mgr_client_get_pre_result(g_vc_m, &event, &pre_result);
1750 vc_mgr_client_use_callback(g_vc_m);
1751 callback(event, pre_result, user_data);
1752 vc_mgr_client_not_use_callback(g_vc_m);
1753 SLOG(LOG_DEBUG, TAG_VCM, "Speech detected callback called");
1755 if (NULL != pre_result) {
1759 vc_mgr_client_unset_pre_result(g_vc_m);
1764 void __vc_mgr_cb_pre_result(int event, const char* pre_result)
1766 if (0 != vc_mgr_client_set_pre_result(g_vc_m, event, pre_result)) {
1767 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Client speech detected callback is NULL");
1770 ecore_timer_add(0, __vc_mgr_notify_pre_result, NULL);
1775 void __vc_mgr_cb_all_result(vc_result_type_e type)
1777 if (false == vc_mgr_client_get_exclusive_command(g_vc_m)) {
1778 __vc_mgr_notify_all_result(type);
1780 __vc_mgr_notify_result(0);
1786 void __vc_mgr_cb_system_result()
1788 __vc_mgr_notify_result(NULL);
1792 static Eina_Bool __vc_mgr_speech_detected(void *data)
1794 vc_mgr_begin_speech_detected_cb callback = NULL;
1795 void* user_data = NULL;
1797 vc_mgr_client_get_speech_detected_cb(g_vc_m, &callback, &user_data);
1798 if (NULL == callback) {
1799 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Client speech detected callback is NULL");
1803 vc_mgr_client_use_callback(g_vc_m);
1804 callback(user_data);
1805 vc_mgr_client_not_use_callback(g_vc_m);
1806 SLOG(LOG_DEBUG, TAG_VCM, "Speech detected callback called");
1811 void __vc_mgr_cb_speech_detected()
1813 __vc_mgr_speech_detected(NULL);
1818 int vc_mgr_set_all_result_cb(vc_mgr_all_result_cb callback, void* user_data)
1820 if (NULL == callback)
1821 return VC_ERROR_INVALID_PARAMETER;
1824 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
1825 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set result callback : A handle is not available");
1826 return VC_ERROR_INVALID_STATE;
1830 if (state != VC_STATE_INITIALIZED) {
1831 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set result callback : Current state is not 'Initialized'");
1832 return VC_ERROR_INVALID_STATE;
1835 vc_mgr_client_set_all_result_cb(g_vc_m, callback, user_data);
1837 SLOG(LOG_DEBUG, TAG_VCM, "[SUCCESS] Set all result callback");
1842 int vc_mgr_unset_all_result_cb()
1845 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
1846 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset result callback : A handle is not available");
1847 return VC_ERROR_INVALID_STATE;
1851 if (state != VC_STATE_INITIALIZED) {
1852 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset result callback : Current state is not 'Initialized'");
1853 return VC_ERROR_INVALID_STATE;
1856 vc_mgr_client_set_all_result_cb(g_vc_m, NULL, NULL);
1861 int vc_mgr_set_result_cb(vc_result_cb callback, void* user_data)
1863 if (NULL == callback)
1864 return VC_ERROR_INVALID_PARAMETER;
1867 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
1868 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set result callback : A handle is not available");
1869 return VC_ERROR_INVALID_STATE;
1873 if (state != VC_STATE_INITIALIZED) {
1874 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set result callback : Current state is not 'Initialized'");
1875 return VC_ERROR_INVALID_STATE;
1878 vc_mgr_client_set_result_cb(g_vc_m, callback, user_data);
1883 int vc_mgr_unset_result_cb()
1886 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
1887 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset result callback : A handle is not available");
1888 return VC_ERROR_INVALID_STATE;
1892 if (state != VC_STATE_INITIALIZED) {
1893 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset result callback : Current state is not 'Initialized'");
1894 return VC_ERROR_INVALID_STATE;
1897 vc_mgr_client_set_result_cb(g_vc_m, NULL, NULL);
1902 static Eina_Bool __vc_mgr_notify_error(void *data)
1904 vc_h vc_m = (vc_h)data;
1906 vc_error_cb callback = NULL;
1907 void* user_data = NULL;
1910 vc_mgr_client_get_error_cb(vc_m, &callback, &user_data);
1911 vc_mgr_client_get_error(vc_m, &reason);
1913 if (NULL != callback) {
1914 vc_mgr_client_use_callback(vc_m);
1915 callback(reason, user_data);
1916 vc_mgr_client_not_use_callback(vc_m);
1917 SLOG(LOG_DEBUG, TAG_VCM, "Error callback is called");
1919 SLOG(LOG_WARN, TAG_VCM, "[WARNING] Error callback is null");
1925 int __vc_mgr_cb_error(int reason, int daemon_pid, char* msg)
1928 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
1929 SLOG(LOG_ERROR, TAG_VCM, "[WARNING] Invalid client");
1934 if (state != VC_STATE_READY) {
1935 SLOG(LOG_ERROR, TAG_VCM, "[WARNING] not connected client yet");
1939 if ((daemon_pid == g_daemon_pid) && (VC_ERROR_SERVICE_RESET == reason)) {
1940 SLOG(LOG_ERROR, TAG_VCM, "[WARNING] This is first initializing, not daemon reset");
1943 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Error reason(%d), msg(%s)", reason, msg);
1945 if (VC_ERROR_SERVICE_RESET == reason) {
1946 vc_mgr_client_set_client_state(g_vc_m, VC_STATE_INITIALIZED);
1947 __vc_mgr_notify_state_changed(NULL);
1950 vc_mgr_client_set_error(g_vc_m, reason);
1951 __vc_mgr_notify_error(g_vc_m);
1956 static Eina_Bool __vc_mgr_notify_state_changed(void *data)
1958 vc_state_changed_cb changed_callback = NULL;
1961 vc_mgr_client_get_state_changed_cb(g_vc_m, &changed_callback, &user_data);
1963 vc_state_e current_state;
1964 vc_state_e before_state;
1966 vc_mgr_client_get_before_state(g_vc_m, ¤t_state, &before_state);
1968 if (NULL != changed_callback) {
1969 vc_mgr_client_use_callback(g_vc_m);
1970 changed_callback(before_state, current_state, user_data);
1971 vc_mgr_client_not_use_callback(g_vc_m);
1972 SLOG(LOG_DEBUG, TAG_VCM, "State changed callback is called");
1974 SLOG(LOG_WARN, TAG_VCM, "[WARNING] State changed callback is null");
1980 int vc_mgr_set_state_changed_cb(vc_state_changed_cb callback, void* user_data)
1982 if (callback == NULL)
1983 return VC_ERROR_INVALID_PARAMETER;
1986 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
1987 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set state changed callback : A handle is not available");
1988 return VC_ERROR_INVALID_STATE;
1992 if (state != VC_STATE_INITIALIZED) {
1993 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set state changed callback : Current state is not 'Initialized'");
1994 return VC_ERROR_INVALID_STATE;
1997 vc_mgr_client_set_state_changed_cb(g_vc_m, callback, user_data);
1999 SLOG(LOG_DEBUG, TAG_VCM, "[SUCCESS] Set state changed callback");
2003 int vc_mgr_unset_state_changed_cb()
2006 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
2007 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset state changed callback : A handle is not available");
2008 return VC_ERROR_INVALID_STATE;
2012 if (state != VC_STATE_INITIALIZED) {
2013 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset state changed callback : Current state is not 'Initialized'");
2014 return VC_ERROR_INVALID_STATE;
2017 vc_mgr_client_set_state_changed_cb(g_vc_m, NULL, NULL);
2022 int __vc_mgr_cb_service_state(int state)
2024 vc_service_state_e current_state = (vc_service_state_e)state;
2025 vc_service_state_e before_state;
2026 vc_mgr_client_get_service_state(g_vc_m, &before_state);
2028 if (current_state == before_state) {
2029 SLOG(LOG_WARN, TAG_VCM, "Service State NOT changed : Before(%d) Current(%d)",
2030 before_state, current_state);
2034 SLOG(LOG_DEBUG, TAG_VCM, "Service State changed : Before(%d) Current(%d)",
2035 before_state, current_state);
2037 /* Save service state */
2038 vc_mgr_client_set_service_state(g_vc_m, current_state);
2040 vc_service_state_changed_cb callback = NULL;
2041 void* service_user_data = NULL;
2042 vc_mgr_client_get_service_state_changed_cb(g_vc_m, &callback, &service_user_data);
2044 if (NULL != callback) {
2045 vc_mgr_client_use_callback(g_vc_m);
2046 callback(before_state, current_state, service_user_data);
2047 vc_mgr_client_not_use_callback(g_vc_m);
2048 SLOG(LOG_DEBUG, TAG_VCM, "Service state changed callback is called");
2050 SLOG(LOG_WARN, TAG_VCM, "[WARNING] Service state changed callback is null");
2056 int vc_mgr_set_service_state_changed_cb(vc_service_state_changed_cb callback, void* user_data)
2058 if (callback == NULL)
2059 return VC_ERROR_INVALID_PARAMETER;
2062 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
2063 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set state changed callback : A handle is not available");
2064 return VC_ERROR_INVALID_STATE;
2068 if (state != VC_STATE_INITIALIZED) {
2069 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set state changed callback : Current state is not 'Initialized'");
2070 return VC_ERROR_INVALID_STATE;
2073 vc_mgr_client_set_service_state_changed_cb(g_vc_m, callback, user_data);
2075 SLOG(LOG_DEBUG, TAG_VCM, "[SUCCESS] Set sevice state changed callback");
2079 int vc_mgr_unset_service_state_changed_cb()
2082 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
2083 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset state changed callback : A handle is not available");
2084 return VC_ERROR_INVALID_STATE;
2088 if (state != VC_STATE_INITIALIZED) {
2089 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset state changed callback : Current state is not 'Initialized'");
2090 return VC_ERROR_INVALID_STATE;
2093 vc_mgr_client_set_service_state_changed_cb(g_vc_m, NULL, NULL);
2097 int vc_mgr_set_speech_detected_cb(vc_mgr_begin_speech_detected_cb callback, void* user_data)
2099 if (callback == NULL)
2100 return VC_ERROR_INVALID_PARAMETER;
2103 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
2104 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set state changed callback : A handle is not available");
2105 return VC_ERROR_INVALID_STATE;
2109 if (state != VC_STATE_INITIALIZED) {
2110 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set speech detected callback : Current state is not 'Initialized'");
2111 return VC_ERROR_INVALID_STATE;
2114 vc_mgr_client_set_speech_detected_cb(g_vc_m, callback, user_data);
2116 SLOG(LOG_DEBUG, TAG_VCM, "[SUCCESS] Set speech detected callback");
2120 int vc_mgr_unset_speech_detected_cb()
2123 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
2124 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset state changed callback : A handle is not available");
2125 return VC_ERROR_INVALID_STATE;
2129 if (state != VC_STATE_INITIALIZED) {
2130 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset state changed callback : Current state is not 'Initialized'");
2131 return VC_ERROR_INVALID_STATE;
2134 vc_mgr_client_set_speech_detected_cb(g_vc_m, NULL, NULL);
2138 int vc_mgr_set_current_language_changed_cb(vc_current_language_changed_cb callback, void* user_data)
2140 if (NULL == callback)
2141 return VC_ERROR_INVALID_PARAMETER;
2144 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
2145 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set current language changed : A handle is not available");
2146 return VC_ERROR_INVALID_STATE;
2150 if (state != VC_STATE_INITIALIZED) {
2151 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set current language changed : Current state is not 'Initialized'");
2152 return VC_ERROR_INVALID_STATE;
2155 vc_mgr_client_set_current_lang_changed_cb(g_vc_m, callback, user_data);
2157 SLOG(LOG_DEBUG, TAG_VCM, "[SUCCESS] Set current language changed callback");
2161 int vc_mgr_unset_current_language_changed_cb()
2164 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
2165 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset current language changed : A handle is not available");
2166 return VC_ERROR_INVALID_STATE;
2170 if (state != VC_STATE_INITIALIZED) {
2171 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset current language changed : Current state is not 'Initialized'");
2172 return VC_ERROR_INVALID_STATE;
2175 vc_mgr_client_set_current_lang_changed_cb(g_vc_m, NULL, NULL);
2180 int vc_mgr_set_error_cb(vc_error_cb callback, void* user_data)
2182 if (NULL == callback)
2183 return VC_ERROR_INVALID_PARAMETER;
2186 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
2187 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set error callback : A handle is not available");
2188 return VC_ERROR_INVALID_STATE;
2192 if (state != VC_STATE_INITIALIZED) {
2193 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set error callback : Current state is not 'Initialized'");
2194 return VC_ERROR_INVALID_STATE;
2197 vc_mgr_client_set_error_cb(g_vc_m, callback, user_data);
2202 int vc_mgr_unset_error_cb()
2205 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
2206 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset error callback : A handle is not available");
2207 return VC_ERROR_INVALID_STATE;
2211 if (state != VC_STATE_INITIALIZED) {
2212 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset error callback : Current state is not 'Initialized'");
2213 return VC_ERROR_INVALID_STATE;
2216 vc_mgr_client_set_error_cb(g_vc_m, NULL, NULL);
2221 static bool __vc_mgr_check_demandable_client(int pid)
2223 if (0 == g_slist_length(g_demandable_client_list)) {
2224 SLOG(LOG_WARN, TAG_VCM, "[WARNING] No demandable clients");
2228 char appid[128] = {'\0', };
2229 aul_app_get_appid_bypid(pid, appid, sizeof(appid));
2231 if (0 >= strlen(appid)) {
2232 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] No appid");
2235 SLOG(LOG_DEBUG, TAG_VCM, "[CHECK] Appid - %s", appid);
2237 GSList *iter = NULL;
2238 vc_demandable_client_s* temp_client;
2239 iter = g_slist_nth(g_demandable_client_list, 0);
2241 while (NULL != iter) {
2242 temp_client = iter->data;
2244 if (NULL != temp_client) {
2245 if (NULL != temp_client->appid) {
2246 if (!strcmp(temp_client->appid, appid)) {
2247 SLOG(LOG_DEBUG, TAG_VCM, "pid(%d) is available", pid);
2253 iter = g_slist_next(iter);
2260 int __vc_mgr_request_auth_enable(int pid)
2262 if (false == __vc_mgr_check_demandable_client(pid)) {
2263 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Not demandable client");
2264 return VC_ERROR_INVALID_PARAMETER;
2267 /* check already authorized */
2268 if (true == vc_mgr_client_is_authorized_client(g_vc_m, pid)) {
2269 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Already authorized");
2270 return VC_ERROR_INVALID_PARAMETER;
2273 /* add authorized list */
2274 if (0 != vc_mgr_client_add_authorized_client(g_vc_m, pid)) {
2275 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to add authorized client");
2276 return VC_ERROR_OPERATION_FAILED;
2279 /* foreground check */
2281 if (0 != vc_mgr_client_get_foreground(g_vc_m, &fore_pid)) {
2282 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get foreground");
2283 return VC_ERROR_OPERATION_FAILED;
2286 if (pid == fore_pid) {
2287 vc_mgr_client_set_valid_authorized_client(g_vc_m, pid);
2293 int __vc_mgr_request_auth_disable(int pid)
2295 /* check authorized */
2296 if (false == vc_mgr_client_is_authorized_client(g_vc_m, pid)) {
2297 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] No authorized");
2298 return VC_ERROR_INVALID_PARAMETER;
2301 /* remove authorized list */
2302 if (0 != vc_mgr_client_remove_authorized_client(g_vc_m, pid)) {
2303 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to remove authorized client");
2304 return VC_ERROR_OPERATION_FAILED;
2307 /* check authority valid */
2308 if (true == vc_mgr_client_is_valid_authorized_client(g_vc_m, pid)) {
2309 SLOG(LOG_DEBUG, TAG_VCM, "Valid authorized client is removed");
2310 if (0 != vc_mgr_client_set_valid_authorized_client(g_vc_m, -1)) {
2311 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to set valid authorized client");
2312 return VC_ERROR_OPERATION_FAILED;
2319 static Eina_Bool __request_auth_start(void* data)
2321 SLOG(LOG_DEBUG, TAG_VCM, "Request Start");
2323 if (0 != vc_mgr_client_set_start_by_client(g_vc_m, true)) {
2324 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to set start by client");
2327 if (0 != vc_mgr_start(false)) {
2328 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Request start is failed");
2329 /* TODO - Error handling? */
2332 if (0 != vc_mgr_client_set_start_by_client(g_vc_m, false)) {
2333 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to set start by client");
2340 int __vc_mgr_request_auth_start(int pid)
2342 /* check authorized */
2343 if (false == vc_mgr_client_is_valid_authorized_client(g_vc_m, pid)) {
2344 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] No valid authorized client");
2345 return VC_ERROR_INVALID_PARAMETER;
2348 /* add timer for start recording */
2349 ecore_timer_add(0, __request_auth_start, NULL);
2354 static Eina_Bool __request_auth_stop(void* data)
2356 SLOG(LOG_DEBUG, TAG_VCM, "Request Stop");
2358 if (0 != vc_mgr_stop()) {
2359 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Request stop is failed");
2360 /* TODO - Error handling? */
2366 int __vc_mgr_request_auth_stop(int pid)
2368 /* check authorized */
2369 if (false == vc_mgr_client_is_valid_authorized_client(g_vc_m, pid)) {
2370 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] No valid authorized client");
2371 return VC_ERROR_INVALID_PARAMETER;
2374 /* add timer for start recording */
2375 ecore_timer_add(0, __request_auth_stop, NULL);
2380 static Eina_Bool __request_auth_cancel(void* data)
2382 SLOG(LOG_DEBUG, TAG_VCM, "Request Cancel");
2384 if (0 != vc_mgr_cancel()) {
2385 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Request cancel is failed");
2386 /* TODO - Error handling? */
2392 int __vc_mgr_request_auth_cancel(int pid)
2394 /* check authorized */
2395 if (false == vc_mgr_client_is_valid_authorized_client(g_vc_m, pid)) {
2396 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] No valid authorized client");
2397 return VC_ERROR_INVALID_PARAMETER;
2400 /* add timer for start recording */
2401 ecore_timer_add(0, __request_auth_cancel, NULL);