Merge "audio-hal/primary-hal: enable sound_trigger hal"
diff --git a/configs/lahaina/audio_io_policy.conf b/configs/lahaina/audio_io_policy.conf
index 3e3fdec..0932e44 100644
--- a/configs/lahaina/audio_io_policy.conf
+++ b/configs/lahaina/audio_io_policy.conf
@@ -76,7 +76,7 @@
   }
   compress_offload_24 {
     flags AUDIO_OUTPUT_FLAG_DIRECT|AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD|AUDIO_OUTPUT_FLAG_NON_BLOCKING
-    formats AUDIO_FORMAT_MP3|AUDIO_FORMAT_PCM_24_BIT_OFFLOAD|AUDIO_FORMAT_FLAC|AUDIO_FORMAT_ALAC|AUDIO_FORMAT_APE|AUDIO_FORMAT_AAC_LC|AUDIO_FORMAT_AAC_HE_V1|AUDIO_FORMAT_AAC_HE_V2|AUDIO_FORMAT_WMA_PRO|AUDIO_FORMAT_AAC_ADTS_LC|AUDIO_FORMAT_AAC_ADTS_HE_V1|AUDIO_FORMAT_AAC_ADTS_HE_V2|AUDIO_FORMAT_AAC_LATM_LC|AUDIO_FORMAT_AAC_LATM_HE_V1|AUDIO_FORMAT_AAC_LATM_HE_V2
+    formats AUDIO_FORMAT_MP3|AUDIO_FORMAT_PCM_24_BIT_OFFLOAD|AUDIO_FORMAT_FLAC|AUDIO_FORMAT_ALAC|AUDIO_FORMAT_APE|AUDIO_FORMAT_AAC_LC|AUDIO_FORMAT_AAC_HE_V1|AUDIO_FORMAT_AAC_HE_V2|AUDIO_FORMAT_WMA_PRO|AUDIO_FORMAT_VORBIS|AUDIO_FORMAT_AAC_ADTS_LC|AUDIO_FORMAT_AAC_ADTS_HE_V1|AUDIO_FORMAT_AAC_ADTS_HE_V2|AUDIO_FORMAT_AAC_LATM_LC|AUDIO_FORMAT_AAC_LATM_HE_V1|AUDIO_FORMAT_AAC_LATM_HE_V2
     sampling_rates 44100|48000|88200|96000|176400|192000
     bit_width 24
     app_type 69940
diff --git a/configs/msm8937/audio_policy_configuration_sdm429w_law.xml b/configs/msm8937/audio_policy_configuration_sdm429w_law.xml
index 0ea7a27..0630c09 100755
--- a/configs/msm8937/audio_policy_configuration_sdm429w_law.xml
+++ b/configs/msm8937/audio_policy_configuration_sdm429w_law.xml
@@ -49,7 +49,6 @@
         <!-- Primary Audio HAL -->
         <module name="primary" halVersion="2.0">
             <attachedDevices>
-                <item>Earpiece</item>
                 <item>Speaker</item>
                 <item>Telephony Tx</item>
                 <item>Built-In Mic</item>
@@ -161,10 +160,6 @@
 
             <devicePorts>
                 <!-- Output devices declaration, i.e. Sink DEVICE PORT -->
-                <devicePort tagName="Earpiece" type="AUDIO_DEVICE_OUT_EARPIECE" role="sink">
-                   <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
-                            samplingRates="48000" channelMasks="AUDIO_CHANNEL_IN_MONO"/>
-                </devicePort>
                 <devicePort tagName="Speaker" role="sink" type="AUDIO_DEVICE_OUT_SPEAKER" address="">
                     <profile name="" format="AUDIO_FORMAT_PCM_16_BIT"
                              samplingRates="48000" channelMasks="AUDIO_CHANNEL_OUT_STEREO"/>
@@ -256,8 +251,6 @@
             </devicePorts>
             <!-- route declaration, i.e. list all available sources for a given sink -->
             <routes>
-                <route type="mix" sink="Earpiece"
-                       sources="primary output,raw,deep_buffer,direct_pcm,compressed_offload,voip_rx"/>
                 <route type="mix" sink="Speaker"
                        sources="primary output,raw,deep_buffer,direct_pcm,compressed_offload,voip_rx"/>
                 <route type="mix" sink="Wired Headset"
diff --git a/configs/msm8937/mixer_paths_sdm429w_dvt2.xml b/configs/msm8937/mixer_paths_sdm429w_dvt2.xml
index ecb6767..4a6d124 100644
--- a/configs/msm8937/mixer_paths_sdm429w_dvt2.xml
+++ b/configs/msm8937/mixer_paths_sdm429w_dvt2.xml
@@ -119,7 +119,7 @@
     <ctl name="MultiMedia1 Mixer TERT_MI2S_TX" value="0" />
     <ctl name="MultiMedia5 Mixer TERT_MI2S_TX" value="0" />
     <ctl name="MultiMedia1 Mixer SLIM_7_TX" value="0" />
-    <ctl name="MultiMedia5 Mixer SLIM_7_TX" value="1" />
+    <ctl name="MultiMedia5 Mixer SLIM_7_TX" value="0" />
     <ctl name="MultiMedia8 Mixer SLIM_7_TX" value="0" />
     <ctl name="PRI_MI2S_RX_Voice Mixer CSVoice" value="0" />
     <ctl name="Voice_Tx Mixer TERT_MI2S_TX_Voice" value="0" />
diff --git a/configs/msmnile_au/audio_effects.conf b/configs/msmnile_au/audio_effects.conf
old mode 100644
new mode 100755
index 8d1251a..edb9814
--- a/configs/msmnile_au/audio_effects.conf
+++ b/configs/msmnile_au/audio_effects.conf
@@ -45,9 +45,6 @@
   audio_pre_processing {
     path /vendor/lib/soundfx/libqcomvoiceprocessing.so
   }
-  volume_listener {
-    path /vendor/lib/soundfx/libvolumelistener.so
-  }
   audiosphere {
     path /vendor/lib/soundfx/libasphere.so
   }
@@ -262,27 +259,6 @@
     library audio_pre_processing
     uuid 1d97bb0b-9e2f-4403-9ae3-58c2554306f8
   }
