hal: update HFP PCM device ID from platform_info.xml

Update HFP PCM device ID from platform_info.xml file (if defined)
instead of using explicitly defined hardcoded values.

CRs-Fixed: 1117322
Change-Id: Id903b32d12666d510326c2656133f0b957485418
diff --git a/hal/audio_extn/hfp.c b/hal/audio_extn/hfp.c
index fa192e5..9e5b213 100644
--- a/hal/audio_extn/hfp.c
+++ b/hal/audio_extn/hfp.c
@@ -1,5 +1,4 @@
-/* hfp.c
-Copyright (c) 2012-2016, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2012-2017, The Linux Foundation. All rights reserved.
 
 Redistribution and use in source and binary forms, with or without
 modification, are permitted provided that the following conditions are
@@ -44,6 +43,7 @@
 #define AUDIO_PARAMETER_HFP_ENABLE      "hfp_enable"
 #define AUDIO_PARAMETER_HFP_SET_SAMPLING_RATE "hfp_set_sampling_rate"
 #define AUDIO_PARAMETER_KEY_HFP_VOLUME "hfp_volume"
+#define AUDIO_PARAMETER_HFP_PCM_DEV_ID "hfp_pcm_dev_id"
 
 #ifdef PLATFORM_MSM8994
 #define HFP_RX_VOLUME     "SEC AUXPCM LOOPBACK Volume"
@@ -67,6 +67,7 @@
     struct pcm *hfp_pcm_tx;
     bool is_hfp_running;
     float hfp_volume;
+    int32_t hfp_pcm_dev_id;
     audio_usecase_t ucid;
 };
 
@@ -75,8 +76,9 @@
     .hfp_sco_tx = NULL,
     .hfp_pcm_rx = NULL,
     .hfp_pcm_tx = NULL,
-    .hfp_volume = 0,
     .is_hfp_running = 0,
+    .hfp_volume = 0,
+    .hfp_pcm_dev_id = HFP_ASM_RX_TX,
     .ucid = USECASE_AUDIO_HFP_SCO,
 };
 static struct pcm_config pcm_config_hfp = {
@@ -157,8 +159,8 @@
 
     pcm_dev_rx_id = platform_get_pcm_device_id(uc_info->id, PCM_PLAYBACK);
     pcm_dev_tx_id = platform_get_pcm_device_id(uc_info->id, PCM_CAPTURE);
-    pcm_dev_asm_rx_id = HFP_ASM_RX_TX;
-    pcm_dev_asm_tx_id = HFP_ASM_RX_TX;
+    pcm_dev_asm_rx_id = hfpmod.hfp_pcm_dev_id;
+    pcm_dev_asm_tx_id = hfpmod.hfp_pcm_dev_id;
     if (pcm_dev_rx_id < 0 || pcm_dev_tx_id < 0 ||
         pcm_dev_asm_rx_id < 0 || pcm_dev_asm_tx_id < 0 ) {
         ALOGE("%s: Invalid PCM devices (rx: %d tx: %d asm: rx tx %d) for the usecase(%d)",
@@ -167,11 +169,9 @@
         goto exit;
     }
 
-    ALOGV("%s: HFP PCM devices (hfp rx tx: %d pcm rx tx: %d) for the usecase(%d)",
-              __func__, pcm_dev_rx_id, pcm_dev_tx_id, uc_info->id);
+    ALOGD("%s: HFP PCM devices (rx: %d tx: %d pcm dev id: %d) usecase(%d)",
+              __func__, pcm_dev_rx_id, pcm_dev_tx_id, hfpmod.hfp_pcm_dev_id, uc_info->id);
 
-    ALOGV("%s: Opening PCM playback device card_id(%d) device_id(%d)",
-          __func__, adev->snd_card, pcm_dev_rx_id);
     hfpmod.hfp_sco_rx = pcm_open(adev->snd_card,
                                   pcm_dev_asm_rx_id,
                                   PCM_OUT, &pcm_config_hfp);
@@ -180,8 +180,7 @@
         ret = -EIO;
         goto exit;
     }
-    ALOGD("%s: Opening PCM capture device card_id(%d) device_id(%d)",
-          __func__, adev->snd_card, pcm_dev_tx_id);
+
     hfpmod.hfp_pcm_rx = pcm_open(adev->snd_card,
                                    pcm_dev_rx_id,
                                    PCM_OUT, &pcm_config_hfp);
@@ -190,6 +189,7 @@
         ret = -EIO;
         goto exit;
     }
+
     hfpmod.hfp_sco_tx = pcm_open(adev->snd_card,
                                   pcm_dev_asm_tx_id,
                                   PCM_IN, &pcm_config_hfp);
@@ -198,8 +198,7 @@
         ret = -EIO;
         goto exit;
     }
-    ALOGV("%s: Opening PCM capture device card_id(%d) device_id(%d)",
-          __func__, adev->snd_card, pcm_dev_tx_id);
+
     hfpmod.hfp_pcm_tx = pcm_open(adev->snd_card,
                                    pcm_dev_tx_id,
                                    PCM_IN, &pcm_config_hfp);
@@ -208,6 +207,7 @@
         ret = -EIO;
         goto exit;
     }
+
     if (pcm_start(hfpmod.hfp_sco_rx) < 0) {
         ALOGE("%s: pcm start for hfp sco rx failed", __func__);
         ret = -EINVAL;
@@ -338,10 +338,12 @@
     ret = str_parms_get_str(parms, AUDIO_PARAMETER_HFP_ENABLE, value,
                             sizeof(value));
     if (ret >= 0) {
-           if (!strncmp(value,"true",sizeof(value)))
-               ret = start_hfp(adev,parms);
-           else
-               stop_hfp(adev);
+            if (!strncmp(value, "true", sizeof(value)) && !hfpmod.is_hfp_running)
+                ret = start_hfp(adev,parms);
+            else if (!strncmp(value, "false", sizeof(value)) && hfpmod.is_hfp_running)
+                stop_hfp(adev);
+            else
+                ALOGE("hfp_enable=%s is unsupported", value);
     }
     memset(value, 0, sizeof(value));
     ret = str_parms_get_str(parms,AUDIO_PARAMETER_HFP_SET_SAMPLING_RATE, value,
@@ -381,6 +383,15 @@
         ALOGD("%s: set_hfp_volume usecase, Vol: [%f]", __func__, vol);
         hfp_set_volume(adev, vol);
     }
+
+    memset(value, 0, sizeof(value));
+    ret = str_parms_get_str(parms, AUDIO_PARAMETER_HFP_PCM_DEV_ID, value, sizeof(value));
+    if (ret >= 0) {
+        hfpmod.hfp_pcm_dev_id = atoi(value);
+        ALOGD("Updating HFP_PCM_DEV_ID as %d from platform XML", hfpmod.hfp_pcm_dev_id);
+        str_parms_del(parms, AUDIO_PARAMETER_HFP_PCM_DEV_ID);
+    }
+
 exit:
     ALOGV("%s Exit",__func__);
 }