Index: /trunk/src/VBox/Devices/Audio/DrvHostDSound.cpp
===================================================================
--- /trunk/src/VBox/Devices/Audio/DrvHostDSound.cpp	(revision 59058)
+++ /trunk/src/VBox/Devices/Audio/DrvHostDSound.cpp	(revision 59059)
@@ -461,37 +461,44 @@
 }
 
-static void directSoundPlayClose(PDRVHOSTDSOUND pThis, PDSOUNDSTREAMOUT pDSoundStrmOut)
-{
-    AssertPtrReturnVoid(pThis);
-    AssertPtrReturnVoid(pDSoundStrmOut);
+static HRESULT directSoundPlayClose(PDRVHOSTDSOUND pThis, PDSOUNDSTREAMOUT pDSoundStrmOut)
+{
+    AssertPtrReturn(pThis, E_POINTER);
+    AssertPtrReturn(pDSoundStrmOut, E_POINTER);
 
     DSLOG(("DSound: Closing playback stream %p, buffer %p\n", pDSoundStrmOut, pDSoundStrmOut->pDSB));
 
+    HRESULT hr = S_OK;
+
     if (pDSoundStrmOut->pDSB)
     {
-        HRESULT hr = IDirectSoundBuffer8_Stop(pDSoundStrmOut->pDSB);
-        if (FAILED(hr))
+        hr = IDirectSoundBuffer8_Stop(pDSoundStrmOut->pDSB);
+        if (SUCCEEDED(hr))
+        {
+#ifdef VBOX_WITH_AUDIO_CALLBACKS
+            if (pThis->aEvents[DSOUNDEVENT_OUTPUT] != NULL)
+            {
+                CloseHandle(pThis->aEvents[DSOUNDEVENT_OUTPUT]);
+                pThis->aEvents[DSOUNDEVENT_OUTPUT] = NULL;
+
+                if (pThis->cEvents)
+                    pThis->cEvents--;
+
+                pThis->pDSStrmOut = NULL;
+            }
+
+            int rc2 = dsoundNotifyThread(pThis, false /* fShutdown */);
+            AssertRC(rc2);
+#endif
+            IDirectSoundBuffer8_Release(pDSoundStrmOut->pDSB);
+            pDSoundStrmOut->pDSB = NULL;
+        }
+        else
             DSLOGREL(("DSound: Stop playback stream %p when closing %Rhrc\n", pDSoundStrmOut, hr));
-
-#ifdef VBOX_WITH_AUDIO_CALLBACKS
-        if (pThis->aEvents[DSOUNDEVENT_OUTPUT] != NULL)
-        {
-            CloseHandle(pThis->aEvents[DSOUNDEVENT_OUTPUT]);
-            pThis->aEvents[DSOUNDEVENT_OUTPUT] = NULL;
-
-            if (pThis->cEvents)
-                pThis->cEvents--;
-
-            pThis->pDSStrmOut = NULL;
-        }
-
-        int rc2 = dsoundNotifyThread(pThis, false /* fShutdown */);
-        AssertRC(rc2);
-#endif
-        IDirectSoundBuffer8_Release(pDSoundStrmOut->pDSB);
-        pDSoundStrmOut->pDSB = NULL;
-    }
-
-    directSoundPlayInterfaceRelease(pDSoundStrmOut);
+    }
+
+    if (SUCCEEDED(hr))
+        directSoundPlayInterfaceRelease(pDSoundStrmOut);
+
+    return hr;
 }
 
@@ -531,7 +538,7 @@
         DSBUFFERDESC bd;
         RT_ZERO(bd);
-        bd.dwSize        = sizeof(bd);
-        bd.lpwfxFormat   = &wfx;
-        bd.dwFlags       = DSBCAPS_GLOBALFOCUS | DSBCAPS_GETCURRENTPOSITION2;
+        bd.dwSize = sizeof(bd);
+        bd.lpwfxFormat = &wfx;
+        bd.dwFlags = DSBCAPS_GLOBALFOCUS | DSBCAPS_GETCURRENTPOSITION2;
 #ifdef VBOX_WITH_AUDIO_CALLBACKS
         bd.dwFlags      |= DSBCAPS_CTRLPOSITIONNOTIFY;
@@ -696,14 +703,20 @@
     /* pdwStatus is optional. */
 
