From dfbec4717a42eb5f231799589ddd593af9ab3ec1 Mon Sep 17 00:00:00 2001 From: Alexy Joseph Date: Sun, 15 Nov 2015 23:52:02 -0800 Subject: AudioTrack: Handle timestamp queries for Track Offload Handle timestamp queries for Track offload session cleanly Change-Id: I93759c0e186e4286037837787057960ee52875d7 CRs-Fixed: 933740 --- media/libmedia/AudioTrack.cpp | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) (limited to 'media/libmedia') diff --git a/media/libmedia/AudioTrack.cpp b/media/libmedia/AudioTrack.cpp index 22c66db..3d9847c 100644 --- a/media/libmedia/AudioTrack.cpp +++ b/media/libmedia/AudioTrack.cpp @@ -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; -- cgit v1.1