diff options
Diffstat (limited to 'audio')
7 files changed, 99 insertions, 24 deletions
diff --git a/audio/common/all-versions/default/include/common/all-versions/default/HidlUtils.impl.h b/audio/common/all-versions/default/include/common/all-versions/default/HidlUtils.impl.h index 8ab73501b..632e81607 100644 --- a/audio/common/all-versions/default/include/common/all-versions/default/HidlUtils.impl.h +++ b/audio/common/all-versions/default/include/common/all-versions/default/HidlUtils.impl.h @@ -174,9 +174,9 @@ void HidlUtils::audioPortConfigFromHal(const struct audio_port_config& halConfig config->ext.mix.hwModule = halConfig.ext.mix.hw_module; config->ext.mix.ioHandle = halConfig.ext.mix.handle; if (halConfig.role == AUDIO_PORT_ROLE_SOURCE) { - config->ext.mix.useCase.source = AudioSource(halConfig.ext.mix.usecase.source); - } else if (halConfig.role == AUDIO_PORT_ROLE_SINK) { config->ext.mix.useCase.stream = AudioStreamType(halConfig.ext.mix.usecase.stream); + } else if (halConfig.role == AUDIO_PORT_ROLE_SINK) { + config->ext.mix.useCase.source = AudioSource(halConfig.ext.mix.usecase.source); } break; } @@ -212,11 +212,11 @@ void HidlUtils::audioPortConfigToHal(const AudioPortConfig& config, halConfig->ext.mix.hw_module = config.ext.mix.hwModule; halConfig->ext.mix.handle = config.ext.mix.ioHandle; if (config.role == AudioPortRole::SOURCE) { - halConfig->ext.mix.usecase.source = - static_cast<audio_source_t>(config.ext.mix.useCase.source); - } else if (config.role == AudioPortRole::SINK) { halConfig->ext.mix.usecase.stream = static_cast<audio_stream_type_t>(config.ext.mix.useCase.stream); + } else if (config.role == AudioPortRole::SINK) { + halConfig->ext.mix.usecase.source = + static_cast<audio_source_t>(config.ext.mix.useCase.source); } break; } diff --git a/audio/core/4.0/vts/functional/Android.bp b/audio/core/4.0/vts/functional/Android.bp index 22c5493dd..e3b376ca8 100644 --- a/audio/core/4.0/vts/functional/Android.bp +++ b/audio/core/4.0/vts/functional/Android.bp @@ -29,6 +29,9 @@ cc_test { "libicuuc_stubdata", "libxml2", ], + shared_libs: [ + "libfmq", + ], header_libs: [ "android.hardware.audio.common.util@all-versions", ], diff --git a/audio/core/4.0/vts/functional/AudioPrimaryHidlHalTest.cpp b/audio/core/4.0/vts/functional/AudioPrimaryHidlHalTest.cpp index 9c9b74992..f4ab54241 100644 --- a/audio/core/4.0/vts/functional/AudioPrimaryHidlHalTest.cpp +++ b/audio/core/4.0/vts/functional/AudioPrimaryHidlHalTest.cpp @@ -38,6 +38,8 @@ #include <android/hardware/audio/4.0/IPrimaryDevice.h> #include <android/hardware/audio/4.0/types.h> #include <android/hardware/audio/common/4.0/types.h> +#include <fmq/EventFlag.h> +#include <fmq/MessageQueue.h> #include <common/all-versions/VersionUtils.h> @@ -55,13 +57,16 @@ using std::vector; using std::list; using ::android::sp; -using ::android::hardware::Return; +using ::android::hardware::EventFlag; using ::android::hardware::hidl_bitfield; using ::android::hardware::hidl_enum_range; using ::android::hardware::hidl_handle; using ::android::hardware::hidl_string; using ::android::hardware::hidl_vec; +using ::android::hardware::kSynchronizedReadWrite; +using ::android::hardware::MessageQueue; using ::android::hardware::MQDescriptorSync; +using ::android::hardware::Return; using ::android::hardware::audio::V4_0::AudioDrain; using ::android::hardware::audio::V4_0::DeviceAddress; using ::android::hardware::audio::V4_0::IDevice; @@ -71,6 +76,7 @@ using TtyMode = ::android::hardware::audio::V4_0::IPrimaryDevice::TtyMode; using ::android::hardware::audio::V4_0::IDevicesFactory; using ::android::hardware::audio::V4_0::IStream; using ::android::hardware::audio::V4_0::IStreamIn; +using ::android::hardware::audio::V4_0::MessageQueueFlagBits; using ::android::hardware::audio::V4_0::TimeSpec; using ReadParameters = ::android::hardware::audio::V4_0::IStreamIn::ReadParameters; using ReadStatus = ::android::hardware::audio::V4_0::IStreamIn::ReadStatus; @@ -489,7 +495,7 @@ TEST_F(AudioPrimaryHidlTest, getParameters) { } ////////////////////////////////////////////////////////////////////////////// -/////////////////////////////// getMicrophones /////////////////////////////// +/////////////////////////// get(Active)Microphones /////////////////////////// ////////////////////////////////////////////////////////////////////////////// TEST_F(AudioPrimaryHidlTest, GetMicrophonesTest) { @@ -497,6 +503,76 @@ TEST_F(AudioPrimaryHidlTest, GetMicrophonesTest) { hidl_vec<MicrophoneInfo> microphones; ASSERT_OK(device->getMicrophones(returnIn(res, microphones))); ASSERT_OK(res); + if (microphones.size() > 0) { + // When there is microphone on the phone, try to open an input stream + // and query for the active microphones. + doc::test( + "Make sure getMicrophones always succeeds" + "and getActiveMicrophones always succeeds when recording from these microphones."); + AudioIoHandle ioHandle = (AudioIoHandle)AudioHandleConsts::AUDIO_IO_HANDLE_NONE; + AudioConfig config{}; + config.channelMask = mkBitfield(AudioChannelMask::IN_MONO); + config.sampleRateHz = 8000; + config.format = AudioFormat::PCM_16_BIT; + auto flags = hidl_bitfield<AudioInputFlag>(AudioInputFlag::NONE); + const SinkMetadata initialMetadata = {{{AudioSource::MIC, 1 /* gain */}}}; + EventFlag* efGroup; + for (auto microphone : microphones) { + if (microphone.deviceAddress.device != AudioDevice::IN_BUILTIN_MIC) { + continue; + } + sp<IStreamIn> stream; + AudioConfig suggestedConfig{}; + ASSERT_OK(device->openInputStream(ioHandle, microphone.deviceAddress, config, flags, + initialMetadata, + returnIn(res, stream, suggestedConfig))); + if (res != Result::OK) { + ASSERT_TRUE(stream == nullptr); + AudioConfig suggestedConfigRetry{}; + ASSERT_OK(device->openInputStream(ioHandle, microphone.deviceAddress, + suggestedConfig, flags, initialMetadata, + returnIn(res, stream, suggestedConfigRetry))); + } + ASSERT_OK(res); + hidl_vec<MicrophoneInfo> activeMicrophones; + Result readRes; + typedef MessageQueue<ReadParameters, kSynchronizedReadWrite> CommandMQ; + typedef MessageQueue<uint8_t, kSynchronizedReadWrite> DataMQ; + std::unique_ptr<CommandMQ> commandMQ; + std::unique_ptr<DataMQ> dataMQ; + size_t frameSize = stream->getFrameSize(); + size_t frameCount = stream->getBufferSize() / frameSize; + ASSERT_OK(stream->prepareForReading( + frameSize, frameCount, [&](auto r, auto& c, auto& d, auto&, auto&) { + readRes = r; + if (readRes == Result::OK) { + commandMQ.reset(new CommandMQ(c)); + dataMQ.reset(new DataMQ(d)); + if (dataMQ->isValid() && dataMQ->getEventFlagWord()) { + EventFlag::createEventFlag(dataMQ->getEventFlagWord(), &efGroup); + } + } + })); + ASSERT_OK(readRes); + ReadParameters params; + params.command = IStreamIn::ReadCommand::READ; + ASSERT_TRUE(commandMQ != nullptr); + ASSERT_TRUE(commandMQ->isValid()); + ASSERT_TRUE(commandMQ->write(¶ms)); + efGroup->wake(static_cast<uint32_t>(MessageQueueFlagBits::NOT_FULL)); + uint32_t efState = 0; + efGroup->wait(static_cast<uint32_t>(MessageQueueFlagBits::NOT_EMPTY), &efState); + if (efState & static_cast<uint32_t>(MessageQueueFlagBits::NOT_EMPTY)) { + ASSERT_OK(stream->getActiveMicrophones(returnIn(res, activeMicrophones))); + ASSERT_OK(res); + ASSERT_NE(0U, activeMicrophones.size()); + } + stream->close(); + if (efGroup) { + EventFlag::deleteEventFlag(&efGroup); + } + } + } } ////////////////////////////////////////////////////////////////////////////// @@ -1104,14 +1180,6 @@ TEST_P(InputStreamTest, updateSinkMetadata) { ASSERT_OK(stream->updateSinkMetadata(initialMetadata)); } -TEST_P(InputStreamTest, getActiveMicrophones) { - doc::test("Getting active microphones should always succeed"); - hidl_vec<MicrophoneInfo> microphones; - ASSERT_OK(device->getMicrophones(returnIn(res, microphones))); - ASSERT_OK(res); - ASSERT_TRUE(microphones.size() > 0); -} - ////////////////////////////////////////////////////////////////////////////// ///////////////////////////////// StreamOut ////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// diff --git a/audio/core/all-versions/default/include/core/all-versions/default/Device.h b/audio/core/all-versions/default/include/core/all-versions/default/Device.h index eb53b482b..222d3dedc 100644 --- a/audio/core/all-versions/default/include/core/all-versions/default/Device.h +++ b/audio/core/all-versions/default/include/core/all-versions/default/Device.h @@ -124,7 +124,8 @@ struct Device : public IDevice, public ParametersUtil { Return<void> debug(const hidl_handle& fd, const hidl_vec<hidl_string>& options) override; // Utility methods for extending interfaces. - Result analyzeStatus(const char* funcName, int status); + Result analyzeStatus(const char* funcName, int status, + const std::vector<int>& ignoreErrors = {}); void closeInputStream(audio_stream_in_t* stream); void closeOutputStream(audio_stream_out_t* stream); audio_hw_device_t* device() const { return mDevice; } diff --git a/audio/core/all-versions/default/include/core/all-versions/default/Device.impl.h b/audio/core/all-versions/default/include/core/all-versions/default/Device.impl.h index 230b8de24..52d21869d 100644 --- a/audio/core/all-versions/default/include/core/all-versions/default/Device.impl.h +++ b/audio/core/all-versions/default/include/core/all-versions/default/Device.impl.h @@ -40,8 +40,9 @@ Device::~Device() { mDevice = nullptr; } -Result Device::analyzeStatus(const char* funcName, int status) { - return util::analyzeStatus("Device", funcName, status); +Result Device::analyzeStatus(const char* funcName, int status, + const std::vector<int>& ignoreErrors) { + return util::analyzeStatus("Device", funcName, status, ignoreErrors); } void Device::closeInputStream(audio_stream_in_t* stream) { @@ -155,7 +156,8 @@ Return<void> Device::openOutputStream(int32_t ioHandle, const DeviceAddress& dev } AudioConfig suggestedConfig; HidlUtils::audioConfigFromHal(halConfig, &suggestedConfig); - _hidl_cb(analyzeStatus("open_output_stream", status), streamOut, suggestedConfig); + _hidl_cb(analyzeStatus("open_output_stream", status, {EINVAL} /* ignore */), streamOut, + suggestedConfig); return Void(); } @@ -183,7 +185,8 @@ Return<void> Device::openInputStream(int32_t ioHandle, const DeviceAddress& devi } AudioConfig suggestedConfig; HidlUtils::audioConfigFromHal(halConfig, &suggestedConfig); - _hidl_cb(analyzeStatus("open_input_stream", status), streamIn, suggestedConfig); + _hidl_cb(analyzeStatus("open_input_stream", status, {EINVAL} /* ignore */), streamIn, + suggestedConfig); return Void(); } diff --git a/audio/core/all-versions/default/include/core/all-versions/default/DevicesFactory.impl.h b/audio/core/all-versions/default/include/core/all-versions/default/DevicesFactory.impl.h index 43e5d6eae..a9f59fbfe 100644 --- a/audio/core/all-versions/default/include/core/all-versions/default/DevicesFactory.impl.h +++ b/audio/core/all-versions/default/include/core/all-versions/default/DevicesFactory.impl.h @@ -106,8 +106,8 @@ out: return rc; } -IDevicesFactory* HIDL_FETCH_IDevicesFactory(const char* /* name */) { - return new DevicesFactory(); +IDevicesFactory* HIDL_FETCH_IDevicesFactory(const char* name) { + return strcmp(name, "default") == 0 ? new DevicesFactory() : nullptr; } } // namespace implementation diff --git a/audio/effect/all-versions/default/include/effect/all-versions/default/EffectsFactory.impl.h b/audio/effect/all-versions/default/include/effect/all-versions/default/EffectsFactory.impl.h index 1882a2c49..f27c739dc 100644 --- a/audio/effect/all-versions/default/include/effect/all-versions/default/EffectsFactory.impl.h +++ b/audio/effect/all-versions/default/include/effect/all-versions/default/EffectsFactory.impl.h @@ -183,8 +183,8 @@ Return<void> EffectsFactory::debug(const hidl_handle& fd, return Void(); } -IEffectsFactory* HIDL_FETCH_IEffectsFactory(const char* /* name */) { - return new EffectsFactory(); +IEffectsFactory* HIDL_FETCH_IEffectsFactory(const char* name) { + return strcmp(name, "default") == 0 ? new EffectsFactory() : nullptr; } } // namespace implementation |