From 9a472ba3c1c5b53bb10538b30ac4496c739c16d6 Mon Sep 17 00:00:00 2001 From: Raphael Junqueira Date: Thu, 27 May 2004 01:54:16 +0000 Subject: [PATCH] - don't use a stupid "while (1);" thread when DMPerformance MSG Queue empty - try to use latency and MSG synchro for timeout (but as i'm not a sound expert don't expect too much) --- dlls/dmime/performance.c | 34 ++++++++++++++++++++++++++-------- 1 file changed, 26 insertions(+), 8 deletions(-) diff --git a/dlls/dmime/performance.c b/dlls/dmime/performance.c index a7887b1d78..9bb35f9384 100644 --- a/dlls/dmime/performance.c +++ b/dlls/dmime/performance.c @@ -50,35 +50,41 @@ struct DMUS_PMSGItem { #define PROCESSMSG_ADD (WM_APP + 4) -static void ProceedMsg(IDirectMusicPerformance8Impl* This, DMUS_PMSGItem* cur) { +static DMUS_PMSGItem* ProceedMsg(IDirectMusicPerformance8Impl* This, DMUS_PMSGItem* cur) { if (cur->pMsg.dwType == DMUS_PMSGT_NOTIFICATION) { SetEvent(This->hNotification); } DMUS_ItemRemoveFromQueue(This, cur); switch (cur->pMsg.dwType) { + case DMUS_PMSGT_WAVE: + case DMUS_PMSGT_TEMPO: case DMUS_PMSGT_STOP: default: FIXME("Unhandled PMsg Type: 0x%lx\n", cur->pMsg.dwType); break; } - HeapFree(GetProcessHeap(), 0, cur); + return cur; } static DWORD WINAPI ProcessMsgThread(LPVOID lpParam) { IDirectMusicPerformance8Impl* This = (IDirectMusicPerformance8Impl*) lpParam; - /*DWORD timeOut = INFINITE;*/ + DWORD timeOut = INFINITE; MSG msg; HRESULT hr; + REFERENCE_TIME rtLastTime; REFERENCE_TIME rtCurTime; DMUS_PMSGItem* it = NULL; + DMUS_PMSGItem* cur = NULL; DMUS_PMSGItem* it_next = NULL; while (TRUE) { DWORD dwDec = This->rtLatencyTime + This->dwBumperLength; - /*if (timeOut > 0) MsgWaitForMultipleObjects(0, NULL, FALSE, timeOut, QS_POSTMESSAGE|QS_SENDMESSAGE|QS_TIMER);*/ - + if (timeOut > 0) MsgWaitForMultipleObjects(0, NULL, FALSE, timeOut, QS_POSTMESSAGE|QS_SENDMESSAGE|QS_TIMER); + timeOut = INFINITE; + EnterCriticalSection(&This->safe); + rtLastTime = rtCurTime; hr = IDirectMusicPerformance8Impl_GetTime((IDirectMusicPerformance8*) This, &rtCurTime, NULL); if (FAILED(hr)) { goto outrefresh; @@ -86,15 +92,24 @@ static DWORD WINAPI ProcessMsgThread(LPVOID lpParam) { for (it = This->imm_head; NULL != it; ) { it_next = it->next; - ProceedMsg(This, it); + cur = ProceedMsg(This, it); + if (NULL != cur) { + HeapFree(GetProcessHeap(), 0, cur); + } it = it_next; } for (it = This->head; NULL != it && it->rtItemTime < rtCurTime + dwDec; ) { it_next = it->next; - ProceedMsg(This, it); + cur = ProceedMsg(This, it); + if (NULL != cur) { + HeapFree(GetProcessHeap(), 0, cur); + } it = it_next; } + if (NULL != it) { + timeOut = ( it->rtItemTime - rtCurTime ) + This->rtLatencyTime; + } outrefresh: LeaveCriticalSection(&This->safe); @@ -122,6 +137,9 @@ outrefresh: } } } + + /** here we should run a little of current AudioPath */ + } outofthread: @@ -974,7 +992,7 @@ HRESULT WINAPI DMUSIC_CreateDirectMusicPerformanceImpl (LPCGUID lpcGUID, LPVOID /** * @see http://msdn.microsoft.com/archive/default.asp?url=/archive/en-us/directx9_c/directx/htm/latencyandbumpertime.asp */ - obj->rtLatencyTime = 1000; /* 1s TO FIX */ + obj->rtLatencyTime = 100; /* 100ms TO FIX */ obj->dwBumperLength = 50; /* 50ms default */ obj->dwPrepareTime = 1000; /* 1000ms default */ return IDirectMusicPerformance8Impl_QueryInterface ((LPDIRECTMUSICPERFORMANCE8)obj, lpcGUID, ppobj); -- 2.32.0.93.g670b81a890