| # 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() |