am 56b20860: Merge change 26349 into eclair

Merge commit '56b208602194a3923521bde1d87453ce3de39576' into eclair-plus-aosp

* commit '56b208602194a3923521bde1d87453ce3de39576':
  Fix issue 2116700: Ringer screwy while connected over Bluetooth.
This commit is contained in:
Eric Laurent
2009-09-22 09:27:54 -07:00
committed by Android Git Automerger

View File

@@ -1227,11 +1227,6 @@ bool AudioFlinger::MixerThread::threadLoop()
enabledTracks = prepareTracks_l(activeTracks, &tracksToRemove); enabledTracks = prepareTracks_l(activeTracks, &tracksToRemove);
} }
// output audio to hardware
if (mSuspended) {
usleep(kMaxBufferRecoveryInUsecs);
} else {
if (LIKELY(enabledTracks)) { if (LIKELY(enabledTracks)) {
// mix buffers... // mix buffers...
mAudioMixer->process(curBuf); mAudioMixer->process(curBuf);
@@ -1239,21 +1234,27 @@ bool AudioFlinger::MixerThread::threadLoop()
standbyTime = systemTime() + kStandbyTimeInNsecs; standbyTime = systemTime() + kStandbyTimeInNsecs;
} else { } else {
sleepTime += kBufferRecoveryInUsecs; sleepTime += kBufferRecoveryInUsecs;
if (sleepTime > kMaxBufferRecoveryInUsecs) {
sleepTime = kMaxBufferRecoveryInUsecs;
}
// There was nothing to mix this round, which means all // There was nothing to mix this round, which means all
// active tracks were late. Sleep a little bit to give // active tracks were late. Sleep a little bit to give
// them another chance. If we're too late, write 0s to audio // them another chance. If we're too late, write 0s to audio
// hardware to avoid underrun. // hardware to avoid underrun.
if (mBytesWritten == 0 || sleepTime < kMaxBufferRecoveryInUsecs) { if (mBytesWritten != 0 && sleepTime >= kMaxBufferRecoveryInUsecs) {
usleep(kBufferRecoveryInUsecs);
} else {
memset (curBuf, 0, mixBufferSize); memset (curBuf, 0, mixBufferSize);
sleepTime = 0; sleepTime = 0;
} }
} }
// sleepTime == 0 means PCM data were written to mMixBuffer[]
if (mSuspended) {
sleepTime = kMaxBufferRecoveryInUsecs;
}
// sleepTime == 0 means we must write to audio hardware
if (sleepTime == 0) { if (sleepTime == 0) {
mLastWriteTime = systemTime(); mLastWriteTime = systemTime();
mInWrite = true; mInWrite = true;
LOGV("mOutput->write() thread %p frames %d", this, mFrameCount);
int bytesWritten = (int)mOutput->write(curBuf, mixBufferSize); int bytesWritten = (int)mOutput->write(curBuf, mixBufferSize);
if (bytesWritten > 0) mBytesWritten += bytesWritten; if (bytesWritten > 0) mBytesWritten += bytesWritten;
mNumWrites++; mNumWrites++;
@@ -1261,10 +1262,11 @@ bool AudioFlinger::MixerThread::threadLoop()
mStandby = false; mStandby = false;
nsecs_t delta = systemTime() - mLastWriteTime; nsecs_t delta = systemTime() - mLastWriteTime;
if (delta > maxPeriod) { if (delta > maxPeriod) {
LOGW("write blocked for %llu msecs", ns2ms(delta)); LOGW("write blocked for %llu msecs, thread %p", ns2ms(delta), this);
mNumDelayedWrites++; mNumDelayedWrites++;
} }
} } else {
usleep(sleepTime);
} }
// finally let go of all our tracks, without the lock held // finally let go of all our tracks, without the lock held
@@ -1718,10 +1720,6 @@ bool AudioFlinger::DirectOutputThread::threadLoop()
} }
} }
// output audio to hardware
if (mSuspended) {
usleep(kMaxBufferRecoveryInUsecs);
} else {
if (activeTrack != 0) { if (activeTrack != 0) {
AudioBufferProvider::Buffer buffer; AudioBufferProvider::Buffer buffer;
size_t frameCount = mFrameCount; size_t frameCount = mFrameCount;
@@ -1743,16 +1741,24 @@ bool AudioFlinger::DirectOutputThread::threadLoop()
standbyTime = systemTime() + kStandbyTimeInNsecs; standbyTime = systemTime() + kStandbyTimeInNsecs;
} else { } else {
sleepTime += kBufferRecoveryInUsecs; sleepTime += kBufferRecoveryInUsecs;
if (mBytesWritten == 0 || !AudioSystem::isLinearPCM(mFormat) || if (sleepTime > kMaxBufferRecoveryInUsecs) {
sleepTime < kMaxBufferRecoveryInUsecs) { sleepTime = kMaxBufferRecoveryInUsecs;
usleep(kBufferRecoveryInUsecs); }
} else { // There was nothing to mix this round, which means all
// active tracks were late. Sleep a little bit to give
// them another chance. If we're too late, write 0s to audio
// hardware to avoid underrun.
if (mBytesWritten != 0 && sleepTime >= kMaxBufferRecoveryInUsecs &&
AudioSystem::isLinearPCM(mFormat)) {
memset (mMixBuffer, 0, mFrameCount * mFrameSize); memset (mMixBuffer, 0, mFrameCount * mFrameSize);
sleepTime = 0; sleepTime = 0;
} }
} }
// sleepTime == 0 means PCM data were written to mMixBuffer[] if (mSuspended) {
sleepTime = kMaxBufferRecoveryInUsecs;
}
// sleepTime == 0 means we must write to audio hardware
if (sleepTime == 0) { if (sleepTime == 0) {
mLastWriteTime = systemTime(); mLastWriteTime = systemTime();
mInWrite = true; mInWrite = true;
@@ -1761,7 +1767,8 @@ bool AudioFlinger::DirectOutputThread::threadLoop()
mNumWrites++; mNumWrites++;
mInWrite = false; mInWrite = false;
mStandby = false; mStandby = false;
} } else {
usleep(sleepTime);
} }
// finally let go of removed track, without the lock held // finally let go of removed track, without the lock held
@@ -1915,36 +1922,38 @@ bool AudioFlinger::DuplicatingThread::threadLoop()
enabledTracks = prepareTracks_l(activeTracks, &tracksToRemove); enabledTracks = prepareTracks_l(activeTracks, &tracksToRemove);
} }
bool mustSleep = true;
if (LIKELY(enabledTracks)) { if (LIKELY(enabledTracks)) {
// mix buffers... // mix buffers...
mAudioMixer->process(curBuf); mAudioMixer->process(curBuf);
if (!mSuspended) { sleepTime = 0;
standbyTime = systemTime() + kStandbyTimeInNsecs;
} else {
sleepTime += kBufferRecoveryInUsecs;
if (sleepTime > kMaxBufferRecoveryInUsecs) {
sleepTime = kMaxBufferRecoveryInUsecs;
}
// There was nothing to mix this round, which means all
// active tracks were late. Sleep a little bit to give
// them another chance. If we're too late, write 0s to audio
// hardware to avoid underrun.
if (mBytesWritten != 0 && sleepTime >= kMaxBufferRecoveryInUsecs) {
memset (curBuf, 0, mixBufferSize);
sleepTime = 0;
}
}
if (mSuspended) {
sleepTime = kMaxBufferRecoveryInUsecs;
}
// sleepTime == 0 means we must write to audio hardware
if (sleepTime == 0) {
for (size_t i = 0; i < outputTracks.size(); i++) { for (size_t i = 0; i < outputTracks.size(); i++) {
outputTracks[i]->write(curBuf, mFrameCount); outputTracks[i]->write(curBuf, mFrameCount);
mustSleep = false;
} }
mStandby = false; mStandby = false;
mBytesWritten += mixBufferSize; mBytesWritten += mixBufferSize;
}
} else { } else {
// flush remaining overflow buffers in output tracks
for (size_t i = 0; i < outputTracks.size(); i++) {
if (outputTracks[i]->isActive()) {
outputTracks[i]->write(curBuf, 0);
standbyTime = systemTime() + kStandbyTimeInNsecs;
mustSleep = false;
}
}
}
if (mustSleep) {
// LOGV("threadLoop() sleeping %d", sleepTime);
usleep(sleepTime); usleep(sleepTime);
if (sleepTime < kMaxBufferRecoveryInUsecs) {
sleepTime += kBufferRecoveryInUsecs;
}
} else {
sleepTime = kBufferRecoveryInUsecs;
} }
// finally let go of all our tracks, without the lock held // finally let go of all our tracks, without the lock held