Loading libs/audioflinger/AudioFlinger.cpp +106 −97 Original line number Diff line number Diff line Loading @@ -1227,11 +1227,6 @@ bool AudioFlinger::MixerThread::threadLoop() enabledTracks = prepareTracks_l(activeTracks, &tracksToRemove); } // output audio to hardware if (mSuspended) { usleep(kMaxBufferRecoveryInUsecs); } else { if (LIKELY(enabledTracks)) { // mix buffers... mAudioMixer->process(curBuf); Loading @@ -1239,21 +1234,27 @@ bool AudioFlinger::MixerThread::threadLoop() 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) { usleep(kBufferRecoveryInUsecs); } else { if (mBytesWritten != 0 && sleepTime >= kMaxBufferRecoveryInUsecs) { memset (curBuf, 0, mixBufferSize); 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) { mLastWriteTime = systemTime(); mInWrite = true; LOGV("mOutput->write() thread %p frames %d", this, mFrameCount); int bytesWritten = (int)mOutput->write(curBuf, mixBufferSize); if (bytesWritten > 0) mBytesWritten += bytesWritten; mNumWrites++; Loading @@ -1261,10 +1262,11 @@ bool AudioFlinger::MixerThread::threadLoop() mStandby = false; nsecs_t delta = systemTime() - mLastWriteTime; if (delta > maxPeriod) { LOGW("write blocked for %llu msecs", ns2ms(delta)); LOGW("write blocked for %llu msecs, thread %p", ns2ms(delta), this); mNumDelayedWrites++; } } } else { usleep(sleepTime); } // finally let go of all our tracks, without the lock held Loading Loading @@ -1718,10 +1720,6 @@ bool AudioFlinger::DirectOutputThread::threadLoop() } } // output audio to hardware if (mSuspended) { usleep(kMaxBufferRecoveryInUsecs); } else { if (activeTrack != 0) { AudioBufferProvider::Buffer buffer; size_t frameCount = mFrameCount; Loading @@ -1743,16 +1741,24 @@ bool AudioFlinger::DirectOutputThread::threadLoop() standbyTime = systemTime() + kStandbyTimeInNsecs; } else { sleepTime += kBufferRecoveryInUsecs; if (mBytesWritten == 0 || !AudioSystem::isLinearPCM(mFormat) || sleepTime < kMaxBufferRecoveryInUsecs) { usleep(kBufferRecoveryInUsecs); } else { 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 && AudioSystem::isLinearPCM(mFormat)) { memset (mMixBuffer, 0, mFrameCount * mFrameSize); 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) { mLastWriteTime = systemTime(); mInWrite = true; Loading @@ -1761,7 +1767,8 @@ bool AudioFlinger::DirectOutputThread::threadLoop() mNumWrites++; mInWrite = false; mStandby = false; } } else { usleep(sleepTime); } // finally let go of removed track, without the lock held Loading Loading @@ -1915,36 +1922,38 @@ bool AudioFlinger::DuplicatingThread::threadLoop() enabledTracks = prepareTracks_l(activeTracks, &tracksToRemove); } bool mustSleep = true; if (LIKELY(enabledTracks)) { // mix buffers... 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++) { outputTracks[i]->write(curBuf, mFrameCount); mustSleep = false; } mStandby = false; mBytesWritten += mixBufferSize; } } 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); if (sleepTime < kMaxBufferRecoveryInUsecs) { sleepTime += kBufferRecoveryInUsecs; } } else { sleepTime = kBufferRecoveryInUsecs; } // finally let go of all our tracks, without the lock held Loading Loading
libs/audioflinger/AudioFlinger.cpp +106 −97 Original line number Diff line number Diff line Loading @@ -1227,11 +1227,6 @@ bool AudioFlinger::MixerThread::threadLoop() enabledTracks = prepareTracks_l(activeTracks, &tracksToRemove); } // output audio to hardware if (mSuspended) { usleep(kMaxBufferRecoveryInUsecs); } else { if (LIKELY(enabledTracks)) { // mix buffers... mAudioMixer->process(curBuf); Loading @@ -1239,21 +1234,27 @@ bool AudioFlinger::MixerThread::threadLoop() 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) { usleep(kBufferRecoveryInUsecs); } else { if (mBytesWritten != 0 && sleepTime >= kMaxBufferRecoveryInUsecs) { memset (curBuf, 0, mixBufferSize); 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) { mLastWriteTime = systemTime(); mInWrite = true; LOGV("mOutput->write() thread %p frames %d", this, mFrameCount); int bytesWritten = (int)mOutput->write(curBuf, mixBufferSize); if (bytesWritten > 0) mBytesWritten += bytesWritten; mNumWrites++; Loading @@ -1261,10 +1262,11 @@ bool AudioFlinger::MixerThread::threadLoop() mStandby = false; nsecs_t delta = systemTime() - mLastWriteTime; if (delta > maxPeriod) { LOGW("write blocked for %llu msecs", ns2ms(delta)); LOGW("write blocked for %llu msecs, thread %p", ns2ms(delta), this); mNumDelayedWrites++; } } } else { usleep(sleepTime); } // finally let go of all our tracks, without the lock held Loading Loading @@ -1718,10 +1720,6 @@ bool AudioFlinger::DirectOutputThread::threadLoop() } } // output audio to hardware if (mSuspended) { usleep(kMaxBufferRecoveryInUsecs); } else { if (activeTrack != 0) { AudioBufferProvider::Buffer buffer; size_t frameCount = mFrameCount; Loading @@ -1743,16 +1741,24 @@ bool AudioFlinger::DirectOutputThread::threadLoop() standbyTime = systemTime() + kStandbyTimeInNsecs; } else { sleepTime += kBufferRecoveryInUsecs; if (mBytesWritten == 0 || !AudioSystem::isLinearPCM(mFormat) || sleepTime < kMaxBufferRecoveryInUsecs) { usleep(kBufferRecoveryInUsecs); } else { 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 && AudioSystem::isLinearPCM(mFormat)) { memset (mMixBuffer, 0, mFrameCount * mFrameSize); 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) { mLastWriteTime = systemTime(); mInWrite = true; Loading @@ -1761,7 +1767,8 @@ bool AudioFlinger::DirectOutputThread::threadLoop() mNumWrites++; mInWrite = false; mStandby = false; } } else { usleep(sleepTime); } // finally let go of removed track, without the lock held Loading Loading @@ -1915,36 +1922,38 @@ bool AudioFlinger::DuplicatingThread::threadLoop() enabledTracks = prepareTracks_l(activeTracks, &tracksToRemove); } bool mustSleep = true; if (LIKELY(enabledTracks)) { // mix buffers... 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++) { outputTracks[i]->write(curBuf, mFrameCount); mustSleep = false; } mStandby = false; mBytesWritten += mixBufferSize; } } 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); if (sleepTime < kMaxBufferRecoveryInUsecs) { sleepTime += kBufferRecoveryInUsecs; } } else { sleepTime = kBufferRecoveryInUsecs; } // finally let go of all our tracks, without the lock held Loading