Merge "Fix kAutoRampDurationUs overflow issue" into klp-dev
diff --git a/include/private/media/AudioTrackShared.h b/include/private/media/AudioTrackShared.h
index 395f164..7fd9379 100644
--- a/include/private/media/AudioTrackShared.h
+++ b/include/private/media/AudioTrackShared.h
@@ -360,6 +360,7 @@
// which must be > 0.
// buffer->mNonContig is unused.
// buffer->mRaw is unused.
+ // ackFlush is true iff being called from Track::start to acknowledge a pending flush.
// On exit:
// buffer->mFrameCount has the actual number of contiguous available frames,
// which is always 0 when the return status != NO_ERROR.
@@ -370,7 +371,7 @@
// NO_ERROR Success, buffer->mFrameCount > 0.
// WOULD_BLOCK No frames are available.
// NO_INIT Shared memory is corrupt.
- virtual status_t obtainBuffer(Buffer* buffer);
+ virtual status_t obtainBuffer(Buffer* buffer, bool ackFlush = false);
// Release (some of) the frames last obtained.
// On entry, buffer->mFrameCount should have the number of frames to release,
@@ -437,7 +438,7 @@
public:
virtual size_t framesReady();
virtual void framesReadyIsCalledByMultipleThreads();
- virtual status_t obtainBuffer(Buffer* buffer);
+ virtual status_t obtainBuffer(Buffer* buffer, bool ackFlush);
virtual void releaseBuffer(Buffer* buffer);
virtual void tallyUnderrunFrames(uint32_t frameCount);
virtual uint32_t getUnderrunFrames() const { return 0; }
diff --git a/media/libmedia/AudioTrackShared.cpp b/media/libmedia/AudioTrackShared.cpp
index da73d65..caa7900 100644
--- a/media/libmedia/AudioTrackShared.cpp
+++ b/media/libmedia/AudioTrackShared.cpp
@@ -506,7 +506,7 @@
{
}
-status_t ServerProxy::obtainBuffer(Buffer* buffer)
+status_t ServerProxy::obtainBuffer(Buffer* buffer, bool ackFlush)
{
LOG_ALWAYS_FATAL_IF(buffer == NULL || buffer->mFrameCount == 0);
if (mIsShutdown) {
@@ -579,7 +579,11 @@
buffer->mRaw = part1 > 0 ?
&((char *) mBuffers)[(mIsOut ? front : rear) * mFrameSize] : NULL;
buffer->mNonContig = availToServer - part1;
- mUnreleased = part1;
+ // After flush(), allow releaseBuffer() on a previously obtained buffer;
+ // see "Acknowledge any pending flush()" in audioflinger/Tracks.cpp.
+ if (!ackFlush) {
+ mUnreleased = part1;
+ }
return part1 > 0 ? NO_ERROR : WOULD_BLOCK;
}
no_init:
@@ -761,7 +765,7 @@
return (ssize_t) position;
}
-status_t StaticAudioTrackServerProxy::obtainBuffer(Buffer* buffer)
+status_t StaticAudioTrackServerProxy::obtainBuffer(Buffer* buffer, bool ackFlush)
{
if (mIsShutdown) {
buffer->mFrameCount = 0;
diff --git a/services/audioflinger/Threads.cpp b/services/audioflinger/Threads.cpp
index 47dcca6..9c8fd1f 100644
--- a/services/audioflinger/Threads.cpp
+++ b/services/audioflinger/Threads.cpp
@@ -3884,15 +3884,11 @@
: DirectOutputThread(audioFlinger, output, id, device, OFFLOAD),
mHwPaused(false),
mFlushPending(false),
- mPausedBytesRemaining(0)
+ mPausedBytesRemaining(0),
+ mPreviousTrack(NULL)
{
}
-AudioFlinger::OffloadThread::~OffloadThread()
-{
- mPreviousTrack.clear();
-}
-
void AudioFlinger::OffloadThread::threadLoop_exit()
{
if (mFlushPending || mHwPaused) {
@@ -3928,7 +3924,7 @@
Track* const track = t.get();
audio_track_cblk_t* cblk = track->cblk();
if (mPreviousTrack != NULL) {
- if (t != mPreviousTrack) {
+ if (t.get() != mPreviousTrack) {
// Flush any data still being written from last track
mBytesRemaining = 0;
if (mPausedBytesRemaining) {
@@ -3943,7 +3939,7 @@
}
}
}
- mPreviousTrack = t;
+ mPreviousTrack = t.get();
bool last = (i == (count - 1));
if (track->isPausing()) {
track->setPaused();
@@ -4008,7 +4004,8 @@
// has been written
ALOGV("OffloadThread: underrun and STOPPING_1 -> draining, STOPPING_2");
track->mState = TrackBase::STOPPING_2; // so presentation completes after drain
- if (last) {
+ // do not drain if no data was ever sent to HAL (mStandby == true)
+ if (last && !mStandby) {
sleepTime = 0;
standbyTime = systemTime() + standbyDelay;
mixerStatus = MIXER_DRAIN_TRACK;
@@ -4022,8 +4019,8 @@
}
}
} else if (track->isStopping_2()) {
- // Drain has completed, signal presentation complete
- if (!(mDrainSequence & 1) || !last) {
+ // Drain has completed or we are in standby, signal presentation complete
+ if (!(mDrainSequence & 1) || !last || mStandby) {
track->mState = TrackBase::STOPPED;
size_t audioHALFrames =
(mOutput->stream->get_latency(mOutput->stream)*mSampleRate) / 1000;
diff --git a/services/audioflinger/Threads.h b/services/audioflinger/Threads.h
index 802b784..a5d2169 100644
--- a/services/audioflinger/Threads.h
+++ b/services/audioflinger/Threads.h
@@ -735,7 +735,7 @@
OffloadThread(const sp<AudioFlinger>& audioFlinger, AudioStreamOut* output,
audio_io_handle_t id, uint32_t device);
- virtual ~OffloadThread();
+ virtual ~OffloadThread() {};
protected:
// threadLoop snippets
@@ -755,7 +755,7 @@
bool mFlushPending;
size_t mPausedWriteLength; // length in bytes of write interrupted by pause
size_t mPausedBytesRemaining; // bytes still waiting in mixbuffer after resume
- sp<Track> mPreviousTrack; // used to detect track switch
+ Track *mPreviousTrack; // used to detect track switch
};
class AsyncCallbackThread : public Thread {
diff --git a/services/audioflinger/Tracks.cpp b/services/audioflinger/Tracks.cpp
index e93833f..363bc9d 100644
--- a/services/audioflinger/Tracks.cpp
+++ b/services/audioflinger/Tracks.cpp
@@ -608,7 +608,7 @@
// and for fast tracks the track is not yet in the fast mixer thread's active set.
ServerProxy::Buffer buffer;
buffer.mFrameCount = 1;
- (void) mAudioTrackServerProxy->obtainBuffer(&buffer);
+ (void) mAudioTrackServerProxy->obtainBuffer(&buffer, true /*ackFlush*/);
}
} else {
status = BAD_VALUE;