+ if (STTD_RECORDER_STATE_NONE != g_recorder_state) {
+ SLOG(LOG_ERROR, TAG_STTD, "[Recorder ERROR] Current state of recorder is recording");
+ return STTD_ERROR_INVALID_STATE;
+ }
+
+ if (0 != pthread_mutex_init(&sttd_audio_in_handle_mutex, NULL)) {
+ SLOG(LOG_ERROR, TAG_STTD, "[Recorder ERROR] Fail to initialize audio in handle mutex.");
+ }
+
+ g_audio_cb = audio_cb;
+ g_interrupt_cb = interrupt_cb;
+ g_recorder_state = STTD_RECORDER_STATE_NONE;
+ g_recorder = NULL;
+
+ if (0 != sound_manager_create_stream_information(SOUND_STREAM_TYPE_VOICE_RECOGNITION, NULL, NULL, &g_stream_info_h)) {
+ SLOG(LOG_ERROR, TAG_STTD, "[Recorder ERROR] Fail to create stream info");
+ }
+
+ if (0 != sound_manager_add_focus_state_watch_cb(SOUND_STREAM_FOCUS_FOR_BOTH, __recorder_focus_state_watch_cb, NULL, &g_stream_focus_id)) {
+ SLOG(LOG_ERROR, TAG_STTD, "[Recorder ERROR] Fail to add focus state watch callback");
+ }
+
+#ifdef TV_BT_MODE
+ if (BT_ERROR_NONE != bt_initialize()) {
+ SLOG(LOG_ERROR, TAG_STTD, "[Recorder ERROR] Fail to init bt");
+ return STTD_ERROR_OPERATION_FAILED;
+ }
+
+ if (BT_ERROR_NONE != bt_hid_host_initialize(_bt_cb_hid_state_changed, NULL)) {
+ SLOG(LOG_ERROR, TAG_STTD, "[Recorder ERROR] Fail bt_hid_host_initialize()");
+ return STTD_ERROR_OPERATION_FAILED;
+ }
+#endif
+
+ return 0;
+}
+
+int sttd_recorder_deinitialize()
+{
+ if (0 != pthread_mutex_destroy(&sttd_audio_in_handle_mutex)) {
+ SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] Fail to destroy audio in handle mutex.");
+ }
+
+ if (0 != sound_manager_remove_focus_state_watch_cb(g_stream_focus_id)) {
+ SLOG(LOG_ERROR, TAG_STTD, "[Recorder ERROR] Fail to remove focus state watch callback");
+ }
+
+ if (0 != sound_manager_destroy_stream_information(g_stream_info_h)) {
+ SLOG(LOG_ERROR, TAG_STTD, "[Recorder ERROR] Fail to destroy stream info");
+ }
+
+ if (NULL != g_recorder) {
+ audio_in_destroy(g_recorder->audio_h);
+ g_recorder->audio_h = NULL;
+ free(g_recorder);
+ g_recorder = NULL;
+ }
+
+#ifdef __UNUSED_CODES__
+ /* Remove all recorder */
+ GSList *iter = NULL;
+ stt_recorder_s *recorder = NULL;
+
+ iter = g_slist_nth(g_recorder_list, 0);
+
+ while (NULL != iter) {
+ recorder = iter->data;
+
+ if (NULL != recorder) {
+ g_recorder_list = g_slist_remove(g_recorder_list, recorder);
+ if (recorder->audio_h) {
+ audio_in_destroy(recorder->audio_h);
+ recorder->audio_h = NULL;
+ }
+ free(recorder);
+ }
+
+ iter = g_slist_nth(g_recorder_list, 0);
+ }
+#endif
+
+#ifdef TV_BT_MODE
+ bt_hid_host_deinitialize();
+
+ bt_deinitialize();
+#endif
+
+ g_recorder_state = STTD_RECORDER_STATE_NONE;
+
+ return 0;
+}
+
+int sttd_recorder_set_audio_session()
+{
+ return 0;
+}
+
+int sttd_recorder_unset_audio_session()
+{
+ return 0;
+}
+
+int sttd_recorder_create(stte_audio_type_e type, int channel, unsigned int sample_rate)
+{
+ /* Check engine id is valid */
+ if (NULL != g_recorder) {
+ SLOG(LOG_WARN, TAG_STTD, "[Recorder WARNING] Engine id is already registered");
+ return STTD_ERROR_INVALID_PARAMETER;
+ }
+
+ audio_in_h temp_in_h = NULL;
+
+#ifndef TV_BT_MODE