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

Commit 6fc2a7c8 authored by Phil Burk's avatar Phil Burk
Browse files

AudioTrack: fix direct tracks not pausing



When a Direct Track is paused and the HAL does not support
pause() and resume() then the HW never gets paused.
The app can just keep writing data, which gets played.

Bug: 18899620
Change-Id: Ice0f360956ff7ca425f6f24a0a2a8640d8b43fa8
Signed-off-by: default avatarPhil Burk <philburk@google.com>
parent 1de1e25c
Loading
Loading
Loading
Loading
+9 −8
Original line number Diff line number Diff line
@@ -2055,6 +2055,9 @@ void AudioFlinger::PlaybackThread::readOutputParameters_l()
            ALOGW("direct output implements resume but not pause");
        }
    }
    if (!mHwSupportsPause && mOutput->flags & AUDIO_OUTPUT_FLAG_HW_AV_SYNC) {
        LOG_ALWAYS_FATAL("HW_AV_SYNC requested but HAL does not implement pause and resume");
    }

    if (mType == DUPLICATING && mMixerBufferEnabled && mEffectBufferEnabled) {
        // For best precision, we use float instead of the associated output
@@ -4375,9 +4378,9 @@ AudioFlinger::PlaybackThread::mixer_state AudioFlinger::DirectOutputThread::prep
        sp<Track> l = mLatestActiveTrack.promote();
        bool last = l.get() == track;

        if (mHwSupportsPause && track->isPausing()) {
        if (track->isPausing()) {
            track->setPaused();
            if (last && !mHwPaused) {
            if (mHwSupportsPause && last && !mHwPaused) {
                doHwPause = true;
                mHwPaused = true;
            }
@@ -4387,15 +4390,13 @@ AudioFlinger::PlaybackThread::mixer_state AudioFlinger::DirectOutputThread::prep
            if (last) {
                flushPending = true;
            }
        } else if (mHwSupportsPause && track->isResumePending()){
        } else if (track->isResumePending()) {
            track->resumeAck();
            if (last) {
                if (mHwPaused) {
            if (last && mHwPaused) {
                doHwResume = true;
                mHwPaused = false;
            }
        }
        }

        // The first time a track is added we wait
        // for all its buffers to be filled before processing it.
+3 −2
Original line number Diff line number Diff line
@@ -713,8 +713,9 @@ protected:
                                   audio_patch_handle_t *handle);
    virtual     status_t    releaseAudioPatch_l(const audio_patch_handle_t handle);

                bool        usesHwAvSync() const { return (mType == DIRECT) && (mOutput != NULL) &&
                                                (mOutput->flags & AUDIO_OUTPUT_FLAG_HW_AV_SYNC); }
                bool        usesHwAvSync() const { return (mType == DIRECT) && (mOutput != NULL)
                                    && mHwSupportsPause
                                    && (mOutput->flags & AUDIO_OUTPUT_FLAG_HW_AV_SYNC); }

private: