xref: /aosp_15_r20/external/autotest/client/cros/audio/audio_spec.py (revision 9c5db1993ded3edbeafc8092d69fe5de2ee02df7)
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