• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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:
~ConfigEventData()59         virtual ~ConfigEventData() {}
60 
61         virtual  void dump(char *buffer, size_t size) = 0;
62     protected:
ConfigEventData()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:
~ConfigEvent()86         virtual ~ConfigEvent() {}
87 
dump(char * buffer,size_t size)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) :
mType(type)100             mType(type), mStatus(NO_ERROR), mWaitStatus(false),
101             mRequiresSystemReady(requiresSystemReady), mData(NULL) {}
102     };
103 
104     class IoConfigEventData : public ConfigEventData {
105     public:
IoConfigEventData(audio_io_config_event event,pid_t pid,audio_port_handle_t portId)106         IoConfigEventData(audio_io_config_event event, pid_t pid,
107                           audio_port_handle_t portId) :
108             mEvent(event), mPid(pid), mPortId(portId) {}
109 
dump(char * buffer,size_t size)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:
IoConfigEvent(audio_io_config_event event,pid_t pid,audio_port_handle_t portId)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         }
~IoConfigEvent()125         virtual ~IoConfigEvent() {}
126     };
127 
128     class PrioConfigEventData : public ConfigEventData {
129     public:
PrioConfigEventData(pid_t pid,pid_t tid,int32_t prio,bool forApp)130         PrioConfigEventData(pid_t pid, pid_t tid, int32_t prio, bool forApp) :
131             mPid(pid), mTid(tid), mPrio(prio), mForApp(forApp) {}
132 
dump(char * buffer,size_t size)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:
PrioConfigEvent(pid_t pid,pid_t tid,int32_t prio,bool forApp)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         }
~PrioConfigEvent()150         virtual ~PrioConfigEvent() {}
151     };
152 
153     class SetParameterConfigEventData : public ConfigEventData {
154     public:
SetParameterConfigEventData(String8 keyValuePairs)155         explicit SetParameterConfigEventData(String8 keyValuePairs) :
156             mKeyValuePairs(keyValuePairs) {}
157 
dump(char * buffer,size_t size)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:
SetParameterConfigEvent(String8 keyValuePairs)167         explicit SetParameterConfigEvent(String8 keyValuePairs) :
168             ConfigEvent(CFG_EVENT_SET_PARAMETER) {
169             mData = new SetParameterConfigEventData(keyValuePairs);
170             mWaitStatus = true;
171         }
~SetParameterConfigEvent()172         virtual ~SetParameterConfigEvent() {}
173     };
174 
175     class CreateAudioPatchConfigEventData : public ConfigEventData {
176     public:
CreateAudioPatchConfigEventData(const struct audio_patch patch,audio_patch_handle_t handle)177         CreateAudioPatchConfigEventData(const struct audio_patch patch,
178                                         audio_patch_handle_t handle) :
179             mPatch(patch), mHandle(handle) {}
180 
dump(char * buffer,size_t size)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:
CreateAudioPatchConfigEvent(const struct audio_patch patch,audio_patch_handle_t handle)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         }
~CreateAudioPatchConfigEvent()197         virtual ~CreateAudioPatchConfigEvent() {}
198     };
199 
200     class ReleaseAudioPatchConfigEventData : public ConfigEventData {
201     public:
ReleaseAudioPatchConfigEventData(const audio_patch_handle_t handle)202         explicit ReleaseAudioPatchConfigEventData(const audio_patch_handle_t handle) :
203             mHandle(handle) {}
204 
dump(char * buffer,size_t size)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:
ReleaseAudioPatchConfigEvent(const audio_patch_handle_t handle)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         }
~ReleaseAudioPatchConfigEvent()219         virtual ~ReleaseAudioPatchConfigEvent() {}
220     };
221 
222     class PMDeathRecipient : public IBinder::DeathRecipient {
223     public:
PMDeathRecipient(const wp<ThreadBase> & thread)224         explicit    PMDeathRecipient(const wp<ThreadBase>& thread) : mThread(thread) {}
~PMDeathRecipient()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
type()239                 type_t      type() const { return mType; }
isDuplicating()240                 bool isDuplicating() const { return (mType == DUPLICATING); }
241 
id()242                 audio_io_handle_t id() const { return mId;}
243 
244                 // dynamic externally-visible
sampleRate()245                 uint32_t    sampleRate() const { return mSampleRate; }
channelMask()246                 audio_channel_mask_t channelMask() const { return mChannelMask; }
format()247                 audio_format_t format() const { return mHALFormat; }
channelCount()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.
frameCountHAL()254                 size_t      frameCountHAL() const { return mFrameCount; }
255 
frameSize()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
standby()290                 bool        standby() const { return mStandby; }
outDevice()291                 audio_devices_t outDevice() const { return mOutDevice; }
inDevice()292                 audio_devices_t inDevice() const { return mInDevice; }
getDevice()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
getEffectChains_l()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
detachAuxEffect_l(int effectId __unused)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;
hasAudioSession(audio_session_t sessionId)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>
hasAudioSession_l(audio_session_t sessionId,const T & tracks)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
getStrategyForSession_l(audio_session_t sessionId __unused)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.
readOnlyHeap()409                 virtual sp<MemoryDealer>    readOnlyHeap() const { return 0; }
410 
pipeMemory()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 
isTimestampCorrectionEnabled()421                 virtual bool        isTimestampCorrectionEnabled() const { return false; }
422 
isMsdDevice()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:
SuspendedSessionDesc()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 
preExit()467     virtual     void        preExit() { }
setMasterMono_l(bool mono __unused)468     virtual     void        setMasterMono_l(bool mono __unused) { }
requireMonoBlend()469     virtual     bool        requireMonoBlend() { return false; }
470 
471                             // called within the threadLoop to obtain timestamp from the HAL.
threadloop_getHalTimestamp_l(ExtendedTimestamp * timestamp __unused)472     virtual     status_t    threadloop_getHalTimestamp_l(
473                                     ExtendedTimestamp *timestamp __unused) const {
474                                 return INVALID_OPERATION;
475                             }
476 
dumpInternals_l(int fd __unused,const Vector<String16> & args __unused)477     virtual     void        dumpInternals_l(int fd __unused, const Vector<String16>& args __unused)
478                             { }
dumpTracks_l(int fd __unused,const Vector<String16> & args __unused)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 
~ActiveTracks()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.
getLatest()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);
size()613                     size_t          size() const {
614                         return mActiveTracks.size();
615                     }
isEmpty()616                     bool            isEmpty() const {
617                         return mActiveTracks.isEmpty();
618                     }
indexOf(const sp<T> & item)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                     }
begin()625                     typename SortedVector<sp<T>>::iterator begin() {
626                         return mActiveTracks.begin();
627                     }
end()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 
getWakeLockUids()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 
~VolumeInterface()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 
keepWakeLock()768     virtual     bool        keepWakeLock() const { return true; }
acquireWakeLock_l()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 
initCheck()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
suspend()821                 void        suspend() { (void) android_atomic_inc(&mSuspended); }
restore()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                                 }
isSuspended()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().
sinkBuffer()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);
hasAudioSession_l(audio_session_t sessionId)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 
frameCount()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.
computeWaitTimeNs_l()873     virtual     int64_t     computeWaitTimeNs_l() const { return INT64_MAX; }
874 
isOutput()875     virtual     bool        isOutput() const override { return true; }
876 
877                 // returns true if the track is allowed to be added to the thread.
isTrackAllowed_l(audio_channel_mask_t channelMask __unused,audio_format_t format __unused,audio_session_t sessionId __unused,uid_t uid)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 
isTimestampCorrectionEnabled()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;
setMasterMute_l(bool muted)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
saveOutputTracks()996     virtual     void        saveOutputTracks() { }
clearOutputTracks()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 
usesHwAvSync()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:
Tracks(bool saveDeletedTrackIds)1032         Tracks(bool saveDeletedTrackIds) :
1033             mSaveDeletedTrackIds(saveDeletedTrackIds) { }
1034 
1035         // SortedVector methods
add(const sp<T> & track)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);
size()1042         size_t          size() const {
1043             return mTracks.size();
1044         }
isEmpty()1045         bool            isEmpty() const {
1046             return mTracks.isEmpty();
1047         }
indexOf(const sp<T> & item)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         }
begin()1054         typename SortedVector<sp<T>>::iterator begin() {
1055             return mTracks.begin();
1056         }
end()1057         typename SortedVector<sp<T>>::iterator end() {
1058             return mTracks.end();
1059         }
1060 
processDeletedTrackIds(std::function<void (int)> f)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 
clearDeletedTrackIds()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;
getFastTrackUnderruns(size_t fastIndex __unused)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 
acquireWakeLock_l()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:
hasFastMixer()1233     virtual     bool        hasFastMixer() const { return mFastMixer != 0; }
getFastTrackUnderruns(size_t fastIndex)1234     virtual     FastTrackUnderruns getFastTrackUnderruns(size_t fastIndex) const {
1235                               ALOG_ASSERT(fastIndex < FastMixerState::sMaxFastTracks);
1236                               return mFastMixerDumpState.mTracks[fastIndex].mUnderruns;
1237                             }
1238 
threadloop_getHalTimestamp_l(ExtendedTimestamp * timestamp)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:
setMasterMono_l(bool mono)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.
requireMonoBlend()1257     virtual     bool       requireMonoBlend() { return mMasterMono.load() && !hasFastMixer(); }
1258 
setMasterBalance(float balance)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 
DirectOutputThread(const sp<AudioFlinger> & audioFlinger,AudioStreamOut * output,audio_io_handle_t id,audio_devices_t device,bool systemReady)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:
hasFastMixer()1321     virtual     bool        hasFastMixer() const { return false; }
1322 
1323     virtual     int64_t     computeWaitTimeNs_l() const override;
1324 
threadloop_getHalTimestamp_l(ExtendedTimestamp * timestamp)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);
~OffloadThread()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 
keepWakeLock()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);
waitTimeMs()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:
hasFastMixer()1446     virtual     bool        hasFastMixer() const { return false; }
threadloop_getHalTimestamp_l(ExtendedTimestamp * timestamp)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:
ResamplerBufferProvider(RecordTrack * recordTrack)1479         explicit ResamplerBufferProvider(RecordTrack* recordTrack) :
1480             mRecordTrack(recordTrack),
1481             mRsmpInUnrel(0), mRsmpInFront(0) { }
~ResamplerBufferProvider()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 
initCheck()1535     virtual status_t    initCheck() const { return (mInput == NULL) ? NO_INIT : NO_ERROR; }
1536 
readOnlyHeap()1537     virtual sp<MemoryDealer>    readOnlyHeap() const { return mReadOnlyHeap; }
1538 
pipeMemory()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                     const String16& opPackageName);
1557 
1558             status_t    start(RecordTrack* recordTrack,
1559                               AudioSystem::sync_event_t event,
1560                               audio_session_t triggerSession);
1561 
1562             // ask the thread to stop the specified track, and
1563             // return true if the caller should then do it's part of the stopping process
1564             bool        stop(RecordTrack* recordTrack);
1565 
1566             AudioStreamIn* clearInput();
1567             virtual sp<StreamHalInterface> stream() const;
1568 
1569 
1570     virtual bool        checkForNewParameter_l(const String8& keyValuePair,
1571                                                status_t& status);
cacheParameters_l()1572     virtual void        cacheParameters_l() {}
1573     virtual String8     getParameters(const String8& keys);
1574     virtual void        ioConfigChanged(audio_io_config_event event, pid_t pid = 0,
1575                                         audio_port_handle_t portId = AUDIO_PORT_HANDLE_NONE);
1576     virtual status_t    createAudioPatch_l(const struct audio_patch *patch,
1577                                            audio_patch_handle_t *handle);
1578     virtual status_t    releaseAudioPatch_l(const audio_patch_handle_t handle);
1579 
1580             void        addPatchTrack(const sp<PatchRecord>& record);
1581             void        deletePatchTrack(const sp<PatchRecord>& record);
1582 
1583             void        readInputParameters_l();
1584     virtual uint32_t    getInputFramesLost();
1585 
1586     virtual status_t addEffectChain_l(const sp<EffectChain>& chain);
1587     virtual size_t removeEffectChain_l(const sp<EffectChain>& chain);
hasAudioSession_l(audio_session_t sessionId)1588             uint32_t hasAudioSession_l(audio_session_t sessionId) const override {
1589                          return ThreadBase::hasAudioSession_l(sessionId, mTracks);
1590                      }
1591 
1592             // Return the set of unique session IDs across all tracks.
1593             // The keys are the session IDs, and the associated values are meaningless.
1594             // FIXME replace by Set [and implement Bag/Multiset for other uses].
1595             KeyedVector<audio_session_t, bool> sessionIds() const;
1596 
1597     virtual status_t setSyncEvent(const sp<SyncEvent>& event);
1598     virtual bool     isValidSyncEvent(const sp<SyncEvent>& event) const;
1599 
1600     static void syncStartEventCallback(const wp<SyncEvent>& event);
1601 
frameCount()1602     virtual size_t      frameCount() const { return mFrameCount; }
hasFastCapture()1603             bool        hasFastCapture() const { return mFastCapture != 0; }
1604     virtual void        toAudioPortConfig(struct audio_port_config *config);
1605 
1606     virtual status_t    checkEffectCompatibility_l(const effect_descriptor_t *desc,
1607                                                    audio_session_t sessionId);
1608 
acquireWakeLock_l()1609     virtual void        acquireWakeLock_l() {
1610                             ThreadBase::acquireWakeLock_l();
1611                             mActiveTracks.updatePowerState(this, true /* force */);
1612                         }
isOutput()1613     virtual bool        isOutput() const override { return false; }
1614 
1615             void        checkBtNrec();
1616 
1617             // Sets the UID records silence
1618             void        setRecordSilenced(uid_t uid, bool silenced);
1619 
1620             status_t    getActiveMicrophones(std::vector<media::MicrophoneInfo>* activeMicrophones);
1621 
1622             status_t    setPreferredMicrophoneDirection(audio_microphone_direction_t direction);
1623             status_t    setPreferredMicrophoneFieldDimension(float zoom);
1624 
1625             void        updateMetadata_l() override;
1626 
fastTrackAvailable()1627             bool        fastTrackAvailable() const { return mFastTrackAvail; }
1628 
isTimestampCorrectionEnabled()1629             bool        isTimestampCorrectionEnabled() const override {
1630                             // checks popcount for exactly one device.
1631                             return audio_is_input_device(
1632                                     mInDevice & mTimestampCorrectedDevices);
1633                         }
1634 
1635 protected:
1636             void        dumpInternals_l(int fd, const Vector<String16>& args) override;
1637             void        dumpTracks_l(int fd, const Vector<String16>& args) override;
1638 
1639 private:
1640             // Enter standby if not already in standby, and set mStandby flag
1641             void    standbyIfNotAlreadyInStandby();
1642 
1643             // Call the HAL standby method unconditionally, and don't change mStandby flag
1644             void    inputStandBy();
1645 
1646             void    checkBtNrec_l();
1647 
1648             AudioStreamIn                       *mInput;
1649             SortedVector < sp<RecordTrack> >    mTracks;
1650             // mActiveTracks has dual roles:  it indicates the current active track(s), and
1651             // is used together with mStartStopCond to indicate start()/stop() progress
1652             ActiveTracks<RecordTrack>           mActiveTracks;
1653 
1654             Condition                           mStartStopCond;
1655 
1656             // resampler converts input at HAL Hz to output at AudioRecord client Hz
1657             void                               *mRsmpInBuffer;  // size = mRsmpInFramesOA
1658             size_t                              mRsmpInFrames;  // size of resampler input in frames
1659             size_t                              mRsmpInFramesP2;// size rounded up to a power-of-2
1660             size_t                              mRsmpInFramesOA;// mRsmpInFramesP2 + over-allocation
1661 
1662             // rolling index that is never cleared
1663             int32_t                             mRsmpInRear;    // last filled frame + 1
1664 
1665             // For dumpsys
1666             const sp<MemoryDealer>              mReadOnlyHeap;
1667 
1668             // one-time initialization, no locks required
1669             sp<FastCapture>                     mFastCapture;   // non-0 if there is also
1670                                                                 // a fast capture
1671 
1672             // FIXME audio watchdog thread
1673 
1674             // contents are not guaranteed to be consistent, no locks required
1675             FastCaptureDumpState                mFastCaptureDumpState;
1676 #ifdef STATE_QUEUE_DUMP
1677             // FIXME StateQueue observer and mutator dump fields
1678 #endif
1679             // FIXME audio watchdog dump
1680 
1681             // accessible only within the threadLoop(), no locks required
1682             //          mFastCapture->sq()      // for mutating and pushing state
1683             int32_t     mFastCaptureFutex;      // for cold idle
1684 
1685             // The HAL input source is treated as non-blocking,
1686             // but current implementation is blocking
1687             sp<NBAIO_Source>                    mInputSource;
1688             // The source for the normal capture thread to read from: mInputSource or mPipeSource
1689             sp<NBAIO_Source>                    mNormalSource;
1690             // If a fast capture is present, the non-blocking pipe sink written to by fast capture,
1691             // otherwise clear
1692             sp<NBAIO_Sink>                      mPipeSink;
1693             // If a fast capture is present, the non-blocking pipe source read by normal thread,
1694             // otherwise clear
1695             sp<NBAIO_Source>                    mPipeSource;
1696             // Depth of pipe from fast capture to normal thread and fast clients, always power of 2
1697             size_t                              mPipeFramesP2;
1698             // If a fast capture is present, the Pipe as IMemory, otherwise clear
1699             sp<IMemory>                         mPipeMemory;
1700 
1701             // TODO: add comment and adjust size as needed
1702             static const size_t                 kFastCaptureLogSize = 4 * 1024;
1703             sp<NBLog::Writer>                   mFastCaptureNBLogWriter;
1704 
1705             bool                                mFastTrackAvail;    // true if fast track available
1706             // common state to all record threads
1707             std::atomic_bool                    mBtNrecSuspended;
1708 
1709             int64_t                             mFramesRead = 0;    // continuous running counter.
1710 };
1711 
1712 class MmapThread : public ThreadBase
1713 {
1714  public:
1715 
1716 #include "MmapTracks.h"
1717 
1718     MmapThread(const sp<AudioFlinger>& audioFlinger, audio_io_handle_t id,
1719                       AudioHwDevice *hwDev, sp<StreamHalInterface> stream,
1720                       audio_devices_t outDevice, audio_devices_t inDevice, bool systemReady);
1721     virtual     ~MmapThread();
1722 
1723     virtual     void        configure(const audio_attributes_t *attr,
1724                                       audio_stream_type_t streamType,
1725                                       audio_session_t sessionId,
1726                                       const sp<MmapStreamCallback>& callback,
1727                                       audio_port_handle_t deviceId,
1728                                       audio_port_handle_t portId);
1729 
1730                 void        disconnect();
1731 
1732     // MmapStreamInterface
1733     status_t createMmapBuffer(int32_t minSizeFrames,
1734                                       struct audio_mmap_buffer_info *info);
1735     status_t getMmapPosition(struct audio_mmap_position *position);
1736     status_t start(const AudioClient& client, audio_port_handle_t *handle);
1737     status_t stop(audio_port_handle_t handle);
1738     status_t standby();
1739 
1740     // RefBase
1741     virtual     void        onFirstRef();
1742 
1743     // Thread virtuals
1744     virtual     bool        threadLoop();
1745 
1746     virtual     void        threadLoop_exit();
1747     virtual     void        threadLoop_standby();
shouldStandby_l()1748     virtual     bool        shouldStandby_l() { return false; }
1749     virtual     status_t    exitStandby();
1750 
initCheck()1751     virtual     status_t    initCheck() const { return (mHalStream == 0) ? NO_INIT : NO_ERROR; }
frameCount()1752     virtual     size_t      frameCount() const { return mFrameCount; }
1753     virtual     bool        checkForNewParameter_l(const String8& keyValuePair,
1754                                                     status_t& status);
1755     virtual     String8     getParameters(const String8& keys);
1756     virtual     void        ioConfigChanged(audio_io_config_event event, pid_t pid = 0,
1757                                             audio_port_handle_t portId = AUDIO_PORT_HANDLE_NONE);
1758                 void        readHalParameters_l();
cacheParameters_l()1759     virtual     void        cacheParameters_l() {}
1760     virtual     status_t    createAudioPatch_l(const struct audio_patch *patch,
1761                                                audio_patch_handle_t *handle);
1762     virtual     status_t    releaseAudioPatch_l(const audio_patch_handle_t handle);
1763     virtual     void        toAudioPortConfig(struct audio_port_config *config);
1764 
stream()1765     virtual     sp<StreamHalInterface> stream() const { return mHalStream; }
1766     virtual     status_t    addEffectChain_l(const sp<EffectChain>& chain);
1767     virtual     size_t      removeEffectChain_l(const sp<EffectChain>& chain);
1768     virtual     status_t    checkEffectCompatibility_l(const effect_descriptor_t *desc,
1769                                                                audio_session_t sessionId);
1770 
hasAudioSession_l(audio_session_t sessionId)1771                 uint32_t    hasAudioSession_l(audio_session_t sessionId) const override {
1772                                 // Note: using mActiveTracks as no mTracks here.
1773                                 return ThreadBase::hasAudioSession_l(sessionId, mActiveTracks);
1774                             }
1775     virtual     status_t    setSyncEvent(const sp<SyncEvent>& event);
1776     virtual     bool        isValidSyncEvent(const sp<SyncEvent>& event) const;
1777 
checkSilentMode_l()1778     virtual     void        checkSilentMode_l() {}
processVolume_l()1779     virtual     void        processVolume_l() {}
1780                 void        checkInvalidTracks_l();
1781 
streamType()1782     virtual     audio_stream_type_t streamType() { return AUDIO_STREAM_DEFAULT; }
1783 
invalidateTracks(audio_stream_type_t streamType __unused)1784     virtual     void        invalidateTracks(audio_stream_type_t streamType __unused) {}
1785 
1786                 // Sets the UID records silence
setRecordSilenced(uid_t uid __unused,bool silenced __unused)1787     virtual     void        setRecordSilenced(uid_t uid __unused, bool silenced __unused) {}
1788 
1789  protected:
1790                 void        dumpInternals_l(int fd, const Vector<String16>& args) override;
1791                 void        dumpTracks_l(int fd, const Vector<String16>& args) override;
1792 
1793                 audio_attributes_t      mAttr;
1794                 audio_session_t         mSessionId;
1795                 audio_port_handle_t     mPortId;
1796 
1797                 wp<MmapStreamCallback>  mCallback;
1798                 sp<StreamHalInterface>  mHalStream;
1799                 sp<DeviceHalInterface>  mHalDevice;
1800                 AudioHwDevice* const    mAudioHwDev;
1801                 ActiveTracks<MmapTrack> mActiveTracks;
1802                 float                   mHalVolFloat;
1803 
1804                 int32_t                 mNoCallbackWarningCount;
1805      static     constexpr int32_t       kMaxNoCallbackWarnings = 5;
1806 };
1807 
1808 class MmapPlaybackThread : public MmapThread, public VolumeInterface
1809 {
1810 
1811 public:
1812     MmapPlaybackThread(const sp<AudioFlinger>& audioFlinger, audio_io_handle_t id,
1813                       AudioHwDevice *hwDev, AudioStreamOut *output,
1814                       audio_devices_t outDevice, audio_devices_t inDevice, bool systemReady);
~MmapPlaybackThread()1815     virtual     ~MmapPlaybackThread() {}
1816 
1817     virtual     void        configure(const audio_attributes_t *attr,
1818                                       audio_stream_type_t streamType,
1819                                       audio_session_t sessionId,
1820                                       const sp<MmapStreamCallback>& callback,
1821                                       audio_port_handle_t deviceId,
1822                                       audio_port_handle_t portId);
1823 
1824                 AudioStreamOut* clearOutput();
1825 
1826                 // VolumeInterface
1827     virtual     void        setMasterVolume(float value);
1828     virtual     void        setMasterMute(bool muted);
1829     virtual     void        setStreamVolume(audio_stream_type_t stream, float value);
1830     virtual     void        setStreamMute(audio_stream_type_t stream, bool muted);
1831     virtual     float       streamVolume(audio_stream_type_t stream) const;
1832 
setMasterMute_l(bool muted)1833                 void        setMasterMute_l(bool muted) { mMasterMute = muted; }
1834 
1835     virtual     void        invalidateTracks(audio_stream_type_t streamType);
1836 
streamType()1837     virtual     audio_stream_type_t streamType() { return mStreamType; }
1838     virtual     void        checkSilentMode_l();
1839                 void        processVolume_l() override;
1840 
isOutput()1841     virtual     bool        isOutput() const override { return true; }
1842 
1843                 void        updateMetadata_l() override;
1844 
1845     virtual     void        toAudioPortConfig(struct audio_port_config *config);
1846 
1847 protected:
1848                 void        dumpInternals_l(int fd, const Vector<String16>& args) override;
1849 
1850                 audio_stream_type_t         mStreamType;
1851                 float                       mMasterVolume;
1852                 float                       mStreamVolume;
1853                 bool                        mMasterMute;
1854                 bool                        mStreamMute;
1855                 AudioStreamOut*             mOutput;
1856 };
1857 
1858 class MmapCaptureThread : public MmapThread
1859 {
1860 
1861 public:
1862     MmapCaptureThread(const sp<AudioFlinger>& audioFlinger, audio_io_handle_t id,
1863                       AudioHwDevice *hwDev, AudioStreamIn *input,
1864                       audio_devices_t outDevice, audio_devices_t inDevice, bool systemReady);
~MmapCaptureThread()1865     virtual     ~MmapCaptureThread() {}
1866 
1867                 AudioStreamIn* clearInput();
1868 
1869                 status_t       exitStandby() override;
isOutput()1870     virtual     bool           isOutput() const override { return false; }
1871 
1872                 void           updateMetadata_l() override;
1873                 void           processVolume_l() override;
1874                 void           setRecordSilenced(uid_t uid, bool silenced) override;
1875 
1876     virtual     void           toAudioPortConfig(struct audio_port_config *config);
1877 
1878 protected:
1879 
1880                 AudioStreamIn*  mInput;
1881 };
1882