Home | History | Annotate | Download | only in audioflinger
      1 /*
      2 **
      3 ** Copyright 2012, 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 
     19 #define LOG_TAG "AudioFlinger"
     20 //#define LOG_NDEBUG 0
     21 
     22 #include "Configuration.h"
     23 #include <linux/futex.h>
     24 #include <math.h>
     25 #include <sys/syscall.h>
     26 #include <utils/Log.h>
     27 
     28 #include <private/media/AudioTrackShared.h>
     29 
     30 #include "AudioFlinger.h"
     31 #include "ServiceUtilities.h"
     32 
     33 #include <media/nbaio/Pipe.h>
     34 #include <media/nbaio/PipeReader.h>
     35 #include <media/RecordBufferConverter.h>
     36 #include <audio_utils/minifloat.h>
     37 
     38 // ----------------------------------------------------------------------------
     39 
     40 // Note: the following macro is used for extremely verbose logging message.  In
     41 // order to run with ALOG_ASSERT turned on, we need to have LOG_NDEBUG set to
     42 // 0; but one side effect of this is to turn all LOGV's as well.  Some messages
     43 // are so verbose that we want to suppress them even when we have ALOG_ASSERT
     44 // turned on.  Do not uncomment the #def below unless you really know what you
     45 // are doing and want to see all of the extremely verbose messages.
     46 //#define VERY_VERY_VERBOSE_LOGGING
     47 #ifdef VERY_VERY_VERBOSE_LOGGING
     48 #define ALOGVV ALOGV
     49 #else
     50 #define ALOGVV(a...) do { } while(0)
     51 #endif
     52 
     53 namespace android {
     54 
     55 // ----------------------------------------------------------------------------
     56 //      TrackBase
     57 // ----------------------------------------------------------------------------
     58 
     59 static volatile int32_t nextTrackId = 55;
     60 
     61 // TrackBase constructor must be called with AudioFlinger::mLock held
     62 AudioFlinger::ThreadBase::TrackBase::TrackBase(
     63             ThreadBase *thread,
     64             const sp<Client>& client,
     65             uint32_t sampleRate,
     66             audio_format_t format,
     67             audio_channel_mask_t channelMask,
     68             size_t frameCount,
     69             void *buffer,
     70             size_t bufferSize,
     71             audio_session_t sessionId,
     72             uid_t clientUid,
     73             bool isOut,
     74             alloc_type alloc,
     75             track_type type,
     76             audio_port_handle_t portId)
     77     :   RefBase(),
     78         mThread(thread),
     79         mClient(client),
     80         mCblk(NULL),
     81         // mBuffer, mBufferSize
     82         mState(IDLE),
     83         mSampleRate(sampleRate),
     84         mFormat(format),
     85         mChannelMask(channelMask),
     86         mChannelCount(isOut ?
     87                 audio_channel_count_from_out_mask(channelMask) :
     88                 audio_channel_count_from_in_mask(channelMask)),
     89         mFrameSize(audio_has_proportional_frames(format) ?
     90                 mChannelCount * audio_bytes_per_sample(format) : sizeof(int8_t)),
     91         mFrameCount(frameCount),
     92         mSessionId(sessionId),
     93         mIsOut(isOut),
     94         mId(android_atomic_inc(&nextTrackId)),
     95         mTerminated(false),
     96         mType(type),
     97         mThreadIoHandle(thread->id()),
     98         mPortId(portId),
     99         mIsInvalid(false)
    100 {
    101     const uid_t callingUid = IPCThreadState::self()->getCallingUid();
    102     if (!isTrustedCallingUid(callingUid) || clientUid == AUDIO_UID_INVALID) {
    103         ALOGW_IF(clientUid != AUDIO_UID_INVALID && clientUid != callingUid,
    104                 "%s uid %d tried to pass itself off as %d", __FUNCTION__, callingUid, clientUid);
    105         clientUid = callingUid;
    106     }
    107     // clientUid contains the uid of the app that is responsible for this track, so we can blame
    108     // battery usage on it.
    109     mUid = clientUid;
    110 
    111     // ALOGD("Creating track with %d buffers @ %d bytes", bufferCount, bufferSize);
    112 
    113     size_t minBufferSize = buffer == NULL ? roundup(frameCount) : frameCount;
    114     // check overflow when computing bufferSize due to multiplication by mFrameSize.
    115     if (minBufferSize < frameCount  // roundup rounds down for values above UINT_MAX / 2
    116             || mFrameSize == 0   // format needs to be correct
    117             || minBufferSize > SIZE_MAX / mFrameSize) {
    118         android_errorWriteLog(0x534e4554, "34749571");
    119         return;
    120     }
    121     minBufferSize *= mFrameSize;
    122 
    123     if (buffer == nullptr) {
    124         bufferSize = minBufferSize; // allocated here.
    125     } else if (minBufferSize > bufferSize) {
    126         android_errorWriteLog(0x534e4554, "38340117");
    127         return;
    128     }
    129 
    130     size_t size = sizeof(audio_track_cblk_t);
    131     if (buffer == NULL && alloc == ALLOC_CBLK) {
    132         // check overflow when computing allocation size for streaming tracks.
    133         if (size > SIZE_MAX - bufferSize) {
    134             android_errorWriteLog(0x534e4554, "34749571");
    135             return;
    136         }
    137         size += bufferSize;
    138     }
    139 
    140     if (client != 0) {
    141         mCblkMemory = client->heap()->allocate(size);
    142         if (mCblkMemory == 0 ||
    143                 (mCblk = static_cast<audio_track_cblk_t *>(mCblkMemory->pointer())) == NULL) {
    144             ALOGE("not enough memory for AudioTrack size=%zu", size);
    145             client->heap()->dump("AudioTrack");
    146             mCblkMemory.clear();
    147             return;
    148         }
    149     } else {
    150         mCblk = (audio_track_cblk_t *) malloc(size);
    151         if (mCblk == NULL) {
    152             ALOGE("not enough memory for AudioTrack size=%zu", size);
    153             return;
    154         }
    155     }
    156 
    157     // construct the shared structure in-place.
    158     if (mCblk != NULL) {
    159         new(mCblk) audio_track_cblk_t();
    160         switch (alloc) {
    161         case ALLOC_READONLY: {
    162             const sp<MemoryDealer> roHeap(thread->readOnlyHeap());
    163             if (roHeap == 0 ||
    164                     (mBufferMemory = roHeap->allocate(bufferSize)) == 0 ||
    165                     (mBuffer = mBufferMemory->pointer()) == NULL) {
    166                 ALOGE("not enough memory for read-only buffer size=%zu", bufferSize);
    167                 if (roHeap != 0) {
    168                     roHeap->dump("buffer");
    169                 }
    170                 mCblkMemory.clear();
    171                 mBufferMemory.clear();
    172                 return;
    173             }
    174             memset(mBuffer, 0, bufferSize);
    175             } break;
    176         case ALLOC_PIPE:
    177             mBufferMemory = thread->pipeMemory();
    178             // mBuffer is the virtual address as seen from current process (mediaserver),
    179             // and should normally be coming from mBufferMemory->pointer().
    180             // However in this case the TrackBase does not reference the buffer directly.
    181             // It should references the buffer via the pipe.
    182             // Therefore, to detect incorrect usage of the buffer, we set mBuffer to NULL.
    183             mBuffer = NULL;
    184             bufferSize = 0;
    185             break;
    186         case ALLOC_CBLK:
    187             // clear all buffers
    188             if (buffer == NULL) {
    189                 mBuffer = (char*)mCblk + sizeof(audio_track_cblk_t);
    190                 memset(mBuffer, 0, bufferSize);
    191             } else {
    192                 mBuffer = buffer;
    193 #if 0
    194                 mCblk->mFlags = CBLK_FORCEREADY;    // FIXME hack, need to fix the track ready logic
    195 #endif
    196             }
    197             break;
    198         case ALLOC_LOCAL:
    199             mBuffer = calloc(1, bufferSize);
    200             break;
    201         case ALLOC_NONE:
    202             mBuffer = buffer;
    203             break;
    204         default:
    205             LOG_ALWAYS_FATAL("invalid allocation type: %d", (int)alloc);
    206         }
    207         mBufferSize = bufferSize;
    208 
    209 #ifdef TEE_SINK
    210         if (mTeeSinkTrackEnabled) {
    211             NBAIO_Format pipeFormat = Format_from_SR_C(mSampleRate, mChannelCount, mFormat);
    212             if (Format_isValid(pipeFormat)) {
    213                 Pipe *pipe = new Pipe(mTeeSinkTrackFrames, pipeFormat);
    214                 size_t numCounterOffers = 0;
    215                 const NBAIO_Format offers[1] = {pipeFormat};
    216                 ssize_t index = pipe->negotiate(offers, 1, NULL, numCounterOffers);
    217                 ALOG_ASSERT(index == 0);
    218                 PipeReader *pipeReader = new PipeReader(*pipe);
    219                 numCounterOffers = 0;
    220                 index = pipeReader->negotiate(offers, 1, NULL, numCounterOffers);
    221                 ALOG_ASSERT(index == 0);
    222                 mTeeSink = pipe;
    223                 mTeeSource = pipeReader;
    224             }
    225         }
    226 #endif
    227 
    228     }
    229 }
    230 
    231 status_t AudioFlinger::ThreadBase::TrackBase::initCheck() const
    232 {
    233     status_t status;
    234     if (mType == TYPE_OUTPUT || mType == TYPE_PATCH) {
    235         status = cblk() != NULL ? NO_ERROR : NO_MEMORY;
    236     } else {
    237         status = getCblk() != 0 ? NO_ERROR : NO_MEMORY;
    238     }
    239     return status;
    240 }
    241 
    242 AudioFlinger::ThreadBase::TrackBase::~TrackBase()
    243 {
    244 #ifdef TEE_SINK
    245     dumpTee(-1, mTeeSource, mId, 'T');
    246 #endif
    247     // delete the proxy before deleting the shared memory it refers to, to avoid dangling reference
    248     mServerProxy.clear();
    249     if (mCblk != NULL) {
    250         mCblk->~audio_track_cblk_t();   // destroy our shared-structure.
    251         if (mClient == 0) {
    252             free(mCblk);
    253         }
    254     }
    255     mCblkMemory.clear();    // free the shared memory before releasing the heap it belongs to
    256     if (mClient != 0) {
    257         // Client destructor must run with AudioFlinger client mutex locked
    258         Mutex::Autolock _l(mClient->audioFlinger()->mClientLock);
    259         // If the client's reference count drops to zero, the associated destructor
    260         // must run with AudioFlinger lock held. Thus the explicit clear() rather than
    261         // relying on the automatic clear() at end of scope.
    262         mClient.clear();
    263     }
    264     // flush the binder command buffer
    265     IPCThreadState::self()->flushCommands();
    266 }
    267 
    268 // AudioBufferProvider interface
    269 // getNextBuffer() = 0;
    270 // This implementation of releaseBuffer() is used by Track and RecordTrack
    271 void AudioFlinger::ThreadBase::TrackBase::releaseBuffer(AudioBufferProvider::Buffer* buffer)
    272 {
    273 #ifdef TEE_SINK
    274     if (mTeeSink != 0) {
    275         (void) mTeeSink->write(buffer->raw, buffer->frameCount);
    276     }
    277 #endif
    278 
    279     ServerProxy::Buffer buf;
    280     buf.mFrameCount = buffer->frameCount;
    281     buf.mRaw = buffer->raw;
    282     buffer->frameCount = 0;
    283     buffer->raw = NULL;
    284     mServerProxy->releaseBuffer(&buf);
    285 }
    286 
    287 status_t AudioFlinger::ThreadBase::TrackBase::setSyncEvent(const sp<SyncEvent>& event)
    288 {
    289     mSyncEvents.add(event);
    290     return NO_ERROR;
    291 }
    292 
    293 // ----------------------------------------------------------------------------
    294 //      Playback
    295 // ----------------------------------------------------------------------------
    296 
    297 AudioFlinger::TrackHandle::TrackHandle(const sp<AudioFlinger::PlaybackThread::Track>& track)
    298     : BnAudioTrack(),
    299       mTrack(track)
    300 {
    301 }
    302 
    303 AudioFlinger::TrackHandle::~TrackHandle() {
    304     // just stop the track on deletion, associated resources
    305     // will be freed from the main thread once all pending buffers have
    306     // been played. Unless it's not in the active track list, in which
    307     // case we free everything now...
    308     mTrack->destroy();
    309 }
    310 
    311 sp<IMemory> AudioFlinger::TrackHandle::getCblk() const {
    312     return mTrack->getCblk();
    313 }
    314 
    315 status_t AudioFlinger::TrackHandle::start() {
    316     return mTrack->start();
    317 }
    318 
    319 void AudioFlinger::TrackHandle::stop() {
    320     mTrack->stop();
    321 }
    322 
    323 void AudioFlinger::TrackHandle::flush() {
    324     mTrack->flush();
    325 }
    326 
    327 void AudioFlinger::TrackHandle::pause() {
    328     mTrack->pause();
    329 }
    330 
    331 status_t AudioFlinger::TrackHandle::attachAuxEffect(int EffectId)
    332 {
    333     return mTrack->attachAuxEffect(EffectId);
    334 }
    335 
    336 status_t AudioFlinger::TrackHandle::setParameters(const String8& keyValuePairs) {
    337     return mTrack->setParameters(keyValuePairs);
    338 }
    339 
    340 VolumeShaper::Status AudioFlinger::TrackHandle::applyVolumeShaper(
    341         const sp<VolumeShaper::Configuration>& configuration,
    342         const sp<VolumeShaper::Operation>& operation) {
    343     return mTrack->applyVolumeShaper(configuration, operation);
    344 }
    345 
    346 sp<VolumeShaper::State> AudioFlinger::TrackHandle::getVolumeShaperState(int id) {
    347     return mTrack->getVolumeShaperState(id);
    348 }
    349 
    350 status_t AudioFlinger::TrackHandle::getTimestamp(AudioTimestamp& timestamp)
    351 {
    352     return mTrack->getTimestamp(timestamp);
    353 }
    354 
    355 
    356 void AudioFlinger::TrackHandle::signal()
    357 {
    358     return mTrack->signal();
    359 }
    360 
    361 status_t AudioFlinger::TrackHandle::onTransact(
    362     uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
    363 {
    364     return BnAudioTrack::onTransact(code, data, reply, flags);
    365 }
    366 
    367 // ----------------------------------------------------------------------------
    368 
    369 // Track constructor must be called with AudioFlinger::mLock and ThreadBase::mLock held
    370 AudioFlinger::PlaybackThread::Track::Track(
    371             PlaybackThread *thread,
    372             const sp<Client>& client,
    373             audio_stream_type_t streamType,
    374             uint32_t sampleRate,
    375             audio_format_t format,
    376             audio_channel_mask_t channelMask,
    377             size_t frameCount,
    378             void *buffer,
    379             size_t bufferSize,
    380             const sp<IMemory>& sharedBuffer,
    381             audio_session_t sessionId,
    382             uid_t uid,
    383             audio_output_flags_t flags,
    384             track_type type,
    385             audio_port_handle_t portId)
    386     :   TrackBase(thread, client, sampleRate, format, channelMask, frameCount,
    387                   (sharedBuffer != 0) ? sharedBuffer->pointer() : buffer,
    388                   (sharedBuffer != 0) ? sharedBuffer->size() : bufferSize,
    389                   sessionId, uid, true /*isOut*/,
    390                   (type == TYPE_PATCH) ? ( buffer == NULL ? ALLOC_LOCAL : ALLOC_NONE) : ALLOC_CBLK,
    391                   type, portId),
    392     mFillingUpStatus(FS_INVALID),
    393     // mRetryCount initialized later when needed
    394     mSharedBuffer(sharedBuffer),
    395     mStreamType(streamType),
    396     mName(-1),  // see note below
    397     mMainBuffer(thread->mixBuffer()),
    398     mAuxBuffer(NULL),
    399     mAuxEffectId(0), mHasVolumeController(false),
    400     mPresentationCompleteFrames(0),
    401     mFrameMap(16 /* sink-frame-to-track-frame map memory */),
    402     mVolumeHandler(new VolumeHandler(sampleRate)),
    403     // mSinkTimestamp
    404     mFastIndex(-1),
    405     mCachedVolume(1.0),
    406     mResumeToStopping(false),
    407     mFlushHwPending(false),
    408     mFlags(flags)
    409 {
    410     // client == 0 implies sharedBuffer == 0
    411     ALOG_ASSERT(!(client == 0 && sharedBuffer != 0));
    412 
    413     ALOGV_IF(sharedBuffer != 0, "sharedBuffer: %p, size: %zu", sharedBuffer->pointer(),
    414             sharedBuffer->size());
    415 
    416     if (mCblk == NULL) {
    417         return;
    418     }
    419 
    420     if (sharedBuffer == 0) {
    421         mAudioTrackServerProxy = new AudioTrackServerProxy(mCblk, mBuffer, frameCount,
    422                 mFrameSize, !isExternalTrack(), sampleRate);
    423     } else {
    424         mAudioTrackServerProxy = new StaticAudioTrackServerProxy(mCblk, mBuffer, frameCount,
    425                 mFrameSize);
    426     }
    427     mServerProxy = mAudioTrackServerProxy;
    428 
    429     mName = thread->getTrackName_l(channelMask, format, sessionId, uid);
    430     if (mName < 0) {
    431         ALOGE("no more track names available");
    432         return;
    433     }
    434     // only allocate a fast track index if we were able to allocate a normal track name
    435     if (flags & AUDIO_OUTPUT_FLAG_FAST) {
    436         // FIXME: Not calling framesReadyIsCalledByMultipleThreads() exposes a potential
    437         // race with setSyncEvent(). However, if we call it, we cannot properly start
    438         // static fast tracks (SoundPool) immediately after stopping.
    439         //mAudioTrackServerProxy->framesReadyIsCalledByMultipleThreads();
    440         ALOG_ASSERT(thread->mFastTrackAvailMask != 0);
    441         int i = __builtin_ctz(thread->mFastTrackAvailMask);
    442         ALOG_ASSERT(0 < i && i < (int)FastMixerState::sMaxFastTracks);
    443         // FIXME This is too eager.  We allocate a fast track index before the
    444         //       fast track becomes active.  Since fast tracks are a scarce resource,
    445         //       this means we are potentially denying other more important fast tracks from
    446         //       being created.  It would be better to allocate the index dynamically.
    447         mFastIndex = i;
    448         thread->mFastTrackAvailMask &= ~(1 << i);
    449     }
    450 }
    451 
    452 AudioFlinger::PlaybackThread::Track::~Track()
    453 {
    454     ALOGV("PlaybackThread::Track destructor");
    455 
    456     // The destructor would clear mSharedBuffer,
    457     // but it will not push the decremented reference count,
    458     // leaving the client's IMemory dangling indefinitely.
    459     // This prevents that leak.
    460     if (mSharedBuffer != 0) {
    461         mSharedBuffer.clear();
    462     }
    463 }
    464 
    465 status_t AudioFlinger::PlaybackThread::Track::initCheck() const
    466 {
    467     status_t status = TrackBase::initCheck();
    468     if (status == NO_ERROR && mName < 0) {
    469         status = NO_MEMORY;
    470     }
    471     return status;
    472 }
    473 
    474 void AudioFlinger::PlaybackThread::Track::destroy()
    475 {
    476     // NOTE: destroyTrack_l() can remove a strong reference to this Track
    477     // by removing it from mTracks vector, so there is a risk that this Tracks's
    478     // destructor is called. As the destructor needs to lock mLock,
    479     // we must acquire a strong reference on this Track before locking mLock
    480     // here so that the destructor is called only when exiting this function.
    481     // On the other hand, as long as Track::destroy() is only called by
    482     // TrackHandle destructor, the TrackHandle still holds a strong ref on
    483     // this Track with its member mTrack.
    484     sp<Track> keep(this);
    485     { // scope for mLock
    486         bool wasActive = false;
    487         sp<ThreadBase> thread = mThread.promote();
    488         if (thread != 0) {
    489             Mutex::Autolock _l(thread->mLock);
    490             PlaybackThread *playbackThread = (PlaybackThread *)thread.get();
    491             wasActive = playbackThread->destroyTrack_l(this);
    492         }
    493         if (isExternalTrack() && !wasActive) {
    494             AudioSystem::releaseOutput(mThreadIoHandle, mStreamType, mSessionId);
    495         }
    496     }
    497 }
    498 
    499 /*static*/ void AudioFlinger::PlaybackThread::Track::appendDumpHeader(String8& result)
    500 {
    501     result.append("T Name Active Client Session S  Flags "
    502                   "  Format Chn mask  SRate "
    503                   "ST  L dB  R dB  VS dB "
    504                   "  Server FrmCnt  FrmRdy F Underruns  Flushed "
    505                   "Main Buf  Aux Buf\n");
    506 }
    507 
    508 void AudioFlinger::PlaybackThread::Track::appendDump(String8& result, bool active)
    509 {
    510     char trackType;
    511     switch (mType) {
    512     case TYPE_DEFAULT:
    513     case TYPE_OUTPUT:
    514         if (mSharedBuffer.get() != nullptr) {
    515             trackType = 'S'; // static
    516         } else {
    517             trackType = ' '; // normal
    518         }
    519         break;
    520     case TYPE_PATCH:
    521         trackType = 'P';
    522         break;
    523     default:
    524         trackType = '?';
    525     }
    526 
    527     if (isFastTrack()) {
    528         result.appendFormat("F%c %3d", trackType, mFastIndex);
    529     } else if (mName >= AudioMixer::TRACK0) {
    530         result.appendFormat("%c %4d", trackType, mName - AudioMixer::TRACK0);
    531     } else {
    532         result.appendFormat("%c none", trackType);
    533     }
    534 
    535     char nowInUnderrun;
    536     switch (mObservedUnderruns.mBitFields.mMostRecent) {
    537     case UNDERRUN_FULL:
    538         nowInUnderrun = ' ';
    539         break;
    540     case UNDERRUN_PARTIAL:
    541         nowInUnderrun = '<';
    542         break;
    543     case UNDERRUN_EMPTY:
    544         nowInUnderrun = '*';
    545         break;
    546     default:
    547         nowInUnderrun = '?';
    548         break;
    549     }
    550 
    551     char fillingStatus;
    552     switch (mFillingUpStatus) {
    553     case FS_INVALID:
    554         fillingStatus = 'I';
    555         break;
    556     case FS_FILLING:
    557         fillingStatus = 'f';
    558         break;
    559     case FS_FILLED:
    560         fillingStatus = 'F';
    561         break;
    562     case FS_ACTIVE:
    563         fillingStatus = 'A';
    564         break;
    565     default:
    566         fillingStatus = '?';
    567         break;
    568     }
    569 
    570     // clip framesReadySafe to max representation in dump
    571     const size_t framesReadySafe =
    572             std::min(mAudioTrackServerProxy->framesReadySafe(), (size_t)99999999);
    573 
    574     // obtain volumes
    575     const gain_minifloat_packed_t vlr = mAudioTrackServerProxy->getVolumeLR();
    576     const std::pair<float /* volume */, bool /* active */> vsVolume =
    577             mVolumeHandler->getLastVolume();
    578 
    579     // Our effective frame count is obtained by ServerProxy::getBufferSizeInFrames()
    580     // as it may be reduced by the application.
    581     const size_t bufferSizeInFrames = (size_t)mAudioTrackServerProxy->getBufferSizeInFrames();
    582     // Check whether the buffer size has been modified by the app.
    583     const char modifiedBufferChar = bufferSizeInFrames < mFrameCount
    584             ? 'r' /* buffer reduced */: bufferSizeInFrames > mFrameCount
    585                     ? 'e' /* error */ : ' ' /* identical */;
    586 
    587     result.appendFormat("%7s %6u %7u %2s 0x%03X "
    588                            "%08X %08X %6u "
    589                            "%2u %5.2g %5.2g %5.2g%c "
    590                            "%08X %6zu%c %6zu %c %9u%c %7u "
    591                            "%08zX %08zX\n",
    592             active ? "yes" : "no",
    593             (mClient == 0) ? getpid_cached : mClient->pid(),
    594             mSessionId,
    595             getTrackStateString(),
    596             mCblk->mFlags,
    597 
    598             mFormat,
    599             mChannelMask,
    600             mAudioTrackServerProxy->getSampleRate(),
    601 
    602             mStreamType,
    603             20.0 * log10(float_from_gain(gain_minifloat_unpack_left(vlr))),
    604             20.0 * log10(float_from_gain(gain_minifloat_unpack_right(vlr))),
    605             20.0 * log10(vsVolume.first), // VolumeShaper(s) total volume
    606             vsVolume.second ? 'A' : ' ',  // if any VolumeShapers active
    607 
    608             mCblk->mServer,
    609             bufferSizeInFrames,
    610             modifiedBufferChar,
    611             framesReadySafe,
    612             fillingStatus,
    613             mAudioTrackServerProxy->getUnderrunFrames(),
    614             nowInUnderrun,
    615             (unsigned)mAudioTrackServerProxy->framesFlushed() % 10000000,
    616 
    617             (size_t)mMainBuffer, // use %zX as %p appends 0x
    618             (size_t)mAuxBuffer   // use %zX as %p appends 0x
    619             );
    620 }
    621 
    622 uint32_t AudioFlinger::PlaybackThread::Track::sampleRate() const {
    623     return mAudioTrackServerProxy->getSampleRate();
    624 }
    625 
    626 // AudioBufferProvider interface
    627 status_t AudioFlinger::PlaybackThread::Track::getNextBuffer(
    628         AudioBufferProvider::Buffer* buffer)
    629 {
    630     ServerProxy::Buffer buf;
    631     size_t desiredFrames = buffer->frameCount;
    632     buf.mFrameCount = desiredFrames;
    633     status_t status = mServerProxy->obtainBuffer(&buf);
    634     buffer->frameCount = buf.mFrameCount;
    635     buffer->raw = buf.mRaw;
    636     if (buf.mFrameCount == 0 && !isStopping() && !isStopped() && !isPaused()) {
    637         ALOGV("underrun,  framesReady(%zu) < framesDesired(%zd), state: %d",
    638                 buf.mFrameCount, desiredFrames, mState);
    639         mAudioTrackServerProxy->tallyUnderrunFrames(desiredFrames);
    640     } else {
    641         mAudioTrackServerProxy->tallyUnderrunFrames(0);
    642     }
    643 
    644     return status;
    645 }
    646 
    647 // releaseBuffer() is not overridden
    648 
    649 // ExtendedAudioBufferProvider interface
    650 
    651 // framesReady() may return an approximation of the number of frames if called
    652 // from a different thread than the one calling Proxy->obtainBuffer() and
    653 // Proxy->releaseBuffer(). Also note there is no mutual exclusion in the
    654 // AudioTrackServerProxy so be especially careful calling with FastTracks.
    655 size_t AudioFlinger::PlaybackThread::Track::framesReady() const {
    656     if (mSharedBuffer != 0 && (isStopped() || isStopping())) {
    657         // Static tracks return zero frames immediately upon stopping (for FastTracks).
    658         // The remainder of the buffer is not drained.
    659         return 0;
    660     }
    661     return mAudioTrackServerProxy->framesReady();
    662 }
    663 
    664 int64_t AudioFlinger::PlaybackThread::Track::framesReleased() const
    665 {
    666     return mAudioTrackServerProxy->framesReleased();
    667 }
    668 
    669 void AudioFlinger::PlaybackThread::Track::onTimestamp(const ExtendedTimestamp &timestamp)
    670 {
    671     // This call comes from a FastTrack and should be kept lockless.
    672     // The server side frames are already translated to client frames.
    673     mAudioTrackServerProxy->setTimestamp(timestamp);
    674 
    675     // We do not set drained here, as FastTrack timestamp may not go to very last frame.
    676 }
    677 
    678 // Don't call for fast tracks; the framesReady() could result in priority inversion
    679 bool AudioFlinger::PlaybackThread::Track::isReady() const {
    680     if (mFillingUpStatus != FS_FILLING || isStopped() || isPausing()) {
    681         return true;
    682     }
    683 
    684     if (isStopping()) {
    685         if (framesReady() > 0) {
    686             mFillingUpStatus = FS_FILLED;
    687         }
    688         return true;
    689     }
    690 
    691     if (framesReady() >= mServerProxy->getBufferSizeInFrames() ||
    692             (mCblk->mFlags & CBLK_FORCEREADY)) {
    693         mFillingUpStatus = FS_FILLED;
    694         android_atomic_and(~CBLK_FORCEREADY, &mCblk->mFlags);
    695         return true;
    696     }
    697     return false;
    698 }
    699 
    700 status_t AudioFlinger::PlaybackThread::Track::start(AudioSystem::sync_event_t event __unused,
    701                                                     audio_session_t triggerSession __unused)
    702 {
    703     status_t status = NO_ERROR;
    704     ALOGV("start(%d), calling pid %d session %d",
    705             mName, IPCThreadState::self()->getCallingPid(), mSessionId);
    706 
    707     sp<ThreadBase> thread = mThread.promote();
    708     if (thread != 0) {
    709         if (isOffloaded()) {
    710             Mutex::Autolock _laf(thread->mAudioFlinger->mLock);
    711             Mutex::Autolock _lth(thread->mLock);
    712             sp<EffectChain> ec = thread->getEffectChain_l(mSessionId);
    713             if (thread->mAudioFlinger->isNonOffloadableGlobalEffectEnabled_l() ||
    714                     (ec != 0 && ec->isNonOffloadableEnabled())) {
    715                 invalidate();
    716                 return PERMISSION_DENIED;
    717             }
    718         }
    719         Mutex::Autolock _lth(thread->mLock);
    720         track_state state = mState;
    721         // here the track could be either new, or restarted
    722         // in both cases "unstop" the track
    723 
    724         // initial state-stopping. next state-pausing.
    725         // What if resume is called ?
    726 
    727         if (state == PAUSED || state == PAUSING) {
    728             if (mResumeToStopping) {
    729                 // happened we need to resume to STOPPING_1
    730                 mState = TrackBase::STOPPING_1;
    731                 ALOGV("PAUSED => STOPPING_1 (%d) on thread %p", mName, this);
    732             } else {
    733                 mState = TrackBase::RESUMING;
    734                 ALOGV("PAUSED => RESUMING (%d) on thread %p", mName, this);
    735             }
    736         } else {
    737             mState = TrackBase::ACTIVE;
    738             ALOGV("? => ACTIVE (%d) on thread %p", mName, this);
    739         }
    740 
    741         // states to reset position info for non-offloaded/direct tracks
    742         if (!isOffloaded() && !isDirect()
    743                 && (state == IDLE || state == STOPPED || state == FLUSHED)) {
    744             mFrameMap.reset();
    745         }
    746         PlaybackThread *playbackThread = (PlaybackThread *)thread.get();
    747         if (isFastTrack()) {
    748             // refresh fast track underruns on start because that field is never cleared
    749             // by the fast mixer; furthermore, the same track can be recycled, i.e. start
    750             // after stop.
    751             mObservedUnderruns = playbackThread->getFastTrackUnderruns(mFastIndex);
    752         }
    753         status = playbackThread->addTrack_l(this);
    754         if (status == INVALID_OPERATION || status == PERMISSION_DENIED) {
    755             triggerEvents(AudioSystem::SYNC_EVENT_PRESENTATION_COMPLETE);
    756             //  restore previous state if start was rejected by policy manager
    757             if (status == PERMISSION_DENIED) {
    758                 mState = state;
    759             }
    760         }
    761         // track was already in the active list, not a problem
    762         if (status == ALREADY_EXISTS) {
    763             status = NO_ERROR;
    764         } else {
    765             // Acknowledge any pending flush(), so that subsequent new data isn't discarded.
    766             // It is usually unsafe to access the server proxy from a binder thread.
    767             // But in this case we know the mixer thread (whether normal mixer or fast mixer)
    768             // isn't looking at this track yet:  we still hold the normal mixer thread lock,
    769             // and for fast tracks the track is not yet in the fast mixer thread's active set.
    770             // For static tracks, this is used to acknowledge change in position or loop.
    771             ServerProxy::Buffer buffer;
    772             buffer.mFrameCount = 1;
    773             (void) mAudioTrackServerProxy->obtainBuffer(&buffer, true /*ackFlush*/);
    774         }
    775     } else {
    776         status = BAD_VALUE;
    777     }
    778     return status;
    779 }
    780 
    781 void AudioFlinger::PlaybackThread::Track::stop()
    782 {
    783     ALOGV("stop(%d), calling pid %d", mName, IPCThreadState::self()->getCallingPid());
    784     sp<ThreadBase> thread = mThread.promote();
    785     if (thread != 0) {
    786         Mutex::Autolock _l(thread->mLock);
    787         track_state state = mState;
    788         if (state == RESUMING || state == ACTIVE || state == PAUSING || state == PAUSED) {
    789             // If the track is not active (PAUSED and buffers full), flush buffers
    790             PlaybackThread *playbackThread = (PlaybackThread *)thread.get();
    791             if (playbackThread->mActiveTracks.indexOf(this) < 0) {
    792                 reset();
    793                 mState = STOPPED;
    794             } else if (!isFastTrack() && !isOffloaded() && !isDirect()) {
    795                 mState = STOPPED;
    796             } else {
    797                 // For fast tracks prepareTracks_l() will set state to STOPPING_2
    798                 // presentation is complete
    799                 // For an offloaded track this starts a drain and state will
    800                 // move to STOPPING_2 when drain completes and then STOPPED
    801                 mState = STOPPING_1;
    802                 if (isOffloaded()) {
    803                     mRetryCount = PlaybackThread::kMaxTrackStopRetriesOffload;
    804                 }
    805             }
    806             playbackThread->broadcast_l();
    807             ALOGV("not stopping/stopped => stopping/stopped (%d) on thread %p", mName,
    808                     playbackThread);
    809         }
    810     }
    811 }
    812 
    813 void AudioFlinger::PlaybackThread::Track::pause()
    814 {
    815     ALOGV("pause(%d), calling pid %d", mName, IPCThreadState::self()->getCallingPid());
    816     sp<ThreadBase> thread = mThread.promote();
    817     if (thread != 0) {
    818         Mutex::Autolock _l(thread->mLock);
    819         PlaybackThread *playbackThread = (PlaybackThread *)thread.get();
    820         switch (mState) {
    821         case STOPPING_1:
    822         case STOPPING_2:
    823             if (!isOffloaded()) {
    824                 /* nothing to do if track is not offloaded */
    825                 break;
    826             }
    827 
    828             // Offloaded track was draining, we need to carry on draining when resumed
    829             mResumeToStopping = true;
    830             // fall through...
    831         case ACTIVE:
    832         case RESUMING:
    833             mState = PAUSING;
    834             ALOGV("ACTIVE/RESUMING => PAUSING (%d) on thread %p", mName, thread.get());
    835             playbackThread->broadcast_l();
    836             break;
    837 
    838         default:
    839             break;
    840         }
    841     }
    842 }
    843 
    844 void AudioFlinger::PlaybackThread::Track::flush()
    845 {
    846     ALOGV("flush(%d)", mName);
    847     sp<ThreadBase> thread = mThread.promote();
    848     if (thread != 0) {
    849         Mutex::Autolock _l(thread->mLock);
    850         PlaybackThread *playbackThread = (PlaybackThread *)thread.get();
    851 
    852         // Flush the ring buffer now if the track is not active in the PlaybackThread.
    853         // Otherwise the flush would not be done until the track is resumed.
    854         // Requires FastTrack removal be BLOCK_UNTIL_ACKED
    855         if (playbackThread->mActiveTracks.indexOf(this) < 0) {
    856             (void)mServerProxy->flushBufferIfNeeded();
    857         }
    858 
    859         if (isOffloaded()) {
    860             // If offloaded we allow flush during any state except terminated
    861             // and keep the track active to avoid problems if user is seeking
    862             // rapidly and underlying hardware has a significant delay handling
    863             // a pause
    864             if (isTerminated()) {
    865                 return;
    866             }
    867 
    868             ALOGV("flush: offload flush");
    869             reset();
    870 
    871             if (mState == STOPPING_1 || mState == STOPPING_2) {
    872                 ALOGV("flushed in STOPPING_1 or 2 state, change state to ACTIVE");
    873                 mState = ACTIVE;
    874             }
    875 
    876             mFlushHwPending = true;
    877             mResumeToStopping = false;
    878         } else {
    879             if (mState != STOPPING_1 && mState != STOPPING_2 && mState != STOPPED &&
    880                     mState != PAUSED && mState != PAUSING && mState != IDLE && mState != FLUSHED) {
    881                 return;
    882             }
    883             // No point remaining in PAUSED state after a flush => go to
    884             // FLUSHED state
    885             mState = FLUSHED;
    886             // do not reset the track if it is still in the process of being stopped or paused.
    887             // this will be done by prepareTracks_l() when the track is stopped.
    888             // prepareTracks_l() will see mState == FLUSHED, then
    889             // remove from active track list, reset(), and trigger presentation complete
    890             if (isDirect()) {
    891                 mFlushHwPending = true;
    892             }
    893             if (playbackThread->mActiveTracks.indexOf(this) < 0) {
    894                 reset();
    895             }
    896         }
    897         // Prevent flush being lost if the track is flushed and then resumed
    898         // before mixer thread can run. This is important when offloading
    899         // because the hardware buffer could hold a large amount of audio
    900         playbackThread->broadcast_l();
    901     }
    902 }
    903 
    904 // must be called with thread lock held
    905 void AudioFlinger::PlaybackThread::Track::flushAck()
    906 {
    907     if (!isOffloaded() && !isDirect())
    908         return;
    909 
    910     // Clear the client ring buffer so that the app can prime the buffer while paused.
    911     // Otherwise it might not get cleared until playback is resumed and obtainBuffer() is called.
    912     mServerProxy->flushBufferIfNeeded();
    913 
    914     mFlushHwPending = false;
    915 }
    916 
    917 void AudioFlinger::PlaybackThread::Track::reset()
    918 {
    919     // Do not reset twice to avoid discarding data written just after a flush and before
    920     // the audioflinger thread detects the track is stopped.
    921     if (!mResetDone) {
    922         // Force underrun condition to avoid false underrun callback until first data is
    923         // written to buffer
    924         android_atomic_and(~CBLK_FORCEREADY, &mCblk->mFlags);
    925         mFillingUpStatus = FS_FILLING;
    926         mResetDone = true;
    927         if (mState == FLUSHED) {
    928             mState = IDLE;
    929         }
    930     }
    931 }
    932 
    933 status_t AudioFlinger::PlaybackThread::Track::setParameters(const String8& keyValuePairs)
    934 {
    935     sp<ThreadBase> thread = mThread.promote();
    936     if (thread == 0) {
    937         ALOGE("thread is dead");
    938         return FAILED_TRANSACTION;
    939     } else if ((thread->type() == ThreadBase::DIRECT) ||
    940                     (thread->type() == ThreadBase::OFFLOAD)) {
    941         return thread->setParameters(keyValuePairs);
    942     } else {
    943         return PERMISSION_DENIED;
    944     }
    945 }
    946 
    947 VolumeShaper::Status AudioFlinger::PlaybackThread::Track::applyVolumeShaper(
    948         const sp<VolumeShaper::Configuration>& configuration,
    949         const sp<VolumeShaper::Operation>& operation)
    950 {
    951     sp<VolumeShaper::Configuration> newConfiguration;
    952 
    953     if (isOffloadedOrDirect()) {
    954         const VolumeShaper::Configuration::OptionFlag optionFlag
    955             = configuration->getOptionFlags();
    956         if ((optionFlag & VolumeShaper::Configuration::OPTION_FLAG_CLOCK_TIME) == 0) {
    957             ALOGW("%s tracks do not support frame counted VolumeShaper,"
    958                     " using clock time instead", isOffloaded() ? "Offload" : "Direct");
    959             newConfiguration = new VolumeShaper::Configuration(*configuration);
    960             newConfiguration->setOptionFlags(
    961                 VolumeShaper::Configuration::OptionFlag(optionFlag
    962                         | VolumeShaper::Configuration::OPTION_FLAG_CLOCK_TIME));
    963         }
    964     }
    965 
    966     VolumeShaper::Status status = mVolumeHandler->applyVolumeShaper(
    967             (newConfiguration.get() != nullptr ? newConfiguration : configuration), operation);
    968 
    969     if (isOffloadedOrDirect()) {
    970         // Signal thread to fetch new volume.
    971         sp<ThreadBase> thread = mThread.promote();
    972         if (thread != 0) {
    973              Mutex::Autolock _l(thread->mLock);
    974             thread->broadcast_l();
    975         }
    976     }
    977     return status;
    978 }
    979 
    980 sp<VolumeShaper::State> AudioFlinger::PlaybackThread::Track::getVolumeShaperState(int id)
    981 {
    982     // Note: We don't check if Thread exists.
    983 
    984     // mVolumeHandler is thread safe.
    985     return mVolumeHandler->getVolumeShaperState(id);
    986 }
    987 
    988 status_t AudioFlinger::PlaybackThread::Track::getTimestamp(AudioTimestamp& timestamp)
    989 {
    990     if (!isOffloaded() && !isDirect()) {
    991         return INVALID_OPERATION; // normal tracks handled through SSQ
    992     }
    993     sp<ThreadBase> thread = mThread.promote();
    994     if (thread == 0) {
    995         return INVALID_OPERATION;
    996     }
    997 
    998     Mutex::Autolock _l(thread->mLock);
    999     PlaybackThread *playbackThread = (PlaybackThread *)thread.get();
   1000     return playbackThread->getTimestamp_l(timestamp);
   1001 }
   1002 
   1003 status_t AudioFlinger::PlaybackThread::Track::attachAuxEffect(int EffectId)
   1004 {
   1005     status_t status = DEAD_OBJECT;
   1006     sp<ThreadBase> thread = mThread.promote();
   1007     if (thread != 0) {
   1008         PlaybackThread *playbackThread = (PlaybackThread *)thread.get();
   1009         sp<AudioFlinger> af = mClient->audioFlinger();
   1010 
   1011         Mutex::Autolock _l(af->mLock);
   1012 
   1013         sp<PlaybackThread> srcThread = af->getEffectThread_l(AUDIO_SESSION_OUTPUT_MIX, EffectId);
   1014 
   1015         if (EffectId != 0 && srcThread != 0 && playbackThread != srcThread.get()) {
   1016             Mutex::Autolock _dl(playbackThread->mLock);
   1017             Mutex::Autolock _sl(srcThread->mLock);
   1018             sp<EffectChain> chain = srcThread->getEffectChain_l(AUDIO_SESSION_OUTPUT_MIX);
   1019             if (chain == 0) {
   1020                 return INVALID_OPERATION;
   1021             }
   1022 
   1023             sp<EffectModule> effect = chain->getEffectFromId_l(EffectId);
   1024             if (effect == 0) {
   1025                 return INVALID_OPERATION;
   1026             }
   1027             srcThread->removeEffect_l(effect);
   1028             status = playbackThread->addEffect_l(effect);
   1029             if (status != NO_ERROR) {
   1030                 srcThread->addEffect_l(effect);
   1031                 return INVALID_OPERATION;
   1032             }
   1033             // removeEffect_l() has stopped the effect if it was active so it must be restarted
   1034             if (effect->state() == EffectModule::ACTIVE ||
   1035                     effect->state() == EffectModule::STOPPING) {
   1036                 effect->start();
   1037             }
   1038 
   1039             sp<EffectChain> dstChain = effect->chain().promote();
   1040             if (dstChain == 0) {
   1041                 srcThread->addEffect_l(effect);
   1042                 return INVALID_OPERATION;
   1043             }
   1044             AudioSystem::unregisterEffect(effect->id());
   1045             AudioSystem::registerEffect(&effect->desc(),
   1046                                         srcThread->id(),
   1047                                         dstChain->strategy(),
   1048                                         AUDIO_SESSION_OUTPUT_MIX,
   1049                                         effect->id());
   1050             AudioSystem::setEffectEnabled(effect->id(), effect->isEnabled());
   1051         }
   1052         status = playbackThread->attachAuxEffect(this, EffectId);
   1053     }
   1054     return status;
   1055 }
   1056 
   1057 void AudioFlinger::PlaybackThread::Track::setAuxBuffer(int EffectId, int32_t *buffer)
   1058 {
   1059     mAuxEffectId = EffectId;
   1060     mAuxBuffer = buffer;
   1061 }
   1062 
   1063 bool AudioFlinger::PlaybackThread::Track::presentationComplete(
   1064         int64_t framesWritten, size_t audioHalFrames)
   1065 {
   1066     // TODO: improve this based on FrameMap if it exists, to ensure full drain.
   1067     // This assists in proper timestamp computation as well as wakelock management.
   1068 
   1069     // a track is considered presented when the total number of frames written to audio HAL
   1070     // corresponds to the number of frames written when presentationComplete() is called for the
   1071     // first time (mPresentationCompleteFrames == 0) plus the buffer filling status at that time.
   1072     // For an offloaded track the HAL+h/w delay is variable so a HAL drain() is used
   1073     // to detect when all frames have been played. In this case framesWritten isn't
   1074     // useful because it doesn't always reflect whether there is data in the h/w
   1075     // buffers, particularly if a track has been paused and resumed during draining
   1076     ALOGV("presentationComplete() mPresentationCompleteFrames %lld framesWritten %lld",
   1077             (long long)mPresentationCompleteFrames, (long long)framesWritten);
   1078     if (mPresentationCompleteFrames == 0) {
   1079         mPresentationCompleteFrames = framesWritten + audioHalFrames;
   1080         ALOGV("presentationComplete() reset: mPresentationCompleteFrames %lld audioHalFrames %zu",
   1081                 (long long)mPresentationCompleteFrames, audioHalFrames);
   1082     }
   1083 
   1084     bool complete;
   1085     if (isOffloaded()) {
   1086         complete = true;
   1087     } else if (isDirect() || isFastTrack()) { // these do not go through linear map
   1088         complete = framesWritten >= (int64_t) mPresentationCompleteFrames;
   1089     } else {  // Normal tracks, OutputTracks, and PatchTracks
   1090         complete = framesWritten >= (int64_t) mPresentationCompleteFrames
   1091                 && mAudioTrackServerProxy->isDrained();
   1092     }
   1093 
   1094     if (complete) {
   1095         triggerEvents(AudioSystem::SYNC_EVENT_PRESENTATION_COMPLETE);
   1096         mAudioTrackServerProxy->setStreamEndDone();
   1097         return true;
   1098     }
   1099     return false;
   1100 }
   1101 
   1102 void AudioFlinger::PlaybackThread::Track::triggerEvents(AudioSystem::sync_event_t type)
   1103 {
   1104     for (size_t i = 0; i < mSyncEvents.size(); i++) {
   1105         if (mSyncEvents[i]->type() == type) {
   1106             mSyncEvents[i]->trigger();
   1107             mSyncEvents.removeAt(i);
   1108             i--;
   1109         }
   1110     }
   1111 }
   1112 
   1113 // implement VolumeBufferProvider interface
   1114 
   1115 gain_minifloat_packed_t AudioFlinger::PlaybackThread::Track::getVolumeLR()
   1116 {
   1117     // called by FastMixer, so not allowed to take any locks, block, or do I/O including logs
   1118     ALOG_ASSERT(isFastTrack() && (mCblk != NULL));
   1119     gain_minifloat_packed_t vlr = mAudioTrackServerProxy->getVolumeLR();
   1120     float vl = float_from_gain(gain_minifloat_unpack_left(vlr));
   1121     float vr = float_from_gain(gain_minifloat_unpack_right(vlr));
   1122     // track volumes come from shared memory, so can't be trusted and must be clamped
   1123     if (vl > GAIN_FLOAT_UNITY) {
   1124         vl = GAIN_FLOAT_UNITY;
   1125     }
   1126     if (vr > GAIN_FLOAT_UNITY) {
   1127         vr = GAIN_FLOAT_UNITY;
   1128     }
   1129     // now apply the cached master volume and stream type volume;
   1130     // this is trusted but lacks any synchronization or barrier so may be stale
   1131     float v = mCachedVolume;
   1132     vl *= v;
   1133     vr *= v;
   1134     // re-combine into packed minifloat
   1135     vlr = gain_minifloat_pack(gain_from_float(vl), gain_from_float(vr));
   1136     // FIXME look at mute, pause, and stop flags
   1137     return vlr;
   1138 }
   1139 
   1140 status_t AudioFlinger::PlaybackThread::Track::setSyncEvent(const sp<SyncEvent>& event)
   1141 {
   1142     if (isTerminated() || mState == PAUSED ||
   1143             ((framesReady() == 0) && ((mSharedBuffer != 0) ||
   1144                                       (mState == STOPPED)))) {
   1145         ALOGW("Track::setSyncEvent() in invalid state %d on session %d %s mode, framesReady %zu",
   1146               mState, mSessionId, (mSharedBuffer != 0) ? "static" : "stream", framesReady());
   1147         event->cancel();
   1148         return INVALID_OPERATION;
   1149     }
   1150     (void) TrackBase::setSyncEvent(event);
   1151     return NO_ERROR;
   1152 }
   1153 
   1154 void AudioFlinger::PlaybackThread::Track::invalidate()
   1155 {
   1156     TrackBase::invalidate();
   1157     signalClientFlag(CBLK_INVALID);
   1158 }
   1159 
   1160 void AudioFlinger::PlaybackThread::Track::disable()
   1161 {
   1162     signalClientFlag(CBLK_DISABLED);
   1163 }
   1164 
   1165 void AudioFlinger::PlaybackThread::Track::signalClientFlag(int32_t flag)
   1166 {
   1167     // FIXME should use proxy, and needs work
   1168     audio_track_cblk_t* cblk = mCblk;
   1169     android_atomic_or(flag, &cblk->mFlags);
   1170     android_atomic_release_store(0x40000000, &cblk->mFutex);
   1171     // client is not in server, so FUTEX_WAKE is needed instead of FUTEX_WAKE_PRIVATE
   1172     (void) syscall(__NR_futex, &cblk->mFutex, FUTEX_WAKE, INT_MAX);
   1173 }
   1174 
   1175 void AudioFlinger::PlaybackThread::Track::signal()
   1176 {
   1177     sp<ThreadBase> thread = mThread.promote();
   1178     if (thread != 0) {
   1179         PlaybackThread *t = (PlaybackThread *)thread.get();
   1180         Mutex::Autolock _l(t->mLock);
   1181         t->broadcast_l();
   1182     }
   1183 }
   1184 
   1185 //To be called with thread lock held
   1186 bool AudioFlinger::PlaybackThread::Track::isResumePending() {
   1187 
   1188     if (mState == RESUMING)
   1189         return true;
   1190     /* Resume is pending if track was stopping before pause was called */
   1191     if (mState == STOPPING_1 &&
   1192         mResumeToStopping)
   1193         return true;
   1194 
   1195     return false;
   1196 }
   1197 
   1198 //To be called with thread lock held
   1199 void AudioFlinger::PlaybackThread::Track::resumeAck() {
   1200 
   1201 
   1202     if (mState == RESUMING)
   1203         mState = ACTIVE;
   1204 
   1205     // Other possibility of  pending resume is stopping_1 state
   1206     // Do not update the state from stopping as this prevents
   1207     // drain being called.
   1208     if (mState == STOPPING_1) {
   1209         mResumeToStopping = false;
   1210     }
   1211 }
   1212 
   1213 //To be called with thread lock held
   1214 void AudioFlinger::PlaybackThread::Track::updateTrackFrameInfo(
   1215         int64_t trackFramesReleased, int64_t sinkFramesWritten,
   1216         const ExtendedTimestamp &timeStamp) {
   1217     //update frame map
   1218     mFrameMap.push(trackFramesReleased, sinkFramesWritten);
   1219 
   1220     // adjust server times and set drained state.
   1221     //
   1222     // Our timestamps are only updated when the track is on the Thread active list.
   1223     // We need to ensure that tracks are not removed before full drain.
   1224     ExtendedTimestamp local = timeStamp;
   1225     bool checked = false;
   1226     for (int i = ExtendedTimestamp::LOCATION_MAX - 1;
   1227             i >= ExtendedTimestamp::LOCATION_SERVER; --i) {
   1228         // Lookup the track frame corresponding to the sink frame position.
   1229         if (local.mTimeNs[i] > 0) {
   1230             local.mPosition[i] = mFrameMap.findX(local.mPosition[i]);
   1231             // check drain state from the latest stage in the pipeline.
   1232             if (!checked && i <= ExtendedTimestamp::LOCATION_KERNEL) {
   1233                 mAudioTrackServerProxy->setDrained(
   1234                         local.mPosition[i] >= mAudioTrackServerProxy->framesReleased());
   1235                 checked = true;
   1236             }
   1237         }
   1238     }
   1239     if (!checked) { // no server info, assume drained.
   1240         mAudioTrackServerProxy->setDrained(true);
   1241     }
   1242     // Set correction for flushed frames that are not accounted for in released.
   1243     local.mFlushed = mAudioTrackServerProxy->framesFlushed();
   1244     mServerProxy->setTimestamp(local);
   1245 }
   1246 
   1247 // ----------------------------------------------------------------------------
   1248 
   1249 AudioFlinger::PlaybackThread::OutputTrack::OutputTrack(
   1250             PlaybackThread *playbackThread,
   1251             DuplicatingThread *sourceThread,
   1252             uint32_t sampleRate,
   1253             audio_format_t format,
   1254             audio_channel_mask_t channelMask,
   1255             size_t frameCount,
   1256             uid_t uid)
   1257     :   Track(playbackThread, NULL, AUDIO_STREAM_PATCH,
   1258               sampleRate, format, channelMask, frameCount,
   1259               nullptr /* buffer */, (size_t)0 /* bufferSize */, nullptr /* sharedBuffer */,
   1260               AUDIO_SESSION_NONE, uid, AUDIO_OUTPUT_FLAG_NONE,
   1261               TYPE_OUTPUT),
   1262     mActive(false), mSourceThread(sourceThread)
   1263 {
   1264 
   1265     if (mCblk != NULL) {
   1266         mOutBuffer.frameCount = 0;
   1267         playbackThread->mTracks.add(this);
   1268         ALOGV("OutputTrack constructor mCblk %p, mBuffer %p, "
   1269                 "frameCount %zu, mChannelMask 0x%08x",
   1270                 mCblk, mBuffer,
   1271                 frameCount, mChannelMask);
   1272         // since client and server are in the same process,
   1273         // the buffer has the same virtual address on both sides
   1274         mClientProxy = new AudioTrackClientProxy(mCblk, mBuffer, mFrameCount, mFrameSize,
   1275                 true /*clientInServer*/);
   1276         mClientProxy->setVolumeLR(GAIN_MINIFLOAT_PACKED_UNITY);
   1277         mClientProxy->setSendLevel(0.0);
   1278         mClientProxy->setSampleRate(sampleRate);
   1279     } else {
   1280         ALOGW("Error creating output track on thread %p", playbackThread);
   1281     }
   1282 }
   1283 
   1284 AudioFlinger::PlaybackThread::OutputTrack::~OutputTrack()
   1285 {
   1286     clearBufferQueue();
   1287     // superclass destructor will now delete the server proxy and shared memory both refer to
   1288 }
   1289 
   1290 status_t AudioFlinger::PlaybackThread::OutputTrack::start(AudioSystem::sync_event_t event,
   1291                                                           audio_session_t triggerSession)
   1292 {
   1293     status_t status = Track::start(event, triggerSession);
   1294     if (status != NO_ERROR) {
   1295         return status;
   1296     }
   1297 
   1298     mActive = true;
   1299     mRetryCount = 127;
   1300     return status;
   1301 }
   1302 
   1303 void AudioFlinger::PlaybackThread::OutputTrack::stop()
   1304 {
   1305     Track::stop();
   1306     clearBufferQueue();
   1307     mOutBuffer.frameCount = 0;
   1308     mActive = false;
   1309 }
   1310 
   1311 bool AudioFlinger::PlaybackThread::OutputTrack::write(void* data, uint32_t frames)
   1312 {
   1313     Buffer *pInBuffer;
   1314     Buffer inBuffer;
   1315     bool outputBufferFull = false;
   1316     inBuffer.frameCount = frames;
   1317     inBuffer.raw = data;
   1318 
   1319     uint32_t waitTimeLeftMs = mSourceThread->waitTimeMs();
   1320 
   1321     if (!mActive && frames != 0) {
   1322         (void) start();
   1323     }
   1324 
   1325     while (waitTimeLeftMs) {
   1326         // First write pending buffers, then new data
   1327         if (mBufferQueue.size()) {
   1328             pInBuffer = mBufferQueue.itemAt(0);
   1329         } else {
   1330             pInBuffer = &inBuffer;
   1331         }
   1332 
   1333         if (pInBuffer->frameCount == 0) {
   1334             break;
   1335         }
   1336 
   1337         if (mOutBuffer.frameCount == 0) {
   1338             mOutBuffer.frameCount = pInBuffer->frameCount;
   1339             nsecs_t startTime = systemTime();
   1340             status_t status = obtainBuffer(&mOutBuffer, waitTimeLeftMs);
   1341             if (status != NO_ERROR && status != NOT_ENOUGH_DATA) {
   1342                 ALOGV("OutputTrack::write() %p thread %p no more output buffers; status %d", this,
   1343                         mThread.unsafe_get(), status);
   1344                 outputBufferFull = true;
   1345                 break;
   1346             }
   1347             uint32_t waitTimeMs = (uint32_t)ns2ms(systemTime() - startTime);
   1348             if (waitTimeLeftMs >= waitTimeMs) {
   1349                 waitTimeLeftMs -= waitTimeMs;
   1350             } else {
   1351                 waitTimeLeftMs = 0;
   1352             }
   1353             if (status == NOT_ENOUGH_DATA) {
   1354                 restartIfDisabled();
   1355                 continue;
   1356             }
   1357         }
   1358 
   1359         uint32_t outFrames = pInBuffer->frameCount > mOutBuffer.frameCount ? mOutBuffer.frameCount :
   1360                 pInBuffer->frameCount;
   1361         memcpy(mOutBuffer.raw, pInBuffer->raw, outFrames * mFrameSize);
   1362         Proxy::Buffer buf;
   1363         buf.mFrameCount = outFrames;
   1364         buf.mRaw = NULL;
   1365         mClientProxy->releaseBuffer(&buf);
   1366         restartIfDisabled();
   1367         pInBuffer->frameCount -= outFrames;
   1368         pInBuffer->raw = (int8_t *)pInBuffer->raw + outFrames * mFrameSize;
   1369         mOutBuffer.frameCount -= outFrames;
   1370         mOutBuffer.raw = (int8_t *)mOutBuffer.raw + outFrames * mFrameSize;
   1371 
   1372         if (pInBuffer->frameCount == 0) {
   1373             if (mBufferQueue.size()) {
   1374                 mBufferQueue.removeAt(0);
   1375                 free(pInBuffer->mBuffer);
   1376                 if (pInBuffer != &inBuffer) {
   1377                     delete pInBuffer;
   1378                 }
   1379                 ALOGV("OutputTrack::write() %p thread %p released overflow buffer %zu", this,
   1380                         mThread.unsafe_get(), mBufferQueue.size());
   1381             } else {
   1382                 break;
   1383             }
   1384         }
   1385     }
   1386 
   1387     // If we could not write all frames, allocate a buffer and queue it for next time.
   1388     if (inBuffer.frameCount) {
   1389         sp<ThreadBase> thread = mThread.promote();
   1390         if (thread != 0 && !thread->standby()) {
   1391             if (mBufferQueue.size() < kMaxOverFlowBuffers) {
   1392                 pInBuffer = new Buffer;
   1393                 pInBuffer->mBuffer = malloc(inBuffer.frameCount * mFrameSize);
   1394                 pInBuffer->frameCount = inBuffer.frameCount;
   1395                 pInBuffer->raw = pInBuffer->mBuffer;
   1396                 memcpy(pInBuffer->raw, inBuffer.raw, inBuffer.frameCount * mFrameSize);
   1397                 mBufferQueue.add(pInBuffer);
   1398                 ALOGV("OutputTrack::write() %p thread %p adding overflow buffer %zu", this,
   1399                         mThread.unsafe_get(), mBufferQueue.size());
   1400             } else {
   1401                 ALOGW("OutputTrack::write() %p thread %p no more overflow buffers",
   1402                         mThread.unsafe_get(), this);
   1403             }
   1404         }
   1405     }
   1406 
   1407     // Calling write() with a 0 length buffer means that no more data will be written:
   1408     // We rely on stop() to set the appropriate flags to allow the remaining frames to play out.
   1409     if (frames == 0 && mBufferQueue.size() == 0 && mActive) {
   1410         stop();
   1411     }
   1412 
   1413     return outputBufferFull;
   1414 }
   1415 
   1416 status_t AudioFlinger::PlaybackThread::OutputTrack::obtainBuffer(
   1417         AudioBufferProvider::Buffer* buffer, uint32_t waitTimeMs)
   1418 {
   1419     ClientProxy::Buffer buf;
   1420     buf.mFrameCount = buffer->frameCount;
   1421     struct timespec timeout;
   1422     timeout.tv_sec = waitTimeMs / 1000;
   1423     timeout.tv_nsec = (int) (waitTimeMs % 1000) * 1000000;
   1424     status_t status = mClientProxy->obtainBuffer(&buf, &timeout);
   1425     buffer->frameCount = buf.mFrameCount;
   1426     buffer->raw = buf.mRaw;
   1427     return status;
   1428 }
   1429 
   1430 void AudioFlinger::PlaybackThread::OutputTrack::clearBufferQueue()
   1431 {
   1432     size_t size = mBufferQueue.size();
   1433 
   1434     for (size_t i = 0; i < size; i++) {
   1435         Buffer *pBuffer = mBufferQueue.itemAt(i);
   1436         free(pBuffer->mBuffer);
   1437         delete pBuffer;
   1438     }
   1439     mBufferQueue.clear();
   1440 }
   1441 
   1442 void AudioFlinger::PlaybackThread::OutputTrack::restartIfDisabled()
   1443 {
   1444     int32_t flags = android_atomic_and(~CBLK_DISABLED, &mCblk->mFlags);
   1445     if (mActive && (flags & CBLK_DISABLED)) {
   1446         start();
   1447     }
   1448 }
   1449 
   1450 AudioFlinger::PlaybackThread::PatchTrack::PatchTrack(PlaybackThread *playbackThread,
   1451                                                      audio_stream_type_t streamType,
   1452                                                      uint32_t sampleRate,
   1453                                                      audio_channel_mask_t channelMask,
   1454                                                      audio_format_t format,
   1455                                                      size_t frameCount,
   1456                                                      void *buffer,
   1457                                                      size_t bufferSize,
   1458                                                      audio_output_flags_t flags)
   1459     :   Track(playbackThread, NULL, streamType,
   1460               sampleRate, format, channelMask, frameCount,
   1461               buffer, bufferSize, nullptr /* sharedBuffer */,
   1462               AUDIO_SESSION_NONE, getuid(), flags, TYPE_PATCH),
   1463               mProxy(new ClientProxy(mCblk, mBuffer, frameCount, mFrameSize, true, true))
   1464 {
   1465     uint64_t mixBufferNs = ((uint64_t)2 * playbackThread->frameCount() * 1000000000) /
   1466                                                                     playbackThread->sampleRate();
   1467     mPeerTimeout.tv_sec = mixBufferNs / 1000000000;
   1468     mPeerTimeout.tv_nsec = (int) (mixBufferNs % 1000000000);
   1469 
   1470     ALOGV("PatchTrack %p sampleRate %d mPeerTimeout %d.%03d sec",
   1471                                       this, sampleRate,
   1472                                       (int)mPeerTimeout.tv_sec,
   1473                                       (int)(mPeerTimeout.tv_nsec / 1000000));
   1474 }
   1475 
   1476 AudioFlinger::PlaybackThread::PatchTrack::~PatchTrack()
   1477 {
   1478 }
   1479 
   1480 status_t AudioFlinger::PlaybackThread::PatchTrack::start(AudioSystem::sync_event_t event,
   1481                                                           audio_session_t triggerSession)
   1482 {
   1483     status_t status = Track::start(event, triggerSession);
   1484     if (status != NO_ERROR) {
   1485         return status;
   1486     }
   1487     android_atomic_and(~CBLK_DISABLED, &mCblk->mFlags);
   1488     return status;
   1489 }
   1490 
   1491 // AudioBufferProvider interface
   1492 status_t AudioFlinger::PlaybackThread::PatchTrack::getNextBuffer(
   1493         AudioBufferProvider::Buffer* buffer)
   1494 {
   1495     ALOG_ASSERT(mPeerProxy != 0, "PatchTrack::getNextBuffer() called without peer proxy");
   1496     Proxy::Buffer buf;
   1497     buf.mFrameCount = buffer->frameCount;
   1498     status_t status = mPeerProxy->obtainBuffer(&buf, &mPeerTimeout);
   1499     ALOGV_IF(status != NO_ERROR, "PatchTrack() %p getNextBuffer status %d", this, status);
   1500     buffer->frameCount = buf.mFrameCount;
   1501     if (buf.mFrameCount == 0) {
   1502         return WOULD_BLOCK;
   1503     }
   1504     status = Track::getNextBuffer(buffer);
   1505     return status;
   1506 }
   1507 
   1508 void AudioFlinger::PlaybackThread::PatchTrack::releaseBuffer(AudioBufferProvider::Buffer* buffer)
   1509 {
   1510     ALOG_ASSERT(mPeerProxy != 0, "PatchTrack::releaseBuffer() called without peer proxy");
   1511     Proxy::Buffer buf;
   1512     buf.mFrameCount = buffer->frameCount;
   1513     buf.mRaw = buffer->raw;
   1514     mPeerProxy->releaseBuffer(&buf);
   1515     TrackBase::releaseBuffer(buffer);
   1516 }
   1517 
   1518 status_t AudioFlinger::PlaybackThread::PatchTrack::obtainBuffer(Proxy::Buffer* buffer,
   1519                                                                 const struct timespec *timeOut)
   1520 {
   1521     status_t status = NO_ERROR;
   1522     static const int32_t kMaxTries = 5;
   1523     int32_t tryCounter = kMaxTries;
   1524     do {
   1525         if (status == NOT_ENOUGH_DATA) {
   1526             restartIfDisabled();
   1527         }
   1528         status = mProxy->obtainBuffer(buffer, timeOut);
   1529     } while ((status == NOT_ENOUGH_DATA) && (tryCounter-- > 0));
   1530     return status;
   1531 }
   1532 
   1533 void AudioFlinger::PlaybackThread::PatchTrack::releaseBuffer(Proxy::Buffer* buffer)
   1534 {
   1535     mProxy->releaseBuffer(buffer);
   1536     restartIfDisabled();
   1537     android_atomic_or(CBLK_FORCEREADY, &mCblk->mFlags);
   1538 }
   1539 
   1540 void AudioFlinger::PlaybackThread::PatchTrack::restartIfDisabled()
   1541 {
   1542     if (android_atomic_and(~CBLK_DISABLED, &mCblk->mFlags) & CBLK_DISABLED) {
   1543         ALOGW("PatchTrack::releaseBuffer() disabled due to previous underrun, restarting");
   1544         start();
   1545     }
   1546 }
   1547 
   1548 // ----------------------------------------------------------------------------
   1549 //      Record
   1550 // ----------------------------------------------------------------------------
   1551 
   1552 AudioFlinger::RecordHandle::RecordHandle(
   1553         const sp<AudioFlinger::RecordThread::RecordTrack>& recordTrack)
   1554     : BnAudioRecord(),
   1555     mRecordTrack(recordTrack)
   1556 {
   1557 }
   1558 
   1559 AudioFlinger::RecordHandle::~RecordHandle() {
   1560     stop_nonvirtual();
   1561     mRecordTrack->destroy();
   1562 }
   1563 
   1564 status_t AudioFlinger::RecordHandle::start(int /*AudioSystem::sync_event_t*/ event,
   1565         audio_session_t triggerSession) {
   1566     ALOGV("RecordHandle::start()");
   1567     return mRecordTrack->start((AudioSystem::sync_event_t)event, triggerSession);
   1568 }
   1569 
   1570 void AudioFlinger::RecordHandle::stop() {
   1571     stop_nonvirtual();
   1572 }
   1573 
   1574 void AudioFlinger::RecordHandle::stop_nonvirtual() {
   1575     ALOGV("RecordHandle::stop()");
   1576     mRecordTrack->stop();
   1577 }
   1578 
   1579 status_t AudioFlinger::RecordHandle::onTransact(
   1580     uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
   1581 {
   1582     return BnAudioRecord::onTransact(code, data, reply, flags);
   1583 }
   1584 
   1585 // ----------------------------------------------------------------------------
   1586 
   1587 // RecordTrack constructor must be called with AudioFlinger::mLock and ThreadBase::mLock held
   1588 AudioFlinger::RecordThread::RecordTrack::RecordTrack(
   1589             RecordThread *thread,
   1590             const sp<Client>& client,
   1591             uint32_t sampleRate,
   1592             audio_format_t format,
   1593             audio_channel_mask_t channelMask,
   1594             size_t frameCount,
   1595             void *buffer,
   1596             size_t bufferSize,
   1597             audio_session_t sessionId,
   1598             uid_t uid,
   1599             audio_input_flags_t flags,
   1600             track_type type,
   1601             audio_port_handle_t portId)
   1602     :   TrackBase(thread, client, sampleRate, format,
   1603                   channelMask, frameCount, buffer, bufferSize, sessionId, uid, false /*isOut*/,
   1604                   (type == TYPE_DEFAULT) ?
   1605                           ((flags & AUDIO_INPUT_FLAG_FAST) ? ALLOC_PIPE : ALLOC_CBLK) :
   1606                           ((buffer == NULL) ? ALLOC_LOCAL : ALLOC_NONE),
   1607                   type, portId),
   1608         mOverflow(false),
   1609         mFramesToDrop(0),
   1610         mResamplerBufferProvider(NULL), // initialize in case of early constructor exit
   1611         mRecordBufferConverter(NULL),
   1612         mFlags(flags)
   1613 {
   1614     if (mCblk == NULL) {
   1615         return;
   1616     }
   1617 
   1618     mRecordBufferConverter = new RecordBufferConverter(
   1619             thread->mChannelMask, thread->mFormat, thread->mSampleRate,
   1620             channelMask, format, sampleRate);
   1621     // Check if the RecordBufferConverter construction was successful.
   1622     // If not, don't continue with construction.
   1623     //
   1624     // NOTE: It would be extremely rare that the record track cannot be created
   1625     // for the current device, but a pending or future device change would make
   1626     // the record track configuration valid.
   1627     if (mRecordBufferConverter->initCheck() != NO_ERROR) {
   1628         ALOGE("RecordTrack unable to create record buffer converter");
   1629         return;
   1630     }
   1631 
   1632     mServerProxy = new AudioRecordServerProxy(mCblk, mBuffer, frameCount,
   1633             mFrameSize, !isExternalTrack());
   1634 
   1635     mResamplerBufferProvider = new ResamplerBufferProvider(this);
   1636 
   1637     if (flags & AUDIO_INPUT_FLAG_FAST) {
   1638         ALOG_ASSERT(thread->mFastTrackAvail);
   1639         thread->mFastTrackAvail = false;
   1640     }
   1641 }
   1642 
   1643 AudioFlinger::RecordThread::RecordTrack::~RecordTrack()
   1644 {
   1645     ALOGV("%s", __func__);
   1646     delete mRecordBufferConverter;
   1647     delete mResamplerBufferProvider;
   1648 }
   1649 
   1650 status_t AudioFlinger::RecordThread::RecordTrack::initCheck() const
   1651 {
   1652     status_t status = TrackBase::initCheck();
   1653     if (status == NO_ERROR && mServerProxy == 0) {
   1654         status = BAD_VALUE;
   1655     }
   1656     return status;
   1657 }
   1658 
   1659 // AudioBufferProvider interface
   1660 status_t AudioFlinger::RecordThread::RecordTrack::getNextBuffer(AudioBufferProvider::Buffer* buffer)
   1661 {
   1662     ServerProxy::Buffer buf;
   1663     buf.mFrameCount = buffer->frameCount;
   1664     status_t status = mServerProxy->obtainBuffer(&buf);
   1665     buffer->frameCount = buf.mFrameCount;
   1666     buffer->raw = buf.mRaw;
   1667     if (buf.mFrameCount == 0) {
   1668         // FIXME also wake futex so that overrun is noticed more quickly
   1669         (void) android_atomic_or(CBLK_OVERRUN, &mCblk->mFlags);
   1670     }
   1671     return status;
   1672 }
   1673 
   1674 status_t AudioFlinger::RecordThread::RecordTrack::start(AudioSystem::sync_event_t event,
   1675                                                         audio_session_t triggerSession)
   1676 {
   1677     sp<ThreadBase> thread = mThread.promote();
   1678     if (thread != 0) {
   1679         RecordThread *recordThread = (RecordThread *)thread.get();
   1680         return recordThread->start(this, event, triggerSession);
   1681     } else {
   1682         return BAD_VALUE;
   1683     }
   1684 }
   1685 
   1686 void AudioFlinger::RecordThread::RecordTrack::stop()
   1687 {
   1688     sp<ThreadBase> thread = mThread.promote();
   1689     if (thread != 0) {
   1690         RecordThread *recordThread = (RecordThread *)thread.get();
   1691         if (recordThread->stop(this) && isExternalTrack()) {
   1692             AudioSystem::stopInput(mThreadIoHandle, mSessionId);
   1693         }
   1694     }
   1695 }
   1696 
   1697 void AudioFlinger::RecordThread::RecordTrack::destroy()
   1698 {
   1699     // see comments at AudioFlinger::PlaybackThread::Track::destroy()
   1700     sp<RecordTrack> keep(this);
   1701     {
   1702         if (isExternalTrack()) {
   1703             if (mState == ACTIVE || mState == RESUMING) {
   1704                 AudioSystem::stopInput(mThreadIoHandle, mSessionId);
   1705             }
   1706             AudioSystem::releaseInput(mThreadIoHandle, mSessionId);
   1707         }
   1708         sp<ThreadBase> thread = mThread.promote();
   1709         if (thread != 0) {
   1710             Mutex::Autolock _l(thread->mLock);
   1711             RecordThread *recordThread = (RecordThread *) thread.get();
   1712             recordThread->destroyTrack_l(this);
   1713         }
   1714     }
   1715 }
   1716 
   1717 void AudioFlinger::RecordThread::RecordTrack::invalidate()
   1718 {
   1719     TrackBase::invalidate();
   1720     // FIXME should use proxy, and needs work
   1721     audio_track_cblk_t* cblk = mCblk;
   1722     android_atomic_or(CBLK_INVALID, &cblk->mFlags);
   1723     android_atomic_release_store(0x40000000, &cblk->mFutex);
   1724     // client is not in server, so FUTEX_WAKE is needed instead of FUTEX_WAKE_PRIVATE
   1725     (void) syscall(__NR_futex, &cblk->mFutex, FUTEX_WAKE, INT_MAX);
   1726 }
   1727 
   1728 
   1729 /*static*/ void AudioFlinger::RecordThread::RecordTrack::appendDumpHeader(String8& result)
   1730 {
   1731     result.append("Active Client Session S  Flags   Format Chn mask  SRate   Server FrmCnt\n");
   1732 }
   1733 
   1734 void AudioFlinger::RecordThread::RecordTrack::appendDump(String8& result, bool active)
   1735 {
   1736     result.appendFormat("%c%5s %6u %7u %2s 0x%03X "
   1737             "%08X %08X %6u "
   1738             "%08X %6zu\n",
   1739             isFastTrack() ? 'F' : ' ',
   1740             active ? "yes" : "no",
   1741             (mClient == 0) ? getpid_cached : mClient->pid(),
   1742             mSessionId,
   1743             getTrackStateString(),
   1744             mCblk->mFlags,
   1745 
   1746             mFormat,
   1747             mChannelMask,
   1748             mSampleRate,
   1749 
   1750             mCblk->mServer,
   1751             mFrameCount
   1752             );
   1753 }
   1754 
   1755 void AudioFlinger::RecordThread::RecordTrack::handleSyncStartEvent(const sp<SyncEvent>& event)
   1756 {
   1757     if (event == mSyncStartEvent) {
   1758         ssize_t framesToDrop = 0;
   1759         sp<ThreadBase> threadBase = mThread.promote();
   1760         if (threadBase != 0) {
   1761             // TODO: use actual buffer filling status instead of 2 buffers when info is available
   1762             // from audio HAL
   1763             framesToDrop = threadBase->mFrameCount * 2;
   1764         }
   1765         mFramesToDrop = framesToDrop;
   1766     }
   1767 }
   1768 
   1769 void AudioFlinger::RecordThread::RecordTrack::clearSyncStartEvent()
   1770 {
   1771     if (mSyncStartEvent != 0) {
   1772         mSyncStartEvent->cancel();
   1773         mSyncStartEvent.clear();
   1774     }
   1775     mFramesToDrop = 0;
   1776 }
   1777 
   1778 void AudioFlinger::RecordThread::RecordTrack::updateTrackFrameInfo(
   1779         int64_t trackFramesReleased, int64_t sourceFramesRead,
   1780         uint32_t halSampleRate, const ExtendedTimestamp &timestamp)
   1781 {
   1782     ExtendedTimestamp local = timestamp;
   1783 
   1784     // Convert HAL frames to server-side track frames at track sample rate.
   1785     // We use trackFramesReleased and sourceFramesRead as an anchor point.
   1786     for (int i = ExtendedTimestamp::LOCATION_SERVER; i < ExtendedTimestamp::LOCATION_MAX; ++i) {
   1787         if (local.mTimeNs[i] != 0) {
   1788             const int64_t relativeServerFrames = local.mPosition[i] - sourceFramesRead;
   1789             const int64_t relativeTrackFrames = relativeServerFrames
   1790                     * mSampleRate / halSampleRate; // TODO: potential computation overflow
   1791             local.mPosition[i] = relativeTrackFrames + trackFramesReleased;
   1792         }
   1793     }
   1794     mServerProxy->setTimestamp(local);
   1795 }
   1796 
   1797 AudioFlinger::RecordThread::PatchRecord::PatchRecord(RecordThread *recordThread,
   1798                                                      uint32_t sampleRate,
   1799                                                      audio_channel_mask_t channelMask,
   1800                                                      audio_format_t format,
   1801                                                      size_t frameCount,
   1802                                                      void *buffer,
   1803                                                      size_t bufferSize,
   1804                                                      audio_input_flags_t flags)
   1805     :   RecordTrack(recordThread, NULL, sampleRate, format, channelMask, frameCount,
   1806                 buffer, bufferSize, AUDIO_SESSION_NONE, getuid(), flags, TYPE_PATCH),
   1807                 mProxy(new ClientProxy(mCblk, mBuffer, frameCount, mFrameSize, false, true))
   1808 {
   1809     uint64_t mixBufferNs = ((uint64_t)2 * recordThread->frameCount() * 1000000000) /
   1810                                                                 recordThread->sampleRate();
   1811     mPeerTimeout.tv_sec = mixBufferNs / 1000000000;
   1812     mPeerTimeout.tv_nsec = (int) (mixBufferNs % 1000000000);
   1813 
   1814     ALOGV("PatchRecord %p sampleRate %d mPeerTimeout %d.%03d sec",
   1815                                       this, sampleRate,
   1816                                       (int)mPeerTimeout.tv_sec,
   1817                                       (int)(mPeerTimeout.tv_nsec / 1000000));
   1818 }
   1819 
   1820 AudioFlinger::RecordThread::PatchRecord::~PatchRecord()
   1821 {
   1822 }
   1823 
   1824 // AudioBufferProvider interface
   1825 status_t AudioFlinger::RecordThread::PatchRecord::getNextBuffer(
   1826                                                   AudioBufferProvider::Buffer* buffer)
   1827 {
   1828     ALOG_ASSERT(mPeerProxy != 0, "PatchRecord::getNextBuffer() called without peer proxy");
   1829     Proxy::Buffer buf;
   1830     buf.mFrameCount = buffer->frameCount;
   1831     status_t status = mPeerProxy->obtainBuffer(&buf, &mPeerTimeout);
   1832     ALOGV_IF(status != NO_ERROR,
   1833              "PatchRecord() %p mPeerProxy->obtainBuffer status %d", this, status);
   1834     buffer->frameCount = buf.mFrameCount;
   1835     if (buf.mFrameCount == 0) {
   1836         return WOULD_BLOCK;
   1837     }
   1838     status = RecordTrack::getNextBuffer(buffer);
   1839     return status;
   1840 }
   1841 
   1842 void AudioFlinger::RecordThread::PatchRecord::releaseBuffer(AudioBufferProvider::Buffer* buffer)
   1843 {
   1844     ALOG_ASSERT(mPeerProxy != 0, "PatchRecord::releaseBuffer() called without peer proxy");
   1845     Proxy::Buffer buf;
   1846     buf.mFrameCount = buffer->frameCount;
   1847     buf.mRaw = buffer->raw;
   1848     mPeerProxy->releaseBuffer(&buf);
   1849     TrackBase::releaseBuffer(buffer);
   1850 }
   1851 
   1852 status_t AudioFlinger::RecordThread::PatchRecord::obtainBuffer(Proxy::Buffer* buffer,
   1853                                                                const struct timespec *timeOut)
   1854 {
   1855     return mProxy->obtainBuffer(buffer, timeOut);
   1856 }
   1857 
   1858 void AudioFlinger::RecordThread::PatchRecord::releaseBuffer(Proxy::Buffer* buffer)
   1859 {
   1860     mProxy->releaseBuffer(buffer);
   1861 }
   1862 
   1863 
   1864 
   1865 AudioFlinger::MmapThread::MmapTrack::MmapTrack(ThreadBase *thread,
   1866         uint32_t sampleRate,
   1867         audio_format_t format,
   1868         audio_channel_mask_t channelMask,
   1869         audio_session_t sessionId,
   1870         uid_t uid,
   1871         pid_t pid,
   1872         audio_port_handle_t portId)
   1873     :   TrackBase(thread, NULL, sampleRate, format,
   1874                   channelMask, (size_t)0 /* frameCount */,
   1875                   nullptr /* buffer */, (size_t)0 /* bufferSize */,
   1876                   sessionId, uid, false /* isOut */,
   1877                   ALLOC_NONE,
   1878                   TYPE_DEFAULT, portId),
   1879         mPid(pid)
   1880 {
   1881 }
   1882 
   1883 AudioFlinger::MmapThread::MmapTrack::~MmapTrack()
   1884 {
   1885 }
   1886 
   1887 status_t AudioFlinger::MmapThread::MmapTrack::initCheck() const
   1888 {
   1889     return NO_ERROR;
   1890 }
   1891 
   1892 status_t AudioFlinger::MmapThread::MmapTrack::start(AudioSystem::sync_event_t event __unused,
   1893                                                         audio_session_t triggerSession __unused)
   1894 {
   1895     return NO_ERROR;
   1896 }
   1897 
   1898 void AudioFlinger::MmapThread::MmapTrack::stop()
   1899 {
   1900 }
   1901 
   1902 // AudioBufferProvider interface
   1903 status_t AudioFlinger::MmapThread::MmapTrack::getNextBuffer(AudioBufferProvider::Buffer* buffer)
   1904 {
   1905     buffer->frameCount = 0;
   1906     buffer->raw = nullptr;
   1907     return INVALID_OPERATION;
   1908 }
   1909 
   1910 // ExtendedAudioBufferProvider interface
   1911 size_t AudioFlinger::MmapThread::MmapTrack::framesReady() const {
   1912     return 0;
   1913 }
   1914 
   1915 int64_t AudioFlinger::MmapThread::MmapTrack::framesReleased() const
   1916 {
   1917     return 0;
   1918 }
   1919 
   1920 void AudioFlinger::MmapThread::MmapTrack::onTimestamp(const ExtendedTimestamp &timestamp __unused)
   1921 {
   1922 }
   1923 
   1924 /*static*/ void AudioFlinger::MmapThread::MmapTrack::appendDumpHeader(String8& result)
   1925 {
   1926     result.append("Client Session   Format Chn mask  SRate\n");
   1927 }
   1928 
   1929 void AudioFlinger::MmapThread::MmapTrack::appendDump(String8& result, bool active __unused)
   1930 {
   1931     result.appendFormat("%6u %7u %08X %08X %6u\n",
   1932             mPid,
   1933             mSessionId,
   1934             mFormat,
   1935             mChannelMask,
   1936             mSampleRate);
   1937 }
   1938 
   1939 } // namespace android
   1940