Add to stop recording from FFV
[platform/core/uifw/stt.git] / server / sttd_recorder.c
index ccab86d..4452096 100644 (file)
@@ -13,6 +13,7 @@
 
 #ifdef TV_PRODUCT
 #define TV_BT_MODE
+#define TV_FFV_MODE
 #endif
 
 #include <audio_io.h>
 #ifdef TV_BT_MODE
 #include <bluetooth_product.h>
 #endif
+#ifdef TV_FFV_MODE
+#include <farfield-voice-api.h>
+#endif
 
 #include "stt_defs.h"
 #include "sttd_dbus.h"
 #include "sttd_recorder.h"
 #include "sttd_main.h"
+#include "sttd_engine_agent.h"
+#include "sttd_client_data.h"
 
+#define STTE_AUDIO_ID_NONE             "STT_AUDIO_ID_NONE"             /**< None audio id */
+#ifdef TV_FFV_MODE
+#define STTE_AUDIO_ID_FFV              "STT_FARFIELD_VOICE_VD"
+#endif
 
 #define FRAME_LENGTH 320
 #define BUFFER_LENGTH FRAME_LENGTH * 2
 
 static pthread_mutex_t sttd_audio_in_handle_mutex = PTHREAD_MUTEX_INITIALIZER;
 
+#ifndef TV_BT_MODE
 static Ecore_Timer* g_audio_timer = NULL;
