Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 38267b77 authored by Mikhail Naganov's avatar Mikhail Naganov Committed by Android (Google) Code Review
Browse files

Merge "Update StreamHalHidl to use IStreamOut.WriteStatus new field"

parents 9fe81732 d635199d
Loading
Loading
Loading
Loading
+26 −18
Original line number Diff line number Diff line
@@ -242,7 +242,7 @@ struct StreamOutCallback : public IStreamOutCallback {

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 @@ retry:
    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 @@ retry:
    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::flush() {
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;
+7 −3
Original line number Diff line number Diff line
@@ -164,15 +164,19 @@ class StreamOutHalHidl : public StreamOutHalInterface, public StreamHalHidl {
    std::unique_ptr<StatusMQ> mStatusMQ;
    EventFlag* mEfGroup;
    bool mGetPresentationPositionNotSupported;
    uint64_t mPPosFromWriteObtained;
    uint64_t mPPosFromWriteFrames;
    struct timespec mPPosFromWriteTS;
    struct {
        uint64_t obtained;
        status_t status;
        uint64_t frames;
        struct timespec ts;
    } mPPosFromWrite;

    // Can not be constructed directly by clients.
    StreamOutHalHidl(const sp<IStreamOut>& stream);

    virtual ~StreamOutHalHidl();

    uint64_t getCurrentTimeMs();
    status_t prepareForWriting(size_t bufferSize);
};