diff options
author | Scott Lobdell <slobdell@google.com> | 2021-01-26 13:54:20 -0800 |
---|---|---|
committer | Scott Lobdell <slobdell@google.com> | 2021-01-26 13:54:20 -0800 |
commit | f072d1ca00fe4e68a9944d8922e09d700f326c85 (patch) | |
tree | dd8a7d623ca33b5c0040ac4e338c2287a169fb4f /audio/core/all-versions/default/StreamOut.cpp | |
parent | c1c3917a4fa8b5a2182affe9cb7085e39db656a3 (diff) | |
parent | 36b9cdeceab74933a1dd9b0174edc37edab862dc (diff) |
Merge SP1A.210122.003
Change-Id: I48e52b88645c81351c04f3783085751522b6e99c
Diffstat (limited to 'audio/core/all-versions/default/StreamOut.cpp')
-rw-r--r-- | audio/core/all-versions/default/StreamOut.cpp | 84 |
1 files changed, 37 insertions, 47 deletions
diff --git a/audio/core/all-versions/default/StreamOut.cpp b/audio/core/all-versions/default/StreamOut.cpp index 2451b9eb3a..357fd941bd 100644 --- a/audio/core/all-versions/default/StreamOut.cpp +++ b/audio/core/all-versions/default/StreamOut.cpp @@ -17,6 +17,7 @@ #define LOG_TAG "StreamOutHAL" #include "core/default/StreamOut.h" +#include "core/default/Conversions.h" #include "core/default/Util.h" //#define LOG_NDEBUG 0 @@ -162,7 +163,7 @@ StreamOut::~StreamOut() { status_t status = EventFlag::deleteEventFlag(&mEfGroup); ALOGE_IF(status, "write MQ event flag deletion error: %s", strerror(-status)); } - mCallback.clear(); + mCallback = nullptr; #if MAJOR_VERSION <= 5 mDevice->closeOutputStream(mStream); // Closing the output stream in the HAL waits for the callback to finish, @@ -461,7 +462,7 @@ Return<Result> StreamOut::setCallback(const sp<IStreamOutCallback>& callback) { Return<Result> StreamOut::clearCallback() { if (mStream->set_callback == NULL) return Result::NOT_SUPPORTED; - mCallback.clear(); + mCallback = nullptr; return Result::OK; } @@ -476,7 +477,7 @@ int StreamOut::asyncCallback(stream_callback_event_t event, void*, void* cookie) // It's correct to hold an sp<> to callback because the reference // in the StreamOut instance can be cleared in the meantime. There is // no difference on which thread to run IStreamOutCallback's destructor. - sp<IStreamOutCallback> callback = self->mCallback; + sp<IStreamOutCallback> callback = self->mCallback.load(); if (callback.get() == nullptr) return 0; ALOGV("asyncCallback() event %d", event); Return<void> result; @@ -585,81 +586,70 @@ Return<void> StreamOut::debug(const hidl_handle& fd, const hidl_vec<hidl_string> } #if MAJOR_VERSION >= 4 -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) { +Result StreamOut::doUpdateSourceMetadata(const SourceMetadata& sourceMetadata) { std::vector<playback_track_metadata_t> halTracks; - halTracks.reserve(sourceMetadata.tracks.size()); - for (auto& metadata : sourceMetadata.tracks) { - halTracks.push_back(convertPlaybackTrackMetadata(metadata)); +#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<playback_track_metadata_v7> 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(), }; mStream->update_source_metadata(mStream, &halMetadata); + return Result::OK; } #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) { +Result 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)); + if (status_t status = sourceMetadataToHalV7(sourceMetadata, &halTracks); status != NO_ERROR) { + return Stream::analyzeStatus("sourceMetadataToHal", status); } const source_metadata_v7_t halMetadata = { .track_count = halTracks.size(), .tracks = halTracks.data(), }; mStream->update_source_metadata_v7(mStream, &halMetadata); + return Result::OK; } #endif // MAJOR_VERSION >= 7 +#if MAJOR_VERSION <= 6 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 + (void)doUpdateSourceMetadata(sourceMetadata); + return Void(); +} +#elif MAJOR_VERSION >= 7 +Return<Result> StreamOut::updateSourceMetadata(const SourceMetadata& sourceMetadata) { if (mDevice->version() < AUDIO_DEVICE_API_VERSION_3_2) { if (mStream->update_source_metadata == nullptr) { - return Void(); // not supported by the HAL + return Result::NOT_SUPPORTED; } - doUpdateSourceMetadata(sourceMetadata); + return doUpdateSourceMetadata(sourceMetadata); } else { if (mStream->update_source_metadata_v7 == nullptr) { - return Void(); // not supported by the HAL + return Result::NOT_SUPPORTED; } - doUpdateSourceMetadataV7(sourceMetadata); + return doUpdateSourceMetadataV7(sourceMetadata); } -#endif // MAJOR_VERSION < 7 - return Void(); } +#endif Return<Result> StreamOut::selectPresentation(int32_t /*presentationId*/, int32_t /*programId*/) { return Result::NOT_SUPPORTED; // TODO: propagate to legacy @@ -708,7 +698,7 @@ Return<Result> StreamOut::setEventCallback(const sp<IStreamOutEventCallback>& ca // static int StreamOut::asyncEventCallback(stream_event_callback_type_t event, void* param, void* cookie) { StreamOut* self = reinterpret_cast<StreamOut*>(cookie); - sp<IStreamOutEventCallback> eventCallback = self->mEventCallback; + sp<IStreamOutEventCallback> eventCallback = self->mEventCallback.load(); if (eventCallback.get() == nullptr) return 0; ALOGV("%s event %d", __func__, event); Return<void> result; |