Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6a7f8644 authored by Haynes Mathew George's avatar Haynes Mathew George Committed by android-build-merger
Browse files

Merge \"audioflinger: async callback error handling\" into nyc-mr1-dev

am: 93540a6b

Change-Id: Ifa8e386c0da9e30b90884e0a787e581ace151c64
parents ab99bf8a 93540a6b
Loading
Loading
Loading
Loading
+32 −1
Original line number Diff line number Diff line
@@ -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);
@@ -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;
@@ -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...
@@ -5220,7 +5236,8 @@ AudioFlinger::AsyncCallbackThread::AsyncCallbackThread(
    :   Thread(false /*canCallJava*/),
        mPlaybackThread(playbackThread),
        mWriteAckSequence(0),
        mDrainSequence(0)
        mDrainSequence(0),
        mAsyncError(false)
{
}

@@ -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);
            }
@@ -5256,6 +5275,8 @@ bool AudioFlinger::AsyncCallbackThread::threadLoop()
            mWriteAckSequence &= ~1;
            drainSequence = mDrainSequence;
            mDrainSequence &= ~1;
            asyncError = mAsyncError;
            mAsyncError = false;
        }
        {
            sp<AudioFlinger::PlaybackThread> playbackThread = mPlaybackThread.promote();
@@ -5266,6 +5287,9 @@ bool AudioFlinger::AsyncCallbackThread::threadLoop()
                if (drainSequence & 1) {
                    playbackThread->resetDraining(drainSequence >> 1);
                }
                if (asyncError) {
                    playbackThread->onAsyncError();
                }
            }
        }
    }
@@ -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,
+4 −0
Original line number Diff line number Diff line
@@ -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);

@@ -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();
@@ -1044,6 +1046,7 @@ public:
            void        resetWriteBlocked();
            void        setDraining(uint32_t sequence);
            void        resetDraining();
            void        setAsyncError();

private:
    const wp<PlaybackThread>   mPlaybackThread;
@@ -1057,6 +1060,7 @@ private:
    uint32_t                   mDrainSequence;
    Condition                  mWaitWorkCV;
    Mutex                      mLock;
    bool                       mAsyncError;
};

class DuplicatingThread : public MixerThread {