msm8916: hal: optimize worst case soundcard detection time
am: d135c3175c
Change-Id: Iae22493864f21a43f3a47b5272aa7b558b23baa5
diff --git a/hal/msm8916/platform.c b/hal/msm8916/platform.c
index 900a7e6..f2efec3 100644
--- a/hal/msm8916/platform.c
+++ b/hal/msm8916/platform.c
@@ -842,24 +842,39 @@
}
list_init(&operator_info_list);
+ bool card_verifed[MAX_SND_CARD] = {0};
+ const int retry_limit = property_get_int32("audio.snd_card.open.retries", RETRY_NUMBER);
- while (snd_card_num < MAX_SND_CARD) {
- adev->mixer = mixer_open(snd_card_num);
+ for (;;) {
+ if (snd_card_num >= MAX_SND_CARD) {
+ if (retry_num++ >= retry_limit) {
+ ALOGE("%s: Unable to find correct sound card, aborting.", __func__);
+ free(my_data);
+ my_data = NULL;
+ return NULL;
+ }
- while (!adev->mixer && retry_num < RETRY_NUMBER) {
+ snd_card_num = 0;
usleep(RETRY_US);
- adev->mixer = mixer_open(snd_card_num);
- retry_num++;
+ continue;
}
+ if (card_verifed[snd_card_num]) {
+ ++snd_card_num;
+ continue;
+ }
+
+ adev->mixer = mixer_open(snd_card_num);
+
if (!adev->mixer) {
ALOGE("%s: Unable to open the mixer card: %d", __func__,
- snd_card_num);
- retry_num = 0;
- snd_card_num++;
+ snd_card_num);
+ ++snd_card_num;
continue;
}
+ card_verifed[snd_card_num] = true;
+
snd_card_name = mixer_get_name(adev->mixer);
ALOGV("%s: snd_card_name: %s", __func__, snd_card_name);
@@ -875,21 +890,21 @@
if (!adev->audio_route) {
ALOGE("%s: Failed to init audio route controls, aborting.",
__func__);
+ hw_info_deinit(my_data->hw_info);
+ my_data->hw_info = NULL;
free(my_data);
+ my_data = NULL;
+ mixer_close(adev->mixer);
+ adev->mixer = NULL;
return NULL;
}
adev->snd_card = snd_card_num;
ALOGD("%s: Opened sound card:%d", __func__, snd_card_num);
break;
}
- retry_num = 0;
- snd_card_num++;
- }
-
- if (snd_card_num >= MAX_SND_CARD) {
- ALOGE("%s: Unable to find correct sound card, aborting.", __func__);
- free(my_data);
- return NULL;
+ ++snd_card_num;
+ mixer_close(adev->mixer);
+ adev->mixer = NULL;
}
//set max volume step for voice call