diff options
author | Chia-chi Yeh <chiachi@android.com> | 2010-09-30 17:41:09 -0700 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2010-09-30 17:41:09 -0700 |
commit | 274e3b5d752d1a4fd05352e50ad098d2f5b49a36 (patch) | |
tree | a51961aa70fba9fdc9ed1a01438528352d507e9a /voip | |
parent | 220ab8877b234e6807b7f6d9028ba55d23220301 (diff) | |
parent | 67ecb5b90c7d944a485ed35f3e968ab0ae49f5b4 (diff) | |
download | frameworks_base-274e3b5d752d1a4fd05352e50ad098d2f5b49a36.zip frameworks_base-274e3b5d752d1a4fd05352e50ad098d2f5b49a36.tar.gz frameworks_base-274e3b5d752d1a4fd05352e50ad098d2f5b49a36.tar.bz2 |
Merge "RTP: Start AudioRecord before AudioTrack to avoid being disabled." into gingerbread
Diffstat (limited to 'voip')
-rw-r--r-- | voip/jni/rtp/AudioGroup.cpp | 27 |
1 files changed, 13 insertions, 14 deletions
diff --git a/voip/jni/rtp/AudioGroup.cpp b/voip/jni/rtp/AudioGroup.cpp index a953d38..5214518 100644 --- a/voip/jni/rtp/AudioGroup.cpp +++ b/voip/jni/rtp/AudioGroup.cpp @@ -776,11 +776,14 @@ bool AudioGroup::DeviceThread::threadLoop() char c; while (recv(deviceSocket, &c, 1, MSG_DONTWAIT) == 1); - // Start your engine! - track.start(); + // Start AudioRecord before AudioTrack. This prevents AudioTrack from being + // disabled due to buffer underrun while waiting for AudioRecord. if (mode != MUTED) { record.start(); + int16_t one; + record.read(&one, sizeof(one)); } + track.start(); while (!exitPending()) { int16_t output[sampleCount]; @@ -806,34 +809,30 @@ bool AudioGroup::DeviceThread::threadLoop() track.releaseBuffer(&buffer); } else if (status != TIMED_OUT && status != WOULD_BLOCK) { LOGE("cannot write to AudioTrack"); - break; + return true; } } if (toRead > 0) { AudioRecord::Buffer buffer; - buffer.frameCount = record.frameCount(); + buffer.frameCount = toRead; status_t status = record.obtainBuffer(&buffer, 1); if (status == NO_ERROR) { - int count = ((int)buffer.frameCount < toRead) ? - buffer.frameCount : toRead; - memcpy(&input[sampleCount - toRead], buffer.i8, count * 2); - toRead -= count; - if (buffer.frameCount < record.frameCount()) { - buffer.frameCount = count; - } + int offset = sampleCount - toRead; + memcpy(&input[offset], buffer.i8, buffer.size); + toRead -= buffer.frameCount; record.releaseBuffer(&buffer); } else if (status != TIMED_OUT && status != WOULD_BLOCK) { LOGE("cannot read from AudioRecord"); - break; + return true; } } } if (chances <= 0) { - LOGE("device loop timeout"); - break; + LOGW("device loop timeout"); + while (recv(deviceSocket, &c, 1, MSG_DONTWAIT) == 1); } if (mode != MUTED) { |