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

Commit c43ea147 authored by Kevin Rocard's avatar Kevin Rocard
Browse files

Propagate track status to interception patch track



Test: adb shell audiorecorder --target /data/file.raw
Bug: 111453086
Change-Id: Icbf627ce36b6d9390439f51237ef9515a2eba8cb
Signed-off-by: default avatarKevin Rocard <krocard@google.com>
parent 153f92d5
Loading
Loading
Loading
Loading
+0 −2
Original line number Diff line number Diff line
@@ -838,8 +838,6 @@ sp<IAudioTrack> AudioFlinger::createTrack(const CreateTrackInput& input,
                secondaryThread->addPatchTrack(patchTrack);
                patchTrack->setPeerProxy(patchRecord.get());
                patchRecord->setPeerProxy(patchTrack.get());

                patchTrack->start(); // patchRecord is NOT started as it has no thread
            }
            track->setTeePatches(std::move(teePatches));
        }
+4 −0
Original line number Diff line number Diff line
@@ -222,6 +222,10 @@ protected:

private:
    void                interceptBuffer(const AudioBufferProvider::Buffer& buffer);
    template <class F>
    void                forEachTeePatchTrack(F f) {
        for (auto& tp : mTeePatches) { f(tp.patchTrack); }
    };

    // The following fields are only for fast tracks, and should be in a subclass
    int                 mFastIndex; // index within FastMixerState::mFastTracks[];
+10 −0
Original line number Diff line number Diff line
@@ -525,6 +525,7 @@ void AudioFlinger::PlaybackThread::Track::destroy()
            AudioSystem::releaseOutput(mPortId);
        }
    }
    forEachTeePatchTrack([](auto patchTrack) { patchTrack->destroy(); });
}

void AudioFlinger::PlaybackThread::Track::appendDumpHeader(String8& result)
@@ -865,6 +866,9 @@ status_t AudioFlinger::PlaybackThread::Track::start(AudioSystem::sync_event_t ev
    } else {
        status = BAD_VALUE;
    }
    if (status == NO_ERROR) {
        forEachTeePatchTrack([](auto patchTrack) { patchTrack->start(); });
    }
    return status;
}

@@ -898,6 +902,7 @@ void AudioFlinger::PlaybackThread::Track::stop()
                    __func__, mId, (int)mThreadIoHandle);
        }
    }
    forEachTeePatchTrack([](auto patchTrack) { patchTrack->stop(); });
}

void AudioFlinger::PlaybackThread::Track::pause()
@@ -930,6 +935,8 @@ void AudioFlinger::PlaybackThread::Track::pause()
            break;
        }
    }
    // Pausing the TeePatch to avoid a glitch on underrun, at the cost of buffered audio loss.
    forEachTeePatchTrack([](auto patchTrack) { patchTrack->pause(); });
}

void AudioFlinger::PlaybackThread::Track::flush()
@@ -991,6 +998,8 @@ void AudioFlinger::PlaybackThread::Track::flush()
        // because the hardware buffer could hold a large amount of audio
        playbackThread->broadcast_l();
    }
    // Flush the Tee to avoid on resume playing old data and glitching on the transition to new data
    forEachTeePatchTrack([](auto patchTrack) { patchTrack->flush(); });
}

// must be called with thread lock held
@@ -1110,6 +1119,7 @@ void AudioFlinger::PlaybackThread::Track::copyMetadataTo(MetadataInserter& backI
}

void AudioFlinger::PlaybackThread::Track::setTeePatches(TeePatches teePatches) {
    forEachTeePatchTrack([](auto patchTrack) { patchTrack->destroy(); });
    mTeePatches = std::move(teePatches);
}