+
+static DWORD dsound_dwSize;
+static DWORD dsound_dwSize2;
+static DWORD *dsound_pbuf;
+static DWORD *dsound_pbuf2;
+
+void *S_LockBuffer(void)
+{
+ int reps;
+ HRESULT hresult;
+ DWORD dwStatus;
+
+ if (pDSBuf)
+ {
+ // if the buffer was lost or stopped, restore it and/or restart it
+ if (pDSBuf->lpVtbl->GetStatus (pDSBuf, &dwStatus) != DS_OK)
+ Con_Print("Couldn't get sound buffer status\n");
+
+ if (dwStatus & DSBSTATUS_BUFFERLOST)
+ pDSBuf->lpVtbl->Restore (pDSBuf);
+
+ if (!(dwStatus & DSBSTATUS_PLAYING))
+ pDSBuf->lpVtbl->Play(pDSBuf, 0, 0, DSBPLAY_LOOPING);
+
+ reps = 0;
+
+ while ((hresult = pDSBuf->lpVtbl->Lock(pDSBuf, 0, gSndBufSize, (LPVOID*)&dsound_pbuf, &dsound_dwSize, (LPVOID*)&dsound_pbuf2, &dsound_dwSize2, 0)) != DS_OK)
+ {
+ if (hresult != DSERR_BUFFERLOST)
+ {
+ Con_Print("S_LockBuffer: DS: Lock Sound Buffer Failed\n");
+ S_Shutdown ();
+ S_Startup ();
+ return NULL;
+ }
+
+ if (++reps > 10000)
+ {
+ Con_Print("S_LockBuffer: DS: couldn't restore buffer\n");
+ S_Shutdown ();
+ S_Startup ();
+ return NULL;
+ }
+ }
+ return dsound_pbuf;
+ }
+ else if (wav_init)
+ return shm->buffer;
+ else
+ return NULL;
+}
+
+void S_UnlockBuffer(void)
+{
+ if (pDSBuf)
+ pDSBuf->lpVtbl->Unlock(pDSBuf, dsound_pbuf, dsound_dwSize, dsound_pbuf2, dsound_dwSize2);
+}
+