Loading services/audioflinger/Threads.cpp +32 −1 Original line number Diff line number Diff line Loading @@ -2299,6 +2299,12 @@ void AudioFlinger::PlaybackThread::drainCallback() mCallbackThread->resetDraining(); } void AudioFlinger::PlaybackThread::errorCallback() { ALOG_ASSERT(mCallbackThread != 0); mCallbackThread->setAsyncError(); } void AudioFlinger::PlaybackThread::resetWriteBlocked(uint32_t sequence) { Mutex::Autolock _l(mLock); Loading Loading @@ -2333,6 +2339,9 @@ int AudioFlinger::PlaybackThread::asyncCallback(stream_callback_event_t event, case STREAM_CBK_EVENT_DRAIN_READY: me->drainCallback(); break; case STREAM_CBK_EVENT_ERROR: me->errorCallback(); break; default: ALOGW("asyncCallback() unknown event %d", event); break; Loading Loading @@ -3904,6 +3913,13 @@ void AudioFlinger::PlaybackThread::onAddNewTrack_l() broadcast_l(); } void AudioFlinger::PlaybackThread::onAsyncError() { for (int i = AUDIO_STREAM_SYSTEM; i < (int)AUDIO_STREAM_CNT; i++) { invalidateTracks((audio_stream_type_t)i); } } void AudioFlinger::MixerThread::threadLoop_mix() { // mix buffers... Loading Loading @@ -5220,7 +5236,8 @@ AudioFlinger::AsyncCallbackThread::AsyncCallbackThread( : Thread(false /*canCallJava*/), mPlaybackThread(playbackThread), mWriteAckSequence(0), mDrainSequence(0) mDrainSequence(0), mAsyncError(false) { } Loading @@ -5238,11 +5255,13 @@ bool AudioFlinger::AsyncCallbackThread::threadLoop() while (!exitPending()) { uint32_t writeAckSequence; uint32_t drainSequence; bool asyncError; { Mutex::Autolock _l(mLock); while (!((mWriteAckSequence & 1) || (mDrainSequence & 1) || mAsyncError || exitPending())) { mWaitWorkCV.wait(mLock); } Loading @@ -5256,6 +5275,8 @@ bool AudioFlinger::AsyncCallbackThread::threadLoop() mWriteAckSequence &= ~1; drainSequence = mDrainSequence; mDrainSequence &= ~1; asyncError = mAsyncError; mAsyncError = false; } { sp<AudioFlinger::PlaybackThread> playbackThread = mPlaybackThread.promote(); Loading @@ -5266,6 +5287,9 @@ bool AudioFlinger::AsyncCallbackThread::threadLoop() if (drainSequence & 1) { playbackThread->resetDraining(drainSequence >> 1); } if (asyncError) { playbackThread->onAsyncError(); } } } } Loading Loading @@ -5314,6 +5338,13 @@ void AudioFlinger::AsyncCallbackThread::resetDraining() } } void AudioFlinger::AsyncCallbackThread::setAsyncError() { Mutex::Autolock _l(mLock); mAsyncError = true; mWaitWorkCV.signal(); } // ---------------------------------------------------------------------------- AudioFlinger::OffloadThread::OffloadThread(const sp<AudioFlinger>& audioFlinger, Loading services/audioflinger/Threads.h +4 −0 Original line number Diff line number Diff line Loading @@ -543,6 +543,7 @@ protected: void resetWriteBlocked(uint32_t sequence); void drainCallback(); void resetDraining(uint32_t sequence); void errorCallback(); static int asyncCallback(stream_callback_event_t event, void *param, void *cookie); Loading @@ -550,6 +551,7 @@ protected: virtual bool waitingAsyncCallback_l(); virtual bool shouldStandby_l(); virtual void onAddNewTrack_l(); void onAsyncError(); // error reported by AsyncCallbackThread // ThreadBase virtuals virtual void preExit(); Loading Loading @@ -1044,6 +1046,7 @@ public: void resetWriteBlocked(); void setDraining(uint32_t sequence); void resetDraining(); void setAsyncError(); private: const wp<PlaybackThread> mPlaybackThread; Loading @@ -1057,6 +1060,7 @@ private: uint32_t mDrainSequence; Condition mWaitWorkCV; Mutex mLock; bool mAsyncError; }; class DuplicatingThread : public MixerThread { Loading Loading
services/audioflinger/Threads.cpp +32 −1 Original line number Diff line number Diff line Loading @@ -2299,6 +2299,12 @@ void AudioFlinger::PlaybackThread::drainCallback() mCallbackThread->resetDraining(); } void AudioFlinger::PlaybackThread::errorCallback() { ALOG_ASSERT(mCallbackThread != 0); mCallbackThread->setAsyncError(); } void AudioFlinger::PlaybackThread::resetWriteBlocked(uint32_t sequence) { Mutex::Autolock _l(mLock); Loading Loading @@ -2333,6 +2339,9 @@ int AudioFlinger::PlaybackThread::asyncCallback(stream_callback_event_t event, case STREAM_CBK_EVENT_DRAIN_READY: me->drainCallback(); break; case STREAM_CBK_EVENT_ERROR: me->errorCallback(); break; default: ALOGW("asyncCallback() unknown event %d", event); break; Loading Loading @@ -3904,6 +3913,13 @@ void AudioFlinger::PlaybackThread::onAddNewTrack_l() broadcast_l(); } void AudioFlinger::PlaybackThread::onAsyncError() { for (int i = AUDIO_STREAM_SYSTEM; i < (int)AUDIO_STREAM_CNT; i++) { invalidateTracks((audio_stream_type_t)i); } } void AudioFlinger::MixerThread::threadLoop_mix() { // mix buffers... Loading Loading @@ -5220,7 +5236,8 @@ AudioFlinger::AsyncCallbackThread::AsyncCallbackThread( : Thread(false /*canCallJava*/), mPlaybackThread(playbackThread), mWriteAckSequence(0), mDrainSequence(0) mDrainSequence(0), mAsyncError(false) { } Loading @@ -5238,11 +5255,13 @@ bool AudioFlinger::AsyncCallbackThread::threadLoop() while (!exitPending()) { uint32_t writeAckSequence; uint32_t drainSequence; bool asyncError; { Mutex::Autolock _l(mLock); while (!((mWriteAckSequence & 1) || (mDrainSequence & 1) || mAsyncError || exitPending())) { mWaitWorkCV.wait(mLock); } Loading @@ -5256,6 +5275,8 @@ bool AudioFlinger::AsyncCallbackThread::threadLoop() mWriteAckSequence &= ~1; drainSequence = mDrainSequence; mDrainSequence &= ~1; asyncError = mAsyncError; mAsyncError = false; } { sp<AudioFlinger::PlaybackThread> playbackThread = mPlaybackThread.promote(); Loading @@ -5266,6 +5287,9 @@ bool AudioFlinger::AsyncCallbackThread::threadLoop() if (drainSequence & 1) { playbackThread->resetDraining(drainSequence >> 1); } if (asyncError) { playbackThread->onAsyncError(); } } } } Loading Loading @@ -5314,6 +5338,13 @@ void AudioFlinger::AsyncCallbackThread::resetDraining() } } void AudioFlinger::AsyncCallbackThread::setAsyncError() { Mutex::Autolock _l(mLock); mAsyncError = true; mWaitWorkCV.signal(); } // ---------------------------------------------------------------------------- AudioFlinger::OffloadThread::OffloadThread(const sp<AudioFlinger>& audioFlinger, Loading
services/audioflinger/Threads.h +4 −0 Original line number Diff line number Diff line Loading @@ -543,6 +543,7 @@ protected: void resetWriteBlocked(uint32_t sequence); void drainCallback(); void resetDraining(uint32_t sequence); void errorCallback(); static int asyncCallback(stream_callback_event_t event, void *param, void *cookie); Loading @@ -550,6 +551,7 @@ protected: virtual bool waitingAsyncCallback_l(); virtual bool shouldStandby_l(); virtual void onAddNewTrack_l(); void onAsyncError(); // error reported by AsyncCallbackThread // ThreadBase virtuals virtual void preExit(); Loading Loading @@ -1044,6 +1046,7 @@ public: void resetWriteBlocked(); void setDraining(uint32_t sequence); void resetDraining(); void setAsyncError(); private: const wp<PlaybackThread> mPlaybackThread; Loading @@ -1057,6 +1060,7 @@ private: uint32_t mDrainSequence; Condition mWaitWorkCV; Mutex mLock; bool mAsyncError; }; class DuplicatingThread : public MixerThread { Loading