diff options
Diffstat (limited to 'audio/core/all-versions/default/Conversions.cpp')
-rw-r--r-- | audio/core/all-versions/default/Conversions.cpp | 102 |
1 files changed, 94 insertions, 8 deletions
diff --git a/audio/core/all-versions/default/Conversions.cpp b/audio/core/all-versions/default/Conversions.cpp index 8e0a140f0b..f1752ccba3 100644 --- a/audio/core/all-versions/default/Conversions.cpp +++ b/audio/core/all-versions/default/Conversions.cpp @@ -32,14 +32,10 @@ namespace implementation { using ::android::hardware::audio::common::CPP_VERSION::implementation::HidlUtils; -#if MAJOR_VERSION <= 6 -std::string deviceAddressToHal(const DeviceAddress& address) { - audio_devices_t halDevice; - char halAddress[AUDIO_DEVICE_MAX_ADDRESS_LEN]; - (void)deviceAddressToHal(address, &halDevice, halAddress); - return halAddress; -} -#endif +#define CONVERT_CHECKED(expr, result) \ + if (status_t status = (expr); status != NO_ERROR) { \ + result = status; \ + } status_t deviceAddressToHal(const DeviceAddress& device, audio_devices_t* halDeviceType, char* halDeviceAddress) { @@ -97,6 +93,52 @@ bool halToMicrophoneCharacteristics(MicrophoneInfo* pDst, } return status; } + +status_t sinkMetadataToHal(const SinkMetadata& sinkMetadata, + std::vector<record_track_metadata>* halTracks) { + status_t result = NO_ERROR; + if (halTracks != nullptr) { + halTracks->reserve(sinkMetadata.tracks.size()); + } + for (auto& metadata : sinkMetadata.tracks) { + record_track_metadata halTrackMetadata{.gain = metadata.gain}; + CONVERT_CHECKED(HidlUtils::audioSourceToHal(metadata.source, &halTrackMetadata.source), + result); +#if MAJOR_VERSION >= 5 + if (metadata.destination.getDiscriminator() == + RecordTrackMetadata::Destination::hidl_discriminator::device) { + CONVERT_CHECKED( + deviceAddressToHal(metadata.destination.device(), &halTrackMetadata.dest_device, + halTrackMetadata.dest_device_address), + result); + } +#endif + if (halTracks != nullptr) { + halTracks->push_back(std::move(halTrackMetadata)); + } + } + return result; +} + +status_t sourceMetadataToHal(const SourceMetadata& sourceMetadata, + std::vector<playback_track_metadata_t>* halTracks) { + status_t result = NO_ERROR; + if (halTracks != nullptr) { + halTracks->reserve(sourceMetadata.tracks.size()); + } + for (auto& metadata : sourceMetadata.tracks) { + playback_track_metadata_t halTrackMetadata{.gain = metadata.gain}; + CONVERT_CHECKED(HidlUtils::audioUsageToHal(metadata.usage, &halTrackMetadata.usage), + result); + CONVERT_CHECKED(HidlUtils::audioContentTypeToHal(metadata.contentType, + &halTrackMetadata.content_type), + result); + if (halTracks != nullptr) { + halTracks->push_back(std::move(halTrackMetadata)); + } + } + return result; +} #endif // MAJOR_VERSION >= 4 #if MAJOR_VERSION >= 7 @@ -135,6 +177,50 @@ bool audioOutputFlagsToHal(const hidl_vec<AudioInOutFlag>& flags, audio_output_f } return success; } + +status_t sinkMetadataToHalV7(const SinkMetadata& sinkMetadata, + std::vector<record_track_metadata_v7_t>* halTracks) { + std::vector<record_track_metadata> bases; + status_t result = sinkMetadataToHal(sinkMetadata, halTracks != nullptr ? &bases : nullptr); + if (halTracks != nullptr) { + halTracks->reserve(bases.size()); + } + auto baseIter = std::make_move_iterator(bases.begin()); + for (auto& metadata : sinkMetadata.tracks) { + record_track_metadata_v7_t halTrackMetadata; + CONVERT_CHECKED(HidlUtils::audioChannelMaskToHal(metadata.channelMask, + &halTrackMetadata.channel_mask), + result); + CONVERT_CHECKED(HidlUtils::audioTagsToHal(metadata.tags, halTrackMetadata.tags), result); + if (halTracks != nullptr) { + halTrackMetadata.base = std::move(*baseIter++); + halTracks->push_back(std::move(halTrackMetadata)); + } + } + return result; +} + +status_t sourceMetadataToHalV7(const SourceMetadata& sourceMetadata, + std::vector<playback_track_metadata_v7_t>* halTracks) { + std::vector<playback_track_metadata_t> bases; + status_t result = sourceMetadataToHal(sourceMetadata, halTracks != nullptr ? &bases : nullptr); + if (halTracks != nullptr) { + halTracks->reserve(bases.size()); + } + auto baseIter = std::make_move_iterator(bases.begin()); + for (auto& metadata : sourceMetadata.tracks) { + playback_track_metadata_v7_t halTrackMetadata; + CONVERT_CHECKED(HidlUtils::audioChannelMaskToHal(metadata.channelMask, + &halTrackMetadata.channel_mask), + result); + CONVERT_CHECKED(HidlUtils::audioTagsToHal(metadata.tags, halTrackMetadata.tags), result); + if (halTracks != nullptr) { + halTrackMetadata.base = std::move(*baseIter++); + halTracks->push_back(std::move(halTrackMetadata)); + } + } + return result; +} #endif } // namespace implementation |