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 #ifndef INCLUDING_FROM_AUDIOFLINGER_H
     19     #error This header file should only be included from AudioFlinger.h
     20 #endif
     21 
     22 class ThreadBase : public Thread {
     23 public:
     24 
     25 #include "TrackBase.h"
     26 
     27     enum type_t {
     28         MIXER,              // Thread class is MixerThread
     29         DIRECT,             // Thread class is DirectOutputThread
     30         DUPLICATING,        // Thread class is DuplicatingThread
     31         RECORD,             // Thread class is RecordThread
     32         OFFLOAD,            // Thread class is OffloadThread
     33         MMAP                // control thread for MMAP stream
     34         // If you add any values here, also update ThreadBase::threadTypeToString()
     35     };
     36 
     37     static const char *threadTypeToString(type_t type);
     38 
     39     ThreadBase(const sp<AudioFlinger>& audioFlinger, audio_io_handle_t id,
     40                 audio_devices_t outDevice, audio_devices_t inDevice, type_t type,
     41                 bool systemReady);
     42     virtual             ~ThreadBase();
     43 
     44     virtual status_t    readyToRun();
     45 
     46     void clearPowerManager();
     47 
     48     // base for record and playback
     49     enum {
     50         CFG_EVENT_IO,
     51         CFG_EVENT_PRIO,
     52         CFG_EVENT_SET_PARAMETER,
     53         CFG_EVENT_CREATE_AUDIO_PATCH,
     54         CFG_EVENT_RELEASE_AUDIO_PATCH,
     55     };
     56 
     57     class ConfigEventData: public RefBase {
     58     public:
     59         virtual ~ConfigEventData() {}
     60 
     61         virtual  void dump(char *buffer, size_t size) = 0;
     62     protected:
     63         ConfigEventData() {}
     64     };
     65 
     66     // Config event sequence by client if status needed (e.g binder thread calling setParameters()):
     67     //  1. create SetParameterConfigEvent. This sets mWaitStatus in config event
     68     //  2. Lock mLock
     69     //  3. Call sendConfigEvent_l(): Append to mConfigEvents and mWaitWorkCV.signal
     70     //  4. sendConfigEvent_l() reads status from event->mStatus;
     71     //  5. sendConfigEvent_l() returns status
     72     //  6. Unlock
     73     //
     74     // Parameter sequence by server: threadLoop calling processConfigEvents_l():
     75     // 1. Lock mLock
     76     // 2. If there is an entry in mConfigEvents proceed ...
     77     // 3. Read first entry in mConfigEvents
     78     // 4. Remove first entry from mConfigEvents
     79     // 5. Process
     80     // 6. Set event->mStatus
     81     // 7. event->mCond.signal
     82     // 8. Unlock
     83 
     84     class ConfigEvent: public RefBase {
     85     public:
     86         virtual ~ConfigEvent() {}
     87 
     88         void dump(char *buffer, size_t size) { mData->dump(buffer, size); }
     89 
     90         const int mType; // event type e.g. CFG_EVENT_IO
     91         Mutex mLock;     // mutex associated with mCond
     92         Condition mCond; // condition for status return
     93         status_t mStatus; // status communicated to sender
     94         bool mWaitStatus; // true if sender is waiting for status
     95         bool mRequiresSystemReady; // true if must wait for system ready to enter event queue
     96         sp<ConfigEventData> mData;     // event specific parameter data
     97 
     98     protected:
     99         explicit ConfigEvent(int type, bool requiresSystemReady = false) :
    100             mType(type), mStatus(NO_ERROR), mWaitStatus(false),
    101             mRequiresSystemReady(requiresSystemReady), mData(NULL) {}
    102     };
    103 
    104     class IoConfigEventData : public ConfigEventData {
    105     public:
    106         IoConfigEventData(audio_io_config_event event, pid_t pid,
    107                           audio_port_handle_t portId) :
    108             mEvent(event), mPid(pid), mPortId(portId) {}
    109 
    110         virtual  void dump(char *buffer, size_t size) {
    111             snprintf(buffer, size, "IO event: event %d\n", mEvent);
    112         }
    113 
    114         const audio_io_config_event mEvent;
    115         const pid_t                 mPid;
    116         const audio_port_handle_t   mPortId;
    117     };
    118 
    119     class IoConfigEvent : public ConfigEvent {
    120     public:
    121         IoConfigEvent(audio_io_config_event event, pid_t pid, audio_port_handle_t portId) :
    122             ConfigEvent(CFG_EVENT_IO) {
    123             mData = new IoConfigEventData(event, pid, portId);
    124         }
    125         virtual ~IoConfigEvent() {}
    126     };
    127 
    128     class PrioConfigEventData : public ConfigEventData {
    129     public:
    130         PrioConfigEventData(pid_t pid, pid_t tid, int32_t prio, bool forApp) :
    131             mPid(pid), mTid(tid), mPrio(prio), mForApp(forApp) {}
    132 
    133         virtual  void dump(char *buffer, size_t size) {
    134             snprintf(buffer, size, "Prio event: pid %d, tid %d, prio %d, for app? %d\n",
    135                     mPid, mTid, mPrio, mForApp);
    136         }
    137 
    138         const pid_t mPid;
    139         const pid_t mTid;
    140         const int32_t mPrio;
    141         const bool mForApp;
    142     };
    143 
    144     class PrioConfigEvent : public ConfigEvent {
    145     public:
    146         PrioConfigEvent(pid_t pid, pid_t tid, int32_t prio, bool forApp) :
    147             ConfigEvent(CFG_EVENT_PRIO, true) {
    148             mData = new PrioConfigEventData(pid, tid, prio, forApp);
    149         }
    150         virtual ~PrioConfigEvent() {}
    151     };
    152 
    153     class SetParameterConfigEventData : public ConfigEventData {
    154     public:
    155         explicit SetParameterConfigEventData(String8 keyValuePairs) :
    156             mKeyValuePairs(keyValuePairs) {}
    157 
    158         virtual  void dump(char *buffer, size_t size) {
    159             snprintf(buffer, size, "KeyValue: %s\n", mKeyValuePairs.string());
    160         }
    161 
    162         const String8 mKeyValuePairs;
    163     };
    164 
    165     class SetParameterConfigEvent : public ConfigEvent {
    166     public:
    167         explicit SetParameterConfigEvent(String8 keyValuePairs) :
    168             ConfigEvent(CFG_EVENT_SET_PARAMETER) {
    169             mData = new SetParameterConfigEventData(keyValuePairs);
    170             mWaitStatus = true;
    171         }
    172         virtual ~SetParameterConfigEvent() {}
    173     };
    174 
    175     class CreateAudioPatchConfigEventData : public ConfigEventData {
    176     public:
    177         CreateAudioPatchConfigEventData(const struct audio_patch patch,
    178                                         audio_patch_handle_t handle) :
    179             mPatch(patch), mHandle(handle) {}
    180 
    181         virtual  void dump(char *buffer, size_t size) {
    182             snprintf(buffer, size, "Patch handle: %u\n", mHandle);
    183         }
    184 
    185         const struct audio_patch mPatch;
    186         audio_patch_handle_t mHandle;
    187     };
    188 
    189     class CreateAudioPatchConfigEvent : public ConfigEvent {
    190     public:
    191         CreateAudioPatchConfigEvent(const struct audio_patch patch,
    192                                     audio_patch_handle_t handle) :
    193             ConfigEvent(CFG_EVENT_CREATE_AUDIO_PATCH) {
    194             mData = new CreateAudioPatchConfigEventData(patch, handle);
    195             mWaitStatus = true;
    196         }
    197         virtual ~CreateAudioPatchConfigEvent() {}
    198     };
    199 
    200     class ReleaseAudioPatchConfigEventData : public ConfigEventData {
    201     public:
    202         explicit ReleaseAudioPatchConfigEventData(const audio_patch_handle_t handle) :
    203             mHandle(handle) {}
    204 
    205         virtual  void dump(char *buffer, size_t size) {
    206             snprintf(buffer, size, "Patch handle: %u\n", mHandle);
    207         }
    208 
    209         audio_patch_handle_t mHandle;
    210     };
    211 
    212     class ReleaseAudioPatchConfigEvent : public ConfigEvent {
    213     public:
    214         explicit ReleaseAudioPatchConfigEvent(const audio_patch_handle_t handle) :
    215             ConfigEvent(CFG_EVENT_RELEASE_AUDIO_PATCH) {
    216             mData = new ReleaseAudioPatchConfigEventData(handle);
    217             mWaitStatus = true;
    218         }
    219         virtual ~ReleaseAudioPatchConfigEvent() {}
    220     };
    221 
    222     class PMDeathRecipient : public IBinder::DeathRecipient {
    223     public:
    224         explicit    PMDeathRecipient(const wp<ThreadBase>& thread) : mThread(thread) {}
    225         virtual     ~PMDeathRecipient() {}
    226 
    227         // IBinder::DeathRecipient
    228         virtual     void        binderDied(const wp<IBinder>& who);
    229 
    230     private:
    231         DISALLOW_COPY_AND_ASSIGN(PMDeathRecipient);
    232 
    233         wp<ThreadBase> mThread;
    234     };
    235 
    236     virtual     status_t    initCheck() const = 0;
    237 
    238                 // static externally-visible
    239                 type_t      type() const { return mType; }
    240                 bool isDuplicating() const { return (mType == DUPLICATING); }
    241 
    242                 audio_io_handle_t id() const { return mId;}
    243 
    244                 // dynamic externally-visible
    245                 uint32_t    sampleRate() const { return mSampleRate; }
    246                 audio_channel_mask_t channelMask() const { return mChannelMask; }
    247                 audio_format_t format() const { return mHALFormat; }
    248                 uint32_t channelCount() const { return mChannelCount; }
    249                 // Called by AudioFlinger::frameCount(audio_io_handle_t output) and effects,
    250                 // and returns the [normal mix] buffer's frame count.
    251     virtual     size_t      frameCount() const = 0;
    252 
    253                 // Return's the HAL's frame count i.e. fast mixer buffer size.
    254                 size_t      frameCountHAL() const { return mFrameCount; }
    255 
    256                 size_t      frameSize() const { return mFrameSize; }
    257 
    258     // Should be "virtual status_t requestExitAndWait()" and override same
    259     // method in Thread, but Thread::requestExitAndWait() is not yet virtual.
    260                 void        exit();
    261     virtual     bool        checkForNewParameter_l(const String8& keyValuePair,
    262                                                     status_t& status) = 0;
    263     virtual     status_t    setParameters(const String8& keyValuePairs);
    264     virtual     String8     getParameters(const String8& keys) = 0;
    265     virtual     void        ioConfigChanged(audio_io_config_event event, pid_t pid = 0,
    266                                         audio_port_handle_t portId = AUDIO_PORT_HANDLE_NONE) = 0;
    267                 // sendConfigEvent_l() must be called with ThreadBase::mLock held
    268                 // Can temporarily release the lock if waiting for a reply from
    269                 // processConfigEvents_l().
    270                 status_t    sendConfigEvent_l(sp<ConfigEvent>& event);
    271                 void        sendIoConfigEvent(audio_io_config_event event, pid_t pid = 0,
    272                                               audio_port_handle_t portId = AUDIO_PORT_HANDLE_NONE);
    273                 void        sendIoConfigEvent_l(audio_io_config_event event, pid_t pid = 0,
    274                                             audio_port_handle_t portId = AUDIO_PORT_HANDLE_NONE);
    275                 void        sendPrioConfigEvent(pid_t pid, pid_t tid, int32_t prio, bool forApp);
    276                 void        sendPrioConfigEvent_l(pid_t pid, pid_t tid, int32_t prio, bool forApp);
    277                 status_t    sendSetParameterConfigEvent_l(const String8& keyValuePair);
    278                 status_t    sendCreateAudioPatchConfigEvent(const struct audio_patch *patch,
    279                                                             audio_patch_handle_t *handle);
    280                 status_t    sendReleaseAudioPatchConfigEvent(audio_patch_handle_t handle);
    281                 void        processConfigEvents_l();
    282     virtual     void        cacheParameters_l() = 0;
    283     virtual     status_t    createAudioPatch_l(const struct audio_patch *patch,
    284                                                audio_patch_handle_t *handle) = 0;
    285     virtual     status_t    releaseAudioPatch_l(const audio_patch_handle_t handle) = 0;
    286     virtual     void        toAudioPortConfig(struct audio_port_config *config) = 0;
    287 
    288 
    289                 // see note at declaration of mStandby, mOutDevice and mInDevice
    290                 bool        standby() const { return mStandby; }
    291                 audio_devices_t outDevice() const { return mOutDevice; }
    292                 audio_devices_t inDevice() const { return mInDevice; }
    293                 audio_devices_t getDevice() const { return isOutput() ? mOutDevice : mInDevice; }
    294 
    295     virtual     bool        isOutput() const = 0;
    296 
    297     virtual     sp<StreamHalInterface> stream() const = 0;
    298 
    299                 sp<EffectHandle> createEffect_l(
    300                                     const sp<AudioFlinger::Client>& client,
    301                                     const sp<IEffectClient>& effectClient,
    302                                     int32_t priority,
    303                                     audio_session_t sessionId,
    304                                     effect_descriptor_t *desc,
    305                                     int *enabled,
    306                                     status_t *status /*non-NULL*/,
    307                                     bool pinned);
    308 
    309                 // return values for hasAudioSession (bit field)
    310                 enum effect_state {
    311                     EFFECT_SESSION = 0x1,   // the audio session corresponds to at least one
    312                                             // effect
    313                     TRACK_SESSION = 0x2,    // the audio session corresponds to at least one
    314                                             // track
    315                     FAST_SESSION = 0x4      // the audio session corresponds to at least one
    316                                             // fast track
    317                 };
    318 
    319                 // get effect chain corresponding to session Id.
    320                 sp<EffectChain> getEffectChain(audio_session_t sessionId);
    321                 // same as getEffectChain() but must be called with ThreadBase mutex locked
    322                 sp<EffectChain> getEffectChain_l(audio_session_t sessionId) const;
    323                 std::vector<int> getEffectIds_l(audio_session_t sessionId);
    324                 // add an effect chain to the chain list (mEffectChains)
    325     virtual     status_t addEffectChain_l(const sp<EffectChain>& chain) = 0;
    326                 // remove an effect chain from the chain list (mEffectChains)
    327     virtual     size_t removeEffectChain_l(const sp<EffectChain>& chain) = 0;
    328                 // lock all effect chains Mutexes. Must be called before releasing the
    329                 // ThreadBase mutex before processing the mixer and effects. This guarantees the
    330                 // integrity of the chains during the process.
    331                 // Also sets the parameter 'effectChains' to current value of mEffectChains.
    332                 void lockEffectChains_l(Vector< sp<EffectChain> >& effectChains);
    333                 // unlock effect chains after process
    334                 void unlockEffectChains(const Vector< sp<EffectChain> >& effectChains);
    335                 // get a copy of mEffectChains vector
    336                 Vector< sp<EffectChain> > getEffectChains_l() const { return mEffectChains; };
    337                 // set audio mode to all effect chains
    338                 void setMode(audio_mode_t mode);
    339                 // get effect module with corresponding ID on specified audio session
    340                 sp<AudioFlinger::EffectModule> getEffect(audio_session_t sessionId, int effectId);
    341                 sp<AudioFlinger::EffectModule> getEffect_l(audio_session_t sessionId, int effectId);
    342                 // add and effect module. Also creates the effect chain is none exists for
    343                 // the effects audio session. Only called in a context of moving an effect
    344                 // from one thread to another
    345                 status_t addEffect_l(const sp< EffectModule>& effect);
    346                 // remove and effect module. Also removes the effect chain is this was the last
    347                 // effect
    348                 void removeEffect_l(const sp< EffectModule>& effect, bool release = false);
    349                 // disconnect an effect handle from module and destroy module if last handle
    350                 void disconnectEffectHandle(EffectHandle *handle, bool unpinIfLast);
    351                 // detach all tracks connected to an auxiliary effect
    352     virtual     void detachAuxEffect_l(int effectId __unused) {}
    353                 // returns a combination of:
    354                 // - EFFECT_SESSION if effects on this audio session exist in one chain
    355                 // - TRACK_SESSION if tracks on this audio session exist
    356                 // - FAST_SESSION if fast tracks on this audio session exist
    357     virtual     uint32_t hasAudioSession_l(audio_session_t sessionId) const = 0;
    358                 uint32_t hasAudioSession(audio_session_t sessionId) const {
    359                     Mutex::Autolock _l(mLock);
    360                     return hasAudioSession_l(sessionId);
    361                 }
    362 
    363                 template <typename T>
    364                 uint32_t hasAudioSession_l(audio_session_t sessionId, const T& tracks) const {
    365                     uint32_t result = 0;
    366                     if (getEffectChain_l(sessionId) != 0) {
    367                         result = EFFECT_SESSION;
    368                     }
    369                     for (size_t i = 0; i < tracks.size(); ++i) {
    370                         const sp<TrackBase>& track = tracks[i];
    371                         if (sessionId == track->sessionId()
    372                                 && !track->isInvalid()       // not yet removed from tracks.
    373                                 && !track->isTerminated()) {
    374                             result |= TRACK_SESSION;
    375                             if (track->isFastTrack()) {
    376                                 result |= FAST_SESSION;  // caution, only represents first track.
    377                             }
    378                             break;
    379                         }
    380                     }
    381                     return result;
    382                 }
    383 
    384                 // the value returned by default implementation is not important as the
    385                 // strategy is only meaningful for PlaybackThread which implements this method
    386                 virtual uint32_t getStrategyForSession_l(audio_session_t sessionId __unused)
    387                         { return 0; }
    388 
    389                 // check if some effects must be suspended/restored when an effect is enabled
    390                 // or disabled
    391                 void checkSuspendOnEffectEnabled(const sp<EffectModule>& effect,
    392                                                  bool enabled,
    393                                                  audio_session_t sessionId =
    394                                                         AUDIO_SESSION_OUTPUT_MIX);
    395                 void checkSuspendOnEffectEnabled_l(const sp<EffectModule>& effect,
    396                                                    bool enabled,
    397                                                    audio_session_t sessionId =
    398                                                         AUDIO_SESSION_OUTPUT_MIX);
    399 
    400                 virtual status_t    setSyncEvent(const sp<SyncEvent>& event) = 0;
    401                 virtual bool        isValidSyncEvent(const sp<SyncEvent>& event) const = 0;
    402 
    403                 // Return a reference to a per-thread heap which can be used to allocate IMemory
    404                 // objects that will be read-only to client processes, read/write to mediaserver,
    405                 // and shared by all client processes of the thread.
    406                 // The heap is per-thread rather than common across all threads, because
    407                 // clients can't be trusted not to modify the offset of the IMemory they receive.
    408                 // If a thread does not have such a heap, this method returns 0.
    409                 virtual sp<MemoryDealer>    readOnlyHeap() const { return 0; }
    410 
    411                 virtual sp<IMemory> pipeMemory() const { return 0; }
    412 
    413                         void systemReady();
    414 
    415                 // checkEffectCompatibility_l() must be called with ThreadBase::mLock held
    416                 virtual status_t    checkEffectCompatibility_l(const effect_descriptor_t *desc,
    417                                                                audio_session_t sessionId) = 0;
    418 
    419                         void        broadcast_l();
    420 
    421                 virtual bool        isTimestampCorrectionEnabled() const { return false; }
    422 
    423                 bool                isMsdDevice() const { return mIsMsdDevice; }
    424 
    425                 void                dump(int fd, const Vector<String16>& args);
    426 
    427                 // deliver stats to mediametrics.
    428                 void                sendStatistics(bool force);
    429 
    430     mutable     Mutex                   mLock;
    431 
    432 protected:
    433 
    434                 // entry describing an effect being suspended in mSuspendedSessions keyed vector
    435                 class SuspendedSessionDesc : public RefBase {
    436                 public:
    437                     SuspendedSessionDesc() : mRefCount(0) {}
    438 
    439                     int mRefCount;          // number of active suspend requests
    440                     effect_uuid_t mType;    // effect type UUID
    441                 };
    442 
    443                 void        acquireWakeLock();
    444                 virtual void acquireWakeLock_l();
    445                 void        releaseWakeLock();
    446                 void        releaseWakeLock_l();
    447                 void        updateWakeLockUids_l(const SortedVector<uid_t> &uids);
    448                 void        getPowerManager_l();
    449                 // suspend or restore effects of the specified type (or all if type is NULL)
    450                 // on a given session. The number of suspend requests is counted and restore
    451                 // occurs when all suspend requests are cancelled.
    452                 void setEffectSuspended_l(const effect_uuid_t *type,
    453                                           bool suspend,
    454                                           audio_session_t sessionId);
    455                 // updated mSuspendedSessions when an effect is suspended or restored
    456                 void        updateSuspendedSessions_l(const effect_uuid_t *type,
    457                                                       bool suspend,
    458                                                       audio_session_t sessionId);
    459                 // check if some effects must be suspended when an effect chain is added
    460                 void checkSuspendOnAddEffectChain_l(const sp<EffectChain>& chain);
    461 
    462                 // sends the metadata of the active tracks to the HAL
    463     virtual     void        updateMetadata_l() = 0;
    464 
    465                 String16 getWakeLockTag();
    466 
    467     virtual     void        preExit() { }
    468     virtual     void        setMasterMono_l(bool mono __unused) { }
    469     virtual     bool        requireMonoBlend() { return false; }
    470 
    471                             // called within the threadLoop to obtain timestamp from the HAL.
    472     virtual     status_t    threadloop_getHalTimestamp_l(
    473                                     ExtendedTimestamp *timestamp __unused) const {
    474                                 return INVALID_OPERATION;
    475                             }
    476 
    477     virtual     void        dumpInternals_l(int fd __unused, const Vector<String16>& args __unused)
    478                             { }
    479     virtual     void        dumpTracks_l(int fd __unused, const Vector<String16>& args __unused) { }
    480 
    481 
    482     friend class AudioFlinger;      // for mEffectChains
    483 
    484                 const type_t            mType;
    485 
    486                 // Used by parameters, config events, addTrack_l, exit
    487                 Condition               mWaitWorkCV;
    488 
    489                 const sp<AudioFlinger>  mAudioFlinger;
    490 
    491                 // updated by PlaybackThread::readOutputParameters_l() or
    492                 // RecordThread::readInputParameters_l()
    493                 uint32_t                mSampleRate;
    494                 size_t                  mFrameCount;       // output HAL, direct output, record
    495                 audio_channel_mask_t    mChannelMask;
    496                 uint32_t                mChannelCount;
    497                 size_t                  mFrameSize;
    498                 // not HAL frame size, this is for output sink (to pipe to fast mixer)
    499                 audio_format_t          mFormat;           // Source format for Recording and
    500                                                            // Sink format for Playback.
    501                                                            // Sink format may be different than
    502                                                            // HAL format if Fastmixer is used.
    503                 audio_format_t          mHALFormat;
    504                 size_t                  mBufferSize;       // HAL buffer size for read() or write()
    505 
    506                 Vector< sp<ConfigEvent> >     mConfigEvents;
    507                 Vector< sp<ConfigEvent> >     mPendingConfigEvents; // events awaiting system ready
    508 
    509                 // These fields are written and read by thread itself without lock or barrier,
    510                 // and read by other threads without lock or barrier via standby(), outDevice()
    511                 // and inDevice().
    512                 // Because of the absence of a lock or barrier, any other thread that reads
    513                 // these fields must use the information in isolation, or be prepared to deal
    514                 // with possibility that it might be inconsistent with other information.
    515                 bool                    mStandby;     // Whether thread is currently in standby.
    516                 audio_devices_t         mOutDevice;   // output device
    517                 audio_devices_t         mInDevice;    // input device
    518                 audio_devices_t         mPrevOutDevice;   // previous output device
    519                 audio_devices_t         mPrevInDevice;    // previous input device
    520                 struct audio_patch      mPatch;
    521                 /**
    522                  * @brief mDeviceId  current device port unique identifier
    523                  */
    524                 audio_port_handle_t     mDeviceId = AUDIO_PORT_HANDLE_NONE;
    525                 audio_source_t          mAudioSource;
    526 
    527                 const audio_io_handle_t mId;
    528                 Vector< sp<EffectChain> > mEffectChains;
    529 
    530                 static const int        kThreadNameLength = 16; // prctl(PR_SET_NAME) limit
    531                 char                    mThreadName[kThreadNameLength]; // guaranteed NUL-terminated
    532                 sp<IPowerManager>       mPowerManager;
    533                 sp<IBinder>             mWakeLockToken;
    534                 const sp<PMDeathRecipient> mDeathRecipient;
    535                 // list of suspended effects per session and per type. The first (outer) vector is
    536                 // keyed by session ID, the second (inner) by type UUID timeLow field
    537                 // Updated by updateSuspendedSessions_l() only.
    538                 KeyedVector< audio_session_t, KeyedVector< int, sp<SuspendedSessionDesc> > >
    539                                         mSuspendedSessions;
    540                 // TODO: add comment and adjust size as needed
    541                 static const size_t     kLogSize = 4 * 1024;
    542                 sp<NBLog::Writer>       mNBLogWriter;
    543                 bool                    mSystemReady;
    544                 ExtendedTimestamp       mTimestamp;
    545                 TimestampVerifier< // For timestamp statistics.
    546                         int64_t /* frame count */, int64_t /* time ns */> mTimestampVerifier;
    547                 audio_devices_t         mTimestampCorrectedDevices = AUDIO_DEVICE_NONE;
    548 
    549                 // ThreadLoop statistics per iteration.
    550                 int64_t                 mLastIoBeginNs = -1;
    551                 int64_t                 mLastIoEndNs = -1;
    552 
    553                 // This should be read under ThreadBase lock (if not on the threadLoop thread).
    554                 audio_utils::Statistics<double> mIoJitterMs{0.995 /* alpha */};
    555                 audio_utils::Statistics<double> mProcessTimeMs{0.995 /* alpha */};
    556                 audio_utils::Statistics<double> mLatencyMs{0.995 /* alpha */};
    557 
    558                 // Save the last count when we delivered statistics to mediametrics.
    559                 int64_t                 mLastRecordedTimestampVerifierN = 0;
    560                 int64_t                 mLastRecordedTimeNs = 0;  // BOOTTIME to include suspend.
    561 
    562                 bool                    mIsMsdDevice = false;
    563                 // A condition that must be evaluated by the thread loop has changed and
    564                 // we must not wait for async write callback in the thread loop before evaluating it
    565                 bool                    mSignalPending;
    566 
    567 #ifdef TEE_SINK
    568                 NBAIO_Tee               mTee;
    569 #endif
    570                 // ActiveTracks is a sorted vector of track type T representing the
    571                 // active tracks of threadLoop() to be considered by the locked prepare portion.
    572                 // ActiveTracks should be accessed with the ThreadBase lock held.
    573                 //
    574                 // During processing and I/O, the threadLoop does not hold the lock;
    575                 // hence it does not directly use ActiveTracks.  Care should be taken
    576                 // to hold local strong references or defer removal of tracks
    577                 // if the threadLoop may still be accessing those tracks due to mix, etc.
    578                 //
    579                 // This class updates power information appropriately.
    580                 //
    581 
    582                 template <typename T>
    583                 class ActiveTracks {
    584                 public:
    585                     explicit ActiveTracks(SimpleLog *localLog = nullptr)
    586                         : mActiveTracksGeneration(0)
    587                         , mLastActiveTracksGeneration(0)
    588                         , mLocalLog(localLog)
    589                     { }
    590 
    591                     ~ActiveTracks() {
    592                         ALOGW_IF(!mActiveTracks.isEmpty(),
    593                                 "ActiveTracks should be empty in destructor");
    594                     }
    595                     // returns the last track added (even though it may have been
    596                     // subsequently removed from ActiveTracks).
    597                     //
    598                     // Used for DirectOutputThread to ensure a flush is called when transitioning
    599                     // to a new track (even though it may be on the same session).
    600                     // Used for OffloadThread to ensure that volume and mixer state is
    601                     // taken from the latest track added.
    602                     //
    603                     // The latest track is saved with a weak pointer to prevent keeping an
    604                     // otherwise useless track alive. Thus the function will return nullptr
    605                     // if the latest track has subsequently been removed and destroyed.
    606                     sp<T> getLatest() {
    607                         return mLatestActiveTrack.promote();
    608                     }
    609 
    610                     // SortedVector methods
    611                     ssize_t         add(const sp<T> &track);
    612                     ssize_t         remove(const sp<T> &track);
    613                     size_t          size() const {
    614                         return mActiveTracks.size();
    615                     }
    616                     bool            isEmpty() const {
    617                         return mActiveTracks.isEmpty();
    618                     }
    619                     ssize_t         indexOf(const sp<T>& item) {
    620                         return mActiveTracks.indexOf(item);
    621                     }
    622                     sp<T>           operator[](size_t index) const {
    623                         return mActiveTracks[index];
    624                     }
    625                     typename SortedVector<sp<T>>::iterator begin() {
    626                         return mActiveTracks.begin();
    627                     }
    628                     typename SortedVector<sp<T>>::iterator end() {
    629                         return mActiveTracks.end();
    630                     }
    631 
    632                     // Due to Binder recursion optimization, clear() and updatePowerState()
    633                     // cannot be called from a Binder thread because they may call back into
    634                     // the original calling process (system server) for BatteryNotifier
    635                     // (which requires a Java environment that may not be present).
    636                     // Hence, call clear() and updatePowerState() only from the
    637                     // ThreadBase thread.
    638                     void            clear();
    639                     // periodically called in the threadLoop() to update power state uids.
    640                     void            updatePowerState(sp<ThreadBase> thread, bool force = false);
    641 
    642                     /** @return true if one or move active tracks was added or removed since the
    643                      *          last time this function was called or the vector was created. */
    644                     bool            readAndClearHasChanged();
    645 
    646                 private:
    647                     void            logTrack(const char *funcName, const sp<T> &track) const;
    648 
    649                     SortedVector<uid_t> getWakeLockUids() {
    650                         SortedVector<uid_t> wakeLockUids;
    651                         for (const sp<T> &track : mActiveTracks) {
    652                             wakeLockUids.add(track->uid());
    653                         }
    654                         return wakeLockUids; // moved by underlying SharedBuffer
    655                     }
    656 
    657                     std::map<uid_t, std::pair<ssize_t /* previous */, ssize_t /* current */>>
    658                                         mBatteryCounter;
    659                     SortedVector<sp<T>> mActiveTracks;
    660                     int                 mActiveTracksGeneration;
    661                     int                 mLastActiveTracksGeneration;
    662                     wp<T>               mLatestActiveTrack; // latest track added to ActiveTracks
    663                     SimpleLog * const   mLocalLog;
    664                     // If the vector has changed since last call to readAndClearHasChanged
    665                     bool                mHasChanged = false;
    666                 };
    667 
    668                 SimpleLog mLocalLog;
    669 
    670 private:
    671                 void dumpBase_l(int fd, const Vector<String16>& args);
    672                 void dumpEffectChains_l(int fd, const Vector<String16>& args);
    673 };
    674 
    675 class VolumeInterface {
    676  public:
    677 
    678     virtual ~VolumeInterface() {}
    679 
    680     virtual void        setMasterVolume(float value) = 0;
    681     virtual void        setMasterMute(bool muted) = 0;
    682     virtual void        setStreamVolume(audio_stream_type_t stream, float value) = 0;
    683     virtual void        setStreamMute(audio_stream_type_t stream, bool muted) = 0;
    684     virtual float       streamVolume(audio_stream_type_t stream) const = 0;
    685 
    686 };
    687 
    688 // --- PlaybackThread ---
    689 class PlaybackThread : public ThreadBase, public StreamOutHalInterfaceCallback,
    690     public VolumeInterface {
    691 public:
    692 
    693 #include "PlaybackTracks.h"
    694 
    695     enum mixer_state {
    696         MIXER_IDLE,             // no active tracks
    697         MIXER_TRACKS_ENABLED,   // at least one active track, but no track has any data ready
    698         MIXER_TRACKS_READY,      // at least one active track, and at least one track has data
    699         MIXER_DRAIN_TRACK,      // drain currently playing track
    700         MIXER_DRAIN_ALL,        // fully drain the hardware
    701         // standby mode does not have an enum value
    702         // suspend by audio policy manager is orthogonal to mixer state
    703     };
    704 
    705     // retry count before removing active track in case of underrun on offloaded thread:
    706     // we need to make sure that AudioTrack client has enough time to send large buffers
    707     //FIXME may be more appropriate if expressed in time units. Need to revise how underrun is
    708     // handled for offloaded tracks
    709     static const int8_t kMaxTrackRetriesOffload = 20;
    710     static const int8_t kMaxTrackStartupRetriesOffload = 100;
    711     static const int8_t kMaxTrackStopRetriesOffload = 2;
    712     static constexpr uint32_t kMaxTracksPerUid = 40;
    713     static constexpr size_t kMaxTracks = 256;
    714 
    715     // Maximum delay (in nanoseconds) for upcoming buffers in suspend mode, otherwise
    716     // if delay is greater, the estimated time for timeLoopNextNs is reset.
    717     // This allows for catch-up to be done for small delays, while resetting the estimate
    718     // for initial conditions or large delays.
    719     static const nsecs_t kMaxNextBufferDelayNs = 100000000;
    720 
    721     PlaybackThread(const sp<AudioFlinger>& audioFlinger, AudioStreamOut* output,
    722                    audio_io_handle_t id, audio_devices_t device, type_t type, bool systemReady);
    723     virtual             ~PlaybackThread();
    724 
    725     // Thread virtuals
    726     virtual     bool        threadLoop();
    727 
    728     // RefBase
    729     virtual     void        onFirstRef();
    730 
    731     virtual     status_t    checkEffectCompatibility_l(const effect_descriptor_t *desc,
    732                                                        audio_session_t sessionId);
    733 
    734 protected:
    735     // Code snippets that were lifted up out of threadLoop()
    736     virtual     void        threadLoop_mix() = 0;
    737     virtual     void        threadLoop_sleepTime() = 0;
    738     virtual     ssize_t     threadLoop_write();
    739     virtual     void        threadLoop_drain();
    740     virtual     void        threadLoop_standby();
    741     virtual     void        threadLoop_exit();
    742     virtual     void        threadLoop_removeTracks(const Vector< sp<Track> >& tracksToRemove);
    743 
    744                 // prepareTracks_l reads and writes mActiveTracks, and returns
    745                 // the pending set of tracks to remove via Vector 'tracksToRemove'.  The caller
    746                 // is responsible for clearing or destroying this Vector later on, when it
    747                 // is safe to do so. That will drop the final ref count and destroy the tracks.
    748     virtual     mixer_state prepareTracks_l(Vector< sp<Track> > *tracksToRemove) = 0;
    749                 void        removeTracks_l(const Vector< sp<Track> >& tracksToRemove);
    750 
    751     // StreamOutHalInterfaceCallback implementation
    752     virtual     void        onWriteReady();
    753     virtual     void        onDrainReady();
    754     virtual     void        onError();
    755 
    756                 void        resetWriteBlocked(uint32_t sequence);
    757                 void        resetDraining(uint32_t sequence);
    758 
    759     virtual     bool        waitingAsyncCallback();
    760     virtual     bool        waitingAsyncCallback_l();
    761     virtual     bool        shouldStandby_l();
    762     virtual     void        onAddNewTrack_l();
    763                 void        onAsyncError(); // error reported by AsyncCallbackThread
    764 
    765     // ThreadBase virtuals
    766     virtual     void        preExit();
    767 
    768     virtual     bool        keepWakeLock() const { return true; }
    769     virtual     void        acquireWakeLock_l() {
    770                                 ThreadBase::acquireWakeLock_l();
    771                                 mActiveTracks.updatePowerState(this, true /* force */);
    772                             }
    773 
    774                 void        dumpInternals_l(int fd, const Vector<String16>& args) override;
    775                 void        dumpTracks_l(int fd, const Vector<String16>& args) override;
    776 
    777 public:
    778 
    779     virtual     status_t    initCheck() const { return (mOutput == NULL) ? NO_INIT : NO_ERROR; }
    780 
    781                 // return estimated latency in milliseconds, as reported by HAL
    782                 uint32_t    latency() const;
    783                 // same, but lock must already be held
    784                 uint32_t    latency_l() const;
    785 
    786                 // VolumeInterface
    787     virtual     void        setMasterVolume(float value);
    788     virtual     void        setMasterBalance(float balance);
    789     virtual     void        setMasterMute(bool muted);
    790     virtual     void        setStreamVolume(audio_stream_type_t stream, float value);
    791     virtual     void        setStreamMute(audio_stream_type_t stream, bool muted);
    792     virtual     float       streamVolume(audio_stream_type_t stream) const;
    793 
    794                 void        setVolumeForOutput_l(float left, float right) const;
    795 
    796                 sp<Track>   createTrack_l(
    797                                 const sp<AudioFlinger::Client>& client,
    798                                 audio_stream_type_t streamType,
    799                                 const audio_attributes_t& attr,
    800                                 uint32_t *sampleRate,
    801                                 audio_format_t format,
    802                                 audio_channel_mask_t channelMask,
    803                                 size_t *pFrameCount,
    804                                 size_t *pNotificationFrameCount,
    805                                 uint32_t notificationsPerBuffer,
    806                                 float speed,
    807                                 const sp<IMemory>& sharedBuffer,
    808                                 audio_session_t sessionId,
    809                                 audio_output_flags_t *flags,
    810                                 pid_t creatorPid,
    811                                 pid_t tid,
    812                                 uid_t uid,
    813                                 status_t *status /*non-NULL*/,
    814                                 audio_port_handle_t portId);
    815 
    816                 AudioStreamOut* getOutput() const;
    817                 AudioStreamOut* clearOutput();
    818                 virtual sp<StreamHalInterface> stream() const;
    819 
    820                 // a very large number of suspend() will eventually wraparound, but unlikely
    821                 void        suspend() { (void) android_atomic_inc(&mSuspended); }
    822                 void        restore()
    823                                 {
    824                                     // if restore() is done without suspend(), get back into
    825                                     // range so that the next suspend() will operate correctly
    826                                     if (android_atomic_dec(&mSuspended) <= 0) {
    827                                         android_atomic_release_store(0, &mSuspended);
    828                                     }
    829                                 }
    830                 bool        isSuspended() const
    831                                 { return android_atomic_acquire_load(&mSuspended) > 0; }
    832 
    833     virtual     String8     getParameters(const String8& keys);
    834     virtual     void        ioConfigChanged(audio_io_config_event event, pid_t pid = 0,
    835                                             audio_port_handle_t portId = AUDIO_PORT_HANDLE_NONE);
    836                 status_t    getRenderPosition(uint32_t *halFrames, uint32_t *dspFrames);
    837                 // Consider also removing and passing an explicit mMainBuffer initialization
    838                 // parameter to AF::PlaybackThread::Track::Track().
    839                 effect_buffer_t *sinkBuffer() const {
    840                     return reinterpret_cast<effect_buffer_t *>(mSinkBuffer); };
    841 
    842     virtual     void detachAuxEffect_l(int effectId);
    843                 status_t attachAuxEffect(const sp<AudioFlinger::PlaybackThread::Track>& track,
    844                         int EffectId);
    845                 status_t attachAuxEffect_l(const sp<AudioFlinger::PlaybackThread::Track>& track,
    846                         int EffectId);
    847 
    848                 virtual status_t addEffectChain_l(const sp<EffectChain>& chain);
    849                 virtual size_t removeEffectChain_l(const sp<EffectChain>& chain);
    850                         uint32_t hasAudioSession_l(audio_session_t sessionId) const override {
    851                             return ThreadBase::hasAudioSession_l(sessionId, mTracks);
    852                         }
    853                 virtual uint32_t getStrategyForSession_l(audio_session_t sessionId);
    854 
    855 
    856                 virtual status_t setSyncEvent(const sp<SyncEvent>& event);
    857                 virtual bool     isValidSyncEvent(const sp<SyncEvent>& event) const;
    858 
    859                 // called with AudioFlinger lock held
    860                         bool     invalidateTracks_l(audio_stream_type_t streamType);
    861                 virtual void     invalidateTracks(audio_stream_type_t streamType);
    862 
    863     virtual     size_t      frameCount() const { return mNormalFrameCount; }
    864 
    865                 status_t    getTimestamp_l(AudioTimestamp& timestamp);
    866 
    867                 void        addPatchTrack(const sp<PatchTrack>& track);
    868                 void        deletePatchTrack(const sp<PatchTrack>& track);
    869 
    870     virtual     void        toAudioPortConfig(struct audio_port_config *config);
    871 
    872                 // Return the asynchronous signal wait time.
    873     virtual     int64_t     computeWaitTimeNs_l() const { return INT64_MAX; }
    874 
    875     virtual     bool        isOutput() const override { return true; }
    876 
    877                 // returns true if the track is allowed to be added to the thread.
    878     virtual     bool        isTrackAllowed_l(
    879                                     audio_channel_mask_t channelMask __unused,
    880                                     audio_format_t format __unused,
    881                                     audio_session_t sessionId __unused,
    882                                     uid_t uid) const {
    883                                 return trackCountForUid_l(uid) < PlaybackThread::kMaxTracksPerUid
    884                                        && mTracks.size() < PlaybackThread::kMaxTracks;
    885                             }
    886 
    887                 bool        isTimestampCorrectionEnabled() const override {
    888                                 const audio_devices_t device =
    889                                         mOutDevice & mTimestampCorrectedDevices;
    890                                 return audio_is_output_devices(device) && popcount(device) > 0;
    891                             }
    892 protected:
    893     // updated by readOutputParameters_l()
    894     size_t                          mNormalFrameCount;  // normal mixer and effects
    895 
    896     bool                            mThreadThrottle;     // throttle the thread processing
    897     uint32_t                        mThreadThrottleTimeMs; // throttle time for MIXER threads
    898     uint32_t                        mThreadThrottleEndMs;  // notify once per throttling
    899     uint32_t                        mHalfBufferMs;       // half the buffer size in milliseconds
    900 
    901     void*                           mSinkBuffer;         // frame size aligned sink buffer
    902 
    903     // TODO:
    904     // Rearrange the buffer info into a struct/class with
    905     // clear, copy, construction, destruction methods.
    906     //
    907     // mSinkBuffer also has associated with it:
    908     //
    909     // mSinkBufferSize: Sink Buffer Size
    910     // mFormat: Sink Buffer Format
    911 
    912     // Mixer Buffer (mMixerBuffer*)
    913     //
    914     // In the case of floating point or multichannel data, which is not in the
    915     // sink format, it is required to accumulate in a higher precision or greater channel count
    916     // buffer before downmixing or data conversion to the sink buffer.
    917 
    918     // Set to "true" to enable the Mixer Buffer otherwise mixer output goes to sink buffer.
    919     bool                            mMixerBufferEnabled;
    920 
    921     // Storage, 32 byte aligned (may make this alignment a requirement later).
    922     // Due to constraints on mNormalFrameCount, the buffer size is a multiple of 16 frames.
    923     void*                           mMixerBuffer;
    924 
    925     // Size of mMixerBuffer in bytes: mNormalFrameCount * #channels * sampsize.
    926     size_t                          mMixerBufferSize;
    927 
    928     // The audio format of mMixerBuffer. Set to AUDIO_FORMAT_PCM_(FLOAT|16_BIT) only.
    929     audio_format_t                  mMixerBufferFormat;
    930 
    931     // An internal flag set to true by MixerThread::prepareTracks_l()
    932     // when mMixerBuffer contains valid data after mixing.
    933     bool                            mMixerBufferValid;
    934 
    935     // Effects Buffer (mEffectsBuffer*)
    936     //
    937     // In the case of effects data, which is not in the sink format,
    938     // it is required to accumulate in a different buffer before data conversion
    939     // to the sink buffer.
    940 
    941     // Set to "true" to enable the Effects Buffer otherwise effects output goes to sink buffer.
    942     bool                            mEffectBufferEnabled;
    943 
    944     // Storage, 32 byte aligned (may make this alignment a requirement later).
    945     // Due to constraints on mNormalFrameCount, the buffer size is a multiple of 16 frames.
    946     void*                           mEffectBuffer;
    947 
    948     // Size of mEffectsBuffer in bytes: mNormalFrameCount * #channels * sampsize.
    949     size_t                          mEffectBufferSize;
    950 
    951     // The audio format of mEffectsBuffer. Set to AUDIO_FORMAT_PCM_16_BIT only.
    952     audio_format_t                  mEffectBufferFormat;
    953 
    954     // An internal flag set to true by MixerThread::prepareTracks_l()
    955     // when mEffectsBuffer contains valid data after mixing.
    956     //
    957     // When this is set, all mixer data is routed into the effects buffer
    958     // for any processing (including output processing).
    959     bool                            mEffectBufferValid;
    960 
    961     // suspend count, > 0 means suspended.  While suspended, the thread continues to pull from
    962     // tracks and mix, but doesn't write to HAL.  A2DP and SCO HAL implementations can't handle
    963     // concurrent use of both of them, so Audio Policy Service suspends one of the threads to
    964     // workaround that restriction.
    965     // 'volatile' means accessed via atomic operations and no lock.
    966     volatile int32_t                mSuspended;
    967 
    968     int64_t                         mBytesWritten;
    969     int64_t                         mFramesWritten; // not reset on standby
    970     int64_t                         mSuspendedFrames; // not reset on standby
    971 
    972     // mHapticChannelMask and mHapticChannelCount will only be valid when the thread support
    973     // haptic playback.
    974     audio_channel_mask_t            mHapticChannelMask = AUDIO_CHANNEL_NONE;
    975     uint32_t                        mHapticChannelCount = 0;
    976 private:
    977     // mMasterMute is in both PlaybackThread and in AudioFlinger.  When a
    978     // PlaybackThread needs to find out if master-muted, it checks it's local
    979     // copy rather than the one in AudioFlinger.  This optimization saves a lock.
    980     bool                            mMasterMute;
    981                 void        setMasterMute_l(bool muted) { mMasterMute = muted; }
    982 protected:
    983     ActiveTracks<Track>     mActiveTracks;
    984 
    985     // Time to sleep between cycles when:
    986     virtual uint32_t        activeSleepTimeUs() const;      // mixer state MIXER_TRACKS_ENABLED
    987     virtual uint32_t        idleSleepTimeUs() const = 0;    // mixer state MIXER_IDLE
    988     virtual uint32_t        suspendSleepTimeUs() const = 0; // audio policy manager suspended us
    989     // No sleep when mixer state == MIXER_TRACKS_READY; relies on audio HAL stream->write()
    990     // No sleep in standby mode; waits on a condition
    991 
    992     // Code snippets that are temporarily lifted up out of threadLoop() until the merge
    993                 void        checkSilentMode_l();
    994 
    995     // Non-trivial for DUPLICATING only
    996     virtual     void        saveOutputTracks() { }
    997     virtual     void        clearOutputTracks() { }
    998 
    999     // Cache various calculated values, at threadLoop() entry and after a parameter change
   1000     virtual     void        cacheParameters_l();
   1001 
   1002     virtual     uint32_t    correctLatency_l(uint32_t latency) const;
   1003 
   1004     virtual     status_t    createAudioPatch_l(const struct audio_patch *patch,
   1005                                    audio_patch_handle_t *handle);
   1006     virtual     status_t    releaseAudioPatch_l(const audio_patch_handle_t handle);
   1007 
   1008                 bool        usesHwAvSync() const { return (mType == DIRECT) && (mOutput != NULL)
   1009                                     && mHwSupportsPause
   1010                                     && (mOutput->flags & AUDIO_OUTPUT_FLAG_HW_AV_SYNC); }
   1011 
   1012                 uint32_t    trackCountForUid_l(uid_t uid) const;
   1013 
   1014 private:
   1015 
   1016     friend class AudioFlinger;      // for numerous
   1017 
   1018     DISALLOW_COPY_AND_ASSIGN(PlaybackThread);
   1019 
   1020     status_t    addTrack_l(const sp<Track>& track);
   1021     bool        destroyTrack_l(const sp<Track>& track);
   1022     void        removeTrack_l(const sp<Track>& track);
   1023 
   1024     void        readOutputParameters_l();
   1025     void        updateMetadata_l() final;
   1026     virtual void sendMetadataToBackend_l(const StreamOutHalInterface::SourceMetadata& metadata);
   1027 
   1028     // The Tracks class manages tracks added and removed from the Thread.
   1029     template <typename T>
   1030     class Tracks {
   1031     public:
   1032         Tracks(bool saveDeletedTrackIds) :
   1033             mSaveDeletedTrackIds(saveDeletedTrackIds) { }
   1034 
   1035         // SortedVector methods
   1036         ssize_t         add(const sp<T> &track) {
   1037             const ssize_t index = mTracks.add(track);
   1038             LOG_ALWAYS_FATAL_IF(index < 0, "cannot add track");
   1039             return index;
   1040         }
   1041         ssize_t         remove(const sp<T> &track);
   1042         size_t          size() const {
   1043             return mTracks.size();
   1044         }
   1045         bool            isEmpty() const {
   1046             return mTracks.isEmpty();
   1047         }
   1048         ssize_t         indexOf(const sp<T> &item) {
   1049             return mTracks.indexOf(item);
   1050         }
   1051         sp<T>           operator[](size_t index) const {
   1052             return mTracks[index];
   1053         }
   1054         typename SortedVector<sp<T>>::iterator begin() {
   1055             return mTracks.begin();
   1056         }
   1057         typename SortedVector<sp<T>>::iterator end() {
   1058             return mTracks.end();
   1059         }
   1060 
   1061         size_t          processDeletedTrackIds(std::function<void(int)> f) {
   1062             for (const int trackId : mDeletedTrackIds) {
   1063                 f(trackId);
   1064             }
   1065             return mDeletedTrackIds.size();
   1066         }
   1067 
   1068         void            clearDeletedTrackIds() { mDeletedTrackIds.clear(); }
   1069 
   1070     private:
   1071         // Tracks pending deletion for MIXER type threads
   1072         const bool mSaveDeletedTrackIds; // true to enable tracking
   1073         std::set<int> mDeletedTrackIds;
   1074 
   1075         SortedVector<sp<T>> mTracks; // wrapped SortedVector.
   1076     };
   1077 
   1078     Tracks<Track>                   mTracks;
   1079 
   1080     stream_type_t                   mStreamTypes[AUDIO_STREAM_CNT];
   1081     AudioStreamOut                  *mOutput;
   1082 
   1083     float                           mMasterVolume;
   1084     std::atomic<float>              mMasterBalance{};
   1085     audio_utils::Balance            mBalance;
   1086     int                             mNumWrites;
   1087     int                             mNumDelayedWrites;
   1088     bool                            mInWrite;
   1089 
   1090     // FIXME rename these former local variables of threadLoop to standard "m" names
   1091     nsecs_t                         mStandbyTimeNs;
   1092     size_t                          mSinkBufferSize;
   1093 
   1094     // cached copies of activeSleepTimeUs() and idleSleepTimeUs() made by cacheParameters_l()
   1095     uint32_t                        mActiveSleepTimeUs;
   1096     uint32_t                        mIdleSleepTimeUs;
   1097 
   1098     uint32_t                        mSleepTimeUs;
   1099 
   1100     // mixer status returned by prepareTracks_l()
   1101     mixer_state                     mMixerStatus; // current cycle
   1102                                                   // previous cycle when in prepareTracks_l()
   1103     mixer_state                     mMixerStatusIgnoringFastTracks;
   1104                                                   // FIXME or a separate ready state per track
   1105 
   1106     // FIXME move these declarations into the specific sub-class that needs them
   1107     // MIXER only
   1108     uint32_t                        sleepTimeShift;
   1109 
   1110     // same as AudioFlinger::mStandbyTimeInNsecs except for DIRECT which uses a shorter value
   1111     nsecs_t                         mStandbyDelayNs;
   1112 
   1113     // MIXER only
   1114     nsecs_t                         maxPeriod;
   1115 
   1116     // DUPLICATING only
   1117     uint32_t                        writeFrames;
   1118 
   1119     size_t                          mBytesRemaining;
   1120     size_t                          mCurrentWriteLength;
   1121     bool                            mUseAsyncWrite;
   1122     // mWriteAckSequence contains current write sequence on bits 31-1. The write sequence is
   1123     // incremented each time a write(), a flush() or a standby() occurs.
   1124     // Bit 0 is set when a write blocks and indicates a callback is expected.
   1125     // Bit 0 is reset by the async callback thread calling resetWriteBlocked(). Out of sequence
   1126     // callbacks are ignored.
   1127     uint32_t                        mWriteAckSequence;
   1128     // mDrainSequence contains current drain sequence on bits 31-1. The drain sequence is
   1129     // incremented each time a drain is requested or a flush() or standby() occurs.
   1130     // Bit 0 is set when the drain() command is called at the HAL and indicates a callback is
   1131     // expected.
   1132     // Bit 0 is reset by the async callback thread calling resetDraining(). Out of sequence
   1133     // callbacks are ignored.
   1134     uint32_t                        mDrainSequence;
   1135     sp<AsyncCallbackThread>         mCallbackThread;
   1136 
   1137 private:
   1138     // The HAL output sink is treated as non-blocking, but current implementation is blocking
   1139     sp<NBAIO_Sink>          mOutputSink;
   1140     // If a fast mixer is present, the blocking pipe sink, otherwise clear
   1141     sp<NBAIO_Sink>          mPipeSink;
   1142     // The current sink for the normal mixer to write it's (sub)mix, mOutputSink or mPipeSink
   1143     sp<NBAIO_Sink>          mNormalSink;
   1144     uint32_t                mScreenState;   // cached copy of gScreenState
   1145     // TODO: add comment and adjust size as needed
   1146     static const size_t     kFastMixerLogSize = 8 * 1024;
   1147     sp<NBLog::Writer>       mFastMixerNBLogWriter;
   1148 
   1149     // Downstream patch latency, available if mDownstreamLatencyStatMs.getN() > 0.
   1150     audio_utils::Statistics<double> mDownstreamLatencyStatMs{0.999};
   1151 
   1152 public:
   1153     virtual     bool        hasFastMixer() const = 0;
   1154     virtual     FastTrackUnderruns getFastTrackUnderruns(size_t fastIndex __unused) const
   1155                                 { FastTrackUnderruns dummy; return dummy; }
   1156 
   1157 protected:
   1158                 // accessed by both binder threads and within threadLoop(), lock on mutex needed
   1159                 unsigned    mFastTrackAvailMask;    // bit i set if fast track [i] is available
   1160                 bool        mHwSupportsPause;
   1161                 bool        mHwPaused;
   1162                 bool        mFlushPending;
   1163                 // volumes last sent to audio HAL with stream->setVolume()
   1164                 float mLeftVolFloat;
   1165                 float mRightVolFloat;
   1166 };
   1167 
   1168 class MixerThread : public PlaybackThread {
   1169 public:
   1170     MixerThread(const sp<AudioFlinger>& audioFlinger,
   1171                 AudioStreamOut* output,
   1172                 audio_io_handle_t id,
   1173                 audio_devices_t device,
   1174                 bool systemReady,
   1175                 type_t type = MIXER);
   1176     virtual             ~MixerThread();
   1177 
   1178     // Thread virtuals
   1179 
   1180     virtual     bool        checkForNewParameter_l(const String8& keyValuePair,
   1181                                                    status_t& status);
   1182 
   1183     virtual     bool        isTrackAllowed_l(
   1184                                     audio_channel_mask_t channelMask, audio_format_t format,
   1185                                     audio_session_t sessionId, uid_t uid) const override;
   1186 protected:
   1187     virtual     mixer_state prepareTracks_l(Vector< sp<Track> > *tracksToRemove);
   1188     virtual     uint32_t    idleSleepTimeUs() const;
   1189     virtual     uint32_t    suspendSleepTimeUs() const;
   1190     virtual     void        cacheParameters_l();
   1191 
   1192     virtual void acquireWakeLock_l() {
   1193         PlaybackThread::acquireWakeLock_l();
   1194         if (hasFastMixer()) {
   1195             mFastMixer->setBoottimeOffset(
   1196                     mTimestamp.mTimebaseOffset[ExtendedTimestamp::TIMEBASE_BOOTTIME]);
   1197         }
   1198     }
   1199 
   1200                 void        dumpInternals_l(int fd, const Vector<String16>& args) override;
   1201 
   1202     // threadLoop snippets
   1203     virtual     ssize_t     threadLoop_write();
   1204     virtual     void        threadLoop_standby();
   1205     virtual     void        threadLoop_mix();
   1206     virtual     void        threadLoop_sleepTime();
   1207     virtual     uint32_t    correctLatency_l(uint32_t latency) const;
   1208 
   1209     virtual     status_t    createAudioPatch_l(const struct audio_patch *patch,
   1210                                    audio_patch_handle_t *handle);
   1211     virtual     status_t    releaseAudioPatch_l(const audio_patch_handle_t handle);
   1212 
   1213                 AudioMixer* mAudioMixer;    // normal mixer
   1214 private:
   1215                 // one-time initialization, no locks required
   1216                 sp<FastMixer>     mFastMixer;     // non-0 if there is also a fast mixer
   1217                 sp<AudioWatchdog> mAudioWatchdog; // non-0 if there is an audio watchdog thread
   1218 
   1219                 // contents are not guaranteed to be consistent, no locks required
   1220                 FastMixerDumpState mFastMixerDumpState;
   1221 #ifdef STATE_QUEUE_DUMP
   1222                 StateQueueObserverDump mStateQueueObserverDump;
   1223                 StateQueueMutatorDump  mStateQueueMutatorDump;
   1224 #endif
   1225                 AudioWatchdogDump mAudioWatchdogDump;
   1226 
   1227                 // accessible only within the threadLoop(), no locks required
   1228                 //          mFastMixer->sq()    // for mutating and pushing state
   1229                 int32_t     mFastMixerFutex;    // for cold idle
   1230 
   1231                 std::atomic_bool mMasterMono;
   1232 public:
   1233     virtual     bool        hasFastMixer() const { return mFastMixer != 0; }
   1234     virtual     FastTrackUnderruns getFastTrackUnderruns(size_t fastIndex) const {
   1235                               ALOG_ASSERT(fastIndex < FastMixerState::sMaxFastTracks);
   1236                               return mFastMixerDumpState.mTracks[fastIndex].mUnderruns;
   1237                             }
   1238 
   1239                 status_t    threadloop_getHalTimestamp_l(
   1240                                     ExtendedTimestamp *timestamp) const override {
   1241                                 if (mNormalSink.get() != nullptr) {
   1242                                     return mNormalSink->getTimestamp(*timestamp);
   1243                                 }
   1244                                 return INVALID_OPERATION;
   1245                             }
   1246 
   1247 protected:
   1248     virtual     void       setMasterMono_l(bool mono) {
   1249                                mMasterMono.store(mono);
   1250                                if (mFastMixer != nullptr) { /* hasFastMixer() */
   1251                                    mFastMixer->setMasterMono(mMasterMono);
   1252                                }
   1253                            }
   1254                 // the FastMixer performs mono blend if it exists.
   1255                 // Blending with limiter is not idempotent,
   1256                 // and blending without limiter is idempotent but inefficient to do twice.
   1257     virtual     bool       requireMonoBlend() { return mMasterMono.load() && !hasFastMixer(); }
   1258 
   1259                 void       setMasterBalance(float balance) override {
   1260                                mMasterBalance.store(balance);
   1261                                if (hasFastMixer()) {
   1262                                    mFastMixer->setMasterBalance(balance);
   1263                                }
   1264                            }
   1265 };
   1266 
   1267 class DirectOutputThread : public PlaybackThread {
   1268 public:
   1269 
   1270     DirectOutputThread(const sp<AudioFlinger>& audioFlinger, AudioStreamOut* output,
   1271                        audio_io_handle_t id, audio_devices_t device, bool systemReady)
   1272         : DirectOutputThread(audioFlinger, output, id, device, DIRECT, systemReady) { }
   1273 
   1274     virtual                 ~DirectOutputThread();
   1275 
   1276                 status_t    selectPresentation(int presentationId, int programId);
   1277 
   1278     // Thread virtuals
   1279 
   1280     virtual     bool        checkForNewParameter_l(const String8& keyValuePair,
   1281                                                    status_t& status);
   1282 
   1283     virtual     void        flushHw_l();
   1284 
   1285                 void        setMasterBalance(float balance) override;
   1286 
   1287 protected:
   1288     virtual     uint32_t    activeSleepTimeUs() const;
   1289     virtual     uint32_t    idleSleepTimeUs() const;
   1290     virtual     uint32_t    suspendSleepTimeUs() const;
   1291     virtual     void        cacheParameters_l();
   1292 
   1293                 void        dumpInternals_l(int fd, const Vector<String16>& args) override;
   1294 
   1295     // threadLoop snippets
   1296     virtual     mixer_state prepareTracks_l(Vector< sp<Track> > *tracksToRemove);
   1297     virtual     void        threadLoop_mix();
   1298     virtual     void        threadLoop_sleepTime();
   1299     virtual     void        threadLoop_exit();
   1300     virtual     bool        shouldStandby_l();
   1301 
   1302     virtual     void        onAddNewTrack_l();
   1303 
   1304     bool mVolumeShaperActive = false;
   1305 
   1306     DirectOutputThread(const sp<AudioFlinger>& audioFlinger, AudioStreamOut* output,
   1307                         audio_io_handle_t id, audio_devices_t device, ThreadBase::type_t type,
   1308                         bool systemReady);
   1309     void processVolume_l(Track *track, bool lastTrack);
   1310 
   1311     // prepareTracks_l() tells threadLoop_mix() the name of the single active track
   1312     sp<Track>               mActiveTrack;
   1313 
   1314     wp<Track>               mPreviousTrack;         // used to detect track switch
   1315 
   1316     // This must be initialized for initial condition of mMasterBalance = 0 (disabled).
   1317     float                   mMasterBalanceLeft = 1.f;
   1318     float                   mMasterBalanceRight = 1.f;
   1319 
   1320 public:
   1321     virtual     bool        hasFastMixer() const { return false; }
   1322 
   1323     virtual     int64_t     computeWaitTimeNs_l() const override;
   1324 
   1325     status_t    threadloop_getHalTimestamp_l(ExtendedTimestamp *timestamp) const override {
   1326                     // For DIRECT and OFFLOAD threads, query the output sink directly.
   1327                     if (mOutput != nullptr) {
   1328                         uint64_t uposition64;
   1329                         struct timespec time;
   1330                         if (mOutput->getPresentationPosition(
   1331                                 &uposition64, &time) == OK) {
   1332                             timestamp->mPosition[ExtendedTimestamp::LOCATION_KERNEL]
   1333                                     = (int64_t)uposition64;
   1334                             timestamp->mTimeNs[ExtendedTimestamp::LOCATION_KERNEL]
   1335                                     = audio_utils_ns_from_timespec(&time);
   1336                             return NO_ERROR;
   1337                         }
   1338                     }
   1339                     return INVALID_OPERATION;
   1340                 }
   1341 };
   1342 
   1343 class OffloadThread : public DirectOutputThread {
   1344 public:
   1345 
   1346     OffloadThread(const sp<AudioFlinger>& audioFlinger, AudioStreamOut* output,
   1347                         audio_io_handle_t id, uint32_t device, bool systemReady);
   1348     virtual                 ~OffloadThread() {};
   1349     virtual     void        flushHw_l();
   1350 
   1351 protected:
   1352     // threadLoop snippets
   1353     virtual     mixer_state prepareTracks_l(Vector< sp<Track> > *tracksToRemove);
   1354     virtual     void        threadLoop_exit();
   1355 
   1356     virtual     bool        waitingAsyncCallback();
   1357     virtual     bool        waitingAsyncCallback_l();
   1358     virtual     void        invalidateTracks(audio_stream_type_t streamType);
   1359 
   1360     virtual     bool        keepWakeLock() const { return (mKeepWakeLock || (mDrainSequence & 1)); }
   1361 
   1362 private:
   1363     size_t      mPausedWriteLength;     // length in bytes of write interrupted by pause
   1364     size_t      mPausedBytesRemaining;  // bytes still waiting in mixbuffer after resume
   1365     bool        mKeepWakeLock;          // keep wake lock while waiting for write callback
   1366     uint64_t    mOffloadUnderrunPosition; // Current frame position for offloaded playback
   1367                                           // used and valid only during underrun.  ~0 if
   1368                                           // no underrun has occurred during playback and
   1369                                           // is not reset on standby.
   1370 };
   1371 
   1372 class AsyncCallbackThread : public Thread {
   1373 public:
   1374 
   1375     explicit AsyncCallbackThread(const wp<PlaybackThread>& playbackThread);
   1376 
   1377     virtual             ~AsyncCallbackThread();
   1378 
   1379     // Thread virtuals
   1380     virtual bool        threadLoop();
   1381 
   1382     // RefBase
   1383     virtual void        onFirstRef();
   1384 
   1385             void        exit();
   1386             void        setWriteBlocked(uint32_t sequence);
   1387             void        resetWriteBlocked();
   1388             void        setDraining(uint32_t sequence);
   1389             void        resetDraining();
   1390             void        setAsyncError();
   1391 
   1392 private:
   1393     const wp<PlaybackThread>   mPlaybackThread;
   1394     // mWriteAckSequence corresponds to the last write sequence passed by the offload thread via
   1395     // setWriteBlocked(). The sequence is shifted one bit to the left and the lsb is used
   1396     // to indicate that the callback has been received via resetWriteBlocked()
   1397     uint32_t                   mWriteAckSequence;
   1398     // mDrainSequence corresponds to the last drain sequence passed by the offload thread via
   1399     // setDraining(). The sequence is shifted one bit to the left and the lsb is used
   1400     // to indicate that the callback has been received via resetDraining()
   1401     uint32_t                   mDrainSequence;
   1402     Condition                  mWaitWorkCV;
   1403     Mutex                      mLock;
   1404     bool                       mAsyncError;
   1405 };
   1406 
   1407 class DuplicatingThread : public MixerThread {
   1408 public:
   1409     DuplicatingThread(const sp<AudioFlinger>& audioFlinger, MixerThread* mainThread,
   1410                       audio_io_handle_t id, bool systemReady);
   1411     virtual                 ~DuplicatingThread();
   1412 
   1413     // Thread virtuals
   1414                 void        addOutputTrack(MixerThread* thread);
   1415                 void        removeOutputTrack(MixerThread* thread);
   1416                 uint32_t    waitTimeMs() const { return mWaitTimeMs; }
   1417 
   1418                 void        sendMetadataToBackend_l(
   1419                         const StreamOutHalInterface::SourceMetadata& metadata) override;
   1420 protected:
   1421     virtual     uint32_t    activeSleepTimeUs() const;
   1422                 void        dumpInternals_l(int fd, const Vector<String16>& args) override;
   1423 
   1424 private:
   1425                 bool        outputsReady(const SortedVector< sp<OutputTrack> > &outputTracks);
   1426 protected:
   1427     // threadLoop snippets
   1428     virtual     void        threadLoop_mix();
   1429     virtual     void        threadLoop_sleepTime();
   1430     virtual     ssize_t     threadLoop_write();
   1431     virtual     void        threadLoop_standby();
   1432     virtual     void        cacheParameters_l();
   1433 
   1434 private:
   1435     // called from threadLoop, addOutputTrack, removeOutputTrack
   1436     virtual     void        updateWaitTime_l();
   1437 protected:
   1438     virtual     void        saveOutputTracks();
   1439     virtual     void        clearOutputTracks();
   1440 private:
   1441 
   1442                 uint32_t    mWaitTimeMs;
   1443     SortedVector < sp<OutputTrack> >  outputTracks;
   1444     SortedVector < sp<OutputTrack> >  mOutputTracks;
   1445 public:
   1446     virtual     bool        hasFastMixer() const { return false; }
   1447                 status_t    threadloop_getHalTimestamp_l(
   1448                                     ExtendedTimestamp *timestamp) const override {
   1449         if (mOutputTracks.size() > 0) {
   1450             // forward the first OutputTrack's kernel information for timestamp.
   1451             const ExtendedTimestamp trackTimestamp =
   1452                     mOutputTracks[0]->getClientProxyTimestamp();
   1453             if (trackTimestamp.mTimeNs[ExtendedTimestamp::LOCATION_KERNEL] > 0) {
   1454                 timestamp->mTimeNs[ExtendedTimestamp::LOCATION_KERNEL] =
   1455                         trackTimestamp.mTimeNs[ExtendedTimestamp::LOCATION_KERNEL];
   1456                 timestamp->mPosition[ExtendedTimestamp::LOCATION_KERNEL] =
   1457                         trackTimestamp.mPosition[ExtendedTimestamp::LOCATION_KERNEL];
   1458                 return OK;  // discard server timestamp - that's ignored.
   1459             }
   1460         }
   1461         return INVALID_OPERATION;
   1462     }
   1463 };
   1464 
   1465 // record thread
   1466 class RecordThread : public ThreadBase
   1467 {
   1468 public:
   1469 
   1470     class RecordTrack;
   1471 
   1472     /* The ResamplerBufferProvider is used to retrieve recorded input data from the
   1473      * RecordThread.  It maintains local state on the relative position of the read
   1474      * position of the RecordTrack compared with the RecordThread.
   1475      */
   1476     class ResamplerBufferProvider : public AudioBufferProvider
   1477     {
   1478     public:
   1479         explicit ResamplerBufferProvider(RecordTrack* recordTrack) :
   1480             mRecordTrack(recordTrack),
   1481             mRsmpInUnrel(0), mRsmpInFront(0) { }
   1482         virtual ~ResamplerBufferProvider() { }
   1483 
   1484         // called to set the ResamplerBufferProvider to head of the RecordThread data buffer,
   1485         // skipping any previous data read from the hal.
   1486         virtual void reset();
   1487 
   1488         /* Synchronizes RecordTrack position with the RecordThread.
   1489          * Calculates available frames and handle overruns if the RecordThread
   1490          * has advanced faster than the ResamplerBufferProvider has retrieved data.
   1491          * TODO: why not do this for every getNextBuffer?
   1492          *
   1493          * Parameters
   1494          * framesAvailable:  pointer to optional output size_t to store record track
   1495          *                   frames available.
   1496          *      hasOverrun:  pointer to optional boolean, returns true if track has overrun.
   1497          */
   1498 
   1499         virtual void sync(size_t *framesAvailable = NULL, bool *hasOverrun = NULL);
   1500 
   1501         // AudioBufferProvider interface
   1502         virtual status_t    getNextBuffer(AudioBufferProvider::Buffer* buffer);
   1503         virtual void        releaseBuffer(AudioBufferProvider::Buffer* buffer);
   1504     private:
   1505         RecordTrack * const mRecordTrack;
   1506         size_t              mRsmpInUnrel;   // unreleased frames remaining from
   1507                                             // most recent getNextBuffer
   1508                                             // for debug only
   1509         int32_t             mRsmpInFront;   // next available frame
   1510                                             // rolling counter that is never cleared
   1511     };
   1512 
   1513 #include "RecordTracks.h"
   1514 
   1515             RecordThread(const sp<AudioFlinger>& audioFlinger,
   1516                     AudioStreamIn *input,
   1517                     audio_io_handle_t id,
   1518                     audio_devices_t outDevice,
   1519                     audio_devices_t inDevice,
   1520                     bool systemReady
   1521                     );
   1522             virtual     ~RecordThread();
   1523 
   1524     // no addTrack_l ?
   1525     void        destroyTrack_l(const sp<RecordTrack>& track);
   1526     void        removeTrack_l(const sp<RecordTrack>& track);
   1527 
   1528     // Thread virtuals
   1529     virtual bool        threadLoop();
   1530     virtual void        preExit();
   1531 
   1532     // RefBase
   1533     virtual void        onFirstRef();
   1534 
   1535     virtual status_t    initCheck() const { return (mInput == NULL) ? NO_INIT : NO_ERROR; }
   1536 
   1537     virtual sp<MemoryDealer>    readOnlyHeap() const { return mReadOnlyHeap; }
   1538 
   1539     virtual sp<IMemory> pipeMemory() const { return mPipeMemory; }
   1540 
   1541             sp<AudioFlinger::RecordThread::RecordTrack>  createRecordTrack_l(
   1542                     const sp<AudioFlinger::Client>& client,
   1543                     const audio_attributes_t& attr,
   1544                     uint32_t *pSampleRate,
   1545                     audio_format_t format,
   1546                     audio_channel_mask_t channelMask,
   1547                     size_t *pFrameCount,
   1548                     audio_session_t sessionId,
   1549                     size_t *pNotificationFrameCount,
   1550                     pid_t creatorPid,
   1551                     uid_t uid,
   1552                     audio_input_flags_t *flags,
   1553                     pid_t tid,
   1554                     status_t *status /*non-NULL*/,
   1555                     audio_port_handle_t portId);
   1556 
   1557             status_t    start(RecordTrack* recordTrack,
   1558                               AudioSystem::sync_event_t event,
   1559                               audio_session_t triggerSession);
   1560 
   1561             // ask the thread to stop the specified track, and
   1562             // return true if the caller should then do it's part of the stopping process
   1563             bool        stop(RecordTrack* recordTrack);
   1564 
   1565             AudioStreamIn* clearInput();
   1566             virtual sp<StreamHalInterface> stream() const;
   1567 
   1568 
   1569     virtual bool        checkForNewParameter_l(const String8& keyValuePair,
   1570                                                status_t& status);
   1571     virtual void        cacheParameters_l() {}
   1572     virtual String8     getParameters(const String8& keys);
   1573     virtual void        ioConfigChanged(audio_io_config_event event, pid_t pid = 0,
   1574                                         audio_port_handle_t portId = AUDIO_PORT_HANDLE_NONE);
   1575     virtual status_t    createAudioPatch_l(const struct audio_patch *patch,
   1576                                            audio_patch_handle_t *handle);
   1577     virtual status_t    releaseAudioPatch_l(const audio_patch_handle_t handle);
   1578 
   1579             void        addPatchTrack(const sp<PatchRecord>& record);
   1580             void        deletePatchTrack(const sp<PatchRecord>& record);
   1581 
   1582             void        readInputParameters_l();
   1583     virtual uint32_t    getInputFramesLost();
   1584 
   1585     virtual status_t addEffectChain_l(const sp<EffectChain>& chain);
   1586     virtual size_t removeEffectChain_l(const sp<EffectChain>& chain);
   1587             uint32_t hasAudioSession_l(audio_session_t sessionId) const override {
   1588                          return ThreadBase::hasAudioSession_l(sessionId, mTracks);
   1589                      }
   1590 
   1591             // Return the set of unique session IDs across all tracks.
   1592             // The keys are the session IDs, and the associated values are meaningless.
   1593             // FIXME replace by Set [and implement Bag/Multiset for other uses].
   1594             KeyedVector<audio_session_t, bool> sessionIds() const;
   1595 
   1596     virtual status_t setSyncEvent(const sp<SyncEvent>& event);
   1597     virtual bool     isValidSyncEvent(const sp<SyncEvent>& event) const;
   1598 
   1599     static void syncStartEventCallback(const wp<SyncEvent>& event);
   1600 
   1601     virtual size_t      frameCount() const { return mFrameCount; }
   1602             bool        hasFastCapture() const { return mFastCapture != 0; }
   1603     virtual void        toAudioPortConfig(struct audio_port_config *config);
   1604 
   1605     virtual status_t    checkEffectCompatibility_l(const effect_descriptor_t *desc,
   1606                                                    audio_session_t sessionId);
   1607 
   1608     virtual void        acquireWakeLock_l() {
   1609                             ThreadBase::acquireWakeLock_l();
   1610                             mActiveTracks.updatePowerState(this, true /* force */);
   1611                         }
   1612     virtual bool        isOutput() const override { return false; }
   1613 
   1614             void        checkBtNrec();
   1615 
   1616             // Sets the UID records silence
   1617             void        setRecordSilenced(uid_t uid, bool silenced);
   1618 
   1619             status_t    getActiveMicrophones(std::vector<media::MicrophoneInfo>* activeMicrophones);
   1620 
   1621             status_t    setPreferredMicrophoneDirection(audio_microphone_direction_t direction);
   1622             status_t    setPreferredMicrophoneFieldDimension(float zoom);
   1623 
   1624             void        updateMetadata_l() override;
   1625 
   1626             bool        fastTrackAvailable() const { return mFastTrackAvail; }
   1627 
   1628             bool        isTimestampCorrectionEnabled() const override {
   1629                             // checks popcount for exactly one device.
   1630                             return audio_is_input_device(
   1631                                     mInDevice & mTimestampCorrectedDevices);
   1632                         }
   1633 
   1634 protected:
   1635             void        dumpInternals_l(int fd, const Vector<String16>& args) override;
   1636             void        dumpTracks_l(int fd, const Vector<String16>& args) override;
   1637 
   1638 private:
   1639             // Enter standby if not already in standby, and set mStandby flag
   1640             void    standbyIfNotAlreadyInStandby();
   1641 
   1642             // Call the HAL standby method unconditionally, and don't change mStandby flag
   1643             void    inputStandBy();
   1644 
   1645             void    checkBtNrec_l();
   1646 
   1647             AudioStreamIn                       *mInput;
   1648             SortedVector < sp<RecordTrack> >    mTracks;
   1649             // mActiveTracks has dual roles:  it indicates the current active track(s), and
   1650             // is used together with mStartStopCond to indicate start()/stop() progress
   1651             ActiveTracks<RecordTrack>           mActiveTracks;
   1652 
   1653             Condition                           mStartStopCond;
   1654 
   1655             // resampler converts input at HAL Hz to output at AudioRecord client Hz
   1656             void                               *mRsmpInBuffer;  // size = mRsmpInFramesOA
   1657             size_t                              mRsmpInFrames;  // size of resampler input in frames
   1658             size_t                              mRsmpInFramesP2;// size rounded up to a power-of-2
   1659             size_t                              mRsmpInFramesOA;// mRsmpInFramesP2 + over-allocation
   1660 
   1661             // rolling index that is never cleared
   1662             int32_t                             mRsmpInRear;    // last filled frame + 1
   1663 
   1664             // For dumpsys
   1665             const sp<MemoryDealer>              mReadOnlyHeap;
   1666 
   1667             // one-time initialization, no locks required
   1668             sp<FastCapture>                     mFastCapture;   // non-0 if there is also
   1669                                                                 // a fast capture
   1670 
   1671             // FIXME audio watchdog thread
   1672 
   1673             // contents are not guaranteed to be consistent, no locks required
   1674             FastCaptureDumpState                mFastCaptureDumpState;
   1675 #ifdef STATE_QUEUE_DUMP
   1676             // FIXME StateQueue observer and mutator dump fields
   1677 #endif
   1678             // FIXME audio watchdog dump
   1679 
   1680             // accessible only within the threadLoop(), no locks required
   1681             //          mFastCapture->sq()      // for mutating and pushing state
   1682             int32_t     mFastCaptureFutex;      // for cold idle
   1683 
   1684             // The HAL input source is treated as non-blocking,
   1685             // but current implementation is blocking
   1686             sp<NBAIO_Source>                    mInputSource;
   1687             // The source for the normal capture thread to read from: mInputSource or mPipeSource
   1688             sp<NBAIO_Source>                    mNormalSource;
   1689             // If a fast capture is present, the non-blocking pipe sink written to by fast capture,
   1690             // otherwise clear
   1691             sp<NBAIO_Sink>                      mPipeSink;
   1692             // If a fast capture is present, the non-blocking pipe source read by normal thread,
   1693             // otherwise clear
   1694             sp<NBAIO_Source>                    mPipeSource;
   1695             // Depth of pipe from fast capture to normal thread and fast clients, always power of 2
   1696             size_t                              mPipeFramesP2;
   1697             // If a fast capture is present, the Pipe as IMemory, otherwise clear
   1698             sp<IMemory>                         mPipeMemory;
   1699 
   1700             // TODO: add comment and adjust size as needed
   1701             static const size_t                 kFastCaptureLogSize = 4 * 1024;
   1702             sp<NBLog::Writer>                   mFastCaptureNBLogWriter;
   1703 
   1704             bool                                mFastTrackAvail;    // true if fast track available
   1705             // common state to all record threads
   1706             std::atomic_bool                    mBtNrecSuspended;
   1707 
   1708             int64_t                             mFramesRead = 0;    // continuous running counter.
   1709 };
   1710 
   1711 class MmapThread : public ThreadBase
   1712 {
   1713  public:
   1714 
   1715 #include "MmapTracks.h"
   1716 
   1717     MmapThread(const sp<AudioFlinger>& audioFlinger, audio_io_handle_t id,
   1718                       AudioHwDevice *hwDev, sp<StreamHalInterface> stream,
   1719                       audio_devices_t outDevice, audio_devices_t inDevice, bool systemReady);
   1720     virtual     ~MmapThread();
   1721 
   1722     virtual     void        configure(const audio_attributes_t *attr,
   1723                                       audio_stream_type_t streamType,
   1724                                       audio_session_t sessionId,
   1725                                       const sp<MmapStreamCallback>& callback,
   1726                                       audio_port_handle_t deviceId,
   1727                                       audio_port_handle_t portId);
   1728 
   1729                 void        disconnect();
   1730 
   1731     // MmapStreamInterface
   1732     status_t createMmapBuffer(int32_t minSizeFrames,
   1733                                       struct audio_mmap_buffer_info *info);
   1734     status_t getMmapPosition(struct audio_mmap_position *position);
   1735     status_t start(const AudioClient& client, audio_port_handle_t *handle);
   1736     status_t stop(audio_port_handle_t handle);
   1737     status_t standby();
   1738 
   1739     // RefBase
   1740     virtual     void        onFirstRef();
   1741 
   1742     // Thread virtuals
   1743     virtual     bool        threadLoop();
   1744 
   1745     virtual     void        threadLoop_exit();
   1746     virtual     void        threadLoop_standby();
   1747     virtual     bool        shouldStandby_l() { return false; }
   1748     virtual     status_t    exitStandby();
   1749 
   1750     virtual     status_t    initCheck() const { return (mHalStream == 0) ? NO_INIT : NO_ERROR; }
   1751     virtual     size_t      frameCount() const { return mFrameCount; }
   1752     virtual     bool        checkForNewParameter_l(const String8& keyValuePair,
   1753                                                     status_t& status);
   1754     virtual     String8     getParameters(const String8& keys);
   1755     virtual     void        ioConfigChanged(audio_io_config_event event, pid_t pid = 0,
   1756                                             audio_port_handle_t portId = AUDIO_PORT_HANDLE_NONE);
   1757                 void        readHalParameters_l();
   1758     virtual     void        cacheParameters_l() {}
   1759     virtual     status_t    createAudioPatch_l(const struct audio_patch *patch,
   1760                                                audio_patch_handle_t *handle);
   1761     virtual     status_t    releaseAudioPatch_l(const audio_patch_handle_t handle);
   1762     virtual     void        toAudioPortConfig(struct audio_port_config *config);
   1763 
   1764     virtual     sp<StreamHalInterface> stream() const { return mHalStream; }
   1765     virtual     status_t    addEffectChain_l(const sp<EffectChain>& chain);
   1766     virtual     size_t      removeEffectChain_l(const sp<EffectChain>& chain);
   1767     virtual     status_t    checkEffectCompatibility_l(const effect_descriptor_t *desc,
   1768                                                                audio_session_t sessionId);
   1769 
   1770                 uint32_t    hasAudioSession_l(audio_session_t sessionId) const override {
   1771                                 // Note: using mActiveTracks as no mTracks here.
   1772                                 return ThreadBase::hasAudioSession_l(sessionId, mActiveTracks);
   1773                             }
   1774     virtual     status_t    setSyncEvent(const sp<SyncEvent>& event);
   1775     virtual     bool        isValidSyncEvent(const sp<SyncEvent>& event) const;
   1776 
   1777     virtual     void        checkSilentMode_l() {}
   1778     virtual     void        processVolume_l() {}
   1779                 void        checkInvalidTracks_l();
   1780 
   1781     virtual     audio_stream_type_t streamType() { return AUDIO_STREAM_DEFAULT; }
   1782 
   1783     virtual     void        invalidateTracks(audio_stream_type_t streamType __unused) {}
   1784 
   1785                 // Sets the UID records silence
   1786     virtual     void        setRecordSilenced(uid_t uid __unused, bool silenced __unused) {}
   1787 
   1788  protected:
   1789                 void        dumpInternals_l(int fd, const Vector<String16>& args) override;
   1790                 void        dumpTracks_l(int fd, const Vector<String16>& args) override;
   1791 
   1792                 audio_attributes_t      mAttr;
   1793                 audio_session_t         mSessionId;
   1794                 audio_port_handle_t     mPortId;
   1795 
   1796                 wp<MmapStreamCallback>  mCallback;
   1797                 sp<StreamHalInterface>  mHalStream;
   1798                 sp<DeviceHalInterface>  mHalDevice;
   1799                 AudioHwDevice* const    mAudioHwDev;
   1800                 ActiveTracks<MmapTrack> mActiveTracks;
   1801                 float                   mHalVolFloat;
   1802 
   1803                 int32_t                 mNoCallbackWarningCount;
   1804      static     constexpr int32_t       kMaxNoCallbackWarnings = 5;
   1805 };
   1806 
   1807 class MmapPlaybackThread : public MmapThread, public VolumeInterface
   1808 {
   1809 
   1810 public:
   1811     MmapPlaybackThread(const sp<AudioFlinger>& audioFlinger, audio_io_handle_t id,
   1812                       AudioHwDevice *hwDev, AudioStreamOut *output,
   1813                       audio_devices_t outDevice, audio_devices_t inDevice, bool systemReady);
   1814     virtual     ~MmapPlaybackThread() {}
   1815 
   1816     virtual     void        configure(const audio_attributes_t *attr,
   1817                                       audio_stream_type_t streamType,
   1818                                       audio_session_t sessionId,
   1819                                       const sp<MmapStreamCallback>& callback,
   1820                                       audio_port_handle_t deviceId,
   1821                                       audio_port_handle_t portId);
   1822 
   1823                 AudioStreamOut* clearOutput();
   1824 
   1825                 // VolumeInterface
   1826     virtual     void        setMasterVolume(float value);
   1827     virtual     void        setMasterMute(bool muted);
   1828     virtual     void        setStreamVolume(audio_stream_type_t stream, float value);
   1829     virtual     void        setStreamMute(audio_stream_type_t stream, bool muted);
   1830     virtual     float       streamVolume(audio_stream_type_t stream) const;
   1831 
   1832                 void        setMasterMute_l(bool muted) { mMasterMute = muted; }
   1833 
   1834     virtual     void        invalidateTracks(audio_stream_type_t streamType);
   1835 
   1836     virtual     audio_stream_type_t streamType() { return mStreamType; }
   1837     virtual     void        checkSilentMode_l();
   1838                 void        processVolume_l() override;
   1839 
   1840     virtual     bool        isOutput() const override { return true; }
   1841 
   1842                 void        updateMetadata_l() override;
   1843 
   1844     virtual     void        toAudioPortConfig(struct audio_port_config *config);
   1845 
   1846 protected:
   1847                 void        dumpInternals_l(int fd, const Vector<String16>& args) override;
   1848 
   1849                 audio_stream_type_t         mStreamType;
   1850                 float                       mMasterVolume;
   1851                 float                       mStreamVolume;
   1852                 bool                        mMasterMute;
   1853                 bool                        mStreamMute;
   1854                 AudioStreamOut*             mOutput;
   1855 };
   1856 
   1857 class MmapCaptureThread : public MmapThread
   1858 {
   1859 
   1860 public:
   1861     MmapCaptureThread(const sp<AudioFlinger>& audioFlinger, audio_io_handle_t id,
   1862                       AudioHwDevice *hwDev, AudioStreamIn *input,
   1863                       audio_devices_t outDevice, audio_devices_t inDevice, bool systemReady);
   1864     virtual     ~MmapCaptureThread() {}
   1865 
   1866                 AudioStreamIn* clearInput();
   1867 
   1868                 status_t       exitStandby() override;
   1869     virtual     bool           isOutput() const override { return false; }
   1870 
   1871                 void           updateMetadata_l() override;
   1872                 void           processVolume_l() override;
   1873                 void           setRecordSilenced(uid_t uid, bool silenced) override;
   1874 
   1875     virtual     void           toAudioPortConfig(struct audio_port_config *config);
   1876 
   1877 protected:
   1878 
   1879                 AudioStreamIn*  mInput;
   1880 };
   1881