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

Commit d25c4552 authored by Eric Laurent's avatar Eric Laurent Committed by Android (Google) Code Review
Browse files

Merge "Revert "Enable FastTrack timestamps"" into nyc-dev

parents b74e696c 8ce8e264
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;
    }