# Copyright 2015 The Chromium OS Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. """This is a server side audio nodes s test using the Chameleon board.""" import os import time from autotest_lib.client.common_lib import error from autotest_lib.client.cros.chameleon import audio_test_utils from autotest_lib.client.cros.chameleon import chameleon_audio_ids from autotest_lib.client.cros.chameleon import chameleon_audio_helper from autotest_lib.client.cros.chameleon import chameleon_port_finder from autotest_lib.client.cros.chameleon import edid as edid_lib from autotest_lib.server.cros.audio import audio_test from autotest_lib.server.cros.multimedia import remote_facade_factory URL = 'https://www.youtube.com/watch?v=aqz-KE-bpKQ' class audio_AudioNodeSwitch(audio_test.AudioTest): """Server side audio test. This test talks to a Chameleon board and a Cros device to verify audio nodes switch correctly. """ version = 1 _APPLY_EDID_DELAY = 5 _PLUG_DELAY = 5 _WAIT_TO_LOAD_VIDEO = 5 _VOLUMES = {'INTERNAL_SPEAKER': 100, 'HEADPHONE': 80, 'LINEOUT': 80, 'HDMI': 60, 'USB': 40,} def check_default_nodes(self): """Checks default audio nodes for devices with onboard audio support.""" if audio_test_utils.has_internal_microphone(self.host): audio_test_utils.check_audio_nodes(self.audio_facade, (None, ['INTERNAL_MIC'])) if audio_test_utils.has_internal_speaker(self.host): audio_test_utils.check_audio_nodes(self.audio_facade, (['INTERNAL_SPEAKER'], None)) def set_active_volume_to_node_volume(self, node): """Sets Chrome volume to the specified volume of node. @param node: One of node type in self._VOLUMES. """ self.audio_facade.set_chrome_active_volume(self._VOLUMES[node]) def check_active_node_volume(self, node): """Checks the active node type and checks if its volume is as expected. @param node: The expected node. @raises: TestFail if node volume is not as expected. """ # Checks the node type is the active node type. audio_test_utils.check_audio_nodes(self.audio_facade, ([node], None)) # Checks if active volume is the node volume. volume, mute = self.audio_facade.get_chrome_active_volume_mute() expected_volume = self._VOLUMES[node] if volume != expected_volume: raise error.TestFail( 'Node %s volume %d != %d' % (node, volume, expected_volume)) def switch_nodes_and_check_volume(self, nodes): """Switches between nodes and check the node volumes. @param nodes: A list of node types to check. """ if len(nodes) == 1: self.check_active_node_volume(nodes[0]) for node in nodes: # Switch nodes and check their volume. self.audio_facade.set_chrome_active_node_type(node, None) self.check_active_node_volume(node) def run_once(self, host, jack_node=False, hdmi_node=False, usb_node=False, play_audio=False): self.host = host chameleon_board = host.chameleon audio_board = chameleon_board.get_audio_board() factory = remote_facade_factory.RemoteFacadeFactory( host, results_dir=self.resultsdir) chameleon_board.setup_and_reset(self.outputdir) self.audio_facade = factory.create_audio_facade() self.display_facade = factory.create_display_facade() self.check_default_nodes() nodes = [] if audio_test_utils.has_internal_speaker(self.host): self.set_active_volume_to_node_volume('INTERNAL_SPEAKER') nodes.append('INTERNAL_SPEAKER') self.switch_nodes_and_check_volume(nodes) if play_audio: self.browser_facade = factory.create_browser_facade() self.browser_facade.new_tab(URL) time.sleep(self._WAIT_TO_LOAD_VIDEO) if hdmi_node: edid_path = os.path.join(self.bindir, 'test_data/edids/HDMI_DELL_U2410.txt') finder = chameleon_port_finder.ChameleonVideoInputFinder( chameleon_board, self.display_facade) hdmi_port = finder.find_port('HDMI') hdmi_port.apply_edid(edid_lib.Edid.from_file(edid_path)) time.sleep(self._APPLY_EDID_DELAY) hdmi_port.set_plug(True) time.sleep(self._PLUG_DELAY * 2) audio_test_utils.check_audio_nodes(self.audio_facade, (['HDMI'], None)) if play_audio: self.audio_facade.check_audio_stream_at_selected_device() self.set_active_volume_to_node_volume('HDMI') nodes.append('HDMI') self.switch_nodes_and_check_volume(nodes) if jack_node: jack_plugger = audio_board.get_jack_plugger() jack_plugger.plug() time.sleep(self._PLUG_DELAY) audio_test_utils.dump_cros_audio_logs(host, self.audio_facade, self.resultsdir) # Checks whether line-out or headphone is detected. hp_jack_node_type = audio_test_utils.check_hp_or_lineout_plugged( self.audio_facade) audio_test_utils.check_audio_nodes(self.audio_facade, (None, ['MIC'])) self.set_active_volume_to_node_volume(hp_jack_node_type) nodes.append(hp_jack_node_type) self.switch_nodes_and_check_volume(nodes) if usb_node: widget_factory = chameleon_audio_helper.AudioWidgetFactory( factory, host) source = widget_factory.create_widget( chameleon_audio_ids.CrosIds.USBOUT) recorder = widget_factory.create_widget( chameleon_audio_ids.ChameleonIds.USBIN) binder = widget_factory.create_binder(source, recorder) with chameleon_audio_helper.bind_widgets(binder): time.sleep(self._PLUG_DELAY) audio_test_utils.check_audio_nodes(self.audio_facade, (['USB'], ['USB'])) self.set_active_volume_to_node_volume('USB') nodes.append('USB') self.switch_nodes_and_check_volume(nodes) time.sleep(self._PLUG_DELAY) nodes.remove('USB') self.switch_nodes_and_check_volume(nodes) if jack_node: if usb_node: audio_test_utils.check_audio_nodes(self.audio_facade, ([hp_jack_node_type], ['MIC'])) jack_plugger.unplug() time.sleep(self._PLUG_DELAY) nodes.remove(hp_jack_node_type) self.switch_nodes_and_check_volume(nodes) if hdmi_node: if usb_node or jack_node : audio_test_utils.check_audio_nodes(self.audio_facade, (['HDMI'], None)) hdmi_port.set_plug(False) time.sleep(self._PLUG_DELAY) nodes.remove('HDMI') self.switch_nodes_and_check_volume(nodes) self.check_default_nodes()