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