Index: /trunk/src/VBox/Devices/Audio/DrvAudio.cpp
===================================================================
--- /trunk/src/VBox/Devices/Audio/DrvAudio.cpp	(revision 86594)
+++ /trunk/src/VBox/Devices/Audio/DrvAudio.cpp	(revision 86595)
@@ -1116,4 +1116,7 @@
  * Re-initializes the given stream if it is scheduled for this operation.
  *
+ * @note This caller must have entered the critical section of the driver instance,
+ *       needed for the host device (re-)enumeration.
+ *
  * @param   pThis               Pointer to driver instance.
  * @param   pStream             Stream to check and maybe re-initialize.
@@ -1133,6 +1136,14 @@
             if (pThis->fEnumerateDevices)
             {
+                /* Make sure to leave the driver's critical section before enumerating host stuff. */
+                int rc2 = RTCritSectLeave(&pThis->CritSect);
+                AssertRC(rc2);
+
                 /* Re-enumerate all host devices. */
                 drvAudioDevicesEnumerateInternal(pThis, true /* fLog */, NULL /* pDevEnum */);
+
+                /* Re-enter the critical section again. */
+                rc2 = RTCritSectEnter(&pThis->CritSect);
+                AssertRC(rc2);
 
                 pThis->fEnumerateDevices = false;
@@ -2097,4 +2108,6 @@
  * VERR_NOT_SUPPORTED if not being supported.
  *
+ * @note Must not hold the driver's critical section!
+ *
  * @returns IPRT status code.
  * @param   pThis               Driver instance to be called.
@@ -2104,4 +2117,6 @@
 static int drvAudioDevicesEnumerateInternal(PDRVAUDIO pThis, bool fLog, PPDMAUDIODEVICEENUM pDevEnum)
 {
+    AssertReturn(RTCritSectIsOwned(&pThis->CritSect) == false, VERR_WRONG_ORDER);
+
     int rc;
 
