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

Commit adbffe32 authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "audio: compress offload to pcm fallback on SSR"

parents 68937407 c699f5dc
Loading
Loading
Loading
Loading
+6 −1
Original line number Diff line number Diff line
@@ -896,6 +896,7 @@ status_t AudioTrack::getPosition(uint32_t *position)
    AutoMutex lock(mLock);
    if (isOffloadedOrDirect_l()) {
        uint32_t dspFrames = 0;
        status_t status;

        if (isOffloaded_l() && ((mState == STATE_PAUSED) || (mState == STATE_PAUSED_STOPPING))) {
            ALOGV("getPosition called in paused state, return cached position %u", mPausedPosition);
@@ -905,7 +906,11 @@ status_t AudioTrack::getPosition(uint32_t *position)

        if (mOutput != AUDIO_IO_HANDLE_NONE) {
            uint32_t halFrames;
            AudioSystem::getRenderPosition(mOutput, &halFrames, &dspFrames);
            status = AudioSystem::getRenderPosition(mOutput, &halFrames, &dspFrames);
            if (status != NO_ERROR) {
                ALOGW("failed to getRenderPosition for offload session");
                return INVALID_OPERATION;
            }
        }
        // FIXME: dspFrames may not be zero in (mState == STATE_STOPPED || mState == STATE_FLUSHED)
        // due to hardware latency. We leave this behavior for now.
+20 −11
Original line number Diff line number Diff line
@@ -818,28 +818,37 @@ int64_t AudioPlayer::getRealTimeUsLocked() const {
int64_t AudioPlayer::getOutputPlayPositionUs_l()
{
    uint32_t playedSamples = 0;
    uint32_t sampleRate;
    status_t err = NO_ERROR;
    int64_t renderedDuration = 0;
    uint32_t sampleRate = 0;

    if (mAudioSink != NULL) {
        mAudioSink->getPosition(&playedSamples);
        err = mAudioSink->getPosition(&playedSamples);
        sampleRate = mAudioSink->getSampleRate();
    } else if (mAudioTrack != NULL) {
        mAudioTrack->getPosition(&playedSamples);
        err = mAudioTrack->getPosition(&playedSamples);
        sampleRate = mAudioTrack->getSampleRate();
    }

    if (sampleRate != 0) {
        mSampleRate = sampleRate;
    }
    // Send last known played postion if query to track fails
    if ((err != NO_ERROR) && (mPositionTimeRealUs >= 0)) {
        ALOGV("getOutputPlayPositionUs_l %lld", renderedDuration);
        renderedDuration = mPositionTimeRealUs;
    } else {
        int64_t playedUs = 0;

    int64_t playedUs;
        if (mSampleRate != 0) {
            playedUs = (static_cast<int64_t>(playedSamples) * 1000000 ) / mSampleRate;
    } else {
        playedUs = 0;
        }

        // HAL position is relative to the first buffer we sent at mStartPosUs
    const int64_t renderedDuration = mStartPosUs + playedUs;
    ALOGV("getOutputPlayPositionUs_l %" PRId64, renderedDuration);
        renderedDuration = mStartPosUs + playedUs;
    }

    ALOGV("getOutputPlayPositionUs_l %lld", renderedDuration);

    return renderedDuration;
}

+3 −6
Original line number Diff line number Diff line
@@ -4652,11 +4652,8 @@ void AudioFlinger::OffloadThread::onAddNewTrack_l()
void AudioFlinger::OffloadThread::onFatalError()
{
    Mutex::Autolock _l(mLock);
    size_t size = mTracks.size();
    for (size_t i = 0; i < size; i++) {
        sp<Track> t = mTracks[i];
        t->signalError();
    }

   // call invalidate, to recreate track on fatal error
   invalidateTracks_l(AUDIO_STREAM_MUSIC);
}