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

Commit dfbec471 authored by Alexy Joseph's avatar Alexy Joseph
Browse files

AudioTrack: Handle timestamp queries for Track Offload

Handle timestamp queries for Track offload session
cleanly

Change-Id: I93759c0e186e4286037837787057960ee52875d7
CRs-Fixed: 933740
parent 36a5d062
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -943,6 +943,7 @@ protected:
    //  a value of AUDIO_PORT_HANDLE_NONE indicated default (AudioPolicyManager) routing.
    audio_port_handle_t     mSelectedDeviceId;
    bool                    mPlaybackRateSet;
    bool                    mTrackOffloaded;

private:
    class DeathNotifier : public IBinder::DeathRecipient {
+4 −0
Original line number Diff line number Diff line
@@ -60,6 +60,10 @@ struct AVMediaUtils {
        return frameCount;
    }

    virtual bool AudioTrackIsTrackOffloaded(audio_io_handle_t /*output*/) {
        return false;
    }

    virtual sp<MediaRecorder> createMediaRecorder(const String16& opPackageName);
    virtual void writeCustomData(
            Parcel * /* reply */, void * /* buffer_data */) {}
+8 −7
Original line number Diff line number Diff line
@@ -849,10 +849,9 @@ status_t AudioTrack::setPlaybackRate(const AudioPlaybackRate &playbackRate)
    mProxy->setPlaybackRate(playbackRateTemp);
    mProxy->setSampleRate(effectiveRate); // FIXME: not quite "atomic" with setPlaybackRate

    // fallback out of Direct PCM if setPlaybackRate is called on PCM track
    if (property_get_bool("audio.offload.track.enable", false) &&
        (mFormat == AUDIO_FORMAT_PCM_16_BIT) && (mOffloadInfo == NULL) &&
        (mFlags == AUDIO_OUTPUT_FLAG_NONE)) {
    // fallback out of Direct PCM if setPlaybackRate is called on a track offloaded
    // session. Do this by setting mPlaybackRateSet to true
    if (mTrackOffloaded) {
        mPlaybackRateSet = true;
        android_atomic_or(CBLK_INVALID, &mCblk->mFlags);
    }
@@ -1165,6 +1164,7 @@ status_t AudioTrack::createTrack_l()
              mSessionId, streamType, mAttributes.usage, mSampleRate, mFormat, mChannelMask, mFlags);
        return BAD_VALUE;
    }
    mTrackOffloaded = AVMediaUtils::get()->AudioTrackIsTrackOffloaded(output);
    {
    // Now that we have a reference to an I/O handle and have not yet handed it off to AudioFlinger,
    // we must release it ourselves if anything goes wrong.
@@ -2264,8 +2264,8 @@ status_t AudioTrack::getTimestamp(AudioTimestamp& timestamp)
    }

    status_t status = UNKNOWN_ERROR;
    //do not call Timestamp if its PCM offloaded
    if (!AVMediaUtils::get()->AudioTrackIsPcmOffloaded(mFormat)) {
    //call Timestamp only if its NOT PCM offloaded and NOT Track Offloaded
    if (!AVMediaUtils::get()->AudioTrackIsPcmOffloaded(mFormat) && !mTrackOffloaded) {
        // 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.

@@ -2277,7 +2277,8 @@ status_t AudioTrack::getTimestamp(AudioTimestamp& timestamp)

    }

    if (isOffloadedOrDirect_l() && !AVMediaUtils::get()->AudioTrackIsPcmOffloaded(mFormat)) {
    if (isOffloadedOrDirect_l() && !AVMediaUtils::get()->AudioTrackIsPcmOffloaded(mFormat)
        && !mTrackOffloaded) {
        if (isOffloaded_l() && (mState == STATE_PAUSED || mState == STATE_PAUSED_STOPPING)) {
            // use cached paused position in case another offloaded track is running.
            timestamp.mPosition = mPausedPosition;