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