1# Copyright (c) 2010 The Chromium 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 5import logging 6import os 7import tempfile 8 9from autotest_lib.client.bin import test, utils 10from autotest_lib.client.common_lib import error 11from autotest_lib.client.cros.audio import audio_spec 12from autotest_lib.client.cros.audio import alsa_utils 13from autotest_lib.client.cros.audio import cras_utils 14 15DURATION = 3 16TOLERANT_RATIO = 0.1 17 18class audio_Microphone(test.test): 19 version = 1 20 21 22 def check_recorded_filesize( 23 self, filesize, duration, channels, rate, bits=16): 24 expected = duration * channels * (bits / 8) * rate 25 if abs(float(filesize) / expected - 1) > TOLERANT_RATIO: 26 raise error.TestFail('File size not correct: %d' % filesize) 27 28 29 def verify_alsa_capture(self, channels, rate, device, bits=16): 30 recorded_file = tempfile.NamedTemporaryFile() 31 alsa_utils.record( 32 recorded_file.name, duration=DURATION, channels=channels, 33 bits=bits, rate=rate, device=device) 34 self.check_recorded_filesize( 35 os.path.getsize(recorded_file.name), 36 DURATION, channels, rate, bits) 37 38 39 def verify_cras_capture(self, channels, rate): 40 recorded_file = tempfile.NamedTemporaryFile() 41 cras_utils.capture( 42 recorded_file.name, duration=DURATION, channels=channels, 43 rate=rate) 44 self.check_recorded_filesize( 45 os.path.getsize(recorded_file.name), 46 DURATION, channels, rate) 47 48 49 def run_once(self): 50 cras_device_name = cras_utils.get_selected_input_device_name() 51 logging.debug("Selected input device name=%s", cras_device_name) 52 53 if cras_device_name is None: 54 board_type = utils.get_board_type() 55 if not audio_spec.has_internal_microphone(board_type): 56 logging.debug("No internal mic. Skipping the test.") 57 return 58 raise error.TestFail("Fail to get selected input device.") 59 60 # Mono and stereo capturing should work fine @ 44.1KHz and 48KHz. 61 62 # Verify recording using ALSA utils. 63 alsa_device_name = alsa_utils.convert_device_name(cras_device_name) 64 channels = alsa_utils.get_record_device_supported_channels( 65 alsa_device_name) 66 if channels is None: 67 raise error.TestFail("Fail to get supported channels for %s", 68 alsa_device_name) 69 70 for c in channels: 71 self.verify_alsa_capture(c, 44100, alsa_device_name) 72 self.verify_alsa_capture(c, 48000, alsa_device_name) 73 74 # Verify recording of CRAS. 75 self.verify_cras_capture(1, 44100) 76 self.verify_cras_capture(1, 48000) 77 self.verify_cras_capture(2, 48000) 78 self.verify_cras_capture(2, 44100) 79