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:
Eric Laurent
2020-11-20 18:42:21 +01:00
parent f468b74002
commit deebf381f6
10 changed files with 220 additions and 37 deletions

View File

@@ -585,26 +585,82 @@ Return<void> StreamOut::debug(const hidl_handle& fd, const hidl_vec<hidl_string>
}
#if MAJOR_VERSION >= 4
Return<void> StreamOut::updateSourceMetadata(const SourceMetadata& sourceMetadata) {
if (mStream->update_source_metadata == nullptr) {
return Void(); // not supported by the HAL
}
playback_track_metadata StreamOut::convertPlaybackTrackMetadata(
const PlaybackTrackMetadata& trackMetadata) {
playback_track_metadata_t halTrackMetadata = {.gain = trackMetadata.gain};
(void)HidlUtils::audioUsageToHal(trackMetadata.usage, &halTrackMetadata.usage);
(void)HidlUtils::audioContentTypeToHal(trackMetadata.contentType,
&halTrackMetadata.content_type);
return halTrackMetadata;
}
void StreamOut::doUpdateSourceMetadata(const SourceMetadata& sourceMetadata) {
std::vector<playback_track_metadata_t> halTracks;
halTracks.reserve(sourceMetadata.tracks.size());
for (auto& metadata : sourceMetadata.tracks) {
playback_track_metadata_t halTrackMetadata = {.gain = metadata.gain};
(void)HidlUtils::audioUsageToHal(metadata.usage, &halTrackMetadata.usage);
(void)HidlUtils::audioContentTypeToHal(metadata.contentType,
&halTrackMetadata.content_type);
halTracks.push_back(std::move(halTrackMetadata));
halTracks.push_back(convertPlaybackTrackMetadata(metadata));
}
const source_metadata_t halMetadata = {
.track_count = halTracks.size(),
.tracks = halTracks.data(),
};
mStream->update_source_metadata(mStream, &halMetadata);
}
#if MAJOR_VERSION >= 7
playback_track_metadata_v7 StreamOut::convertPlaybackTrackMetadataV7(
const PlaybackTrackMetadata& trackMetadata) {
playback_track_metadata_v7 halTrackMetadata;
halTrackMetadata.base = convertPlaybackTrackMetadata(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 StreamOut::doUpdateSourceMetadataV7(const SourceMetadata& sourceMetadata) {
std::vector<playback_track_metadata_v7> halTracks;
halTracks.reserve(sourceMetadata.tracks.size());
for (auto& metadata : sourceMetadata.tracks) {
halTracks.push_back(convertPlaybackTrackMetadataV7(metadata));
}
const source_metadata_v7_t halMetadata = {
.track_count = halTracks.size(),
.tracks = halTracks.data(),
};
mStream->update_source_metadata_v7(mStream, &halMetadata);
}
#endif // MAJOR_VERSION >= 7
Return<void> StreamOut::updateSourceMetadata(const SourceMetadata& sourceMetadata) {
#if MAJOR_VERSION < 7
if (mStream->update_source_metadata == nullptr) {
return Void(); // not supported by the HAL
}
doUpdateSourceMetadata(sourceMetadata);
#else
if (mDevice->version() < AUDIO_DEVICE_API_VERSION_3_2) {
if (mStream->update_source_metadata == nullptr) {
return Void(); // not supported by the HAL
}
doUpdateSourceMetadata(sourceMetadata);
} else {
if (mStream->update_source_metadata_v7 == nullptr) {
return Void(); // not supported by the HAL
}
doUpdateSourceMetadataV7(sourceMetadata);
}
#endif // MAJOR_VERSION < 7
return Void();
}
Return<Result> StreamOut::selectPresentation(int32_t /*presentationId*/, int32_t /*programId*/) {
return Result::NOT_SUPPORTED; // TODO: propagate to legacy
}