# Lint as: python3 """Tests for testing audio capture in android bt target controller. location of the controller: blueberry.controllers.android_bt_target_device Before the test, the music file should be copied to the location of the pri_phone. The a2dp sink phone should be with the android build that can support a2dp sink profile (for example, the git_master-bds-dev). """ from __future__ import absolute_import from __future__ import division from __future__ import print_function import logging import time from mobly import asserts from mobly import test_runner from blueberry.utils import blueberry_base_test from blueberry.utils import bt_test_utils MUSIC_FILE = '1khz.wav' class BluetoothAudioCaptureTest(blueberry_base_test.BlueberryBaseTest): def setup_class(self): """Standard Mobly setup class.""" super(BluetoothAudioCaptureTest, self).setup_class() self.derived_bt_device = self.derived_bt_devices[0] for device in self.android_devices: device.init_setup() device.sl4a_setup() self.pri_phone = self.android_devices[0] self.mac_address = self.derived_bt_device.get_bluetooth_mac_address() self.derived_bt_device.activate_pairing_mode() self.pri_phone.sl4a.bluetoothDiscoverAndBond(self.mac_address) self.pri_phone.wait_for_connection_success(self.mac_address) # Gives more time for the pairing between the pri_phone and the # derived_bt_device (the android bt target device) time.sleep(3) self.derived_bt_device.add_sec_ad_device(self.pri_phone) self.derived_bt_device.disconnect_all() self.duration = self.derived_bt_device.audio_params['duration'] self.recorded_duration = 0 def setup_test(self): """Setup for bluetooth latency test.""" logging.info('Setup Test for audio capture test') super(BluetoothAudioCaptureTest, self).setup_test() asserts.assert_true(self.derived_bt_device.a2dp_sink_connect(), 'Failed to establish A2dp Sink connection') def test_audio_capture(self): """Tests the audio capture for the android bt target device.""" music_file = self.derived_bt_device.audio_params.get( 'music_file', MUSIC_FILE) music_file = 'file:///sdcard/Music/{}'.format(music_file) self.pri_phone.sl4a.mediaPlayOpen(music_file) self.pri_phone.sl4a.mediaPlaySetLooping() self.pri_phone.sl4a.mediaPlayStart() time.sleep(3) self.pri_phone.log.info(self.pri_phone.sl4a.mediaPlayGetInfo()) self.derived_bt_device.start_audio_capture() time.sleep(self.duration) audio_captured = self.derived_bt_device.stop_audio_capture() self.pri_phone.sl4a.mediaPlayStop() self.pri_phone.sl4a.mediaPlayClose() self.derived_bt_device.log.info('Audio play and record stopped') self.recorded_duration = bt_test_utils.get_duration_seconds(audio_captured) self.derived_bt_device.log.info( 'The capture duration is %s s and the recorded duration is %s s', self.duration, self.recorded_duration) def teardown_class(self): logging.info('Factory resetting Bluetooth on devices.') self.pri_phone.factory_reset_bluetooth() self.derived_bt_device.factory_reset_bluetooth() super(BluetoothAudioCaptureTest, self).teardown_class() self.derived_bt_device.stop_all_services() self.record_data({ 'Test Name': 'test_audio_capture', 'sponge_properties': { 'duration': self.duration, 'recorded duration': self.recorded_duration } }) if __name__ == '__main__': test_runner.main()