diff options
-rw-r--r-- | services/audioflinger/AudioFlinger.cpp | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/services/audioflinger/AudioFlinger.cpp b/services/audioflinger/AudioFlinger.cpp index 94efa74..a58f64c 100644 --- a/services/audioflinger/AudioFlinger.cpp +++ b/services/audioflinger/AudioFlinger.cpp @@ -87,6 +87,8 @@ static const nsecs_t kWarningThrottle = seconds(5); // RecordThread loop sleep time upon application overrun or audio HAL read error static const int kRecordThreadSleepUs = 5000; +static const nsecs_t kSetParametersTimeout = seconds(2); + // ---------------------------------------------------------------------------- static bool recordingAllowed() { @@ -1032,7 +1034,7 @@ status_t AudioFlinger::ThreadBase::setParameters(const String8& keyValuePairs) mWaitWorkCV.signal(); // wait condition with timeout in case the thread loop has exited // before the request could be processed - if (mParamCond.waitRelative(mLock, seconds(2)) == NO_ERROR) { + if (mParamCond.waitRelative(mLock, kSetParametersTimeout) == NO_ERROR) { status = mParamStatus; mWaitWorkCV.signal(); } else { @@ -2349,7 +2351,9 @@ bool AudioFlinger::MixerThread::checkForNewParameters_l() mParamStatus = status; mParamCond.signal(); - mWaitWorkCV.wait(mLock); + // wait for condition with time out in case the thread calling ThreadBase::setParameters() + // already timed out waiting for the status and will never signal the condition. + mWaitWorkCV.waitRelative(mLock, kSetParametersTimeout); } return reconfig; } @@ -2828,7 +2832,9 @@ bool AudioFlinger::DirectOutputThread::checkForNewParameters_l() mParamStatus = status; mParamCond.signal(); - mWaitWorkCV.wait(mLock); + // wait for condition with time out in case the thread calling ThreadBase::setParameters() + // already timed out waiting for the status and will never signal the condition. + mWaitWorkCV.waitRelative(mLock, kSetParametersTimeout); } return reconfig; } @@ -4669,7 +4675,9 @@ bool AudioFlinger::RecordThread::checkForNewParameters_l() mParamStatus = status; mParamCond.signal(); - mWaitWorkCV.wait(mLock); + // wait for condition with time out in case the thread calling ThreadBase::setParameters() + // already timed out waiting for the status and will never signal the condition. + mWaitWorkCV.waitRelative(mLock, kSetParametersTimeout); } return reconfig; } |