cherry-pick: factory_AudioLoop: use card index from given device names

BUG=chromium:298474
TEST=Manual specify hw:1,0 and make sure mixer settings
applies to correct audio card.

Change-Id: Id1eaf4623ace001d42707585e812c6bbc00d7aed
Original-Change-Id: Ie9e570f6221493cb45170d6f2f1475cb43a58022
Reviewed-on: https://chromium-review.googlesource.com/170902
Reviewed-by: Heng-ruey Hsu <henryhsu@chromium.org>
Commit-Queue: Hsinyu Chao <hychao@chromium.org>
Tested-by: Hsinyu Chao <hychao@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/170965
Reviewed-by: Hsinyu Chao <hychao@chromium.org>
Commit-Queue: Gediminas Ramanauskas <gedis@chromium.org>
Tested-by: Gediminas Ramanauskas <gedis@chromium.org>
diff --git a/client/site_tests/factory_AudioLoop/factory_AudioLoop.py b/client/site_tests/factory_AudioLoop/factory_AudioLoop.py
index b8dd0f5..fae5d1c 100755
--- a/client/site_tests/factory_AudioLoop/factory_AudioLoop.py
+++ b/client/site_tests/factory_AudioLoop/factory_AudioLoop.py
@@ -70,10 +70,11 @@
                         if self.in_blacklist_combinations(channel, idev):
                             continue
 
-                        self._ah.set_mixer_controls(settings)
+                        self._ah.set_mixer_controls(settings, self._card)
                         if self._mute_device_mixer_settings:
                             self._ah.set_mixer_controls(
-                                    self._mute_device_mixer_settings)
+                                    self._mute_device_mixer_settings,
+                                    self._card)
                         self.run_audiofuntest(idev, odev,
                                               self._audiofuntest_duration)
                         time.sleep(0.5)
@@ -118,7 +119,7 @@
                      break
 
         # Unmute channels
-        self._ah.set_mixer_controls(self._unmute_mixer_settings)
+        self._ah.set_mixer_controls(self._unmute_mixer_settings, self._card)
 
         # Show instant message and wait for a while
         if self._test_result:
@@ -167,6 +168,20 @@
             self._test_result = True
             factory.console.info('Got frequency %d' % freq)
 
+    def get_card_index(self, devs):
+        '''
+        Gets the card index from given device names. If more then
+        one card is covered, return the first found one.
+        Args:
+            devs - List of alsa device names
+        '''
+        dev_name_pattern = re.compile(".*?hw:([0-9]+),([0-9]+)")
+        for dev in devs:
+            match = dev_name_pattern.match(dev)
+            if match:
+                return match.group(1)
+        return '0'
+
     def run_once(self, audiofuntest=True, audiofuntest_duration=10,
             blacklist_combinations=[],
             duration=_DEFAULT_DURATION_SEC,
@@ -198,8 +213,10 @@
 
         # Create a default audio helper to do the setup jobs.
         self._ah = audio_helper.AudioHelper(self)
+        # Guess the card index from given I/O device names.
+        self._card = self.get_card_index(output_devices + input_devices)
         if mixer_controls is not None:
-            self._ah.set_mixer_controls(mixer_controls)
+            self._ah.set_mixer_controls(mixer_controls, self._card)
 
         # Setup dependencies
         self._ah.setup_deps(['sox', 'test_tones'])