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

Commit 2fa114de authored by Jean-Michel Trivi's avatar Jean-Michel Trivi
Browse files

bug 7253033 clean up before closing an output

An output can only be closed if there is no lock contention that
 prevents ThreadBase::exit() from being blocked. If an output
 device is waiting for an operation to complete (here a write
 in the remote_submix module, because the pipe is full), signal
 the module that it's entering the "exiting" state.

Change-Id: I8248add60da543e90c25a4c809866cdb26255651
parent 9bb6e65d
Loading
Loading
Loading
Loading
+11 −0
Original line number Diff line number Diff line
@@ -1163,6 +1163,8 @@ AudioFlinger::ThreadBase::~ThreadBase()
void AudioFlinger::ThreadBase::exit()
{
    ALOGV("ThreadBase::exit");
    // do any cleanup required for exit to succeed
    preExit();
    {
        // This lock prevents the following race in thread (uniprocessor for illustration):
        //  if (!exitPending()) {
@@ -1694,6 +1696,15 @@ void AudioFlinger::PlaybackThread::onFirstRef()
    run(mName, ANDROID_PRIORITY_URGENT_AUDIO);
}

// ThreadBase virtuals
void AudioFlinger::PlaybackThread::preExit()
{
    ALOGV("  preExit()");
    // FIXME this is using hard-coded strings but in the future, this functionality will be
    //       converted to use audio HAL extensions required to support tunneling
    mOutput->stream->common.set_parameters(&mOutput->stream->common, "exiting=1");
}

// PlaybackThread::createTrack_l() must be called with AudioFlinger::mLock held
sp<AudioFlinger::PlaybackThread::Track> AudioFlinger::PlaybackThread::createTrack_l(
        const sp<AudioFlinger::Client>& client,
+5 −0
Original line number Diff line number Diff line
@@ -682,6 +682,8 @@ private:
                    // check if some effects must be suspended when an effect chain is added
                    void checkSuspendOnAddEffectChain_l(const sp<EffectChain>& chain);

        virtual     void        preExit() { }

        friend class AudioFlinger;      // for mEffectChains

                    const type_t            mType;
@@ -1050,6 +1052,9 @@ protected:
                    // is safe to do so. That will drop the final ref count and destroy the tracks.
        virtual     mixer_state prepareTracks_l(Vector< sp<Track> > *tracksToRemove) = 0;

        // ThreadBase virtuals
        virtual     void        preExit();

public:

        virtual     status_t    initCheck() const { return (mOutput == NULL) ? NO_INIT : NO_ERROR; }