blob: e5195c432e32917f80365048ff26bea7f8f03f29 [file] [log] [blame]
# Copyright 2017 The ChromiumOS Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""This module provides the test utilities for audio spec."""
import collections
_BOARD_TYPE_CHROMEBOX = 'CHROMEBOX'
_BOARD_TYPE_CHROMEBIT = 'CHROMEBIT'
_BOARD_WITHOUT_SOUND_CARD = ['gale', 'veyron_rialto']
def has_internal_speaker(board_type, board_name):
"""Checks if a board has internal speaker.
@param board_type: board type string. E.g. CHROMEBOX, CHROMEBIT, and etc.
@param board_name: board name string.
@returns: True if the board has internal speaker. False otherwise.
"""
board_name = strip_kernelnext_suffix(board_name)
if (board_type == _BOARD_TYPE_CHROMEBOX
or board_type == _BOARD_TYPE_CHROMEBIT
or board_name in _BOARD_WITHOUT_SOUND_CARD):
return False
return True
def has_internal_microphone(board_type):
"""Checks if a board has internal microphone.
@param board_type: board type string. E.g. CHROMEBOX, CHROMEBIT, and etc.
@returns: True if the board has internal microphone. False otherwise.
"""
if (board_type == _BOARD_TYPE_CHROMEBOX
or board_type == _BOARD_TYPE_CHROMEBIT):
return False
return True
def has_audio_jack(board_name, board_type):
"""Checks if a board has a 3.5mm audio jack.
@param board_name: board name of the DUT.
@param board_type: board type string. E.g. CHROMEBOX, CHROMEBIT, and etc.
@returns: True if the board has headphone. False otherwise.
"""
board_name = strip_kernelnext_suffix(board_name)
if (board_name in ['nocturne'] or board_type == _BOARD_TYPE_CHROMEBIT):
return False
return True
def strip_kernelnext_suffix(board_name):
"""Removes the '-kernelnext' suffix from board_name if present.
@param board_name: board name of the DUT.
@returns: board_name without '-kernelnext' suffix.
"""
if board_name.endswith("-kernelnext"):
return board_name[:-len("-kernelnext")]
return board_name
BOARDS_WITH_HOTWORDING = ['kevin']
def has_hotwording(board_name, model_name):
"""Checks if a board has hotwording.
@param board_name: board name of the DUT.
@param model_name: model name of the DUT.
@returns: True if the board has hotwording.
"""
board_name = strip_kernelnext_suffix(board_name)
return (board_name in BOARDS_WITH_HOTWORDING)
def has_echo_reference(board_name):
"""Checks if a board has echo reference.
@param board_name: board name of the DUT.
@returns: True if the board has echo reference.
"""
board_name = strip_kernelnext_suffix(board_name)
return board_name in ['nocturne', 'atlas', 'volteer', 'brya', 'rammus']
BoardInfo = collections.namedtuple('BoardInfo', ['board', 'model', 'sku'])
BOARDS_WITH_FOUR_INTERNAL_SPEAKERS = [
BoardInfo('strongbad', 'homestar', ''),
]
BOARDS_WITH_TWO_INTERNAL_MICS = [
BoardInfo('coral', 'babytiger', ''),
BoardInfo('coral', 'nasher360', ''),
BoardInfo('coral', 'rabbid', ''),
BoardInfo('coral', 'robo360', ''),
BoardInfo('dedede', 'boten', ''),
BoardInfo('grunt', 'treeya360', '175'),
BoardInfo('hatch', 'kohaku', ''),
BoardInfo('octopus', 'ampton', ''),
BoardInfo('octopus', 'bobba360', '9'),
BoardInfo('octopus', 'bobba360', '10'),
BoardInfo('octopus', 'dood', ''),
BoardInfo('octopus', 'foob360', ''),
BoardInfo('octopus', 'grabbiter', ''),
BoardInfo('octopus', 'phaser360', '3'),
BoardInfo('octopus', 'sparky', ''),
BoardInfo('octopus', 'sparky360', ''),
BoardInfo('octopus', 'vortininja', ''),
BoardInfo('skyrim', 'skyrim6w360', ''),
BoardInfo('skyrim', 'skyrim15w360', ''),
BoardInfo('snappy', 'snappy', '8'),
BoardInfo('zork', 'dalboz', ''),
BoardInfo('zork', 'ezkinil', ''),
# b/232791346 clarifies zork-morpheus SKU 1510014998
# has a a front mic ONLY. Other SKUs have both UFC and WFC
# for which the following line will be valid.
#BoardInfo('zork', 'morphius', ''),
BoardInfo('zork', 'vilboz360', '1518534658'),
BoardInfo('zork', 'vilboz360', '1518534660'),
BoardInfo('zork', 'vilboz360', '1518534661'),
BoardInfo('zork', 'vilboz360', '1518534662'),
BoardInfo('keeby', 'lalala', ''),
BoardInfo('dedede', 'drawcia', ''),
BoardInfo('nissa', 'craask', ''),
BoardInfo('nissa', 'craaskbowl', ''),
BoardInfo('nissa', 'xivu', ''),
BoardInfo('nissa', 'xivu360', ''),
]
def get_internal_speaker_channel_count(board_type, board, model, sku):
"""Gets the channel count of internal speakers.
@param board_type: board type string. E.g. CHROMEBOX, CHROMEBIT, and etc.
@param board: board name of the DUT.
@param model: model name of the DUT.
@param sku: sku number string of the DUT.
@returns: The channel count of internal speakers.
"""
if not has_internal_speaker(board_type, board):
return 0
for b in BOARDS_WITH_FOUR_INTERNAL_SPEAKERS:
if b.board == board and b.model == model:
if b.sku == '' or b.sku == sku:
return 4
return 2
def get_num_internal_microphone(board_type, board, model, sku):
"""Gets the number of internal microphones.
@param board_type: board type string. E.g. CHROMEBOX, CHROMEBIT, and etc.
@param board: board name of the DUT.
@param model: model name of the DUT.
@param sku: sku number string of the DUT.
@returns: The number of internal microphones.
"""
if not has_internal_microphone(board_type):
return 0
board = strip_kernelnext_suffix(board)
for b in BOARDS_WITH_TWO_INTERNAL_MICS:
if b.board == board and b.model == model:
if b.sku == '' or b.sku == sku:
return 2
return 1
INTERNAL_MIC_NODE = {
('nami', 'pantheon'): 'FRONT_MIC',
('nami', 'sona'): 'FRONT_MIC',
('nami', 'syndra'): 'FRONT_MIC',
('nami', 'vayne'): 'FRONT_MIC',
('dedede', 'boten'): 'FRONT_MIC',
('nissa', 'craask'): 'FRONT_MIC',
}
def get_internal_mic_node(board_type, board, model, sku):
"""Return the expected internal microphone node for given board name and
model name.
@param board_type: board type string. E.g. CHROMEBOX, CHROMEBIT, and etc.
@param board: board name of the DUT.
@param model: model name of the DUT.
@param sku: sku number string of the DUT.
@returns: The name of the expected internal microphone nodes.
"""
board = strip_kernelnext_suffix(board)
if get_num_internal_microphone(board_type, board, model, sku) == 2:
return 'FRONT_MIC'
return INTERNAL_MIC_NODE.get((board, model), 'INTERNAL_MIC')
INTERNAL_MIC_NODES = {
('nami', 'vayne'): ['FRONT_MIC'],
}
def get_plugged_internal_mics(board_type, board, model, sku):
"""Return a list of all the plugged internal microphone nodes for given
board name and model name.
@param board_type: board type string. E.g. CHROMEBOX, CHROMEBIT, and etc.
@param board: board name of the DUT.
@param model: model name of the DUT.
@param sku: sku number string of the DUT.
@returns: A list of all the plugged internal microphone nodes.
"""
board = strip_kernelnext_suffix(board)
if get_num_internal_microphone(board_type, board, model, sku) == 2:
return ['FRONT_MIC', 'REAR_MIC']
return INTERNAL_MIC_NODES.get((board, model), ['INTERNAL_MIC'])
HEADPHONE_NODE = {
('sarien'): 'LINEOUT',
('drallion'): 'LINEOUT',
}
def get_headphone_node(board):
"""Return the expected headphone node for given board name.
@param board: board name of the DUT.
@returns: The name of the expected headphone node.
"""
board = strip_kernelnext_suffix(board)
return HEADPHONE_NODE.get((board), 'HEADPHONE')