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 //--- Audio Effect Management 23 24 // Interface implemented by the EffectModule parent or owner (e.g an EffectChain) to abstract 25 // interactions between the EffectModule and the reset of the audio framework. 26 class EffectCallbackInterface : public RefBase { 27 public: 28 ~EffectCallbackInterface() override = default; 29 30 // Trivial methods usually implemented with help from ThreadBase 31 virtual audio_io_handle_t io() const = 0; 32 virtual bool isOutput() const = 0; 33 virtual bool isOffload() const = 0; 34 virtual bool isOffloadOrDirect() const = 0; 35 virtual bool isOffloadOrMmap() const = 0; 36 virtual uint32_t sampleRate() const = 0; 37 virtual audio_channel_mask_t channelMask() const = 0; 38 virtual uint32_t channelCount() const = 0; 39 virtual size_t frameCount() const = 0; 40 41 // Non trivial methods usually implemented with help from ThreadBase: 42 // pay attention to mutex locking order latency()43 virtual uint32_t latency() const { return 0; } 44 virtual status_t addEffectToHal(sp<EffectHalInterface> effect) = 0; 45 virtual status_t removeEffectFromHal(sp<EffectHalInterface> effect) = 0; 46 virtual void setVolumeForOutput(float left, float right) const = 0; 47 virtual bool disconnectEffectHandle(EffectHandle *handle, bool unpinIfLast) = 0; 48 virtual void checkSuspendOnEffectEnabled(const sp<EffectBase>& effect, 49 bool enabled, 50 bool threadLocked) = 0; 51 virtual void onEffectEnable(const sp<EffectBase>& effect) = 0; 52 virtual void onEffectDisable(const sp<EffectBase>& effect) = 0; 53 54 // Methods usually implemented with help from AudioFlinger: pay attention to mutex locking order 55 virtual status_t createEffectHal(const effect_uuid_t *pEffectUuid, 56 int32_t sessionId, int32_t deviceId, sp<EffectHalInterface> *effect) = 0; 57 virtual status_t allocateHalBuffer(size_t size, sp<EffectBufferHalInterface>* buffer) = 0; 58 virtual bool updateOrphanEffectChains(const sp<EffectBase>& effect) = 0; 59 60 // Methods usually implemented with help from EffectChain: pay attention to mutex locking order 61 virtual uint32_t strategy() const = 0; 62 virtual int32_t activeTrackCnt() const = 0; 63 virtual void resetVolume() = 0; 64 65 virtual wp<EffectChain> chain() const = 0; 66 }; 67 68 // EffectBase(EffectModule) and EffectChain classes both have their own mutex to protect 69 // state changes or resource modifications. Always respect the following order 70 // if multiple mutexes must be acquired to avoid cross deadlock: 71 // AudioFlinger -> ThreadBase -> EffectChain -> EffectBase(EffectModule) 72 // AudioHandle -> ThreadBase -> EffectChain -> EffectBase(EffectModule) 73 74 // NOTE: When implementing the EffectCallbackInterface, in an EffectChain or other, it is important 75 // to pay attention to this locking order as some callback methods can be called from a state where 76 // EffectModule and/or EffectChain mutexes are held. 77 78 // In addition, methods that lock the AudioPolicyService mutex (getOutputForEffect(), 79 // startOutput(), getInputForAttr(), releaseInput()...) should never be called with AudioFlinger or 80 // Threadbase mutex locked to avoid cross deadlock with other clients calling AudioPolicyService 81 // methods that in turn call AudioFlinger thus locking the same mutexes in the reverse order. 82 83 84 // The EffectBase class contains common properties, state and behavior for and EffectModule or 85 // other derived classes managing an audio effect instance within the effect framework. 86 // It also contains the class mutex (see comment on locking order above). 87 class EffectBase : public RefBase { 88 public: 89 EffectBase(const sp<EffectCallbackInterface>& callback, 90 effect_descriptor_t *desc, 91 int id, 92 audio_session_t sessionId, 93 bool pinned); 94 95 ~EffectBase() override = default; 96 97 enum effect_state { 98 IDLE, 99 RESTART, 100 STARTING, 101 ACTIVE, 102 STOPPING, 103 STOPPED, 104 DESTROYED 105 }; 106 id()107 int id() const { return mId; } state()108 effect_state state() const { 109 return mState; 110 } sessionId()111 audio_session_t sessionId() const { 112 return mSessionId; 113 } desc()114 const effect_descriptor_t& desc() const { return mDescriptor; } isOffloadable()115 bool isOffloadable() const 116 { return (mDescriptor.flags & EFFECT_FLAG_OFFLOAD_SUPPORTED) != 0; } isImplementationSoftware()117 bool isImplementationSoftware() const 118 { return (mDescriptor.flags & EFFECT_FLAG_HW_ACC_MASK) == 0; } isProcessImplemented()119 bool isProcessImplemented() const 120 { return (mDescriptor.flags & EFFECT_FLAG_NO_PROCESS) == 0; } isVolumeControl()121 bool isVolumeControl() const 122 { return (mDescriptor.flags & EFFECT_FLAG_VOLUME_MASK) 123 == EFFECT_FLAG_VOLUME_CTRL; } isVolumeMonitor()124 bool isVolumeMonitor() const 125 { return (mDescriptor.flags & EFFECT_FLAG_VOLUME_MASK) 126 == EFFECT_FLAG_VOLUME_MONITOR; } 127 128 virtual status_t setEnabled(bool enabled, bool fromHandle); 129 status_t setEnabled_l(bool enabled); 130 bool isEnabled() const; 131 132 void setSuspended(bool suspended); 133 bool suspended() const; 134 command(uint32_t cmdCode __unused,uint32_t cmdSize __unused,void * pCmdData __unused,uint32_t * replySize __unused,void * pReplyData __unused)135 virtual status_t command(uint32_t cmdCode __unused, 136 uint32_t cmdSize __unused, 137 void *pCmdData __unused, 138 uint32_t *replySize __unused, 139 void *pReplyData __unused) { return NO_ERROR; }; 140 setCallback(const sp<EffectCallbackInterface> & callback)141 void setCallback(const sp<EffectCallbackInterface>& callback) { mCallback = callback; } callback()142 sp<EffectCallbackInterface>& callback() { return mCallback; } 143 144 status_t addHandle(EffectHandle *handle); 145 ssize_t disconnectHandle(EffectHandle *handle, bool unpinIfLast); 146 ssize_t removeHandle(EffectHandle *handle); 147 virtual ssize_t removeHandle_l(EffectHandle *handle); 148 EffectHandle* controlHandle_l(); 149 bool purgeHandles(); 150 151 void checkSuspendOnEffectEnabled(bool enabled, bool threadLocked); 152 isPinned()153 bool isPinned() const { return mPinned; } unPin()154 void unPin() { mPinned = false; } 155 lock()156 void lock() { mLock.lock(); } unlock()157 void unlock() { mLock.unlock(); } 158 159 status_t updatePolicyState(); 160 asEffectModule()161 virtual sp<EffectModule> asEffectModule() { return nullptr; } asDeviceEffectProxy()162 virtual sp<DeviceEffectProxy> asDeviceEffectProxy() { return nullptr; } 163 164 void dump(int fd, const Vector<String16>& args); 165 166 private: 167 friend class AudioFlinger; // for mHandles 168 bool mPinned = false; 169 170 DISALLOW_COPY_AND_ASSIGN(EffectBase); 171 172 mutable Mutex mLock; // mutex for process, commands and handles list protection 173 sp<EffectCallbackInterface> mCallback; // parent effect chain 174 const int mId; // this instance unique ID 175 const audio_session_t mSessionId; // audio session ID 176 const effect_descriptor_t mDescriptor;// effect descriptor received from effect engine 177 effect_state mState = IDLE; // current activation state 178 // effect is suspended: temporarily disabled by framework 179 bool mSuspended = false; 180 181 Vector<EffectHandle *> mHandles; // list of client handles 182 // First handle in mHandles has highest priority and controls the effect module 183 184 // Audio policy effect state management 185 // Mutex protecting transactions with audio policy manager as mLock cannot 186 // be held to avoid cross deadlocks with audio policy mutex 187 Mutex mPolicyLock; 188 // Effect is registered in APM or not 189 bool mPolicyRegistered = false; 190 // Effect enabled state communicated to APM. Enabled state corresponds to 191 // state requested by the EffectHandle with control 192 bool mPolicyEnabled = false; 193 }; 194 195 // The EffectModule class is a wrapper object controlling the effect engine implementation 196 // in the effect library. It prevents concurrent calls to process() and command() functions 197 // from different client threads. It keeps a list of EffectHandle objects corresponding 198 // to all client applications using this effect and notifies applications of effect state, 199 // control or parameter changes. It manages the activation state machine to send appropriate 200 // reset, enable, disable commands to effect engine and provide volume 201 // ramping when effects are activated/deactivated. 202 // When controlling an auxiliary effect, the EffectModule also provides an input buffer used by 203 // the attached track(s) to accumulate their auxiliary channel. 204 class EffectModule : public EffectBase { 205 public: 206 EffectModule(const sp<EffectCallbackInterface>& callabck, 207 effect_descriptor_t *desc, 208 int id, 209 audio_session_t sessionId, 210 bool pinned, 211 audio_port_handle_t deviceId); 212 virtual ~EffectModule(); 213 214 void process(); 215 bool updateState(); 216 status_t command(uint32_t cmdCode, 217 uint32_t cmdSize, 218 void *pCmdData, 219 uint32_t *replySize, 220 void *pReplyData) override; 221 222 void reset_l(); 223 status_t configure(); 224 status_t init(); 225 status()226 uint32_t status() { 227 return mStatus; 228 } 229 230 bool isProcessEnabled() const; 231 bool isOffloadedOrDirect() const; 232 bool isVolumeControlEnabled() const; 233 234 void setInBuffer(const sp<EffectBufferHalInterface>& buffer); inBuffer()235 int16_t *inBuffer() const { 236 return mInBuffer != 0 ? reinterpret_cast<int16_t*>(mInBuffer->ptr()) : NULL; 237 } 238 void setOutBuffer(const sp<EffectBufferHalInterface>& buffer); outBuffer()239 int16_t *outBuffer() const { 240 return mOutBuffer != 0 ? reinterpret_cast<int16_t*>(mOutBuffer->ptr()) : NULL; 241 } 242 243 ssize_t removeHandle_l(EffectHandle *handle) override; 244 245 status_t setDevices(const AudioDeviceTypeAddrVector &devices); 246 status_t setInputDevice(const AudioDeviceTypeAddr &device); 247 status_t setVolume(uint32_t *left, uint32_t *right, bool controller); 248 status_t setMode(audio_mode_t mode); 249 status_t setAudioSource(audio_source_t source); 250 status_t start(); 251 status_t stop(); 252 253 status_t setOffloaded(bool offloaded, audio_io_handle_t io); 254 bool isOffloaded() const; 255 void addEffectToHal_l(); 256 void release_l(); 257 asEffectModule()258 sp<EffectModule> asEffectModule() override { return this; } 259 260 void dump(int fd, const Vector<String16>& args); 261 262 private: 263 friend class AudioFlinger; // for mHandles 264 265 // Maximum time allocated to effect engines to complete the turn off sequence 266 static const uint32_t MAX_DISABLE_TIME_MS = 10000; 267 268 DISALLOW_COPY_AND_ASSIGN(EffectModule); 269 270 status_t start_l(); 271 status_t stop_l(); 272 status_t removeEffectFromHal_l(); 273 status_t sendSetAudioDevicesCommand(const AudioDeviceTypeAddrVector &devices, uint32_t cmdCode); 274 275 effect_config_t mConfig; // input and output audio configuration 276 sp<EffectHalInterface> mEffectInterface; // Effect module HAL 277 sp<EffectBufferHalInterface> mInBuffer; // Buffers for interacting with HAL 278 sp<EffectBufferHalInterface> mOutBuffer; 279 status_t mStatus; // initialization status 280 // First handle in mHandles has highest priority and controls the effect module 281 uint32_t mMaxDisableWaitCnt; // maximum grace period before forcing an effect off after 282 // sending disable command. 283 uint32_t mDisableWaitCnt; // current process() calls count during disable period. 284 bool mOffloaded; // effect is currently offloaded to the audio DSP 285 286 #ifdef FLOAT_EFFECT_CHAIN 287 bool mSupportsFloat; // effect supports float processing 288 sp<EffectBufferHalInterface> mInConversionBuffer; // Buffers for HAL conversion if needed. 289 sp<EffectBufferHalInterface> mOutConversionBuffer; 290 uint32_t mInChannelCountRequested; 291 uint32_t mOutChannelCountRequested; 292 #endif 293 294 class AutoLockReentrant { 295 public: AutoLockReentrant(Mutex & mutex,pid_t allowedTid)296 AutoLockReentrant(Mutex& mutex, pid_t allowedTid) 297 : mMutex(gettid() == allowedTid ? nullptr : &mutex) 298 { 299 if (mMutex != nullptr) mMutex->lock(); 300 } ~AutoLockReentrant()301 ~AutoLockReentrant() { 302 if (mMutex != nullptr) mMutex->unlock(); 303 } 304 private: 305 Mutex * const mMutex; 306 }; 307 308 static constexpr pid_t INVALID_PID = (pid_t)-1; 309 // this tid is allowed to call setVolume() without acquiring the mutex. 310 pid_t mSetVolumeReentrantTid = INVALID_PID; 311 }; 312 313 // The EffectHandle class implements the IEffect interface. It provides resources 314 // to receive parameter updates, keeps track of effect control 315 // ownership and state and has a pointer to the EffectModule object it is controlling. 316 // There is one EffectHandle object for each application controlling (or using) 317 // an effect module. 318 // The EffectHandle is obtained by calling AudioFlinger::createEffect(). 319 class EffectHandle: public android::BnEffect { 320 public: 321 322 EffectHandle(const sp<EffectBase>& effect, 323 const sp<AudioFlinger::Client>& client, 324 const sp<IEffectClient>& effectClient, 325 int32_t priority); 326 virtual ~EffectHandle(); 327 virtual status_t initCheck(); 328 329 // IEffect 330 virtual status_t enable(); 331 virtual status_t disable(); 332 virtual status_t command(uint32_t cmdCode, 333 uint32_t cmdSize, 334 void *pCmdData, 335 uint32_t *replySize, 336 void *pReplyData); 337 virtual void disconnect(); 338 private: 339 void disconnect(bool unpinIfLast); 340 public: getCblk()341 virtual sp<IMemory> getCblk() const { return mCblkMemory; } 342 virtual status_t onTransact(uint32_t code, const Parcel& data, 343 Parcel* reply, uint32_t flags); 344 345 346 // Give or take control of effect module 347 // - hasControl: true if control is given, false if removed 348 // - signal: true client app should be signaled of change, false otherwise 349 // - enabled: state of the effect when control is passed 350 void setControl(bool hasControl, bool signal, bool enabled); 351 void commandExecuted(uint32_t cmdCode, 352 uint32_t cmdSize, 353 void *pCmdData, 354 uint32_t replySize, 355 void *pReplyData); 356 void setEnabled(bool enabled); enabled()357 bool enabled() const { return mEnabled; } 358 359 // Getters effect()360 wp<EffectBase> effect() const { return mEffect; } id()361 int id() const { 362 sp<EffectBase> effect = mEffect.promote(); 363 if (effect == 0) { 364 return 0; 365 } 366 return effect->id(); 367 } priority()368 int priority() const { return mPriority; } hasControl()369 bool hasControl() const { return mHasControl; } disconnected()370 bool disconnected() const { return mDisconnected; } 371 372 void dumpToBuffer(char* buffer, size_t size); 373 374 private: 375 friend class AudioFlinger; // for mEffect, mHasControl, mEnabled 376 DISALLOW_COPY_AND_ASSIGN(EffectHandle); 377 378 Mutex mLock; // protects IEffect method calls 379 wp<EffectBase> mEffect; // pointer to controlled EffectModule 380 sp<IEffectClient> mEffectClient; // callback interface for client notifications 381 /*const*/ sp<Client> mClient; // client for shared memory allocation, see disconnect() 382 sp<IMemory> mCblkMemory; // shared memory for control block 383 effect_param_cblk_t* mCblk; // control block for deferred parameter setting via 384 // shared memory 385 uint8_t* mBuffer; // pointer to parameter area in shared memory 386 int mPriority; // client application priority to control the effect 387 bool mHasControl; // true if this handle is controlling the effect 388 bool mEnabled; // cached enable state: needed when the effect is 389 // restored after being suspended 390 bool mDisconnected; // Set to true by disconnect() 391 }; 392 393 // the EffectChain class represents a group of effects associated to one audio session. 394 // There can be any number of EffectChain objects per output mixer thread (PlaybackThread). 395 // The EffectChain with session ID AUDIO_SESSION_OUTPUT_MIX contains global effects applied 396 // to the output mix. 397 // Effects in this chain can be insert or auxiliary. Effects in other chains (attached to 398 // tracks) are insert only. The EffectChain maintains an ordered list of effect module, the 399 // order corresponding in the effect process order. When attached to a track (session ID != 400 // AUDIO_SESSION_OUTPUT_MIX), 401 // it also provide it's own input buffer used by the track as accumulation buffer. 402 class EffectChain : public RefBase { 403 public: 404 EffectChain(const wp<ThreadBase>& wThread, audio_session_t sessionId); 405 EffectChain(ThreadBase *thread, audio_session_t sessionId); 406 virtual ~EffectChain(); 407 408 // special key used for an entry in mSuspendedEffects keyed vector 409 // corresponding to a suspend all request. 410 static const int kKeyForSuspendAll = 0; 411 412 // minimum duration during which we force calling effect process when last track on 413 // a session is stopped or removed to allow effect tail to be rendered 414 static const int kProcessTailDurationMs = 1000; 415 416 void process_l(); 417 lock()418 void lock() { 419 mLock.lock(); 420 } unlock()421 void unlock() { 422 mLock.unlock(); 423 } 424 425 status_t createEffect_l(sp<EffectModule>& effect, 426 effect_descriptor_t *desc, 427 int id, 428 audio_session_t sessionId, 429 bool pinned); 430 status_t addEffect_l(const sp<EffectModule>& handle); 431 status_t addEffect_ll(const sp<EffectModule>& handle); 432 size_t removeEffect_l(const sp<EffectModule>& handle, bool release = false); 433 sessionId()434 audio_session_t sessionId() const { return mSessionId; } setSessionId(audio_session_t sessionId)435 void setSessionId(audio_session_t sessionId) { mSessionId = sessionId; } 436 437 sp<EffectModule> getEffectFromDesc_l(effect_descriptor_t *descriptor); 438 sp<EffectModule> getEffectFromId_l(int id); 439 sp<EffectModule> getEffectFromType_l(const effect_uuid_t *type); 440 std::vector<int> getEffectIds(); 441 // FIXME use float to improve the dynamic range 442 bool setVolume_l(uint32_t *left, uint32_t *right, bool force = false); 443 void resetVolume_l(); 444 void setDevices_l(const AudioDeviceTypeAddrVector &devices); 445 void setInputDevice_l(const AudioDeviceTypeAddr &device); 446 void setMode_l(audio_mode_t mode); 447 void setAudioSource_l(audio_source_t source); 448 setInBuffer(const sp<EffectBufferHalInterface> & buffer)449 void setInBuffer(const sp<EffectBufferHalInterface>& buffer) { 450 mInBuffer = buffer; 451 } inBuffer()452 effect_buffer_t *inBuffer() const { 453 return mInBuffer != 0 ? reinterpret_cast<effect_buffer_t*>(mInBuffer->ptr()) : NULL; 454 } setOutBuffer(const sp<EffectBufferHalInterface> & buffer)455 void setOutBuffer(const sp<EffectBufferHalInterface>& buffer) { 456 mOutBuffer = buffer; 457 } outBuffer()458 effect_buffer_t *outBuffer() const { 459 return mOutBuffer != 0 ? reinterpret_cast<effect_buffer_t*>(mOutBuffer->ptr()) : NULL; 460 } 461 incTrackCnt()462 void incTrackCnt() { android_atomic_inc(&mTrackCnt); } decTrackCnt()463 void decTrackCnt() { android_atomic_dec(&mTrackCnt); } trackCnt()464 int32_t trackCnt() const { return android_atomic_acquire_load(&mTrackCnt); } 465 incActiveTrackCnt()466 void incActiveTrackCnt() { android_atomic_inc(&mActiveTrackCnt); 467 mTailBufferCount = mMaxTailBuffers; } decActiveTrackCnt()468 void decActiveTrackCnt() { android_atomic_dec(&mActiveTrackCnt); } activeTrackCnt()469 int32_t activeTrackCnt() const { return android_atomic_acquire_load(&mActiveTrackCnt); } 470 strategy()471 uint32_t strategy() const { return mStrategy; } setStrategy(uint32_t strategy)472 void setStrategy(uint32_t strategy) 473 { mStrategy = strategy; } 474 475 // suspend or restore effects of the specified type. The number of suspend requests is counted 476 // and restore occurs once all suspend requests are cancelled. 477 void setEffectSuspended_l(const effect_uuid_t *type, 478 bool suspend); 479 // suspend all eligible effects 480 void setEffectSuspendedAll_l(bool suspend); 481 // check if effects should be suspended or restored when a given effect is enable or disabled 482 void checkSuspendOnEffectEnabled(const sp<EffectModule>& effect, bool enabled); 483 484 void clearInputBuffer(); 485 486 // At least one non offloadable effect in the chain is enabled 487 bool isNonOffloadableEnabled(); 488 bool isNonOffloadableEnabled_l(); 489 490 void syncHalEffectsState(); 491 492 // flags is an ORed set of audio_output_flags_t which is updated on return. 493 void checkOutputFlagCompatibility(audio_output_flags_t *flags) const; 494 495 // flags is an ORed set of audio_input_flags_t which is updated on return. 496 void checkInputFlagCompatibility(audio_input_flags_t *flags) const; 497 498 // Is this EffectChain compatible with the RAW audio flag. 499 bool isRawCompatible() const; 500 501 // Is this EffectChain compatible with the FAST audio flag. 502 bool isFastCompatible() const; 503 504 // isCompatibleWithThread_l() must be called with thread->mLock held 505 bool isCompatibleWithThread_l(const sp<ThreadBase>& thread) const; 506 effectCallback()507 sp<EffectCallbackInterface> effectCallback() const { return mEffectCallback; } thread()508 wp<ThreadBase> thread() const { return mEffectCallback->thread(); } 509 510 void dump(int fd, const Vector<String16>& args); 511 512 private: 513 514 class EffectCallback : public EffectCallbackInterface { 515 public: EffectCallback(EffectChain * chain,ThreadBase * thread,AudioFlinger * audioFlinger)516 EffectCallback(EffectChain *chain, ThreadBase *thread, AudioFlinger *audioFlinger) 517 : mChain(chain), mThread(thread), mAudioFlinger(audioFlinger) {} 518 519 status_t createEffectHal(const effect_uuid_t *pEffectUuid, 520 int32_t sessionId, int32_t deviceId, sp<EffectHalInterface> *effect) override; 521 status_t allocateHalBuffer(size_t size, sp<EffectBufferHalInterface>* buffer) override; 522 bool updateOrphanEffectChains(const sp<EffectBase>& effect) override; 523 524 audio_io_handle_t io() const override; 525 bool isOutput() const override; 526 bool isOffload() const override; 527 bool isOffloadOrDirect() const override; 528 bool isOffloadOrMmap() const override; 529 530 uint32_t sampleRate() const override; 531 audio_channel_mask_t channelMask() const override; 532 uint32_t channelCount() const override; 533 size_t frameCount() const override; 534 uint32_t latency() const override; 535 536 status_t addEffectToHal(sp<EffectHalInterface> effect) override; 537 status_t removeEffectFromHal(sp<EffectHalInterface> effect) override; 538 bool disconnectEffectHandle(EffectHandle *handle, bool unpinIfLast) override; 539 void setVolumeForOutput(float left, float right) const override; 540 541 // check if effects should be suspended/restored when a given effect is enable/disabled 542 void checkSuspendOnEffectEnabled(const sp<EffectBase>& effect, 543 bool enabled, bool threadLocked) override; 544 void resetVolume() override; 545 uint32_t strategy() const override; 546 int32_t activeTrackCnt() const override; 547 void onEffectEnable(const sp<EffectBase>& effect) override; 548 void onEffectDisable(const sp<EffectBase>& effect) override; 549 chain()550 wp<EffectChain> chain() const override { return mChain; } 551 thread()552 wp<ThreadBase> thread() { return mThread; } setThread(ThreadBase * thread)553 void setThread(ThreadBase *thread) { mThread = thread; }; 554 555 private: 556 wp<EffectChain> mChain; 557 wp<ThreadBase> mThread; 558 wp<AudioFlinger> mAudioFlinger; 559 }; 560 561 friend class AudioFlinger; // for mThread, mEffects 562 DISALLOW_COPY_AND_ASSIGN(EffectChain); 563 564 class SuspendedEffectDesc : public RefBase { 565 public: SuspendedEffectDesc()566 SuspendedEffectDesc() : mRefCount(0) {} 567 568 int mRefCount; // > 0 when suspended 569 effect_uuid_t mType; 570 wp<EffectModule> mEffect; 571 }; 572 573 // get a list of effect modules to suspend when an effect of the type 574 // passed is enabled. 575 void getSuspendEligibleEffects(Vector< sp<EffectModule> > &effects); 576 577 // get an effect module if it is currently enable 578 sp<EffectModule> getEffectIfEnabled(const effect_uuid_t *type); 579 // true if the effect whose descriptor is passed can be suspended 580 // OEMs can modify the rules implemented in this method to exclude specific effect 581 // types or implementations from the suspend/restore mechanism. 582 bool isEffectEligibleForSuspend(const effect_descriptor_t& desc); 583 584 static bool isEffectEligibleForBtNrecSuspend(const effect_uuid_t *type); 585 586 void clearInputBuffer_l(); 587 588 void setThread(const sp<ThreadBase>& thread); 589 590 void setVolumeForOutput_l(uint32_t left, uint32_t right); 591 592 mutable Mutex mLock; // mutex protecting effect list 593 Vector< sp<EffectModule> > mEffects; // list of effect modules 594 audio_session_t mSessionId; // audio session ID 595 sp<EffectBufferHalInterface> mInBuffer; // chain input buffer 596 sp<EffectBufferHalInterface> mOutBuffer; // chain output buffer 597 598 // 'volatile' here means these are accessed with atomic operations instead of mutex 599 volatile int32_t mActiveTrackCnt; // number of active tracks connected 600 volatile int32_t mTrackCnt; // number of tracks connected 601 602 int32_t mTailBufferCount; // current effect tail buffer count 603 int32_t mMaxTailBuffers; // maximum effect tail buffers 604 int mVolumeCtrlIdx; // index of insert effect having control over volume 605 uint32_t mLeftVolume; // previous volume on left channel 606 uint32_t mRightVolume; // previous volume on right channel 607 uint32_t mNewLeftVolume; // new volume on left channel 608 uint32_t mNewRightVolume; // new volume on right channel 609 uint32_t mStrategy; // strategy for this effect chain 610 // mSuspendedEffects lists all effects currently suspended in the chain. 611 // Use effect type UUID timelow field as key. There is no real risk of identical 612 // timeLow fields among effect type UUIDs. 613 // Updated by setEffectSuspended_l() and setEffectSuspendedAll_l() only. 614 KeyedVector< int, sp<SuspendedEffectDesc> > mSuspendedEffects; 615 616 const sp<EffectCallback> mEffectCallback; 617 }; 618 619 class DeviceEffectProxy : public EffectBase { 620 public: DeviceEffectProxy(const AudioDeviceTypeAddr & device,const sp<DeviceEffectManagerCallback> & callback,effect_descriptor_t * desc,int id)621 DeviceEffectProxy (const AudioDeviceTypeAddr& device, 622 const sp<DeviceEffectManagerCallback>& callback, 623 effect_descriptor_t *desc, int id) 624 : EffectBase(callback, desc, id, AUDIO_SESSION_DEVICE, false), 625 mDevice(device), mManagerCallback(callback), 626 mMyCallback(new ProxyCallback(this, callback)) {} 627 628 status_t setEnabled(bool enabled, bool fromHandle) override; asDeviceEffectProxy()629 sp<DeviceEffectProxy> asDeviceEffectProxy() override { return this; } 630 631 status_t init(const std::map<audio_patch_handle_t, PatchPanel::Patch>& patches); 632 status_t onCreatePatch(audio_patch_handle_t patchHandle, const PatchPanel::Patch& patch); 633 void onReleasePatch(audio_patch_handle_t patchHandle); 634 635 size_t removeEffect(const sp<EffectModule>& effect); 636 637 status_t addEffectToHal(sp<EffectHalInterface> effect); 638 status_t removeEffectFromHal(sp<EffectHalInterface> effect); 639 device()640 const AudioDeviceTypeAddr& device() { return mDevice; }; 641 bool isOutput() const; 642 uint32_t sampleRate() const; 643 audio_channel_mask_t channelMask() const; 644 uint32_t channelCount() const; 645 646 void dump(int fd, int spaces); 647 648 private: 649 650 class ProxyCallback : public EffectCallbackInterface { 651 public: ProxyCallback(DeviceEffectProxy * proxy,const sp<DeviceEffectManagerCallback> & callback)652 ProxyCallback(DeviceEffectProxy *proxy, 653 const sp<DeviceEffectManagerCallback>& callback) 654 : mProxy(proxy), mManagerCallback(callback) {} 655 656 status_t createEffectHal(const effect_uuid_t *pEffectUuid, 657 int32_t sessionId, int32_t deviceId, sp<EffectHalInterface> *effect) override; allocateHalBuffer(size_t size __unused,sp<EffectBufferHalInterface> * buffer __unused)658 status_t allocateHalBuffer(size_t size __unused, 659 sp<EffectBufferHalInterface>* buffer __unused) override { return NO_ERROR; } updateOrphanEffectChains(const sp<EffectBase> & effect __unused)660 bool updateOrphanEffectChains(const sp<EffectBase>& effect __unused) override { 661 return false; 662 } 663 io()664 audio_io_handle_t io() const override { return AUDIO_IO_HANDLE_NONE; } 665 bool isOutput() const override; isOffload()666 bool isOffload() const override { return false; } isOffloadOrDirect()667 bool isOffloadOrDirect() const override { return false; } isOffloadOrMmap()668 bool isOffloadOrMmap() const override { return false; } 669 670 uint32_t sampleRate() const override; 671 audio_channel_mask_t channelMask() const override; 672 uint32_t channelCount() const override; frameCount()673 size_t frameCount() const override { return 0; } latency()674 uint32_t latency() const override { return 0; } 675 676 status_t addEffectToHal(sp<EffectHalInterface> effect) override; 677 status_t removeEffectFromHal(sp<EffectHalInterface> effect) override; 678 679 bool disconnectEffectHandle(EffectHandle *handle, bool unpinIfLast) override; setVolumeForOutput(float left __unused,float right __unused)680 void setVolumeForOutput(float left __unused, float right __unused) const override {} 681 checkSuspendOnEffectEnabled(const sp<EffectBase> & effect __unused,bool enabled __unused,bool threadLocked __unused)682 void checkSuspendOnEffectEnabled(const sp<EffectBase>& effect __unused, 683 bool enabled __unused, bool threadLocked __unused) override {} resetVolume()684 void resetVolume() override {} strategy()685 uint32_t strategy() const override { return 0; } activeTrackCnt()686 int32_t activeTrackCnt() const override { return 0; } onEffectEnable(const sp<EffectBase> & effect __unused)687 void onEffectEnable(const sp<EffectBase>& effect __unused) override {} onEffectDisable(const sp<EffectBase> & effect __unused)688 void onEffectDisable(const sp<EffectBase>& effect __unused) override {} 689 chain()690 wp<EffectChain> chain() const override { return nullptr; } 691 692 int newEffectId(); 693 694 private: 695 const wp<DeviceEffectProxy> mProxy; 696 const sp<DeviceEffectManagerCallback> mManagerCallback; 697 }; 698 699 status_t checkPort(const PatchPanel::Patch& patch, const struct audio_port_config *port, 700 sp<EffectHandle> *handle); 701 702 const AudioDeviceTypeAddr mDevice; 703 const sp<DeviceEffectManagerCallback> mManagerCallback; 704 const sp<ProxyCallback> mMyCallback; 705 706 Mutex mProxyLock; 707 std::map<audio_patch_handle_t, sp<EffectHandle>> mEffectHandles; // protected by mProxyLock 708 sp<EffectModule> mHalEffect; // protected by mProxyLock 709 struct audio_port_config mDevicePort = { .id = AUDIO_PORT_HANDLE_NONE }; 710 }; 711