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:
@@ -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();
|
||||||
|
Reference in New Issue
Block a user