diff options
author | Mikhail Naganov <mnaganov@google.com> | 2021-01-27 02:16:53 +0000 |
---|---|---|
committer | Mikhail Naganov <mnaganov@google.com> | 2021-01-28 21:27:43 +0000 |
commit | ff611980f317888607389d0cb258bd86f11f2dfb (patch) | |
tree | c0c25fc7cf56730823b5cbe2b5552caac488457a /audio/common/all-versions/default/7.0/HidlUtils.cpp | |
parent | 31f2eb37915bf81117a77fc48af01ec7bdb4e381 (diff) |
audio: Update common types to better match legacy structs
HAL V7 types were updated to better match data structure
definitions from the legacy HAL:
- Added 'AudioConfigBaseOptional' struct to match
legacy structs that have 'mask' field to specify
initialized fields.
- All fields in 'AudioConfigBase' made mandatory.
- Removed 'EffectConfigParameters' in favor of
'AudioConfigBaseOptional' and safe_unions.
- Added missing enum string values to ensure that round-trip
conversions from the legacy HAL to HIDL and back to legacy
preserve enum values.
Bug: 142480271
Test: atest android.hardware.audio.common@7.0-util_tests
Test: atest VtsHalAudioV6_0TargetTest
Test: atest VtsHalAudioV7_0TargetTest
Test: atest VtsHalAudioEffectV7_0TargetTest
Change-Id: If02a81b3f6790a8eb315fa57123141aad2419132
Diffstat (limited to 'audio/common/all-versions/default/7.0/HidlUtils.cpp')
-rw-r--r-- | audio/common/all-versions/default/7.0/HidlUtils.cpp | 98 |
1 files changed, 73 insertions, 25 deletions
diff --git a/audio/common/all-versions/default/7.0/HidlUtils.cpp b/audio/common/all-versions/default/7.0/HidlUtils.cpp index de19faf153..f09db5ed98 100644 --- a/audio/common/all-versions/default/7.0/HidlUtils.cpp +++ b/audio/common/all-versions/default/7.0/HidlUtils.cpp @@ -147,6 +147,59 @@ status_t HidlUtils::audioConfigBaseToHal(const AudioConfigBase& configBase, return result; } +status_t HidlUtils::audioConfigBaseOptionalFromHal(const audio_config_base_t& halConfigBase, + bool isInput, bool formatSpecified, + bool sampleRateSpecified, + bool channelMaskSpecified, + AudioConfigBaseOptional* configBase) { + status_t result = NO_ERROR; + if (formatSpecified) { + AudioFormat value; + CONVERT_CHECKED(audioFormatFromHal(halConfigBase.format, &value), result); + configBase->format.value(std::move(value)); + } else { + configBase->format.unspecified({}); + } + if (sampleRateSpecified) { + configBase->sampleRateHz.value(halConfigBase.sample_rate); + } else { + configBase->sampleRateHz.unspecified({}); + } + if (channelMaskSpecified) { + AudioChannelMask value; + CONVERT_CHECKED(audioChannelMaskFromHal(halConfigBase.channel_mask, isInput, &value), + result); + configBase->channelMask.value(std::move(value)); + } + return result; +} + +status_t HidlUtils::audioConfigBaseOptionalToHal(const AudioConfigBaseOptional& configBase, + audio_config_base_t* halConfigBase, + bool* formatSpecified, bool* sampleRateSpecified, + bool* channelMaskSpecified) { + status_t result = NO_ERROR; + *formatSpecified = configBase.format.getDiscriminator() == + AudioConfigBaseOptional::Format::hidl_discriminator::value; + if (*formatSpecified) { + CONVERT_CHECKED(audioFormatToHal(configBase.format.value(), &halConfigBase->format), + result); + } + *sampleRateSpecified = configBase.sampleRateHz.getDiscriminator() == + AudioConfigBaseOptional::SampleRate::hidl_discriminator::value; + if (*sampleRateSpecified) { + halConfigBase->sample_rate = configBase.sampleRateHz.value(); + } + *channelMaskSpecified = configBase.channelMask.getDiscriminator() == + AudioConfigBaseOptional::ChannelMask::hidl_discriminator::value; + if (*channelMaskSpecified) { + CONVERT_CHECKED( + audioChannelMaskToHal(configBase.channelMask.value(), &halConfigBase->channel_mask), + result); + } + return result; +} + status_t HidlUtils::audioContentTypeFromHal(const audio_content_type_t halContentType, AudioContentType* contentType) { *contentType = audio_content_type_to_string(halContentType); @@ -508,23 +561,14 @@ status_t HidlUtils::audioPortConfigFromHal(const struct audio_port_config& halCo audio_port_config_has_input_direction(&halConfig), isInput); result = BAD_VALUE; } - if (halConfig.config_mask & AUDIO_PORT_CONFIG_SAMPLE_RATE) { - config->base.sampleRateHz = halConfig.sample_rate; - } else { - config->base.sampleRateHz = {}; - } - if (halConfig.config_mask & AUDIO_PORT_CONFIG_CHANNEL_MASK) { - CONVERT_CHECKED( - audioChannelMaskFromHal(halConfig.channel_mask, isInput, &config->base.channelMask), - result); - } else { - config->base.channelMask = {}; - } - if (halConfig.config_mask & AUDIO_PORT_CONFIG_FORMAT) { - CONVERT_CHECKED(audioFormatFromHal(halConfig.format, &config->base.format), result); - } else { - config->base.format = {}; - } + audio_config_base_t halConfigBase = {halConfig.sample_rate, halConfig.channel_mask, + halConfig.format}; + CONVERT_CHECKED( + audioConfigBaseOptionalFromHal( + halConfigBase, isInput, halConfig.config_mask & AUDIO_PORT_CONFIG_FORMAT, + halConfig.config_mask & AUDIO_PORT_CONFIG_SAMPLE_RATE, + halConfig.config_mask & AUDIO_PORT_CONFIG_CHANNEL_MASK, &config->base), + result); if (halConfig.config_mask & AUDIO_PORT_CONFIG_GAIN) { config->gain.config({}); CONVERT_CHECKED(audioGainConfigFromHal(halConfig.gain, isInput, &config->gain.config()), @@ -540,19 +584,23 @@ status_t HidlUtils::audioPortConfigToHal(const AudioPortConfig& config, status_t result = NO_ERROR; memset(halConfig, 0, sizeof(audio_port_config)); halConfig->id = config.id; - halConfig->config_mask = {}; - if (config.base.sampleRateHz != 0) { + halConfig->config_mask = 0; + audio_config_base_t halConfigBase = AUDIO_CONFIG_BASE_INITIALIZER; + bool formatSpecified = false, sRateSpecified = false, channelMaskSpecified = false; + CONVERT_CHECKED(audioConfigBaseOptionalToHal(config.base, &halConfigBase, &formatSpecified, + &sRateSpecified, &channelMaskSpecified), + result); + if (sRateSpecified) { halConfig->config_mask |= AUDIO_PORT_CONFIG_SAMPLE_RATE; - halConfig->sample_rate = config.base.sampleRateHz; + halConfig->sample_rate = halConfigBase.sample_rate; } - if (!config.base.channelMask.empty()) { + if (channelMaskSpecified) { halConfig->config_mask |= AUDIO_PORT_CONFIG_CHANNEL_MASK; - CONVERT_CHECKED(audioChannelMaskToHal(config.base.channelMask, &halConfig->channel_mask), - result); + halConfig->channel_mask = halConfigBase.channel_mask; } - if (!config.base.format.empty()) { + if (formatSpecified) { halConfig->config_mask |= AUDIO_PORT_CONFIG_FORMAT; - CONVERT_CHECKED(audioFormatToHal(config.base.format, &halConfig->format), result); + halConfig->format = halConfigBase.format; } if (config.gain.getDiscriminator() == AudioPortConfig::OptionalGain::hidl_discriminator::config) { |