Update StreamHalHidl to use IStreamOut.WriteStatus new field
Updated the client code to use the new field:
IStreamOut.WriteStatus.presentationPositionRetval for providing
legacy-compatible results when calling 'get_presentation_position'
immediately after 'write'.
Bug: 30222631
Test: Loopback RTT, media CTS
Change-Id: Idf3f1d29288ddf17a5015f96291648d64d124ec7
diff --git a/media/libaudiohal/StreamHalHidl.cpp b/media/libaudiohal/StreamHalHidl.cpp
index 5943e22..cbc8a08 100644
--- a/media/libaudiohal/StreamHalHidl.cpp
+++ b/media/libaudiohal/StreamHalHidl.cpp
@@ -242,7 +242,7 @@
StreamOutHalHidl::StreamOutHalHidl(const sp<IStreamOut>& stream)
: StreamHalHidl(stream.get()), mStream(stream), mEfGroup(nullptr),
- mGetPresentationPositionNotSupported(false), mPPosFromWriteObtained(0) {
+ mGetPresentationPositionNotSupported(false), mPPosFromWrite{ 0, OK, 0, { 0, 0 } } {
}
StreamOutHalHidl::~StreamOutHalHidl() {
@@ -301,19 +301,22 @@
status_t ret = mEfGroup->wait(
static_cast<uint32_t>(MessageQueueFlagBits::NOT_FULL), &efState, NS_PER_SEC);
if (efState & static_cast<uint32_t>(MessageQueueFlagBits::NOT_FULL)) {
- WriteStatus writeStatus = { Result::NOT_INITIALIZED, 0, 0, { 0, 0 } };
+ WriteStatus writeStatus =
+ { Result::NOT_INITIALIZED, 0, Result::NOT_INITIALIZED, 0, { 0, 0 } };
mStatusMQ->read(&writeStatus);
- if (writeStatus.retval == Result::OK) {
+ if (writeStatus.writeRetval == Result::OK) {
status = OK;
*written = writeStatus.written;
- mPPosFromWriteFrames = writeStatus.frames;
- mPPosFromWriteTS.tv_sec = writeStatus.timeStamp.tvSec;
- mPPosFromWriteTS.tv_nsec = writeStatus.timeStamp.tvNSec;
- struct timespec timeNow;
- clock_gettime(CLOCK_MONOTONIC, &timeNow);
- mPPosFromWriteObtained = timeNow.tv_sec * 1000000 + timeNow.tv_nsec / 1000;
+ mPPosFromWrite.status = processReturn(
+ "get_presentation_position", writeStatus.presentationPositionRetval);
+ if (mPPosFromWrite.status == OK) {
+ mPPosFromWrite.frames = writeStatus.frames;
+ mPPosFromWrite.ts.tv_sec = writeStatus.timeStamp.tvSec;
+ mPPosFromWrite.ts.tv_nsec = writeStatus.timeStamp.tvNSec;
+ }
+ mPPosFromWrite.obtained = getCurrentTimeMs();
} else {
- status = processReturn("write", writeStatus.retval);
+ status = processReturn("write", writeStatus.writeRetval);
}
return status;
}
@@ -324,6 +327,12 @@
return ret;
}
+uint64_t StreamOutHalHidl::getCurrentTimeMs() {
+ struct timespec timeNow;
+ clock_gettime(CLOCK_MONOTONIC, &timeNow);
+ return timeNow.tv_sec * 1000000 + timeNow.tv_nsec / 1000;
+}
+
status_t StreamOutHalHidl::prepareForWriting(size_t bufferSize) {
std::unique_ptr<DataMQ> tempDataMQ;
std::unique_ptr<StatusMQ> tempStatusMQ;
@@ -435,15 +444,14 @@
status_t StreamOutHalHidl::getPresentationPosition(uint64_t *frames, struct timespec *timestamp) {
if (mStream == 0) return NO_INIT;
if (mGetPresentationPositionNotSupported) return INVALID_OPERATION;
- struct timespec timeNow;
- clock_gettime(CLOCK_MONOTONIC, &timeNow);
- uint64_t timeStampNow = timeNow.tv_sec * 1000000 + timeNow.tv_nsec / 1000;
- if (timeStampNow - mPPosFromWriteObtained <= 1000) {
+ if (getCurrentTimeMs() - mPPosFromWrite.obtained <= 1000) {
// No more than 1 ms passed since the last write, use cached result to avoid binder calls.
- *frames = mPPosFromWriteFrames;
- timestamp->tv_sec = mPPosFromWriteTS.tv_sec;
- timestamp->tv_nsec = mPPosFromWriteTS.tv_nsec;
- return OK;
+ if (mPPosFromWrite.status == OK) {
+ *frames = mPPosFromWrite.frames;
+ timestamp->tv_sec = mPPosFromWrite.ts.tv_sec;
+ timestamp->tv_nsec = mPPosFromWrite.ts.tv_nsec;
+ }
+ return mPPosFromWrite.status;
}
Result retval;