Home | History | Annotate | Download | only in libaudioclient
      1 /*
      2 **
      3 ** Copyright 2007, The Android Open Source Project
      4 **
      5 ** Licensed under the Apache License, Version 2.0 (the "License");
      6 ** you may not use this file except in compliance with the License.
      7 ** You may obtain a copy of the License at
      8 **
      9 **     http://www.apache.org/licenses/LICENSE-2.0
     10 **
     11 ** Unless required by applicable law or agreed to in writing, software
     12 ** distributed under the License is distributed on an "AS IS" BASIS,
     13 ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14 ** See the License for the specific language governing permissions and
     15 ** limitations under the License.
     16 */
     17 
     18 //#define LOG_NDEBUG 0
     19 #define LOG_TAG "AudioTrack"
     20 
     21 #include <inttypes.h>
     22 #include <math.h>
     23 #include <sys/resource.h>
     24 
     25 #include <audio_utils/primitives.h>
     26 #include <binder/IPCThreadState.h>
     27 #include <media/AudioTrack.h>
     28 #include <utils/Log.h>
     29 #include <private/media/AudioTrackShared.h>
     30 #include <media/IAudioFlinger.h>
     31 #include <media/AudioPolicyHelper.h>
     32 #include <media/AudioResamplerPublic.h>
     33 
     34 #define WAIT_PERIOD_MS                  10
     35 #define WAIT_STREAM_END_TIMEOUT_SEC     120
     36 static const int kMaxLoopCountNotifications = 32;
     37 
     38 namespace android {
     39 // ---------------------------------------------------------------------------
     40 
     41 // TODO: Move to a separate .h
     42 
     43 template <typename T>
     44 static inline const T &min(const T &x, const T &y) {
     45     return x < y ? x : y;
     46 }
     47 
     48 template <typename T>
     49 static inline const T &max(const T &x, const T &y) {
     50     return x > y ? x : y;
     51 }
     52 
     53 static const int32_t NANOS_PER_SECOND = 1000000000;
     54 
     55 static inline nsecs_t framesToNanoseconds(ssize_t frames, uint32_t sampleRate, float speed)
     56 {
     57     return ((double)frames * 1000000000) / ((double)sampleRate * speed);
     58 }
     59 
     60 static int64_t convertTimespecToUs(const struct timespec &tv)
     61 {
     62     return tv.tv_sec * 1000000ll + tv.tv_nsec / 1000;
     63 }
     64 
     65 static inline nsecs_t convertTimespecToNs(const struct timespec &tv)
     66 {
     67     return tv.tv_sec * (long long)NANOS_PER_SECOND + tv.tv_nsec;
     68 }
     69 
     70 // current monotonic time in microseconds.
     71 static int64_t getNowUs()
     72 {
     73     struct timespec tv;
     74     (void) clock_gettime(CLOCK_MONOTONIC, &tv);
     75     return convertTimespecToUs(tv);
     76 }
     77 
     78 // FIXME: we don't use the pitch setting in the time stretcher (not working);
     79 // instead we emulate it using our sample rate converter.
     80 static const bool kFixPitch = true; // enable pitch fix
     81 static inline uint32_t adjustSampleRate(uint32_t sampleRate, float pitch)
     82 {
     83     return kFixPitch ? (sampleRate * pitch + 0.5) : sampleRate;
     84 }
     85 
     86 static inline float adjustSpeed(float speed, float pitch)
     87 {
     88     return kFixPitch ? speed / max(pitch, AUDIO_TIMESTRETCH_PITCH_MIN_DELTA) : speed;
     89 }
     90 
     91 static inline float adjustPitch(float pitch)
     92 {
     93     return kFixPitch ? AUDIO_TIMESTRETCH_PITCH_NORMAL : pitch;
     94 }
     95 
     96 // Must match similar computation in createTrack_l in Threads.cpp.
     97 // TODO: Move to a common library
     98 static size_t calculateMinFrameCount(
     99         uint32_t afLatencyMs, uint32_t afFrameCount, uint32_t afSampleRate,
    100         uint32_t sampleRate, float speed /*, uint32_t notificationsPerBufferReq*/)
    101 {
    102     // Ensure that buffer depth covers at least audio hardware latency
    103     uint32_t minBufCount = afLatencyMs / ((1000 * afFrameCount) / afSampleRate);
    104     if (minBufCount < 2) {
    105         minBufCount = 2;
    106     }
    107 #if 0
    108     // The notificationsPerBufferReq parameter is not yet used for non-fast tracks,
    109     // but keeping the code here to make it easier to add later.
    110     if (minBufCount < notificationsPerBufferReq) {
    111         minBufCount = notificationsPerBufferReq;
    112     }
    113 #endif
    114     ALOGV("calculateMinFrameCount afLatency %u  afFrameCount %u  afSampleRate %u  "
    115             "sampleRate %u  speed %f  minBufCount: %u" /*"  notificationsPerBufferReq %u"*/,
    116             afLatencyMs, afFrameCount, afSampleRate, sampleRate, speed, minBufCount
    117             /*, notificationsPerBufferReq*/);
    118     return minBufCount * sourceFramesNeededWithTimestretch(
    119             sampleRate, afFrameCount, afSampleRate, speed);
    120 }
    121 
    122 // static
    123 status_t AudioTrack::getMinFrameCount(
    124         size_t* frameCount,
    125         audio_stream_type_t streamType,
    126         uint32_t sampleRate)
    127 {
    128     if (frameCount == NULL) {
    129         return BAD_VALUE;
    130     }
    131 
    132     // FIXME handle in server, like createTrack_l(), possible missing info:
    133     //          audio_io_handle_t output
    134     //          audio_format_t format
    135     //          audio_channel_mask_t channelMask
    136     //          audio_output_flags_t flags (FAST)
    137     uint32_t afSampleRate;
    138     status_t status;
    139     status = AudioSystem::getOutputSamplingRate(&afSampleRate, streamType);
    140     if (status != NO_ERROR) {
    141         ALOGE("Unable to query output sample rate for stream type %d; status %d",
    142                 streamType, status);
    143         return status;
    144     }
    145     size_t afFrameCount;
    146     status = AudioSystem::getOutputFrameCount(&afFrameCount, streamType);
    147     if (status != NO_ERROR) {
    148         ALOGE("Unable to query output frame count for stream type %d; status %d",
    149                 streamType, status);
    150         return status;
    151     }
    152     uint32_t afLatency;
    153     status = AudioSystem::getOutputLatency(&afLatency, streamType);
    154     if (status != NO_ERROR) {
    155         ALOGE("Unable to query output latency for stream type %d; status %d",
    156                 streamType, status);
    157         return status;
    158     }
    159 
    160     // When called from createTrack, speed is 1.0f (normal speed).
    161     // This is rechecked again on setting playback rate (TODO: on setting sample rate, too).
    162     *frameCount = calculateMinFrameCount(afLatency, afFrameCount, afSampleRate, sampleRate, 1.0f
    163             /*, 0 notificationsPerBufferReq*/);
    164 
    165     // The formula above should always produce a non-zero value under normal circumstances:
    166     // AudioTrack.SAMPLE_RATE_HZ_MIN <= sampleRate <= AudioTrack.SAMPLE_RATE_HZ_MAX.
    167     // Return error in the unlikely event that it does not, as that's part of the API contract.
    168     if (*frameCount == 0) {
    169         ALOGE("AudioTrack::getMinFrameCount failed for streamType %d, sampleRate %u",
    170                 streamType, sampleRate);
    171         return BAD_VALUE;
    172     }
    173     ALOGV("getMinFrameCount=%zu: afFrameCount=%zu, afSampleRate=%u, afLatency=%u",
    174             *frameCount, afFrameCount, afSampleRate, afLatency);
    175     return NO_ERROR;
    176 }
    177 
    178 // ---------------------------------------------------------------------------
    179 
    180 AudioTrack::AudioTrack()
    181     : mStatus(NO_INIT),
    182       mState(STATE_STOPPED),
    183       mPreviousPriority(ANDROID_PRIORITY_NORMAL),
    184       mPreviousSchedulingGroup(SP_DEFAULT),
    185       mPausedPosition(0),
    186       mSelectedDeviceId(AUDIO_PORT_HANDLE_NONE),
    187       mPortId(AUDIO_PORT_HANDLE_NONE)
    188 {
    189     mAttributes.content_type = AUDIO_CONTENT_TYPE_UNKNOWN;
    190     mAttributes.usage = AUDIO_USAGE_UNKNOWN;
    191     mAttributes.flags = 0x0;
    192     strcpy(mAttributes.tags, "");
    193 }
    194 
    195 AudioTrack::AudioTrack(
    196         audio_stream_type_t streamType,
    197         uint32_t sampleRate,
    198         audio_format_t format,
    199         audio_channel_mask_t channelMask,
    200         size_t frameCount,
    201         audio_output_flags_t flags,
    202         callback_t cbf,
    203         void* user,
    204         int32_t notificationFrames,
    205         audio_session_t sessionId,
    206         transfer_type transferType,
    207         const audio_offload_info_t *offloadInfo,
    208         uid_t uid,
    209         pid_t pid,
    210         const audio_attributes_t* pAttributes,
    211         bool doNotReconnect,
    212         float maxRequiredSpeed)
    213     : mStatus(NO_INIT),
    214       mState(STATE_STOPPED),
    215       mPreviousPriority(ANDROID_PRIORITY_NORMAL),
    216       mPreviousSchedulingGroup(SP_DEFAULT),
    217       mPausedPosition(0),
    218       mSelectedDeviceId(AUDIO_PORT_HANDLE_NONE),
    219       mPortId(AUDIO_PORT_HANDLE_NONE)
    220 {
    221     mStatus = set(streamType, sampleRate, format, channelMask,
    222             frameCount, flags, cbf, user, notificationFrames,
    223             0 /*sharedBuffer*/, false /*threadCanCallJava*/, sessionId, transferType,
    224             offloadInfo, uid, pid, pAttributes, doNotReconnect, maxRequiredSpeed);
    225 }
    226 
    227 AudioTrack::AudioTrack(
    228         audio_stream_type_t streamType,
    229         uint32_t sampleRate,
    230         audio_format_t format,
    231         audio_channel_mask_t channelMask,
    232         const sp<IMemory>& sharedBuffer,
    233         audio_output_flags_t flags,
    234         callback_t cbf,
    235         void* user,
    236         int32_t notificationFrames,
    237         audio_session_t sessionId,
    238         transfer_type transferType,
    239         const audio_offload_info_t *offloadInfo,
    240         uid_t uid,
    241         pid_t pid,
    242         const audio_attributes_t* pAttributes,
    243         bool doNotReconnect,
    244         float maxRequiredSpeed)
    245     : mStatus(NO_INIT),
    246       mState(STATE_STOPPED),
    247       mPreviousPriority(ANDROID_PRIORITY_NORMAL),
    248       mPreviousSchedulingGroup(SP_DEFAULT),
    249       mPausedPosition(0),
    250       mSelectedDeviceId(AUDIO_PORT_HANDLE_NONE),
    251       mPortId(AUDIO_PORT_HANDLE_NONE)
    252 {
    253     mStatus = set(streamType, sampleRate, format, channelMask,
    254             0 /*frameCount*/, flags, cbf, user, notificationFrames,
    255             sharedBuffer, false /*threadCanCallJava*/, sessionId, transferType, offloadInfo,
    256             uid, pid, pAttributes, doNotReconnect, maxRequiredSpeed);
    257 }
    258 
    259 AudioTrack::~AudioTrack()
    260 {
    261     if (mStatus == NO_ERROR) {
    262         // Make sure that callback function exits in the case where
    263         // it is looping on buffer full condition in obtainBuffer().
    264         // Otherwise the callback thread will never exit.
    265         stop();
    266         if (mAudioTrackThread != 0) {
    267             mProxy->interrupt();
    268             mAudioTrackThread->requestExit();   // see comment in AudioTrack.h
    269             mAudioTrackThread->requestExitAndWait();
    270             mAudioTrackThread.clear();
    271         }
    272         // No lock here: worst case we remove a NULL callback which will be a nop
    273         if (mDeviceCallback != 0 && mOutput != AUDIO_IO_HANDLE_NONE) {
    274             AudioSystem::removeAudioDeviceCallback(mDeviceCallback, mOutput);
    275         }
    276         IInterface::asBinder(mAudioTrack)->unlinkToDeath(mDeathNotifier, this);
    277         mAudioTrack.clear();
    278         mCblkMemory.clear();
    279         mSharedBuffer.clear();
    280         IPCThreadState::self()->flushCommands();
    281         ALOGV("~AudioTrack, releasing session id %d from %d on behalf of %d",
    282                 mSessionId, IPCThreadState::self()->getCallingPid(), mClientPid);
    283         AudioSystem::releaseAudioSessionId(mSessionId, mClientPid);
    284     }
    285 }
    286 
    287 status_t AudioTrack::set(
    288         audio_stream_type_t streamType,
    289         uint32_t sampleRate,
    290         audio_format_t format,
    291         audio_channel_mask_t channelMask,
    292         size_t frameCount,
    293         audio_output_flags_t flags,
    294         callback_t cbf,
    295         void* user,
    296         int32_t notificationFrames,
    297         const sp<IMemory>& sharedBuffer,
    298         bool threadCanCallJava,
    299         audio_session_t sessionId,
    300         transfer_type transferType,
    301         const audio_offload_info_t *offloadInfo,
    302         uid_t uid,
    303         pid_t pid,
    304         const audio_attributes_t* pAttributes,
    305         bool doNotReconnect,
    306         float maxRequiredSpeed)
    307 {
    308     ALOGV("set(): streamType %d, sampleRate %u, format %#x, channelMask %#x, frameCount %zu, "
    309           "flags #%x, notificationFrames %d, sessionId %d, transferType %d, uid %d, pid %d",
    310           streamType, sampleRate, format, channelMask, frameCount, flags, notificationFrames,
    311           sessionId, transferType, uid, pid);
    312 
    313     mThreadCanCallJava = threadCanCallJava;
    314 
    315     switch (transferType) {
    316     case TRANSFER_DEFAULT:
    317         if (sharedBuffer != 0) {
    318             transferType = TRANSFER_SHARED;
    319         } else if (cbf == NULL || threadCanCallJava) {
    320             transferType = TRANSFER_SYNC;
    321         } else {
    322             transferType = TRANSFER_CALLBACK;
    323         }
    324         break;
    325     case TRANSFER_CALLBACK:
    326         if (cbf == NULL || sharedBuffer != 0) {
    327             ALOGE("Transfer type TRANSFER_CALLBACK but cbf == NULL || sharedBuffer != 0");
    328             return BAD_VALUE;
    329         }
    330         break;
    331     case TRANSFER_OBTAIN:
    332     case TRANSFER_SYNC:
    333         if (sharedBuffer != 0) {
    334             ALOGE("Transfer type TRANSFER_OBTAIN but sharedBuffer != 0");
    335             return BAD_VALUE;
    336         }
    337         break;
    338     case TRANSFER_SHARED:
    339         if (sharedBuffer == 0) {
    340             ALOGE("Transfer type TRANSFER_SHARED but sharedBuffer == 0");
    341             return BAD_VALUE;
    342         }
    343         break;
    344     default:
    345         ALOGE("Invalid transfer type %d", transferType);
    346         return BAD_VALUE;
    347     }
    348     mSharedBuffer = sharedBuffer;
    349     mTransfer = transferType;
    350     mDoNotReconnect = doNotReconnect;
    351 
    352     ALOGV_IF(sharedBuffer != 0, "sharedBuffer: %p, size: %zu", sharedBuffer->pointer(),
    353             sharedBuffer->size());
    354 
    355     ALOGV("set() streamType %d frameCount %zu flags %04x", streamType, frameCount, flags);
    356 
    357     // invariant that mAudioTrack != 0 is true only after set() returns successfully
    358     if (mAudioTrack != 0) {
    359         ALOGE("Track already in use");
    360         return INVALID_OPERATION;
    361     }
    362 
    363     // handle default values first.
    364     if (streamType == AUDIO_STREAM_DEFAULT) {
    365         streamType = AUDIO_STREAM_MUSIC;
    366     }
    367     if (pAttributes == NULL) {
    368         if (uint32_t(streamType) >= AUDIO_STREAM_PUBLIC_CNT) {
    369             ALOGE("Invalid stream type %d", streamType);
    370             return BAD_VALUE;
    371         }
    372         mStreamType = streamType;
    373 
    374     } else {
    375         // stream type shouldn't be looked at, this track has audio attributes
    376         memcpy(&mAttributes, pAttributes, sizeof(audio_attributes_t));
    377         ALOGV("Building AudioTrack with attributes: usage=%d content=%d flags=0x%x tags=[%s]",
    378                 mAttributes.usage, mAttributes.content_type, mAttributes.flags, mAttributes.tags);
    379         mStreamType = AUDIO_STREAM_DEFAULT;
    380         if ((mAttributes.flags & AUDIO_FLAG_HW_AV_SYNC) != 0) {
    381             flags = (audio_output_flags_t)(flags | AUDIO_OUTPUT_FLAG_HW_AV_SYNC);
    382         }
    383         if ((mAttributes.flags & AUDIO_FLAG_LOW_LATENCY) != 0) {
    384             flags = (audio_output_flags_t) (flags | AUDIO_OUTPUT_FLAG_FAST);
    385         }
    386         // check deep buffer after flags have been modified above
    387         if (flags == AUDIO_OUTPUT_FLAG_NONE && (mAttributes.flags & AUDIO_FLAG_DEEP_BUFFER) != 0) {
    388             flags = AUDIO_OUTPUT_FLAG_DEEP_BUFFER;
    389         }
    390     }
    391 
    392     // these below should probably come from the audioFlinger too...
    393     if (format == AUDIO_FORMAT_DEFAULT) {
    394         format = AUDIO_FORMAT_PCM_16_BIT;
    395     } else if (format == AUDIO_FORMAT_IEC61937) { // HDMI pass-through?
    396         mAttributes.flags |= AUDIO_OUTPUT_FLAG_IEC958_NONAUDIO;
    397     }
    398 
    399     // validate parameters
    400     if (!audio_is_valid_format(format)) {
    401         ALOGE("Invalid format %#x", format);
    402         return BAD_VALUE;
    403     }
    404     mFormat = format;
    405 
    406     if (!audio_is_output_channel(channelMask)) {
    407         ALOGE("Invalid channel mask %#x", channelMask);
    408         return BAD_VALUE;
    409     }
    410     mChannelMask = channelMask;
    411     uint32_t channelCount = audio_channel_count_from_out_mask(channelMask);
    412     mChannelCount = channelCount;
    413 
    414     // force direct flag if format is not linear PCM
    415     // or offload was requested
    416     if ((flags & AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD)
    417             || !audio_is_linear_pcm(format)) {
    418         ALOGV( (flags & AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD)
    419                     ? "Offload request, forcing to Direct Output"
    420                     : "Not linear PCM, forcing to Direct Output");
    421         flags = (audio_output_flags_t)
    422                 // FIXME why can't we allow direct AND fast?
    423                 ((flags | AUDIO_OUTPUT_FLAG_DIRECT) & ~AUDIO_OUTPUT_FLAG_FAST);
    424     }
    425 
    426     // force direct flag if HW A/V sync requested
    427     if ((flags & AUDIO_OUTPUT_FLAG_HW_AV_SYNC) != 0) {
    428         flags = (audio_output_flags_t)(flags | AUDIO_OUTPUT_FLAG_DIRECT);
    429     }
    430 
    431     if (flags & AUDIO_OUTPUT_FLAG_DIRECT) {
    432         if (audio_has_proportional_frames(format)) {
    433             mFrameSize = channelCount * audio_bytes_per_sample(format);
    434         } else {
    435             mFrameSize = sizeof(uint8_t);
    436         }
    437     } else {
    438         ALOG_ASSERT(audio_has_proportional_frames(format));
    439         mFrameSize = channelCount * audio_bytes_per_sample(format);
    440         // createTrack will return an error if PCM format is not supported by server,
    441         // so no need to check for specific PCM formats here
    442     }
    443 
    444     // sampling rate must be specified for direct outputs
    445     if (sampleRate == 0 && (flags & AUDIO_OUTPUT_FLAG_DIRECT) != 0) {
    446         return BAD_VALUE;
    447     }
    448     mSampleRate = sampleRate;
    449     mOriginalSampleRate = sampleRate;
    450     mPlaybackRate = AUDIO_PLAYBACK_RATE_DEFAULT;
    451     // 1.0 <= mMaxRequiredSpeed <= AUDIO_TIMESTRETCH_SPEED_MAX
    452     mMaxRequiredSpeed = min(max(maxRequiredSpeed, 1.0f), AUDIO_TIMESTRETCH_SPEED_MAX);
    453 
    454     // Make copy of input parameter offloadInfo so that in the future:
    455     //  (a) createTrack_l doesn't need it as an input parameter
    456     //  (b) we can support re-creation of offloaded tracks
    457     if (offloadInfo != NULL) {
    458         mOffloadInfoCopy = *offloadInfo;
    459         mOffloadInfo = &mOffloadInfoCopy;
    460     } else {
    461         mOffloadInfo = NULL;
    462         memset(&mOffloadInfoCopy, 0, sizeof(audio_offload_info_t));
    463     }
    464 
    465     mVolume[AUDIO_INTERLEAVE_LEFT] = 1.0f;
    466     mVolume[AUDIO_INTERLEAVE_RIGHT] = 1.0f;
    467     mSendLevel = 0.0f;
    468     // mFrameCount is initialized in createTrack_l
    469     mReqFrameCount = frameCount;
    470     if (notificationFrames >= 0) {
    471         mNotificationFramesReq = notificationFrames;
    472         mNotificationsPerBufferReq = 0;
    473     } else {
    474         if (!(flags & AUDIO_OUTPUT_FLAG_FAST)) {
    475             ALOGE("notificationFrames=%d not permitted for non-fast track",
    476                     notificationFrames);
    477             return BAD_VALUE;
    478         }
    479         if (frameCount > 0) {
    480             ALOGE("notificationFrames=%d not permitted with non-zero frameCount=%zu",
    481                     notificationFrames, frameCount);
    482             return BAD_VALUE;
    483         }
    484         mNotificationFramesReq = 0;
    485         const uint32_t minNotificationsPerBuffer = 1;
    486         const uint32_t maxNotificationsPerBuffer = 8;
    487         mNotificationsPerBufferReq = min(maxNotificationsPerBuffer,
    488                 max((uint32_t) -notificationFrames, minNotificationsPerBuffer));
    489         ALOGW_IF(mNotificationsPerBufferReq != (uint32_t) -notificationFrames,
    490                 "notificationFrames=%d clamped to the range -%u to -%u",
    491                 notificationFrames, minNotificationsPerBuffer, maxNotificationsPerBuffer);
    492     }
    493     mNotificationFramesAct = 0;
    494     if (sessionId == AUDIO_SESSION_ALLOCATE) {
    495         mSessionId = (audio_session_t) AudioSystem::newAudioUniqueId(AUDIO_UNIQUE_ID_USE_SESSION);
    496     } else {
    497         mSessionId = sessionId;
    498     }
    499     int callingpid = IPCThreadState::self()->getCallingPid();
    500     int mypid = getpid();
    501     if (uid == AUDIO_UID_INVALID || (callingpid != mypid)) {
    502         mClientUid = IPCThreadState::self()->getCallingUid();
    503     } else {
    504         mClientUid = uid;
    505     }
    506     if (pid == -1 || (callingpid != mypid)) {
    507         mClientPid = callingpid;
    508     } else {
    509         mClientPid = pid;
    510     }
    511     mAuxEffectId = 0;
    512     mOrigFlags = mFlags = flags;
    513     mCbf = cbf;
    514 
    515     if (cbf != NULL) {
    516         mAudioTrackThread = new AudioTrackThread(*this, threadCanCallJava);
    517         mAudioTrackThread->run("AudioTrack", ANDROID_PRIORITY_AUDIO, 0 /*stack*/);
    518         // thread begins in paused state, and will not reference us until start()
    519     }
    520 
    521     // create the IAudioTrack
    522     status_t status = createTrack_l();
    523 
    524     if (status != NO_ERROR) {
    525         if (mAudioTrackThread != 0) {
    526             mAudioTrackThread->requestExit();   // see comment in AudioTrack.h
    527             mAudioTrackThread->requestExitAndWait();
    528             mAudioTrackThread.clear();
    529         }
    530         return status;
    531     }
    532 
    533     mStatus = NO_ERROR;
    534     mUserData = user;
    535     mLoopCount = 0;
    536     mLoopStart = 0;
    537     mLoopEnd = 0;
    538     mLoopCountNotified = 0;
    539     mMarkerPosition = 0;
    540     mMarkerReached = false;
    541     mNewPosition = 0;
    542     mUpdatePeriod = 0;
    543     mPosition = 0;
    544     mReleased = 0;
    545     mStartUs = 0;
    546     AudioSystem::acquireAudioSessionId(mSessionId, mClientPid);
    547     mSequence = 1;
    548     mObservedSequence = mSequence;
    549     mInUnderrun = false;
    550     mPreviousTimestampValid = false;
    551     mTimestampStartupGlitchReported = false;
    552     mRetrogradeMotionReported = false;
    553     mPreviousLocation = ExtendedTimestamp::LOCATION_INVALID;
    554     mStartTs.mPosition = 0;
    555     mUnderrunCountOffset = 0;
    556     mFramesWritten = 0;
    557     mFramesWrittenServerOffset = 0;
    558     mFramesWrittenAtRestore = -1; // -1 is a unique initializer.
    559     mVolumeHandler = new VolumeHandler();
    560     return NO_ERROR;
    561 }
    562 
    563 // -------------------------------------------------------------------------
    564 
    565 status_t AudioTrack::start()
    566 {
    567     AutoMutex lock(mLock);
    568 
    569     if (mState == STATE_ACTIVE) {
    570         return INVALID_OPERATION;
    571     }
    572 
    573     mInUnderrun = true;
    574 
    575     State previousState = mState;
    576     if (previousState == STATE_PAUSED_STOPPING) {
    577         mState = STATE_STOPPING;
    578     } else {
    579         mState = STATE_ACTIVE;
    580     }
    581     (void) updateAndGetPosition_l();
    582 
    583     // save start timestamp
    584     if (isOffloadedOrDirect_l()) {
    585         if (getTimestamp_l(mStartTs) != OK) {
    586             mStartTs.mPosition = 0;
    587         }
    588     } else {
    589         if (getTimestamp_l(&mStartEts) != OK) {
    590             mStartEts.clear();
    591         }
    592     }
    593     if (previousState == STATE_STOPPED || previousState == STATE_FLUSHED) {
    594         // reset current position as seen by client to 0
    595         mPosition = 0;
    596         mPreviousTimestampValid = false;
    597         mTimestampStartupGlitchReported = false;
    598         mRetrogradeMotionReported = false;
    599         mPreviousLocation = ExtendedTimestamp::LOCATION_INVALID;
    600 
    601         if (!isOffloadedOrDirect_l()
    602                 && mStartEts.mTimeNs[ExtendedTimestamp::LOCATION_SERVER] > 0) {
    603             // Server side has consumed something, but is it finished consuming?
    604             // It is possible since flush and stop are asynchronous that the server
    605             // is still active at this point.
    606             ALOGV("start: server read:%lld  cumulative flushed:%lld  client written:%lld",
    607                     (long long)(mFramesWrittenServerOffset
    608                             + mStartEts.mPosition[ExtendedTimestamp::LOCATION_SERVER]),
    609                     (long long)mStartEts.mFlushed,
    610                     (long long)mFramesWritten);
    611             mFramesWrittenServerOffset = -mStartEts.mPosition[ExtendedTimestamp::LOCATION_SERVER];
    612         }
    613         mFramesWritten = 0;
    614         mProxy->clearTimestamp(); // need new server push for valid timestamp
    615         mMarkerReached = false;
    616 
    617         // For offloaded tracks, we don't know if the hardware counters are really zero here,
    618         // since the flush is asynchronous and stop may not fully drain.
    619         // We save the time when the track is started to later verify whether
    620         // the counters are realistic (i.e. start from zero after this time).
    621         mStartUs = getNowUs();
    622 
    623         // force refresh of remaining frames by processAudioBuffer() as last
    624         // write before stop could be partial.
    625         mRefreshRemaining = true;
    626     }
    627     mNewPosition = mPosition + mUpdatePeriod;
    628     int32_t flags = android_atomic_and(~(CBLK_STREAM_END_DONE | CBLK_DISABLED), &mCblk->mFlags);
    629 
    630     status_t status = NO_ERROR;
    631     if (!(flags & CBLK_INVALID)) {
    632         status = mAudioTrack->start();
    633         if (status == DEAD_OBJECT) {
    634             flags |= CBLK_INVALID;
    635         }
    636     }
    637     if (flags & CBLK_INVALID) {
    638         status = restoreTrack_l("start");
    639     }
    640 
    641     // resume or pause the callback thread as needed.
    642     sp<AudioTrackThread> t = mAudioTrackThread;
    643     if (status == NO_ERROR) {
    644         if (t != 0) {
    645             if (previousState == STATE_STOPPING) {
    646                 mProxy->interrupt();
    647             } else {
    648                 t->resume();
    649             }
    650         } else {
    651             mPreviousPriority = getpriority(PRIO_PROCESS, 0);
    652             get_sched_policy(0, &mPreviousSchedulingGroup);
    653             androidSetThreadPriority(0, ANDROID_PRIORITY_AUDIO);
    654         }
    655 
    656         // Start our local VolumeHandler for restoration purposes.
    657         mVolumeHandler->setStarted();
    658     } else {
    659         ALOGE("start() status %d", status);
    660         mState = previousState;
    661         if (t != 0) {
    662             if (previousState != STATE_STOPPING) {
    663                 t->pause();
    664             }
    665         } else {
    666             setpriority(PRIO_PROCESS, 0, mPreviousPriority);
    667             set_sched_policy(0, mPreviousSchedulingGroup);
    668         }
    669     }
    670 
    671     return status;
    672 }
    673 
    674 void AudioTrack::stop()
    675 {
    676     AutoMutex lock(mLock);
    677     if (mState != STATE_ACTIVE && mState != STATE_PAUSED) {
    678         return;
    679     }
    680 
    681     if (isOffloaded_l()) {
    682         mState = STATE_STOPPING;
    683     } else {
    684         mState = STATE_STOPPED;
    685         ALOGD_IF(mSharedBuffer == nullptr,
    686                 "stop() called with %u frames delivered", mReleased.value());
    687         mReleased = 0;
    688     }
    689 
    690     mProxy->interrupt();
    691     mAudioTrack->stop();
    692 
    693     // Note: legacy handling - stop does not clear playback marker
    694     // and periodic update counter, but flush does for streaming tracks.
    695 
    696     if (mSharedBuffer != 0) {
    697         // clear buffer position and loop count.
    698         mStaticProxy->setBufferPositionAndLoop(0 /* position */,
    699                 0 /* loopStart */, 0 /* loopEnd */, 0 /* loopCount */);
    700     }
    701 
    702     sp<AudioTrackThread> t = mAudioTrackThread;
    703     if (t != 0) {
    704         if (!isOffloaded_l()) {
    705             t->pause();
    706         }
    707     } else {
    708         setpriority(PRIO_PROCESS, 0, mPreviousPriority);
    709         set_sched_policy(0, mPreviousSchedulingGroup);
    710     }
    711 }
    712 
    713 bool AudioTrack::stopped() const
    714 {
    715     AutoMutex lock(mLock);
    716     return mState != STATE_ACTIVE;
    717 }
    718 
    719 void AudioTrack::flush()
    720 {
    721     if (mSharedBuffer != 0) {
    722         return;
    723     }
    724     AutoMutex lock(mLock);
    725     if (mState == STATE_ACTIVE || mState == STATE_FLUSHED) {
    726         return;
    727     }
    728     flush_l();
    729 }
    730 
    731 void AudioTrack::flush_l()
    732 {
    733     ALOG_ASSERT(mState != STATE_ACTIVE);
    734 
    735     // clear playback marker and periodic update counter
    736     mMarkerPosition = 0;
    737     mMarkerReached = false;
    738     mUpdatePeriod = 0;
    739     mRefreshRemaining = true;
    740 
    741     mState = STATE_FLUSHED;
    742     mReleased = 0;
    743     if (isOffloaded_l()) {
    744         mProxy->interrupt();
    745     }
    746     mProxy->flush();
    747     mAudioTrack->flush();
    748 }
    749 
    750 void AudioTrack::pause()
    751 {
    752     AutoMutex lock(mLock);
    753     if (mState == STATE_ACTIVE) {
    754         mState = STATE_PAUSED;
    755     } else if (mState == STATE_STOPPING) {
    756         mState = STATE_PAUSED_STOPPING;
    757     } else {
    758         return;
    759     }
    760     mProxy->interrupt();
    761     mAudioTrack->pause();
    762 
    763     if (isOffloaded_l()) {
    764         if (mOutput != AUDIO_IO_HANDLE_NONE) {
    765             // An offload output can be re-used between two audio tracks having
    766             // the same configuration. A timestamp query for a paused track
    767             // while the other is running would return an incorrect time.
    768             // To fix this, cache the playback position on a pause() and return
    769             // this time when requested until the track is resumed.
    770 
    771             // OffloadThread sends HAL pause in its threadLoop. Time saved
    772             // here can be slightly off.
    773 
    774             // TODO: check return code for getRenderPosition.
    775 
    776             uint32_t halFrames;
    777             AudioSystem::getRenderPosition(mOutput, &halFrames, &mPausedPosition);
    778             ALOGV("AudioTrack::pause for offload, cache current position %u", mPausedPosition);
    779         }
    780     }
    781 }
    782 
    783 status_t AudioTrack::setVolume(float left, float right)
    784 {
    785     // This duplicates a test by AudioTrack JNI, but that is not the only caller
    786     if (isnanf(left) || left < GAIN_FLOAT_ZERO || left > GAIN_FLOAT_UNITY ||
    787             isnanf(right) || right < GAIN_FLOAT_ZERO || right > GAIN_FLOAT_UNITY) {
    788         return BAD_VALUE;
    789     }
    790 
    791     AutoMutex lock(mLock);
    792     mVolume[AUDIO_INTERLEAVE_LEFT] = left;
    793     mVolume[AUDIO_INTERLEAVE_RIGHT] = right;
    794 
    795     mProxy->setVolumeLR(gain_minifloat_pack(gain_from_float(left), gain_from_float(right)));
    796 
    797     if (isOffloaded_l()) {
    798         mAudioTrack->signal();
    799     }
    800     return NO_ERROR;
    801 }
    802 
    803 status_t AudioTrack::setVolume(float volume)
    804 {
    805     return setVolume(volume, volume);
    806 }
    807 
    808 status_t AudioTrack::setAuxEffectSendLevel(float level)
    809 {
    810     // This duplicates a test by AudioTrack JNI, but that is not the only caller
    811     if (isnanf(level) || level < GAIN_FLOAT_ZERO || level > GAIN_FLOAT_UNITY) {
    812         return BAD_VALUE;
    813     }
    814 
    815     AutoMutex lock(mLock);
    816     mSendLevel = level;
    817     mProxy->setSendLevel(level);
    818 
    819     return NO_ERROR;
    820 }
    821 
    822 void AudioTrack::getAuxEffectSendLevel(float* level) const
    823 {
    824     if (level != NULL) {
    825         *level = mSendLevel;
    826     }
    827 }
    828 
    829 status_t AudioTrack::setSampleRate(uint32_t rate)
    830 {
    831     AutoMutex lock(mLock);
    832     if (rate == mSampleRate) {
    833         return NO_ERROR;
    834     }
    835     if (isOffloadedOrDirect_l() || (mFlags & AUDIO_OUTPUT_FLAG_FAST)) {
    836         return INVALID_OPERATION;
    837     }
    838     if (mOutput == AUDIO_IO_HANDLE_NONE) {
    839         return NO_INIT;
    840     }
    841     // NOTE: it is theoretically possible, but highly unlikely, that a device change
    842     // could mean a previously allowed sampling rate is no longer allowed.
    843     uint32_t afSamplingRate;
    844     if (AudioSystem::getSamplingRate(mOutput, &afSamplingRate) != NO_ERROR) {
    845         return NO_INIT;
    846     }
    847     // pitch is emulated by adjusting speed and sampleRate
    848     const uint32_t effectiveSampleRate = adjustSampleRate(rate, mPlaybackRate.mPitch);
    849     if (rate == 0 || effectiveSampleRate > afSamplingRate * AUDIO_RESAMPLER_DOWN_RATIO_MAX) {
    850         return BAD_VALUE;
    851     }
    852     // TODO: Should we also check if the buffer size is compatible?
    853 
    854     mSampleRate = rate;
    855     mProxy->setSampleRate(effectiveSampleRate);
    856 
    857     return NO_ERROR;
    858 }
    859 
    860 uint32_t AudioTrack::getSampleRate() const
    861 {
    862     AutoMutex lock(mLock);
    863 
    864     // sample rate can be updated during playback by the offloaded decoder so we need to
    865     // query the HAL and update if needed.
    866 // FIXME use Proxy return channel to update the rate from server and avoid polling here
    867     if (isOffloadedOrDirect_l()) {
    868         if (mOutput != AUDIO_IO_HANDLE_NONE) {
    869             uint32_t sampleRate = 0;
    870             status_t status = AudioSystem::getSamplingRate(mOutput, &sampleRate);
    871             if (status == NO_ERROR) {
    872                 mSampleRate = sampleRate;
    873             }
    874         }
    875     }
    876     return mSampleRate;
    877 }
    878 
    879 uint32_t AudioTrack::getOriginalSampleRate() const
    880 {
    881     return mOriginalSampleRate;
    882 }
    883 
    884 status_t AudioTrack::setPlaybackRate(const AudioPlaybackRate &playbackRate)
    885 {
    886     AutoMutex lock(mLock);
    887     if (isAudioPlaybackRateEqual(playbackRate, mPlaybackRate)) {
    888         return NO_ERROR;
    889     }
    890     if (isOffloadedOrDirect_l()) {
    891         return INVALID_OPERATION;
    892     }
    893     if (mFlags & AUDIO_OUTPUT_FLAG_FAST) {
    894         return INVALID_OPERATION;
    895     }
    896 
    897     ALOGV("setPlaybackRate (input): mSampleRate:%u  mSpeed:%f  mPitch:%f",
    898             mSampleRate, playbackRate.mSpeed, playbackRate.mPitch);
    899     // pitch is emulated by adjusting speed and sampleRate
    900     const uint32_t effectiveRate = adjustSampleRate(mSampleRate, playbackRate.mPitch);
    901     const float effectiveSpeed = adjustSpeed(playbackRate.mSpeed, playbackRate.mPitch);
    902     const float effectivePitch = adjustPitch(playbackRate.mPitch);
    903     AudioPlaybackRate playbackRateTemp = playbackRate;
    904     playbackRateTemp.mSpeed = effectiveSpeed;
    905     playbackRateTemp.mPitch = effectivePitch;
    906 
    907     ALOGV("setPlaybackRate (effective): mSampleRate:%u  mSpeed:%f  mPitch:%f",
    908             effectiveRate, effectiveSpeed, effectivePitch);
    909 
    910     if (!isAudioPlaybackRateValid(playbackRateTemp)) {
    911         ALOGV("setPlaybackRate(%f, %f) failed (effective rate out of bounds)",
    912                 playbackRate.mSpeed, playbackRate.mPitch);
    913         return BAD_VALUE;
    914     }
    915     // Check if the buffer size is compatible.
    916     if (!isSampleRateSpeedAllowed_l(effectiveRate, effectiveSpeed)) {
    917         ALOGV("setPlaybackRate(%f, %f) failed (buffer size)",
    918                 playbackRate.mSpeed, playbackRate.mPitch);
    919         return BAD_VALUE;
    920     }
    921 
    922     // Check resampler ratios are within bounds
    923     if ((uint64_t)effectiveRate > (uint64_t)mSampleRate *
    924             (uint64_t)AUDIO_RESAMPLER_DOWN_RATIO_MAX) {
    925         ALOGV("setPlaybackRate(%f, %f) failed. Resample rate exceeds max accepted value",
    926                 playbackRate.mSpeed, playbackRate.mPitch);
    927         return BAD_VALUE;
    928     }
    929 
    930     if ((uint64_t)effectiveRate * (uint64_t)AUDIO_RESAMPLER_UP_RATIO_MAX < (uint64_t)mSampleRate) {
    931         ALOGV("setPlaybackRate(%f, %f) failed. Resample rate below min accepted value",
    932                         playbackRate.mSpeed, playbackRate.mPitch);
    933         return BAD_VALUE;
    934     }
    935     mPlaybackRate = playbackRate;
    936     //set effective rates
    937     mProxy->setPlaybackRate(playbackRateTemp);
    938     mProxy->setSampleRate(effectiveRate); // FIXME: not quite "atomic" with setPlaybackRate
    939     return NO_ERROR;
    940 }
    941 
    942 const AudioPlaybackRate& AudioTrack::getPlaybackRate() const
    943 {
    944     AutoMutex lock(mLock);
    945     return mPlaybackRate;
    946 }
    947 
    948 ssize_t AudioTrack::getBufferSizeInFrames()
    949 {
    950     AutoMutex lock(mLock);
    951     if (mOutput == AUDIO_IO_HANDLE_NONE || mProxy.get() == 0) {
    952         return NO_INIT;
    953     }
    954     return (ssize_t) mProxy->getBufferSizeInFrames();
    955 }
    956 
    957 status_t AudioTrack::getBufferDurationInUs(int64_t *duration)
    958 {
    959     if (duration == nullptr) {
    960         return BAD_VALUE;
    961     }
    962     AutoMutex lock(mLock);
    963     if (mOutput == AUDIO_IO_HANDLE_NONE || mProxy.get() == 0) {
    964         return NO_INIT;
    965     }
    966     ssize_t bufferSizeInFrames = (ssize_t) mProxy->getBufferSizeInFrames();
    967     if (bufferSizeInFrames < 0) {
    968         return (status_t)bufferSizeInFrames;
    969     }
    970     *duration = (int64_t)((double)bufferSizeInFrames * 1000000
    971             / ((double)mSampleRate * mPlaybackRate.mSpeed));
    972     return NO_ERROR;
    973 }
    974 
    975 ssize_t AudioTrack::setBufferSizeInFrames(size_t bufferSizeInFrames)
    976 {
    977     AutoMutex lock(mLock);
    978     if (mOutput == AUDIO_IO_HANDLE_NONE || mProxy.get() == 0) {
    979         return NO_INIT;
    980     }
    981     // Reject if timed track or compressed audio.
    982     if (!audio_is_linear_pcm(mFormat)) {
    983         return INVALID_OPERATION;
    984     }
    985     return (ssize_t) mProxy->setBufferSizeInFrames((uint32_t) bufferSizeInFrames);
    986 }
    987 
    988 status_t AudioTrack::setLoop(uint32_t loopStart, uint32_t loopEnd, int loopCount)
    989 {
    990     if (mSharedBuffer == 0 || isOffloadedOrDirect()) {
    991         return INVALID_OPERATION;
    992     }
    993 
    994     if (loopCount == 0) {
    995         ;
    996     } else if (loopCount >= -1 && loopStart < loopEnd && loopEnd <= mFrameCount &&
    997             loopEnd - loopStart >= MIN_LOOP) {
    998         ;
    999     } else {
   1000         return BAD_VALUE;
   1001     }
   1002 
   1003     AutoMutex lock(mLock);
   1004     // See setPosition() regarding setting parameters such as loop points or position while active
   1005     if (mState == STATE_ACTIVE) {
   1006         return INVALID_OPERATION;
   1007     }
   1008     setLoop_l(loopStart, loopEnd, loopCount);
   1009     return NO_ERROR;
   1010 }
   1011 
   1012 void AudioTrack::setLoop_l(uint32_t loopStart, uint32_t loopEnd, int loopCount)
   1013 {
   1014     // We do not update the periodic notification point.
   1015     // mNewPosition = updateAndGetPosition_l() + mUpdatePeriod;
   1016     mLoopCount = loopCount;
   1017     mLoopEnd = loopEnd;
   1018     mLoopStart = loopStart;
   1019     mLoopCountNotified = loopCount;
   1020     mStaticProxy->setLoop(loopStart, loopEnd, loopCount);
   1021 
   1022     // Waking the AudioTrackThread is not needed as this cannot be called when active.
   1023 }
   1024 
   1025 status_t AudioTrack::setMarkerPosition(uint32_t marker)
   1026 {
   1027     // The only purpose of setting marker position is to get a callback
   1028     if (mCbf == NULL || isOffloadedOrDirect()) {
   1029         return INVALID_OPERATION;
   1030     }
   1031 
   1032     AutoMutex lock(mLock);
   1033     mMarkerPosition = marker;
   1034     mMarkerReached = false;
   1035 
   1036     sp<AudioTrackThread> t = mAudioTrackThread;
   1037     if (t != 0) {
   1038         t->wake();
   1039     }
   1040     return NO_ERROR;
   1041 }
   1042 
   1043 status_t AudioTrack::getMarkerPosition(uint32_t *marker) const
   1044 {
   1045     if (isOffloadedOrDirect()) {
   1046         return INVALID_OPERATION;
   1047     }
   1048     if (marker == NULL) {
   1049         return BAD_VALUE;
   1050     }
   1051 
   1052     AutoMutex lock(mLock);
   1053     mMarkerPosition.getValue(marker);
   1054 
   1055     return NO_ERROR;
   1056 }
   1057 
   1058 status_t AudioTrack::setPositionUpdatePeriod(uint32_t updatePeriod)
   1059 {
   1060     // The only purpose of setting position update period is to get a callback
   1061     if (mCbf == NULL || isOffloadedOrDirect()) {
   1062         return INVALID_OPERATION;
   1063     }
   1064 
   1065     AutoMutex lock(mLock);
   1066     mNewPosition = updateAndGetPosition_l() + updatePeriod;
   1067     mUpdatePeriod = updatePeriod;
   1068 
   1069     sp<AudioTrackThread> t = mAudioTrackThread;
   1070     if (t != 0) {
   1071         t->wake();
   1072     }
   1073     return NO_ERROR;
   1074 }
   1075 
   1076 status_t AudioTrack::getPositionUpdatePeriod(uint32_t *updatePeriod) const
   1077 {
   1078     if (isOffloadedOrDirect()) {
   1079         return INVALID_OPERATION;
   1080     }
   1081     if (updatePeriod == NULL) {
   1082         return BAD_VALUE;
   1083     }
   1084 
   1085     AutoMutex lock(mLock);
   1086     *updatePeriod = mUpdatePeriod;
   1087 
   1088     return NO_ERROR;
   1089 }
   1090 
   1091 status_t AudioTrack::setPosition(uint32_t position)
   1092 {
   1093     if (mSharedBuffer == 0 || isOffloadedOrDirect()) {
   1094         return INVALID_OPERATION;
   1095     }
   1096     if (position > mFrameCount) {
   1097         return BAD_VALUE;
   1098     }
   1099 
   1100     AutoMutex lock(mLock);
   1101     // Currently we require that the player is inactive before setting parameters such as position
   1102     // or loop points.  Otherwise, there could be a race condition: the application could read the
   1103     // current position, compute a new position or loop parameters, and then set that position or
   1104     // loop parameters but it would do the "wrong" thing since the position has continued to advance
   1105     // in the mean time.  If we ever provide a sequencer in server, we could allow a way for the app
   1106     // to specify how it wants to handle such scenarios.
   1107     if (mState == STATE_ACTIVE) {
   1108         return INVALID_OPERATION;
   1109     }
   1110     // After setting the position, use full update period before notification.
   1111     mNewPosition = updateAndGetPosition_l() + mUpdatePeriod;
   1112     mStaticProxy->setBufferPosition(position);
   1113 
   1114     // Waking the AudioTrackThread is not needed as this cannot be called when active.
   1115     return NO_ERROR;
   1116 }
   1117 
   1118 status_t AudioTrack::getPosition(uint32_t *position)
   1119 {
   1120     if (position == NULL) {
   1121         return BAD_VALUE;
   1122     }
   1123 
   1124     AutoMutex lock(mLock);
   1125     // FIXME: offloaded and direct tracks call into the HAL for render positions
   1126     // for compressed/synced data; however, we use proxy position for pure linear pcm data
   1127     // as we do not know the capability of the HAL for pcm position support and standby.
   1128     // There may be some latency differences between the HAL position and the proxy position.
   1129     if (isOffloadedOrDirect_l() && !isPurePcmData_l()) {
   1130         uint32_t dspFrames = 0;
   1131 
   1132         if (isOffloaded_l() && ((mState == STATE_PAUSED) || (mState == STATE_PAUSED_STOPPING))) {
   1133             ALOGV("getPosition called in paused state, return cached position %u", mPausedPosition);
   1134             *position = mPausedPosition;
   1135             return NO_ERROR;
   1136         }
   1137 
   1138         if (mOutput != AUDIO_IO_HANDLE_NONE) {
   1139             uint32_t halFrames; // actually unused
   1140             (void) AudioSystem::getRenderPosition(mOutput, &halFrames, &dspFrames);
   1141             // FIXME: on getRenderPosition() error, we return OK with frame position 0.
   1142         }
   1143         // FIXME: dspFrames may not be zero in (mState == STATE_STOPPED || mState == STATE_FLUSHED)
   1144         // due to hardware latency. We leave this behavior for now.
   1145         *position = dspFrames;
   1146     } else {
   1147         if (mCblk->mFlags & CBLK_INVALID) {
   1148             (void) restoreTrack_l("getPosition");
   1149             // FIXME: for compatibility with the Java API we ignore the restoreTrack_l()
   1150             // error here (e.g. DEAD_OBJECT) and return OK with the last recorded server position.
   1151         }
   1152 
   1153         // IAudioTrack::stop() isn't synchronous; we don't know when presentation completes
   1154         *position = (mState == STATE_STOPPED || mState == STATE_FLUSHED) ?
   1155                 0 : updateAndGetPosition_l().value();
   1156     }
   1157     return NO_ERROR;
   1158 }
   1159 
   1160 status_t AudioTrack::getBufferPosition(uint32_t *position)
   1161 {
   1162     if (mSharedBuffer == 0) {
   1163         return INVALID_OPERATION;
   1164     }
   1165     if (position == NULL) {
   1166         return BAD_VALUE;
   1167     }
   1168 
   1169     AutoMutex lock(mLock);
   1170     *position = mStaticProxy->getBufferPosition();
   1171     return NO_ERROR;
   1172 }
   1173 
   1174 status_t AudioTrack::reload()
   1175 {
   1176     if (mSharedBuffer == 0 || isOffloadedOrDirect()) {
   1177         return INVALID_OPERATION;
   1178     }
   1179 
   1180     AutoMutex lock(mLock);
   1181     // See setPosition() regarding setting parameters such as loop points or position while active
   1182     if (mState == STATE_ACTIVE) {
   1183         return INVALID_OPERATION;
   1184     }
   1185     mNewPosition = mUpdatePeriod;
   1186     (void) updateAndGetPosition_l();
   1187     mPosition = 0;
   1188     mPreviousTimestampValid = false;
   1189 #if 0
   1190     // The documentation is not clear on the behavior of reload() and the restoration
   1191     // of loop count. Historically we have not restored loop count, start, end,
   1192     // but it makes sense if one desires to repeat playing a particular sound.
   1193     if (mLoopCount != 0) {
   1194         mLoopCountNotified = mLoopCount;
   1195         mStaticProxy->setLoop(mLoopStart, mLoopEnd, mLoopCount);
   1196     }
   1197 #endif
   1198     mStaticProxy->setBufferPosition(0);
   1199     return NO_ERROR;
   1200 }
   1201 
   1202 audio_io_handle_t AudioTrack::getOutput() const
   1203 {
   1204     AutoMutex lock(mLock);
   1205     return mOutput;
   1206 }
   1207 
   1208 status_t AudioTrack::setOutputDevice(audio_port_handle_t deviceId) {
   1209     AutoMutex lock(mLock);
   1210     if (mSelectedDeviceId != deviceId) {
   1211         mSelectedDeviceId = deviceId;
   1212         if (mStatus == NO_ERROR) {
   1213             android_atomic_or(CBLK_INVALID, &mCblk->mFlags);
   1214         }
   1215     }
   1216     return NO_ERROR;
   1217 }
   1218 
   1219 audio_port_handle_t AudioTrack::getOutputDevice() {
   1220     AutoMutex lock(mLock);
   1221     return mSelectedDeviceId;
   1222 }
   1223 
   1224 audio_port_handle_t AudioTrack::getRoutedDeviceId() {
   1225     AutoMutex lock(mLock);
   1226     if (mOutput == AUDIO_IO_HANDLE_NONE) {
   1227         return AUDIO_PORT_HANDLE_NONE;
   1228     }
   1229     return AudioSystem::getDeviceIdForIo(mOutput);
   1230 }
   1231 
   1232 status_t AudioTrack::attachAuxEffect(int effectId)
   1233 {
   1234     AutoMutex lock(mLock);
   1235     status_t status = mAudioTrack->attachAuxEffect(effectId);
   1236     if (status == NO_ERROR) {
   1237         mAuxEffectId = effectId;
   1238     }
   1239     return status;
   1240 }
   1241 
   1242 audio_stream_type_t AudioTrack::streamType() const
   1243 {
   1244     if (mStreamType == AUDIO_STREAM_DEFAULT) {
   1245         return audio_attributes_to_stream_type(&mAttributes);
   1246     }
   1247     return mStreamType;
   1248 }
   1249 
   1250 // -------------------------------------------------------------------------
   1251 
   1252 // must be called with mLock held
   1253 status_t AudioTrack::createTrack_l()
   1254 {
   1255     const sp<IAudioFlinger>& audioFlinger = AudioSystem::get_audio_flinger();
   1256     if (audioFlinger == 0) {
   1257         ALOGE("Could not get audioflinger");
   1258         return NO_INIT;
   1259     }
   1260 
   1261     if (mDeviceCallback != 0 && mOutput != AUDIO_IO_HANDLE_NONE) {
   1262         AudioSystem::removeAudioDeviceCallback(mDeviceCallback, mOutput);
   1263     }
   1264     audio_io_handle_t output;
   1265     audio_stream_type_t streamType = mStreamType;
   1266     audio_attributes_t *attr = (mStreamType == AUDIO_STREAM_DEFAULT) ? &mAttributes : NULL;
   1267 
   1268     // mFlags (not mOrigFlags) is modified depending on whether fast request is accepted.
   1269     // After fast request is denied, we will request again if IAudioTrack is re-created.
   1270 
   1271     status_t status;
   1272     audio_config_t config = AUDIO_CONFIG_INITIALIZER;
   1273     config.sample_rate = mSampleRate;
   1274     config.channel_mask = mChannelMask;
   1275     config.format = mFormat;
   1276     config.offload_info = mOffloadInfoCopy;
   1277     status = AudioSystem::getOutputForAttr(attr, &output,
   1278                                            mSessionId, &streamType, mClientUid,
   1279                                            &config,
   1280                                            mFlags, mSelectedDeviceId, &mPortId);
   1281 
   1282     if (status != NO_ERROR || output == AUDIO_IO_HANDLE_NONE) {
   1283         ALOGE("Could not get audio output for session %d, stream type %d, usage %d, sample rate %u,"
   1284               " format %#x, channel mask %#x, flags %#x",
   1285               mSessionId, streamType, mAttributes.usage, mSampleRate, mFormat, mChannelMask,
   1286               mFlags);
   1287         return BAD_VALUE;
   1288     }
   1289     {
   1290     // Now that we have a reference to an I/O handle and have not yet handed it off to AudioFlinger,
   1291     // we must release it ourselves if anything goes wrong.
   1292 
   1293     // Not all of these values are needed under all conditions, but it is easier to get them all
   1294     status = AudioSystem::getLatency(output, &mAfLatency);
   1295     if (status != NO_ERROR) {
   1296         ALOGE("getLatency(%d) failed status %d", output, status);
   1297         goto release;
   1298     }
   1299     ALOGV("createTrack_l() output %d afLatency %u", output, mAfLatency);
   1300 
   1301     status = AudioSystem::getFrameCount(output, &mAfFrameCount);
   1302     if (status != NO_ERROR) {
   1303         ALOGE("getFrameCount(output=%d) status %d", output, status);
   1304         goto release;
   1305     }
   1306 
   1307     // TODO consider making this a member variable if there are other uses for it later
   1308     size_t afFrameCountHAL;
   1309     status = AudioSystem::getFrameCountHAL(output, &afFrameCountHAL);
   1310     if (status != NO_ERROR) {
   1311         ALOGE("getFrameCountHAL(output=%d) status %d", output, status);
   1312         goto release;
   1313     }
   1314     ALOG_ASSERT(afFrameCountHAL > 0);
   1315 
   1316     status = AudioSystem::getSamplingRate(output, &mAfSampleRate);
   1317     if (status != NO_ERROR) {
   1318         ALOGE("getSamplingRate(output=%d) status %d", output, status);
   1319         goto release;
   1320     }
   1321     if (mSampleRate == 0) {
   1322         mSampleRate = mAfSampleRate;
   1323         mOriginalSampleRate = mAfSampleRate;
   1324     }
   1325 
   1326     // Client can only express a preference for FAST.  Server will perform additional tests.
   1327     if (mFlags & AUDIO_OUTPUT_FLAG_FAST) {
   1328         bool useCaseAllowed =
   1329             // either of these use cases:
   1330             // use case 1: shared buffer
   1331             (mSharedBuffer != 0) ||
   1332             // use case 2: callback transfer mode
   1333             (mTransfer == TRANSFER_CALLBACK) ||
   1334             // use case 3: obtain/release mode
   1335             (mTransfer == TRANSFER_OBTAIN) ||
   1336             // use case 4: synchronous write
   1337             ((mTransfer == TRANSFER_SYNC) && mThreadCanCallJava);
   1338         // sample rates must also match
   1339         bool fastAllowed = useCaseAllowed && (mSampleRate == mAfSampleRate);
   1340         if (!fastAllowed) {
   1341             ALOGW("AUDIO_OUTPUT_FLAG_FAST denied by client; transfer %d, "
   1342                 "track %u Hz, output %u Hz",
   1343                 mTransfer, mSampleRate, mAfSampleRate);
   1344             mFlags = (audio_output_flags_t) (mFlags & ~AUDIO_OUTPUT_FLAG_FAST);
   1345         }
   1346     }
   1347 
   1348     mNotificationFramesAct = mNotificationFramesReq;
   1349 
   1350     size_t frameCount = mReqFrameCount;
   1351     if (!audio_has_proportional_frames(mFormat)) {
   1352 
   1353         if (mSharedBuffer != 0) {
   1354             // Same comment as below about ignoring frameCount parameter for set()
   1355             frameCount = mSharedBuffer->size();
   1356         } else if (frameCount == 0) {
   1357             frameCount = mAfFrameCount;
   1358         }
   1359         if (mNotificationFramesAct != frameCount) {
   1360             mNotificationFramesAct = frameCount;
   1361         }
   1362     } else if (mSharedBuffer != 0) {
   1363         // FIXME: Ensure client side memory buffers need
   1364         // not have additional alignment beyond sample
   1365         // (e.g. 16 bit stereo accessed as 32 bit frame).
   1366         size_t alignment = audio_bytes_per_sample(mFormat);
   1367         if (alignment & 1) {
   1368             // for AUDIO_FORMAT_PCM_24_BIT_PACKED (not exposed through Java).
   1369             alignment = 1;
   1370         }
   1371         if (mChannelCount > 1) {
   1372             // More than 2 channels does not require stronger alignment than stereo
   1373             alignment <<= 1;
   1374         }
   1375         if (((uintptr_t)mSharedBuffer->pointer() & (alignment - 1)) != 0) {
   1376             ALOGE("Invalid buffer alignment: address %p, channel count %u",
   1377                     mSharedBuffer->pointer(), mChannelCount);
   1378             status = BAD_VALUE;
   1379             goto release;
   1380         }
   1381 
   1382         // When initializing a shared buffer AudioTrack via constructors,
   1383         // there's no frameCount parameter.
   1384         // But when initializing a shared buffer AudioTrack via set(),
   1385         // there _is_ a frameCount parameter.  We silently ignore it.
   1386         frameCount = mSharedBuffer->size() / mFrameSize;
   1387     } else {
   1388         size_t minFrameCount = 0;
   1389         // For fast tracks the frame count calculations and checks are mostly done by server,
   1390         // but we try to respect the application's request for notifications per buffer.
   1391         if (mFlags & AUDIO_OUTPUT_FLAG_FAST) {
   1392             if (mNotificationsPerBufferReq > 0) {
   1393                 // Avoid possible arithmetic overflow during multiplication.
   1394                 // mNotificationsPerBuffer is clamped to a small integer earlier, so it is unlikely.
   1395                 if (mNotificationsPerBufferReq > SIZE_MAX / afFrameCountHAL) {
   1396                     ALOGE("Requested notificationPerBuffer=%u ignored for HAL frameCount=%zu",
   1397                             mNotificationsPerBufferReq, afFrameCountHAL);
   1398                 } else {
   1399                     minFrameCount = afFrameCountHAL * mNotificationsPerBufferReq;
   1400                 }
   1401             }
   1402         } else {
   1403             // for normal tracks precompute the frame count based on speed.
   1404             const float speed = !isPurePcmData_l() || isOffloadedOrDirect_l() ? 1.0f :
   1405                             max(mMaxRequiredSpeed, mPlaybackRate.mSpeed);
   1406             minFrameCount = calculateMinFrameCount(
   1407                     mAfLatency, mAfFrameCount, mAfSampleRate, mSampleRate,
   1408                     speed /*, 0 mNotificationsPerBufferReq*/);
   1409         }
   1410         if (frameCount < minFrameCount) {
   1411             frameCount = minFrameCount;
   1412         }
   1413     }
   1414 
   1415     audio_output_flags_t flags = mFlags;
   1416 
   1417     pid_t tid = -1;
   1418     if (mFlags & AUDIO_OUTPUT_FLAG_FAST) {
   1419         if (mAudioTrackThread != 0 && !mThreadCanCallJava) {
   1420             tid = mAudioTrackThread->getTid();
   1421         }
   1422     }
   1423 
   1424     size_t temp = frameCount;   // temp may be replaced by a revised value of frameCount,
   1425                                 // but we will still need the original value also
   1426     audio_session_t originalSessionId = mSessionId;
   1427     sp<IAudioTrack> track = audioFlinger->createTrack(streamType,
   1428                                                       mSampleRate,
   1429                                                       mFormat,
   1430                                                       mChannelMask,
   1431                                                       &temp,
   1432                                                       &flags,
   1433                                                       mSharedBuffer,
   1434                                                       output,
   1435                                                       mClientPid,
   1436                                                       tid,
   1437                                                       &mSessionId,
   1438                                                       mClientUid,
   1439                                                       &status,
   1440                                                       mPortId);
   1441     ALOGE_IF(originalSessionId != AUDIO_SESSION_ALLOCATE && mSessionId != originalSessionId,
   1442             "session ID changed from %d to %d", originalSessionId, mSessionId);
   1443 
   1444     if (status != NO_ERROR) {
   1445         ALOGE("AudioFlinger could not create track, status: %d", status);
   1446         goto release;
   1447     }
   1448     ALOG_ASSERT(track != 0);
   1449 
   1450     // AudioFlinger now owns the reference to the I/O handle,
   1451     // so we are no longer responsible for releasing it.
   1452 
   1453     // FIXME compare to AudioRecord
   1454     sp<IMemory> iMem = track->getCblk();
   1455     if (iMem == 0) {
   1456         ALOGE("Could not get control block");
   1457         return NO_INIT;
   1458     }
   1459     void *iMemPointer = iMem->pointer();
   1460     if (iMemPointer == NULL) {
   1461         ALOGE("Could not get control block pointer");
   1462         return NO_INIT;
   1463     }
   1464     // invariant that mAudioTrack != 0 is true only after set() returns successfully
   1465     if (mAudioTrack != 0) {
   1466         IInterface::asBinder(mAudioTrack)->unlinkToDeath(mDeathNotifier, this);
   1467         mDeathNotifier.clear();
   1468     }
   1469     mAudioTrack = track;
   1470     mCblkMemory = iMem;
   1471     IPCThreadState::self()->flushCommands();
   1472 
   1473     audio_track_cblk_t* cblk = static_cast<audio_track_cblk_t*>(iMemPointer);
   1474     mCblk = cblk;
   1475     // note that temp is the (possibly revised) value of frameCount
   1476     if (temp < frameCount || (frameCount == 0 && temp == 0)) {
   1477         // In current design, AudioTrack client checks and ensures frame count validity before
   1478         // passing it to AudioFlinger so AudioFlinger should not return a different value except
   1479         // for fast track as it uses a special method of assigning frame count.
   1480         ALOGW("Requested frameCount %zu but received frameCount %zu", frameCount, temp);
   1481     }
   1482     frameCount = temp;
   1483 
   1484     mAwaitBoost = false;
   1485     if (mFlags & AUDIO_OUTPUT_FLAG_FAST) {
   1486         if (flags & AUDIO_OUTPUT_FLAG_FAST) {
   1487             ALOGI("AUDIO_OUTPUT_FLAG_FAST successful; frameCount %zu -> %zu", frameCount, temp);
   1488             if (!mThreadCanCallJava) {
   1489                 mAwaitBoost = true;
   1490             }
   1491         } else {
   1492             ALOGW("AUDIO_OUTPUT_FLAG_FAST denied by server; frameCount %zu -> %zu", frameCount,
   1493                     temp);
   1494         }
   1495     }
   1496     mFlags = flags;
   1497 
   1498     // Make sure that application is notified with sufficient margin before underrun.
   1499     // The client can divide the AudioTrack buffer into sub-buffers,
   1500     // and expresses its desire to server as the notification frame count.
   1501     if (mSharedBuffer == 0 && audio_is_linear_pcm(mFormat)) {
   1502         size_t maxNotificationFrames;
   1503         if (mFlags & AUDIO_OUTPUT_FLAG_FAST) {
   1504             // notify every HAL buffer, regardless of the size of the track buffer
   1505             maxNotificationFrames = afFrameCountHAL;
   1506         } else {
   1507             // For normal tracks, use at least double-buffering if no sample rate conversion,
   1508             // or at least triple-buffering if there is sample rate conversion
   1509             const int nBuffering = mOriginalSampleRate == mAfSampleRate ? 2 : 3;
   1510             maxNotificationFrames = frameCount / nBuffering;
   1511         }
   1512         if (mNotificationFramesAct == 0 || mNotificationFramesAct > maxNotificationFrames) {
   1513             if (mNotificationFramesAct == 0) {
   1514                 ALOGD("Client defaulted notificationFrames to %zu for frameCount %zu",
   1515                     maxNotificationFrames, frameCount);
   1516             } else {
   1517                 ALOGW("Client adjusted notificationFrames from %u to %zu for frameCount %zu",
   1518                     mNotificationFramesAct, maxNotificationFrames, frameCount);
   1519             }
   1520             mNotificationFramesAct = (uint32_t) maxNotificationFrames;
   1521         }
   1522     }
   1523 
   1524     // We retain a copy of the I/O handle, but don't own the reference
   1525     mOutput = output;
   1526     mRefreshRemaining = true;
   1527 
   1528     // Starting address of buffers in shared memory.  If there is a shared buffer, buffers
   1529     // is the value of pointer() for the shared buffer, otherwise buffers points
   1530     // immediately after the control block.  This address is for the mapping within client
   1531     // address space.  AudioFlinger::TrackBase::mBuffer is for the server address space.
   1532     void* buffers;
   1533     if (mSharedBuffer == 0) {
   1534         buffers = cblk + 1;
   1535     } else {
   1536         buffers = mSharedBuffer->pointer();
   1537         if (buffers == NULL) {
   1538             ALOGE("Could not get buffer pointer");
   1539             return NO_INIT;
   1540         }
   1541     }
   1542 
   1543     mAudioTrack->attachAuxEffect(mAuxEffectId);
   1544     // FIXME doesn't take into account speed or future sample rate changes (until restoreTrack)
   1545     // FIXME don't believe this lie
   1546     mLatency = mAfLatency + (1000*frameCount) / mSampleRate;
   1547 
   1548     mFrameCount = frameCount;
   1549     // If IAudioTrack is re-created, don't let the requested frameCount
   1550     // decrease.  This can confuse clients that cache frameCount().
   1551     if (frameCount > mReqFrameCount) {
   1552         mReqFrameCount = frameCount;
   1553     }
   1554 
   1555     // reset server position to 0 as we have new cblk.
   1556     mServer = 0;
   1557 
   1558     // update proxy
   1559     if (mSharedBuffer == 0) {
   1560         mStaticProxy.clear();
   1561         mProxy = new AudioTrackClientProxy(cblk, buffers, frameCount, mFrameSize);
   1562     } else {
   1563         mStaticProxy = new StaticAudioTrackClientProxy(cblk, buffers, frameCount, mFrameSize);
   1564         mProxy = mStaticProxy;
   1565     }
   1566 
   1567     mProxy->setVolumeLR(gain_minifloat_pack(
   1568             gain_from_float(mVolume[AUDIO_INTERLEAVE_LEFT]),
   1569             gain_from_float(mVolume[AUDIO_INTERLEAVE_RIGHT])));
   1570 
   1571     mProxy->setSendLevel(mSendLevel);
   1572     const uint32_t effectiveSampleRate = adjustSampleRate(mSampleRate, mPlaybackRate.mPitch);
   1573     const float effectiveSpeed = adjustSpeed(mPlaybackRate.mSpeed, mPlaybackRate.mPitch);
   1574     const float effectivePitch = adjustPitch(mPlaybackRate.mPitch);
   1575     mProxy->setSampleRate(effectiveSampleRate);
   1576 
   1577     AudioPlaybackRate playbackRateTemp = mPlaybackRate;
   1578     playbackRateTemp.mSpeed = effectiveSpeed;
   1579     playbackRateTemp.mPitch = effectivePitch;
   1580     mProxy->setPlaybackRate(playbackRateTemp);
   1581     mProxy->setMinimum(mNotificationFramesAct);
   1582 
   1583     mDeathNotifier = new DeathNotifier(this);
   1584     IInterface::asBinder(mAudioTrack)->linkToDeath(mDeathNotifier, this);
   1585 
   1586     if (mDeviceCallback != 0) {
   1587         AudioSystem::addAudioDeviceCallback(mDeviceCallback, mOutput);
   1588     }
   1589 
   1590     return NO_ERROR;
   1591     }
   1592 
   1593 release:
   1594     AudioSystem::releaseOutput(output, streamType, mSessionId);
   1595     if (status == NO_ERROR) {
   1596         status = NO_INIT;
   1597     }
   1598     return status;
   1599 }
   1600 
   1601 status_t AudioTrack::obtainBuffer(Buffer* audioBuffer, int32_t waitCount, size_t *nonContig)
   1602 {
   1603     if (audioBuffer == NULL) {
   1604         if (nonContig != NULL) {
   1605             *nonContig = 0;
   1606         }
   1607         return BAD_VALUE;
   1608     }
   1609     if (mTransfer != TRANSFER_OBTAIN) {
   1610         audioBuffer->frameCount = 0;
   1611         audioBuffer->size = 0;
   1612         audioBuffer->raw = NULL;
   1613         if (nonContig != NULL) {
   1614             *nonContig = 0;
   1615         }
   1616         return INVALID_OPERATION;
   1617     }
   1618 
   1619     const struct timespec *requested;
   1620     struct timespec timeout;
   1621     if (waitCount == -1) {
   1622         requested = &ClientProxy::kForever;
   1623     } else if (waitCount == 0) {
   1624         requested = &ClientProxy::kNonBlocking;
   1625     } else if (waitCount > 0) {
   1626         long long ms = WAIT_PERIOD_MS * (long long) waitCount;
   1627         timeout.tv_sec = ms / 1000;
   1628         timeout.tv_nsec = (int) (ms % 1000) * 1000000;
   1629         requested = &timeout;
   1630     } else {
   1631         ALOGE("%s invalid waitCount %d", __func__, waitCount);
   1632         requested = NULL;
   1633     }
   1634     return obtainBuffer(audioBuffer, requested, NULL /*elapsed*/, nonContig);
   1635 }
   1636 
   1637 status_t AudioTrack::obtainBuffer(Buffer* audioBuffer, const struct timespec *requested,
   1638         struct timespec *elapsed, size_t *nonContig)
   1639 {
   1640     // previous and new IAudioTrack sequence numbers are used to detect track re-creation
   1641     uint32_t oldSequence = 0;
   1642     uint32_t newSequence;
   1643 
   1644     Proxy::Buffer buffer;
   1645     status_t status = NO_ERROR;
   1646 
   1647     static const int32_t kMaxTries = 5;
   1648     int32_t tryCounter = kMaxTries;
   1649 
   1650     do {
   1651         // obtainBuffer() is called with mutex unlocked, so keep extra references to these fields to
   1652         // keep them from going away if another thread re-creates the track during obtainBuffer()
   1653         sp<AudioTrackClientProxy> proxy;
   1654         sp<IMemory> iMem;
   1655 
   1656         {   // start of lock scope
   1657             AutoMutex lock(mLock);
   1658 
   1659             newSequence = mSequence;
   1660             // did previous obtainBuffer() fail due to media server death or voluntary invalidation?
   1661             if (status == DEAD_OBJECT) {
   1662                 // re-create track, unless someone else has already done so
   1663                 if (newSequence == oldSequence) {
   1664                     status = restoreTrack_l("obtainBuffer");
   1665                     if (status != NO_ERROR) {
   1666                         buffer.mFrameCount = 0;
   1667                         buffer.mRaw = NULL;
   1668                         buffer.mNonContig = 0;
   1669                         break;
   1670                     }
   1671                 }
   1672             }
   1673             oldSequence = newSequence;
   1674 
   1675             if (status == NOT_ENOUGH_DATA) {
   1676                 restartIfDisabled();
   1677             }
   1678 
   1679             // Keep the extra references
   1680             proxy = mProxy;
   1681             iMem = mCblkMemory;
   1682 
   1683             if (mState == STATE_STOPPING) {
   1684                 status = -EINTR;
   1685                 buffer.mFrameCount = 0;
   1686                 buffer.mRaw = NULL;
   1687                 buffer.mNonContig = 0;
   1688                 break;
   1689             }
   1690 
   1691             // Non-blocking if track is stopped or paused
   1692             if (mState != STATE_ACTIVE) {
   1693                 requested = &ClientProxy::kNonBlocking;
   1694             }
   1695 
   1696         }   // end of lock scope
   1697 
   1698         buffer.mFrameCount = audioBuffer->frameCount;
   1699         // FIXME starts the requested timeout and elapsed over from scratch
   1700         status = proxy->obtainBuffer(&buffer, requested, elapsed);
   1701     } while (((status == DEAD_OBJECT) || (status == NOT_ENOUGH_DATA)) && (tryCounter-- > 0));
   1702 
   1703     audioBuffer->frameCount = buffer.mFrameCount;
   1704     audioBuffer->size = buffer.mFrameCount * mFrameSize;
   1705     audioBuffer->raw = buffer.mRaw;
   1706     if (nonContig != NULL) {
   1707         *nonContig = buffer.mNonContig;
   1708     }
   1709     return status;
   1710 }
   1711 
   1712 void AudioTrack::releaseBuffer(const Buffer* audioBuffer)
   1713 {
   1714     // FIXME add error checking on mode, by adding an internal version
   1715     if (mTransfer == TRANSFER_SHARED) {
   1716         return;
   1717     }
   1718 
   1719     size_t stepCount = audioBuffer->size / mFrameSize;
   1720     if (stepCount == 0) {
   1721         return;
   1722     }
   1723 
   1724     Proxy::Buffer buffer;
   1725     buffer.mFrameCount = stepCount;
   1726     buffer.mRaw = audioBuffer->raw;
   1727 
   1728     AutoMutex lock(mLock);
   1729     mReleased += stepCount;
   1730     mInUnderrun = false;
   1731     mProxy->releaseBuffer(&buffer);
   1732 
   1733     // restart track if it was disabled by audioflinger due to previous underrun
   1734     restartIfDisabled();
   1735 }
   1736 
   1737 void AudioTrack::restartIfDisabled()
   1738 {
   1739     int32_t flags = android_atomic_and(~CBLK_DISABLED, &mCblk->mFlags);
   1740     if ((mState == STATE_ACTIVE) && (flags & CBLK_DISABLED)) {
   1741         ALOGW("releaseBuffer() track %p disabled due to previous underrun, restarting", this);
   1742         // FIXME ignoring status
   1743         mAudioTrack->start();
   1744     }
   1745 }
   1746 
   1747 // -------------------------------------------------------------------------
   1748 
   1749 ssize_t AudioTrack::write(const void* buffer, size_t userSize, bool blocking)
   1750 {
   1751     if (mTransfer != TRANSFER_SYNC) {
   1752         return INVALID_OPERATION;
   1753     }
   1754 
   1755     if (isDirect()) {
   1756         AutoMutex lock(mLock);
   1757         int32_t flags = android_atomic_and(
   1758                             ~(CBLK_UNDERRUN | CBLK_LOOP_CYCLE | CBLK_LOOP_FINAL | CBLK_BUFFER_END),
   1759                             &mCblk->mFlags);
   1760         if (flags & CBLK_INVALID) {
   1761             return DEAD_OBJECT;
   1762         }
   1763     }
   1764 
   1765     if (ssize_t(userSize) < 0 || (buffer == NULL && userSize != 0)) {
   1766         // Sanity-check: user is most-likely passing an error code, and it would
   1767         // make the return value ambiguous (actualSize vs error).
   1768         ALOGE("AudioTrack::write(buffer=%p, size=%zu (%zd)", buffer, userSize, userSize);
   1769         return BAD_VALUE;
   1770     }
   1771 
   1772     size_t written = 0;
   1773     Buffer audioBuffer;
   1774 
   1775     while (userSize >= mFrameSize) {
   1776         audioBuffer.frameCount = userSize / mFrameSize;
   1777 
   1778         status_t err = obtainBuffer(&audioBuffer,
   1779                 blocking ? &ClientProxy::kForever : &ClientProxy::kNonBlocking);
   1780         if (err < 0) {
   1781             if (written > 0) {
   1782                 break;
   1783             }
   1784             if (err == TIMED_OUT || err == -EINTR) {
   1785                 err = WOULD_BLOCK;
   1786             }
   1787             return ssize_t(err);
   1788         }
   1789 
   1790         size_t toWrite = audioBuffer.size;
   1791         memcpy(audioBuffer.i8, buffer, toWrite);
   1792         buffer = ((const char *) buffer) + toWrite;
   1793         userSize -= toWrite;
   1794         written += toWrite;
   1795 
   1796         releaseBuffer(&audioBuffer);
   1797     }
   1798 
   1799     if (written > 0) {
   1800         mFramesWritten += written / mFrameSize;
   1801     }
   1802     return written;
   1803 }
   1804 
   1805 // -------------------------------------------------------------------------
   1806 
   1807 nsecs_t AudioTrack::processAudioBuffer()
   1808 {
   1809     // Currently the AudioTrack thread is not created if there are no callbacks.
   1810     // Would it ever make sense to run the thread, even without callbacks?
   1811     // If so, then replace this by checks at each use for mCbf != NULL.
   1812     LOG_ALWAYS_FATAL_IF(mCblk == NULL);
   1813 
   1814     mLock.lock();
   1815     if (mAwaitBoost) {
   1816         mAwaitBoost = false;
   1817         mLock.unlock();
   1818         static const int32_t kMaxTries = 5;
   1819         int32_t tryCounter = kMaxTries;
   1820         uint32_t pollUs = 10000;
   1821         do {
   1822             int policy = sched_getscheduler(0) & ~SCHED_RESET_ON_FORK;
   1823             if (policy == SCHED_FIFO || policy == SCHED_RR) {
   1824                 break;
   1825             }
   1826             usleep(pollUs);
   1827             pollUs <<= 1;
   1828         } while (tryCounter-- > 0);
   1829         if (tryCounter < 0) {
   1830             ALOGE("did not receive expected priority boost on time");
   1831         }
   1832         // Run again immediately
   1833         return 0;
   1834     }
   1835 
   1836     // Can only reference mCblk while locked
   1837     int32_t flags = android_atomic_and(
   1838         ~(CBLK_UNDERRUN | CBLK_LOOP_CYCLE | CBLK_LOOP_FINAL | CBLK_BUFFER_END), &mCblk->mFlags);
   1839 
   1840     // Check for track invalidation
   1841     if (flags & CBLK_INVALID) {
   1842         // for offloaded tracks restoreTrack_l() will just update the sequence and clear
   1843         // AudioSystem cache. We should not exit here but after calling the callback so
   1844         // that the upper layers can recreate the track
   1845         if (!isOffloadedOrDirect_l() || (mSequence == mObservedSequence)) {
   1846             status_t status __unused = restoreTrack_l("processAudioBuffer");
   1847             // FIXME unused status
   1848             // after restoration, continue below to make sure that the loop and buffer events
   1849             // are notified because they have been cleared from mCblk->mFlags above.
   1850         }
   1851     }
   1852 
   1853     bool waitStreamEnd = mState == STATE_STOPPING;
   1854     bool active = mState == STATE_ACTIVE;
   1855 
   1856     // Manage underrun callback, must be done under lock to avoid race with releaseBuffer()
   1857     bool newUnderrun = false;
   1858     if (flags & CBLK_UNDERRUN) {
   1859 #if 0
   1860         // Currently in shared buffer mode, when the server reaches the end of buffer,
   1861         // the track stays active in continuous underrun state.  It's up to the application
   1862         // to pause or stop the track, or set the position to a new offset within buffer.
   1863         // This was some experimental code to auto-pause on underrun.   Keeping it here
   1864         // in "if 0" so we can re-visit this if we add a real sequencer for shared memory content.
   1865         if (mTransfer == TRANSFER_SHARED) {
   1866             mState = STATE_PAUSED;
   1867             active = false;
   1868         }
   1869 #endif
   1870         if (!mInUnderrun) {
   1871             mInUnderrun = true;
   1872             newUnderrun = true;
   1873         }
   1874     }
   1875 
   1876     // Get current position of server
   1877     Modulo<uint32_t> position(updateAndGetPosition_l());
   1878 
   1879     // Manage marker callback
   1880     bool markerReached = false;
   1881     Modulo<uint32_t> markerPosition(mMarkerPosition);
   1882     // uses 32 bit wraparound for comparison with position.
   1883     if (!mMarkerReached && markerPosition.value() > 0 && position >= markerPosition) {
   1884         mMarkerReached = markerReached = true;
   1885     }
   1886 
   1887     // Determine number of new position callback(s) that will be needed, while locked
   1888     size_t newPosCount = 0;
   1889     Modulo<uint32_t> newPosition(mNewPosition);
   1890     uint32_t updatePeriod = mUpdatePeriod;
   1891     // FIXME fails for wraparound, need 64 bits
   1892     if (updatePeriod > 0 && position >= newPosition) {
   1893         newPosCount = ((position - newPosition).value() / updatePeriod) + 1;
   1894         mNewPosition += updatePeriod * newPosCount;
   1895     }
   1896 
   1897     // Cache other fields that will be needed soon
   1898     uint32_t sampleRate = mSampleRate;
   1899     float speed = mPlaybackRate.mSpeed;
   1900     const uint32_t notificationFrames = mNotificationFramesAct;
   1901     if (mRefreshRemaining) {
   1902         mRefreshRemaining = false;
   1903         mRemainingFrames = notificationFrames;
   1904         mRetryOnPartialBuffer = false;
   1905     }
   1906     size_t misalignment = mProxy->getMisalignment();
   1907     uint32_t sequence = mSequence;
   1908     sp<AudioTrackClientProxy> proxy = mProxy;
   1909 
   1910     // Determine the number of new loop callback(s) that will be needed, while locked.
   1911     int loopCountNotifications = 0;
   1912     uint32_t loopPeriod = 0; // time in frames for next EVENT_LOOP_END or EVENT_BUFFER_END
   1913 
   1914     if (mLoopCount > 0) {
   1915         int loopCount;
   1916         size_t bufferPosition;
   1917         mStaticProxy->getBufferPositionAndLoopCount(&bufferPosition, &loopCount);
   1918         loopPeriod = ((loopCount > 0) ? mLoopEnd : mFrameCount) - bufferPosition;
   1919         loopCountNotifications = min(mLoopCountNotified - loopCount, kMaxLoopCountNotifications);
   1920         mLoopCountNotified = loopCount; // discard any excess notifications
   1921     } else if (mLoopCount < 0) {
   1922         // FIXME: We're not accurate with notification count and position with infinite looping
   1923         // since loopCount from server side will always return -1 (we could decrement it).
   1924         size_t bufferPosition = mStaticProxy->getBufferPosition();
   1925         loopCountNotifications = int((flags & (CBLK_LOOP_CYCLE | CBLK_LOOP_FINAL)) != 0);
   1926         loopPeriod = mLoopEnd - bufferPosition;
   1927     } else if (/* mLoopCount == 0 && */ mSharedBuffer != 0) {
   1928         size_t bufferPosition = mStaticProxy->getBufferPosition();
   1929         loopPeriod = mFrameCount - bufferPosition;
   1930     }
   1931 
   1932     // These fields don't need to be cached, because they are assigned only by set():
   1933     //     mTransfer, mCbf, mUserData, mFormat, mFrameSize, mFlags
   1934     // mFlags is also assigned by createTrack_l(), but not the bit we care about.
   1935 
   1936     mLock.unlock();
   1937 
   1938     // get anchor time to account for callbacks.
   1939     const nsecs_t timeBeforeCallbacks = systemTime();
   1940 
   1941     if (waitStreamEnd) {
   1942         // FIXME:  Instead of blocking in proxy->waitStreamEndDone(), Callback thread
   1943         // should wait on proxy futex and handle CBLK_STREAM_END_DONE within this function
   1944         // (and make sure we don't callback for more data while we're stopping).
   1945         // This helps with position, marker notifications, and track invalidation.
   1946         struct timespec timeout;
   1947         timeout.tv_sec = WAIT_STREAM_END_TIMEOUT_SEC;
   1948         timeout.tv_nsec = 0;
   1949 
   1950         status_t status = proxy->waitStreamEndDone(&timeout);
   1951         switch (status) {
   1952         case NO_ERROR:
   1953         case DEAD_OBJECT:
   1954         case TIMED_OUT:
   1955             if (status != DEAD_OBJECT) {
   1956                 // for DEAD_OBJECT, we do not send a EVENT_STREAM_END after stop();
   1957                 // instead, the application should handle the EVENT_NEW_IAUDIOTRACK.
   1958                 mCbf(EVENT_STREAM_END, mUserData, NULL);
   1959             }
   1960             {
   1961                 AutoMutex lock(mLock);
   1962                 // The previously assigned value of waitStreamEnd is no longer valid,
   1963                 // since the mutex has been unlocked and either the callback handler
   1964                 // or another thread could have re-started the AudioTrack during that time.
   1965                 waitStreamEnd = mState == STATE_STOPPING;
   1966                 if (waitStreamEnd) {
   1967                     mState = STATE_STOPPED;
   1968                     mReleased = 0;
   1969                 }
   1970             }
   1971             if (waitStreamEnd && status != DEAD_OBJECT) {
   1972                return NS_INACTIVE;
   1973             }
   1974             break;
   1975         }
   1976         return 0;
   1977     }
   1978 
   1979     // perform callbacks while unlocked
   1980     if (newUnderrun) {
   1981         mCbf(EVENT_UNDERRUN, mUserData, NULL);
   1982     }
   1983     while (loopCountNotifications > 0) {
   1984         mCbf(EVENT_LOOP_END, mUserData, NULL);
   1985         --loopCountNotifications;
   1986     }
   1987     if (flags & CBLK_BUFFER_END) {
   1988         mCbf(EVENT_BUFFER_END, mUserData, NULL);
   1989     }
   1990     if (markerReached) {
   1991         mCbf(EVENT_MARKER, mUserData, &markerPosition);
   1992     }
   1993     while (newPosCount > 0) {
   1994         size_t temp = newPosition.value(); // FIXME size_t != uint32_t
   1995         mCbf(EVENT_NEW_POS, mUserData, &temp);
   1996         newPosition += updatePeriod;
   1997         newPosCount--;
   1998     }
   1999 
   2000     if (mObservedSequence != sequence) {
   2001         mObservedSequence = sequence;
   2002         mCbf(EVENT_NEW_IAUDIOTRACK, mUserData, NULL);
   2003         // for offloaded tracks, just wait for the upper layers to recreate the track
   2004         if (isOffloadedOrDirect()) {
   2005             return NS_INACTIVE;
   2006         }
   2007     }
   2008 
   2009     // if inactive, then don't run me again until re-started
   2010     if (!active) {
   2011         return NS_INACTIVE;
   2012     }
   2013 
   2014     // Compute the estimated time until the next timed event (position, markers, loops)
   2015     // FIXME only for non-compressed audio
   2016     uint32_t minFrames = ~0;
   2017     if (!markerReached && position < markerPosition) {
   2018         minFrames = (markerPosition - position).value();
   2019     }
   2020     if (loopPeriod > 0 && loopPeriod < minFrames) {
   2021         // loopPeriod is already adjusted for actual position.
   2022         minFrames = loopPeriod;
   2023     }
   2024     if (updatePeriod > 0) {
   2025         minFrames = min(minFrames, (newPosition - position).value());
   2026     }
   2027 
   2028     // If > 0, poll periodically to recover from a stuck server.  A good value is 2.
   2029     static const uint32_t kPoll = 0;
   2030     if (kPoll > 0 && mTransfer == TRANSFER_CALLBACK && kPoll * notificationFrames < minFrames) {
   2031         minFrames = kPoll * notificationFrames;
   2032     }
   2033 
   2034     // This "fudge factor" avoids soaking CPU, and compensates for late progress by server
   2035     static const nsecs_t kWaitPeriodNs = WAIT_PERIOD_MS * 1000000LL;
   2036     const nsecs_t timeAfterCallbacks = systemTime();
   2037 
   2038     // Convert frame units to time units
   2039     nsecs_t ns = NS_WHENEVER;
   2040     if (minFrames != (uint32_t) ~0) {
   2041         ns = framesToNanoseconds(minFrames, sampleRate, speed) + kWaitPeriodNs;
   2042         ns -= (timeAfterCallbacks - timeBeforeCallbacks);  // account for callback time
   2043         // TODO: Should we warn if the callback time is too long?
   2044         if (ns < 0) ns = 0;
   2045     }
   2046 
   2047     // If not supplying data by EVENT_MORE_DATA, then we're done
   2048     if (mTransfer != TRANSFER_CALLBACK) {
   2049         return ns;
   2050     }
   2051 
   2052     // EVENT_MORE_DATA callback handling.
   2053     // Timing for linear pcm audio data formats can be derived directly from the
   2054     // buffer fill level.
   2055     // Timing for compressed data is not directly available from the buffer fill level,
   2056     // rather indirectly from waiting for blocking mode callbacks or waiting for obtain()
   2057     // to return a certain fill level.
   2058 
   2059     struct timespec timeout;
   2060     const struct timespec *requested = &ClientProxy::kForever;
   2061     if (ns != NS_WHENEVER) {
   2062         timeout.tv_sec = ns / 1000000000LL;
   2063         timeout.tv_nsec = ns % 1000000000LL;
   2064         ALOGV("timeout %ld.%03d", timeout.tv_sec, (int) timeout.tv_nsec / 1000000);
   2065         requested = &timeout;
   2066     }
   2067 
   2068     size_t writtenFrames = 0;
   2069     while (mRemainingFrames > 0) {
   2070 
   2071         Buffer audioBuffer;
   2072         audioBuffer.frameCount = mRemainingFrames;
   2073         size_t nonContig;
   2074         status_t err = obtainBuffer(&audioBuffer, requested, NULL, &nonContig);
   2075         LOG_ALWAYS_FATAL_IF((err != NO_ERROR) != (audioBuffer.frameCount == 0),
   2076                 "obtainBuffer() err=%d frameCount=%zu", err, audioBuffer.frameCount);
   2077         requested = &ClientProxy::kNonBlocking;
   2078         size_t avail = audioBuffer.frameCount + nonContig;
   2079         ALOGV("obtainBuffer(%u) returned %zu = %zu + %zu err %d",
   2080                 mRemainingFrames, avail, audioBuffer.frameCount, nonContig, err);
   2081         if (err != NO_ERROR) {
   2082             if (err == TIMED_OUT || err == WOULD_BLOCK || err == -EINTR ||
   2083                     (isOffloaded() && (err == DEAD_OBJECT))) {
   2084                 // FIXME bug 25195759
   2085                 return 1000000;
   2086             }
   2087             ALOGE("Error %d obtaining an audio buffer, giving up.", err);
   2088             return NS_NEVER;
   2089         }
   2090 
   2091         if (mRetryOnPartialBuffer && audio_has_proportional_frames(mFormat)) {
   2092             mRetryOnPartialBuffer = false;
   2093             if (avail < mRemainingFrames) {
   2094                 if (ns > 0) { // account for obtain time
   2095                     const nsecs_t timeNow = systemTime();
   2096                     ns = max((nsecs_t)0, ns - (timeNow - timeAfterCallbacks));
   2097                 }
   2098                 nsecs_t myns = framesToNanoseconds(mRemainingFrames - avail, sampleRate, speed);
   2099                 if (ns < 0 /* NS_WHENEVER */ || myns < ns) {
   2100                     ns = myns;
   2101                 }
   2102                 return ns;
   2103             }
   2104         }
   2105 
   2106         size_t reqSize = audioBuffer.size;
   2107         mCbf(EVENT_MORE_DATA, mUserData, &audioBuffer);
   2108         size_t writtenSize = audioBuffer.size;
   2109 
   2110         // Sanity check on returned size
   2111         if (ssize_t(writtenSize) < 0 || writtenSize > reqSize) {
   2112             ALOGE("EVENT_MORE_DATA requested %zu bytes but callback returned %zd bytes",
   2113                     reqSize, ssize_t(writtenSize));
   2114             return NS_NEVER;
   2115         }
   2116 
   2117         if (writtenSize == 0) {
   2118             // The callback is done filling buffers
   2119             // Keep this thread going to handle timed events and
   2120             // still try to get more data in intervals of WAIT_PERIOD_MS
   2121             // but don't just loop and block the CPU, so wait
   2122 
   2123             // mCbf(EVENT_MORE_DATA, ...) might either
   2124             // (1) Block until it can fill the buffer, returning 0 size on EOS.
   2125             // (2) Block until it can fill the buffer, returning 0 data (silence) on EOS.
   2126             // (3) Return 0 size when no data is available, does not wait for more data.
   2127             //
   2128             // (1) and (2) occurs with AudioPlayer/AwesomePlayer; (3) occurs with NuPlayer.
   2129             // We try to compute the wait time to avoid a tight sleep-wait cycle,
   2130             // especially for case (3).
   2131             //
   2132             // The decision to support (1) and (2) affect the sizing of mRemainingFrames
   2133             // and this loop; whereas for case (3) we could simply check once with the full
   2134             // buffer size and skip the loop entirely.
   2135 
   2136             nsecs_t myns;
   2137             if (audio_has_proportional_frames(mFormat)) {
   2138                 // time to wait based on buffer occupancy
   2139                 const nsecs_t datans = mRemainingFrames <= avail ? 0 :
   2140                         framesToNanoseconds(mRemainingFrames - avail, sampleRate, speed);
   2141                 // audio flinger thread buffer size (TODO: adjust for fast tracks)
   2142                 // FIXME: use mAfFrameCountHAL instead of mAfFrameCount below for fast tracks.
   2143                 const nsecs_t afns = framesToNanoseconds(mAfFrameCount, mAfSampleRate, speed);
   2144                 // add a half the AudioFlinger buffer time to avoid soaking CPU if datans is 0.
   2145                 myns = datans + (afns / 2);
   2146             } else {
   2147                 // FIXME: This could ping quite a bit if the buffer isn't full.
   2148                 // Note that when mState is stopping we waitStreamEnd, so it never gets here.
   2149                 myns = kWaitPeriodNs;
   2150             }
   2151             if (ns > 0) { // account for obtain and callback time
   2152                 const nsecs_t timeNow = systemTime();
   2153                 ns = max((nsecs_t)0, ns - (timeNow - timeAfterCallbacks));
   2154             }
   2155             if (ns < 0 /* NS_WHENEVER */ || myns < ns) {
   2156                 ns = myns;
   2157             }
   2158             return ns;
   2159         }
   2160 
   2161         size_t releasedFrames = writtenSize / mFrameSize;
   2162         audioBuffer.frameCount = releasedFrames;
   2163         mRemainingFrames -= releasedFrames;
   2164         if (misalignment >= releasedFrames) {
   2165             misalignment -= releasedFrames;
   2166         } else {
   2167             misalignment = 0;
   2168         }
   2169 
   2170         releaseBuffer(&audioBuffer);
   2171         writtenFrames += releasedFrames;
   2172 
   2173         // FIXME here is where we would repeat EVENT_MORE_DATA again on same advanced buffer
   2174         // if callback doesn't like to accept the full chunk
   2175         if (writtenSize < reqSize) {
   2176             continue;
   2177         }
   2178 
   2179         // There could be enough non-contiguous frames available to satisfy the remaining request
   2180         if (mRemainingFrames <= nonContig) {
   2181             continue;
   2182         }
   2183 
   2184 #if 0
   2185         // This heuristic tries to collapse a series of EVENT_MORE_DATA that would total to a
   2186         // sum <= notificationFrames.  It replaces that series by at most two EVENT_MORE_DATA
   2187         // that total to a sum == notificationFrames.
   2188         if (0 < misalignment && misalignment <= mRemainingFrames) {
   2189             mRemainingFrames = misalignment;
   2190             return ((double)mRemainingFrames * 1100000000) / ((double)sampleRate * speed);
   2191         }
   2192 #endif
   2193 
   2194     }
   2195     if (writtenFrames > 0) {
   2196         AutoMutex lock(mLock);
   2197         mFramesWritten += writtenFrames;
   2198     }
   2199     mRemainingFrames = notificationFrames;
   2200     mRetryOnPartialBuffer = true;
   2201 
   2202     // A lot has transpired since ns was calculated, so run again immediately and re-calculate
   2203     return 0;
   2204 }
   2205 
   2206 status_t AudioTrack::restoreTrack_l(const char *from)
   2207 {
   2208     ALOGW("dead IAudioTrack, %s, creating a new one from %s()",
   2209           isOffloadedOrDirect_l() ? "Offloaded or Direct" : "PCM", from);
   2210     ++mSequence;
   2211 
   2212     // refresh the audio configuration cache in this process to make sure we get new
   2213     // output parameters and new IAudioFlinger in createTrack_l()
   2214     AudioSystem::clearAudioConfigCache();
   2215 
   2216     if (isOffloadedOrDirect_l() || mDoNotReconnect) {
   2217         // FIXME re-creation of offloaded and direct tracks is not yet implemented;
   2218         // reconsider enabling for linear PCM encodings when position can be preserved.
   2219         return DEAD_OBJECT;
   2220     }
   2221 
   2222     // Save so we can return count since creation.
   2223     mUnderrunCountOffset = getUnderrunCount_l();
   2224 
   2225     // save the old static buffer position
   2226     uint32_t staticPosition = 0;
   2227     size_t bufferPosition = 0;
   2228     int loopCount = 0;
   2229     if (mStaticProxy != 0) {
   2230         mStaticProxy->getBufferPositionAndLoopCount(&bufferPosition, &loopCount);
   2231         staticPosition = mStaticProxy->getPosition().unsignedValue();
   2232     }
   2233 
   2234     mFlags = mOrigFlags;
   2235 
   2236     // If a new IAudioTrack is successfully created, createTrack_l() will modify the
   2237     // following member variables: mAudioTrack, mCblkMemory and mCblk.
   2238     // It will also delete the strong references on previous IAudioTrack and IMemory.
   2239     // If a new IAudioTrack cannot be created, the previous (dead) instance will be left intact.
   2240     status_t result = createTrack_l();
   2241 
   2242     if (result == NO_ERROR) {
   2243         // take the frames that will be lost by track recreation into account in saved position
   2244         // For streaming tracks, this is the amount we obtained from the user/client
   2245         // (not the number actually consumed at the server - those are already lost).
   2246         if (mStaticProxy == 0) {
   2247             mPosition = mReleased;
   2248         }
   2249         // Continue playback from last known position and restore loop.
   2250         if (mStaticProxy != 0) {
   2251             if (loopCount != 0) {
   2252                 mStaticProxy->setBufferPositionAndLoop(bufferPosition,
   2253                         mLoopStart, mLoopEnd, loopCount);
   2254             } else {
   2255                 mStaticProxy->setBufferPosition(bufferPosition);
   2256                 if (bufferPosition == mFrameCount) {
   2257                     ALOGD("restoring track at end of static buffer");
   2258                 }
   2259             }
   2260         }
   2261         // restore volume handler
   2262         mVolumeHandler->forall([this](const VolumeShaper &shaper) -> VolumeShaper::Status {
   2263             sp<VolumeShaper::Operation> operationToEnd =
   2264                     new VolumeShaper::Operation(shaper.mOperation);
   2265             // TODO: Ideally we would restore to the exact xOffset position
   2266             // as returned by getVolumeShaperState(), but we don't have that
   2267             // information when restoring at the client unless we periodically poll
   2268             // the server or create shared memory state.
   2269             //
   2270             // For now, we simply advance to the end of the VolumeShaper effect
   2271             // if it has been started.
   2272             if (shaper.isStarted()) {
   2273                 operationToEnd->setNormalizedTime(1.f);
   2274             }
   2275             return mAudioTrack->applyVolumeShaper(shaper.mConfiguration, operationToEnd);
   2276         });
   2277 
   2278         if (mState == STATE_ACTIVE) {
   2279             result = mAudioTrack->start();
   2280         }
   2281         // server resets to zero so we offset
   2282         mFramesWrittenServerOffset =
   2283                 mStaticProxy.get() != nullptr ? staticPosition : mFramesWritten;
   2284         mFramesWrittenAtRestore = mFramesWrittenServerOffset;
   2285     }
   2286     if (result != NO_ERROR) {
   2287         ALOGW("restoreTrack_l() failed status %d", result);
   2288         mState = STATE_STOPPED;
   2289         mReleased = 0;
   2290     }
   2291 
   2292     return result;
   2293 }
   2294 
   2295 Modulo<uint32_t> AudioTrack::updateAndGetPosition_l()
   2296 {
   2297     // This is the sole place to read server consumed frames
   2298     Modulo<uint32_t> newServer(mProxy->getPosition());
   2299     const int32_t delta = (newServer - mServer).signedValue();
   2300     // TODO There is controversy about whether there can be "negative jitter" in server position.
   2301     //      This should be investigated further, and if possible, it should be addressed.
   2302     //      A more definite failure mode is infrequent polling by client.
   2303     //      One could call (void)getPosition_l() in releaseBuffer(),
   2304     //      so mReleased and mPosition are always lock-step as best possible.
   2305     //      That should ensure delta never goes negative for infrequent polling
   2306     //      unless the server has more than 2^31 frames in its buffer,
   2307     //      in which case the use of uint32_t for these counters has bigger issues.
   2308     ALOGE_IF(delta < 0,
   2309             "detected illegal retrograde motion by the server: mServer advanced by %d",
   2310             delta);
   2311     mServer = newServer;
   2312     if (delta > 0) { // avoid retrograde
   2313         mPosition += delta;
   2314     }
   2315     return mPosition;
   2316 }
   2317 
   2318 bool AudioTrack::isSampleRateSpeedAllowed_l(uint32_t sampleRate, float speed) const
   2319 {
   2320     // applicable for mixing tracks only (not offloaded or direct)
   2321     if (mStaticProxy != 0) {
   2322         return true; // static tracks do not have issues with buffer sizing.
   2323     }
   2324     const size_t minFrameCount =
   2325             calculateMinFrameCount(mAfLatency, mAfFrameCount, mAfSampleRate, sampleRate, speed
   2326                 /*, 0 mNotificationsPerBufferReq*/);
   2327     ALOGV("isSampleRateSpeedAllowed_l mFrameCount %zu  minFrameCount %zu",
   2328             mFrameCount, minFrameCount);
   2329     return mFrameCount >= minFrameCount;
   2330 }
   2331 
   2332 status_t AudioTrack::setParameters(const String8& keyValuePairs)
   2333 {
   2334     AutoMutex lock(mLock);
   2335     return mAudioTrack->setParameters(keyValuePairs);
   2336 }
   2337 
   2338 VolumeShaper::Status AudioTrack::applyVolumeShaper(
   2339         const sp<VolumeShaper::Configuration>& configuration,
   2340         const sp<VolumeShaper::Operation>& operation)
   2341 {
   2342     AutoMutex lock(mLock);
   2343     mVolumeHandler->setIdIfNecessary(configuration);
   2344     VolumeShaper::Status status = mAudioTrack->applyVolumeShaper(configuration, operation);
   2345 
   2346     if (status == DEAD_OBJECT) {
   2347         if (restoreTrack_l("applyVolumeShaper") == OK) {
   2348             status = mAudioTrack->applyVolumeShaper(configuration, operation);
   2349         }
   2350     }
   2351     if (status >= 0) {
   2352         // save VolumeShaper for restore
   2353         mVolumeHandler->applyVolumeShaper(configuration, operation);
   2354         if (mState == STATE_ACTIVE || mState == STATE_STOPPING) {
   2355             mVolumeHandler->setStarted();
   2356         }
   2357     } else {
   2358         // warn only if not an expected restore failure.
   2359         ALOGW_IF(!((isOffloadedOrDirect_l() || mDoNotReconnect) && status == DEAD_OBJECT),
   2360                 "applyVolumeShaper failed: %d", status);
   2361     }
   2362     return status;
   2363 }
   2364 
   2365 sp<VolumeShaper::State> AudioTrack::getVolumeShaperState(int id)
   2366 {
   2367     AutoMutex lock(mLock);
   2368     sp<VolumeShaper::State> state = mAudioTrack->getVolumeShaperState(id);
   2369     if (state.get() == nullptr && (mCblk->mFlags & CBLK_INVALID) != 0) {
   2370         if (restoreTrack_l("getVolumeShaperState") == OK) {
   2371             state = mAudioTrack->getVolumeShaperState(id);
   2372         }
   2373     }
   2374     return state;
   2375 }
   2376 
   2377 status_t AudioTrack::getTimestamp(ExtendedTimestamp *timestamp)
   2378 {
   2379     if (timestamp == nullptr) {
   2380         return BAD_VALUE;
   2381     }
   2382     AutoMutex lock(mLock);
   2383     return getTimestamp_l(timestamp);
   2384 }
   2385 
   2386 status_t AudioTrack::getTimestamp_l(ExtendedTimestamp *timestamp)
   2387 {
   2388     if (mCblk->mFlags & CBLK_INVALID) {
   2389         const status_t status = restoreTrack_l("getTimestampExtended");
   2390         if (status != OK) {
   2391             // per getTimestamp() API doc in header, we return DEAD_OBJECT here,
   2392             // recommending that the track be recreated.
   2393             return DEAD_OBJECT;
   2394         }
   2395     }
   2396     // check for offloaded/direct here in case restoring somehow changed those flags.
   2397     if (isOffloadedOrDirect_l()) {
   2398         return INVALID_OPERATION; // not supported
   2399     }
   2400     status_t status = mProxy->getTimestamp(timestamp);
   2401     LOG_ALWAYS_FATAL_IF(status != OK, "status %d not allowed from proxy getTimestamp", status);
   2402     bool found = false;
   2403     timestamp->mPosition[ExtendedTimestamp::LOCATION_CLIENT] = mFramesWritten;
   2404     timestamp->mTimeNs[ExtendedTimestamp::LOCATION_CLIENT] = 0;
   2405     // server side frame offset in case AudioTrack has been restored.
   2406     for (int i = ExtendedTimestamp::LOCATION_SERVER;
   2407             i < ExtendedTimestamp::LOCATION_MAX; ++i) {
   2408         if (timestamp->mTimeNs[i] >= 0) {
   2409             // apply server offset (frames flushed is ignored
   2410             // so we don't report the jump when the flush occurs).
   2411             timestamp->mPosition[i] += mFramesWrittenServerOffset;
   2412             found = true;
   2413         }
   2414     }
   2415     return found ? OK : WOULD_BLOCK;
   2416 }
   2417 
   2418 status_t AudioTrack::getTimestamp(AudioTimestamp& timestamp)
   2419 {
   2420     AutoMutex lock(mLock);
   2421     return getTimestamp_l(timestamp);
   2422 }
   2423 
   2424 status_t AudioTrack::getTimestamp_l(AudioTimestamp& timestamp)
   2425 {
   2426     bool previousTimestampValid = mPreviousTimestampValid;
   2427     // Set false here to cover all the error return cases.
   2428     mPreviousTimestampValid = false;
   2429 
   2430     switch (mState) {
   2431     case STATE_ACTIVE:
   2432     case STATE_PAUSED:
   2433         break; // handle below
   2434     case STATE_FLUSHED:
   2435     case STATE_STOPPED:
   2436         return WOULD_BLOCK;
   2437     case STATE_STOPPING:
   2438     case STATE_PAUSED_STOPPING:
   2439         if (!isOffloaded_l()) {
   2440             return INVALID_OPERATION;
   2441         }
   2442         break; // offloaded tracks handled below
   2443     default:
   2444         LOG_ALWAYS_FATAL("Invalid mState in getTimestamp(): %d", mState);
   2445         break;
   2446     }
   2447 
   2448     if (mCblk->mFlags & CBLK_INVALID) {
   2449         const status_t status = restoreTrack_l("getTimestamp");
   2450         if (status != OK) {
   2451             // per getTimestamp() API doc in header, we return DEAD_OBJECT here,
   2452             // recommending that the track be recreated.
   2453             return DEAD_OBJECT;
   2454         }
   2455     }
   2456 
   2457     // The presented frame count must always lag behind the consumed frame count.
   2458     // To avoid a race, read the presented frames first.  This ensures that presented <= consumed.
   2459 
   2460     status_t status;
   2461     if (isOffloadedOrDirect_l()) {
   2462         // use Binder to get timestamp
   2463         status = mAudioTrack->getTimestamp(timestamp);
   2464     } else {
   2465         // read timestamp from shared memory
   2466         ExtendedTimestamp ets;
   2467         status = mProxy->getTimestamp(&ets);
   2468         if (status == OK) {
   2469             ExtendedTimestamp::Location location;
   2470             status = ets.getBestTimestamp(&timestamp, &location);
   2471 
   2472             if (status == OK) {
   2473                 // It is possible that the best location has moved from the kernel to the server.
   2474                 // In this case we adjust the position from the previous computed latency.
   2475                 if (location == ExtendedTimestamp::LOCATION_SERVER) {
   2476                     ALOGW_IF(mPreviousLocation == ExtendedTimestamp::LOCATION_KERNEL,
   2477                             "getTimestamp() location moved from kernel to server");
   2478                     // check that the last kernel OK time info exists and the positions
   2479                     // are valid (if they predate the current track, the positions may
   2480                     // be zero or negative).
   2481                     const int64_t frames =
   2482                             (ets.mTimeNs[ExtendedTimestamp::LOCATION_SERVER_LASTKERNELOK] < 0 ||
   2483                             ets.mTimeNs[ExtendedTimestamp::LOCATION_KERNEL_LASTKERNELOK] < 0 ||
   2484                             ets.mPosition[ExtendedTimestamp::LOCATION_SERVER_LASTKERNELOK] <= 0 ||
   2485                             ets.mPosition[ExtendedTimestamp::LOCATION_KERNEL_LASTKERNELOK] <= 0)
   2486                             ?
   2487                             int64_t((double)mAfLatency * mSampleRate * mPlaybackRate.mSpeed
   2488                                     / 1000)
   2489                             :
   2490                             (ets.mPosition[ExtendedTimestamp::LOCATION_SERVER_LASTKERNELOK]
   2491                             - ets.mPosition[ExtendedTimestamp::LOCATION_KERNEL_LASTKERNELOK]);
   2492                     ALOGV("frame adjustment:%lld  timestamp:%s",
   2493                             (long long)frames, ets.toString().c_str());
   2494                     if (frames >= ets.mPosition[location]) {
   2495                         timestamp.mPosition = 0;
   2496                     } else {
   2497                         timestamp.mPosition = (uint32_t)(ets.mPosition[location] - frames);
   2498                     }
   2499                 } else if (location == ExtendedTimestamp::LOCATION_KERNEL) {
   2500                     ALOGV_IF(mPreviousLocation == ExtendedTimestamp::LOCATION_SERVER,
   2501                             "getTimestamp() location moved from server to kernel");
   2502                 }
   2503 
   2504                 // We update the timestamp time even when paused.
   2505                 if (mState == STATE_PAUSED /* not needed: STATE_PAUSED_STOPPING */) {
   2506                     const int64_t now = systemTime();
   2507                     const int64_t at = convertTimespecToNs(timestamp.mTime);
   2508                     const int64_t lag =
   2509                             (ets.mTimeNs[ExtendedTimestamp::LOCATION_SERVER_LASTKERNELOK] < 0 ||
   2510                                 ets.mTimeNs[ExtendedTimestamp::LOCATION_KERNEL_LASTKERNELOK] < 0)
   2511                             ? int64_t(mAfLatency * 1000000LL)
   2512                             : (ets.mPosition[ExtendedTimestamp::LOCATION_SERVER_LASTKERNELOK]
   2513                              - ets.mPosition[ExtendedTimestamp::LOCATION_KERNEL_LASTKERNELOK])
   2514                              * NANOS_PER_SECOND / mSampleRate;
   2515                     const int64_t limit = now - lag; // no earlier than this limit
   2516                     if (at < limit) {
   2517                         ALOGV("timestamp pause lag:%lld adjusting from %lld to %lld",
   2518                                 (long long)lag, (long long)at, (long long)limit);
   2519                         timestamp.mTime.tv_sec = limit / NANOS_PER_SECOND;
   2520                         timestamp.mTime.tv_nsec = limit % NANOS_PER_SECOND; // compiler opt.
   2521                     }
   2522                 }
   2523                 mPreviousLocation = location;
   2524             } else {
   2525                 // right after AudioTrack is started, one may not find a timestamp
   2526                 ALOGV("getBestTimestamp did not find timestamp");
   2527             }
   2528         }
   2529         if (status == INVALID_OPERATION) {
   2530             // INVALID_OPERATION occurs when no timestamp has been issued by the server;
   2531             // other failures are signaled by a negative time.
   2532             // If we come out of FLUSHED or STOPPED where the position is known
   2533             // to be zero we convert this to WOULD_BLOCK (with the implicit meaning of
   2534             // "zero" for NuPlayer).  We don't convert for track restoration as position
   2535             // does not reset.
   2536             ALOGV("timestamp server offset:%lld restore frames:%lld",
   2537                     (long long)mFramesWrittenServerOffset, (long long)mFramesWrittenAtRestore);
   2538             if (mFramesWrittenServerOffset != mFramesWrittenAtRestore) {
   2539                 status = WOULD_BLOCK;
   2540             }
   2541         }
   2542     }
   2543     if (status != NO_ERROR) {
   2544         ALOGV_IF(status != WOULD_BLOCK, "getTimestamp error:%#x", status);
   2545         return status;
   2546     }
   2547     if (isOffloadedOrDirect_l()) {
   2548         if (isOffloaded_l() && (mState == STATE_PAUSED || mState == STATE_PAUSED_STOPPING)) {
   2549             // use cached paused position in case another offloaded track is running.
   2550             timestamp.mPosition = mPausedPosition;
   2551             clock_gettime(CLOCK_MONOTONIC, &timestamp.mTime);
   2552             // TODO: adjust for delay
   2553             return NO_ERROR;
   2554         }
   2555 
   2556         // Check whether a pending flush or stop has completed, as those commands may
   2557         // be asynchronous or return near finish or exhibit glitchy behavior.
   2558         //
   2559         // Originally this showed up as the first timestamp being a continuation of
   2560         // the previous song under gapless playback.
   2561         // However, we sometimes see zero timestamps, then a glitch of
   2562         // the previous song's position, and then correct timestamps afterwards.
   2563         if (mStartUs != 0 && mSampleRate != 0) {
   2564             static const int kTimeJitterUs = 100000; // 100 ms
   2565             static const int k1SecUs = 1000000;
   2566 
   2567             const int64_t timeNow = getNowUs();
   2568 
   2569             if (timeNow < mStartUs + k1SecUs) { // within first second of starting
   2570                 const int64_t timestampTimeUs = convertTimespecToUs(timestamp.mTime);
   2571                 if (timestampTimeUs < mStartUs) {
   2572                     return WOULD_BLOCK;  // stale timestamp time, occurs before start.
   2573                 }
   2574                 const int64_t deltaTimeUs = timestampTimeUs - mStartUs;
   2575                 const int64_t deltaPositionByUs = (double)timestamp.mPosition * 1000000
   2576                         / ((double)mSampleRate * mPlaybackRate.mSpeed);
   2577 
   2578                 if (deltaPositionByUs > deltaTimeUs + kTimeJitterUs) {
   2579                     // Verify that the counter can't count faster than the sample rate
   2580                     // since the start time.  If greater, then that means we may have failed
   2581                     // to completely flush or stop the previous playing track.
   2582                     ALOGW_IF(!mTimestampStartupGlitchReported,
   2583                             "getTimestamp startup glitch detected"
   2584                             " deltaTimeUs(%lld) deltaPositionUs(%lld) tsmPosition(%u)",
   2585                             (long long)deltaTimeUs, (long long)deltaPositionByUs,
   2586                             timestamp.mPosition);
   2587                     mTimestampStartupGlitchReported = true;
   2588                     if (previousTimestampValid
   2589                             && mPreviousTimestamp.mPosition == 0 /* should be true if valid */) {
   2590                         timestamp = mPreviousTimestamp;
   2591                         mPreviousTimestampValid = true;
   2592                         return NO_ERROR;
   2593                     }
   2594                     return WOULD_BLOCK;
   2595                 }
   2596                 if (deltaPositionByUs != 0) {
   2597                     mStartUs = 0; // don't check again, we got valid nonzero position.
   2598                 }
   2599             } else {
   2600                 mStartUs = 0; // don't check again, start time expired.
   2601             }
   2602             mTimestampStartupGlitchReported = false;
   2603         }
   2604     } else {
   2605         // Update the mapping between local consumed (mPosition) and server consumed (mServer)
   2606         (void) updateAndGetPosition_l();
   2607         // Server consumed (mServer) and presented both use the same server time base,
   2608         // and server consumed is always >= presented.
   2609         // The delta between these represents the number of frames in the buffer pipeline.
   2610         // If this delta between these is greater than the client position, it means that
   2611         // actually presented is still stuck at the starting line (figuratively speaking),
   2612         // waiting for the first frame to go by.  So we can't report a valid timestamp yet.
   2613         // Note: We explicitly use non-Modulo comparison here - potential wrap issue when
   2614         // mPosition exceeds 32 bits.
   2615         // TODO Remove when timestamp is updated to contain pipeline status info.
   2616         const int32_t pipelineDepthInFrames = (mServer - timestamp.mPosition).signedValue();
   2617         if (pipelineDepthInFrames > 0 /* should be true, but we check anyways */
   2618                 && (uint32_t)pipelineDepthInFrames > mPosition.value()) {
   2619             return INVALID_OPERATION;
   2620         }
   2621         // Convert timestamp position from server time base to client time base.
   2622         // TODO The following code should work OK now because timestamp.mPosition is 32-bit.
   2623         // But if we change it to 64-bit then this could fail.
   2624         // Use Modulo computation here.
   2625         timestamp.mPosition = (mPosition - mServer + timestamp.mPosition).value();
   2626         // Immediately after a call to getPosition_l(), mPosition and
   2627         // mServer both represent the same frame position.  mPosition is
   2628         // in client's point of view, and mServer is in server's point of
   2629         // view.  So the difference between them is the "fudge factor"
   2630         // between client and server views due to stop() and/or new
   2631         // IAudioTrack.  And timestamp.mPosition is initially in server's
   2632         // point of view, so we need to apply the same fudge factor to it.
   2633     }
   2634 
   2635     // Prevent retrograde motion in timestamp.
   2636     // This is sometimes caused by erratic reports of the available space in the ALSA drivers.
   2637     if (status == NO_ERROR) {
   2638         if (previousTimestampValid) {
   2639             const int64_t previousTimeNanos = convertTimespecToNs(mPreviousTimestamp.mTime);
   2640             const int64_t currentTimeNanos = convertTimespecToNs(timestamp.mTime);
   2641             if (currentTimeNanos < previousTimeNanos) {
   2642                 ALOGW("retrograde timestamp time corrected, %lld < %lld",
   2643                         (long long)currentTimeNanos, (long long)previousTimeNanos);
   2644                 timestamp.mTime = mPreviousTimestamp.mTime;
   2645             }
   2646 
   2647             // Looking at signed delta will work even when the timestamps
   2648             // are wrapping around.
   2649             int32_t deltaPosition = (Modulo<uint32_t>(timestamp.mPosition)
   2650                     - mPreviousTimestamp.mPosition).signedValue();
   2651             if (deltaPosition < 0) {
   2652                 // Only report once per position instead of spamming the log.
   2653                 if (!mRetrogradeMotionReported) {
   2654                     ALOGW("retrograde timestamp position corrected, %d = %u - %u",
   2655                             deltaPosition,
   2656                             timestamp.mPosition,
   2657                             mPreviousTimestamp.mPosition);
   2658                     mRetrogradeMotionReported = true;
   2659                 }
   2660             } else {
   2661                 mRetrogradeMotionReported = false;
   2662             }
   2663             if (deltaPosition < 0) {
   2664                 timestamp.mPosition = mPreviousTimestamp.mPosition;
   2665                 deltaPosition = 0;
   2666             }
   2667 #if 0
   2668             // Uncomment this to verify audio timestamp rate.
   2669             const int64_t deltaTime =
   2670                     convertTimespecToNs(timestamp.mTime) - previousTimeNanos;
   2671             if (deltaTime != 0) {
   2672                 const int64_t computedSampleRate =
   2673                         deltaPosition * (long long)NANOS_PER_SECOND / deltaTime;
   2674                 ALOGD("computedSampleRate:%u  sampleRate:%u",
   2675                         (unsigned)computedSampleRate, mSampleRate);
   2676             }
   2677 #endif
   2678         }
   2679         mPreviousTimestamp = timestamp;
   2680         mPreviousTimestampValid = true;
   2681     }
   2682 
   2683     return status;
   2684 }
   2685 
   2686 String8 AudioTrack::getParameters(const String8& keys)
   2687 {
   2688     audio_io_handle_t output = getOutput();
   2689     if (output != AUDIO_IO_HANDLE_NONE) {
   2690         return AudioSystem::getParameters(output, keys);
   2691     } else {
   2692         return String8::empty();
   2693     }
   2694 }
   2695 
   2696 bool AudioTrack::isOffloaded() const
   2697 {
   2698     AutoMutex lock(mLock);
   2699     return isOffloaded_l();
   2700 }
   2701 
   2702 bool AudioTrack::isDirect() const
   2703 {
   2704     AutoMutex lock(mLock);
   2705     return isDirect_l();
   2706 }
   2707 
   2708 bool AudioTrack::isOffloadedOrDirect() const
   2709 {
   2710     AutoMutex lock(mLock);
   2711     return isOffloadedOrDirect_l();
   2712 }
   2713 
   2714 
   2715 status_t AudioTrack::dump(int fd, const Vector<String16>& args __unused) const
   2716 {
   2717 
   2718     const size_t SIZE = 256;
   2719     char buffer[SIZE];
   2720     String8 result;
   2721 
   2722     result.append(" AudioTrack::dump\n");
   2723     snprintf(buffer, 255, "  stream type(%d), left - right volume(%f, %f)\n", mStreamType,
   2724             mVolume[AUDIO_INTERLEAVE_LEFT], mVolume[AUDIO_INTERLEAVE_RIGHT]);
   2725     result.append(buffer);
   2726     snprintf(buffer, 255, "  format(%d), channel count(%d), frame count(%zu)\n", mFormat,
   2727             mChannelCount, mFrameCount);
   2728     result.append(buffer);
   2729     snprintf(buffer, 255, "  sample rate(%u), speed(%f), status(%d)\n",
   2730             mSampleRate, mPlaybackRate.mSpeed, mStatus);
   2731     result.append(buffer);
   2732     snprintf(buffer, 255, "  state(%d), latency (%d)\n", mState, mLatency);
   2733     result.append(buffer);
   2734     ::write(fd, result.string(), result.size());
   2735     return NO_ERROR;
   2736 }
   2737 
   2738 uint32_t AudioTrack::getUnderrunCount() const
   2739 {
   2740     AutoMutex lock(mLock);
   2741     return getUnderrunCount_l();
   2742 }
   2743 
   2744 uint32_t AudioTrack::getUnderrunCount_l() const
   2745 {
   2746     return mProxy->getUnderrunCount() + mUnderrunCountOffset;
   2747 }
   2748 
   2749 uint32_t AudioTrack::getUnderrunFrames() const
   2750 {
   2751     AutoMutex lock(mLock);
   2752     return mProxy->getUnderrunFrames();
   2753 }
   2754 
   2755 status_t AudioTrack::addAudioDeviceCallback(const sp<AudioSystem::AudioDeviceCallback>& callback)
   2756 {
   2757     if (callback == 0) {
   2758         ALOGW("%s adding NULL callback!", __FUNCTION__);
   2759         return BAD_VALUE;
   2760     }
   2761     AutoMutex lock(mLock);
   2762     if (mDeviceCallback == callback) {
   2763         ALOGW("%s adding same callback!", __FUNCTION__);
   2764         return INVALID_OPERATION;
   2765     }
   2766     status_t status = NO_ERROR;
   2767     if (mOutput != AUDIO_IO_HANDLE_NONE) {
   2768         if (mDeviceCallback != 0) {
   2769             ALOGW("%s callback already present!", __FUNCTION__);
   2770             AudioSystem::removeAudioDeviceCallback(mDeviceCallback, mOutput);
   2771         }
   2772         status = AudioSystem::addAudioDeviceCallback(callback, mOutput);
   2773     }
   2774     mDeviceCallback = callback;
   2775     return status;
   2776 }
   2777 
   2778 status_t AudioTrack::removeAudioDeviceCallback(
   2779         const sp<AudioSystem::AudioDeviceCallback>& callback)
   2780 {
   2781     if (callback == 0) {
   2782         ALOGW("%s removing NULL callback!", __FUNCTION__);
   2783         return BAD_VALUE;
   2784     }
   2785     AutoMutex lock(mLock);
   2786     if (mDeviceCallback != callback) {
   2787         ALOGW("%s removing different callback!", __FUNCTION__);
   2788         return INVALID_OPERATION;
   2789     }
   2790     if (mOutput != AUDIO_IO_HANDLE_NONE) {
   2791         AudioSystem::removeAudioDeviceCallback(mDeviceCallback, mOutput);
   2792     }
   2793     mDeviceCallback = 0;
   2794     return NO_ERROR;
   2795 }
   2796 
   2797 status_t AudioTrack::pendingDuration(int32_t *msec, ExtendedTimestamp::Location location)
   2798 {
   2799     if (msec == nullptr ||
   2800             (location != ExtendedTimestamp::LOCATION_SERVER
   2801                     && location != ExtendedTimestamp::LOCATION_KERNEL)) {
   2802         return BAD_VALUE;
   2803     }
   2804     AutoMutex lock(mLock);
   2805     // inclusive of offloaded and direct tracks.
   2806     //
   2807     // It is possible, but not enabled, to allow duration computation for non-pcm
   2808     // audio_has_proportional_frames() formats because currently they have
   2809     // the drain rate equivalent to the pcm sample rate * framesize.
   2810     if (!isPurePcmData_l()) {
   2811         return INVALID_OPERATION;
   2812     }
   2813     ExtendedTimestamp ets;
   2814     if (getTimestamp_l(&ets) == OK
   2815             && ets.mTimeNs[location] > 0) {
   2816         int64_t diff = ets.mPosition[ExtendedTimestamp::LOCATION_CLIENT]
   2817                 - ets.mPosition[location];
   2818         if (diff < 0) {
   2819             *msec = 0;
   2820         } else {
   2821             // ms is the playback time by frames
   2822             int64_t ms = (int64_t)((double)diff * 1000 /
   2823                     ((double)mSampleRate * mPlaybackRate.mSpeed));
   2824             // clockdiff is the timestamp age (negative)
   2825             int64_t clockdiff = (mState != STATE_ACTIVE) ? 0 :
   2826                     ets.mTimeNs[location]
   2827                     + ets.mTimebaseOffset[ExtendedTimestamp::TIMEBASE_MONOTONIC]
   2828                     - systemTime(SYSTEM_TIME_MONOTONIC);
   2829 
   2830             //ALOGV("ms: %lld  clockdiff: %lld", (long long)ms, (long long)clockdiff);
   2831             static const int NANOS_PER_MILLIS = 1000000;
   2832             *msec = (int32_t)(ms + clockdiff / NANOS_PER_MILLIS);
   2833         }
   2834         return NO_ERROR;
   2835     }
   2836     if (location != ExtendedTimestamp::LOCATION_SERVER) {
   2837         return INVALID_OPERATION; // LOCATION_KERNEL is not available
   2838     }
   2839     // use server position directly (offloaded and direct arrive here)
   2840     updateAndGetPosition_l();
   2841     int32_t diff = (Modulo<uint32_t>(mFramesWritten) - mPosition).signedValue();
   2842     *msec = (diff <= 0) ? 0
   2843             : (int32_t)((double)diff * 1000 / ((double)mSampleRate * mPlaybackRate.mSpeed));
   2844     return NO_ERROR;
   2845 }
   2846 
   2847 bool AudioTrack::hasStarted()
   2848 {
   2849     AutoMutex lock(mLock);
   2850     switch (mState) {
   2851     case STATE_STOPPED:
   2852         if (isOffloadedOrDirect_l()) {
   2853             // check if we have started in the past to return true.
   2854             return mStartUs > 0;
   2855         }
   2856         // A normal audio track may still be draining, so
   2857         // check if stream has ended.  This covers fasttrack position
   2858         // instability and start/stop without any data written.
   2859         if (mProxy->getStreamEndDone()) {
   2860             return true;
   2861         }
   2862         // fall through
   2863     case STATE_ACTIVE:
   2864     case STATE_STOPPING:
   2865         break;
   2866     case STATE_PAUSED:
   2867     case STATE_PAUSED_STOPPING:
   2868     case STATE_FLUSHED:
   2869         return false;  // we're not active
   2870     default:
   2871         LOG_ALWAYS_FATAL("Invalid mState in hasStarted(): %d", mState);
   2872         break;
   2873     }
   2874 
   2875     // wait indicates whether we need to wait for a timestamp.
   2876     // This is conservatively figured - if we encounter an unexpected error
   2877     // then we will not wait.
   2878     bool wait = false;
   2879     if (isOffloadedOrDirect_l()) {
   2880         AudioTimestamp ts;
   2881         status_t status = getTimestamp_l(ts);
   2882         if (status == WOULD_BLOCK) {
   2883             wait = true;
   2884         } else if (status == OK) {
   2885             wait = (ts.mPosition == 0 || ts.mPosition == mStartTs.mPosition);
   2886         }
   2887         ALOGV("hasStarted wait:%d  ts:%u  start position:%lld",
   2888                 (int)wait,
   2889                 ts.mPosition,
   2890                 (long long)mStartTs.mPosition);
   2891     } else {
   2892         int location = ExtendedTimestamp::LOCATION_SERVER; // for ALOG
   2893         ExtendedTimestamp ets;
   2894         status_t status = getTimestamp_l(&ets);
   2895         if (status == WOULD_BLOCK) {  // no SERVER or KERNEL frame info in ets
   2896             wait = true;
   2897         } else if (status == OK) {
   2898             for (location = ExtendedTimestamp::LOCATION_KERNEL;
   2899                     location >= ExtendedTimestamp::LOCATION_SERVER; --location) {
   2900                 if (ets.mTimeNs[location] < 0 || mStartEts.mTimeNs[location] < 0) {
   2901                     continue;
   2902                 }
   2903                 wait = ets.mPosition[location] == 0
   2904                         || ets.mPosition[location] == mStartEts.mPosition[location];
   2905                 break;
   2906             }
   2907         }
   2908         ALOGV("hasStarted wait:%d  ets:%lld  start position:%lld",
   2909                 (int)wait,
   2910                 (long long)ets.mPosition[location],
   2911                 (long long)mStartEts.mPosition[location]);
   2912     }
   2913     return !wait;
   2914 }
   2915 
   2916 // =========================================================================
   2917 
   2918 void AudioTrack::DeathNotifier::binderDied(const wp<IBinder>& who __unused)
   2919 {
   2920     sp<AudioTrack> audioTrack = mAudioTrack.promote();
   2921     if (audioTrack != 0) {
   2922         AutoMutex lock(audioTrack->mLock);
   2923         audioTrack->mProxy->binderDied();
   2924     }
   2925 }
   2926 
   2927 // =========================================================================
   2928 
   2929 AudioTrack::AudioTrackThread::AudioTrackThread(AudioTrack& receiver, bool bCanCallJava)
   2930     : Thread(bCanCallJava), mReceiver(receiver), mPaused(true), mPausedInt(false), mPausedNs(0LL),
   2931       mIgnoreNextPausedInt(false)
   2932 {
   2933 }
   2934 
   2935 AudioTrack::AudioTrackThread::~AudioTrackThread()
   2936 {
   2937 }
   2938 
   2939 bool AudioTrack::AudioTrackThread::threadLoop()
   2940 {
   2941     {
   2942         AutoMutex _l(mMyLock);
   2943         if (mPaused) {
   2944             mMyCond.wait(mMyLock);
   2945             // caller will check for exitPending()
   2946             return true;
   2947         }
   2948         if (mIgnoreNextPausedInt) {
   2949             mIgnoreNextPausedInt = false;
   2950             mPausedInt = false;
   2951         }
   2952         if (mPausedInt) {
   2953             if (mPausedNs > 0) {
   2954                 (void) mMyCond.waitRelative(mMyLock, mPausedNs);
   2955             } else {
   2956                 mMyCond.wait(mMyLock);
   2957             }
   2958             mPausedInt = false;
   2959             return true;
   2960         }
   2961     }
   2962     if (exitPending()) {
   2963         return false;
   2964     }
   2965     nsecs_t ns = mReceiver.processAudioBuffer();
   2966     switch (ns) {
   2967     case 0:
   2968         return true;
   2969     case NS_INACTIVE:
   2970         pauseInternal();
   2971         return true;
   2972     case NS_NEVER:
   2973         return false;
   2974     case NS_WHENEVER:
   2975         // Event driven: call wake() when callback notifications conditions change.
   2976         ns = INT64_MAX;
   2977         // fall through
   2978     default:
   2979         LOG_ALWAYS_FATAL_IF(ns < 0, "processAudioBuffer() returned %" PRId64, ns);
   2980         pauseInternal(ns);
   2981         return true;
   2982     }
   2983 }
   2984 
   2985 void AudioTrack::AudioTrackThread::requestExit()
   2986 {
   2987     // must be in this order to avoid a race condition
   2988     Thread::requestExit();
   2989     resume();
   2990 }
   2991 
   2992 void AudioTrack::AudioTrackThread::pause()
   2993 {
   2994     AutoMutex _l(mMyLock);
   2995     mPaused = true;
   2996 }
   2997 
   2998 void AudioTrack::AudioTrackThread::resume()
   2999 {
   3000     AutoMutex _l(mMyLock);
   3001     mIgnoreNextPausedInt = true;
   3002     if (mPaused || mPausedInt) {
   3003         mPaused = false;
   3004         mPausedInt = false;
   3005         mMyCond.signal();
   3006     }
   3007 }
   3008 
   3009 void AudioTrack::AudioTrackThread::wake()
   3010 {
   3011     AutoMutex _l(mMyLock);
   3012     if (!mPaused) {
   3013         // wake() might be called while servicing a callback - ignore the next
   3014         // pause time and call processAudioBuffer.
   3015         mIgnoreNextPausedInt = true;
   3016         if (mPausedInt && mPausedNs > 0) {
   3017             // audio track is active and internally paused with timeout.
   3018             mPausedInt = false;
   3019             mMyCond.signal();
   3020         }
   3021     }
   3022 }
   3023 
   3024 void AudioTrack::AudioTrackThread::pauseInternal(nsecs_t ns)
   3025 {
   3026     AutoMutex _l(mMyLock);
   3027     mPausedInt = true;
   3028     mPausedNs = ns;
   3029 }
   3030 
   3031 } // namespace android
   3032