# 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_helper
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

class audio_Microphone(test.test):
    version = 1

    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)
        audio_helper.recorded_filesize_check(
                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)
        audio_helper.recorded_filesize_check(
                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)
