audio: Open proper sound card
If the device is booted up with USB connected,
hw_info initialization will fail but it's missing
some logic to retry with the next available card.
Add that logic. Also limit sound card state monitoring
for ADSP and CPE.
Bug: 62272435
Change-Id: Ifc584362d7184804be6978fc260774e4091cce45
diff --git a/hal/audio_extn/audio_extn.h b/hal/audio_extn/audio_extn.h
index 100741f..600c179 100644
--- a/hal/audio_extn/audio_extn.h
+++ b/hal/audio_extn/audio_extn.h
@@ -187,7 +187,7 @@
#endif
bool audio_extn_utils_resolve_config_file(char[]);
-void audio_extn_utils_get_platform_info(const char* snd_card_name,
- char* platform_info_file);
+int audio_extn_utils_get_platform_info(const char* snd_card_name,
+ char* platform_info_file);
int audio_extn_utils_get_snd_card_num();
#endif /* AUDIO_EXTN_H */
diff --git a/hal/audio_extn/sndmonitor.c b/hal/audio_extn/sndmonitor.c
index 58ab43d..3c91dda 100644
--- a/hal/audio_extn/sndmonitor.c
+++ b/hal/audio_extn/sndmonitor.c
@@ -152,7 +152,7 @@
size_t len = 0;
ssize_t bytes_read;
char path[128] = {0};
- char *ptr, *saveptr;
+ char *ptr, *saveptr, *card_id;
int line_no=0;
unsigned int num_cards=0, num_cpe=0;
FILE *fp;
@@ -180,6 +180,19 @@
if (!ptr)
continue;
+ card_id = strtok_r(saveptr+1, "]", &saveptr);
+ if (!card_id)
+ continue;
+
+ // Limit to sound cards associated with ADSP
+ if ((strncasecmp(card_id, "msm", 3) != 0) &&
+ (strncasecmp(card_id, "sdm", 3) != 0) &&
+ (strncasecmp(card_id, "sdc", 3) != 0) &&
+ (strncasecmp(card_id, "apq", 3) != 0)) {
+ ALOGW("Skip over non-ADSP snd card %s", card_id);
+ continue;
+ }
+
snprintf(path, sizeof(path), "/proc/asound/card%s/state", ptr);
ALOGV("Opening sound card state : %s", path);
diff --git a/hal/audio_extn/utils.c b/hal/audio_extn/utils.c
index e41af96..eb0f9f6 100644
--- a/hal/audio_extn/utils.c
+++ b/hal/audio_extn/utils.c
@@ -324,14 +324,14 @@
}
/* platform_info_file should be size 'MIXER_PATH_MAX_LENGTH' */
-void audio_extn_utils_get_platform_info(const char* snd_card_name, char* platform_info_file)
+int audio_extn_utils_get_platform_info(const char* snd_card_name, char* platform_info_file)
{
if (NULL == snd_card_name) {
- return;
+ return -1;
}
struct snd_card_split *snd_split_handle = NULL;
-
+ int ret = 0;
audio_extn_set_snd_card_split(snd_card_name);
snd_split_handle = audio_extn_get_snd_card_split();
@@ -347,9 +347,11 @@
if (!audio_extn_utils_resolve_config_file(platform_info_file)) {
memset(platform_info_file, 0, MIXER_PATH_MAX_LENGTH);
strlcpy(platform_info_file, PLATFORM_INFO_XML_PATH, MIXER_PATH_MAX_LENGTH);
- audio_extn_utils_resolve_config_file(platform_info_file);
+ ret = audio_extn_utils_resolve_config_file(platform_info_file) ? 0 : -1;
}
}
+
+ return ret;
}
int audio_extn_utils_get_snd_card_num()
@@ -399,10 +401,17 @@
snd_card_name = mixer_get_name(mixer);
hw_info = hw_info_init(snd_card_name);
- audio_extn_utils_get_platform_info(snd_card_name, platform_info_file);
+ if (audio_extn_utils_get_platform_info(snd_card_name, platform_info_file) < 0) {
+ ALOGE("Failed to find platform_info_file");
+ goto cleanup;
+ }
/* Initialize snd card name specific ids and/or backends*/
- snd_card_info_init(platform_info_file, my_data, &acdb_set_parameters);
+ if (snd_card_info_init(platform_info_file, my_data,
+ &acdb_set_parameters) < 0) {
+ ALOGE("Failed to find platform_info_file");
+ goto cleanup;
+ }
/* validate the sound card name
* my_data->snd_card_name can contain
@@ -419,17 +428,18 @@
min(strlen(snd_card_name), strlen(my_data->snd_card_name))) != 0) {
ALOGI("%s: found valid sound card %s, but not primary sound card %s",
__func__, snd_card_name, my_data->snd_card_name);
- ++snd_card_num;
- mixer_close(mixer);
- mixer = NULL;
- hw_info_deinit(hw_info);
- hw_info = NULL;
- continue;
+ goto cleanup;
}
- ALOGI("%s: found sound card %s, primary sound card expeted is %s",
+ ALOGI("%s: found sound card %s, primary sound card expected is %s",
__func__, snd_card_name, my_data->snd_card_name);
break;
+ cleanup:
+ ++snd_card_num;
+ mixer_close(mixer);
+ mixer = NULL;
+ hw_info_deinit(hw_info);
+ hw_info = NULL;
}
done: