Revert "AudioEffect: prevent adding effect for unknown session o..."
Revert submission 25712917
Reason for revert: Droid-monitor triggered revert likely due to breakage in b/330202134. Will be verifying through ABTD before submission.
Reverted changes: /q/submissionid:25712917
Change-Id: I8b5a30920d54f1ebf49d0073426150933f057398
diff --git a/services/audioflinger/AudioFlinger.cpp b/services/audioflinger/AudioFlinger.cpp
index 7ecca4f..01f55dd 100644
--- a/services/audioflinger/AudioFlinger.cpp
+++ b/services/audioflinger/AudioFlinger.cpp
@@ -1079,7 +1079,6 @@
client = registerPid(clientPid);
IAfPlaybackThread* effectThread = nullptr;
- sp<IAfEffectChain> effectChain = nullptr;
// check if an effect chain with the same session ID is present on another
// output thread and move it here.
for (size_t i = 0; i < mPlaybackThreads.size(); i++) {
@@ -1092,10 +1091,6 @@
}
}
}
- // Check if an orphan effect chain exists for this session
- if (effectThread == nullptr) {
- effectChain = getOrphanEffectChain_l(sessionId);
- }
ALOGV("createTrack() sessionId: %d", sessionId);
output.sampleRate = input.config.sample_rate;
@@ -1140,13 +1135,6 @@
effectIds = thread->getEffectIds_l(sessionId);
}
}
- if (effectChain != nullptr) {
- if (moveEffectChain_ll(sessionId, nullptr, thread, effectChain.get())
- == NO_ERROR) {
- effectThreadId = thread->id();
- effectIds = thread->getEffectIds_l(sessionId);
- }
- }
}
// Look for sync events awaiting for a session to be used.
@@ -4234,9 +4222,8 @@
// before creating the AudioEffect or the io handle must be specified.
//
// Detect if the effect is created after an AudioRecord is destroyed.
- if (sessionId != AUDIO_SESSION_OUTPUT_MIX
- && ((descOut.flags & EFFECT_FLAG_TYPE_MASK) == EFFECT_FLAG_TYPE_PRE_PROC)
- && getOrphanEffectChain_l(sessionId).get() != nullptr) {
+ if ((sessionId != AUDIO_SESSION_OUTPUT_MIX) &&
+ getOrphanEffectChain_l(sessionId).get() != nullptr) {
ALOGE("%s: effect %s with no specified io handle is denied because the AudioRecord"
" for session %d no longer exists",
__func__, descOut.name, sessionId);
@@ -4247,27 +4234,11 @@
// Legacy handling of creating an effect on an expired or made-up
// session id. We think that it is a Playback effect.
//
- // If no output thread contains the requested session ID, park the effect to
- // the orphan chains. The effect chain will be moved to the correct output
- // thread when a track with the same session ID is created.
- if (io == AUDIO_IO_HANDLE_NONE) {
- if (probe) {
- // In probe mode, as no compatible thread found, exit with error.
- lStatus = BAD_VALUE;
- goto Exit;
- }
- ALOGV("%s() got io %d for effect %s", __func__, io, descOut.name);
- sp<Client> client = registerPid(currentPid);
- bool pinned = !audio_is_global_session(sessionId) && isSessionAcquired_l(sessionId);
- handle = createOrphanEffect_l(client, effectClient, priority, sessionId,
- &descOut, &enabledOut, &lStatus, pinned,
- request.notifyFramesProcessed);
- if (lStatus != NO_ERROR && lStatus != ALREADY_EXISTS) {
- // remove local strong reference to Client with clientMutex() held
- audio_utils::lock_guard _cl(clientMutex());
- client.clear();
- }
- goto Register;
+ // If no output thread contains the requested session ID, default to
+ // first output. The effect chain will be moved to the correct output
+ // thread when a track with the same session ID is created
+ if (io == AUDIO_IO_HANDLE_NONE && mPlaybackThreads.size() > 0) {
+ io = mPlaybackThreads.keyAt(0);
}
ALOGV("createEffect() got io %d for effect %s", io, descOut.name);
} else if (checkPlaybackThread_l(io) != nullptr
@@ -4385,78 +4356,6 @@
return lStatus;
}
-sp<IAfEffectHandle> AudioFlinger::createOrphanEffect_l(
- const sp<Client>& client,
- const sp<IEffectClient>& effectClient,
- int32_t priority,
- audio_session_t sessionId,
- effect_descriptor_t *desc,
- int *enabled,
- status_t *status,
- bool pinned,
- bool notifyFramesProcessed)
-{
- ALOGV("%s effectClient %p, priority %d, sessionId %d, factory %p",
- __func__, effectClient.get(), priority, sessionId, mEffectsFactoryHal.get());
-
- // Check if an orphan effect chain exists for this session or create new chain for this session
- sp<IAfEffectModule> effect;
- sp<IAfEffectChain> chain = getOrphanEffectChain_l(sessionId);
- bool chainCreated = false;
- if (chain == nullptr) {
- chain = IAfEffectChain::create(/* ThreadBase= */ nullptr, sessionId, this);
- chainCreated = true;
- } else {
- effect = chain->getEffectFromDesc(desc);
- }
- bool effectCreated = false;
- if (effect == nullptr) {
- audio_unique_id_t effectId = nextUniqueId(AUDIO_UNIQUE_ID_USE_EFFECT);
- // create a new effect module if none present in the chain
- status_t llStatus =
- chain->createEffect(effect, desc, effectId, sessionId, pinned);
- if (llStatus != NO_ERROR) {
- *status = llStatus;
- return nullptr;
- }
- effect->setMode(getMode());
-
- if (effect->isHapticGenerator()) {
- // TODO(b/184194057): Use the vibrator information from the vibrator that will be used
- // for the HapticGenerator.
- const std::optional<media::AudioVibratorInfo> defaultVibratorInfo =
- std::move(getDefaultVibratorInfo_l());
- if (defaultVibratorInfo) {
- // Only set the vibrator info when it is a valid one.
- audio_utils::lock_guard _cl(chain->mutex());
- effect->setVibratorInfo_l(*defaultVibratorInfo);
- }
- }
- effectCreated = true;
- }
- // create effect handle and connect it to effect module
- sp<IAfEffectHandle> handle =
- IAfEffectHandle::create(effect, client, effectClient, priority, notifyFramesProcessed);
- status_t lStatus = handle->initCheck();
- if (lStatus == OK) {
- lStatus = effect->addHandle(handle.get());
- }
- if (lStatus != NO_ERROR && lStatus != ALREADY_EXISTS) {
- if (effectCreated) {
- chain->removeEffect(effect);
- }
- } else {
- if (enabled != NULL) {
- *enabled = (int)effect->isEnabled();
- }
- if (chainCreated) {
- putOrphanEffectChain_l(chain);
- }
- }
- *status = lStatus;
- return handle;
-}
-
status_t AudioFlinger::moveEffects(audio_session_t sessionId, audio_io_handle_t srcIo,
audio_io_handle_t dstIo)
NO_THREAD_SAFETY_ANALYSIS
@@ -4588,7 +4487,7 @@
if (srcThread != nullptr) {
srcThread->removeEffect_l(effect);
} else {
- chain->removeEffect(effect);
+ chain->removeEffect_l(effect);
}
removed.add(effect);
status = dstThread->addEffect_ll(effect);
@@ -4831,7 +4730,7 @@
ALOGV("updateOrphanEffectChains session %d index %zd", session, index);
if (index >= 0) {
sp<IAfEffectChain> chain = mOrphanEffectChains.valueAt(index);
- if (chain->removeEffect(effect, true) == 0) {
+ if (chain->removeEffect_l(effect, true) == 0) {
ALOGV("updateOrphanEffectChains removing effect chain at index %zd", index);
mOrphanEffectChains.removeItemsAt(index);
}
diff --git a/services/audioflinger/AudioFlinger.h b/services/audioflinger/AudioFlinger.h
index 4e46bea..7c26f72 100644
--- a/services/audioflinger/AudioFlinger.h
+++ b/services/audioflinger/AudioFlinger.h
@@ -703,16 +703,6 @@
sp<Client> registerPid(pid_t pid) EXCLUDES_AudioFlinger_ClientMutex; // always returns non-0
- sp<IAfEffectHandle> createOrphanEffect_l(const sp<Client>& client,
- const sp<media::IEffectClient>& effectClient,
- int32_t priority,
- audio_session_t sessionId,
- effect_descriptor_t *desc,
- int *enabled,
- status_t *status /*non-NULL*/,
- bool pinned,
- bool notifyFramesProcessed) REQUIRES(mutex());
-
// for use from destructor
status_t closeOutput_nonvirtual(audio_io_handle_t output) EXCLUDES_AudioFlinger_Mutex;
status_t closeInput_nonvirtual(audio_io_handle_t input) EXCLUDES_AudioFlinger_Mutex;
diff --git a/services/audioflinger/Effects.cpp b/services/audioflinger/Effects.cpp
index 4d22837..b8ed7f7 100644
--- a/services/audioflinger/Effects.cpp
+++ b/services/audioflinger/Effects.cpp
@@ -2157,31 +2157,27 @@
/* static */
sp<IAfEffectChain> IAfEffectChain::create(
const sp<IAfThreadBase>& thread,
- audio_session_t sessionId,
- const sp<IAfThreadCallback>& afThreadCallback)
+ audio_session_t sessionId)
{
- return sp<EffectChain>::make(thread, sessionId, afThreadCallback);
+ return sp<EffectChain>::make(thread, sessionId);
}
-EffectChain::EffectChain(const sp<IAfThreadBase>& thread, audio_session_t sessionId,
- const sp<IAfThreadCallback>& afThreadCallback)
+EffectChain::EffectChain(const sp<IAfThreadBase>& thread,
+ audio_session_t sessionId)
: mSessionId(sessionId), mActiveTrackCnt(0), mTrackCnt(0), mTailBufferCount(0),
mLeftVolume(UINT_MAX), mRightVolume(UINT_MAX),
mNewLeftVolume(UINT_MAX), mNewRightVolume(UINT_MAX),
- mEffectCallback(new EffectCallback(wp<EffectChain>(this), thread, afThreadCallback))
+ mEffectCallback(new EffectCallback(wp<EffectChain>(this), thread))
{
- if (thread != nullptr) {
- mStrategy = thread->getStrategyForStream(AUDIO_STREAM_MUSIC);
- mMaxTailBuffers =
- ((kProcessTailDurationMs * thread->sampleRate()) / 1000) /
- thread->frameCount();
- }
+ mStrategy = thread->getStrategyForStream(AUDIO_STREAM_MUSIC);
+ mMaxTailBuffers = ((kProcessTailDurationMs * thread->sampleRate()) / 1000) /
+ thread->frameCount();
}
-sp<IAfEffectModule> EffectChain::getEffectFromDesc(
+// getEffectFromDesc_l() must be called with IAfThreadBase::mutex() held
+sp<IAfEffectModule> EffectChain::getEffectFromDesc_l(
effect_descriptor_t *descriptor) const
{
- audio_utils::lock_guard _l(mutex());
size_t size = mEffects.size();
for (size_t i = 0; i < size; i++) {
@@ -2195,7 +2191,6 @@
// getEffectFromId_l() must be called with IAfThreadBase::mutex() held
sp<IAfEffectModule> EffectChain::getEffectFromId_l(int id) const
{
- audio_utils::lock_guard _l(mutex());
size_t size = mEffects.size();
for (size_t i = 0; i < size; i++) {
@@ -2211,7 +2206,6 @@
sp<IAfEffectModule> EffectChain::getEffectFromType_l(
const effect_uuid_t *type) const
{
- audio_utils::lock_guard _l(mutex());
size_t size = mEffects.size();
for (size_t i = 0; i < size; i++) {
@@ -2302,7 +2296,8 @@
}
}
-status_t EffectChain::createEffect(sp<IAfEffectModule>& effect,
+// createEffect_l() must be called with IAfThreadBase::mutex() held
+status_t EffectChain::createEffect_l(sp<IAfEffectModule>& effect,
effect_descriptor_t *desc,
int id,
audio_session_t sessionId,
@@ -2312,7 +2307,7 @@
effect = new EffectModule(mEffectCallback, desc, id, sessionId, pinned, AUDIO_PORT_HANDLE_NONE);
status_t lStatus = effect->status();
if (lStatus == NO_ERROR) {
- lStatus = addEffect_l(effect);
+ lStatus = addEffect_ll(effect);
}
if (lStatus != NO_ERROR) {
effect.clear();
@@ -2320,13 +2315,14 @@
return lStatus;
}
-status_t EffectChain::addEffect(const sp<IAfEffectModule>& effect)
+// addEffect_l() must be called with IAfThreadBase::mutex() held
+status_t EffectChain::addEffect_l(const sp<IAfEffectModule>& effect)
{
audio_utils::lock_guard _l(mutex());
- return addEffect_l(effect);
+ return addEffect_ll(effect);
}
-// addEffect_l() must be called with EffectChain::mutex() held
-status_t EffectChain::addEffect_l(const sp<IAfEffectModule>& effect)
+// addEffect_l() must be called with IAfThreadBase::mutex() and EffectChain::mutex() held
+status_t EffectChain::addEffect_ll(const sp<IAfEffectModule>& effect)
{
effect->setCallback(mEffectCallback);
@@ -2354,7 +2350,7 @@
// by insert effects
effect->setOutBuffer(mInBuffer);
} else {
- ssize_t idx_insert = getInsertIndex_l(desc);
+ ssize_t idx_insert = getInsertIndex_ll(desc);
if (idx_insert < 0) {
return INVALID_OPERATION;
}
@@ -2415,7 +2411,7 @@
return std::nullopt;
}
-ssize_t EffectChain::getInsertIndex_l(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:
@@ -2488,7 +2484,8 @@
return idx_insert;
}
-size_t EffectChain::removeEffect(const sp<IAfEffectModule>& effect,
+// removeEffect_l() must be called with IAfThreadBase::mutex() held
+size_t EffectChain::removeEffect_l(const sp<IAfEffectModule>& effect,
bool release)
{
audio_utils::lock_guard _l(mutex());
@@ -2539,7 +2536,6 @@
// setDevices_l() must be called with IAfThreadBase::mutex() held
void EffectChain::setDevices_l(const AudioDeviceTypeAddrVector &devices)
{
- audio_utils::lock_guard _l(mutex());
size_t size = mEffects.size();
for (size_t i = 0; i < size; i++) {
mEffects[i]->setDevices(devices);
@@ -2549,7 +2545,6 @@
// setInputDevice_l() must be called with IAfThreadBase::mutex() held
void EffectChain::setInputDevice_l(const AudioDeviceTypeAddr &device)
{
- audio_utils::lock_guard _l(mutex());
size_t size = mEffects.size();
for (size_t i = 0; i < size; i++) {
mEffects[i]->setInputDevice(device);
@@ -2559,7 +2554,6 @@
// setMode_l() must be called with IAfThreadBase::mutex() held
void EffectChain::setMode_l(audio_mode_t mode)
{
- audio_utils::lock_guard _l(mutex());
size_t size = mEffects.size();
for (size_t i = 0; i < size; i++) {
mEffects[i]->setMode(mode);
@@ -2569,7 +2563,6 @@
// setAudioSource_l() must be called with IAfThreadBase::mutex() held
void EffectChain::setAudioSource_l(audio_source_t source)
{
- audio_utils::lock_guard _l(mutex());
size_t size = mEffects.size();
for (size_t i = 0; i < size; i++) {
mEffects[i]->setAudioSource(source);
@@ -2675,12 +2668,8 @@
}
}
-bool EffectChain::containsHapticGeneratingEffect()
-{
- audio_utils::lock_guard _l(mutex());
- return containsHapticGeneratingEffect_l();
-}
-// containsHapticGeneratingEffect_l must be called with EffectChain::mutex() held
+// containsHapticGeneratingEffect_l must be called with
+// IAfThreadBase::mutex() or EffectChain::mutex() held
bool EffectChain::containsHapticGeneratingEffect_l()
{
for (size_t i = 0; i < mEffects.size(); ++i) {
@@ -2821,7 +2810,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);
}
@@ -2871,7 +2860,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) &&
@@ -2884,13 +2873,12 @@
return true;
}
-void EffectChain::getSuspendEligibleEffects(
+void EffectChain::getSuspendEligibleEffects_l(
Vector< sp<IAfEffectModule> > &effects)
{
effects.clear();
- audio_utils::lock_guard _l(mutex());
for (size_t i = 0; i < mEffects.size(); i++) {
- if (isEffectEligibleForSuspend(mEffects[i]->desc())) {
+ if (isEffectEligibleForSuspend_l(mEffects[i]->desc())) {
effects.add(mEffects[i]);
}
}
@@ -2911,7 +2899,7 @@
if (index < 0) {
return;
}
- if (!isEffectEligibleForSuspend(effect->desc())) {
+ if (!isEffectEligibleForSuspend_l(effect->desc())) {
return;
}
setEffectSuspended_l(&effect->desc().type, enabled);
@@ -2959,12 +2947,6 @@
void EffectChain::setThread(const sp<IAfThreadBase>& thread)
{
- if (thread != nullptr) {
- mStrategy = thread->getStrategyForStream(AUDIO_STREAM_MUSIC);
- mMaxTailBuffers =
- ((kProcessTailDurationMs * thread->sampleRate()) / 1000) /
- thread->frameCount();
- }
audio_utils::lock_guard _l(mutex());
mEffectCallback->setThread(thread);
}
@@ -3154,7 +3136,7 @@
uint32_t EffectChain::EffectCallback::sampleRate() const {
const sp<IAfThreadBase> t = thread().promote();
if (t == nullptr) {
- return DEFAULT_OUTPUT_SAMPLE_RATE;
+ return 0;
}
return t->sampleRate();
}
@@ -3162,7 +3144,6 @@
audio_channel_mask_t EffectChain::EffectCallback::inChannelMask(int id) const
NO_THREAD_SAFETY_ANALYSIS
// calling function 'hasAudioSession_l' requires holding mutex 'ThreadBase_Mutex' exclusively
-// calling function 'isFirstEffect_l' requires holding mutex 'EffectChain_Mutex' exclusively
{
const sp<IAfThreadBase> t = thread().promote();
if (t == nullptr) {
@@ -3175,7 +3156,7 @@
if (mThreadType == IAfThreadBase::SPATIALIZER) {
if (c->sessionId() == AUDIO_SESSION_OUTPUT_STAGE) {
- if (c->isFirstEffect_l(id)) {
+ if (c->isFirstEffect(id)) {
return t->mixerChannelMask();
} else {
return t->channelMask();
@@ -3243,8 +3224,7 @@
size_t EffectChain::EffectCallback::frameCount() const {
const sp<IAfThreadBase> t = thread().promote();
if (t == nullptr) {
- // frameCount cannot be zero.
- return 1;
+ return 0;
}
return t->frameCount();
}
diff --git a/services/audioflinger/Effects.h b/services/audioflinger/Effects.h
index 505f3b3..5e527d3 100644
--- a/services/audioflinger/Effects.h
+++ b/services/audioflinger/Effects.h
@@ -234,9 +234,9 @@
bool isSpatializer() const final;
status_t setHapticScale_l(int id, os::HapticScale hapticScale) final
- REQUIRES(audio_utils::EffectChain_Mutex) EXCLUDES_EffectBase_Mutex;
+ REQUIRES(audio_utils::ThreadBase_Mutex) EXCLUDES_EffectBase_Mutex;
status_t setVibratorInfo_l(const media::AudioVibratorInfo& vibratorInfo) final
- REQUIRES(audio_utils::EffectChain_Mutex) EXCLUDES_EffectBase_Mutex;
+ 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;
@@ -412,9 +412,7 @@
// it also provide it's own input buffer used by the track as accumulation buffer.
class EffectChain : public IAfEffectChain {
public:
- EffectChain(const sp<IAfThreadBase>& thread,
- audio_session_t sessionId,
- const sp<IAfThreadCallback>& afThreadCallback);
+ EffectChain(const sp<IAfThreadBase>& thread, audio_session_t sessionId);
void process_l() final REQUIRES(audio_utils::EffectChain_Mutex);
@@ -422,25 +420,25 @@
return mMutex;
}
- status_t createEffect(sp<IAfEffectModule>& effect, effect_descriptor_t* desc, int id,
+ status_t createEffect_l(sp<IAfEffectModule>& effect, effect_descriptor_t* desc, int id,
audio_session_t sessionId, bool pinned) final
- EXCLUDES_EffectChain_Mutex;
- status_t addEffect(const sp<IAfEffectModule>& handle) final
- EXCLUDES_EffectChain_Mutex;
+ REQUIRES(audio_utils::ThreadBase_Mutex) EXCLUDES_EffectChain_Mutex;
status_t addEffect_l(const sp<IAfEffectModule>& handle) final
- REQUIRES(audio_utils::EffectChain_Mutex);
- size_t removeEffect(const sp<IAfEffectModule>& handle, bool release = false) final
- EXCLUDES_EffectChain_Mutex;
+ 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(effect_descriptor_t* descriptor) const final
- EXCLUDES_EffectChain_Mutex;
+ 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) EXCLUDES_EffectChain_Mutex;
+ REQUIRES(audio_utils::ThreadBase_Mutex);
sp<IAfEffectModule> getEffectFromType_l(const effect_uuid_t* type) const final
- REQUIRES(audio_utils::ThreadBase_Mutex) EXCLUDES_EffectChain_Mutex;
+ 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
@@ -448,13 +446,11 @@
bool force = false) final EXCLUDES_EffectChain_Mutex;
void resetVolume_l() final REQUIRES(audio_utils::EffectChain_Mutex);
void setDevices_l(const AudioDeviceTypeAddrVector& devices) final
- REQUIRES(audio_utils::ThreadBase_Mutex) EXCLUDES_EffectChain_Mutex;
+ REQUIRES(audio_utils::ThreadBase_Mutex);
void setInputDevice_l(const AudioDeviceTypeAddr& device) final
- REQUIRES(audio_utils::ThreadBase_Mutex) EXCLUDES_EffectChain_Mutex;
- void setMode_l(audio_mode_t mode) final
- REQUIRES(audio_utils::ThreadBase_Mutex) EXCLUDES_EffectChain_Mutex;
- void setAudioSource_l(audio_source_t source) final
- REQUIRES(audio_utils::ThreadBase_Mutex) EXCLUDES_EffectChain_Mutex;
+ 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;
@@ -521,11 +517,8 @@
bool isCompatibleWithThread_l(const sp<IAfThreadBase>& thread) const final
REQUIRES(audio_utils::ThreadBase_Mutex) EXCLUDES_EffectChain_Mutex;
- bool containsHapticGeneratingEffect() final
- EXCLUDES_EffectChain_Mutex;
-
- bool containsHapticGeneratingEffect_l() final
- REQUIRES(audio_utils::EffectChain_Mutex);
+ // Requires either IAfThreadBase::mutex() or EffectChain::mutex() held
+ bool containsHapticGeneratingEffect_l() final;
void setHapticScale_l(int id, os::HapticScale hapticScale) final
REQUIRES(audio_utils::ThreadBase_Mutex) EXCLUDES_EffectChain_Mutex;
@@ -534,19 +527,15 @@
wp<IAfThreadBase> thread() const final { return mEffectCallback->thread(); }
- bool isFirstEffect_l(int id) const final REQUIRES(audio_utils::EffectChain_Mutex) {
+ bool isFirstEffect(int id) const final {
return !mEffects.isEmpty() && id == mEffects[0]->id();
}
void dump(int fd, const Vector<String16>& args) const final;
- size_t numberOfEffects() const final {
- audio_utils::lock_guard _l(mutex());
- return mEffects.size();
- }
+ size_t numberOfEffects() const final { return mEffects.size(); }
sp<IAfEffectModule> getEffectModule(size_t index) const final {
- audio_utils::lock_guard _l(mutex());
return mEffects[index];
}
@@ -571,13 +560,11 @@
// Note: ctors taking a weak pointer to their owner must not promote it
// during construction (but may keep a reference for later promotion).
EffectCallback(const wp<EffectChain>& owner,
- const sp<IAfThreadBase>& thread,
- const sp<IAfThreadCallback>& afThreadCallback) // we take a sp<> but store a wp<>.
+ const sp<IAfThreadBase>& thread) // we take a sp<> but store a wp<>.
: mChain(owner)
- , mThread(thread), mAfThreadCallback(afThreadCallback) {
- if (thread != nullptr) {
- mThreadType = thread->type();
- }
+ , mThread(thread) {
+ mThreadType = thread->type();
+ mAfThreadCallback = thread->afThreadCallback();
}
status_t createEffectHal(const effect_uuid_t *pEffectUuid,
@@ -619,9 +606,6 @@
wp<IAfEffectChain> chain() const final { return mChain; }
bool isAudioPolicyReady() const final {
- if (mAfThreadCallback == nullptr) {
- return false;
- }
return mAfThreadCallback->isAudioPolicyReady();
}
@@ -629,10 +613,8 @@
void setThread(const sp<IAfThreadBase>& thread) {
mThread = thread;
- if (thread != nullptr) {
- mThreadType = thread->type();
- mAfThreadCallback = thread->afThreadCallback();
- }
+ mThreadType = thread->type();
+ mAfThreadCallback = thread->afThreadCallback();
}
bool hasThreadAttached() const {
return thread().promote() != nullptr;
@@ -641,7 +623,7 @@
const wp<IAfEffectChain> mChain;
mediautils::atomic_wp<IAfThreadBase> mThread;
sp<IAfThreadCallback> mAfThreadCallback;
- IAfThreadBase::type_t mThreadType = IAfThreadBase::MIXER;
+ IAfThreadBase::type_t mThreadType;
};
DISALLOW_COPY_AND_ASSIGN(EffectChain);
@@ -657,8 +639,8 @@
// get a list of effect modules to suspend when an effect of the type
// passed is enabled.
- void getSuspendEligibleEffects(Vector<sp<IAfEffectModule>>& effects)
- EXCLUDES_EffectChain_Mutex;
+ void getSuspendEligibleEffects_l(Vector<sp<IAfEffectModule>>& effects)
+ REQUIRES(audio_utils::ThreadBase_Mutex);
// get an effect module if it is currently enable
sp<IAfEffectModule> getEffectIfEnabled_l(const effect_uuid_t* type)
@@ -666,7 +648,8 @@
// 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_l(const effect_uuid_t* type)
REQUIRES(audio_utils::ThreadBase_Mutex);
@@ -679,15 +662,15 @@
void setVolumeForOutput_l(uint32_t left, uint32_t right)
REQUIRES(audio_utils::EffectChain_Mutex);
- ssize_t getInsertIndex_l(const effect_descriptor_t& desc)
- REQUIRES(audio_utils::EffectChain_Mutex);
+ 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
REQUIRES(audio_utils::EffectChain_Mutex);
// mutex protecting effect list
mutable audio_utils::mutex mMutex{audio_utils::MutexOrder::kEffectChain_Mutex};
- Vector<sp<IAfEffectModule>> mEffects GUARDED_BY(mutex()); // list of effect modules
+ Vector<sp<IAfEffectModule>> mEffects; // list of effect modules
audio_session_t mSessionId; // audio session ID
sp<EffectBufferHalInterface> mInBuffer; // chain input buffer
sp<EffectBufferHalInterface> mOutBuffer; // chain output buffer
diff --git a/services/audioflinger/IAfEffect.h b/services/audioflinger/IAfEffect.h
index 0c8e9e3..fd4dd62 100644
--- a/services/audioflinger/IAfEffect.h
+++ b/services/audioflinger/IAfEffect.h
@@ -181,9 +181,9 @@
virtual bool isSpatializer() const = 0;
virtual status_t setHapticScale_l(int id, os::HapticScale hapticScale)
- REQUIRES(audio_utils::EffectChain_Mutex) EXCLUDES_EffectBase_Mutex = 0;
+ REQUIRES(audio_utils::ThreadBase_Mutex) EXCLUDES_EffectBase_Mutex = 0;
virtual status_t setVibratorInfo_l(const media::AudioVibratorInfo& vibratorInfo)
- REQUIRES(audio_utils::EffectChain_Mutex) EXCLUDES_EffectBase_Mutex = 0;
+ 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;
@@ -218,8 +218,7 @@
public:
static sp<IAfEffectChain> create(
const sp<IAfThreadBase>& thread,
- audio_session_t sessionId,
- const sp<IAfThreadCallback>& afThreadCallback);
+ audio_session_t sessionId);
// special key used for an entry in mSuspendedEffects keyed vector
// corresponding to a suspend all request.
@@ -233,36 +232,35 @@
virtual audio_utils::mutex& mutex() const RETURN_CAPABILITY(audio_utils::EffectChain_Mutex) = 0;
- virtual status_t createEffect(sp<IAfEffectModule>& effect, effect_descriptor_t* desc, int id,
+ virtual status_t createEffect_l(sp<IAfEffectModule>& effect, effect_descriptor_t* desc, int id,
audio_session_t sessionId, bool pinned)
- EXCLUDES_EffectChain_Mutex = 0;
+ REQUIRES(audio_utils::ThreadBase_Mutex) EXCLUDES_EffectChain_Mutex = 0;
- virtual status_t addEffect(const sp<IAfEffectModule>& handle)
- EXCLUDES_EffectChain_Mutex = 0;
virtual status_t addEffect_l(const sp<IAfEffectModule>& handle)
- REQUIRES(audio_utils::EffectChain_Mutex) = 0;
- virtual size_t removeEffect(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(effect_descriptor_t* descriptor) const
- EXCLUDES_EffectChain_Mutex = 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) EXCLUDES_EffectChain_Mutex = 0;
+ REQUIRES(audio_utils::ThreadBase_Mutex) = 0;
virtual sp<IAfEffectModule> getEffectFromType_l(const effect_uuid_t* type) const
- REQUIRES(audio_utils::ThreadBase_Mutex) EXCLUDES_EffectChain_Mutex = 0;
+ 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)
- REQUIRES(audio_utils::ThreadBase_Mutex) EXCLUDES_EffectChain_Mutex = 0;
+ REQUIRES(audio_utils::ThreadBase_Mutex) = 0;
virtual void setInputDevice_l(const AudioDeviceTypeAddr& device)
- REQUIRES(audio_utils::ThreadBase_Mutex) EXCLUDES_EffectChain_Mutex = 0;
- virtual void setMode_l(audio_mode_t mode)
- REQUIRES(audio_utils::ThreadBase_Mutex) EXCLUDES_EffectChain_Mutex = 0;
+ 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;
@@ -319,11 +317,7 @@
virtual bool isCompatibleWithThread_l(const sp<IAfThreadBase>& thread) const
REQUIRES(audio_utils::ThreadBase_Mutex) EXCLUDES_EffectChain_Mutex = 0;
- virtual bool containsHapticGeneratingEffect()
- EXCLUDES_EffectChain_Mutex = 0;
-
- virtual bool containsHapticGeneratingEffect_l()
- REQUIRES(audio_utils::EffectChain_Mutex) = 0;
+ virtual bool containsHapticGeneratingEffect_l() = 0;
virtual void setHapticScale_l(int id, os::HapticScale hapticScale)
REQUIRES(audio_utils::ThreadBase_Mutex) EXCLUDES_EffectChain_Mutex = 0;
@@ -333,7 +327,7 @@
virtual wp<IAfThreadBase> thread() const = 0;
virtual void setThread(const sp<IAfThreadBase>& thread) EXCLUDES_EffectChain_Mutex = 0;
- virtual bool isFirstEffect_l(int id) const REQUIRES(audio_utils::EffectChain_Mutex) = 0;
+ virtual bool isFirstEffect(int id) const = 0;
virtual size_t numberOfEffects() const = 0;
virtual sp<IAfEffectModule> getEffectModule(size_t index) const = 0;
diff --git a/services/audioflinger/Threads.cpp b/services/audioflinger/Threads.cpp
index ef6621e..f1be3976 100644
--- a/services/audioflinger/Threads.cpp
+++ b/services/audioflinger/Threads.cpp
@@ -1662,12 +1662,12 @@
if (chain == 0) {
// create a new chain for this session
ALOGV("createEffect_l() new effect chain for session %d", sessionId);
- chain = IAfEffectChain::create(this, sessionId, mAfThreadCallback);
+ chain = IAfEffectChain::create(this, sessionId);
addEffectChain_l(chain);
chain->setStrategy(getStrategyForSession_l(sessionId));
chainCreated = true;
} else {
- effect = chain->getEffectFromDesc(desc);
+ effect = chain->getEffectFromDesc_l(desc);
}
ALOGV("createEffect_l() got effect %p on chain %p", effect.get(), chain.get());
@@ -1675,7 +1675,7 @@
if (effect == 0) {
effectId = mAfThreadCallback->nextUniqueId(AUDIO_UNIQUE_ID_USE_EFFECT);
// create a new effect module if none present in the chain
- lStatus = chain->createEffect(effect, desc, effectId, sessionId, pinned);
+ lStatus = chain->createEffect_l(effect, desc, effectId, sessionId, pinned);
if (lStatus != NO_ERROR) {
goto Exit;
}
@@ -1693,7 +1693,6 @@
const std::optional<media::AudioVibratorInfo> defaultVibratorInfo =
std::move(mAfThreadCallback->getDefaultVibratorInfo_l());
if (defaultVibratorInfo) {
- audio_utils::lock_guard _cl(chain->mutex());
// Only set the vibrator info when it is a valid one.
effect->setVibratorInfo_l(*defaultVibratorInfo);
}
@@ -1715,7 +1714,7 @@
if (!probe && lStatus != NO_ERROR && lStatus != ALREADY_EXISTS) {
audio_utils::lock_guard _l(mutex());
if (effectCreated) {
- chain->removeEffect(effect);
+ chain->removeEffect_l(effect);
}
if (chainCreated) {
removeEffectChain_l(chain);
@@ -1816,7 +1815,7 @@
if (chain == 0) {
// create a new chain for this session
ALOGV("%s: new effect chain for session %d", __func__, sessionId);
- chain = IAfEffectChain::create(this, sessionId, mAfThreadCallback);
+ chain = IAfEffectChain::create(this, sessionId);
addEffectChain_l(chain);
chain->setStrategy(getStrategyForSession_l(sessionId));
chainCreated = true;
@@ -1831,7 +1830,7 @@
effect->setOffloaded_l(mType == OFFLOAD, mId);
- status_t status = chain->addEffect(effect);
+ status_t status = chain->addEffect_l(effect);
if (status != NO_ERROR) {
if (chainCreated) {
removeEffectChain_l(chain);
@@ -1858,7 +1857,7 @@
sp<IAfEffectChain> chain = effect->getCallback()->chain().promote();
if (chain != 0) {
// remove effect chain if removing last effect
- if (chain->removeEffect(effect, release) == 0) {
+ if (chain->removeEffect_l(effect, release) == 0) {
removeEffectChain_l(chain);
}
} else {
@@ -2898,7 +2897,7 @@
sp<IAfEffectChain> chain = getEffectChain_l(track->sessionId());
if (mHapticChannelMask != AUDIO_CHANNEL_NONE
&& ((track->channelMask() & AUDIO_CHANNEL_HAPTIC_ALL) != AUDIO_CHANNEL_NONE
- || (chain != nullptr && chain->containsHapticGeneratingEffect()))) {
+ || (chain != nullptr && chain->containsHapticGeneratingEffect_l()))) {
// Unlock due to VibratorService will lock for this call and will
// call Tracks.mute/unmute which also require thread's lock.
mutex().unlock();
@@ -4801,7 +4800,7 @@
}
if (mHapticChannelCount > 0 &&
((track->channelMask() & AUDIO_CHANNEL_HAPTIC_ALL) != AUDIO_CHANNEL_NONE
- || (chain != nullptr && chain->containsHapticGeneratingEffect()))) {
+ || (chain != nullptr && chain->containsHapticGeneratingEffect_l()))) {
mutex().unlock();
// Unlock due to VibratorService will lock for this call and will
// call Tracks.mute/unmute which also require thread's lock.
diff --git a/services/audiopolicy/managerdefault/AudioPolicyManager.cpp b/services/audiopolicy/managerdefault/AudioPolicyManager.cpp
index bee1e8e..154172a 100644
--- a/services/audiopolicy/managerdefault/AudioPolicyManager.cpp
+++ b/services/audiopolicy/managerdefault/AudioPolicyManager.cpp
@@ -3577,7 +3577,7 @@
int session,
int id)
{
- if (session != AUDIO_SESSION_DEVICE && io != AUDIO_IO_HANDLE_NONE) {
+ if (session != AUDIO_SESSION_DEVICE) {
ssize_t index = mOutputs.indexOfKey(io);
if (index < 0) {
index = mInputs.indexOfKey(io);