+    bool fRestoreBuffer = false;
+
     DWORD dwStatus = 0;
     HRESULT hr = IDirectSoundBuffer8_GetStatus(pDSB, &dwStatus);
     if (SUCCEEDED(hr))
     {
-        if ((dwStatus & DSBSTATUS_BUFFERLOST) != 0)
-        {
-            hr = directSoundPlayRestore(pDSB);
-            if (SUCCEEDED(hr))
-                hr = IDirectSoundBuffer8_GetStatus(pDSB, &dwStatus);
-        }
+        fRestoreBuffer = RT_BOOL(dwStatus & DSBSTATUS_BUFFERLOST);
+    }
+    else if (hr == DSERR_BUFFERLOST)
+        fRestoreBuffer = true;
+
+    if (fRestoreBuffer)
+    {
+        hr = directSoundPlayRestore(pDSB);
+        if (SUCCEEDED(hr))
+            hr = IDirectSoundBuffer8_GetStatus(pDSB, &dwStatus);
     }
 
@@ -876,21 +889,28 @@
 }
 
-static void directSoundCaptureClose(PDSOUNDSTREAMIN pDSoundStrmIn)
-{
-    AssertPtrReturnVoid(pDSoundStrmIn);
+static HRESULT directSoundCaptureClose(PDSOUNDSTREAMIN pDSoundStrmIn)
+{
+    AssertPtrReturn(pDSoundStrmIn, E_POINTER);
 
     DSLOG(("DSound: pDSoundStrmIn=%p, pDSCB=%p\n", pDSoundStrmIn, pDSoundStrmIn->pDSCB));
 
+    HRESULT hr = S_OK;
+
     if (pDSoundStrmIn->pDSCB)
     {
-        HRESULT hr = IDirectSoundCaptureBuffer_Stop(pDSoundStrmIn->pDSCB);
-        if (FAILED(hr))
+        hr = IDirectSoundCaptureBuffer_Stop(pDSoundStrmIn->pDSCB);
+        if (SUCCEEDED(hr))
+        {
+            IDirectSoundCaptureBuffer8_Release(pDSoundStrmIn->pDSCB);
+            pDSoundStrmIn->pDSCB = NULL;
+        }
+        else
             DSLOGREL(("DSound: Stop capture buffer %Rhrc\n", hr));
-
-        IDirectSoundCaptureBuffer8_Release(pDSoundStrmIn->pDSCB);
-        pDSoundStrmIn->pDSCB = NULL;
-    }
-
-    directSoundCaptureInterfaceRelease(pDSoundStrmIn);
+    }
+
+    if (SUCCEEDED(hr))
+        directSoundCaptureInterfaceRelease(pDSoundStrmIn);
+
+    return hr;
 }
 
@@ -1332,5 +1352,5 @@
         DWORD cb1, cb2;
         HRESULT hr = directSoundPlayLock(pDSB, &pHstStrmOut->Props, pDSoundStrmOut->cbPlayWritePos, cbLive,
-                                         &pv1, &pv2, &cb1, &cb2, 0 /* dwFlags */);
+                                 &pv1, &pv2, &cb1, &cb2, 0 /* dwFlags */);
         if (FAILED(hr))
         {
@@ -1405,6 +1425,6 @@
     if (RT_SUCCESS(rc))
     {
-        if (pcSamplesPlayed)
-            *pcSamplesPlayed = cReadTotal;
+    if (pcSamplesPlayed)
+        *pcSamplesPlayed = cReadTotal;
     }
 
@@ -1419,6 +1439,6 @@
     directSoundPlayClose(pThis, pDSoundStrmOut);
 
-    pDSoundStrmOut->cbPlayWritePos       = 0;
-    pDSoundStrmOut->fRestartPlayback     = true;
+    pDSoundStrmOut->cbPlayWritePos = 0;
+    pDSoundStrmOut->fRestartPlayback = true;
     pDSoundStrmOut->csPlaybackBufferSize = 0;
 
@@ -1491,8 +1511,11 @@
             if (FAILED(hr))
             {
-                directSoundCaptureClose(pDSoundStrmIn);
-                directSoundCaptureOpen(pThis, pDSoundStrmIn);
-
-                hr = directSoundCaptureStart(pThis, pDSoundStrmIn);
+                hr = directSoundCaptureClose(pDSoundStrmIn);
+                if (SUCCEEDED(hr))
+                {
+                    hr = directSoundCaptureOpen(pThis, pDSoundStrmIn);
+                    if (SUCCEEDED(hr))
+                        hr = directSoundCaptureStart(pThis, pDSoundStrmIn);
+                }
             }
 
@@ -1517,5 +1540,5 @@
             rc = VERR_INVALID_PARAMETER;
             break;
-        }
+    }
     }
 
