Support Multi-Assistant 61/189661/9
authorsooyeon.kim <sooyeon.kim@samsung.com>
Wed, 19 Sep 2018 07:06:51 +0000 (16:06 +0900)
committerWonnam Jang <wn.jang@samsung.com>
Fri, 28 Sep 2018 06:43:12 +0000 (15:43 +0900)
Change-Id: I062eadc3b60af5051a3460a5d6d9388796da3e48
Signed-off-by: sooyeon.kim <sooyeon.kim@samsung.com>
17 files changed:
client/vc_mgr.c
client/vc_mgr_client.c
client/vc_mgr_client.h
client/vc_mgr_dbus.c
client/vc_mgr_dbus.h
common/vc_defs.h
include/voice_control_manager_internal.h
server/vcd_config.c
server/vcd_config.h
server/vcd_dbus.c
server/vcd_dbus_server.c
server/vcd_dbus_server.h
server/vcd_main.h
server/vcd_recorder.c
server/vcd_recorder.h
server/vcd_server.c
server/vcd_server.h

index 17bbbb8..fee9d82 100644 (file)
@@ -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;
+}
index 9f5124d..2317c43 100644 (file)
@@ -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;
+}
index 9128f95..3ee6512 100644 (file)
@@ -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
index 8f8adf6..f889e43 100644 (file)
@@ -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;
+}
+
index b0b5c2f..9ce1239 100644 (file)
@@ -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
 }
index 0458c37..55fc210 100644 (file)
@@ -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"
index c06d38b..4b58230 100644 (file)
@@ -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
 }
index 8d707b7..629487e 100755 (executable)
@@ -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;
+}
index de6589d..68db934 100755 (executable)
@@ -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
index 69e1f52..1718191 100644 (file)
@@ -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);
index 68b0ae1..9740609 100644 (file)
@@ -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;
index bef7205..ac02296 100644 (file)
@@ -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
index 3d8525b..46b9fd8 100644 (file)
@@ -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;
 };
index ca49fb9..6ffb708 100644 (file)
@@ -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;
 
index a061d2a..7a612b8 100644 (file)
@@ -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();
index d79b946..8de4a88 100644 (file)
@@ -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
index 87b735c..d6270f1 100644 (file)
@@ -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