hal: add a new key to query for decoder viability
- Due to resource constraints some times a decoder playback cannot
be supported, for example HW decoders cannot be supported during
voice calls, this key can be queried to know about this.
- Bring in the this funtionality in HAL under the android prop
"voice.playback.conc.disabled"
Change-Id: Id6819b1b953c8ba9948c85218d98beb789f92631
CRs-Fixed: 902360
diff --git a/hal/audio_extn/audio_defs.h b/hal/audio_extn/audio_defs.h
index 96b0a8b..96a7a19 100644
--- a/hal/audio_extn/audio_defs.h
+++ b/hal/audio_extn/audio_defs.h
@@ -99,4 +99,6 @@
/* Query if Proxy can be Opend */
#define AUDIO_PARAMETER_KEY_CAN_OPEN_PROXY "can_open_proxy"
+#define AUDIO_PARAMETER_IS_HW_DECODER_SESSION_ALLOWED "is_hw_dec_session_allowed"
+
#endif /* AUDIO_DEFS_H */
diff --git a/hal/msm8916/platform.c b/hal/msm8916/platform.c
index 9457ff9..fc7d038 100644
--- a/hal/msm8916/platform.c
+++ b/hal/msm8916/platform.c
@@ -148,12 +148,12 @@
#define MAX_DSP_ONLY_DECODERS 6
char * dsp_only_decoders_mime[] = {
- "audio/x-ms-wma" /* wma*/ ,
- "audio/x-ms-wma-lossless" /* wma lossless */ ,
- "audio/x-ms-wma-pro" /* wma prop */ ,
- "audio/amr-wb-plus" /* amr wb plus */ ,
- "audio/alac" /*alac */ ,
- "audio/x-ape" /*ape */,
+ "audio/x-ms-wma" /* wma*/ ,
+ "audio/x-ms-wma-lossless" /* wma lossless */ ,
+ "audio/x-ms-wma-pro" /* wma prop */ ,
+ "audio/amr-wb-plus" /* amr wb plus */ ,
+ "audio/alac" /*alac */ ,
+ "audio/x-ape" /*ape */,
};
enum {
@@ -3486,6 +3486,8 @@
char value[512] = {0};
int ret;
char *kv_pairs = NULL;
+ char propValue[PROPERTY_VALUE_MAX]={0};
+ bool prop_playback_enabled = false;
ret = str_parms_get_str(query, AUDIO_PARAMETER_KEY_SLOWTALK,
value, sizeof(value));
@@ -3516,12 +3518,16 @@
ret = str_parms_get_str(query, AUDIO_PARAMETER_IS_HW_DECODER_SESSION_ALLOWED,
value, sizeof(value));
-
if (ret >= 0) {
int isallowed = 1; /*true*/
- if(voice_is_in_call(my_data->adev) ||
- (SND_CARD_STATE_OFFLINE == get_snd_card_state(my_data->adev))) {
+ if (property_get("voice.playback.conc.disabled", propValue, NULL)) {
+ prop_playback_enabled = atoi(propValue) ||
+ !strncmp("true", propValue, 4);
+ }
+
+ if (prop_playback_enabled && (voice_is_in_call(my_data->adev) ||
+ (SND_CARD_STATE_OFFLINE == get_snd_card_state(my_data->adev)))) {
char *decoder_mime_type = value;
//check if unsupported mime type or not
@@ -3530,7 +3536,7 @@
for (i = 0; i < sizeof(dsp_only_decoders_mime)/sizeof(dsp_only_decoders_mime[0]); i++) {
if (!strncmp(decoder_mime_type, dsp_only_decoders_mime[i],
strlen(dsp_only_decoders_mime[i]))) {
- ALOGE("Rejecting request for DSP only session from HAL during voice call/SSR state");
+ ALOGD("Rejecting request for DSP only session from HAL during voice call/SSR state");
isallowed = 0;
break;
}
diff --git a/hal/msm8974/platform.c b/hal/msm8974/platform.c
index 58013b7..175a3a6 100644
--- a/hal/msm8974/platform.c
+++ b/hal/msm8974/platform.c
@@ -131,6 +131,18 @@
[WCD9XXX_MBHC_CAL] = "mbhc_cal",
};
+#define AUDIO_PARAMETER_IS_HW_DECODER_SESSION_ALLOWED "is_hw_dec_session_allowed"
+
+char * dsp_only_decoders_mime[] = {
+ "audio/x-ms-wma" /* wma*/ ,
+ "audio/x-ms-wma-lossless" /* wma lossless */ ,
+ "audio/x-ms-wma-pro" /* wma prop */ ,
+ "audio/amr-wb-plus" /* amr wb plus */ ,
+ "audio/alac" /*alac */ ,
+ "audio/x-ape" /*ape */,
+};
+
+
enum {
VOICE_FEATURE_SET_DEFAULT,
VOICE_FEATURE_SET_VOLUME_BOOST
@@ -3104,6 +3116,36 @@
get_audiocal(platform, query, reply);
native_audio_get_params(query, reply, value, sizeof(value));
+ ret = str_parms_get_str(query, AUDIO_PARAMETER_IS_HW_DECODER_SESSION_ALLOWED,
+ value, sizeof(value));
+ if (ret >= 0) {
+ int isallowed = 1; /*true*/
+
+ if (property_get("voice.playback.conc.disabled", propValue, NULL)) {
+ prop_playback_enabled = atoi(propValue) ||
+ !strncmp("true", propValue, 4);
+ }
+
+ if (prop_playback_enabled && (voice_is_in_call(my_data->adev) ||
+ (SND_CARD_STATE_OFFLINE == get_snd_card_state(my_data->adev)))) {
+ char *decoder_mime_type = value;
+
+ //check if unsupported mime type or not
+ if(decoder_mime_type) {
+ int i = 0;
+ for (i = 0; i < sizeof(dsp_only_decoders_mime)/sizeof(dsp_only_decoders_mime[0]); i++) {
+ if (!strncmp(decoder_mime_type, dsp_only_decoders_mime[i],
+ strlen(dsp_only_decoders_mime[i]))) {
+ ALOGD("Rejecting request for DSP only session from HAL during voice call/SSR state");
+ isallowed = 0;
+ break;
+ }
+ }
+ }
+ }
+ str_parms_add_int(reply, AUDIO_PARAMETER_IS_HW_DECODER_SESSION_ALLOWED, isallowed);
+ }
+
done:
kv_pairs = str_parms_to_str(reply);
ALOGV_IF(kv_pairs != NULL, "%s: exit: returns - %s", __func__, kv_pairs);