Add thread safe annotation in audio flinger effects
Bug: 315995877
Test: atest AudioTrackTest AudioRecordTest audioeffect_tests
Change-Id: I90406c48660aef25ab4402a70a2a45deb6651335
diff --git a/services/audioflinger/AudioFlinger.cpp b/services/audioflinger/AudioFlinger.cpp
index f5ac109..bdbd4d6 100644
--- a/services/audioflinger/AudioFlinger.cpp
+++ b/services/audioflinger/AudioFlinger.cpp
@@ -4483,7 +4483,7 @@
if (effect->state() == IAfEffectModule::ACTIVE ||
effect->state() == IAfEffectModule::STOPPING) {
++started;
- effect->start();
+ effect->start_l();
}
}
dstChain->mutex().unlock();
@@ -4586,7 +4586,7 @@
// removeEffect_l() has stopped the effect if it was active so it must be restarted
if (effect->state() == IAfEffectModule::ACTIVE ||
effect->state() == IAfEffectModule::STOPPING) {
- effect->start();
+ effect->start_l();
}
}
diff --git a/services/audioflinger/DeviceEffectManager.cpp b/services/audioflinger/DeviceEffectManager.cpp
index 201d147..feae97e 100644
--- a/services/audioflinger/DeviceEffectManager.cpp
+++ b/services/audioflinger/DeviceEffectManager.cpp
@@ -143,7 +143,7 @@
if (lStatus == NO_ERROR) {
lStatus = effect->addHandle(handle.get());
if (lStatus == NO_ERROR) {
- lStatus = effect->init(patches);
+ lStatus = effect->init_l(patches);
if (lStatus == NAME_NOT_FOUND) {
lStatus = NO_ERROR;
}
diff --git a/services/audioflinger/DeviceEffectManager.h b/services/audioflinger/DeviceEffectManager.h
index 7045c8b..287d838 100644
--- a/services/audioflinger/DeviceEffectManager.h
+++ b/services/audioflinger/DeviceEffectManager.h
@@ -139,7 +139,7 @@
// check if effects should be suspended or restored when a given effect is enable or disabled
void checkSuspendOnEffectEnabled(const sp<IAfEffectBase>& effect __unused,
bool enabled __unused, bool threadLocked __unused) final {}
- void resetVolume() final {}
+ void resetVolume_l() final REQUIRES(audio_utils::EffectChain_Mutex) {}
product_strategy_t strategy() const final { return static_cast<product_strategy_t>(0); }
int32_t activeTrackCnt() const final { return 0; }
void onEffectEnable(const sp<IAfEffectBase>& effect __unused) final {}
diff --git a/services/audioflinger/Effects.cpp b/services/audioflinger/Effects.cpp
index a348b42..a02657e 100644
--- a/services/audioflinger/Effects.cpp
+++ b/services/audioflinger/Effects.cpp
@@ -570,10 +570,10 @@
: EffectBase(callback, desc, id, sessionId, pinned),
// clear mConfig to ensure consistent initial value of buffer framecount
// in case buffers are associated by setInBuffer() or setOutBuffer()
- // prior to configure().
+ // prior to configure_l().
mConfig{{}, {}},
mStatus(NO_INIT),
- mMaxDisableWaitCnt(1), // set by configure(), should be >= 1
+ mMaxDisableWaitCnt(1), // set by configure_l(), should be >= 1
mDisableWaitCnt(0), // set by process() and updateState()
mOffloaded(false),
mIsOutput(false)
@@ -588,13 +588,13 @@
if (mStatus != NO_ERROR) {
return;
}
- lStatus = init();
+ lStatus = init_l();
if (lStatus < 0) {
mStatus = lStatus;
goto Error;
}
- setOffloaded(callback->isOffload(), callback->io());
+ setOffloaded_l(callback->isOffload(), callback->io());
ALOGV("Constructor success name %s, Interface %p", mDescriptor.name, mEffectInterface.get());
return;
@@ -616,7 +616,7 @@
}
-bool EffectModule::updateState() {
+bool EffectModule::updateState_l() {
audio_utils::lock_guard _l(mutex());
bool started = false;
@@ -632,7 +632,7 @@
0,
mConfig.inputCfg.buffer.frameCount*sizeof(int32_t));
}
- if (start_l() == NO_ERROR) {
+ if (start_ll() == NO_ERROR) {
mState = ACTIVE;
started = true;
} else {
@@ -641,8 +641,8 @@
break;
case STOPPING:
// volume control for offload and direct threads must take effect immediately.
- if (stop_l() == NO_ERROR
- && !(isVolumeControl() && isOffloadedOrDirect())) {
+ if (stop_ll() == NO_ERROR
+ && !(isVolumeControl() && isOffloadedOrDirect_l())) {
mDisableWaitCnt = mMaxDisableWaitCnt;
} else {
mDisableWaitCnt = 1; // will cause immediate transition to IDLE
@@ -836,9 +836,9 @@
mEffectInterface->command(EFFECT_CMD_RESET, 0, NULL, &replySize, &reply);
}
-status_t EffectModule::configure()
+status_t EffectModule::configure_l()
{
- ALOGVV("configure() started");
+ ALOGVV("%s started", __func__);
status_t status;
uint32_t size;
audio_channel_mask_t channelMask;
@@ -879,7 +879,7 @@
mConfig.outputCfg.format = AUDIO_FORMAT_PCM_FLOAT;
// Don't use sample rate for thread if effect isn't offloadable.
- if (callback->isOffloadOrDirect() && !isOffloaded()) {
+ if (callback->isOffloadOrDirect() && !isOffloaded_l()) {
mConfig.inputCfg.samplingRate = DEFAULT_OUTPUT_SAMPLE_RATE;
ALOGV("Overriding effect input as 48kHz");
} else {
@@ -909,9 +909,9 @@
mConfig.outputCfg.buffer.frameCount = mConfig.inputCfg.buffer.frameCount;
mIsOutput = callback->isOutput();
- ALOGV("configure() %p chain %p buffer %p framecount %zu",
- this, callback->chain().promote().get(),
- mConfig.inputCfg.buffer.raw, mConfig.inputCfg.buffer.frameCount);
+ ALOGV("%s %p chain %p buffer %p framecount %zu", __func__, this,
+ callback->chain().promote().get(), mConfig.inputCfg.buffer.raw,
+ mConfig.inputCfg.buffer.frameCount);
status_t cmdStatus;
size = sizeof(int);
@@ -1012,11 +1012,11 @@
exit:
// TODO: consider clearing mConfig on error.
mStatus = status;
- ALOGVV("configure ended");
+ ALOGVV("%s ended", __func__);
return status;
}
-status_t EffectModule::init()
+status_t EffectModule::init_l()
{
audio_utils::lock_guard _l(mutex());
if (mEffectInterface == 0) {
@@ -1048,21 +1048,21 @@
}
}
-// start() must be called with PlaybackThread::mutex() or EffectChain::mutex() held
-status_t EffectModule::start()
+// start_l() must be called with EffectChain::mutex() held
+status_t EffectModule::start_l()
{
status_t status;
{
audio_utils::lock_guard _l(mutex());
- status = start_l();
+ status = start_ll();
}
if (status == NO_ERROR) {
- getCallback()->resetVolume();
+ getCallback()->resetVolume_l();
}
return status;
}
-status_t EffectModule::start_l()
+status_t EffectModule::start_ll()
{
if (mEffectInterface == 0) {
return NO_INIT;
@@ -1086,13 +1086,13 @@
return status;
}
-status_t EffectModule::stop()
+status_t EffectModule::stop_l()
{
audio_utils::lock_guard _l(mutex());
- return stop_l();
+ return stop_ll();
}
-status_t EffectModule::stop_l()
+status_t EffectModule::stop_ll()
{
if (mEffectInterface == 0) {
return NO_INIT;
@@ -1103,11 +1103,11 @@
status_t cmdStatus = NO_ERROR;
uint32_t size = sizeof(status_t);
- if (isVolumeControl() && isOffloadedOrDirect()) {
+ if (isVolumeControl() && isOffloadedOrDirect_l()) {
// We have the EffectChain and EffectModule lock, permit a reentrant call to setVolume:
// resetVolume_l --> setVolume_l --> EffectModule::setVolume
mSetVolumeReentrantTid = gettid();
- getCallback()->resetVolume();
+ getCallback()->resetVolume_l();
mSetVolumeReentrantTid = INVALID_PID;
}
@@ -1162,7 +1162,7 @@
std::vector<uint8_t>* reply)
{
audio_utils::lock_guard _l(mutex());
- ALOGVV("command(), cmdCode: %d, mEffectInterface: %p", cmdCode, mEffectInterface.get());
+ ALOGVV("%s, cmdCode: %d, mEffectInterface: %p", __func__, cmdCode, mEffectInterface.get());
if (mState == DESTROYED || mEffectInterface == 0) {
return NO_INIT;
@@ -1258,20 +1258,20 @@
}
}
-bool EffectModule::isOffloadedOrDirect() const
+bool EffectModule::isOffloadedOrDirect_l() const
{
return getCallback()->isOffloadOrDirect();
}
-bool EffectModule::isVolumeControlEnabled() const
+bool EffectModule::isVolumeControlEnabled_l() const
{
- return (isVolumeControl() && (isOffloadedOrDirect() ? isEnabled() : isProcessEnabled()));
+ return (isVolumeControl() && (isOffloadedOrDirect_l() ? isEnabled() : isProcessEnabled()));
}
void EffectModule::setInBuffer(const sp<EffectBufferHalInterface>& buffer) {
ALOGVV("setInBuffer %p",(&buffer));
- // mConfig.inputCfg.buffer.frameCount may be zero if configure() is not called yet.
+ // mConfig.inputCfg.buffer.frameCount may be zero if configure_l() is not called yet.
if (buffer != 0) {
mConfig.inputCfg.buffer.raw = buffer->audioBuffer()->raw;
buffer->setFrameCount(mConfig.inputCfg.buffer.frameCount);
@@ -1317,7 +1317,7 @@
void EffectModule::setOutBuffer(const sp<EffectBufferHalInterface>& buffer) {
ALOGVV("setOutBuffer %p",(&buffer));
- // mConfig.outputCfg.buffer.frameCount may be zero if configure() is not called yet.
+ // mConfig.outputCfg.buffer.frameCount may be zero if configure_l() is not called yet.
if (buffer != 0) {
mConfig.outputCfg.buffer.raw = buffer->audioBuffer()->raw;
buffer->setFrameCount(mConfig.outputCfg.buffer.frameCount);
@@ -1479,7 +1479,7 @@
return status;
}
-status_t EffectModule::setOffloaded(bool offloaded, audio_io_handle_t io)
+status_t EffectModule::setOffloaded_l(bool offloaded, audio_io_handle_t io)
{
audio_utils::lock_guard _l(mutex());
if (mStatus != NO_ERROR) {
@@ -1508,11 +1508,11 @@
}
mOffloaded = false;
}
- ALOGV("setOffloaded() offloaded %d io %d status %d", offloaded, io, status);
+ ALOGV("%s offloaded %d io %d status %d", __func__, offloaded, io, status);
return status;
}
-bool EffectModule::isOffloaded() const
+bool EffectModule::isOffloaded_l() const
{
audio_utils::lock_guard _l(mutex());
return mOffloaded;
@@ -1536,8 +1536,7 @@
return IAfEffectModule::isSpatializer(&mDescriptor.type);
}
-status_t EffectModule::setHapticIntensity(int id, os::HapticScale intensity)
-{
+status_t EffectModule::setHapticIntensity_l(int id, os::HapticScale intensity) {
if (mStatus != NO_ERROR) {
return mStatus;
}
@@ -1562,8 +1561,7 @@
return status;
}
-status_t EffectModule::setVibratorInfo(const media::AudioVibratorInfo& vibratorInfo)
-{
+status_t EffectModule::setVibratorInfo_l(const media::AudioVibratorInfo& vibratorInfo) {
if (mStatus != NO_ERROR) {
return mStatus;
}
@@ -1592,8 +1590,8 @@
return status;
}
-status_t EffectModule::getConfigs(
- audio_config_base_t* inputCfg, audio_config_base_t* outputCfg, bool* isOutput) const {
+status_t EffectModule::getConfigs_l(audio_config_base_t* inputCfg, audio_config_base_t* outputCfg,
+ bool* isOutput) const {
audio_utils::lock_guard _l(mutex());
if (mConfig.inputCfg.mask == 0 || mConfig.outputCfg.mask == 0) {
return NO_INIT;
@@ -1608,7 +1606,7 @@
return NO_ERROR;
}
-status_t EffectModule::sendMetadata(const std::vector<playback_track_metadata_v7_t>& metadata) {
+status_t EffectModule::sendMetadata_ll(const std::vector<playback_track_metadata_v7_t>& metadata) {
if (mStatus != NO_ERROR) {
return mStatus;
}
@@ -1947,7 +1945,7 @@
audio_config_base_t inputCfg = AUDIO_CONFIG_BASE_INITIALIZER;
audio_config_base_t outputCfg = AUDIO_CONFIG_BASE_INITIALIZER;
bool isOutput;
- status_t status = effectModule->getConfigs(&inputCfg, &outputCfg, &isOutput);
+ status_t status = effectModule->getConfigs_l(&inputCfg, &outputCfg, &isOutput);
if (status == NO_ERROR) {
constexpr bool isInput = false; // effects always use 'OUT' channel masks.
_config->inputCfg = VALUE_OR_RETURN_STATUS_AS_OUT(
@@ -2213,7 +2211,7 @@
return 0;
}
-std::vector<int> EffectChain::getEffectIds() const
+std::vector<int> EffectChain::getEffectIds_l() const
{
std::vector<int> ids;
audio_utils::lock_guard _l(mutex());
@@ -2243,8 +2241,7 @@
}
// Must be called with EffectChain::mutex() locked
-void EffectChain::process_l()
-{
+void EffectChain::process_l() {
// never process effects when:
// - on an OFFLOAD thread
// - no more tracks are on the session and the effect tail has been rendered
@@ -2287,7 +2284,7 @@
}
bool doResetVolume = false;
for (size_t i = 0; i < size; i++) {
- doResetVolume = mEffects[i]->updateState() || doResetVolume;
+ doResetVolume = mEffects[i]->updateState_l() || doResetVolume;
}
if (doResetVolume) {
resetVolume_l();
@@ -2341,14 +2338,14 @@
numSamples * sizeof(float), &halBuffer);
if (result != OK) return result;
- effect->configure();
+ effect->configure_l();
effect->setInBuffer(halBuffer);
// auxiliary effects output samples to chain input buffer for further processing
// by insert effects
effect->setOutBuffer(mInBuffer);
} else {
- ssize_t idx_insert = getInsertIndex(desc);
+ ssize_t idx_insert = getInsertIndex_ll(desc);
if (idx_insert < 0) {
return INVALID_OPERATION;
}
@@ -2356,7 +2353,7 @@
size_t previousSize = mEffects.size();
mEffects.insertAt(effect, idx_insert);
- effect->configure();
+ effect->configure_l();
// - By default:
// All effects read samples from chain input buffer.
@@ -2371,9 +2368,9 @@
effect->setOutBuffer(mOutBuffer);
if (idx_insert == 0) {
if (previousSize != 0) {
- mEffects[1]->configure();
+ mEffects[1]->configure_l();
mEffects[1]->setInBuffer(mOutBuffer);
- mEffects[1]->updateAccessMode(); // reconfig if neeeded.
+ mEffects[1]->updateAccessMode_l(); // reconfig if needed.
}
effect->setInBuffer(mInBuffer);
} else {
@@ -2383,9 +2380,9 @@
effect->setInBuffer(mInBuffer);
if (idx_insert == static_cast<ssize_t>(previousSize)) {
if (idx_insert != 0) {
- mEffects[idx_insert-1]->configure();
+ mEffects[idx_insert-1]->configure_l();
mEffects[idx_insert-1]->setOutBuffer(mInBuffer);
- mEffects[idx_insert - 1]->updateAccessMode(); // reconfig if neeeded.
+ mEffects[idx_insert - 1]->updateAccessMode_l(); // reconfig if needed.
}
effect->setOutBuffer(mOutBuffer);
} else {
@@ -2395,21 +2392,21 @@
ALOGV("%s effect %p, added in chain %p at rank %zu",
__func__, effect.get(), this, idx_insert);
}
- effect->configure();
+ effect->configure_l();
return NO_ERROR;
}
std::optional<size_t> EffectChain::findVolumeControl_l(size_t from, size_t to) const {
for (size_t i = std::min(to, mEffects.size()); i > from; i--) {
- if (mEffects[i - 1]->isVolumeControlEnabled()) {
+ if (mEffects[i - 1]->isVolumeControlEnabled_l()) {
return i - 1;
}
}
return std::nullopt;
}
-ssize_t EffectChain::getInsertIndex(const effect_descriptor_t& desc) {
+ssize_t EffectChain::getInsertIndex_ll(const effect_descriptor_t& desc) {
// Insert effects are inserted at the end of mEffects vector as they are processed
// after track and auxiliary effects.
// Insert effect order as a function of indicated preference:
@@ -2497,7 +2494,7 @@
// the middle of a read from audio HAL
if (mEffects[i]->state() == EffectModule::ACTIVE ||
mEffects[i]->state() == EffectModule::STOPPING) {
- mEffects[i]->stop();
+ mEffects[i]->stop_l();
}
if (release) {
mEffects[i]->release_l();
@@ -2505,9 +2502,9 @@
if (type != EFFECT_FLAG_TYPE_AUXILIARY) {
if (i == size - 1 && i != 0) {
- mEffects[i - 1]->configure();
+ mEffects[i - 1]->configure_l();
mEffects[i - 1]->setOutBuffer(mOutBuffer);
- mEffects[i - 1]->updateAccessMode(); // reconfig if neeeded.
+ mEffects[i - 1]->updateAccessMode_l(); // reconfig if needed.
}
}
mEffects.removeAt(i);
@@ -2516,9 +2513,9 @@
// is updated if needed (can switch from HAL channel mask to mixer channel mask)
if (type != EFFECT_FLAG_TYPE_AUXILIARY // TODO(b/284522658) breaks for aux FX, why?
&& i == 0 && size > 1) {
- mEffects[0]->configure();
+ mEffects[0]->configure_l();
mEffects[0]->setInBuffer(mInBuffer);
- mEffects[0]->updateAccessMode(); // reconfig if neeeded.
+ mEffects[0]->updateAccessMode_l(); // reconfig if needed.
}
ALOGV("removeEffect_l() effect %p, removed from chain %p at rank %zu", effect.get(),
@@ -2568,7 +2565,7 @@
bool EffectChain::hasVolumeControlEnabled_l() const {
for (const auto &effect : mEffects) {
- if (effect->isVolumeControlEnabled()) return true;
+ if (effect->isVolumeControlEnabled_l()) return true;
}
return false;
}
@@ -2681,11 +2678,11 @@
{
audio_utils::lock_guard _l(mutex());
for (size_t i = 0; i < mEffects.size(); ++i) {
- mEffects[i]->setHapticIntensity(id, intensity);
+ mEffects[i]->setHapticIntensity_l(id, intensity);
}
}
-void EffectChain::syncHalEffectsState()
+void EffectChain::syncHalEffectsState_l()
{
audio_utils::lock_guard _l(mutex());
for (size_t i = 0; i < mEffects.size(); i++) {
@@ -2754,7 +2751,7 @@
}
if (desc->mRefCount++ == 0) {
- sp<IAfEffectModule> effect = getEffectIfEnabled(type);
+ sp<IAfEffectModule> effect = getEffectIfEnabled_l(type);
if (effect != 0) {
desc->mEffect = effect;
effect->setSuspended(true);
@@ -2807,7 +2804,7 @@
}
if (desc->mRefCount++ == 0) {
Vector< sp<IAfEffectModule> > effects;
- getSuspendEligibleEffects(effects);
+ getSuspendEligibleEffects_l(effects);
for (size_t i = 0; i < effects.size(); i++) {
setEffectSuspended_l(&effects[i]->desc().type, true);
}
@@ -2848,8 +2845,7 @@
#endif //OPENSL_ES_H_
/* static */
-bool EffectChain::isEffectEligibleForBtNrecSuspend(const effect_uuid_t *type)
-{
+bool EffectChain::isEffectEligibleForBtNrecSuspend_l(const effect_uuid_t* type) {
// Only NS and AEC are suspended when BtNRec is off
if ((memcmp(type, FX_IID_AEC, sizeof(effect_uuid_t)) == 0) ||
(memcmp(type, FX_IID_NS, sizeof(effect_uuid_t)) == 0)) {
@@ -2858,7 +2854,7 @@
return false;
}
-bool EffectChain::isEffectEligibleForSuspend(const effect_descriptor_t& desc)
+bool EffectChain::isEffectEligibleForSuspend_l(const effect_descriptor_t& desc)
{
// auxiliary effects and visualizer are never suspended on output mix
if ((mSessionId == AUDIO_SESSION_OUTPUT_MIX) &&
@@ -2871,26 +2867,24 @@
return true;
}
-void EffectChain::getSuspendEligibleEffects(
+void EffectChain::getSuspendEligibleEffects_l(
Vector< sp<IAfEffectModule> > &effects)
{
effects.clear();
for (size_t i = 0; i < mEffects.size(); i++) {
- if (isEffectEligibleForSuspend(mEffects[i]->desc())) {
+ if (isEffectEligibleForSuspend_l(mEffects[i]->desc())) {
effects.add(mEffects[i]);
}
}
}
-sp<IAfEffectModule> EffectChain::getEffectIfEnabled(const effect_uuid_t *type)
+sp<IAfEffectModule> EffectChain::getEffectIfEnabled_l(const effect_uuid_t *type)
{
sp<IAfEffectModule> effect = getEffectFromType_l(type);
return effect != 0 && effect->isEnabled() ? effect : 0;
}
-void EffectChain::checkSuspendOnEffectEnabled(const sp<IAfEffectModule>& effect,
- bool enabled)
-{
+void EffectChain::checkSuspendOnEffectEnabled_l(const sp<IAfEffectModule>& effect, bool enabled) {
ssize_t index = mSuspendedEffects.indexOfKey(effect->desc().type.timeLow);
if (enabled) {
if (index < 0) {
@@ -2899,18 +2893,17 @@
if (index < 0) {
return;
}
- if (!isEffectEligibleForSuspend(effect->desc())) {
+ if (!isEffectEligibleForSuspend_l(effect->desc())) {
return;
}
setEffectSuspended_l(&effect->desc().type, enabled);
index = mSuspendedEffects.indexOfKey(effect->desc().type.timeLow);
if (index < 0) {
- ALOGW("checkSuspendOnEffectEnabled() Fx should be suspended here!");
+ ALOGW("%s Fx should be suspended here!", __func__);
return;
}
}
- ALOGV("checkSuspendOnEffectEnabled() enable suspending fx %08x",
- effect->desc().type.timeLow);
+ ALOGV("%s enable suspending fx %08x", __func__, effect->desc().type.timeLow);
sp<SuspendedEffectDesc> desc = mSuspendedEffects.valueAt(index);
// if effect is requested to suspended but was not yet enabled, suspend it now.
if (desc->mEffect == 0) {
@@ -2922,8 +2915,7 @@
if (index < 0) {
return;
}
- ALOGV("checkSuspendOnEffectEnabled() disable restoring fx %08x",
- effect->desc().type.timeLow);
+ ALOGV("%s disable restoring fx %08x", __func__, effect->desc().type.timeLow);
sp<SuspendedEffectDesc> desc = mSuspendedEffects.valueAt(index);
desc->mEffect.clear();
effect->setSuspended(false);
@@ -3032,9 +3024,9 @@
for (const auto& effect : mEffects) {
if (spatializedMetadata.has_value()
&& IAfEffectModule::isSpatializer(&effect->desc().type)) {
- effect->sendMetadata(spatializedMetadata.value());
+ effect->sendMetadata_ll(spatializedMetadata.value());
} else {
- effect->sendMetadata(allMetadata);
+ effect->sendMetadata_ll(allMetadata);
}
}
}
@@ -3252,8 +3244,9 @@
t->setVolumeForOutput_l(left, right);
}
-void EffectChain::EffectCallback::checkSuspendOnEffectEnabled(
- const sp<IAfEffectBase>& effect, bool enabled, bool threadLocked) {
+void EffectChain::EffectCallback::checkSuspendOnEffectEnabled(const sp<IAfEffectBase>& effect,
+ bool enabled, bool threadLocked)
+ NO_THREAD_SAFETY_ANALYSIS {
const sp<IAfThreadBase> t = thread().promote();
if (t == nullptr) {
return;
@@ -3265,7 +3258,7 @@
return;
}
// in EffectChain context, an EffectBase is always from an EffectModule so static cast is safe
- c->checkSuspendOnEffectEnabled(effect->asEffectModule(), enabled);
+ c->checkSuspendOnEffectEnabled_l(effect->asEffectModule(), enabled);
}
void EffectChain::EffectCallback::onEffectEnable(const sp<IAfEffectBase>& effect) {
@@ -3297,7 +3290,7 @@
return true;
}
-void EffectChain::EffectCallback::resetVolume() NO_THREAD_SAFETY_ANALYSIS {
+void EffectChain::EffectCallback::resetVolume_l() {
sp<IAfEffectChain> c = chain().promote();
if (c == nullptr) {
return;
@@ -3358,7 +3351,7 @@
return status;
}
-status_t DeviceEffectProxy::init(
+status_t DeviceEffectProxy::init_l(
const std::map <audio_patch_handle_t, IAfPatchPanel::Patch>& patches) {
//For all audio patches
//If src or sink device match
@@ -3462,7 +3455,7 @@
} else {
mHalEffect->setDevices({mDevice});
}
- mHalEffect->configure();
+ mHalEffect->configure_l();
}
*handle = new EffectHandle(mHalEffect, nullptr, nullptr, 0 /*priority*/,
mNotifyFramesProcessed);
@@ -3751,7 +3744,7 @@
if (effect == nullptr) {
return;
}
- effect->start();
+ effect->start_l();
}
void DeviceEffectProxy::ProxyCallback::onEffectDisable(
@@ -3760,7 +3753,7 @@
if (effect == nullptr) {
return;
}
- effect->stop();
+ effect->stop_l();
}
} // namespace android
diff --git a/services/audioflinger/Effects.h b/services/audioflinger/Effects.h
index cbd62ea..6e34e9b 100644
--- a/services/audioflinger/Effects.h
+++ b/services/audioflinger/Effects.h
@@ -78,11 +78,11 @@
{ return (mDescriptor.flags & EFFECT_FLAG_VOLUME_MASK)
== EFFECT_FLAG_VOLUME_MONITOR; }
- status_t setEnabled(bool enabled, bool fromHandle) override;
- status_t setEnabled_l(bool enabled) final;
+ status_t setEnabled(bool enabled, bool fromHandle) override EXCLUDES_EffectBase_Mutex;
+ status_t setEnabled_l(bool enabled) final REQUIRES(audio_utils::EffectBase_Mutex);
bool isEnabled() const final;
- void setSuspended(bool suspended) final;
- bool suspended() const final;
+ void setSuspended(bool suspended) final EXCLUDES_EffectBase_Mutex;
+ bool suspended() const final EXCLUDES_EffectBase_Mutex;
status_t command(int32_t __unused,
const std::vector<uint8_t>& __unused,
@@ -99,36 +99,40 @@
return mCallback.load();
}
- status_t addHandle(IAfEffectHandle *handle) final;
- ssize_t disconnectHandle(IAfEffectHandle *handle, bool unpinIfLast) final;
- ssize_t removeHandle(IAfEffectHandle *handle) final;
- ssize_t removeHandle_l(IAfEffectHandle *handle) final;
- IAfEffectHandle* controlHandle_l() final;
- bool purgeHandles() final;
+ status_t addHandle(IAfEffectHandle* handle) final EXCLUDES_EffectBase_Mutex;
+ ssize_t disconnectHandle(IAfEffectHandle* handle,
+ bool unpinIfLast) final EXCLUDES_EffectBase_Mutex;
+ ssize_t removeHandle(IAfEffectHandle* handle) final EXCLUDES_EffectBase_Mutex;
+ ssize_t removeHandle_l(IAfEffectHandle* handle) final REQUIRES(audio_utils::EffectBase_Mutex);
+ IAfEffectHandle* controlHandle_l() final REQUIRES(audio_utils::EffectBase_Mutex);
+ bool purgeHandles() final EXCLUDES_EffectBase_Mutex;
- void checkSuspendOnEffectEnabled(bool enabled, bool threadLocked) final;
+ void checkSuspendOnEffectEnabled(bool enabled, bool threadLocked) final;
- bool isPinned() const final { return mPinned; }
- void unPin() final { mPinned = false; }
+ bool isPinned() const final { return mPinned; }
+ void unPin() final { mPinned = false; }
- audio_utils::mutex& mutex() const final { return mMutex; }
+ audio_utils::mutex& mutex() const final
+ RETURN_CAPABILITY(android::audio_utils::EffectBase_Mutex) {
+ return mMutex;
+ }
- status_t updatePolicyState() final;
+ status_t updatePolicyState() final EXCLUDES_EffectBase_Mutex;
sp<IAfEffectModule> asEffectModule() override { return nullptr; }
sp<IAfDeviceEffectProxy> asDeviceEffectProxy() override { return nullptr; }
- void dump(int fd, const Vector<String16>& args) const override;
+ void dump(int fd, const Vector<String16>& args) const override;
protected:
- bool isInternal_l() const {
- for (auto handle : mHandles) {
- if (handle->client() != nullptr) {
- return false;
- }
- }
- return true;
- }
+ bool isInternal_l() const REQUIRES(audio_utils::EffectBase_Mutex) {
+ for (auto handle : mHandles) {
+ if (handle->client() != nullptr) {
+ return false;
+ }
+ }
+ return true;
+ }
bool mPinned = false;
@@ -150,7 +154,10 @@
// Audio policy effect state management
// Mutex protecting transactions with audio policy manager as mutex() cannot
// be held to avoid cross deadlocks with audio policy mutex
- audio_utils::mutex& policyMutex() const { return mPolicyMutex; }
+ audio_utils::mutex& policyMutex() const
+ RETURN_CAPABILITY(android::audio_utils::EffectBase_PolicyMutex) {
+ return mPolicyMutex;
+ }
mutable audio_utils::mutex mPolicyMutex{audio_utils::MutexOrder::kEffectBase_PolicyMutex};
// Effect is registered in APM or not
bool mPolicyRegistered = false;
@@ -175,25 +182,23 @@
int id,
audio_session_t sessionId,
bool pinned,
- audio_port_handle_t deviceId);
- ~EffectModule() override;
+ audio_port_handle_t deviceId) REQUIRES(audio_utils::EffectChain_Mutex);
+ ~EffectModule() override REQUIRES(audio_utils::EffectChain_Mutex);
- void process() final;
- bool updateState() final;
- status_t command(int32_t cmdCode,
- const std::vector<uint8_t>& cmdData,
- int32_t maxReplySize,
- std::vector<uint8_t>* reply) final;
+ void process() final EXCLUDES_EffectBase_Mutex;
+ bool updateState_l() final REQUIRES(audio_utils::EffectChain_Mutex) EXCLUDES_EffectBase_Mutex;
+ status_t command(int32_t cmdCode, const std::vector<uint8_t>& cmdData, int32_t maxReplySize,
+ std::vector<uint8_t>* reply) final EXCLUDES_EffectBase_Mutex;
- void reset_l() final;
- status_t configure() final;
- status_t init() final;
+ void reset_l() final REQUIRES(audio_utils::EffectBase_Mutex);
+ status_t configure_l() final REQUIRES(audio_utils::EffectChain_Mutex);
+ status_t init_l() final REQUIRES(audio_utils::EffectChain_Mutex) EXCLUDES_EffectBase_Mutex;
uint32_t status() const final {
return mStatus;
}
bool isProcessEnabled() const final;
- bool isOffloadedOrDirect() const final;
- bool isVolumeControlEnabled() const final;
+ bool isOffloadedOrDirect_l() const final REQUIRES(audio_utils::EffectChain_Mutex);
+ bool isVolumeControlEnabled_l() const final REQUIRES(audio_utils::EffectChain_Mutex);
void setInBuffer(const sp<EffectBufferHalInterface>& buffer) final;
int16_t *inBuffer() const final {
return mInBuffer != 0 ? reinterpret_cast<int16_t*>(mInBuffer->ptr()) : NULL;
@@ -203,36 +208,42 @@
return mOutBuffer != 0 ? reinterpret_cast<int16_t*>(mOutBuffer->ptr()) : NULL;
}
// Updates the access mode if it is out of date. May issue a new effect configure.
- void updateAccessMode() final {
- if (requiredEffectBufferAccessMode() != mConfig.outputCfg.accessMode) {
- configure();
- }
- }
- status_t setDevices(const AudioDeviceTypeAddrVector &devices) final;
- status_t setInputDevice(const AudioDeviceTypeAddr &device) final;
+ void updateAccessMode_l() final REQUIRES(audio_utils::EffectChain_Mutex) {
+ if (requiredEffectBufferAccessMode() != mConfig.outputCfg.accessMode) {
+ configure_l();
+ }
+ }
+ status_t setDevices(const AudioDeviceTypeAddrVector& devices) final EXCLUDES_EffectBase_Mutex;
+ status_t setInputDevice(const AudioDeviceTypeAddr& device) final EXCLUDES_EffectBase_Mutex;
status_t setVolume(uint32_t *left, uint32_t *right, bool controller) final;
- status_t setMode(audio_mode_t mode) final;
- status_t setAudioSource(audio_source_t source) final;
- status_t start() final;
- status_t stop() final;
+ status_t setMode(audio_mode_t mode) final EXCLUDES_EffectBase_Mutex;
+ status_t setAudioSource(audio_source_t source) final EXCLUDES_EffectBase_Mutex;
+ status_t start_l() final REQUIRES(audio_utils::EffectChain_Mutex) EXCLUDES_EffectBase_Mutex;
+ status_t stop_l() final REQUIRES(audio_utils::EffectChain_Mutex) EXCLUDES_EffectBase_Mutex;
- status_t setOffloaded(bool offloaded, audio_io_handle_t io) final;
- bool isOffloaded() const final;
- void addEffectToHal_l() final;
- void release_l() final;
+ status_t setOffloaded_l(bool offloaded, audio_io_handle_t io) final
+ REQUIRES(audio_utils::EffectChain_Mutex) EXCLUDES_EffectBase_Mutex;
+ bool isOffloaded_l() const final
+ REQUIRES(audio_utils::EffectChain_Mutex) EXCLUDES_EffectBase_Mutex;
+ void addEffectToHal_l() final REQUIRES(audio_utils::EffectChain_Mutex);
+ void release_l() final REQUIRES(audio_utils::EffectChain_Mutex);
sp<IAfEffectModule> asEffectModule() final { return this; }
bool isHapticGenerator() const final;
bool isSpatializer() const final;
- status_t setHapticIntensity(int id, os::HapticScale intensity) final;
- status_t setVibratorInfo(const media::AudioVibratorInfo& vibratorInfo) final;
- status_t sendMetadata(const std::vector<playback_track_metadata_v7_t>& metadata) final;
+ status_t setHapticIntensity_l(int id, os::HapticScale intensity) final
+ REQUIRES(audio_utils::ThreadBase_Mutex) EXCLUDES_EffectBase_Mutex;
+ status_t setVibratorInfo_l(const media::AudioVibratorInfo& vibratorInfo) final
+ REQUIRES(audio_utils::ThreadBase_Mutex) EXCLUDES_EffectBase_Mutex;
+ status_t sendMetadata_ll(const std::vector<playback_track_metadata_v7_t>& metadata) final
+ REQUIRES(audio_utils::ThreadBase_Mutex,
+ audio_utils::EffectChain_Mutex) EXCLUDES_EffectBase_Mutex;
- status_t getConfigs(audio_config_base_t* inputCfg,
- audio_config_base_t* outputCfg,
- bool* isOutput) const final;
+ status_t getConfigs_l(audio_config_base_t* inputCfg, audio_config_base_t* outputCfg,
+ bool* isOutput) const final
+ REQUIRES(audio_utils::EffectHandle_Mutex) EXCLUDES_EffectBase_Mutex;
void dump(int fd, const Vector<String16>& args) const final;
@@ -243,9 +254,9 @@
DISALLOW_COPY_AND_ASSIGN(EffectModule);
- status_t start_l();
- status_t stop_l();
- status_t removeEffectFromHal_l();
+ status_t start_ll() REQUIRES(audio_utils::EffectChain_Mutex, audio_utils::EffectBase_Mutex);
+ status_t stop_ll() REQUIRES(audio_utils::EffectChain_Mutex, audio_utils::EffectBase_Mutex);
+ status_t removeEffectFromHal_l() REQUIRES(audio_utils::EffectChain_Mutex);
status_t sendSetAudioDevicesCommand(const AudioDeviceTypeAddrVector &devices, uint32_t cmdCode);
effect_buffer_access_e requiredEffectBufferAccessMode() const {
return mConfig.inputCfg.buffer.raw == mConfig.outputCfg.buffer.raw
@@ -368,7 +379,9 @@
private:
DISALLOW_COPY_AND_ASSIGN(EffectHandle);
- audio_utils::mutex& mutex() const { return mMutex; }
+ audio_utils::mutex& mutex() const RETURN_CAPABILITY(android::audio_utils::EffectHandle_Mutex) {
+ return mMutex;
+ }
// protects IEffect method calls
mutable audio_utils::mutex mMutex{audio_utils::MutexOrder::kEffectHandle_Mutex};
const wp<IAfEffectBase> mEffect; // pointer to controlled EffectModule
@@ -407,31 +420,37 @@
return mMutex;
}
- status_t createEffect_l(sp<IAfEffectModule>& effect,
- effect_descriptor_t *desc,
- int id,
- audio_session_t sessionId,
- bool pinned) final;
- status_t addEffect_l(const sp<IAfEffectModule>& handle) final;
- status_t addEffect_ll(const sp<IAfEffectModule>& handle) final;
- size_t removeEffect_l(const sp<IAfEffectModule>& handle, bool release = false) final;
+ status_t createEffect_l(sp<IAfEffectModule>& effect, effect_descriptor_t* desc, int id,
+ audio_session_t sessionId, bool pinned) final
+ REQUIRES(audio_utils::ThreadBase_Mutex) EXCLUDES_EffectChain_Mutex;
+ status_t addEffect_l(const sp<IAfEffectModule>& handle) final
+ REQUIRES(audio_utils::ThreadBase_Mutex) EXCLUDES_EffectChain_Mutex;
+ status_t addEffect_ll(const sp<IAfEffectModule>& handle) final
+ REQUIRES(audio_utils::ThreadBase_Mutex, audio_utils::EffectChain_Mutex);
+ size_t removeEffect_l(const sp<IAfEffectModule>& handle, bool release = false) final
+ REQUIRES(audio_utils::ThreadBase_Mutex) EXCLUDES_EffectChain_Mutex;
audio_session_t sessionId() const final { return mSessionId; }
void setSessionId(audio_session_t sessionId) final { mSessionId = sessionId; }
- sp<IAfEffectModule> getEffectFromDesc_l(effect_descriptor_t *descriptor) const final;
- sp<IAfEffectModule> getEffectFromId_l(int id) const final;
- sp<IAfEffectModule> getEffectFromType_l(const effect_uuid_t *type) const final;
- std::vector<int> getEffectIds() const final;
+ sp<IAfEffectModule> getEffectFromDesc_l(effect_descriptor_t* descriptor) const final
+ REQUIRES(audio_utils::ThreadBase_Mutex);
+ sp<IAfEffectModule> getEffectFromId_l(int id) const final
+ REQUIRES(audio_utils::ThreadBase_Mutex);
+ sp<IAfEffectModule> getEffectFromType_l(const effect_uuid_t* type) const final
+ REQUIRES(audio_utils::ThreadBase_Mutex);
+ std::vector<int> getEffectIds_l() const final REQUIRES(audio_utils::ThreadBase_Mutex);
// FIXME use float to improve the dynamic range
bool setVolume(uint32_t* left, uint32_t* right,
bool force = false) final EXCLUDES_EffectChain_Mutex;
void resetVolume_l() final REQUIRES(audio_utils::EffectChain_Mutex);
- void setDevices_l(const AudioDeviceTypeAddrVector &devices) final;
- void setInputDevice_l(const AudioDeviceTypeAddr &device) final;
- void setMode_l(audio_mode_t mode) final;
- void setAudioSource_l(audio_source_t source) final;
+ void setDevices_l(const AudioDeviceTypeAddrVector& devices) final
+ REQUIRES(audio_utils::ThreadBase_Mutex);
+ void setInputDevice_l(const AudioDeviceTypeAddr& device) final
+ REQUIRES(audio_utils::ThreadBase_Mutex);
+ void setMode_l(audio_mode_t mode) final REQUIRES(audio_utils::ThreadBase_Mutex);
+ void setAudioSource_l(audio_source_t source) final REQUIRES(audio_utils::ThreadBase_Mutex);
void setInBuffer(const sp<EffectBufferHalInterface>& buffer) final {
mInBuffer = buffer;
@@ -462,21 +481,22 @@
// suspend or restore effects of the specified type. The number of suspend requests is counted
// and restore occurs once all suspend requests are cancelled.
- void setEffectSuspended_l(const effect_uuid_t *type,
- bool suspend) final;
+ void setEffectSuspended_l(const effect_uuid_t* type, bool suspend) final
+ REQUIRES(audio_utils::ThreadBase_Mutex);
// suspend all eligible effects
- void setEffectSuspendedAll_l(bool suspend) final;
+ void setEffectSuspendedAll_l(bool suspend) final REQUIRES(audio_utils::ThreadBase_Mutex);
// check if effects should be suspended or restored when a given effect is enable or disabled
- void checkSuspendOnEffectEnabled(
- const sp<IAfEffectModule>& effect, bool enabled) final;
+ void checkSuspendOnEffectEnabled_l(const sp<IAfEffectModule>& effect, bool enabled) final
+ REQUIRES(audio_utils::ThreadBase_Mutex);
- void clearInputBuffer() final;
+ void clearInputBuffer() final EXCLUDES_EffectChain_Mutex;
// At least one non offloadable effect in the chain is enabled
- bool isNonOffloadableEnabled() const final;
- bool isNonOffloadableEnabled_l() const final;
+ bool isNonOffloadableEnabled() const final EXCLUDES_EffectChain_Mutex;
+ bool isNonOffloadableEnabled_l() const final REQUIRES(audio_utils::EffectChain_Mutex);
- void syncHalEffectsState() final;
+ void syncHalEffectsState_l()
+ REQUIRES(audio_utils::ThreadBase_Mutex) EXCLUDES_EffectChain_Mutex final;
// flags is an ORed set of audio_output_flags_t which is updated on return.
void checkOutputFlagCompatibility(audio_output_flags_t *flags) const final;
@@ -495,12 +515,13 @@
// isCompatibleWithThread_l() must be called with thread->mutex() held
bool isCompatibleWithThread_l(const sp<IAfThreadBase>& thread) const final
- REQUIRES(audio_utils::ThreadBase_Mutex);
+ REQUIRES(audio_utils::ThreadBase_Mutex) EXCLUDES_EffectChain_Mutex;
// Requires either IAfThreadBase::mutex() or EffectChain::mutex() held
bool containsHapticGeneratingEffect_l() final;
- void setHapticIntensity_l(int id, os::HapticScale intensity) final;
+ void setHapticIntensity_l(int id, os::HapticScale intensity) final
+ REQUIRES(audio_utils::ThreadBase_Mutex) EXCLUDES_EffectChain_Mutex;
sp<EffectCallbackInterface> effectCallback() const final { return mEffectCallback; }
@@ -522,7 +543,7 @@
const std::optional<const std::vector<playback_track_metadata_v7_t>> spatializedMetadata)
final REQUIRES(audio_utils::ThreadBase_Mutex);
- void setThread(const sp<IAfThreadBase>& thread) final;
+ void setThread(const sp<IAfThreadBase>& thread) final EXCLUDES_EffectChain_Mutex;
private:
bool setVolume_l(uint32_t* left, uint32_t* right, bool force = false)
@@ -573,9 +594,10 @@
void setVolumeForOutput(float left, float right) const override;
// check if effects should be suspended/restored when a given effect is enable/disabled
- void checkSuspendOnEffectEnabled(const sp<IAfEffectBase>& effect,
- bool enabled, bool threadLocked) override;
- void resetVolume() override;
+ void checkSuspendOnEffectEnabled(const sp<IAfEffectBase>& effect, bool enabled,
+ bool threadLocked) override;
+ void resetVolume_l() override
+ REQUIRES(audio_utils::ThreadBase_Mutex, audio_utils::EffectChain_Mutex);
product_strategy_t strategy() const override;
int32_t activeTrackCnt() const override;
void onEffectEnable(const sp<IAfEffectBase>& effect) override;
@@ -615,27 +637,34 @@
// get a list of effect modules to suspend when an effect of the type
// passed is enabled.
- void getSuspendEligibleEffects(Vector<sp<IAfEffectModule>> &effects);
+ void getSuspendEligibleEffects_l(Vector<sp<IAfEffectModule>>& effects)
+ REQUIRES(audio_utils::ThreadBase_Mutex);
// get an effect module if it is currently enable
- sp<IAfEffectModule> getEffectIfEnabled(const effect_uuid_t *type);
+ sp<IAfEffectModule> getEffectIfEnabled_l(const effect_uuid_t* type)
+ REQUIRES(audio_utils::ThreadBase_Mutex);
// true if the effect whose descriptor is passed can be suspended
// OEMs can modify the rules implemented in this method to exclude specific effect
// types or implementations from the suspend/restore mechanism.
- bool isEffectEligibleForSuspend(const effect_descriptor_t& desc);
+ bool isEffectEligibleForSuspend_l(const effect_descriptor_t& desc)
+ REQUIRES(audio_utils::ThreadBase_Mutex);
- static bool isEffectEligibleForBtNrecSuspend(const effect_uuid_t *type);
+ static bool isEffectEligibleForBtNrecSuspend_l(const effect_uuid_t* type)
+ REQUIRES(audio_utils::ThreadBase_Mutex);
- void clearInputBuffer_l();
+ void clearInputBuffer_l() REQUIRES(audio_utils::EffectChain_Mutex);
// true if any effect module within the chain has volume control
- bool hasVolumeControlEnabled_l() const;
+ bool hasVolumeControlEnabled_l() const REQUIRES(audio_utils::EffectChain_Mutex);
- void setVolumeForOutput_l(uint32_t left, uint32_t right);
+ void setVolumeForOutput_l(uint32_t left, uint32_t right)
+ REQUIRES(audio_utils::EffectChain_Mutex);
- ssize_t getInsertIndex(const effect_descriptor_t& desc);
+ ssize_t getInsertIndex_ll(const effect_descriptor_t& desc)
+ REQUIRES(audio_utils::ThreadBase_Mutex, audio_utils::EffectChain_Mutex);
- std::optional<size_t> findVolumeControl_l(size_t from, size_t to) const;
+ std::optional<size_t> findVolumeControl_l(size_t from, size_t to) const
+ REQUIRES(audio_utils::EffectChain_Mutex);
// mutex protecting effect list
mutable audio_utils::mutex mMutex{audio_utils::MutexOrder::kEffectChain_Mutex};
@@ -679,11 +708,11 @@
status_t setEnabled(bool enabled, bool fromHandle) final;
sp<IAfDeviceEffectProxy> asDeviceEffectProxy() final { return this; }
- status_t init(const std::map<audio_patch_handle_t,
- IAfPatchPanel::Patch>& patches) final;
+ status_t init_l(const std::map<audio_patch_handle_t, IAfPatchPanel::Patch>& patches) final
+ REQUIRES(audio_utils::DeviceEffectManager_Mutex) EXCLUDES_EffectBase_Mutex;
status_t onCreatePatch(audio_patch_handle_t patchHandle,
- const IAfPatchPanel::Patch& patch) final;
+ const IAfPatchPanel::Patch& patch) final;
status_t onUpdatePatch(audio_patch_handle_t oldPatchHandle, audio_patch_handle_t newPatchHandle,
const IAfPatchPanel::Patch& patch) final;
@@ -701,10 +730,8 @@
audio_channel_mask_t channelMask() const final;
uint32_t channelCount() const final;
- status_t command(int32_t cmdCode,
- const std::vector<uint8_t>& cmdData,
- int32_t maxReplySize,
- std::vector<uint8_t>* reply) final;
+ status_t command(int32_t cmdCode, const std::vector<uint8_t>& cmdData, int32_t maxReplySize,
+ std::vector<uint8_t>* reply) final EXCLUDES_DeviceEffectProxy_ProxyMutex;
void dump2(int fd, int spaces) const final;
@@ -750,7 +777,7 @@
void checkSuspendOnEffectEnabled(const sp<IAfEffectBase>& effect __unused,
bool enabled __unused, bool threadLocked __unused) override {}
- void resetVolume() override {}
+ void resetVolume_l() override REQUIRES(audio_utils::EffectChain_Mutex) {}
product_strategy_t strategy() const override { return static_cast<product_strategy_t>(0); }
int32_t activeTrackCnt() const override { return 0; }
void onEffectEnable(const sp<IAfEffectBase>& effect __unused) override;
@@ -770,13 +797,16 @@
};
status_t checkPort(const IAfPatchPanel::Patch& patch,
- const struct audio_port_config *port, sp<IAfEffectHandle> *handle);
+ const struct audio_port_config* port, sp<IAfEffectHandle>* handle);
const AudioDeviceTypeAddr mDevice;
const sp<DeviceEffectManagerCallback> mManagerCallback;
const sp<ProxyCallback> mMyCallback;
- audio_utils::mutex& proxyMutex() const { return mProxyMutex; }
+ audio_utils::mutex& proxyMutex() const
+ RETURN_CAPABILITY(android::audio_utils::DeviceEffectProxy_ProxyMutex) {
+ return mProxyMutex;
+ }
mutable audio_utils::mutex mProxyMutex{
audio_utils::MutexOrder::kDeviceEffectProxy_ProxyMutex};
std::map<audio_patch_handle_t, sp<IAfEffectHandle>> mEffectHandles; // protected by mProxyMutex
diff --git a/services/audioflinger/IAfEffect.h b/services/audioflinger/IAfEffect.h
index d02fbb7..82436a3 100644
--- a/services/audioflinger/IAfEffect.h
+++ b/services/audioflinger/IAfEffect.h
@@ -80,7 +80,7 @@
// Methods usually implemented with help from EffectChain: pay attention to mutex locking order
virtual product_strategy_t strategy() const = 0;
virtual int32_t activeTrackCnt() const = 0;
- virtual void resetVolume() = 0;
+ virtual void resetVolume_l() REQUIRES(audio_utils::EffectChain_Mutex) = 0;
virtual wp<IAfEffectChain> chain() const = 0;
virtual bool isAudioPolicyReady() const = 0;
};
@@ -106,43 +106,45 @@
virtual bool isOffloadable() const = 0;
virtual bool isImplementationSoftware() const = 0;
virtual bool isProcessImplemented() const = 0;
- virtual bool isVolumeControl() const = 0;
+ virtual bool isVolumeControl() const REQUIRES(audio_utils::EffectChain_Mutex) = 0;
virtual bool isVolumeMonitor() const = 0;
virtual bool isEnabled() const = 0;
virtual bool isPinned() const = 0;
virtual void unPin() = 0;
- virtual status_t updatePolicyState() = 0;
- virtual bool purgeHandles() = 0;
+ virtual status_t updatePolicyState() EXCLUDES_EffectBase_Mutex = 0;
+ virtual bool purgeHandles() EXCLUDES_EffectBase_Mutex = 0;
virtual void checkSuspendOnEffectEnabled(bool enabled, bool threadLocked) = 0;
// mCallback is atomic so this can be lock-free.
virtual void setCallback(const sp<EffectCallbackInterface>& callback) = 0;
virtual sp<EffectCallbackInterface> getCallback() const = 0;
- virtual status_t addHandle(IAfEffectHandle *handle) = 0;
- virtual ssize_t removeHandle(IAfEffectHandle *handle) = 0;
+ virtual status_t addHandle(IAfEffectHandle* handle) EXCLUDES_EffectBase_Mutex = 0;
+ virtual ssize_t removeHandle(IAfEffectHandle* handle) EXCLUDES_EffectBase_Mutex = 0;
virtual sp<IAfEffectModule> asEffectModule() = 0;
virtual sp<IAfDeviceEffectProxy> asDeviceEffectProxy() = 0;
- virtual status_t command(int32_t cmdCode,
- const std::vector<uint8_t>& cmdData,
- int32_t maxReplySize,
- std::vector<uint8_t>* reply) = 0;
+ virtual status_t command(int32_t cmdCode, const std::vector<uint8_t>& cmdData,
+ int32_t maxReplySize, std::vector<uint8_t>* reply)
+ EXCLUDES(audio_utils::EffectBase_Mutex) = 0;
virtual void dump(int fd, const Vector<String16>& args) const = 0;
private:
- virtual status_t setEnabled(bool enabled, bool fromHandle) = 0;
- virtual status_t setEnabled_l(bool enabled) = 0;
- virtual void setSuspended(bool suspended) = 0;
- virtual bool suspended() const = 0;
+ virtual status_t setEnabled(bool enabled, bool fromHandle) EXCLUDES_EffectBase_Mutex = 0;
+ virtual status_t setEnabled_l(bool enabled) REQUIRES(audio_utils::EffectBase_Mutex) = 0;
+ virtual void setSuspended(bool suspended) EXCLUDES_EffectBase_Mutex = 0;
+ virtual bool suspended() const EXCLUDES_EffectBase_Mutex = 0;
- virtual ssize_t disconnectHandle(IAfEffectHandle *handle, bool unpinIfLast) = 0;
- virtual ssize_t removeHandle_l(IAfEffectHandle *handle) = 0;
- virtual IAfEffectHandle* controlHandle_l() = 0;
+ virtual ssize_t disconnectHandle(IAfEffectHandle* handle,
+ bool unpinIfLast) EXCLUDES_EffectBase_Mutex = 0;
+ virtual ssize_t removeHandle_l(IAfEffectHandle* handle)
+ REQUIRES(audio_utils::EffectBase_Mutex) = 0;
+ virtual IAfEffectHandle* controlHandle_l() REQUIRES(audio_utils::EffectBase_Mutex) = 0;
- virtual audio_utils::mutex& mutex() const = 0;
+ virtual audio_utils::mutex& mutex() const
+ RETURN_CAPABILITY(android::audio_utils::EffectBase_Mutex) = 0;
};
class IAfEffectModule : public virtual IAfEffectBase {
@@ -162,45 +164,51 @@
virtual status_t setDevices(const AudioDeviceTypeAddrVector &devices) = 0;
virtual status_t setInputDevice(const AudioDeviceTypeAddr &device) = 0;
virtual status_t setVolume(uint32_t *left, uint32_t *right, bool controller) = 0;
- virtual status_t setOffloaded(bool offloaded, audio_io_handle_t io) = 0;
- virtual bool isOffloaded() const = 0;
+ virtual status_t setOffloaded_l(bool offloaded, audio_io_handle_t io) = 0;
+ virtual bool isOffloaded_l() const = 0;
virtual status_t setAudioSource(audio_source_t source) = 0;
virtual status_t setMode(audio_mode_t mode) = 0;
- virtual status_t start() = 0;
- virtual status_t getConfigs(audio_config_base_t* inputCfg,
- audio_config_base_t* outputCfg,
- bool* isOutput) const = 0;
+ virtual status_t start_l() = 0;
+ virtual status_t getConfigs_l(audio_config_base_t* inputCfg, audio_config_base_t* outputCfg,
+ bool* isOutput) const
+ REQUIRES(audio_utils::EffectHandle_Mutex) EXCLUDES_EffectBase_Mutex = 0;
static bool isHapticGenerator(const effect_uuid_t* type);
virtual bool isHapticGenerator() const = 0;
static bool isSpatializer(const effect_uuid_t* type);
virtual bool isSpatializer() const = 0;
- virtual status_t setHapticIntensity(int id, os::HapticScale intensity) = 0;
- virtual status_t setVibratorInfo(const media::AudioVibratorInfo& vibratorInfo) = 0;
- virtual status_t sendMetadata(const std::vector<playback_track_metadata_v7_t>& metadata) = 0;
+ virtual status_t setHapticIntensity_l(int id, os::HapticScale intensity)
+ REQUIRES(audio_utils::ThreadBase_Mutex) EXCLUDES_EffectBase_Mutex = 0;
+ virtual status_t setVibratorInfo_l(const media::AudioVibratorInfo& vibratorInfo)
+ REQUIRES(audio_utils::ThreadBase_Mutex) EXCLUDES_EffectBase_Mutex = 0;
+ virtual status_t sendMetadata_ll(const std::vector<playback_track_metadata_v7_t>& metadata)
+ REQUIRES(audio_utils::ThreadBase_Mutex,
+ audio_utils::EffectChain_Mutex) EXCLUDES_EffectBase_Mutex = 0;
private:
virtual void process() = 0;
- virtual bool updateState() = 0;
- virtual void reset_l() = 0;
- virtual status_t configure() = 0;
- virtual status_t init() = 0;
+ virtual bool updateState_l()
+ REQUIRES(audio_utils::EffectChain_Mutex) EXCLUDES_EffectBase_Mutex = 0;
+ virtual void reset_l() REQUIRES(audio_utils::EffectChain_Mutex) = 0;
+ virtual status_t configure_l() REQUIRES(audio_utils::EffectChain_Mutex) = 0;
+ virtual status_t init_l()
+ REQUIRES(audio_utils::EffectChain_Mutex) EXCLUDES_EffectBase_Mutex = 0;
virtual uint32_t status() const = 0;
virtual bool isProcessEnabled() const = 0;
- virtual bool isOffloadedOrDirect() const = 0;
- virtual bool isVolumeControlEnabled() const = 0;
+ virtual bool isOffloadedOrDirect_l() const REQUIRES(audio_utils::EffectChain_Mutex) = 0;
+ virtual bool isVolumeControlEnabled_l() const REQUIRES(audio_utils::EffectChain_Mutex) = 0;
virtual void setInBuffer(const sp<EffectBufferHalInterface>& buffer) = 0;
virtual void setOutBuffer(const sp<EffectBufferHalInterface>& buffer) = 0;
virtual int16_t *outBuffer() const = 0;
// Updates the access mode if it is out of date. May issue a new effect configure.
- virtual void updateAccessMode() = 0;
+ virtual void updateAccessMode_l() = 0;
- virtual status_t stop() = 0;
+ virtual status_t stop_l() = 0;
virtual void addEffectToHal_l() = 0;
virtual void release_l() = 0;
};
@@ -220,35 +228,41 @@
// a session is stopped or removed to allow effect tail to be rendered
static constexpr int kProcessTailDurationMs = 1000;
- virtual void process_l() = 0;
+ virtual void process_l() REQUIRES(audio_utils::EffectChain_Mutex) = 0;
- virtual audio_utils::mutex& mutex() const
- RETURN_CAPABILITY(android::audio_utils::EffectChain_Mutex) = 0;
+ virtual audio_utils::mutex& mutex() const RETURN_CAPABILITY(audio_utils::EffectChain_Mutex) = 0;
- virtual status_t createEffect_l(sp<IAfEffectModule>& effect,
- effect_descriptor_t *desc,
- int id,
- audio_session_t sessionId,
- bool pinned) = 0;
+ virtual status_t createEffect_l(sp<IAfEffectModule>& effect, effect_descriptor_t* desc, int id,
+ audio_session_t sessionId, bool pinned)
+ REQUIRES(audio_utils::ThreadBase_Mutex) EXCLUDES_EffectChain_Mutex = 0;
- virtual status_t addEffect_l(const sp<IAfEffectModule>& handle) = 0;
- virtual status_t addEffect_ll(const sp<IAfEffectModule>& handle) = 0;
- virtual size_t removeEffect_l(const sp<IAfEffectModule>& handle, bool release = false) = 0;
+ virtual status_t addEffect_l(const sp<IAfEffectModule>& handle)
+ REQUIRES(audio_utils::ThreadBase_Mutex) EXCLUDES_EffectChain_Mutex = 0;
+ virtual status_t addEffect_ll(const sp<IAfEffectModule>& handle)
+ REQUIRES(audio_utils::ThreadBase_Mutex, audio_utils::EffectChain_Mutex) = 0;
+ virtual size_t removeEffect_l(const sp<IAfEffectModule>& handle,
+ bool release = false) EXCLUDES_EffectChain_Mutex = 0;
virtual audio_session_t sessionId() const = 0;
virtual void setSessionId(audio_session_t sessionId) = 0;
- virtual sp<IAfEffectModule> getEffectFromDesc_l(effect_descriptor_t *descriptor) const = 0;
- virtual sp<IAfEffectModule> getEffectFromId_l(int id) const = 0;
- virtual sp<IAfEffectModule> getEffectFromType_l(const effect_uuid_t *type) const = 0;
- virtual std::vector<int> getEffectIds() const = 0;
+ virtual sp<IAfEffectModule> getEffectFromDesc_l(effect_descriptor_t* descriptor) const
+ REQUIRES(audio_utils::ThreadBase_Mutex) = 0;
+ virtual sp<IAfEffectModule> getEffectFromId_l(int id) const
+ REQUIRES(audio_utils::ThreadBase_Mutex) = 0;
+ virtual sp<IAfEffectModule> getEffectFromType_l(const effect_uuid_t* type) const
+ REQUIRES(audio_utils::ThreadBase_Mutex) = 0;
+ virtual std::vector<int> getEffectIds_l() const = 0;
virtual bool setVolume(uint32_t* left, uint32_t* right,
bool force = false) EXCLUDES_EffectChain_Mutex = 0;
virtual void resetVolume_l() REQUIRES(audio_utils::EffectChain_Mutex) = 0;
- virtual void setDevices_l(const AudioDeviceTypeAddrVector &devices) = 0;
- virtual void setInputDevice_l(const AudioDeviceTypeAddr &device) = 0;
- virtual void setMode_l(audio_mode_t mode) = 0;
- virtual void setAudioSource_l(audio_source_t source) = 0;
+ virtual void setDevices_l(const AudioDeviceTypeAddrVector& devices)
+ REQUIRES(audio_utils::ThreadBase_Mutex) = 0;
+ virtual void setInputDevice_l(const AudioDeviceTypeAddr& device)
+ REQUIRES(audio_utils::ThreadBase_Mutex) = 0;
+ virtual void setMode_l(audio_mode_t mode) REQUIRES(audio_utils::ThreadBase_Mutex) = 0;
+ virtual void setAudioSource_l(audio_source_t source)
+ REQUIRES(audio_utils::ThreadBase_Mutex) = 0;
virtual void setInBuffer(const sp<EffectBufferHalInterface>& buffer) = 0;
virtual float *inBuffer() const = 0;
@@ -268,20 +282,21 @@
// suspend or restore effects of the specified type. The number of suspend requests is counted
// and restore occurs once all suspend requests are cancelled.
- virtual void setEffectSuspended_l(
- const effect_uuid_t *type, bool suspend) = 0;
+ virtual void setEffectSuspended_l(const effect_uuid_t* type, bool suspend) = 0;
// suspend all eligible effects
virtual void setEffectSuspendedAll_l(bool suspend) = 0;
// check if effects should be suspended or restored when a given effect is enable or disabled
- virtual void checkSuspendOnEffectEnabled(const sp<IAfEffectModule>& effect, bool enabled) = 0;
+ virtual void checkSuspendOnEffectEnabled_l(const sp<IAfEffectModule>& effect, bool enabled)
+ REQUIRES(audio_utils::ThreadBase_Mutex) REQUIRES(audio_utils::ThreadBase_Mutex) = 0;
- virtual void clearInputBuffer() = 0;
+ virtual void clearInputBuffer() EXCLUDES_EffectChain_Mutex = 0;
// At least one non offloadable effect in the chain is enabled
- virtual bool isNonOffloadableEnabled() const = 0;
- virtual bool isNonOffloadableEnabled_l() const = 0;
+ virtual bool isNonOffloadableEnabled() const EXCLUDES_EffectChain_Mutex = 0;
+ virtual bool isNonOffloadableEnabled_l() const REQUIRES(audio_utils::EffectChain_Mutex) = 0;
- virtual void syncHalEffectsState() = 0;
+ virtual void syncHalEffectsState_l()
+ REQUIRES(audio_utils::ThreadBase_Mutex) EXCLUDES_EffectChain_Mutex = 0;
// flags is an ORed set of audio_output_flags_t which is updated on return.
virtual void checkOutputFlagCompatibility(audio_output_flags_t *flags) const = 0;
@@ -299,16 +314,18 @@
virtual bool isBitPerfectCompatible() const = 0;
// isCompatibleWithThread_l() must be called with thread->mLock held
- virtual bool isCompatibleWithThread_l(const sp<IAfThreadBase>& thread) const = 0;
+ virtual bool isCompatibleWithThread_l(const sp<IAfThreadBase>& thread) const
+ REQUIRES(audio_utils::ThreadBase_Mutex) EXCLUDES_EffectChain_Mutex = 0;
virtual bool containsHapticGeneratingEffect_l() = 0;
- virtual void setHapticIntensity_l(int id, os::HapticScale intensity) = 0;
+ virtual void setHapticIntensity_l(int id, os::HapticScale intensity)
+ REQUIRES(audio_utils::ThreadBase_Mutex) EXCLUDES_EffectChain_Mutex = 0;
virtual sp<EffectCallbackInterface> effectCallback() const = 0;
virtual wp<IAfThreadBase> thread() const = 0;
- virtual void setThread(const sp<IAfThreadBase>& thread) = 0;
+ virtual void setThread(const sp<IAfThreadBase>& thread) EXCLUDES_EffectChain_Mutex = 0;
virtual bool isFirstEffect(int id) const = 0;
@@ -362,9 +379,8 @@
const sp<DeviceEffectManagerCallback>& callback,
effect_descriptor_t *desc, int id, bool notifyFramesProcessed);
- virtual status_t init(
- const std::map<audio_patch_handle_t,
- IAfPatchPanel::Patch>& patches) = 0;
+ virtual status_t init_l(const std::map<audio_patch_handle_t, IAfPatchPanel::Patch>& patches)
+ REQUIRES(audio_utils::DeviceEffectManager_Mutex) EXCLUDES_EffectBase_Mutex = 0;
virtual const AudioDeviceTypeAddr& device() const = 0;
virtual status_t onCreatePatch(
diff --git a/services/audioflinger/IAfThread.h b/services/audioflinger/IAfThread.h
index 46a67e8..d701288 100644
--- a/services/audioflinger/IAfThread.h
+++ b/services/audioflinger/IAfThread.h
@@ -279,7 +279,7 @@
// integrity of the chains during the process.
// Also sets the parameter 'effectChains' to current value of mEffectChains.
virtual void lockEffectChains_l(Vector<sp<IAfEffectChain>>& effectChains)
- REQUIRES(mutex()) = 0;
+ REQUIRES(mutex()) EXCLUDES_EffectChain_Mutex = 0;
// unlock effect chains after process
virtual void unlockEffectChains(const Vector<sp<IAfEffectChain>>& effectChains)
EXCLUDES_ThreadBase_Mutex = 0;
diff --git a/services/audioflinger/Threads.cpp b/services/audioflinger/Threads.cpp
index ac8018b..671e27f 100644
--- a/services/audioflinger/Threads.cpp
+++ b/services/audioflinger/Threads.cpp
@@ -1691,7 +1691,7 @@
std::move(mAfThreadCallback->getDefaultVibratorInfo_l());
if (defaultVibratorInfo) {
// Only set the vibrator info when it is a valid one.
- effect->setVibratorInfo(*defaultVibratorInfo);
+ effect->setVibratorInfo_l(*defaultVibratorInfo);
}
}
// create effect handle and connect it to effect module
@@ -1793,7 +1793,7 @@
std::vector<int> ThreadBase::getEffectIds_l(audio_session_t sessionId) const
{
sp<IAfEffectChain> chain = getEffectChain_l(sessionId);
- return chain != nullptr ? chain->getEffectIds() : std::vector<int>{};
+ return chain != nullptr ? chain->getEffectIds_l() : std::vector<int>{};
}
// PlaybackThread::addEffect_ll() must be called with AudioFlinger::mutex() and
@@ -1825,7 +1825,7 @@
return BAD_VALUE;
}
- effect->setOffloaded(mType == OFFLOAD, mId);
+ effect->setOffloaded_l(mType == OFFLOAD, mId);
status_t status = chain->addEffect_l(effect);
if (status != NO_ERROR) {
@@ -9746,7 +9746,7 @@
// make sure enabled pre processing effects state is communicated to the HAL as we
// just moved them to a new input stream.
- chain->syncHalEffectsState();
+ chain->syncHalEffectsState_l();
mEffectChains.add(chain);
@@ -10731,7 +10731,7 @@
chain->setThread(this);
chain->setInBuffer(nullptr);
chain->setOutBuffer(nullptr);
- chain->syncHalEffectsState();
+ chain->syncHalEffectsState_l();
mEffectChains.add(chain);
checkSuspendOnAddEffectChain_l(chain);
diff --git a/services/audioflinger/Threads.h b/services/audioflinger/Threads.h
index a8e4339..a6888c0 100644
--- a/services/audioflinger/Threads.h
+++ b/services/audioflinger/Threads.h
@@ -437,9 +437,10 @@
// integrity of the chains during the process.
// Also sets the parameter 'effectChains' to current value of mEffectChains.
void lockEffectChains_l(Vector<sp<IAfEffectChain>>& effectChains) final
- REQUIRES(mutex()) EXCLUDES_EffectChain_Mutex;
+ REQUIRES(audio_utils::ThreadBase_Mutex) ACQUIRE(audio_utils::EffectChain_Mutex);
// unlock effect chains after process
- void unlockEffectChains(const Vector<sp<IAfEffectChain>>& effectChains) final;
+ void unlockEffectChains(const Vector<sp<IAfEffectChain>>& effectChains) final
+ RELEASE(audio_utils::EffectChain_Mutex);
// get a copy of mEffectChains vector
Vector<sp<IAfEffectChain>> getEffectChains_l() const final REQUIRES(mutex()) {
return mEffectChains;