From: sooyeon.kim Date: Wed, 19 Sep 2018 07:06:51 +0000 (+0900) Subject: Support Multi-Assistant X-Git-Tag: accepted/tizen/unified/20180928.142135~1^2 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=refs%2Fchanges%2F61%2F189661%2F9;p=platform%2Fcore%2Fuifw%2Fvoice-control.git Support Multi-Assistant Change-Id: I062eadc3b60af5051a3460a5d6d9388796da3e48 Signed-off-by: sooyeon.kim --- diff --git a/client/vc_mgr.c b/client/vc_mgr.c index 17bbbb8..fee9d82 100644 --- a/client/vc_mgr.c +++ b/client/vc_mgr.c @@ -213,7 +213,6 @@ static int __vc_mgr_check_privilege() __check_privilege_deinitialize(); } - g_privilege_allowed = 1; return VC_ERROR_NONE; } @@ -270,6 +269,14 @@ int vc_mgr_initialize(void) return ret; } + ret = vc_mgr_client_set_audio_streaming_mode(g_vc_m, VC_AUDIO_STREAMING_MODE_VC_SERVICE); + if (0 != ret) { + SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to set audio streaming mode : %d", ret); + vc_config_mgr_finalize(g_vc_m->handle + VC_MANAGER_CONFIG_HANDLE); + vc_mgr_client_destroy(g_vc_m); + return ret; + } + /* for TTS feedback */ /* ret = vc_mgr_player_init(); if (0 != ret) { @@ -377,7 +384,10 @@ static Eina_Bool __vc_mgr_connect_daemon(void *data) g_m_connect_timer = NULL; - ret = vc_mgr_dbus_request_initialize(g_vc_m->handle, &service_state, &foreground, &g_daemon_pid); + vc_audio_streaming_mode_e streaming_mode; + vc_mgr_client_get_audio_streaming_mode(g_vc_m, &streaming_mode); + + ret = vc_mgr_dbus_request_initialize(g_vc_m->handle, (int)streaming_mode, &service_state, &foreground, &g_daemon_pid); if (VC_ERROR_ENGINE_NOT_FOUND == ret) { SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to initialize : %s", __vc_mgr_get_error_code(ret)); @@ -4255,3 +4265,93 @@ int vc_mgr_send_utterance_status(int pid, int utt_id, int utt_status) return 0; } +int vc_mgr_send_audio_streaming(vc_audio_streaming_event_e event, unsigned char* buffer, unsigned int len) +{ + SLOG(LOG_DEBUG, TAG_VCM, "[Manager] Send audio streaming to the engine service"); + + if (NULL == buffer) { + SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid parameter"); + return VC_ERROR_INVALID_PARAMETER; + } + + if (0 != __vc_mgr_get_feature_enabled()) { + SLOG(LOG_DEBUG, TAG_VCM, "@@@ [Manager] not supported"); + return VC_ERROR_NOT_SUPPORTED; + } + + if (0 != __vc_mgr_check_privilege()) { + return VC_ERROR_PERMISSION_DENIED; + } + + vc_state_e state; + if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) { + SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available"); + SLOG(LOG_DEBUG, TAG_VCM, "@@@"); + return VC_ERROR_INVALID_STATE; + } + + /* check state */ + if (state != VC_STATE_READY) { + + SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: Current state is not 'READY'"); + SLOG(LOG_DEBUG, TAG_VCM, "@@@"); + return VC_ERROR_INVALID_STATE; + } + + /* Check service state */ + vc_service_state_e service_state = -1; + vc_mgr_client_get_service_state(g_vc_m, &service_state); + if (VC_SERVICE_STATE_READY != service_state && VC_SERVICE_STATE_RECORDING != service_state) { + + SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: service state is not 'READY' and 'RECORDING', state(%d)", service_state); + SLOG(LOG_DEBUG, TAG_VCM, "@@@"); + return VC_ERROR_INVALID_STATE; + } + + /* send audio streaming */ + int ret = vc_mgr_dbus_send_audio_streaming(g_vc_m->handle, event, buffer, len); + if (0 != ret) { + SLOG(LOG_WARN, TAG_VCM, "[WARNING] retry to send audio streaming data"); + } else { + SLOG(LOG_DEBUG, TAG_VCM, "[DEBUG] Success to send"); + } + + return ret; +} + +int vc_mgr_set_audio_streaming_mode(vc_audio_streaming_mode_e streaming_mode) +{ + SLOG(LOG_DEBUG, TAG_VCM, "[Manager] Set multi assistant mode"); + + if (0 != __vc_mgr_get_feature_enabled()) { + SLOG(LOG_DEBUG, TAG_VCM, "@@@ [Manager] not supported"); + return VC_ERROR_NOT_SUPPORTED; + } + + if (0 != __vc_mgr_check_privilege()) { + return VC_ERROR_PERMISSION_DENIED; + } + + vc_state_e state; + if (0 != vc_mgr_client_get_client_state(g_vc_m, &state)) { + SLOG(LOG_ERROR, TAG_VCM, "[ERROR] A handle is not available"); + SLOG(LOG_DEBUG, TAG_VCM, "@@@"); + return VC_ERROR_INVALID_STATE; + } + + /* check state */ + if (state != VC_STATE_INITIALIZED) { + + SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Invalid State: Current state is not 'INITIALIZED', state(%d)", state); + SLOG(LOG_DEBUG, TAG_VCM, "@@@"); + return VC_ERROR_INVALID_STATE; + } + + int ret = vc_mgr_client_set_audio_streaming_mode(g_vc_m, streaming_mode); + if (0 != ret) { + SLOG(LOG_ERROR, TAG_VCM, "[ERROR] Fail to set multi assistant mode, ret(%d)", ret); + return VC_ERROR_INVALID_STATE; + } + + return ret; +} diff --git a/client/vc_mgr_client.c b/client/vc_mgr_client.c index 9f5124d..2317c43 100644 --- a/client/vc_mgr_client.c +++ b/client/vc_mgr_client.c @@ -102,6 +102,9 @@ typedef struct { /* foreground pid */ int foreground_pid; + + /* multi-assistant */ + vc_audio_streaming_mode_e streaming_mode; } vc_mgr_client_s; typedef struct { @@ -227,6 +230,8 @@ int vc_mgr_client_create(vc_h* vc) client->foreground_pid = VC_RUNTIME_INFO_NO_FOREGROUND; + client->streaming_mode = VC_AUDIO_STREAMING_MODE_VC_SERVICE; + g_mgr_client_list = g_slist_append(g_mgr_client_list, client); *vc = temp; @@ -1322,3 +1327,29 @@ int vc_mgr_client_get_specific_engine_result_cb(vc_h vc, vc_mgr_specific_engine_ return 0; } + +int vc_mgr_client_set_audio_streaming_mode(vc_h vc, vc_audio_streaming_mode_e streaming_mode) +{ + vc_mgr_client_s* client = __mgr_client_get(vc); + + /* check handle */ + if (NULL == client) + return VC_ERROR_INVALID_PARAMETER; + + client->streaming_mode = streaming_mode; + + return 0; +} + +int vc_mgr_client_get_audio_streaming_mode(vc_h vc, vc_audio_streaming_mode_e* streaming_mode) +{ + vc_mgr_client_s* client = __mgr_client_get(vc); + + /* check handle */ + if (NULL == client) + return VC_ERROR_INVALID_PARAMETER; + + *streaming_mode = client->streaming_mode; + + return 0; +} diff --git a/client/vc_mgr_client.h b/client/vc_mgr_client.h index 9128f95..3ee6512 100644 --- a/client/vc_mgr_client.h +++ b/client/vc_mgr_client.h @@ -21,6 +21,7 @@ #include "vc_info_parser.h" #include "voice_control_manager.h" +#include "voice_control_manager_internal.h" #ifdef __cplusplus extern "C" { @@ -111,7 +112,6 @@ int vc_mgr_client_set_vc_tts_streaming_cb(vc_h vc, vc_mgr_vc_tts_streaming_cb ca int vc_mgr_client_get_vc_tts_streaming_cb(vc_h vc, vc_mgr_vc_tts_streaming_cb* callback, void** user_data); - /* * set/get option */ @@ -161,6 +161,11 @@ int vc_mgr_client_set_foreground(vc_h vc, int pid, bool value); int vc_mgr_client_get_foreground(vc_h vc, int* pid); +int vc_mgr_client_set_multi_assistant(vc_h vc, bool use_multi_assistant); + +int vc_mgr_client_get_multi_assistant(vc_h vc, bool* use_multi_assistant); + + /* utils */ int vc_mgr_client_get_count(); @@ -185,6 +190,12 @@ int vc_mgr_client_set_start_by_client(vc_h vc, bool option); int vc_mgr_client_get_start_by_client(vc_h vc, bool* option); +/* multi assistant */ +int vc_mgr_client_set_audio_streaming_mode(vc_h vc, vc_audio_streaming_mode_e streaming_mode); + +int vc_mgr_client_get_audio_streaming_mode(vc_h vc, vc_audio_streaming_mode_e* streaming_mode); + + #ifdef __cplusplus } #endif diff --git a/client/vc_mgr_dbus.c b/client/vc_mgr_dbus.c index 8f8adf6..f889e43 100644 --- a/client/vc_mgr_dbus.c +++ b/client/vc_mgr_dbus.c @@ -891,7 +891,7 @@ static int __dbus_restore_daemon() return ret; } -int vc_mgr_dbus_request_initialize(int pid, int* service_state, int* foreground, int* daemon_pid) +int vc_mgr_dbus_request_initialize(int pid, int audio_streaming_mode, int* service_state, int* foreground, int* daemon_pid) { DBusError err; dbus_error_init(&err); @@ -929,6 +929,7 @@ int vc_mgr_dbus_request_initialize(int pid, int* service_state, int* foreground, dbus_message_append_args(msg, DBUS_TYPE_INT32, &pid, + DBUS_TYPE_INT32, &audio_streaming_mode, DBUS_TYPE_INVALID); DBusMessage* result_msg; @@ -2301,8 +2302,6 @@ int vc_mgr_dbus_send_specific_engine_request(int pid, const char* engine_app_id, int vc_mgr_dbus_send_utterance_status(int pid, int utt_id, int utt_status) { DBusMessage* msg; - - /* create a signal & check for errors */ msg = __get_message(pid, VC_MANAGER_METHOD_UTTERANCE_STATUS, VC_COMMAND_TYPE_FOREGROUND); if (NULL == msg) { @@ -2329,3 +2328,42 @@ int vc_mgr_dbus_send_utterance_status(int pid, int utt_id, int utt_status) return 0; } + +int vc_mgr_dbus_send_audio_streaming(int pid, vc_audio_streaming_event_e event, unsigned char* buffer, unsigned int len) +{ + DBusMessage* msg; + msg = dbus_message_new_method_call( + VC_SERVER_SERVICE_NAME, + VC_SERVER_SERVICE_OBJECT_PATH, + VC_SERVER_SERVICE_INTERFACE, + VC_MANAGER_METHOD_SEND_AUDIO_STREAMING); + + if (NULL == msg) { + SLOG(LOG_ERROR, TAG_VCM, "@@ vc send audio streaming : Fail to make message"); + return VC_ERROR_OPERATION_FAILED; + } else { + SLOG(LOG_DEBUG, TAG_VCM, "@@ vc send audio streaming : pid(%d), event(%d), buffer(%p), len(%d)", pid, event, buffer, len); + } + + dbus_message_append_args(msg, + DBUS_TYPE_INT32, &pid, + DBUS_TYPE_INT32, &event, + DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE, + &buffer, len, + DBUS_TYPE_INVALID); + + dbus_message_set_no_reply(msg, TRUE); + + /* send dbus message and flush the connection */ + if (!dbus_connection_send(g_m_conn_sender, msg, NULL)) { + SLOG(LOG_ERROR, TAG_VCM, "[Dbus ERROR] Fail to send audio streaming"); + } else { + SLOG(LOG_DEBUG, TAG_VCM, "[Dbus DEBUG] Success to send audio streaming"); + dbus_connection_flush(g_m_conn_sender); + } + + dbus_message_unref(msg); + + return 0; +} + diff --git a/client/vc_mgr_dbus.h b/client/vc_mgr_dbus.h index b0b5c2f..9ce1239 100644 --- a/client/vc_mgr_dbus.h +++ b/client/vc_mgr_dbus.h @@ -18,6 +18,8 @@ #ifndef __VC_DBUS_H_ #define __VC_DBUS_H_ +#include "voice_control_manager_internal.h" + #ifdef __cplusplus extern "C" { @@ -30,7 +32,7 @@ int vc_mgr_dbus_close_connection(); int vc_mgr_dbus_request_hello(); -int vc_mgr_dbus_request_initialize(int pid, int* service_state, int* foreground, int* daemon_pid); +int vc_mgr_dbus_request_initialize(int pid, int audio_streaming_mode, int* service_state, int* foreground, int* daemon_pid); int vc_mgr_dbus_request_finalize(int pid); @@ -76,6 +78,7 @@ int vc_mgr_dbus_request_stop_feedback(int pid); int vc_mgr_dbus_send_utterance_status(int pid, int utt_id, int utt_status); +int vc_mgr_dbus_send_audio_streaming(int pid, vc_audio_streaming_event_e event, unsigned char* buffer, unsigned int len); #ifdef __cplusplus } diff --git a/common/vc_defs.h b/common/vc_defs.h index 0458c37..55fc210 100644 --- a/common/vc_defs.h +++ b/common/vc_defs.h @@ -151,6 +151,8 @@ extern "C" { #define VC_MANAGER_METHOD_STOP_FEEDBACK "vc_manager_method_request_stop_feedback" #define VC_MANAGER_METHOD_UTTERANCE_STATUS "vc_manager_method_utterance_status" +#define VC_MANAGER_METHOD_SEND_AUDIO_STREAMING "vc_manager_method_send_audio_streaming" + #define VCD_MANAGER_METHOD_HELLO "vcd_manager_method_hello" #define VCD_MANAGER_METHOD_SPEECH_DETECTED "vcd_manager_method_speech_detected" #define VCD_MANAGER_METHOD_ALL_RESULT "vcd_manager_method_all_result" diff --git a/include/voice_control_manager_internal.h b/include/voice_control_manager_internal.h index c06d38b..4b58230 100644 --- a/include/voice_control_manager_internal.h +++ b/include/voice_control_manager_internal.h @@ -27,6 +27,18 @@ extern "C" { #endif +typedef enum { + VC_AUDIO_STREAMING_EVENT_FAIL = -1, /**< Failed */ + VC_AUDIO_STREAMING_EVENT_START = 1, /**< Start event */ + VC_AUDIO_STREAMING_EVENT_CONTINUE = 2, /**< Continue event */ + VC_AUDIO_STREAMING_EVENT_FINISH = 3 /**< Finish event */ +} vc_audio_streaming_event_e; + +typedef enum { + VC_AUDIO_STREAMING_MODE_VC_SERVICE = 0, /**< Use audio recording from vc service */ + VC_AUDIO_STREAMING_MODE_MULTI_ASSISTANT = 1, /**< Use audio streaming from multi-assistant */ + VC_AUDIO_STREAMING_MODE_OUTSIDE = 2, /**< Use audio streaming from outside */ +} vc_audio_streaming_mode_e; /** * @brief Sets demandable client list. @@ -79,6 +91,15 @@ int vc_mgr_unset_demandable_client_rule(void); */ int vc_mgr_set_domain(const char* domain); +/** + * @brief Sends audio streaming to the engine service. + * @since_tizen 5.0 + * + */ +int vc_mgr_send_audio_streaming(vc_audio_streaming_event_e event, unsigned char* buffer, unsigned int len); + +int vc_mgr_set_audio_streaming_mode(vc_audio_streaming_mode_e streaming_mode); + #ifdef __cplusplus } diff --git a/server/vcd_config.c b/server/vcd_config.c index 8d707b7..629487e 100755 --- a/server/vcd_config.c +++ b/server/vcd_config.c @@ -28,6 +28,8 @@ static vcd_state_e g_state; static int g_foreground_pid; +static int g_audio_streaming_mode; + #define COMMAND_TYPE_MAX 7 static int g_enabled_command_type[COMMAND_TYPE_MAX] = { 0, /* NONE */ @@ -185,3 +187,15 @@ int vcd_config_get_command_type_enabled(int cmd_type) return g_enabled_command_type[cmd_type]; } + +int vcd_config_get_audio_streaming_mode(vcd_audio_streaming_mode_e* streaming_mode) +{ + *streaming_mode = g_audio_streaming_mode; + return 0; +} + +int vcd_config_set_audio_streaming_mode(vcd_audio_streaming_mode_e streaming_mode) +{ + g_audio_streaming_mode = streaming_mode; + return 0; +} diff --git a/server/vcd_config.h b/server/vcd_config.h index de6589d..68db934 100755 --- a/server/vcd_config.h +++ b/server/vcd_config.h @@ -51,6 +51,11 @@ int vcd_config_disable_command_type(int cmd_type); int vcd_config_get_command_type_enabled(int cmd_type); +int vcd_config_get_audio_streaming_mode(vcd_audio_streaming_mode_e* streaming_mode); + +int vcd_config_set_audio_streaming_mode(vcd_audio_streaming_mode_e streaming_mode); + + #ifdef __cplusplus } #endif diff --git a/server/vcd_dbus.c b/server/vcd_dbus.c index 69e1f52..1718191 100644 --- a/server/vcd_dbus.c +++ b/server/vcd_dbus.c @@ -1150,6 +1150,9 @@ static Eina_Bool listener_event_callback(void* data, Ecore_Fd_Handler *fd_handle else if (dbus_message_is_method_call(msg, VC_SERVER_SERVICE_INTERFACE, VC_MANAGER_METHOD_STOP_FEEDBACK)) vcd_dbus_server_mgr_stop_feedback(g_conn_listener, msg); + else if (dbus_message_is_method_call(msg, VC_SERVER_SERVICE_INTERFACE, VC_MANAGER_METHOD_SEND_AUDIO_STREAMING)) + vcd_dbus_server_mgr_send_audio_streaming(g_conn_listener, msg); + /* client event */ else if (dbus_message_is_method_call(msg, VC_SERVER_SERVICE_INTERFACE, VC_METHOD_INITIALIZE)) vcd_dbus_server_initialize(g_conn_listener, msg); diff --git a/server/vcd_dbus_server.c b/server/vcd_dbus_server.c index 68b0ae1..9740609 100644 --- a/server/vcd_dbus_server.c +++ b/server/vcd_dbus_server.c @@ -20,7 +20,7 @@ #include "vcd_dbus_server.h" #include "vcd_main.h" #include "vcd_server.h" - +#include "vcd_config.h" int __dbus_error_return(DBusConnection* conn, DBusMessage* msg, int ret) { @@ -86,6 +86,7 @@ int vcd_dbus_server_mgr_initialize(DBusConnection* conn, DBusMessage* msg) dbus_error_init(&err); int pid; + int streaming_mode; int service_state; int foreground; int daemon_pid; @@ -93,6 +94,7 @@ int vcd_dbus_server_mgr_initialize(DBusConnection* conn, DBusMessage* msg) dbus_message_get_args(msg, &err, DBUS_TYPE_INT32, &pid, + DBUS_TYPE_INT32, &streaming_mode, DBUS_TYPE_INVALID); SLOG(LOG_DEBUG, TAG_VCD, "@@@ VCD Manager Initialize"); @@ -102,6 +104,7 @@ int vcd_dbus_server_mgr_initialize(DBusConnection* conn, DBusMessage* msg) dbus_error_free(&err); ret = VCD_ERROR_OPERATION_FAILED; } else { + vcd_config_set_audio_streaming_mode((vcd_audio_streaming_mode_e)streaming_mode); ret = vcd_server_mgr_initialize(pid); service_state = vcd_server_get_service_state(); foreground = vcd_server_get_foreground(); @@ -1188,6 +1191,39 @@ int vcd_dbus_server_mgr_stop_feedback(DBusConnection* conn, DBusMessage* msg) return 0; } +int vcd_dbus_server_mgr_send_audio_streaming(DBusConnection* conn, DBusMessage* msg) +{ + DBusError err; + dbus_error_init(&err); + + int pid = 0; + int event = 0; + unsigned char* buffer = NULL; + unsigned int len = 0; + + int ret = VCD_ERROR_OPERATION_FAILED; + + SLOG(LOG_DEBUG, TAG_VCD, "@@@ VCD Manager send audio streaming"); + + dbus_message_get_args(msg, &err, + DBUS_TYPE_INT32, &pid, + DBUS_TYPE_INT32, &event, + DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE, + &buffer, &len, + DBUS_TYPE_INVALID); + + if (dbus_error_is_set(&err)) { + SLOG(LOG_ERROR, TAG_VCD, "[IN ERROR] vcd mgr send audio streaming : get arguments error (%s)", err.message); + dbus_error_free(&err); + ret = VCD_ERROR_OPERATION_FAILED; + } else { + SLOG(LOG_DEBUG, TAG_VCD, "[IN] vcd mgr send audio streaming : pid(%d), event(%d), buffer(%p), len(%d)", pid, event, buffer, len); + ret = vcd_server_mgr_send_audio_streaming(pid, event, buffer, len); + } + + return ret; +} + /* * Dbus Server functions for client @@ -2206,6 +2242,7 @@ int vcd_dbus_server_set_language(DBusConnection* conn, DBusMessage* msg) return 0; } + int vcd_dbus_server_request_tts(DBusConnection* conn, DBusMessage* msg) { DBusError err; diff --git a/server/vcd_dbus_server.h b/server/vcd_dbus_server.h index bef7205..ac02296 100644 --- a/server/vcd_dbus_server.h +++ b/server/vcd_dbus_server.h @@ -74,6 +74,9 @@ int vcd_dbus_server_mgr_start_feedback(DBusConnection* conn, DBusMessage* msg); int vcd_dbus_server_mgr_stop_feedback(DBusConnection* conn, DBusMessage* msg); +/* for Multi-assistant */ +int vcd_dbus_server_mgr_send_audio_streaming(DBusConnection* conn, DBusMessage* msg); + /* * Dbus Server functions for client diff --git a/server/vcd_main.h b/server/vcd_main.h index 3d8525b..46b9fd8 100644 --- a/server/vcd_main.h +++ b/server/vcd_main.h @@ -74,6 +74,19 @@ typedef enum { VCD_STATE_PROCESSING = 3 } vcd_state_e; +typedef enum { + VCD_AUDIO_STREAMING_EVENT_FAIL = -1, /**< Failed */ + VCD_AUDIO_STREAMING_EVENT_START = 1, /**< Start event */ + VCD_AUDIO_STREAMING_EVENT_CONTINUE = 2, /**< Continue event */ + VCD_AUDIO_STREAMING_EVENT_FINISH = 3 /**< Finish event */ +} vcd_audio_streaming_event_e; + +typedef enum { + VCD_AUDIO_STREAMING_MODE_VC_SERVICE = 0, /**< Use audio recording from vc service */ + VCD_AUDIO_STREAMING_MODE_MULTI_ASSISTANT = 1, /**< Use audio streaming from multi-assistant */ + VCD_AUDIO_STREAMING_MODE_OUTSIDE = 2, /**< Use audio streaming from outside */ +} vcd_audio_streaming_mode_e; + struct vce_cmd_s { int index; }; diff --git a/server/vcd_recorder.c b/server/vcd_recorder.c index ca49fb9..6ffb708 100644 --- a/server/vcd_recorder.c +++ b/server/vcd_recorder.c @@ -75,9 +75,9 @@ static int g_buffer_count; static int g_device_id = -1; /* Sound buf save */ -/* +#if 0 #define BUF_SAVE_MODE - */ +#endif #ifdef BUF_SAVE_MODE static FILE* g_normal_file; @@ -507,6 +507,13 @@ int vcd_recorder_destroy() int vcd_recorder_set(const char* audio_type, vce_audio_type_e type, int rate, int channel) { + vcd_audio_streaming_mode_e streaming_mode; + vcd_config_get_audio_streaming_mode(&streaming_mode); + if (VCD_AUDIO_STREAMING_MODE_MULTI_ASSISTANT == streaming_mode || VCD_AUDIO_STREAMING_MODE_OUTSIDE == streaming_mode) { + SLOG(LOG_DEBUG, TAG_VCD, "[Recorder] Current audio streaming mode(%d)", streaming_mode); + return VCD_ERROR_NONE; + } + if (NULL == audio_type) { return VCD_ERROR_INVALID_PARAMETER; } @@ -627,6 +634,13 @@ int vcd_recorder_set(const char* audio_type, vce_audio_type_e type, int rate, in int vcd_recorder_get(char** audio_type) { + vcd_audio_streaming_mode_e streaming_mode; + vcd_config_get_audio_streaming_mode(&streaming_mode); + if (VCD_AUDIO_STREAMING_MODE_MULTI_ASSISTANT == streaming_mode || VCD_AUDIO_STREAMING_MODE_OUTSIDE == streaming_mode) { + SLOG(LOG_DEBUG, TAG_VCD, "[Recorder] Current audio streaming mode(%d)", streaming_mode); + return VCD_ERROR_NONE; + } + if (NULL == audio_type) { return VCD_ERROR_INVALID_PARAMETER; } @@ -793,11 +807,107 @@ static void __check_audio_format() } } +int vcd_recorder_start_streaming() +{ + SLOG(LOG_DEBUG, TAG_VCD, "[Recorder] start streaming"); + + vcd_audio_streaming_mode_e streaming_mode; + vcd_config_get_audio_streaming_mode(&streaming_mode); + if (VCD_AUDIO_STREAMING_MODE_VC_SERVICE == streaming_mode) { + SLOG(LOG_DEBUG, TAG_VCD, "[Recorder] Current audio streaming mode(%d)", streaming_mode); + return VCD_ERROR_NONE; + } + +#ifdef BUF_SAVE_MODE + char normal_file_name[128] = {'\0',}; + g_count++; + + while (1) { + snprintf(normal_file_name, sizeof(normal_file_name), "/tmp/vc_streaming_%d_%d", getpid(), g_count); + int ret = access(normal_file_name, 0); + + if (0 == ret) { + SLOG(LOG_ERROR, TAG_VCD, "[Recorder ERROR] File is already exist"); + if (0 == remove(normal_file_name)) { + SLOG(LOG_DEBUG, TAG_VCD, "[Recorder] Remove file"); + break; + } else { + g_count++; + } + } else { + break; + } + } + SLOG(LOG_DEBUG, TAG_VCD, "[Recorder] File normal name : %s", normal_file_name); + + /* open test file */ + g_normal_file = fopen(normal_file_name, "wb+x"); + if (!g_normal_file) { + SLOG(LOG_ERROR, TAG_VCD, "[Recorder ERROR] File not found!"); + } +#endif + + return 0; +} + +int vcd_recorder_send_streaming(const void* buffer, const unsigned int length) +{ + vcd_audio_streaming_mode_e streaming_mode; + vcd_config_get_audio_streaming_mode(&streaming_mode); + if (VCD_AUDIO_STREAMING_MODE_VC_SERVICE == streaming_mode) { + SLOG(LOG_DEBUG, TAG_VCD, "[Recorder] Current audio streaming mode(%d)", streaming_mode); + return VCD_ERROR_NONE; + } + + if (NULL != g_audio_cb) { + int ret = g_audio_cb(buffer, length); + if (0 != ret) { + SLOG(LOG_ERROR, TAG_VCD, "[Recorder ERROR] Fail to start streaming : %d", ret); + vcd_recorder_stop(); + return ret; + } + } + +#ifdef BUF_SAVE_MODE + /* write pcm buffer */ + if (g_normal_file) + fwrite(buffer, 1, length, g_normal_file); +#endif + + return 0; +} + +int vcd_recorder_stop_streaming() +{ + SLOG(LOG_DEBUG, TAG_VCD, "[Recorder] stop streaming"); + + vcd_audio_streaming_mode_e streaming_mode; + vcd_config_get_audio_streaming_mode(&streaming_mode); + if (VCD_AUDIO_STREAMING_MODE_VC_SERVICE == streaming_mode) { + SLOG(LOG_DEBUG, TAG_VCD, "[Recorder] Current audio streaming mode(%d)", streaming_mode); + return VCD_ERROR_NONE; + } + +#ifdef BUF_SAVE_MODE + if (g_normal_file) + fclose(g_normal_file); +#endif + + return 0; +} int vcd_recorder_start() { int ret = -1; + + vcd_audio_streaming_mode_e streaming_mode; + vcd_config_get_audio_streaming_mode(&streaming_mode); + if (VCD_AUDIO_STREAMING_MODE_MULTI_ASSISTANT == streaming_mode || VCD_AUDIO_STREAMING_MODE_OUTSIDE == streaming_mode) { + SLOG(LOG_DEBUG, TAG_VCD, "[Recorder] Current audio streaming mode(%d)", streaming_mode); + return VCD_ERROR_NONE; + } + g_buffer_count = 0; SLOG(LOG_DEBUG, TAG_VCD, "[Recorder] Enter, recorder state(%d)", g_recorder_state); @@ -919,6 +1029,13 @@ int vcd_recorder_stop() { int ret = -1; + vcd_audio_streaming_mode_e streaming_mode; + vcd_config_get_audio_streaming_mode(&streaming_mode); + if (VCD_AUDIO_STREAMING_MODE_MULTI_ASSISTANT == streaming_mode || VCD_AUDIO_STREAMING_MODE_OUTSIDE == streaming_mode) { + SLOG(LOG_DEBUG, TAG_VCD, "[Recorder] Current audio streaming mode(%d)", streaming_mode); + return VCD_ERROR_NONE; + } + if (VCD_RECORDER_STATE_READY == g_recorder_state) return 0; diff --git a/server/vcd_recorder.h b/server/vcd_recorder.h index a061d2a..7a612b8 100644 --- a/server/vcd_recorder.h +++ b/server/vcd_recorder.h @@ -43,6 +43,12 @@ int vcd_recorder_set(const char* audio_type, vce_audio_type_e type, int rate, in int vcd_recorder_get(char** audio_type); +int vcd_recorder_start_streaming(); + +int vcd_recorder_send_streaming(const void* buffer, const unsigned int length); + +int vcd_recorder_stop_streaming(); + int vcd_recorder_start(); int vcd_recorder_read(); diff --git a/server/vcd_server.c b/server/vcd_server.c index d79b946..8de4a88 100644 --- a/server/vcd_server.c +++ b/server/vcd_server.c @@ -2226,6 +2226,36 @@ int vcd_server_mgr_stop_feedback(void) return VCD_ERROR_NONE; } +int vcd_server_mgr_send_audio_streaming(int pid, int event, unsigned char* buffer, unsigned int len) +{ + SLOG(LOG_DEBUG, TAG_VCD, "[DEBUG] Send Audio Streaming from Multi-assistant. event(%d), buffer(%p), len(%d)", event, &buffer, len); + + int ret = 0; + if (VCD_AUDIO_STREAMING_EVENT_START == event) { + ret = vcd_recorder_start_streaming(); + if (0 != ret) { + SLOG(LOG_ERROR, TAG_VCD, "[ERROR] Fail to start streaming, ret(%d)", ret); + return ret; + } + } + + ret = vcd_recorder_send_streaming((const void*)buffer, (const unsigned int)len); + if (0 != ret) { + SLOG(LOG_ERROR, TAG_VCD, "[ERROR] Fail to start streaming, ret(%d)", ret); + return ret; + } + + if (VCD_AUDIO_STREAMING_EVENT_FINISH == event) { + ret = vcd_recorder_stop_streaming(); + if (0 != ret) { + SLOG(LOG_ERROR, TAG_VCD, "[ERROR] Fail to stop streaming, ret(%d)", ret); + return ret; + } + } + + return VCD_ERROR_NONE; +} + /* * VC Server Functions for Client diff --git a/server/vcd_server.h b/server/vcd_server.h index 87b735c..d6270f1 100644 --- a/server/vcd_server.h +++ b/server/vcd_server.h @@ -85,6 +85,9 @@ int vcd_server_mgr_start_feedback(void); int vcd_server_mgr_stop_feedback(void); +/* for Multi-assistant */ +int vcd_server_mgr_send_audio_streaming(int pid, int event, unsigned char* buffer, unsigned int len); + /* * For client