Module: wine Branch: refs/heads/master Commit: fb5a073e462308eeb6a0ba19be91d6fe30a59f22 URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=fb5a073e462308eeb6a0ba19...
Author: Ken Thomases ken@codeweavers.com Date: Wed May 24 05:43:14 2006 -0500
winecoreaudio: Use unique name for message port.
Use a unique port name for the message port to the message thread. Port names are system-global, so using a non-unique constant name prevents the CoreAudio driver from being used in multiple processes simultaneously.
---
dlls/winmm/winecoreaudio/audio.c | 19 ++++++++++++++++--- 1 files changed, 16 insertions(+), 3 deletions(-)
diff --git a/dlls/winmm/winecoreaudio/audio.c b/dlls/winmm/winecoreaudio/audio.c index bc7a47d..df6bdc8 100644 --- a/dlls/winmm/winecoreaudio/audio.c +++ b/dlls/winmm/winecoreaudio/audio.c @@ -171,6 +171,8 @@ typedef struct {
static WINE_WAVEOUT WOutDev [MAX_WAVEOUTDRV];
+static CFStringRef MessageThreadPortName; + static LPWAVEHDR wodHelper_PlayPtrNext(WINE_WAVEOUT* wwo); static DWORD wodHelper_NotifyCompletions(WINE_WAVEOUT* wwo, BOOL force);
@@ -279,7 +281,7 @@ static DWORD WINAPI messageThread(LPVOID CFRunLoopSourceRef source; Boolean info;
- local = CFMessagePortCreateLocal(kCFAllocatorDefault, CFSTR("WaveMessagePort"), + local = CFMessagePortCreateLocal(kCFAllocatorDefault, MessageThreadPortName, &wodMessageHandler, NULL, &info);
source = CFMessagePortCreateRunLoopSource(kCFAllocatorDefault, local, (CFIndex)0); @@ -290,6 +292,8 @@ static DWORD WINAPI messageThread(LPVOID CFRunLoopSourceInvalidate(source); CFRelease(source); CFRelease(local); + CFRelease(MessageThreadPortName); + MessageThreadPortName = NULL;
return 0; } @@ -301,7 +305,7 @@ static DWORD wodSendDriverCallbackMessag SInt32 ret;
CFMessagePortRef messagePort; - messagePort = CFMessagePortCreateRemote(kCFAllocatorDefault, CFSTR("WaveMessagePort")); + messagePort = CFMessagePortCreateRemote(kCFAllocatorDefault, MessageThreadPortName);
buffer = CFAllocatorAllocate(NULL, sizeof(UInt32) * 4, 0); if (!buffer) @@ -525,6 +529,15 @@ LONG CoreAudio_WaveInit(void) pthread_mutexattr_destroy(&mutexattr);
/* create mach messages handler */ + srandomdev(); + MessageThreadPortName = CFStringCreateWithFormat(kCFAllocatorDefault, NULL, + CFSTR("WaveMessagePort.%d.%lu"), getpid(), (unsigned long)random()); + if (!MessageThreadPortName) + { + ERR("Can't create message thread port name\n"); + return 1; + } + hThread = CreateThread(NULL, 0, messageThread, NULL, 0, NULL); if ( !hThread ) { @@ -543,7 +556,7 @@ void CoreAudio_WaveRelease(void)
TRACE("()\n");
- messagePort = CFMessagePortCreateRemote(kCFAllocatorDefault, CFSTR("WaveMessagePort")); + messagePort = CFMessagePortCreateRemote(kCFAllocatorDefault, MessageThreadPortName); CFMessagePortSendRequest(messagePort, kStopLoopMessage, NULL, 0.0, 0.0, NULL, NULL); CFRelease(messagePort);