Merge "hal: add sidetone support for USB" into oc-dr1-dev
diff --git a/hal/audio_extn/soundtrigger.c b/hal/audio_extn/soundtrigger.c
index 32b7b85..112bd1e 100644
--- a/hal/audio_extn/soundtrigger.c
+++ b/hal/audio_extn/soundtrigger.c
@@ -68,6 +68,15 @@
     return NULL;
 }
 
+static void stdev_snd_mon_cb(void * stream __unused, struct str_parms * parms)
+{
+    if (!parms)
+        return;
+
+    audio_extn_sound_trigger_set_parameters(NULL, parms);
+    return;
+}
+
 int audio_hw_call_back(sound_trigger_event_type_t event,
                        sound_trigger_event_info_t* config)
 {
@@ -333,6 +342,7 @@
 
     st_dev->adev = adev;
     list_init(&st_dev->st_ses_list);
+    audio_extn_snd_mon_register_listener(st_dev, stdev_snd_mon_cb);
 
     return 0;
 
@@ -349,6 +359,7 @@
 {
     ALOGV("%s: Enter", __func__);
     if (st_dev && (st_dev->adev == adev) && st_dev->lib_handle) {
+        audio_extn_snd_mon_unregister_listener(st_dev);
         dlclose(st_dev->lib_handle);
         free(st_dev);
         st_dev = NULL;
diff --git a/hal/audio_hw.c b/hal/audio_hw.c
index e5a8854..49a0716 100644
--- a/hal/audio_hw.c
+++ b/hal/audio_hw.c
@@ -4483,19 +4483,17 @@
     if (!adev)
         return 0;
 
-    audio_extn_snd_mon_unregister_listener(adev);
-    audio_extn_snd_mon_deinit();
-
-    audio_extn_tfa_98xx_deinit();
-
     pthread_mutex_lock(&adev_init_lock);
 
     if ((--audio_device_ref_count) == 0) {
+        audio_extn_snd_mon_unregister_listener(adev);
+        audio_extn_tfa_98xx_deinit();
         audio_route_free(adev->audio_route);
         free(adev->snd_dev_ref_cnt);
         platform_deinit(adev->platform);
         audio_extn_extspk_deinit(adev->extspk);
         audio_extn_sound_trigger_deinit(adev);
+        audio_extn_snd_mon_deinit();
         for (i = 0; i < ARRAY_SIZE(adev->use_case_table); ++i) {
             pcm_params_free(adev->use_case_table[i]);
         }
@@ -4621,7 +4619,6 @@
         return -EINVAL;
     }
     adev->extspk = audio_extn_extspk_init(adev);
-    audio_extn_sound_trigger_init(adev);
 
     adev->visualizer_lib = dlopen(VISUALIZER_LIBRARY_PATH, RTLD_NOW);
     if (adev->visualizer_lib == NULL) {
@@ -4733,6 +4730,7 @@
     audio_extn_snd_mon_register_listener(NULL, adev_snd_mon_cb);
     adev->card_status = CARD_STATUS_ONLINE;
     pthread_mutex_unlock(&adev->lock);
+    audio_extn_sound_trigger_init(adev);/* dependent on snd_mon_init() */
 
     ALOGD("%s: exit", __func__);
     return 0;
diff --git a/hal/msm8974/platform.c b/hal/msm8974/platform.c
index cfe2b3d..1b0bc20 100644
--- a/hal/msm8974/platform.c
+++ b/hal/msm8974/platform.c
@@ -732,8 +732,8 @@
     int mode = CAL_MODE_RTAC;
     struct listnode *node;
     struct audio_usecase *usecase;
-    bool valid_uc_type = false;
-    bool valid_dev = false;
+    bool valid_uc_type;
+    bool valid_dev;
 
     if (my_data->acdb_send_gain_dep_cal == NULL) {
         ALOGE("%s: dlsym error for acdb_send_gain_dep_cal", __func__);
@@ -748,12 +748,17 @@
         // find the current active sound device
         list_for_each(node, &adev->usecase_list) {
             usecase = node_to_item(node, struct audio_usecase, list);
-            valid_uc_type =  usecase->type == PCM_PLAYBACK;
-            audio_devices_t dev = usecase->stream.out->devices;
-            valid_dev = (dev == AUDIO_DEVICE_OUT_SPEAKER ||
-                         dev == AUDIO_DEVICE_OUT_WIRED_HEADSET ||
-                         dev == AUDIO_DEVICE_OUT_WIRED_HEADPHONE);
-             if (usecase != NULL && valid_uc_type && valid_dev) {
+            LOG_ALWAYS_FATAL_IF(usecase == NULL,
+                                "unxpected NULL usecase in usecase_list");
+            valid_uc_type = usecase->type == PCM_PLAYBACK;
+            valid_dev = false;
+            if (valid_uc_type) {
+                audio_devices_t dev = usecase->stream.out->devices;
+                valid_dev = (dev == AUDIO_DEVICE_OUT_SPEAKER ||
+                             dev == AUDIO_DEVICE_OUT_WIRED_HEADSET ||
+                             dev == AUDIO_DEVICE_OUT_WIRED_HEADPHONE);
+            }
+            if (valid_dev) {
                  ALOGV("%s: out device is %d", __func__,  usecase->out_snd_device);
                  if (audio_extn_spkr_prot_is_enabled()) {
                     acdb_dev_id = audio_extn_spkr_prot_get_acdb_id(usecase->out_snd_device);
@@ -1068,7 +1073,20 @@
     hw_interface_table[SND_DEVICE_IN_HEADSET_MIC] = strdup("SLIMBUS_0_TX");
     hw_interface_table[SND_DEVICE_IN_UNPROCESSED_MIC] = strdup("SLIMBUS_0_TX");
     hw_interface_table[SND_DEVICE_IN_CAMCORDER_MIC] = strdup("SLIMBUS_0_TX");
-
+    hw_interface_table[SND_DEVICE_IN_VOICE_REC_MIC] = strdup("SLIMBUS_0_TX");
+    hw_interface_table[SND_DEVICE_IN_VOICE_REC_MIC_NS] = strdup("SLIMBUS_0_TX");
+    hw_interface_table[SND_DEVICE_IN_VOICE_REC_DMIC_STEREO] = strdup("SLIMBUS_0_TX");
+    hw_interface_table[SND_DEVICE_IN_VOICE_REC_DMIC_FLUENCE] = strdup("SLIMBUS_0_TX");
+    hw_interface_table[SND_DEVICE_IN_SPEAKER_MIC] = strdup("SLIMBUS_0_TX");
+    hw_interface_table[SND_DEVICE_IN_SPEAKER_MIC_AEC] = strdup("SLIMBUS_0_TX");
+    hw_interface_table[SND_DEVICE_IN_SPEAKER_MIC_NS] = strdup("SLIMBUS_0_TX");
+    hw_interface_table[SND_DEVICE_IN_SPEAKER_MIC_AEC_NS] = strdup("SLIMBUS_0_TX");
+    hw_interface_table[SND_DEVICE_IN_SPEAKER_DMIC] = strdup("SLIMBUS_0_TX");
+    hw_interface_table[SND_DEVICE_IN_SPEAKER_DMIC_AEC] = strdup("SLIMBUS_0_TX");
+    hw_interface_table[SND_DEVICE_IN_SPEAKER_DMIC_NS] = strdup("SLIMBUS_0_TX");
+    hw_interface_table[SND_DEVICE_IN_SPEAKER_DMIC_AEC_NS] = strdup("SLIMBUS_0_TX");
+    hw_interface_table[SND_DEVICE_IN_VOICE_SPEAKER_MIC] = strdup("SLIMBUS_0_TX");
+    hw_interface_table[SND_DEVICE_IN_VOICE_HEADSET_MIC] = strdup("SLIMBUS_0_TX");
     my_data->max_mic_count = PLATFORM_DEFAULT_MIC_COUNT;
 }
 
diff --git a/hal/platform_api.h b/hal/platform_api.h
index bca3e2b..2e30608 100644
--- a/hal/platform_api.h
+++ b/hal/platform_api.h
@@ -18,7 +18,7 @@
 #define AUDIO_PLATFORM_API_H
 
 #include "voice.h"
-#define MAX_VOLUME_CAL_STEPS 15
+#define MAX_VOLUME_CAL_STEPS 25
 #define CODEC_BACKEND_DEFAULT_SAMPLE_RATE 48000
 #define CODEC_BACKEND_DEFAULT_BIT_WIDTH 16
 #define CODEC_BACKEND_DEFAULT_CHANNELS 2