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