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