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.
19 #include <system_info.h>
21 #include "vc_cmd_db.h"
22 #include "vc_config_mgr.h"
23 #include "vc_command.h"
24 #include "vc_info_parser.h"
25 #include "vc_json_parser.h"
27 #include "vc_mgr_client.h"
28 #include "vc_mgr_dbus.h"
29 #include "voice_control.h"
30 #include "voice_control_command.h"
31 #include "voice_control_command_expand.h"
32 #include "voice_control_common.h"
33 #include "voice_control_manager.h"
36 #define VC_MANAGER_CONFIG_HANDLE 100000
38 static Ecore_Timer* g_m_connect_timer = NULL;
40 static Ecore_Timer* g_m_set_volume_timer = NULL;
42 static vc_h g_vc_m = NULL;
44 static GSList* g_demandable_client_list = NULL;
46 static float g_volume_db = 0;
48 static float g_prev_volume_db = 0;
50 static float g_cur_volume_db = 0;
52 static int g_daemon_pid = 0;
54 static int g_feature_enabled = -1;
56 static bool g_err_callback_status = false;
58 static Eina_Bool __vc_mgr_notify_state_changed(void *data);
59 static Eina_Bool __vc_mgr_notify_error(void *data);
60 static Eina_Bool __vc_mgr_notify_result(void *data);
62 static const char* __vc_mgr_get_error_code(vc_error_e err)
65 case VC_ERROR_NONE: return "VC_ERROR_NONE";
66 case VC_ERROR_OUT_OF_MEMORY: return "VC_ERROR_OUT_OF_MEMORY";
67 case VC_ERROR_IO_ERROR: return "VC_ERROR_IO_ERROR";
68 case VC_ERROR_INVALID_PARAMETER: return "VC_ERROR_INVALID_PARAMETER";
69 case VC_ERROR_TIMED_OUT: return "VC_ERROR_TIMED_OUT";
70 case VC_ERROR_RECORDER_BUSY: return "VC_ERROR_RECORDER_BUSY";
71 case VC_ERROR_INVALID_STATE: return "VC_ERROR_INVALID_STATE";
72 case VC_ERROR_INVALID_LANGUAGE: return "VC_ERROR_INVALID_LANGUAGE";
73 case VC_ERROR_ENGINE_NOT_FOUND: return "VC_ERROR_ENGINE_NOT_FOUND";
74 case VC_ERROR_OPERATION_FAILED: return "VC_ERROR_OPERATION_FAILED";
75 default: return "Invalid error code";
80 static void __vc_mgr_lang_changed_cb(const char* before_lang, const char* current_lang)
82 SLOG(LOG_DEBUG, TAG_VCM, "Lang changed : Before lang(%s) Current lang(%s)",
83 before_lang, current_lang);
85 vc_current_language_changed_cb callback = NULL;
87 vc_mgr_client_get_current_lang_changed_cb(g_vc_m, &callback, &lang_user_data);
89 if (NULL != callback) {
90 vc_mgr_client_use_callback(g_vc_m);
91 callback(before_lang, current_lang, lang_user_data);
92 vc_mgr_client_not_use_callback(g_vc_m);
93 SLOG(LOG_DEBUG, TAG_VCM, "Language changed callback is called");
95 SLOG(LOG_WARN, TAG_VCM, "[WARNING] Language changed callback is null");
101 static int __vc_mgr_get_feature_enabled()
103 if (0 == g_feature_enabled) {
104 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Voice control feature NOT supported");
105 return VC_ERROR_NOT_SUPPORTED;
106 } else if (-1 == g_feature_enabled) {
107 bool vc_supported = false;
108 bool mic_supported = false;
109 if (0 == system_info_get_platform_bool(VC_FEATURE_PATH, &vc_supported)) {
110 if (0 == system_info_get_platform_bool(VC_MIC_FEATURE_PATH, &mic_supported)) {
111 if (false == vc_supported || false == mic_supported) {
112 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Voice control feature NOT supported");
113 g_feature_enabled = 0;
114 return VC_ERROR_NOT_SUPPORTED;
117 g_feature_enabled = 1;
125 int vc_mgr_initialize()
127 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Initialize");
130 if (0 != __vc_mgr_get_feature_enabled()) {
131 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] not supported");
132 return VC_ERROR_NOT_SUPPORTED;
136 if (true == vc_mgr_client_is_valid(g_vc_m)) {
137 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Already initialized");
138 return VC_ERROR_NONE;
141 if (0 != vc_mgr_dbus_open_connection()) {
142 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to open connection");
143 return VC_ERROR_OPERATION_FAILED;
146 if (0 != vc_mgr_client_create(&g_vc_m)) {
147 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to create client!!!!!");
148 return VC_ERROR_OUT_OF_MEMORY;
151 int ret = vc_config_mgr_initialize(g_vc_m->handle + VC_MANAGER_CONFIG_HANDLE);
153 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to init config manager : %d", ret);
154 vc_mgr_client_destroy(g_vc_m);
155 return VC_ERROR_OPERATION_FAILED;
158 ret = vc_config_mgr_set_lang_cb(g_vc_m->handle + VC_MANAGER_CONFIG_HANDLE, __vc_mgr_lang_changed_cb);
160 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to set callback : %d", ret);
161 vc_config_mgr_finalize(g_vc_m->handle + VC_MANAGER_CONFIG_HANDLE);
162 vc_mgr_client_destroy(g_vc_m);
163 return VC_ERROR_OPERATION_FAILED;
166 ret = vc_db_initialize();
168 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to initialize DB : %d", ret);
169 vc_config_mgr_finalize(g_vc_m->handle + VC_MANAGER_CONFIG_HANDLE);
170 vc_mgr_client_destroy(g_vc_m);
174 SLOG(LOG_DEBUG, TAG_VCM, "[Success] pid(%d)", g_vc_m->handle);
176 SLOG(LOG_DEBUG, TAG_VCM, "=====");
177 SLOG(LOG_DEBUG, TAG_VCM, " ");
179 return VC_ERROR_NONE;
182 static void __vc_mgr_internal_unprepare()
184 int ret = vc_mgr_dbus_request_finalize(g_vc_m->handle);
186 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request finalize : %s", __vc_mgr_get_error_code(ret));
189 vc_mgr_client_set_internal_state(g_vc_m, VC_INTERNAL_STATE_NONE);
193 int vc_mgr_deinitialize()
195 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Deinitialize");
197 if (false == vc_mgr_client_is_valid(g_vc_m)) {
198 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] NOT initialized");
199 SLOG(LOG_DEBUG, TAG_VCM, "=====");
200 SLOG(LOG_DEBUG, TAG_VCM, " ");
201 return VC_ERROR_INVALID_STATE;
205 vc_mgr_client_get_client_state(g_vc_m, &state);
210 __vc_mgr_internal_unprepare();
211 /* no break. need to next step*/
212 case VC_STATE_INITIALIZED:
213 if (NULL != g_m_connect_timer) {
214 SLOG(LOG_DEBUG, TAG_VCM, "Connect Timer is deleted");
215 ecore_timer_del(g_m_connect_timer);
216 g_m_connect_timer = NULL;
219 vc_config_mgr_unset_lang_cb(g_vc_m->handle + VC_MANAGER_CONFIG_HANDLE);
220 vc_config_mgr_finalize(g_vc_m->handle + VC_MANAGER_CONFIG_HANDLE);
222 /* Free client resources */
223 vc_mgr_client_destroy(g_vc_m);
230 SLOG(LOG_DEBUG, TAG_VCM, "Success: destroy");
232 int cnt = VC_COMMAND_TYPE_FOREGROUND;
234 int ret = vc_cmd_parser_delete_file(getpid(), cnt);
236 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to delete file, type(%d), ret(%d)", cnt, ret);
237 } while (VC_COMMAND_TYPE_EXCLUSIVE >= ++cnt);
239 int ret = vc_db_finalize();
241 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to finalize DB, ret(%d)", ret);
244 if (0 != vc_mgr_dbus_close_connection()) {
245 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to close connection");
248 SLOG(LOG_DEBUG, TAG_VCM, "=====");
249 SLOG(LOG_DEBUG, TAG_VCM, " ");
251 return VC_ERROR_NONE;
254 static Eina_Bool __vc_mgr_connect_daemon(void *data)
256 /* request initialization */
258 int service_state = 0;
259 int foreground = VC_RUNTIME_INFO_NO_FOREGROUND;
261 g_m_connect_timer = NULL;
263 ret = vc_mgr_dbus_request_initialize(g_vc_m->handle, &service_state, &foreground, &g_daemon_pid);
265 if (VC_ERROR_ENGINE_NOT_FOUND == ret) {
266 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to initialize : %s", __vc_mgr_get_error_code(ret));
268 vc_mgr_client_set_error(g_vc_m, VC_ERROR_ENGINE_NOT_FOUND);
269 ecore_timer_add(0, __vc_mgr_notify_error, g_vc_m);
271 SLOG(LOG_DEBUG, TAG_VCM, "=====");
272 SLOG(LOG_DEBUG, TAG_VCM, " ");
275 } else if (0 != ret) {
276 SLOG(LOG_ERROR, TAG_VCM, "[WARNING] Fail to connection. Retry to connect : %s", __vc_mgr_get_error_code(ret));
279 /* Success to connect */
282 /* Set service state */
283 vc_mgr_client_set_service_state(g_vc_m, (vc_service_state_e)service_state);
286 vc_mgr_client_set_foreground(g_vc_m, foreground, true);
288 SLOG(LOG_DEBUG, TAG_VCM, "[SUCCESS] Connected daemon");
290 vc_mgr_client_set_client_state(g_vc_m, VC_STATE_READY);
292 vc_state_changed_cb changed_callback = NULL;
293 void* user_data = NULL;
295 vc_mgr_client_get_state_changed_cb(g_vc_m, &changed_callback, &user_data);
297 vc_state_e current_state;
298 vc_state_e before_state;
300 vc_mgr_client_get_before_state(g_vc_m, ¤t_state, &before_state);
302 if (NULL != changed_callback) {
303 vc_mgr_client_use_callback(g_vc_m);
304 changed_callback(before_state, current_state, user_data);
305 vc_mgr_client_not_use_callback(g_vc_m);
306 SLOG(LOG_DEBUG, TAG_VCM, "State changed callback is called");
308 SLOG(LOG_WARN, TAG_VCM, "[WARNING] State changed callback is null");
311 SLOG(LOG_DEBUG, TAG_VCM, "=====");
312 SLOG(LOG_DEBUG, TAG_VCM, " ");
317 static Eina_Bool __vc_mgr_prepare_daemon(void *data)
320 if (0 != vc_mgr_dbus_request_hello()) {
324 g_m_connect_timer = NULL;
325 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Connect daemon");
327 g_m_connect_timer = ecore_idler_add(__vc_mgr_connect_daemon, data);
334 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Prepare");
337 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
338 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
339 SLOG(LOG_DEBUG, TAG_VCM, "=====");
340 SLOG(LOG_DEBUG, TAG_VCM, " ");
341 return VC_ERROR_INVALID_STATE;
345 if (state != VC_STATE_INITIALIZED) {
346 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: Current state is not 'CREATED'");
347 SLOG(LOG_DEBUG, TAG_VCM, "=====");
348 SLOG(LOG_DEBUG, TAG_VCM, " ");
349 return VC_ERROR_INVALID_STATE;
352 g_m_connect_timer = ecore_timer_add(0, __vc_mgr_prepare_daemon, NULL);
354 SLOG(LOG_DEBUG, TAG_VCM, "=====");
355 SLOG(LOG_DEBUG, TAG_VCM, " ");
357 return VC_ERROR_NONE;
360 int vc_mgr_unprepare()
362 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Unprepare");
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_READY) {
374 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: Current state is not 'READY'");
375 SLOG(LOG_DEBUG, TAG_VCM, "=====");
376 SLOG(LOG_DEBUG, TAG_VCM, " ");
377 return VC_ERROR_INVALID_STATE;
380 __vc_mgr_internal_unprepare();
382 vc_mgr_client_set_client_state(g_vc_m, VC_STATE_INITIALIZED);
383 ecore_timer_add(0, __vc_mgr_notify_state_changed, g_vc_m);
385 SLOG(LOG_DEBUG, TAG_VCM, "=====");
386 SLOG(LOG_DEBUG, TAG_VCM, " ");
388 return VC_ERROR_NONE;
391 int vc_mgr_foreach_supported_languages(vc_supported_language_cb callback, void* user_data)
393 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Foreach Supported Language");
395 if (NULL == callback) {
396 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Input parameter is NULL");
397 SLOG(LOG_DEBUG, TAG_VCM, "=====");
398 SLOG(LOG_DEBUG, TAG_VCM, " ");
399 return VC_ERROR_INVALID_PARAMETER;
403 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
404 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
405 SLOG(LOG_DEBUG, TAG_VCM, "=====");
406 SLOG(LOG_DEBUG, TAG_VCM, " ");
407 return VC_ERROR_INVALID_STATE;
411 ret = vc_config_mgr_get_language_list(callback, user_data);
413 ret = vc_config_convert_error_code((vc_config_error_e)ret);
414 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get languages : %s", __vc_mgr_get_error_code(ret));
417 SLOG(LOG_DEBUG, TAG_VCM, "=====");
418 SLOG(LOG_DEBUG, TAG_VCM, " ");
420 return VC_ERROR_NONE;
423 int vc_mgr_get_current_language(char** language)
425 if (NULL == language) {
426 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Input parameter is NULL");
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 return VC_ERROR_INVALID_STATE;
437 ret = vc_config_mgr_get_default_language(language);
439 ret = vc_config_convert_error_code((vc_config_error_e)ret);
440 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get current languages : %s", __vc_mgr_get_error_code(ret));
442 SLOG(LOG_DEBUG, TAG_VCM, "[Get current language] language : %s", *language);
448 int vc_mgr_get_state(vc_state_e* state)
450 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Get State");
453 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Input parameter is NULL");
454 return VC_ERROR_INVALID_PARAMETER;
458 if (0 != vc_mgr_client_get_client_state(g_vc_m, &temp)) {
459 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
460 SLOG(LOG_DEBUG, TAG_VCM, "=====");
461 SLOG(LOG_DEBUG, TAG_VCM, " ");
462 return VC_ERROR_INVALID_STATE;
468 case VC_STATE_NONE: SLOG(LOG_DEBUG, TAG_VCM, "Current state is 'None'"); break;
469 case VC_STATE_INITIALIZED: SLOG(LOG_DEBUG, TAG_VCM, "Current state is 'Created'"); break;
470 case VC_STATE_READY: SLOG(LOG_DEBUG, TAG_VCM, "Current state is 'Ready'"); break;
471 default: SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid state");
474 SLOG(LOG_DEBUG, TAG_VCM, "=====");
475 SLOG(LOG_DEBUG, TAG_VCM, " ");
477 return VC_ERROR_NONE;
480 int vc_mgr_get_service_state(vc_service_state_e* state)
482 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Get Service State");
485 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Input parameter is NULL");
486 return VC_ERROR_INVALID_PARAMETER;
489 vc_state_e client_state;
490 if (0 != vc_mgr_client_get_client_state(g_vc_m, &client_state)) {
491 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
492 return VC_ERROR_INVALID_STATE;
496 if (client_state != VC_STATE_READY) {
497 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Current state is not 'READY'");
498 return VC_ERROR_INVALID_STATE;
501 /* get service state */
502 vc_service_state_e service_state;
503 if (0 != vc_mgr_client_get_service_state(g_vc_m, &service_state)) {
504 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get service state");
505 return VC_ERROR_OPERATION_FAILED;
508 *state = service_state;
511 case VC_SERVICE_STATE_NONE: SLOG(LOG_DEBUG, TAG_VCM, "Current service state is 'None'"); break;
512 case VC_SERVICE_STATE_READY: SLOG(LOG_DEBUG, TAG_VCM, "Current service state is 'Ready'"); break;
513 case VC_SERVICE_STATE_RECORDING: SLOG(LOG_DEBUG, TAG_VCM, "Current service state is 'Recording'"); break;
514 case VC_SERVICE_STATE_PROCESSING: SLOG(LOG_DEBUG, TAG_VCM, "Current service state is 'Processing'"); break;
515 default: SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid state");
518 SLOG(LOG_DEBUG, TAG_VCM, "=====");
519 SLOG(LOG_DEBUG, TAG_VCM, " ");
521 return VC_ERROR_NONE;
524 int vc_mgr_set_demandable_client_rule(const char* rule)
526 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Set Demandable client rule");
529 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
530 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
531 SLOG(LOG_DEBUG, TAG_VCM, "=====");
532 SLOG(LOG_DEBUG, TAG_VCM, " ");
533 return VC_ERROR_INVALID_STATE;
537 if (state != VC_STATE_READY) {
538 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: Current state is not 'READY'");
539 SLOG(LOG_DEBUG, TAG_VCM, "=====");
540 SLOG(LOG_DEBUG, TAG_VCM, " ");
541 return VC_ERROR_INVALID_STATE;
545 ret = vc_info_parser_set_demandable_client(rule);
547 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] rule is NOT valid");
548 SLOG(LOG_DEBUG, TAG_VCM, "=====");
549 SLOG(LOG_DEBUG, TAG_VCM, " ");
550 return VC_ERROR_INVALID_PARAMETER;
553 if (0 != vc_info_parser_get_demandable_clients(&g_demandable_client_list)) {
554 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get demandable clients");
555 return VC_ERROR_OPERATION_FAILED;
558 SLOG(LOG_DEBUG, TAG_VCM, "=====");
559 SLOG(LOG_DEBUG, TAG_VCM, " ");
567 ret = vc_mgr_dbus_request_demandable_client(g_vc_m->handle);
569 if (VC_ERROR_TIMED_OUT != ret) {
570 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request set client rule to daemon : %s", __vc_mgr_get_error_code(ret));
573 SLOG(LOG_WARN, TAG_VCM, "[WARNING] retry request set client rule : %s", __vc_mgr_get_error_code(ret));
576 if (VC_RETRY_COUNT == count) {
577 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request");
584 SLOG(LOG_DEBUG, TAG_VCM, "=====");
585 SLOG(LOG_DEBUG, TAG_VCM, " ");
591 int vc_mgr_unset_demandable_client_rule()
593 vc_info_parser_set_demandable_client(NULL);
598 ret = vc_mgr_dbus_request_demandable_client(g_vc_m->handle);
600 if (VC_ERROR_TIMED_OUT != ret) {
601 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request unset client rule to daemon : %s", __vc_mgr_get_error_code(ret));
604 SLOG(LOG_WARN, TAG_VCM, "[WARNING] retry request unset client rule : %s", __vc_mgr_get_error_code(ret));
607 if (VC_RETRY_COUNT == count) {
608 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request");
618 int vc_mgr_is_command_format_supported(vc_cmd_format_e format, bool* support)
620 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Is command type supported");
623 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
624 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
625 SLOG(LOG_DEBUG, TAG_VCM, "=====");
626 SLOG(LOG_DEBUG, TAG_VCM, " ");
627 return VC_ERROR_INVALID_STATE;
631 bool non_fixed_support = false;
632 if (0 != vc_config_mgr_get_nonfixed_support(&non_fixed_support)) {
633 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get nonfixed support info");
637 case VC_CMD_FORMAT_FIXED: *support = true; break;
638 case VC_CMD_FORMAT_FIXED_AND_VFIXED: *support = true; break;
639 case VC_CMD_FORMAT_VFIXED_AND_FIXED: *support = true; break;
640 case VC_CMD_FORMAT_FIXED_AND_NONFIXED: *support = non_fixed_support; break;
641 case VC_CMD_FORMAT_NONFIXED_AND_FIXED: *support = non_fixed_support; break;
642 default: *support = false; break;
645 SLOG(LOG_ERROR, TAG_VCM, "[DEBUG] Format(%d) support(%s)", format, *support ? "true" : "false");
647 SLOG(LOG_DEBUG, TAG_VCM, "=====");
648 SLOG(LOG_DEBUG, TAG_VCM, " ");
650 return VC_ERROR_NONE;
653 int vc_mgr_enable_command_type(int cmd_type)
655 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Enable Command Type");
658 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
659 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
660 SLOG(LOG_DEBUG, TAG_VCM, "=====");
661 SLOG(LOG_DEBUG, TAG_VCM, " ");
662 return VC_ERROR_INVALID_STATE;
666 if (state != VC_STATE_READY) {
667 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: Current state is not 'READY'");
668 SLOG(LOG_DEBUG, TAG_VCM, "=====");
669 SLOG(LOG_DEBUG, TAG_VCM, " ");
670 return VC_ERROR_INVALID_STATE;
673 /* Check service state */
674 vc_service_state_e service_state = -1;
675 vc_mgr_client_get_service_state(g_vc_m, &service_state);
676 if (service_state != VC_SERVICE_STATE_READY) {
677 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: service state is not 'READY'");
678 SLOG(LOG_DEBUG, TAG_VCM, "=====");
679 SLOG(LOG_DEBUG, TAG_VCM, " ");
680 return VC_ERROR_INVALID_STATE;
686 ret = vc_mgr_dbus_request_enable_command_type(g_vc_m->handle, cmd_type);
688 if (VC_ERROR_TIMED_OUT != ret) {
689 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request enable command type : %s", __vc_mgr_get_error_code(ret));
692 SLOG(LOG_WARN, TAG_VCM, "[WARNING] retry request enable command type : %s", __vc_mgr_get_error_code(ret));
695 if (VC_RETRY_COUNT == count) {
696 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request");
703 SLOG(LOG_DEBUG, TAG_VCM, "=====");
704 SLOG(LOG_DEBUG, TAG_VCM, " ");
709 int vc_mgr_disable_command_type(int cmd_type)
711 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Disable Command Type");
714 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
715 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
716 SLOG(LOG_DEBUG, TAG_VCM, "=====");
717 SLOG(LOG_DEBUG, TAG_VCM, " ");
718 return VC_ERROR_INVALID_STATE;
722 if (state != VC_STATE_READY) {
723 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: Current state is not 'READY'");
724 SLOG(LOG_DEBUG, TAG_VCM, "=====");
725 SLOG(LOG_DEBUG, TAG_VCM, " ");
726 return VC_ERROR_INVALID_STATE;
729 /* Check service state */
730 vc_service_state_e service_state = -1;
731 vc_mgr_client_get_service_state(g_vc_m, &service_state);
732 if (service_state != VC_SERVICE_STATE_READY) {
733 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: service state is not 'READY'");
734 SLOG(LOG_DEBUG, TAG_VCM, "=====");
735 SLOG(LOG_DEBUG, TAG_VCM, " ");
736 return VC_ERROR_INVALID_STATE;
742 ret = vc_mgr_dbus_request_disable_command_type(g_vc_m->handle, cmd_type);
744 if (VC_ERROR_TIMED_OUT != ret) {
745 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request disable command type : %s", __vc_mgr_get_error_code(ret));
748 SLOG(LOG_WARN, TAG_VCM, "[WARNING] retry request disable command type : %s", __vc_mgr_get_error_code(ret));
751 if (VC_RETRY_COUNT == count) {
752 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request");
759 SLOG(LOG_DEBUG, TAG_VCM, "=====");
760 SLOG(LOG_DEBUG, TAG_VCM, " ");
765 int vc_mgr_set_command_list(vc_cmd_list_h vc_cmd_list)
767 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Set Command list");
770 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
771 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
772 SLOG(LOG_DEBUG, TAG_VCM, "=====");
773 SLOG(LOG_DEBUG, TAG_VCM, " ");
774 return VC_ERROR_INVALID_STATE;
778 if (state != VC_STATE_READY) {
779 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: Current state is not 'READY'");
780 SLOG(LOG_DEBUG, TAG_VCM, "=====");
781 SLOG(LOG_DEBUG, TAG_VCM, " ");
782 return VC_ERROR_INVALID_STATE;
785 /* Check service state */
786 vc_service_state_e service_state = -1;
787 vc_mgr_client_get_service_state(g_vc_m, &service_state);
788 if (service_state != VC_SERVICE_STATE_READY) {
789 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: service state is not 'READY'");
790 SLOG(LOG_DEBUG, TAG_VCM, "=====");
791 SLOG(LOG_DEBUG, TAG_VCM, " ");
792 return VC_ERROR_INVALID_STATE;
795 if (NULL == vc_cmd_list) {
796 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Input parameter is NULL");
797 return VC_ERROR_INVALID_PARAMETER;
800 vc_cmd_list_s* list = NULL;
801 list = (vc_cmd_list_s*)vc_cmd_list;
802 SLOG(LOG_INFO, TAG_VCM, "[List] (%p) (%p)", list, list->list);
804 if (NULL == list->list) {
805 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid command list");
806 return VC_ERROR_INVALID_PARAMETER;
811 bool success_save = false;
812 for (i = VC_COMMAND_TYPE_FOREGROUND; i <= VC_COMMAND_TYPE_EXCLUSIVE; i++) {
813 ret = vc_cmd_parser_delete_file(getpid(), i);
815 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to delete file, type(%d), ret(%d)", i, ret);
817 ret = vc_cmd_parser_save_file(getpid(), i, list->list, NULL);
819 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to save file, type(%d), ret(%d)", i, ret);
821 SLOG(LOG_DEBUG, TAG_VCM, "[SUCCESS] Save file, type(%d)", i);
826 if (true != success_save) {
827 ret = VC_ERROR_INVALID_PARAMETER;
828 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to save command group : %s", __vc_mgr_get_error_code(ret));
832 ret = vc_mgr_dbus_request_set_command(g_vc_m->handle);
834 if (VC_ERROR_TIMED_OUT != ret) {
835 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request set command to daemon : %s", __vc_mgr_get_error_code(ret));
838 SLOG(LOG_WARN, TAG_VCM, "[WARNING] retry request set command : %s", __vc_mgr_get_error_code(ret));
841 if (VC_RETRY_COUNT == count) {
842 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request");
850 SLOG(LOG_DEBUG, TAG_VCM, "=====");
851 SLOG(LOG_DEBUG, TAG_VCM, " ");
856 int vc_mgr_unset_command_list()
858 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Unset Command list");
861 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
862 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
863 return VC_ERROR_INVALID_STATE;
867 if (state != VC_STATE_READY) {
868 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Current state is not 'READY'");
869 return VC_ERROR_INVALID_STATE;
875 ret = vc_mgr_dbus_request_unset_command(g_vc_m->handle);
877 if (VC_ERROR_TIMED_OUT != ret) {
878 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request unset command to daemon : %s", __vc_mgr_get_error_code(ret));
881 SLOG(LOG_WARN, TAG_VCM, "[WARNING] retry request unset command : %s", __vc_mgr_get_error_code(ret));
884 if (VC_RETRY_COUNT == count) {
885 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request");
893 for (i = VC_COMMAND_TYPE_FOREGROUND; i <= VC_COMMAND_TYPE_EXCLUSIVE; i++) {
894 ret = vc_cmd_parser_delete_file(getpid(), i);
896 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to delete file, type(%d), ret(%d)", i, ret);
899 SLOG(LOG_DEBUG, TAG_VCM, "=====");
900 SLOG(LOG_DEBUG, TAG_VCM, " ");
905 int vc_mgr_set_command_list_from_file(const char* file_path, int type)
907 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Set Command list from file");
909 if (NULL == file_path) {
910 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid parameter!!");
911 return VC_ERROR_INVALID_PARAMETER;
913 SLOG(LOG_DEBUG, TAG_VCM, "===== File path: %s", file_path);
917 if (VC_COMMAND_TYPE_FOREGROUND > type || VC_COMMAND_TYPE_EXCLUSIVE < type) {
918 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid command type: input type is %d", type);
919 SLOG(LOG_DEBUG, TAG_VCC, "=====");
920 SLOG(LOG_DEBUG, TAG_VCC, " ");
921 return VC_ERROR_INVALID_PARAMETER;
925 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
926 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
927 return VC_ERROR_INVALID_STATE;
931 if (state != VC_STATE_READY) {
932 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: Current state is not 'READY'");
933 return VC_ERROR_INVALID_STATE;
936 /* Check service state */
937 vc_service_state_e service_state = -1;
938 vc_mgr_client_get_service_state(g_vc_m, &service_state);
939 if (service_state != VC_SERVICE_STATE_READY) {
940 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: service state is not 'READY'");
941 return VC_ERROR_INVALID_STATE;
944 int ret = vc_cmd_parser_delete_file(getpid(), type);
946 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to delete file, type(4), ret(%d)", ret);
948 if (0 != vc_json_set_commands_from_file(file_path, type, NULL)) {
949 ret = VC_ERROR_INVALID_PARAMETER;
950 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to save command list (%d)", ret);
954 ret = vc_mgr_dbus_request_set_command(g_vc_m->handle);
956 if (VC_ERROR_TIMED_OUT != ret) {
957 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request set command to daemon : %s", __vc_mgr_get_error_code(ret));
960 SLOG(LOG_WARN, TAG_VCM, "[WARNING] retry request set command : %s", __vc_mgr_get_error_code(ret));
963 if (VC_RETRY_COUNT == count) {
964 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request");
972 SLOG(LOG_DEBUG, TAG_VCM, "=====");
973 SLOG(LOG_DEBUG, TAG_VCM, " ");
978 int vc_mgr_set_preloaded_commands_from_file(const char* file_path)
980 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Set preloaded command list");
983 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
984 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
985 return VC_ERROR_INVALID_STATE;
989 if (state != VC_STATE_READY) {
990 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: Current state is not 'READY'");
991 return VC_ERROR_INVALID_STATE;
994 /* Check service state */
995 vc_service_state_e service_state = -1;
996 vc_mgr_client_get_service_state(g_vc_m, &service_state);
997 if (service_state != VC_SERVICE_STATE_READY) {
998 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: service state is not 'READY'");
999 return VC_ERROR_INVALID_STATE;
1002 /* Only support to set background commands for preloaded application */
1003 int ret = vc_json_set_commands_from_file(file_path, VC_COMMAND_TYPE_BACKGROUND, NULL);
1005 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to insert preloaded commands into db");
1007 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1008 SLOG(LOG_DEBUG, TAG_VCM, " ");
1012 int vc_mgr_set_audio_type(const char* audio_id)
1014 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Set audio type");
1016 if (NULL == audio_id) {
1017 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Input parameter is NULL");
1018 return VC_ERROR_INVALID_PARAMETER;
1022 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
1023 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1024 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1025 SLOG(LOG_DEBUG, TAG_VCM, " ");
1026 return VC_ERROR_INVALID_STATE;
1030 if (state != VC_STATE_READY) {
1031 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: Current state is not 'READY'");
1032 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1033 SLOG(LOG_DEBUG, TAG_VCM, " ");
1034 return VC_ERROR_INVALID_STATE;
1037 /* Check service state */
1038 vc_service_state_e service_state = -1;
1039 vc_mgr_client_get_service_state(g_vc_m, &service_state);
1040 if (service_state != VC_SERVICE_STATE_READY) {
1041 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: service state is not 'READY'");
1042 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1043 SLOG(LOG_DEBUG, TAG_VCM, " ");
1044 return VC_ERROR_INVALID_STATE;
1054 ret = vc_mgr_dbus_request_set_audio_type(g_vc_m->handle, audio_id);
1056 if (VC_ERROR_TIMED_OUT != ret) {
1057 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to set audio type : %s", __vc_mgr_get_error_code(ret));
1060 SLOG(LOG_WARN, TAG_VCM, "[WARNING] retry to set audio type : %s", __vc_mgr_get_error_code(ret));
1063 if (VC_RETRY_COUNT == count) {
1064 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request");
1069 SLOG(LOG_DEBUG, TAG_VCM, "[SUCCESS] Set audio type");
1071 vc_mgr_client_set_audio_type(g_vc_m, audio_id);
1075 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1076 SLOG(LOG_DEBUG, TAG_VCM, " ");
1081 int vc_mgr_get_audio_type(char** audio_id)
1083 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Get audio type");
1085 if (NULL == audio_id) {
1086 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Input parameter is NULL");
1087 return VC_ERROR_INVALID_PARAMETER;
1091 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
1092 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1093 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1094 SLOG(LOG_DEBUG, TAG_VCM, " ");
1095 return VC_ERROR_INVALID_STATE;
1099 if (state != VC_STATE_READY) {
1100 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: Current state is not 'READY'");
1101 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1102 SLOG(LOG_DEBUG, TAG_VCM, " ");
1103 return VC_ERROR_INVALID_STATE;
1106 /* Check service state */
1107 vc_service_state_e service_state = -1;
1108 vc_mgr_client_get_service_state(g_vc_m, &service_state);
1109 if (service_state != VC_SERVICE_STATE_READY) {
1110 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: service state is not 'READY'");
1111 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1112 SLOG(LOG_DEBUG, TAG_VCM, " ");
1113 return VC_ERROR_INVALID_STATE;
1118 vc_mgr_client_get_audio_type(g_vc_m, &temp);
1121 /* Not initiallized */
1125 ret = vc_mgr_dbus_request_get_audio_type(g_vc_m->handle, &temp);
1127 if (VC_ERROR_TIMED_OUT != ret) {
1128 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get audio type : %s", __vc_mgr_get_error_code(ret));
1131 SLOG(LOG_WARN, TAG_VCM, "[WARNING] retry to get audio type : %s", __vc_mgr_get_error_code(ret));
1134 if (VC_RETRY_COUNT == count) {
1135 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request");
1140 SLOG(LOG_DEBUG, TAG_VCM, "[SUCCESS] Get audio type : %s", temp);
1142 vc_mgr_client_set_audio_type(g_vc_m, temp);
1148 *audio_id = strdup(temp);
1156 int vc_mgr_get_current_commands(vc_cmd_list_h* vc_cmd_list)
1158 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Foreach current commands");
1161 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
1162 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1163 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1164 SLOG(LOG_DEBUG, TAG_VCM, " ");
1165 return VC_ERROR_INVALID_STATE;
1169 if (state != VC_STATE_READY) {
1170 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: Current state is not 'READY'");
1171 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1172 SLOG(LOG_DEBUG, TAG_VCM, " ");
1173 return VC_ERROR_INVALID_STATE;
1176 /* Check service state */
1177 vc_service_state_e service_state = -1;
1178 vc_mgr_client_get_service_state(g_vc_m, &service_state);
1179 if (service_state != VC_SERVICE_STATE_READY) {
1180 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: service state is not 'READY'");
1181 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1182 SLOG(LOG_DEBUG, TAG_VCM, " ");
1183 return VC_ERROR_INVALID_STATE;
1186 if (NULL == vc_cmd_list) {
1187 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid Parameter");
1188 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1189 SLOG(LOG_DEBUG, TAG_VCM, " ");
1190 return VC_ERROR_INVALID_PARAMETER;
1193 vc_cmd_list_h temp_list = NULL;
1194 if (0 != vc_cmd_list_create(&temp_list)) {
1195 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to create list");
1196 return VC_ERROR_INVALID_PARAMETER;
1199 *vc_cmd_list = temp_list;
1206 /* Get foreground pid */
1207 if (0 != vc_mgr_client_get_foreground(g_vc_m, &fg_pid)) {
1208 /* There is no foreground app for voice control */
1209 SLOG(LOG_WARN, TAG_VCM, "[Manager WARNING] No foreground pid for voice control");
1211 SLOG(LOG_DEBUG, TAG_VCM, "[Manager] Foreground pid(%d)", fg_pid);
1214 if (0 != vc_mgr_client_get_pid(g_vc_m, &mgr_pid)) {
1215 SLOG(LOG_DEBUG, TAG_VCM, "[Manager] Fail to get manager pid");
1216 return VC_ERROR_OPERATION_FAILED;
1218 SLOG(LOG_DEBUG, TAG_VCM, "[Manager] Manager pid(%d)", mgr_pid);
1221 /* Get system command */
1222 ret = vc_cmd_parser_append_commands(mgr_pid, VC_COMMAND_TYPE_SYSTEM, temp_list);
1224 SLOG(LOG_DEBUG, TAG_VCM, "[Manager] No system commands");
1231 ret = vc_mgr_dbus_request_set_client_info(g_vc_m->handle);
1233 if (VC_ERROR_TIMED_OUT != ret) {
1234 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to set client info : %s", __vc_mgr_get_error_code(ret));
1237 SLOG(LOG_WARN, TAG_VCM, "[WARNING] retry to set client info : %s", __vc_mgr_get_error_code(ret));
1240 if (VC_RETRY_COUNT == count) {
1241 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request");
1246 SLOG(LOG_DEBUG, TAG_VCM, "[SUCCESS] Set client info");
1250 GSList *iter = NULL;
1251 GSList* client_info_list = NULL;
1252 vc_client_info_s *client_info = NULL;
1253 bool is_fgpid = false;
1255 if (0 != vc_info_parser_get_client_info(&client_info_list)) {
1256 SLOG(LOG_DEBUG, TAG_VCM, "[DEBUG] No client");
1260 if (VC_NO_FOREGROUND_PID != fg_pid) {
1261 iter = g_slist_nth(client_info_list, 0);
1262 while (NULL != iter) {
1263 client_info = iter->data;
1264 if (NULL != client_info) {
1265 if (fg_pid == client_info->pid) {
1270 iter = g_slist_next(iter);
1274 /* Get foreground commands and widget */
1275 if (true == is_fgpid) {
1277 SLOG(LOG_DEBUG, TAG_VCM, "[Manager] fore cmd(%d)", client_info->fg_cmd);
1279 /* Get foreground command */
1280 if (true == client_info->fg_cmd) {
1281 ret = vc_cmd_parser_append_commands(fg_pid, VC_COMMAND_TYPE_FOREGROUND, temp_list);
1283 SLOG(LOG_ERROR, TAG_VCM, "[Client Data ERROR] Fail to get the fg command list");
1286 SLOG(LOG_DEBUG, TAG_VCM, "[Manager] No foreground commands");
1289 /* Check exclusive option */
1290 if (true == client_info->exclusive_cmd) {
1291 SLOG(LOG_DEBUG, TAG_VCM, "[Manager] Exclusive command is ON");
1293 /* Set background command for exclusive option */
1294 if (true == client_info->bg_cmd) {
1295 SLOG(LOG_DEBUG, TAG_VCM, "[Manager] Set background command");
1296 ret = vc_cmd_parser_append_commands(client_info->pid, VC_COMMAND_TYPE_BACKGROUND, temp_list);
1298 SLOG(LOG_ERROR, TAG_VCM, "[Client Data ERROR] Fail to get the bg command list : pid(%d)", client_info->pid);
1302 /* need to release client info */
1303 iter = g_slist_nth(client_info_list, 0);
1305 while (NULL != iter) {
1306 client_info = iter->data;
1307 if (NULL != client_info) {
1310 client_info_list = g_slist_remove_link(client_info_list, iter);
1311 iter = g_slist_nth(client_info_list, 0);
1314 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1315 SLOG(LOG_DEBUG, TAG_VCM, " ");
1320 SLOG(LOG_DEBUG, TAG_VCM, "[Manager] No foreground app");
1323 /* Get background commands */
1324 if (0 < g_slist_length(client_info_list)) {
1325 iter = g_slist_nth(client_info_list, 0);
1327 while (NULL != iter) {
1328 client_info = iter->data;
1330 if (NULL != client_info) {
1331 SLOG(LOG_DEBUG, TAG_VCM, "[Manager] Pid(%d) Back cmd(%d)", client_info->pid, client_info->bg_cmd);
1332 if (true == client_info->bg_cmd) {
1333 ret = vc_cmd_parser_append_commands(client_info->pid, VC_COMMAND_TYPE_BACKGROUND, temp_list);
1335 SLOG(LOG_ERROR, TAG_VCM, "[Client Data ERROR] Fail to get the bg command list : pid(%d)", client_info->pid);
1340 client_info_list = g_slist_remove_link(client_info_list, iter);
1342 iter = g_slist_nth(client_info_list, 0);
1346 SLOG(LOG_DEBUG, TAG_VCM, "[Manager] No background commands");
1349 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1350 SLOG(LOG_DEBUG, TAG_VCM, " ");
1355 int vc_mgr_set_recognition_mode(vc_recognition_mode_e mode)
1357 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Set recognition mode = %d", mode);
1360 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
1361 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1362 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1363 SLOG(LOG_DEBUG, TAG_VCM, " ");
1364 return VC_ERROR_INVALID_STATE;
1368 if (state != VC_STATE_READY) {
1369 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: Current state is not 'READY'");
1370 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1371 SLOG(LOG_DEBUG, TAG_VCM, " ");
1372 return VC_ERROR_INVALID_STATE;
1375 /* Check service state */
1376 vc_service_state_e service_state = -1;
1377 vc_mgr_client_get_service_state(g_vc_m, &service_state);
1378 if (service_state != VC_SERVICE_STATE_READY) {
1379 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: service state is not 'READY'");
1380 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1381 SLOG(LOG_DEBUG, TAG_VCM, " ");
1382 return VC_ERROR_INVALID_STATE;
1385 vc_mgr_client_set_recognition_mode(g_vc_m, mode);
1389 int vc_mgr_get_recognition_mode(vc_recognition_mode_e* mode)
1393 ret = vc_mgr_client_get_recognition_mode(g_vc_m, mode);
1395 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get recognition mode");
1399 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Get recognition mode = %d", *mode);
1403 int vc_mgr_set_private_data(const char* key, const char* data)
1405 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Set private data");
1408 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid parameter");
1409 return VC_ERROR_INVALID_PARAMETER;
1413 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
1414 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1415 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1416 SLOG(LOG_DEBUG, TAG_VCM, " ");
1417 return VC_ERROR_INVALID_STATE;
1421 if (state != VC_STATE_READY) {
1422 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: Current state is not 'READY'");
1423 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1424 SLOG(LOG_DEBUG, TAG_VCM, " ");
1425 return VC_ERROR_INVALID_STATE;
1428 /* Check service state */
1429 vc_service_state_e service_state = -1;
1430 vc_mgr_client_get_service_state(g_vc_m, &service_state);
1431 if (service_state != VC_SERVICE_STATE_READY) {
1432 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: service state is not 'READY'");
1433 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1434 SLOG(LOG_DEBUG, TAG_VCM, " ");
1435 return VC_ERROR_INVALID_STATE;
1441 ret = vc_mgr_dbus_request_set_private_data(g_vc_m->handle, key, data);
1443 if (VC_ERROR_TIMED_OUT != ret) {
1444 SLOG(LOG_DEBUG, TAG_VCM, "[ERROR] Fail to set private data request : %s", __vc_mgr_get_error_code(ret));
1447 SLOG(LOG_WARN, TAG_VCM, "[WARNING] retry set private data request : %s", __vc_mgr_get_error_code(ret));
1450 if (VC_RETRY_COUNT == count) {
1451 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request");
1456 SLOG(LOG_DEBUG, TAG_VCM, "[SUCCESS] Set domain");
1459 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1460 SLOG(LOG_DEBUG, TAG_VCM, " ");
1465 int vc_mgr_get_private_data(const char* key, char** data)
1467 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Get private data");
1469 if (NULL == key || NULL == data) {
1470 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid parameter");
1471 return VC_ERROR_INVALID_PARAMETER;
1475 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
1476 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1477 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1478 SLOG(LOG_DEBUG, TAG_VCM, " ");
1479 return VC_ERROR_INVALID_STATE;
1483 if (state != VC_STATE_READY) {
1484 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: Current state is not 'READY'");
1485 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1486 SLOG(LOG_DEBUG, TAG_VCM, " ");
1487 return VC_ERROR_INVALID_STATE;
1490 /* Check service state */
1491 vc_service_state_e service_state = -1;
1492 vc_mgr_client_get_service_state(g_vc_m, &service_state);
1493 if (service_state != VC_SERVICE_STATE_READY) {
1494 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: service state is not 'READY'");
1495 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1496 SLOG(LOG_DEBUG, TAG_VCM, " ");
1497 return VC_ERROR_INVALID_STATE;
1505 ret = vc_mgr_dbus_request_get_private_data(g_vc_m->handle, key, &temp);
1507 if (VC_ERROR_TIMED_OUT != ret) {
1508 SLOG(LOG_DEBUG, TAG_VCM, "[ERROR] Fail to get private data request : %s", __vc_mgr_get_error_code(ret));
1511 SLOG(LOG_WARN, TAG_VCM, "[WARNING] retry get private data request : %s", __vc_mgr_get_error_code(ret));
1514 if (VC_RETRY_COUNT == count) {
1515 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request");
1520 SLOG(LOG_DEBUG, TAG_VCM, "[SUCCESS] Get private data, key(%s), data(%s)", key, temp);
1525 *data = strdup(temp);
1530 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1531 SLOG(LOG_DEBUG, TAG_VCM, " ");
1536 int vc_mgr_set_domain(const char* domain)
1538 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Set domain");
1540 if (NULL == domain) {
1541 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid parameter");
1542 return VC_ERROR_INVALID_PARAMETER;
1546 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
1547 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1548 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1549 SLOG(LOG_DEBUG, TAG_VCM, " ");
1550 return VC_ERROR_INVALID_STATE;
1554 if (state != VC_STATE_READY) {
1555 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: Current state is not 'READY'");
1556 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1557 SLOG(LOG_DEBUG, TAG_VCM, " ");
1558 return VC_ERROR_INVALID_STATE;
1561 /* Check service state */
1562 vc_service_state_e service_state = -1;
1563 vc_mgr_client_get_service_state(g_vc_m, &service_state);
1564 if (service_state != VC_SERVICE_STATE_READY) {
1565 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: service state is not 'READY'");
1566 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1567 SLOG(LOG_DEBUG, TAG_VCM, " ");
1568 return VC_ERROR_INVALID_STATE;
1574 ret = vc_mgr_dbus_request_set_domain(g_vc_m->handle, domain);
1576 if (VC_ERROR_TIMED_OUT != ret) {
1577 SLOG(LOG_DEBUG, TAG_VCM, "[ERROR] Fail to set domain request : %s", __vc_mgr_get_error_code(ret));
1580 SLOG(LOG_WARN, TAG_VCM, "[WARNING] retry set domain request : %s", __vc_mgr_get_error_code(ret));
1583 if (VC_RETRY_COUNT == count) {
1584 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request");
1589 SLOG(LOG_DEBUG, TAG_VCM, "[SUCCESS] Set domain");
1592 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1593 SLOG(LOG_DEBUG, TAG_VCM, " ");
1598 int vc_mgr_do_action(vc_send_event_type_e type, char* send_event)
1600 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] do action");
1602 if (NULL == send_event) {
1603 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid parameter");
1604 return VC_ERROR_INVALID_PARAMETER;
1608 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
1609 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1610 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1611 SLOG(LOG_DEBUG, TAG_VCM, " ");
1612 return VC_ERROR_INVALID_STATE;
1616 if (state != VC_STATE_READY) {
1617 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: Current state is not 'READY'");
1618 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1619 SLOG(LOG_DEBUG, TAG_VCM, " ");
1620 return VC_ERROR_INVALID_STATE;
1623 /* Check service state */
1624 vc_service_state_e service_state = -1;
1625 vc_mgr_client_get_service_state(g_vc_m, &service_state);
1626 if (service_state != VC_SERVICE_STATE_READY) {
1627 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: service state is not 'READY'");
1628 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1629 SLOG(LOG_DEBUG, TAG_VCM, " ");
1630 return VC_ERROR_INVALID_STATE;
1636 ret = vc_mgr_dbus_request_do_action(g_vc_m->handle, type, send_event);
1638 if (VC_ERROR_TIMED_OUT != ret) {
1639 SLOG(LOG_DEBUG, TAG_VCM, "[ERROR] Fail to do action request : %s", __vc_mgr_get_error_code(ret));
1642 SLOG(LOG_WARN, TAG_VCM, "[WARNING] retry do action request : %s", __vc_mgr_get_error_code(ret));
1645 if (VC_RETRY_COUNT == count) {
1646 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request");
1651 SLOG(LOG_DEBUG, TAG_VCM, "[SUCCESS] do action");
1654 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1655 SLOG(LOG_DEBUG, TAG_VCM, " ");
1660 int vc_mgr_start(bool exclusive_command_option)
1662 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Request start");
1665 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
1666 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1667 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1668 SLOG(LOG_DEBUG, TAG_VCM, " ");
1669 return VC_ERROR_INVALID_STATE;
1673 if (state != VC_STATE_READY) {
1674 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: Current state is not 'READY'");
1675 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1676 SLOG(LOG_DEBUG, TAG_VCM, " ");
1677 return VC_ERROR_INVALID_STATE;
1680 /* Check service state */
1681 vc_service_state_e service_state = -1;
1682 vc_mgr_client_get_service_state(g_vc_m, &service_state);
1683 if (service_state != VC_SERVICE_STATE_READY) {
1684 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: service state is not 'READY'");
1685 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1686 SLOG(LOG_DEBUG, TAG_VCM, " ");
1687 return VC_ERROR_INVALID_STATE;
1690 /* Check internal state for async */
1691 vc_internal_state_e internal_state = -1;
1692 vc_mgr_client_get_internal_state(g_vc_m, &internal_state);
1693 if (internal_state != VC_INTERNAL_STATE_NONE) {
1694 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invaid State : Internal state is NOT none : %d", internal_state);
1695 return VC_ERROR_IN_PROGRESS_TO_RECORDING;
1698 vc_mgr_client_set_exclusive_command(g_vc_m, exclusive_command_option);
1700 bool start_by_client = false;
1701 if (0 != vc_mgr_client_get_start_by_client(g_vc_m, &start_by_client)) {
1702 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get start by client");
1707 vc_recognition_mode_e recognition_mode = VC_RECOGNITION_MODE_STOP_BY_SILENCE;
1708 if (0 != vc_mgr_get_recognition_mode(&recognition_mode)) {
1709 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get recognition mode");
1716 ret = vc_mgr_dbus_request_start(g_vc_m->handle, (int)recognition_mode, exclusive_command_option, start_by_client);
1718 if (VC_ERROR_TIMED_OUT != ret) {
1719 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to start request start : %s", __vc_mgr_get_error_code(ret));
1722 SLOG(LOG_WARN, TAG_VCM, "[WARNING] retry start request start : %s", __vc_mgr_get_error_code(ret));
1725 if (VC_RETRY_COUNT == count) {
1726 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request");
1727 vc_mgr_client_set_exclusive_command(g_vc_m, false);
1732 SLOG(LOG_DEBUG, TAG_VCM, "[SUCCESS] start recognition");
1733 vc_mgr_client_set_internal_state(g_vc_m, VC_INTERNAL_STATE_STARTING);
1738 g_prev_volume_db = 0;
1739 g_cur_volume_db = 0;
1741 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1742 SLOG(LOG_DEBUG, TAG_VCM, " ");
1749 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Request stop");
1752 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
1753 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1754 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1755 SLOG(LOG_DEBUG, TAG_VCM, " ");
1756 return VC_ERROR_INVALID_STATE;
1760 if (state != VC_STATE_READY) {
1761 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: client state is not 'READY'");
1762 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1763 SLOG(LOG_DEBUG, TAG_VCM, " ");
1764 return VC_ERROR_INVALID_STATE;
1767 /* Check service state */
1768 vc_service_state_e service_state = -1;
1769 vc_mgr_client_get_service_state(g_vc_m, &service_state);
1770 if (service_state != VC_SERVICE_STATE_RECORDING) {
1771 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: service state is not 'RECORDING'");
1772 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1773 SLOG(LOG_DEBUG, TAG_VCM, " ");
1774 return VC_ERROR_INVALID_STATE;
1777 /* Check internal state for async */
1778 vc_internal_state_e internal_state = -1;
1779 vc_mgr_client_get_internal_state(g_vc_m, &internal_state);
1780 if (VC_INTERNAL_STATE_STARTING == internal_state) {
1781 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State : Internal state is STARTING");
1782 return VC_ERROR_IN_PROGRESS_TO_RECORDING;
1783 } else if (VC_INTERNAL_STATE_STOPPING == internal_state) {
1784 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State : Internal state is STOPPING");
1785 return VC_ERROR_IN_PROGRESS_TO_PROCESSING;
1786 } else if (VC_INTERNAL_STATE_CANCELING == internal_state) {
1787 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State : Internal state is CANCELING");
1788 return VC_ERROR_IN_PROGRESS_TO_READY;
1795 ret = vc_mgr_dbus_request_stop(g_vc_m->handle);
1797 if (VC_ERROR_TIMED_OUT != ret) {
1798 SLOG(LOG_DEBUG, TAG_VCM, "[ERROR] Fail to stop request : %s", __vc_mgr_get_error_code(ret));
1801 SLOG(LOG_WARN, TAG_VCM, "[WARNING] retry stop request : %s", __vc_mgr_get_error_code(ret));
1804 if (VC_RETRY_COUNT == count) {
1805 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request");
1810 SLOG(LOG_DEBUG, TAG_VCM, "[SUCCESS] Stop recognition");
1811 vc_mgr_client_set_internal_state(g_vc_m, VC_INTERNAL_STATE_STOPPING);
1815 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1816 SLOG(LOG_DEBUG, TAG_VCM, " ");
1823 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Request cancel");
1826 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
1827 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1828 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1829 SLOG(LOG_DEBUG, TAG_VCM, " ");
1830 return VC_ERROR_INVALID_STATE;
1834 if (state != VC_STATE_READY) {
1835 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: client state is not 'READY'");
1836 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1837 SLOG(LOG_DEBUG, TAG_VCM, " ");
1838 return VC_ERROR_INVALID_STATE;
1841 /* Check service state */
1842 vc_service_state_e service_state = -1;
1843 vc_mgr_client_get_service_state(g_vc_m, &service_state);
1844 if (service_state != VC_SERVICE_STATE_RECORDING && service_state != VC_SERVICE_STATE_PROCESSING) {
1845 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: service state is not 'RECORDING' or 'PROCESSING'");
1846 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1847 SLOG(LOG_DEBUG, TAG_VCM, " ");
1848 return VC_ERROR_INVALID_STATE;
1851 vc_internal_state_e internal_state = -1;
1852 vc_mgr_client_get_internal_state(g_vc_m, &internal_state);
1853 if (VC_INTERNAL_STATE_STARTING == internal_state) {
1854 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State : Internal state is STARTING");
1855 return VC_ERROR_IN_PROGRESS_TO_RECORDING;
1856 } else if (VC_INTERNAL_STATE_STOPPING == internal_state) {
1857 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State : Internal state is STOPPING");
1858 return VC_ERROR_IN_PROGRESS_TO_PROCESSING;
1859 } else if (VC_INTERNAL_STATE_CANCELING == internal_state) {
1860 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State : Internal state is CANCELING");
1861 return VC_ERROR_IN_PROGRESS_TO_READY;
1867 ret = vc_mgr_dbus_request_cancel(g_vc_m->handle);
1869 if (VC_ERROR_TIMED_OUT != ret) {
1870 SLOG(LOG_DEBUG, TAG_VCM, "[ERROR] Fail to cancel request : %s", __vc_mgr_get_error_code(ret));
1873 SLOG(LOG_WARN, TAG_VCM, "[WARNING] retry cancel request : %s", __vc_mgr_get_error_code(ret));
1876 if (VC_RETRY_COUNT == count) {
1877 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request");
1882 SLOG(LOG_DEBUG, TAG_VCM, "[SUCCESS] Cancel recognition");
1883 vc_mgr_client_set_internal_state(g_vc_m, VC_INTERNAL_STATE_CANCELING);
1887 vc_mgr_client_set_exclusive_command(g_vc_m, false);
1889 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1890 SLOG(LOG_DEBUG, TAG_VCM, " ");
1895 static int g_cnt = 0;
1896 static Eina_Bool __vc_mgr_set_volume(void* data)
1899 g_volume_db = g_prev_volume_db + (g_cur_volume_db - g_prev_volume_db) / 5 * g_cnt;
1901 SLOG(LOG_DEBUG, TAG_VCM, "Set volume (%f)(%f)", g_volume_db, g_cur_volume_db);
1903 if (0 == g_cnt % 5) {
1909 int __vc_mgr_cb_set_volume(float volume)
1911 g_prev_volume_db = g_volume_db;
1912 g_cur_volume_db = volume;
1914 g_volume_db = g_prev_volume_db + (g_cur_volume_db - g_prev_volume_db) / 5;
1916 SLOG(LOG_DEBUG, TAG_VCM, "Set volume (%f)(%f)", g_volume_db, g_cur_volume_db);
1918 if (NULL != g_m_set_volume_timer) {
1919 SLOG(LOG_DEBUG, TAG_VCM, "Connect Timer is deleted");
1920 ecore_timer_del(g_m_set_volume_timer);
1924 g_m_set_volume_timer = ecore_timer_add(0.05, __vc_mgr_set_volume, NULL);
1929 int vc_mgr_get_recording_volume(float* volume)
1931 if (NULL == volume) {
1932 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Input parameter is NULL");
1933 return VC_ERROR_INVALID_PARAMETER;
1936 vc_service_state_e service_state = -1;
1937 if (0 != vc_mgr_client_get_service_state(g_vc_m, &service_state)) {
1938 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1939 return VC_ERROR_INVALID_STATE;
1943 if (VC_SERVICE_STATE_RECORDING != service_state) {
1944 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: Service state is not 'RECORDING'");
1945 return VC_ERROR_INVALID_STATE;
1948 *volume = g_volume_db;
1953 int __vc_mgr_cb_set_foreground(int pid, bool value)
1955 vc_mgr_client_set_foreground(g_vc_m, pid, value);
1957 /* get authorized valid app */
1959 if (0 != vc_mgr_client_get_valid_authorized_client(g_vc_m, &tmp_pid)) {
1960 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get authorized valid app");
1961 return VC_ERROR_INVALID_PARAMETER;
1964 if (true == value) {
1965 /* compare & set valid */
1966 if (tmp_pid != pid) {
1967 SLOG(LOG_DEBUG, TAG_VCM, "Authority(%d) changed to invalid", tmp_pid);
1969 /* set authorized valid */
1970 if (true == vc_mgr_client_is_authorized_client(g_vc_m, pid)) {
1971 SLOG(LOG_DEBUG, TAG_VCM, "Authority(%d) change to valid", pid);
1972 vc_mgr_client_set_valid_authorized_client(g_vc_m, pid);
1974 SLOG(LOG_DEBUG, TAG_VCM, "No valid Authority");
1975 vc_mgr_client_set_valid_authorized_client(g_vc_m, -1);
1979 if (tmp_pid == pid) {
1980 SLOG(LOG_DEBUG, TAG_VCM, "Authority(%d) changed to invalid", tmp_pid);
1981 vc_mgr_client_set_valid_authorized_client(g_vc_m, -1);
1988 int vc_mgr_set_selected_results(vc_cmd_list_h vc_cmd_list)
1990 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Select result");
1992 /* Do not check state for 'restart continusly' mode */
1994 vc_service_state_e service_state = -1;
1995 vc_mgr_client_get_service_state(g_vc_m, &service_state);
1996 if (service_state != VC_SERVICE_STATE_PROCESSING) {
1997 vc_recognition_mode_e recognition_mode;
1998 vc_mgr_get_recognition_mode(&recognition_mode);
2000 if (VC_RECOGNITION_MODE_RESTART_CONTINUOUSLY != recognition_mode) {
2001 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: service state is not 'PROCESSING' and mode is not 'Restart continously'");
2002 SLOG(LOG_DEBUG, TAG_VCM, "=====");
2003 SLOG(LOG_DEBUG, TAG_VCM, " ");
2004 return VC_ERROR_INVALID_STATE;
2008 if (NULL != vc_cmd_list) {
2010 char* result_text = NULL;
2012 vc_mgr_client_get_all_result(g_vc_m, &event, &result_text);
2014 vc_info_parser_set_result(result_text, event, NULL, vc_cmd_list, false);
2016 if (NULL != result_text) {
2029 ret = vc_mgr_dbus_send_result_selection(g_vc_m->handle);
2031 if (VC_ERROR_TIMED_OUT != ret) {
2032 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to send result selection : %s", __vc_mgr_get_error_code(ret));
2035 SLOG(LOG_WARN, TAG_VCM, "[WARNING] retry send result selection : %s", __vc_mgr_get_error_code(ret));
2038 if (VC_RETRY_COUNT == count) {
2039 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request");
2044 SLOG(LOG_DEBUG, TAG_VCM, "[SUCCESS] result selection");
2048 vc_mgr_client_unset_all_result(g_vc_m);
2050 SLOG(LOG_DEBUG, TAG_VCM, "=====");
2051 SLOG(LOG_DEBUG, TAG_VCM, " ");
2056 static Eina_Bool __vc_mgr_set_select_result(void *data)
2058 vc_mgr_set_selected_results(NULL);
2062 static void __vc_mgr_notify_all_result(vc_result_type_e result_type)
2064 char* temp_text = NULL;
2066 char* temp_message = NULL;
2067 vc_cmd_list_h vc_cmd_list = NULL;
2069 vc_mgr_all_result_cb all_callback = NULL;
2070 void* all_user_data = NULL;
2072 vc_mgr_client_get_all_result_cb(g_vc_m, &all_callback, &all_user_data);
2073 if (NULL == all_callback) {
2074 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] All result callback is NULL");
2078 if (0 != vc_cmd_list_create(&vc_cmd_list)) {
2079 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to create command list");
2083 vc_info_parser_get_result(&temp_text, &event, &temp_message, -1, vc_cmd_list, vc_mgr_client_get_exclusive_command(g_vc_m));
2085 SLOG(LOG_INFO, TAG_VCM, "Result info : result type(%d) result text(%s) event(%d) result_message(%s)",
2086 result_type, temp_text, event, temp_message);
2088 vc_cmd_print_list(vc_cmd_list);
2092 vc_mgr_client_use_callback(g_vc_m);
2093 cb_ret = all_callback(event, vc_cmd_list, temp_text, temp_message, all_user_data);
2094 vc_mgr_client_not_use_callback(g_vc_m);
2096 if (true == vc_mgr_client_get_exclusive_command(g_vc_m)) {
2098 vc_result_cb callback = NULL;
2099 void* user_data = NULL;
2101 vc_mgr_client_get_result_cb(g_vc_m, &callback, &user_data);
2102 if (NULL == callback) {
2103 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Client result callback is NULL");
2107 vc_mgr_client_use_callback(g_vc_m);
2108 callback(event, vc_cmd_list, temp_text, user_data);
2109 vc_mgr_client_not_use_callback(g_vc_m);
2110 SLOG(LOG_DEBUG, TAG_VCM, "Exclusive result callback called");
2112 /* Release result */
2113 if (NULL != temp_text) free(temp_text);
2116 vc_cmd_list_destroy(vc_cmd_list, true);
2118 vc_mgr_client_set_exclusive_command(g_vc_m, false);
2124 vc_cmd_list_get_count(vc_cmd_list, &count);
2126 vc_mgr_client_set_all_result(g_vc_m, event, temp_text);
2127 if (true == cb_ret) {
2128 SLOG(LOG_DEBUG, TAG_VCM, "Callback result is true");
2129 if (VC_RESULT_TYPE_NOTIFICATION != result_type)
2130 ecore_idler_add(__vc_mgr_set_select_result, NULL);
2132 SLOG(LOG_DEBUG, TAG_VCM, "Callback result is false");
2133 /* need to select conflicted result */
2136 if (VC_RESULT_TYPE_NOTIFICATION != result_type)
2137 ecore_idler_add(__vc_mgr_set_select_result, NULL);
2139 vc_mgr_client_set_exclusive_command(g_vc_m, false);
2140 vc_mgr_client_unset_all_result(g_vc_m);
2143 /* Release result */
2144 if (NULL != temp_text) {
2150 vc_cmd_list_destroy(vc_cmd_list, true);
2155 static Eina_Bool __vc_mgr_notify_result(void *data)
2157 char* temp_text = NULL;
2159 vc_cmd_list_h vc_cmd_list = NULL;
2161 vc_result_cb callback = NULL;
2162 void* user_data = NULL;
2164 vc_mgr_client_get_result_cb(g_vc_m, &callback, &user_data);
2165 if (NULL == callback) {
2166 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Client result callback is NULL");
2170 if (0 != vc_cmd_list_create(&vc_cmd_list)) {
2171 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to create command list");
2175 vc_info_parser_get_result(&temp_text, &event, NULL, getpid(), vc_cmd_list, false);
2177 SLOG(LOG_INFO, TAG_VCM, "Result : result text(%s) event(%d)", temp_text, event);
2179 vc_cmd_print_list(vc_cmd_list);
2181 vc_mgr_client_use_callback(g_vc_m);
2182 callback(event, vc_cmd_list, temp_text, user_data);
2183 vc_mgr_client_not_use_callback(g_vc_m);
2184 SLOG(LOG_INFO, TAG_VCM, "Result callback called");
2186 vc_cmd_list_destroy(vc_cmd_list, true);
2188 /* Release result */
2189 if (NULL != temp_text) free(temp_text);
2194 void __vc_mgr_cb_all_result(vc_result_type_e type)
2196 if (false == vc_mgr_client_get_exclusive_command(g_vc_m)) {
2197 __vc_mgr_notify_all_result(type);
2199 __vc_mgr_notify_result(0);
2205 void __vc_mgr_cb_pre_result(vc_pre_result_event_e event, const char* pre_result)
2207 vc_mgr_pre_result_cb callback = NULL;
2208 void* user_data = NULL;
2210 vc_mgr_client_get_pre_result_cb(g_vc_m, &callback, &user_data);
2211 if (NULL == callback) {
2212 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Client pre result callback is NULL");
2216 vc_mgr_client_use_callback(g_vc_m);
2217 callback(event, pre_result, user_data);
2218 vc_mgr_client_not_use_callback(g_vc_m);
2219 SLOG(LOG_DEBUG, TAG_VCM, "Pre result callback is called");
2224 void __vc_mgr_cb_system_result()
2226 __vc_mgr_notify_result(NULL);
2230 static Eina_Bool __vc_mgr_speech_detected(void *data)
2232 vc_mgr_begin_speech_detected_cb callback = NULL;
2233 void* user_data = NULL;
2235 vc_mgr_client_get_speech_detected_cb(g_vc_m, &callback, &user_data);
2236 if (NULL == callback) {
2237 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Client speech detected callback is NULL");
2241 vc_mgr_client_use_callback(g_vc_m);
2242 callback(user_data);
2243 vc_mgr_client_not_use_callback(g_vc_m);
2244 SLOG(LOG_DEBUG, TAG_VCM, "Speech detected callback called");
2249 void __vc_mgr_cb_speech_detected()
2251 __vc_mgr_speech_detected(NULL);
2256 int vc_mgr_set_all_result_cb(vc_mgr_all_result_cb callback, void* user_data)
2258 if (NULL == callback)
2259 return VC_ERROR_INVALID_PARAMETER;
2262 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
2263 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set result callback : A handle is not available");
2264 return VC_ERROR_INVALID_STATE;
2268 if (state != VC_STATE_INITIALIZED) {
2269 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set result callback : Current state is not 'Initialized'");
2270 return VC_ERROR_INVALID_STATE;
2273 vc_mgr_client_set_all_result_cb(g_vc_m, callback, user_data);
2275 SLOG(LOG_DEBUG, TAG_VCM, "[SUCCESS] Set all result callback");
2280 int vc_mgr_unset_all_result_cb()
2283 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
2284 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset result callback : A handle is not available");
2285 return VC_ERROR_INVALID_STATE;
2289 if (state != VC_STATE_INITIALIZED) {
2290 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset result callback : Current state is not 'Initialized'");
2291 return VC_ERROR_INVALID_STATE;
2294 vc_mgr_client_set_all_result_cb(g_vc_m, NULL, NULL);
2299 int vc_mgr_set_result_cb(vc_result_cb callback, void* user_data)
2301 if (NULL == callback)
2302 return VC_ERROR_INVALID_PARAMETER;
2305 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
2306 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set result callback : A handle is not available");
2307 return VC_ERROR_INVALID_STATE;
2311 if (state != VC_STATE_INITIALIZED) {
2312 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set result callback : Current state is not 'Initialized'");
2313 return VC_ERROR_INVALID_STATE;
2316 vc_mgr_client_set_result_cb(g_vc_m, callback, user_data);
2321 int vc_mgr_unset_result_cb()
2324 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
2325 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset result callback : A handle is not available");
2326 return VC_ERROR_INVALID_STATE;
2330 if (state != VC_STATE_INITIALIZED) {
2331 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset result callback : Current state is not 'Initialized'");
2332 return VC_ERROR_INVALID_STATE;
2335 vc_mgr_client_set_result_cb(g_vc_m, NULL, NULL);
2340 int vc_mgr_set_pre_result_cb(vc_mgr_pre_result_cb callback, void* user_data)
2342 if (NULL == callback)
2343 return VC_ERROR_INVALID_PARAMETER;
2346 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
2347 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set pre result callback : A handle is not available");
2348 return VC_ERROR_INVALID_STATE;
2352 if (state != VC_STATE_INITIALIZED) {
2353 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set pre result callback : Current state is not 'Initialized'");
2354 return VC_ERROR_INVALID_STATE;
2357 vc_mgr_client_set_pre_result_cb(g_vc_m, callback, user_data);
2362 int vc_mgr_unset_pre_result_cb()
2365 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
2366 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset pre result callback : A handle is not available");
2367 return VC_ERROR_INVALID_STATE;
2371 if (state != VC_STATE_INITIALIZED) {
2372 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset pre result callback : Current state is not 'Initialize'");
2373 return VC_ERROR_INVALID_STATE;
2376 vc_mgr_client_set_pre_result_cb(g_vc_m, NULL, NULL);
2381 int vc_mgr_get_error_message(char** err_msg)
2383 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Get error message");
2385 if (NULL == err_msg) {
2386 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] invalid parameter");
2387 return VC_ERROR_INVALID_PARAMETER;
2390 if (false == g_err_callback_status) {
2391 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Not in error callback");
2392 return VC_ERROR_OPERATION_FAILED;
2396 ret = vc_mgr_client_get_error_message(g_vc_m, err_msg);
2398 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get error message");
2401 SLOG(LOG_DEBUG, TAG_VCM, "=====");
2402 SLOG(LOG_DEBUG, TAG_VCM, " ");
2407 static Eina_Bool __vc_mgr_notify_error(void *data)
2409 vc_h vc_m = (vc_h)data;
2411 vc_error_cb callback = NULL;
2412 void* user_data = NULL;
2415 vc_mgr_client_get_error_cb(vc_m, &callback, &user_data);
2416 vc_mgr_client_get_error(vc_m, &reason);
2418 if (NULL != callback) {
2419 vc_mgr_client_use_callback(vc_m);
2420 g_err_callback_status = true;
2421 callback(reason, user_data);
2422 g_err_callback_status = false;
2423 vc_mgr_client_not_use_callback(vc_m);
2424 SLOG(LOG_DEBUG, TAG_VCM, "Error callback is called");
2426 SLOG(LOG_WARN, TAG_VCM, "[WARNING] Error callback is null");
2432 int __vc_mgr_cb_error(int reason, int daemon_pid, char* msg)
2435 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
2436 SLOG(LOG_ERROR, TAG_VCM, "[WARNING] Invalid client");
2441 if (state != VC_STATE_READY) {
2442 SLOG(LOG_ERROR, TAG_VCM, "[WARNING] not connected client yet");
2446 vc_mgr_client_set_internal_state(g_vc_m, VC_INTERNAL_STATE_NONE);
2448 if (VC_ERROR_SERVICE_RESET == reason) {
2449 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] VC daemon reset");
2451 vc_mgr_client_set_client_state(g_vc_m, VC_STATE_INITIALIZED);
2452 __vc_mgr_notify_state_changed(g_vc_m);
2454 if (0 != vc_mgr_prepare()) {
2455 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to prepare");
2459 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Error reason(%d), msg(%s)", reason, msg);
2461 vc_mgr_client_set_error(g_vc_m, reason);
2462 vc_mgr_client_set_error_message(g_vc_m, msg);
2463 __vc_mgr_notify_error(g_vc_m);
2468 static Eina_Bool __vc_mgr_notify_state_changed(void *data)
2470 vc_state_changed_cb changed_callback = NULL;
2473 vc_mgr_client_get_state_changed_cb(g_vc_m, &changed_callback, &user_data);
2475 vc_state_e current_state;
2476 vc_state_e before_state;
2478 vc_mgr_client_get_before_state(g_vc_m, ¤t_state, &before_state);
2480 if (NULL != changed_callback) {
2481 vc_mgr_client_use_callback(g_vc_m);
2482 changed_callback(before_state, current_state, user_data);
2483 vc_mgr_client_not_use_callback(g_vc_m);
2484 SLOG(LOG_DEBUG, TAG_VCM, "State changed callback is called");
2486 SLOG(LOG_WARN, TAG_VCM, "[WARNING] State changed callback is null");
2492 int vc_mgr_set_state_changed_cb(vc_state_changed_cb callback, void* user_data)
2494 if (callback == NULL)
2495 return VC_ERROR_INVALID_PARAMETER;
2498 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
2499 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set state changed callback : A handle is not available");
2500 return VC_ERROR_INVALID_STATE;
2504 if (state != VC_STATE_INITIALIZED) {
2505 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set state changed callback : Current state is not 'Initialized'");
2506 return VC_ERROR_INVALID_STATE;
2509 vc_mgr_client_set_state_changed_cb(g_vc_m, callback, user_data);
2511 SLOG(LOG_DEBUG, TAG_VCM, "[SUCCESS] Set state changed callback");
2515 int vc_mgr_unset_state_changed_cb()
2518 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
2519 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset state changed callback : A handle is not available");
2520 return VC_ERROR_INVALID_STATE;
2524 if (state != VC_STATE_INITIALIZED) {
2525 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset state changed callback : Current state is not 'Initialized'");
2526 return VC_ERROR_INVALID_STATE;
2529 vc_mgr_client_set_state_changed_cb(g_vc_m, NULL, NULL);
2534 int __vc_mgr_cb_service_state(int state)
2536 vc_service_state_e current_state = (vc_service_state_e)state;
2537 vc_service_state_e before_state;
2538 vc_mgr_client_get_service_state(g_vc_m, &before_state);
2540 if (current_state == before_state) {
2541 SLOG(LOG_WARN, TAG_VCM, "Service State NOT changed : Before(%d) Current(%d)",
2542 before_state, current_state);
2546 SLOG(LOG_DEBUG, TAG_VCM, "Service State changed : Before(%d) Current(%d)",
2547 before_state, current_state);
2549 vc_internal_state_e internal_state = -1;
2550 vc_mgr_client_get_internal_state(g_vc_m, &internal_state);
2551 if ((VC_INTERNAL_STATE_STARTING == internal_state && VC_SERVICE_STATE_RECORDING == current_state) ||
2552 (VC_INTERNAL_STATE_STOPPING == internal_state && VC_SERVICE_STATE_PROCESSING == current_state) ||
2553 (VC_INTERNAL_STATE_CANCELING == internal_state && VC_SERVICE_STATE_READY == current_state)) {
2554 SLOG(LOG_DEBUG, TAG_VCM, "Internal state is changed to NONE");
2555 vc_mgr_client_set_internal_state(g_vc_m, VC_INTERNAL_STATE_NONE);
2558 /* Save service state */
2559 vc_mgr_client_set_service_state(g_vc_m, current_state);
2561 vc_service_state_changed_cb callback = NULL;
2562 void* service_user_data = NULL;
2563 vc_mgr_client_get_service_state_changed_cb(g_vc_m, &callback, &service_user_data);
2565 if (NULL != callback) {
2566 vc_mgr_client_use_callback(g_vc_m);
2567 callback(before_state, current_state, service_user_data);
2568 vc_mgr_client_not_use_callback(g_vc_m);
2569 SLOG(LOG_DEBUG, TAG_VCM, "Service state changed callback is called");
2571 SLOG(LOG_WARN, TAG_VCM, "[WARNING] Service state changed callback is null");
2577 int vc_mgr_set_service_state_changed_cb(vc_service_state_changed_cb callback, void* user_data)
2579 if (callback == NULL)
2580 return VC_ERROR_INVALID_PARAMETER;
2583 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
2584 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set state changed callback : A handle is not available");
2585 return VC_ERROR_INVALID_STATE;
2589 if (state != VC_STATE_INITIALIZED) {
2590 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set state changed callback : Current state is not 'Initialized'");
2591 return VC_ERROR_INVALID_STATE;
2594 vc_mgr_client_set_service_state_changed_cb(g_vc_m, callback, user_data);
2596 SLOG(LOG_DEBUG, TAG_VCM, "[SUCCESS] Set sevice state changed callback");
2600 int vc_mgr_unset_service_state_changed_cb()
2603 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
2604 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset state changed callback : A handle is not available");
2605 return VC_ERROR_INVALID_STATE;
2609 if (state != VC_STATE_INITIALIZED) {
2610 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset state changed callback : Current state is not 'Initialized'");
2611 return VC_ERROR_INVALID_STATE;
2614 vc_mgr_client_set_service_state_changed_cb(g_vc_m, NULL, NULL);
2618 int vc_mgr_set_speech_detected_cb(vc_mgr_begin_speech_detected_cb callback, void* user_data)
2620 if (callback == NULL)
2621 return VC_ERROR_INVALID_PARAMETER;
2624 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
2625 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set state changed callback : A handle is not available");
2626 return VC_ERROR_INVALID_STATE;
2630 if (state != VC_STATE_INITIALIZED) {
2631 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set speech detected callback : Current state is not 'Initialized'");
2632 return VC_ERROR_INVALID_STATE;
2635 vc_mgr_client_set_speech_detected_cb(g_vc_m, callback, user_data);
2637 SLOG(LOG_DEBUG, TAG_VCM, "[SUCCESS] Set speech detected callback");
2641 int vc_mgr_unset_speech_detected_cb()
2644 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
2645 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset state changed callback : A handle is not available");
2646 return VC_ERROR_INVALID_STATE;
2650 if (state != VC_STATE_INITIALIZED) {
2651 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset state changed callback : Current state is not 'Initialized'");
2652 return VC_ERROR_INVALID_STATE;
2655 vc_mgr_client_set_speech_detected_cb(g_vc_m, NULL, NULL);
2659 int vc_mgr_set_current_language_changed_cb(vc_current_language_changed_cb callback, void* user_data)
2661 if (NULL == callback)
2662 return VC_ERROR_INVALID_PARAMETER;
2665 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
2666 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set current language changed : A handle is not available");
2667 return VC_ERROR_INVALID_STATE;
2671 if (state != VC_STATE_INITIALIZED) {
2672 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set current language changed : Current state is not 'Initialized'");
2673 return VC_ERROR_INVALID_STATE;
2676 vc_mgr_client_set_current_lang_changed_cb(g_vc_m, callback, user_data);
2678 SLOG(LOG_DEBUG, TAG_VCM, "[SUCCESS] Set current language changed callback");
2682 int vc_mgr_unset_current_language_changed_cb()
2685 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
2686 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset current language changed : A handle is not available");
2687 return VC_ERROR_INVALID_STATE;
2691 if (state != VC_STATE_INITIALIZED) {
2692 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset current language changed : Current state is not 'Initialized'");
2693 return VC_ERROR_INVALID_STATE;
2696 vc_mgr_client_set_current_lang_changed_cb(g_vc_m, NULL, NULL);
2701 int vc_mgr_set_error_cb(vc_error_cb callback, void* user_data)
2703 if (NULL == callback)
2704 return VC_ERROR_INVALID_PARAMETER;
2707 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
2708 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set error callback : A handle is not available");
2709 return VC_ERROR_INVALID_STATE;
2713 if (state != VC_STATE_INITIALIZED) {
2714 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set error callback : Current state is not 'Initialized'");
2715 return VC_ERROR_INVALID_STATE;
2718 vc_mgr_client_set_error_cb(g_vc_m, callback, user_data);
2723 int vc_mgr_unset_error_cb()
2726 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
2727 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset error callback : A handle is not available");
2728 return VC_ERROR_INVALID_STATE;
2732 if (state != VC_STATE_INITIALIZED) {
2733 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset error callback : Current state is not 'Initialized'");
2734 return VC_ERROR_INVALID_STATE;
2737 vc_mgr_client_set_error_cb(g_vc_m, NULL, NULL);
2742 int __vc_mgr_cb_dialog(int pid, const char* disp_text, const char* utt_text, bool continuous)
2744 vc_mgr_dialog_request_cb callback = NULL;
2745 void* user_data = NULL;
2747 vc_mgr_client_get_dialog_request_cb(g_vc_m, &callback, &user_data);
2749 if (NULL != callback) {
2750 vc_mgr_client_use_callback(g_vc_m);
2751 callback(pid, disp_text, utt_text, continuous, user_data);
2752 vc_mgr_client_not_use_callback(g_vc_m);
2753 SLOG(LOG_DEBUG, TAG_VCM, "Dialog callback is called");
2755 SLOG(LOG_WARN, TAG_VCM, "[WARNING] Error callback is null");
2761 int vc_mgr_set_dialog_request_cb(vc_mgr_dialog_request_cb callback, void* user_data)
2763 if (NULL == callback)
2764 return VC_ERROR_INVALID_PARAMETER;
2767 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
2768 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set error callback : A handle is not available");
2769 return VC_ERROR_INVALID_STATE;
2773 if (state != VC_STATE_INITIALIZED) {
2774 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set error callback : Current state is not 'Initialized'");
2775 return VC_ERROR_INVALID_STATE;
2778 vc_mgr_client_set_dialog_request_cb(g_vc_m, callback, user_data);
2783 int vc_mgr_unset_dialog_request_cb()
2786 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
2787 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset error callback : A handle is not available");
2788 return VC_ERROR_INVALID_STATE;
2792 if (state != VC_STATE_INITIALIZED) {
2793 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset error callback : Current state is not 'Initialized'");
2794 return VC_ERROR_INVALID_STATE;
2797 vc_mgr_client_set_dialog_request_cb(g_vc_m, NULL, NULL);
2802 static bool __vc_mgr_check_demandable_client(int pid)
2804 if (0 == g_slist_length(g_demandable_client_list)) {
2805 SLOG(LOG_WARN, TAG_VCM, "[WARNING] No demandable clients");
2809 char appid[128] = {'\0', };
2810 aul_app_get_appid_bypid(pid, appid, sizeof(appid));
2812 if (0 >= strlen(appid)) {
2813 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] No appid");
2816 SLOG(LOG_DEBUG, TAG_VCM, "[CHECK] Appid - %s", appid);
2818 GSList *iter = NULL;
2819 vc_demandable_client_s* temp_client;
2820 iter = g_slist_nth(g_demandable_client_list, 0);
2822 while (NULL != iter) {
2823 temp_client = iter->data;
2825 if (NULL != temp_client) {
2826 if (NULL != temp_client->appid) {
2827 if (!strcmp(temp_client->appid, appid)) {
2828 SLOG(LOG_DEBUG, TAG_VCM, "pid(%d) is available", pid);
2834 iter = g_slist_next(iter);
2841 int __vc_mgr_request_auth_enable(int pid)
2843 if (false == __vc_mgr_check_demandable_client(pid)) {
2844 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Not demandable client");
2845 return VC_ERROR_INVALID_PARAMETER;
2848 /* check already authorized */
2849 if (true == vc_mgr_client_is_authorized_client(g_vc_m, pid)) {
2850 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Already authorized");
2851 return VC_ERROR_INVALID_PARAMETER;
2854 /* add authorized list */
2855 if (0 != vc_mgr_client_add_authorized_client(g_vc_m, pid)) {
2856 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to add authorized client");
2857 return VC_ERROR_OPERATION_FAILED;
2860 /* foreground check */
2862 if (0 != vc_mgr_client_get_foreground(g_vc_m, &fore_pid)) {
2863 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get foreground");
2864 return VC_ERROR_OPERATION_FAILED;
2867 if (pid == fore_pid) {
2868 vc_mgr_client_set_valid_authorized_client(g_vc_m, pid);
2874 int __vc_mgr_request_auth_disable(int pid)
2876 /* check authorized */
2877 if (false == vc_mgr_client_is_authorized_client(g_vc_m, pid)) {
2878 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] No authorized");
2879 return VC_ERROR_INVALID_PARAMETER;
2882 /* remove authorized list */
2883 if (0 != vc_mgr_client_remove_authorized_client(g_vc_m, pid)) {
2884 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to remove authorized client");
2885 return VC_ERROR_OPERATION_FAILED;
2888 /* check authority valid */
2889 if (true == vc_mgr_client_is_valid_authorized_client(g_vc_m, pid)) {
2890 SLOG(LOG_DEBUG, TAG_VCM, "Valid authorized client is removed");
2891 if (0 != vc_mgr_client_set_valid_authorized_client(g_vc_m, -1)) {
2892 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to set valid authorized client");
2893 return VC_ERROR_OPERATION_FAILED;
2900 static Eina_Bool __request_auth_start(void* data)
2902 SLOG(LOG_DEBUG, TAG_VCM, "Request Start");
2904 if (0 != vc_mgr_client_set_start_by_client(g_vc_m, true)) {
2905 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to set start by client");
2908 if (0 != vc_mgr_start(false)) {
2909 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Request start is failed");
2910 /* TODO - Error handling? */
2913 if (0 != vc_mgr_client_set_start_by_client(g_vc_m, false)) {
2914 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to set start by client");
2921 int __vc_mgr_request_auth_start(int pid)
2923 /* check authorized */
2924 if (false == vc_mgr_client_is_valid_authorized_client(g_vc_m, pid)) {
2925 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] No valid authorized client");
2926 return VC_ERROR_INVALID_PARAMETER;
2929 /* add timer for start recording */
2930 ecore_timer_add(0, __request_auth_start, NULL);
2935 static Eina_Bool __request_auth_stop(void* data)
2937 SLOG(LOG_DEBUG, TAG_VCM, "Request Stop");
2939 if (0 != vc_mgr_stop()) {
2940 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Request stop is failed");
2941 /* TODO - Error handling? */
2947 int __vc_mgr_request_auth_stop(int pid)
2949 /* check authorized */
2950 if (false == vc_mgr_client_is_valid_authorized_client(g_vc_m, pid)) {
2951 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] No valid authorized client");
2952 return VC_ERROR_INVALID_PARAMETER;
2955 /* add timer for start recording */
2956 ecore_timer_add(0, __request_auth_stop, NULL);
2961 static Eina_Bool __request_auth_cancel(void* data)
2963 SLOG(LOG_DEBUG, TAG_VCM, "Request Cancel");
2965 if (0 != vc_mgr_cancel()) {
2966 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Request cancel is failed");
2967 /* TODO - Error handling? */
2973 int __vc_mgr_request_auth_cancel(int pid)
2975 /* check authorized */
2976 if (false == vc_mgr_client_is_valid_authorized_client(g_vc_m, pid)) {
2977 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] No valid authorized client");
2978 return VC_ERROR_INVALID_PARAMETER;
2981 /* add timer for start recording */
2982 ecore_timer_add(0, __request_auth_cancel, NULL);