-  music_helper {
-    library volume_listener
-    uuid 08b8b058-0590-11e5-ac71-0025b32654a0
-  }
-  ring_helper {
-    library volume_listener
-    uuid 0956df94-0590-11e5-bdbe-0025b32654a0
-  }
-  alarm_helper {
-    library volume_listener
-    uuid 09f303e2-0590-11e5-8fdb-0025b32654a0
-  }
-  # voice_helper is called when stream type is voice_call in VoIP usecase
-  voice_helper {
-    library volume_listener
-    uuid 0ace5c08-0590-11e5-ae9e-0025b32654a0
-  }
-  notification_helper {
-    library volume_listener
-    uuid 0b776dde-0590-11e5-81ba-0025b32654a0
-  }
   audiosphere {
     library audiosphere
     uuid 184e62ab-2d19-4364-9d1b-c0a40733866c
diff --git a/configs/msmsteppe_au/audio_effects.conf b/configs/msmsteppe_au/audio_effects.conf
old mode 100644
new mode 100755
index 1f29086..2e850c6
--- a/configs/msmsteppe_au/audio_effects.conf
+++ b/configs/msmsteppe_au/audio_effects.conf
@@ -42,9 +42,6 @@
   audio_pre_processing {
     path /vendor/lib/soundfx/libqcomvoiceprocessing.so
   }
-  volume_listener {
-    path /vendor/lib/soundfx/libvolumelistener.so
-  }
   audiosphere {
     path /vendor/lib/soundfx/libasphere.so
   }
@@ -255,27 +252,6 @@
     library audio_pre_processing
     uuid 1d97bb0b-9e2f-4403-9ae3-58c2554306f8
   }
