Module: wine Branch: refs/heads/master Commit: 2b3247a4243eaa5a75448ab446a37af4b7e952f4 URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=2b3247a4243eaa5a75448ab4...
Author: Robert Reif reif@earthlink.net Date: Tue May 30 18:14:18 2006 -0400
winmm: Always check for open and close enents in wave test.
Always check for open and close events. Send WM_APP message to thread to terminate it rather than TerminateThread. Fix CreateThread/waveOutOpen race by waiting for background thread to run before waveOutOpen is called. Add more non-hardware supported formats. There is a bug in wave mapper GetPosition when multiple headers are used and this helps trigger it.
---
dlls/winmm/tests/wave.c | 35 ++++++++++++++++++++++------------- dlls/winmm/tests/winmm_test.h | 3 +++ 2 files changed, 25 insertions(+), 13 deletions(-)
diff --git a/dlls/winmm/tests/wave.c b/dlls/winmm/tests/wave.c index f2972f0..3019472 100644 --- a/dlls/winmm/tests/wave.c +++ b/dlls/winmm/tests/wave.c @@ -535,14 +535,20 @@ static DWORD WINAPI callback_thread(LPVO { MSG msg;
+ SetEvent((HANDLE)lpParameter); + while (GetMessage(&msg, 0, 0, 0)) { UINT message = msg.message; /* for some reason XP sends a WM_USER message before WOM_OPEN */ ok (message == WOM_OPEN || message == WOM_DONE || - message == WOM_CLOSE || message == WM_USER, + message == WOM_CLOSE || message == WM_USER || message == WM_APP, "GetMessage returned unexpected message: %u\n", message); if (message == WOM_OPEN || message == WOM_DONE || message == WOM_CLOSE) SetEvent((HANDLE)lpParameter); + else if (message == WM_APP) { + SetEvent((HANDLE)lpParameter); + return 0; + } }
return 0; @@ -556,7 +562,7 @@ static void wave_out_test_deviceOut(int { HWAVEOUT wout; HANDLE hevent; - WAVEHDR *frags; + WAVEHDR *frags = 0; MMRESULT rc; DWORD volume; WORD nChannels = pwfx->nChannels; @@ -568,7 +574,8 @@ static void wave_out_test_deviceOut(int DWORD callback = 0; DWORD callback_instance = 0; HANDLE thread = 0; - BYTE * buffer; + DWORD thread_id; + char * buffer; DWORD length; DWORD frag_length; int i, j; @@ -585,9 +592,10 @@ static void wave_out_test_deviceOut(int callback = (DWORD)callback_func; callback_instance = (DWORD)hevent; } else if ((flags & CALLBACK_TYPEMASK) == CALLBACK_THREAD) { - DWORD thread_id; thread = CreateThread(NULL, 0, callback_thread, hevent, 0, &thread_id); if (thread) { + /* make sure thread is running */ + WaitForSingleObject(hevent,INFINITE); callback = thread_id; callback_instance = 0; } else { @@ -636,12 +644,10 @@ static void wave_out_test_deviceOut(int pwfx->wBitsPerSample,pwfx->nChannels, flags & WAVE_FORMAT_DIRECT ? "flags=WAVE_FORMAT_DIRECT" : flags & WAVE_MAPPED ? "flags=WAVE_MAPPED" : "", mmsys_error(rc)); - if (rc!=MMSYSERR_NOERROR) { - if ((flags & CALLBACK_TYPEMASK) == CALLBACK_THREAD) - TerminateThread(thread, 0); - CloseHandle(hevent); - return; - } + if (rc!=MMSYSERR_NOERROR) + goto EXIT; + + WaitForSingleObject(hevent,INFINITE);
ok(pwfx->nChannels==nChannels && pwfx->wBitsPerSample==wBitsPerSample && @@ -699,7 +705,6 @@ static void wave_out_test_deviceOut(int rc=waveOutSetVolume(wout,0x20002000); ok(has_volume ? rc==MMSYSERR_NOERROR : rc==MMSYSERR_NOTSUPPORTED, "waveOutSetVolume(%s): rc=%s\n",dev_name(device),wave_out_error(rc)); - WaitForSingleObject(hevent,INFINITE);
rc=waveOutSetVolume(wout,volume); ok(has_volume ? rc==MMSYSERR_NOERROR : rc==MMSYSERR_NOTSUPPORTED, @@ -779,8 +784,12 @@ static void wave_out_test_deviceOut(int rc=waveOutClose(wout); ok(rc==MMSYSERR_NOERROR,"waveOutClose(%s): rc=%s\n",dev_name(device), wave_out_error(rc)); - if ((flags & CALLBACK_TYPEMASK) == CALLBACK_THREAD) - TerminateThread(thread, 0); + WaitForSingleObject(hevent,INFINITE); +EXIT: + if ((flags & CALLBACK_TYPEMASK) == CALLBACK_THREAD) { + PostThreadMessage(thread_id, WM_APP, 0, 0); + WaitForSingleObject(hevent,INFINITE); + } CloseHandle(hevent); free(frags); } diff --git a/dlls/winmm/tests/winmm_test.h b/dlls/winmm/tests/winmm_test.h index e6c0242..177dc2e 100644 --- a/dlls/winmm/tests/winmm_test.h +++ b/dlls/winmm/tests/winmm_test.h @@ -43,6 +43,9 @@ static const unsigned int win_formats[][ {WAVE_FORMAT_1S08, 11025, 8, 2}, {WAVE_FORMAT_1M16, 11025, 16, 1}, {WAVE_FORMAT_1S16, 11025, 16, 2}, + {0, 12000, 8, 1}, + {0, 12000, 8, 2}, + {0, 12000, 16, 1}, {0, 12000, 16, 2}, {0, 16000, 8, 1}, {0, 16000, 8, 2},