# Copyright (c) 2010 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
import logging
import os
import tempfile
from autotest_lib.client.bin import test, utils
from autotest_lib.client.common_lib import error
from autotest_lib.client.cros.audio import audio_spec
from autotest_lib.client.cros.audio import alsa_utils
from autotest_lib.client.cros.audio import cras_utils
DURATION = 3
TOLERANT_RATIO = 0.1
class audio_Microphone(test.test):
version = 1
def check_recorded_filesize(
self, filesize, duration, channels, rate, bits=16):
expected = duration * channels * (bits / 8) * rate
if abs(float(filesize) / expected - 1) > TOLERANT_RATIO:
raise error.TestFail('File size not correct: %d' % filesize)
def verify_alsa_capture(self, channels, rate, device, bits=16):
recorded_file = tempfile.NamedTemporaryFile()
alsa_utils.record(
recorded_file.name, duration=DURATION, channels=channels,
bits=bits, rate=rate, device=device)
self.check_recorded_filesize(
os.path.getsize(recorded_file.name),
DURATION, channels, rate, bits)
def verify_cras_capture(self, channels, rate):
recorded_file = tempfile.NamedTemporaryFile()
cras_utils.capture(
recorded_file.name, duration=DURATION, channels=channels,
rate=rate)
self.check_recorded_filesize(
os.path.getsize(recorded_file.name),
DURATION, channels, rate)
def run_once(self):
cras_device_name = cras_utils.get_selected_input_device_name()
logging.debug("Selected input device name=%s", cras_device_name)
if cras_device_name is None:
board_type = utils.get_board_type()
if not audio_spec.has_internal_microphone(board_type):
logging.debug("No internal mic. Skipping the test.")
return
raise error.TestFail("Fail to get selected input device.")
# Mono and stereo capturing should work fine @ 44.1KHz and 48KHz.
# Verify recording using ALSA utils.
alsa_device_name = alsa_utils.convert_device_name(cras_device_name)
channels = alsa_utils.get_record_device_supported_channels(
alsa_device_name)
if channels is None:
raise error.TestFail("Fail to get supported channels for %s",
alsa_device_name)
for c in channels:
self.verify_alsa_capture(c, 44100, alsa_device_name)
self.verify_alsa_capture(c, 48000, alsa_device_name)
# Verify recording of CRAS.
self.verify_cras_capture(1, 44100)
self.verify_cras_capture(1, 48000)
self.verify_cras_capture(2, 48000)
self.verify_cras_capture(2, 44100)