Add thread safe annotation in audio flinger effects
Bug: 315995877
Test: atest AudioTrackTest AudioRecordTest audioeffect_tests
Change-Id: I90406c48660aef25ab4402a70a2a45deb6651335
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