Ken Thomases : winecoreaudio: Lift mutex lock/
unlock out of wodHelper_PlayPtrNext to caller.
Alexandre Julliard
julliard at wine.codeweavers.com
Thu Dec 21 10:36:33 CST 2006
Module: wine
Branch: master
Commit: 82fff94c338571ec95a1cda47570a3b71523588e
URL: http://source.winehq.org/git/wine.git/?a=commit;h=82fff94c338571ec95a1cda47570a3b71523588e
Author: Ken Thomases <ken at codeweavers.com>
Date: Thu Dec 21 03:49:07 2006 -0600
winecoreaudio: Lift mutex lock/unlock out of wodHelper_PlayPtrNext to caller.
---
dlls/winmm/winecoreaudio/audio.c | 27 +++++++++------------------
1 files changed, 9 insertions(+), 18 deletions(-)
diff --git a/dlls/winmm/winecoreaudio/audio.c b/dlls/winmm/winecoreaudio/audio.c
index d38fe9b..c967ebb 100644
--- a/dlls/winmm/winecoreaudio/audio.c
+++ b/dlls/winmm/winecoreaudio/audio.c
@@ -897,14 +897,13 @@ static void wodHelper_CheckForLoopBegin(
* wodHelper_PlayPtrNext [internal]
*
* 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.
*/
static void wodHelper_PlayPtrNext(WINE_WAVEOUT* wwo)
{
BOOL didLoopBack = FALSE;
- pthread_mutex_lock(&wwo->lock);
-
wwo->dwPartialOffset = 0;
if ((wwo->lpPlayPtr->dwFlags & WHDR_ENDLOOP) && wwo->lpLoopPtr)
{
@@ -930,8 +929,6 @@ static void wodHelper_PlayPtrNext(WINE_W
else
wodHelper_CheckForLoopBegin(wwo);
}
-
- pthread_mutex_unlock(&wwo->lock);
}
/* if force is TRUE then notify the client that all the headers were completed
@@ -1406,16 +1403,15 @@ OSStatus CoreAudio_woAudioUnitIOProc(voi
{
UInt32 buffer;
WINE_WAVEOUT *wwo = (WINE_WAVEOUT *) inRefCon;
- int nextPtr = 0;
int needNotify = 0;
unsigned int dataNeeded = ioData->mBuffers[0].mDataByteSize;
unsigned int dataProvided = 0;
+ pthread_mutex_lock(&wwo->lock);
+
while (dataNeeded > 0)
{
- pthread_mutex_lock(&wwo->lock);
-
if (wwo->state == WINE_WS_PLAYING && wwo->lpPlayPtr)
{
unsigned int available = wwo->lpPlayPtr->dwBufferLength - wwo->dwPartialOffset;
@@ -1438,9 +1434,10 @@ OSStatus CoreAudio_woAudioUnitIOProc(voi
}
if (available == 0)
- nextPtr = 1;
-
- needNotify = 1;
+ {
+ wodHelper_PlayPtrNext(wwo);
+ needNotify = 1;
+ }
}
else
{
@@ -1448,16 +1445,10 @@ OSStatus CoreAudio_woAudioUnitIOProc(voi
dataProvided += dataNeeded;
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. */
for (buffer = 1; buffer < ioData->mNumberBuffers; buffer++)
{
More information about the wine-cvs
mailing list