Add farfield audio type 06/198206/1
authorWonnam Jang <wn.jang@samsung.com>
Fri, 14 Dec 2018 06:28:10 +0000 (15:28 +0900)
committerSooyeon Kim <sooyeon.kim@samsung.com>
Tue, 22 Jan 2019 09:32:42 +0000 (09:32 +0000)
Change-Id: I0ef337a100611b06ccf13d311b37fd46f12ccc71
Signed-off-by: Wonnam Jang <wn.jang@samsung.com>
(cherry picked from commit 1257cfae82c1f3f4c44f08f43c80ea37d65766cc)

CMakeLists.txt
packaging/voice-control.spec
server/vcd_recorder.c

index b555f38..ffeca96 100644 (file)
@@ -46,7 +46,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-network-bluetooth-tv capi-system-info cynara-client cynara-session dbus-1 db-util dlog ecore glib-2.0 json-glib-1.0 libgum 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 libgum libtzplatform-config libxml-2.0 sqlite3 vconf msfapi farfield-voice-api
 )
 ELSE()
 pkg_check_modules(pkgs REQUIRED
index 06035f5..1115948 100644 (file)
@@ -36,6 +36,7 @@ BuildRequires:  pkgconfig(pkgmgr-installer)
 BuildRequires:  pkgconfig(capi-network-bluetooth)
 BuildRequires:  pkgconfig(capi-network-bluetooth-tv)
 BuildRequires:  pkgconfig(msfapi)
+BuildRequires:  pkgconfig(farfield-voice-api)
 %endif
 BuildRequires:  pkgconfig(vconf)
 BuildRequires:  cmake
index 8151e00..fdc76a2 100644 (file)
@@ -17,6 +17,7 @@
 #ifdef TV_PRODUCT
 #define TV_BT_MODE
 #define TV_MSF_WIFI_MODE
+#define TV_FFV_MODE
 #endif
 
 #include <audio_io.h>
@@ -30,6 +31,9 @@
 #ifdef TV_MSF_WIFI_MODE
 #include <MSFVoiceInterface.h>
 #endif
+#ifdef TV_FFV_MODE
+#include <farfield-voice-api.h>
+#endif
 #endif
 
 #include "vcd_client_data.h"
@@ -45,6 +49,7 @@
 #define FOCUS_SERVER_READY             "/tmp/.focus_server_ready"
 
 #define VCE_AUDIO_ID_NONE              "VC_AUDIO_ID_NONE"              /**< None audio id */
+#define VCE_AUDIO_ID_FFV               "VC_FARFIELD_VOICE_VD"
 
 static vcd_recorder_state_e    g_recorder_state = VCD_RECORDER_STATE_READY;
 
@@ -74,6 +79,10 @@ static int   g_buffer_count;
 
 static int     g_device_id = -1;
 
+#ifdef TV_FFV_MODE
+farfield_voice_h g_farfieldvoice_h = NULL;
+#endif
+
 static sound_stream_info_h     g_stream_for_volume_h = NULL;
 static virtual_sound_stream_h  g_virtual_sound_stream_h = NULL;
 
@@ -212,7 +221,28 @@ static void _bt_hid_audio_data_receive_cb(bt_hid_voice_data_s *voice_data, void
 #endif
        return;
 }
+#endif
 
+#ifdef TV_FFV_MODE
+static void _ffv_audio_function_cb(void* data, unsigned int length, void* user_data)
+{
+       if (0 != strncmp(g_current_audio_type, VCE_AUDIO_ID_FFV, sizeof(VCE_AUDIO_ID_FFV))) {
+               vcd_state_e state = vcd_config_get_service_state();
+               if (VCD_STATE_READY == state) {
+                       vcd_recorder_set(VCE_AUDIO_ID_FFV, VCE_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 (NULL != g_audio_cb) {
+               if (0 != g_audio_cb(data, length)) {
+                       SLOG(LOG_ERROR, TAG_VCD, "[Recorder ERROR] Fail to read audio");
+                       vcd_recorder_stop();
+               }
+       }
+}
 #endif
 
 #if 1
@@ -419,6 +449,19 @@ int vcd_recorder_create(vcd_recoder_audio_cb audio_cb, vcd_recorder_interrupt_cb
        g_interrupt_cb = interrupt_cb;
        g_recorder_state = VCD_RECORDER_STATE_READY;
 
+#ifdef TV_FFV_MODE
+       g_farfieldvoice_h = farfield_voice_init();
+       if (NULL == g_farfieldvoice_h)
+       {
+               SLOG(LOG_ERROR, TAG_VCD, "[Recorder ERROR] Fail to init farfield_voice_init");
+       }
+
+       if (g_farfieldvoice_h)
+       {
+               farfield_voice_register_audio_cb(g_farfieldvoice_h, _ffv_audio_function_cb, NULL);
+       }
+#endif
+
 #ifdef TV_BT_MODE
 
        bool is_bt_failed = false;
@@ -490,6 +533,15 @@ int vcd_recorder_destroy()
        if (0 != ret)
                SLOG(LOG_ERROR, TAG_VCD, "[Recorder ERROR] Fail to audio in destroy, ret(%d)", ret);
 
+#ifdef TV_FFV_MODE
+       if (NULL != g_farfieldvoice_h)
+       {
+               farfield_voice_unregister_audio_cb(g_farfieldvoice_h);
+               farfield_voice_final(g_farfieldvoice_h);
+               g_farfieldvoice_h = NULL;
+       }
+#endif
+
 #ifdef TV_BT_MODE
        bt_hid_unset_audio_data_receive_cb();
 
@@ -538,8 +590,10 @@ int vcd_recorder_set(const char* audio_type, vce_audio_type_e type, int rate, in
                if (NULL != g_current_audio_type) {
                        if ((!strncmp(g_current_audio_type, VCE_AUDIO_ID_NONE, strlen(g_current_audio_type)) &&
                                                strncmp(audio_type, VCE_AUDIO_ID_BLUETOOTH, strlen(audio_type)) &&
+                                               strncmp(audio_type, VCE_AUDIO_ID_FFV, strlen(audio_type)) &&
                                                strncmp(audio_type, VCE_AUDIO_ID_WIFI, strlen(audio_type))) ||
                                        (strncmp(g_current_audio_type, VCE_AUDIO_ID_BLUETOOTH, strlen(g_current_audio_type)) &&
+                                        strncmp(g_current_audio_type, VCE_AUDIO_ID_FFV, strlen(g_current_audio_type)) &&
                                         strncmp(g_current_audio_type, VCE_AUDIO_ID_WIFI, strlen(g_current_audio_type)) &&
                                         strncmp(g_current_audio_type, VCE_AUDIO_ID_NONE, strlen(g_current_audio_type)) &&
                                         !strncmp(audio_type, VCE_AUDIO_ID_NONE, strlen(audio_type)))) {
@@ -573,6 +627,13 @@ int vcd_recorder_set(const char* audio_type, vce_audio_type_e type, int rate, in
                }
 
                g_current_audio_type = strdup(audio_type);
+       } else if (0 == strncmp(VCE_AUDIO_ID_FFV, audio_type, strlen(VCE_AUDIO_ID_FFV))) {
+               if (NULL != g_current_audio_type) {
+                       free(g_current_audio_type);
+                       g_current_audio_type = NULL;
+               }
+
+               g_current_audio_type = strdup(audio_type);
        } else {
                if (false == g_is_valid_audio_in) {
                        SLOG(LOG_ERROR, TAG_VCD, "[Recorder ERROR] Audio-in is NOT valid");
@@ -1005,6 +1066,9 @@ int vcd_recorder_start()
 
                        g_bt_extend_count = 0;
 #endif
+               } else if (0 == strncmp(VCE_AUDIO_ID_FFV, g_current_audio_type, strlen(VCE_AUDIO_ID_FFV))) {
+                       SLOG(LOG_DEBUG, TAG_VCD, "[Recorder] call FARFIELD() function");
+                       started = true;
                } else if (0 == strncmp(VCE_AUDIO_ID_WIFI, g_current_audio_type, strlen(VCE_AUDIO_ID_WIFI))) {
                        SLOG(LOG_DEBUG, TAG_VCD, "[Recorder] call RegisterMSFAudioCallback() function");
 #ifdef TV_MSF_WIFI_MODE
@@ -1129,6 +1193,7 @@ int vcd_recorder_stop()
                        }
                        if (NULL != g_current_audio_type &&
                                        (!strncmp(g_current_audio_type, VCE_AUDIO_ID_BLUETOOTH, sizeof(VCE_AUDIO_ID_BLUETOOTH)) ||
+                                       !strncmp(g_current_audio_type, VCE_AUDIO_ID_FFV, sizeof(VCE_AUDIO_ID_FFV)) ||
                                         !strncmp(g_current_audio_type, VCE_AUDIO_ID_WIFI, sizeof(VCE_AUDIO_ID_WIFI)))) {
                                SLOG(LOG_DEBUG, TAG_VCD, "[DEBUG] Recorder reset to NONE");
                                vcd_recorder_set(VCE_AUDIO_ID_NONE, g_audio_type, g_audio_rate, g_audio_channel);
@@ -1139,6 +1204,17 @@ int vcd_recorder_stop()
                                return VCD_ERROR_OPERATION_FAILED;
                        }
 #endif
+               } else if (0 == strncmp(VCE_AUDIO_ID_FFV, g_current_audio_type, strlen(VCE_AUDIO_ID_FFV))) {
+                       SLOG(LOG_DEBUG, TAG_VCD, "[DEBUG] FFV");
+                       if (NULL != g_current_audio_type &&
+                                       (!strncmp(g_current_audio_type, VCE_AUDIO_ID_BLUETOOTH, sizeof(VCE_AUDIO_ID_BLUETOOTH)) ||
+                                       !strncmp(g_current_audio_type, VCE_AUDIO_ID_FFV, sizeof(VCE_AUDIO_ID_FFV)) ||
+                                        !strncmp(g_current_audio_type, VCE_AUDIO_ID_WIFI, sizeof(VCE_AUDIO_ID_WIFI)))) {
+                               SLOG(LOG_DEBUG, TAG_VCD, "[DEBUG] Recorder reset to NONE");
+                               vcd_recorder_set(VCE_AUDIO_ID_NONE, g_audio_type, g_audio_rate, g_audio_channel);
+                       }
+                       stoped = true;
+
                } else if (0 == strncmp(VCE_AUDIO_ID_WIFI, g_current_audio_type, strlen(VCE_AUDIO_ID_WIFI))) {
 #ifdef TV_MSF_WIFI_MODE
                        UnRegisterMSFAudioCallback();