hal: add API to pass FNN usecase status to acdb-loader

Add API to allow FNN usecase status to be passed to
acdb-loader allowing persist cal block to be set
based on the FNN usecase status.

Change-Id: Ib9ce1c627eff26e873e1fd88fa2e19e6635a38e1
diff --git a/hal/acdb.h b/hal/acdb.h
index e1ab942..4db8c60 100644
--- a/hal/acdb.h
+++ b/hal/acdb.h
@@ -66,6 +66,8 @@
 typedef int (*acdb_reload_t) (char *, char *, char *, int);
 typedef int (*acdb_reload_v2_t) (char *, char *, char *, struct listnode *);
 typedef int (*acdb_send_gain_dep_cal_t)(int, int, int, int, int);
+typedef void (*acdb_set_fluence_nn_state_t)(bool);
+typedef bool (*acdb_get_fluence_nn_state_t)();
 
 struct meta_key_list {
     struct listnode list;
diff --git a/hal/audio_hw.c b/hal/audio_hw.c
index a88fd5a..8efa53c 100644
--- a/hal/audio_hw.c
+++ b/hal/audio_hw.c
@@ -1274,6 +1274,13 @@
         snd_device = usecase->out_snd_device;
     }
 
+    if (usecase->type == PCM_CAPTURE) {
+       if (platform_get_fluence_nn_state(adev->platform) == 0) {
+           platform_set_fluence_nn_state(adev->platform, true);
+           ALOGD("%s: set fluence nn capture state", __func__);
+       }
+    }
+
 #ifdef DS1_DOLBY_DAP_ENABLED
     audio_extn_dolby_set_dmid(adev);
     audio_extn_dolby_set_endpoint(adev);
@@ -1292,6 +1299,14 @@
     }
 
     if (usecase->type == PCM_CAPTURE) {
+         if (platform_get_fluence_nn_state(adev->platform) == 1 &&
+             adev->fluence_nn_usecase_id == USECASE_INVALID ) {
+             adev->fluence_nn_usecase_id = usecase->id;
+             ALOGD("%s: assign fluence nn usecase %d", __func__, usecase->id);
+         }
+    }
+
+    if (usecase->type == PCM_CAPTURE) {
         in = usecase->stream.in;
         if (in && is_loopback_input_device(get_device_types(&in->device_list))) {
             ALOGD("%s: set custom mtmx params v1", __func__);
@@ -1377,6 +1392,11 @@
             in->ec_opened = false;
         }
     }
+    if (usecase->id == adev->fluence_nn_usecase_id) {
+         platform_set_fluence_nn_state(adev->platform, false);
+         adev->fluence_nn_usecase_id = USECASE_INVALID;
+         ALOGD("%s: reset fluence nn capture state", __func__);
+    }
     audio_extn_sound_trigger_update_stream_status(usecase, ST_EVENT_STREAM_FREE);
     audio_extn_listen_update_stream_status(usecase, LISTEN_EVENT_STREAM_FREE);
 
@@ -10736,6 +10756,7 @@
     adev->enable_voicerx = false;
     adev->bt_wb_speech_enabled = false;
     adev->swb_speech_mode = SPEECH_MODE_INVALID;
+    adev->fluence_nn_usecase_id = USECASE_INVALID;
     //initialize this to false for now,
     //this will be set to true through set param
     adev->vr_audio_mode_enabled = false;
diff --git a/hal/audio_hw.h b/hal/audio_hw.h
index 18f081b..403f69e 100755
--- a/hal/audio_hw.h
+++ b/hal/audio_hw.h
@@ -748,6 +748,7 @@
     int    haptic_pcm_device_id;
     uint8_t *haptic_buffer;
     size_t haptic_buffer_size;
+    int fluence_nn_usecase_id;
 
     /* logging */
     snd_device_t last_logged_snd_device[AUDIO_USECASE_MAX][2]; /* [out, in] */
diff --git a/hal/msm8974/platform.c b/hal/msm8974/platform.c
index d30e777..0a68567 100755
--- a/hal/msm8974/platform.c
+++ b/hal/msm8974/platform.c
@@ -359,6 +359,8 @@
     acdb_set_codec_data_t      acdb_set_codec_data;
     acdb_reload_t              acdb_reload;
     acdb_reload_v2_t           acdb_reload_v2;
+    acdb_get_fluence_nn_state_t  acdb_get_fluence_nn_state;
+    acdb_set_fluence_nn_state_t  acdb_set_fluence_nn_state;
     void *hw_info;
     acdb_send_gain_dep_cal_t   acdb_send_gain_dep_cal;
     struct csd_data *csd;
@@ -3730,6 +3732,18 @@
             ALOGE("%s: dlsym error %s for acdb_loader_reload_acdb_files_v2", __func__, dlerror());
         }
 
+        my_data->acdb_set_fluence_nn_state = (acdb_set_fluence_nn_state_t)dlsym(
+                                                                   my_data->acdb_handle,
+                                                                   "acdb_set_fluence_nn_state");
+        if (!my_data->acdb_set_fluence_nn_state)
+            ALOGE("%s: dlsym error %s for acdb_set_fluence_nn_state", __func__, dlerror());
+
+        my_data->acdb_get_fluence_nn_state = (acdb_get_fluence_nn_state_t)dlsym(
+                                                                   my_data->acdb_handle,
+                                                                   "acdb_get_fluence_nn_state");
+        if (!my_data->acdb_get_fluence_nn_state)
+            ALOGE("%s: dlsym error %s for acdb_get_fluence_nn_state", __func__, dlerror());
+
         my_data->acdb_reload = (acdb_reload_t)dlsym(my_data->acdb_handle,
                                                     "acdb_loader_reload_acdb_files");
         if (my_data->acdb_reload == NULL) {
@@ -12591,3 +12605,37 @@
         return true;
     return false;
 }
+
+bool platform_set_fluence_nn_state(void *platform, bool state) {
+     struct platform_data *my_data = (struct platform_data *)platform;
+
+     if (my_data->acdb_set_fluence_nn_state == NULL) {
+         ALOGE("%s: dlsym error for acdb_set_fluence_nn_state", __func__);
+         return false;
+     }
+
+     if (my_data->fluence_nn_enabled) {
+         my_data->acdb_set_fluence_nn_state(state);
+         ALOGD("%s: set fluence nn state %d", __func__, state);
+         return true;
+     }
+
+     return false;
+}
+
+int platform_get_fluence_nn_state(void *platform) {
+    struct platform_data *my_data = (struct platform_data *)platform;
+    int ret = -1;
+
+    if (my_data->acdb_get_fluence_nn_state == NULL) {
+        ALOGE("%s: dlsym error for acdb_get_fluence_nn_state", __func__);
+        return ret;
+    }
+
+    if (my_data->fluence_nn_enabled)
+        ret = my_data->acdb_get_fluence_nn_state();
+    else
+        ALOGD("fluence nn disabled");
+
+    return ret;
+}
diff --git a/hal/platform_api.h b/hal/platform_api.h
index f0b10f5..bea9675 100644
--- a/hal/platform_api.h
+++ b/hal/platform_api.h
@@ -424,6 +424,8 @@
 int platform_get_display_port_ctl_index(int controller, int stream);
 bool platform_is_call_proxy_snd_device(snd_device_t snd_device);
 void platform_set_audio_source_delay(audio_source_t audio_source, int delay_ms);
+bool platform_set_fluence_nn_state(void *platform, bool start);
+int platform_get_fluence_nn_state(void *platform);
 
 int platform_get_audio_source_index(const char *audio_source_name);
 bool platform_check_and_update_island_power_status(void *platform,