Patch from Dmitry Kostjuchenko: Fixes x64 issue with mis-casting DWORD_PTRs to DWORDs, support proper conversion of device names in UNICODE builds, use of CreateThread instead of _beginthreadex with cygwin.

This commit is contained in:
rossb 2009-12-08 09:26:33 +00:00
commit bdc279551c

View file

@ -152,13 +152,16 @@ Non-critical stuff for the future:
#endif /* PAWIN_USE_WDMKS_DEVICE_INFO */ #endif /* PAWIN_USE_WDMKS_DEVICE_INFO */
/* use CreateThread for CYGWIN, _beginthreadex for all others */ /* use CreateThread for CYGWIN, _beginthreadex for all others */
#ifndef __CYGWIN__ #if !defined(__CYGWIN__) && !defined(_WIN32_WCE)
#define CREATE_THREAD (HANDLE)_beginthreadex( 0, 0, ProcessingThreadProc, stream, 0, &stream->processingThreadId ) #define CREATE_THREAD (HANDLE)_beginthreadex( 0, 0, ProcessingThreadProc, stream, 0, &stream->processingThreadId )
#define PA_THREAD_FUNC static unsigned WINAPI
#define PA_THREAD_ID unsigned
#else #else
#define CREATE_THREAD CreateThread( 0, 0, ProcessingThreadProc, stream, 0, &stream->processingThreadId ) #define CREATE_THREAD CreateThread( 0, 0, ProcessingThreadProc, stream, 0, &stream->processingThreadId )
#define PA_THREAD_FUNC static DWORD WINAPI
#define PA_THREAD_ID DWORD
#endif #endif
#if (defined(_WIN32_WCE))
#if (defined(UNDER_CE))
#pragma comment(lib, "Coredll.lib") #pragma comment(lib, "Coredll.lib")
#elif (defined(WIN32) && (defined(_MSC_VER) && (_MSC_VER >= 1200))) /* MSC version 6 and above */ #elif (defined(WIN32) && (defined(_MSC_VER) && (_MSC_VER >= 1200))) /* MSC version 6 and above */
#pragma comment(lib, "winmm.lib") #pragma comment(lib, "winmm.lib")
@ -168,7 +171,11 @@ Non-critical stuff for the future:
provided in newer platform sdks provided in newer platform sdks
*/ */
#ifndef DWORD_PTR #ifndef DWORD_PTR
#define DWORD_PTR DWORD #if defined(_WIN64)
#define DWORD_PTR unsigned __int64
#else
#define DWORD_PTR unsigned long
#endif
#endif #endif
/************************************************* Constants ********/ /************************************************* Constants ********/
@ -205,6 +212,34 @@ Non-critical stuff for the future:
static const char constInputMapperSuffix_[] = " - Input"; static const char constInputMapperSuffix_[] = " - Input";
static const char constOutputMapperSuffix_[] = " - Output"; static const char constOutputMapperSuffix_[] = " - Output";
/*
copies TCHAR string to explicit char string
*/
char *StrTCpyToC(char *to, const TCHAR *from)
{
#if !defined(_UNICODE) && !defined(UNICODE)
return strcpy(to, from);
#else
int count = wcslen(from);
if (count != 0)
if (WideCharToMultiByte(CP_ACP, 0, from, count, to, count, NULL, NULL) == 0)
return NULL;
return to;
#endif
}
/*
returns length of TCHAR string
*/
size_t StrTLen(const TCHAR *str)
{
#if !defined(_UNICODE) && !defined(UNICODE)
return strlen(str);
#else
return wcslen(str);
#endif
}
/********************************************************************/ /********************************************************************/
typedef struct PaWinMmeStream PaWinMmeStream; /* forward declaration */ typedef struct PaWinMmeStream PaWinMmeStream; /* forward declaration */
@ -685,25 +720,25 @@ static PaError InitializeInputDeviceInfo( PaWinMmeHostApiRepresentation *winMmeH
{ {
/* Append I/O suffix to WAVE_MAPPER device. */ /* Append I/O suffix to WAVE_MAPPER device. */
deviceName = (char *)PaUtil_GroupAllocateMemory( deviceName = (char *)PaUtil_GroupAllocateMemory(
winMmeHostApi->allocations, strlen( wic.szPname ) + 1 + sizeof(constInputMapperSuffix_) ); winMmeHostApi->allocations, StrTLen( wic.szPname ) + 1 + sizeof(constInputMapperSuffix_) );
if( !deviceName ) if( !deviceName )
{ {
result = paInsufficientMemory; result = paInsufficientMemory;
goto error; goto error;
} }
strcpy( deviceName, wic.szPname ); StrTCpyToC( deviceName, wic.szPname );
strcat( deviceName, constInputMapperSuffix_ ); strcat( deviceName, constInputMapperSuffix_ );
} }
else else
{ {
deviceName = (char*)PaUtil_GroupAllocateMemory( deviceName = (char*)PaUtil_GroupAllocateMemory(
winMmeHostApi->allocations, strlen( wic.szPname ) + 1 ); winMmeHostApi->allocations, StrTLen( wic.szPname ) + 1 );
if( !deviceName ) if( !deviceName )
{ {
result = paInsufficientMemory; result = paInsufficientMemory;
goto error; goto error;
} }
strcpy( deviceName, wic.szPname ); StrTCpyToC( deviceName, wic.szPname );
} }
deviceInfo->name = deviceName; deviceInfo->name = deviceName;
@ -808,25 +843,25 @@ static PaError InitializeOutputDeviceInfo( PaWinMmeHostApiRepresentation *winMme
{ {
/* Append I/O suffix to WAVE_MAPPER device. */ /* Append I/O suffix to WAVE_MAPPER device. */
deviceName = (char *)PaUtil_GroupAllocateMemory( deviceName = (char *)PaUtil_GroupAllocateMemory(
winMmeHostApi->allocations, strlen( woc.szPname ) + 1 + sizeof(constOutputMapperSuffix_) ); winMmeHostApi->allocations, StrTLen( woc.szPname ) + 1 + sizeof(constOutputMapperSuffix_) );
if( !deviceName ) if( !deviceName )
{ {
result = paInsufficientMemory; result = paInsufficientMemory;
goto error; goto error;
} }
strcpy( deviceName, woc.szPname ); StrTCpyToC( deviceName, woc.szPname );
strcat( deviceName, constOutputMapperSuffix_ ); strcat( deviceName, constOutputMapperSuffix_ );
} }
else else
{ {
deviceName = (char*)PaUtil_GroupAllocateMemory( deviceName = (char*)PaUtil_GroupAllocateMemory(
winMmeHostApi->allocations, strlen( woc.szPname ) + 1 ); winMmeHostApi->allocations, StrTLen( woc.szPname ) + 1 );
if( !deviceName ) if( !deviceName )
{ {
result = paInsufficientMemory; result = paInsufficientMemory;
goto error; goto error;
} }
strcpy( deviceName, woc.szPname ); StrTCpyToC( deviceName, woc.szPname );
} }
deviceInfo->name = deviceName; deviceInfo->name = deviceName;
@ -940,11 +975,11 @@ PaError PaWinMme_Initialize( PaUtilHostApiRepresentation **hostApi, PaHostApiInd
/* the following calls assume that if wave*Message fails the preferred device parameter won't be modified */ /* the following calls assume that if wave*Message fails the preferred device parameter won't be modified */
preferredDeviceStatusFlags = 0; preferredDeviceStatusFlags = 0;
waveInPreferredDevice = -1; waveInPreferredDevice = -1;
waveInMessage( (HWAVEIN)WAVE_MAPPER, DRVM_MAPPER_PREFERRED_GET, (DWORD)&waveInPreferredDevice, (DWORD)&preferredDeviceStatusFlags ); waveInMessage( (HWAVEIN)WAVE_MAPPER, DRVM_MAPPER_PREFERRED_GET, (DWORD_PTR)&waveInPreferredDevice, (DWORD_PTR)&preferredDeviceStatusFlags );
preferredDeviceStatusFlags = 0; preferredDeviceStatusFlags = 0;
waveOutPreferredDevice = -1; waveOutPreferredDevice = -1;
waveOutMessage( (HWAVEOUT)WAVE_MAPPER, DRVM_MAPPER_PREFERRED_GET, (DWORD)&waveOutPreferredDevice, (DWORD)&preferredDeviceStatusFlags ); waveOutMessage( (HWAVEOUT)WAVE_MAPPER, DRVM_MAPPER_PREFERRED_GET, (DWORD_PTR)&waveOutPreferredDevice, (DWORD_PTR)&preferredDeviceStatusFlags );
maximumPossibleDeviceCount = 0; maximumPossibleDeviceCount = 0;
@ -2092,7 +2127,7 @@ struct PaWinMmeStream
/* Processing thread management -------------- */ /* Processing thread management -------------- */
HANDLE abortEvent; HANDLE abortEvent;
HANDLE processingThread; HANDLE processingThread;
DWORD processingThreadId; PA_THREAD_ID processingThreadId;
char throttleProcessingThreadOnOverload; /* 0 -> don't throtte, non-0 -> throttle */ char throttleProcessingThreadOnOverload; /* 0 -> don't throtte, non-0 -> throttle */
int processingThreadPriority; int processingThreadPriority;
@ -2758,7 +2793,7 @@ static PaError CatchUpOutputBuffers( PaWinMmeStream *stream )
} }
static DWORD WINAPI ProcessingThreadProc( void *pArg ) PA_THREAD_FUNC ProcessingThreadProc( void *pArg )
{ {
PaWinMmeStream *stream = (PaWinMmeStream *)pArg; PaWinMmeStream *stream = (PaWinMmeStream *)pArg;
HANDLE events[3]; HANDLE events[3];