@@ -282,8 +282,6 @@ status_t AudioSource::dataCallbackTimestamp(
282282 mPrevSampleTimeUs = mStartTimeUs ;
283283 }
284284
285- int64_t timestampUs = mPrevSampleTimeUs ;
286-
287285 size_t numLostBytes = 0 ;
288286 if (mNumFramesReceived > 0 ) { // Ignore earlier frame lost
289287 // getInputFramesLost() returns the number of lost frames.
@@ -293,37 +291,58 @@ status_t AudioSource::dataCallbackTimestamp(
293291
294292 CHECK_EQ (numLostBytes & 1 , 0u );
295293 CHECK_EQ (audioBuffer.size & 1 , 0u );
296- size_t bufferSize = numLostBytes + audioBuffer.size ;
297- MediaBuffer *buffer = new MediaBuffer (bufferSize);
298294 if (numLostBytes > 0 ) {
299- memset (buffer->data (), 0 , numLostBytes);
300- memcpy ((uint8_t *) buffer->data () + numLostBytes,
301- audioBuffer.i16 , audioBuffer.size );
302- } else {
303- if (audioBuffer.size == 0 ) {
304- ALOGW (" Nothing is available from AudioRecord callback buffer" );
305- buffer->release ();
306- return OK;
295+ // Loss of audio frames should happen rarely; thus the LOGW should
296+ // not cause a logging spam
297+ ALOGW (" Lost audio record data: %d bytes" , numLostBytes);
298+ }
299+
300+ while (numLostBytes > 0 ) {
301+ size_t bufferSize = numLostBytes;
302+ if (numLostBytes > kMaxBufferSize ) {
303+ numLostBytes -= kMaxBufferSize ;
304+ bufferSize = kMaxBufferSize ;
305+ } else {
306+ numLostBytes = 0 ;
307307 }
308- memcpy ((uint8_t *) buffer->data (),
309- audioBuffer.i16 , audioBuffer.size );
308+ MediaBuffer *lostAudioBuffer = new MediaBuffer (bufferSize);
309+ memset (lostAudioBuffer->data (), 0 , bufferSize);
310+ lostAudioBuffer->set_range (0 , bufferSize);
311+ queueInputBuffer_l (lostAudioBuffer, timeUs);
312+ }
313+
314+ if (audioBuffer.size == 0 ) {
315+ ALOGW (" Nothing is available from AudioRecord callback buffer" );
316+ return OK;
310317 }
311318
319+ const size_t bufferSize = audioBuffer.size ;
320+ MediaBuffer *buffer = new MediaBuffer (bufferSize);
321+ memcpy ((uint8_t *) buffer->data (),
322+ audioBuffer.i16 , audioBuffer.size );
312323 buffer->set_range (0 , bufferSize);
313- timestampUs += ((1000000LL * (bufferSize >> 1 )) +
314- (mSampleRate >> 1 )) / mSampleRate ;
324+ queueInputBuffer_l (buffer, timeUs);
325+ return OK;
326+ }
327+
328+ void AudioSource::queueInputBuffer_l (MediaBuffer *buffer, int64_t timeUs) {
329+ const size_t bufferSize = buffer->range_length ();
330+ const size_t frameSize = mRecord ->frameSize ();
331+ const int64_t timestampUs =
332+ mPrevSampleTimeUs +
333+ ((1000000LL * (bufferSize / frameSize)) +
334+ (mSampleRate >> 1 )) / mSampleRate ;
315335
316336 if (mNumFramesReceived == 0 ) {
317337 buffer->meta_data ()->setInt64 (kKeyAnchorTime , mStartTimeUs );
318338 }
339+
319340 buffer->meta_data ()->setInt64 (kKeyTime , mPrevSampleTimeUs );
320341 buffer->meta_data ()->setInt64 (kKeyDriftTime , timeUs - mInitialReadTimeUs );
321342 mPrevSampleTimeUs = timestampUs;
322- mNumFramesReceived += buffer-> range_length () / sizeof ( int16_t ) ;
343+ mNumFramesReceived += bufferSize / frameSize ;
323344 mBuffersReceived .push_back (buffer);
324345 mFrameAvailableCondition .signal ();
325-
326- return OK;
327346}
328347
329348void AudioSource::trackMaxAmplitude (int16_t *data, int nSamples) {
0 commit comments