From 2e6ad64c007433da49fd48899c4efe2063483732 Mon Sep 17 00:00:00 2001 From: robiwan Date: Fri, 29 Jun 2012 10:04:30 +0000 Subject: [PATCH] Changed so that Mingw build should reference WASAPI supplied Mingw includes + minor refactorings --- src/hostapi/wdmks/pa_win_wdmks.c | 127 ++++++++++++++++++++----------- 1 file changed, 84 insertions(+), 43 deletions(-) diff --git a/src/hostapi/wdmks/pa_win_wdmks.c b/src/hostapi/wdmks/pa_win_wdmks.c index 16fe372..be66fea 100644 --- a/src/hostapi/wdmks/pa_win_wdmks.c +++ b/src/hostapi/wdmks/pa_win_wdmks.c @@ -159,6 +159,21 @@ Default is to use the pin category. #endif #include + +#ifndef EXTERN_C +#define EXTERN_C extern +#endif + +#if defined(__GNUC__) + +/* For MinGW we reference mingw-include files supplied with WASAPI */ +#define WINBOOL BOOL + +#include "../wasapi/mingw-include/ks.h" +#include "../wasapi/mingw-include/ksmedia.h" + +#else + #include #include @@ -167,6 +182,8 @@ Default is to use the pin category. an "old" ksmedia.h), so the proper ksmedia.h is used */ #include +#endif + #include #include @@ -176,9 +193,6 @@ extern HMODULE DllKsUser; extern KSCREATEPIN* FunctionKsCreatePin; /* These definitions allows the use of AVRT.DLL on Vista and later OSs */ -extern HMODULE DllAvRt; -typedef HANDLE WINAPI AVSETMMTHREADCHARACTERISTICS(LPCSTR, LPDWORD TaskIndex); -typedef BOOL WINAPI AVREVERTMMTHREADCHARACTERISTICS(HANDLE); typedef enum _PA_AVRT_PRIORITY { PA_AVRT_PRIORITY_LOW = -1, @@ -186,10 +200,17 @@ typedef enum _PA_AVRT_PRIORITY PA_AVRT_PRIORITY_HIGH, PA_AVRT_PRIORITY_CRITICAL } PA_AVRT_PRIORITY, *PPA_AVRT_PRIORITY; -typedef BOOL WINAPI AVSETMMTHREADPRIORITY(HANDLE, PA_AVRT_PRIORITY); -extern AVSETMMTHREADCHARACTERISTICS* FunctionAvSetMmThreadCharacteristics; -extern AVREVERTMMTHREADCHARACTERISTICS* FunctionAvRevertMmThreadCharacteristics; -extern AVSETMMTHREADPRIORITY* FunctionAvSetMmThreadPriority; + +typedef struct +{ + HINSTANCE hInstance; + + HANDLE (WINAPI *AvSetMmThreadCharacteristics) (LPCSTR, LPDWORD); + BOOL (WINAPI *AvRevertMmThreadCharacteristics) (HANDLE); + BOOL (WINAPI *AvSetMmThreadPriority) (HANDLE, PA_AVRT_PRIORITY); +} PaWinWDMKSAvRtEntryPoints; + +static PaWinWDMKSAvRtEntryPoints paWinWDMKSAvRtEntryPoints = {0}; /* An unspecified channel count (-1) is not treated correctly, so we replace it with * an arbitrarily large number */ @@ -408,11 +429,6 @@ static const unsigned cPacketsArrayMask = 3; HMODULE DllKsUser = NULL; KSCREATEPIN* FunctionKsCreatePin = NULL; -HMODULE DllAvRt = NULL; -AVSETMMTHREADCHARACTERISTICS* FunctionAvSetMmThreadCharacteristics = NULL; -AVREVERTMMTHREADCHARACTERISTICS* FunctionAvRevertMmThreadCharacteristics = NULL; -AVSETMMTHREADPRIORITY* FunctionAvSetMmThreadPriority = NULL; - /* prototypes for functions declared in this file */ #ifdef __cplusplus @@ -692,7 +708,17 @@ static PaError WdmSyncIoctl( ( ioctlNumber == IOCTL_KS_PROPERTY ) && ( outBufferCount == 0 ) ) ) { - PaWinWDM_SetLastErrorInfo(result, "WdmSyncIoctl: DeviceIoControl GLE = 0x%08X", error); + KSPROPERTY* ksProperty = (KSPROPERTY*)inBuffer; + + PaWinWDM_SetLastErrorInfo(result, "WdmSyncIoctl: DeviceIoControl GLE = 0x%08X (prop_set = {%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}, prop_id = %u)", + error, + ksProperty->Set.Data1, ksProperty->Set.Data2, ksProperty->Set.Data3, + ksProperty->Set.Data4[0], ksProperty->Set.Data4[1], + ksProperty->Set.Data4[2], ksProperty->Set.Data4[3], + ksProperty->Set.Data4[4], ksProperty->Set.Data4[5], + ksProperty->Set.Data4[6], ksProperty->Set.Data4[7], + ksProperty->Id + ); result = paUnanticipatedHostError; } } @@ -3686,23 +3712,25 @@ PaError PaWinWdm_Initialize( PaUtilHostApiRepresentation **hostApi, PaHostApiInd if(DllKsUser == NULL) goto error; } + FunctionKsCreatePin = (KSCREATEPIN*)GetProcAddress(DllKsUser, "KsCreatePin"); + if(FunctionKsCreatePin == NULL) + goto error; /* Attempt to load AVRT.DLL, if we can't, then we'll just use time critical prio instead... */ - if(DllAvRt == NULL) + if(paWinWDMKSAvRtEntryPoints.hInstance == NULL) { - DllAvRt = LoadLibrary(TEXT("avrt.dll")); - if (DllAvRt != NULL) + paWinWDMKSAvRtEntryPoints.hInstance = LoadLibrary(TEXT("avrt.dll")); + if (paWinWDMKSAvRtEntryPoints.hInstance != NULL) { - FunctionAvSetMmThreadCharacteristics = (AVSETMMTHREADCHARACTERISTICS*)GetProcAddress(DllAvRt,"AvSetMmThreadCharacteristicsA"); - FunctionAvRevertMmThreadCharacteristics = (AVREVERTMMTHREADCHARACTERISTICS*)GetProcAddress(DllAvRt, "AvRevertMmThreadCharacteristics"); - FunctionAvSetMmThreadPriority = (AVSETMMTHREADPRIORITY*)GetProcAddress(DllAvRt, "AvSetMmThreadPriority"); + paWinWDMKSAvRtEntryPoints.AvSetMmThreadCharacteristics = + (HANDLE(WINAPI*)(LPCSTR,LPDWORD))GetProcAddress(paWinWDMKSAvRtEntryPoints.hInstance,"AvSetMmThreadCharacteristicsA"); + paWinWDMKSAvRtEntryPoints.AvRevertMmThreadCharacteristics = + (BOOL(WINAPI*)(HANDLE))GetProcAddress(paWinWDMKSAvRtEntryPoints.hInstance, "AvRevertMmThreadCharacteristics"); + paWinWDMKSAvRtEntryPoints.AvSetMmThreadPriority = + (BOOL(WINAPI*)(HANDLE,PA_AVRT_PRIORITY))GetProcAddress(paWinWDMKSAvRtEntryPoints.hInstance, "AvSetMmThreadPriority"); } } - FunctionKsCreatePin = (KSCREATEPIN*)GetProcAddress(DllKsUser, "KsCreatePin"); - if(FunctionKsCreatePin == NULL) - goto error; - wdmHostApi = (PaWinWdmHostApiRepresentation*)PaUtil_AllocateMemory( sizeof(PaWinWdmHostApiRepresentation) ); if( !wdmHostApi ) { @@ -3778,10 +3806,10 @@ static void Terminate( struct PaUtilHostApiRepresentation *hostApi ) DllKsUser = NULL; } - if( DllAvRt != NULL ) + if( paWinWDMKSAvRtEntryPoints.hInstance != NULL ) { - FreeLibrary( DllAvRt ); - DllAvRt = NULL; + FreeLibrary( paWinWDMKSAvRtEntryPoints.hInstance ); + paWinWDMKSAvRtEntryPoints.hInstance = NULL; } if( wdmHostApi) @@ -5343,12 +5371,12 @@ static HANDLE BumpThreadPriority() HANDLE hAVRT = NULL; /* If we have access to AVRT.DLL (Vista and later), use it */ - if (FunctionAvSetMmThreadCharacteristics != NULL) + if (paWinWDMKSAvRtEntryPoints.AvSetMmThreadCharacteristics != NULL) { - hAVRT = FunctionAvSetMmThreadCharacteristics("Pro Audio", &dwTask); + hAVRT = paWinWDMKSAvRtEntryPoints.AvSetMmThreadCharacteristics("Pro Audio", &dwTask); if (hAVRT != NULL && hAVRT != INVALID_HANDLE_VALUE) { - BOOL bret = FunctionAvSetMmThreadPriority(hAVRT, PA_AVRT_PRIORITY_CRITICAL); + BOOL bret = paWinWDMKSAvRtEntryPoints.AvSetMmThreadPriority(hAVRT, PA_AVRT_PRIORITY_CRITICAL); if (!bret) { PA_DEBUG(("Set mm thread prio to critical failed!\n")); @@ -5385,8 +5413,8 @@ static void DropThreadPriority(HANDLE hAVRT) if (hAVRT != NULL) { - FunctionAvSetMmThreadPriority(hAVRT, PA_AVRT_PRIORITY_NORMAL); - FunctionAvRevertMmThreadCharacteristics(hAVRT); + paWinWDMKSAvRtEntryPoints.AvSetMmThreadPriority(hAVRT, PA_AVRT_PRIORITY_NORMAL); + paWinWDMKSAvRtEntryPoints.AvRevertMmThreadCharacteristics(hAVRT); return; } @@ -6046,6 +6074,11 @@ static PaError StartStream( PaStream *s ) PA_LOGE_; + if (stream->streamThread != NULL) + { + return paStreamIsNotStopped; + } + stream->streamStop = 0; stream->streamAbort = 0; @@ -6101,14 +6134,14 @@ static PaError StopStream( PaStream *s ) { PaError result = paNoError; PaWinWdmStream *stream = (PaWinWdmStream*)s; - int doCb = 0; + BOOL doCb = FALSE; PA_LOGE_; if(stream->streamActive) { DWORD dwExitCode; - doCb = 1; + doCb = TRUE; stream->streamStop = 1; if (GetExitCodeThread(stream->streamThread, &dwExitCode) && dwExitCode == STILL_ACTIVE) { @@ -6136,8 +6169,11 @@ static PaError StopStream( PaStream *s ) } } - CloseHandle(stream->streamThread); - stream->streamThread = 0; + if (stream->streamThread != NULL) + { + CloseHandle(stream->streamThread); + stream->streamThread = 0; + } stream->streamStarted = 0; stream->streamActive = 0; @@ -6325,6 +6361,7 @@ static signed long GetStreamWriteAvailable( PaStream* s ) static PaError PaPinCaptureEventHandler_WaveCyclic(PaProcessThreadInfo* pInfo, unsigned eventIndex) { + PaError result = paNoError; ring_buffer_size_t frameCount; DATAPACKET* packet = pInfo->stream->capture.packets + eventIndex; @@ -6332,22 +6369,26 @@ static PaError PaPinCaptureEventHandler_WaveCyclic(PaProcessThreadInfo* pInfo, u if (packet->Header.DataUsed == 0) { - PA_HP_TRACE((pInfo->stream->hLog, ">>> Capture bogus event: idx=%u (DataUsed=%u)", eventIndex, packet->Header.DataUsed)); + PA_HP_TRACE((pInfo->stream->hLog, ">>> Capture bogus event (no data): idx=%u", eventIndex)); /* Bogus event, reset! This is to handle the behavior of this USB mic: http://shop.xtz.se/measurement-system/microphone-to-dirac-live-room-correction-suite on startup of streaming, where it erroneously sets the event without the corresponding buffer being filled (DataUsed == 0) */ ResetEvent(packet->Signal.hEvent); - return -1; + + result = -1; /* Only need this to be NOT paNoError */ } + else + { + pInfo->capturePackets[pInfo->captureHead & cPacketsArrayMask].packet = packet; - pInfo->capturePackets[pInfo->captureHead & cPacketsArrayMask].packet = packet; + frameCount = PaUtil_WriteRingBuffer(&pInfo->stream->ringBuffer, packet->Header.Data, pInfo->stream->capture.framesPerBuffer); - frameCount = PaUtil_WriteRingBuffer(&pInfo->stream->ringBuffer, packet->Header.Data, pInfo->stream->capture.framesPerBuffer); + PA_HP_TRACE((pInfo->stream->hLog, ">>> Capture event: idx=%u (frames=%u)", eventIndex, frameCount)); + ++pInfo->captureHead; + } - PA_HP_TRACE((pInfo->stream->hLog, ">>> Capture event: idx=%u (frames=%u)", eventIndex, frameCount)); - ++pInfo->captureHead; - --pInfo->pending; - return paNoError; + --pInfo->pending; /* This needs to be done in either case */ + return result; } static PaError PaPinCaptureSubmitHandler_WaveCyclic(PaProcessThreadInfo* pInfo, unsigned eventIndex) -- 2.43.0