audio_Microphone: Add card preference for ALSA layer test

Some sound card has record device and channels limitation so that
existing rule to use default 'plughw:0,1' and channels 1, 2 doesn't
apply. Let alsa_util specify card preference about recording device
and channels.

BUG=chrome-os-partner:62629
TEST=test_that -b squawks <ip> audio_Microphone

Change-Id: I95baf20413b1002ba195f31c696198306c48bbf0
Reviewed-on: https://chromium-review.googlesource.com/444491
Commit-Ready: Hsinyu Chao <hychao@chromium.org>
Tested-by: Sathyanarayana Nujella <sathyanarayana.nujella@intel.com>
Reviewed-by: Sathyanarayana Nujella <sathyanarayana.nujella@intel.com>
Reviewed-by: Benson Leung <bleung@chromium.org>
diff --git a/client/cros/audio/alsa_utils.py b/client/cros/audio/alsa_utils.py
index 79d4676..51f9172 100644
--- a/client/cros/audio/alsa_utils.py
+++ b/client/cros/audio/alsa_utils.py
@@ -16,6 +16,13 @@
 CONTROL_NAME_RE = re.compile("name='(.*)'")
 SCONTROL_NAME_RE = re.compile("Simple mixer control '(.*)'")
 
+CARD_PREF_RECORD_DEV_IDX = {
+    'bxtda7219max': 3,
+}
+
+CARD_PREF_RECORD_CHANNELS = {
+    'bxtda7219max': [ 4 ],
+}
 
 def _get_format_args(channels, bits, rate):
     args = ['-c', str(channels)]
@@ -141,6 +148,37 @@
         return None
     return 'plughw:%d' % card_id
 
+def get_record_card_name(card_idx):
+    '''Gets the recording sound card name for given card idx.
+
+    Returns the card name inside the square brackets of arecord output lines.
+    '''
+    card_name_re = re.compile('card %d: .*?\[(.*?)\]' % card_idx)
+    cmd = ARECORD_PATH + ' -l'
+    p = cmd_utils.popen(shlex.split(cmd), stdout=cmd_utils.PIPE)
+    output, _ = p.communicate()
+    if p.wait() != 0:
+        raise RuntimeError('arecord -l command failed')
+
+    for line in output.splitlines():
+        match = card_name_re.search(line)
+        if match:
+            return match.group(1)
+    return None
+
+def get_card_preferred_record_channels():
+    '''Gets the preferred record channel counts for default sound card.
+
+    Returns the preferred value for default card in CARD_PREF_RECORD_CHANNELS.
+    If preferred value doesn't exist, return None.
+    '''
+    card_id = get_first_soundcard_with_control(cname='Mic Jack', scname='Mic')
+    if card_id is None:
+        return None
+    card_name = get_record_card_name(card_id)
+    if CARD_PREF_RECORD_CHANNELS.has_key(card_name):
+        return CARD_PREF_RECORD_CHANNELS[card_name]
+    return None
 
 def get_default_record_device():
     '''Gets the first record device.
@@ -152,6 +190,10 @@
     if card_id is None:
         return None
 
+    card_name = get_record_card_name(card_id)
+    if CARD_PREF_RECORD_DEV_IDX.has_key(card_name):
+        return 'plughw:%d,%d' % (card_id, CARD_PREF_RECORD_DEV_IDX[card_name])
+
     # Get first device id of this card.
     cmd = ARECORD_PATH + ' -l'
     p = cmd_utils.popen(shlex.split(cmd), stdout=cmd_utils.PIPE)