Loading media/libmedia/AudioTrack.cpp +6 −1 Original line number Diff line number Diff line Loading @@ -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); Loading @@ -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. Loading media/libstagefright/AudioPlayer.cpp +20 −11 Original line number Diff line number Diff line Loading @@ -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; } Loading services/audioflinger/Threads.cpp +3 −6 Original line number Diff line number Diff line Loading @@ -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); } Loading Loading
media/libmedia/AudioTrack.cpp +6 −1 Original line number Diff line number Diff line Loading @@ -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); Loading @@ -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. Loading
media/libstagefright/AudioPlayer.cpp +20 −11 Original line number Diff line number Diff line Loading @@ -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; } Loading
services/audioflinger/Threads.cpp +3 −6 Original line number Diff line number Diff line Loading @@ -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); } Loading