13ba0d9bb0134523cf2c0d80988f99d720c685a1fHelen Zhang# Copyright 2015 The Chromium OS Authors. All rights reserved. 23ba0d9bb0134523cf2c0d80988f99d720c685a1fHelen Zhang# Use of this source code is governed by a BSD-style license that can be 33ba0d9bb0134523cf2c0d80988f99d720c685a1fHelen Zhang# found in the LICENSE file. 43ba0d9bb0134523cf2c0d80988f99d720c685a1fHelen Zhang 53ba0d9bb0134523cf2c0d80988f99d720c685a1fHelen Zhang"""This is a server side audio nodes s test using the Chameleon board.""" 63ba0d9bb0134523cf2c0d80988f99d720c685a1fHelen Zhang 7f7dfb2ed1117078602a49335b343ea9ee672e413Kalin Stoyanovimport os 83ba0d9bb0134523cf2c0d80988f99d720c685a1fHelen Zhangimport time 93ba0d9bb0134523cf2c0d80988f99d720c685a1fHelen Zhang 100d68794405135a0bf8c1ef95cc65f24301756335Cheng-Yi Chiangfrom autotest_lib.client.common_lib import error 113ba0d9bb0134523cf2c0d80988f99d720c685a1fHelen Zhangfrom autotest_lib.client.cros.chameleon import audio_test_utils 12b286ca3966dc5b6d5a66bfb4fbb3c15f18147f02Shrawan Jhafrom autotest_lib.client.cros.chameleon import chameleon_audio_ids 13b286ca3966dc5b6d5a66bfb4fbb3c15f18147f02Shrawan Jhafrom autotest_lib.client.cros.chameleon import chameleon_audio_helper 142d3d9b6210ca31370fbb7f80153cb9432670834fSridhar Sontifrom autotest_lib.client.cros.chameleon import chameleon_port_finder 15b286ca3966dc5b6d5a66bfb4fbb3c15f18147f02Shrawan Jha 16f7dfb2ed1117078602a49335b343ea9ee672e413Kalin Stoyanovfrom autotest_lib.client.cros.chameleon import edid as edid_lib 173ba0d9bb0134523cf2c0d80988f99d720c685a1fHelen Zhangfrom autotest_lib.server.cros.audio import audio_test 183ba0d9bb0134523cf2c0d80988f99d720c685a1fHelen Zhang 193ba0d9bb0134523cf2c0d80988f99d720c685a1fHelen Zhang 203ba0d9bb0134523cf2c0d80988f99d720c685a1fHelen Zhang 213ba0d9bb0134523cf2c0d80988f99d720c685a1fHelen Zhangclass audio_AudioNodeSwitch(audio_test.AudioTest): 223ba0d9bb0134523cf2c0d80988f99d720c685a1fHelen Zhang """Server side audio test. 233ba0d9bb0134523cf2c0d80988f99d720c685a1fHelen Zhang 243ba0d9bb0134523cf2c0d80988f99d720c685a1fHelen Zhang This test talks to a Chameleon board and a Cros device to verify 253ba0d9bb0134523cf2c0d80988f99d720c685a1fHelen Zhang audio nodes switch correctly. 263ba0d9bb0134523cf2c0d80988f99d720c685a1fHelen Zhang 273ba0d9bb0134523cf2c0d80988f99d720c685a1fHelen Zhang """ 283ba0d9bb0134523cf2c0d80988f99d720c685a1fHelen Zhang version = 1 29f7dfb2ed1117078602a49335b343ea9ee672e413Kalin Stoyanov _APPLY_EDID_DELAY = 5 303ba0d9bb0134523cf2c0d80988f99d720c685a1fHelen Zhang _PLUG_DELAY = 5 310d68794405135a0bf8c1ef95cc65f24301756335Cheng-Yi Chiang _VOLUMES = {'INTERNAL_SPEAKER': 100, 320d68794405135a0bf8c1ef95cc65f24301756335Cheng-Yi Chiang 'HEADPHONE': 80, 33b286ca3966dc5b6d5a66bfb4fbb3c15f18147f02Shrawan Jha 'HDMI': 60, 34b286ca3966dc5b6d5a66bfb4fbb3c15f18147f02Shrawan Jha 'USB': 40,} 350d68794405135a0bf8c1ef95cc65f24301756335Cheng-Yi Chiang 360d68794405135a0bf8c1ef95cc65f24301756335Cheng-Yi Chiang def check_default_nodes(self): 370d68794405135a0bf8c1ef95cc65f24301756335Cheng-Yi Chiang """Checks default audio nodes for devices with onboard audio support.""" 380d68794405135a0bf8c1ef95cc65f24301756335Cheng-Yi Chiang if audio_test_utils.has_internal_microphone(self.host): 390d68794405135a0bf8c1ef95cc65f24301756335Cheng-Yi Chiang audio_test_utils.check_audio_nodes(self.audio_facade, 400d68794405135a0bf8c1ef95cc65f24301756335Cheng-Yi Chiang (None, ['INTERNAL_MIC'])) 410d68794405135a0bf8c1ef95cc65f24301756335Cheng-Yi Chiang if audio_test_utils.has_internal_speaker(self.host): 420d68794405135a0bf8c1ef95cc65f24301756335Cheng-Yi Chiang audio_test_utils.check_audio_nodes(self.audio_facade, 430d68794405135a0bf8c1ef95cc65f24301756335Cheng-Yi Chiang (['INTERNAL_SPEAKER'], None)) 443ba0d9bb0134523cf2c0d80988f99d720c685a1fHelen Zhang 457fd9b36ac07d4e845c96a6fc91c7c7277f09e398Sridhar Sonti 460d68794405135a0bf8c1ef95cc65f24301756335Cheng-Yi Chiang def set_active_volume_to_node_volume(self, node): 470d68794405135a0bf8c1ef95cc65f24301756335Cheng-Yi Chiang """Sets Chrome volume to the specified volume of node. 487fd9b36ac07d4e845c96a6fc91c7c7277f09e398Sridhar Sonti 490d68794405135a0bf8c1ef95cc65f24301756335Cheng-Yi Chiang @param node: One of node type in self._VOLUMES. 507fd9b36ac07d4e845c96a6fc91c7c7277f09e398Sridhar Sonti 517fd9b36ac07d4e845c96a6fc91c7c7277f09e398Sridhar Sonti """ 520d68794405135a0bf8c1ef95cc65f24301756335Cheng-Yi Chiang self.audio_facade.set_chrome_active_volume(self._VOLUMES[node]) 530d68794405135a0bf8c1ef95cc65f24301756335Cheng-Yi Chiang 540d68794405135a0bf8c1ef95cc65f24301756335Cheng-Yi Chiang 550d68794405135a0bf8c1ef95cc65f24301756335Cheng-Yi Chiang def check_active_node_volume(self, node): 560d68794405135a0bf8c1ef95cc65f24301756335Cheng-Yi Chiang """Checks the active node type and checks if its volume is as expected. 570d68794405135a0bf8c1ef95cc65f24301756335Cheng-Yi Chiang 580d68794405135a0bf8c1ef95cc65f24301756335Cheng-Yi Chiang @param node: The expected node. 590d68794405135a0bf8c1ef95cc65f24301756335Cheng-Yi Chiang 600d68794405135a0bf8c1ef95cc65f24301756335Cheng-Yi Chiang @raises: TestFail if node volume is not as expected. 610d68794405135a0bf8c1ef95cc65f24301756335Cheng-Yi Chiang 620d68794405135a0bf8c1ef95cc65f24301756335Cheng-Yi Chiang """ 630d68794405135a0bf8c1ef95cc65f24301756335Cheng-Yi Chiang # Checks the node type is the active node type. 640d68794405135a0bf8c1ef95cc65f24301756335Cheng-Yi Chiang audio_test_utils.check_audio_nodes(self.audio_facade, ([node], None)) 650d68794405135a0bf8c1ef95cc65f24301756335Cheng-Yi Chiang # Checks if active volume is the node volume. 660d68794405135a0bf8c1ef95cc65f24301756335Cheng-Yi Chiang volume, mute = self.audio_facade.get_chrome_active_volume_mute() 670d68794405135a0bf8c1ef95cc65f24301756335Cheng-Yi Chiang expected_volume = self._VOLUMES[node] 680d68794405135a0bf8c1ef95cc65f24301756335Cheng-Yi Chiang if volume != expected_volume: 690d68794405135a0bf8c1ef95cc65f24301756335Cheng-Yi Chiang raise error.TestFail( 700d68794405135a0bf8c1ef95cc65f24301756335Cheng-Yi Chiang 'Node %s volume %d != %d' % (node, volume, expected_volume)) 710d68794405135a0bf8c1ef95cc65f24301756335Cheng-Yi Chiang 720d68794405135a0bf8c1ef95cc65f24301756335Cheng-Yi Chiang 730d68794405135a0bf8c1ef95cc65f24301756335Cheng-Yi Chiang def switch_nodes_and_check_volume(self, nodes): 740d68794405135a0bf8c1ef95cc65f24301756335Cheng-Yi Chiang """Switches between nodes and check the node volumes. 750d68794405135a0bf8c1ef95cc65f24301756335Cheng-Yi Chiang 760d68794405135a0bf8c1ef95cc65f24301756335Cheng-Yi Chiang @param nodes: A list of node types to check. 770d68794405135a0bf8c1ef95cc65f24301756335Cheng-Yi Chiang 780d68794405135a0bf8c1ef95cc65f24301756335Cheng-Yi Chiang """ 790d68794405135a0bf8c1ef95cc65f24301756335Cheng-Yi Chiang if len(nodes) == 1: 800d68794405135a0bf8c1ef95cc65f24301756335Cheng-Yi Chiang self.check_active_node_volume(nodes[0]) 810d68794405135a0bf8c1ef95cc65f24301756335Cheng-Yi Chiang for node in nodes: 820d68794405135a0bf8c1ef95cc65f24301756335Cheng-Yi Chiang # Switch nodes and check their volume. 830d68794405135a0bf8c1ef95cc65f24301756335Cheng-Yi Chiang self.audio_facade.set_chrome_active_node_type(node, None) 840d68794405135a0bf8c1ef95cc65f24301756335Cheng-Yi Chiang self.check_active_node_volume(node) 850d68794405135a0bf8c1ef95cc65f24301756335Cheng-Yi Chiang 867fd9b36ac07d4e845c96a6fc91c7c7277f09e398Sridhar Sonti 87b286ca3966dc5b6d5a66bfb4fbb3c15f18147f02Shrawan Jha def run_once(self, host, jack_node=False, hdmi_node=False, usb_node=False): 880d68794405135a0bf8c1ef95cc65f24301756335Cheng-Yi Chiang self.host = host 893ba0d9bb0134523cf2c0d80988f99d720c685a1fHelen Zhang chameleon_board = host.chameleon 903ba0d9bb0134523cf2c0d80988f99d720c685a1fHelen Zhang audio_board = chameleon_board.get_audio_board() 915de7e2a855b51eba066f77bb11b1f0075cc8330dCheng-Yi Chiang factory = self.create_remote_facade_factory(host) 923ba0d9bb0134523cf2c0d80988f99d720c685a1fHelen Zhang 933ba0d9bb0134523cf2c0d80988f99d720c685a1fHelen Zhang chameleon_board.reset() 940d68794405135a0bf8c1ef95cc65f24301756335Cheng-Yi Chiang self.audio_facade = factory.create_audio_facade() 95f7dfb2ed1117078602a49335b343ea9ee672e413Kalin Stoyanov self.display_facade = factory.create_display_facade() 960d68794405135a0bf8c1ef95cc65f24301756335Cheng-Yi Chiang 970d68794405135a0bf8c1ef95cc65f24301756335Cheng-Yi Chiang self.check_default_nodes() 98ca28a8fd7601ee37a927ae876dd8df032927a67eSridhar Sonti nodes = [] 99ca28a8fd7601ee37a927ae876dd8df032927a67eSridhar Sonti if audio_test_utils.has_internal_speaker(self.host): 100ca28a8fd7601ee37a927ae876dd8df032927a67eSridhar Sonti self.set_active_volume_to_node_volume('INTERNAL_SPEAKER') 101ca28a8fd7601ee37a927ae876dd8df032927a67eSridhar Sonti nodes.append('INTERNAL_SPEAKER') 102ca28a8fd7601ee37a927ae876dd8df032927a67eSridhar Sonti self.switch_nodes_and_check_volume(nodes) 103b286ca3966dc5b6d5a66bfb4fbb3c15f18147f02Shrawan Jha 1043ba0d9bb0134523cf2c0d80988f99d720c685a1fHelen Zhang 1052d3d9b6210ca31370fbb7f80153cb9432670834fSridhar Sonti if hdmi_node: 106f7dfb2ed1117078602a49335b343ea9ee672e413Kalin Stoyanov edid_path = os.path.join(self.bindir, 107f7dfb2ed1117078602a49335b343ea9ee672e413Kalin Stoyanov 'test_data/edids/HDMI_DELL_U2410.txt') 108f7dfb2ed1117078602a49335b343ea9ee672e413Kalin Stoyanov finder = chameleon_port_finder.ChameleonVideoInputFinder( 109f7dfb2ed1117078602a49335b343ea9ee672e413Kalin Stoyanov chameleon_board, self.display_facade) 1102d3d9b6210ca31370fbb7f80153cb9432670834fSridhar Sonti hdmi_port = finder.find_port('HDMI') 111f7dfb2ed1117078602a49335b343ea9ee672e413Kalin Stoyanov hdmi_port.apply_edid(edid_lib.Edid.from_file(edid_path)) 112f7dfb2ed1117078602a49335b343ea9ee672e413Kalin Stoyanov time.sleep(self._APPLY_EDID_DELAY) 1132d3d9b6210ca31370fbb7f80153cb9432670834fSridhar Sonti hdmi_port.set_plug(True) 1142d3d9b6210ca31370fbb7f80153cb9432670834fSridhar Sonti time.sleep(self._PLUG_DELAY) 1152d3d9b6210ca31370fbb7f80153cb9432670834fSridhar Sonti 1160d68794405135a0bf8c1ef95cc65f24301756335Cheng-Yi Chiang audio_test_utils.check_audio_nodes(self.audio_facade, 1172d3d9b6210ca31370fbb7f80153cb9432670834fSridhar Sonti (['HDMI'], None)) 1180d68794405135a0bf8c1ef95cc65f24301756335Cheng-Yi Chiang 1190d68794405135a0bf8c1ef95cc65f24301756335Cheng-Yi Chiang self.set_active_volume_to_node_volume('HDMI') 120b286ca3966dc5b6d5a66bfb4fbb3c15f18147f02Shrawan Jha nodes.append('HDMI') 121b286ca3966dc5b6d5a66bfb4fbb3c15f18147f02Shrawan Jha self.switch_nodes_and_check_volume(nodes) 1220d68794405135a0bf8c1ef95cc65f24301756335Cheng-Yi Chiang 1233ba0d9bb0134523cf2c0d80988f99d720c685a1fHelen Zhang if jack_node: 1243ba0d9bb0134523cf2c0d80988f99d720c685a1fHelen Zhang jack_plugger = audio_board.get_jack_plugger() 1253ba0d9bb0134523cf2c0d80988f99d720c685a1fHelen Zhang jack_plugger.plug() 1263ba0d9bb0134523cf2c0d80988f99d720c685a1fHelen Zhang time.sleep(self._PLUG_DELAY) 1270d68794405135a0bf8c1ef95cc65f24301756335Cheng-Yi Chiang audio_test_utils.dump_cros_audio_logs(host, self.audio_facade, 1282d3d9b6210ca31370fbb7f80153cb9432670834fSridhar Sonti self.resultsdir) 1290d68794405135a0bf8c1ef95cc65f24301756335Cheng-Yi Chiang audio_test_utils.check_audio_nodes(self.audio_facade, 1303ba0d9bb0134523cf2c0d80988f99d720c685a1fHelen Zhang (['HEADPHONE'], ['MIC'])) 1310d68794405135a0bf8c1ef95cc65f24301756335Cheng-Yi Chiang 1320d68794405135a0bf8c1ef95cc65f24301756335Cheng-Yi Chiang self.set_active_volume_to_node_volume('HEADPHONE') 133b286ca3966dc5b6d5a66bfb4fbb3c15f18147f02Shrawan Jha nodes.append('HEADPHONE') 1340d68794405135a0bf8c1ef95cc65f24301756335Cheng-Yi Chiang self.switch_nodes_and_check_volume(nodes) 1350d68794405135a0bf8c1ef95cc65f24301756335Cheng-Yi Chiang 136b286ca3966dc5b6d5a66bfb4fbb3c15f18147f02Shrawan Jha if usb_node: 137b286ca3966dc5b6d5a66bfb4fbb3c15f18147f02Shrawan Jha widget_factory = chameleon_audio_helper.AudioWidgetFactory( 138b286ca3966dc5b6d5a66bfb4fbb3c15f18147f02Shrawan Jha factory, host) 139b286ca3966dc5b6d5a66bfb4fbb3c15f18147f02Shrawan Jha 140b286ca3966dc5b6d5a66bfb4fbb3c15f18147f02Shrawan Jha source = widget_factory.create_widget( 141b286ca3966dc5b6d5a66bfb4fbb3c15f18147f02Shrawan Jha chameleon_audio_ids.CrosIds.USBOUT) 142b286ca3966dc5b6d5a66bfb4fbb3c15f18147f02Shrawan Jha recorder = widget_factory.create_widget( 143b286ca3966dc5b6d5a66bfb4fbb3c15f18147f02Shrawan Jha chameleon_audio_ids.ChameleonIds.USBIN) 144b286ca3966dc5b6d5a66bfb4fbb3c15f18147f02Shrawan Jha binder = widget_factory.create_binder(source, recorder) 145b286ca3966dc5b6d5a66bfb4fbb3c15f18147f02Shrawan Jha 146b286ca3966dc5b6d5a66bfb4fbb3c15f18147f02Shrawan Jha with chameleon_audio_helper.bind_widgets(binder): 147b286ca3966dc5b6d5a66bfb4fbb3c15f18147f02Shrawan Jha time.sleep(self._PLUG_DELAY) 148b286ca3966dc5b6d5a66bfb4fbb3c15f18147f02Shrawan Jha audio_test_utils.check_audio_nodes(self.audio_facade, 149b286ca3966dc5b6d5a66bfb4fbb3c15f18147f02Shrawan Jha (['USB'], ['USB'])) 150b286ca3966dc5b6d5a66bfb4fbb3c15f18147f02Shrawan Jha self.set_active_volume_to_node_volume('USB') 151b286ca3966dc5b6d5a66bfb4fbb3c15f18147f02Shrawan Jha nodes.append('USB') 152b286ca3966dc5b6d5a66bfb4fbb3c15f18147f02Shrawan Jha self.switch_nodes_and_check_volume(nodes) 153b286ca3966dc5b6d5a66bfb4fbb3c15f18147f02Shrawan Jha time.sleep(self._PLUG_DELAY) 154b286ca3966dc5b6d5a66bfb4fbb3c15f18147f02Shrawan Jha nodes.remove('USB') 155b286ca3966dc5b6d5a66bfb4fbb3c15f18147f02Shrawan Jha self.switch_nodes_and_check_volume(nodes) 15608529c0d4b5a19d4628c38b5a52f3a80220d5dbdCheng-Yi Chiang 157b286ca3966dc5b6d5a66bfb4fbb3c15f18147f02Shrawan Jha if jack_node: 158b286ca3966dc5b6d5a66bfb4fbb3c15f18147f02Shrawan Jha if usb_node: 159b286ca3966dc5b6d5a66bfb4fbb3c15f18147f02Shrawan Jha audio_test_utils.check_audio_nodes(self.audio_facade, 160b286ca3966dc5b6d5a66bfb4fbb3c15f18147f02Shrawan Jha (['HEADPHONE'], ['MIC'])) 161b286ca3966dc5b6d5a66bfb4fbb3c15f18147f02Shrawan Jha jack_plugger.unplug() 1622d3d9b6210ca31370fbb7f80153cb9432670834fSridhar Sonti time.sleep(self._PLUG_DELAY) 163b286ca3966dc5b6d5a66bfb4fbb3c15f18147f02Shrawan Jha nodes.remove('HEADPHONE') 164b286ca3966dc5b6d5a66bfb4fbb3c15f18147f02Shrawan Jha self.switch_nodes_and_check_volume(nodes) 1652d3d9b6210ca31370fbb7f80153cb9432670834fSridhar Sonti 1662d3d9b6210ca31370fbb7f80153cb9432670834fSridhar Sonti if hdmi_node: 167b286ca3966dc5b6d5a66bfb4fbb3c15f18147f02Shrawan Jha if usb_node or jack_node : 168b286ca3966dc5b6d5a66bfb4fbb3c15f18147f02Shrawan Jha audio_test_utils.check_audio_nodes(self.audio_facade, 169b286ca3966dc5b6d5a66bfb4fbb3c15f18147f02Shrawan Jha (['HDMI'], None)) 1702d3d9b6210ca31370fbb7f80153cb9432670834fSridhar Sonti hdmi_port.set_plug(False) 1712d3d9b6210ca31370fbb7f80153cb9432670834fSridhar Sonti time.sleep(self._PLUG_DELAY) 172b286ca3966dc5b6d5a66bfb4fbb3c15f18147f02Shrawan Jha nodes.remove('HDMI') 173b286ca3966dc5b6d5a66bfb4fbb3c15f18147f02Shrawan Jha self.switch_nodes_and_check_volume(nodes) 1742d3d9b6210ca31370fbb7f80153cb9432670834fSridhar Sonti 1750d68794405135a0bf8c1ef95cc65f24301756335Cheng-Yi Chiang self.check_default_nodes() 176b286ca3966dc5b6d5a66bfb4fbb3c15f18147f02Shrawan Jha 177