-  music_helper {
-    library volume_listener
-    uuid 08b8b058-0590-11e5-ac71-0025b32654a0
-  }
-  ring_helper {
-    library volume_listener
-    uuid 0956df94-0590-11e5-bdbe-0025b32654a0
-  }
-  alarm_helper {
-    library volume_listener
-    uuid 09f303e2-0590-11e5-8fdb-0025b32654a0
-  }
-  # voice_helper is called when stream type is voice_call in VoIP usecase
-  voice_helper {
-    library volume_listener
-    uuid 0ace5c08-0590-11e5-ae9e-0025b32654a0
-  }
-  notification_helper {
-    library volume_listener
-    uuid 0b776dde-0590-11e5-81ba-0025b32654a0
-  }
   audiosphere {
     library audiosphere
     uuid 184e62ab-2d19-4364-9d1b-c0a40733866c
diff --git a/hal/audio_extn/hfp.c b/hal/audio_extn/hfp.c
index ca5d3bb..697a507 100644
--- a/hal/audio_extn/hfp.c
+++ b/hal/audio_extn/hfp.c
@@ -52,6 +52,7 @@
 #define AUDIO_PARAMETER_HFP_PCM_DEV_ID "hfp_pcm_dev_id"
 #define AUDIO_PARAMETER_HFP_VOL_MIXER_CTL "hfp_vol_mixer_ctl"
 #define AUDIO_PARAMETER_HFP_VALUE_MAX   128
+#define AUDIO_PARAMETER_HFP_FORCE_ROUTE_SPEAKER "hfp_route_spkr"
 
 #define AUDIO_PARAMETER_KEY_HFP_MIC_VOLUME "hfp_mic_volume"
 #define PLAYBACK_VOLUME_MAX 0x2000
@@ -118,6 +119,7 @@
     .stop_threshold = INT_MAX,
     .avail_min = 0,
 };
+static bool route_spkr = false;
 
 //external feature dependency
 static fp_platform_set_mic_mute_t                   fp_platform_set_mic_mute;
@@ -320,6 +322,11 @@
     uc_info->in_snd_device = SND_DEVICE_NONE;
     uc_info->out_snd_device = SND_DEVICE_NONE;
 
+    if (route_spkr) {
+        reassign_device_list(&uc_info->device_list, AUDIO_DEVICE_OUT_SPEAKER, "");
+        reassign_device_list(&uc_info->stream.out->device_list, AUDIO_DEVICE_OUT_SPEAKER, "");
+    }
+
     list_add_tail(&adev->usecase_list, &uc_info->list);
 
     fp_select_devices(adev, hfpmod.ucid);
@@ -431,6 +438,7 @@
 
     ALOGD("%s: enter", __func__);
     hfpmod.is_hfp_running = false;
+    route_spkr = false;
 
     /* 1. Close the PCM devices */
     if (hfpmod.hfp_sco_rx) {
@@ -553,6 +561,7 @@
     int val;
     float vol;
     char value[32]={0};
+    struct audio_usecase *uc_info = NULL;
 
     ALOGV("%s: enter", __func__);
 
@@ -581,14 +590,36 @@
                ALOGE("Unsupported rate..");
     }
 
-    if (hfpmod.is_hfp_running) {
-        memset(value, 0, sizeof(value));
-        ret = str_parms_get_str(parms, AUDIO_PARAMETER_STREAM_ROUTING,
+    memset(value, 0, sizeof(value));
+    ret = str_parms_get_str(parms, AUDIO_PARAMETER_HFP_FORCE_ROUTE_SPEAKER, value,
+                            sizeof(value));
+    if(ret >= 0){
+        route_spkr = true;
+        ALOGD("%s: Set force route to speaker", __func__);
+    }
+
+    memset(value, 0, sizeof(value));
+    ret = str_parms_get_str(parms, AUDIO_PARAMETER_STREAM_ROUTING,
                                 value, sizeof(value));
-        if (ret >= 0) {
-            val = atoi(value);
-            if (val > 0)
-                fp_select_devices(adev, hfpmod.ucid);
+    if (ret >= 0) {
+        val = atoi(value);
+        if (val > 0) {
+            if (hfpmod.is_hfp_running) {
+                if (route_spkr) {
+                    if (val != AUDIO_DEVICE_OUT_SPEAKER)
+                        ALOGI("%s: HFP call in progress, cannot route to device %d", __func__, val);
+                } else {
+                    uc_info = fp_get_usecase_from_list(adev, hfpmod.ucid);
+
+                    if (uc_info != NULL) {
+                        reassign_device_list(&uc_info->device_list, val, "");
+                        reassign_device_list(&uc_info->stream.out->device_list, val, "");
+                        fp_select_devices(adev, hfpmod.ucid);
+                    }
+                }
+
+                str_parms_del(parms, AUDIO_PARAMETER_STREAM_ROUTING);
+            }
         }
     }