diff --git a/dlls/dsound/dsound.c b/dlls/dsound/dsound.c index 824f581b9a4..065c377aa84 100644 --- a/dlls/dsound/dsound.c +++ b/dlls/dsound/dsound.c @@ -208,8 +208,9 @@ static ULONG DirectSoundDevice_Release(DirectSoundDevice * device) SetEvent(device->sleepev); if (device->thread) { - WaitForSingleObject(device->thread, INFINITE); + WaitForSingleObject(device->thread_finished, INFINITE); CloseHandle(device->thread); + CloseHandle(device->thread_finished); } CloseHandle(device->sleepev); @@ -384,6 +385,7 @@ static HRESULT DirectSoundDevice_Initialize(DirectSoundDevice ** ppDevice, LPCGU hr = DSOUND_PrimaryCreate(device); if (hr == DS_OK) { + device->thread_finished = CreateEventW(0, 0, 0, 0); device->thread = CreateThread(0, 0, DSOUND_mixthread, device, 0, 0); SetThreadPriority(device->thread, THREAD_PRIORITY_TIME_CRITICAL); } else diff --git a/dlls/dsound/dsound_private.h b/dlls/dsound/dsound_private.h index 9c58679e017..9c001eddd9e 100644 --- a/dlls/dsound/dsound_private.h +++ b/dlls/dsound/dsound_private.h @@ -108,6 +108,7 @@ struct DirectSoundDevice IAudioRenderClient *render; HANDLE sleepev, thread; + HANDLE thread_finished; struct list entry; }; diff --git a/dlls/dsound/mixer.c b/dlls/dsound/mixer.c index 8dbd15ad1a5..85ab14a3307 100644 --- a/dlls/dsound/mixer.c +++ b/dlls/dsound/mixer.c @@ -909,5 +909,6 @@ DWORD CALLBACK DSOUND_mixthread(void *p) DSOUND_PerformMix(dev); RtlReleaseResource(&(dev->buffer_list_lock)); } + SetEvent(dev->thread_finished); return 0; }