mirror of
https://github.com/Evolution-X/hardware_interfaces
synced 2026-02-02 02:42:35 +00:00
audio HAL V7: Update track metadata
Add channel mask and audio attributes tags to playback and record track metadata sent to audio HAL. The legacy HAL wrapper supports older legacy HAL versions by sending partial metadata when the legay HAL version is less than 3.2. Bug: 168751366 Test: make Change-Id: Iba3ee3b669e4300201374d4a0d5cf45a04872274
This commit is contained in:
@@ -478,29 +478,85 @@ Return<void> StreamIn::debug(const hidl_handle& fd, const hidl_vec<hidl_string>&
|
||||
}
|
||||
|
||||
#if MAJOR_VERSION >= 4
|
||||
Return<void> StreamIn::updateSinkMetadata(const SinkMetadata& sinkMetadata) {
|
||||
if (mStream->update_sink_metadata == nullptr) {
|
||||
return Void(); // not supported by the HAL
|
||||
|
||||
record_track_metadata StreamIn::convertRecordTrackMetadata(
|
||||
const RecordTrackMetadata& trackMetadata) {
|
||||
record_track_metadata halTrackMetadata = {.gain = trackMetadata.gain};
|
||||
(void)HidlUtils::audioSourceToHal(trackMetadata.source, &halTrackMetadata.source);
|
||||
#if MAJOR_VERSION >= 5
|
||||
if (trackMetadata.destination.getDiscriminator() ==
|
||||
RecordTrackMetadata::Destination::hidl_discriminator::device) {
|
||||
(void)deviceAddressToHal(trackMetadata.destination.device(), &halTrackMetadata.dest_device,
|
||||
halTrackMetadata.dest_device_address);
|
||||
}
|
||||
#endif
|
||||
return halTrackMetadata;
|
||||
}
|
||||
|
||||
void StreamIn::doUpdateSinkMetadata(const SinkMetadata& sinkMetadata) {
|
||||
std::vector<record_track_metadata> halTracks;
|
||||
halTracks.reserve(sinkMetadata.tracks.size());
|
||||
for (auto& metadata : sinkMetadata.tracks) {
|
||||
record_track_metadata halTrackMetadata = {.gain = metadata.gain};
|
||||
(void)HidlUtils::audioSourceToHal(metadata.source, &halTrackMetadata.source);
|
||||
#if MAJOR_VERSION >= 5
|
||||
if (metadata.destination.getDiscriminator() ==
|
||||
RecordTrackMetadata::Destination::hidl_discriminator::device) {
|
||||
(void)deviceAddressToHal(metadata.destination.device(), &halTrackMetadata.dest_device,
|
||||
halTrackMetadata.dest_device_address);
|
||||
}
|
||||
#endif
|
||||
halTracks.push_back(halTrackMetadata);
|
||||
halTracks.push_back(convertRecordTrackMetadata(metadata));
|
||||
}
|
||||
const sink_metadata_t halMetadata = {
|
||||
.track_count = halTracks.size(),
|
||||
.tracks = halTracks.data(),
|
||||
};
|
||||
mStream->update_sink_metadata(mStream, &halMetadata);
|
||||
}
|
||||
|
||||
#if MAJOR_VERSION >= 7
|
||||
record_track_metadata_v7 StreamIn::convertRecordTrackMetadataV7(
|
||||
const RecordTrackMetadata& trackMetadata) {
|
||||
record_track_metadata_v7 halTrackMetadata;
|
||||
halTrackMetadata.base = convertRecordTrackMetadata(trackMetadata);
|
||||
(void)HidlUtils::audioChannelMaskToHal(trackMetadata.channelMask,
|
||||
&halTrackMetadata.channel_mask);
|
||||
std::string halTags;
|
||||
for (const auto& tag : trackMetadata.tags) {
|
||||
if (&tag != &trackMetadata.tags[0]) {
|
||||
halTags += HidlUtils::sAudioTagSeparator;
|
||||
}
|
||||
halTags += tag.c_str();
|
||||
}
|
||||
strncpy(halTrackMetadata.tags, halTags.c_str(), AUDIO_ATTRIBUTES_TAGS_MAX_SIZE);
|
||||
return halTrackMetadata;
|
||||
}
|
||||
|
||||
void StreamIn::doUpdateSinkMetadataV7(const SinkMetadata& sinkMetadata) {
|
||||
std::vector<record_track_metadata_v7> halTracks;
|
||||
halTracks.reserve(sinkMetadata.tracks.size());
|
||||
for (auto& metadata : sinkMetadata.tracks) {
|
||||
halTracks.push_back(convertRecordTrackMetadataV7(metadata));
|
||||
}
|
||||
const sink_metadata_v7_t halMetadata = {
|
||||
.track_count = halTracks.size(),
|
||||
.tracks = halTracks.data(),
|
||||
};
|
||||
mStream->update_sink_metadata_v7(mStream, &halMetadata);
|
||||
}
|
||||
#endif // MAJOR_VERSION >= 7
|
||||
|
||||
Return<void> StreamIn::updateSinkMetadata(const SinkMetadata& sinkMetadata) {
|
||||
#if MAJOR_VERSION < 7
|
||||
if (mStream->update_sink_metadata == nullptr) {
|
||||
return Void(); // not supported by the HAL
|
||||
}
|
||||
doUpdateSinkMetadata(sinkMetadata);
|
||||
#else
|
||||
if (mDevice->version() < AUDIO_DEVICE_API_VERSION_3_2) {
|
||||
if (mStream->update_sink_metadata == nullptr) {
|
||||
return Void(); // not supported by the HAL
|
||||
}
|
||||
doUpdateSinkMetadata(sinkMetadata);
|
||||
} else {
|
||||
if (mStream->update_sink_metadata_v7 == nullptr) {
|
||||
return Void(); // not supported by the HAL
|
||||
}
|
||||
doUpdateSinkMetadataV7(sinkMetadata);
|
||||
}
|
||||
#endif // MAJOR_VERSION < 7
|
||||
return Void();
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user