status_t BufferQueue::setSynchronousMode(bool enabled) { ATRACE_CALL(); ST_LOGV("setSynchronousMode: enabled=%d", enabled); Mutex::Autolock lock(mMutex); if (mAbandoned) { ST_LOGE("setSynchronousMode: SurfaceTexture has been abandoned!"); return NO_INIT; } status_t err = OK; if (!mAllowSynchronousMode && enabled) return err; if (!enabled) { // going to asynchronous mode, drain the queue err = drainQueueLocked(); if (err != NO_ERROR) return err; } if (mSynchronousMode != enabled) { // - if we're going to asynchronous mode, the queue is guaranteed to be // empty here // - if the client set the number of buffers, we're guaranteed that // we have at least 3 (because we don't allow less) mSynchronousMode = enabled; mDequeueCondition.broadcast(); } return err; }
status_t BufferQueue::drainQueueAndFreeBuffersLocked() { status_t err = drainQueueLocked(); if (err == NO_ERROR) { if (mSynchronousMode) { freeAllBuffersLocked(); } else { freeAllBuffersExceptHeadLocked(); } } return err; }
status_t BufferQueue::drainQueueAndFreeBuffersLocked() { status_t err = drainQueueLocked(); if (err == NO_ERROR) { if (mQueue.empty()) { freeAllBuffersLocked(); } else { freeAllBuffersExceptHeadLocked(); } } return err; }