summaryrefslogtreecommitdiff
path: root/audio/core/all-versions/default/StreamOut.cpp
diff options
context:
space:
mode:
authorScott Lobdell <slobdell@google.com>2021-01-20 23:33:26 -0800
committerScott Lobdell <slobdell@google.com>2021-01-20 23:33:26 -0800
commitc1c3917a4fa8b5a2182affe9cb7085e39db656a3 (patch)
tree5b48ce37e552ff7b1d607b413456e5f73d81c5d1 /audio/core/all-versions/default/StreamOut.cpp
parent2ed00921cc09456c69e085dca5faf6b28ff18ad8 (diff)
parent78c4ffcbf6ded706cbd1d4b9f4bdebce3a9bdf7b (diff)
Merge SP1A.210105.001
Change-Id: Id2a20fc365d42c97b319cbc5c563ff56e3fad368
Diffstat (limited to 'audio/core/all-versions/default/StreamOut.cpp')
-rw-r--r--audio/core/all-versions/default/StreamOut.cpp102
1 files changed, 91 insertions, 11 deletions
diff --git a/audio/core/all-versions/default/StreamOut.cpp b/audio/core/all-versions/default/StreamOut.cpp
index 007eb4564a..2451b9eb3a 100644
--- a/audio/core/all-versions/default/StreamOut.cpp
+++ b/audio/core/all-versions/default/StreamOut.cpp
@@ -26,6 +26,7 @@
#include <memory>
+#include <HidlUtils.h>
#include <android/log.h>
#include <hardware/audio.h>
#include <utils/Trace.h>
@@ -36,6 +37,8 @@ namespace audio {
namespace CPP_VERSION {
namespace implementation {
+using ::android::hardware::audio::common::CPP_VERSION::implementation::HidlUtils;
+
namespace {
class WriteThread : public Thread {
@@ -142,7 +145,7 @@ bool WriteThread::threadLoop() {
StreamOut::StreamOut(const sp<Device>& device, audio_stream_out_t* stream)
: mDevice(device),
mStream(stream),
- mStreamCommon(new Stream(&stream->common)),
+ mStreamCommon(new Stream(false /*isInput*/, &stream->common)),
mStreamMmap(new StreamMmap<audio_stream_out_t>(stream)),
mEfGroup(nullptr),
mStopWriteThread(false) {}
@@ -182,6 +185,7 @@ Return<uint64_t> StreamOut::getBufferSize() {
return mStreamCommon->getBufferSize();
}
+#if MAJOR_VERSION <= 6
Return<uint32_t> StreamOut::getSampleRate() {
return mStreamCommon->getSampleRate();
}
@@ -228,6 +232,18 @@ Return<Result> StreamOut::setFormat(AudioFormat format) {
return mStreamCommon->setFormat(format);
}
+#else
+
+Return<void> StreamOut::getSupportedProfiles(getSupportedProfiles_cb _hidl_cb) {
+ return mStreamCommon->getSupportedProfiles(_hidl_cb);
+}
+
+Return<Result> StreamOut::setAudioProperties(const AudioConfigBase& config) {
+ return mStreamCommon->setAudioProperties(config);
+}
+
+#endif // MAJOR_VERSION <= 6
+
Return<void> StreamOut::getAudioProperties(getAudioProperties_cb _hidl_cb) {
return mStreamCommon->getAudioProperties(_hidl_cb);
}
@@ -327,7 +343,11 @@ Return<Result> StreamOut::setVolume(float left, float right) {
Return<void> StreamOut::prepareForWriting(uint32_t frameSize, uint32_t framesCount,
prepareForWriting_cb _hidl_cb) {
status_t status;
+#if MAJOR_VERSION <= 6
ThreadInfo threadInfo = {0, 0};
+#else
+ int32_t threadInfo = 0;
+#endif
// Wrap the _hidl_cb to return an error
auto sendError = [&threadInfo, &_hidl_cb](Result result) {
@@ -396,8 +416,12 @@ Return<void> StreamOut::prepareForWriting(uint32_t frameSize, uint32_t framesCou
mStatusMQ = std::move(tempStatusMQ);
mWriteThread = tempWriteThread.release();
mEfGroup = tempElfGroup.release();
+#if MAJOR_VERSION <= 6
threadInfo.pid = getpid();
threadInfo.tid = mWriteThread->getTid();
+#else
+ threadInfo = mWriteThread->getTid();
+#endif
_hidl_cb(Result::OK, *mCommandMQ->getDesc(), *mDataMQ->getDesc(), *mStatusMQ->getDesc(),
threadInfo);
return Void();
@@ -561,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
- }
- std::vector<playback_track_metadata> halTracks;
+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) {
- halTracks.push_back({
- .usage = static_cast<audio_usage_t>(metadata.usage),
- .content_type = static_cast<audio_content_type_t>(metadata.contentType),
- .gain = metadata.gain,
- });
+ 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
}