@@ -1538,8 +1561,8 @@
         if (pDSCB == NULL)
         {
-            pThis->fEnabledIn = false;
-
-            rc = VERR_NOT_AVAILABLE;
-            break;
+                pThis->fEnabledIn = false;
+
+                rc = VERR_NOT_AVAILABLE;
+                break;
         }
 
@@ -1555,6 +1578,6 @@
             }
 
-            rc = VERR_NOT_AVAILABLE;
-            break;
+                rc = VERR_NOT_AVAILABLE;
+                break;
         }
 
@@ -1570,5 +1593,5 @@
         DWORD csCaptured = dsoundRingDistance(csReadPos, pDSoundStrmIn->csCaptureReadPos, pDSoundStrmIn->csCaptureBufferSize);
         if (csCaptured == 0)
-            break;
+                break;
 
         /* Using as an intermediate not circular buffer. */
@@ -1580,5 +1603,5 @@
         {
             DSLOGF(("DSound: Capture buffer full\n"));
-            break;
+                break;
         }
 
@@ -1599,6 +1622,6 @@
         if (FAILED(hr))
         {
-            rc = VERR_ACCESS_DENIED;
-            break;
+                rc = VERR_ACCESS_DENIED;
+                break;
         }
 
@@ -1628,12 +1651,12 @@
         directSoundCaptureUnlock(pDSCB, pv1, pv2, cb1, cb2);
 
-        if (csWrittenTotal) /* Captured something? */
-            rc = AudioMixBufMixToParent(&pHstStrmIn->MixBuf, csWrittenTotal, &cCaptured);
+            if (csWrittenTotal) /* Captured something? */
+                rc = AudioMixBufMixToParent(&pHstStrmIn->MixBuf, csWrittenTotal, &cCaptured);
 
         if (RT_SUCCESS(rc))
         {
-            pDSoundStrmIn->csCaptureReadPos = (pDSoundStrmIn->csCaptureReadPos + cCaptured) % pDSoundStrmIn->csCaptureBufferSize;
+                pDSoundStrmIn->csCaptureReadPos = (pDSoundStrmIn->csCaptureReadPos + cCaptured) % pDSoundStrmIn->csCaptureBufferSize;
             DSLOGF(("DSound: Capture %ld (%ld+%ld), processed %RU32/%RU32\n",
-                    csCaptured, len1, len2, cCaptured, csWrittenTotal));
+                        csCaptured, len1, len2, cCaptured, csWrittenTotal));
         }
 
@@ -1870,5 +1893,5 @@
         CloseHandle(pThis->aEvents[DSOUNDEVENT_NOTIFY]);
         pThis->aEvents[DSOUNDEVENT_NOTIFY] = NULL;
-    }
+}
 #endif
 
@@ -1910,5 +1933,5 @@
                 DSLOGREL(("DSound: Waiting for thread to initialize failed with rc=%Rrc\n", rc));
         }
-        else
+    else
             DSLOGREL(("DSound: Creating thread failed with rc=%Rrc\n", rc));
 #else
@@ -2037,6 +2060,6 @@
     pThis->fEnabledOut = false;
 #ifdef VBOX_WITH_AUDIO_CALLBACKS
-    pThis->fStopped    = false;
-    pThis->fShutdown   = false;
+    pThis->fStopped  = false;
+    pThis->fShutdown = false;
 
     RT_ZERO(pThis->aEvents);
@@ -2068,5 +2091,5 @@
     "DirectSound Audio host driver",
     /* fFlags */
-    PDM_DRVREG_FLAGS_HOST_BITS_DEFAULT,
+     PDM_DRVREG_FLAGS_HOST_BITS_DEFAULT,
     /* fClass. */
     PDM_DRVREG_CLASS_AUDIO,