+#endif
 
 typedef enum {
        STTD_RECORDER_STATE_NONE = -1,
@@ -64,6 +76,12 @@ static int g_buffer_count;
 
 static int g_stream_focus_id;
 
+static bool g_is_set_audio_type = false;
+
+#ifdef TV_FFV_MODE
+farfield_voice_h g_farfieldvoice_h = NULL;
+#endif
+
 /* Sound buf save for test */
 /*
 #define BUF_SAVE_MODE
@@ -91,12 +109,29 @@ 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 >= sttd_client_get_ref_count()) {
+               if (0 == g_buffer_count % 50) {
+                       SLOG(LOG_INFO, TAG_STTD, "[Recorder INFO] BT audio function callback is invoked, but no cliet");
+
+                       if (100000 == g_buffer_count) {
+                               g_buffer_count = 0;
+                       }
+               }
+               g_buffer_count++;
+               return;
+       }
+
        if (STTD_RECORDER_STATE_RECORDING != g_recorder_state) {
-               /* SLOG(LOG_DEBUG, TAG_STTD, "[Recorder] Exit audio reading normal func"); */
+               SLOG(LOG_INFO, TAG_STTD, "[Recorder] Exit audio reading normal func");
                return;
        }
 
        if (NULL != g_audio_cb) {
+               if (false == g_is_set_audio_type) {
+                       sttd_engine_agent_set_audio_type(STTE_AUDIO_ID_BLUETOOTH);
+                       g_is_set_audio_type = true;
+               }
+
                if (0 != g_audio_cb((void*)voice_data->audio_buf, (unsigned int)voice_data->length)) {
                        SLOG(LOG_ERROR, TAG_STTD, "[Recorder ERROR] Fail to read audio");
                        sttd_recorder_stop();
@@ -130,6 +165,59 @@ static void _bt_hid_audio_data_receive_cb(bt_hid_voice_data_s *voice_data, void
 }
 #endif
 
+#ifdef TV_FFV_MODE
+static void _ffv_audio_function_cb(void* data, unsigned int length, void* user_data)
+{
+       if (STTD_RECORDER_STATE_RECORDING != g_recorder_state) {
+               SLOG(LOG_INFO, TAG_STTD, "[Recorder] Exit audio reading normal func");
+               return;
+       }
+
+       if (0 >= sttd_client_get_ref_count()) {
+               if (0 == g_buffer_count % 50) {
+                       SLOG(LOG_INFO, TAG_STTD, "[Recorder INFO] farfield audio function callback is invoked, but no cliet");
+
+                       if (100000 == g_buffer_count) {
+                               g_buffer_count = 0;
+                       }
+               }
+               g_buffer_count++;
+               return;
+       }
+
+       if (false == g_is_set_audio_type) {
+               sttd_engine_agent_set_audio_type(STTE_AUDIO_ID_FFV);
+               g_is_set_audio_type = true;
+       }
+
+       if (0 == g_buffer_count % 50) {
+               SLOG(LOG_INFO, TAG_STTD, "[Recorder INFO] farfield audio function callback is invoked");
+
+               if (100000 == g_buffer_count) {
+                       g_buffer_count = 0;
+               }
+       }
+
+       g_buffer_count++;
+
+       if (NULL != g_audio_cb) {
+               if (0 != g_audio_cb(data, length)) {
+                       SLOG(LOG_ERROR, TAG_STTD, "[Recorder ERROR] Fail to read audio");
+                       sttd_recorder_stop();
+               }
+
+               if (NULL == g_recorder) {
+                       SLOG(LOG_INFO, TAG_STTD, "[Recorder INFO] g_recoder is NULL");
+                       return;
+               }
+
+               float vol_db = get_volume_decibel((char*)data, (int)length, g_recorder->audio_type);
+               if (0 != sttdc_send_set_volume(g_recorder->uid, vol_db)) {
+                       SLOG(LOG_ERROR, TAG_STTD, "[Recorder] Fail to send recording volume(%f)", vol_db);
+               }
+       }
+}
+#endif
 
 const char* __stt_get_focus_changed_reason_code(sound_stream_focus_change_reason_e reason)
 {
@@ -191,6 +279,16 @@ int sttd_recorder_initialize(stt_recorder_audio_cb audio_cb, stt_recorder_interr
                SLOG(LOG_ERROR, TAG_STTD, "[Recorder ERROR] Fail to add focus state watch callback");
        }
 
+#ifdef TV_FFV_MODE
+       g_farfieldvoice_h = farfield_voice_init();
+       if (NULL == g_farfieldvoice_h) {
+               SLOG(LOG_ERROR, TAG_STTD, "[Recorder ERROR] Fail to init farfield_voice_init");
+       } else {
+               SLOG(LOG_INFO, TAG_STTD, "[Recorder INFO] Register farfield voice audio callback");
+               farfield_voice_register_audio_cb(g_farfieldvoice_h, _ffv_audio_function_cb, NULL);
+       }
+#endif
+
 #ifdef TV_BT_MODE
        if (BT_ERROR_NONE != bt_product_init()) {
                SLOG(LOG_ERROR, TAG_STTD, "[Recorder ERROR] Fail to init bt");
@@ -250,6 +348,15 @@ int sttd_recorder_deinitialize()
        }
 #endif
 
+#ifdef TV_FFV_MODE
+       if (NULL != g_farfieldvoice_h) {
+               SLOG(LOG_INFO, TAG_STTD, "[Recorder INFO] Unregister farfield voice");
+               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_host_deinitialize();
 
@@ -577,6 +684,9 @@ int sttd_recorder_stop()
        SLOG(LOG_WARN, TAG_STTD, "[Recorder WARNING] Enter critical section");
        pthread_mutex_lock(&sttd_audio_in_handle_mutex);
 
+       g_is_set_audio_type = false;
+       sttd_engine_agent_set_audio_type(STTE_AUDIO_ID_NONE);
+
        /* Check engine id is valid */
        if (NULL == g_recorder) {
                SLOG(LOG_WARN, TAG_STTD, "[Recorder WARNING] Engine id is not valid");
@@ -621,6 +731,13 @@ int sttd_recorder_stop()
        }
 #endif
 
+#ifdef TV_FFV_MODE
+       ret = farfield_voice_set_recognition_state(FARFIELD_VOICE_RECOGNITION_STOP);
+       if (0 != ret) {
+               SLOG(LOG_ERROR, TAG_STTD, "[Recorder ERROR] Fail to stop FFV, ret(%d)", ret);
+       }
+#endif
+
        g_recorder_state = STTD_RECORDER_STATE_READY;
 
 #ifdef BUF_SAVE_MODE