From 54274035905ef52c7eb88309aec5e5b8f25be471 Mon Sep 17 00:00:00 2001 From: Andy Hung Date: Thu, 19 Apr 2018 18:16:44 -0700 Subject: [PATCH] AudioTrackShared: Fix wrap condition for stop limit Test: Photos video playback and repeat accessing info Bug: 68747620 Change-Id: I8c4afa44c0a0a7f689fbc8797ee815e8ae960979 --- media/libaudioclient/AudioTrackShared.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/media/libaudioclient/AudioTrackShared.cpp b/media/libaudioclient/AudioTrackShared.cpp index b4c179d1db..dced3c4389 100644 --- a/media/libaudioclient/AudioTrackShared.cpp +++ b/media/libaudioclient/AudioTrackShared.cpp @@ -725,12 +725,13 @@ int32_t AudioTrackServerProxy::getRear() const const size_t mask = overflowBit - 1; int32_t newRear = (rear & ~mask) | (stop & mask); ssize_t filled = newRear - front; - if (filled < 0) { + // overflowBit is unsigned, so cast to signed for comparison. + if (filled >= (ssize_t)overflowBit) { // front and rear offsets span the overflow bit of the p2 mask - // so rebasing newrear. + // so rebasing newRear on the rear offset is off by the overflow bit. ALOGV("stop wrap: filled %zx >= overflowBit %zx", filled, overflowBit); - newRear += overflowBit; - filled += overflowBit; + newRear -= overflowBit; + filled -= overflowBit; } if (0 <= filled && (size_t) filled <= mFrameCount) { // we're stopped, return the stop level as newRear