diff --git a/audio/core/all-versions/default/StreamIn.cpp b/audio/core/all-versions/default/StreamIn.cpp index 39a4c27210..2c5e9f1521 100644 --- a/audio/core/all-versions/default/StreamIn.cpp +++ b/audio/core/all-versions/default/StreamIn.cpp @@ -478,13 +478,24 @@ Return StreamIn::debug(const hidl_handle& fd, const hidl_vec& } #if MAJOR_VERSION >= 4 -Result StreamIn::doUpdateSinkMetadata(const SinkMetadata& sinkMetadata, - bool abortOnConversionFailure) { +Result StreamIn::doUpdateSinkMetadata(const SinkMetadata& sinkMetadata) { std::vector halTracks; - if (status_t status = sinkMetadataToHal(sinkMetadata, &halTracks); - status != NO_ERROR && abortOnConversionFailure) { +#if MAJOR_VERSION <= 6 + (void)sinkMetadataToHal(sinkMetadata, &halTracks); +#else + // Validate whether a conversion to V7 is possible. This is needed + // to have a consistent behavior of the HAL regardless of the API + // version of the legacy HAL (and also to be consistent with openInputStream). + std::vector halTracksV7; + if (status_t status = sinkMetadataToHalV7(sinkMetadata, &halTracksV7); status == NO_ERROR) { + halTracks.reserve(halTracksV7.size()); + for (auto metadata_v7 : halTracksV7) { + halTracks.push_back(std::move(metadata_v7.base)); + } + } else { return Stream::analyzeStatus("sinkMetadataToHal", status); } +#endif // MAJOR_VERSION <= 6 const sink_metadata_t halMetadata = { .track_count = halTracks.size(), .tracks = halTracks.data(), @@ -513,7 +524,7 @@ Return StreamIn::updateSinkMetadata(const SinkMetadata& sinkMetadata) { if (mStream->update_sink_metadata == nullptr) { return Void(); // not supported by the HAL } - (void)doUpdateSinkMetadata(sinkMetadata, false /*abortOnConversionFailure*/); + (void)doUpdateSinkMetadata(sinkMetadata); return Void(); } #elif MAJOR_VERSION >= 7 @@ -522,7 +533,7 @@ Return StreamIn::updateSinkMetadata(const SinkMetadata& sinkMetadata) { if (mStream->update_sink_metadata == nullptr) { return Result::NOT_SUPPORTED; } - return doUpdateSinkMetadata(sinkMetadata, true /*abortOnConversionFailure*/); + return doUpdateSinkMetadata(sinkMetadata); } else { if (mStream->update_sink_metadata_v7 == nullptr) { return Result::NOT_SUPPORTED; diff --git a/audio/core/all-versions/default/StreamOut.cpp b/audio/core/all-versions/default/StreamOut.cpp index 0ff918213d..ffd3b6b856 100644 --- a/audio/core/all-versions/default/StreamOut.cpp +++ b/audio/core/all-versions/default/StreamOut.cpp @@ -586,13 +586,24 @@ Return StreamOut::debug(const hidl_handle& fd, const hidl_vec } #if MAJOR_VERSION >= 4 -Result StreamOut::doUpdateSourceMetadata(const SourceMetadata& sourceMetadata, - bool abortOnConversionFailure) { +Result StreamOut::doUpdateSourceMetadata(const SourceMetadata& sourceMetadata) { std::vector halTracks; - if (status_t status = sourceMetadataToHal(sourceMetadata, &halTracks); - status != NO_ERROR && abortOnConversionFailure) { +#if MAJOR_VERSION <= 6 + (void)sourceMetadataToHal(sourceMetadata, &halTracks); +#else + // Validate whether a conversion to V7 is possible. This is needed + // to have a consistent behavior of the HAL regardless of the API + // version of the legacy HAL (and also to be consistent with openOutputStream). + std::vector halTracksV7; + if (status_t status = sourceMetadataToHalV7(sourceMetadata, &halTracksV7); status == NO_ERROR) { + halTracks.reserve(halTracksV7.size()); + for (auto metadata_v7 : halTracksV7) { + halTracks.push_back(std::move(metadata_v7.base)); + } + } else { return Stream::analyzeStatus("sourceMetadataToHal", status); } +#endif // MAJOR_VERSION <= 6 const source_metadata_t halMetadata = { .track_count = halTracks.size(), .tracks = halTracks.data(), @@ -621,7 +632,7 @@ Return StreamOut::updateSourceMetadata(const SourceMetadata& sourceMetadat if (mStream->update_source_metadata == nullptr) { return Void(); // not supported by the HAL } - (void)doUpdateSourceMetadata(sourceMetadata, false /*abortOnConversionFailure*/); + (void)doUpdateSourceMetadata(sourceMetadata); return Void(); } #elif MAJOR_VERSION >= 7 @@ -630,7 +641,7 @@ Return StreamOut::updateSourceMetadata(const SourceMetadata& sourceMetad if (mStream->update_source_metadata == nullptr) { return Result::NOT_SUPPORTED; } - return doUpdateSourceMetadata(sourceMetadata, true /*abortOnConversionFailure*/); + return doUpdateSourceMetadata(sourceMetadata); } else { if (mStream->update_source_metadata_v7 == nullptr) { return Result::NOT_SUPPORTED; diff --git a/audio/core/all-versions/default/include/core/default/StreamIn.h b/audio/core/all-versions/default/include/core/default/StreamIn.h index ccb5eedc91..651b3a6ae1 100644 --- a/audio/core/all-versions/default/include/core/default/StreamIn.h +++ b/audio/core/all-versions/default/include/core/default/StreamIn.h @@ -130,7 +130,7 @@ struct StreamIn : public IStreamIn { private: #if MAJOR_VERSION >= 4 - Result doUpdateSinkMetadata(const SinkMetadata& sinkMetadata, bool abortOnConversionFailure); + Result doUpdateSinkMetadata(const SinkMetadata& sinkMetadata); #if MAJOR_VERSION >= 7 Result doUpdateSinkMetadataV7(const SinkMetadata& sinkMetadata); #endif diff --git a/audio/core/all-versions/default/include/core/default/StreamOut.h b/audio/core/all-versions/default/include/core/default/StreamOut.h index b7f211efaa..b8e8515739 100644 --- a/audio/core/all-versions/default/include/core/default/StreamOut.h +++ b/audio/core/all-versions/default/include/core/default/StreamOut.h @@ -148,8 +148,7 @@ struct StreamOut : public IStreamOut { private: #if MAJOR_VERSION >= 4 - Result doUpdateSourceMetadata(const SourceMetadata& sourceMetadata, - bool abortOnConversionFailure); + Result doUpdateSourceMetadata(const SourceMetadata& sourceMetadata); #if MAJOR_VERSION >= 7 Result doUpdateSourceMetadataV7(const SourceMetadata& sourceMetadata); #endif diff --git a/audio/core/all-versions/vts/functional/7.0/AudioPrimaryHidlHalTest.cpp b/audio/core/all-versions/vts/functional/7.0/AudioPrimaryHidlHalTest.cpp index 2ed578de2c..3b6d5f2c08 100644 --- a/audio/core/all-versions/vts/functional/7.0/AudioPrimaryHidlHalTest.cpp +++ b/audio/core/all-versions/vts/functional/7.0/AudioPrimaryHidlHalTest.cpp @@ -401,6 +401,22 @@ static const RecordTrackMetadata& getRecordTrackMetadataWithInvalidDest() { return invalid; } +static const RecordTrackMetadata& getInvalidChannelMaskRecordTrackMetadata() { + static const RecordTrackMetadata invalid = { + .source = toString(xsd::AudioSource::AUDIO_SOURCE_DEFAULT), + .gain = 1, + .channelMask = "random_string"}; + return invalid; +} + +static const RecordTrackMetadata& getInvalidTagsRecordTrackMetadata() { + static const RecordTrackMetadata invalid = { + .source = toString(xsd::AudioSource::AUDIO_SOURCE_DEFAULT), + .gain = 1, + .tags = {{"random_string"}}}; + return invalid; +} + static const PlaybackTrackMetadata& getValidPlaybackTrackMetadata() { static const PlaybackTrackMetadata valid = { .usage = toString(xsd::AudioUsage::AUDIO_USAGE_MEDIA), @@ -425,24 +441,54 @@ static const PlaybackTrackMetadata& getInvalidContentTypePlaybackTrackMetadata() return invalid; } +static const PlaybackTrackMetadata& getInvalidChannelMaskPlaybackTrackMetadata() { + static const PlaybackTrackMetadata invalid = { + .usage = toString(xsd::AudioUsage::AUDIO_USAGE_MEDIA), + .contentType = toString(xsd::AudioContentType::AUDIO_CONTENT_TYPE_MUSIC), + .gain = 1, + .channelMask = "random_string"}; + return invalid; +} + +static const PlaybackTrackMetadata& getInvalidTagsPlaybackTrackMetadata() { + static const PlaybackTrackMetadata invalid = { + .usage = toString(xsd::AudioUsage::AUDIO_USAGE_MEDIA), + .contentType = toString(xsd::AudioContentType::AUDIO_CONTENT_TYPE_MUSIC), + .gain = 1, + .tags = {{"random_string"}}}; + return invalid; +} + static const std::vector& getInvalidSourceMetadatas() { static const std::vector invalids = { SourceMetadata{.tracks = {{getInvalidUsagePlaybackTrackMetadata()}}}, SourceMetadata{.tracks = {{getInvalidContentTypePlaybackTrackMetadata()}}}, + SourceMetadata{.tracks = {{getInvalidChannelMaskPlaybackTrackMetadata()}}}, + SourceMetadata{.tracks = {{getInvalidTagsPlaybackTrackMetadata()}}}, SourceMetadata{.tracks = {{getValidPlaybackTrackMetadata(), getInvalidUsagePlaybackTrackMetadata()}}}, SourceMetadata{.tracks = {{getValidPlaybackTrackMetadata(), - getInvalidContentTypePlaybackTrackMetadata()}}}}; + getInvalidContentTypePlaybackTrackMetadata()}}}, + SourceMetadata{.tracks = {{getValidPlaybackTrackMetadata(), + getInvalidChannelMaskPlaybackTrackMetadata()}}}, + SourceMetadata{.tracks = {{getValidPlaybackTrackMetadata(), + getInvalidTagsPlaybackTrackMetadata()}}}}; return invalids; } static const std::vector& getInvalidSinkMetadatas() { static const std::vector invalids = { SinkMetadata{.tracks = {{getInvalidSourceRecordTrackMetadata()}}}, SinkMetadata{.tracks = {{getRecordTrackMetadataWithInvalidDest()}}}, + SinkMetadata{.tracks = {{getInvalidChannelMaskRecordTrackMetadata()}}}, + SinkMetadata{.tracks = {{getInvalidTagsRecordTrackMetadata()}}}, SinkMetadata{.tracks = {{getValidRecordTrackMetadata(), getInvalidSourceRecordTrackMetadata()}}}, SinkMetadata{.tracks = {{getValidRecordTrackMetadata(), - getRecordTrackMetadataWithInvalidDest()}}}}; + getRecordTrackMetadataWithInvalidDest()}}}, + SinkMetadata{.tracks = {{getValidRecordTrackMetadata(), + getInvalidChannelMaskRecordTrackMetadata()}}}, + SinkMetadata{.tracks = {{getValidRecordTrackMetadata(), + getInvalidTagsRecordTrackMetadata()}}}}; return invalids; } template