audio: Add fields belonged to APM XSD schema to HAL structs
Since APM XML configuration is being replaced with data
provided by the HAL, add data fields used to be in the APM XSD
schema to HAL structures. Summary of changes:
- Audio*Flags enum types moved to HAL types because flags
are specified for mixPorts in the APM config;
- AudioGainSys.useForVolume -> AudioGain
- added AudioPort.flags because they are specified in the
APM config for mixPorts; since AudioIoFlags is a union,
it will be used for determining the mix port role;
- AudioPortConfigSys.flags -> AudioPortConfig
this is for symmetry with AudioPort;
In C++:
- DeviceDescriptor.mEncodedFormats -> DeviceDescriptorBase
- IOProfile.max{Open|Active}Count -> AudioPort
- IOProfile.recommendedMuteDurationMs -> AudioPort
Flags are not moved out from PolicyAudioPort to AudioPort as it's
a non-trivial change.
Bug: 198812639
Test: atest audiofoundation_parcelable_test
Test: atest audiopolicy_tests
Change-Id: I7aca107f7e7f20c6cd97080327cb9e4589cbe544
diff --git a/media/libaudiofoundation/AudioGain.cpp b/media/libaudiofoundation/AudioGain.cpp
index 1a8fbf0..47e0edb 100644
--- a/media/libaudiofoundation/AudioGain.cpp
+++ b/media/libaudiofoundation/AudioGain.cpp
@@ -122,20 +122,20 @@
ConversionResult<AudioGain::Aidl> AudioGain::toParcelable() const {
media::audio::common::AudioGain aidl = VALUE_OR_RETURN(
legacy2aidl_audio_gain_AudioGain(mGain, mIsInput));
+ aidl.useForVolume = mUseForVolume;
media::AudioGainSys aidlSys;
aidlSys.index = VALUE_OR_RETURN(convertIntegral<int32_t>(mIndex));
aidlSys.isInput = mIsInput;
- aidlSys.useForVolume = mUseForVolume;
return std::make_pair(aidl, aidlSys);
}
ConversionResult<sp<AudioGain>> AudioGain::fromParcelable(const AudioGain::Aidl& aidl) {
+ const media::audio::common::AudioGain& hal = aidl.first;
const media::AudioGainSys& sys = aidl.second;
auto index = VALUE_OR_RETURN(convertIntegral<int>(sys.index));
sp<AudioGain> legacy = sp<AudioGain>::make(index, sys.isInput);
- legacy->mGain = VALUE_OR_RETURN(
- aidl2legacy_AudioGain_audio_gain(aidl.first, sys.isInput));
- legacy->mUseForVolume = sys.useForVolume;
+ legacy->mGain = VALUE_OR_RETURN(aidl2legacy_AudioGain_audio_gain(hal, sys.isInput));
+ legacy->mUseForVolume = hal.useForVolume;
return legacy;
}
diff --git a/media/libaudiofoundation/AudioPort.cpp b/media/libaudiofoundation/AudioPort.cpp
index 099aff4..a00e00d 100644
--- a/media/libaudiofoundation/AudioPort.cpp
+++ b/media/libaudiofoundation/AudioPort.cpp
@@ -219,6 +219,14 @@
auto aidlGains = VALUE_OR_RETURN_STATUS(legacy2aidl_AudioGains(mGains));
parcelable->hal.gains = aidlGains.first;
parcelable->sys.gains = aidlGains.second;
+ if (mType == AUDIO_PORT_TYPE_MIX) {
+ media::audio::common::AudioPortMixExt mixExt{};
+ mixExt.maxOpenStreamCount = maxOpenCount;
+ mixExt.maxActiveStreamCount = maxActiveCount;
+ mixExt.recommendedMuteDurationMs = recommendedMuteDurationMs;
+ parcelable->hal.ext = media::audio::common::AudioPortExt::make<
+ media::audio::common::AudioPortExt::mix>(mixExt);
+ }
return OK;
}
@@ -241,6 +249,13 @@
mExtraAudioDescriptors = parcelable.hal.extraAudioDescriptors;
mGains = VALUE_OR_RETURN_STATUS(
aidl2legacy_AudioGains(std::make_pair(parcelable.hal.gains, parcelable.sys.gains)));
+ if (mType == AUDIO_PORT_TYPE_MIX) {
+ const media::audio::common::AudioPortMixExt& mixExt =
+ parcelable.hal.ext.get<media::audio::common::AudioPortExt::mix>();
+ maxOpenCount = mixExt.maxOpenStreamCount;
+ maxActiveCount = mixExt.maxActiveStreamCount;
+ recommendedMuteDurationMs = mixExt.recommendedMuteDurationMs;
+ }
return OK;
}
diff --git a/media/libaudiofoundation/DeviceDescriptorBase.cpp b/media/libaudiofoundation/DeviceDescriptorBase.cpp
index cf829b5..b383db4 100644
--- a/media/libaudiofoundation/DeviceDescriptorBase.cpp
+++ b/media/libaudiofoundation/DeviceDescriptorBase.cpp
@@ -30,16 +30,20 @@
{
}
-DeviceDescriptorBase::DeviceDescriptorBase(audio_devices_t type, const std::string& address) :
- DeviceDescriptorBase(AudioDeviceTypeAddr(type, address))
+DeviceDescriptorBase::DeviceDescriptorBase(
+ audio_devices_t type, const std::string& address,
+ const FormatVector &encodedFormats) :
+ DeviceDescriptorBase(AudioDeviceTypeAddr(type, address), encodedFormats)
{
}
-DeviceDescriptorBase::DeviceDescriptorBase(const AudioDeviceTypeAddr &deviceTypeAddr) :
+DeviceDescriptorBase::DeviceDescriptorBase(
+ const AudioDeviceTypeAddr &deviceTypeAddr, const FormatVector &encodedFormats) :
AudioPort("", AUDIO_PORT_TYPE_DEVICE,
audio_is_output_device(deviceTypeAddr.mType) ? AUDIO_PORT_ROLE_SINK :
AUDIO_PORT_ROLE_SOURCE),
- mDeviceTypeAddr(deviceTypeAddr)
+ mDeviceTypeAddr(deviceTypeAddr),
+ mEncodedFormats(encodedFormats)
{
if (mDeviceTypeAddr.address().empty() && audio_is_remote_submix_device(mDeviceTypeAddr.mType)) {
mDeviceTypeAddr.setAddress("0");
@@ -148,12 +152,35 @@
AudioPort::log(" ");
}
+template<typename T>
+bool checkEqual(const T& f1, const T& f2)
+{
+ std::set<typename T::value_type> s1(f1.begin(), f1.end());
+ std::set<typename T::value_type> s2(f2.begin(), f2.end());
+ return s1 == s2;
+}
+
bool DeviceDescriptorBase::equals(const sp<DeviceDescriptorBase> &other) const
{
return other != nullptr &&
static_cast<const AudioPort*>(this)->equals(other) &&
static_cast<const AudioPortConfig*>(this)->equals(other) &&
- mDeviceTypeAddr.equals(other->mDeviceTypeAddr);
+ mDeviceTypeAddr.equals(other->mDeviceTypeAddr) &&
+ checkEqual(mEncodedFormats, other->mEncodedFormats);
+}
+
+bool DeviceDescriptorBase::supportsFormat(audio_format_t format)
+{
+ if (mEncodedFormats.empty()) {
+ return true;
+ }
+
+ for (const auto& devFormat : mEncodedFormats) {
+ if (devFormat == format) {
+ return true;
+ }
+ }
+ return false;
}
@@ -169,9 +196,13 @@
AudioPortConfig::writeToParcelable(&parcelable->hal.activeConfig, useInputChannelMask());
parcelable->hal.id = VALUE_OR_RETURN_STATUS(legacy2aidl_audio_port_handle_t_int32_t(mId));
- media::audio::common::AudioDevice device = VALUE_OR_RETURN_STATUS(
+ media::audio::common::AudioPortDeviceExt deviceExt;
+ deviceExt.device = VALUE_OR_RETURN_STATUS(
legacy2aidl_AudioDeviceTypeAddress(mDeviceTypeAddr));
- UNION_SET(parcelable->hal.ext, device, device);
+ deviceExt.encodedFormats = VALUE_OR_RETURN_STATUS(
+ convertContainer<std::vector<media::audio::common::AudioFormatDescription>>(
+ mEncodedFormats, legacy2aidl_audio_format_t_AudioFormatDescription));
+ UNION_SET(parcelable->hal.ext, device, deviceExt);
media::AudioPortDeviceExtSys deviceSys;
deviceSys.encapsulationModes = VALUE_OR_RETURN_STATUS(
legacy2aidl_AudioEncapsulationMode_mask(mEncapsulationModes));
@@ -198,10 +229,13 @@
return status;
}
- media::audio::common::AudioDevice device = VALUE_OR_RETURN_STATUS(
+ media::audio::common::AudioPortDeviceExt deviceExt = VALUE_OR_RETURN_STATUS(
UNION_GET(parcelable.hal.ext, device));
mDeviceTypeAddr = VALUE_OR_RETURN_STATUS(
- aidl2legacy_AudioDeviceTypeAddress(device));
+ aidl2legacy_AudioDeviceTypeAddress(deviceExt.device));
+ mEncodedFormats = VALUE_OR_RETURN_STATUS(
+ convertContainer<FormatVector>(deviceExt.encodedFormats,
+ aidl2legacy_AudioFormatDescription_audio_format_t));
media::AudioPortDeviceExtSys deviceSys = VALUE_OR_RETURN_STATUS(
UNION_GET(parcelable.sys.ext, device));
mEncapsulationModes = VALUE_OR_RETURN_STATUS(
diff --git a/media/libaudiofoundation/include/media/AudioPort.h b/media/libaudiofoundation/include/media/AudioPort.h
index aa9b5f6..b5a17c9 100644
--- a/media/libaudiofoundation/include/media/AudioPort.h
+++ b/media/libaudiofoundation/include/media/AudioPort.h
@@ -106,6 +106,21 @@
status_t readFromParcelable(const media::AudioPort& parcelable);
AudioGains mGains; // gain controllers
+ // Maximum number of input or output streams that can be simultaneously
+ // opened for this profile. By convention 0 means no limit. To respect
+ // legacy behavior, initialized to 1 for output profiles and 0 for input
+ // profiles
+ // FIXME: IOProfile code used the same value for both cases.
+ uint32_t maxOpenCount = 1;
+ // Maximum number of input or output streams that can be simultaneously
+ // active for this profile. By convention 0 means no limit. To respect
+ // legacy behavior, initialized to 0 for output profiles and 1 for input
+ // profiles
+ // FIXME: IOProfile code used the same value for both cases.
+ uint32_t maxActiveCount = 1;
+ // Mute duration while changing device on this output profile.
+ uint32_t recommendedMuteDurationMs = 0;
+
protected:
std::string mName;
audio_port_type_t mType;
diff --git a/media/libaudiofoundation/include/media/DeviceDescriptorBase.h b/media/libaudiofoundation/include/media/DeviceDescriptorBase.h
index 140ce36..a4092eb 100644
--- a/media/libaudiofoundation/include/media/DeviceDescriptorBase.h
+++ b/media/libaudiofoundation/include/media/DeviceDescriptorBase.h
@@ -36,16 +36,21 @@
public:
// Note that empty name refers by convention to a generic device.
explicit DeviceDescriptorBase(audio_devices_t type);
- DeviceDescriptorBase(audio_devices_t type, const std::string& address);
- explicit DeviceDescriptorBase(const AudioDeviceTypeAddr& deviceTypeAddr);
+ DeviceDescriptorBase(audio_devices_t type, const std::string& address,
+ const FormatVector &encodedFormats = FormatVector{});
+ DeviceDescriptorBase(const AudioDeviceTypeAddr& deviceTypeAddr,
+ const FormatVector &encodedFormats = FormatVector{});
- virtual ~DeviceDescriptorBase() {}
+ virtual ~DeviceDescriptorBase() = default;
audio_devices_t type() const { return mDeviceTypeAddr.mType; }
const std::string& address() const { return mDeviceTypeAddr.address(); }
void setAddress(const std::string &address);
const AudioDeviceTypeAddr& getDeviceTypeAddr() const { return mDeviceTypeAddr; }
+ const FormatVector& encodedFormats() const { return mEncodedFormats; }
+ bool supportsFormat(audio_format_t format);
+
// AudioPortConfig
virtual sp<AudioPort> getAudioPort() const {
return static_cast<AudioPort*>(const_cast<DeviceDescriptorBase*>(this));
@@ -82,6 +87,7 @@
protected:
AudioDeviceTypeAddr mDeviceTypeAddr;
+ FormatVector mEncodedFormats;
uint32_t mEncapsulationModes = 0;
uint32_t mEncapsulationMetadataTypes = 0;
private: