Module: wine Branch: master Commit: cff4da8db8a152535a0e20110618ea8815e67e51 URL: http://source.winehq.org/git/wine.git/?a=commit;h=cff4da8db8a152535a0e201106...
Author: Ken Thomases ken@codeweavers.com Date: Thu Dec 28 11:06:51 2006 -0600
winecoreaudio: Add mechanism for cross-thread call of widHelper_NotifyCompletions.
wodSendNotifyInputCompletionsMessage sends the kWaveInNotifyCompletionsMessage to the message thread, which calls widHelper_NotifyCompletions.
---
dlls/winmm/winecoreaudio/audio.c | 26 ++++++++++++++++++++++++-- 1 files changed, 24 insertions(+), 2 deletions(-)
diff --git a/dlls/winmm/winecoreaudio/audio.c b/dlls/winmm/winecoreaudio/audio.c index 607b711..10a01fc 100644 --- a/dlls/winmm/winecoreaudio/audio.c +++ b/dlls/winmm/winecoreaudio/audio.c @@ -284,7 +284,7 @@ static const char * getMessage(UINT msg)
#define kStopLoopMessage 0 #define kWaveOutNotifyCompletionsMessage 1 -#define kWaveInCallbackMessage 2 +#define kWaveInNotifyCompletionsMessage 2
/* Mach Message Handling */ static CFDataRef wodMessageHandler(CFMessagePortRef port_ReceiveInMessageThread, SInt32 msgid, CFDataRef data, void *info) @@ -297,7 +297,10 @@ static CFDataRef wodMessageHandler(CFMes buffer = (UInt32 *) CFDataGetBytePtr(data); wodHelper_NotifyCompletions(&WOutDev[buffer[0]], FALSE); break; - case kWaveInCallbackMessage: + case kWaveInNotifyCompletionsMessage: + buffer = (UInt32 *) CFDataGetBytePtr(data); + widHelper_NotifyCompletions(&WInDev[buffer[0]]); + break; default: CFRunLoopStop(CFRunLoopGetCurrent()); break; @@ -342,6 +345,25 @@ static void wodSendNotifyCompletionsMess CFRelease(data); }
+/************************************************************************** +* wodSendNotifyInputCompletionsMessage [internal] +* Call from AudioUnit IO thread can't use Wine debug channels. +*/ +static void wodSendNotifyInputCompletionsMessage(WINE_WAVEIN* wwi) +{ + CFDataRef data; + UInt32 buffer; + + buffer = (UInt32) wwi->wiID; + + data = CFDataCreate(kCFAllocatorDefault, (UInt8 *)&buffer, sizeof(buffer)); + if (!data) + return; + + CFMessagePortSendRequest(Port_SendToMessageThread, kWaveInNotifyCompletionsMessage, data, 0.0, 0.0, NULL, NULL); + CFRelease(data); +} + static DWORD bytes_to_mmtime(LPMMTIME lpTime, DWORD position, PCMWAVEFORMAT* format) {