AudioFlinger: Create DeviceEffectManager callback
Test: atest AudioTrackTest AudioRecordTest
Test: Camera YouTube
Bug: 291319167
Merged-In: Id64e51136079da0ad0218de2836c01d0be4a69bd
Change-Id: Id64e51136079da0ad0218de2836c01d0be4a69bd
diff --git a/services/audioflinger/AudioFlinger.cpp b/services/audioflinger/AudioFlinger.cpp
index c359d98..96023ff 100644
--- a/services/audioflinger/AudioFlinger.cpp
+++ b/services/audioflinger/AudioFlinger.cpp
@@ -329,7 +329,6 @@
mClientSharedHeapSize(kMinimumClientSharedHeapSizeBytes),
mGlobalEffectEnableTime(0),
mPatchCommandThread(sp<PatchCommandThread>::make()),
- mDeviceEffectManager(sp<DeviceEffectManager>::make(*this)),
mMelReporter(sp<MelReporter>::make(*this)),
mSystemReady(false),
mBluetoothLatencyModesEnabled(true)
@@ -404,7 +403,8 @@
mMode = AUDIO_MODE_NORMAL;
gAudioFlinger = this; // we are already refcounted, store into atomic pointer.
-
+ mDeviceEffectManager = sp<DeviceEffectManager>::make(
+ sp<IAfDeviceEffectManagerCallback>::fromExisting(this)),
mDevicesFactoryHalCallback = new DevicesFactoryHalCallbackImpl;
mDevicesFactoryHal->setCallbackOnce(mDevicesFactoryHalCallback);
diff --git a/services/audioflinger/AudioFlinger.h b/services/audioflinger/AudioFlinger.h
index 8664241..09b7c1c 100644
--- a/services/audioflinger/AudioFlinger.h
+++ b/services/audioflinger/AudioFlinger.h
@@ -164,11 +164,10 @@
class AudioFlinger
: public AudioFlingerServerAdapter::Delegate // IAudioFlinger client interface
, public IAfClientCallback
+ , public IAfDeviceEffectManagerCallback
{
friend class sp<AudioFlinger>;
// TODO(b/291319167) Create interface and remove friends.
- friend class DeviceEffectManager;
- friend class DeviceEffectManagerCallback;
friend class MelReporter;
friend class PatchPanel;
// TODO(b/291012167) replace the Thread friends with an interface.
@@ -372,7 +371,16 @@
// ---- end of IAfClientCallback interface
- bool isAudioPolicyReady() const { return mAudioPolicyReady.load(); }
+ // ---- begin IAfDeviceEffectManagerCallback interface
+
+ bool isAudioPolicyReady() const final { return mAudioPolicyReady.load(); }
+ const sp<PatchCommandThread>& getPatchCommandThread() final { return mPatchCommandThread; }
+ status_t addEffectToHal(
+ const struct audio_port_config* device, const sp<EffectHalInterface>& effect) final;
+ status_t removeEffectFromHal(
+ const struct audio_port_config* device, const sp<EffectHalInterface>& effect) final;
+
+ // ---- end of IAfDeviceEffectManagerCallback interface
/* List available audio ports and their attributes */
status_t listAudioPorts(unsigned int* num_ports, struct audio_port* ports) const;
@@ -395,11 +403,6 @@
const sp<os::ExternalVibration>& externalVibration);
static void onExternalVibrationStop(const sp<os::ExternalVibration>& externalVibration);
- status_t addEffectToHal(
- const struct audio_port_config *device, const sp<EffectHalInterface>& effect);
- status_t removeEffectFromHal(
- const struct audio_port_config *device, const sp<EffectHalInterface>& effect);
-
void updateDownStreamPatches_l(const struct audio_patch *patch,
const std::set<audio_io_handle_t>& streams);
@@ -664,7 +667,8 @@
// Thus it may fail by returning an ID of the wrong sign,
// or by returning a non-unique ID.
// This is the internal API. For the binder API see newAudioUniqueId().
- audio_unique_id_t nextUniqueId(audio_unique_id_use_t use);
+ // used by IAfDeviceEffectManagerCallback
+ audio_unique_id_t nextUniqueId(audio_unique_id_use_t use) final;
status_t moveEffectChain_l(audio_session_t sessionId,
IAfPlaybackThread* srcThread, IAfPlaybackThread* dstThread);
@@ -870,7 +874,7 @@
private:
const sp<PatchCommandThread> mPatchCommandThread;
- sp<DeviceEffectManager> mDeviceEffectManager;
+ /* const */ sp<DeviceEffectManager> mDeviceEffectManager; // set onFirstRef
sp<MelReporter> mMelReporter;
bool mSystemReady;
diff --git a/services/audioflinger/DeviceEffectManager.cpp b/services/audioflinger/DeviceEffectManager.cpp
index c088c90..e689829 100644
--- a/services/audioflinger/DeviceEffectManager.cpp
+++ b/services/audioflinger/DeviceEffectManager.cpp
@@ -34,22 +34,23 @@
using detail::AudioHalVersionInfo;
using media::IEffectClient;
-DeviceEffectManager::DeviceEffectManager(AudioFlinger& audioFlinger)
- : mAudioFlinger(audioFlinger),
+DeviceEffectManager::DeviceEffectManager(
+ const sp<IAfDeviceEffectManagerCallback>& afDeviceEffectManagerCallback)
+ : mAfDeviceEffectManagerCallback(afDeviceEffectManagerCallback),
mMyCallback(new DeviceEffectManagerCallback(*this)) {}
void DeviceEffectManager::onFirstRef() {
- mAudioFlinger.mPatchCommandThread->addListener(this);
+ mAfDeviceEffectManagerCallback->getPatchCommandThread()->addListener(this);
}
status_t DeviceEffectManager::addEffectToHal(const struct audio_port_config* device,
const sp<EffectHalInterface>& effect) {
- return mAudioFlinger.addEffectToHal(device, effect);
+ return mAfDeviceEffectManagerCallback->addEffectToHal(device, effect);
};
status_t DeviceEffectManager::removeEffectFromHal(const struct audio_port_config* device,
const sp<EffectHalInterface>& effect) {
- return mAudioFlinger.removeEffectFromHal(device, effect);
+ return mAfDeviceEffectManagerCallback->removeEffectFromHal(device, effect);
};
void DeviceEffectManager::onCreateAudioPatch(audio_patch_handle_t handle,
@@ -101,7 +102,8 @@
effect = iter->second;
} else {
effect = IAfDeviceEffectProxy::create(device, mMyCallback,
- descriptor, mAudioFlinger.nextUniqueId(AUDIO_UNIQUE_ID_USE_EFFECT),
+ descriptor,
+ mAfDeviceEffectManagerCallback->nextUniqueId(AUDIO_UNIQUE_ID_USE_EFFECT),
notifyFramesProcessed);
}
// create effect handle and connect it to effect module
@@ -221,11 +223,11 @@
}
bool DeviceEffectManagerCallback::isAudioPolicyReady() const {
- return mManager.audioFlinger().isAudioPolicyReady();
+ return mManager.afDeviceEffectManagerCallback()->isAudioPolicyReady();
}
int DeviceEffectManagerCallback::newEffectId() const {
- return mManager.audioFlinger().nextUniqueId(AUDIO_UNIQUE_ID_USE_EFFECT);
+ return mManager.afDeviceEffectManagerCallback()->nextUniqueId(AUDIO_UNIQUE_ID_USE_EFFECT);
}
} // namespace android
diff --git a/services/audioflinger/DeviceEffectManager.h b/services/audioflinger/DeviceEffectManager.h
index b09de77..162ffd3 100644
--- a/services/audioflinger/DeviceEffectManager.h
+++ b/services/audioflinger/DeviceEffectManager.h
@@ -19,12 +19,24 @@
namespace android {
+class IAfDeviceEffectManagerCallback : public virtual RefBase {
+public:
+ virtual bool isAudioPolicyReady() const = 0;
+ virtual audio_unique_id_t nextUniqueId(audio_unique_id_use_t use) = 0;
+ virtual const sp<PatchCommandThread>& getPatchCommandThread() = 0;
+ virtual status_t addEffectToHal(
+ const struct audio_port_config* device, const sp<EffectHalInterface>& effect) = 0;
+ virtual status_t removeEffectFromHal(
+ const struct audio_port_config* device, const sp<EffectHalInterface>& effect) = 0;
+};
+
class DeviceEffectManagerCallback;
// DeviceEffectManager is concealed within AudioFlinger, their lifetimes are the same.
class DeviceEffectManager : public PatchCommandThread::PatchCommandListener {
public:
- explicit DeviceEffectManager(AudioFlinger& audioFlinger);
+ explicit DeviceEffectManager(
+ const sp<IAfDeviceEffectManagerCallback>& afDeviceEffectManagerCallback);
void onFirstRef() override;
@@ -47,7 +59,7 @@
status_t removeEffectFromHal(const struct audio_port_config *device,
const sp<EffectHalInterface>& effect);
- AudioFlinger& audioFlinger() const { return mAudioFlinger; }
+ const auto& afDeviceEffectManagerCallback() const { return mAfDeviceEffectManagerCallback; }
void dump(int fd);
@@ -61,7 +73,7 @@
status_t checkEffectCompatibility(const effect_descriptor_t *desc);
Mutex mLock;
- AudioFlinger &mAudioFlinger;
+ const sp<IAfDeviceEffectManagerCallback> mAfDeviceEffectManagerCallback;
const sp<DeviceEffectManagerCallback> mMyCallback;
std::map<AudioDeviceTypeAddr, sp<IAfDeviceEffectProxy>> mDeviceEffects;
};