1*ec779b8eSAndroid Build Coastguard Worker /* 2*ec779b8eSAndroid Build Coastguard Worker ** 3*ec779b8eSAndroid Build Coastguard Worker ** Copyright 2019, The Android Open Source Project 4*ec779b8eSAndroid Build Coastguard Worker ** 5*ec779b8eSAndroid Build Coastguard Worker ** Licensed under the Apache License, Version 2.0 (the "License"); 6*ec779b8eSAndroid Build Coastguard Worker ** you may not use this file except in compliance with the License. 7*ec779b8eSAndroid Build Coastguard Worker ** You may obtain a copy of the License at 8*ec779b8eSAndroid Build Coastguard Worker ** 9*ec779b8eSAndroid Build Coastguard Worker ** http://www.apache.org/licenses/LICENSE-2.0 10*ec779b8eSAndroid Build Coastguard Worker ** 11*ec779b8eSAndroid Build Coastguard Worker ** Unless required by applicable law or agreed to in writing, software 12*ec779b8eSAndroid Build Coastguard Worker ** distributed under the License is distributed on an "AS IS" BASIS, 13*ec779b8eSAndroid Build Coastguard Worker ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14*ec779b8eSAndroid Build Coastguard Worker ** See the License for the specific language governing permissions and 15*ec779b8eSAndroid Build Coastguard Worker ** limitations under the License. 16*ec779b8eSAndroid Build Coastguard Worker */ 17*ec779b8eSAndroid Build Coastguard Worker 18*ec779b8eSAndroid Build Coastguard Worker #pragma once 19*ec779b8eSAndroid Build Coastguard Worker 20*ec779b8eSAndroid Build Coastguard Worker #include "IAfEffect.h" 21*ec779b8eSAndroid Build Coastguard Worker #include "PatchCommandThread.h" 22*ec779b8eSAndroid Build Coastguard Worker 23*ec779b8eSAndroid Build Coastguard Worker namespace android { 24*ec779b8eSAndroid Build Coastguard Worker 25*ec779b8eSAndroid Build Coastguard Worker class IAfDeviceEffectManagerCallback : public virtual RefBase { 26*ec779b8eSAndroid Build Coastguard Worker public: 27*ec779b8eSAndroid Build Coastguard Worker virtual bool isAudioPolicyReady() const = 0; 28*ec779b8eSAndroid Build Coastguard Worker virtual audio_unique_id_t nextUniqueId(audio_unique_id_use_t use) = 0; 29*ec779b8eSAndroid Build Coastguard Worker virtual const sp<PatchCommandThread>& getPatchCommandThread() = 0; 30*ec779b8eSAndroid Build Coastguard Worker virtual status_t addEffectToHal( 31*ec779b8eSAndroid Build Coastguard Worker const struct audio_port_config* device, const sp<EffectHalInterface>& effect) 32*ec779b8eSAndroid Build Coastguard Worker EXCLUDES_AudioFlinger_HardwareMutex = 0; 33*ec779b8eSAndroid Build Coastguard Worker virtual status_t removeEffectFromHal( 34*ec779b8eSAndroid Build Coastguard Worker const struct audio_port_config* device, const sp<EffectHalInterface>& effect) 35*ec779b8eSAndroid Build Coastguard Worker EXCLUDES_AudioFlinger_HardwareMutex= 0; 36*ec779b8eSAndroid Build Coastguard Worker }; 37*ec779b8eSAndroid Build Coastguard Worker 38*ec779b8eSAndroid Build Coastguard Worker class DeviceEffectManagerCallback; 39*ec779b8eSAndroid Build Coastguard Worker 40*ec779b8eSAndroid Build Coastguard Worker // DeviceEffectManager is concealed within AudioFlinger, their lifetimes are the same. 41*ec779b8eSAndroid Build Coastguard Worker class DeviceEffectManager : public PatchCommandThread::PatchCommandListener { 42*ec779b8eSAndroid Build Coastguard Worker public: 43*ec779b8eSAndroid Build Coastguard Worker explicit DeviceEffectManager( 44*ec779b8eSAndroid Build Coastguard Worker const sp<IAfDeviceEffectManagerCallback>& afDeviceEffectManagerCallback); 45*ec779b8eSAndroid Build Coastguard Worker 46*ec779b8eSAndroid Build Coastguard Worker void onFirstRef() override; 47*ec779b8eSAndroid Build Coastguard Worker 48*ec779b8eSAndroid Build Coastguard Worker sp<IAfEffectHandle> createEffect_l(effect_descriptor_t *descriptor, 49*ec779b8eSAndroid Build Coastguard Worker const AudioDeviceTypeAddr& device, 50*ec779b8eSAndroid Build Coastguard Worker const sp<Client>& client, 51*ec779b8eSAndroid Build Coastguard Worker const sp<media::IEffectClient>& effectClient, 52*ec779b8eSAndroid Build Coastguard Worker const std::map<audio_patch_handle_t, IAfPatchPanel::Patch>& patches, 53*ec779b8eSAndroid Build Coastguard Worker int *enabled, 54*ec779b8eSAndroid Build Coastguard Worker status_t *status, 55*ec779b8eSAndroid Build Coastguard Worker bool probe, 56*ec779b8eSAndroid Build Coastguard Worker bool notifyFramesProcessed) REQUIRES(audio_utils::AudioFlinger_Mutex); 57*ec779b8eSAndroid Build Coastguard Worker 58*ec779b8eSAndroid Build Coastguard Worker size_t removeEffect(const sp<IAfDeviceEffectProxy>& effect); 59*ec779b8eSAndroid Build Coastguard Worker static status_t createEffectHal(const effect_uuid_t *pEffectUuid, 60*ec779b8eSAndroid Build Coastguard Worker int32_t sessionId, int32_t deviceId, 61*ec779b8eSAndroid Build Coastguard Worker sp<EffectHalInterface> *effect); 62*ec779b8eSAndroid Build Coastguard Worker status_t addEffectToHal(const struct audio_port_config *device, 63*ec779b8eSAndroid Build Coastguard Worker const sp<EffectHalInterface>& effect); 64*ec779b8eSAndroid Build Coastguard Worker status_t removeEffectFromHal(const struct audio_port_config *device, 65*ec779b8eSAndroid Build Coastguard Worker const sp<EffectHalInterface>& effect); 66*ec779b8eSAndroid Build Coastguard Worker afDeviceEffectManagerCallback()67*ec779b8eSAndroid Build Coastguard Worker const auto& afDeviceEffectManagerCallback() const { return mAfDeviceEffectManagerCallback; } 68*ec779b8eSAndroid Build Coastguard Worker 69*ec779b8eSAndroid Build Coastguard Worker void dump(int fd); 70*ec779b8eSAndroid Build Coastguard Worker 71*ec779b8eSAndroid Build Coastguard Worker // PatchCommandThread::PatchCommandListener implementation 72*ec779b8eSAndroid Build Coastguard Worker 73*ec779b8eSAndroid Build Coastguard Worker void onCreateAudioPatch(audio_patch_handle_t handle, 74*ec779b8eSAndroid Build Coastguard Worker const IAfPatchPanel::Patch& patch) final 75*ec779b8eSAndroid Build Coastguard Worker EXCLUDES_DeviceEffectManager_Mutex; 76*ec779b8eSAndroid Build Coastguard Worker void onReleaseAudioPatch(audio_patch_handle_t handle) final 77*ec779b8eSAndroid Build Coastguard Worker EXCLUDES_DeviceEffectManager_Mutex; 78*ec779b8eSAndroid Build Coastguard Worker void onUpdateAudioPatch(audio_patch_handle_t oldHandle, 79*ec779b8eSAndroid Build Coastguard Worker audio_patch_handle_t newHandle, const IAfPatchPanel::Patch& patch) final 80*ec779b8eSAndroid Build Coastguard Worker EXCLUDES_DeviceEffectManager_Mutex; 81*ec779b8eSAndroid Build Coastguard Worker 82*ec779b8eSAndroid Build Coastguard Worker private: 83*ec779b8eSAndroid Build Coastguard Worker static status_t checkEffectCompatibility(const effect_descriptor_t *desc); 84*ec779b8eSAndroid Build Coastguard Worker mutex()85*ec779b8eSAndroid Build Coastguard Worker audio_utils::mutex& mutex() const RETURN_CAPABILITY(audio_utils::DeviceEffectManager_Mutex) { 86*ec779b8eSAndroid Build Coastguard Worker return mMutex; 87*ec779b8eSAndroid Build Coastguard Worker } 88*ec779b8eSAndroid Build Coastguard Worker mutable audio_utils::mutex mMutex{audio_utils::MutexOrder::kDeviceEffectManager_Mutex}; 89*ec779b8eSAndroid Build Coastguard Worker const sp<IAfDeviceEffectManagerCallback> mAfDeviceEffectManagerCallback; 90*ec779b8eSAndroid Build Coastguard Worker const sp<DeviceEffectManagerCallback> mMyCallback; 91*ec779b8eSAndroid Build Coastguard Worker std::map<AudioDeviceTypeAddr, std::vector<sp<IAfDeviceEffectProxy>>> 92*ec779b8eSAndroid Build Coastguard Worker mDeviceEffects GUARDED_BY(mutex()); 93*ec779b8eSAndroid Build Coastguard Worker }; 94*ec779b8eSAndroid Build Coastguard Worker 95*ec779b8eSAndroid Build Coastguard Worker class DeviceEffectManagerCallback : public EffectCallbackInterface { 96*ec779b8eSAndroid Build Coastguard Worker public: DeviceEffectManagerCallback(DeviceEffectManager & manager)97*ec779b8eSAndroid Build Coastguard Worker explicit DeviceEffectManagerCallback(DeviceEffectManager& manager) 98*ec779b8eSAndroid Build Coastguard Worker : mManager(manager) {} 99*ec779b8eSAndroid Build Coastguard Worker createEffectHal(const effect_uuid_t * pEffectUuid,int32_t sessionId,int32_t deviceId,sp<EffectHalInterface> * effect)100*ec779b8eSAndroid Build Coastguard Worker status_t createEffectHal(const effect_uuid_t *pEffectUuid, 101*ec779b8eSAndroid Build Coastguard Worker int32_t sessionId, int32_t deviceId, sp<EffectHalInterface> *effect) final { 102*ec779b8eSAndroid Build Coastguard Worker return mManager.createEffectHal(pEffectUuid, sessionId, deviceId, effect); 103*ec779b8eSAndroid Build Coastguard Worker } allocateHalBuffer(size_t size __unused,sp<EffectBufferHalInterface> * buffer __unused)104*ec779b8eSAndroid Build Coastguard Worker status_t allocateHalBuffer(size_t size __unused, 105*ec779b8eSAndroid Build Coastguard Worker sp<EffectBufferHalInterface>* buffer __unused) final { return NO_ERROR; } updateOrphanEffectChains(const sp<IAfEffectBase> & effect __unused)106*ec779b8eSAndroid Build Coastguard Worker bool updateOrphanEffectChains(const sp<IAfEffectBase>& effect __unused) final { 107*ec779b8eSAndroid Build Coastguard Worker return false; 108*ec779b8eSAndroid Build Coastguard Worker } 109*ec779b8eSAndroid Build Coastguard Worker io()110*ec779b8eSAndroid Build Coastguard Worker audio_io_handle_t io() const final { return AUDIO_IO_HANDLE_NONE; } isOutput()111*ec779b8eSAndroid Build Coastguard Worker bool isOutput() const final { return false; } isOffload()112*ec779b8eSAndroid Build Coastguard Worker bool isOffload() const final { return false; } isOffloadOrDirect()113*ec779b8eSAndroid Build Coastguard Worker bool isOffloadOrDirect() const final { return false; } isOffloadOrMmap()114*ec779b8eSAndroid Build Coastguard Worker bool isOffloadOrMmap() const final { return false; } isSpatializer()115*ec779b8eSAndroid Build Coastguard Worker bool isSpatializer() const final { return false; } 116*ec779b8eSAndroid Build Coastguard Worker sampleRate()117*ec779b8eSAndroid Build Coastguard Worker uint32_t sampleRate() const final { return 0; } inChannelMask(int id __unused)118*ec779b8eSAndroid Build Coastguard Worker audio_channel_mask_t inChannelMask(int id __unused) const final { 119*ec779b8eSAndroid Build Coastguard Worker return AUDIO_CHANNEL_NONE; 120*ec779b8eSAndroid Build Coastguard Worker } inChannelCount(int id __unused)121*ec779b8eSAndroid Build Coastguard Worker uint32_t inChannelCount(int id __unused) const final { return 0; } outChannelMask()122*ec779b8eSAndroid Build Coastguard Worker audio_channel_mask_t outChannelMask() const final { return AUDIO_CHANNEL_NONE; } outChannelCount()123*ec779b8eSAndroid Build Coastguard Worker uint32_t outChannelCount() const final { return 0; } 124*ec779b8eSAndroid Build Coastguard Worker hapticChannelMask()125*ec779b8eSAndroid Build Coastguard Worker audio_channel_mask_t hapticChannelMask() const final { return AUDIO_CHANNEL_NONE; } frameCount()126*ec779b8eSAndroid Build Coastguard Worker size_t frameCount() const final { return 0; } latency()127*ec779b8eSAndroid Build Coastguard Worker uint32_t latency() const final { return 0; } 128*ec779b8eSAndroid Build Coastguard Worker addEffectToHal(const sp<EffectHalInterface> &)129*ec779b8eSAndroid Build Coastguard Worker status_t addEffectToHal(const sp<EffectHalInterface>& /* effect */) final { 130*ec779b8eSAndroid Build Coastguard Worker return NO_ERROR; 131*ec779b8eSAndroid Build Coastguard Worker } removeEffectFromHal(const sp<EffectHalInterface> &)132*ec779b8eSAndroid Build Coastguard Worker status_t removeEffectFromHal(const sp<EffectHalInterface>& /* effect */) final { 133*ec779b8eSAndroid Build Coastguard Worker return NO_ERROR; 134*ec779b8eSAndroid Build Coastguard Worker } 135*ec779b8eSAndroid Build Coastguard Worker 136*ec779b8eSAndroid Build Coastguard Worker bool disconnectEffectHandle(IAfEffectHandle *handle, bool unpinIfLast) final; setVolumeForOutput(float left __unused,float right __unused)137*ec779b8eSAndroid Build Coastguard Worker void setVolumeForOutput(float left __unused, float right __unused) const final {} 138*ec779b8eSAndroid Build Coastguard Worker 139*ec779b8eSAndroid Build Coastguard Worker // check if effects should be suspended or restored when a given effect is enable or disabled checkSuspendOnEffectEnabled(const sp<IAfEffectBase> & effect __unused,bool enabled __unused,bool threadLocked __unused)140*ec779b8eSAndroid Build Coastguard Worker void checkSuspendOnEffectEnabled(const sp<IAfEffectBase>& effect __unused, 141*ec779b8eSAndroid Build Coastguard Worker bool enabled __unused, bool threadLocked __unused) final {} resetVolume_l()142*ec779b8eSAndroid Build Coastguard Worker void resetVolume_l() final REQUIRES(audio_utils::EffectChain_Mutex) {} strategy()143*ec779b8eSAndroid Build Coastguard Worker product_strategy_t strategy() const final { return static_cast<product_strategy_t>(0); } activeTrackCnt()144*ec779b8eSAndroid Build Coastguard Worker int32_t activeTrackCnt() const final { return 0; } onEffectEnable(const sp<IAfEffectBase> & effect __unused)145*ec779b8eSAndroid Build Coastguard Worker void onEffectEnable(const sp<IAfEffectBase>& effect __unused) final {} onEffectDisable(const sp<IAfEffectBase> & effect __unused)146*ec779b8eSAndroid Build Coastguard Worker void onEffectDisable(const sp<IAfEffectBase>& effect __unused) final {} 147*ec779b8eSAndroid Build Coastguard Worker chain()148*ec779b8eSAndroid Build Coastguard Worker wp<IAfEffectChain> chain() const final { return nullptr; } 149*ec779b8eSAndroid Build Coastguard Worker 150*ec779b8eSAndroid Build Coastguard Worker bool isAudioPolicyReady() const final; 151*ec779b8eSAndroid Build Coastguard Worker 152*ec779b8eSAndroid Build Coastguard Worker int newEffectId() const; 153*ec779b8eSAndroid Build Coastguard Worker addEffectToHal(const struct audio_port_config * device,const sp<EffectHalInterface> & effect)154*ec779b8eSAndroid Build Coastguard Worker status_t addEffectToHal(const struct audio_port_config *device, 155*ec779b8eSAndroid Build Coastguard Worker const sp<EffectHalInterface>& effect) { 156*ec779b8eSAndroid Build Coastguard Worker return mManager.addEffectToHal(device, effect); 157*ec779b8eSAndroid Build Coastguard Worker } removeEffectFromHal(const struct audio_port_config * device,const sp<EffectHalInterface> & effect)158*ec779b8eSAndroid Build Coastguard Worker status_t removeEffectFromHal(const struct audio_port_config *device, 159*ec779b8eSAndroid Build Coastguard Worker const sp<EffectHalInterface>& effect) { 160*ec779b8eSAndroid Build Coastguard Worker return mManager.removeEffectFromHal(device, effect); 161*ec779b8eSAndroid Build Coastguard Worker } 162*ec779b8eSAndroid Build Coastguard Worker private: 163*ec779b8eSAndroid Build Coastguard Worker DeviceEffectManager& mManager; 164*ec779b8eSAndroid Build Coastguard Worker }; 165*ec779b8eSAndroid Build Coastguard Worker 166*ec779b8eSAndroid Build Coastguard Worker } // namespace android 167