Home | History | Annotate | Download | only in sound_infrastructure
      1 # Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
      2 # Use of this source code is governed by a BSD-style license that can be
      3 # found in the LICENSE file.
      4 
      5 import os
      6 import re
      7 import stat
      8 import subprocess
      9 
     10 from autotest_lib.client.common_lib import error
     11 from autotest_lib.client.bin import test
     12 
     13 _SND_DEV_DIR = '/dev/snd/'
     14 
     15 class sound_infrastructure(test.test):
     16     """
     17     Tests that the expected sound infrastructure is present.
     18 
     19     Check that at least one playback and capture device exists and that their
     20     permissions are configured properly.
     21 
     22     """
     23     version = 2
     24 
     25     def check_snd_dev_perms(self, filename):
     26         desired_mode = (stat.S_IRUSR | stat.S_IWUSR | stat.S_IRGRP |
     27                         stat.S_IWGRP | stat.S_IFCHR)
     28         st = os.stat(filename)
     29         if (st.st_mode != desired_mode):
     30             raise error.TestError("Incorrect permissions for %s" % filename)
     31 
     32     def check_sound_files(self):
     33         patterns = {'^controlC(\d+)': False,
     34                     '^pcmC(\d+)D(\d+)p$': False,
     35                     '^pcmC(\d+)D(\d+)c$': False}
     36 
     37         filenames = os.listdir(_SND_DEV_DIR)
     38 
     39         for filename in filenames:
     40             for pattern in patterns:
     41                 if re.match(pattern, filename):
     42                     patterns[pattern] = True
     43                     self.check_snd_dev_perms(_SND_DEV_DIR + filename)
     44 
     45         for pattern in patterns:
     46             if not patterns[pattern]:
     47                 raise error.TestError("Missing device %s" % pattern)
     48 
     49     def check_aplay_list(self):
     50         no_cards_pattern = '.*no soundcards found.*'
     51 
     52         aplay = subprocess.Popen(["aplay", "-l"], stderr=subprocess.PIPE)
     53         aplay_list = aplay.communicate()[1]
     54         if aplay.returncode or re.match(no_cards_pattern, aplay_list):
     55             raise error.TestError("No playback devices found by aplay")
     56 
     57         arecord = subprocess.Popen(["arecord", "-l"], stderr=subprocess.PIPE)
     58         arecord_list = arecord.communicate()[1]
     59         if arecord.returncode or re.match(no_cards_pattern, arecord_list):
     60             raise error.TestError("No playback devices found by arecord")
     61 
     62     def run_once(self):
     63         self.check_sound_files()
     64         self.check_aplay_list()
     65