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

Commit 8ce8e264 authored by Eric Laurent's avatar Eric Laurent
Browse files

Revert "Enable FastTrack timestamps"

This reverts commit b3a486fe.

Reverting while investigating the root cause.

Bug: 27186414
parent bc57b120
Loading
Loading
Loading
Loading
+3 −35
Original line number Diff line number Diff line
@@ -119,11 +119,8 @@ struct AudioTrackSharedStatic {

typedef SingleStateQueue<AudioPlaybackRate> PlaybackRateQueue;


typedef SingleStateQueue<ExtendedTimestamp> ExtendedTimestampQueue;

typedef SingleStateQueue<AudioTimestamp> TimestampQueue;

// ----------------------------------------------------------------------------

// Important: do not add any virtual methods, including ~
@@ -178,9 +175,7 @@ private:
                uint16_t    mPad2;           // unused

                // server write-only, client read
                ExtendedTimestampQueue::Shared mExtendedTimestampQueue; // capture
                TimestampQueue::Shared mTimestampQueue; // playback

                ExtendedTimestampQueue::Shared mExtendedTimestampQueue;
public:

    volatile    int32_t     mFlags;         // combinations of CBLK_*
@@ -338,10 +333,7 @@ public:
            size_t frameSize, bool clientInServer = false)
        : ClientProxy(cblk, buffers, frameCount, frameSize, true /*isOut*/,
          clientInServer),
          mPlaybackRateMutator(&cblk->mPlaybackRateQueue),
          mTimestampObserver(&cblk->mTimestampQueue) {
    }

          mPlaybackRateMutator(&cblk->mPlaybackRateQueue) { }
    virtual ~AudioTrackClientProxy() { }

    // No barriers on the following operations, so the ordering of loads/stores
@@ -365,20 +357,6 @@ public:
        mPlaybackRateMutator.push(playbackRate);
    }

    status_t    getTimestamp(AudioTimestamp *timestamp) {
        if (timestamp == nullptr) {
            return BAD_VALUE;
        }
        (void) mTimestampObserver.poll(mTimestamp);
        // if no data is pushed by server, mTimestamp should be initialized by its constructor
        // to all zero elements.
        if (mTimestamp.mTime.tv_sec == 0 && mTimestamp.mTime.tv_nsec == 0) {
            return WOULD_BLOCK;
        }
        *timestamp = mTimestamp;
        return OK;
    }

    virtual void flush();

    virtual uint32_t    getUnderrunFrames() const {
@@ -396,8 +374,6 @@ public:

private:
    PlaybackRateQueue::Mutator   mPlaybackRateMutator;
    TimestampQueue::Observer mTimestampObserver;
    AudioTimestamp mTimestamp;
};

class StaticAudioTrackClientProxy : public AudioTrackClientProxy {
@@ -546,8 +522,7 @@ public:
            size_t frameSize, bool clientInServer = false, uint32_t sampleRate = 0)
        : ServerProxy(cblk, buffers, frameCount, frameSize, true /*isOut*/, clientInServer),
          mPlaybackRateObserver(&cblk->mPlaybackRateQueue),
          mUnderrunCount(0), mUnderrunning(false),
          mTimestampMutator(&cblk->mTimestampQueue) {
          mUnderrunCount(0), mUnderrunning(false) {
        mCblk->mSampleRate = sampleRate;
        mPlaybackRate = AUDIO_PLAYBACK_RATE_DEFAULT;
    }
@@ -587,11 +562,6 @@ public:
    // Return the playback speed and pitch read atomically. Not multi-thread safe on server side.
    AudioPlaybackRate getPlaybackRate();

    // Expose timestamp to client proxy. Should only be called by a single thread.
                   void setTimestamp(const AudioTimestamp &timestamp) {
                       mTimestampMutator.push(timestamp);
                   }

private:
    AudioPlaybackRate             mPlaybackRate;  // last observed playback rate
    PlaybackRateQueue::Observer   mPlaybackRateObserver;
@@ -599,8 +569,6 @@ private:
    // The server keeps a copy here where it is safe from the client.
    uint32_t                      mUnderrunCount; // echoed to mCblk
    bool                          mUnderrunning;  // used to detect edge of underrun

    TimestampQueue::Mutator       mTimestampMutator;
};

class StaticAudioTrackServerProxy : public AudioTrackServerProxy {
+6 −4
Original line number Diff line number Diff line
@@ -2169,6 +2169,11 @@ status_t AudioTrack::getTimestamp(AudioTimestamp& timestamp)
    // Set false here to cover all the error return cases.
    mPreviousTimestampValid = false;

    // FIXME not implemented for fast tracks; should use proxy and SSQ
    if (mFlags & AUDIO_OUTPUT_FLAG_FAST) {
        return INVALID_OPERATION;
    }

    switch (mState) {
    case STATE_ACTIVE:
    case STATE_PAUSED:
@@ -2198,10 +2203,7 @@ status_t AudioTrack::getTimestamp(AudioTimestamp& timestamp)

    // The presented frame count must always lag behind the consumed frame count.
    // To avoid a race, read the presented frames first.  This ensures that presented <= consumed.

    // FastTrack timestamps are read through shared memory; otherwise use Binder.
    status_t status = (mFlags & AUDIO_OUTPUT_FLAG_FAST) ?
            mProxy->getTimestamp(&timestamp) : mAudioTrack->getTimestamp(timestamp);
    status_t status = mAudioTrack->getTimestamp(timestamp);
    if (status != NO_ERROR) {
        ALOGV_IF(status != WOULD_BLOCK, "getTimestamp error:%#x", status);
        return status;
+0 −1
Original line number Diff line number Diff line
@@ -89,7 +89,6 @@ protected:
    // ExtendedAudioBufferProvider interface
    virtual size_t framesReady() const;
    virtual size_t framesReleased() const;
    virtual void onTimestamp(const AudioTimestamp &timestamp);

    bool isPausing() const { return mState == PAUSING; }
    bool isPaused() const { return mState == PAUSED; }
+1 −6
Original line number Diff line number Diff line
@@ -596,11 +596,6 @@ size_t AudioFlinger::PlaybackThread::Track::framesReleased() const
    return mAudioTrackServerProxy->framesReleased();
}

void AudioFlinger::PlaybackThread::Track::onTimestamp(const AudioTimestamp &timestamp)
{
    mAudioTrackServerProxy->setTimestamp(timestamp);
}

// Don't call for fast tracks; the framesReady() could result in priority inversion
bool AudioFlinger::PlaybackThread::Track::isReady() const {
    if (mFillingUpStatus != FS_FILLING || isStopped() || isPausing()) {
@@ -863,7 +858,7 @@ status_t AudioFlinger::PlaybackThread::Track::setParameters(const String8& keyVa

status_t AudioFlinger::PlaybackThread::Track::getTimestamp(AudioTimestamp& timestamp)
{
    // FastTrack timestamps are read through SSQ
    // Client should implement this using SSQ; the unpresented frame count in latch is irrelevant
    if (isFastTrack()) {
        return INVALID_OPERATION;
    }