Module: wine Branch: master Commit: a6da8f212d26d462dc4767ca5ecaf273d43301ae URL: http://source.winehq.org/git/wine.git/?a=commit;h=a6da8f212d26d462dc4767ca5e...
Author: Ken Thomases ken@codeweavers.com Date: Thu Dec 21 03:47:05 2006 -0600
winecoreaudio: Create port for sending messages to the callback thread only once.
---
dlls/winmm/winecoreaudio/audio.c | 62 +++++++++++++++++++++++-------------- 1 files changed, 38 insertions(+), 24 deletions(-)
diff --git a/dlls/winmm/winecoreaudio/audio.c b/dlls/winmm/winecoreaudio/audio.c index b971efe..255f7ab 100644 --- a/dlls/winmm/winecoreaudio/audio.c +++ b/dlls/winmm/winecoreaudio/audio.c @@ -177,7 +177,7 @@ typedef struct {
static WINE_WAVEOUT WOutDev [MAX_WAVEOUTDRV];
-static CFStringRef MessageThreadPortName; +static CFMessagePortRef Port_SendToMessageThread;
static LPWAVEHDR wodHelper_PlayPtrNext(WINE_WAVEOUT* wwo); static DWORD wodHelper_NotifyCompletions(WINE_WAVEOUT* wwo, BOOL force); @@ -255,7 +255,7 @@ static const char * getMessage(UINT msg) #define kWaveInCallbackMessage 2
/* Mach Message Handling */ -static CFDataRef wodMessageHandler(CFMessagePortRef local, SInt32 msgid, CFDataRef data, void *info) +static CFDataRef wodMessageHandler(CFMessagePortRef port_ReceiveInMessageThread, SInt32 msgid, CFDataRef data, void *info) { UInt32 *buffer = NULL; WINE_WAVEOUT* wwo = NULL; @@ -283,23 +283,17 @@ static CFDataRef wodMessageHandler(CFMes
static DWORD WINAPI messageThread(LPVOID p) { - CFMessagePortRef local; + CFMessagePortRef port_ReceiveInMessageThread = (CFMessagePortRef) p; CFRunLoopSourceRef source; - Boolean info;
- local = CFMessagePortCreateLocal(kCFAllocatorDefault, MessageThreadPortName, - &wodMessageHandler, NULL, &info); - - source = CFMessagePortCreateRunLoopSource(kCFAllocatorDefault, local, (CFIndex)0); + source = CFMessagePortCreateRunLoopSource(kCFAllocatorDefault, port_ReceiveInMessageThread, (CFIndex)0); CFRunLoopAddSource(CFRunLoopGetCurrent(), source, kCFRunLoopDefaultMode);
CFRunLoopRun();
CFRunLoopSourceInvalidate(source); CFRelease(source); - CFRelease(local); - CFRelease(MessageThreadPortName); - MessageThreadPortName = NULL; + CFRelease(port_ReceiveInMessageThread);
return 0; } @@ -310,9 +304,6 @@ static DWORD wodSendDriverCallbackMessag UInt32 buffer[4]; SInt32 ret;
- CFMessagePortRef messagePort; - messagePort = CFMessagePortCreateRemote(kCFAllocatorDefault, MessageThreadPortName); - buffer[0] = (UInt32) wwo->woID; buffer[1] = (UInt32) wMsg; buffer[2] = (UInt32) dwParam1; @@ -322,9 +313,8 @@ static DWORD wodSendDriverCallbackMessag if (!data) return 0;
- ret = CFMessagePortSendRequest(messagePort, kWaveOutCallbackMessage, data, 0.0, 0.0, NULL, NULL); + ret = CFMessagePortSendRequest(Port_SendToMessageThread, kWaveOutCallbackMessage, data, 0.0, 0.0, NULL, NULL); CFRelease(data); - CFRelease(messagePort);
return (ret == kCFMessagePortSuccess)?1:0; } @@ -455,6 +445,8 @@ LONG CoreAudio_WaveInit(void) pthread_mutexattr_t mutexattr; int i; HANDLE hThread; + CFStringRef messageThreadPortName; + CFMessagePortRef port_ReceiveInMessageThread;
TRACE("()\n");
@@ -528,35 +520,57 @@ LONG CoreAudio_WaveInit(void)
/* create mach messages handler */ srandomdev(); - MessageThreadPortName = CFStringCreateWithFormat(kCFAllocatorDefault, NULL, + messageThreadPortName = CFStringCreateWithFormat(kCFAllocatorDefault, NULL, CFSTR("WaveMessagePort.%d.%lu"), getpid(), (unsigned long)random()); - if (!MessageThreadPortName) + if (!messageThreadPortName) { ERR("Can't create message thread port name\n"); return 1; }
- hThread = CreateThread(NULL, 0, messageThread, NULL, 0, NULL); + port_ReceiveInMessageThread = CFMessagePortCreateLocal(kCFAllocatorDefault, messageThreadPortName, + &wodMessageHandler, NULL, NULL); + if (!port_ReceiveInMessageThread) + { + ERR("Can't create message thread local port\n"); + CFRelease(messageThreadPortName); + return 1; + } + + Port_SendToMessageThread = CFMessagePortCreateRemote(kCFAllocatorDefault, messageThreadPortName); + CFRelease(messageThreadPortName); + if (!Port_SendToMessageThread) + { + ERR("Can't create port for sending to message thread\n"); + CFRelease(port_ReceiveInMessageThread); + return 1; + } + + hThread = CreateThread(NULL, 0, messageThread, (LPVOID)port_ReceiveInMessageThread, 0, NULL); if ( !hThread ) { ERR("Can't create message thread\n"); + CFRelease(port_ReceiveInMessageThread); + CFRelease(Port_SendToMessageThread); + Port_SendToMessageThread = NULL; return 1; } - + + /* The message thread is responsible for releasing port_ReceiveInMessageThread. */ + return 0; }
void CoreAudio_WaveRelease(void) { /* Stop CFRunLoop in messageThread */ - CFMessagePortRef messagePort; int i;
TRACE("()\n");
- messagePort = CFMessagePortCreateRemote(kCFAllocatorDefault, MessageThreadPortName); - CFMessagePortSendRequest(messagePort, kStopLoopMessage, NULL, 0.0, 0.0, NULL, NULL); - CFRelease(messagePort); + CFMessagePortSendRequest(Port_SendToMessageThread, kStopLoopMessage, NULL, 0.0, 0.0, NULL, NULL); + CFRelease(Port_SendToMessageThread); + Port_SendToMessageThread = NULL;
for (i = 0; i < MAX_WAVEOUTDRV; ++i) {