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