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