diff options
author | Glenn Kasten <gkasten@google.com> | 2012-09-30 11:48:10 -0700 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2012-09-30 11:48:11 -0700 |
commit | d13df2463bd09d8c1fc5b20050d3262a4e89512d (patch) | |
tree | a684796ab498c092f7d98de69d105a2cfe3bf6e1 | |
parent | 73bbd1f1c493835f191ea2b0b72439292496b40a (diff) | |
parent | 003d9f71937070791418bf7efc1f7fe1e4c6b821 (diff) |
Merge "Enable write side of MonoPipe to be shutdown" into jb-mr1-dev
-rw-r--r-- | include/media/nbaio/MonoPipe.h | 13 | ||||
-rw-r--r-- | media/libnbaio/MonoPipe.cpp | 15 |
2 files changed, 26 insertions, 2 deletions
diff --git a/include/media/nbaio/MonoPipe.h b/include/media/nbaio/MonoPipe.h index c47bf6ce..5fcfe9ee 100644 --- a/include/media/nbaio/MonoPipe.h +++ b/include/media/nbaio/MonoPipe.h @@ -77,6 +77,17 @@ public: void setAvgFrames(size_t setpoint); size_t maxFrames() const { return mMaxFrames; } + // Set the shutdown state for the write side of a pipe. + // This may be called by an unrelated thread. When shutdown state is 'true', + // a write that would otherwise block instead returns a short transfer count. + // There is no guarantee how long it will take for the shutdown to be recognized, + // but it will not be an unbounded amount of time. + // The state can be restored to normal by calling shutdown(false). + void shutdown(bool newState = true); + + // Return true if the write side of a pipe is currently shutdown. + bool isShutdown(); + private: // A pair of methods and a helper variable which allows the reader and the // writer to update and observe the values of mFront and mNextRdPTS in an @@ -114,6 +125,8 @@ private: int64_t offsetTimestampByAudioFrames(int64_t ts, size_t audFrames); LinearTransform mSamplesToLocalTime; + + bool mIsShutdown; // whether shutdown(true) was called, no barriers are needed }; } // namespace android diff --git a/media/libnbaio/MonoPipe.cpp b/media/libnbaio/MonoPipe.cpp index bbdc8c1b..e8d3d9b8 100644 --- a/media/libnbaio/MonoPipe.cpp +++ b/media/libnbaio/MonoPipe.cpp @@ -41,7 +41,8 @@ MonoPipe::MonoPipe(size_t reqFrames, NBAIO_Format format, bool writeCanBlock) : mWriteTsValid(false), // mWriteTs mSetpoint((reqFrames * 11) / 16), - mWriteCanBlock(writeCanBlock) + mWriteCanBlock(writeCanBlock), + mIsShutdown(false) { CCHelper tmpHelper; status_t res; @@ -121,7 +122,7 @@ ssize_t MonoPipe::write(const void *buffer, size_t count) android_atomic_release_store(written + mRear, &mRear); totalFramesWritten += written; } - if (!mWriteCanBlock) { + if (!mWriteCanBlock || mIsShutdown) { break; } count -= written; @@ -299,4 +300,14 @@ int64_t MonoPipe::offsetTimestampByAudioFrames(int64_t ts, size_t audFrames) return ts + frame_lt_duration; } +void MonoPipe::shutdown(bool newState) +{ + mIsShutdown = newState; +} + +bool MonoPipe::isShutdown() +{ + return mIsShutdown; +} + } // namespace android |