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.
This commit is contained in:
Ken Thomases 2006-05-24 05:43:14 -05:00 committed by Alexandre Julliard
parent a1e6989a9b
commit fb5a073e46
1 changed files with 16 additions and 3 deletions

View File

@ -171,6 +171,8 @@ typedef struct {
static WINE_WAVEOUT WOutDev [MAX_WAVEOUTDRV]; static WINE_WAVEOUT WOutDev [MAX_WAVEOUTDRV];
static CFStringRef MessageThreadPortName;
static LPWAVEHDR wodHelper_PlayPtrNext(WINE_WAVEOUT* wwo); static LPWAVEHDR wodHelper_PlayPtrNext(WINE_WAVEOUT* wwo);
static DWORD wodHelper_NotifyCompletions(WINE_WAVEOUT* wwo, BOOL force); static DWORD wodHelper_NotifyCompletions(WINE_WAVEOUT* wwo, BOOL force);
@ -279,7 +281,7 @@ static DWORD WINAPI messageThread(LPVOID p)
CFRunLoopSourceRef source; CFRunLoopSourceRef source;
Boolean info; Boolean info;
local = CFMessagePortCreateLocal(kCFAllocatorDefault, CFSTR("WaveMessagePort"), local = CFMessagePortCreateLocal(kCFAllocatorDefault, MessageThreadPortName,
&wodMessageHandler, NULL, &info); &wodMessageHandler, NULL, &info);
source = CFMessagePortCreateRunLoopSource(kCFAllocatorDefault, local, (CFIndex)0); source = CFMessagePortCreateRunLoopSource(kCFAllocatorDefault, local, (CFIndex)0);
@ -290,6 +292,8 @@ static DWORD WINAPI messageThread(LPVOID p)
CFRunLoopSourceInvalidate(source); CFRunLoopSourceInvalidate(source);
CFRelease(source); CFRelease(source);
CFRelease(local); CFRelease(local);
CFRelease(MessageThreadPortName);
MessageThreadPortName = NULL;
return 0; return 0;
} }
@ -301,7 +305,7 @@ static DWORD wodSendDriverCallbackMessage(WINE_WAVEOUT* wwo, WORD wMsg, DWORD dw
SInt32 ret; SInt32 ret;
CFMessagePortRef messagePort; CFMessagePortRef messagePort;
messagePort = CFMessagePortCreateRemote(kCFAllocatorDefault, CFSTR("WaveMessagePort")); messagePort = CFMessagePortCreateRemote(kCFAllocatorDefault, MessageThreadPortName);
buffer = CFAllocatorAllocate(NULL, sizeof(UInt32) * 4, 0); buffer = CFAllocatorAllocate(NULL, sizeof(UInt32) * 4, 0);
if (!buffer) if (!buffer)
@ -525,6 +529,15 @@ LONG CoreAudio_WaveInit(void)
pthread_mutexattr_destroy(&mutexattr); pthread_mutexattr_destroy(&mutexattr);
/* create mach messages handler */ /* 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); hThread = CreateThread(NULL, 0, messageThread, NULL, 0, NULL);
if ( !hThread ) if ( !hThread )
{ {
@ -543,7 +556,7 @@ void CoreAudio_WaveRelease(void)
TRACE("()\n"); TRACE("()\n");
messagePort = CFMessagePortCreateRemote(kCFAllocatorDefault, CFSTR("WaveMessagePort")); messagePort = CFMessagePortCreateRemote(kCFAllocatorDefault, MessageThreadPortName);
CFMessagePortSendRequest(messagePort, kStopLoopMessage, NULL, 0.0, 0.0, NULL, NULL); CFMessagePortSendRequest(messagePort, kStopLoopMessage, NULL, 0.0, 0.0, NULL, NULL);
CFRelease(messagePort); CFRelease(messagePort);