X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fdarkplaces.git;a=blobdiff_plain;f=snd_win.c;h=2fed37be8279b8dda4ac6dcdf30e56f7e9a7f2ae;hp=bd74615125f4e35e130618f9d5e87fb31ab308f2;hb=b2f7fe6f3ec6934b89161592c5df77b3932f2698;hpb=ea7c24e1fb41f3b1df984ac0eed6881c9fde16f5 diff --git a/snd_win.c b/snd_win.c index bd746151..2fed37be 100644 --- a/snd_win.c +++ b/snd_win.c @@ -701,19 +701,19 @@ void SNDDMA_Submit(void) h = lpWaveHdr + ( snd_sent&WAV_MASK ); snd_sent++; - /* - * Now the data block can be sent to the output device. The - * waveOutWrite function returns immediately and waveform - * data is sent to the output device in the background. - */ - wResult = waveOutWrite(hWaveOut, h, sizeof(WAVEHDR)); + /* + * Now the data block can be sent to the output device. The + * waveOutWrite function returns immediately and waveform + * data is sent to the output device in the background. + */ + wResult = waveOutWrite(hWaveOut, h, sizeof(WAVEHDR)); if (wResult != MMSYSERR_NOERROR) - { + { Con_SafePrintf ("Failed to write block to device\n"); FreeSound (); - return; - } + return; + } } } @@ -729,3 +729,46 @@ void SNDDMA_Shutdown(void) FreeSound (); } +DWORD dsound_dwSize; +DWORD dsound_dwSize2; +DWORD *dsound_pbuf; +DWORD *dsound_pbuf2; +void *S_LockBuffer(void) +{ + int reps; + HRESULT hresult; + + if (pDSBuf) + { + reps = 0; + + while ((hresult = pDSBuf->lpVtbl->Lock(pDSBuf, 0, gSndBufSize, &dsound_pbuf, &dsound_dwSize, &dsound_pbuf2, &dsound_dwSize2, 0)) != DS_OK) + { + if (hresult != DSERR_BUFFERLOST) + { + Con_Printf ("S_LockBuffer: DS::Lock Sound Buffer Failed\n"); + S_Shutdown (); + S_Startup (); + return NULL; + } + + if (++reps > 10000) + { + Con_Printf ("S_LockBuffer: DS: couldn't restore buffer\n"); + S_Shutdown (); + S_Startup (); + return NULL; + } + } + return dsound_pbuf; + } + else + return shm->buffer; +} + +void S_UnlockBuffer() +{ + if (pDSBuf) + pDSBuf->lpVtbl->Unlock(pDSBuf, dsound_pbuf, dsound_dwSize, dsound_pbuf2, dsound_dwSize2); +} +