X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=snd_win.c;h=2fed37be8279b8dda4ac6dcdf30e56f7e9a7f2ae;hb=12a3c44a3e0403d4806d8803cc1469e7c822a975;hp=1a725ebbabf36f4852b7510beb153cf82e2760bd;hpb=e4b3858e7aca0ead91be1d8f675db084d025abad;p=xonotic%2Fdarkplaces.git diff --git a/snd_win.c b/snd_win.c index 1a725ebb..2fed37be 100644 --- a/snd_win.c +++ b/snd_win.c @@ -207,11 +207,9 @@ sndinitstat SNDDMA_InitDirect (void) format.nChannels = shm->channels; format.wBitsPerSample = shm->samplebits; format.nSamplesPerSec = shm->speed; - format.nBlockAlign = format.nChannels - *format.wBitsPerSample / 8; + format.nBlockAlign = format.nChannels * format.wBitsPerSample / 8; format.cbSize = 0; - format.nAvgBytesPerSec = format.nSamplesPerSec - *format.nBlockAlign; + format.nAvgBytesPerSec = format.nSamplesPerSec * format.nBlockAlign; if (!hInstDS) { @@ -391,7 +389,6 @@ sndinitstat SNDDMA_InitDirect (void) } memset(lpData, 0, dwSize); -// lpData[4] = lpData[5] = 0x7f; // force a pop for debugging pDSBuf->lpVtbl->Unlock(pDSBuf, lpData, dwSize, NULL, 0); @@ -621,12 +618,7 @@ qboolean SNDDMA_Init(void) snd_firsttime = false; if (!dsound_init && !wav_init) - { -// if (snd_firsttime) -// Con_SafePrintf ("No sound device initialized\n"); - return 0; - } return 1; } @@ -656,6 +648,8 @@ int SNDDMA_GetDMAPos(void) { s = snd_sent * WAV_BUFFER_SIZE; } + else + s = 0; s >>= sample16; @@ -707,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; + } } } @@ -735,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); +} +