autotest: Stop involving jack plugger while binding
This requires 1959209 to be in first, otherwise it will break tests that
rely on the link binder to trigger the jack plugger.
Ex: audio_AudioBasicHeadphone
BUG=b:145963290
TEST=Run all affected tests.
Change-Id: If766c6320d259a805516109011c7d71209aae454
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/third_party/autotest/+/1961696
Tested-by: En-Shuo Hsu <enshuo@chromium.org>
Auto-Submit: En-Shuo Hsu <enshuo@chromium.org>
Reviewed-by: Yu-Hsuan Hsu <yuhsuan@chromium.org>
Commit-Queue: En-Shuo Hsu <enshuo@chromium.org>
diff --git a/client/cros/chameleon/audio_widget.py b/client/cros/chameleon/audio_widget.py
index b627378..0010331 100644
--- a/client/cros/chameleon/audio_widget.py
+++ b/client/cros/chameleon/audio_widget.py
@@ -655,95 +655,24 @@
Properties:
_audio_facade: An AudioFacadeRemoteAdapter to access Cros device
audio functionality.
- _plug_handler: A PlugHandler for performing plug and unplug.
"""
- def __init__(self, audio_facade, plug_handler):
+ def __init__(self, audio_facade):
"""Initializes a CrosWidgetHandler.
@param audio_facade: An AudioFacadeRemoteAdapter to access Cros device
audio functionality.
- @param plug_handler: A PlugHandler object for plug and unplug.
"""
self._audio_facade = audio_facade
- self._plug_handler = plug_handler
-
def plug(self):
"""Plugs this widget."""
logging.info('CrosWidgetHandler: plug')
- self._plug_handler.plug()
-
def unplug(self):
"""Unplugs this widget."""
logging.info('CrosWidgetHandler: unplug')
- self._plug_handler.unplug()
-
-
-class PlugHandler(object):
- """This class abstracts plug/unplug action for widgets on Cros device.
-
- This class will be used by CrosWidgetHandler when performinng plug/unplug.
-
- """
- def __init__(self):
- """Initializes a PlugHandler."""
-
-
- def plug(self):
- """Plugs in the widget/device."""
- raise NotImplementedError('plug() not implemented.')
-
-
- def unplug(self):
- """Unplugs the widget/device."""
- raise NotImplementedError('unplug() not implemented.')
-
-
-class DummyPlugHandler(PlugHandler):
- """A dummy class that does not do anything for plug() or unplug().
-
- This class can be used by Cros widgets that have alternative ways of
- performing plug and unplug.
-
- """
-
- def plug(self):
- """Does nothing for plug."""
- logging.info('DummyPlugHandler: plug')
-
-
- def unplug(self):
- """Does nothing for unplug."""
- logging.info('DummyPlugHandler: unplug')
-
-
-class JackPluggerPlugHandler(PlugHandler):
- """This class abstracts plug/unplug action with motor on Cros device.
-
- Properties:
- _jack_plugger: A JackPlugger object to access the jack plugger robot
-
- """
-
- def __init__(self, jack_plugger):
- """Initializes a JackPluggerPlugHandler.
-
- @param jack_plugger: A JackPlugger object
- """
- self._jack_plugger = jack_plugger
-
-
- def plug(self):
- """plugs in the jack to the cros device."""
- self._jack_plugger.plug()
-
-
- def unplug(self):
- """Unplugs the jack from the cros device."""
- self._jack_plugger.unplug()
class CrosInputWidgetHandlerError(Exception):
@@ -857,18 +786,16 @@
This class abstracts a Cros device audio input widget handler on int mic.
"""
- def __init__(self, audio_facade, plug_handler, system_facade):
+ def __init__(self, audio_facade, system_facade):
"""Initializes a CrosWidgetHandler.
@param audio_facade: An AudioFacadeRemoteAdapter to access Cros device
audio functionality.
- @param plug_handler: A PlugHandler object for plug and unplug.
@param system_facade: A SystemFacadeRemoteAdapter to access Cros device
audio functionality.
"""
- super(CrosIntMicInputWidgetHandler, self).__init__(
- audio_facade, plug_handler)
+ super(CrosIntMicInputWidgetHandler, self).__init__(audio_facade)
self._system_facade = system_facade
@@ -910,18 +837,17 @@
channel=1,
rate=16000)
- def __init__(self, audio_facade, plug_handler, system_facade):
+ def __init__(self, audio_facade, system_facade):
"""Initializes a CrosWidgetHandler.
@param audio_facade: An AudioFacadeRemoteAdapter to access Cros device
audio functionality.
- @param plug_handler: A PlugHandler object for plug and unplug.
@param system_facade: A SystemFacadeRemoteAdapter to access Cros device
system functionality.
"""
super(CrosHotwordingWidgetHandler, self).__init__(
- audio_facade, plug_handler)
+ audio_facade)
self._system_facade = system_facade
diff --git a/client/cros/chameleon/audio_widget_link.py b/client/cros/chameleon/audio_widget_link.py
index 4bf4674..5a5a632 100644
--- a/client/cros/chameleon/audio_widget_link.py
+++ b/client/cros/chameleon/audio_widget_link.py
@@ -8,7 +8,6 @@
import time
from autotest_lib.client.cros.chameleon import audio_level
-from autotest_lib.client.cros.chameleon import chameleon_audio_ids as ids
from autotest_lib.client.cros.chameleon import chameleon_bluetooth_audio
@@ -171,14 +170,7 @@
class AudioBusLink(WidgetLink):
"""The abstraction of widget link using audio bus on audio board.
- This class handles two tasks.
- 1. Audio bus routing.
- 2. Plug/unplug jack using the widget handler on the DUT side.
-
- Note that audio jack is shared by headphone and external microphone on
- Cros device. So plugging/unplugging headphone widget will also affect
- external microphone. This should be handled outside of this class
- when we need to support complicated test case.
+ This class handles the Audio bus routing.
Properties:
_audio_bus: An AudioBus object.
@@ -201,9 +193,6 @@
@param widget: An AudioWidget object.
"""
- if widget.audio_port.host == 'Cros':
- widget.handler.plug()
-
self._audio_bus.connect(widget.audio_port.port_id)
logging.info(
@@ -217,9 +206,6 @@
@param widget: An AudioWidget object.
"""
- if widget.audio_port.host == 'Cros':
- widget.handler.unplug()
-
self._audio_bus.disconnect(widget.audio_port.port_id)
logging.info(
@@ -233,9 +219,6 @@
@param widget: An AudioWidget object.
"""
- if widget.audio_port.host == 'Cros':
- widget.handler.plug()
-
self._audio_bus.connect(widget.audio_port.port_id)
logging.info(
@@ -249,9 +232,6 @@
@param widget: An AudioWidget object.
"""
- if widget.audio_port.host == 'Cros':
- widget.handler.unplug()
-
self._audio_bus.disconnect(widget.audio_port.port_id)
logging.info(
'Unplugged audio board bus %d output from %s',
@@ -433,8 +413,7 @@
"""
board = self._cros_host.get_board().split(':')[1]
- if board in ['peach_pit', 'peach_pi', 'daisy', 'daisy_spring',
- 'daisy_skate', 'cyan', 'celes', 'nyan_big', 'lars']:
+ if board in ['cyan', 'celes', 'lars']:
logging.info('Need extra plug/unplug on board %s', board)
for _ in xrange(3):
handler.plug()
diff --git a/client/cros/chameleon/chameleon_audio_helper.py b/client/cros/chameleon/chameleon_audio_helper.py
index d8366bf..c4cfd73 100644
--- a/client/cros/chameleon/chameleon_audio_helper.py
+++ b/client/cros/chameleon/chameleon_audio_helper.py
@@ -279,7 +279,6 @@
return audio_widget.ChameleonOutputWidgetHandler(
self._chameleon_board, audio_port.interface)
-
def _create_cros_handler(audio_port):
"""Creates a CrosWidgetHandler for a given AudioPort.
@@ -289,53 +288,34 @@
role of audio_port.
"""
- is_usb = audio_port.port_id in [ids.CrosIds.USBIN,
- ids.CrosIds.USBOUT]
- is_audio_jack = audio_port.port_id in [ids.CrosIds.HEADPHONE,
- ids.CrosIds.EXTERNAL_MIC]
+ is_usb = audio_port.port_id in [
+ ids.CrosIds.USBIN, ids.CrosIds.USBOUT
+ ]
is_internal_mic = audio_port.port_id == ids.CrosIds.INTERNAL_MIC
is_hotwording = audio_port.port_id == ids.CrosIds.HOTWORDING
- # Determines the plug handler to be used.
- # By default, the plug handler is DummyPlugHandler.
- # If the port uses audio jack, and there is jack plugger available
- # through audio board, then JackPluggerPlugHandler should be used.
- audio_board = self._chameleon_board.get_audio_board()
- if audio_board:
- jack_plugger = audio_board.get_jack_plugger()
- else:
- jack_plugger = None
-
- if jack_plugger and is_audio_jack:
- plug_handler = audio_widget.JackPluggerPlugHandler(jack_plugger)
- else:
- plug_handler = audio_widget.DummyPlugHandler()
-
if audio_port.role == 'sink':
if use_arc:
return audio_widget_arc.CrosInputWidgetARCHandler(
- self._audio_facade, plug_handler)
+ self._audio_facade)
elif is_usb:
return audio_widget.CrosUSBInputWidgetHandler(
- self._audio_facade, plug_handler)
+ self._audio_facade)
elif is_internal_mic:
return audio_widget.CrosIntMicInputWidgetHandler(
- self._audio_facade, plug_handler,
- self._system_facade)
+ self._audio_facade, self._system_facade)
elif is_hotwording:
return audio_widget.CrosHotwordingWidgetHandler(
- self._audio_facade, plug_handler,
- self._system_facade)
+ self._audio_facade, self._system_facade)
else:
return audio_widget.CrosInputWidgetHandler(
- self._audio_facade, plug_handler)
+ self._audio_facade)
else:
if use_arc:
return audio_widget_arc.CrosOutputWidgetARCHandler(
- self._audio_facade, plug_handler)
- return audio_widget.CrosOutputWidgetHandler(self._audio_facade,
- plug_handler)
-
+ self._audio_facade)
+ return audio_widget.CrosOutputWidgetHandler(
+ self._audio_facade)
def _create_audio_widget(audio_port, handler):
"""Creates an AudioWidget for given AudioPort using WidgetHandler.
diff --git a/server/site_tests/audio_AudioAfterReboot/audio_AudioAfterReboot.py b/server/site_tests/audio_AudioAfterReboot/audio_AudioAfterReboot.py
index d7b65bf..9a3b345 100644
--- a/server/site_tests/audio_AudioAfterReboot/audio_AudioAfterReboot.py
+++ b/server/site_tests/audio_AudioAfterReboot/audio_AudioAfterReboot.py
@@ -28,27 +28,8 @@
DELAY_BEFORE_RECORD_SECONDS = 0.5
DELAY_AFTER_BINDING = 0.5
RECORD_SECONDS = 5
- SHORT_WAIT = 2
PRC_RECONNECT_TIMEOUT = 60
- def action_plug_jack(self, plug_state):
- """Calls the audio interface API and plugs/unplugs.
-
- @param plug_state: plug state to switch to
-
- """
- logging.debug('Plugging' if plug_state else 'Unplugging')
- jack_plugger = self.audio_board.get_jack_plugger()
- if jack_plugger == None:
- logging.debug('Jack plugger is NOT present!')
- return
- if plug_state:
- jack_plugger.plug()
- else:
- jack_plugger.unplug()
- time.sleep(self.SHORT_WAIT)
-
-
def play_and_record(self, source_widget, recorder_widget=None):
"""Plays and records (if needed) audio.
@@ -234,8 +215,9 @@
else:
recorder_widget = widget_factory.create_widget(recorder)
- # Plug for external audio
- self.action_plug_jack(not is_internal)
+ # Selects and checks the node selected by cras is correct.
+ audio_test_utils.check_and_set_chrome_active_node_types(
+ self.facade, audio_nodes[0][0], audio_nodes[1][0])
# Play only, reboot, then play and record.
if binder_widget != None:
diff --git a/server/site_tests/audio_AudioNodeSwitch/audio_AudioNodeSwitch.py b/server/site_tests/audio_AudioNodeSwitch/audio_AudioNodeSwitch.py
index cf493c1..27cf6f0 100644
--- a/server/site_tests/audio_AudioNodeSwitch/audio_AudioNodeSwitch.py
+++ b/server/site_tests/audio_AudioNodeSwitch/audio_AudioNodeSwitch.py
@@ -15,7 +15,6 @@
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'
@@ -40,10 +39,10 @@
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,
+ audio_test_utils.check_audio_nodes(self.facade,
(None, ['INTERNAL_MIC']))
if audio_test_utils.has_internal_speaker(self.host):
- audio_test_utils.check_audio_nodes(self.audio_facade,
+ audio_test_utils.check_audio_nodes(self.facade,
(['INTERNAL_SPEAKER'], None))
@@ -53,7 +52,7 @@
@param node: One of node type in self._VOLUMES.
"""
- self.audio_facade.set_chrome_active_volume(self._VOLUMES[node])
+ self.facade.set_chrome_active_volume(self._VOLUMES[node])
def check_active_node_volume(self, node):
@@ -65,9 +64,9 @@
"""
# Checks the node type is the active node type.
- audio_test_utils.check_audio_nodes(self.audio_facade, ([node], None))
+ audio_test_utils.check_audio_nodes(self.facade, ([node], None))
# Checks if active volume is the node volume.
- volume, mute = self.audio_facade.get_chrome_active_volume_mute()
+ volume, mute = self.facade.get_chrome_active_volume_mute()
expected_volume = self._VOLUMES[node]
if volume != expected_volume:
raise error.TestFail(
@@ -84,21 +83,14 @@
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.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,
+ def run_once(self, 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()
+ """Runs AudioNodeSwitch test."""
+ self.display_facade = self.factory.create_display_facade()
self.check_default_nodes()
nodes = []
@@ -108,40 +100,41 @@
self.switch_nodes_and_check_volume(nodes)
if play_audio:
- self.browser_facade = factory.create_browser_facade()
+ self.browser_facade = self.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)
+ self.host.chameleon, 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,
+ audio_test_utils.check_audio_nodes(self.facade,
(['HDMI'], None))
if play_audio:
- self.audio_facade.check_audio_stream_at_selected_device()
+ self.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 = self.host.chameleon.get_audio_board(
+ ).get_jack_plugger()
jack_plugger.plug()
time.sleep(self._PLUG_DELAY)
- audio_test_utils.dump_cros_audio_logs(host, self.audio_facade,
+ audio_test_utils.dump_cros_audio_logs(self.host, self.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)
+ self.facade)
- audio_test_utils.check_audio_nodes(self.audio_facade,
+ audio_test_utils.check_audio_nodes(self.facade,
(None, ['MIC']))
self.set_active_volume_to_node_volume(hp_jack_node_type)
@@ -150,18 +143,15 @@
self.switch_nodes_and_check_volume(nodes)
if usb_node:
- widget_factory = chameleon_audio_helper.AudioWidgetFactory(
- factory, host)
-
- source = widget_factory.create_widget(
+ source = self.widget_factory.create_widget(
chameleon_audio_ids.CrosIds.USBOUT)
- recorder = widget_factory.create_widget(
+ recorder = self.widget_factory.create_widget(
chameleon_audio_ids.ChameleonIds.USBIN)
- binder = widget_factory.create_binder(source, recorder)
+ binder = self.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,
+ audio_test_utils.check_audio_nodes(self.facade,
(['USB'], ['USB']))
self.set_active_volume_to_node_volume('USB')
nodes.append('USB')
@@ -172,8 +162,8 @@
if jack_node:
if usb_node:
- audio_test_utils.check_audio_nodes(self.audio_facade,
- ([hp_jack_node_type], ['MIC']))
+ audio_test_utils.check_audio_nodes(
+ self.facade, ([hp_jack_node_type], ['MIC']))
jack_plugger.unplug()
time.sleep(self._PLUG_DELAY)
nodes.remove(hp_jack_node_type)
@@ -181,7 +171,7 @@
if hdmi_node:
if usb_node or jack_node :
- audio_test_utils.check_audio_nodes(self.audio_facade,
+ audio_test_utils.check_audio_nodes(self.facade,
(['HDMI'], None))
hdmi_port.set_plug(False)
time.sleep(self._PLUG_DELAY)
@@ -189,4 +179,3 @@
self.switch_nodes_and_check_volume(nodes)
self.check_default_nodes()
-
diff --git a/server/site_tests/audio_AudioPinnedStream/audio_AudioPinnedStream.py b/server/site_tests/audio_AudioPinnedStream/audio_AudioPinnedStream.py
index fbc8eac..e849080 100644
--- a/server/site_tests/audio_AudioPinnedStream/audio_AudioPinnedStream.py
+++ b/server/site_tests/audio_AudioPinnedStream/audio_AudioPinnedStream.py
@@ -1,7 +1,6 @@
# Copyright 2019 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 pinned stream audio test using the Chameleon board."""
import logging
@@ -13,7 +12,6 @@
from autotest_lib.client.cros.chameleon import chameleon_audio_ids
from autotest_lib.client.cros.chameleon import chameleon_audio_helper
from autotest_lib.server.cros.audio import audio_test
-from autotest_lib.server.cros.multimedia import remote_facade_factory
class audio_AudioPinnedStream(audio_test.AudioTest):
@@ -28,66 +26,50 @@
PLAYBACK_RECORD_SECONDS = 3
RECORDING_RECORD_SECONDS = 6
DELAY_AFTER_BINDING = 0.5
- DELAY_AFTER_SETTING = 5
- def run_once(self, host, playback):
+ def run_once(self, playback):
"""Running basic pinned stream audio tests.
- @param host: device under test host
+ @param playback: True if testing for playback path
"""
# [1330, 1330] sine wave
golden_file = audio_test_data.SIMPLE_FREQUENCY_TEST_1330_FILE
# [2000, 1000] sine wave
usb_golden_file = audio_test_data.FREQUENCY_TEST_FILE
- chameleon_board = host.chameleon
- factory = remote_facade_factory.RemoteFacadeFactory(
- host, results_dir=self.resultsdir)
-
- chameleon_board.setup_and_reset(self.outputdir)
-
- widget_factory = chameleon_audio_helper.AudioWidgetFactory(
- factory, host)
-
if playback:
- source = widget_factory.create_widget(
+ source = self.widget_factory.create_widget(
chameleon_audio_ids.CrosIds.HEADPHONE)
- recorder = widget_factory.create_widget(
+ recorder = self.widget_factory.create_widget(
chameleon_audio_ids.ChameleonIds.LINEIN)
- usb_source = widget_factory.create_widget(
+ usb_source = self.widget_factory.create_widget(
chameleon_audio_ids.CrosIds.USBOUT)
- usb_recorder = widget_factory.create_widget(
+ usb_recorder = self.widget_factory.create_widget(
chameleon_audio_ids.ChameleonIds.USBIN)
else:
- source = widget_factory.create_widget(
+ source = self.widget_factory.create_widget(
chameleon_audio_ids.ChameleonIds.LINEOUT)
- recorder = widget_factory.create_widget(
+ recorder = self.widget_factory.create_widget(
chameleon_audio_ids.CrosIds.EXTERNAL_MIC)
- usb_source = widget_factory.create_widget(
+ usb_source = self.widget_factory.create_widget(
chameleon_audio_ids.ChameleonIds.USBOUT)
- usb_recorder = widget_factory.create_widget(
+ usb_recorder = self.widget_factory.create_widget(
chameleon_audio_ids.CrosIds.USBIN)
- binder = widget_factory.create_binder(source, recorder)
- usb_binder = widget_factory.create_binder(usb_source, usb_recorder)
+ binder = self.widget_factory.create_binder(source, recorder)
+ usb_binder = self.widget_factory.create_binder(usb_source,
+ usb_recorder)
with chameleon_audio_helper.bind_widgets(usb_binder):
with chameleon_audio_helper.bind_widgets(binder):
time.sleep(self.DELAY_AFTER_BINDING)
- audio_facade = factory.create_audio_facade()
- plugger = chameleon_board.get_audio_board().get_jack_plugger()
-
- # Fix for chameleon rack hosts because audio jack is always
- # plugged. (crbug.com/955009)
- if plugger is None:
- if playback:
- audio_test_utils.check_and_set_chrome_active_node_types(
- audio_facade, 'HEADPHONE', None)
- else:
- audio_test_utils.check_and_set_chrome_active_node_types(
- audio_facade, None, 'MIC')
- time.sleep(self.DELAY_AFTER_SETTING)
+ if playback:
+ audio_test_utils.check_and_set_chrome_active_node_types(
+ self.facade, 'HEADPHONE', None)
+ else:
+ audio_test_utils.check_and_set_chrome_active_node_types(
+ self.facade, None, 'MIC')
logging.info('Setting playback data')
source.set_playback_data(golden_file)
@@ -97,7 +79,7 @@
source.start_playback()
logging.info('Start playing %s, pinned:%s',
- usb_golden_file.path, playback)
+ usb_golden_file.path, playback)
usb_source.start_playback(pinned=playback)
time.sleep(self.DELAY_BEFORE_RECORD_SECONDS)
@@ -121,8 +103,9 @@
recorder.stop_recording()
usb_recorder.stop_recording(pinned=True)
- audio_test_utils.dump_cros_audio_logs(
- host, audio_facade, self.resultsdir, 'after_recording')
+ audio_test_utils.dump_cros_audio_logs(self.host, self.facade,
+ self.resultsdir,
+ 'after_recording')
recorder.read_recorded_binary()
usb_recorder.read_recorded_binary()
@@ -143,4 +126,5 @@
# not the main point of this test.
audio_test_utils.check_recorded_frequency(
golden_file, recorder, second_peak_ratio=0.3)
- audio_test_utils.check_recorded_frequency(usb_golden_file, usb_recorder)
+ audio_test_utils.check_recorded_frequency(usb_golden_file,
+ usb_recorder)