Commit 82fff94c authored by Ken Thomases's avatar Ken Thomases Committed by Alexandre Julliard

winecoreaudio: Lift mutex lock/unlock out of wodHelper_PlayPtrNext to caller.

parent bdbe803c
...@@ -897,14 +897,13 @@ static void wodHelper_CheckForLoopBegin(WINE_WAVEOUT* wwo) ...@@ -897,14 +897,13 @@ static void wodHelper_CheckForLoopBegin(WINE_WAVEOUT* wwo)
* wodHelper_PlayPtrNext [internal] * wodHelper_PlayPtrNext [internal]
* *
* Advance the play pointer to the next waveheader, looping if required. * Advance the play pointer to the next waveheader, looping if required.
* This is called with the WAVEOUT lock held.
* Call from AudioUnit IO thread can't use Wine debug channels. * Call from AudioUnit IO thread can't use Wine debug channels.
*/ */
static void wodHelper_PlayPtrNext(WINE_WAVEOUT* wwo) static void wodHelper_PlayPtrNext(WINE_WAVEOUT* wwo)
{ {
BOOL didLoopBack = FALSE; BOOL didLoopBack = FALSE;
pthread_mutex_lock(&wwo->lock);
wwo->dwPartialOffset = 0; wwo->dwPartialOffset = 0;
if ((wwo->lpPlayPtr->dwFlags & WHDR_ENDLOOP) && wwo->lpLoopPtr) if ((wwo->lpPlayPtr->dwFlags & WHDR_ENDLOOP) && wwo->lpLoopPtr)
{ {
...@@ -930,8 +929,6 @@ static void wodHelper_PlayPtrNext(WINE_WAVEOUT* wwo) ...@@ -930,8 +929,6 @@ static void wodHelper_PlayPtrNext(WINE_WAVEOUT* wwo)
else else
wodHelper_CheckForLoopBegin(wwo); wodHelper_CheckForLoopBegin(wwo);
} }
pthread_mutex_unlock(&wwo->lock);
} }
/* if force is TRUE then notify the client that all the headers were completed /* if force is TRUE then notify the client that all the headers were completed
...@@ -1406,16 +1403,15 @@ OSStatus CoreAudio_woAudioUnitIOProc(void *inRefCon, ...@@ -1406,16 +1403,15 @@ OSStatus CoreAudio_woAudioUnitIOProc(void *inRefCon,
{ {
UInt32 buffer; UInt32 buffer;
WINE_WAVEOUT *wwo = (WINE_WAVEOUT *) inRefCon; WINE_WAVEOUT *wwo = (WINE_WAVEOUT *) inRefCon;
int nextPtr = 0;
int needNotify = 0; int needNotify = 0;
unsigned int dataNeeded = ioData->mBuffers[0].mDataByteSize; unsigned int dataNeeded = ioData->mBuffers[0].mDataByteSize;
unsigned int dataProvided = 0; unsigned int dataProvided = 0;
pthread_mutex_lock(&wwo->lock);
while (dataNeeded > 0) while (dataNeeded > 0)
{ {
pthread_mutex_lock(&wwo->lock);
if (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 available = wwo->lpPlayPtr->dwBufferLength - wwo->dwPartialOffset;
...@@ -1438,9 +1434,10 @@ OSStatus CoreAudio_woAudioUnitIOProc(void *inRefCon, ...@@ -1438,9 +1434,10 @@ OSStatus CoreAudio_woAudioUnitIOProc(void *inRefCon,
} }
if (available == 0) if (available == 0)
nextPtr = 1; {
wodHelper_PlayPtrNext(wwo);
needNotify = 1; needNotify = 1;
}
} }
else else
{ {
...@@ -1448,16 +1445,10 @@ OSStatus CoreAudio_woAudioUnitIOProc(void *inRefCon, ...@@ -1448,16 +1445,10 @@ OSStatus CoreAudio_woAudioUnitIOProc(void *inRefCon,
dataProvided += dataNeeded; dataProvided += dataNeeded;
dataNeeded = 0; dataNeeded = 0;
} }
pthread_mutex_unlock(&wwo->lock);
if (nextPtr)
{
wodHelper_PlayPtrNext(wwo);
nextPtr = 0;
}
} }
pthread_mutex_unlock(&wwo->lock);
/* We only fill buffer 0. Set any others that might be requested to 0. */ /* We only fill buffer 0. Set any others that might be requested to 0. */
for (buffer = 1; buffer < ioData->mNumberBuffers; buffer++) for (buffer = 1; buffer < ioData->mNumberBuffers; buffer++)
{ {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment