summaryrefslogtreecommitdiffstats
path: root/voip
diff options
context:
space:
mode:
authorChia-chi Yeh <chiachi@android.com>2010-09-30 17:41:09 -0700
committerAndroid (Google) Code Review <android-gerrit@google.com>2010-09-30 17:41:09 -0700
commit274e3b5d752d1a4fd05352e50ad098d2f5b49a36 (patch)
treea51961aa70fba9fdc9ed1a01438528352d507e9a /voip
parent220ab8877b234e6807b7f6d9028ba55d23220301 (diff)
parent67ecb5b90c7d944a485ed35f3e968ab0ae49f5b4 (diff)
downloadframeworks_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.cpp27
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) {