summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndy Hung <hunga@google.com>2014-11-26 18:41:10 +0000
committerAndroid Git Automerger <android-git-automerger@android.com>2014-11-26 18:41:10 +0000
commit0e47b16ffcf78acb81b0ebf14d058db191f74af0 (patch)
treeb887a57604e0cdc8f76c427a34dac2c9673d833e
parentd802d0718d7639da1bef1128a840cfd05200af55 (diff)
parent1e18795a4847e9368baa7ecee146d3901b283cd0 (diff)
downloadframeworks_av-0e47b16ffcf78acb81b0ebf14d058db191f74af0.zip
frameworks_av-0e47b16ffcf78acb81b0ebf14d058db191f74af0.tar.gz
frameworks_av-0e47b16ffcf78acb81b0ebf14d058db191f74af0.tar.bz2
am 1e18795a: am d325005e: Merge "Fix AudioTrack loop mode to play audio from buffer start" into lmp-mr1-dev
* commit '1e18795a4847e9368baa7ecee146d3901b283cd0': Fix AudioTrack loop mode to play audio from buffer start
-rw-r--r--media/libmedia/AudioTrack.cpp3
-rw-r--r--media/libmedia/AudioTrackShared.cpp10
2 files changed, 9 insertions, 4 deletions
diff --git a/media/libmedia/AudioTrack.cpp b/media/libmedia/AudioTrack.cpp
index 4c51646..ca79f25 100644
--- a/media/libmedia/AudioTrack.cpp
+++ b/media/libmedia/AudioTrack.cpp
@@ -742,8 +742,7 @@ status_t AudioTrack::setLoop(uint32_t loopStart, uint32_t loopEnd, int loopCount
void AudioTrack::setLoop_l(uint32_t loopStart, uint32_t loopEnd, int loopCount)
{
- // FIXME If setting a loop also sets position to start of loop, then
- // this is correct. Otherwise it should be removed.
+ // Setting the loop will reset next notification update period (like setPosition).
mNewPosition = updateAndGetPosition_l() + mUpdatePeriod;
mLoopPeriod = loopCount != 0 ? loopEnd - loopStart : 0;
mStaticProxy->setLoop(loopStart, loopEnd, loopCount);
diff --git a/media/libmedia/AudioTrackShared.cpp b/media/libmedia/AudioTrackShared.cpp
index 62362da..4a783b3 100644
--- a/media/libmedia/AudioTrackShared.cpp
+++ b/media/libmedia/AudioTrackShared.cpp
@@ -503,7 +503,11 @@ void StaticAudioTrackClientProxy::setLoop(size_t loopStart, size_t loopEnd, int
newState.mLoopStart = (uint32_t) loopStart;
newState.mLoopEnd = (uint32_t) loopEnd;
newState.mLoopCount = loopCount;
- mBufferPosition = loopStart;
+ size_t bufferPosition;
+ if (loopCount == 0 || (bufferPosition = getBufferPosition()) >= loopEnd) {
+ bufferPosition = loopStart;
+ }
+ mBufferPosition = bufferPosition; // snapshot buffer position until loop is acknowledged.
(void) mMutator.push(newState);
}
@@ -776,7 +780,9 @@ ssize_t StaticAudioTrackServerProxy::pollPosition()
} else if (state.mLoopCount >= -1) {
if (loopStart < loopEnd && loopEnd <= mFrameCount &&
loopEnd - loopStart >= MIN_LOOP) {
- if (!(loopStart <= position && position < loopEnd)) {
+ // If the current position is greater than the end of the loop
+ // we "wrap" to the loop start. This might cause an audible pop.
+ if (position >= loopEnd) {
mPosition = position = loopStart;
}
if (state.mLoopCount == -1) {