From 6304a412ac3bd88bb362dab4bfecee0e8f9ed84a Mon Sep 17 00:00:00 2001 From: Suyeon Hwang Date: Wed, 12 Apr 2017 10:51:23 +0900 Subject: [PATCH 01/16] Fix calling duplicated result callback Change-Id: I3c1b2a49bb2aa1d0e795c1811a4d1ccee83cc12b Signed-off-by: Suyeon Hwang --- common/vc_cmd_db.c | 8 +++----- server/vcd_server.c | 6 +++++- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/common/vc_cmd_db.c b/common/vc_cmd_db.c index 4218894..30e0266 100644 --- a/common/vc_cmd_db.c +++ b/common/vc_cmd_db.c @@ -989,7 +989,8 @@ int __vc_db_get_result_pid_list(const char* result, GSList** pid_list) int ret = 0; sqlite3_stmt* stmt = NULL; - const char* sql = "SELECT * FROM vc_result WHERE result = ? COLLATE NOCASE;"; + const char* sql = "SELECT DISTINCT pid, type FROM vc_result WHERE result = ? COLLATE NOCASE ORDER BY pid ASC;"; + ret = sqlite3_prepare_v2(db_handle, sql, -1, &stmt, NULL); if (ret != SQLITE_OK) { @@ -1031,12 +1032,9 @@ int __vc_db_get_result_pid_list(const char* result, GSList** pid_list) } temp = sqlite3_column_int(stmt, 0); - temp_cmd->id = temp; - - temp = sqlite3_column_int(stmt, 5); temp_cmd->pid = temp; - temp = sqlite3_column_int(stmt, 6); + temp = sqlite3_column_int(stmt, 1); temp_cmd->type = temp; temp_pid_list = g_slist_append(temp_pid_list, temp_cmd); diff --git a/server/vcd_server.c b/server/vcd_server.c index de53304..26f4b7c 100755 --- a/server/vcd_server.c +++ b/server/vcd_server.c @@ -387,12 +387,14 @@ static Eina_Bool __vcd_send_selected_result(void *data) GSList* iter = NULL; vc_cmd_s* temp_cmd = NULL; int ret = 0; + int pre_pid = -1; + int pre_type = -1; iter = g_slist_nth(pid_list, 0); while (NULL != iter) { temp_cmd = iter->data; - if (NULL != temp_cmd) { + if (NULL != temp_cmd && (pre_pid != temp_cmd->pid || pre_type == VC_COMMAND_TYPE_WIDGET || temp_cmd->type == VC_COMMAND_TYPE_WIDGET)) { /* Launch deactivated several apps that is matched with result */ ret = __vcd_launch_app(result); if (0 != ret) { @@ -405,6 +407,8 @@ static Eina_Bool __vcd_send_selected_result(void *data) break; } else { SLOG(LOG_DEBUG, TAG_VCD, "[Server] Send result : pid(%d) type(%d)", temp_cmd->pid, temp_cmd->type); + pre_pid = temp_cmd->pid; + pre_type = temp_cmd->type; } } free(temp_cmd); -- 2.7.4 From 411065bfa9a7296a5030f1d78aa08466b2551b05 Mon Sep 17 00:00:00 2001 From: Kwangyoun Kim Date: Thu, 20 Apr 2017 14:58:16 +0900 Subject: [PATCH 02/16] Fix invalid volume value when recording value is zero Change-Id: I05c815b192380c575da1b4217bd26e8f2f5c81bf --- server/vcd_recorder.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/server/vcd_recorder.c b/server/vcd_recorder.c index 4d3cb7e..5ba69d6 100644 --- a/server/vcd_recorder.c +++ b/server/vcd_recorder.c @@ -514,8 +514,8 @@ static float get_volume_decibel(char* data, int size) count++; } - if (0 == count) { - SLOG(LOG_ERROR, TAG_VCD, "[ERROR] NULL data"); + if (0 == count || 0 == square_sum) { + SLOG(LOG_ERROR, TAG_VCD, "[ERROR] No data"); rms = 1.0; } else { rms = sqrt((float)square_sum/count); -- 2.7.4 From c9f8884299559c7b73b5c047607f92a185be584b Mon Sep 17 00:00:00 2001 From: Suyeon Hwang Date: Wed, 29 Mar 2017 10:52:19 +0900 Subject: [PATCH 03/16] Fix event of consumed ASR result to become success Change-Id: I153ea61d8b7245c729459ac72f74f18032cd5008 Signed-off-by: Suyeon Hwang --- server/vcd_server.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/server/vcd_server.c b/server/vcd_server.c index 26f4b7c..aff998d 100755 --- a/server/vcd_server.c +++ b/server/vcd_server.c @@ -31,6 +31,7 @@ #include "vcd_dbus.h" #include "voice_control_command_expand.h" +#include "voice_control_common.h" /* * VC Server static variable @@ -510,12 +511,17 @@ static void __vcd_server_result_cb(vcp_result_event_e event, int* result_id, int vcdc_send_show_tooltip(pid, false); if (-1 != vcd_client_manager_get_pid()) { /* Manager client is available */ + vc_info_parser_unset_result(false); + vc_info_parser_set_result(all_result, VC_RESULT_EVENT_RESULT_SUCCESS, msg, NULL, false); if (0 != vcdc_send_result_to_manager(vcd_client_manager_get_pid(), VC_RESULT_TYPE_NOTIFICATION)) { SLOG(LOG_WARN, TAG_VCD, "[Server WARNING] Fail to send result"); } } vcd_client_manager_set_exclusive(false); + + vcd_config_set_service_state(VCD_STATE_READY); + vcdc_send_service_state(VCD_STATE_READY); return; } } -- 2.7.4 From cb53d6b1113a0b975131c3628dac5d3fdf353314 Mon Sep 17 00:00:00 2001 From: Wonnam Jang Date: Thu, 27 Apr 2017 14:19:46 +0900 Subject: [PATCH 04/16] Fix bug Change-Id: Id7e51b54f188abf87734575a162817a434b8df98 Signed-off-by: Wonnam Jang --- server/vcd_recorder.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/vcd_recorder.c b/server/vcd_recorder.c index 5ba69d6..3b33e95 100644 --- a/server/vcd_recorder.c +++ b/server/vcd_recorder.c @@ -143,7 +143,7 @@ static void _bt_cb_hid_state_changed(int result, bool connected, const char *rem static void _bt_hid_audio_data_receive_cb(bt_hid_voice_data_s *voice_data, void *user_data) { - if (0 != strncmp(g_current_audio_type, VCP_AUDIO_ID_BLUETOOTH, sizeof(VCP_AUDIO_ID_BLUETOOTH))) { + if (0 != strncmp(g_current_audio_type, VCP_AUDIO_ID_BLUETOOTH, strlen(VCP_AUDIO_ID_BLUETOOTH))) { SLOG(LOG_ERROR, TAG_VCD, "[Recorder ERROR] current audio type is (%s)", g_current_audio_type); return; } -- 2.7.4 From d5ee7634d3d134323526d03da0deae1101c0ffb2 Mon Sep 17 00:00:00 2001 From: Wonnam Jang Date: Thu, 27 Apr 2017 14:46:31 +0900 Subject: [PATCH 05/16] Fix internal state error when api is called in thread Change-Id: I1aaab56682def70092c9241503e7ab844f87e580 Signed-off-by: Wonnam Jang --- client/vc_mgr.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/client/vc_mgr.c b/client/vc_mgr.c index ee31520..cad7905 100644 --- a/client/vc_mgr.c +++ b/client/vc_mgr.c @@ -1684,10 +1684,12 @@ int vc_mgr_start(bool exclusive_command_option) ret = -1; count = 0; while (0 != ret) { + vc_mgr_client_set_internal_state(g_vc_m, VC_INTERNAL_STATE_STARTING); ret = vc_mgr_dbus_request_start(g_vc_m->handle, (int)recognition_mode, exclusive_command_option, start_by_client); if (0 != ret) { if (VC_ERROR_TIMED_OUT != ret) { SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to start request start : %s", __vc_mgr_get_error_code(ret)); + vc_mgr_client_set_internal_state(g_vc_m, VC_INTERNAL_STATE_NONE); break; } else { SLOG(LOG_WARN, TAG_VCM, "[WARNING] retry start request start : %s", __vc_mgr_get_error_code(ret)); @@ -1696,12 +1698,12 @@ int vc_mgr_start(bool exclusive_command_option) if (VC_RETRY_COUNT == count) { SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request"); vc_mgr_client_set_exclusive_command(g_vc_m, false); + vc_mgr_client_set_internal_state(g_vc_m, VC_INTERNAL_STATE_NONE); break; } } } else { SLOG(LOG_DEBUG, TAG_VCM, "[SUCCESS] start recognition"); - vc_mgr_client_set_internal_state(g_vc_m, VC_INTERNAL_STATE_STARTING); } } @@ -1763,10 +1765,12 @@ int vc_mgr_stop() int count = 0; /* do request */ while (0 != ret) { + vc_mgr_client_set_internal_state(g_vc_m, VC_INTERNAL_STATE_STOPPING); ret = vc_mgr_dbus_request_stop(g_vc_m->handle); if (0 != ret) { if (VC_ERROR_TIMED_OUT != ret) { SLOG(LOG_DEBUG, TAG_VCM, "[ERROR] Fail to stop request : %s", __vc_mgr_get_error_code(ret)); + vc_mgr_client_set_internal_state(g_vc_m, VC_INTERNAL_STATE_NONE); break; } else { SLOG(LOG_WARN, TAG_VCM, "[WARNING] retry stop request : %s", __vc_mgr_get_error_code(ret)); @@ -1774,12 +1778,12 @@ int vc_mgr_stop() count++; if (VC_RETRY_COUNT == count) { SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request"); + vc_mgr_client_set_internal_state(g_vc_m, VC_INTERNAL_STATE_NONE); break; } } } else { SLOG(LOG_DEBUG, TAG_VCM, "[SUCCESS] Stop recognition"); - vc_mgr_client_set_internal_state(g_vc_m, VC_INTERNAL_STATE_STOPPING); } } @@ -1835,10 +1839,12 @@ int vc_mgr_cancel() int ret = -1; int count = 0; while (0 != ret) { + vc_mgr_client_set_internal_state(g_vc_m, VC_INTERNAL_STATE_CANCELING); ret = vc_mgr_dbus_request_cancel(g_vc_m->handle); if (0 != ret) { if (VC_ERROR_TIMED_OUT != ret) { SLOG(LOG_DEBUG, TAG_VCM, "[ERROR] Fail to cancel request : %s", __vc_mgr_get_error_code(ret)); + vc_mgr_client_set_internal_state(g_vc_m, VC_INTERNAL_STATE_NONE); break; } else { SLOG(LOG_WARN, TAG_VCM, "[WARNING] retry cancel request : %s", __vc_mgr_get_error_code(ret)); @@ -1846,12 +1852,12 @@ int vc_mgr_cancel() count++; if (VC_RETRY_COUNT == count) { SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to request"); + vc_mgr_client_set_internal_state(g_vc_m, VC_INTERNAL_STATE_NONE); break; } } } else { SLOG(LOG_DEBUG, TAG_VCM, "[SUCCESS] Cancel recognition"); - vc_mgr_client_set_internal_state(g_vc_m, VC_INTERNAL_STATE_CANCELING); } } -- 2.7.4 From d78ad0b02b5661469f2bb87007c6db6db8ad1087 Mon Sep 17 00:00:00 2001 From: Wonnam Jang Date: Wed, 10 May 2017 16:29:44 +0900 Subject: [PATCH 06/16] add NLG result callback Change-Id: I3248d4bb092007f78c9916bf2e7b33763f9b202a --- client/vc_mgr.c | 2 +- client/vc_mgr_dbus.c | 5 +++++ include/voice_control_plugin_engine.h | 20 ++++++++++++++++++++ server/vcd_dbus.c | 5 +++++ server/vcd_engine_agent.c | 26 ++++++++++++++++++++++++-- server/vcd_engine_agent.h | 4 +++- server/vcd_server.c | 18 +++++++++++++++++- 7 files changed, 75 insertions(+), 5 deletions(-) mode change 100755 => 100644 server/vcd_server.c diff --git a/client/vc_mgr.c b/client/vc_mgr.c index cad7905..c626f34 100644 --- a/client/vc_mgr.c +++ b/client/vc_mgr.c @@ -2728,7 +2728,7 @@ int __vc_mgr_cb_dialog(int pid, const char* disp_text, const char* utt_text, boo vc_mgr_client_use_callback(g_vc_m); callback(pid, disp_text, utt_text, continuous, user_data); vc_mgr_client_not_use_callback(g_vc_m); - SLOG(LOG_DEBUG, TAG_VCM, "Dialog callback is called"); + SLOG(LOG_DEBUG, TAG_VCM, "Dialog callback is called, disp_text(%s), utt)text(%s), continous(%d)", disp_text, utt_text, continuous); } else { SLOG(LOG_WARN, TAG_VCM, "[WARNING] Error callback is null"); } diff --git a/client/vc_mgr_dbus.c b/client/vc_mgr_dbus.c index 3087a04..06175e3 100644 --- a/client/vc_mgr_dbus.c +++ b/client/vc_mgr_dbus.c @@ -245,6 +245,11 @@ static Eina_Bool vc_mgr_listener_event_callback(void* data, Ecore_Fd_Handler *fd DBUS_TYPE_INT32, &tmp_continue, DBUS_TYPE_INVALID); + if (!strcmp(disp_text, "#NULL")) + disp_text = NULL; + if (!strcmp(utt_text, "#NULL")) + utt_text = NULL; + __vc_mgr_cb_dialog(pid, disp_text, utt_text, (bool)tmp_continue); SLOG(LOG_DEBUG, TAG_VCM, "====="); diff --git a/include/voice_control_plugin_engine.h b/include/voice_control_plugin_engine.h index 04a1cf0..82ce330 100644 --- a/include/voice_control_plugin_engine.h +++ b/include/voice_control_plugin_engine.h @@ -182,6 +182,14 @@ typedef void (*vcpe_result_cb)(vcp_result_event_e event, int* result_id, int cou typedef void (*vcpe_asr_result_cb)(vcp_asr_result_event_e event, const char* asr_result, void *user_data); /** +* @brief Called when the daemon gets nlg result. +* +* @param[in] nlg_result Nlg result +* @param[in] user_data The user data passed from the start +*/ +typedef void (*vcpe_nlg_result_cb)(const char* nlg_result, void *user_data); + +/** * @brief Called when the daemon gets error. * * @param[in] error Error type @@ -260,6 +268,17 @@ typedef int (*vcpe_set_result_cb)(vcpe_result_cb callback, void* user_data); */ typedef int (*vcpe_set_asr_result_cb)(vcpe_asr_result_cb callback, void* user_data); +/** +* @brief Registers a callback function for getting nlg result. +* +* @param[in] callback Callback function to register +* @param[in] user_data The user data to be passed to the callback function +* +* @return 0 on success, otherwise a negative error value +* +*/ +typedef int (*vcpe_set_nlg_result_cb)(vcpe_nlg_result_cb, void* user_data); + #if 0 /** * @brief Registers a callback function for getting partial recognition result. @@ -648,6 +667,7 @@ typedef struct { //vcpe_set_pre_result_cb set_pre_result_cb; /**< Set pre result callback */ vcpe_set_asr_result_cb set_asr_result_cb; /**< Set asr result callback */ + vcpe_set_nlg_result_cb set_nlg_result_cb; /**< Set nlg result callback */ vcpe_set_error_cb set_error_cb; /**< Set error callback */ vcpe_set_domain set_domain; /**< Set domain */ vcpe_get_nlu_base_info get_nlu_base_info; /**< Get essential info */ diff --git a/server/vcd_dbus.c b/server/vcd_dbus.c index 05a66a1..75a8c63 100644 --- a/server/vcd_dbus.c +++ b/server/vcd_dbus.c @@ -613,6 +613,11 @@ int vcdc_send_dialog(int manger_pid, int pid, const char* disp_text, const char* SLOG(LOG_DEBUG, TAG_VCD, "[Dbus] send dialog : pid(%d), disp_text(%s), utt_text(%s), continue(%d)", pid, disp_text, utt_text, continuous); + if (NULL == disp_text) + disp_text = strdup("#NULL"); + if (NULL == utt_text) + utt_text = strdup("#NULL"); + dbus_message_append_args(msg, DBUS_TYPE_INT32, &pid, DBUS_TYPE_STRING, &disp_text, diff --git a/server/vcd_engine_agent.c b/server/vcd_engine_agent.c index 1e52a70..1e457b5 100644 --- a/server/vcd_engine_agent.c +++ b/server/vcd_engine_agent.c @@ -73,6 +73,7 @@ static char* g_default_lang; static result_callback g_result_cb = NULL; static asr_result_callback g_asr_result_cb = NULL; +static nlg_result_callback g_nlg_result_cb = NULL; #if 0 static pre_result_callback g_pre_result_cb = NULL; @@ -111,7 +112,7 @@ int __log_enginelist(); * VCS Engine Agent Interfaces */ //int vcd_engine_agent_init(pre_result_callback pre_result_cb, result_callback result_cb, nlu_result_callback nlu_result_cb, error_callback error_cb) -int vcd_engine_agent_init(asr_result_callback asr_result_cb, result_callback result_cb, error_callback error_cb) +int vcd_engine_agent_init(asr_result_callback asr_result_cb, result_callback result_cb, nlg_result_callback nlg_result_cb, error_callback error_cb) { if (/*NULL == pre_result_cb*/ NULL == asr_result_cb || NULL == result_cb /*|| NULL == nlu_result_cb*/ || NULL == error_cb) { SLOG(LOG_ERROR, TAG_VCD, "[Engine Agent ERROR] Input parameter is NULL"); @@ -134,6 +135,7 @@ int vcd_engine_agent_init(asr_result_callback asr_result_cb, result_callback res //g_pre_result_cb = pre_result_cb; g_asr_result_cb = asr_result_cb; + g_nlg_result_cb = nlg_result_cb; g_result_cb = result_cb; //g_nlu_result_cb = nlu_result_cb; g_error_cb = error_cb; @@ -209,6 +211,7 @@ int vcd_engine_agent_release() //g_pre_result_cb = NULL; g_asr_result_cb = NULL; + g_nlg_result_cb = NULL; g_result_cb = NULL; //g_nlu_result_cb = NULL; g_error_cb = NULL; @@ -553,6 +556,19 @@ void __asr_result_cb(vcp_asr_result_event_e event, const char* asr_result, void return; } +void __nlg_result_cb(const char* nlg_result, void *user_data) +{ + SLOG(LOG_DEBUG, TAG_VCD, "[Engine Agent] NLG result - Result(%s)", nlg_result); + + if (NULL != g_nlg_result_cb) { + g_nlg_result_cb(nlg_result, user_data); + } else { + SLOG(LOG_DEBUG, TAG_VCD, "[Engine Agent ERROR] NLG result callback function is NOT valid"); + } + + return; +} + void __error_cb(vcp_error_e error, const char* msg, void *user_data) { SLOG(LOG_ERROR, TAG_VCD, "[Engine Agent] ERROR(%d)", error); @@ -616,7 +632,7 @@ int __load_engine(vcengine_s* engine) return VCD_ERROR_OPERATION_FAILED; } - SLOG(LOG_DEBUG, TAG_VCD, "[Engine Agent] engine info : version(%d), size(%d)", engine->pefuncs->version, engine->pefuncs->size); + SLOG(LOG_DEBUG, TAG_VCD, "[Engine Agent] engine info : version(%d), size(%d)(%d)", engine->pefuncs->version, engine->pefuncs->size, sizeof(vcpe_funcs_s)); /* engine error check */ if (engine->pefuncs->size != sizeof(vcpe_funcs_s)) { @@ -639,6 +655,7 @@ int __load_engine(vcengine_s* engine) NULL == engine->pefuncs->stop || NULL == engine->pefuncs->cancel || NULL == engine->pefuncs->set_asr_result_cb || + NULL == engine->pefuncs->set_nlg_result_cb || //NULL == engine->pefuncs->set_pre_result_cb || NULL == engine->pefuncs->set_error_cb || NULL == engine->pefuncs->set_domain || @@ -669,6 +686,11 @@ int __load_engine(vcengine_s* engine) return VCD_ERROR_OPERATION_FAILED; } + if (0 != engine->pefuncs->set_nlg_result_cb(__nlg_result_cb, NULL)) { + SLOG(LOG_ERROR, TAG_VCD, "[Engine Agent ERROR] Fail to set nlg result callback of vc-engine"); + return VCD_ERROR_OPERATION_FAILED; + } + if (0 != engine->pefuncs->set_error_cb(__error_cb, NULL)) { SLOG(LOG_ERROR, TAG_VCD, "[Engine Agent ERROR] Fail to set error callback of vc-engine"); return VCD_ERROR_OPERATION_FAILED; diff --git a/server/vcd_engine_agent.h b/server/vcd_engine_agent.h index 8e50ff9..4b4a21e 100644 --- a/server/vcd_engine_agent.h +++ b/server/vcd_engine_agent.h @@ -36,6 +36,8 @@ typedef void (*result_callback)(vcp_result_event_e event, int* result_id, int co typedef void (*asr_result_callback)(vcp_asr_result_event_e event, const char* asr_result, void *user_data); +typedef void (*nlg_result_callback)(const char* nlg_result, void *user_data); + #if 0 typedef void (*pre_result_callback)(vcp_pre_result_event_e event, const char* pre_result, void *user_data); @@ -50,7 +52,7 @@ typedef void (*silence_dectection_callback)(void *user_data); /** Init engine agent */ //int vcd_engine_agent_init(pre_result_callback pre_result_cb, result_callback result_cb, nlu_result_callback nlu_result_cb, error_callback error_cb); -int vcd_engine_agent_init(asr_result_callback asr_result_cb, result_callback result_cb, error_callback error_cb); +int vcd_engine_agent_init(asr_result_callback asr_result_cb, result_callback result_cb, nlg_result_callback nlg_result_cb, error_callback error_cb); /** Release engine agent */ int vcd_engine_agent_release(); diff --git a/server/vcd_server.c b/server/vcd_server.c old mode 100755 new mode 100644 index aff998d..79bb719 --- a/server/vcd_server.c +++ b/server/vcd_server.c @@ -51,6 +51,8 @@ typedef enum { VCD_SEND_EVENT_TYPE_HAPTIC_EVENT /**< send haptic event to vc engine */ } vcd_send_event_type_e; +static int __vcd_server_launch_manager_app(); + /* * VC Server Internal Functions */ @@ -440,6 +442,20 @@ static void __vcd_server_asr_result_cb(vcp_asr_result_event_e event, const char* return; } +static void __vcd_server_nlg_result_cb(const char* nlg_result, void *user_data) +{ + int ret = __vcd_server_launch_manager_app(); + if (0 != ret) { + SLOG(LOG_ERROR, TAG_VCD, "[Server ERROR] Fail to send dialog : mgr_pid(%d), nlg_result(%s)", vcd_client_manager_get_pid(), nlg_result); + return; + } + + ret = vcdc_send_dialog(vcd_client_manager_get_pid(), -1, nlg_result, NULL, 0); //0: VC_DIALOG_END + if (0 != ret) + SLOG(LOG_ERROR, TAG_VCD, "[Server ERROR] Fail to send dialog : mgr_pid(%d), nlg_result(%s)", vcd_client_manager_get_pid(), nlg_result); + return; +} + static void* __recorder_stop(void *data) { vcd_recorder_stop(); @@ -972,7 +988,7 @@ int vcd_initialize() vcd_config_set_service_state(VCD_STATE_NONE); //ret = vcd_engine_agent_init(__vcd_server_pre_result_cb, __vcd_server_result_cb, __vcd_server_nlu_result_cb, __vcd_server_error_cb); - ret = vcd_engine_agent_init(__vcd_server_asr_result_cb, __vcd_server_result_cb, __vcd_server_error_cb); + ret = vcd_engine_agent_init(__vcd_server_asr_result_cb, __vcd_server_result_cb, __vcd_server_nlg_result_cb, __vcd_server_error_cb); if (0 != ret) { SLOG(LOG_ERROR, TAG_VCD, "[Server ERROR] Fail to engine agent initialize : result(%d)", ret); return ret; -- 2.7.4 From dd1a46f2e0f5e887af7bc8058e720ffd26bb46d8 Mon Sep 17 00:00:00 2001 From: Kwangyoun Kim Date: Thu, 11 May 2017 14:25:59 +0900 Subject: [PATCH 07/16] Change audio recording procedure Change-Id: Ic23c55aece9b34b3af587451e2eee35a4b4fa2b2 --- client/vc_mgr.c | 4 +-- include/voice_control_plugin_engine.h | 30 +++++++++++++++++++++++ server/vcd_engine_agent.c | 46 +++++++++++++++++++++++++++++++++++ server/vcd_engine_agent.h | 2 ++ server/vcd_recorder.c | 30 +++++++++++++++++++---- server/vcd_server.c | 21 +++++++++++----- 6 files changed, 120 insertions(+), 13 deletions(-) diff --git a/client/vc_mgr.c b/client/vc_mgr.c index c626f34..26b1630 100644 --- a/client/vc_mgr.c +++ b/client/vc_mgr.c @@ -1816,8 +1816,8 @@ int vc_mgr_cancel() /* Check service state */ vc_service_state_e service_state = -1; vc_mgr_client_get_service_state(g_vc_m, &service_state); - if (service_state != VC_SERVICE_STATE_RECORDING && service_state != VC_SERVICE_STATE_PROCESSING) { - SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: service state is not 'RECORDING' or 'PROCESSING'"); + if (service_state == VC_SERVICE_STATE_NONE) { + SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State"); SLOG(LOG_DEBUG, TAG_VCM, "====="); SLOG(LOG_DEBUG, TAG_VCM, " "); return VC_ERROR_INVALID_STATE; diff --git a/include/voice_control_plugin_engine.h b/include/voice_control_plugin_engine.h index 82ce330..b6926da 100644 --- a/include/voice_control_plugin_engine.h +++ b/include/voice_control_plugin_engine.h @@ -479,6 +479,15 @@ typedef int (*vcpe_stop)(void); typedef int (*vcpe_cancel)(void); /** +* @brief Set audio recording type. +* +* @return 0 on success, otherwise a negative error value. +* @retval #VCP_ERROR_NONE Successful. +* +*/ +typedef int (*vcpe_set_audio_type)(const char* audio); + +/** * @brief Sets domain (Agent or device type) * * @param[in] domain available Agent or device type @@ -639,6 +648,22 @@ typedef int (*vcpd_set_private_data)(const char* key, const char* data); typedef int (*vcpd_get_private_data)(const char* key, char** data); /** +* @brief Request start recording. +* +* @return 0 on success, otherwise a negative error value. +* +*/ +typedef int (*vcpd_start_recording)(); + +/** +* @brief Request stop recording. +* +* @return 0 on success, otherwise a negative error value. +* +*/ +typedef int (*vcpd_stop_recording)(); + +/** * @brief A structure of the engine functions. */ typedef struct { @@ -665,6 +690,8 @@ typedef struct { vcpe_stop stop; /**< Stop recording for getting result */ vcpe_cancel cancel; /**< Cancel recording and processing */ + vcpe_set_audio_type set_audio_type; /**< Set audio type */ + //vcpe_set_pre_result_cb set_pre_result_cb; /**< Set pre result callback */ vcpe_set_asr_result_cb set_asr_result_cb; /**< Set asr result callback */ vcpe_set_nlg_result_cb set_nlg_result_cb; /**< Set nlg result callback */ @@ -693,6 +720,9 @@ typedef struct { vcpd_set_private_data set_private_data; /**< Set private data to Manager */ vcpd_get_private_data get_private_data; /**< Get private data from Manager */ + + vcpd_start_recording start_recording; /**< Request start recording */ + vcpd_stop_recording stop_recording; /**< Request stop recording */ } vcpd_funcs_s; /** diff --git a/server/vcd_engine_agent.c b/server/vcd_engine_agent.c index 1e457b5..1718842 100644 --- a/server/vcd_engine_agent.c +++ b/server/vcd_engine_agent.c @@ -530,6 +530,29 @@ int __get_private_data(const char* key, char** data) return 0; } +int __start_recording() +{ + SLOG(LOG_DEBUG, TAG_VCD, "[Engine Agent] Request start recording"); + + int ret = vcd_recorder_start(); + if (0 != ret) { + SLOG(LOG_ERROR, TAG_VCD, "[Server ERROR] Fail to start recorder : result(%d)", ret); + vcd_engine_recognize_cancel(); + /* Send error cb to manager */ + vcdc_send_error_signal_to_manager(vcd_client_manager_get_pid(), VCD_ERROR_OPERATION_FAILED, "voice_engine.error.proc_fail"); + return ret; + } + + return 0; +} + +int __stop_recording() +{ + SLOG(LOG_DEBUG, TAG_VCD, "[Engine Agent] Request stop recording"); + + return vcd_recorder_stop(); +} + void __result_cb(vcp_result_event_e event, int* result_id, int count, const char* all_result, const char* non_fixed, const char* nlu_result, const char* msg, void *user_data) { SLOG(LOG_DEBUG, TAG_VCD, "[Engine agent] Event(%d), Count(%d) Text(%s) Nonfixed(%s) NLU result(%s) Msg(%s)", event, count, all_result, non_fixed, nlu_result, msg); @@ -626,6 +649,9 @@ int __load_engine(vcengine_s* engine) engine->pdfuncs->set_private_data = __set_private_data; engine->pdfuncs->get_private_data = __get_private_data; + engine->pdfuncs->start_recording = __start_recording; + engine->pdfuncs->stop_recording = __stop_recording; + if (0 != engine->vcp_load_engine(engine->pdfuncs, engine->pefuncs)) { SLOG(LOG_ERROR, TAG_VCD, "[Engine Agent ERROR] Fail vcp_load_engine()"); dlclose(engine->handle); @@ -654,6 +680,7 @@ int __load_engine(vcengine_s* engine) NULL == engine->pefuncs->set_recording || NULL == engine->pefuncs->stop || NULL == engine->pefuncs->cancel || + NULL == engine->pefuncs->set_audio_type || NULL == engine->pefuncs->set_asr_result_cb || NULL == engine->pefuncs->set_nlg_result_cb || //NULL == engine->pefuncs->set_pre_result_cb || @@ -880,6 +907,25 @@ int vcd_engine_recognize_cancel() return 0; } +int vcd_engine_set_audio_type(const char* audio) +{ + if (false == g_agent_init) { + SLOG(LOG_ERROR, TAG_VCD, "[Engine Agent ERROR] Not Initialized"); + return VCD_ERROR_OPERATION_FAILED; + } + + int ret = -1; + if (true == g_dynamic_engine.is_loaded) { + ret = g_dynamic_engine.pefuncs->set_audio_type(audio); + if (0 != ret) { + SLOG(LOG_ERROR, TAG_VCD, "[Engine Agent ERROR] Fail to set audio type(%d)", ret); + return VCD_ERROR_OPERATION_FAILED; + } + } + + return 0; +} + int vcd_engine_set_domain(int pid, const char* domain) { if (false == g_agent_init) { diff --git a/server/vcd_engine_agent.h b/server/vcd_engine_agent.h index 4b4a21e..7166cc8 100644 --- a/server/vcd_engine_agent.h +++ b/server/vcd_engine_agent.h @@ -91,6 +91,8 @@ int vcd_engine_recognize_stop(); int vcd_engine_recognize_cancel(); +int vcd_engine_set_audio_type(const char* audio); + int vcd_engine_set_domain(int pid, const char* domain); int vcd_engine_get_nlu_base_info(int pid, const char* key, char** value); diff --git a/server/vcd_recorder.c b/server/vcd_recorder.c index 3b33e95..6202720 100644 --- a/server/vcd_recorder.c +++ b/server/vcd_recorder.c @@ -32,7 +32,9 @@ #endif #include "vcd_client_data.h" +#include "vcd_config.h" #include "vcd_dbus.h" +#include "vcd_engine_agent.h" #include "vcd_recorder.h" #include "vcd_main.h" #include "voice_control_plugin_engine.h" @@ -87,8 +89,14 @@ static float get_volume_decibel(char* data, int size); static void __msf_wifi_audio_data_receive_cb(msf_wifi_voice_data_s *voice_data, void* user_data) { if (0 != strncmp(g_current_audio_type, VCP_AUDIO_ID_MSF, sizeof(VCP_AUDIO_ID_MSF))) { - SLOG(LOG_ERROR, TAG_VCD, "[Recorder ERROR] current audio type is (%s)", g_current_audio_type); - return; + vcd_state_e state = vcd_config_get_service_state(); + if (VCD_STATE_READY == state) { + vcd_engine_set_audio_type(VCP_AUDIO_ID_MSF); + vcd_recorder_set(VCP_AUDIO_ID_MSF, VCP_AUDIO_TYPE_PCM_S16_LE, 16000, 1); + } else { + SLOG(LOG_ERROR, TAG_VCD, "[Recorder ERROR] current audio type is (%s)", g_current_audio_type); + return; + } } if (VCD_RECORDER_STATE_RECORDING != g_recorder_state) { @@ -143,9 +151,15 @@ static void _bt_cb_hid_state_changed(int result, bool connected, const char *rem static void _bt_hid_audio_data_receive_cb(bt_hid_voice_data_s *voice_data, void *user_data) { - if (0 != strncmp(g_current_audio_type, VCP_AUDIO_ID_BLUETOOTH, strlen(VCP_AUDIO_ID_BLUETOOTH))) { - SLOG(LOG_ERROR, TAG_VCD, "[Recorder ERROR] current audio type is (%s)", g_current_audio_type); - return; + if (0 != strncmp(g_current_audio_type, VCP_AUDIO_ID_BLUETOOTH, sizeof(VCP_AUDIO_ID_BLUETOOTH))) { + vcd_state_e state = vcd_config_get_service_state(); + if (VCD_STATE_READY == state) { + vcd_engine_set_audio_type(VCP_AUDIO_ID_BLUETOOTH); + vcd_recorder_set(VCP_AUDIO_ID_BLUETOOTH, VCP_AUDIO_TYPE_PCM_S16_LE, 16000, 1); + } else { + SLOG(LOG_ERROR, TAG_VCD, "[Recorder ERROR] current audio type is (%s)", g_current_audio_type); + return; + } } if (VCD_RECORDER_STATE_RECORDING != g_recorder_state) { @@ -739,6 +753,12 @@ int vcd_recorder_stop() } #endif } + + if (0 != strncmp(g_current_audio_type, VCP_AUDIO_ID_NONE, sizeof(VCP_AUDIO_ID_NONE))) { + vcd_recorder_set(VCP_AUDIO_ID_NONE, VCP_AUDIO_TYPE_PCM_S16_LE, 16000, 1); + vcd_engine_set_audio_type(VCP_AUDIO_ID_NONE); + } + return 0; } diff --git a/server/vcd_server.c b/server/vcd_server.c index 79bb719..bed1370 100644 --- a/server/vcd_server.c +++ b/server/vcd_server.c @@ -1521,6 +1521,7 @@ static int __start_internal_recognition() SLOG(LOG_DEBUG, TAG_VCD, "[Server Success] Start engine"); +#if 0 /* 5. recorder start */ ret = vcd_recorder_start(); if (0 != ret) { @@ -1532,6 +1533,7 @@ static int __start_internal_recognition() vcdc_send_error_signal_to_manager(vcd_client_manager_get_pid(), VCD_ERROR_OPERATION_FAILED, "voice_engine.error.proc_fail"); return ret; } +#endif vcd_config_set_service_state(VCD_STATE_RECORDING); vcdc_send_service_state(VCD_STATE_RECORDING); @@ -1622,8 +1624,10 @@ int vcd_server_mgr_stop() return VCD_ERROR_OPERATION_FAILED; } +#if 0 /* 2. Stop recorder */ vcd_recorder_stop(); +#endif /* 3. Stop engine recognition */ int ret = vcd_engine_recognize_stop(); @@ -1640,12 +1644,6 @@ int vcd_server_mgr_stop() int vcd_server_mgr_cancel() { - /* 1. Check current state */ - vcd_state_e state = vcd_config_get_service_state(); - if (VCD_STATE_RECORDING != state && VCD_STATE_PROCESSING != state) { - SLOG(LOG_WARN, TAG_VCD, "[Server ERROR] Current state is not recording or processing"); - return VCD_ERROR_INVALID_STATE; - } if (-1 == vcd_client_manager_get_pid()) { SLOG(LOG_DEBUG, TAG_VCD, "[Server] Manager is NOT available."); return VCD_ERROR_OPERATION_FAILED; @@ -1657,8 +1655,19 @@ int vcd_server_mgr_cancel() g_restart_timer = NULL; } + /* 1. Check current state */ + vcd_state_e state = vcd_config_get_service_state(); + if (VCD_STATE_READY == state) { + SLOG(LOG_DEBUG, TAG_VCD, "[Server] Current state is READY"); + vcd_recorder_stop(); + return VCD_ERROR_NONE; + } + +#if 0 /* 2. Stop recorder */ vcd_recorder_stop(); +#endif + /* 3. Cancel engine */ int ret = vcd_engine_recognize_cancel(); if (0 != ret) { -- 2.7.4 From ff65c8eed642e1b8d4b8c32183c234df8b91221c Mon Sep 17 00:00:00 2001 From: Suyeon Hwang Date: Thu, 11 May 2017 18:15:33 +0900 Subject: [PATCH 08/16] Fix memory leak Change-Id: I6d8d02a895d84e9a9469930aef3dd2e198a30983 Signed-off-by: Suyeon Hwang --- common/vc_cmd_db.c | 50 +++++++++++++++++++++++++++++++----------------- common/vc_command.c | 1 - server/vcd_client_data.c | 8 ++++++++ server/vcd_dbus.c | 25 ++++++++++++++++++++---- server/vcd_recorder.c | 2 +- 5 files changed, 62 insertions(+), 24 deletions(-) diff --git a/common/vc_cmd_db.c b/common/vc_cmd_db.c index 30e0266..2e35e84 100644 --- a/common/vc_cmd_db.c +++ b/common/vc_cmd_db.c @@ -22,7 +22,7 @@ #include "vc_cmd_db.h" #include "vc_main.h" -#include "voice_control_command.h" +#include "vc_command.h" #include "voice_control_command_expand.h" @@ -361,10 +361,12 @@ static int __vc_db_get_commands(int pid, vc_cmd_type_e type, GSList** cmd_list) while (SQLITE_ROW == ret) { int temp = 0; + int ret = -1; char* temp_text = NULL; - vc_cmd_s* temp_cmd = NULL; - temp_cmd = (vc_cmd_s*)calloc(1, sizeof(vc_cmd_s)); - if (NULL == temp_cmd) { + vc_cmd_h temp_cmd; + ret = vc_cmd_create(&temp_cmd); + + if (0 != ret) { SLOG(LOG_ERROR, vc_db_tag(), "[ERROR] Fail to allocate memory"); if (NULL != appid) { free(appid); @@ -380,12 +382,16 @@ static int __vc_db_get_commands(int pid, vc_cmd_type_e type, GSList** cmd_list) temp_text = (char*)sqlite3_column_text(stmt, 7); if (NULL != temp_text) - temp_cmd->appid = strdup(temp_text); + vc_cmd_set_appid(temp_cmd, temp_text); - if (NULL != appid && NULL != temp_cmd->appid) { - if (VC_COMMAND_TYPE_BACKGROUND == type && 0 == strncmp(appid, temp_cmd->appid, strlen(appid))) { + ret = vc_cmd_get_appid(temp_cmd, &temp_text); + if (NULL != appid && 0 == ret) { + if (VC_COMMAND_TYPE_BACKGROUND == type && 0 == strncmp(appid, temp_text, strlen(appid))) { SLOG(LOG_DEBUG, vc_db_tag(), "Skip get background commands when app is foreground, appid(%s)", appid); + free(temp_text); + temp_text = NULL; + ret = sqlite3_step(stmt); if (SQLITE_DONE == ret) break; @@ -394,41 +400,49 @@ static int __vc_db_get_commands(int pid, vc_cmd_type_e type, GSList** cmd_list) } } + if (NULL != temp_text) { + free(temp_text); + temp_text = NULL; + } + temp = sqlite3_column_int(stmt, 0); - temp_cmd->id = temp; + vc_cmd_set_id(temp_cmd, temp); temp = sqlite3_column_int(stmt, 1); - temp_cmd->pid = temp; + vc_cmd_set_pid(temp_cmd, temp); temp = sqlite3_column_int(stmt, 2); - temp_cmd->type = temp; + vc_cmd_set_type(temp_cmd, temp); temp = sqlite3_column_int(stmt, 3); - temp_cmd->format = temp; + vc_cmd_set_format(temp_cmd, temp); temp = sqlite3_column_int(stmt, 4); - temp_cmd->domain = temp; + vc_cmd_set_domain(temp_cmd, temp); temp_text = (char*)sqlite3_column_text(stmt, 5); if (NULL != temp_text) - temp_cmd->command = strdup(temp_text); + vc_cmd_set_command(temp_cmd, temp_text); temp_text = (char*)sqlite3_column_text(stmt, 6); if (NULL != temp_text) - temp_cmd->parameter = strdup(temp_text); + vc_cmd_set_unfixed_command(temp_cmd, temp_text); temp_text = (char*)sqlite3_column_text(stmt, 8); if (NULL != temp_text) - temp_cmd->invocation_name = strdup(temp_text); + vc_cmd_set_invocation_name(temp_cmd, temp_text); temp_text = (char*)sqlite3_column_text(stmt, 9); if (NULL != temp_text) - temp_cmd->fixed = strdup(temp_text); + vc_cmd_set_fixed_command(temp_cmd, temp_text); - if (type == temp_cmd->type) { + ret = vc_cmd_get_type(temp_cmd, &temp); + if (0 == ret && type == temp) { *cmd_list = g_slist_append(*cmd_list, temp_cmd); } else { - SLOG(LOG_WARN, vc_db_tag(), "[WARNING] Command type(%d) is NOT valid : request type(%d)", temp_cmd->type, type); + SLOG(LOG_WARN, vc_db_tag(), "[WARNING] Command type(%d) is NOT valid : request type(%d)", temp, type); + + vc_cmd_destroy((vc_cmd_h)temp_cmd); } ret = sqlite3_step(stmt); if (SQLITE_DONE == ret) diff --git a/common/vc_command.c b/common/vc_command.c index 38f0299..1478fcd 100644 --- a/common/vc_command.c +++ b/common/vc_command.c @@ -702,7 +702,6 @@ int vc_cmd_create(vc_cmd_h* vc_command) command->key = VC_KEY_NONE; command->modifier = VC_MODIFIER_NONE; command->invocation_name = NULL; - command->parameter = NULL; command->appid = NULL; command->fixed = NULL; diff --git a/server/vcd_client_data.c b/server/vcd_client_data.c index b033950..e7a9a00 100644 --- a/server/vcd_client_data.c +++ b/server/vcd_client_data.c @@ -942,6 +942,10 @@ int vcd_client_add(int pid) if (NULL == g_client_list) { SLOG(LOG_ERROR, TAG_VCD, "[Client Data ERROR] Fail to add new client"); + + free(info); + info = NULL; + return -1; } else { SLOG(LOG_DEBUG, TAG_VCD, "[Client Data SUCCESS] Add new client"); @@ -1263,6 +1267,10 @@ int vcd_client_widget_add(int pid) if (NULL == g_widget_list) { SLOG(LOG_ERROR, TAG_VCD, "[Client Data ERROR] Fail to add new widget"); + + free(info); + info = NULL; + return -1; } else { SLOG(LOG_DEBUG, TAG_VCD, "[Client Data SUCCESS] Add new widget"); diff --git a/server/vcd_dbus.c b/server/vcd_dbus.c index 75a8c63..eed98a8 100644 --- a/server/vcd_dbus.c +++ b/server/vcd_dbus.c @@ -613,10 +613,17 @@ int vcdc_send_dialog(int manger_pid, int pid, const char* disp_text, const char* SLOG(LOG_DEBUG, TAG_VCD, "[Dbus] send dialog : pid(%d), disp_text(%s), utt_text(%s), continue(%d)", pid, disp_text, utt_text, continuous); - if (NULL == disp_text) - disp_text = strdup("#NULL"); - if (NULL == utt_text) - utt_text = strdup("#NULL"); + char* disp_null = NULL; + char* utt_null = NULL; + if (NULL == disp_text) { + disp_null = strdup("#NULL"); + disp_text = disp_null; + } + + if (NULL == utt_text) { + utt_null = strdup("#NULL"); + utt_text = utt_null; + } dbus_message_append_args(msg, DBUS_TYPE_INT32, &pid, @@ -637,6 +644,16 @@ int vcdc_send_dialog(int manger_pid, int pid, const char* disp_text, const char* dbus_message_unref(msg); + if (NULL != disp_null) { + free(disp_null); + disp_null = NULL; + } + + if (NULL != utt_null) { + free(utt_null); + utt_null = NULL; + } + return 0; } diff --git a/server/vcd_recorder.c b/server/vcd_recorder.c index 6202720..25df611 100644 --- a/server/vcd_recorder.c +++ b/server/vcd_recorder.c @@ -754,7 +754,7 @@ int vcd_recorder_stop() #endif } - if (0 != strncmp(g_current_audio_type, VCP_AUDIO_ID_NONE, sizeof(VCP_AUDIO_ID_NONE))) { + if (NULL != g_current_audio_type && 0 != strncmp(g_current_audio_type, VCP_AUDIO_ID_NONE, sizeof(VCP_AUDIO_ID_NONE))) { vcd_recorder_set(VCP_AUDIO_ID_NONE, VCP_AUDIO_TYPE_PCM_S16_LE, 16000, 1); vcd_engine_set_audio_type(VCP_AUDIO_ID_NONE); } -- 2.7.4 From 28ec881df62d707cf7ba5001609205ed5d7b672a Mon Sep 17 00:00:00 2001 From: Kwangyoun Kim Date: Fri, 19 May 2017 11:19:28 +0900 Subject: [PATCH 09/16] Fix invalid access when error message is NULL Change-Id: If46596e96d2f24660e04b1fb4896c36f29fdc244 --- server/vcd_server.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/server/vcd_server.c b/server/vcd_server.c index bed1370..9242c83 100644 --- a/server/vcd_server.c +++ b/server/vcd_server.c @@ -900,7 +900,11 @@ static void __vcd_server_error_cb(vcp_error_e error, const char* msg, void *user ecore_main_loop_thread_safe_call_async(__cancel_by_error, NULL); char* error_msg = NULL; - error_msg = strdup(msg); + if (NULL != msg) { + error_msg = strdup(msg); + } else { + error_msg = strdup("no message"); + } if (0 != vcdc_send_error_signal_to_manager(vcd_client_manager_get_pid(), error, error_msg)) { SLOG(LOG_ERROR, TAG_VCD, "[Server ERROR] Fail to send error signal"); -- 2.7.4 From 99eb889e3af8784d5123249b5c903e9d4cd6fcd4 Mon Sep 17 00:00:00 2001 From: Kwangyoun Kim Date: Fri, 19 May 2017 14:06:02 +0900 Subject: [PATCH 10/16] Change instant error message to NULL Change-Id: I5513aa24edbd8d6b6b3626ee12b0dd25bb891224 --- client/vc_mgr_dbus.c | 14 +++++++++++--- server/vcd_dbus.c | 25 ++++++++++++++++++------- server/vcd_server.c | 2 -- 3 files changed, 29 insertions(+), 12 deletions(-) diff --git a/client/vc_mgr_dbus.c b/client/vc_mgr_dbus.c index 06175e3..dde3532 100644 --- a/client/vc_mgr_dbus.c +++ b/client/vc_mgr_dbus.c @@ -261,7 +261,7 @@ static Eina_Bool vc_mgr_listener_event_callback(void* data, Ecore_Fd_Handler *fd SLOG(LOG_DEBUG, TAG_VCM, "===== Get Error"); int reason; int daemon_pid; - char* err_msg; + char* err_msg = NULL; dbus_message_get_args(msg, &err, DBUS_TYPE_INT32, &reason, @@ -273,8 +273,16 @@ static Eina_Bool vc_mgr_listener_event_callback(void* data, Ecore_Fd_Handler *fd SLOG(LOG_ERROR, TAG_VCM, "<<<< vc mgr Get Error message : Get arguments error (%s)", err.message); dbus_error_free(&err); } else { - SLOG(LOG_ERROR, TAG_VCM, "<<<< vc mgr Get Error message : reason(%d), daemon_pid(%d), msg(%s)", reason, daemon_pid, err_msg); - __vc_mgr_cb_error(reason, daemon_pid, err_msg); + char* temp_msg = NULL; + if (NULL != err_msg && strcmp("#NULL", err_msg)) { + temp_msg = strdup(err_msg); + } + SLOG(LOG_ERROR, TAG_VCM, "<<<< vc mgr Get Error message : reason(%d), daemon_pid(%d), msg(%s)", reason, daemon_pid, temp_msg); + __vc_mgr_cb_error(reason, daemon_pid, temp_msg); + if (NULL != temp_msg) { + free(temp_msg); + temp_msg = NULL; + } } SLOG(LOG_DEBUG, TAG_VCM, "====="); diff --git a/server/vcd_dbus.c b/server/vcd_dbus.c index eed98a8..45c5e4c 100644 --- a/server/vcd_dbus.c +++ b/server/vcd_dbus.c @@ -661,11 +661,6 @@ int vcdc_send_error_signal_to_manager(int manager_pid, int reason, char *err_msg { SLOG(LOG_ERROR, TAG_VCD, ">>>> Send error signal to manager"); - if (NULL == err_msg) { - SLOG(LOG_ERROR, TAG_VCD, "[Dbus ERROR] Input parameter is NULL"); - return VCD_ERROR_INVALID_PARAMETER; - } - if (0 != __dbus_check()) { return VCD_ERROR_OPERATION_FAILED; } @@ -686,18 +681,34 @@ int vcdc_send_error_signal_to_manager(int manager_pid, int reason, char *err_msg return VCD_ERROR_OUT_OF_MEMORY; } + char *temp_msg = NULL; + if (NULL == err_msg) { + SLOG(LOG_WARN, TAG_VCD, "[Dbus ERROR] Input parameter is NULL"); + temp_msg = strdup("#NULL"); + } else { + temp_msg = strdup(err_msg); + } + daemon_pid = getpid(); - dbus_message_append_args(msg, DBUS_TYPE_INT32, &reason, DBUS_TYPE_INT32, &daemon_pid, DBUS_TYPE_STRING, &err_msg, DBUS_TYPE_INVALID); + dbus_message_append_args(msg, DBUS_TYPE_INT32, &reason, DBUS_TYPE_INT32, &daemon_pid, DBUS_TYPE_STRING, &temp_msg, DBUS_TYPE_INVALID); if (1 != dbus_connection_send(g_conn_sender, msg, NULL)) { SLOG(LOG_ERROR, TAG_VCD, "[Dbus ERROR] Fail to Send"); + if (NULL != temp_msg) { + free(temp_msg); + temp_msg = NULL; + } return VCD_ERROR_OPERATION_FAILED; } else { - SLOG(LOG_DEBUG, TAG_VCD, "<<<< Send error signal to manager : reason(%d), Error Msg(%s)", reason, err_msg); + SLOG(LOG_DEBUG, TAG_VCD, "<<<< Send error signal to manager : reason(%d), Error Msg(%s)", reason, temp_msg); dbus_connection_flush(g_conn_sender); } dbus_message_unref(msg); + if (NULL != temp_msg) { + free(temp_msg); + temp_msg = NULL; + } return 0; } diff --git a/server/vcd_server.c b/server/vcd_server.c index 9242c83..681ae9f 100644 --- a/server/vcd_server.c +++ b/server/vcd_server.c @@ -902,8 +902,6 @@ static void __vcd_server_error_cb(vcp_error_e error, const char* msg, void *user char* error_msg = NULL; if (NULL != msg) { error_msg = strdup(msg); - } else { - error_msg = strdup("no message"); } if (0 != vcdc_send_error_signal_to_manager(vcd_client_manager_get_pid(), error, error_msg)) { -- 2.7.4 From 47705d5c12eafba6747b17402dbd064e4d970599 Mon Sep 17 00:00:00 2001 From: Hwankyu Jhun Date: Fri, 19 May 2017 13:39:00 +0900 Subject: [PATCH 11/16] Fix build dependency The app-control API package is capi-appfw-app-control. Change-Id: I5959c9fe163512c8374c8d331706ca3ef93bed48 Signed-off-by: Hwankyu Jhun --- CMakeLists.txt | 4 ++-- client/vc_mgr.c | 1 - packaging/voice-control.spec | 2 +- server/vcd_server.c | 2 +- 4 files changed, 4 insertions(+), 5 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index bb246fd..339df7f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -42,12 +42,12 @@ INCLUDE_DIRECTORIES("${CMAKE_SOURCE_DIR}/include") INCLUDE(FindPkgConfig) IF("${_TV_PRODUCT}" STREQUAL "TRUE") pkg_check_modules(pkgs REQUIRED - aul capi-appfw-application capi-appfw-app-manager capi-base-common capi-media-audio-io capi-media-sound-manager ecore-wayland + aul capi-appfw-app-control capi-appfw-app-manager capi-base-common capi-media-audio-io capi-media-sound-manager ecore-wayland capi-network-bluetooth capi-system-info cynara-client cynara-session dbus-1 db-util dlog ecore glib-2.0 json-glib-1.0 libtzplatform-config libxml-2.0 sqlite3 vconf msfapi ) ELSE() pkg_check_modules(pkgs REQUIRED - aul capi-appfw-application capi-appfw-app-manager capi-base-common capi-media-audio-io capi-media-sound-manager ecore-wayland + aul capi-appfw-app-control capi-appfw-app-manager capi-base-common capi-media-audio-io capi-media-sound-manager ecore-wayland capi-system-info cynara-client cynara-session dbus-1 db-util dlog ecore glib-2.0 json-glib-1.0 libtzplatform-config libxml-2.0 sqlite3 vconf ) ENDIF() diff --git a/client/vc_mgr.c b/client/vc_mgr.c index 26b1630..b64bdaa 100644 --- a/client/vc_mgr.c +++ b/client/vc_mgr.c @@ -14,7 +14,6 @@ * limitations under the License. */ -#include #include #include diff --git a/packaging/voice-control.spec b/packaging/voice-control.spec index 25c0471..1ea14a4 100644 --- a/packaging/voice-control.spec +++ b/packaging/voice-control.spec @@ -11,7 +11,7 @@ Requires(post): /sbin/ldconfig Requires(postun): /sbin/ldconfig BuildRequires: pkgconfig(aul) -BuildRequires: pkgconfig(capi-appfw-application) +BuildRequires: pkgconfig(capi-appfw-app-control) BuildRequires: pkgconfig(capi-appfw-app-manager) BuildRequires: pkgconfig(capi-base-common) BuildRequires: pkgconfig(capi-media-audio-io) diff --git a/server/vcd_server.c b/server/vcd_server.c index 681ae9f..23675a8 100644 --- a/server/vcd_server.c +++ b/server/vcd_server.c @@ -14,7 +14,7 @@ * limitations under the License. */ -#include +#include #include #include #include -- 2.7.4 From 807585486b2a6e7c25753735e486f6b9e26acdb2 Mon Sep 17 00:00:00 2001 From: Kwangyoun Kim Date: Tue, 30 May 2017 11:32:46 +0900 Subject: [PATCH 12/16] Change BT internal APIS Change-Id: Id7c2be600885e62974b61ae757e66477a6001cc7 --- CMakeLists.txt | 2 +- packaging/voice-control.spec | 3 ++- server/vcd_recorder.c | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 339df7f..86be582 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -43,7 +43,7 @@ INCLUDE(FindPkgConfig) IF("${_TV_PRODUCT}" STREQUAL "TRUE") pkg_check_modules(pkgs REQUIRED aul capi-appfw-app-control capi-appfw-app-manager capi-base-common capi-media-audio-io capi-media-sound-manager ecore-wayland - capi-network-bluetooth capi-system-info cynara-client cynara-session dbus-1 db-util dlog ecore glib-2.0 json-glib-1.0 libtzplatform-config libxml-2.0 sqlite3 vconf msfapi + capi-network-bluetooth capi-network-bluetooth-tv capi-system-info cynara-client cynara-session dbus-1 db-util dlog ecore glib-2.0 json-glib-1.0 libtzplatform-config libxml-2.0 sqlite3 vconf msfapi ) ELSE() pkg_check_modules(pkgs REQUIRED diff --git a/packaging/voice-control.spec b/packaging/voice-control.spec index 1ea14a4..4a21c0f 100644 --- a/packaging/voice-control.spec +++ b/packaging/voice-control.spec @@ -16,7 +16,6 @@ BuildRequires: pkgconfig(capi-appfw-app-manager) BuildRequires: pkgconfig(capi-base-common) BuildRequires: pkgconfig(capi-media-audio-io) BuildRequires: pkgconfig(capi-media-sound-manager) -BuildRequires: pkgconfig(capi-network-bluetooth) BuildRequires: pkgconfig(capi-system-info) BuildRequires: pkgconfig(cynara-client) BuildRequires: pkgconfig(cynara-session) @@ -31,6 +30,8 @@ BuildRequires: pkgconfig(libtzplatform-config) BuildRequires: pkgconfig(libxml-2.0) BuildRequires: pkgconfig(sqlite3) %if "%{PRODUCT_TYPE}" == "TV" +BuildRequires: pkgconfig(capi-network-bluetooth) +BuildRequires: pkgconfig(capi-network-bluetooth-tv) BuildRequires: pkgconfig(msfapi) %endif BuildRequires: pkgconfig(vconf) diff --git a/server/vcd_recorder.c b/server/vcd_recorder.c index 25df611..324b2bf 100644 --- a/server/vcd_recorder.c +++ b/server/vcd_recorder.c @@ -24,7 +24,7 @@ #include #ifdef TV_PRODUCT #ifdef TV_BT_MODE -#include +#include #endif #ifdef TV_MSF_WIFI_MODE #include -- 2.7.4 From 33255c363e850a3025e606bd024f1d6ddd55de48 Mon Sep 17 00:00:00 2001 From: Wonnam Jang Date: Wed, 7 Jun 2017 19:32:30 +0900 Subject: [PATCH 13/16] Remove to check processing state in result callback from engine Change-Id: I9f062c969facab7377859154113889b16328b849 Signed-off-by: Wonnam Jang --- server/vcd_server.c | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/server/vcd_server.c b/server/vcd_server.c index 23675a8..fdad45b 100644 --- a/server/vcd_server.c +++ b/server/vcd_server.c @@ -465,13 +465,6 @@ static void* __recorder_stop(void *data) static void __vcd_server_result_cb(vcp_result_event_e event, int* result_id, int count, const char* all_result, const char* non_fixed_result, const char* nlu_result, const char* msg, void *user_data) { - if (VCD_STATE_PROCESSING != vcd_config_get_service_state()) { - if (VCD_RECOGNITION_MODE_RESTART_CONTINUOUSLY != vcd_client_get_recognition_mode()) { - SLOG(LOG_ERROR, TAG_VCD, "[Server ERROR] Current state is not 'Processing' and mode is not 'Restart continuously'"); - return; - } - } - vc_info_parser_unset_result(vcd_client_manager_get_exclusive()); vcd_client_manager_set_result_text(all_result); @@ -1804,6 +1797,8 @@ int vcd_server_mgr_do_action(int pid, int type, const char* action) if (0 != ret) { SLOG(LOG_ERROR, TAG_VCD, "[Server ERROR] Fail to process do action : %d", ret); } else { + vcd_config_set_service_state(VCD_STATE_PROCESSING); + vcdc_send_service_state(VCD_STATE_PROCESSING); SLOG(LOG_DEBUG, TAG_VCD, "[Server SUCCESS] Process do action"); } -- 2.7.4 From c5636cd761cbddacb5c4a1c46f4ec340a278c0ec Mon Sep 17 00:00:00 2001 From: Wonnam Jang Date: Wed, 21 Jun 2017 15:59:54 +0900 Subject: [PATCH 14/16] Fix timing issue to hide tooltip when voice touch is consumed Change-Id: I4c96ffae5320a793af876066262cc781a1b72884 Signed-off-by: Wonnam Jang --- client/vc_widget.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/client/vc_widget.c b/client/vc_widget.c index c671570..6dfb664 100644 --- a/client/vc_widget.c +++ b/client/vc_widget.c @@ -1061,7 +1061,7 @@ static Eina_Bool __vc_widget_start_recording(void *data) } -static Eina_Bool __vc_widget_notify_tooltip(void *data) +static void __vc_widget_notify_tooltip(void *data) { bool show = (bool)data; @@ -1099,12 +1099,12 @@ static Eina_Bool __vc_widget_notify_tooltip(void *data) g_w_start_timer = ecore_timer_add(0, __vc_widget_start_recording, NULL); } - return EINA_FALSE; + return; } void __vc_widget_cb_show_tooltip(int pid, bool show) { - ecore_timer_add(0, __vc_widget_notify_tooltip, (void*)show); + ecore_main_loop_thread_safe_call_async(__vc_widget_notify_tooltip, (void*)show); } static Eina_Bool __vc_widget_notify_result(void *data) -- 2.7.4 From ad52a9427db528819c096faf7d247fbd04d79bc0 Mon Sep 17 00:00:00 2001 From: Wonnam Jang Date: Wed, 21 Jun 2017 20:12:11 +0900 Subject: [PATCH 15/16] Fix dangling pointer issue with command list Change-Id: I028c2f9972c587b2143d1dc0e225eb80dd1f5af5 Signed-off-by: Wonnam Jang --- common/vc_command.c | 34 ++++++++++++++++++++++++++++++---- 1 file changed, 30 insertions(+), 4 deletions(-) diff --git a/common/vc_command.c b/common/vc_command.c index 1478fcd..5ae5859 100644 --- a/common/vc_command.c +++ b/common/vc_command.c @@ -37,6 +37,8 @@ static int g_feature_enabled = -1; static int g_privilege_allowed = 1; /* Always True */ static cynara *p_cynara = NULL; +static GList *g_cmdlist_list = NULL; + // For getting timestamp using regular expression static regex_t reg[MAX_NUM_REGEX]; @@ -178,6 +180,8 @@ int vc_cmd_list_create(vc_cmd_list_h* vc_cmd_list) *vc_cmd_list = (vc_cmd_list_h)list; + g_cmdlist_list = g_list_append(g_cmdlist_list, list); + SLOG(LOG_DEBUG, TAG_VCCMD, "[List] list(%p)", *vc_cmd_list); return VC_ERROR_NONE; @@ -204,12 +208,34 @@ int vc_cmd_list_destroy(vc_cmd_list_h vc_cmd_list, bool release_command) SLOG(LOG_DEBUG, TAG_VCCMD, "[List] list(%p)", list); - if (NULL != list) { - free(list); - list = NULL; + GList *iter = NULL; + vc_cmd_list_s *data = NULL; + + /* if list have item */ + if (g_list_length(g_cmdlist_list) > 0) { + /* Get a first item */ + iter = g_list_first(g_cmdlist_list); + + while (NULL != iter) { + data = iter->data; + if (data && list == data) { + g_cmdlist_list = g_list_remove_link(g_cmdlist_list, iter); + + free(data); + data = NULL; + + SLOG(LOG_DEBUG, TAG_VCCMD, "Client destroy"); + g_list_free(iter); + + return VC_ERROR_NONE; + } + /* Next item */ + iter = g_list_next(iter); + } } + SLOG(LOG_ERROR, TAG_VCCMD, "Fail to destroy client : handle is not valid"); - return VC_ERROR_NONE; + return VC_ERROR_INVALID_PARAMETER; } int vc_cmd_list_get_count(vc_cmd_list_h vc_cmd_list, int* count) -- 2.7.4 From f5bad5dfbdf2b672bdccb68500f90c8f9c2812a5 Mon Sep 17 00:00:00 2001 From: Wonnam Jang Date: Wed, 28 Jun 2017 16:59:41 +0900 Subject: [PATCH 16/16] Fix dlog format argument error Change-Id: I9cdb77a7a4faea05d6b6db6d690f14ad7c1adac5 Signed-off-by: Wonnam Jang --- common/vc_cmd_db.c | 2 +- common/vc_command.c | 2 +- common/vc_json_parser.c | 2 +- server/vcd_dbus_server.c | 2 +- server/vcd_recorder.c | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/common/vc_cmd_db.c b/common/vc_cmd_db.c index 2e35e84..ca87d8b 100644 --- a/common/vc_cmd_db.c +++ b/common/vc_cmd_db.c @@ -759,7 +759,7 @@ static int __vc_db_get_result(char** result_text, int* event, char** msg, int pi if (-1 == pid) SLOG(LOG_DEBUG, vc_db_tag(), "[SQL] %s", sql); else if (NULL != appid) - SLOG(LOG_DEBUG, vc_db_tag(), "[SQL] SELECT * FROM vc_result WHERE appid = %d;", appid); + SLOG(LOG_DEBUG, vc_db_tag(), "[SQL] SELECT * FROM vc_result WHERE appid = %s;", appid); else SLOG(LOG_DEBUG, vc_db_tag(), "[SQL] SELECT * FROM vc_result WHERE pid = %d;", pid); diff --git a/common/vc_command.c b/common/vc_command.c index 5ae5859..1263d48 100644 --- a/common/vc_command.c +++ b/common/vc_command.c @@ -2314,7 +2314,7 @@ int vc_cmd_get_datetime(const char *text, time_t *result, char **remain) if (g_time_flag > 0 || g_date_flag > 0) { *result = mktime(&td); - SLOG(LOG_DEBUG, TAG_VCCMD, "Timestamp in the text = %d", *result); + SLOG(LOG_DEBUG, TAG_VCCMD, "Timestamp in the text = %ld", *result); SLOG(LOG_DEBUG, TAG_VCCMD, "%d-%d-%d (%s), %d:%d:%d", td.tm_year + 1900, td.tm_mon + 1, td.tm_mday, day_name[td.tm_wday], td.tm_hour, td.tm_min, td.tm_sec, td.tm_yday); diff --git a/common/vc_json_parser.c b/common/vc_json_parser.c index 8ab0e4f..3f6a487 100755 --- a/common/vc_json_parser.c +++ b/common/vc_json_parser.c @@ -388,7 +388,7 @@ int vc_json_set_commands_from_file(const char* file_path, vc_cmd_type_e type, ch parser = json_parser_new(); json_parser_load_from_file(parser, file_path, &err_msg); if (err_msg) { - SLOG(LOG_ERROR, vc_json_tag(), "[ERROR] Fail to load json file, file_path(%s), err_msg(%s)", file_path, err_msg); + SLOG(LOG_ERROR, vc_json_tag(), "[ERROR] Fail to load json file, file_path(%s), err_msg(%s)", file_path, err_msg->message); g_error_free(err_msg); g_object_unref(parser); return VC_ERROR_OPERATION_FAILED; diff --git a/server/vcd_dbus_server.c b/server/vcd_dbus_server.c index 169e3f4..45c92ec 100644 --- a/server/vcd_dbus_server.c +++ b/server/vcd_dbus_server.c @@ -33,7 +33,7 @@ int __dbus_error_return(DBusConnection* conn, DBusMessage* msg, int ret) DBUS_TYPE_INVALID); if (0 == ret) { - SLOG(LOG_DEBUG, TAG_VCD, "[OUT SUCCESS] Result(%d)"); + SLOG(LOG_DEBUG, TAG_VCD, "[OUT SUCCESS] Result(%d)", ret); } else { SLOG(LOG_ERROR, TAG_VCD, "[OUT ERROR] Result(%d)", ret); } diff --git a/server/vcd_recorder.c b/server/vcd_recorder.c index 324b2bf..a04f281 100644 --- a/server/vcd_recorder.c +++ b/server/vcd_recorder.c @@ -119,7 +119,7 @@ static void __msf_wifi_audio_data_receive_cb(msf_wifi_voice_data_s *voice_data, } if (0 == g_buffer_count || 0 == g_buffer_count % 50) { - SLOG(LOG_WARN, TAG_VCD, "[Recorder][%d] Recording... : read_size(%d)", g_buffer_count, voice_data->length); + SLOG(LOG_WARN, TAG_VCD, "[Recorder][%d] Recording... : read_size(%ld)", g_buffer_count, voice_data->length); if (100000 == g_buffer_count) g_buffer_count = 0; -- 2.7.4