Merge "Add DeviceffectHandle mutex" into main
diff --git a/audio_utils/include/audio_utils/mutex.h b/audio_utils/include/audio_utils/mutex.h
index d159c3b..f656cfe 100644
--- a/audio_utils/include/audio_utils/mutex.h
+++ b/audio_utils/include/audio_utils/mutex.h
@@ -60,24 +60,25 @@
     kAudioFlinger_Mutex = 8,
     kDeviceEffectManager_Mutex = 9,
     kDeviceEffectProxy_ProxyMutex = 10,
-    kPatchCommandThread_Mutex = 11,
-    kThreadBase_Mutex = 12,
-    kAudioFlinger_ClientMutex = 13,
-    kEffectChain_Mutex = 14,
-    kEffectBase_Mutex = 15,
-    kAudioFlinger_HardwareMutex = 16,
-    kMelReporter_Mutex = 17,
-    kAudioFlinger_UnregisteredWritersMutex = 18,
-    kAsyncCallbackThread_Mutex = 19,
-    kConfigEvent_Mutex = 20,
-    kOutputTrack_TrackMetadataMutex = 21,
-    kPassthruPatchRecord_ReadMutex = 22,
-    kPatchCommandThread_ListenerMutex = 23,
-    kPlaybackThread_AudioTrackCbMutex = 24,
-    kAudioPolicyService_NotificationClientsMutex = 25,
-    kMediaLogNotifier_Mutex = 26,
-    kOtherMutex = 27,
-    kSize = 28,
+    kDeviceEffectHandle_Mutex = 11,
+    kPatchCommandThread_Mutex = 12,
+    kThreadBase_Mutex = 13,
+    kAudioFlinger_ClientMutex = 14,
+    kEffectChain_Mutex = 15,
+    kEffectBase_Mutex = 16,
+    kAudioFlinger_HardwareMutex = 17,
+    kMelReporter_Mutex = 18,
+    kAudioFlinger_UnregisteredWritersMutex = 19,
+    kAsyncCallbackThread_Mutex = 20,
+    kConfigEvent_Mutex = 21,
+    kOutputTrack_TrackMetadataMutex = 22,
+    kPassthruPatchRecord_ReadMutex = 23,
+    kPatchCommandThread_ListenerMutex = 24,
+    kPlaybackThread_AudioTrackCbMutex = 25,
+    kAudioPolicyService_NotificationClientsMutex = 26,
+    kMediaLogNotifier_Mutex = 27,
+    kOtherMutex = 28,
+    kSize = 29,
 };
 
 // Lock by name
@@ -93,6 +94,7 @@
     "AudioFlinger_Mutex",
     "DeviceEffectManager_Mutex",
     "DeviceEffectProxy_ProxyMutex",
+    "DeviceEffectHandle_Mutex",
     "PatchCommandThread_Mutex",
     "ThreadBase_Mutex",
     "AudioFlinger_ClientMutex",
@@ -140,8 +142,10 @@
         ACQUIRED_AFTER(android::audio_utils::AudioFlinger_Mutex);
 inline mutex* DeviceEffectProxy_ProxyMutex
         ACQUIRED_AFTER(android::audio_utils::DeviceEffectManager_Mutex);
-inline mutex* PatchCommandThread_Mutex
+inline mutex* DeviceEffectHandle_Mutex
         ACQUIRED_AFTER(android::audio_utils::DeviceEffectProxy_ProxyMutex);
+inline mutex* PatchCommandThread_Mutex
+        ACQUIRED_AFTER(android::audio_utils::DeviceEffectHandle_Mutex);
 inline mutex* ThreadBase_Mutex
         ACQUIRED_AFTER(android::audio_utils::PatchCommandThread_Mutex);
 inline mutex* AudioFlinger_ClientMutex
@@ -277,8 +281,14 @@
     EXCLUDES(android::audio_utils::PatchCommandThread_Mutex) \
     EXCLUDES_BELOW_PatchCommandThread_Mutex
 
-#define EXCLUDES_BELOW_DeviceEffectProxy_ProxyMutex \
+#define EXCLUDES_BELOW_DeviceEffectHandle_Mutex \
     EXCLUDES_PatchCommandThread_Mutex
+#define EXCLUDES_DeviceEffectHandle_Mutex \
+    EXCLUDES(android::audio_utils::DeviceEffectHandle_Mutex) \
+    EXCLUDES_BELOW_DeviceEffectHandle_Mutex
+
+#define EXCLUDES_BELOW_DeviceEffectProxy_ProxyMutex \
+    EXCLUDES_DeviceEffectHandle_Mutex
 #define EXCLUDES_DeviceEffectProxy_ProxyMutex \
     EXCLUDES(android::audio_utils::DeviceEffectProxy_ProxyMutex) \
     EXCLUDES_BELOW_DeviceEffectProxy_ProxyMutex
diff --git a/audio_utils/tests/generate_mutex_order.cpp b/audio_utils/tests/generate_mutex_order.cpp
index 734597d..8dde2b8 100644
--- a/audio_utils/tests/generate_mutex_order.cpp
+++ b/audio_utils/tests/generate_mutex_order.cpp
@@ -34,6 +34,7 @@
   // 5) EffectHandle -> ThreadBase -> EffectChain -> EffectBase(EffectModule)
   // 6) AudioFlinger::mutex() -> DeviceEffectManager -> DeviceEffectProxy -> EffectChain
   //    -> AudioFlinger::hardwareMutex() when adding/removing effect to/from HAL
+  // 7) AudioFlinger -> DeviceEffectManager -> DeviceEffectProxy -> DeviceEffectHandle
 
   "Spatializer_Mutex",         // AP - must come before EffectHandle_Mutex
   "AudioPolicyEffects_Mutex",  // AP - never hold AudioPolicyEffects_Mutex while calling APS,
@@ -50,6 +51,7 @@
   "AudioFlinger_Mutex",            // AF
   "DeviceEffectManager_Mutex",     // AF
   "DeviceEffectProxy_ProxyMutex",  // AF: used for device effects (which have no chain).
+  "DeviceEffectHandle_Mutex",      // AF: used for device effects when controlled internally.
   "PatchCommandThread_Mutex",      // AF
   "ThreadBase_Mutex",              // AF
   "AudioFlinger_ClientMutex",      // AF