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

Commit 6edd8ca5 authored by Eric Laurent's avatar Eric Laurent Committed by Android Git Automerger
Browse files

am 6a51d7ed: audioflinger: fix track terminated before playing

* commit '6a51d7ed':
  audioflinger: fix track terminated before playing
parents e45796de 6a51d7ed
Loading
Loading
Loading
Loading
+8 −11
Original line number Diff line number Diff line
@@ -3884,15 +3884,11 @@ AudioFlinger::OffloadThread::OffloadThread(const sp<AudioFlinger>& audioFlinger,
    :   DirectOutputThread(audioFlinger, output, id, device, OFFLOAD),
        mHwPaused(false),
        mFlushPending(false),
        mPausedBytesRemaining(0)
        mPausedBytesRemaining(0),
        mPreviousTrack(NULL)
{
}

AudioFlinger::OffloadThread::~OffloadThread()
{
    mPreviousTrack.clear();
}

void AudioFlinger::OffloadThread::threadLoop_exit()
{
    if (mFlushPending || mHwPaused) {
@@ -3928,7 +3924,7 @@ AudioFlinger::PlaybackThread::mixer_state AudioFlinger::OffloadThread::prepareTr
        Track* const track = t.get();
        audio_track_cblk_t* cblk = track->cblk();
        if (mPreviousTrack != NULL) {
            if (t != mPreviousTrack) {
            if (t.get() != mPreviousTrack) {
                // Flush any data still being written from last track
                mBytesRemaining = 0;
                if (mPausedBytesRemaining) {
@@ -3943,7 +3939,7 @@ AudioFlinger::PlaybackThread::mixer_state AudioFlinger::OffloadThread::prepareTr
                }
            }
        }
        mPreviousTrack = t;
        mPreviousTrack = t.get();
        bool last = (i == (count - 1));
        if (track->isPausing()) {
            track->setPaused();
@@ -4008,7 +4004,8 @@ AudioFlinger::PlaybackThread::mixer_state AudioFlinger::OffloadThread::prepareTr
                    // has been written
                    ALOGV("OffloadThread: underrun and STOPPING_1 -> draining, STOPPING_2");
                    track->mState = TrackBase::STOPPING_2; // so presentation completes after drain
                    if (last) {
                    // do not drain if no data was ever sent to HAL (mStandby == true)
                    if (last && !mStandby) {
                        sleepTime = 0;
                        standbyTime = systemTime() + standbyDelay;
                        mixerStatus = MIXER_DRAIN_TRACK;
@@ -4022,8 +4019,8 @@ AudioFlinger::PlaybackThread::mixer_state AudioFlinger::OffloadThread::prepareTr
                    }
                }
            } else if (track->isStopping_2()) {
                // Drain has completed, signal presentation complete
                if (!(mDrainSequence & 1) || !last) {
                // Drain has completed or we are in standby, signal presentation complete
                if (!(mDrainSequence & 1) || !last || mStandby) {
                    track->mState = TrackBase::STOPPED;
                    size_t audioHALFrames =
                            (mOutput->stream->get_latency(mOutput->stream)*mSampleRate) / 1000;
+2 −2
Original line number Diff line number Diff line
@@ -735,7 +735,7 @@ public:

    OffloadThread(const sp<AudioFlinger>& audioFlinger, AudioStreamOut* output,
                        audio_io_handle_t id, uint32_t device);
    virtual                 ~OffloadThread();
    virtual                 ~OffloadThread() {};

protected:
    // threadLoop snippets
@@ -755,7 +755,7 @@ private:
    bool        mFlushPending;
    size_t      mPausedWriteLength;     // length in bytes of write interrupted by pause
    size_t      mPausedBytesRemaining;  // bytes still waiting in mixbuffer after resume
    sp<Track>   mPreviousTrack;         // used to detect track switch
    Track       *mPreviousTrack;         // used to detect track switch
};

class AsyncCallbackThread : public Thread {