From 72e50e2ef1480fc3d90f0d88c7e9e3595622e75c Mon Sep 17 00:00:00 2001 From: Kevin Rocard Date: Fri, 5 May 2017 14:02:55 -0700 Subject: [PATCH] Audio HAL VTS: Fix style on modified files In order to avoid style inconsistency as well as non functional modification in following patches, fix the style of all files modified for the fix of the VTS tests. Patch generated with: $ clang-format -i --style file -- Bug: 36311550 Test: compile Change-Id: I53dbcdabf959a6100e34a2ee4d0f951d525049cb --- audio/2.0/default/Device.cpp | 218 +++--- audio/2.0/default/ParametersUtil.cpp | 20 +- audio/2.0/default/PrimaryDevice.cpp | 100 +-- audio/2.0/default/StreamIn.cpp | 217 +++--- audio/2.0/default/StreamOut.cpp | 270 +++---- .../functional/AudioPrimaryHidlHalTest.cpp | 661 +++++++++++------- audio/2.0/vts/functional/utility/AssertOk.h | 25 +- 7 files changed, 847 insertions(+), 664 deletions(-) diff --git a/audio/2.0/default/Device.cpp b/audio/2.0/default/Device.cpp index da792384eb..9246f8b4e3 100644 --- a/audio/2.0/default/Device.cpp +++ b/audio/2.0/default/Device.cpp @@ -1,18 +1,18 @@ - /* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ +/* +* Copyright (C) 2016 The Android Open Source Project +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ #define LOG_TAG "DeviceHAL" //#define LOG_NDEBUG 0 @@ -92,7 +92,8 @@ Device::Device(audio_hw_device_t* device, const char* type) Device::~Device() { int status = audio_hw_device_close(mDevice); - ALOGW_IF(status, "Error closing audio hw device %p: %s", mDevice, strerror(-status)); + ALOGW_IF(status, "Error closing audio hw device %p: %s", mDevice, + strerror(-status)); mDevice = nullptr; } @@ -101,12 +102,18 @@ Result Device::analyzeStatus(const char* funcName, int status) { ALOGW("Device %p %s: %s", mDevice, funcName, strerror(-status)); } switch (status) { - case 0: return Result::OK; - case -EINVAL: return Result::INVALID_ARGUMENTS; - case -ENODATA: return Result::INVALID_STATE; - case -ENODEV: return Result::NOT_INITIALIZED; - case -ENOSYS: return Result::NOT_SUPPORTED; - default: return Result::INVALID_STATE; + case 0: + return Result::OK; + case -EINVAL: + return Result::INVALID_ARGUMENTS; + case -ENODATA: + return Result::INVALID_STATE; + case -ENODEV: + return Result::NOT_INITIALIZED; + case -ENOSYS: + return Result::NOT_SUPPORTED; + default: + return Result::INVALID_STATE; } } @@ -129,59 +136,64 @@ int Device::halSetParameters(const char* keysAndValues) { } // Methods from ::android::hardware::audio::V2_0::IDevice follow. -Return Device::initCheck() { +Return Device::initCheck() { return analyzeStatus("init_check", mDevice->init_check(mDevice)); } -Return Device::setMasterVolume(float volume) { +Return Device::setMasterVolume(float volume) { Result retval(Result::NOT_SUPPORTED); if (mDevice->set_master_volume != NULL) { - retval = analyzeStatus("set_master_volume", mDevice->set_master_volume(mDevice, volume)); + retval = analyzeStatus("set_master_volume", + mDevice->set_master_volume(mDevice, volume)); } return retval; } -Return Device::getMasterVolume(getMasterVolume_cb _hidl_cb) { +Return Device::getMasterVolume(getMasterVolume_cb _hidl_cb) { Result retval(Result::NOT_SUPPORTED); float volume = 0; if (mDevice->get_master_volume != NULL) { - retval = analyzeStatus("get_master_volume", mDevice->get_master_volume(mDevice, &volume)); + retval = analyzeStatus("get_master_volume", + mDevice->get_master_volume(mDevice, &volume)); } _hidl_cb(retval, volume); return Void(); } -Return Device::setMicMute(bool mute) { +Return Device::setMicMute(bool mute) { return analyzeStatus("set_mic_mute", mDevice->set_mic_mute(mDevice, mute)); } -Return Device::getMicMute(getMicMute_cb _hidl_cb) { +Return Device::getMicMute(getMicMute_cb _hidl_cb) { bool mute = false; - Result retval = analyzeStatus("get_mic_mute", mDevice->get_mic_mute(mDevice, &mute)); + Result retval = + analyzeStatus("get_mic_mute", mDevice->get_mic_mute(mDevice, &mute)); _hidl_cb(retval, mute); return Void(); } -Return Device::setMasterMute(bool mute) { +Return Device::setMasterMute(bool mute) { Result retval(Result::NOT_SUPPORTED); if (mDevice->set_master_mute != NULL) { - retval = analyzeStatus("set_master_mute", mDevice->set_master_mute(mDevice, mute)); + retval = analyzeStatus("set_master_mute", + mDevice->set_master_mute(mDevice, mute)); } return retval; } -Return Device::getMasterMute(getMasterMute_cb _hidl_cb) { +Return Device::getMasterMute(getMasterMute_cb _hidl_cb) { Result retval(Result::NOT_SUPPORTED); bool mute = false; if (mDevice->get_master_mute != NULL) { - retval = analyzeStatus("get_master_mute", mDevice->get_master_mute(mDevice, &mute)); + retval = analyzeStatus("get_master_mute", + mDevice->get_master_mute(mDevice, &mute)); } _hidl_cb(retval, mute); return Void(); } -Return Device::getInputBufferSize( - const AudioConfig& config, getInputBufferSize_cb _hidl_cb) { +Return Device::getInputBufferSize(const AudioConfig& config, + getInputBufferSize_cb _hidl_cb) { audio_config_t halConfig; HidlUtils::audioConfigToHal(config, &halConfig); size_t halBufferSize = mDevice->get_input_buffer_size(mDevice, &halConfig); @@ -195,29 +207,25 @@ Return Device::getInputBufferSize( return Void(); } -Return Device::openOutputStream( - int32_t ioHandle, - const DeviceAddress& device, - const AudioConfig& config, - AudioOutputFlag flags, - openOutputStream_cb _hidl_cb) { +Return Device::openOutputStream(int32_t ioHandle, + const DeviceAddress& device, + const AudioConfig& config, + AudioOutputFlag flags, + openOutputStream_cb _hidl_cb) { audio_config_t halConfig; HidlUtils::audioConfigToHal(config, &halConfig); - audio_stream_out_t *halStream; - ALOGV("open_output_stream handle: %d devices: %x flags: %#x " - "srate: %d format %#x channels %x address %s", - ioHandle, - static_cast(device.device), static_cast(flags), - halConfig.sample_rate, halConfig.format, halConfig.channel_mask, - deviceAddressToHal(device).c_str()); + audio_stream_out_t* halStream; + ALOGV( + "open_output_stream handle: %d devices: %x flags: %#x " + "srate: %d format %#x channels %x address %s", + ioHandle, static_cast(device.device), + static_cast(flags), halConfig.sample_rate, + halConfig.format, halConfig.channel_mask, + deviceAddressToHal(device).c_str()); int status = mDevice->open_output_stream( - mDevice, - ioHandle, - static_cast(device.device), - static_cast(flags), - &halConfig, - &halStream, - deviceAddressToHal(device).c_str()); + mDevice, ioHandle, static_cast(device.device), + static_cast(flags), &halConfig, &halStream, + deviceAddressToHal(device).c_str()); ALOGV("open_output_stream status %d stream %p", status, halStream); sp streamOut; if (status == OK) { @@ -225,35 +233,32 @@ Return Device::openOutputStream( } AudioConfig suggestedConfig; HidlUtils::audioConfigFromHal(halConfig, &suggestedConfig); - _hidl_cb(analyzeStatus("open_output_stream", status), streamOut, suggestedConfig); + _hidl_cb(analyzeStatus("open_output_stream", status), streamOut, + suggestedConfig); return Void(); } -Return Device::openInputStream( - int32_t ioHandle, - const DeviceAddress& device, - const AudioConfig& config, - AudioInputFlag flags, - AudioSource source, - openInputStream_cb _hidl_cb) { +Return Device::openInputStream(int32_t ioHandle, + const DeviceAddress& device, + const AudioConfig& config, + AudioInputFlag flags, AudioSource source, + openInputStream_cb _hidl_cb) { audio_config_t halConfig; HidlUtils::audioConfigToHal(config, &halConfig); - audio_stream_in_t *halStream; - ALOGV("open_input_stream handle: %d devices: %x flags: %#x " - "srate: %d format %#x channels %x address %s source %d", - ioHandle, - static_cast(device.device), static_cast(flags), - halConfig.sample_rate, halConfig.format, halConfig.channel_mask, - deviceAddressToHal(device).c_str(), static_cast(source)); + audio_stream_in_t* halStream; + ALOGV( + "open_input_stream handle: %d devices: %x flags: %#x " + "srate: %d format %#x channels %x address %s source %d", + ioHandle, static_cast(device.device), + static_cast(flags), halConfig.sample_rate, + halConfig.format, halConfig.channel_mask, + deviceAddressToHal(device).c_str(), + static_cast(source)); int status = mDevice->open_input_stream( - mDevice, - ioHandle, - static_cast(device.device), - &halConfig, - &halStream, - static_cast(flags), - deviceAddressToHal(device).c_str(), - static_cast(source)); + mDevice, ioHandle, static_cast(device.device), + &halConfig, &halStream, static_cast(flags), + deviceAddressToHal(device).c_str(), + static_cast(source)); ALOGV("open_input_stream status %d stream %p", status, halStream); sp streamIn; if (status == OK) { @@ -261,7 +266,8 @@ Return Device::openInputStream( } AudioConfig suggestedConfig; HidlUtils::audioConfigFromHal(halConfig, &suggestedConfig); - _hidl_cb(analyzeStatus("open_input_stream", status), streamIn, suggestedConfig); + _hidl_cb(analyzeStatus("open_input_stream", status), streamIn, + suggestedConfig); return Void(); } @@ -269,23 +275,21 @@ Return Device::supportsAudioPatches() { return version() >= AUDIO_DEVICE_API_VERSION_3_0; } -Return Device::createAudioPatch( - const hidl_vec& sources, - const hidl_vec& sinks, - createAudioPatch_cb _hidl_cb) { +Return Device::createAudioPatch(const hidl_vec& sources, + const hidl_vec& sinks, + createAudioPatch_cb _hidl_cb) { Result retval(Result::NOT_SUPPORTED); AudioPatchHandle patch = 0; if (version() >= AUDIO_DEVICE_API_VERSION_3_0) { - std::unique_ptr halSources(HidlUtils::audioPortConfigsToHal(sources)); - std::unique_ptr halSinks(HidlUtils::audioPortConfigsToHal(sinks)); + std::unique_ptr halSources( + HidlUtils::audioPortConfigsToHal(sources)); + std::unique_ptr halSinks( + HidlUtils::audioPortConfigsToHal(sinks)); audio_patch_handle_t halPatch = AUDIO_PATCH_HANDLE_NONE; retval = analyzeStatus( - "create_audio_patch", - mDevice->create_audio_patch( - mDevice, - sources.size(), &halSources[0], - sinks.size(), &halSinks[0], - &halPatch)); + "create_audio_patch", + mDevice->create_audio_patch(mDevice, sources.size(), &halSources[0], + sinks.size(), &halSinks[0], &halPatch)); if (retval == Result::OK) { patch = static_cast(halPatch); } @@ -294,19 +298,22 @@ Return Device::createAudioPatch( return Void(); } -Return Device::releaseAudioPatch(int32_t patch) { +Return Device::releaseAudioPatch(int32_t patch) { if (version() >= AUDIO_DEVICE_API_VERSION_3_0) { return analyzeStatus( - "release_audio_patch", - mDevice->release_audio_patch(mDevice, static_cast(patch))); + "release_audio_patch", + mDevice->release_audio_patch( + mDevice, static_cast(patch))); } return Result::NOT_SUPPORTED; } -Return Device::getAudioPort(const AudioPort& port, getAudioPort_cb _hidl_cb) { +Return Device::getAudioPort(const AudioPort& port, + getAudioPort_cb _hidl_cb) { audio_port halPort; HidlUtils::audioPortToHal(port, &halPort); - Result retval = analyzeStatus("get_audio_port", mDevice->get_audio_port(mDevice, &halPort)); + Result retval = analyzeStatus("get_audio_port", + mDevice->get_audio_port(mDevice, &halPort)); AudioPort resultPort = port; if (retval == Result::OK) { HidlUtils::audioPortFromHal(halPort, &resultPort); @@ -315,36 +322,39 @@ Return Device::getAudioPort(const AudioPort& port, getAudioPort_cb _hidl_c return Void(); } -Return Device::setAudioPortConfig(const AudioPortConfig& config) { +Return Device::setAudioPortConfig(const AudioPortConfig& config) { if (version() >= AUDIO_DEVICE_API_VERSION_3_0) { struct audio_port_config halPortConfig; HidlUtils::audioPortConfigToHal(config, &halPortConfig); return analyzeStatus( - "set_audio_port_config", mDevice->set_audio_port_config(mDevice, &halPortConfig)); + "set_audio_port_config", + mDevice->set_audio_port_config(mDevice, &halPortConfig)); } return Result::NOT_SUPPORTED; } -Return Device::getHwAvSync() { +Return Device::getHwAvSync() { int halHwAvSync; Result retval = getParam(AudioParameter::keyHwAvSync, &halHwAvSync); return retval == Result::OK ? halHwAvSync : AUDIO_HW_SYNC_INVALID; } -Return Device::setScreenState(bool turnedOn) { +Return Device::setScreenState(bool turnedOn) { return setParam(AudioParameter::keyScreenState, turnedOn); } -Return Device::getParameters(const hidl_vec& keys, getParameters_cb _hidl_cb) { +Return Device::getParameters(const hidl_vec& keys, + getParameters_cb _hidl_cb) { getParametersImpl(keys, _hidl_cb); return Void(); } -Return Device::setParameters(const hidl_vec& parameters) { +Return Device::setParameters( + const hidl_vec& parameters) { return setParametersImpl(parameters); } -Return Device::debugDump(const hidl_handle& fd) { +Return Device::debugDump(const hidl_handle& fd) { if (fd.getNativeHandle() != nullptr && fd->numFds == 1) { analyzeStatus("dump", mDevice->dump(mDevice, fd->data[0])); } diff --git a/audio/2.0/default/ParametersUtil.cpp b/audio/2.0/default/ParametersUtil.cpp index 75a60b9b64..0511557da3 100644 --- a/audio/2.0/default/ParametersUtil.cpp +++ b/audio/2.0/default/ParametersUtil.cpp @@ -51,8 +51,10 @@ Result ParametersUtil::getParam(const char* name, String8* value) { } void ParametersUtil::getParametersImpl( - const hidl_vec& keys, - std::function& parameters)> cb) { + const hidl_vec& keys, + std::function& parameters)> + cb) { AudioParameter halKeys; for (size_t i = 0; i < keys.size(); ++i) { halKeys.addKey(String8(keys[i].c_str())); @@ -79,9 +81,10 @@ void ParametersUtil::getParametersImpl( cb(retval, result); } -std::unique_ptr ParametersUtil::getParams(const AudioParameter& keys) { +std::unique_ptr ParametersUtil::getParams( + const AudioParameter& keys) { String8 paramsAndValues; - char *halValues = halGetParameters(keys.keysToString().string()); + char* halValues = halGetParameters(keys.keysToString().string()); if (halValues != NULL) { paramsAndValues.setTo(halValues); free(halValues); @@ -93,7 +96,8 @@ std::unique_ptr ParametersUtil::getParams(const AudioParameter& Result ParametersUtil::setParam(const char* name, bool value) { AudioParameter param; - param.add(String8(name), String8(value ? AudioParameter::valueOn : AudioParameter::valueOff)); + param.add(String8(name), String8(value ? AudioParameter::valueOn + : AudioParameter::valueOff)); return setParams(param); } @@ -109,10 +113,12 @@ Result ParametersUtil::setParam(const char* name, const char* value) { return setParams(param); } -Result ParametersUtil::setParametersImpl(const hidl_vec& parameters) { +Result ParametersUtil::setParametersImpl( + const hidl_vec& parameters) { AudioParameter params; for (size_t i = 0; i < parameters.size(); ++i) { - params.add(String8(parameters[i].key.c_str()), String8(parameters[i].value.c_str())); + params.add(String8(parameters[i].key.c_str()), + String8(parameters[i].value.c_str())); } return setParams(params); } diff --git a/audio/2.0/default/PrimaryDevice.cpp b/audio/2.0/default/PrimaryDevice.cpp index af0b249f72..6f2268a331 100644 --- a/audio/2.0/default/PrimaryDevice.cpp +++ b/audio/2.0/default/PrimaryDevice.cpp @@ -30,56 +30,52 @@ PrimaryDevice::PrimaryDevice(audio_hw_device_t* device) PrimaryDevice::~PrimaryDevice() {} // Methods from ::android::hardware::audio::V2_0::IDevice follow. -Return PrimaryDevice::initCheck() { +Return PrimaryDevice::initCheck() { return mDevice->initCheck(); } -Return PrimaryDevice::setMasterVolume(float volume) { +Return PrimaryDevice::setMasterVolume(float volume) { return mDevice->setMasterVolume(volume); } -Return PrimaryDevice::getMasterVolume(getMasterVolume_cb _hidl_cb) { +Return PrimaryDevice::getMasterVolume(getMasterVolume_cb _hidl_cb) { return mDevice->getMasterVolume(_hidl_cb); } -Return PrimaryDevice::setMicMute(bool mute) { +Return PrimaryDevice::setMicMute(bool mute) { return mDevice->setMicMute(mute); } -Return PrimaryDevice::getMicMute(getMicMute_cb _hidl_cb) { +Return PrimaryDevice::getMicMute(getMicMute_cb _hidl_cb) { return mDevice->getMicMute(_hidl_cb); } -Return PrimaryDevice::setMasterMute(bool mute) { +Return PrimaryDevice::setMasterMute(bool mute) { return mDevice->setMasterMute(mute); } -Return PrimaryDevice::getMasterMute(getMasterMute_cb _hidl_cb) { +Return PrimaryDevice::getMasterMute(getMasterMute_cb _hidl_cb) { return mDevice->getMasterMute(_hidl_cb); } -Return PrimaryDevice::getInputBufferSize( - const AudioConfig& config, getInputBufferSize_cb _hidl_cb) { +Return PrimaryDevice::getInputBufferSize(const AudioConfig& config, + getInputBufferSize_cb _hidl_cb) { return mDevice->getInputBufferSize(config, _hidl_cb); } -Return PrimaryDevice::openOutputStream( - int32_t ioHandle, - const DeviceAddress& device, - const AudioConfig& config, - AudioOutputFlag flags, - openOutputStream_cb _hidl_cb) { +Return PrimaryDevice::openOutputStream(int32_t ioHandle, + const DeviceAddress& device, + const AudioConfig& config, + AudioOutputFlag flags, + openOutputStream_cb _hidl_cb) { return mDevice->openOutputStream(ioHandle, device, config, flags, _hidl_cb); } Return PrimaryDevice::openInputStream( - int32_t ioHandle, - const DeviceAddress& device, - const AudioConfig& config, - AudioInputFlag flags, - AudioSource source, - openInputStream_cb _hidl_cb) { - return mDevice->openInputStream(ioHandle, device, config, flags, source, _hidl_cb); + int32_t ioHandle, const DeviceAddress& device, const AudioConfig& config, + AudioInputFlag flags, AudioSource source, openInputStream_cb _hidl_cb) { + return mDevice->openInputStream(ioHandle, device, config, flags, source, + _hidl_cb); } Return PrimaryDevice::supportsAudioPatches() { @@ -87,82 +83,85 @@ Return PrimaryDevice::supportsAudioPatches() { } Return PrimaryDevice::createAudioPatch( - const hidl_vec& sources, - const hidl_vec& sinks, - createAudioPatch_cb _hidl_cb) { + const hidl_vec& sources, + const hidl_vec& sinks, createAudioPatch_cb _hidl_cb) { return mDevice->createAudioPatch(sources, sinks, _hidl_cb); } -Return PrimaryDevice::releaseAudioPatch(int32_t patch) { +Return PrimaryDevice::releaseAudioPatch(int32_t patch) { return mDevice->releaseAudioPatch(patch); } -Return PrimaryDevice::getAudioPort(const AudioPort& port, getAudioPort_cb _hidl_cb) { +Return PrimaryDevice::getAudioPort(const AudioPort& port, + getAudioPort_cb _hidl_cb) { return mDevice->getAudioPort(port, _hidl_cb); } -Return PrimaryDevice::setAudioPortConfig(const AudioPortConfig& config) { +Return PrimaryDevice::setAudioPortConfig( + const AudioPortConfig& config) { return mDevice->setAudioPortConfig(config); } -Return PrimaryDevice::getHwAvSync() { +Return PrimaryDevice::getHwAvSync() { return mDevice->getHwAvSync(); } -Return PrimaryDevice::setScreenState(bool turnedOn) { +Return PrimaryDevice::setScreenState(bool turnedOn) { return mDevice->setScreenState(turnedOn); } -Return PrimaryDevice::getParameters( - const hidl_vec& keys, getParameters_cb _hidl_cb) { +Return PrimaryDevice::getParameters(const hidl_vec& keys, + getParameters_cb _hidl_cb) { return mDevice->getParameters(keys, _hidl_cb); } -Return PrimaryDevice::setParameters(const hidl_vec& parameters) { +Return PrimaryDevice::setParameters( + const hidl_vec& parameters) { return mDevice->setParameters(parameters); } -Return PrimaryDevice::debugDump(const hidl_handle& fd) { +Return PrimaryDevice::debugDump(const hidl_handle& fd) { return mDevice->debugDump(fd); } - // Methods from ::android::hardware::audio::V2_0::IPrimaryDevice follow. -Return PrimaryDevice::setVoiceVolume(float volume) { +Return PrimaryDevice::setVoiceVolume(float volume) { return mDevice->analyzeStatus( - "set_voice_volume", - mDevice->device()->set_voice_volume(mDevice->device(), volume)); + "set_voice_volume", + mDevice->device()->set_voice_volume(mDevice->device(), volume)); } -Return PrimaryDevice::setMode(AudioMode mode) { +Return PrimaryDevice::setMode(AudioMode mode) { return mDevice->analyzeStatus( - "set_mode", - mDevice->device()->set_mode(mDevice->device(), static_cast(mode))); + "set_mode", mDevice->device()->set_mode( + mDevice->device(), static_cast(mode))); } -Return PrimaryDevice::getBtScoNrecEnabled(getBtScoNrecEnabled_cb _hidl_cb) { +Return PrimaryDevice::getBtScoNrecEnabled( + getBtScoNrecEnabled_cb _hidl_cb) { bool enabled; Result retval = mDevice->getParam(AudioParameter::keyBtNrec, &enabled); _hidl_cb(retval, enabled); return Void(); } -Return PrimaryDevice::setBtScoNrecEnabled(bool enabled) { +Return PrimaryDevice::setBtScoNrecEnabled(bool enabled) { return mDevice->setParam(AudioParameter::keyBtNrec, enabled); } -Return PrimaryDevice::getBtScoWidebandEnabled(getBtScoWidebandEnabled_cb _hidl_cb) { +Return PrimaryDevice::getBtScoWidebandEnabled( + getBtScoWidebandEnabled_cb _hidl_cb) { bool enabled; Result retval = mDevice->getParam(AUDIO_PARAMETER_KEY_BT_SCO_WB, &enabled); _hidl_cb(retval, enabled); return Void(); } -Return PrimaryDevice::setBtScoWidebandEnabled(bool enabled) { +Return PrimaryDevice::setBtScoWidebandEnabled(bool enabled) { return mDevice->setParam(AUDIO_PARAMETER_KEY_BT_SCO_WB, enabled); } -Return PrimaryDevice::getTtyMode(getTtyMode_cb _hidl_cb) { +Return PrimaryDevice::getTtyMode(getTtyMode_cb _hidl_cb) { int halMode; Result retval = mDevice->getParam(AUDIO_PARAMETER_KEY_TTY_MODE, &halMode); TtyMode mode = retval == Result::OK ? TtyMode(halMode) : TtyMode::OFF; @@ -170,18 +169,19 @@ Return PrimaryDevice::getTtyMode(getTtyMode_cb _hidl_cb) { return Void(); } -Return PrimaryDevice::setTtyMode(IPrimaryDevice::TtyMode mode) { - return mDevice->setParam(AUDIO_PARAMETER_KEY_TTY_MODE, static_cast(mode)); +Return PrimaryDevice::setTtyMode(IPrimaryDevice::TtyMode mode) { + return mDevice->setParam(AUDIO_PARAMETER_KEY_TTY_MODE, + static_cast(mode)); } -Return PrimaryDevice::getHacEnabled(getHacEnabled_cb _hidl_cb) { +Return PrimaryDevice::getHacEnabled(getHacEnabled_cb _hidl_cb) { bool enabled; Result retval = mDevice->getParam(AUDIO_PARAMETER_KEY_HAC, &enabled); _hidl_cb(retval, enabled); return Void(); } -Return PrimaryDevice::setHacEnabled(bool enabled) { +Return PrimaryDevice::setHacEnabled(bool enabled) { return mDevice->setParam(AUDIO_PARAMETER_KEY_HAC, enabled); } diff --git a/audio/2.0/default/StreamIn.cpp b/audio/2.0/default/StreamIn.cpp index e5a1a55524..2262697cde 100644 --- a/audio/2.0/default/StreamIn.cpp +++ b/audio/2.0/default/StreamIn.cpp @@ -20,8 +20,8 @@ #include #include -#include #include +#include #include "StreamIn.h" @@ -38,30 +38,26 @@ using ::android::hardware::audio::common::V2_0::ThreadInfo; namespace { class ReadThread : public Thread { - public: + public: // ReadThread's lifespan never exceeds StreamIn's lifespan. - ReadThread(std::atomic* stop, - audio_stream_in_t* stream, - StreamIn::CommandMQ* commandMQ, - StreamIn::DataMQ* dataMQ, - StreamIn::StatusMQ* statusMQ, - EventFlag* efGroup) - : Thread(false /*canCallJava*/), - mStop(stop), - mStream(stream), - mCommandMQ(commandMQ), - mDataMQ(dataMQ), - mStatusMQ(statusMQ), - mEfGroup(efGroup), - mBuffer(nullptr) { - } + ReadThread(std::atomic* stop, audio_stream_in_t* stream, + StreamIn::CommandMQ* commandMQ, StreamIn::DataMQ* dataMQ, + StreamIn::StatusMQ* statusMQ, EventFlag* efGroup) + : Thread(false /*canCallJava*/), + mStop(stop), + mStream(stream), + mCommandMQ(commandMQ), + mDataMQ(dataMQ), + mStatusMQ(statusMQ), + mEfGroup(efGroup), + mBuffer(nullptr) {} bool init() { - mBuffer.reset(new(std::nothrow) uint8_t[mDataMQ->getQuantumCount()]); + mBuffer.reset(new (std::nothrow) uint8_t[mDataMQ->getQuantumCount()]); return mBuffer != nullptr; } virtual ~ReadThread() {} - private: + private: std::atomic* mStop; audio_stream_in_t* mStream; StreamIn::CommandMQ* mCommandMQ; @@ -82,8 +78,10 @@ void ReadThread::doRead() { size_t availableToWrite = mDataMQ->availableToWrite(); size_t requestedToRead = mParameters.params.read; if (requestedToRead > availableToWrite) { - ALOGW("truncating read data from %d to %d due to insufficient data queue space", - (int32_t)requestedToRead, (int32_t)availableToWrite); + ALOGW( + "truncating read data from %d to %d due to insufficient data queue " + "space", + (int32_t)requestedToRead, (int32_t)availableToWrite); requestedToRead = availableToWrite; } ssize_t readResult = mStream->read(mStream, &mBuffer[0], requestedToRead); @@ -101,16 +99,20 @@ void ReadThread::doRead() { void ReadThread::doGetCapturePosition() { mStatus.retval = StreamIn::getCapturePositionImpl( - mStream, &mStatus.reply.capturePosition.frames, &mStatus.reply.capturePosition.time); + mStream, &mStatus.reply.capturePosition.frames, + &mStatus.reply.capturePosition.time); } bool ReadThread::threadLoop() { - // This implementation doesn't return control back to the Thread until it decides to stop, + // This implementation doesn't return control back to the Thread until it + // decides to stop, // as the Thread uses mutexes, and this can lead to priority inversion. - while(!std::atomic_load_explicit(mStop, std::memory_order_acquire)) { + while (!std::atomic_load_explicit(mStop, std::memory_order_acquire)) { uint32_t efState = 0; - mEfGroup->wait(static_cast(MessageQueueFlagBits::NOT_FULL), &efState); - if (!(efState & static_cast(MessageQueueFlagBits::NOT_FULL))) { + mEfGroup->wait(static_cast(MessageQueueFlagBits::NOT_FULL), + &efState); + if (!(efState & + static_cast(MessageQueueFlagBits::NOT_FULL))) { continue; // Nothing to do. } if (!mCommandMQ->read(&mParameters)) { @@ -125,7 +127,8 @@ bool ReadThread::threadLoop() { doGetCapturePosition(); break; default: - ALOGE("Unknown read thread command code %d", mParameters.command); + ALOGE("Unknown read thread command code %d", + mParameters.command); mStatus.retval = Result::NOT_SUPPORTED; break; } @@ -141,11 +144,13 @@ bool ReadThread::threadLoop() { } // namespace StreamIn::StreamIn(const sp& device, audio_stream_in_t* stream) - : mIsClosed(false), mDevice(device), mStream(stream), - mStreamCommon(new Stream(&stream->common)), - mStreamMmap(new StreamMmap(stream)), - mEfGroup(nullptr), mStopReadThread(false) { -} + : mIsClosed(false), + mDevice(device), + mStream(stream), + mStreamCommon(new Stream(&stream->common)), + mStreamMmap(new StreamMmap(stream)), + mEfGroup(nullptr), + mStopReadThread(false) {} StreamIn::~StreamIn() { ATRACE_CALL(); @@ -157,102 +162,108 @@ StreamIn::~StreamIn() { } if (mEfGroup) { status_t status = EventFlag::deleteEventFlag(&mEfGroup); - ALOGE_IF(status, "read MQ event flag deletion error: %s", strerror(-status)); + ALOGE_IF(status, "read MQ event flag deletion error: %s", + strerror(-status)); } mDevice->closeInputStream(mStream); mStream = nullptr; } // Methods from ::android::hardware::audio::V2_0::IStream follow. -Return StreamIn::getFrameSize() { +Return StreamIn::getFrameSize() { return audio_stream_in_frame_size(mStream); } -Return StreamIn::getFrameCount() { +Return StreamIn::getFrameCount() { return mStreamCommon->getFrameCount(); } -Return StreamIn::getBufferSize() { +Return StreamIn::getBufferSize() { return mStreamCommon->getBufferSize(); } -Return StreamIn::getSampleRate() { +Return StreamIn::getSampleRate() { return mStreamCommon->getSampleRate(); } -Return StreamIn::getSupportedSampleRates(getSupportedSampleRates_cb _hidl_cb) { +Return StreamIn::getSupportedSampleRates( + getSupportedSampleRates_cb _hidl_cb) { return mStreamCommon->getSupportedSampleRates(_hidl_cb); } -Return StreamIn::setSampleRate(uint32_t sampleRateHz) { +Return StreamIn::setSampleRate(uint32_t sampleRateHz) { return mStreamCommon->setSampleRate(sampleRateHz); } -Return StreamIn::getChannelMask() { +Return StreamIn::getChannelMask() { return mStreamCommon->getChannelMask(); } -Return StreamIn::getSupportedChannelMasks(getSupportedChannelMasks_cb _hidl_cb) { +Return StreamIn::getSupportedChannelMasks( + getSupportedChannelMasks_cb _hidl_cb) { return mStreamCommon->getSupportedChannelMasks(_hidl_cb); } -Return StreamIn::setChannelMask(AudioChannelMask mask) { +Return StreamIn::setChannelMask(AudioChannelMask mask) { return mStreamCommon->setChannelMask(mask); } -Return StreamIn::getFormat() { +Return StreamIn::getFormat() { return mStreamCommon->getFormat(); } -Return StreamIn::getSupportedFormats(getSupportedFormats_cb _hidl_cb) { +Return StreamIn::getSupportedFormats(getSupportedFormats_cb _hidl_cb) { return mStreamCommon->getSupportedFormats(_hidl_cb); } -Return StreamIn::setFormat(AudioFormat format) { +Return StreamIn::setFormat(AudioFormat format) { return mStreamCommon->setFormat(format); } -Return StreamIn::getAudioProperties(getAudioProperties_cb _hidl_cb) { +Return StreamIn::getAudioProperties(getAudioProperties_cb _hidl_cb) { return mStreamCommon->getAudioProperties(_hidl_cb); } -Return StreamIn::addEffect(uint64_t effectId) { +Return StreamIn::addEffect(uint64_t effectId) { return mStreamCommon->addEffect(effectId); } -Return StreamIn::removeEffect(uint64_t effectId) { +Return StreamIn::removeEffect(uint64_t effectId) { return mStreamCommon->removeEffect(effectId); } -Return StreamIn::standby() { +Return StreamIn::standby() { return mStreamCommon->standby(); } -Return StreamIn::getDevice() { +Return StreamIn::getDevice() { return mStreamCommon->getDevice(); } -Return StreamIn::setDevice(const DeviceAddress& address) { +Return StreamIn::setDevice(const DeviceAddress& address) { return mStreamCommon->setDevice(address); } -Return StreamIn::setConnectedState(const DeviceAddress& address, bool connected) { +Return StreamIn::setConnectedState(const DeviceAddress& address, + bool connected) { return mStreamCommon->setConnectedState(address, connected); } -Return StreamIn::setHwAvSync(uint32_t hwAvSync) { +Return StreamIn::setHwAvSync(uint32_t hwAvSync) { return mStreamCommon->setHwAvSync(hwAvSync); } -Return StreamIn::getParameters(const hidl_vec& keys, getParameters_cb _hidl_cb) { +Return StreamIn::getParameters(const hidl_vec& keys, + getParameters_cb _hidl_cb) { return mStreamCommon->getParameters(keys, _hidl_cb); } -Return StreamIn::setParameters(const hidl_vec& parameters) { +Return StreamIn::setParameters( + const hidl_vec& parameters) { return mStreamCommon->setParameters(parameters); } -Return StreamIn::debugDump(const hidl_handle& fd) { +Return StreamIn::debugDump(const hidl_handle& fd) { return mStreamCommon->debugDump(fd); } @@ -264,16 +275,17 @@ Return StreamIn::stop() { return mStreamMmap->stop(); } -Return StreamIn::createMmapBuffer(int32_t minSizeFrames, createMmapBuffer_cb _hidl_cb) { +Return StreamIn::createMmapBuffer(int32_t minSizeFrames, + createMmapBuffer_cb _hidl_cb) { return mStreamMmap->createMmapBuffer( - minSizeFrames, audio_stream_in_frame_size(mStream), _hidl_cb); + minSizeFrames, audio_stream_in_frame_size(mStream), _hidl_cb); } Return StreamIn::getMmapPosition(getMmapPosition_cb _hidl_cb) { return mStreamMmap->getMmapPosition(_hidl_cb); } -Return StreamIn::close() { +Return StreamIn::close() { if (mIsClosed) return Result::INVALID_STATE; mIsClosed = true; if (mReadThread.get()) { @@ -286,9 +298,10 @@ Return StreamIn::close() { } // Methods from ::android::hardware::audio::V2_0::IStreamIn follow. -Return StreamIn::getAudioSource(getAudioSource_cb _hidl_cb) { +Return StreamIn::getAudioSource(getAudioSource_cb _hidl_cb) { int halSource; - Result retval = mStreamCommon->getParam(AudioParameter::keyInputSource, &halSource); + Result retval = + mStreamCommon->getParam(AudioParameter::keyInputSource, &halSource); AudioSource source(AudioSource::DEFAULT); if (retval == Result::OK) { source = AudioSource(halSource); @@ -297,68 +310,69 @@ Return StreamIn::getAudioSource(getAudioSource_cb _hidl_cb) { return Void(); } -Return StreamIn::setGain(float gain) { +Return StreamIn::setGain(float gain) { return Stream::analyzeStatus("set_gain", mStream->set_gain(mStream, gain)); } -Return StreamIn::prepareForReading( - uint32_t frameSize, uint32_t framesCount, prepareForReading_cb _hidl_cb) { +Return StreamIn::prepareForReading(uint32_t frameSize, + uint32_t framesCount, + prepareForReading_cb _hidl_cb) { status_t status; - ThreadInfo threadInfo = { 0, 0 }; + ThreadInfo threadInfo = {0, 0}; // Create message queues. if (mDataMQ) { ALOGE("the client attempts to call prepareForReading twice"); - _hidl_cb(Result::INVALID_STATE, - CommandMQ::Descriptor(), DataMQ::Descriptor(), StatusMQ::Descriptor(), threadInfo); + _hidl_cb(Result::INVALID_STATE, CommandMQ::Descriptor(), + DataMQ::Descriptor(), StatusMQ::Descriptor(), threadInfo); return Void(); } std::unique_ptr tempCommandMQ(new CommandMQ(1)); if (frameSize > std::numeric_limits::max() / framesCount) { - ALOGE("Requested buffer is too big, %d*%d can not fit in size_t", frameSize, framesCount); - _hidl_cb(Result::INVALID_ARGUMENTS, - CommandMQ::Descriptor(), DataMQ::Descriptor(), StatusMQ::Descriptor(), threadInfo); + ALOGE("Requested buffer is too big, %d*%d can not fit in size_t", + frameSize, framesCount); + _hidl_cb(Result::INVALID_ARGUMENTS, CommandMQ::Descriptor(), + DataMQ::Descriptor(), StatusMQ::Descriptor(), threadInfo); return Void(); } - std::unique_ptr tempDataMQ(new DataMQ(frameSize * framesCount, true /* EventFlag */)); + std::unique_ptr tempDataMQ( + new DataMQ(frameSize * framesCount, true /* EventFlag */)); std::unique_ptr tempStatusMQ(new StatusMQ(1)); - if (!tempCommandMQ->isValid() || !tempDataMQ->isValid() || !tempStatusMQ->isValid()) { + if (!tempCommandMQ->isValid() || !tempDataMQ->isValid() || + !tempStatusMQ->isValid()) { ALOGE_IF(!tempCommandMQ->isValid(), "command MQ is invalid"); ALOGE_IF(!tempDataMQ->isValid(), "data MQ is invalid"); ALOGE_IF(!tempStatusMQ->isValid(), "status MQ is invalid"); - _hidl_cb(Result::INVALID_ARGUMENTS, - CommandMQ::Descriptor(), DataMQ::Descriptor(), StatusMQ::Descriptor(), threadInfo); + _hidl_cb(Result::INVALID_ARGUMENTS, CommandMQ::Descriptor(), + DataMQ::Descriptor(), StatusMQ::Descriptor(), threadInfo); return Void(); } EventFlag* tempRawEfGroup{}; - status = EventFlag::createEventFlag(tempDataMQ->getEventFlagWord(), &tempRawEfGroup); - std::unique_ptr tempElfGroup(tempRawEfGroup, [](auto *ef) { - EventFlag::deleteEventFlag(&ef); }); + status = EventFlag::createEventFlag(tempDataMQ->getEventFlagWord(), + &tempRawEfGroup); + std::unique_ptr tempElfGroup( + tempRawEfGroup, [](auto* ef) { EventFlag::deleteEventFlag(&ef); }); if (status != OK || !tempElfGroup) { ALOGE("failed creating event flag for data MQ: %s", strerror(-status)); - _hidl_cb(Result::INVALID_ARGUMENTS, - CommandMQ::Descriptor(), DataMQ::Descriptor(), StatusMQ::Descriptor(), threadInfo); + _hidl_cb(Result::INVALID_ARGUMENTS, CommandMQ::Descriptor(), + DataMQ::Descriptor(), StatusMQ::Descriptor(), threadInfo); return Void(); } // Create and launch the thread. auto tempReadThread = std::make_unique( - &mStopReadThread, - mStream, - tempCommandMQ.get(), - tempDataMQ.get(), - tempStatusMQ.get(), - tempElfGroup.get()); + &mStopReadThread, mStream, tempCommandMQ.get(), tempDataMQ.get(), + tempStatusMQ.get(), tempElfGroup.get()); if (!tempReadThread->init()) { - _hidl_cb(Result::INVALID_ARGUMENTS, - CommandMQ::Descriptor(), DataMQ::Descriptor(), StatusMQ::Descriptor(), threadInfo); + _hidl_cb(Result::INVALID_ARGUMENTS, CommandMQ::Descriptor(), + DataMQ::Descriptor(), StatusMQ::Descriptor(), threadInfo); return Void(); } status = tempReadThread->run("reader", PRIORITY_URGENT_AUDIO); if (status != OK) { ALOGW("failed to start reader thread: %s", strerror(-status)); - _hidl_cb(Result::INVALID_ARGUMENTS, - CommandMQ::Descriptor(), DataMQ::Descriptor(), StatusMQ::Descriptor(), threadInfo); + _hidl_cb(Result::INVALID_ARGUMENTS, CommandMQ::Descriptor(), + DataMQ::Descriptor(), StatusMQ::Descriptor(), threadInfo); return Void(); } @@ -369,28 +383,27 @@ Return StreamIn::prepareForReading( mEfGroup = tempElfGroup.release(); threadInfo.pid = getpid(); threadInfo.tid = mReadThread->getTid(); - _hidl_cb(Result::OK, - *mCommandMQ->getDesc(), *mDataMQ->getDesc(), *mStatusMQ->getDesc(), - threadInfo); + _hidl_cb(Result::OK, *mCommandMQ->getDesc(), *mDataMQ->getDesc(), + *mStatusMQ->getDesc(), threadInfo); return Void(); } -Return StreamIn::getInputFramesLost() { +Return StreamIn::getInputFramesLost() { return mStream->get_input_frames_lost(mStream); } // static -Result StreamIn::getCapturePositionImpl( - audio_stream_in_t *stream, uint64_t *frames, uint64_t *time) { +Result StreamIn::getCapturePositionImpl(audio_stream_in_t* stream, + uint64_t* frames, uint64_t* time) { Result retval(Result::NOT_SUPPORTED); if (stream->get_capture_position != NULL) return retval; int64_t halFrames, halTime; retval = Stream::analyzeStatus( - "get_capture_position", - stream->get_capture_position(stream, &halFrames, &halTime), - // HAL may have a stub function, always returning ENOSYS, don't - // spam the log in this case. - ENOSYS); + "get_capture_position", + stream->get_capture_position(stream, &halFrames, &halTime), + // HAL may have a stub function, always returning ENOSYS, don't + // spam the log in this case. + ENOSYS); if (retval == Result::OK) { *frames = halFrames; *time = halTime; @@ -398,14 +411,14 @@ Result StreamIn::getCapturePositionImpl( return retval; }; -Return StreamIn::getCapturePosition(getCapturePosition_cb _hidl_cb) { +Return StreamIn::getCapturePosition(getCapturePosition_cb _hidl_cb) { uint64_t frames = 0, time = 0; Result retval = getCapturePositionImpl(mStream, &frames, &time); _hidl_cb(retval, frames, time); return Void(); } -} // namespace implementation +} // namespace implementation } // namespace V2_0 } // namespace audio } // namespace hardware diff --git a/audio/2.0/default/StreamOut.cpp b/audio/2.0/default/StreamOut.cpp index 3339b63006..63b9ae352c 100644 --- a/audio/2.0/default/StreamOut.cpp +++ b/audio/2.0/default/StreamOut.cpp @@ -37,30 +37,26 @@ using ::android::hardware::audio::common::V2_0::ThreadInfo; namespace { class WriteThread : public Thread { - public: + public: // WriteThread's lifespan never exceeds StreamOut's lifespan. - WriteThread(std::atomic* stop, - audio_stream_out_t* stream, - StreamOut::CommandMQ* commandMQ, - StreamOut::DataMQ* dataMQ, - StreamOut::StatusMQ* statusMQ, - EventFlag* efGroup) - : Thread(false /*canCallJava*/), - mStop(stop), - mStream(stream), - mCommandMQ(commandMQ), - mDataMQ(dataMQ), - mStatusMQ(statusMQ), - mEfGroup(efGroup), - mBuffer(nullptr) { - } + WriteThread(std::atomic* stop, audio_stream_out_t* stream, + StreamOut::CommandMQ* commandMQ, StreamOut::DataMQ* dataMQ, + StreamOut::StatusMQ* statusMQ, EventFlag* efGroup) + : Thread(false /*canCallJava*/), + mStop(stop), + mStream(stream), + mCommandMQ(commandMQ), + mDataMQ(dataMQ), + mStatusMQ(statusMQ), + mEfGroup(efGroup), + mBuffer(nullptr) {} bool init() { - mBuffer.reset(new(std::nothrow) uint8_t[mDataMQ->getQuantumCount()]); + mBuffer.reset(new (std::nothrow) uint8_t[mDataMQ->getQuantumCount()]); return mBuffer != nullptr; } virtual ~WriteThread() {} - private: + private: std::atomic* mStop; audio_stream_out_t* mStream; StreamOut::CommandMQ* mCommandMQ; @@ -93,9 +89,8 @@ void WriteThread::doWrite() { void WriteThread::doGetPresentationPosition() { mStatus.retval = StreamOut::getPresentationPositionImpl( - mStream, - &mStatus.reply.presentationPosition.frames, - &mStatus.reply.presentationPosition.timeStamp); + mStream, &mStatus.reply.presentationPosition.frames, + &mStatus.reply.presentationPosition.timeStamp); } void WriteThread::doGetLatency() { @@ -104,12 +99,15 @@ void WriteThread::doGetLatency() { } bool WriteThread::threadLoop() { - // This implementation doesn't return control back to the Thread until it decides to stop, + // This implementation doesn't return control back to the Thread until it + // decides to stop, // as the Thread uses mutexes, and this can lead to priority inversion. - while(!std::atomic_load_explicit(mStop, std::memory_order_acquire)) { + while (!std::atomic_load_explicit(mStop, std::memory_order_acquire)) { uint32_t efState = 0; - mEfGroup->wait(static_cast(MessageQueueFlagBits::NOT_EMPTY), &efState); - if (!(efState & static_cast(MessageQueueFlagBits::NOT_EMPTY))) { + mEfGroup->wait(static_cast(MessageQueueFlagBits::NOT_EMPTY), + &efState); + if (!(efState & + static_cast(MessageQueueFlagBits::NOT_EMPTY))) { continue; // Nothing to do. } if (!mCommandMQ->read(&mStatus.replyTo)) { @@ -142,11 +140,13 @@ bool WriteThread::threadLoop() { } // namespace StreamOut::StreamOut(const sp& device, audio_stream_out_t* stream) - : mIsClosed(false), mDevice(device), mStream(stream), - mStreamCommon(new Stream(&stream->common)), - mStreamMmap(new StreamMmap(stream)), - mEfGroup(nullptr), mStopWriteThread(false) { -} + : mIsClosed(false), + mDevice(device), + mStream(stream), + mStreamCommon(new Stream(&stream->common)), + mStreamMmap(new StreamMmap(stream)), + mEfGroup(nullptr), + mStopWriteThread(false) {} StreamOut::~StreamOut() { ATRACE_CALL(); @@ -158,7 +158,8 @@ StreamOut::~StreamOut() { } if (mEfGroup) { status_t status = EventFlag::deleteEventFlag(&mEfGroup); - ALOGE_IF(status, "write MQ event flag deletion error: %s", strerror(-status)); + ALOGE_IF(status, "write MQ event flag deletion error: %s", + strerror(-status)); } mCallback.clear(); mDevice->closeOutputStream(mStream); @@ -166,100 +167,104 @@ StreamOut::~StreamOut() { } // Methods from ::android::hardware::audio::V2_0::IStream follow. -Return StreamOut::getFrameSize() { +Return StreamOut::getFrameSize() { return audio_stream_out_frame_size(mStream); } -Return StreamOut::getFrameCount() { +Return StreamOut::getFrameCount() { return mStreamCommon->getFrameCount(); } -Return StreamOut::getBufferSize() { +Return StreamOut::getBufferSize() { return mStreamCommon->getBufferSize(); } -Return StreamOut::getSampleRate() { +Return StreamOut::getSampleRate() { return mStreamCommon->getSampleRate(); } -Return StreamOut::getSupportedSampleRates(getSupportedSampleRates_cb _hidl_cb) { +Return StreamOut::getSupportedSampleRates( + getSupportedSampleRates_cb _hidl_cb) { return mStreamCommon->getSupportedSampleRates(_hidl_cb); } -Return StreamOut::setSampleRate(uint32_t sampleRateHz) { +Return StreamOut::setSampleRate(uint32_t sampleRateHz) { return mStreamCommon->setSampleRate(sampleRateHz); } -Return StreamOut::getChannelMask() { +Return StreamOut::getChannelMask() { return mStreamCommon->getChannelMask(); } -Return StreamOut::getSupportedChannelMasks(getSupportedChannelMasks_cb _hidl_cb) { +Return StreamOut::getSupportedChannelMasks( + getSupportedChannelMasks_cb _hidl_cb) { return mStreamCommon->getSupportedChannelMasks(_hidl_cb); } -Return StreamOut::setChannelMask(AudioChannelMask mask) { +Return StreamOut::setChannelMask(AudioChannelMask mask) { return mStreamCommon->setChannelMask(mask); } -Return StreamOut::getFormat() { +Return StreamOut::getFormat() { return mStreamCommon->getFormat(); } -Return StreamOut::getSupportedFormats(getSupportedFormats_cb _hidl_cb) { +Return StreamOut::getSupportedFormats(getSupportedFormats_cb _hidl_cb) { return mStreamCommon->getSupportedFormats(_hidl_cb); } -Return StreamOut::setFormat(AudioFormat format) { +Return StreamOut::setFormat(AudioFormat format) { return mStreamCommon->setFormat(format); } -Return StreamOut::getAudioProperties(getAudioProperties_cb _hidl_cb) { +Return StreamOut::getAudioProperties(getAudioProperties_cb _hidl_cb) { return mStreamCommon->getAudioProperties(_hidl_cb); } -Return StreamOut::addEffect(uint64_t effectId) { +Return StreamOut::addEffect(uint64_t effectId) { return mStreamCommon->addEffect(effectId); } -Return StreamOut::removeEffect(uint64_t effectId) { +Return StreamOut::removeEffect(uint64_t effectId) { return mStreamCommon->removeEffect(effectId); } -Return StreamOut::standby() { +Return StreamOut::standby() { return mStreamCommon->standby(); } -Return StreamOut::getDevice() { +Return StreamOut::getDevice() { return mStreamCommon->getDevice(); } -Return StreamOut::setDevice(const DeviceAddress& address) { +Return StreamOut::setDevice(const DeviceAddress& address) { return mStreamCommon->setDevice(address); } -Return StreamOut::setConnectedState(const DeviceAddress& address, bool connected) { +Return StreamOut::setConnectedState(const DeviceAddress& address, + bool connected) { return mStreamCommon->setConnectedState(address, connected); } -Return StreamOut::setHwAvSync(uint32_t hwAvSync) { +Return StreamOut::setHwAvSync(uint32_t hwAvSync) { return mStreamCommon->setHwAvSync(hwAvSync); } -Return StreamOut::getParameters( - const hidl_vec& keys, getParameters_cb _hidl_cb) { +Return StreamOut::getParameters(const hidl_vec& keys, + getParameters_cb _hidl_cb) { return mStreamCommon->getParameters(keys, _hidl_cb); } -Return StreamOut::setParameters(const hidl_vec& parameters) { +Return StreamOut::setParameters( + const hidl_vec& parameters) { return mStreamCommon->setParameters(parameters); } -Return StreamOut::debugDump(const hidl_handle& fd) { +Return StreamOut::debugDump(const hidl_handle& fd) { return mStreamCommon->debugDump(fd); } -Return StreamOut::close() { +Return StreamOut::close() { if (mIsClosed) return Result::INVALID_STATE; mIsClosed = true; if (mWriteThread.get()) { @@ -272,78 +277,79 @@ Return StreamOut::close() { } // Methods from ::android::hardware::audio::V2_0::IStreamOut follow. -Return StreamOut::getLatency() { +Return StreamOut::getLatency() { return mStream->get_latency(mStream); } -Return StreamOut::setVolume(float left, float right) { +Return StreamOut::setVolume(float left, float right) { Result retval(Result::NOT_SUPPORTED); if (mStream->set_volume != NULL) { retval = Stream::analyzeStatus( - "set_volume", mStream->set_volume(mStream, left, right)); + "set_volume", mStream->set_volume(mStream, left, right)); } return retval; } -Return StreamOut::prepareForWriting( - uint32_t frameSize, uint32_t framesCount, prepareForWriting_cb _hidl_cb) { +Return StreamOut::prepareForWriting(uint32_t frameSize, + uint32_t framesCount, + prepareForWriting_cb _hidl_cb) { status_t status; - ThreadInfo threadInfo = { 0, 0 }; + ThreadInfo threadInfo = {0, 0}; // Create message queues. if (mDataMQ) { ALOGE("the client attempts to call prepareForWriting twice"); - _hidl_cb(Result::INVALID_STATE, - CommandMQ::Descriptor(), DataMQ::Descriptor(), StatusMQ::Descriptor(), threadInfo); + _hidl_cb(Result::INVALID_STATE, CommandMQ::Descriptor(), + DataMQ::Descriptor(), StatusMQ::Descriptor(), threadInfo); return Void(); } std::unique_ptr tempCommandMQ(new CommandMQ(1)); if (frameSize > std::numeric_limits::max() / framesCount) { - ALOGE("Requested buffer is too big, %d*%d can not fit in size_t", frameSize, framesCount); - _hidl_cb(Result::INVALID_ARGUMENTS, - CommandMQ::Descriptor(), DataMQ::Descriptor(), StatusMQ::Descriptor(), threadInfo); + ALOGE("Requested buffer is too big, %d*%d can not fit in size_t", + frameSize, framesCount); + _hidl_cb(Result::INVALID_ARGUMENTS, CommandMQ::Descriptor(), + DataMQ::Descriptor(), StatusMQ::Descriptor(), threadInfo); return Void(); } - std::unique_ptr tempDataMQ(new DataMQ(frameSize * framesCount, true /* EventFlag */)); + std::unique_ptr tempDataMQ( + new DataMQ(frameSize * framesCount, true /* EventFlag */)); std::unique_ptr tempStatusMQ(new StatusMQ(1)); - if (!tempCommandMQ->isValid() || !tempDataMQ->isValid() || !tempStatusMQ->isValid()) { + if (!tempCommandMQ->isValid() || !tempDataMQ->isValid() || + !tempStatusMQ->isValid()) { ALOGE_IF(!tempCommandMQ->isValid(), "command MQ is invalid"); ALOGE_IF(!tempDataMQ->isValid(), "data MQ is invalid"); ALOGE_IF(!tempStatusMQ->isValid(), "status MQ is invalid"); - _hidl_cb(Result::INVALID_ARGUMENTS, - CommandMQ::Descriptor(), DataMQ::Descriptor(), StatusMQ::Descriptor(), threadInfo); + _hidl_cb(Result::INVALID_ARGUMENTS, CommandMQ::Descriptor(), + DataMQ::Descriptor(), StatusMQ::Descriptor(), threadInfo); return Void(); } EventFlag* tempRawEfGroup{}; - status = EventFlag::createEventFlag(tempDataMQ->getEventFlagWord(), &tempRawEfGroup); - std::unique_ptr tempElfGroup(tempRawEfGroup,[](auto *ef) { - EventFlag::deleteEventFlag(&ef); }); + status = EventFlag::createEventFlag(tempDataMQ->getEventFlagWord(), + &tempRawEfGroup); + std::unique_ptr tempElfGroup( + tempRawEfGroup, [](auto* ef) { EventFlag::deleteEventFlag(&ef); }); if (status != OK || !tempElfGroup) { ALOGE("failed creating event flag for data MQ: %s", strerror(-status)); - _hidl_cb(Result::INVALID_ARGUMENTS, - CommandMQ::Descriptor(), DataMQ::Descriptor(), StatusMQ::Descriptor(), threadInfo); + _hidl_cb(Result::INVALID_ARGUMENTS, CommandMQ::Descriptor(), + DataMQ::Descriptor(), StatusMQ::Descriptor(), threadInfo); return Void(); } // Create and launch the thread. auto tempWriteThread = std::make_unique( - &mStopWriteThread, - mStream, - tempCommandMQ.get(), - tempDataMQ.get(), - tempStatusMQ.get(), - tempElfGroup.get()); + &mStopWriteThread, mStream, tempCommandMQ.get(), tempDataMQ.get(), + tempStatusMQ.get(), tempElfGroup.get()); if (!tempWriteThread->init()) { - _hidl_cb(Result::INVALID_ARGUMENTS, - CommandMQ::Descriptor(), DataMQ::Descriptor(), StatusMQ::Descriptor(), threadInfo); + _hidl_cb(Result::INVALID_ARGUMENTS, CommandMQ::Descriptor(), + DataMQ::Descriptor(), StatusMQ::Descriptor(), threadInfo); return Void(); } status = tempWriteThread->run("writer", PRIORITY_URGENT_AUDIO); if (status != OK) { ALOGW("failed to start writer thread: %s", strerror(-status)); - _hidl_cb(Result::INVALID_ARGUMENTS, - CommandMQ::Descriptor(), DataMQ::Descriptor(), StatusMQ::Descriptor(), threadInfo); + _hidl_cb(Result::INVALID_ARGUMENTS, CommandMQ::Descriptor(), + DataMQ::Descriptor(), StatusMQ::Descriptor(), threadInfo); return Void(); } @@ -354,33 +360,34 @@ Return StreamOut::prepareForWriting( mEfGroup = tempElfGroup.release(); threadInfo.pid = getpid(); threadInfo.tid = mWriteThread->getTid(); - _hidl_cb(Result::OK, - *mCommandMQ->getDesc(), *mDataMQ->getDesc(), *mStatusMQ->getDesc(), - threadInfo); + _hidl_cb(Result::OK, *mCommandMQ->getDesc(), *mDataMQ->getDesc(), + *mStatusMQ->getDesc(), threadInfo); return Void(); } -Return StreamOut::getRenderPosition(getRenderPosition_cb _hidl_cb) { +Return StreamOut::getRenderPosition(getRenderPosition_cb _hidl_cb) { uint32_t halDspFrames; Result retval = Stream::analyzeStatus( - "get_render_position", mStream->get_render_position(mStream, &halDspFrames)); + "get_render_position", + mStream->get_render_position(mStream, &halDspFrames)); _hidl_cb(retval, halDspFrames); return Void(); } -Return StreamOut::getNextWriteTimestamp(getNextWriteTimestamp_cb _hidl_cb) { +Return StreamOut::getNextWriteTimestamp( + getNextWriteTimestamp_cb _hidl_cb) { Result retval(Result::NOT_SUPPORTED); int64_t timestampUs = 0; if (mStream->get_next_write_timestamp != NULL) { retval = Stream::analyzeStatus( - "get_next_write_timestamp", - mStream->get_next_write_timestamp(mStream, ×tampUs)); + "get_next_write_timestamp", + mStream->get_next_write_timestamp(mStream, ×tampUs)); } _hidl_cb(retval, timestampUs); return Void(); } -Return StreamOut::setCallback(const sp& callback) { +Return StreamOut::setCallback(const sp& callback) { if (mStream->set_callback == NULL) return Result::NOT_SUPPORTED; int result = mStream->set_callback(mStream, StreamOut::asyncCallback, this); if (result == 0) { @@ -389,14 +396,15 @@ Return StreamOut::setCallback(const sp& callback) { return Stream::analyzeStatus("set_callback", result); } -Return StreamOut::clearCallback() { +Return StreamOut::clearCallback() { if (mStream->set_callback == NULL) return Result::NOT_SUPPORTED; mCallback.clear(); return Result::OK; } // static -int StreamOut::asyncCallback(stream_callback_event_t event, void*, void *cookie) { +int StreamOut::asyncCallback(stream_callback_event_t event, void*, + void* cookie) { wp weakSelf(reinterpret_cast(cookie)); sp self = weakSelf.promote(); if (self == nullptr || self->mCallback == nullptr) return 0; @@ -418,53 +426,57 @@ int StreamOut::asyncCallback(stream_callback_event_t event, void*, void *cookie) return 0; } -Return StreamOut::supportsPauseAndResume(supportsPauseAndResume_cb _hidl_cb) { +Return StreamOut::supportsPauseAndResume( + supportsPauseAndResume_cb _hidl_cb) { _hidl_cb(mStream->pause != NULL, mStream->resume != NULL); return Void(); } -Return StreamOut::pause() { - return mStream->pause != NULL ? - Stream::analyzeStatus("pause", mStream->pause(mStream)) : - Result::NOT_SUPPORTED; +Return StreamOut::pause() { + return mStream->pause != NULL + ? Stream::analyzeStatus("pause", mStream->pause(mStream)) + : Result::NOT_SUPPORTED; } -Return StreamOut::resume() { - return mStream->resume != NULL ? - Stream::analyzeStatus("resume", mStream->resume(mStream)) : - Result::NOT_SUPPORTED; +Return StreamOut::resume() { + return mStream->resume != NULL + ? Stream::analyzeStatus("resume", mStream->resume(mStream)) + : Result::NOT_SUPPORTED; } -Return StreamOut::supportsDrain() { +Return StreamOut::supportsDrain() { return mStream->drain != NULL; } -Return StreamOut::drain(AudioDrain type) { - return mStream->drain != NULL ? - Stream::analyzeStatus( - "drain", mStream->drain(mStream, static_cast(type))) : - Result::NOT_SUPPORTED; +Return StreamOut::drain(AudioDrain type) { + return mStream->drain != NULL + ? Stream::analyzeStatus( + "drain", + mStream->drain(mStream, + static_cast(type))) + : Result::NOT_SUPPORTED; } -Return StreamOut::flush() { - return mStream->flush != NULL ? - Stream::analyzeStatus("flush", mStream->flush(mStream)) : - Result::NOT_SUPPORTED; +Return StreamOut::flush() { + return mStream->flush != NULL + ? Stream::analyzeStatus("flush", mStream->flush(mStream)) + : Result::NOT_SUPPORTED; } // static -Result StreamOut::getPresentationPositionImpl( - audio_stream_out_t *stream, uint64_t *frames, TimeSpec *timeStamp) { +Result StreamOut::getPresentationPositionImpl(audio_stream_out_t* stream, + uint64_t* frames, + TimeSpec* timeStamp) { Result retval(Result::NOT_SUPPORTED); if (stream->get_presentation_position == NULL) return retval; struct timespec halTimeStamp; retval = Stream::analyzeStatus( - "get_presentation_position", - stream->get_presentation_position(stream, frames, &halTimeStamp), - // Don't logspam on EINVAL--it's normal for get_presentation_position - // to return it sometimes. EAGAIN may be returned by A2DP audio HAL - // implementation. - EINVAL, EAGAIN); + "get_presentation_position", + stream->get_presentation_position(stream, frames, &halTimeStamp), + // Don't logspam on EINVAL--it's normal for get_presentation_position + // to return it sometimes. EAGAIN may be returned by A2DP audio HAL + // implementation. + EINVAL, EAGAIN); if (retval == Result::OK) { timeStamp->tvSec = halTimeStamp.tv_sec; timeStamp->tvNSec = halTimeStamp.tv_nsec; @@ -472,9 +484,10 @@ Result StreamOut::getPresentationPositionImpl( return retval; } -Return StreamOut::getPresentationPosition(getPresentationPosition_cb _hidl_cb) { +Return StreamOut::getPresentationPosition( + getPresentationPosition_cb _hidl_cb) { uint64_t frames = 0; - TimeSpec timeStamp = { 0, 0 }; + TimeSpec timeStamp = {0, 0}; Result retval = getPresentationPositionImpl(mStream, &frames, &timeStamp); _hidl_cb(retval, frames, timeStamp); return Void(); @@ -488,9 +501,10 @@ Return StreamOut::stop() { return mStreamMmap->stop(); } -Return StreamOut::createMmapBuffer(int32_t minSizeFrames, createMmapBuffer_cb _hidl_cb) { +Return StreamOut::createMmapBuffer(int32_t minSizeFrames, + createMmapBuffer_cb _hidl_cb) { return mStreamMmap->createMmapBuffer( - minSizeFrames, audio_stream_out_frame_size(mStream), _hidl_cb); + minSizeFrames, audio_stream_out_frame_size(mStream), _hidl_cb); } Return StreamOut::getMmapPosition(getMmapPosition_cb _hidl_cb) { diff --git a/audio/2.0/vts/functional/AudioPrimaryHidlHalTest.cpp b/audio/2.0/vts/functional/AudioPrimaryHidlHalTest.cpp index 074903f665..e1c9549541 100644 --- a/audio/2.0/vts/functional/AudioPrimaryHidlHalTest.cpp +++ b/audio/2.0/vts/functional/AudioPrimaryHidlHalTest.cpp @@ -36,9 +36,9 @@ #include #include -#include "utility/ReturnIn.h" #include "utility/AssertOk.h" #include "utility/PrettyPrintAudioTypes.h" +#include "utility/ReturnIn.h" using std::string; using std::to_string; @@ -59,7 +59,8 @@ using ::android::hardware::audio::V2_0::IDevicesFactory; using ::android::hardware::audio::V2_0::IStream; using ::android::hardware::audio::V2_0::IStreamIn; using ::android::hardware::audio::V2_0::TimeSpec; -using ReadParameters = ::android::hardware::audio::V2_0::IStreamIn::ReadParameters; +using ReadParameters = + ::android::hardware::audio::V2_0::IStreamIn::ReadParameters; using ReadStatus = ::android::hardware::audio::V2_0::IStreamIn::ReadStatus; using ::android::hardware::audio::V2_0::IStreamOut; using ::android::hardware::audio::V2_0::IStreamOutCallback; @@ -84,16 +85,20 @@ using utility::returnIn; namespace doc { /** Document the current test case. - * Eg: calling `doc::test("Dump the state of the hal")` in the "debugDump" test will output: - * - * see https://github.com/google/googletest/blob/master/googletest/docs/AdvancedGuide.md#logging-additional-information + * Eg: calling `doc::test("Dump the state of the hal")` in the "debugDump" test + * will output: + * + * see + https://github.com/google/googletest/blob/master/googletest/docs/AdvancedGuide.md#logging-additional-information */ void test(const std::string& testCaseDocumentation) { ::testing::Test::RecordProperty("description", testCaseDocumentation); } -/** Document why a test was not fully run. Usually due to an optional feature not implemented. */ +/** Document why a test was not fully run. Usually due to an optional feature + * not implemented. */ void partialTest(const std::string& reason) { ::testing::Test::RecordProperty("partialyRunTest", reason); } @@ -101,16 +106,17 @@ void partialTest(const std::string& reason) { // Register callback for static object destruction // Avoid destroying static objects after main return. -// Post main return destruction leads to incorrect gtest timing measurements as well as harder +// Post main return destruction leads to incorrect gtest timing measurements as +// well as harder // debuging if anything goes wrong during destruction. class Environment : public ::testing::Environment { -public: - using TearDownFunc = std::function; - void registerTearDown(TearDownFunc&& tearDown) { - tearDowns.push_back(std::move(tearDown)); + public: + using TearDownFunc = std::function; + void registerTearDown(TearDownFunc&& tearDown) { + tearDowns.push_back(std::move(tearDown)); } -private: + private: void TearDown() override { // Call the tear downs in reverse order of insertion for (auto& tearDown : tearDowns) { @@ -123,7 +129,7 @@ private: static Environment* environment; class HidlTest : public ::testing::VtsHalHidlTargetTestBase { -protected: + protected: // Convenient member to store results Result res; }; @@ -134,18 +140,19 @@ protected: // Test all audio devices class AudioHidlTest : public HidlTest { -public: + public: void SetUp() override { - ASSERT_NO_FATAL_FAILURE(HidlTest::SetUp()); // setup base + ASSERT_NO_FATAL_FAILURE(HidlTest::SetUp()); // setup base if (devicesFactory == nullptr) { - environment->registerTearDown([]{ devicesFactory.clear(); }); - devicesFactory = ::testing::VtsHalHidlTargetTestBase::getService(); + environment->registerTearDown([] { devicesFactory.clear(); }); + devicesFactory = ::testing::VtsHalHidlTargetTestBase::getService< + IDevicesFactory>(); } ASSERT_TRUE(devicesFactory != nullptr); } -protected: + protected: // Cache the devicesFactory retrieval to speed up each test by ~0.5s static sp devicesFactory; }; @@ -171,26 +178,27 @@ TEST_F(AudioHidlTest, OpenDeviceInvalidParameter) { // Test the primary device class AudioPrimaryHidlTest : public AudioHidlTest { -public: + public: /** Primary HAL test are NOT thread safe. */ void SetUp() override { - ASSERT_NO_FATAL_FAILURE(AudioHidlTest::SetUp()); // setup base + ASSERT_NO_FATAL_FAILURE(AudioHidlTest::SetUp()); // setup base if (device == nullptr) { IDevicesFactory::Result result; sp baseDevice; - ASSERT_OK(devicesFactory->openDevice(IDevicesFactory::Device::PRIMARY, - returnIn(result, baseDevice))); + ASSERT_OK( + devicesFactory->openDevice(IDevicesFactory::Device::PRIMARY, + returnIn(result, baseDevice))); ASSERT_OK(result); ASSERT_TRUE(baseDevice != nullptr); - environment->registerTearDown([]{ device.clear(); }); + environment->registerTearDown([] { device.clear(); }); device = IPrimaryDevice::castFrom(baseDevice); ASSERT_TRUE(device != nullptr); } } -protected: + protected: // Cache the device opening to speed up each test by ~0.5s static sp device; }; @@ -211,15 +219,15 @@ TEST_F(AudioPrimaryHidlTest, Init) { template class AccessorPrimaryHidlTest : public AudioPrimaryHidlTest { -protected: - + protected: /** Test a property getter and setter. */ template - void testAccessors(const string& propertyName, const vector& valuesToTest, - Setter setter, Getter getter, + void testAccessors(const string& propertyName, + const vector& valuesToTest, Setter setter, + Getter getter, const vector& invalidValues = {}) { - - Property initialValue; // Save initial value to restore it at the end of the test + Property initialValue; // Save initial value to restore it at the end + // of the test ASSERT_OK((device.get()->*getter)(returnIn(res, initialValue))); ASSERT_OK(res); @@ -235,17 +243,21 @@ protected: } for (Property invalidValue : invalidValues) { - SCOPED_TRACE("Try to set " + propertyName + " with the invalid value " + + SCOPED_TRACE("Try to set " + propertyName + + " with the invalid value " + testing::PrintToString(invalidValue)); - EXPECT_RESULT(Result::INVALID_ARGUMENTS, (device.get()->*setter)(invalidValue)); + EXPECT_RESULT(Result::INVALID_ARGUMENTS, + (device.get()->*setter)(invalidValue)); } - ASSERT_OK((device.get()->*setter)(initialValue)); // restore initial value + ASSERT_OK( + (device.get()->*setter)(initialValue)); // restore initial value } /** Test the getter and setter of an optional feature. */ template - void testOptionalAccessors(const string& propertyName, const vector& valuesToTest, + void testOptionalAccessors(const string& propertyName, + const vector& valuesToTest, Setter setter, Getter getter, const vector& invalidValues = {}) { doc::test("Test the optional " + propertyName + " getters and setter"); @@ -257,10 +269,11 @@ protected: doc::partialTest(propertyName + " getter is not supported"); return; } - ASSERT_OK(res); // If it is supported it must succeed + ASSERT_OK(res); // If it is supported it must succeed } // The feature is supported, test it - testAccessors(propertyName, valuesToTest, setter, getter, invalidValues); + testAccessors(propertyName, valuesToTest, setter, getter, + invalidValues); } }; @@ -268,12 +281,15 @@ using BoolAccessorPrimaryHidlTest = AccessorPrimaryHidlTest; TEST_F(BoolAccessorPrimaryHidlTest, MicMuteTest) { doc::test("Check that the mic can be muted and unmuted"); - testAccessors("mic mute", {true, false, true}, &IDevice::setMicMute, &IDevice::getMicMute); + testAccessors("mic mute", {true, false, true}, &IDevice::setMicMute, + &IDevice::getMicMute); // TODO: check that the mic is really muted (all sample are 0) } TEST_F(BoolAccessorPrimaryHidlTest, MasterMuteTest) { - doc::test("If master mute is supported, try to mute and unmute the master output"); + doc::test( + "If master mute is supported, try to mute and unmute the master " + "output"); testOptionalAccessors("master mute", {true, false, true}, &IDevice::setMasterMute, &IDevice::getMasterMute); // TODO: check that the master volume is really muted @@ -282,7 +298,7 @@ TEST_F(BoolAccessorPrimaryHidlTest, MasterMuteTest) { using FloatAccessorPrimaryHidlTest = AccessorPrimaryHidlTest; TEST_F(FloatAccessorPrimaryHidlTest, MasterVolumeTest) { doc::test("Test the master volume if supported"); - testOptionalAccessors("master volume", {0, 0.5, 1}, + testOptionalAccessors("master volume", {0, 0.5, 1}, &IDevice::setMasterVolume, &IDevice::getMasterVolume, {-0.1, 1.1, NAN, INFINITY, -INFINITY, 1 + std::numeric_limits::epsilon()}); @@ -294,7 +310,7 @@ TEST_F(FloatAccessorPrimaryHidlTest, MasterVolumeTest) { ////////////////////////////////////////////////////////////////////////////// class AudioPatchPrimaryHidlTest : public AudioPrimaryHidlTest { -protected: + protected: bool areAudioPatchesSupported() { auto result = device->supportsAudioPatches(); EXPECT_TRUE(result.isOk()); @@ -311,27 +327,30 @@ TEST_F(AudioPatchPrimaryHidlTest, AudioPatches) { // TODO: test audio patches } - ////////////////////////////////////////////////////////////////////////////// //////////////// Required and recommended audio format support /////////////// -// From: https://source.android.com/compatibility/android-cdd.html#5_4_audio_recording -// From: https://source.android.com/compatibility/android-cdd.html#5_5_audio_playback +// From: +// https://source.android.com/compatibility/android-cdd.html#5_4_audio_recording +// From: +// https://source.android.com/compatibility/android-cdd.html#5_5_audio_playback /////////// TODO: move to the beginning of the file for easier update //////// ////////////////////////////////////////////////////////////////////////////// class AudioConfigPrimaryTest : public AudioPatchPrimaryHidlTest { -public: + public: // Cache result ? static const vector getRequiredSupportPlaybackAudioConfig() { - return combineAudioConfig({AudioChannelMask::OUT_STEREO, AudioChannelMask::OUT_MONO}, - {8000, 11025, 16000, 22050, 32000, 44100}, - {AudioFormat::PCM_16_BIT}); + return combineAudioConfig( + {AudioChannelMask::OUT_STEREO, AudioChannelMask::OUT_MONO}, + {8000, 11025, 16000, 22050, 32000, 44100}, + {AudioFormat::PCM_16_BIT}); } - static const vector getRecommendedSupportPlaybackAudioConfig() { - return combineAudioConfig({AudioChannelMask::OUT_STEREO, AudioChannelMask::OUT_MONO}, - {24000, 48000}, - {AudioFormat::PCM_16_BIT}); + static const vector + getRecommendedSupportPlaybackAudioConfig() { + return combineAudioConfig( + {AudioChannelMask::OUT_STEREO, AudioChannelMask::OUT_MONO}, + {24000, 48000}, {AudioFormat::PCM_16_BIT}); } static const vector getSupportedPlaybackAudioConfig() { @@ -346,8 +365,7 @@ public: {AudioFormat::PCM_16_BIT}); } static const vector getRecommendedSupportCaptureAudioConfig() { - return combineAudioConfig({AudioChannelMask::IN_STEREO}, - {22050, 48000}, + return combineAudioConfig({AudioChannelMask::IN_STEREO}, {22050, 48000}, {AudioFormat::PCM_16_BIT}); } static const vector getSupportedCaptureAudioConfig() { @@ -355,13 +373,13 @@ public: // as declared in the policy configuration return {}; } -private: + + private: static const vector combineAudioConfig( - vector channelMasks, - vector sampleRates, - vector formats) { + vector channelMasks, vector sampleRates, + vector formats) { vector configs; - for (auto channelMask: channelMasks) { + for (auto channelMask : channelMasks) { for (auto sampleRate : sampleRates) { for (auto format : formats) { AudioConfig config{}; @@ -383,28 +401,34 @@ private: * As the only parameter changing are channel mask and sample rate, * only print those ones in the test name. */ -static string generateTestName(const testing::TestParamInfo& info) { +static string generateTestName( + const testing::TestParamInfo& info) { const AudioConfig& config = info.param; - return to_string(info.index) + "__" + to_string(config.sampleRateHz)+ "_" + - // "MONO" is more clear than "FRONT_LEFT" - ((config.channelMask == AudioChannelMask::OUT_MONO || - config.channelMask == AudioChannelMask::IN_MONO) ? - "MONO" : toString(config.channelMask)); + return to_string(info.index) + "__" + to_string(config.sampleRateHz) + "_" + + // "MONO" is more clear than "FRONT_LEFT" + ((config.channelMask == AudioChannelMask::OUT_MONO || + config.channelMask == AudioChannelMask::IN_MONO) + ? "MONO" + : toString(config.channelMask)); } ////////////////////////////////////////////////////////////////////////////// ///////////////////////////// getInputBufferSize ///////////////////////////// ////////////////////////////////////////////////////////////////////////////// -// FIXME: execute input test only if platform declares android.hardware.microphone +// FIXME: execute input test only if platform declares +// android.hardware.microphone // how to get this value ? is it a property ??? -class AudioCaptureConfigPrimaryTest : public AudioConfigPrimaryTest, - public ::testing::WithParamInterface { -protected: - void inputBufferSizeTest(const AudioConfig& audioConfig, bool supportRequired) { +class AudioCaptureConfigPrimaryTest + : public AudioConfigPrimaryTest, + public ::testing::WithParamInterface { + protected: + void inputBufferSizeTest(const AudioConfig& audioConfig, + bool supportRequired) { uint64_t bufferSize; - ASSERT_OK(device->getInputBufferSize(audioConfig, returnIn(res, bufferSize))); + ASSERT_OK( + device->getInputBufferSize(audioConfig, returnIn(res, bufferSize))); switch (res) { case Result::INVALID_ARGUMENTS: @@ -416,36 +440,46 @@ protected: EXPECT_GT(bufferSize, uint64_t(0)); break; default: - FAIL() << "Invalid return status: " << ::testing::PrintToString(res); + FAIL() << "Invalid return status: " + << ::testing::PrintToString(res); } } }; -// Test that the required capture config and those declared in the policy are indeed supported +// Test that the required capture config and those declared in the policy are +// indeed supported class RequiredInputBufferSizeTest : public AudioCaptureConfigPrimaryTest {}; TEST_P(RequiredInputBufferSizeTest, RequiredInputBufferSizeTest) { - doc::test("Input buffer size must be retrievable for a format with required support."); + doc::test( + "Input buffer size must be retrievable for a format with required " + "support."); inputBufferSizeTest(GetParam(), true); } INSTANTIATE_TEST_CASE_P( - RequiredInputBufferSize, RequiredInputBufferSizeTest, - ::testing::ValuesIn(AudioConfigPrimaryTest::getRequiredSupportCaptureAudioConfig()), - &generateTestName); + RequiredInputBufferSize, RequiredInputBufferSizeTest, + ::testing::ValuesIn( + AudioConfigPrimaryTest::getRequiredSupportCaptureAudioConfig()), + &generateTestName); INSTANTIATE_TEST_CASE_P( - SupportedInputBufferSize, RequiredInputBufferSizeTest, - ::testing::ValuesIn(AudioConfigPrimaryTest::getSupportedCaptureAudioConfig()), - &generateTestName); + SupportedInputBufferSize, RequiredInputBufferSizeTest, + ::testing::ValuesIn( + AudioConfigPrimaryTest::getSupportedCaptureAudioConfig()), + &generateTestName); -// Test that the recommended capture config are supported or lead to a INVALID_ARGUMENTS return +// Test that the recommended capture config are supported or lead to a +// INVALID_ARGUMENTS return class OptionalInputBufferSizeTest : public AudioCaptureConfigPrimaryTest {}; TEST_P(OptionalInputBufferSizeTest, OptionalInputBufferSizeTest) { - doc::test("Input buffer size should be retrievable for a format with recommended support."); + doc::test( + "Input buffer size should be retrievable for a format with recommended " + "support."); inputBufferSizeTest(GetParam(), false); } INSTANTIATE_TEST_CASE_P( - RecommendedCaptureAudioConfigSupport, OptionalInputBufferSizeTest, - ::testing::ValuesIn(AudioConfigPrimaryTest::getRecommendedSupportCaptureAudioConfig()), - &generateTestName); + RecommendedCaptureAudioConfigSupport, OptionalInputBufferSizeTest, + ::testing::ValuesIn( + AudioConfigPrimaryTest::getRecommendedSupportCaptureAudioConfig()), + &generateTestName); ////////////////////////////////////////////////////////////////////////////// /////////////////////////////// setScreenState /////////////////////////////// @@ -457,7 +491,8 @@ TEST_F(AudioPrimaryHidlTest, setScreenState) { auto ret = device->setScreenState(turnedOn); ASSERT_TRUE(ret.isOk()); Result result = ret; - ASSERT_TRUE(result == Result::OK || result == Result::NOT_SUPPORTED) << toString(result); + ASSERT_TRUE(result == Result::OK || result == Result::NOT_SUPPORTED) + << toString(result); } } @@ -492,10 +527,11 @@ static void testDebugDump(DebugDump debugDump) { handle.setTo(nativeHandle, true /*take ownership*/); // TODO: debugDump does not return a Result. - // This mean that the hal can not report that it not implementing the function. + // This mean that the hal can not report that it not implementing the + // function. ASSERT_OK(debugDump(handle)); - rewind(file); // can not fail + rewind(file); // can not fail // Check that at least one bit was written by the hal char buff; @@ -505,7 +541,8 @@ static void testDebugDump(DebugDump debugDump) { TEST_F(AudioPrimaryHidlTest, debugDump) { doc::test("Check that the hal can dump its state without error"); - testDebugDump([this](const auto& handle){ return device->debugDump(handle); }); + testDebugDump( + [this](const auto& handle) { return device->debugDump(handle); }); } TEST_F(AudioPrimaryHidlTest, debugDumpInvalidArguments) { @@ -520,14 +557,16 @@ TEST_F(AudioPrimaryHidlTest, debugDumpInvalidArguments) { template class OpenStreamTest : public AudioConfigPrimaryTest, public ::testing::WithParamInterface { -protected: + protected: template void testOpen(Open openStream, const AudioConfig& config) { // FIXME: Open a stream without an IOHandle // This is not required to be accepted by hal implementations - AudioIoHandle ioHandle = (AudioIoHandle)AudioHandleConsts::AUDIO_IO_HANDLE_NONE; + AudioIoHandle ioHandle = + (AudioIoHandle)AudioHandleConsts::AUDIO_IO_HANDLE_NONE; AudioConfig suggestedConfig{}; - ASSERT_OK(openStream(ioHandle, config, returnIn(res, stream, suggestedConfig))); + ASSERT_OK(openStream(ioHandle, config, + returnIn(res, stream, suggestedConfig))); // TODO: only allow failure for RecommendedPlaybackAudioConfig switch (res) { @@ -538,16 +577,19 @@ protected: case Result::INVALID_ARGUMENTS: ASSERT_TRUE(stream == nullptr); AudioConfig suggestedConfigRetry; - // Could not open stream with config, try again with the suggested one - ASSERT_OK(openStream(ioHandle, suggestedConfig, - returnIn(res, stream, suggestedConfigRetry))); + // Could not open stream with config, try again with the + // suggested one + ASSERT_OK( + openStream(ioHandle, suggestedConfig, + returnIn(res, stream, suggestedConfigRetry))); // This time it must succeed ASSERT_OK(res); ASSERT_TRUE(stream == nullptr); audioConfig = suggestedConfig; break; default: - FAIL() << "Invalid return status: " << ::testing::PrintToString(res); + FAIL() << "Invalid return status: " + << ::testing::PrintToString(res); } open = true; } @@ -556,15 +598,15 @@ protected: open = false; return stream->close(); } -private: + + private: void TearDown() override { if (open) { ASSERT_OK(stream->close()); } } -protected: - + protected: AudioConfig audioConfig; DeviceAddress address = {}; sp stream; @@ -575,66 +617,84 @@ protected: class OutputStreamTest : public OpenStreamTest { virtual void SetUp() override { - ASSERT_NO_FATAL_FAILURE(OpenStreamTest::SetUp()); // setup base + ASSERT_NO_FATAL_FAILURE(OpenStreamTest::SetUp()); // setup base address.device = AudioDevice::OUT_DEFAULT; const AudioConfig& config = GetParam(); - AudioOutputFlag flags = AudioOutputFlag::NONE; // TODO: test all flag combination - testOpen([&](AudioIoHandle handle, AudioConfig config, auto cb) - { return device->openOutputStream(handle, address, config, flags, cb); }, - config); + AudioOutputFlag flags = + AudioOutputFlag::NONE; // TODO: test all flag combination + testOpen( + [&](AudioIoHandle handle, AudioConfig config, auto cb) { + return device->openOutputStream(handle, address, config, flags, + cb); + }, + config); } }; TEST_P(OutputStreamTest, OpenOutputStreamTest) { - doc::test("Check that output streams can be open with the required and recommended config"); + doc::test( + "Check that output streams can be open with the required and " + "recommended config"); // Open done in SetUp } INSTANTIATE_TEST_CASE_P( - RequiredOutputStreamConfigSupport, OutputStreamTest, - ::testing::ValuesIn(AudioConfigPrimaryTest::getRequiredSupportPlaybackAudioConfig()), - &generateTestName); + RequiredOutputStreamConfigSupport, OutputStreamTest, + ::testing::ValuesIn( + AudioConfigPrimaryTest::getRequiredSupportPlaybackAudioConfig()), + &generateTestName); INSTANTIATE_TEST_CASE_P( - SupportedOutputStreamConfig, OutputStreamTest, - ::testing::ValuesIn(AudioConfigPrimaryTest::getSupportedPlaybackAudioConfig()), - &generateTestName); + SupportedOutputStreamConfig, OutputStreamTest, + ::testing::ValuesIn( + AudioConfigPrimaryTest::getSupportedPlaybackAudioConfig()), + &generateTestName); INSTANTIATE_TEST_CASE_P( - RecommendedOutputStreamConfigSupport, OutputStreamTest, - ::testing::ValuesIn(AudioConfigPrimaryTest::getRecommendedSupportPlaybackAudioConfig()), - &generateTestName); + RecommendedOutputStreamConfigSupport, OutputStreamTest, + ::testing::ValuesIn( + AudioConfigPrimaryTest::getRecommendedSupportPlaybackAudioConfig()), + &generateTestName); ////////////////////////////// openInputStream ////////////////////////////// class InputStreamTest : public OpenStreamTest { - virtual void SetUp() override { - ASSERT_NO_FATAL_FAILURE(OpenStreamTest::SetUp()); // setup base + ASSERT_NO_FATAL_FAILURE(OpenStreamTest::SetUp()); // setup base address.device = AudioDevice::IN_DEFAULT; const AudioConfig& config = GetParam(); - AudioInputFlag flags = AudioInputFlag::NONE; // TODO: test all flag combination - AudioSource source = AudioSource::DEFAULT; // TODO: test all flag combination - testOpen([&](AudioIoHandle handle, AudioConfig config, auto cb) - { return device->openInputStream(handle, address, config, flags, source, cb); }, - config); + AudioInputFlag flags = + AudioInputFlag::NONE; // TODO: test all flag combination + AudioSource source = + AudioSource::DEFAULT; // TODO: test all flag combination + testOpen( + [&](AudioIoHandle handle, AudioConfig config, auto cb) { + return device->openInputStream(handle, address, config, flags, + source, cb); + }, + config); } }; TEST_P(InputStreamTest, OpenInputStreamTest) { - doc::test("Check that input streams can be open with the required and recommended config"); + doc::test( + "Check that input streams can be open with the required and " + "recommended config"); // Open done in setup } INSTANTIATE_TEST_CASE_P( - RequiredInputStreamConfigSupport, InputStreamTest, - ::testing::ValuesIn(AudioConfigPrimaryTest::getRequiredSupportCaptureAudioConfig()), - &generateTestName); + RequiredInputStreamConfigSupport, InputStreamTest, + ::testing::ValuesIn( + AudioConfigPrimaryTest::getRequiredSupportCaptureAudioConfig()), + &generateTestName); INSTANTIATE_TEST_CASE_P( - SupportedInputStreamConfig, InputStreamTest, - ::testing::ValuesIn(AudioConfigPrimaryTest::getSupportedCaptureAudioConfig()), - &generateTestName); + SupportedInputStreamConfig, InputStreamTest, + ::testing::ValuesIn( + AudioConfigPrimaryTest::getSupportedCaptureAudioConfig()), + &generateTestName); INSTANTIATE_TEST_CASE_P( - RecommendedInputStreamConfigSupport, InputStreamTest, - ::testing::ValuesIn(AudioConfigPrimaryTest::getRecommendedSupportCaptureAudioConfig()), - &generateTestName); + RecommendedInputStreamConfigSupport, InputStreamTest, + ::testing::ValuesIn( + AudioConfigPrimaryTest::getRecommendedSupportCaptureAudioConfig()), + &generateTestName); ////////////////////////////////////////////////////////////////////////////// ////////////////////////////// IStream getters /////////////////////////////// @@ -654,49 +714,63 @@ static R extract(Return ret) { /* Could not find a way to write a test for two parametrized class fixure * thus use this macro do duplicate tests for Input and Output stream */ #define TEST_IO_STREAM(test_name, documentation, code) \ - TEST_P(InputStreamTest, test_name) { \ - doc::test(documentation); \ - code; \ - } \ - TEST_P(OutputStreamTest, test_name) { \ - doc::test(documentation); \ - code; \ + TEST_P(InputStreamTest, test_name) { \ + doc::test(documentation); \ + code; \ + } \ + TEST_P(OutputStreamTest, test_name) { \ + doc::test(documentation); \ + code; \ } -TEST_IO_STREAM(GetFrameCount, "Check that the stream frame count == the one it was opened with", - ASSERT_EQ(audioConfig.frameCount, extract(stream->getFrameCount()))) +TEST_IO_STREAM( + GetFrameCount, + "Check that the stream frame count == the one it was opened with", + ASSERT_EQ(audioConfig.frameCount, extract(stream->getFrameCount()))) -TEST_IO_STREAM(GetSampleRate, "Check that the stream sample rate == the one it was opened with", - ASSERT_EQ(audioConfig.sampleRateHz, extract(stream->getSampleRate()))) +TEST_IO_STREAM( + GetSampleRate, + "Check that the stream sample rate == the one it was opened with", + ASSERT_EQ(audioConfig.sampleRateHz, extract(stream->getSampleRate()))) -TEST_IO_STREAM(GetChannelMask, "Check that the stream channel mask == the one it was opened with", - ASSERT_EQ(audioConfig.channelMask, extract(stream->getChannelMask()))) +TEST_IO_STREAM( + GetChannelMask, + "Check that the stream channel mask == the one it was opened with", + ASSERT_EQ(audioConfig.channelMask, extract(stream->getChannelMask()))) -TEST_IO_STREAM(GetFormat, "Check that the stream format == the one it was opened with", +TEST_IO_STREAM(GetFormat, + "Check that the stream format == the one it was opened with", ASSERT_EQ(audioConfig.format, extract(stream->getFormat()))) // TODO: for now only check that the framesize is not incoherent -TEST_IO_STREAM(GetFrameSize, "Check that the stream frame size == the one it was opened with", +TEST_IO_STREAM(GetFrameSize, + "Check that the stream frame size == the one it was opened with", ASSERT_GT(extract(stream->getFrameSize()), 0U)) -TEST_IO_STREAM(GetBufferSize, "Check that the stream buffer size== the one it was opened with", - ASSERT_GE(extract(stream->getBufferSize()), \ - extract(stream->getFrameSize()))); +TEST_IO_STREAM(GetBufferSize, + "Check that the stream buffer size== the one it was opened with", + ASSERT_GE(extract(stream->getBufferSize()), + extract(stream->getFrameSize()))); template -static void testCapabilityGetter(const string& name, IStream* stream, Property currentValue, - CapabilityGetter capablityGetter, Getter getter, Setter setter) { +static void testCapabilityGetter(const string& name, IStream* stream, + Property currentValue, + CapabilityGetter capablityGetter, + Getter getter, Setter setter) { hidl_vec capabilities; ASSERT_OK((stream->*capablityGetter)(returnIn(capabilities))); if (capabilities.size() == 0) { - // The default hal should probably return a NOT_SUPPORTED if the hal does not expose - // capability retrieval. For now it returns an empty list if not implemented + // The default hal should probably return a NOT_SUPPORTED if the hal + // does not expose + // capability retrieval. For now it returns an empty list if not + // implemented doc::partialTest(name + " is not supported"); return; }; - // TODO: This code has never been tested on a hal that supports getSupportedSampleRates + // TODO: This code has never been tested on a hal that supports + // getSupportedSampleRates EXPECT_NE(std::find(capabilities.begin(), capabilities.end(), currentValue), - capabilities.end()) + capabilities.end()) << "current " << name << " is not in the list of the supported ones " << toString(capabilities); @@ -707,22 +781,27 @@ static void testCapabilityGetter(const string& name, IStream* stream, Property c } } -TEST_IO_STREAM(SupportedSampleRate, "Check that the stream sample rate is declared as supported", - testCapabilityGetter("getSupportedSampleRate", stream.get(), \ - extract(stream->getSampleRate()), \ - &IStream::getSupportedSampleRates, \ - &IStream::getSampleRate, &IStream::setSampleRate)) +TEST_IO_STREAM(SupportedSampleRate, + "Check that the stream sample rate is declared as supported", + testCapabilityGetter("getSupportedSampleRate", stream.get(), + extract(stream->getSampleRate()), + &IStream::getSupportedSampleRates, + &IStream::getSampleRate, + &IStream::setSampleRate)) -TEST_IO_STREAM(SupportedChannelMask, "Check that the stream channel mask is declared as supported", - testCapabilityGetter("getSupportedChannelMask", stream.get(), \ - extract(stream->getChannelMask()), \ - &IStream::getSupportedChannelMasks, \ - &IStream::getChannelMask, &IStream::setChannelMask)) +TEST_IO_STREAM(SupportedChannelMask, + "Check that the stream channel mask is declared as supported", + testCapabilityGetter("getSupportedChannelMask", stream.get(), + extract(stream->getChannelMask()), + &IStream::getSupportedChannelMasks, + &IStream::getChannelMask, + &IStream::setChannelMask)) -TEST_IO_STREAM(SupportedFormat, "Check that the stream format is declared as supported", - testCapabilityGetter("getSupportedFormat", stream.get(), \ - extract(stream->getFormat()), \ - &IStream::getSupportedFormats, \ +TEST_IO_STREAM(SupportedFormat, + "Check that the stream format is declared as supported", + testCapabilityGetter("getSupportedFormat", stream.get(), + extract(stream->getFormat()), + &IStream::getSupportedFormats, &IStream::getFormat, &IStream::setFormat)) static void testGetDevice(IStream* stream, AudioDevice expectedDevice) { @@ -732,44 +811,53 @@ static void testGetDevice(IStream* stream, AudioDevice expectedDevice) { ASSERT_EQ(expectedDevice, device); } -TEST_IO_STREAM(GetDevice, "Check that the stream device == the one it was opened with", - areAudioPatchesSupported() ? doc::partialTest("Audio patches are supported") : \ - testGetDevice(stream.get(), address.device)) +TEST_IO_STREAM(GetDevice, + "Check that the stream device == the one it was opened with", + areAudioPatchesSupported() + ? doc::partialTest("Audio patches are supported") + : testGetDevice(stream.get(), address.device)) static void testSetDevice(IStream* stream, const DeviceAddress& address) { DeviceAddress otherAddress = address; - otherAddress.device = (address.device & AudioDevice::BIT_IN) == 0 ? - AudioDevice::OUT_SPEAKER : AudioDevice::IN_BUILTIN_MIC; + otherAddress.device = (address.device & AudioDevice::BIT_IN) == 0 + ? AudioDevice::OUT_SPEAKER + : AudioDevice::IN_BUILTIN_MIC; EXPECT_OK(stream->setDevice(otherAddress)); - ASSERT_OK(stream->setDevice(address)); // Go back to the original value + ASSERT_OK(stream->setDevice(address)); // Go back to the original value } -TEST_IO_STREAM(SetDevice, "Check that the stream can be rerouted to SPEAKER or BUILTIN_MIC", - areAudioPatchesSupported() ? doc::partialTest("Audio patches are supported") : \ - testSetDevice(stream.get(), address)) +TEST_IO_STREAM( + SetDevice, + "Check that the stream can be rerouted to SPEAKER or BUILTIN_MIC", + areAudioPatchesSupported() ? doc::partialTest("Audio patches are supported") + : testSetDevice(stream.get(), address)) -static void testGetAudioProperties(IStream* stream, AudioConfig expectedConfig) { +static void testGetAudioProperties(IStream* stream, + AudioConfig expectedConfig) { uint32_t sampleRateHz; AudioChannelMask mask; AudioFormat format; stream->getAudioProperties(returnIn(sampleRateHz, mask, format)); - // FIXME: the qcom hal it does not currently negotiate the sampleRate & channel mask + // FIXME: the qcom hal it does not currently negotiate the sampleRate & + // channel mask EXPECT_EQ(expectedConfig.sampleRateHz, sampleRateHz); EXPECT_EQ(expectedConfig.channelMask, mask); EXPECT_EQ(expectedConfig.format, format); } -TEST_IO_STREAM(GetAudioProperties, - "Check that the stream audio properties == the ones it was opened with", - testGetAudioProperties(stream.get(), audioConfig)) +TEST_IO_STREAM( + GetAudioProperties, + "Check that the stream audio properties == the ones it was opened with", + testGetAudioProperties(stream.get(), audioConfig)) static void testConnectedState(IStream* stream) { DeviceAddress address = {}; using AD = AudioDevice; - for (auto device : {AD::OUT_HDMI, AD::OUT_WIRED_HEADPHONE, AD::IN_USB_HEADSET}) { + for (auto device : + {AD::OUT_HDMI, AD::OUT_WIRED_HEADPHONE, AD::IN_USB_HEADSET}) { address.device = device; ASSERT_OK(stream->setConnectedState(address, true)); @@ -777,13 +865,15 @@ static void testConnectedState(IStream* stream) { } } TEST_IO_STREAM(SetConnectedState, - "Check that the stream can be notified of device connection and deconnection", + "Check that the stream can be notified of device connection and " + "deconnection", testConnectedState(stream.get())) - -static auto invalidArgsOrNotSupported = {Result::INVALID_ARGUMENTS, Result::NOT_SUPPORTED}; +static auto invalidArgsOrNotSupported = {Result::INVALID_ARGUMENTS, + Result::NOT_SUPPORTED}; TEST_IO_STREAM(SetHwAvSync, "Try to set hardware sync to an invalid value", - ASSERT_RESULT(invalidArgsOrNotSupported, stream->setHwAvSync(666))) + ASSERT_RESULT(invalidArgsOrNotSupported, + stream->setHwAvSync(666))) TEST_IO_STREAM(GetHwAvSync, "Get hardware sync can not fail", ASSERT_TRUE(device->getHwAvSync().isOk())) @@ -799,7 +889,8 @@ static void checkGetParameter(IStream* stream, hidl_vec keys, } } -/* Get/Set parameter is intended to be an opaque channel between vendors app and their HALs. +/* Get/Set parameter is intended to be an opaque channel between vendors app and + * their HALs. * Thus can not be meaningfully tested. * TODO: Doc missing. Should asking for an empty set of params raise an error ? */ @@ -807,22 +898,27 @@ TEST_IO_STREAM(getEmptySetParameter, "Retrieve the values of an empty set", checkGetParameter(stream.get(), {} /* keys */, {Result::OK, Result::INVALID_ARGUMENTS})) - -TEST_IO_STREAM(getNonExistingParameter, "Retrieve the values of an non existing parameter", +TEST_IO_STREAM(getNonExistingParameter, + "Retrieve the values of an non existing parameter", checkGetParameter(stream.get(), {"Non existing key"} /* keys */, {Result::INVALID_ARGUMENTS})) -static vector okOrInvalidArguments = {Result::OK, Result::INVALID_ARGUMENTS}; -TEST_IO_STREAM(setEmptySetParameter, "Set the values of an empty set of parameters", +static vector okOrInvalidArguments = {Result::OK, + Result::INVALID_ARGUMENTS}; +TEST_IO_STREAM(setEmptySetParameter, + "Set the values of an empty set of parameters", ASSERT_RESULT(okOrInvalidArguments, stream->setParameters({}))) -TEST_IO_STREAM(setNonExistingParameter, "Set the values of an non existing parameter", - ASSERT_RESULT(Result::INVALID_ARGUMENTS, - stream->setParameters({{"non existing key", "0"}}))) +TEST_IO_STREAM( + setNonExistingParameter, "Set the values of an non existing parameter", + ASSERT_RESULT(Result::INVALID_ARGUMENTS, + stream->setParameters({{"non existing key", "0"}}))) TEST_IO_STREAM(DebugDump, "Check that a stream can dump its state without error", - testDebugDump([this](const auto& handle){ return stream->debugDump(handle); })) + testDebugDump([this](const auto& handle) { + return stream->debugDump(handle); + })) TEST_IO_STREAM(DebugDumpInvalidArguments, "Check that the stream dump doesn't crash on invalid arguments", @@ -834,39 +930,47 @@ TEST_IO_STREAM(DebugDumpInvalidArguments, TEST_IO_STREAM(AddNonExistingEffect, "Adding a non existing effect should fail", ASSERT_RESULT(Result::INVALID_ARGUMENTS, stream->addEffect(666))) -TEST_IO_STREAM(RemoveNonExistingEffect, "Removing a non existing effect should fail", - ASSERT_RESULT(Result::INVALID_ARGUMENTS, stream->removeEffect(666))) +TEST_IO_STREAM(RemoveNonExistingEffect, + "Removing a non existing effect should fail", + ASSERT_RESULT(Result::INVALID_ARGUMENTS, + stream->removeEffect(666))) -//TODO: positive tests +// TODO: positive tests ////////////////////////////////////////////////////////////////////////////// /////////////////////////////// Control //////////////////////////////// ////////////////////////////////////////////////////////////////////////////// TEST_IO_STREAM(standby, "Make sure the stream can be put in stanby", - ASSERT_OK(stream->standby())) // can not fail + ASSERT_OK(stream->standby())) // can not fail -static vector invalidStateOrNotSupported = {Result::INVALID_STATE, Result::NOT_SUPPORTED}; +static vector invalidStateOrNotSupported = {Result::INVALID_STATE, + Result::NOT_SUPPORTED}; -TEST_IO_STREAM(startNoMmap, "Starting a mmaped stream before mapping it should fail", +TEST_IO_STREAM(startNoMmap, + "Starting a mmaped stream before mapping it should fail", ASSERT_RESULT(invalidStateOrNotSupported, stream->start())) -TEST_IO_STREAM(stopNoMmap, "Stopping a mmaped stream before mapping it should fail", +TEST_IO_STREAM(stopNoMmap, + "Stopping a mmaped stream before mapping it should fail", ASSERT_RESULT(invalidStateOrNotSupported, stream->stop())) -TEST_IO_STREAM(getMmapPositionNoMmap, "Get a stream Mmap position before mapping it should fail", +TEST_IO_STREAM(getMmapPositionNoMmap, + "Get a stream Mmap position before mapping it should fail", ASSERT_RESULT(invalidStateOrNotSupported, stream->stop())) -TEST_IO_STREAM(close, "Make sure a stream can be closed", ASSERT_OK(closeStream())) +TEST_IO_STREAM(close, "Make sure a stream can be closed", + ASSERT_OK(closeStream())) TEST_IO_STREAM(closeTwice, "Make sure a stream can not be closed twice", - ASSERT_OK(closeStream()); \ + ASSERT_OK(closeStream()); ASSERT_RESULT(Result::INVALID_STATE, closeStream())) static void testCreateTooBigMmapBuffer(IStream* stream) { MmapBufferInfo info; Result res; // Assume that int max is a value too big to be allocated - // This is true currently with a 32bit media server, but might not when it will run in 64 bit + // This is true currently with a 32bit media server, but might not when it + // will run in 64 bit auto minSizeFrames = std::numeric_limits::max(); ASSERT_OK(stream->createMmapBuffer(minSizeFrames, returnIn(res, info))); ASSERT_RESULT(invalidArgsOrNotSupported, res); @@ -875,7 +979,6 @@ static void testCreateTooBigMmapBuffer(IStream* stream) { TEST_IO_STREAM(CreateTooBigMmapBuffer, "Create mmap buffer too big should fail", testCreateTooBigMmapBuffer(stream.get())) - static void testGetMmapPositionOfNonMmapedStream(IStream* stream) { Result res; MmapPosition position; @@ -883,33 +986,36 @@ static void testGetMmapPositionOfNonMmapedStream(IStream* stream) { ASSERT_RESULT(invalidArgsOrNotSupported, res); } -TEST_IO_STREAM(GetMmapPositionOfNonMmapedStream, - "Retrieving the mmap position of a non mmaped stream should fail", - testGetMmapPositionOfNonMmapedStream(stream.get())) +TEST_IO_STREAM( + GetMmapPositionOfNonMmapedStream, + "Retrieving the mmap position of a non mmaped stream should fail", + testGetMmapPositionOfNonMmapedStream(stream.get())) ////////////////////////////////////////////////////////////////////////////// ///////////////////////////////// StreamIn /////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// TEST_P(InputStreamTest, GetAudioSource) { - doc::test("Retrieving the audio source of an input stream should always succeed"); + doc::test( + "Retrieving the audio source of an input stream should always succeed"); AudioSource source; ASSERT_OK(stream->getAudioSource(returnIn(res, source))); ASSERT_OK(res); ASSERT_EQ(AudioSource::DEFAULT, source); } -static void testUnitaryGain(std::function (float)> setGain) { +static void testUnitaryGain(std::function(float)> setGain) { for (float value : {0.0, 0.01, 0.5, 0.09, 1.0}) { SCOPED_TRACE("value=" + to_string(value)); ASSERT_OK(setGain(value)); } - for (float value : (float[]){-INFINITY,-1.0, -0.0, - 1.0 + std::numeric_limits::epsilon(), 2.0, INFINITY, - NAN}) { + for (float value : (float[]){-INFINITY, -1.0, -0.0, + 1.0 + std::numeric_limits::epsilon(), + 2.0, INFINITY, NAN}) { SCOPED_TRACE("value=" + to_string(value)); // FIXME: NAN should never be accepted - // FIXME: Missing api doc. What should the impl do if the volume is outside [0,1] ? + // FIXME: Missing api doc. What should the impl do if the volume is + // outside [0,1] ? ASSERT_RESULT(Result::INVALID_ARGUMENTS, setGain(value)); } } @@ -919,27 +1025,34 @@ TEST_P(InputStreamTest, SetGain) { testUnitaryGain([this](float volume) { return stream->setGain(volume); }); } -static void testPrepareForReading(IStreamIn* stream, uint32_t frameSize, uint32_t framesCount) { +static void testPrepareForReading(IStreamIn* stream, uint32_t frameSize, + uint32_t framesCount) { Result res; // Ignore output parameters as the call should fail - ASSERT_OK(stream->prepareForReading(frameSize, framesCount, - [&res](auto r, auto&, auto&, auto&, auto&) { res = r; })); + ASSERT_OK(stream->prepareForReading( + frameSize, framesCount, + [&res](auto r, auto&, auto&, auto&, auto&) { res = r; })); EXPECT_RESULT(invalidArgsOrNotSupported, res); } TEST_P(InputStreamTest, PrepareForReadingWithHugeBuffer) { - doc::test("Preparing a stream for reading with a 2^32 sized buffer should fail"); - testPrepareForReading(stream.get(), 1, std::numeric_limits::max()); + doc::test( + "Preparing a stream for reading with a 2^32 sized buffer should fail"); + testPrepareForReading(stream.get(), 1, + std::numeric_limits::max()); } TEST_P(InputStreamTest, PrepareForReadingCheckOverflow) { - doc::test("Preparing a stream for reading with a overflowing sized buffer should fail"); + doc::test( + "Preparing a stream for reading with a overflowing sized buffer should " + "fail"); auto uintMax = std::numeric_limits::max(); testPrepareForReading(stream.get(), uintMax, uintMax); } TEST_P(InputStreamTest, GetInputFramesLost) { - doc::test("The number of frames lost on a never started stream should be 0"); + doc::test( + "The number of frames lost on a never started stream should be 0"); auto ret = stream->getInputFramesLost(); ASSERT_TRUE(ret.isOk()); uint32_t framesLost{ret}; @@ -947,7 +1060,9 @@ TEST_P(InputStreamTest, GetInputFramesLost) { } TEST_P(InputStreamTest, getCapturePosition) { - doc::test("The capture position of a non prepared stream should not be retrievable"); + doc::test( + "The capture position of a non prepared stream should not be " + "retrievable"); uint64_t frames; uint64_t time; ASSERT_OK(stream->getCapturePosition(returnIn(res, frames, time))); @@ -973,24 +1088,31 @@ TEST_P(OutputStreamTest, setVolume) { doc::partialTest("setVolume is not supported"); return; } - testUnitaryGain([this](float volume) { return stream->setVolume(volume, volume); }); + testUnitaryGain( + [this](float volume) { return stream->setVolume(volume, volume); }); } -static void testPrepareForWriting(IStreamOut* stream, uint32_t frameSize, uint32_t framesCount) { +static void testPrepareForWriting(IStreamOut* stream, uint32_t frameSize, + uint32_t framesCount) { Result res; // Ignore output parameters as the call should fail - ASSERT_OK(stream->prepareForWriting(frameSize, framesCount, - [&res](auto r, auto&, auto&, auto&, auto&) { res = r; })); + ASSERT_OK(stream->prepareForWriting( + frameSize, framesCount, + [&res](auto r, auto&, auto&, auto&, auto&) { res = r; })); EXPECT_RESULT(invalidArgsOrNotSupported, res); } TEST_P(OutputStreamTest, PrepareForWriteWithHugeBuffer) { - doc::test("Preparing a stream for writing with a 2^32 sized buffer should fail"); - testPrepareForWriting(stream.get(), 1, std::numeric_limits::max()); + doc::test( + "Preparing a stream for writing with a 2^32 sized buffer should fail"); + testPrepareForWriting(stream.get(), 1, + std::numeric_limits::max()); } TEST_P(OutputStreamTest, PrepareForWritingCheckOverflow) { - doc::test("Preparing a stream for writing with a overflowing sized buffer should fail"); + doc::test( + "Preparing a stream for writing with a overflowing sized buffer should " + "fail"); auto uintMax = std::numeric_limits::max(); testPrepareForWriting(stream.get(), uintMax, uintMax); } @@ -1010,7 +1132,8 @@ struct Capability { }; TEST_P(OutputStreamTest, SupportsPauseAndResumeAndDrain) { - doc::test("Implementation must expose pause, resume and drain capabilities"); + doc::test( + "Implementation must expose pause, resume and drain capabilities"); Capability(stream.get()); } @@ -1044,16 +1167,19 @@ class MockOutCallbacks : public IStreamOutCallback { Return onError() override { return {}; } }; -static bool isAsyncModeSupported(IStreamOut *stream) { +static bool isAsyncModeSupported(IStreamOut* stream) { auto res = stream->setCallback(new MockOutCallbacks); - stream->clearCallback(); // try to restore the no callback state, ignore any error - auto okOrNotSupported = { Result::OK, Result::NOT_SUPPORTED }; + stream->clearCallback(); // try to restore the no callback state, ignore + // any error + auto okOrNotSupported = {Result::OK, Result::NOT_SUPPORTED}; EXPECT_RESULT(okOrNotSupported, res); return res.isOk() ? res == Result::OK : false; } TEST_P(OutputStreamTest, SetCallback) { - doc::test("If supported, registering callback for async operation should never fail"); + doc::test( + "If supported, registering callback for async operation should never " + "fail"); if (!isAsyncModeSupported(stream.get())) { doc::partialTest("The stream does not support async operations"); return; @@ -1063,7 +1189,9 @@ TEST_P(OutputStreamTest, SetCallback) { } TEST_P(OutputStreamTest, clearCallback) { - doc::test("If supported, clearing a callback to go back to sync operation should not fail"); + doc::test( + "If supported, clearing a callback to go back to sync operation should " + "not fail"); if (!isAsyncModeSupported(stream.get())) { doc::partialTest("The stream does not support async operations"); return; @@ -1074,7 +1202,9 @@ TEST_P(OutputStreamTest, clearCallback) { } TEST_P(OutputStreamTest, Resume) { - doc::test("If supported, a stream should fail to resume if not previously paused"); + doc::test( + "If supported, a stream should fail to resume if not previously " + "paused"); if (!Capability(stream.get()).resume) { doc::partialTest("The output stream does not support resume"); return; @@ -1083,7 +1213,9 @@ TEST_P(OutputStreamTest, Resume) { } TEST_P(OutputStreamTest, Pause) { - doc::test("If supported, a stream should fail to pause if not previously started"); + doc::test( + "If supported, a stream should fail to pause if not previously " + "started"); if (!Capability(stream.get()).pause) { doc::partialTest("The output stream does not support pause"); return; @@ -1091,7 +1223,7 @@ TEST_P(OutputStreamTest, Pause) { ASSERT_RESULT(Result::INVALID_STATE, stream->resume()); } -static void testDrain(IStreamOut *stream, AudioDrain type) { +static void testDrain(IStreamOut* stream, AudioDrain type) { if (!Capability(stream).drain) { doc::partialTest("The output stream does not support drain"); return; @@ -1121,7 +1253,9 @@ TEST_P(OutputStreamTest, FlushStop) { } TEST_P(OutputStreamTest, GetPresentationPositionStop) { - doc::test("If supported, a stream should always succeed to retrieve the presentation position"); + doc::test( + "If supported, a stream should always succeed to retrieve the " + "presentation position"); uint64_t frames; TimeSpec mesureTS; ASSERT_OK(stream->getPresentationPosition(returnIn(res, frames, mesureTS))); @@ -1134,63 +1268,66 @@ TEST_P(OutputStreamTest, GetPresentationPositionStop) { struct timespec currentTS; ASSERT_EQ(0, clock_gettime(CLOCK_MONOTONIC, ¤tTS)) << errno; - auto toMicroSec = [](uint64_t sec, auto nsec) { return sec * 1e+6 + nsec / 1e+3; }; + auto toMicroSec = [](uint64_t sec, auto nsec) { + return sec * 1e+6 + nsec / 1e+3; + }; auto currentTime = toMicroSec(currentTS.tv_sec, currentTS.tv_nsec); auto mesureTime = toMicroSec(mesureTS.tvSec, mesureTS.tvNSec); - ASSERT_PRED2([](auto c, auto m){ return c - m < 1e+6; }, currentTime, mesureTime); + ASSERT_PRED2([](auto c, auto m) { return c - m < 1e+6; }, currentTime, + mesureTime); } - ////////////////////////////////////////////////////////////////////////////// /////////////////////////////// PrimaryDevice //////////////////////////////// ////////////////////////////////////////////////////////////////////////////// - TEST_F(AudioPrimaryHidlTest, setVoiceVolume) { doc::test("Make sure setVoiceVolume only succeed if volume is in [0,1]"); - testUnitaryGain([this](float volume) { return device->setVoiceVolume(volume); }); + testUnitaryGain( + [this](float volume) { return device->setVoiceVolume(volume); }); } TEST_F(AudioPrimaryHidlTest, setMode) { doc::test("Make sure setMode always succeeds if mode is valid"); - for (AudioMode mode : {AudioMode::IN_CALL, AudioMode::IN_COMMUNICATION, - AudioMode::RINGTONE, AudioMode::CURRENT, - AudioMode::NORMAL /* Make sure to leave the test in normal mode */ }) { + for (AudioMode mode : + {AudioMode::IN_CALL, AudioMode::IN_COMMUNICATION, AudioMode::RINGTONE, + AudioMode::CURRENT, + AudioMode::NORMAL /* Make sure to leave the test in normal mode */}) { SCOPED_TRACE("mode=" + toString(mode)); ASSERT_OK(device->setMode(mode)); } // FIXME: Missing api doc. What should the impl do if the mode is invalid ? - ASSERT_RESULT(Result::INVALID_ARGUMENTS, device->setMode(AudioMode::INVALID)); + ASSERT_RESULT(Result::INVALID_ARGUMENTS, + device->setMode(AudioMode::INVALID)); } - TEST_F(BoolAccessorPrimaryHidlTest, BtScoNrecEnabled) { doc::test("Query and set the BT SCO NR&EC state"); testOptionalAccessors("BtScoNrecEnabled", {true, false, true}, - &IPrimaryDevice::setBtScoNrecEnabled, - &IPrimaryDevice::getBtScoNrecEnabled); + &IPrimaryDevice::setBtScoNrecEnabled, + &IPrimaryDevice::getBtScoNrecEnabled); } TEST_F(BoolAccessorPrimaryHidlTest, setGetBtScoWidebandEnabled) { doc::test("Query and set the SCO whideband state"); testOptionalAccessors("BtScoWideband", {true, false, true}, - &IPrimaryDevice::setBtScoWidebandEnabled, - &IPrimaryDevice::getBtScoWidebandEnabled); + &IPrimaryDevice::setBtScoWidebandEnabled, + &IPrimaryDevice::getBtScoWidebandEnabled); } using TtyModeAccessorPrimaryHidlTest = AccessorPrimaryHidlTest; TEST_F(TtyModeAccessorPrimaryHidlTest, setGetTtyMode) { doc::test("Query and set the TTY mode state"); - testOptionalAccessors("TTY mode", {TtyMode::OFF, TtyMode::HCO, TtyMode::VCO, TtyMode::FULL}, - &IPrimaryDevice::setTtyMode, &IPrimaryDevice::getTtyMode); + testOptionalAccessors( + "TTY mode", {TtyMode::OFF, TtyMode::HCO, TtyMode::VCO, TtyMode::FULL}, + &IPrimaryDevice::setTtyMode, &IPrimaryDevice::getTtyMode); } TEST_F(BoolAccessorPrimaryHidlTest, setGetHac) { doc::test("Query and set the HAC state"); - testAccessors("HAC", {true, false, true}, - &IPrimaryDevice::setHacEnabled, - &IPrimaryDevice::getHacEnabled); + testAccessors("HAC", {true, false, true}, &IPrimaryDevice::setHacEnabled, + &IPrimaryDevice::getHacEnabled); } ////////////////////////////////////////////////////////////////////////////// diff --git a/audio/2.0/vts/functional/utility/AssertOk.h b/audio/2.0/vts/functional/utility/AssertOk.h index 10b088c374..6891dc4af8 100644 --- a/audio/2.0/vts/functional/utility/AssertOk.h +++ b/audio/2.0/vts/functional/utility/AssertOk.h @@ -14,14 +14,15 @@ * limitations under the License. */ -#include #include +#include #include namespace detail { -// This is a detail namespace, thus it is OK to import a class as nobody else is allowed to use it +// This is a detail namespace, thus it is OK to import a class as nobody else is +// allowed to use it using ::android::hardware::Return; using ::android::hardware::audio::V2_0::Result; @@ -29,27 +30,28 @@ inline void assertResult(Result expected, Result result) { ASSERT_EQ(expected, result); } -inline void assertResult(Result expected, const Return &ret) { +inline void assertResult(Result expected, const Return& ret) { ASSERT_TRUE(ret.isOk()); Result result = ret; assertResult(expected, result); } -inline void assertResult(const std::vector &expected, Result result) { +inline void assertResult(const std::vector& expected, Result result) { if (std::find(expected.begin(), expected.end(), result) != expected.end()) { - return; // result is in expected + return; // result is in expected } FAIL() << "Expected result " << ::testing::PrintToString(result) << " to be one of " << ::testing::PrintToString(expected); } -inline void assertResult(const std::vector &expected, const Return &ret) { +inline void assertResult(const std::vector& expected, + const Return& ret) { ASSERT_TRUE(ret.isOk()); Result result = ret; assertResult(expected, result); } -inline void assertOk(const Return &ret) { +inline void assertOk(const Return& ret) { ASSERT_TRUE(ret.isOk()); } @@ -57,15 +59,16 @@ inline void assertOk(Result result) { assertResult(Result::OK, result); } -inline void assertOk(const Return &ret) { +inline void assertOk(const Return& ret) { assertResult(Result::OK, ret); } - } // Test anything provided is and contains only OK #define ASSERT_OK(ret) ASSERT_NO_FATAL_FAILURE(detail::assertOk(ret)) #define EXPECT_OK(ret) EXPECT_NO_FATAL_FAILURE(detail::assertOk(ret)) -#define ASSERT_RESULT(expected, ret) ASSERT_NO_FATAL_FAILURE(detail::assertResult(expected, ret)) -#define EXPECT_RESULT(expected, ret) EXPECT_NO_FATAL_FAILURE(detail::assertResult(expected, ret)) +#define ASSERT_RESULT(expected, ret) \ + ASSERT_NO_FATAL_FAILURE(detail::assertResult(expected, ret)) +#define EXPECT_RESULT(expected, ret) \ + EXPECT_NO_FATAL_FAILURE(detail::assertResult(expected, ret))