diff --git a/audio/common/6.0/types.hal b/audio/common/6.0/types.hal index b2806c7eeb..67217ab503 100644 --- a/audio/common/6.0/types.hal +++ b/audio/common/6.0/types.hal @@ -903,6 +903,25 @@ enum AudioContentType : uint32_t { SONIFICATION = 4, }; +/** Encapsulation mode used for sending audio compressed data. */ +@export(name="audio_encapsulation_mode_t", value_prefix="AUDIO_ENCAPSULATION_MODE_") +enum AudioEncapsulationMode : int32_t { + // Do not change these values without updating their counterparts + // in frameworks/base/media/java/android/media/AudioTrack.java + /** + * No encapsulation mode for metadata. + */ + NONE = 0, + /** + * Elementary stream payload with metadata + */ + ELEMENTARY_STREAM = 1, + /** + * Handle-based payload with metadata + */ + HANDLE = 2, +}; + /** * Additional information about the stream passed to hardware decoders. */ @@ -918,6 +937,9 @@ struct AudioOffloadInfo { uint32_t bitWidth; uint32_t bufferSize; AudioUsage usage; + AudioEncapsulationMode encapsulationMode; + int32_t contentId; + int32_t syncId; }; /** diff --git a/audio/common/all-versions/default/HidlUtils.cpp b/audio/common/all-versions/default/HidlUtils.cpp index 08002c8788..a470c9cb78 100644 --- a/audio/common/all-versions/default/HidlUtils.cpp +++ b/audio/common/all-versions/default/HidlUtils.cpp @@ -28,12 +28,13 @@ namespace common { namespace CPP_VERSION { namespace implementation { -void HidlUtils::audioConfigFromHal(const audio_config_t& halConfig, AudioConfig* config) { +status_t HidlUtils::audioConfigFromHal(const audio_config_t& halConfig, AudioConfig* config) { config->sampleRateHz = halConfig.sample_rate; config->channelMask = EnumBitfield(halConfig.channel_mask); config->format = AudioFormat(halConfig.format); - audioOffloadInfoFromHal(halConfig.offload_info, &config->offloadInfo); + status_t status = audioOffloadInfoFromHal(halConfig.offload_info, &config->offloadInfo); config->frameCount = halConfig.frame_count; + return status; } void HidlUtils::audioConfigToHal(const AudioConfig& config, audio_config_t* halConfig) { @@ -106,8 +107,8 @@ audio_usage_t HidlUtils::audioUsageToHal(const AudioUsage usage) { return static_cast(usage); } -void HidlUtils::audioOffloadInfoFromHal(const audio_offload_info_t& halOffload, - AudioOffloadInfo* offload) { +status_t HidlUtils::audioOffloadInfoFromHal(const audio_offload_info_t& halOffload, + AudioOffloadInfo* offload) { offload->sampleRateHz = halOffload.sample_rate; offload->channelMask = EnumBitfield(halOffload.channel_mask); offload->format = AudioFormat(halOffload.format); @@ -119,6 +120,26 @@ void HidlUtils::audioOffloadInfoFromHal(const audio_offload_info_t& halOffload, offload->bitWidth = halOffload.bit_width; offload->bufferSize = halOffload.offload_buffer_size; offload->usage = audioUsageFromHal(halOffload.usage); +#if MAJOR_VERSION >= 6 + if (halOffload.version >= AUDIO_OFFLOAD_INFO_VERSION_0_2) { + offload->encapsulationMode = + static_cast(halOffload.encapsulation_mode); + offload->contentId = halOffload.content_id; + offload->syncId = halOffload.sync_id; + } else { + offload->encapsulationMode = AudioEncapsulationMode::NONE; + offload->contentId = 0; + offload->syncId = 0; + } +#else + // nonzero values here are not compatible with HAL versions below 6. + if (halOffload.version >= AUDIO_OFFLOAD_INFO_VERSION_0_2 && + (halOffload.encapsulation_mode != AUDIO_ENCAPSULATION_MODE_NONE || + halOffload.content_id != 0 || halOffload.sync_id != 0)) { + return BAD_VALUE; + } +#endif + return OK; } void HidlUtils::audioOffloadInfoToHal(const AudioOffloadInfo& offload, @@ -135,6 +156,14 @@ void HidlUtils::audioOffloadInfoToHal(const AudioOffloadInfo& offload, halOffload->bit_width = offload.bitWidth; halOffload->offload_buffer_size = offload.bufferSize; halOffload->usage = audioUsageToHal(offload.usage); +#if MAJOR_VERSION >= 6 + halOffload->encapsulation_mode = + static_cast(offload.encapsulationMode); + halOffload->content_id = offload.contentId; + halOffload->sync_id = offload.syncId; +#else + // offload doesn't contain encapsulationMode, contentId, syncId, so this is OK. +#endif } void HidlUtils::audioPortConfigFromHal(const struct audio_port_config& halConfig, diff --git a/audio/common/all-versions/default/HidlUtils.h b/audio/common/all-versions/default/HidlUtils.h index 758a7f43d1..ef6dee3706 100644 --- a/audio/common/all-versions/default/HidlUtils.h +++ b/audio/common/all-versions/default/HidlUtils.h @@ -35,8 +35,11 @@ namespace implementation { using namespace ::android::hardware::audio::common::CPP_VERSION; class HidlUtils { - public: - static void audioConfigFromHal(const audio_config_t& halConfig, AudioConfig* config); + public: + // A failure here indicates a platform config that is incompatible with + // the compiled HIDL interface version. + static status_t audioConfigFromHal(const audio_config_t& halConfig, AudioConfig* config); + static void audioConfigToHal(const AudioConfig& config, audio_config_t* halConfig); static void audioGainConfigFromHal(const struct audio_gain_config& halConfig, AudioGainConfig* config); @@ -46,8 +49,10 @@ class HidlUtils { static void audioGainToHal(const AudioGain& gain, struct audio_gain* halGain); static AudioUsage audioUsageFromHal(const audio_usage_t halUsage); static audio_usage_t audioUsageToHal(const AudioUsage usage); - static void audioOffloadInfoFromHal(const audio_offload_info_t& halOffload, - AudioOffloadInfo* offload); + // A failure here indicates a platform offload info that is incompatible with + // the compiled HIDL interface version. + static status_t audioOffloadInfoFromHal(const audio_offload_info_t& halOffload, + AudioOffloadInfo* offload); static void audioOffloadInfoToHal(const AudioOffloadInfo& offload, audio_offload_info_t* halOffload); static void audioPortConfigFromHal(const struct audio_port_config& halConfig, @@ -58,7 +63,7 @@ class HidlUtils { const struct audio_port_config* halConfigs, hidl_vec* configs); static std::unique_ptr audioPortConfigsToHal( - const hidl_vec& configs); + const hidl_vec& configs); static void audioPortFromHal(const struct audio_port& halPort, AudioPort* port); static void audioPortToHal(const AudioPort& port, struct audio_port* halPort); static void uuidFromHal(const audio_uuid_t& halUuid, Uuid* uuid); diff --git a/audio/core/all-versions/default/Device.cpp b/audio/core/all-versions/default/Device.cpp index 47e31c1801..6260ba1979 100644 --- a/audio/core/all-versions/default/Device.cpp +++ b/audio/core/all-versions/default/Device.cpp @@ -171,7 +171,8 @@ std::tuple> Device::openOutputStreamImpl(int32_t ioHandle streamOut = new StreamOut(this, halStream); ++mOpenedStreamsCount; } - HidlUtils::audioConfigFromHal(halConfig, suggestedConfig); + status_t convertStatus = HidlUtils::audioConfigFromHal(halConfig, suggestedConfig); + ALOGW_IF(convertStatus != OK, "%s: suggested config with incompatible fields", __func__); return {analyzeStatus("open_output_stream", status, {EINVAL} /*ignore*/), streamOut}; } @@ -198,7 +199,8 @@ std::tuple> Device::openInputStreamImpl( streamIn = new StreamIn(this, halStream); ++mOpenedStreamsCount; } - HidlUtils::audioConfigFromHal(halConfig, suggestedConfig); + status_t convertStatus = HidlUtils::audioConfigFromHal(halConfig, suggestedConfig); + ALOGW_IF(convertStatus != OK, "%s: suggested config with incompatible fields", __func__); return {analyzeStatus("open_input_stream", status, {EINVAL} /*ignore*/), streamIn}; } diff --git a/current.txt b/current.txt index 96de2c7bdf..5f5758ca13 100644 --- a/current.txt +++ b/current.txt @@ -613,7 +613,7 @@ fd1f1b29f26b42e886220f04a08086c00e5ade9d7b53f095438e578ab9d42a93 android.hardwar 2df5d5866b37776f25079c0e54b54350a2abe4e025a59c9e02a7d3abe8ca00e8 android.hardware.audio@6.0::IStreamIn e6cd2b7c1a86b6ca683c0224ffde3b73aa14f6487de9f46833e539d26d1b3b5c android.hardware.audio@6.0::IStreamOut 997fdaad7a9d17ee7e01feb7031a753e2365e72ad30b11d950e9183fabdf3844 android.hardware.audio@6.0::IStreamOutCallback -167ed5cfb7d91db2e2bf20f1320c1a9004eeb768e26f535e0f7db94a21867d21 android.hardware.audio.common@6.0::types +bee662c62d997d8065e2bcb5c1e7a9578931f22ce28fd02c219fdb4d0630abf7 android.hardware.audio.common@6.0::types 817930d58412d662cb45e641c50cb62c727e4a3e3ffe7029a53cad9677b97d58 android.hardware.audio.effect@6.0::types 525bec6b44f1103869c269a128d51b8dccd73af5340ba863c8886c68357c7faf android.hardware.audio.effect@6.0::IAcousticEchoCancelerEffect 8d76bbe3719d051a8e9a1dcf9244f37f5b0a491feb249fa48391edf7cb4f3131 android.hardware.audio.effect@6.0::IAutomaticGainControlEffect