diff options
Diffstat (limited to 'media')
-rw-r--r-- | media/libmedia/AudioTrack.cpp | 25 |
1 files changed, 21 insertions, 4 deletions
diff --git a/media/libmedia/AudioTrack.cpp b/media/libmedia/AudioTrack.cpp index 3b6c64d..7509239 100644 --- a/media/libmedia/AudioTrack.cpp +++ b/media/libmedia/AudioTrack.cpp @@ -1182,16 +1182,33 @@ status_t AudioTrack::restoreTrack_l(audio_track_cblk_t*& cblk, bool fromStart) false); if (result == NO_ERROR) { + uint32_t user = cblk->user; + uint32_t server = cblk->server; // restore write index and set other indexes to reflect empty buffer status - mCblk->user = cblk->user; - mCblk->server = cblk->user; - mCblk->userBase = cblk->user; - mCblk->serverBase = cblk->user; + mCblk->user = user; + mCblk->server = user; + mCblk->userBase = user; + mCblk->serverBase = user; // restore loop: this is not guaranteed to succeed if new frame count is not // compatible with loop length setLoop_l(cblk->loopStart, cblk->loopEnd, cblk->loopCount); if (!fromStart) { mCblk->bufferTimeoutMs = MAX_RUN_TIMEOUT_MS; + // Make sure that a client relying on callback events indicating underrun or + // the actual amount of audio frames played (e.g SoundPool) receives them. + if (mSharedBuffer == 0) { + uint32_t frames = 0; + if (user > server) { + frames = ((user - server) > mCblk->frameCount) ? + mCblk->frameCount : (user - server); + memset(mCblk->buffers, 0, frames * mCblk->frameSize); + } + // restart playback even if buffer is not completely filled. + android_atomic_or(CBLK_FORCEREADY_ON, &mCblk->flags); + // stepUser() clears CBLK_UNDERRUN_ON flag enabling underrun callbacks to + // the client + mCblk->stepUser(frames); + } } if (mActive) { result = mAudioTrack->start(); |