Update of /cvsroot/pure-data/pd/portaudio/pa_win In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv15364/portaudio/pa_win
Added Files: pa_win_hostapis.c pa_win_util.c pa_x86_plain_converters.c pa_x86_plain_converters.h Log Message: ... more changes to try to upload 0.38 test 5 to CVS
--- NEW FILE: pa_win_hostapis.c --- /* * $Id: pa_win_hostapis.c,v 1.3 2004/09/06 20:44:41 millerpuckette Exp $ * Portable Audio I/O Library Windows initialization table * * Based on the Open Source API proposed by Ross Bencina * Copyright (c) 1999-2002 Ross Bencina, Phil Burk * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files * (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, * publish, distribute, sublicense, and/or sell copies of the Software, * and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * Any person wishing to distribute modifications to the Software is * requested to send the modifications to the original developer so that * they can be incorporated into the canonical version. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/** @file Win32 host API initialization function table.
@todo Consider using PA_USE_WMME etc instead of PA_NO_WMME. This is what the Unix version does, we should consider being consistent. */
#include "pa_hostapi.h"
#ifdef __cplusplus extern "C" { #endif /* __cplusplus */
PaError PaSkeleton_Initialize( PaUtilHostApiRepresentation **hostApi, PaHostApiIndex index ); PaError PaWinMme_Initialize( PaUtilHostApiRepresentation **hostApi, PaHostApiIndex index ); PaError PaWinDs_Initialize( PaUtilHostApiRepresentation **hostApi, PaHostApiIndex index ); PaError PaAsio_Initialize( PaUtilHostApiRepresentation **hostApi, PaHostApiIndex index );
#ifdef __cplusplus } #endif /* __cplusplus */
PaUtilHostApiInitializer *paHostApiInitializers[] = {
#ifndef PA_NO_WMME PaWinMme_Initialize, #endif
#ifndef PA_NO_DS PaWinDs_Initialize, #endif
#ifndef PA_NO_ASIO PaAsio_Initialize, #endif
PaSkeleton_Initialize, /* just for testing */
0 /* NULL terminated array */ };
int paDefaultHostApiIndex = 0;
--- NEW FILE: pa_x86_plain_converters.c --- #include "pa_x86_plain_converters.h"
#include "pa_converters.h" #include "pa_dither.h"
/* plain intel assemby versions of standard pa converter functions.
the main reason these versions are faster than the equivalent C versions is that float -> int casting is expensive in C on x86 because the rounding mode needs to be changed for every cast. these versions only set the rounding mode once outside the loop.
small additional speed gains are made by the way that clamping is implemented.
TODO: o- inline dither code o- implement Dither only (no-clip) versions [...1128 lines suppressed...] }
/* -------------------------------------------------------------------------- */
void PaUtil_InitializeX86PlainConverters( void ) { paConverters.Float32_To_Int32 = Float32_To_Int32; paConverters.Float32_To_Int32_Clip = Float32_To_Int32_Clip; paConverters.Float32_To_Int32_DitherClip = Float32_To_Int32_DitherClip;
paConverters.Float32_To_Int24 = Float32_To_Int24; paConverters.Float32_To_Int24_Clip = Float32_To_Int24_Clip; paConverters.Float32_To_Int24_DitherClip = Float32_To_Int24_DitherClip;
paConverters.Float32_To_Int16 = Float32_To_Int16; paConverters.Float32_To_Int16_Clip = Float32_To_Int16_Clip; paConverters.Float32_To_Int16_DitherClip = Float32_To_Int16_DitherClip; }
/* -------------------------------------------------------------------------- */
--- NEW FILE: pa_x86_plain_converters.h --- #ifndef PA_X86_PLAIN_CONVERTERS_H #define PA_X86_PLAIN_CONVERTERS_H
#ifdef __cplusplus extern "C" { #endif /* __cplusplus */
/** @brief Install optimised converter functions suitable for all IA32 processors */ void PaUtil_InitializeX86PlainConverters( void );
#ifdef __cplusplus } #endif /* __cplusplus */ #endif /* PA_X86_PLAIN_CONVERTERS_H */
--- NEW FILE: pa_win_util.c --- /* * $Id: pa_win_util.c,v 1.3 2004/09/06 20:44:41 millerpuckette Exp $ * Portable Audio I/O Library * Win32 platform-specific support functions * * Based on the Open Source API proposed by Ross Bencina * Copyright (c) 1999-2000 Ross Bencina * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files * (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, * publish, distribute, sublicense, and/or sell copies of the Software, * and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * Any person wishing to distribute modifications to the Software is * requested to send the modifications to the original developer so that * they can be incorporated into the canonical version. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/** @file Win32 platform-specific support functions.
@todo Implement workaround for QueryPerformanceCounter() skipping forward bug. (see msdn kb Q274323). */
#include <windows.h> #include <mmsystem.h> /* for timeGetTime() */
#include "pa_util.h"
/* Track memory allocations to avoid leaks. */
#if PA_TRACK_MEMORY static int numAllocations_ = 0; #endif
void *PaUtil_AllocateMemory( long size ) { void *result = GlobalAlloc( GPTR, size );
#if PA_TRACK_MEMORY if( result != NULL ) numAllocations_ += 1; #endif return result; }
void PaUtil_FreeMemory( void *block ) { if( block != NULL ) { GlobalFree( block ); #if PA_TRACK_MEMORY numAllocations_ -= 1; #endif
} }
int PaUtil_CountCurrentlyAllocatedBlocks( void ) { #if PA_TRACK_MEMORY return numAllocations_; #else return 0; #endif }
void Pa_Sleep( long msec ) { Sleep( msec ); }
static int usePerformanceCounter_; static double secondsPerTick_;
void PaUtil_InitializeClock( void ) { LARGE_INTEGER ticksPerSecond;
if( QueryPerformanceFrequency( &ticksPerSecond ) != 0 ) { usePerformanceCounter_ = 1; secondsPerTick_ = 1.0 / (double)ticksPerSecond.QuadPart; } else { usePerformanceCounter_ = 0; } }
double PaUtil_GetTime( void ) { LARGE_INTEGER time;
if( usePerformanceCounter_ ) { /* FIXME: according to this knowledge-base article, QueryPerformanceCounter can skip forward by seconds! http://support.microsoft.com/default.aspx?scid=KB;EN-US;Q274323&
it may be better to use the rtdsc instruction using inline asm, however then a method is needed to calculate a ticks/seconds ratio. */ QueryPerformanceCounter( &time ); return time.QuadPart * secondsPerTick_; } else { return timeGetTime() * .001; } }