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