Update AIDL<->legacy conversion for AudioChannelLayout
Index masks can contain arbitrary bits set, thus the range
of valid values is not restricted to AUDIO_CHANNEL_INDEX_MASK_*
values from system/audio.h.
Bug: 188932434
Bug: 195346865
Test: atest audio_aidl_conversion_tests
Test: atest android.media.cts.AudioNativeTest#testInputChannelMasks
Change-Id: Ic09c89c996726d9be4563c9d55327bbe9a5b199d
diff --git a/media/libaudioclient/AidlConversion.cpp b/media/libaudioclient/AidlConversion.cpp
index 4c155fe..b0eb7bd 100644
--- a/media/libaudioclient/AidlConversion.cpp
+++ b/media/libaudioclient/AidlConversion.cpp
@@ -396,44 +396,6 @@
using AudioFormatPairs = std::vector<AudioFormatPair>;
}
-const detail::AudioChannelPairs& getIndexAudioChannelPairs() {
- static const detail::AudioChannelPairs pairs = {
-#define DEFINE_INDEX_MASK(n) \
- { \
- AUDIO_CHANNEL_INDEX_MASK_##n, \
- media::AudioChannelLayout::make<media::AudioChannelLayout::Tag::indexMask>( \
- media::AudioChannelLayout::INDEX_MASK_##n) \
- }
-
- DEFINE_INDEX_MASK(1),
- DEFINE_INDEX_MASK(2),
- DEFINE_INDEX_MASK(3),
- DEFINE_INDEX_MASK(4),
- DEFINE_INDEX_MASK(5),
- DEFINE_INDEX_MASK(6),
- DEFINE_INDEX_MASK(7),
- DEFINE_INDEX_MASK(8),
- DEFINE_INDEX_MASK(9),
- DEFINE_INDEX_MASK(10),
- DEFINE_INDEX_MASK(11),
- DEFINE_INDEX_MASK(12),
- DEFINE_INDEX_MASK(13),
- DEFINE_INDEX_MASK(14),
- DEFINE_INDEX_MASK(15),
- DEFINE_INDEX_MASK(16),
- DEFINE_INDEX_MASK(17),
- DEFINE_INDEX_MASK(18),
- DEFINE_INDEX_MASK(19),
- DEFINE_INDEX_MASK(20),
- DEFINE_INDEX_MASK(21),
- DEFINE_INDEX_MASK(22),
- DEFINE_INDEX_MASK(23),
- DEFINE_INDEX_MASK(24)
-#undef DEFINE_INDEX_MASK
- };
- return pairs;
-}
-
const detail::AudioChannelPairs& getInAudioChannelPairs() {
static const detail::AudioChannelPairs pairs = {
#define DEFINE_INPUT_LAYOUT(n) \
@@ -1096,7 +1058,6 @@
const media::AudioChannelLayout& aidl, bool isInput) {
using ReverseMap = std::unordered_map<media::AudioChannelLayout, audio_channel_mask_t>;
using Tag = media::AudioChannelLayout::Tag;
- static const ReverseMap mIdx = make_ReverseMap(getIndexAudioChannelPairs());
static const ReverseMap mIn = make_ReverseMap(getInAudioChannelPairs());
static const ReverseMap mOut = make_ReverseMap(getOutAudioChannelPairs());
static const ReverseMap mVoice = make_ReverseMap(getVoiceAudioChannelPairs());
@@ -1117,8 +1078,19 @@
return AUDIO_CHANNEL_NONE;
case Tag::invalid:
return AUDIO_CHANNEL_INVALID;
- case Tag::indexMask:
- return convert(aidl, mIdx, __func__, "index");
+ case Tag::indexMask: {
+ // Index masks do not have pre-defined values.
+ const int bits = aidl.get<Tag::indexMask>();
+ if (__builtin_popcount(bits) != 0 &&
+ __builtin_popcount(bits) <= AUDIO_CHANNEL_COUNT_MAX) {
+ return audio_channel_mask_from_representation_and_bits(
+ AUDIO_CHANNEL_REPRESENTATION_INDEX, bits);
+ } else {
+ ALOGE("%s: invalid indexMask value 0x%x in %s",
+ __func__, bits, aidl.toString().c_str());
+ return unexpected(BAD_VALUE);
+ }
+ }
case Tag::layoutMask:
return convert(aidl, isInput ? mIn : mOut, __func__, isInput ? "input" : "output");
case Tag::voiceMask:
@@ -1132,7 +1104,6 @@
audio_channel_mask_t legacy, bool isInput) {
using DirectMap = std::unordered_map<audio_channel_mask_t, media::AudioChannelLayout>;
using Tag = media::AudioChannelLayout::Tag;
- static const DirectMap mIdx = make_DirectMap(getIndexAudioChannelPairs());
static const DirectMap mInAndVoice = make_DirectMap(
getInAudioChannelPairs(), getVoiceAudioChannelPairs());
static const DirectMap mOut = make_DirectMap(getOutAudioChannelPairs());
@@ -1156,7 +1127,14 @@
const audio_channel_representation_t repr = audio_channel_mask_get_representation(legacy);
if (repr == AUDIO_CHANNEL_REPRESENTATION_INDEX) {
- return convert(legacy, mIdx, __func__, "index");
+ if (audio_channel_mask_is_valid(legacy)) {
+ const int indexMask = VALUE_OR_RETURN(
+ convertIntegral<int>(audio_channel_mask_get_bits(legacy)));
+ return media::AudioChannelLayout::make<Tag::indexMask>(indexMask);
+ } else {
+ ALOGE("%s: legacy audio_channel_mask_t value 0x%x is invalid", __func__, legacy);
+ return unexpected(BAD_VALUE);
+ }
} else if (repr == AUDIO_CHANNEL_REPRESENTATION_POSITION) {
return convert(legacy, isInput ? mInAndVoice : mOut, __func__,
isInput ? "input / voice" : "output");