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/audio_extn.c b/hal/audio_extn/audio_extn.c
index 5a244e5..c9d3cf8 100644
--- a/hal/audio_extn/audio_extn.c
+++ b/hal/audio_extn/audio_extn.c
@@ -213,12 +213,6 @@
void audio_extn_fm_set_parameters(struct audio_device *adev,
struct str_parms *parms);
#endif
-#ifndef HFP_ENABLED
-#define audio_extn_hfp_set_parameters(adev, parms) (0)
-#else
-void audio_extn_hfp_set_parameters(struct audio_device *adev,
- struct str_parms *parms);
-#endif
#ifndef SOURCE_TRACKING_ENABLED
#define audio_extn_source_track_set_parameters(adev, parms) (0)
diff --git a/hal/audio_extn/audio_extn.h b/hal/audio_extn/audio_extn.h
index c298eb0..8d58d09 100644
--- a/hal/audio_extn/audio_extn.h
+++ b/hal/audio_extn/audio_extn.h
@@ -503,10 +503,13 @@
#define audio_extn_hfp_is_active(adev) (0)
#define audio_extn_hfp_get_usecase() (-1)
#define hfp_set_mic_mute(dev, state) (0)
+#define audio_extn_hfp_set_parameters(adev, parms) (0)
#else
bool audio_extn_hfp_is_active(struct audio_device *adev);
audio_usecase_t audio_extn_hfp_get_usecase();
int hfp_set_mic_mute(struct audio_device *dev, bool state);
+void audio_extn_hfp_set_parameters(struct audio_device *adev,
+ struct str_parms *parms);
#endif
#ifndef DEV_ARBI_ENABLED
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__);
}
diff --git a/hal/msm8916/platform.c b/hal/msm8916/platform.c
index b94bab0..9710f59 100644
--- a/hal/msm8916/platform.c
+++ b/hal/msm8916/platform.c
@@ -819,6 +819,7 @@
{TO_NAME_INDEX(USECASE_INCALL_REC_DOWNLINK)},
{TO_NAME_INDEX(USECASE_INCALL_REC_UPLINK_AND_DOWNLINK)},
{TO_NAME_INDEX(USECASE_AUDIO_HFP_SCO)},
+ {TO_NAME_INDEX(USECASE_AUDIO_HFP_SCO_WB)},
{TO_NAME_INDEX(USECASE_AUDIO_SPKR_CALIB_TX)},
{TO_NAME_INDEX(USECASE_AUDIO_PLAYBACK_EXT_DISP_SILENCE)},
{TO_NAME_INDEX(USECASE_AUDIO_PLAYBACK_FM)},
@@ -4333,6 +4334,7 @@
int platform_set_parameters(void *platform, struct str_parms *parms)
{
struct platform_data *my_data = (struct platform_data *)platform;
+ struct audio_device *adev = my_data->adev;
char value[256] = {0};
int len;
int ret = 0, err;
@@ -4449,6 +4451,7 @@
native_audio_set_params(platform, parms, value, sizeof(value));
audio_extn_spkr_prot_set_parameters(parms, value, len);
audio_extn_usb_set_sidetone_gain(parms, value, len);
+ audio_extn_hfp_set_parameters(adev, parms);
true_32_bit_set_params(parms, value, len);
ALOGV("%s: exit with code(%d)", __func__, ret);
return ret;
diff --git a/hal/msm8974/platform.c b/hal/msm8974/platform.c
index e9936ff..f161f7e 100644
--- a/hal/msm8974/platform.c
+++ b/hal/msm8974/platform.c
@@ -780,6 +780,7 @@
{TO_NAME_INDEX(USECASE_INCALL_REC_DOWNLINK)},
{TO_NAME_INDEX(USECASE_INCALL_REC_UPLINK_AND_DOWNLINK)},
{TO_NAME_INDEX(USECASE_AUDIO_HFP_SCO)},
+ {TO_NAME_INDEX(USECASE_AUDIO_HFP_SCO_WB)},
{TO_NAME_INDEX(USECASE_AUDIO_PLAYBACK_FM)},
{TO_NAME_INDEX(USECASE_AUDIO_RECORD_FM_VIRTUAL)},
{TO_NAME_INDEX(USECASE_AUDIO_SPKR_CALIB_RX)},
@@ -4172,6 +4173,7 @@
int platform_set_parameters(void *platform, struct str_parms *parms)
{
struct platform_data *my_data = (struct platform_data *)platform;
+ struct audio_device *adev = my_data->adev;
char *value=NULL;
int len;
int ret = 0, err;
@@ -4306,6 +4308,7 @@
native_audio_set_params(platform, parms, value, len);
audio_extn_spkr_prot_set_parameters(parms, value, len);
audio_extn_usb_set_sidetone_gain(parms, value, len);
+ audio_extn_hfp_set_parameters(adev, parms);
perf_lock_set_params(platform, parms, value, len);
true_32_bit_set_params(parms, value, len);
done: