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 --- include/media/AudioTrack.h | 1 + media/libavextensions/media/AVMediaExtensions.h | 4 ++++ media/libmedia/AudioTrack.cpp | 15 ++++++++------- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/include/media/AudioTrack.h b/include/media/AudioTrack.h index 42fa3be..191802d 100644 --- a/include/media/AudioTrack.h +++ b/include/media/AudioTrack.h @@ -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 { diff --git a/media/libavextensions/media/AVMediaExtensions.h b/media/libavextensions/media/AVMediaExtensions.h index ae26143..9161fae 100644 --- a/media/libavextensions/media/AVMediaExtensions.h +++ b/media/libavextensions/media/AVMediaExtensions.h @@ -60,6 +60,10 @@ struct AVMediaUtils { return frameCount; } + virtual bool AudioTrackIsTrackOffloaded(audio_io_handle_t /*output*/) { + return false; + } + virtual sp createMediaRecorder(const String16& opPackageName); virtual void writeCustomData( Parcel * /* reply */, void * /* buffer_data */) {} 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