diff options
author | Alexy Joseph <alexyj@codeaurora.org> | 2015-11-15 23:52:02 -0800 |
---|---|---|
committer | Alexy Joseph <alexyj@codeaurora.org> | 2015-11-15 23:52:02 -0800 |
commit | dfbec4717a42eb5f231799589ddd593af9ab3ec1 (patch) | |
tree | 35bc9c0d175657029f80d55c1a5d3fecacbff484 /media/libmedia/AudioTrack.cpp | |
parent | 36a5d0626d308c7dd04a6e0c8aa06a91d2398d3e (diff) | |
download | frameworks_av-dfbec4717a42eb5f231799589ddd593af9ab3ec1.zip frameworks_av-dfbec4717a42eb5f231799589ddd593af9ab3ec1.tar.gz frameworks_av-dfbec4717a42eb5f231799589ddd593af9ab3ec1.tar.bz2 |
AudioTrack: Handle timestamp queries for Track Offload
Handle timestamp queries for Track offload session
cleanly
Change-Id: I93759c0e186e4286037837787057960ee52875d7
CRs-Fixed: 933740
Diffstat (limited to 'media/libmedia/AudioTrack.cpp')
-rw-r--r-- | media/libmedia/AudioTrack.cpp | 15 |
1 files changed, 8 insertions, 7 deletions
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; |