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
36static const int kMaxLoopCountNotifications = 32;
37
38namespace android {
39// ---------------------------------------------------------------------------
40
41// TODO: Move to a separate .h
42
43template <typename T>
44static inline const T &min(const T &x, const T &y) {
45    return x < y ? x : y;
46}
47
48template <typename T>
49static inline const T &max(const T &x, const T &y) {
50    return x > y ? x : y;
51}
52
53static const int32_t NANOS_PER_SECOND = 1000000000;
54
55static inline nsecs_t framesToNanoseconds(ssize_t frames, uint32_t sampleRate, float speed)
56{
57    return ((double)frames * 1000000000) / ((double)sampleRate * speed);
58}
59
60static int64_t convertTimespecToUs(const struct timespec &tv)
61{
62    return tv.tv_sec * 1000000ll + tv.tv_nsec / 1000;
63}
64
65static 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.
71static 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.
80static const bool kFixPitch = true; // enable pitch fix
81static inline uint32_t adjustSampleRate(uint32_t sampleRate, float pitch)
82{
83    return kFixPitch ? (sampleRate * pitch + 0.5) : sampleRate;
84}
85
86static inline float adjustSpeed(float speed, float pitch)
87{
88    return kFixPitch ? speed / max(pitch, AUDIO_TIMESTRETCH_PITCH_MIN_DELTA) : speed;
89}
90
91static 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
98static 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
123status_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
180AudioTrack::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
195AudioTrack::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
227AudioTrack::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
259AudioTrack::~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
287status_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
565status_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
674void 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
713bool AudioTrack::stopped() const
714{
715    AutoMutex lock(mLock);
716    return mState != STATE_ACTIVE;
717}
718
719void 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
731void 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
750void 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
783status_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
803status_t AudioTrack::setVolume(float volume)
804{
805    return setVolume(volume, volume);
806}
807
808status_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
822void AudioTrack::getAuxEffectSendLevel(float* level) const
823{
824    if (level != NULL) {
825        *level = mSendLevel;
826    }
827}
828
829status_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
860uint32_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
879uint32_t AudioTrack::getOriginalSampleRate() const
880{
881    return mOriginalSampleRate;
882}
883
884status_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
942const AudioPlaybackRate& AudioTrack::getPlaybackRate() const
943{
944    AutoMutex lock(mLock);
945    return mPlaybackRate;
946}
947
948ssize_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
957status_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
975ssize_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
988status_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
1012void 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
1025status_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
1043status_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
1058status_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
1076status_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
1091status_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
1118status_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
1160status_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
1174status_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
1202audio_io_handle_t AudioTrack::getOutput() const
1203{
1204    AutoMutex lock(mLock);
1205    return mOutput;
1206}
1207
1208status_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
1219audio_port_handle_t AudioTrack::getOutputDevice() {
1220    AutoMutex lock(mLock);
1221    return mSelectedDeviceId;
1222}
1223
1224audio_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
1232status_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
1242audio_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
1253status_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
1593release:
1594    AudioSystem::releaseOutput(output, streamType, mSessionId);
1595    if (status == NO_ERROR) {
1596        status = NO_INIT;
1597    }
1598    return status;
1599}
1600
1601status_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
1637status_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
1712void 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
1737void 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
1749ssize_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
1807nsecs_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
2206status_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
2295Modulo<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
2318bool 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
2332status_t AudioTrack::setParameters(const String8& keyValuePairs)
2333{
2334    AutoMutex lock(mLock);
2335    return mAudioTrack->setParameters(keyValuePairs);
2336}
2337
2338VolumeShaper::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
2365sp<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
2377status_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
2386status_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
2418status_t AudioTrack::getTimestamp(AudioTimestamp& timestamp)
2419{
2420    AutoMutex lock(mLock);
2421    return getTimestamp_l(timestamp);
2422}
2423
2424status_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
2686String8 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
2696bool AudioTrack::isOffloaded() const
2697{
2698    AutoMutex lock(mLock);
2699    return isOffloaded_l();
2700}
2701
2702bool AudioTrack::isDirect() const
2703{
2704    AutoMutex lock(mLock);
2705    return isDirect_l();
2706}
2707
2708bool AudioTrack::isOffloadedOrDirect() const
2709{
2710    AutoMutex lock(mLock);
2711    return isOffloadedOrDirect_l();
2712}
2713
2714
2715status_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
2738uint32_t AudioTrack::getUnderrunCount() const
2739{
2740    AutoMutex lock(mLock);
2741    return getUnderrunCount_l();
2742}
2743
2744uint32_t AudioTrack::getUnderrunCount_l() const
2745{
2746    return mProxy->getUnderrunCount() + mUnderrunCountOffset;
2747}
2748
2749uint32_t AudioTrack::getUnderrunFrames() const
2750{
2751    AutoMutex lock(mLock);
2752    return mProxy->getUnderrunFrames();
2753}
2754
2755status_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
2778status_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
2797status_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
2847bool 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
2918void 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
2929AudioTrack::AudioTrackThread::AudioTrackThread(AudioTrack& receiver, bool bCanCallJava)
2930    : Thread(bCanCallJava), mReceiver(receiver), mPaused(true), mPausedInt(false), mPausedNs(0LL),
2931      mIgnoreNextPausedInt(false)
2932{
2933}
2934
2935AudioTrack::AudioTrackThread::~AudioTrackThread()
2936{
2937}
2938
2939bool 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
2985void AudioTrack::AudioTrackThread::requestExit()
2986{
2987    // must be in this order to avoid a race condition
2988    Thread::requestExit();
2989    resume();
2990}
2991
2992void AudioTrack::AudioTrackThread::pause()
2993{
2994    AutoMutex _l(mMyLock);
2995    mPaused = true;
2996}
2997
2998void 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
3009void 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
3024void AudioTrack::AudioTrackThread::pauseInternal(nsecs_t ns)
3025{
3026    AutoMutex _l(mMyLock);
3027    mPausedInt = true;
3028    mPausedNs = ns;
3029}
3030
3031} // namespace android
3032