summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/media/AudioTrack.h1
-rw-r--r--media/libavextensions/media/AVMediaExtensions.h4
-rw-r--r--media/libmedia/AudioTrack.cpp15
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<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;