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_cmd_db.h"
21 #include "vc_config_mgr.h"
22 #include "vc_command.h"
23 #include "vc_info_parser.h"
24 #include "vc_json_parser.h"
26 #include "vc_mgr_client.h"
27 #include "vc_mgr_dbus.h"
28 #include "voice_control.h"
29 #include "voice_control_command.h"
30 #include "voice_control_command_expand.h"
31 #include "voice_control_common.h"
32 #include "voice_control_manager.h"
35 #define VC_MANAGER_CONFIG_HANDLE 100000
37 static Ecore_Timer* g_m_connect_timer = NULL;
39 static Ecore_Timer* g_m_set_volume_timer = NULL;
41 static vc_h g_vc_m = NULL;
43 static GSList* g_demandable_client_list = NULL;
45 static float g_volume_db = 0;
47 static float g_prev_volume_db = 0;
49 static float g_cur_volume_db = 0;
51 static int g_daemon_pid = 0;
53 static int g_feature_enabled = -1;
55 static bool g_err_callback_status = false;
57 static Eina_Bool __vc_mgr_notify_state_changed(void *data);
58 static Eina_Bool __vc_mgr_notify_error(void *data);
59 static Eina_Bool __vc_mgr_notify_result(void *data);
61 static const char* __vc_mgr_get_error_code(vc_error_e err)
64 case VC_ERROR_NONE: return "VC_ERROR_NONE";
65 case VC_ERROR_OUT_OF_MEMORY: return "VC_ERROR_OUT_OF_MEMORY";
66 case VC_ERROR_IO_ERROR: return "VC_ERROR_IO_ERROR";
67 case VC_ERROR_INVALID_PARAMETER: return "VC_ERROR_INVALID_PARAMETER";
68 case VC_ERROR_TIMED_OUT: return "VC_ERROR_TIMED_OUT";
69 case VC_ERROR_RECORDER_BUSY: return "VC_ERROR_RECORDER_BUSY";
70 case VC_ERROR_INVALID_STATE: return "VC_ERROR_INVALID_STATE";
71 case VC_ERROR_INVALID_LANGUAGE: return "VC_ERROR_INVALID_LANGUAGE";
72 case VC_ERROR_ENGINE_NOT_FOUND: return "VC_ERROR_ENGINE_NOT_FOUND";
73 case VC_ERROR_OPERATION_FAILED: return "VC_ERROR_OPERATION_FAILED";
74 default: return "Invalid error code";
79 static void __vc_mgr_lang_changed_cb(const char* before_lang, const char* current_lang)
81 SLOG(LOG_DEBUG, TAG_VCM, "Lang changed : Before lang(%s) Current lang(%s)",
82 before_lang, current_lang);
84 vc_current_language_changed_cb callback = NULL;
86 vc_mgr_client_get_current_lang_changed_cb(g_vc_m, &callback, &lang_user_data);
88 if (NULL != callback) {
89 vc_mgr_client_use_callback(g_vc_m);
90 callback(before_lang, current_lang, lang_user_data);
91 vc_mgr_client_not_use_callback(g_vc_m);
92 SLOG(LOG_DEBUG, TAG_VCM, "Language changed callback is called");
94 SLOG(LOG_WARN, TAG_VCM, "[WARNING] Language changed callback is null");
100 static int __vc_mgr_get_feature_enabled()
102 if (0 == g_feature_enabled) {
103 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Voice control feature NOT supported");
104 return VC_ERROR_NOT_SUPPORTED;
105 } else if (-1 == g_feature_enabled) {
106 bool vc_supported = false;
107 bool mic_supported = false;
108 if (0 == system_info_get_platform_bool(VC_FEATURE_PATH, &vc_supported)) {
109 if (0 == system_info_get_platform_bool(VC_MIC_FEATURE_PATH, &mic_supported)) {
110 if (false == vc_supported || false == mic_supported) {
111 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Voice control feature NOT supported");
112 g_feature_enabled = 0;
113 return VC_ERROR_NOT_SUPPORTED;
116 g_feature_enabled = 1;
124 int vc_mgr_initialize()
126 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Initialize");
129 if (0 != __vc_mgr_get_feature_enabled()) {
130 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] not supported");
131 return VC_ERROR_NOT_SUPPORTED;
135 if (true == vc_mgr_client_is_valid(g_vc_m)) {
136 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Already initialized");
137 return VC_ERROR_NONE;
140 if (0 != vc_mgr_dbus_open_connection()) {
141 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to open connection");
142 return VC_ERROR_OPERATION_FAILED;
145 if (0 != vc_mgr_client_create(&g_vc_m)) {
146 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to create client!!!!!");
147 return VC_ERROR_OUT_OF_MEMORY;
150 int ret = vc_config_mgr_initialize(g_vc_m->handle + VC_MANAGER_CONFIG_HANDLE);
152 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to init config manager : %d", ret);
153 vc_mgr_client_destroy(g_vc_m);
154 return VC_ERROR_OPERATION_FAILED;
157 ret = vc_config_mgr_set_lang_cb(g_vc_m->handle + VC_MANAGER_CONFIG_HANDLE, __vc_mgr_lang_changed_cb);
159 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to set callback : %d", ret);
160 vc_config_mgr_finalize(g_vc_m->handle + VC_MANAGER_CONFIG_HANDLE);
161 vc_mgr_client_destroy(g_vc_m);
162 return VC_ERROR_OPERATION_FAILED;
165 ret = vc_db_initialize();
167 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to initialize DB : %d", ret);
168 vc_config_mgr_finalize(g_vc_m->handle + VC_MANAGER_CONFIG_HANDLE);
169 vc_mgr_client_destroy(g_vc_m);
173 SLOG(LOG_DEBUG, TAG_VCM, "[Success] pid(%d)", g_vc_m->handle);
175 SLOG(LOG_DEBUG, TAG_VCM, "=====");
176 SLOG(LOG_DEBUG, TAG_VCM, " ");
178 return VC_ERROR_NONE;
181 static void __vc_mgr_internal_unprepare()
183 int ret = vc_mgr_dbus_request_finalize(g_vc_m->handle);
185 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request finalize : %s", __vc_mgr_get_error_code(ret));
188 vc_mgr_client_set_internal_state(g_vc_m, VC_INTERNAL_STATE_NONE);
192 int vc_mgr_deinitialize()
194 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Deinitialize");
196 if (false == vc_mgr_client_is_valid(g_vc_m)) {
197 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] NOT initialized");
198 SLOG(LOG_DEBUG, TAG_VCM, "=====");
199 SLOG(LOG_DEBUG, TAG_VCM, " ");
200 return VC_ERROR_INVALID_STATE;
204 vc_mgr_client_get_client_state(g_vc_m, &state);
209 __vc_mgr_internal_unprepare();
210 /* no break. need to next step*/
211 case VC_STATE_INITIALIZED:
212 if (NULL != g_m_connect_timer) {
213 SLOG(LOG_DEBUG, TAG_VCM, "Connect Timer is deleted");
214 ecore_timer_del(g_m_connect_timer);
215 g_m_connect_timer = NULL;
218 vc_config_mgr_unset_lang_cb(g_vc_m->handle + VC_MANAGER_CONFIG_HANDLE);
219 vc_config_mgr_finalize(g_vc_m->handle + VC_MANAGER_CONFIG_HANDLE);
221 /* Free client resources */
222 vc_mgr_client_destroy(g_vc_m);
229 SLOG(LOG_DEBUG, TAG_VCM, "Success: destroy");
231 int cnt = VC_COMMAND_TYPE_FOREGROUND;
233 int ret = vc_cmd_parser_delete_file(getpid(), cnt);
235 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to delete file, type(%d), ret(%d)", cnt, ret);
236 } while (VC_COMMAND_TYPE_EXCLUSIVE >= ++cnt);
238 int ret = vc_db_finalize();
240 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to finalize DB, ret(%d)", ret);
243 if (0 != vc_mgr_dbus_close_connection()) {
244 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to close connection");
247 SLOG(LOG_DEBUG, TAG_VCM, "=====");
248 SLOG(LOG_DEBUG, TAG_VCM, " ");
250 return VC_ERROR_NONE;
253 static Eina_Bool __vc_mgr_connect_daemon(void *data)
255 /* request initialization */
257 int service_state = 0;
258 int foreground = VC_RUNTIME_INFO_NO_FOREGROUND;
260 g_m_connect_timer = NULL;
262 ret = vc_mgr_dbus_request_initialize(g_vc_m->handle, &service_state, &foreground, &g_daemon_pid);
264 if (VC_ERROR_ENGINE_NOT_FOUND == ret) {
265 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to initialize : %s", __vc_mgr_get_error_code(ret));
267 vc_mgr_client_set_error(g_vc_m, VC_ERROR_ENGINE_NOT_FOUND);
268 ecore_timer_add(0, __vc_mgr_notify_error, g_vc_m);
270 SLOG(LOG_DEBUG, TAG_VCM, "=====");
271 SLOG(LOG_DEBUG, TAG_VCM, " ");
274 } else if (0 != ret) {
275 SLOG(LOG_ERROR, TAG_VCM, "[WARNING] Fail to connection. Retry to connect : %s", __vc_mgr_get_error_code(ret));
278 /* Success to connect */
281 /* Set service state */
282 vc_mgr_client_set_service_state(g_vc_m, (vc_service_state_e)service_state);
285 vc_mgr_client_set_foreground(g_vc_m, foreground, true);
287 SLOG(LOG_DEBUG, TAG_VCM, "[SUCCESS] Connected daemon");
289 vc_mgr_client_set_client_state(g_vc_m, VC_STATE_READY);
291 vc_state_changed_cb changed_callback = NULL;
292 void* user_data = NULL;
294 vc_mgr_client_get_state_changed_cb(g_vc_m, &changed_callback, &user_data);
296 vc_state_e current_state;
297 vc_state_e before_state;
299 vc_mgr_client_get_before_state(g_vc_m, ¤t_state, &before_state);
301 if (NULL != changed_callback) {
302 vc_mgr_client_use_callback(g_vc_m);
303 changed_callback(before_state, current_state, user_data);
304 vc_mgr_client_not_use_callback(g_vc_m);
305 SLOG(LOG_DEBUG, TAG_VCM, "State changed callback is called");
307 SLOG(LOG_WARN, TAG_VCM, "[WARNING] State changed callback is null");
310 SLOG(LOG_DEBUG, TAG_VCM, "=====");
311 SLOG(LOG_DEBUG, TAG_VCM, " ");
316 static Eina_Bool __vc_mgr_prepare_daemon(void *data)
319 if (0 != vc_mgr_dbus_request_hello()) {
323 g_m_connect_timer = NULL;
324 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Connect daemon");
326 g_m_connect_timer = ecore_idler_add(__vc_mgr_connect_daemon, data);
333 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Prepare");
336 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
337 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
338 SLOG(LOG_DEBUG, TAG_VCM, "=====");
339 SLOG(LOG_DEBUG, TAG_VCM, " ");
340 return VC_ERROR_INVALID_STATE;
344 if (state != VC_STATE_INITIALIZED) {
345 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: Current state is not 'CREATED'");
346 SLOG(LOG_DEBUG, TAG_VCM, "=====");
347 SLOG(LOG_DEBUG, TAG_VCM, " ");
348 return VC_ERROR_INVALID_STATE;
351 g_m_connect_timer = ecore_timer_add(0, __vc_mgr_prepare_daemon, NULL);
353 SLOG(LOG_DEBUG, TAG_VCM, "=====");
354 SLOG(LOG_DEBUG, TAG_VCM, " ");
356 return VC_ERROR_NONE;
359 int vc_mgr_unprepare()
361 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Unprepare");
364 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
365 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
366 SLOG(LOG_DEBUG, TAG_VCM, "=====");
367 SLOG(LOG_DEBUG, TAG_VCM, " ");
368 return VC_ERROR_INVALID_STATE;
372 if (state != VC_STATE_READY) {
373 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: Current state is not 'READY'");
374 SLOG(LOG_DEBUG, TAG_VCM, "=====");
375 SLOG(LOG_DEBUG, TAG_VCM, " ");
376 return VC_ERROR_INVALID_STATE;
379 __vc_mgr_internal_unprepare();
381 vc_mgr_client_set_client_state(g_vc_m, VC_STATE_INITIALIZED);
382 ecore_timer_add(0, __vc_mgr_notify_state_changed, g_vc_m);
384 SLOG(LOG_DEBUG, TAG_VCM, "=====");
385 SLOG(LOG_DEBUG, TAG_VCM, " ");
387 return VC_ERROR_NONE;
390 int vc_mgr_foreach_supported_languages(vc_supported_language_cb callback, void* user_data)
392 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Foreach Supported Language");
394 if (NULL == callback) {
395 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Input parameter is NULL");
396 SLOG(LOG_DEBUG, TAG_VCM, "=====");
397 SLOG(LOG_DEBUG, TAG_VCM, " ");
398 return VC_ERROR_INVALID_PARAMETER;
402 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
403 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
404 SLOG(LOG_DEBUG, TAG_VCM, "=====");
405 SLOG(LOG_DEBUG, TAG_VCM, " ");
406 return VC_ERROR_INVALID_STATE;
410 ret = vc_config_mgr_get_language_list(callback, user_data);
412 ret = vc_config_convert_error_code((vc_config_error_e)ret);
413 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get languages : %s", __vc_mgr_get_error_code(ret));
416 SLOG(LOG_DEBUG, TAG_VCM, "=====");
417 SLOG(LOG_DEBUG, TAG_VCM, " ");
419 return VC_ERROR_NONE;
422 int vc_mgr_get_current_language(char** language)
424 if (NULL == language) {
425 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Input parameter is NULL");
426 return VC_ERROR_INVALID_PARAMETER;
430 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
431 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
432 return VC_ERROR_INVALID_STATE;
436 ret = vc_config_mgr_get_default_language(language);
438 ret = vc_config_convert_error_code((vc_config_error_e)ret);
439 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get current languages : %s", __vc_mgr_get_error_code(ret));
441 SLOG(LOG_DEBUG, TAG_VCM, "[Get current language] language : %s", *language);
447 int vc_mgr_get_state(vc_state_e* state)
449 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Get State");
452 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Input parameter is NULL");
453 return VC_ERROR_INVALID_PARAMETER;
457 if (0 != vc_mgr_client_get_client_state(g_vc_m, &temp)) {
458 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
459 SLOG(LOG_DEBUG, TAG_VCM, "=====");
460 SLOG(LOG_DEBUG, TAG_VCM, " ");
461 return VC_ERROR_INVALID_STATE;
467 case VC_STATE_NONE: SLOG(LOG_DEBUG, TAG_VCM, "Current state is 'None'"); break;
468 case VC_STATE_INITIALIZED: SLOG(LOG_DEBUG, TAG_VCM, "Current state is 'Created'"); break;
469 case VC_STATE_READY: SLOG(LOG_DEBUG, TAG_VCM, "Current state is 'Ready'"); break;
470 default: SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid state");
473 SLOG(LOG_DEBUG, TAG_VCM, "=====");
474 SLOG(LOG_DEBUG, TAG_VCM, " ");
476 return VC_ERROR_NONE;
479 int vc_mgr_get_service_state(vc_service_state_e* state)
481 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Get Service State");
484 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Input parameter is NULL");
485 return VC_ERROR_INVALID_PARAMETER;
488 vc_state_e client_state;
489 if (0 != vc_mgr_client_get_client_state(g_vc_m, &client_state)) {
490 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
491 return VC_ERROR_INVALID_STATE;
495 if (client_state != VC_STATE_READY) {
496 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Current state is not 'READY'");
497 return VC_ERROR_INVALID_STATE;
500 /* get service state */
501 vc_service_state_e service_state;
502 if (0 != vc_mgr_client_get_service_state(g_vc_m, &service_state)) {
503 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get service state");
504 return VC_ERROR_OPERATION_FAILED;
507 *state = service_state;
510 case VC_SERVICE_STATE_NONE: SLOG(LOG_DEBUG, TAG_VCM, "Current service state is 'None'"); break;
511 case VC_SERVICE_STATE_READY: SLOG(LOG_DEBUG, TAG_VCM, "Current service state is 'Ready'"); break;
512 case VC_SERVICE_STATE_RECORDING: SLOG(LOG_DEBUG, TAG_VCM, "Current service state is 'Recording'"); break;
513 case VC_SERVICE_STATE_PROCESSING: SLOG(LOG_DEBUG, TAG_VCM, "Current service state is 'Processing'"); break;
514 default: SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid state");
517 SLOG(LOG_DEBUG, TAG_VCM, "=====");
518 SLOG(LOG_DEBUG, TAG_VCM, " ");
520 return VC_ERROR_NONE;
523 int vc_mgr_set_demandable_client_rule(const char* rule)
525 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Set Demandable client rule");
528 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
529 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
530 SLOG(LOG_DEBUG, TAG_VCM, "=====");
531 SLOG(LOG_DEBUG, TAG_VCM, " ");
532 return VC_ERROR_INVALID_STATE;
536 if (state != VC_STATE_READY) {
537 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: Current state is not 'READY'");
538 SLOG(LOG_DEBUG, TAG_VCM, "=====");
539 SLOG(LOG_DEBUG, TAG_VCM, " ");
540 return VC_ERROR_INVALID_STATE;
544 ret = vc_info_parser_set_demandable_client(rule);
546 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] rule is NOT valid");
547 SLOG(LOG_DEBUG, TAG_VCM, "=====");
548 SLOG(LOG_DEBUG, TAG_VCM, " ");
549 return VC_ERROR_INVALID_PARAMETER;
552 if (0 != vc_info_parser_get_demandable_clients(&g_demandable_client_list)) {
553 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get demandable clients");
554 return VC_ERROR_OPERATION_FAILED;
557 SLOG(LOG_DEBUG, TAG_VCM, "=====");
558 SLOG(LOG_DEBUG, TAG_VCM, " ");
563 int vc_mgr_unset_demandable_client_rule()
565 vc_info_parser_set_demandable_client(NULL);
570 ret = vc_mgr_dbus_request_demandable_client(g_vc_m->handle);
572 if (VC_ERROR_TIMED_OUT != ret) {
573 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request unset client rule to daemon : %s", __vc_mgr_get_error_code(ret));
576 SLOG(LOG_WARN, TAG_VCM, "[WARNING] retry request unset client rule : %s", __vc_mgr_get_error_code(ret));
579 if (VC_RETRY_COUNT == count) {
580 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request");
590 int vc_mgr_is_command_format_supported(vc_cmd_format_e format, bool* support)
592 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Is command type supported");
595 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
596 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
597 SLOG(LOG_DEBUG, TAG_VCM, "=====");
598 SLOG(LOG_DEBUG, TAG_VCM, " ");
599 return VC_ERROR_INVALID_STATE;
603 bool non_fixed_support = false;
604 if (0 != vc_config_mgr_get_nonfixed_support(&non_fixed_support)) {
605 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get nonfixed support info");
609 case VC_CMD_FORMAT_FIXED: *support = true; break;
610 case VC_CMD_FORMAT_FIXED_AND_VFIXED: *support = true; break;
611 case VC_CMD_FORMAT_VFIXED_AND_FIXED: *support = true; break;
612 case VC_CMD_FORMAT_FIXED_AND_NONFIXED: *support = non_fixed_support; break;
613 case VC_CMD_FORMAT_NONFIXED_AND_FIXED: *support = non_fixed_support; break;
614 default: *support = false; break;
617 SLOG(LOG_ERROR, TAG_VCM, "[DEBUG] Format(%d) support(%s)", format, *support ? "true" : "false");
619 SLOG(LOG_DEBUG, TAG_VCM, "=====");
620 SLOG(LOG_DEBUG, TAG_VCM, " ");
622 return VC_ERROR_NONE;
625 int vc_mgr_enable_command_type(int cmd_type)
627 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Enable Command Type");
630 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
631 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
632 SLOG(LOG_DEBUG, TAG_VCM, "=====");
633 SLOG(LOG_DEBUG, TAG_VCM, " ");
634 return VC_ERROR_INVALID_STATE;
638 if (state != VC_STATE_READY) {
639 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: Current state is not 'READY'");
640 SLOG(LOG_DEBUG, TAG_VCM, "=====");
641 SLOG(LOG_DEBUG, TAG_VCM, " ");
642 return VC_ERROR_INVALID_STATE;
645 /* Check service state */
646 vc_service_state_e service_state = -1;
647 vc_mgr_client_get_service_state(g_vc_m, &service_state);
648 if (service_state != VC_SERVICE_STATE_READY) {
649 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: service state is not 'READY'");
650 SLOG(LOG_DEBUG, TAG_VCM, "=====");
651 SLOG(LOG_DEBUG, TAG_VCM, " ");
652 return VC_ERROR_INVALID_STATE;
658 ret = vc_mgr_dbus_request_enable_command_type(g_vc_m->handle, cmd_type);
660 if (VC_ERROR_TIMED_OUT != ret) {
661 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request enable command type : %s", __vc_mgr_get_error_code(ret));
664 SLOG(LOG_WARN, TAG_VCM, "[WARNING] retry request enable command type : %s", __vc_mgr_get_error_code(ret));
667 if (VC_RETRY_COUNT == count) {
668 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request");
675 SLOG(LOG_DEBUG, TAG_VCM, "=====");
676 SLOG(LOG_DEBUG, TAG_VCM, " ");
681 int vc_mgr_disable_command_type(int cmd_type)
683 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Disable Command Type");
686 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
687 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
688 SLOG(LOG_DEBUG, TAG_VCM, "=====");
689 SLOG(LOG_DEBUG, TAG_VCM, " ");
690 return VC_ERROR_INVALID_STATE;
694 if (state != VC_STATE_READY) {
695 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: Current state is not 'READY'");
696 SLOG(LOG_DEBUG, TAG_VCM, "=====");
697 SLOG(LOG_DEBUG, TAG_VCM, " ");
698 return VC_ERROR_INVALID_STATE;
701 /* Check service state */
702 vc_service_state_e service_state = -1;
703 vc_mgr_client_get_service_state(g_vc_m, &service_state);
704 if (service_state != VC_SERVICE_STATE_READY) {
705 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: service state is not 'READY'");
706 SLOG(LOG_DEBUG, TAG_VCM, "=====");
707 SLOG(LOG_DEBUG, TAG_VCM, " ");
708 return VC_ERROR_INVALID_STATE;
714 ret = vc_mgr_dbus_request_disable_command_type(g_vc_m->handle, cmd_type);
716 if (VC_ERROR_TIMED_OUT != ret) {
717 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request disable command type : %s", __vc_mgr_get_error_code(ret));
720 SLOG(LOG_WARN, TAG_VCM, "[WARNING] retry request disable command type : %s", __vc_mgr_get_error_code(ret));
723 if (VC_RETRY_COUNT == count) {
724 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request");
731 SLOG(LOG_DEBUG, TAG_VCM, "=====");
732 SLOG(LOG_DEBUG, TAG_VCM, " ");
737 int vc_mgr_set_command_list(vc_cmd_list_h vc_cmd_list)
739 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Set Command list");
742 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
743 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
744 SLOG(LOG_DEBUG, TAG_VCM, "=====");
745 SLOG(LOG_DEBUG, TAG_VCM, " ");
746 return VC_ERROR_INVALID_STATE;
750 if (state != VC_STATE_READY) {
751 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: Current state is not 'READY'");
752 SLOG(LOG_DEBUG, TAG_VCM, "=====");
753 SLOG(LOG_DEBUG, TAG_VCM, " ");
754 return VC_ERROR_INVALID_STATE;
757 /* Check service state */
758 vc_service_state_e service_state = -1;
759 vc_mgr_client_get_service_state(g_vc_m, &service_state);
760 if (service_state != VC_SERVICE_STATE_READY) {
761 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: service state is not 'READY'");
762 SLOG(LOG_DEBUG, TAG_VCM, "=====");
763 SLOG(LOG_DEBUG, TAG_VCM, " ");
764 return VC_ERROR_INVALID_STATE;
767 if (NULL == vc_cmd_list) {
768 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Input parameter is NULL");
769 return VC_ERROR_INVALID_PARAMETER;
772 vc_cmd_list_s* list = NULL;
773 list = (vc_cmd_list_s*)vc_cmd_list;
774 SLOG(LOG_INFO, TAG_VCM, "[List] (%p) (%p)", list, list->list);
776 if (NULL == list->list) {
777 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid command list");
778 return VC_ERROR_INVALID_PARAMETER;
783 bool success_save = false;
784 for (i = VC_COMMAND_TYPE_FOREGROUND; i <= VC_COMMAND_TYPE_EXCLUSIVE; i++) {
785 ret = vc_cmd_parser_delete_file(getpid(), i);
787 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to delete file, type(%d), ret(%d)", i, ret);
789 ret = vc_cmd_parser_save_file(getpid(), i, list->list, NULL);
791 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to save file, type(%d), ret(%d)", i, ret);
793 SLOG(LOG_DEBUG, TAG_VCM, "[SUCCESS] Save file, type(%d)", i);
798 if (true != success_save) {
799 ret = VC_ERROR_INVALID_PARAMETER;
800 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to save command group : %s", __vc_mgr_get_error_code(ret));
804 ret = vc_mgr_dbus_request_set_command(g_vc_m->handle);
806 if (VC_ERROR_TIMED_OUT != ret) {
807 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request set command to daemon : %s", __vc_mgr_get_error_code(ret));
810 SLOG(LOG_WARN, TAG_VCM, "[WARNING] retry request set command : %s", __vc_mgr_get_error_code(ret));
813 if (VC_RETRY_COUNT == count) {
814 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request");
822 SLOG(LOG_DEBUG, TAG_VCM, "=====");
823 SLOG(LOG_DEBUG, TAG_VCM, " ");
828 int vc_mgr_unset_command_list()
830 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Unset Command list");
833 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
834 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
835 return VC_ERROR_INVALID_STATE;
839 if (state != VC_STATE_READY) {
840 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Current state is not 'READY'");
841 return VC_ERROR_INVALID_STATE;
847 ret = vc_mgr_dbus_request_unset_command(g_vc_m->handle);
849 if (VC_ERROR_TIMED_OUT != ret) {
850 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request unset command to daemon : %s", __vc_mgr_get_error_code(ret));
853 SLOG(LOG_WARN, TAG_VCM, "[WARNING] retry request unset command : %s", __vc_mgr_get_error_code(ret));
856 if (VC_RETRY_COUNT == count) {
857 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request");
865 for (i = VC_COMMAND_TYPE_FOREGROUND; i <= VC_COMMAND_TYPE_EXCLUSIVE; i++) {
866 ret = vc_cmd_parser_delete_file(getpid(), i);
868 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to delete file, type(%d), ret(%d)", i, ret);
871 SLOG(LOG_DEBUG, TAG_VCM, "=====");
872 SLOG(LOG_DEBUG, TAG_VCM, " ");
877 int vc_mgr_set_command_list_from_file(const char* file_path, int type)
879 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Set Command list from file");
881 if (NULL == file_path) {
882 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid parameter!!");
883 return VC_ERROR_INVALID_PARAMETER;
885 SLOG(LOG_DEBUG, TAG_VCM, "===== File path: %s", file_path);
889 if (VC_COMMAND_TYPE_FOREGROUND > type || VC_COMMAND_TYPE_EXCLUSIVE < type) {
890 SLOG(LOG_ERROR, TAG_VCC, "[ERROR] Invalid command type: input type is %d", type);
891 SLOG(LOG_DEBUG, TAG_VCC, "=====");
892 SLOG(LOG_DEBUG, TAG_VCC, " ");
893 return VC_ERROR_INVALID_PARAMETER;
897 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
898 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
899 return VC_ERROR_INVALID_STATE;
903 if (state != VC_STATE_READY) {
904 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: Current state is not 'READY'");
905 return VC_ERROR_INVALID_STATE;
908 /* Check service state */
909 vc_service_state_e service_state = -1;
910 vc_mgr_client_get_service_state(g_vc_m, &service_state);
911 if (service_state != VC_SERVICE_STATE_READY) {
912 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: service state is not 'READY'");
913 return VC_ERROR_INVALID_STATE;
916 int ret = vc_cmd_parser_delete_file(getpid(), type);
918 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to delete file, type(4), ret(%d)", ret);
920 if (0 != vc_json_set_commands_from_file(file_path, type, NULL)) {
921 ret = VC_ERROR_INVALID_PARAMETER;
922 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to save command list (%d)", ret);
926 ret = vc_mgr_dbus_request_set_command(g_vc_m->handle);
928 if (VC_ERROR_TIMED_OUT != ret) {
929 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request set command to daemon : %s", __vc_mgr_get_error_code(ret));
932 SLOG(LOG_WARN, TAG_VCM, "[WARNING] retry request set command : %s", __vc_mgr_get_error_code(ret));
935 if (VC_RETRY_COUNT == count) {
936 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request");
944 SLOG(LOG_DEBUG, TAG_VCM, "=====");
945 SLOG(LOG_DEBUG, TAG_VCM, " ");
950 int vc_mgr_set_preloaded_commands_from_file(const char* file_path)
952 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Set preloaded command list");
955 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
956 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
957 return VC_ERROR_INVALID_STATE;
961 if (state != VC_STATE_READY) {
962 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: Current state is not 'READY'");
963 return VC_ERROR_INVALID_STATE;
966 /* Check service state */
967 vc_service_state_e service_state = -1;
968 vc_mgr_client_get_service_state(g_vc_m, &service_state);
969 if (service_state != VC_SERVICE_STATE_READY) {
970 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: service state is not 'READY'");
971 return VC_ERROR_INVALID_STATE;
974 /* Only support to set background commands for preloaded application */
975 int ret = vc_json_set_commands_from_file(file_path, VC_COMMAND_TYPE_BACKGROUND, NULL);
977 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to insert preloaded commands into db");
979 SLOG(LOG_DEBUG, TAG_VCM, "=====");
980 SLOG(LOG_DEBUG, TAG_VCM, " ");
984 int vc_mgr_set_audio_type(const char* audio_id)
986 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Set audio type");
988 if (NULL == audio_id) {
989 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Input parameter is NULL");
990 return VC_ERROR_INVALID_PARAMETER;
994 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
995 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
996 SLOG(LOG_DEBUG, TAG_VCM, "=====");
997 SLOG(LOG_DEBUG, TAG_VCM, " ");
998 return VC_ERROR_INVALID_STATE;
1002 if (state != VC_STATE_READY) {
1003 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: Current state is not 'READY'");
1004 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1005 SLOG(LOG_DEBUG, TAG_VCM, " ");
1006 return VC_ERROR_INVALID_STATE;
1009 /* Check service state */
1010 vc_service_state_e service_state = -1;
1011 vc_mgr_client_get_service_state(g_vc_m, &service_state);
1012 if (service_state != VC_SERVICE_STATE_READY) {
1013 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: service state is not 'READY'");
1014 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1015 SLOG(LOG_DEBUG, TAG_VCM, " ");
1016 return VC_ERROR_INVALID_STATE;
1024 ret = vc_mgr_dbus_request_set_audio_type(g_vc_m->handle, audio_id);
1026 if (VC_ERROR_TIMED_OUT != ret) {
1027 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to set audio type : %s", __vc_mgr_get_error_code(ret));
1030 SLOG(LOG_WARN, TAG_VCM, "[WARNING] retry to set audio type : %s", __vc_mgr_get_error_code(ret));
1033 if (VC_RETRY_COUNT == count) {
1034 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request");
1039 SLOG(LOG_DEBUG, TAG_VCM, "[SUCCESS] Set audio type");
1041 vc_mgr_client_set_audio_type(g_vc_m, audio_id);
1045 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1046 SLOG(LOG_DEBUG, TAG_VCM, " ");
1051 int vc_mgr_get_audio_type(char** audio_id)
1053 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Get audio type");
1055 if (NULL == audio_id) {
1056 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Input parameter is NULL");
1057 return VC_ERROR_INVALID_PARAMETER;
1061 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
1062 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1063 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1064 SLOG(LOG_DEBUG, TAG_VCM, " ");
1065 return VC_ERROR_INVALID_STATE;
1069 if (state != VC_STATE_READY) {
1070 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: Current state is not 'READY'");
1071 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1072 SLOG(LOG_DEBUG, TAG_VCM, " ");
1073 return VC_ERROR_INVALID_STATE;
1076 /* Check service state */
1077 vc_service_state_e service_state = -1;
1078 vc_mgr_client_get_service_state(g_vc_m, &service_state);
1079 if (service_state != VC_SERVICE_STATE_READY) {
1080 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: service state is not 'READY'");
1081 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1082 SLOG(LOG_DEBUG, TAG_VCM, " ");
1083 return VC_ERROR_INVALID_STATE;
1088 vc_mgr_client_get_audio_type(g_vc_m, &temp);
1091 /* Not initiallized */
1095 ret = vc_mgr_dbus_request_get_audio_type(g_vc_m->handle, &temp);
1097 if (VC_ERROR_TIMED_OUT != ret) {
1098 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get audio type : %s", __vc_mgr_get_error_code(ret));
1101 SLOG(LOG_WARN, TAG_VCM, "[WARNING] retry to get audio type : %s", __vc_mgr_get_error_code(ret));
1104 if (VC_RETRY_COUNT == count) {
1105 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request");
1110 SLOG(LOG_DEBUG, TAG_VCM, "[SUCCESS] Get audio type : %s", temp);
1112 vc_mgr_client_set_audio_type(g_vc_m, temp);
1118 *audio_id = strdup(temp);
1126 int vc_mgr_get_current_commands(vc_cmd_list_h* vc_cmd_list)
1128 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Foreach current commands");
1131 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
1132 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1133 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1134 SLOG(LOG_DEBUG, TAG_VCM, " ");
1135 return VC_ERROR_INVALID_STATE;
1139 if (state != VC_STATE_READY) {
1140 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: Current state is not 'READY'");
1141 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1142 SLOG(LOG_DEBUG, TAG_VCM, " ");
1143 return VC_ERROR_INVALID_STATE;
1146 /* Check service state */
1147 vc_service_state_e service_state = -1;
1148 vc_mgr_client_get_service_state(g_vc_m, &service_state);
1149 if (service_state != VC_SERVICE_STATE_READY) {
1150 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: service state is not 'READY'");
1151 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1152 SLOG(LOG_DEBUG, TAG_VCM, " ");
1153 return VC_ERROR_INVALID_STATE;
1156 if (NULL == vc_cmd_list) {
1157 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid Parameter");
1158 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1159 SLOG(LOG_DEBUG, TAG_VCM, " ");
1160 return VC_ERROR_INVALID_PARAMETER;
1163 vc_cmd_list_h temp_list = NULL;
1164 if (0 != vc_cmd_list_create(&temp_list)) {
1165 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to create list");
1166 return VC_ERROR_INVALID_PARAMETER;
1169 *vc_cmd_list = temp_list;
1176 /* Get foreground pid */
1177 if (0 != vc_mgr_client_get_foreground(g_vc_m, &fg_pid)) {
1178 /* There is no foreground app for voice control */
1179 SLOG(LOG_WARN, TAG_VCM, "[Manager WARNING] No foreground pid for voice control");
1181 SLOG(LOG_DEBUG, TAG_VCM, "[Manager] Foreground pid(%d)", fg_pid);
1184 if (0 != vc_mgr_client_get_pid(g_vc_m, &mgr_pid)) {
1185 SLOG(LOG_DEBUG, TAG_VCM, "[Manager] Fail to get manager pid");
1186 return VC_ERROR_OPERATION_FAILED;
1188 SLOG(LOG_DEBUG, TAG_VCM, "[Manager] Manager pid(%d)", mgr_pid);
1191 /* Get system command */
1192 ret = vc_cmd_parser_append_commands(mgr_pid, VC_COMMAND_TYPE_SYSTEM, temp_list);
1194 SLOG(LOG_DEBUG, TAG_VCM, "[Manager] No system commands");
1201 ret = vc_mgr_dbus_request_set_client_info(g_vc_m->handle);
1203 if (VC_ERROR_TIMED_OUT != ret) {
1204 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to set client info : %s", __vc_mgr_get_error_code(ret));
1207 SLOG(LOG_WARN, TAG_VCM, "[WARNING] retry to set client info : %s", __vc_mgr_get_error_code(ret));
1210 if (VC_RETRY_COUNT == count) {
1211 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request");
1216 SLOG(LOG_DEBUG, TAG_VCM, "[SUCCESS] Set client info");
1220 GSList *iter = NULL;
1221 GSList* client_info_list = NULL;
1222 vc_client_info_s *client_info = NULL;
1223 bool is_fgpid = false;
1225 if (0 != vc_info_parser_get_client_info(&client_info_list)) {
1226 SLOG(LOG_DEBUG, TAG_VCM, "[DEBUG] No client");
1230 if (VC_NO_FOREGROUND_PID != fg_pid) {
1231 iter = g_slist_nth(client_info_list, 0);
1232 while (NULL != iter) {
1233 client_info = iter->data;
1234 if (NULL != client_info) {
1235 if (fg_pid == client_info->pid) {
1240 iter = g_slist_next(iter);
1244 /* Get foreground commands and widget */
1245 if (true == is_fgpid) {
1247 SLOG(LOG_DEBUG, TAG_VCM, "[Manager] fore cmd(%d)", client_info->fg_cmd);
1249 /* Get foreground command */
1250 if (true == client_info->fg_cmd) {
1251 ret = vc_cmd_parser_append_commands(fg_pid, VC_COMMAND_TYPE_FOREGROUND, temp_list);
1253 SLOG(LOG_ERROR, TAG_VCM, "[Client Data ERROR] Fail to get the fg command list");
1256 SLOG(LOG_DEBUG, TAG_VCM, "[Manager] No foreground commands");
1259 /* Check exclusive option */
1260 if (true == client_info->exclusive_cmd) {
1261 SLOG(LOG_DEBUG, TAG_VCM, "[Manager] Exclusive command is ON");
1263 /* Set background command for exclusive option */
1264 if (true == client_info->bg_cmd) {
1265 SLOG(LOG_DEBUG, TAG_VCM, "[Manager] Set background command");
1266 ret = vc_cmd_parser_append_commands(client_info->pid, VC_COMMAND_TYPE_BACKGROUND, temp_list);
1268 SLOG(LOG_ERROR, TAG_VCM, "[Client Data ERROR] Fail to get the bg command list : pid(%d)", client_info->pid);
1272 /* need to release client info */
1273 iter = g_slist_nth(client_info_list, 0);
1275 while (NULL != iter) {
1276 client_info = iter->data;
1277 if (NULL != client_info) {
1280 client_info_list = g_slist_remove_link(client_info_list, iter);
1281 iter = g_slist_nth(client_info_list, 0);
1284 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1285 SLOG(LOG_DEBUG, TAG_VCM, " ");
1290 SLOG(LOG_DEBUG, TAG_VCM, "[Manager] No foreground app");
1293 /* Get background commands */
1294 if (0 < g_slist_length(client_info_list)) {
1295 iter = g_slist_nth(client_info_list, 0);
1297 while (NULL != iter) {
1298 client_info = iter->data;
1300 if (NULL != client_info) {
1301 SLOG(LOG_DEBUG, TAG_VCM, "[Manager] Pid(%d) Back cmd(%d)", client_info->pid, client_info->bg_cmd);
1302 if (true == client_info->bg_cmd) {
1303 ret = vc_cmd_parser_append_commands(client_info->pid, VC_COMMAND_TYPE_BACKGROUND, temp_list);
1305 SLOG(LOG_ERROR, TAG_VCM, "[Client Data ERROR] Fail to get the bg command list : pid(%d)", client_info->pid);
1310 client_info_list = g_slist_remove_link(client_info_list, iter);
1312 iter = g_slist_nth(client_info_list, 0);
1316 SLOG(LOG_DEBUG, TAG_VCM, "[Manager] No background commands");
1319 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1320 SLOG(LOG_DEBUG, TAG_VCM, " ");
1325 int vc_mgr_set_recognition_mode(vc_recognition_mode_e mode)
1327 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Set recognition mode = %d", mode);
1330 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
1331 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1332 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1333 SLOG(LOG_DEBUG, TAG_VCM, " ");
1334 return VC_ERROR_INVALID_STATE;
1338 if (state != VC_STATE_READY) {
1339 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: Current state is not 'READY'");
1340 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1341 SLOG(LOG_DEBUG, TAG_VCM, " ");
1342 return VC_ERROR_INVALID_STATE;
1345 /* Check service state */
1346 vc_service_state_e service_state = -1;
1347 vc_mgr_client_get_service_state(g_vc_m, &service_state);
1348 if (service_state != VC_SERVICE_STATE_READY) {
1349 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: service state is not 'READY'");
1350 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1351 SLOG(LOG_DEBUG, TAG_VCM, " ");
1352 return VC_ERROR_INVALID_STATE;
1355 vc_mgr_client_set_recognition_mode(g_vc_m, mode);
1359 int vc_mgr_get_recognition_mode(vc_recognition_mode_e* mode)
1363 ret = vc_mgr_client_get_recognition_mode(g_vc_m, mode);
1365 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get recognition mode");
1369 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Get recognition mode = %d", *mode);
1373 int vc_mgr_set_private_data(const char* key, const char* data)
1375 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Set private data");
1378 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid parameter");
1379 return VC_ERROR_INVALID_PARAMETER;
1383 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
1384 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1385 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1386 SLOG(LOG_DEBUG, TAG_VCM, " ");
1387 return VC_ERROR_INVALID_STATE;
1391 if (state != VC_STATE_READY) {
1392 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: Current state is not 'READY'");
1393 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1394 SLOG(LOG_DEBUG, TAG_VCM, " ");
1395 return VC_ERROR_INVALID_STATE;
1398 /* Check service state */
1399 vc_service_state_e service_state = -1;
1400 vc_mgr_client_get_service_state(g_vc_m, &service_state);
1401 if (service_state != VC_SERVICE_STATE_READY) {
1402 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: service state is not 'READY'");
1403 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1404 SLOG(LOG_DEBUG, TAG_VCM, " ");
1405 return VC_ERROR_INVALID_STATE;
1411 ret = vc_mgr_dbus_request_set_private_data(g_vc_m->handle, key, data);
1413 if (VC_ERROR_TIMED_OUT != ret) {
1414 SLOG(LOG_DEBUG, TAG_VCM, "[ERROR] Fail to set private data request : %s", __vc_mgr_get_error_code(ret));
1417 SLOG(LOG_WARN, TAG_VCM, "[WARNING] retry set private data request : %s", __vc_mgr_get_error_code(ret));
1420 if (VC_RETRY_COUNT == count) {
1421 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request");
1426 SLOG(LOG_DEBUG, TAG_VCM, "[SUCCESS] Set domain");
1429 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1430 SLOG(LOG_DEBUG, TAG_VCM, " ");
1435 int vc_mgr_get_private_data(const char* key, char** data)
1437 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Get private data");
1439 if (NULL == key || NULL == data) {
1440 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid parameter");
1441 return VC_ERROR_INVALID_PARAMETER;
1445 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
1446 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1447 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1448 SLOG(LOG_DEBUG, TAG_VCM, " ");
1449 return VC_ERROR_INVALID_STATE;
1453 if (state != VC_STATE_READY) {
1454 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: Current state is not 'READY'");
1455 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1456 SLOG(LOG_DEBUG, TAG_VCM, " ");
1457 return VC_ERROR_INVALID_STATE;
1460 /* Check service state */
1461 vc_service_state_e service_state = -1;
1462 vc_mgr_client_get_service_state(g_vc_m, &service_state);
1463 if (service_state != VC_SERVICE_STATE_READY) {
1464 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: service state is not 'READY'");
1465 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1466 SLOG(LOG_DEBUG, TAG_VCM, " ");
1467 return VC_ERROR_INVALID_STATE;
1475 ret = vc_mgr_dbus_request_get_private_data(g_vc_m->handle, key, &temp);
1477 if (VC_ERROR_TIMED_OUT != ret) {
1478 SLOG(LOG_DEBUG, TAG_VCM, "[ERROR] Fail to get private data request : %s", __vc_mgr_get_error_code(ret));
1481 SLOG(LOG_WARN, TAG_VCM, "[WARNING] retry get private data request : %s", __vc_mgr_get_error_code(ret));
1484 if (VC_RETRY_COUNT == count) {
1485 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request");
1490 SLOG(LOG_DEBUG, TAG_VCM, "[SUCCESS] Get private data, key(%s), data(%s)", key, temp);
1495 *data = strdup(temp);
1500 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1501 SLOG(LOG_DEBUG, TAG_VCM, " ");
1506 int vc_mgr_set_domain(const char* domain)
1508 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Set domain");
1510 if (NULL == domain) {
1511 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid parameter");
1512 return VC_ERROR_INVALID_PARAMETER;
1516 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
1517 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1518 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1519 SLOG(LOG_DEBUG, TAG_VCM, " ");
1520 return VC_ERROR_INVALID_STATE;
1524 if (state != VC_STATE_READY) {
1525 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: Current state is not 'READY'");
1526 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1527 SLOG(LOG_DEBUG, TAG_VCM, " ");
1528 return VC_ERROR_INVALID_STATE;
1531 /* Check service state */
1532 vc_service_state_e service_state = -1;
1533 vc_mgr_client_get_service_state(g_vc_m, &service_state);
1534 if (service_state != VC_SERVICE_STATE_READY) {
1535 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: service state is not 'READY'");
1536 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1537 SLOG(LOG_DEBUG, TAG_VCM, " ");
1538 return VC_ERROR_INVALID_STATE;
1544 ret = vc_mgr_dbus_request_set_domain(g_vc_m->handle, domain);
1546 if (VC_ERROR_TIMED_OUT != ret) {
1547 SLOG(LOG_DEBUG, TAG_VCM, "[ERROR] Fail to set domain request : %s", __vc_mgr_get_error_code(ret));
1550 SLOG(LOG_WARN, TAG_VCM, "[WARNING] retry set domain request : %s", __vc_mgr_get_error_code(ret));
1553 if (VC_RETRY_COUNT == count) {
1554 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request");
1559 SLOG(LOG_DEBUG, TAG_VCM, "[SUCCESS] Set domain");
1562 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1563 SLOG(LOG_DEBUG, TAG_VCM, " ");
1568 int vc_mgr_do_action(vc_send_event_type_e type, char* send_event)
1570 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] do action");
1572 if (NULL == send_event) {
1573 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid parameter");
1574 return VC_ERROR_INVALID_PARAMETER;
1578 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
1579 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1580 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1581 SLOG(LOG_DEBUG, TAG_VCM, " ");
1582 return VC_ERROR_INVALID_STATE;
1586 if (state != VC_STATE_READY) {
1587 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: Current state is not 'READY'");
1588 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1589 SLOG(LOG_DEBUG, TAG_VCM, " ");
1590 return VC_ERROR_INVALID_STATE;
1593 /* Check service state */
1594 vc_service_state_e service_state = -1;
1595 vc_mgr_client_get_service_state(g_vc_m, &service_state);
1596 if (service_state != VC_SERVICE_STATE_READY) {
1597 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: service state is not 'READY'");
1598 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1599 SLOG(LOG_DEBUG, TAG_VCM, " ");
1600 return VC_ERROR_INVALID_STATE;
1606 ret = vc_mgr_dbus_request_do_action(g_vc_m->handle, type, send_event);
1608 if (VC_ERROR_TIMED_OUT != ret) {
1609 SLOG(LOG_DEBUG, TAG_VCM, "[ERROR] Fail to do action request : %s", __vc_mgr_get_error_code(ret));
1612 SLOG(LOG_WARN, TAG_VCM, "[WARNING] retry do action request : %s", __vc_mgr_get_error_code(ret));
1615 if (VC_RETRY_COUNT == count) {
1616 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request");
1621 SLOG(LOG_DEBUG, TAG_VCM, "[SUCCESS] do action");
1624 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1625 SLOG(LOG_DEBUG, TAG_VCM, " ");
1630 int vc_mgr_start(bool exclusive_command_option)
1632 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Request start");
1635 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
1636 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1637 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1638 SLOG(LOG_DEBUG, TAG_VCM, " ");
1639 return VC_ERROR_INVALID_STATE;
1643 if (state != VC_STATE_READY) {
1644 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: Current state is not 'READY'");
1645 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1646 SLOG(LOG_DEBUG, TAG_VCM, " ");
1647 return VC_ERROR_INVALID_STATE;
1650 /* Check service state */
1651 vc_service_state_e service_state = -1;
1652 vc_mgr_client_get_service_state(g_vc_m, &service_state);
1653 if (service_state != VC_SERVICE_STATE_READY) {
1654 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: service state is not 'READY'");
1655 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1656 SLOG(LOG_DEBUG, TAG_VCM, " ");
1657 return VC_ERROR_INVALID_STATE;
1660 /* Check internal state for async */
1661 vc_internal_state_e internal_state = -1;
1662 vc_mgr_client_get_internal_state(g_vc_m, &internal_state);
1663 if (internal_state != VC_INTERNAL_STATE_NONE) {
1664 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invaid State : Internal state is NOT none : %d", internal_state);
1665 return VC_ERROR_IN_PROGRESS_TO_RECORDING;
1668 vc_mgr_client_set_exclusive_command(g_vc_m, exclusive_command_option);
1670 bool start_by_client = false;
1671 if (0 != vc_mgr_client_get_start_by_client(g_vc_m, &start_by_client)) {
1672 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get start by client");
1677 vc_recognition_mode_e recognition_mode = VC_RECOGNITION_MODE_STOP_BY_SILENCE;
1678 if (0 != vc_mgr_get_recognition_mode(&recognition_mode)) {
1679 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get recognition mode");
1686 vc_mgr_client_set_internal_state(g_vc_m, VC_INTERNAL_STATE_STARTING);
1687 ret = vc_mgr_dbus_request_start(g_vc_m->handle, (int)recognition_mode, exclusive_command_option, start_by_client);
1689 if (VC_ERROR_TIMED_OUT != ret) {
1690 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to start request start : %s", __vc_mgr_get_error_code(ret));
1691 vc_mgr_client_set_internal_state(g_vc_m, VC_INTERNAL_STATE_NONE);
1694 SLOG(LOG_WARN, TAG_VCM, "[WARNING] retry start request start : %s", __vc_mgr_get_error_code(ret));
1697 if (VC_RETRY_COUNT == count) {
1698 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request");
1699 vc_mgr_client_set_exclusive_command(g_vc_m, false);
1700 vc_mgr_client_set_internal_state(g_vc_m, VC_INTERNAL_STATE_NONE);
1705 SLOG(LOG_DEBUG, TAG_VCM, "[SUCCESS] start recognition");
1710 g_prev_volume_db = 0;
1711 g_cur_volume_db = 0;
1713 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1714 SLOG(LOG_DEBUG, TAG_VCM, " ");
1721 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Request stop");
1724 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
1725 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1726 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1727 SLOG(LOG_DEBUG, TAG_VCM, " ");
1728 return VC_ERROR_INVALID_STATE;
1732 if (state != VC_STATE_READY) {
1733 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: client state is not 'READY'");
1734 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1735 SLOG(LOG_DEBUG, TAG_VCM, " ");
1736 return VC_ERROR_INVALID_STATE;
1739 /* Check service state */
1740 vc_service_state_e service_state = -1;
1741 vc_mgr_client_get_service_state(g_vc_m, &service_state);
1742 if (service_state != VC_SERVICE_STATE_RECORDING) {
1743 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: service state is not 'RECORDING'");
1744 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1745 SLOG(LOG_DEBUG, TAG_VCM, " ");
1746 return VC_ERROR_INVALID_STATE;
1749 /* Check internal state for async */
1750 vc_internal_state_e internal_state = -1;
1751 vc_mgr_client_get_internal_state(g_vc_m, &internal_state);
1752 if (VC_INTERNAL_STATE_STARTING == internal_state) {
1753 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State : Internal state is STARTING");
1754 return VC_ERROR_IN_PROGRESS_TO_RECORDING;
1755 } else if (VC_INTERNAL_STATE_STOPPING == internal_state) {
1756 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State : Internal state is STOPPING");
1757 return VC_ERROR_IN_PROGRESS_TO_PROCESSING;
1758 } else if (VC_INTERNAL_STATE_CANCELING == internal_state) {
1759 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State : Internal state is CANCELING");
1760 return VC_ERROR_IN_PROGRESS_TO_READY;
1767 vc_mgr_client_set_internal_state(g_vc_m, VC_INTERNAL_STATE_STOPPING);
1768 ret = vc_mgr_dbus_request_stop(g_vc_m->handle);
1770 if (VC_ERROR_TIMED_OUT != ret) {
1771 SLOG(LOG_DEBUG, TAG_VCM, "[ERROR] Fail to stop request : %s", __vc_mgr_get_error_code(ret));
1772 vc_mgr_client_set_internal_state(g_vc_m, VC_INTERNAL_STATE_NONE);
1775 SLOG(LOG_WARN, TAG_VCM, "[WARNING] retry stop request : %s", __vc_mgr_get_error_code(ret));
1778 if (VC_RETRY_COUNT == count) {
1779 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request");
1780 vc_mgr_client_set_internal_state(g_vc_m, VC_INTERNAL_STATE_NONE);
1785 SLOG(LOG_DEBUG, TAG_VCM, "[SUCCESS] Stop recognition");
1789 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1790 SLOG(LOG_DEBUG, TAG_VCM, " ");
1797 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Request cancel");
1800 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
1801 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1802 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1803 SLOG(LOG_DEBUG, TAG_VCM, " ");
1804 return VC_ERROR_INVALID_STATE;
1808 if (state != VC_STATE_READY) {
1809 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: client state is not 'READY'");
1810 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1811 SLOG(LOG_DEBUG, TAG_VCM, " ");
1812 return VC_ERROR_INVALID_STATE;
1815 /* Check service state */
1816 vc_service_state_e service_state = -1;
1817 vc_mgr_client_get_service_state(g_vc_m, &service_state);
1818 if (service_state == VC_SERVICE_STATE_NONE) {
1819 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State");
1820 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1821 SLOG(LOG_DEBUG, TAG_VCM, " ");
1822 return VC_ERROR_INVALID_STATE;
1825 vc_internal_state_e internal_state = -1;
1826 vc_mgr_client_get_internal_state(g_vc_m, &internal_state);
1827 if (VC_INTERNAL_STATE_STARTING == internal_state) {
1828 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State : Internal state is STARTING");
1829 return VC_ERROR_IN_PROGRESS_TO_RECORDING;
1830 } else if (VC_INTERNAL_STATE_STOPPING == internal_state) {
1831 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State : Internal state is STOPPING");
1832 return VC_ERROR_IN_PROGRESS_TO_PROCESSING;
1833 } else if (VC_INTERNAL_STATE_CANCELING == internal_state) {
1834 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State : Internal state is CANCELING");
1835 return VC_ERROR_IN_PROGRESS_TO_READY;
1841 vc_mgr_client_set_internal_state(g_vc_m, VC_INTERNAL_STATE_CANCELING);
1842 ret = vc_mgr_dbus_request_cancel(g_vc_m->handle);
1844 if (VC_ERROR_TIMED_OUT != ret) {
1845 SLOG(LOG_DEBUG, TAG_VCM, "[ERROR] Fail to cancel request : %s", __vc_mgr_get_error_code(ret));
1846 vc_mgr_client_set_internal_state(g_vc_m, VC_INTERNAL_STATE_NONE);
1849 SLOG(LOG_WARN, TAG_VCM, "[WARNING] retry cancel request : %s", __vc_mgr_get_error_code(ret));
1852 if (VC_RETRY_COUNT == count) {
1853 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request");
1854 vc_mgr_client_set_internal_state(g_vc_m, VC_INTERNAL_STATE_NONE);
1859 SLOG(LOG_DEBUG, TAG_VCM, "[SUCCESS] Cancel recognition");
1863 vc_mgr_client_set_exclusive_command(g_vc_m, false);
1865 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1866 SLOG(LOG_DEBUG, TAG_VCM, " ");
1871 static int g_cnt = 0;
1872 static Eina_Bool __vc_mgr_set_volume(void* data)
1875 g_volume_db = g_prev_volume_db + (g_cur_volume_db - g_prev_volume_db) / 5 * g_cnt;
1877 SLOG(LOG_DEBUG, TAG_VCM, "Set volume (%f)(%f)", g_volume_db, g_cur_volume_db);
1879 if (0 == g_cnt % 5) {
1885 int __vc_mgr_cb_set_volume(float volume)
1887 g_prev_volume_db = g_volume_db;
1888 g_cur_volume_db = volume;
1890 g_volume_db = g_prev_volume_db + (g_cur_volume_db - g_prev_volume_db) / 5;
1892 if (NULL != g_m_set_volume_timer) {
1893 ecore_timer_del(g_m_set_volume_timer);
1897 g_m_set_volume_timer = ecore_timer_add(0.05, __vc_mgr_set_volume, NULL);
1902 int vc_mgr_get_recording_volume(float* volume)
1904 if (NULL == volume) {
1905 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Input parameter is NULL");
1906 return VC_ERROR_INVALID_PARAMETER;
1909 vc_service_state_e service_state = -1;
1910 if (0 != vc_mgr_client_get_service_state(g_vc_m, &service_state)) {
1911 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available");
1912 return VC_ERROR_INVALID_STATE;
1916 if (VC_SERVICE_STATE_RECORDING != service_state) {
1917 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: Service state is not 'RECORDING'");
1918 return VC_ERROR_INVALID_STATE;
1921 *volume = g_volume_db;
1926 int __vc_mgr_cb_set_foreground(int pid, bool value)
1928 vc_mgr_client_set_foreground(g_vc_m, pid, value);
1930 /* get authorized valid app */
1932 if (0 != vc_mgr_client_get_valid_authorized_client(g_vc_m, &tmp_pid)) {
1933 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get authorized valid app");
1934 return VC_ERROR_INVALID_PARAMETER;
1937 if (true == value) {
1938 /* compare & set valid */
1939 if (tmp_pid != pid) {
1940 SLOG(LOG_DEBUG, TAG_VCM, "Authority(%d) changed to invalid", tmp_pid);
1942 /* set authorized valid */
1943 if (true == vc_mgr_client_is_authorized_client(g_vc_m, pid)) {
1944 SLOG(LOG_DEBUG, TAG_VCM, "Authority(%d) change to valid", pid);
1945 vc_mgr_client_set_valid_authorized_client(g_vc_m, pid);
1947 SLOG(LOG_DEBUG, TAG_VCM, "No valid Authority");
1948 vc_mgr_client_set_valid_authorized_client(g_vc_m, -1);
1952 if (tmp_pid == pid) {
1953 SLOG(LOG_DEBUG, TAG_VCM, "Authority(%d) changed to invalid", tmp_pid);
1954 vc_mgr_client_set_valid_authorized_client(g_vc_m, -1);
1961 int vc_mgr_set_selected_results(vc_cmd_list_h vc_cmd_list)
1963 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Select result");
1965 /* Do not check state for 'restart continusly' mode */
1967 vc_service_state_e service_state = -1;
1968 vc_mgr_client_get_service_state(g_vc_m, &service_state);
1969 if (service_state != VC_SERVICE_STATE_PROCESSING) {
1970 vc_recognition_mode_e recognition_mode;
1971 vc_mgr_get_recognition_mode(&recognition_mode);
1973 if (VC_RECOGNITION_MODE_RESTART_CONTINUOUSLY != recognition_mode) {
1974 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: service state is not 'PROCESSING' and mode is not 'Restart continously'");
1975 SLOG(LOG_DEBUG, TAG_VCM, "=====");
1976 SLOG(LOG_DEBUG, TAG_VCM, " ");
1977 return VC_ERROR_INVALID_STATE;
1981 if (NULL != vc_cmd_list) {
1983 char* result_text = NULL;
1985 vc_mgr_client_get_all_result(g_vc_m, &event, &result_text);
1987 vc_info_parser_set_result(result_text, event, NULL, vc_cmd_list, false);
1989 if (NULL != result_text) {
2002 ret = vc_mgr_dbus_send_result_selection(g_vc_m->handle);
2004 if (VC_ERROR_TIMED_OUT != ret) {
2005 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to send result selection : %s", __vc_mgr_get_error_code(ret));
2008 SLOG(LOG_WARN, TAG_VCM, "[WARNING] retry send result selection : %s", __vc_mgr_get_error_code(ret));
2011 if (VC_RETRY_COUNT == count) {
2012 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request");
2017 SLOG(LOG_DEBUG, TAG_VCM, "[SUCCESS] result selection");
2021 vc_mgr_client_unset_all_result(g_vc_m);
2023 SLOG(LOG_DEBUG, TAG_VCM, "=====");
2024 SLOG(LOG_DEBUG, TAG_VCM, " ");
2029 static Eina_Bool __vc_mgr_set_select_result(void *data)
2031 vc_mgr_set_selected_results(NULL);
2035 static void __vc_mgr_notify_all_result(vc_result_type_e result_type)
2037 char* temp_text = NULL;
2039 char* temp_message = NULL;
2040 vc_cmd_list_h vc_cmd_list = NULL;
2042 vc_mgr_all_result_cb all_callback = NULL;
2043 void* all_user_data = NULL;
2045 vc_mgr_client_get_all_result_cb(g_vc_m, &all_callback, &all_user_data);
2046 if (NULL == all_callback) {
2047 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] All result callback is NULL");
2051 if (0 != vc_cmd_list_create(&vc_cmd_list)) {
2052 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to create command list");
2056 vc_info_parser_get_result(&temp_text, &event, &temp_message, -1, vc_cmd_list, vc_mgr_client_get_exclusive_command(g_vc_m));
2058 SLOG(LOG_INFO, TAG_VCM, "Result info : result type(%d) result text(%s) event(%d) result_message(%s)",
2059 result_type, temp_text, event, temp_message);
2061 vc_cmd_print_list(vc_cmd_list);
2065 vc_mgr_client_set_all_result(g_vc_m, event, temp_text);
2067 vc_mgr_client_use_callback(g_vc_m);
2068 cb_ret = all_callback(event, vc_cmd_list, temp_text, temp_message, all_user_data);
2069 vc_mgr_client_not_use_callback(g_vc_m);
2071 if (true == vc_mgr_client_get_exclusive_command(g_vc_m)) {
2073 vc_result_cb callback = NULL;
2074 void* user_data = NULL;
2076 vc_mgr_client_get_result_cb(g_vc_m, &callback, &user_data);
2077 if (NULL == callback) {
2078 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Client result callback is NULL");
2082 vc_mgr_client_use_callback(g_vc_m);
2083 callback(event, vc_cmd_list, temp_text, user_data);
2084 vc_mgr_client_not_use_callback(g_vc_m);
2085 SLOG(LOG_DEBUG, TAG_VCM, "Exclusive result callback called");
2087 /* Release result */
2088 if (NULL != temp_text) free(temp_text);
2091 vc_cmd_list_destroy(vc_cmd_list, true);
2093 vc_mgr_client_set_exclusive_command(g_vc_m, false);
2099 vc_cmd_list_get_count(vc_cmd_list, &count);
2101 if (true == cb_ret) {
2102 SLOG(LOG_DEBUG, TAG_VCM, "Callback result is true");
2103 if (VC_RESULT_TYPE_NOTIFICATION != result_type)
2104 ecore_idler_add(__vc_mgr_set_select_result, NULL);
2106 SLOG(LOG_DEBUG, TAG_VCM, "Callback result is false");
2107 /* need to select conflicted result */
2110 if (VC_RESULT_TYPE_NOTIFICATION != result_type)
2111 ecore_idler_add(__vc_mgr_set_select_result, NULL);
2113 vc_mgr_client_set_exclusive_command(g_vc_m, false);
2114 vc_mgr_client_unset_all_result(g_vc_m);
2117 /* Release result */
2118 if (NULL != temp_text) {
2124 vc_cmd_list_destroy(vc_cmd_list, true);
2129 static Eina_Bool __vc_mgr_notify_result(void *data)
2131 char* temp_text = NULL;
2133 vc_cmd_list_h vc_cmd_list = NULL;
2135 vc_result_cb callback = NULL;
2136 void* user_data = NULL;
2138 vc_mgr_client_get_result_cb(g_vc_m, &callback, &user_data);
2139 if (NULL == callback) {
2140 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Client result callback is NULL");
2144 if (0 != vc_cmd_list_create(&vc_cmd_list)) {
2145 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to create command list");
2149 vc_info_parser_get_result(&temp_text, &event, NULL, getpid(), vc_cmd_list, false);
2151 SLOG(LOG_INFO, TAG_VCM, "Result : result text(%s) event(%d)", temp_text, event);
2153 vc_cmd_print_list(vc_cmd_list);
2155 vc_mgr_client_use_callback(g_vc_m);
2156 callback(event, vc_cmd_list, temp_text, user_data);
2157 vc_mgr_client_not_use_callback(g_vc_m);
2158 SLOG(LOG_INFO, TAG_VCM, "Result callback called");
2160 vc_cmd_list_destroy(vc_cmd_list, true);
2162 /* Release result */
2163 if (NULL != temp_text) free(temp_text);
2168 void __vc_mgr_cb_all_result(vc_result_type_e type)
2170 if (false == vc_mgr_client_get_exclusive_command(g_vc_m)) {
2171 __vc_mgr_notify_all_result(type);
2173 __vc_mgr_notify_result(0);
2179 void __vc_mgr_cb_pre_result(vc_pre_result_event_e event, const char* pre_result)
2181 vc_mgr_pre_result_cb callback = NULL;
2182 void* user_data = NULL;
2184 vc_mgr_client_get_pre_result_cb(g_vc_m, &callback, &user_data);
2185 if (NULL == callback) {
2186 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Client pre result callback is NULL");
2190 vc_mgr_client_use_callback(g_vc_m);
2191 callback(event, pre_result, user_data);
2192 vc_mgr_client_not_use_callback(g_vc_m);
2193 SLOG(LOG_DEBUG, TAG_VCM, "Pre result callback is called");
2198 void __vc_mgr_cb_system_result()
2200 __vc_mgr_notify_result(NULL);
2204 static Eina_Bool __vc_mgr_speech_detected(void *data)
2206 vc_mgr_begin_speech_detected_cb callback = NULL;
2207 void* user_data = NULL;
2209 vc_mgr_client_get_speech_detected_cb(g_vc_m, &callback, &user_data);
2210 if (NULL == callback) {
2211 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Client speech detected callback is NULL");
2215 vc_mgr_client_use_callback(g_vc_m);
2216 callback(user_data);
2217 vc_mgr_client_not_use_callback(g_vc_m);
2218 SLOG(LOG_DEBUG, TAG_VCM, "Speech detected callback called");
2223 void __vc_mgr_cb_speech_detected()
2225 __vc_mgr_speech_detected(NULL);
2230 int vc_mgr_set_all_result_cb(vc_mgr_all_result_cb callback, void* user_data)
2232 if (NULL == callback)
2233 return VC_ERROR_INVALID_PARAMETER;
2236 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
2237 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set result callback : A handle is not available");
2238 return VC_ERROR_INVALID_STATE;
2242 if (state != VC_STATE_INITIALIZED) {
2243 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set result callback : Current state is not 'Initialized'");
2244 return VC_ERROR_INVALID_STATE;
2247 vc_mgr_client_set_all_result_cb(g_vc_m, callback, user_data);
2249 SLOG(LOG_DEBUG, TAG_VCM, "[SUCCESS] Set all result callback");
2254 int vc_mgr_unset_all_result_cb()
2257 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
2258 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset result callback : A handle is not available");
2259 return VC_ERROR_INVALID_STATE;
2263 if (state != VC_STATE_INITIALIZED) {
2264 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset result callback : Current state is not 'Initialized'");
2265 return VC_ERROR_INVALID_STATE;
2268 vc_mgr_client_set_all_result_cb(g_vc_m, NULL, NULL);
2273 int vc_mgr_set_result_cb(vc_result_cb callback, void* user_data)
2275 if (NULL == callback)
2276 return VC_ERROR_INVALID_PARAMETER;
2279 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
2280 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set result callback : A handle is not available");
2281 return VC_ERROR_INVALID_STATE;
2285 if (state != VC_STATE_INITIALIZED) {
2286 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set result callback : Current state is not 'Initialized'");
2287 return VC_ERROR_INVALID_STATE;
2290 vc_mgr_client_set_result_cb(g_vc_m, callback, user_data);
2295 int vc_mgr_unset_result_cb()
2298 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
2299 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset result callback : A handle is not available");
2300 return VC_ERROR_INVALID_STATE;
2304 if (state != VC_STATE_INITIALIZED) {
2305 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset result callback : Current state is not 'Initialized'");
2306 return VC_ERROR_INVALID_STATE;
2309 vc_mgr_client_set_result_cb(g_vc_m, NULL, NULL);
2314 int vc_mgr_set_pre_result_cb(vc_mgr_pre_result_cb callback, void* user_data)
2316 if (NULL == callback)
2317 return VC_ERROR_INVALID_PARAMETER;
2320 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
2321 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set pre result callback : A handle is not available");
2322 return VC_ERROR_INVALID_STATE;
2326 if (state != VC_STATE_INITIALIZED) {
2327 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set pre result callback : Current state is not 'Initialized'");
2328 return VC_ERROR_INVALID_STATE;
2331 vc_mgr_client_set_pre_result_cb(g_vc_m, callback, user_data);
2336 int vc_mgr_unset_pre_result_cb()
2339 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
2340 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset pre result callback : A handle is not available");
2341 return VC_ERROR_INVALID_STATE;
2345 if (state != VC_STATE_INITIALIZED) {
2346 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset pre result callback : Current state is not 'Initialize'");
2347 return VC_ERROR_INVALID_STATE;
2350 vc_mgr_client_set_pre_result_cb(g_vc_m, NULL, NULL);
2355 int vc_mgr_get_error_message(char** err_msg)
2357 SLOG(LOG_DEBUG, TAG_VCM, "===== [Manager] Get error message");
2359 if (NULL == err_msg) {
2360 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] invalid parameter");
2361 return VC_ERROR_INVALID_PARAMETER;
2364 if (false == g_err_callback_status) {
2365 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Not in error callback");
2366 return VC_ERROR_OPERATION_FAILED;
2370 ret = vc_mgr_client_get_error_message(g_vc_m, err_msg);
2372 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get error message");
2375 SLOG(LOG_DEBUG, TAG_VCM, "=====");
2376 SLOG(LOG_DEBUG, TAG_VCM, " ");
2381 static Eina_Bool __vc_mgr_notify_error(void *data)
2383 vc_h vc_m = (vc_h)data;
2385 vc_error_cb callback = NULL;
2386 void* user_data = NULL;
2389 vc_mgr_client_get_error_cb(vc_m, &callback, &user_data);
2390 vc_mgr_client_get_error(vc_m, &reason);
2392 if (NULL != callback) {
2393 vc_mgr_client_use_callback(vc_m);
2394 g_err_callback_status = true;
2395 callback(reason, user_data);
2396 g_err_callback_status = false;
2397 vc_mgr_client_not_use_callback(vc_m);
2398 SLOG(LOG_DEBUG, TAG_VCM, "Error callback is called");
2400 SLOG(LOG_WARN, TAG_VCM, "[WARNING] Error callback is null");
2406 int __vc_mgr_cb_error(int reason, int daemon_pid, char* msg)
2409 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
2410 SLOG(LOG_ERROR, TAG_VCM, "[WARNING] Invalid client");
2415 if (state != VC_STATE_READY) {
2416 SLOG(LOG_ERROR, TAG_VCM, "[WARNING] not connected client yet");
2420 vc_mgr_client_set_internal_state(g_vc_m, VC_INTERNAL_STATE_NONE);
2422 if (VC_ERROR_SERVICE_RESET == reason) {
2423 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] VC daemon reset");
2425 vc_mgr_client_set_client_state(g_vc_m, VC_STATE_INITIALIZED);
2426 __vc_mgr_notify_state_changed(g_vc_m);
2428 if (0 != vc_mgr_prepare()) {
2429 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to prepare");
2433 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Error reason(%d), msg(%s)", reason, msg);
2435 vc_mgr_client_set_error(g_vc_m, reason);
2436 vc_mgr_client_set_error_message(g_vc_m, msg);
2437 __vc_mgr_notify_error(g_vc_m);
2442 static Eina_Bool __vc_mgr_notify_state_changed(void *data)
2444 vc_state_changed_cb changed_callback = NULL;
2447 vc_mgr_client_get_state_changed_cb(g_vc_m, &changed_callback, &user_data);
2449 vc_state_e current_state;
2450 vc_state_e before_state;
2452 vc_mgr_client_get_before_state(g_vc_m, ¤t_state, &before_state);
2454 if (NULL != changed_callback) {
2455 vc_mgr_client_use_callback(g_vc_m);
2456 changed_callback(before_state, current_state, user_data);
2457 vc_mgr_client_not_use_callback(g_vc_m);
2458 SLOG(LOG_DEBUG, TAG_VCM, "State changed callback is called");
2460 SLOG(LOG_WARN, TAG_VCM, "[WARNING] State changed callback is null");
2466 int vc_mgr_set_state_changed_cb(vc_state_changed_cb callback, void* user_data)
2468 if (callback == NULL)
2469 return VC_ERROR_INVALID_PARAMETER;
2472 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
2473 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set state changed callback : A handle is not available");
2474 return VC_ERROR_INVALID_STATE;
2478 if (state != VC_STATE_INITIALIZED) {
2479 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set state changed callback : Current state is not 'Initialized'");
2480 return VC_ERROR_INVALID_STATE;
2483 vc_mgr_client_set_state_changed_cb(g_vc_m, callback, user_data);
2485 SLOG(LOG_DEBUG, TAG_VCM, "[SUCCESS] Set state changed callback");
2489 int vc_mgr_unset_state_changed_cb()
2492 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
2493 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset state changed callback : A handle is not available");
2494 return VC_ERROR_INVALID_STATE;
2498 if (state != VC_STATE_INITIALIZED) {
2499 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset state changed callback : Current state is not 'Initialized'");
2500 return VC_ERROR_INVALID_STATE;
2503 vc_mgr_client_set_state_changed_cb(g_vc_m, NULL, NULL);
2508 int __vc_mgr_cb_service_state(int state)
2510 vc_service_state_e current_state = (vc_service_state_e)state;
2511 vc_service_state_e before_state;
2512 vc_mgr_client_get_service_state(g_vc_m, &before_state);
2514 SLOG(LOG_DEBUG, TAG_VCM, "Service State changed : Before(%d) Current(%d)",
2515 before_state, current_state);
2517 vc_internal_state_e internal_state = -1;
2518 vc_mgr_client_get_internal_state(g_vc_m, &internal_state);
2519 if ((VC_INTERNAL_STATE_STARTING == internal_state && VC_SERVICE_STATE_RECORDING == current_state) ||
2520 (VC_INTERNAL_STATE_STOPPING == internal_state && VC_SERVICE_STATE_PROCESSING == current_state) ||
2521 (VC_INTERNAL_STATE_CANCELING == internal_state && VC_SERVICE_STATE_READY == current_state)) {
2522 SLOG(LOG_DEBUG, TAG_VCM, "Internal state is changed to NONE");
2523 vc_mgr_client_set_internal_state(g_vc_m, VC_INTERNAL_STATE_NONE);
2526 if (current_state == before_state) {
2527 SLOG(LOG_WARN, TAG_VCM, "Service State NOT changed : Before(%d) Current(%d)",
2528 before_state, current_state);
2532 /* Save service state */
2533 vc_mgr_client_set_service_state(g_vc_m, current_state);
2535 vc_service_state_changed_cb callback = NULL;
2536 void* service_user_data = NULL;
2537 vc_mgr_client_get_service_state_changed_cb(g_vc_m, &callback, &service_user_data);
2539 if (NULL != callback) {
2540 vc_mgr_client_use_callback(g_vc_m);
2541 callback(before_state, current_state, service_user_data);
2542 vc_mgr_client_not_use_callback(g_vc_m);
2543 SLOG(LOG_DEBUG, TAG_VCM, "Service state changed callback is called");
2545 SLOG(LOG_WARN, TAG_VCM, "[WARNING] Service state changed callback is null");
2551 int vc_mgr_set_service_state_changed_cb(vc_service_state_changed_cb callback, void* user_data)
2553 if (callback == NULL)
2554 return VC_ERROR_INVALID_PARAMETER;
2557 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
2558 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set state changed callback : A handle is not available");
2559 return VC_ERROR_INVALID_STATE;
2563 if (state != VC_STATE_INITIALIZED) {
2564 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set state changed callback : Current state is not 'Initialized'");
2565 return VC_ERROR_INVALID_STATE;
2568 vc_mgr_client_set_service_state_changed_cb(g_vc_m, callback, user_data);
2570 SLOG(LOG_DEBUG, TAG_VCM, "[SUCCESS] Set sevice state changed callback");
2574 int vc_mgr_unset_service_state_changed_cb()
2577 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
2578 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset state changed callback : A handle is not available");
2579 return VC_ERROR_INVALID_STATE;
2583 if (state != VC_STATE_INITIALIZED) {
2584 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset state changed callback : Current state is not 'Initialized'");
2585 return VC_ERROR_INVALID_STATE;
2588 vc_mgr_client_set_service_state_changed_cb(g_vc_m, NULL, NULL);
2592 int vc_mgr_set_speech_detected_cb(vc_mgr_begin_speech_detected_cb callback, void* user_data)
2594 if (callback == NULL)
2595 return VC_ERROR_INVALID_PARAMETER;
2598 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
2599 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set state changed callback : A handle is not available");
2600 return VC_ERROR_INVALID_STATE;
2604 if (state != VC_STATE_INITIALIZED) {
2605 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set speech detected callback : Current state is not 'Initialized'");
2606 return VC_ERROR_INVALID_STATE;
2609 vc_mgr_client_set_speech_detected_cb(g_vc_m, callback, user_data);
2611 SLOG(LOG_DEBUG, TAG_VCM, "[SUCCESS] Set speech detected callback");
2615 int vc_mgr_unset_speech_detected_cb()
2618 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
2619 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset state changed callback : A handle is not available");
2620 return VC_ERROR_INVALID_STATE;
2624 if (state != VC_STATE_INITIALIZED) {
2625 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset state changed callback : Current state is not 'Initialized'");
2626 return VC_ERROR_INVALID_STATE;
2629 vc_mgr_client_set_speech_detected_cb(g_vc_m, NULL, NULL);
2633 int vc_mgr_set_current_language_changed_cb(vc_current_language_changed_cb callback, void* user_data)
2635 if (NULL == callback)
2636 return VC_ERROR_INVALID_PARAMETER;
2639 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
2640 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set current language changed : A handle is not available");
2641 return VC_ERROR_INVALID_STATE;
2645 if (state != VC_STATE_INITIALIZED) {
2646 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set current language changed : Current state is not 'Initialized'");
2647 return VC_ERROR_INVALID_STATE;
2650 vc_mgr_client_set_current_lang_changed_cb(g_vc_m, callback, user_data);
2652 SLOG(LOG_DEBUG, TAG_VCM, "[SUCCESS] Set current language changed callback");
2656 int vc_mgr_unset_current_language_changed_cb()
2659 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
2660 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset current language changed : A handle is not available");
2661 return VC_ERROR_INVALID_STATE;
2665 if (state != VC_STATE_INITIALIZED) {
2666 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset current language changed : Current state is not 'Initialized'");
2667 return VC_ERROR_INVALID_STATE;
2670 vc_mgr_client_set_current_lang_changed_cb(g_vc_m, NULL, NULL);
2675 int vc_mgr_set_error_cb(vc_error_cb callback, void* user_data)
2677 if (NULL == callback)
2678 return VC_ERROR_INVALID_PARAMETER;
2681 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
2682 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set error callback : A handle is not available");
2683 return VC_ERROR_INVALID_STATE;
2687 if (state != VC_STATE_INITIALIZED) {
2688 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set error callback : Current state is not 'Initialized'");
2689 return VC_ERROR_INVALID_STATE;
2692 vc_mgr_client_set_error_cb(g_vc_m, callback, user_data);
2697 int vc_mgr_unset_error_cb()
2700 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
2701 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset error callback : A handle is not available");
2702 return VC_ERROR_INVALID_STATE;
2706 if (state != VC_STATE_INITIALIZED) {
2707 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset error callback : Current state is not 'Initialized'");
2708 return VC_ERROR_INVALID_STATE;
2711 vc_mgr_client_set_error_cb(g_vc_m, NULL, NULL);
2716 int __vc_mgr_cb_dialog(int pid, const char* disp_text, const char* utt_text, bool continuous)
2718 vc_mgr_dialog_request_cb callback = NULL;
2719 void* user_data = NULL;
2721 vc_mgr_client_get_dialog_request_cb(g_vc_m, &callback, &user_data);
2723 if (NULL != callback) {
2724 vc_mgr_client_use_callback(g_vc_m);
2725 callback(pid, disp_text, utt_text, continuous, user_data);
2726 vc_mgr_client_not_use_callback(g_vc_m);
2727 SLOG(LOG_DEBUG, TAG_VCM, "Dialog callback is called, disp_text(%s), utt)text(%s), continous(%d)", disp_text, utt_text, continuous);
2729 SLOG(LOG_WARN, TAG_VCM, "[WARNING] Error callback is null");
2735 int __vc_mgr_cb_private_data_set(const char* key, const char* data)
2737 vc_mgr_private_data_set_cb callback = NULL;
2738 void* user_data = NULL;
2741 vc_mgr_client_get_private_data_set_cb(g_vc_m, &callback, &user_data);
2743 if (NULL != callback) {
2744 vc_mgr_client_use_callback(g_vc_m);
2745 ret = callback(key, data, user_data);
2746 vc_mgr_client_not_use_callback(g_vc_m);
2747 SLOG(LOG_DEBUG, TAG_VCM, "Private data set callback is called");
2749 SLOG(LOG_WARN, TAG_VCM, "[WARNING] Private data set callback is null");
2755 int __vc_mgr_cb_private_data_requested(const char* key, char** data)
2757 vc_mgr_private_data_requested_cb callback = NULL;
2758 void* user_data = NULL;
2761 vc_mgr_client_get_private_data_requested_cb(g_vc_m, &callback, &user_data);
2763 if (NULL != callback) {
2764 vc_mgr_client_use_callback(g_vc_m);
2765 ret = callback(key, data, user_data);
2766 vc_mgr_client_not_use_callback(g_vc_m);
2767 SLOG(LOG_DEBUG, TAG_VCM, "Private data requested callback is called");
2769 SLOG(LOG_WARN, TAG_VCM, "[WARNING] Private data requested callback is null");
2775 int vc_mgr_set_dialog_request_cb(vc_mgr_dialog_request_cb callback, void* user_data)
2777 if (NULL == callback)
2778 return VC_ERROR_INVALID_PARAMETER;
2781 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
2782 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set error callback : A handle is not available");
2783 return VC_ERROR_INVALID_STATE;
2787 if (state != VC_STATE_INITIALIZED) {
2788 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set error callback : Current state is not 'Initialized'");
2789 return VC_ERROR_INVALID_STATE;
2792 vc_mgr_client_set_dialog_request_cb(g_vc_m, callback, user_data);
2797 int vc_mgr_unset_dialog_request_cb()
2800 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
2801 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset error callback : A handle is not available");
2802 return VC_ERROR_INVALID_STATE;
2806 if (state != VC_STATE_INITIALIZED) {
2807 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset error callback : Current state is not 'Initialized'");
2808 return VC_ERROR_INVALID_STATE;
2811 vc_mgr_client_set_dialog_request_cb(g_vc_m, NULL, NULL);
2816 int vc_mgr_set_private_data_set_cb(vc_mgr_private_data_set_cb callback, void* user_data)
2818 if (NULL == callback)
2819 return VC_ERROR_INVALID_PARAMETER;
2822 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
2823 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set private data set callback : A handle is not available");
2824 return VC_ERROR_INVALID_STATE;
2828 if (VC_STATE_INITIALIZED != state) {
2829 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set private data set callback : Current state is not 'Initialized'");
2830 return VC_ERROR_INVALID_STATE;
2833 vc_mgr_client_set_private_data_set_cb(g_vc_m, callback, user_data);
2838 int vc_mgr_unset_private_data_set_cb()
2841 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
2842 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset private data set callback : A handle is not available");
2843 return VC_ERROR_INVALID_STATE;
2847 if (VC_STATE_INITIALIZED != state) {
2848 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset private data set callback : Current state is not 'Initialized'");
2849 return VC_ERROR_INVALID_STATE;
2852 vc_mgr_client_set_private_data_set_cb(g_vc_m, NULL, NULL);
2857 int vc_mgr_set_private_data_requested_cb(vc_mgr_private_data_requested_cb callback, void* user_data)
2859 if (NULL == callback)
2860 return VC_ERROR_INVALID_PARAMETER;
2863 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
2864 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set private data requested callback : A handle is not available");
2865 return VC_ERROR_INVALID_STATE;
2869 if (VC_STATE_INITIALIZED != state) {
2870 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Set private data requested callback : Current state is not 'Initialized'");
2871 return VC_ERROR_INVALID_STATE;
2874 vc_mgr_client_set_private_data_requested_cb(g_vc_m, callback, user_data);
2879 int vc_mgr_unset_private_data_requested_cb()
2882 if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) {
2883 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset private data requested callback : A handle is not available");
2884 return VC_ERROR_INVALID_STATE;
2888 if (VC_STATE_INITIALIZED != state) {
2889 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Unset private data requested callback : Current state is not 'Initialized'");
2890 return VC_ERROR_INVALID_STATE;
2893 vc_mgr_client_set_private_data_requested_cb(g_vc_m, NULL, NULL);
2898 static bool __vc_mgr_check_demandable_client(int pid)
2900 if (0 == g_slist_length(g_demandable_client_list)) {
2901 SLOG(LOG_WARN, TAG_VCM, "[WARNING] No demandable clients");
2905 char appid[128] = {'\0', };
2906 aul_app_get_appid_bypid(pid, appid, sizeof(appid));
2908 if (0 >= strlen(appid)) {
2909 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] No appid");
2912 SLOG(LOG_DEBUG, TAG_VCM, "[CHECK] Appid - %s", appid);
2914 GSList *iter = NULL;
2915 vc_demandable_client_s* temp_client;
2916 iter = g_slist_nth(g_demandable_client_list, 0);
2918 while (NULL != iter) {
2919 temp_client = iter->data;
2921 if (NULL != temp_client) {
2922 if (NULL != temp_client->appid) {
2923 if (!strcmp(temp_client->appid, appid)) {
2924 SLOG(LOG_DEBUG, TAG_VCM, "pid(%d) is available", pid);
2930 iter = g_slist_next(iter);
2937 int __vc_mgr_request_auth_enable(int pid)
2939 if (false == __vc_mgr_check_demandable_client(pid)) {
2940 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Not demandable client");
2941 return VC_ERROR_INVALID_PARAMETER;
2944 /* check already authorized */
2945 if (true == vc_mgr_client_is_authorized_client(g_vc_m, pid)) {
2946 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Already authorized");
2947 return VC_ERROR_INVALID_PARAMETER;
2950 /* add authorized list */
2951 if (0 != vc_mgr_client_add_authorized_client(g_vc_m, pid)) {
2952 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to add authorized client");
2953 return VC_ERROR_OPERATION_FAILED;
2956 /* foreground check */
2958 if (0 != vc_mgr_client_get_foreground(g_vc_m, &fore_pid)) {
2959 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to get foreground");
2960 return VC_ERROR_OPERATION_FAILED;
2963 if (pid == fore_pid) {
2964 vc_mgr_client_set_valid_authorized_client(g_vc_m, pid);
2970 int __vc_mgr_request_auth_disable(int pid)
2972 /* check authorized */
2973 if (false == vc_mgr_client_is_authorized_client(g_vc_m, pid)) {
2974 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] No authorized");
2975 return VC_ERROR_INVALID_PARAMETER;
2978 /* remove authorized list */
2979 if (0 != vc_mgr_client_remove_authorized_client(g_vc_m, pid)) {
2980 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to remove authorized client");
2981 return VC_ERROR_OPERATION_FAILED;
2984 /* check authority valid */
2985 if (true == vc_mgr_client_is_valid_authorized_client(g_vc_m, pid)) {
2986 SLOG(LOG_DEBUG, TAG_VCM, "Valid authorized client is removed");
2987 if (0 != vc_mgr_client_set_valid_authorized_client(g_vc_m, -1)) {
2988 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to set valid authorized client");
2989 return VC_ERROR_OPERATION_FAILED;
2996 static Eina_Bool __request_auth_start(void* data)
2998 SLOG(LOG_DEBUG, TAG_VCM, "Request Start");
3000 if (0 != vc_mgr_client_set_start_by_client(g_vc_m, true)) {
3001 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to set start by client");
3004 if (0 != vc_mgr_start(false)) {
3005 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Request start is failed");
3006 /* TODO - Error handling? */
3009 if (0 != vc_mgr_client_set_start_by_client(g_vc_m, false)) {
3010 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to set start by client");
3017 int __vc_mgr_request_auth_start(int pid)
3019 /* check authorized */
3020 if (false == vc_mgr_client_is_valid_authorized_client(g_vc_m, pid)) {
3021 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] No valid authorized client");
3022 return VC_ERROR_INVALID_PARAMETER;
3025 /* add timer for start recording */
3026 ecore_timer_add(0, __request_auth_start, NULL);
3031 static Eina_Bool __request_auth_stop(void* data)
3033 SLOG(LOG_DEBUG, TAG_VCM, "Request Stop");
3035 if (0 != vc_mgr_stop()) {
3036 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Request stop is failed");
3037 /* TODO - Error handling? */
3043 int __vc_mgr_request_auth_stop(int pid)
3045 /* check authorized */
3046 if (false == vc_mgr_client_is_valid_authorized_client(g_vc_m, pid)) {
3047 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] No valid authorized client");
3048 return VC_ERROR_INVALID_PARAMETER;
3051 /* add timer for start recording */
3052 ecore_timer_add(0, __request_auth_stop, NULL);
3057 static Eina_Bool __request_auth_cancel(void* data)
3059 SLOG(LOG_DEBUG, TAG_VCM, "Request Cancel");
3061 if (0 != vc_mgr_cancel()) {
3062 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Request cancel is failed");
3063 /* TODO - Error handling? */
3069 int __vc_mgr_request_auth_cancel(int pid)
3071 /* check authorized */
3072 if (false == vc_mgr_client_is_valid_authorized_client(g_vc_m, pid)) {
3073 SLOG(LOG_ERROR, TAG_VCM, "[ERROR] No valid authorized client");
3074 return VC_ERROR_INVALID_PARAMETER;
3077 /* add timer for start recording */
3078 ecore_timer_add(0, __request_auth_cancel, NULL);