From 234558c2c7bcc815c43791acf6fdf4ad7262376d Mon Sep 17 00:00:00 2001 From: Ken Thomases Date: Thu, 21 Dec 2006 03:50:09 -0600 Subject: [PATCH] winecoreaudio: Move a memset out of a mutex-guarded section. --- dlls/winmm/winecoreaudio/audio.c | 61 ++++++++++++++++++++-------------------- 1 file changed, 30 insertions(+), 31 deletions(-) diff --git a/dlls/winmm/winecoreaudio/audio.c b/dlls/winmm/winecoreaudio/audio.c index a28057dbeb6..e5b9e414c67 100644 --- a/dlls/winmm/winecoreaudio/audio.c +++ b/dlls/winmm/winecoreaudio/audio.c @@ -1365,47 +1365,46 @@ OSStatus CoreAudio_woAudioUnitIOProc(void *inRefCon, pthread_mutex_lock(&wwo->lock); - while (dataNeeded > 0) + while (dataNeeded > 0 && wwo->state == WINE_WS_PLAYING && wwo->lpPlayPtr) { - if (wwo->state == WINE_WS_PLAYING && wwo->lpPlayPtr) - { - unsigned int available = wwo->lpPlayPtr->dwBufferLength - wwo->dwPartialOffset; - unsigned int toCopy; - - if (available >= dataNeeded) - toCopy = dataNeeded; - else - toCopy = available; + unsigned int available = wwo->lpPlayPtr->dwBufferLength - wwo->dwPartialOffset; + unsigned int toCopy; - if (toCopy > 0) - { - memcpy((char*)ioData->mBuffers[0].mData + dataProvided, - wwo->lpPlayPtr->lpData + wwo->dwPartialOffset, toCopy); - wwo->dwPartialOffset += toCopy; - wwo->dwPlayedTotal += toCopy; - dataProvided += toCopy; - dataNeeded -= toCopy; - available -= toCopy; - } + if (available >= dataNeeded) + toCopy = dataNeeded; + else + toCopy = available; - if (available == 0) - { - wodHelper_PlayPtrNext(wwo); - needNotify = 1; - } + if (toCopy > 0) + { + memcpy((char*)ioData->mBuffers[0].mData + dataProvided, + wwo->lpPlayPtr->lpData + wwo->dwPartialOffset, toCopy); + wwo->dwPartialOffset += toCopy; + wwo->dwPlayedTotal += toCopy; + dataProvided += toCopy; + dataNeeded -= toCopy; + available -= toCopy; } - else + + if (available == 0) { - if (!dataProvided) - *ioActionFlags |= kAudioUnitRenderAction_OutputIsSilence; - memset((char*)ioData->mBuffers[0].mData + dataProvided, 0, dataNeeded); - dataProvided += dataNeeded; - dataNeeded = 0; + wodHelper_PlayPtrNext(wwo); + needNotify = 1; } } pthread_mutex_unlock(&wwo->lock); + /* We can't provide any more wave data. Fill the rest with silence. */ + if (dataNeeded > 0) + { + if (!dataProvided) + *ioActionFlags |= kAudioUnitRenderAction_OutputIsSilence; + memset((char*)ioData->mBuffers[0].mData + dataProvided, 0, dataNeeded); + dataProvided += dataNeeded; + dataNeeded = 0; + } + /* We only fill buffer 0. Set any others that might be requested to 0. */ for (buffer = 1; buffer < ioData->mNumberBuffers; buffer++) { -- 2.11.4.GIT