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: