mirror of
https://github.com/Evolution-X/hardware_interfaces
synced 2026-02-02 02:42:35 +00:00
audio: Add microphone settings to IModule, IStreamIn
Add 'MicrophoneInfo' and 'MicrophoneDynamicInfo' parcelables. Add IModule.getMicrophones method. Add following methods to IStreamIn: - getActiveMicrophonesIds; - get/setMicrophoneDirection; - get/setMicrophoneFieldDimension. Provide trivial implementations and VTS. Also slightly refactor port retrieval from ModuleConfig to unify common queries. Bug: 205884982 Test: atest VtsHalAudioCoreTargetTest Change-Id: I472c7733e2a331a67cea613cd9218889eff06a43
This commit is contained in:
@@ -28,6 +28,7 @@ using namespace std::chrono_literals;
|
||||
|
||||
using aidl::android::hardware::audio::core::IModule;
|
||||
using aidl::android::media::audio::common::AudioChannelLayout;
|
||||
using aidl::android::media::audio::common::AudioDeviceType;
|
||||
using aidl::android::media::audio::common::AudioEncapsulationMode;
|
||||
using aidl::android::media::audio::common::AudioFormatDescription;
|
||||
using aidl::android::media::audio::common::AudioFormatType;
|
||||
@@ -62,6 +63,18 @@ std::optional<AudioOffloadInfo> ModuleConfig::generateOffloadInfoIfNeeded(
|
||||
return {};
|
||||
}
|
||||
|
||||
// static
|
||||
std::vector<aidl::android::media::audio::common::AudioPort> ModuleConfig::getBuiltInMicPorts(
|
||||
const std::vector<aidl::android::media::audio::common::AudioPort>& ports) {
|
||||
std::vector<AudioPort> result;
|
||||
std::copy_if(ports.begin(), ports.end(), std::back_inserter(result), [](const auto& port) {
|
||||
const auto type = port.ext.template get<AudioPortExt::Tag::device>().device.type;
|
||||
return type.connection.empty() && (type.type == AudioDeviceType::IN_MICROPHONE ||
|
||||
type.type == AudioDeviceType::IN_MICROPHONE_BACK);
|
||||
});
|
||||
return result;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
auto findById(const std::vector<T>& v, int32_t id) {
|
||||
return std::find_if(v.begin(), v.end(), [&](const auto& p) { return p.id == id; });
|
||||
@@ -107,38 +120,45 @@ std::vector<AudioPort> ModuleConfig::getExternalDevicePorts() const {
|
||||
return result;
|
||||
}
|
||||
|
||||
std::vector<AudioPort> ModuleConfig::getInputMixPorts() const {
|
||||
std::vector<AudioPort> ModuleConfig::getInputMixPorts(bool attachedOnly) const {
|
||||
std::vector<AudioPort> result;
|
||||
std::copy_if(mPorts.begin(), mPorts.end(), std::back_inserter(result), [](const auto& port) {
|
||||
std::copy_if(mPorts.begin(), mPorts.end(), std::back_inserter(result), [&](const auto& port) {
|
||||
return port.ext.getTag() == AudioPortExt::Tag::mix &&
|
||||
port.flags.getTag() == AudioIoFlags::Tag::input;
|
||||
port.flags.getTag() == AudioIoFlags::Tag::input &&
|
||||
(!attachedOnly || !getAttachedSourceDevicesPortsForMixPort(port).empty());
|
||||
});
|
||||
return result;
|
||||
}
|
||||
|
||||
std::vector<AudioPort> ModuleConfig::getOutputMixPorts() const {
|
||||
std::vector<AudioPort> ModuleConfig::getOutputMixPorts(bool attachedOnly) const {
|
||||
std::vector<AudioPort> result;
|
||||
std::copy_if(mPorts.begin(), mPorts.end(), std::back_inserter(result), [](const auto& port) {
|
||||
std::copy_if(mPorts.begin(), mPorts.end(), std::back_inserter(result), [&](const auto& port) {
|
||||
return port.ext.getTag() == AudioPortExt::Tag::mix &&
|
||||
port.flags.getTag() == AudioIoFlags::Tag::output;
|
||||
port.flags.getTag() == AudioIoFlags::Tag::output &&
|
||||
(!attachedOnly || !getAttachedSinkDevicesPortsForMixPort(port).empty());
|
||||
});
|
||||
return result;
|
||||
}
|
||||
|
||||
std::vector<AudioPort> ModuleConfig::getNonBlockingMixPorts(bool attachedOnly,
|
||||
bool singlePort) const {
|
||||
return findMixPorts(false /*isInput*/, singlePort, [&](const AudioPort& port) {
|
||||
return findMixPorts(false /*isInput*/, attachedOnly, singlePort, [&](const AudioPort& port) {
|
||||
return isBitPositionFlagSet(port.flags.get<AudioIoFlags::Tag::output>(),
|
||||
AudioOutputFlags::NON_BLOCKING) &&
|
||||
(!attachedOnly || !getAttachedSinkDevicesPortsForMixPort(port).empty());
|
||||
AudioOutputFlags::NON_BLOCKING);
|
||||
});
|
||||
}
|
||||
|
||||
std::vector<AudioPort> ModuleConfig::getOffloadMixPorts(bool attachedOnly, bool singlePort) const {
|
||||
return findMixPorts(false /*isInput*/, singlePort, [&](const AudioPort& port) {
|
||||
return findMixPorts(false /*isInput*/, attachedOnly, singlePort, [&](const AudioPort& port) {
|
||||
return isBitPositionFlagSet(port.flags.get<AudioIoFlags::Tag::output>(),
|
||||
AudioOutputFlags::COMPRESS_OFFLOAD) &&
|
||||
(!attachedOnly || !getAttachedSinkDevicesPortsForMixPort(port).empty());
|
||||
AudioOutputFlags::COMPRESS_OFFLOAD);
|
||||
});
|
||||
}
|
||||
|
||||
std::vector<AudioPort> ModuleConfig::getPrimaryMixPorts(bool attachedOnly, bool singlePort) const {
|
||||
return findMixPorts(false /*isInput*/, attachedOnly, singlePort, [&](const AudioPort& port) {
|
||||
return isBitPositionFlagSet(port.flags.get<AudioIoFlags::Tag::output>(),
|
||||
AudioOutputFlags::PRIMARY);
|
||||
});
|
||||
}
|
||||
|
||||
@@ -193,7 +213,7 @@ std::optional<AudioPort> ModuleConfig::getSourceMixPortForAttachedDevice() const
|
||||
|
||||
std::optional<ModuleConfig::SrcSinkPair> ModuleConfig::getNonRoutableSrcSinkPair(
|
||||
bool isInput) const {
|
||||
const auto mixPorts = getMixPorts(isInput);
|
||||
const auto mixPorts = getMixPorts(isInput, false /*attachedOnly*/);
|
||||
std::set<std::pair<int32_t, int32_t>> allowedRoutes;
|
||||
for (const auto& route : mRoutes) {
|
||||
for (const auto srcPortId : route.sourcePortIds) {
|
||||
@@ -344,9 +364,10 @@ static bool isDynamicProfile(const AudioProfile& profile) {
|
||||
}
|
||||
|
||||
std::vector<AudioPort> ModuleConfig::findMixPorts(
|
||||
bool isInput, bool singlePort, std::function<bool(const AudioPort&)> pred) const {
|
||||
bool isInput, bool attachedOnly, bool singlePort,
|
||||
const std::function<bool(const AudioPort&)>& pred) const {
|
||||
std::vector<AudioPort> result;
|
||||
const auto mixPorts = getMixPorts(isInput);
|
||||
const auto mixPorts = getMixPorts(isInput, attachedOnly);
|
||||
for (auto mixPortIt = mixPorts.begin(); mixPortIt != mixPorts.end();) {
|
||||
mixPortIt = std::find_if(mixPortIt, mixPorts.end(), pred);
|
||||
if (mixPortIt == mixPorts.end()) break;
|
||||
|
||||
Reference in New Issue
Block a user