1*9c5db199SXin Li# Copyright 2017 The Chromium OS Authors. All rights reserved. 2*9c5db199SXin Li# Use of this source code is governed by a BSD-style license that can be 3*9c5db199SXin Li# found in the LICENSE file. 4*9c5db199SXin Li"""This module provides the test utilities for audio spec.""" 5*9c5db199SXin Li 6*9c5db199SXin Liimport collections 7*9c5db199SXin Li 8*9c5db199SXin Li_BOARD_TYPE_CHROMEBOX = 'CHROMEBOX' 9*9c5db199SXin Li_BOARD_TYPE_CHROMEBIT = 'CHROMEBIT' 10*9c5db199SXin Li_BOARD_WITHOUT_SOUND_CARD = ['gale', 'veyron_rialto'] 11*9c5db199SXin Li 12*9c5db199SXin Li 13*9c5db199SXin Lidef has_internal_speaker(board_type, board_name): 14*9c5db199SXin Li """Checks if a board has internal speaker. 15*9c5db199SXin Li 16*9c5db199SXin Li @param board_type: board type string. E.g. CHROMEBOX, CHROMEBIT, and etc. 17*9c5db199SXin Li @param board_name: board name string. 18*9c5db199SXin Li 19*9c5db199SXin Li @returns: True if the board has internal speaker. False otherwise. 20*9c5db199SXin Li 21*9c5db199SXin Li """ 22*9c5db199SXin Li board_name = strip_kernelnext_suffix(board_name) 23*9c5db199SXin Li if (board_type == _BOARD_TYPE_CHROMEBOX 24*9c5db199SXin Li or board_type == _BOARD_TYPE_CHROMEBIT 25*9c5db199SXin Li or board_name in _BOARD_WITHOUT_SOUND_CARD): 26*9c5db199SXin Li return False 27*9c5db199SXin Li return True 28*9c5db199SXin Li 29*9c5db199SXin Li 30*9c5db199SXin Lidef has_internal_microphone(board_type): 31*9c5db199SXin Li """Checks if a board has internal microphone. 32*9c5db199SXin Li 33*9c5db199SXin Li @param board_type: board type string. E.g. CHROMEBOX, CHROMEBIT, and etc. 34*9c5db199SXin Li 35*9c5db199SXin Li @returns: True if the board has internal microphone. False otherwise. 36*9c5db199SXin Li 37*9c5db199SXin Li """ 38*9c5db199SXin Li if (board_type == _BOARD_TYPE_CHROMEBOX 39*9c5db199SXin Li or board_type == _BOARD_TYPE_CHROMEBIT): 40*9c5db199SXin Li return False 41*9c5db199SXin Li return True 42*9c5db199SXin Li 43*9c5db199SXin Li 44*9c5db199SXin Lidef has_audio_jack(board_name, board_type): 45*9c5db199SXin Li """Checks if a board has a 3.5mm audio jack. 46*9c5db199SXin Li 47*9c5db199SXin Li @param board_name: board name of the DUT. 48*9c5db199SXin Li @param board_type: board type string. E.g. CHROMEBOX, CHROMEBIT, and etc. 49*9c5db199SXin Li 50*9c5db199SXin Li @returns: True if the board has headphone. False otherwise. 51*9c5db199SXin Li 52*9c5db199SXin Li """ 53*9c5db199SXin Li board_name = strip_kernelnext_suffix(board_name) 54*9c5db199SXin Li if (board_name in ['nocturne'] or board_type == _BOARD_TYPE_CHROMEBIT): 55*9c5db199SXin Li return False 56*9c5db199SXin Li return True 57*9c5db199SXin Li 58*9c5db199SXin Lidef strip_kernelnext_suffix(board_name): 59*9c5db199SXin Li """Removes the '-kernelnext' suffix from board_name if present. 60*9c5db199SXin Li 61*9c5db199SXin Li @param board_name: board name of the DUT. 62*9c5db199SXin Li 63*9c5db199SXin Li @returns: board_name without '-kernelnext' suffix. 64*9c5db199SXin Li 65*9c5db199SXin Li """ 66*9c5db199SXin Li if board_name.endswith("-kernelnext"): 67*9c5db199SXin Li return board_name[:-len("-kernelnext")] 68*9c5db199SXin Li 69*9c5db199SXin Li return board_name 70*9c5db199SXin Li 71*9c5db199SXin LiBOARDS_WITH_HOTWORDING = [ 72*9c5db199SXin Li 'atlas', 'coral', 'eve', 'kevin', 'nami', 'nocturne', 'rammus', 73*9c5db199SXin Li 'samus', 'volteer' 74*9c5db199SXin Li] 75*9c5db199SXin Li 76*9c5db199SXin Li 77*9c5db199SXin Lidef has_hotwording(board_name, model_name): 78*9c5db199SXin Li """Checks if a board has hotwording. 79*9c5db199SXin Li 80*9c5db199SXin Li @param board_name: board name of the DUT. 81*9c5db199SXin Li @param model_name: model name of the DUT. 82*9c5db199SXin Li 83*9c5db199SXin Li @returns: True if the board has hotwording. 84*9c5db199SXin Li 85*9c5db199SXin Li """ 86*9c5db199SXin Li board_name = strip_kernelnext_suffix(board_name) 87*9c5db199SXin Li return (board_name in BOARDS_WITH_HOTWORDING) 88*9c5db199SXin Li 89*9c5db199SXin Lidef has_echo_reference(board_name): 90*9c5db199SXin Li """Checks if a board has echo reference. 91*9c5db199SXin Li 92*9c5db199SXin Li @param board_name: board name of the DUT. 93*9c5db199SXin Li 94*9c5db199SXin Li @returns: True if the board has echo reference. 95*9c5db199SXin Li 96*9c5db199SXin Li """ 97*9c5db199SXin Li board_name = strip_kernelnext_suffix(board_name) 98*9c5db199SXin Li return board_name in ['nocturne', 'atlas', 'volteer'] 99*9c5db199SXin Li 100*9c5db199SXin Li 101*9c5db199SXin LiBoardInfo = collections.namedtuple('BoardInfo', ['board', 'model', 'sku']) 102*9c5db199SXin Li 103*9c5db199SXin LiBOARDS_WITH_FOUR_INTERNAL_SPEAKERS = [ 104*9c5db199SXin Li BoardInfo('strongbad', 'homestar', ''), 105*9c5db199SXin Li] 106*9c5db199SXin Li 107*9c5db199SXin LiBOARDS_WITH_TWO_INTERNAL_MICS = [ 108*9c5db199SXin Li BoardInfo('coral', 'babytiger', ''), 109*9c5db199SXin Li BoardInfo('coral', 'nasher360', ''), 110*9c5db199SXin Li BoardInfo('coral', 'rabbid', ''), 111*9c5db199SXin Li BoardInfo('coral', 'robo360', ''), 112*9c5db199SXin Li BoardInfo('dedede', 'boten', ''), 113*9c5db199SXin Li BoardInfo('grunt', 'treeya360', '175'), 114*9c5db199SXin Li BoardInfo('hatch', 'kohaku', ''), 115*9c5db199SXin Li BoardInfo('octopus', 'ampton', ''), 116*9c5db199SXin Li BoardInfo('octopus', 'bobba360', '9'), 117*9c5db199SXin Li BoardInfo('octopus', 'bobba360', '10'), 118*9c5db199SXin Li BoardInfo('octopus', 'dood', ''), 119*9c5db199SXin Li BoardInfo('octopus', 'foob360', ''), 120*9c5db199SXin Li BoardInfo('octopus', 'grabbiter', ''), 121*9c5db199SXin Li BoardInfo('octopus', 'phaser360', '3'), 122*9c5db199SXin Li BoardInfo('octopus', 'sparky', ''), 123*9c5db199SXin Li BoardInfo('octopus', 'sparky360', ''), 124*9c5db199SXin Li BoardInfo('octopus', 'vortininja', ''), 125*9c5db199SXin Li BoardInfo('snappy', 'snappy', '8'), 126*9c5db199SXin Li BoardInfo('zork', 'dalboz', ''), 127*9c5db199SXin Li BoardInfo('zork', 'ezkinil', ''), 128*9c5db199SXin Li # b/232791346 clarifies zork-morpheus SKU 1510014998 129*9c5db199SXin Li # has a a front mic ONLY. Other SKUs have both UFC and WFC 130*9c5db199SXin Li # for which the following line will be valid. 131*9c5db199SXin Li #BoardInfo('zork', 'morphius', ''), 132*9c5db199SXin Li BoardInfo('zork', 'vilboz360', '1518534658'), 133*9c5db199SXin Li BoardInfo('zork', 'vilboz360', '1518534660'), 134*9c5db199SXin Li BoardInfo('zork', 'vilboz360', '1518534661'), 135*9c5db199SXin Li BoardInfo('zork', 'vilboz360', '1518534662'), 136*9c5db199SXin Li BoardInfo('keeby', 'lalala', ''), 137*9c5db199SXin Li BoardInfo('dedede', 'drawcia', ''), 138*9c5db199SXin Li] 139*9c5db199SXin Li 140*9c5db199SXin Li 141*9c5db199SXin Lidef get_internal_speaker_channel_count(board_type, board, model, sku): 142*9c5db199SXin Li """Gets the channel count of internal speakers. 143*9c5db199SXin Li @param board_type: board type string. E.g. CHROMEBOX, CHROMEBIT, and etc. 144*9c5db199SXin Li @param board: board name of the DUT. 145*9c5db199SXin Li @param model: model name of the DUT. 146*9c5db199SXin Li @param sku: sku number string of the DUT. 147*9c5db199SXin Li 148*9c5db199SXin Li @returns: The channel count of internal speakers. 149*9c5db199SXin Li 150*9c5db199SXin Li """ 151*9c5db199SXin Li if not has_internal_speaker(board_type, board): 152*9c5db199SXin Li return 0 153*9c5db199SXin Li 154*9c5db199SXin Li for b in BOARDS_WITH_FOUR_INTERNAL_SPEAKERS: 155*9c5db199SXin Li if b.board == board and b.model == model: 156*9c5db199SXin Li if b.sku == '' or b.sku == sku: 157*9c5db199SXin Li return 4 158*9c5db199SXin Li return 2 159*9c5db199SXin Li 160*9c5db199SXin Li 161*9c5db199SXin Lidef get_num_internal_microphone(board_type, board, model, sku): 162*9c5db199SXin Li """Gets the number of internal microphones. 163*9c5db199SXin Li 164*9c5db199SXin Li @param board_type: board type string. E.g. CHROMEBOX, CHROMEBIT, and etc. 165*9c5db199SXin Li @param board: board name of the DUT. 166*9c5db199SXin Li @param model: model name of the DUT. 167*9c5db199SXin Li @param sku: sku number string of the DUT. 168*9c5db199SXin Li 169*9c5db199SXin Li @returns: The number of internal microphones. 170*9c5db199SXin Li 171*9c5db199SXin Li """ 172*9c5db199SXin Li if not has_internal_microphone(board_type): 173*9c5db199SXin Li return 0 174*9c5db199SXin Li 175*9c5db199SXin Li board = strip_kernelnext_suffix(board) 176*9c5db199SXin Li for b in BOARDS_WITH_TWO_INTERNAL_MICS: 177*9c5db199SXin Li if b.board == board and b.model == model: 178*9c5db199SXin Li if b.sku == '' or b.sku == sku: 179*9c5db199SXin Li return 2 180*9c5db199SXin Li 181*9c5db199SXin Li return 1 182*9c5db199SXin Li 183*9c5db199SXin Li 184*9c5db199SXin LiINTERNAL_MIC_NODE = { 185*9c5db199SXin Li ('nami', 'pantheon'): 'FRONT_MIC', 186*9c5db199SXin Li ('nami', 'sona'): 'FRONT_MIC', 187*9c5db199SXin Li ('nami', 'syndra'): 'FRONT_MIC', 188*9c5db199SXin Li ('nami', 'vayne'): 'FRONT_MIC', 189*9c5db199SXin Li} 190*9c5db199SXin Li 191*9c5db199SXin Li 192*9c5db199SXin Lidef get_internal_mic_node(board_type, board, model, sku): 193*9c5db199SXin Li """Return the expected internal microphone node for given board name and 194*9c5db199SXin Li model name. 195*9c5db199SXin Li 196*9c5db199SXin Li @param board_type: board type string. E.g. CHROMEBOX, CHROMEBIT, and etc. 197*9c5db199SXin Li @param board: board name of the DUT. 198*9c5db199SXin Li @param model: model name of the DUT. 199*9c5db199SXin Li @param sku: sku number string of the DUT. 200*9c5db199SXin Li 201*9c5db199SXin Li @returns: The name of the expected internal microphone nodes. 202*9c5db199SXin Li """ 203*9c5db199SXin Li board = strip_kernelnext_suffix(board) 204*9c5db199SXin Li if get_num_internal_microphone(board_type, board, model, sku) == 2: 205*9c5db199SXin Li return 'FRONT_MIC' 206*9c5db199SXin Li 207*9c5db199SXin Li return INTERNAL_MIC_NODE.get((board, model), 'INTERNAL_MIC') 208*9c5db199SXin Li 209*9c5db199SXin Li 210*9c5db199SXin LiINTERNAL_MIC_NODES = { 211*9c5db199SXin Li ('nami', 'vayne'): ['FRONT_MIC'], 212*9c5db199SXin Li} 213*9c5db199SXin Li 214*9c5db199SXin Li 215*9c5db199SXin Lidef get_plugged_internal_mics(board_type, board, model, sku): 216*9c5db199SXin Li """Return a list of all the plugged internal microphone nodes for given 217*9c5db199SXin Li board name and model name. 218*9c5db199SXin Li 219*9c5db199SXin Li @param board_type: board type string. E.g. CHROMEBOX, CHROMEBIT, and etc. 220*9c5db199SXin Li @param board: board name of the DUT. 221*9c5db199SXin Li @param model: model name of the DUT. 222*9c5db199SXin Li @param sku: sku number string of the DUT. 223*9c5db199SXin Li 224*9c5db199SXin Li @returns: A list of all the plugged internal microphone nodes. 225*9c5db199SXin Li """ 226*9c5db199SXin Li board = strip_kernelnext_suffix(board) 227*9c5db199SXin Li if get_num_internal_microphone(board_type, board, model, sku) == 2: 228*9c5db199SXin Li return ['FRONT_MIC', 'REAR_MIC'] 229*9c5db199SXin Li 230*9c5db199SXin Li return INTERNAL_MIC_NODES.get((board, model), ['INTERNAL_MIC']) 231*9c5db199SXin Li 232*9c5db199SXin Li 233*9c5db199SXin LiHEADPHONE_NODE = { 234*9c5db199SXin Li ('sarien'): 'LINEOUT', 235*9c5db199SXin Li ('drallion'): 'LINEOUT', 236*9c5db199SXin Li} 237*9c5db199SXin Li 238*9c5db199SXin Li 239*9c5db199SXin Lidef get_headphone_node(board): 240*9c5db199SXin Li """Return the expected headphone node for given board name. 241*9c5db199SXin Li 242*9c5db199SXin Li @param board: board name of the DUT. 243*9c5db199SXin Li 244*9c5db199SXin Li @returns: The name of the expected headphone node. 245*9c5db199SXin Li """ 246*9c5db199SXin Li board = strip_kernelnext_suffix(board) 247*9c5db199SXin Li return HEADPHONE_NODE.get((board), 'HEADPHONE') 248