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