summaryrefslogtreecommitdiffstats
path: root/media
diff options
context:
space:
mode:
authorAlexy Joseph <alexyj@codeaurora.org>2015-11-15 23:52:02 -0800
committerAlexy Joseph <alexyj@codeaurora.org>2015-11-15 23:52:02 -0800
commitdfbec4717a42eb5f231799589ddd593af9ab3ec1 (patch)
tree35bc9c0d175657029f80d55c1a5d3fecacbff484 /media
parent36a5d0626d308c7dd04a6e0c8aa06a91d2398d3e (diff)
downloadframeworks_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')
-rw-r--r--media/libavextensions/media/AVMediaExtensions.h4
-rw-r--r--media/libmedia/AudioTrack.cpp15
2 files changed, 12 insertions, 7 deletions
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<MediaRecorder> 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;