100 lines
3.9 KiB
Python
Executable File
100 lines
3.9 KiB
Python
Executable File
# Copyright 2019 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 time
|
|
|
|
from autotest_lib.client.bin import 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 audio_test_data
|
|
from autotest_lib.client.cros.audio import cmd_utils
|
|
from autotest_lib.client.cros.audio import cras_utils
|
|
|
|
TEST_DURATION = 1
|
|
|
|
|
|
class audio_CrasPinnedStream(audio_helper.cras_rms_test):
|
|
"""Verifies audio capture function on multiple devices."""
|
|
version = 1
|
|
|
|
@staticmethod
|
|
def wait_for_active_stream_count(expected_count):
|
|
"""Wait until the active stream count is correct"""
|
|
|
|
utils.poll_for_condition(
|
|
lambda: cras_utils.get_active_stream_count() == expected_count,
|
|
exception=error.TestError(
|
|
'Timeout waiting active stream count to become %d' %
|
|
expected_count))
|
|
|
|
@staticmethod
|
|
def contains_all_zero(path):
|
|
"""Check the recorded sample contains none zero data"""
|
|
with open(path, 'rb') as f:
|
|
samples = f.read()
|
|
for sample in samples:
|
|
if sample != '\x00':
|
|
return False
|
|
return True
|
|
|
|
def run_once(self):
|
|
"""Entry point of this test."""
|
|
|
|
# The test requires internal mic as second capture device.
|
|
if not audio_spec.has_internal_microphone(utils.get_board_type()):
|
|
logging.info("No internal mic. Skipping the test.")
|
|
return
|
|
|
|
raw_file = audio_test_data.GenerateAudioTestData(
|
|
path=os.path.join(self.bindir, '5SEC.raw'),
|
|
duration_secs=5,
|
|
frequencies=[440, 440],
|
|
volume_scale=0.9)
|
|
|
|
loopback_recorded_file = os.path.join(self.resultsdir,
|
|
'loopback_recorded.raw')
|
|
internal_mic_recorded_file = os.path.join(self.resultsdir,
|
|
'internal_mic_recorded.raw')
|
|
node_type = audio_spec.get_internal_mic_node(utils.get_board_type(),
|
|
utils.get_board(),
|
|
utils.get_platform(),
|
|
utils.get_sku())
|
|
device_id = int(
|
|
cras_utils.get_device_id_from_node_type(node_type, True))
|
|
|
|
self.wait_for_active_stream_count(0)
|
|
p = cmd_utils.popen(cras_utils.playback_cmd(raw_file.path))
|
|
try:
|
|
loop_c = cmd_utils.popen(
|
|
cras_utils.capture_cmd(
|
|
loopback_recorded_file, duration=TEST_DURATION))
|
|
int_c = cmd_utils.popen(
|
|
cras_utils.capture_cmd(
|
|
internal_mic_recorded_file,
|
|
duration=TEST_DURATION,
|
|
pin_device=device_id))
|
|
|
|
# Make sure the audio is still playing.
|
|
if p.poll() != None:
|
|
raise error.TestError('playback stopped')
|
|
# Make sure the recordings finish.
|
|
time.sleep(2 * TEST_DURATION)
|
|
finally:
|
|
cmd_utils.kill_or_log_returncode(p, int_c, loop_c)
|
|
raw_file.delete()
|
|
|
|
rms_value = audio_helper.get_rms(loopback_recorded_file)[0]
|
|
self.write_perf_keyval({'rms_value': rms_value})
|
|
|
|
audio_helper.recorded_filesize_check(
|
|
os.path.getsize(internal_mic_recorded_file), TEST_DURATION)
|
|
audio_helper.recorded_filesize_check(
|
|
os.path.getsize(loopback_recorded_file), TEST_DURATION)
|
|
|
|
if self.contains_all_zero(internal_mic_recorded_file):
|
|
raise error.TestError('Record all zero from internal mic')
|