@ -884,7 +884,6 @@ status_t AudioRecord::obtainBuffer(Buffer* audioBuffer, const struct timespec *r
{
// previous and new IAudioRecord sequence numbers are used to detect track re-creation
uint32_t oldSequence = 0 ;
uint32_t newSequence ;
Proxy : : Buffer buffer ;
status_t status = NO_ERROR ;
@ -902,7 +901,7 @@ status_t AudioRecord::obtainBuffer(Buffer* audioBuffer, const struct timespec *r
// start of lock scope
AutoMutex lock ( mLock ) ;
newSequence = mSequence ;
uint32_t newSequence = mSequence ;
// did previous obtainBuffer() fail due to media server death or voluntary invalidation?
if ( status = = DEAD_OBJECT ) {
// re-create track, unless someone else has already done so
@ -939,6 +938,7 @@ status_t AudioRecord::obtainBuffer(Buffer* audioBuffer, const struct timespec *r
audioBuffer - > frameCount = buffer . mFrameCount ;
audioBuffer - > size = buffer . mFrameCount * mFrameSize ;
audioBuffer - > raw = buffer . mRaw ;
audioBuffer - > sequence = oldSequence ;
if ( nonContig ! = NULL ) {
* nonContig = buffer . mNonContig ;
}
@ -959,6 +959,12 @@ void AudioRecord::releaseBuffer(const Buffer* audioBuffer)
buffer . mRaw = audioBuffer - > raw ;
AutoMutex lock ( mLock ) ;
if ( audioBuffer - > sequence ! = mSequence ) {
// This Buffer came from a different IAudioRecord instance, so ignore the releaseBuffer
ALOGD ( " %s is no-op due to IAudioRecord sequence mismatch %u != %u " ,
__func__ , audioBuffer - > sequence , mSequence ) ;
return ;
}
mInOverrun = false ;
mProxy - > releaseBuffer ( & buffer ) ;