size_t StaticAudioTrackServerProxy::framesReady() { // Can't call pollPosition() from multiple threads. if (!mFramesReadyIsCalledByMultipleThreads) { (void) pollPosition(); } return mFramesReadySafe; }
size_t StaticAudioTrackServerProxy::framesReady() { // FIXME // This is racy if called by normal mixer thread, // as we're reading 2 independent variables without a lock. // Can't call mObserver.poll(), as we might be called from wrong thread. // If looping is enabled, should return a higher number (since includes non-contiguous). size_t position = mPosition; if (!mFramesReadyIsCalledByMultipleThreads) { ssize_t positionOrStatus = pollPosition(); if (positionOrStatus >= 0) { position = (size_t) positionOrStatus; } } size_t end = mEnd; return position < end ? end - position : 0; }
status_t StaticAudioTrackServerProxy::obtainBuffer(Buffer* buffer, bool ackFlush __unused) { if (mIsShutdown) { buffer->mFrameCount = 0; buffer->mRaw = NULL; buffer->mNonContig = 0; mUnreleased = 0; return NO_INIT; } ssize_t positionOrStatus = pollPosition(); if (positionOrStatus < 0) { buffer->mFrameCount = 0; buffer->mRaw = NULL; buffer->mNonContig = 0; mUnreleased = 0; return (status_t) positionOrStatus; } size_t position = (size_t) positionOrStatus; size_t end = mState.mLoopCount != 0 ? mState.mLoopEnd : mFrameCount; size_t avail; if (position < end) { avail = end - position; size_t wanted = buffer->mFrameCount; if (avail < wanted) { buffer->mFrameCount = avail; } else { avail = wanted; } buffer->mRaw = &((char *) mBuffers)[position * mFrameSize]; } else { avail = 0; buffer->mFrameCount = 0; buffer->mRaw = NULL; } // As mFramesReady is the total remaining frames in the static audio track, // it is always larger or equal to avail. LOG_ALWAYS_FATAL_IF(mFramesReady < (int64_t) avail); buffer->mNonContig = mFramesReady == INT64_MAX ? SIZE_MAX : clampToSize(mFramesReady - avail); mUnreleased = avail; return NO_ERROR; }
status_t StaticAudioTrackServerProxy::obtainBuffer(Buffer* buffer, bool ackFlush) { if (mIsShutdown) { buffer->mFrameCount = 0; buffer->mRaw = NULL; buffer->mNonContig = 0; mUnreleased = 0; return NO_INIT; } ssize_t positionOrStatus = pollPosition(); if (positionOrStatus < 0) { buffer->mFrameCount = 0; buffer->mRaw = NULL; buffer->mNonContig = 0; mUnreleased = 0; return (status_t) positionOrStatus; } size_t position = (size_t) positionOrStatus; size_t avail; if (position < mEnd) { avail = mEnd - position; size_t wanted = buffer->mFrameCount; if (avail < wanted) { buffer->mFrameCount = avail; } else { avail = wanted; } buffer->mRaw = &((char *) mBuffers)[position * mFrameSize]; } else { avail = 0; buffer->mFrameCount = 0; buffer->mRaw = NULL; } buffer->mNonContig = 0; // FIXME should be > 0 for looping mUnreleased = avail; return NO_ERROR; }