1
0
mirror of https://github.com/XProger/OpenLara.git synced 2025-08-16 10:04:28 +02:00

#15 fix mmsystem deadlock

This commit is contained in:
XProger
2017-11-26 06:45:16 +03:00
parent a927da8d73
commit 4807dbbcc5

View File

@@ -171,7 +171,6 @@ void touchUpdate(HWND hWnd, HTOUCHINPUT hTouch, int count) {
bool sndReady; bool sndReady;
char *sndData; char *sndData;
CRITICAL_SECTION sndCS;
HWAVEOUT waveOut; HWAVEOUT waveOut;
WAVEFORMATEX waveFmt = { WAVE_FORMAT_PCM, 2, 44100, 44100 * 4, 4, 16, sizeof(waveFmt) }; WAVEFORMATEX waveFmt = { WAVE_FORMAT_PCM, 2, 44100, 44100 * 4, 4, 16, sizeof(waveFmt) };
WAVEHDR waveBuf[2]; WAVEHDR waveBuf[2];
@@ -179,41 +178,30 @@ WAVEHDR waveBuf[2];
void sndFree() { void sndFree() {
if (!sndReady) return; if (!sndReady) return;
sndReady = false; sndReady = false;
EnterCriticalSection(&sndCS);
waveOutUnprepareHeader(waveOut, &waveBuf[0], sizeof(WAVEHDR)); waveOutUnprepareHeader(waveOut, &waveBuf[0], sizeof(WAVEHDR));
waveOutUnprepareHeader(waveOut, &waveBuf[1], sizeof(WAVEHDR)); waveOutUnprepareHeader(waveOut, &waveBuf[1], sizeof(WAVEHDR));
waveOutReset(waveOut); waveOutReset(waveOut);
waveOutClose(waveOut); waveOutClose(waveOut);
delete[] sndData; delete[] sndData;
LeaveCriticalSection(&sndCS);
DeleteCriticalSection(&sndCS);
} }
void CALLBACK sndFill(HWAVEOUT waveOut, UINT uMsg, DWORD_PTR dwInstance, LPWAVEHDR waveBuf, DWORD dwParam2) { void sndFill(HWAVEOUT waveOut, LPWAVEHDR waveBuf) {
if (!sndReady) return; if (!sndReady) return;
if (uMsg == MM_WOM_CLOSE) {
sndFree();
return;
}
EnterCriticalSection(&sndCS);
waveOutUnprepareHeader(waveOut, waveBuf, sizeof(WAVEHDR)); waveOutUnprepareHeader(waveOut, waveBuf, sizeof(WAVEHDR));
Sound::fill((Sound::Frame*)waveBuf->lpData, SND_SIZE / 4); Sound::fill((Sound::Frame*)waveBuf->lpData, SND_SIZE / 4);
waveOutPrepareHeader(waveOut, waveBuf, sizeof(WAVEHDR)); waveOutPrepareHeader(waveOut, waveBuf, sizeof(WAVEHDR));
waveOutWrite(waveOut, waveBuf, sizeof(WAVEHDR)); waveOutWrite(waveOut, waveBuf, sizeof(WAVEHDR));
LeaveCriticalSection(&sndCS);
} }
void sndInit(HWND hwnd) { void sndInit(HWND hwnd) {
InitializeCriticalSection(&sndCS); if (waveOutOpen(&waveOut, WAVE_MAPPER, &waveFmt, (INT_PTR)hwnd, 0, CALLBACK_WINDOW) == MMSYSERR_NOERROR) {
if (waveOutOpen(&waveOut, WAVE_MAPPER, &waveFmt, (INT_PTR)sndFill, 0, CALLBACK_FUNCTION) == MMSYSERR_NOERROR) {
sndReady = true; sndReady = true;
sndData = new char[SND_SIZE * 2]; sndData = new char[SND_SIZE * 2];
memset(&waveBuf, 0, sizeof(waveBuf)); memset(&waveBuf, 0, sizeof(waveBuf));
for (int i = 0; i < 2; i++) { for (int i = 0; i < 2; i++) {
waveBuf[i].dwBufferLength = SND_SIZE; waveBuf[i].dwBufferLength = SND_SIZE;
waveBuf[i].lpData = sndData + SND_SIZE * i; waveBuf[i].lpData = sndData + SND_SIZE * i;
sndFill(waveOut, 0, 0, &waveBuf[i], 0); sndFill(waveOut, &waveBuf[i]);
} }
} else { } else {
sndReady = false; sndReady = false;
@@ -294,6 +282,10 @@ static LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lPara
case WM_TOUCH : case WM_TOUCH :
touchUpdate(hWnd, (HTOUCHINPUT)lParam, wParam); touchUpdate(hWnd, (HTOUCHINPUT)lParam, wParam);
break; break;
// sound
case MM_WOM_DONE :
sndFill((HWAVEOUT)wParam, (WAVEHDR*)lParam);
break;
default : default :
return DefWindowProc(hWnd, msg, wParam, lParam); return DefWindowProc(hWnd, msg, wParam, lParam);
} }
@@ -375,12 +367,10 @@ int main(int argc, char** argv) {
joyUpdate(); joyUpdate();
DWORD time = getTime(); DWORD time = getTime();
//if (time <= lastTime) if (time <= lastTime)
// continue; continue;
EnterCriticalSection(&sndCS);
Game::update((time - lastTime) * 0.001f); Game::update((time - lastTime) * 0.001f);
LeaveCriticalSection(&sndCS);
lastTime = time; lastTime = time;
Game::render(); Game::render();