From 8d0e18f87b2068f62c60efb79b1034731dcd16c3 Mon Sep 17 00:00:00 2001 From: Etienne Dechamps Date: Sun, 25 Nov 2018 13:54:22 +0000 Subject: [PATCH 001/164] Get rid of the garbage testcvs/ directory. --- testcvs/changeme.txt | 21 --------------------- testcvs/file1.txt | 9 --------- testcvs/file2.txt | 9 --------- 3 files changed, 39 deletions(-) delete mode 100644 testcvs/changeme.txt delete mode 100644 testcvs/file1.txt delete mode 100644 testcvs/file2.txt diff --git a/testcvs/changeme.txt b/testcvs/changeme.txt deleted file mode 100644 index 48904b7..0000000 --- a/testcvs/changeme.txt +++ /dev/null @@ -1,21 +0,0 @@ -This is just a dopy little file used to test the source code repository. -Feel free to trash this file. -Minor change. -Another tweak. -philburk tweak -stephane test -Phil changed this again on 2/21/02. Yawn... -Bjorn test3! -Phil tried to change this on 5/13/08 -Now we are using SVN instead of CVS. PB 2/10/10 -Test from builder-pc - -make a change using SVN on Ubuntu -tweak -testing - -PLB changing it to see if SVN broken -Testing from Ubuntu with SVN on Assembla. - -5/2/2016 - Now using Git! - diff --git a/testcvs/file1.txt b/testcvs/file1.txt deleted file mode 100644 index a900ec6..0000000 --- a/testcvs/file1.txt +++ /dev/null @@ -1,9 +0,0 @@ -This is used to test the SVN versioning system. - - $Revision$ - $Author$ - $Date$ - $Id$ - -After propset svn:keywords - diff --git a/testcvs/file2.txt b/testcvs/file2.txt deleted file mode 100644 index a900ec6..0000000 --- a/testcvs/file2.txt +++ /dev/null @@ -1,9 +0,0 @@ -This is used to test the SVN versioning system. - - $Revision$ - $Author$ - $Date$ - $Id$ - -After propset svn:keywords - From 83ab55b62d707c11d18238b1928e0297d67e4767 Mon Sep 17 00:00:00 2001 From: dmitrykos Date: Mon, 24 Dec 2018 14:20:29 +0200 Subject: [PATCH 002/164] wasapi: new API PaWasapi_SetStreamStateHandler() to be able to catch WASAPI error inside the rendering thread loop (and handle it gracefully, for example restart the stream), protect from dangling pointer during device list update, cleanup header --- build/msvc/portaudio.def | 16 +- include/pa_win_wasapi.h | 314 ++++++++++++++++++----------- src/hostapi/wasapi/pa_win_wasapi.c | 237 ++++++++++++++-------- 3 files changed, 363 insertions(+), 204 deletions(-) diff --git a/build/msvc/portaudio.def b/build/msvc/portaudio.def index 87b2559..c08243a 100644 --- a/build/msvc/portaudio.def +++ b/build/msvc/portaudio.def @@ -45,10 +45,12 @@ PaWasapi_GetAudioClient @56 PaWasapi_UpdateDeviceList @57 PaWasapi_GetDeviceCurrentFormat @58 PaWasapi_GetDeviceDefaultFormat @59 -PaWasapi_GetDeviceRole @60 -PaWasapi_ThreadPriorityBoost @61 -PaWasapi_ThreadPriorityRevert @62 -PaWasapi_GetFramesPerHostBuffer @63 -PaWasapi_GetJackCount @64 -PaWasapi_GetJackDescription @65 -PaWasapi_SetDefaultInterfaceId @66 \ No newline at end of file +PaWasapi_GetDeviceMixFormat @60 +PaWasapi_GetDeviceRole @61 +PaWasapi_ThreadPriorityBoost @62 +PaWasapi_ThreadPriorityRevert @63 +PaWasapi_GetFramesPerHostBuffer @64 +PaWasapi_GetJackCount @65 +PaWasapi_GetJackDescription @66 +PaWasapi_SetDefaultInterfaceId @67 +PaWasapi_SetStreamStateHandler @68 \ No newline at end of file diff --git a/include/pa_win_wasapi.h b/include/pa_win_wasapi.h index a899bf9..63b5d6a 100644 --- a/include/pa_win_wasapi.h +++ b/include/pa_win_wasapi.h @@ -3,9 +3,11 @@ /* * $Id: $ * PortAudio Portable Real-Time Audio Library - * DirectSound specific extensions + * WASAPI specific extensions * - * Copyright (c) 1999-2007 Ross Bencina and Phil Burk + * Copyright (c) 1999-2018 Ross Bencina and Phil Burk + * Copyright (c) 2006-2010 David Viens + * Copyright (c) 2010-2018 Dmitry Kostjuchenko * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files @@ -28,13 +30,13 @@ */ /* - * The text above constitutes the entire PortAudio license; however, + * The text above constitutes the entire PortAudio license; however, * the PortAudio community also makes the following non-binding requests: * * 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. It is also - * requested that these non-binding requests be included along with the + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the * license above. */ @@ -52,7 +54,7 @@ extern "C" #endif /* __cplusplus */ -/* Setup flags */ +/* Stream setup flags. */ typedef enum PaWasapiFlags { /* put WASAPI into exclusive mode */ @@ -69,12 +71,12 @@ typedef enum PaWasapiFlags method can only provide 15-20ms latency. */ paWinWasapiPolling = (1 << 3), - /* force custom thread priority setting, must be used if PaWasapiStreamInfo::threadPriority + /* force custom thread priority setting, must be used if PaWasapiStreamInfo::threadPriority is set to a custom value */ paWinWasapiThreadPriority = (1 << 4), - /* force explicit sample format and do not allow PA to select suitable working format, API will - fail if provided sample format is not supported by audio hardware in Exclusive mode + /* force explicit sample format and do not allow PA to select suitable working format, API will + fail if provided sample format is not supported by audio hardware in Exclusive mode or system mixer in Shared mode */ paWinWasapiExplicitSampleFormat = (1 << 5) } @@ -87,15 +89,62 @@ PaWasapiFlags; #define paWinWasapiExplicitSampleFormat (paWinWasapiExplicitSampleFormat) -/* Host processor. Allows to skip internal PA processing completely. - You must set paWinWasapiRedirectHostProcessor flag to PaWasapiStreamInfo::flags member - in order to have host processor redirected to your callback. - Use with caution! inputFrames and outputFrames depend solely on final device setup. - To query maximal values of inputFrames/outputFrames use PaWasapi_GetFramesPerHostBuffer. +/* Stream state. + + @note Multiple states can be united into a bitmask. + @see PaWasapiStreamStateCallback, PaWasapi_SetStreamStateHandler */ -typedef void (*PaWasapiHostProcessorCallback) (void *inputBuffer, long inputFrames, - void *outputBuffer, long outputFrames, - void *userData); +typedef enum PaWasapiStreamState +{ + /* state change was caused by the error: + + Example: + 1) If thread execution stopped due to AUDCLNT_E_RESOURCES_INVALIDATED then state + value will contain paWasapiStreamStateError|paWasapiStreamStateThreadStop. + */ + paWasapiStreamStateError = (1 << 0), + + /* processing thread is preparing to start execution */ + paWasapiStreamStateThreadPrepare = (1 << 1), + + /* processing thread started execution (enters its loop) */ + paWasapiStreamStateThreadStart = (1 << 2), + + /* processing thread stopped execution */ + paWasapiStreamStateThreadStop = (1 << 3) +} +PaWasapiStreamState; +#define paWasapiStreamStateError (paWasapiStreamStateError) +#define paWasapiStreamStateThreadPrepare (paWasapiStreamStateThreadPrepare) +#define paWasapiStreamStateThreadStart (paWasapiStreamStateThreadStart) +#define paWasapiStreamStateThreadStop (paWasapiStreamStateThreadStop) + + +/* Host processor. + + Allows to skip internal PA processing completely. paWinWasapiRedirectHostProcessor flag + must be set to the PaWasapiStreamInfo::flags member in order to have host processor + redirected to this callback. + + Use with caution! inputFrames and outputFrames depend solely on final device setup. + To query max values of inputFrames/outputFrames use PaWasapi_GetFramesPerHostBuffer. +*/ +typedef void (*PaWasapiHostProcessorCallback) (void *inputBuffer, long inputFrames, + void *outputBuffer, long outputFrames, void *userData); + + +/* Stream state handler. + + @param pStream Pointer to PaStream object. + @param stateFlags State flags, a collection of values from PaWasapiStreamState enum. + @param errorId Error id provided by system API (HRESULT). + @param userData Pointer to user data. + + @see PaWasapiStreamState +*/ +typedef void (*PaWasapiStreamStateCallback) (PaStream *pStream, unsigned int stateFlags, + unsigned int errorId, void *pUserData); + /* Device role. */ typedef enum PaWasapiDeviceRole @@ -130,7 +179,7 @@ typedef enum PaWasapiJackConnectionType eJackConnTypeXlrProfessional, eJackConnTypeRJ11Modem, eJackConnTypeCombination -} +} PaWasapiJackConnectionType; @@ -153,7 +202,7 @@ typedef enum PaWasapiJackGeoLocation eJackGeoLocATAPI, eJackGeoLocReserved5, eJackGeoLocReserved6, -} +} PaWasapiJackGeoLocation; @@ -164,7 +213,7 @@ typedef enum PaWasapiJackGenLocation eJackGenLocInternal, eJackGenLocSeparate, eJackGenLocOther -} +} PaWasapiJackGenLocation; @@ -175,7 +224,7 @@ typedef enum PaWasapiJackPortConnection eJackPortConnIntegratedDevice, eJackPortConnBothIntegratedAndJack, eJackPortConnUnknown -} +} PaWasapiJackPortConnection; @@ -195,7 +244,7 @@ PaWasapiThreadPriority; /* Stream descriptor. */ -typedef struct PaWasapiJackDescription +typedef struct PaWasapiJackDescription { unsigned long channelMapping; unsigned long color; /* derived from macro: #define RGB(r,g,b) ((COLORREF)(((BYTE)(r)|((WORD)((BYTE)(g))<<8))|(((DWORD)(BYTE)(b))<<16))) */ @@ -249,7 +298,7 @@ PaWasapiStreamOption; /* Stream descriptor. */ -typedef struct PaWasapiStreamInfo +typedef struct PaWasapiStreamInfo { unsigned long size; /**< sizeof(PaWasapiStreamInfo) */ PaHostApiTypeId hostApiType; /**< paWASAPI */ @@ -258,16 +307,16 @@ typedef struct PaWasapiStreamInfo unsigned long flags; /**< collection of PaWasapiFlags */ /** Support for WAVEFORMATEXTENSIBLE channel masks. If flags contains - paWinWasapiUseChannelMask this allows you to specify which speakers + paWinWasapiUseChannelMask this allows you to specify which speakers to address in a multichannel stream. Constants for channelMask - are specified in pa_win_waveformat.h. Will be used only if + are specified in pa_win_waveformat.h. Will be used only if paWinWasapiUseChannelMask flag is specified. */ PaWinWaveFormatChannelMask channelMask; /** Delivers raw data to callback obtained from GetBuffer() methods skipping - internal PortAudio processing inventory completely. userData parameter will - be the same that was passed to Pa_OpenStream method. Will be used only if + internal PortAudio processing inventory completely. userData parameter will + be the same that was passed to Pa_OpenStream method. Will be used only if paWinWasapiRedirectHostProcessor flag is specified. */ PaWasapiHostProcessorCallback hostProcessorOutput; @@ -293,13 +342,13 @@ typedef struct PaWasapiStreamInfo @version Available as of 19.6.0 */ PaWasapiStreamOption streamOption; -} +} PaWasapiStreamInfo; /** Returns pointer to WASAPI's IAudioClient object of the stream. - @param pStream Pointer to PaStream. + @param pStream Pointer to PaStream object. @param pAudioClient Pointer to pointer of IAudioClient. @param bOutput TRUE (1) for output stream, FALSE (0) for input stream. @@ -308,10 +357,11 @@ PaWasapiStreamInfo; PaError PaWasapi_GetAudioClient( PaStream *pStream, void **pAudioClient, int bOutput ); -/** Update device list. - This function is available if PA_WASAPI_MAX_CONST_DEVICE_COUNT is defined during compile time - with maximum constant WASAPI device count (recommended value - 32). - If PA_WASAPI_MAX_CONST_DEVICE_COUNT is set to 0 (or not defined) during compile time the implementation +/** Update device list. + + This function is available if PA_WASAPI_MAX_CONST_DEVICE_COUNT is defined during compile time + with maximum constant WASAPI device count (recommended value - 32). + If PA_WASAPI_MAX_CONST_DEVICE_COUNT is set to 0 (or not defined) during compile time the implementation will not define PaWasapi_UpdateDeviceList() and thus updating device list can only be possible by calling Pa_Terminate() and then Pa_Initialize(). @@ -320,115 +370,128 @@ PaError PaWasapi_GetAudioClient( PaStream *pStream, void **pAudioClient, int bOu PaError PaWasapi_UpdateDeviceList(); -/** Returns current audio format of the device assigned to the opened stream. Format is represented by - PaWinWaveFormat or WAVEFORMATEXTENSIBLE structure. Use this function to reconfirm format if - PA's processor is overriden and paWinWasapiRedirectHostProcessor flag is specified. +/** Get current audio format of the device assigned to the opened stream. - @param pStream Pointer to PaStream. - @param pFormat Pointer to PaWinWaveFormat or WAVEFORMATEXTENSIBLE structure. - @param nFormatSize Size of PaWinWaveFormat or WAVEFORMATEXTENSIBLE structure in bytes. - @param bOutput TRUE (1) for output stream, FALSE (0) for input stream. + Format is represented by PaWinWaveFormat or WAVEFORMATEXTENSIBLE structure. + Use this function to reconfirm format if PA's processor is overriden and + paWinWasapiRedirectHostProcessor flag is specified. + + @param pStream Pointer to PaStream object. + @param pFormat Pointer to PaWinWaveFormat or WAVEFORMATEXTENSIBLE structure. + @param formatSize Size of PaWinWaveFormat or WAVEFORMATEXTENSIBLE structure in bytes. + @param bOutput TRUE (1) for output stream, FALSE (0) for input stream. @return Non-negative value indicating the number of bytes copied into format decriptor - or, a PaErrorCode (which are always negative) if PortAudio is not initialized + or, a PaErrorCode (which is always negative) if PortAudio is not initialized or an error is encountered. */ -int PaWasapi_GetDeviceCurrentFormat( PaStream *pStream, void *pFormat, unsigned int nFormatSize, int bOutput ); +int PaWasapi_GetDeviceCurrentFormat( PaStream *pStream, void *pFormat, unsigned int formatSize, int bOutput ); -/** Returns default audio format for device in Shared Mode. Format is represented by - PaWinWaveFormat or WAVEFORMATEXTENSIBLE structure and obtained by getting - the device property with a PKEY_AudioEngine_DeviceFormat key. +/** Get default audio format for the device in Shared Mode. - @param pFormat Pointer to PaWinWaveFormat or WAVEFORMATEXTENSIBLE structure. - @param nFormatSize Size of PaWinWaveFormat or WAVEFORMATEXTENSIBLE structure in bytes. - @param nDevice Device index. + Format is represented by PaWinWaveFormat or WAVEFORMATEXTENSIBLE structure and obtained + by getting the device property with a PKEY_AudioEngine_DeviceFormat key. + + @param pFormat Pointer to PaWinWaveFormat or WAVEFORMATEXTENSIBLE structure. + @param formatSize Size of PaWinWaveFormat or WAVEFORMATEXTENSIBLE structure in bytes. + @param device Device index. @return Non-negative value indicating the number of bytes copied into format decriptor - or, a PaErrorCode (which are always negative) if PortAudio is not initialized + or, a PaErrorCode (which is always negative) if PortAudio is not initialized or an error is encountered. */ -int PaWasapi_GetDeviceDefaultFormat( void *pFormat, unsigned int nFormatSize, PaDeviceIndex nDevice ); +int PaWasapi_GetDeviceDefaultFormat( void *pFormat, unsigned int formatSize, PaDeviceIndex device ); -/** Returns mix audio format for device in Shared Mode. Format is represented by - PaWinWaveFormat or WAVEFORMATEXTENSIBLE structureand obtained by +/** Get mix audio format for the device in Shared Mode. + + Format is represented by PaWinWaveFormat or WAVEFORMATEXTENSIBLE structureand obtained by IAudioClient::GetMixFormat. - @param pFormat Pointer to PaWinWaveFormat or WAVEFORMATEXTENSIBLE structure. - @param nFormatSize Size of PaWinWaveFormat or WAVEFORMATEXTENSIBLE structure in bytes. - @param nDevice Device index. + @param pFormat Pointer to PaWinWaveFormat or WAVEFORMATEXTENSIBLE structure. + @param formatSize Size of PaWinWaveFormat or WAVEFORMATEXTENSIBLE structure in bytes. + @param device Device index. @return Non-negative value indicating the number of bytes copied into format decriptor - or, a PaErrorCode (which are always negative) if PortAudio is not initialized + or, a PaErrorCode (which is always negative) if PortAudio is not initialized or an error is encountered. */ -int PaWasapi_GetDeviceMixFormat( void *pFormat, unsigned int nFormatSize, PaDeviceIndex nDevice ); +int PaWasapi_GetDeviceMixFormat( void *pFormat, unsigned int formatSize, PaDeviceIndex device ); -/** Returns device role (PaWasapiDeviceRole enum). +/** Get device role (PaWasapiDeviceRole enum). - @param nDevice Device index. + @param device Device index. - @return Non-negative value indicating device role or, a PaErrorCode (which are always negative) + @return Non-negative value indicating device role or, a PaErrorCode (which is always negative) if PortAudio is not initialized or an error is encountered. */ -int/*PaWasapiDeviceRole*/ PaWasapi_GetDeviceRole( PaDeviceIndex nDevice ); +int/*PaWasapiDeviceRole*/ PaWasapi_GetDeviceRole( PaDeviceIndex device ); -/** Boost thread priority of calling thread (MMCSS). Use it for Blocking Interface only for thread - which makes calls to Pa_WriteStream/Pa_ReadStream. +/** Boost thread priority of calling thread (MMCSS). - @param hTask Handle to pointer to priority task. Must be used with PaWasapi_RevertThreadPriority - method to revert thread priority to initial state. + Use it for Blocking Interface only inside the thread which makes calls to Pa_WriteStream/Pa_ReadStream. - @param nPriorityClass Id of thread priority of PaWasapiThreadPriority type. Specifying + @param pTask Handle to pointer to priority task. Must be used with PaWasapi_RevertThreadPriority + method to revert thread priority to initial state. + + @param priorityClass Id of thread priority of PaWasapiThreadPriority type. Specifying eThreadPriorityNone does nothing. @return Error code indicating success or failure. @see PaWasapi_RevertThreadPriority */ -PaError PaWasapi_ThreadPriorityBoost( void **hTask, PaWasapiThreadPriority nPriorityClass ); +PaError PaWasapi_ThreadPriorityBoost( void **pTask, PaWasapiThreadPriority priorityClass ); -/** Boost thread priority of calling thread (MMCSS). Use it for Blocking Interface only for thread - which makes calls to Pa_WriteStream/Pa_ReadStream. +/** Boost thread priority of calling thread (MMCSS). + + Use it for Blocking Interface only inside the thread which makes calls to Pa_WriteStream/Pa_ReadStream. + + @param pTask Task handle obtained by PaWasapi_BoostThreadPriority method. - @param hTask Task handle obtained by PaWasapi_BoostThreadPriority method. @return Error code indicating success or failure. @see PaWasapi_BoostThreadPriority */ -PaError PaWasapi_ThreadPriorityRevert( void *hTask ); +PaError PaWasapi_ThreadPriorityRevert( void *pTask ); -/** Get number of frames per host buffer. This is maximal value of frames of WASAPI buffer which - can be locked for operations. Use this method as helper to findout maximal values of - inputFrames/outputFrames of PaWasapiHostProcessorCallback. +/** Get number of frames per host buffer. + + It is max value of frames of WASAPI buffer which can be locked for operations. + Use this method as helper to findout max values of inputFrames/outputFrames + of PaWasapiHostProcessorCallback. + + @param pStream Pointer to PaStream object. + @param pInput Pointer to variable to receive number of input frames. Can be NULL. + @param pOutput Pointer to variable to receive number of output frames. Can be NULL. - @param pStream Pointer to PaStream to query. - @param nInput Pointer to variable to receive number of input frames. Can be NULL. - @param nOutput Pointer to variable to receive number of output frames. Can be NULL. @return Error code indicating success or failure. @see PaWasapiHostProcessorCallback */ -PaError PaWasapi_GetFramesPerHostBuffer( PaStream *pStream, unsigned int *nInput, unsigned int *nOutput ); +PaError PaWasapi_GetFramesPerHostBuffer( PaStream *pStream, unsigned int *pInput, unsigned int *pOutput ); -/** Get number of jacks associated with a WASAPI device. Use this method to determine if - there are any jacks associated with the provided WASAPI device. Not all audio devices - will support this capability. This is valid for both input and output devices. +/** Get number of jacks associated with a WASAPI device. + + Use this method to determine if there are any jacks associated with the provided WASAPI device. + Not all audio devices will support this capability. This is valid for both input and output devices. @note Not available on UWP platform. - @param nDevice device index. - @param jcount Number of jacks is returned in this variable - @return Error code indicating success or failure + @param device Device index. + @param pJackCount Pointer to variable to receive number of jacks. + + @return Error code indicating success or failure. @see PaWasapi_GetJackDescription */ -PaError PaWasapi_GetJackCount( PaDeviceIndex nDevice, int *jcount ); +PaError PaWasapi_GetJackCount( PaDeviceIndex device, int *pJackCount ); -/** Get the jack description associated with a WASAPI device and jack number +/** Get the jack description associated with a WASAPI device and jack number. + Before this function is called, use PaWasapi_GetJackCount to determine the number of jacks associated with device. If jcount is greater than zero, then each jack from 0 to jcount can be queried with this function to get the jack @@ -436,19 +499,21 @@ PaError PaWasapi_GetJackCount( PaDeviceIndex nDevice, int *jcount ); @note Not available on UWP platform. - @param nDevice device index. - @param jindex Which jack to return information + @param device Device index. + @param jackIndex Jack index. @param pJackDescription Pointer to PaWasapiJackDescription. - @return Error code indicating success or failure + + @return Error code indicating success or failure. @see PaWasapi_GetJackCount */ -PaError PaWasapi_GetJackDescription( PaDeviceIndex nDevice, int jindex, PaWasapiJackDescription *pJackDescription ); +PaError PaWasapi_GetJackDescription( PaDeviceIndex device, int jackIndex, PaWasapiJackDescription *pJackDescription ); /** Set default interface Id. - By default PA implementation will use DEVINTERFACE_AUDIO_RENDER and - DEVINTERFACE_AUDIO_CAPTURE if device Id is not provided explicitly. These default Ids - will not allow to use Exclusive mode on UWP platform and thus you must provide + + By default PA implementation will use DEVINTERFACE_AUDIO_RENDER and + DEVINTERFACE_AUDIO_CAPTURE if device Id is not provided explicitly. These default Ids + will not allow to use Exclusive mode on UWP platform and thus you must provide device Id explicitly via this API before calling Pa_OpenStream(). Device Ids on UWP platform are obtainable via Windows::Media::Devices::MediaDevice::GetDefaultAudioRenderId() or @@ -459,18 +524,30 @@ PaError PaWasapi_GetJackDescription( PaDeviceIndex nDevice, int jindex, PaWasapi @param pId Interface Id, pointer to the 16-bit Unicode string (WCHAR). If NULL then device Id will be reset to the default, e.g. DEVINTERFACE_AUDIO_RENDER or DEVINTERFACE_AUDIO_CAPTURE. @param bOutput TRUE (1) for output (render), FALSE (0) for input (capture). + @return Error code indicating success or failure. Will return paIncompatibleStreamHostApi if PA is not compiled for UWP platform. If Id is longer than 4096 characters paBufferTooBig will be returned. */ PaError PaWasapi_SetDefaultInterfaceId( unsigned short *pId, int bOutput ); +/** Set stream state handler. + + @param pStream Pointer to PaStream object. + @param fnStateHandler Pointer to state handling function. + @param pUserData Pointer to user data. + + @return Error code indicating success or failure. +*/ +PaError PaWasapi_SetStreamStateHandler( PaStream *pStream, PaWasapiStreamStateCallback fnStateHandler, void *pUserData ); + + /* IMPORTANT: WASAPI is implemented for Callback and Blocking interfaces. It supports Shared and Exclusive - share modes. - + share modes. + Exclusive Mode: Exclusive mode allows to deliver audio data directly to hardware bypassing @@ -479,20 +556,20 @@ PaError PaWasapi_SetDefaultInterfaceId( unsigned short *pId, int bOutput ); Callback Interface: - Provides best audio quality with low latency. Callback interface is implemented in + Provides best audio quality with low latency. Callback interface is implemented in two versions: 1) Event-Driven: This is the most powerful WASAPI implementation which provides glitch-free - audio at around 3ms latency in Exclusive mode. Lowest possible latency for this mode is - 3 ms for HD Audio class audio chips. For the Shared mode latency can not be + audio at around 3ms latency in Exclusive mode. Lowest possible latency for this mode is + 3 ms for HD Audio class audio chips. For the Shared mode latency can not be lower than 20 ms. 2) Poll-Driven: Polling is another 2-nd method to operate with WASAPI. It is less efficient than Event-Driven and provides latency at around 10-13ms. Polling must be used to overcome a system bug - under Windows Vista x64 when application is WOW64(32-bit) and Event-Driven method simply - times out (event handle is never signalled on buffer completion). Please note, such WOW64 bug + under Windows Vista x64 when application is WOW64(32-bit) and Event-Driven method simply + times out (event handle is never signalled on buffer completion). Please note, such WOW64 bug does not exist in Vista x86 or Windows 7. Polling can be setup by speciying 'paWinWasapiPolling' flag. Our WASAPI implementation detects WOW64 bug and sets 'paWinWasapiPolling' automatically. @@ -501,44 +578,51 @@ PaError PaWasapi_SetDefaultInterfaceId( unsigned short *pId, int bOutput ); Normally thread priority is set automatically and does not require modification. Although if user wants some tweaking thread priority can be modified by setting 'paWinWasapiThreadPriority' - flag and specifying 'PaWasapiStreamInfo::threadPriority' with value from PaWasapiThreadPriority + flag and specifying 'PaWasapiStreamInfo::threadPriority' with value from PaWasapiThreadPriority enum. Blocking Interface: Blocking interface is implemented but due to above described Poll-Driven method can not - deliver lowest possible latency. Specifying too low latency in Shared mode will result in + deliver lowest possible latency. Specifying too low latency in Shared mode will result in distorted audio although Exclusive mode adds stability. 8.24 format: - If paCustomFormat is specified as sample format then the implementation will understand it + If paCustomFormat is specified as sample format then the implementation will understand it as valid 24-bits inside 32-bit container (e.g. wBitsPerSample = 32, Samples.wValidBitsPerSample = 24). - - By using paCustomFormat there will be small optimization when samples are be copied - with Copy_24_To_24 by PA processor instead of conversion from packed 3-byte (24-bit) data + + By using paCustomFormat there will be small optimization when samples are be copied + with Copy_24_To_24 by PA processor instead of conversion from packed 3-byte (24-bit) data with Int24_To_Int32. Pa_IsFormatSupported: - To check format with correct Share Mode (Exclusive/Shared) you must supply PaWasapiStreamInfo - with flags paWinWasapiExclusive set through member of PaStreamParameters::hostApiSpecificStreamInfo - structure. - - If paWinWasapiExplicitSampleFormat flag is provided then implementation will not try to select - suitable close format and will return an error instead of paFormatIsSupported. By specifying - paWinWasapiExplicitSampleFormat flag it is possible to find out what sample formats are + To check format with correct Share Mode (Exclusive/Shared) you must supply PaWasapiStreamInfo + with flags paWinWasapiExclusive set through member of PaStreamParameters::hostApiSpecificStreamInfo + structure. + + If paWinWasapiExplicitSampleFormat flag is provided then implementation will not try to select + suitable close format and will return an error instead of paFormatIsSupported. By specifying + paWinWasapiExplicitSampleFormat flag it is possible to find out what sample formats are supported by Exclusive or Shared modes. Pa_OpenStream: To set desired Share Mode (Exclusive/Shared) you must supply - PaWasapiStreamInfo with flags paWinWasapiExclusive set through member of + PaWasapiStreamInfo with flags paWinWasapiExclusive set through member of PaStreamParameters::hostApiSpecificStreamInfo structure. + + Coding style for parameters and structure members of the public API: + + 1) bXXX - boolean, [1 (TRUE), 0 (FALSE)] + 2) pXXX - pointer + 3) fnXXX - pointer to function + 4) structure members are never prefixed with a type distinguisher */ #ifdef __cplusplus } #endif /* __cplusplus */ -#endif /* PA_WIN_WASAPI_H */ +#endif /* PA_WIN_WASAPI_H */ diff --git a/src/hostapi/wasapi/pa_win_wasapi.c b/src/hostapi/wasapi/pa_win_wasapi.c index 9809cda..e9d41b3 100644 --- a/src/hostapi/wasapi/pa_win_wasapi.c +++ b/src/hostapi/wasapi/pa_win_wasapi.c @@ -1,9 +1,10 @@ /* * Portable Audio I/O Library WASAPI implementation - * Copyright (c) 2006-2010 David Viens, Dmitry Kostjuchenko + * Copyright (c) 2006-2010 David Viens + * Copyright (c) 2010-2018 Dmitry Kostjuchenko * * Based on the Open Source API proposed by Ross Bencina - * Copyright (c) 1999-2002 Ross Bencina, Phil Burk + * Copyright (c) 1999-2018 Ross Bencina, Phil Burk * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files @@ -287,6 +288,10 @@ PA_THREAD_FUNC ProcThreadPoll(void *param); #define MAX_STR_LEN 512 +#ifdef PA_WINRT + #define PA_WASAPI_DEVICE_ID_LEN 4096 +#endif + enum { S_INPUT = 0, S_OUTPUT = 1, S_COUNT = 2, S_FULLDUPLEX = 0 }; // Number of packets which compose single contignous buffer. With trial and error it was calculated @@ -334,12 +339,6 @@ FAvRevertMmThreadCharacteristics pAvRevertMmThreadCharacteristics = NULL; FAvSetMmThreadPriority pAvSetMmThreadPriority = NULL; #endif -#ifdef PA_WINRT -#define PA_WASAPI_DEVICE_ID_LEN 4096 -static OLECHAR g_DefaultRenderId[PA_WASAPI_DEVICE_ID_LEN] = { 0 }; -static OLECHAR g_DefaultCaptureId[PA_WASAPI_DEVICE_ID_LEN] = { 0 }; -#endif - #define _GetProc(fun, type, name) { \ fun = (type) GetProcAddress(hDInputDLL,name); \ if (fun == NULL) { \ @@ -447,15 +446,15 @@ typedef struct PaWinUtilComInitializationResult comInitializationResult; - //this is the REAL number of devices, whether they are usefull to PA or not! + // this is the REAL number of devices, whether they are usefull to PA or not! UINT32 deviceCount; - WCHAR defaultRenderer [MAX_STR_LEN]; - WCHAR defaultCapturer [MAX_STR_LEN]; + WCHAR defaultRenderer[MAX_STR_LEN]; + WCHAR defaultCapturer[MAX_STR_LEN]; PaWasapiDeviceInfo *devInfo; - // Is true when WOW64 Vista/7 Workaround is needed + // is TRUE when WOW64 Vista/7 Workaround is needed BOOL useWOW64Workaround; } PaWasapiHostApiRepresentation; @@ -579,6 +578,10 @@ typedef struct PaWasapiStream // Thread priority level PaWasapiThreadPriority nThreadPriority; + + // State handler + PaWasapiStreamStateCallback fnStateHandler; + void *pStateHandlerUserData; } PaWasapiStream; @@ -601,6 +604,10 @@ static void PaWasapi_FreeMemory(void *ptr); static PaSampleFormat WaveToPaFormat(const WAVEFORMATEXTENSIBLE *fmtext); // Local statics +#ifdef PA_WINRT +static OLECHAR g_DefaultRenderId[PA_WASAPI_DEVICE_ID_LEN] = { 0 }; +static OLECHAR g_DefaultCaptureId[PA_WASAPI_DEVICE_ID_LEN] = { 0 }; +#endif // ------------------------------------------------------------------------------------------ #define LogHostError(HRES) __LogHostError(HRES, __FUNCTION__, __FILE__, __LINE__) @@ -846,7 +853,7 @@ static UINT32 ALIGN_FWD(UINT32 v, UINT32 align) // ------------------------------------------------------------------------------------------ // Get next value power of 2 -UINT32 ALIGN_NEXT_POW2(UINT32 v) +static UINT32 ALIGN_NEXT_POW2(UINT32 v) { UINT32 v2 = 1; while (v > (v2 <<= 1)) { } @@ -1578,6 +1585,18 @@ static DWORD SignalObjectAndWait(HANDLE hObjectToSignal, HANDLE hObjectToWaitOn, #endif #endif +// ------------------------------------------------------------------------------------------ +static void NotifyStateChanged(PaWasapiStream *stream, UINT32 flags, HRESULT hr) +{ + if (stream->fnStateHandler == NULL) + return; + + if (FAILED(hr)) + flags |= paWasapiStreamStateError; + + stream->fnStateHandler((PaStream *)stream, flags, hr, stream->pStateHandlerUserData); +} + // ------------------------------------------------------------------------------------------ static PaError CreateDeviceList(PaWasapiHostApiRepresentation *paWasapi, PaHostApiIndex hostApiIndex) { @@ -1679,7 +1698,8 @@ static PaError CreateDeviceList(PaWasapiHostApiRepresentation *paWasapi, PaHostA } #endif - paWasapi->devInfo = (PaWasapiDeviceInfo *)PaUtil_AllocateMemory(sizeof(PaWasapiDeviceInfo) * paWasapi->deviceCount); + paWasapi->devInfo = (PaWasapiDeviceInfo *)PaUtil_GroupAllocateMemory( + paWasapi->allocations, sizeof(PaWasapiDeviceInfo) * paWasapi->deviceCount); if (paWasapi->devInfo == NULL) { result = paInsufficientMemory; @@ -2008,7 +2028,7 @@ error: // ------------------------------------------------------------------------------------------ PaError PaWasapi_Initialize( PaUtilHostApiRepresentation **hostApi, PaHostApiIndex hostApiIndex ) { - PaError result = paInternalError; + PaError result; PaWasapiHostApiRepresentation *paWasapi; #ifndef PA_WINRT @@ -2027,10 +2047,12 @@ PaError PaWasapi_Initialize( PaUtilHostApiRepresentation **hostApi, PaHostApiInd } memset(paWasapi, 0, sizeof(PaWasapiHostApiRepresentation)); /* ensure all fields are zeroed. especially paWasapi->allocations */ + // Initialize COM subsystem result = PaWinUtil_CoInitialize(paWASAPI, &paWasapi->comInitializationResult); if (result != paNoError) goto error; + // Create memory group paWasapi->allocations = PaUtil_CreateAllocationGroup(); if (paWasapi->allocations == NULL) { @@ -2086,15 +2108,20 @@ static void ReleaseWasapiDeviceInfoList( PaWasapiHostApiRepresentation *paWasapi { UINT32 i; - // Release device info bound objects and device info itself + // Release device info bound objects for (i = 0; i < paWasapi->deviceCount; ++i) { #ifndef PA_WINRT SAFE_RELEASE(paWasapi->devInfo[i].device); #endif } - PaUtil_FreeMemory(paWasapi->devInfo); + // Free device info + if (paWasapi->allocations != NULL) + PaUtil_GroupFreeMemory(paWasapi->allocations, paWasapi->devInfo); + + // Be ready for a device list reinitialization and if its creation is failed pointers must not be dangling + paWasapi->devInfo = NULL; paWasapi->deviceCount = 0; } @@ -2105,16 +2132,20 @@ static void Terminate( PaUtilHostApiRepresentation *hostApi ) if (paWasapi == NULL) return; + // Release device list ReleaseWasapiDeviceInfoList(paWasapi); + // Free allocations and memory group itself if (paWasapi->allocations != NULL) { PaUtil_FreeAllAllocations(paWasapi->allocations); PaUtil_DestroyAllocationGroup(paWasapi->allocations); } - PaWinUtil_CoUninitialize( paWASAPI, &paWasapi->comInitializationResult ); + // Release COM subsystem + PaWinUtil_CoUninitialize(paWASAPI, &paWasapi->comInitializationResult); + // Free API representation PaUtil_FreeMemory(paWasapi); // Close AVRT @@ -2122,18 +2153,19 @@ static void Terminate( PaUtilHostApiRepresentation *hostApi ) } // ------------------------------------------------------------------------------------------ -static PaWasapiHostApiRepresentation *_GetHostApi(PaError *_error) +static PaWasapiHostApiRepresentation *_GetHostApi(PaError *ret) { PaError error; - PaUtilHostApiRepresentation *pApi; + if ((error = PaUtil_GetHostApiRepresentation(&pApi, paWASAPI)) != paNoError) { - if (_error != NULL) - (*_error) = error; + if (ret != NULL) + (*ret) = error; return NULL; } + return (PaWasapiHostApiRepresentation *)pApi; } @@ -2148,7 +2180,11 @@ static PaError UpdateDeviceList() // Get API hostApi = (PaUtilHostApiRepresentation *)(paWasapi = _GetHostApi(&ret)); if (paWasapi == NULL) - return ret; + return paNotInitialized; + + // Make sure initialized properly + if (paWasapi->allocations == NULL) + return paNotInitialized; // Release WASAPI internal device info list ReleaseWasapiDeviceInfoList(paWasapi); @@ -2163,6 +2199,8 @@ static PaError UpdateDeviceList() PaUtil_GroupFreeMemory(paWasapi->allocations, hostApi->deviceInfos[0]); PaUtil_GroupFreeMemory(paWasapi->allocations, hostApi->deviceInfos); + // Be ready for a device list reinitialization and if its creation is failed pointers must not be dangling + hostApi->deviceInfos = NULL; hostApi->info.deviceCount = 0; hostApi->info.defaultInputDevice = paNoDevice; hostApi->info.defaultOutputDevice = paNoDevice; @@ -2184,7 +2222,7 @@ PaError PaWasapi_UpdateDeviceList() #endif // ------------------------------------------------------------------------------------------ -int PaWasapi_GetDeviceCurrentFormat( PaStream *pStream, void *pFormat, unsigned int nFormatSize, int bOutput ) +int PaWasapi_GetDeviceCurrentFormat( PaStream *pStream, void *pFormat, unsigned int formatSize, int bOutput ) { UINT32 size; WAVEFORMATEXTENSIBLE *format; @@ -2195,14 +2233,14 @@ int PaWasapi_GetDeviceCurrentFormat( PaStream *pStream, void *pFormat, unsigned format = (bOutput == TRUE ? &stream->out.wavex : &stream->in.wavex); - size = min(nFormatSize, (UINT32)sizeof(*format)); + size = min(formatSize, (UINT32)sizeof(*format)); memcpy(pFormat, format, size); return size; } // ------------------------------------------------------------------------------------------ -int PaWasapi_GetDeviceDefaultFormat( void *pFormat, unsigned int nFormatSize, PaDeviceIndex nDevice ) +int PaWasapi_GetDeviceDefaultFormat( void *pFormat, unsigned int formatSize, PaDeviceIndex device ) { PaError ret; PaWasapiHostApiRepresentation *paWasapi; @@ -2211,7 +2249,7 @@ int PaWasapi_GetDeviceDefaultFormat( void *pFormat, unsigned int nFormatSize, Pa if (pFormat == NULL) return paBadBufferPtr; - if (nFormatSize <= 0) + if (formatSize <= 0) return paBufferTooSmall; // Get API @@ -2220,7 +2258,7 @@ int PaWasapi_GetDeviceDefaultFormat( void *pFormat, unsigned int nFormatSize, Pa return ret; // Get device index - ret = PaUtil_DeviceIndexToHostApiDeviceIndex(&index, nDevice, &paWasapi->inheritedHostApiRep); + ret = PaUtil_DeviceIndexToHostApiDeviceIndex(&index, device, &paWasapi->inheritedHostApiRep); if (ret != paNoError) return ret; @@ -2228,14 +2266,14 @@ int PaWasapi_GetDeviceDefaultFormat( void *pFormat, unsigned int nFormatSize, Pa if ((UINT32)index >= paWasapi->deviceCount) return paInvalidDevice; - size = min(nFormatSize, (UINT32)sizeof(paWasapi->devInfo[ index ].DefaultFormat)); + size = min(formatSize, (UINT32)sizeof(paWasapi->devInfo[ index ].DefaultFormat)); memcpy(pFormat, &paWasapi->devInfo[ index ].DefaultFormat, size); return size; } // ------------------------------------------------------------------------------------------ -int PaWasapi_GetDeviceMixFormat( void *pFormat, unsigned int nFormatSize, PaDeviceIndex nDevice ) +int PaWasapi_GetDeviceMixFormat( void *pFormat, unsigned int formatSize, PaDeviceIndex device ) { PaError ret; PaWasapiHostApiRepresentation *paWasapi; @@ -2244,7 +2282,7 @@ int PaWasapi_GetDeviceMixFormat( void *pFormat, unsigned int nFormatSize, PaDevi if (pFormat == NULL) return paBadBufferPtr; - if (nFormatSize <= 0) + if (formatSize <= 0) return paBufferTooSmall; // Get API @@ -2253,7 +2291,7 @@ int PaWasapi_GetDeviceMixFormat( void *pFormat, unsigned int nFormatSize, PaDevi return ret; // Get device index - ret = PaUtil_DeviceIndexToHostApiDeviceIndex(&index, nDevice, &paWasapi->inheritedHostApiRep); + ret = PaUtil_DeviceIndexToHostApiDeviceIndex(&index, device, &paWasapi->inheritedHostApiRep); if (ret != paNoError) return ret; @@ -2261,14 +2299,14 @@ int PaWasapi_GetDeviceMixFormat( void *pFormat, unsigned int nFormatSize, PaDevi if ((UINT32)index >= paWasapi->deviceCount) return paInvalidDevice; - size = min(nFormatSize, (UINT32)sizeof(paWasapi->devInfo[ index ].MixFormat)); + size = min(formatSize, (UINT32)sizeof(paWasapi->devInfo[ index ].MixFormat)); memcpy(pFormat, &paWasapi->devInfo[ index ].MixFormat, size); return size; } // ------------------------------------------------------------------------------------------ -int PaWasapi_GetDeviceRole( PaDeviceIndex nDevice ) +int PaWasapi_GetDeviceRole( PaDeviceIndex device ) { PaError ret; PaDeviceIndex index; @@ -2279,7 +2317,7 @@ int PaWasapi_GetDeviceRole( PaDeviceIndex nDevice ) return paNotInitialized; // Get device index - ret = PaUtil_DeviceIndexToHostApiDeviceIndex(&index, nDevice, &paWasapi->inheritedHostApiRep); + ret = PaUtil_DeviceIndexToHostApiDeviceIndex(&index, device, &paWasapi->inheritedHostApiRep); if (ret != paNoError) return ret; @@ -2291,17 +2329,17 @@ int PaWasapi_GetDeviceRole( PaDeviceIndex nDevice ) } // ------------------------------------------------------------------------------------------ -PaError PaWasapi_GetFramesPerHostBuffer( PaStream *pStream, unsigned int *nInput, unsigned int *nOutput ) +PaError PaWasapi_GetFramesPerHostBuffer( PaStream *pStream, unsigned int *pInput, unsigned int *pOutput ) { PaWasapiStream *stream = (PaWasapiStream *)pStream; if (stream == NULL) return paBadStreamPtr; - if (nInput != NULL) - (*nInput) = stream->in.framesPerHostCallback; + if (pInput != NULL) + (*pInput) = stream->in.framesPerHostCallback; - if (nOutput != NULL) - (*nOutput) = stream->out.framesPerHostCallback; + if (pOutput != NULL) + (*pOutput) = stream->out.framesPerHostCallback; return paNoError; } @@ -4844,19 +4882,19 @@ static void MMCSS_deactivate(HANDLE hTask) #endif // ------------------------------------------------------------------------------------------ -PaError PaWasapi_ThreadPriorityBoost(void **hTask, PaWasapiThreadPriority nPriorityClass) +PaError PaWasapi_ThreadPriorityBoost(void **pTask, PaWasapiThreadPriority priorityClass) { HANDLE task; PaError ret; - if (hTask == NULL) + if (pTask == NULL) return paUnanticipatedHostError; #ifndef PA_WINRT - if ((ret = MMCSS_activate(nPriorityClass, &task)) != paNoError) + if ((ret = MMCSS_activate(priorityClass, &task)) != paNoError) return ret; #else - switch (nPriorityClass) + switch (priorityClass) { case eThreadPriorityAudio: case eThreadPriorityProAudio: { @@ -4880,21 +4918,21 @@ PaError PaWasapi_ThreadPriorityBoost(void **hTask, PaWasapiThreadPriority nPrior } #endif - (*hTask) = task; + (*pTask) = task; return ret; } // ------------------------------------------------------------------------------------------ -PaError PaWasapi_ThreadPriorityRevert(void *hTask) +PaError PaWasapi_ThreadPriorityRevert(void *pTask) { - if (hTask == NULL) + if (pTask == NULL) return paUnanticipatedHostError; #ifndef PA_WINRT - MMCSS_deactivate((HANDLE)hTask); + MMCSS_deactivate((HANDLE)pTask); #else // Revert previous priority by removing 0x80000000 mask - if (SetThreadPriority(GetCurrentThread(), (int)((intptr_t)hTask & ~0x80000000)) == FALSE) + if (SetThreadPriority(GetCurrentThread(), (int)((intptr_t)pTask & ~0x80000000)) == FALSE) return paUnanticipatedHostError; #endif @@ -4905,7 +4943,7 @@ PaError PaWasapi_ThreadPriorityRevert(void *hTask) // Described at: // http://msdn.microsoft.com/en-us/library/dd371387(v=VS.85).aspx -PaError PaWasapi_GetJackCount(PaDeviceIndex nDevice, int *jcount) +PaError PaWasapi_GetJackCount(PaDeviceIndex device, int *pJackCount) { #ifndef PA_WINRT PaError ret; @@ -4922,47 +4960,50 @@ PaError PaWasapi_GetJackCount(PaDeviceIndex nDevice, int *jcount) if (paWasapi == NULL) return paNotInitialized; - // Get device index. - ret = PaUtil_DeviceIndexToHostApiDeviceIndex(&index, nDevice, &paWasapi->inheritedHostApiRep); + if (pJackCount == NULL) + return paUnanticipatedHostError; + + // Get device index + ret = PaUtil_DeviceIndexToHostApiDeviceIndex(&index, device, &paWasapi->inheritedHostApiRep); if (ret != paNoError) return ret; - // Validate index. + // Validate index if ((UINT32)index >= paWasapi->deviceCount) return paInvalidDevice; - // Get the endpoint device's IDeviceTopology interface. + // Get the endpoint device's IDeviceTopology interface hr = IMMDevice_Activate(paWasapi->devInfo[index].device, &pa_IID_IDeviceTopology, CLSCTX_INPROC_SERVER, NULL, (void**)&pDeviceTopology); IF_FAILED_JUMP(hr, error); - // The device topology for an endpoint device always contains just one connector (connector number 0). + // The device topology for an endpoint device always contains just one connector (connector number 0) hr = IDeviceTopology_GetConnector(pDeviceTopology, 0, &pConnFrom); IF_FAILED_JUMP(hr, error); - // Step across the connection to the jack on the adapter. + // Step across the connection to the jack on the adapter hr = IConnector_GetConnectedTo(pConnFrom, &pConnTo); if (HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND) == hr) { - // The adapter device is not currently active. + // The adapter device is not currently active hr = E_NOINTERFACE; } IF_FAILED_JUMP(hr, error); - // Get the connector's IPart interface. + // Get the connector's IPart interface hr = IConnector_QueryInterface(pConnTo, &pa_IID_IPart, (void**)&pPart); IF_FAILED_JUMP(hr, error); - // Activate the connector's IKsJackDescription interface. + // Activate the connector's IKsJackDescription interface hr = IPart_Activate(pPart, CLSCTX_INPROC_SERVER, &pa_IID_IKsJackDescription, (void**)&pJackDesc); IF_FAILED_JUMP(hr, error); - // Return jack count for this device. + // Return jack count for this device hr = IKsJackDescription_GetJackCount(pJackDesc, &jackCount); IF_FAILED_JUMP(hr, error); // Set. - (*jcount) = jackCount; + (*pJackCount) = jackCount; // Ok. ret = paNoError; @@ -4978,8 +5019,8 @@ error: LogHostError(hr); return paNoError; #else - (void)nDevice; - (void)jcount; + (void)device; + (void)pJackCount; return paUnanticipatedHostError; #endif } @@ -5077,7 +5118,7 @@ static PaWasapiJackPortConnection _ConvertJackPortConnectionWASAPIToPA(int portC // Described at: // http://msdn.microsoft.com/en-us/library/dd371387(v=VS.85).aspx -PaError PaWasapi_GetJackDescription(PaDeviceIndex nDevice, int jindex, PaWasapiJackDescription *pJackDescription) +PaError PaWasapi_GetJackDescription(PaDeviceIndex device, int jackIndex, PaWasapiJackDescription *pJackDescription) { #ifndef PA_WINRT PaError ret; @@ -5094,46 +5135,46 @@ PaError PaWasapi_GetJackDescription(PaDeviceIndex nDevice, int jindex, PaWasapiJ if (paWasapi == NULL) return paNotInitialized; - // Get device index. - ret = PaUtil_DeviceIndexToHostApiDeviceIndex(&index, nDevice, &paWasapi->inheritedHostApiRep); + // Get device index + ret = PaUtil_DeviceIndexToHostApiDeviceIndex(&index, device, &paWasapi->inheritedHostApiRep); if (ret != paNoError) return ret; - // Validate index. + // Validate index if ((UINT32)index >= paWasapi->deviceCount) return paInvalidDevice; - // Get the endpoint device's IDeviceTopology interface. + // Get the endpoint device's IDeviceTopology interface hr = IMMDevice_Activate(paWasapi->devInfo[index].device, &pa_IID_IDeviceTopology, CLSCTX_INPROC_SERVER, NULL, (void**)&pDeviceTopology); IF_FAILED_JUMP(hr, error); - // The device topology for an endpoint device always contains just one connector (connector number 0). + // The device topology for an endpoint device always contains just one connector (connector number 0) hr = IDeviceTopology_GetConnector(pDeviceTopology, 0, &pConnFrom); IF_FAILED_JUMP(hr, error); - // Step across the connection to the jack on the adapter. + // Step across the connection to the jack on the adapter hr = IConnector_GetConnectedTo(pConnFrom, &pConnTo); if (HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND) == hr) { - // The adapter device is not currently active. + // The adapter device is not currently active hr = E_NOINTERFACE; } IF_FAILED_JUMP(hr, error); - // Get the connector's IPart interface. + // Get the connector's IPart interface hr = IConnector_QueryInterface(pConnTo, &pa_IID_IPart, (void**)&pPart); IF_FAILED_JUMP(hr, error); - // Activate the connector's IKsJackDescription interface. + // Activate the connector's IKsJackDescription interface hr = IPart_Activate(pPart, CLSCTX_INPROC_SERVER, &pa_IID_IKsJackDescription, (void**)&pJackDesc); IF_FAILED_JUMP(hr, error); - // Test to return jack description struct for index 0. - hr = IKsJackDescription_GetJackDescription(pJackDesc, jindex, &jack); + // Test to return jack description struct for index 0 + hr = IKsJackDescription_GetJackDescription(pJackDesc, jackIndex, &jack); IF_FAILED_JUMP(hr, error); - // Convert WASAPI values to PA format. + // Convert WASAPI values to PA format pJackDescription->channelMapping = jack.ChannelMapping; pJackDescription->color = jack.Color; pJackDescription->connectionType = _ConvertJackConnectionTypeWASAPIToPA(jack.ConnectionType); @@ -5142,7 +5183,7 @@ PaError PaWasapi_GetJackDescription(PaDeviceIndex nDevice, int jindex, PaWasapiJ pJackDescription->isConnected = jack.IsConnected; pJackDescription->portConnection = _ConvertJackPortConnectionWASAPIToPA(jack.PortConnection); - // Ok. + // Ok ret = paNoError; error: @@ -5157,8 +5198,8 @@ error: return ret; #else - (void)nDevice; - (void)jindex; + (void)device; + (void)jackIndex; (void)pJackDescription; return paUnanticipatedHostError; #endif @@ -5183,11 +5224,12 @@ PaError PaWasapi_GetAudioClient(PaStream *pStream, void **pAudioClient, int bOut PaError PaWasapi_SetDefaultInterfaceId( unsigned short *pId, int bOutput ) { #ifdef PA_WINRT + int i; // Validate Id length if (pId != NULL) { - for (int i = 0; pId[i] != 0; ++i) + for (i = 0; pId[i] != 0; ++i) { if (i >= PA_WASAPI_DEVICE_ID_LEN) return paBufferTooBig; @@ -5200,7 +5242,7 @@ PaError PaWasapi_SetDefaultInterfaceId( unsigned short *pId, int bOutput ) memset(g_DefaultRenderId, 0, sizeof(g_DefaultRenderId)); if (pId != NULL) { - for (int i = 0; (pId[i] != 0) && (i < STATIC_ARRAY_SIZE(g_DefaultRenderId)); ++i) + for (i = 0; (pId[i] != 0) && (i < STATIC_ARRAY_SIZE(g_DefaultRenderId)); ++i) g_DefaultRenderId[i] = pId[i]; } } @@ -5209,7 +5251,7 @@ PaError PaWasapi_SetDefaultInterfaceId( unsigned short *pId, int bOutput ) memset(g_DefaultCaptureId, 0, sizeof(g_DefaultCaptureId)); if (pId != NULL) { - for (int i = 0; (pId[i] != 0) && (i < STATIC_ARRAY_SIZE(g_DefaultCaptureId)); ++i) + for (i = 0; (pId[i] != 0) && (i < STATIC_ARRAY_SIZE(g_DefaultCaptureId)); ++i) g_DefaultCaptureId[i] = pId[i]; } } @@ -5221,6 +5263,19 @@ PaError PaWasapi_SetDefaultInterfaceId( unsigned short *pId, int bOutput ) #endif } +// ------------------------------------------------------------------------------------------ +PaError PaWasapi_SetStreamStateHandler( PaStream *pStream, PaWasapiStreamStateCallback fnStateHandler, void *pUserData ) +{ + PaWasapiStream *stream = (PaWasapiStream *)pStream; + if (stream == NULL) + return paBadStreamPtr; + + stream->fnStateHandler = fnStateHandler; + stream->pStateHandlerUserData = pUserData; + + return paNoError; +} + // ------------------------------------------------------------------------------------------ HRESULT _PollGetOutputFramesAvailable(PaWasapiStream *stream, UINT32 *available) { @@ -5448,6 +5503,9 @@ PA_THREAD_FUNC ProcThreadEvent(void *param) BOOL bWaitAllEvents = FALSE; BOOL bThreadComInitialized = FALSE; + // Notify: state + NotifyStateChanged(stream, paWasapiStreamStateThreadPrepare, ERROR_SUCCESS); + /* If COM is already initialized CoInitialize will either return FALSE, or RPC_E_CHANGED_MODE if it was initialized in a different @@ -5560,6 +5618,9 @@ PA_THREAD_FUNC ProcThreadEvent(void *param) // Notify: thread started SetEvent(stream->hThreadStart); + // Notify: state + NotifyStateChanged(stream, paWasapiStreamStateThreadStart, ERROR_SUCCESS); + // Processing Loop for (;;) { @@ -5627,6 +5688,9 @@ thread_end: // Notify: thread exited SetEvent(stream->hThreadExit); + // Notify: state + NotifyStateChanged(stream, paWasapiStreamStateThreadStop, hr); + return 0; thread_error: @@ -5655,6 +5719,9 @@ PA_THREAD_FUNC ProcThreadPoll(void *param) BOOL bThreadComInitialized = FALSE; + // Notify: state + NotifyStateChanged(stream, paWasapiStreamStateThreadPrepare, ERROR_SUCCESS); + /* If COM is already initialized CoInitialize will either return FALSE, or RPC_E_CHANGED_MODE if it was initialized in a different @@ -5797,6 +5864,9 @@ PA_THREAD_FUNC ProcThreadPoll(void *param) // Notify: thread started SetEvent(stream->hThreadStart); + // Notify: state + NotifyStateChanged(stream, paWasapiStreamStateThreadStart, ERROR_SUCCESS); + if (!PA_WASAPI__IS_FULLDUPLEX(stream)) { // Processing Loop @@ -6152,6 +6222,9 @@ thread_end: // Notify: thread exited SetEvent(stream->hThreadExit); + // Notify: state + NotifyStateChanged(stream, paWasapiStreamStateThreadStop, hr); + return 0; thread_error: From 96f81c0ec1f7bd50f29d7298d927bfeb503ac0f3 Mon Sep 17 00:00:00 2001 From: dmitrykos Date: Sat, 23 Feb 2019 23:02:38 +0200 Subject: [PATCH 003/164] wasapi: Improved audio output stability in Exclusive mode for some UAC2 DACs with custom USB Audio driver by calculating buffer periodicity being equal (or almost equal) to the requested user frames (Capturing is excluded from this implementation as it has not yet been tested but can be included if tests show the improvement), cleanup/refactor some code to make it better readable --- src/hostapi/wasapi/pa_win_wasapi.c | 362 +++++++++++++---------------- 1 file changed, 167 insertions(+), 195 deletions(-) diff --git a/src/hostapi/wasapi/pa_win_wasapi.c b/src/hostapi/wasapi/pa_win_wasapi.c index e9d41b3..1dc888e 100644 --- a/src/hostapi/wasapi/pa_win_wasapi.c +++ b/src/hostapi/wasapi/pa_win_wasapi.c @@ -1,10 +1,10 @@ /* * Portable Audio I/O Library WASAPI implementation * Copyright (c) 2006-2010 David Viens - * Copyright (c) 2010-2018 Dmitry Kostjuchenko + * Copyright (c) 2010-2019 Dmitry Kostjuchenko * * Based on the Open Source API proposed by Ross Bencina - * Copyright (c) 1999-2018 Ross Bencina, Phil Burk + * Copyright (c) 1999-2019 Ross Bencina, Phil Burk * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files @@ -54,6 +54,13 @@ #define PA_WASAPI_MAX_CONST_DEVICE_COUNT 0 // Force basic behavior by defining 0 if not defined by user #endif +// Fallback from Event to the Polling method in case if latency is higher than 21.33ms, as it allows to use +// 100% of CPU inside the PA's callback. +// Note: Some USB DAC drivers are buggy when Polling method is forced in Exclusive mode, audio output becomes +// unstable with a lot of interruptions, therefore this define is optional. The default behavior is to +// not change the Event mode to Polling and use the mode which user provided. +//#define PA_WASAPI_FORCE_POLL_IF_LARGE_BUFFER + // WinRT #if defined(WINAPI_FAMILY) && (WINAPI_FAMILY == WINAPI_FAMILY_APP) #define PA_WINRT @@ -1686,12 +1693,12 @@ static PaError CreateDeviceList(PaWasapiHostApiRepresentation *paWasapi, PaHostA #else // Determine number of available devices by activating AudioClient for render and capture data flows - if (!FAILED(ActivateAudioInterface_WINRT(eRender, GetAudioClientIID(), &tmpClient))) + if (SUCCEEDED(ActivateAudioInterface_WINRT(eRender, GetAudioClientIID(), &tmpClient))) { paWasapi->deviceCount++; SAFE_RELEASE(tmpClient); } - if (!FAILED(ActivateAudioInterface_WINRT(eCapture, GetAudioClientIID(), &tmpClient))) + if (SUCCEEDED(ActivateAudioInterface_WINRT(eCapture, GetAudioClientIID(), &tmpClient))) { paWasapi->deviceCount++; SAFE_RELEASE(tmpClient); @@ -2034,7 +2041,7 @@ PaError PaWasapi_Initialize( PaUtilHostApiRepresentation **hostApi, PaHostApiInd #ifndef PA_WINRT if (!SetupAVRT()) { - PRINT(("WASAPI: No AVRT! (not VISTA?)")); + PRINT(("WASAPI: No AVRT! (not VISTA?)\n")); return paNoError; } #endif @@ -2872,8 +2879,7 @@ static void _RecalculateBuffersCount(PaWasapiSubStream *sub, UINT32 userFramesPe } // ------------------------------------------------------------------------------------------ -static void _CalculateAlignedPeriod(PaWasapiSubStream *pSub, UINT32 *nFramesPerLatency, - ALIGN_FUNC pAlignFunc) +static void _CalculateAlignedPeriod(PaWasapiSubStream *pSub, UINT32 *nFramesPerLatency, ALIGN_FUNC pAlignFunc) { // Align frames to HD Audio packet size of 128 bytes for Exclusive mode only. // Not aligning on Windows Vista will cause Event timeout, although Windows 7 will @@ -2889,21 +2895,66 @@ static void _CalculateAlignedPeriod(PaWasapiSubStream *pSub, UINT32 *nFramesPerL pSub->period = MakeHnsPeriod((*nFramesPerLatency), pSub->wavex.Format.nSamplesPerSec); } +// ------------------------------------------------------------------------------------------ +static void _CalculatePeriodicity(PaWasapiSubStream *pSub, BOOL output, REFERENCE_TIME *periodicity) +{ + // Note: according Microsoft docs for IAudioClient::Initialize we can set periodicity of the buffer + // only for Exclusive mode. By setting periodicity almost equal to the user buffer frames we can + // achieve high quality (less glitchy) low-latency audio. + if (pSub->shareMode == AUDCLNT_SHAREMODE_EXCLUSIVE) + { + const PaWasapiDeviceInfo *pInfo = pSub->params.device_info; + + // By default periodicity equals to the full buffer (legacy PA WASAPI's behavior) + (*periodicity) = pSub->period; + + // Try make buffer ready for I/O once we request the buffer readiness for it. Only Polling mode + // because for Event mode buffer size and periodicity must be equal according Microsoft + // documentation for IAudioClient::Initialize. + // + // TO-DO: try spread to capture and full-duplex cases (not tested and therefore disabled) + // + if (((pSub->streamFlags & AUDCLNT_STREAMFLAGS_EVENTCALLBACK) == 0) && + (output && !pSub->params.full_duplex)) + { + UINT32 alignedFrames; + REFERENCE_TIME userPeriodicity; + + // Align frames backwards, so device will likely make buffer read ready when we are ready + // to read it (our sheduling will wait for amount of millisoconds of frames_per_buffer) + alignedFrames = AlignFramesPerBuffer(pSub->params.frames_per_buffer, + pSub->wavex.Format.nSamplesPerSec, pSub->wavex.Format.nBlockAlign, ALIGN_BWD); + + userPeriodicity = MakeHnsPeriod(alignedFrames, pSub->wavex.Format.nSamplesPerSec); + + // Must not be larger than buffer size + if (userPeriodicity > pSub->period) + userPeriodicity = pSub->period; + + // Must not be smaller than minimum supported by the device + if (userPeriodicity < pInfo->MinimumDevicePeriod) + userPeriodicity = pInfo->MinimumDevicePeriod; + + (*periodicity) = userPeriodicity; + } + } + else + (*periodicity) = 0; +} + // ------------------------------------------------------------------------------------------ static HRESULT CreateAudioClient(PaWasapiStream *pStream, PaWasapiSubStream *pSub, BOOL output, PaError *pa_error) { PaError error; HRESULT hr; - const PaWasapiDeviceInfo *pInfo = pSub->params.device_info; const PaStreamParameters *params = &pSub->params.stream_params; - UINT32 framesPerLatency = pSub->params.frames_per_buffer; - double sampleRate = pSub->params.sample_rate; - //BOOL blocking = pSub->params.blocking; - BOOL fullDuplex = pSub->params.full_duplex; - - const UINT32 userFramesPerBuffer = framesPerLatency; - IAudioClient *audioClient = NULL; + const double sampleRate = pSub->params.sample_rate; + const BOOL fullDuplex = pSub->params.full_duplex; + const UINT32 userFramesPerBuffer = pSub->params.frames_per_buffer; + UINT32 framesPerLatency = userFramesPerBuffer; + IAudioClient *audioClient = NULL; + REFERENCE_TIME eventPeriodicity = 0; // Assume default failure due to some reason (*pa_error) = paInvalidDevice; @@ -2921,8 +2972,7 @@ static HRESULT CreateAudioClient(PaWasapiStream *pStream, PaWasapiSubStream *pSu } // Get the audio client - hr = ActivateAudioInterface(pInfo, &audioClient); - if (hr != S_OK) + if (FAILED(hr = ActivateAudioInterface(pInfo, &audioClient))) { (*pa_error) = paInsufficientMemory; LogHostError(hr); @@ -2940,12 +2990,6 @@ static HRESULT CreateAudioClient(PaWasapiStream *pStream, PaWasapiSubStream *pSu // Check for Mono <<>> Stereo workaround if ((params->channelCount == 1) && (pSub->wavex.Format.nChannels == 2)) { - /*if (blocking) - { - LogHostError(hr = AUDCLNT_E_UNSUPPORTED_FORMAT); - goto done; // fail, blocking mode not supported - }*/ - // select mixer pSub->monoMixer = GetMonoToStereoMixer(&pSub->wavex, (pInfo->flow == eRender ? MIX_DIR__1TO2 : MIX_DIR__2TO1_L)); if (pSub->monoMixer == NULL) @@ -2956,10 +3000,6 @@ static HRESULT CreateAudioClient(PaWasapiStream *pStream, PaWasapiSubStream *pSu } } -#if 0 - // Add suggestd latency - framesPerLatency += MakeFramesFromHns(SecondsTonano100(params->suggestedLatency), pSub->wavex.Format.nSamplesPerSec); -#else // Calculate host buffer size if ((pSub->shareMode != AUDCLNT_SHAREMODE_EXCLUSIVE) && (!pSub->streamFlags || ((pSub->streamFlags & AUDCLNT_STREAMFLAGS_EVENTCALLBACK) == 0))) @@ -2970,13 +3010,16 @@ static HRESULT CreateAudioClient(PaWasapiStream *pStream, PaWasapiSubStream *pSu } else { + #ifdef PA_WASAPI_FORCE_POLL_IF_LARGE_BUFFER REFERENCE_TIME overall; + #endif // Work 1:1 with user buffer (only polling allows to use >1) framesPerLatency += MakeFramesFromHns(SecondsTonano100(params->suggestedLatency), pSub->wavex.Format.nSamplesPerSec); - // Use Polling if overall latency is >= 21.33ms as it allows to use 100% CPU in a callback, - // or user specified latency parameter + // Force Polling if overall latency is >= 21.33ms as it allows to use 100% CPU in a callback, + // or user specified latency parameter. + #ifdef PA_WASAPI_FORCE_POLL_IF_LARGE_BUFFER overall = MakeHnsPeriod(framesPerLatency, pSub->wavex.Format.nSamplesPerSec); if (overall >= (106667 * 2)/*21.33ms*/) { @@ -2988,8 +3031,8 @@ static HRESULT CreateAudioClient(PaWasapiStream *pStream, PaWasapiSubStream *pSu pSub->streamFlags &= ~AUDCLNT_STREAMFLAGS_EVENTCALLBACK; PRINT(("WASAPI: CreateAudioClient: forcing POLL mode\n")); } + #endif } -#endif // For full-duplex output resize buffer to be the same as for input if (output && fullDuplex) @@ -3019,6 +3062,7 @@ static HRESULT CreateAudioClient(PaWasapiStream *pStream, PaWasapiSubStream *pSu if (pSub->period < pInfo->DefaultDevicePeriod) { pSub->period = pInfo->DefaultDevicePeriod; + // Recalculate aligned period framesPerLatency = MakeFramesFromHns(pSub->period, pSub->wavex.Format.nSamplesPerSec); _CalculateAlignedPeriod(pSub, &framesPerLatency, ALIGN_BWD); @@ -3029,6 +3073,7 @@ static HRESULT CreateAudioClient(PaWasapiStream *pStream, PaWasapiSubStream *pSu if (pSub->period < pInfo->MinimumDevicePeriod) { pSub->period = pInfo->MinimumDevicePeriod; + // Recalculate aligned period framesPerLatency = MakeFramesFromHns(pSub->period, pSub->wavex.Format.nSamplesPerSec); _CalculateAlignedPeriod(pSub, &framesPerLatency, ALIGN_FWD); @@ -3050,21 +3095,25 @@ static HRESULT CreateAudioClient(PaWasapiStream *pStream, PaWasapiSubStream *pSu static const REFERENCE_TIME MAX_BUFFER_EVENT_DURATION = 500 * 10000; static const REFERENCE_TIME MAX_BUFFER_POLL_DURATION = 2000 * 10000; - if (pSub->streamFlags & AUDCLNT_STREAMFLAGS_EVENTCALLBACK) // pull mode, max 500ms + // Pull mode, max 500ms + if (pSub->streamFlags & AUDCLNT_STREAMFLAGS_EVENTCALLBACK) { if (pSub->period > MAX_BUFFER_EVENT_DURATION) { pSub->period = MAX_BUFFER_EVENT_DURATION; + // Recalculate aligned period framesPerLatency = MakeFramesFromHns(pSub->period, pSub->wavex.Format.nSamplesPerSec); _CalculateAlignedPeriod(pSub, &framesPerLatency, ALIGN_BWD); } } - else // push mode, max 2000ms + // Push mode, max 2000ms + else { if (pSub->period > MAX_BUFFER_POLL_DURATION) { pSub->period = MAX_BUFFER_POLL_DURATION; + // Recalculate aligned period framesPerLatency = MakeFramesFromHns(pSub->period, pSub->wavex.Format.nSamplesPerSec); _CalculateAlignedPeriod(pSub, &framesPerLatency, ALIGN_BWD); @@ -3093,8 +3142,7 @@ static HRESULT CreateAudioClient(PaWasapiStream *pStream, PaWasapiSubStream *pSu break; } - hr = IAudioClient2_SetClientProperties((IAudioClient2 *)audioClient, (AudioClientProperties *)&audioProps); - if (hr != S_OK) + if (FAILED(hr = IAudioClient2_SetClientProperties((IAudioClient2 *)audioClient, (AudioClientProperties *)&audioProps))) { PRINT(("WASAPI: IAudioClient2_SetClientProperties(IsOffload = %d, Category = %d, Options = %d) failed\n", audioProps.bIsOffload, audioProps.eCategory, audioProps.Options)); LogHostError(hr); @@ -3106,36 +3154,38 @@ static HRESULT CreateAudioClient(PaWasapiStream *pStream, PaWasapiSubStream *pSu } #endif + // Set device scheduling period (always 0 in Shared mode according Microsoft docs) + _CalculatePeriodicity(pSub, output, &eventPeriodicity); + // Open the stream and associate it with an audio session hr = IAudioClient_Initialize(audioClient, pSub->shareMode, pSub->streamFlags, pSub->period, - (pSub->shareMode == AUDCLNT_SHAREMODE_EXCLUSIVE ? pSub->period : 0), + eventPeriodicity, &pSub->wavex.Format, NULL); // [Output only] Check if buffer size is the one we requested in Exclusive mode, for UAC1 USB DACs WASAPI - // allocates internal buffer equal to 8 times of pSub->period that has to be corrected in order to match + // can allocate internal buffer equal to 8 times of pSub->period that has to be corrected in order to match // the requested latency - if (output && (hr == S_OK) && (pSub->shareMode == AUDCLNT_SHAREMODE_EXCLUSIVE)) + if (output && SUCCEEDED(hr) && (pSub->shareMode == AUDCLNT_SHAREMODE_EXCLUSIVE)) { - UINT32 maxBufferSize = 0; + UINT32 maxBufferFrames; - hr = IAudioClient_GetBufferSize(audioClient, &maxBufferSize); - if (hr != S_OK) + if (FAILED(hr = IAudioClient_GetBufferSize(audioClient, &maxBufferFrames))) { (*pa_error) = paInvalidDevice; LogHostError(hr); goto done; } - // For Exclusive mode for UAC1 devices maxBufferSize will be framesPerLatency * 8 but check any difference + // For Exclusive mode for UAC1 devices maxBufferFrames may be framesPerLatency * 8 but check any difference // to be able to guarantee the latency user requested and also resulted framesPerLatency may be bigger than // 2 seconds that will cause audio client not operational (GetCurrentPadding() will return always 0) - if (maxBufferSize >= (framesPerLatency * 2)) + if (maxBufferFrames >= (framesPerLatency * 2)) { - UINT32 ratio = maxBufferSize / framesPerLatency; + UINT32 ratio = maxBufferFrames / framesPerLatency; PRINT(("WASAPI: CreateAudioClient: detected %d times larger buffer than requested, correct to match user latency\n", ratio)); @@ -3151,20 +3201,22 @@ static HRESULT CreateAudioClient(PaWasapiStream *pStream, PaWasapiSubStream *pSu SAFE_RELEASE(audioClient); // Create a new audio client - hr = ActivateAudioInterface(pInfo, &audioClient); - if (hr != S_OK) + if (FAILED(hr = ActivateAudioInterface(pInfo, &audioClient))) { (*pa_error) = paInsufficientMemory; LogHostError(hr); goto done; } + // Set device scheduling period (always 0 in Shared mode according Microsoft docs) + _CalculatePeriodicity(pSub, output, &eventPeriodicity); + // Open the stream and associate it with an audio session hr = IAudioClient_Initialize(audioClient, pSub->shareMode, pSub->streamFlags, pSub->period, - (pSub->shareMode == AUDCLNT_SHAREMODE_EXCLUSIVE ? pSub->period : 0), + eventPeriodicity, &pSub->wavex.Format, NULL); } @@ -3189,132 +3241,61 @@ static HRESULT CreateAudioClient(PaWasapiStream *pStream, PaWasapiSubStream *pSu SAFE_RELEASE(audioClient); // Create a new audio client - hr = ActivateAudioInterface(pInfo, &audioClient); - if (hr != S_OK) + if (FAILED(hr = ActivateAudioInterface(pInfo, &audioClient))) { (*pa_error) = paInsufficientMemory; LogHostError(hr); goto done; } + // Set device scheduling period (always 0 in Shared mode according Microsoft docs) + _CalculatePeriodicity(pSub, output, &eventPeriodicity); + // Open the stream and associate it with an audio session hr = IAudioClient_Initialize(audioClient, pSub->shareMode, pSub->streamFlags, pSub->period, - (pSub->shareMode == AUDCLNT_SHAREMODE_EXCLUSIVE ? pSub->period : 0), + eventPeriodicity, &pSub->wavex.Format, NULL); } - /*! WASAPI buffer size failure. Fallback to using default size. + /*! WASAPI buffer size or alignment failure. Fallback to using default size and alignment. */ - if (hr == AUDCLNT_E_BUFFER_SIZE_ERROR) + if ((hr == AUDCLNT_E_BUFFER_SIZE_ERROR) || (hr == AUDCLNT_E_BUFFER_SIZE_NOT_ALIGNED)) { // Use default pSub->period = pInfo->DefaultDevicePeriod; - PRINT(("WASAPI: CreateAudioClient: correcting buffer size to device default\n")); + PRINT(("WASAPI: CreateAudioClient: correcting buffer size/alignment to device default\n")); // Release the previous allocations SAFE_RELEASE(audioClient); // Create a new audio client - hr = ActivateAudioInterface(pInfo, &audioClient); - if (hr != S_OK) + if (FAILED(hr = ActivateAudioInterface(pInfo, &audioClient))) { (*pa_error) = paInsufficientMemory; LogHostError(hr); goto done; } + // Set device scheduling period (always 0 in Shared mode according Microsoft docs) + _CalculatePeriodicity(pSub, output, &eventPeriodicity); + // Open the stream and associate it with an audio session hr = IAudioClient_Initialize(audioClient, pSub->shareMode, pSub->streamFlags, pSub->period, - (pSub->shareMode == AUDCLNT_SHAREMODE_EXCLUSIVE ? pSub->period : 0), + eventPeriodicity, &pSub->wavex.Format, NULL); } - /*! If the requested buffer size is not aligned. Can be triggered by Windows 7 and up. - Should not be be triggered ever as we do align buffers always with _CalculateAlignedPeriod. - */ - if (hr == AUDCLNT_E_BUFFER_SIZE_NOT_ALIGNED) - { - UINT32 frames = 0; - - // Get the next aligned frame - hr = IAudioClient_GetBufferSize(audioClient, &frames); - if (hr != S_OK) - { - (*pa_error) = paInvalidDevice; - LogHostError(hr); - goto done; - } - - PRINT(("WASAPI: CreateAudioClient: aligning buffer size to % frames\n", frames)); - - // Release the previous allocations - SAFE_RELEASE(audioClient); - - // Create a new audio client - hr = ActivateAudioInterface(pInfo, &audioClient); - if (hr != S_OK) - { - (*pa_error) = paInsufficientMemory; - LogHostError(hr); - goto done; - } - - // Get closest format - if ((error = GetClosestFormat(audioClient, sampleRate, params, pSub->shareMode, &pSub->wavex, output)) != paFormatIsSupported) - { - (*pa_error) = error; - LogHostError(hr = AUDCLNT_E_UNSUPPORTED_FORMAT); // fail, format not supported - goto done; - } - - // Check for Mono >> Stereo workaround - if ((params->channelCount == 1) && (pSub->wavex.Format.nChannels == 2)) - { - /*if (blocking) - { - LogHostError(hr = AUDCLNT_E_UNSUPPORTED_FORMAT); - goto done; // fail, blocking mode not supported - }*/ - - // Select mixer - pSub->monoMixer = GetMonoToStereoMixer(&pSub->wavex, (pInfo->flow == eRender ? MIX_DIR__1TO2 : MIX_DIR__2TO1_L)); - if (pSub->monoMixer == NULL) - { - (*pa_error) = paInvalidChannelCount; - LogHostError(hr = AUDCLNT_E_UNSUPPORTED_FORMAT); - goto done; // fail, no mixer for format - } - } - - // Calculate period - pSub->period = MakeHnsPeriod(frames, pSub->wavex.Format.nSamplesPerSec); - - // Open the stream and associate it with an audio session - hr = IAudioClient_Initialize(audioClient, - pSub->shareMode, - pSub->streamFlags, - pSub->period, - (pSub->shareMode == AUDCLNT_SHAREMODE_EXCLUSIVE ? pSub->period : 0), - &pSub->wavex.Format, - NULL); - if (hr != S_OK) - { - (*pa_error) = paInvalidDevice; - LogHostError(hr); - goto done; - } - } - else - if (hr != S_OK) + // Error has no workaround, fail completely + if (FAILED(hr)) { (*pa_error) = paInvalidDevice; LogHostError(hr); @@ -3326,9 +3307,7 @@ static HRESULT CreateAudioClient(PaWasapiStream *pStream, PaWasapiSubStream *pSu IAudioClient_AddRef(pSub->clientParent); // Recalculate buffers count - _RecalculateBuffersCount(pSub, - userFramesPerBuffer, - MakeFramesFromHns(pSub->period, pSub->wavex.Format.nSamplesPerSec), + _RecalculateBuffersCount(pSub, userFramesPerBuffer, MakeFramesFromHns(pSub->period, pSub->wavex.Format.nSamplesPerSec), fullDuplex); // No error, client is succesfully created @@ -3346,14 +3325,12 @@ static PaError ActivateAudioClientOutput(PaWasapiStream *stream) { HRESULT hr; PaError result; - - UINT32 maxBufferSize = 0; - PaTime buffer_latency = 0; - UINT32 framesPerBuffer = stream->out.params.frames_per_buffer; + UINT32 maxBufferSize; + PaTime bufferLatency; + const UINT32 framesPerBuffer = stream->out.params.frames_per_buffer; // Create Audio client - hr = CreateAudioClient(stream, &stream->out, TRUE, &result); - if (hr != S_OK) + if (FAILED(hr = CreateAudioClient(stream, &stream->out, TRUE, &result))) { LogPaError(result); goto error; @@ -3369,8 +3346,7 @@ static PaError ActivateAudioClientOutput(PaWasapiStream *stream) return paInvalidDevice;*/ // Get max possible buffer size to check if it is not less than that we request - hr = IAudioClient_GetBufferSize(stream->out.clientParent, &maxBufferSize); - if (hr != S_OK) + if (FAILED(hr = IAudioClient_GetBufferSize(stream->out.clientParent, &maxBufferSize))) { LogHostError(hr); LogPaError(result = paInvalidDevice); @@ -3380,10 +3356,8 @@ static PaError ActivateAudioClientOutput(PaWasapiStream *stream) // Correct buffer to max size if it maxed out result of GetBufferSize stream->out.bufferSize = maxBufferSize; - // Get interface latency (actually uneeded as we calculate latency from the size - // of maxBufferSize). - hr = IAudioClient_GetStreamLatency(stream->out.clientParent, &stream->out.deviceLatency); - if (hr != S_OK) + // Get interface latency (actually uneeded as we calculate latency from the size of maxBufferSize) + if (FAILED(hr = IAudioClient_GetStreamLatency(stream->out.clientParent, &stream->out.deviceLatency))) { LogHostError(hr); LogPaError(result = paInvalidDevice); @@ -3399,10 +3373,10 @@ static PaError ActivateAudioClientOutput(PaWasapiStream *stream) (stream->out.userBufferAndHostMatch ? stream->out.framesPerHostCallback : framesPerBuffer); // Calculate buffer latency - buffer_latency = (PaTime)maxBufferSize / stream->out.wavex.Format.nSamplesPerSec; + bufferLatency = (PaTime)maxBufferSize / stream->out.wavex.Format.nSamplesPerSec; // Append buffer latency to interface latency in shared mode (see GetStreamLatency notes) - stream->out.latencySeconds = buffer_latency; + stream->out.latencySeconds = bufferLatency; PRINT(("WASAPI::OpenStream(output): framesPerUser[ %d ] framesPerHost[ %d ] latency[ %.02fms ] exclusive[ %s ] wow64_fix[ %s ] mode[ %s ]\n", (UINT32)framesPerBuffer, (UINT32)stream->out.framesPerHostCallback, (float)(stream->out.latencySeconds*1000.0f), (stream->out.shareMode == AUDCLNT_SHAREMODE_EXCLUSIVE ? "YES" : "NO"), (stream->out.params.wow64_workaround ? "YES" : "NO"), (stream->out.streamFlags & AUDCLNT_STREAMFLAGS_EVENTCALLBACK ? "EVENT" : "POLL"))); @@ -3418,14 +3392,12 @@ static PaError ActivateAudioClientInput(PaWasapiStream *stream) { HRESULT hr; PaError result; - - UINT32 maxBufferSize = 0; - PaTime buffer_latency = 0; - UINT32 framesPerBuffer = stream->in.params.frames_per_buffer; + UINT32 maxBufferSize; + PaTime bufferLatency; + const UINT32 framesPerBuffer = stream->in.params.frames_per_buffer; // Create Audio client - hr = CreateAudioClient(stream, &stream->in, FALSE, &result); - if (hr != S_OK) + if (FAILED(hr = CreateAudioClient(stream, &stream->in, FALSE, &result))) { LogPaError(result); goto error; @@ -3441,8 +3413,7 @@ static PaError ActivateAudioClientInput(PaWasapiStream *stream) return paInvalidDevice;*/ // Get max possible buffer size to check if it is not less than that we request - hr = IAudioClient_GetBufferSize(stream->in.clientParent, &maxBufferSize); - if (hr != S_OK) + if (FAILED(hr = IAudioClient_GetBufferSize(stream->in.clientParent, &maxBufferSize))) { LogHostError(hr); LogPaError(result = paInvalidDevice); @@ -3454,8 +3425,7 @@ static PaError ActivateAudioClientInput(PaWasapiStream *stream) // Get interface latency (actually uneeded as we calculate latency from the size // of maxBufferSize). - hr = IAudioClient_GetStreamLatency(stream->in.clientParent, &stream->in.deviceLatency); - if (hr != S_OK) + if (FAILED(hr = IAudioClient_GetStreamLatency(stream->in.clientParent, &stream->in.deviceLatency))) { LogHostError(hr); LogPaError(result = paInvalidDevice); @@ -3471,10 +3441,10 @@ static PaError ActivateAudioClientInput(PaWasapiStream *stream) (stream->in.userBufferAndHostMatch ? stream->in.framesPerHostCallback : framesPerBuffer); // Calculate buffer latency - buffer_latency = (PaTime)maxBufferSize / stream->in.wavex.Format.nSamplesPerSec; + bufferLatency = (PaTime)maxBufferSize / stream->in.wavex.Format.nSamplesPerSec; // Append buffer latency to interface latency in shared mode (see GetStreamLatency notes) - stream->in.latencySeconds = buffer_latency; + stream->in.latencySeconds = bufferLatency; PRINT(("WASAPI::OpenStream(input): framesPerUser[ %d ] framesPerHost[ %d ] latency[ %.02fms ] exclusive[ %s ] wow64_fix[ %s ] mode[ %s ]\n", (UINT32)framesPerBuffer, (UINT32)stream->in.framesPerHostCallback, (float)(stream->in.latencySeconds*1000.0f), (stream->in.shareMode == AUDCLNT_SHAREMODE_EXCLUSIVE ? "YES" : "NO"), (stream->in.params.wow64_workaround ? "YES" : "NO"), (stream->in.streamFlags & AUDCLNT_STREAMFLAGS_EVENTCALLBACK ? "EVENT" : "POLL"))); @@ -3617,8 +3587,7 @@ static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi, stream->in.params.wow64_workaround = paWasapi->useWOW64Workaround; // Create and activate audio client - hr = ActivateAudioClientInput(stream); - if (hr != S_OK) + if (FAILED(hr = ActivateAudioClientInput(stream))) { LogPaError(result = paInvalidDevice); goto error; @@ -3636,8 +3605,7 @@ static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi, } // Only get IAudioCaptureClient input once here instead of getting it at multiple places based on the use - hr = IAudioClient_GetService(stream->in.clientParent, &pa_IID_IAudioCaptureClient, (void **)&stream->captureClientParent); - if (hr != S_OK) + if (FAILED(hr = IAudioClient_GetService(stream->in.clientParent, &pa_IID_IAudioCaptureClient, (void **)&stream->captureClientParent))) { LogHostError(hr); LogPaError(result = paUnanticipatedHostError); @@ -3747,8 +3715,7 @@ static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi, stream->out.params.wow64_workaround = paWasapi->useWOW64Workaround; // Create and activate audio client - hr = ActivateAudioClientOutput(stream); - if (hr != S_OK) + if (FAILED(hr = ActivateAudioClientOutput(stream))) { LogPaError(result = paInvalidDevice); goto error; @@ -3766,8 +3733,7 @@ static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi, } // Only get IAudioCaptureClient output once here instead of getting it at multiple places based on the use - hr = IAudioClient_GetService(stream->out.clientParent, &pa_IID_IAudioRenderClient, (void **)&stream->renderClientParent); - if (hr != S_OK) + if (FAILED(hr = IAudioClient_GetService(stream->out.clientParent, &pa_IID_IAudioRenderClient, (void **)&stream->renderClientParent))) { LogHostError(hr); LogPaError(result = paUnanticipatedHostError); @@ -5320,13 +5286,15 @@ static HRESULT ProcessOutputBuffer(PaWasapiStream *stream, PaWasapiHostProcessor // Get buffer if ((hr = IAudioRenderClient_GetBuffer(stream->renderClient, frames, &data)) != S_OK) { + // Both modes, Shared and Exclusive, can fail with AUDCLNT_E_BUFFER_TOO_LARGE error + #if 0 if (stream->out.shareMode == AUDCLNT_SHAREMODE_SHARED) { // Using GetCurrentPadding to overcome AUDCLNT_E_BUFFER_TOO_LARGE in // shared mode results in no sound in Event-driven mode (MSDN does not // document this, or is it WASAPI bug?), thus we better // try to acquire buffer next time when GetBuffer allows to do so. -#if 0 + #if 0 // Get Read position UINT32 padding = 0; hr = IAudioClient_GetCurrentPadding(stream->out.clientProc, &padding); @@ -5340,13 +5308,19 @@ static HRESULT ProcessOutputBuffer(PaWasapiStream *stream, PaWasapiHostProcessor if ((hr = IAudioRenderClient_GetBuffer(stream->renderClient, frames, &data)) != S_OK) return LogHostError(hr); -#else + #else if (hr == AUDCLNT_E_BUFFER_TOO_LARGE) return S_OK; // be silent in shared mode, try again next time -#endif + #endif } else return LogHostError(hr); + #else + if (hr == AUDCLNT_E_BUFFER_TOO_LARGE) + return S_OK; // try again next time + + return LogHostError(hr); + #endif } // Process data @@ -5713,7 +5687,7 @@ PA_THREAD_FUNC ProcThreadPoll(void *param) ThreadIdleScheduler scheduler; // Calculate the actual duration of the allocated buffer. - DWORD sleep_ms = 0; + DWORD sleep_ms = 0; DWORD sleep_ms_in; DWORD sleep_ms_out; @@ -5829,18 +5803,19 @@ PA_THREAD_FUNC ProcThreadPoll(void *param) } else { - if (frames != 0) - { - // USB DACs report large buffer in Exclusive mode and if it is filled fully will stuck in - // non playing state, e.g. IAudioClient_GetCurrentPadding() will start reporting max buffer size - // constantly, thus preload data size equal to the user buffer to allow process going - if ((stream->out.shareMode == AUDCLNT_SHAREMODE_EXCLUSIVE) && (frames > stream->out.framesPerBuffer)) - frames = stream->out.framesPerBuffer; + // Some devices may not start (will get stuck with 0 ready frames) if data not prefetched + if (frames == 0) + frames = stream->out.framesPerBuffer; - if ((hr = ProcessOutputBuffer(stream, processor, frames)) != S_OK) - { - LogHostError(hr); // not fatal, just log - } + // USB DACs report large buffer in Exclusive mode and if it is filled fully will stuck in + // non playing state, e.g. IAudioClient_GetCurrentPadding() will start reporting max buffer size + // constantly, thus preload data size equal to the user buffer to allow process going + if ((stream->out.shareMode == AUDCLNT_SHAREMODE_EXCLUSIVE) && (frames >= (stream->out.framesPerBuffer * 2))) + frames -= stream->out.framesPerBuffer; + + if ((hr = ProcessOutputBuffer(stream, processor, frames)) != S_OK) + { + LogHostError(hr); // not fatal, just log } } } @@ -5869,15 +5844,14 @@ PA_THREAD_FUNC ProcThreadPoll(void *param) if (!PA_WASAPI__IS_FULLDUPLEX(stream)) { - // Processing Loop UINT32 next_sleep = sleep_ms; + + // Processing Loop while (WaitForSingleObject(stream->hCloseRequest, next_sleep) == WAIT_TIMEOUT) { // Get next sleep time if (sleep_ms == 0) - { next_sleep = ThreadIdleScheduler_NextSleep(&scheduler); - } for (i = 0; i < S_COUNT; ++i) { @@ -5905,14 +5879,14 @@ PA_THREAD_FUNC ProcThreadPoll(void *param) if (stream->renderClient == NULL) break; - // get available frames + // Get available frames if ((hr = _PollGetOutputFramesAvailable(stream, &frames)) != S_OK) { LogHostError(hr); goto thread_error; } - // output + // Output data to the user callback if (stream->bufferMode == paUtilFixedHostBufferSize) { while (frames >= stream->out.framesPerBuffer) @@ -5927,14 +5901,12 @@ PA_THREAD_FUNC ProcThreadPoll(void *param) } } else + if (frames != 0) { - if (frames != 0) + if ((hr = ProcessOutputBuffer(stream, processor, frames)) != S_OK) { - if ((hr = ProcessOutputBuffer(stream, processor, frames)) != S_OK) - { - LogHostError(hr); - goto thread_error; - } + LogHostError(hr); + goto thread_error; } } From d99940b26eb6a48d1a069b3195a50d06badabb46 Mon Sep 17 00:00:00 2001 From: dmitrykos Date: Sat, 9 Mar 2019 12:43:14 +0200 Subject: [PATCH 004/164] wasapi: set IAudioClient2+ properties before GetClosestFormat() in order to avoid failing with unsupported format error if PaWasapiStreamCategory is other than default, for example eAudioCategorySpeech --- src/hostapi/wasapi/pa_win_wasapi.c | 97 ++++++++++++++++-------------- 1 file changed, 53 insertions(+), 44 deletions(-) diff --git a/src/hostapi/wasapi/pa_win_wasapi.c b/src/hostapi/wasapi/pa_win_wasapi.c index 1dc888e..ffc4b11 100644 --- a/src/hostapi/wasapi/pa_win_wasapi.c +++ b/src/hostapi/wasapi/pa_win_wasapi.c @@ -1571,13 +1571,54 @@ error: #endif // ------------------------------------------------------------------------------------------ -static HRESULT ActivateAudioInterface(const PaWasapiDeviceInfo *deviceInfo, IAudioClient **client) +static HRESULT ActivateAudioInterface(const PaWasapiDeviceInfo *deviceInfo, const PaWasapiStreamInfo *streamInfo, + IAudioClient **client) { + HRESULT hr; + #ifndef PA_WINRT - return IMMDevice_Activate(deviceInfo->device, GetAudioClientIID(), CLSCTX_ALL, NULL, (void **)client); + if (FAILED(hr = IMMDevice_Activate(deviceInfo->device, GetAudioClientIID(), CLSCTX_ALL, NULL, (void **)client))) + return hr; #else - return ActivateAudioInterface_WINRT(deviceInfo->flow, GetAudioClientIID(), (void **)client); + if (FAILED(hr = ActivateAudioInterface_WINRT(deviceInfo->flow, GetAudioClientIID(), (void **)client))) + return hr; #endif + + // Set audio client options (applicable only to IAudioClient2+): options may affect the audio format + // support by IAudioClient implementation and therefore we should set them before GetClosestFormat() + // in order to correctly match the requested format +#ifdef __IAudioClient2_INTERFACE_DEFINED__ + if ((streamInfo != NULL) && (GetAudioClientVersion() >= 2)) + { + pa_AudioClientProperties audioProps = { 0 }; + audioProps.cbSize = sizeof(pa_AudioClientProperties); + audioProps.bIsOffload = FALSE; + audioProps.eCategory = (AUDIO_STREAM_CATEGORY)streamInfo->streamCategory; + switch (streamInfo->streamOption) + { + case eStreamOptionRaw: + if (GetWindowsVersion() >= WINDOWS_8_1_SERVER2012R2) + audioProps.Options = pa_AUDCLNT_STREAMOPTIONS_RAW; + break; + case eStreamOptionMatchFormat: + if (GetWindowsVersion() >= WINDOWS_10_SERVER2016) + audioProps.Options = pa_AUDCLNT_STREAMOPTIONS_MATCH_FORMAT; + break; + } + + if (FAILED(hr = IAudioClient2_SetClientProperties((IAudioClient2 *)(*client), (AudioClientProperties *)&audioProps))) + { + PRINT(("WASAPI: IAudioClient2_SetClientProperties(IsOffload = %d, Category = %d, Options = %d) failed\n", audioProps.bIsOffload, audioProps.eCategory, audioProps.Options)); + LogHostError(hr); + } + else + { + PRINT(("WASAPI: IAudioClient2 set properties: IsOffload = %d, Category = %d, Options = %d\n", audioProps.bIsOffload, audioProps.eCategory, audioProps.Options)); + } + } +#endif + + return S_OK; } // ------------------------------------------------------------------------------------------ @@ -1873,7 +1914,7 @@ static PaError CreateDeviceList(PaWasapiHostApiRepresentation *paWasapi, PaHostA #endif // Create temp Audio Client instance to query additional details - hr = ActivateAudioInterface(&paWasapi->devInfo[i], &tmpClient); + hr = ActivateAudioInterface(&paWasapi->devInfo[i], NULL, &tmpClient); // We need to set the result to a value otherwise we will return paNoError // [IF_FAILED_JUMP(hResult, error);] IF_FAILED_INTERNAL_ERROR_JUMP(hr, result, error); @@ -2801,9 +2842,9 @@ static PaError IsFormatSupported( struct PaUtilHostApiRepresentation *hostApi, inputStreamInfo = (PaWasapiStreamInfo *)inputParameters->hostApiSpecificStreamInfo; if (inputStreamInfo && (inputStreamInfo->flags & paWinWasapiExclusive)) - shareMode = AUDCLNT_SHAREMODE_EXCLUSIVE; + shareMode = AUDCLNT_SHAREMODE_EXCLUSIVE; - hr = ActivateAudioInterface(&paWasapi->devInfo[inputParameters->device], &tmpClient); + hr = ActivateAudioInterface(&paWasapi->devInfo[inputParameters->device], inputStreamInfo, &tmpClient); if (hr != S_OK) { LogHostError(hr); @@ -2826,9 +2867,9 @@ static PaError IsFormatSupported( struct PaUtilHostApiRepresentation *hostApi, outputStreamInfo = (PaWasapiStreamInfo *)outputParameters->hostApiSpecificStreamInfo; if (outputStreamInfo && (outputStreamInfo->flags & paWinWasapiExclusive)) - shareMode = AUDCLNT_SHAREMODE_EXCLUSIVE; + shareMode = AUDCLNT_SHAREMODE_EXCLUSIVE; - hr = ActivateAudioInterface(&paWasapi->devInfo[outputParameters->device], &tmpClient); + hr = ActivateAudioInterface(&paWasapi->devInfo[outputParameters->device], outputStreamInfo, &tmpClient); if (hr != S_OK) { LogHostError(hr); @@ -2972,7 +3013,7 @@ static HRESULT CreateAudioClient(PaWasapiStream *pStream, PaWasapiSubStream *pSu } // Get the audio client - if (FAILED(hr = ActivateAudioInterface(pInfo, &audioClient))) + if (FAILED(hr = ActivateAudioInterface(pInfo, &pSub->params.wasapi_params, &audioClient))) { (*pa_error) = paInsufficientMemory; LogHostError(hr); @@ -3122,38 +3163,6 @@ static HRESULT CreateAudioClient(PaWasapiStream *pStream, PaWasapiSubStream *pSu } } - // Set Raw mode (applicable only to IAudioClient2) -#ifdef __IAudioClient2_INTERFACE_DEFINED__ - if (GetAudioClientVersion() >= 2) - { - pa_AudioClientProperties audioProps = { 0 }; - audioProps.cbSize = sizeof(pa_AudioClientProperties); - audioProps.bIsOffload = FALSE; - audioProps.eCategory = (AUDIO_STREAM_CATEGORY)pSub->params.wasapi_params.streamCategory; - switch (pSub->params.wasapi_params.streamOption) - { - case eStreamOptionRaw: - if (GetWindowsVersion() >= WINDOWS_8_1_SERVER2012R2) - audioProps.Options = pa_AUDCLNT_STREAMOPTIONS_RAW; - break; - case eStreamOptionMatchFormat: - if (GetWindowsVersion() >= WINDOWS_10_SERVER2016) - audioProps.Options = pa_AUDCLNT_STREAMOPTIONS_MATCH_FORMAT; - break; - } - - if (FAILED(hr = IAudioClient2_SetClientProperties((IAudioClient2 *)audioClient, (AudioClientProperties *)&audioProps))) - { - PRINT(("WASAPI: IAudioClient2_SetClientProperties(IsOffload = %d, Category = %d, Options = %d) failed\n", audioProps.bIsOffload, audioProps.eCategory, audioProps.Options)); - LogHostError(hr); - } - else - { - PRINT(("WASAPI: IAudioClient2 set properties: IsOffload = %d, Category = %d, Options = %d\n", audioProps.bIsOffload, audioProps.eCategory, audioProps.Options)); - } - } -#endif - // Set device scheduling period (always 0 in Shared mode according Microsoft docs) _CalculatePeriodicity(pSub, output, &eventPeriodicity); @@ -3201,7 +3210,7 @@ static HRESULT CreateAudioClient(PaWasapiStream *pStream, PaWasapiSubStream *pSu SAFE_RELEASE(audioClient); // Create a new audio client - if (FAILED(hr = ActivateAudioInterface(pInfo, &audioClient))) + if (FAILED(hr = ActivateAudioInterface(pInfo, &pSub->params.wasapi_params, &audioClient))) { (*pa_error) = paInsufficientMemory; LogHostError(hr); @@ -3241,7 +3250,7 @@ static HRESULT CreateAudioClient(PaWasapiStream *pStream, PaWasapiSubStream *pSu SAFE_RELEASE(audioClient); // Create a new audio client - if (FAILED(hr = ActivateAudioInterface(pInfo, &audioClient))) + if (FAILED(hr = ActivateAudioInterface(pInfo, &pSub->params.wasapi_params, &audioClient))) { (*pa_error) = paInsufficientMemory; LogHostError(hr); @@ -3274,7 +3283,7 @@ static HRESULT CreateAudioClient(PaWasapiStream *pStream, PaWasapiSubStream *pSu SAFE_RELEASE(audioClient); // Create a new audio client - if (FAILED(hr = ActivateAudioInterface(pInfo, &audioClient))) + if (FAILED(hr = ActivateAudioInterface(pInfo, &pSub->params.wasapi_params, &audioClient))) { (*pa_error) = paInsufficientMemory; LogHostError(hr); From aa0748a5b59491ba2cfa9943825653cde6e1f748 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Heusipp?= Date: Mon, 1 Apr 2019 09:05:18 +0200 Subject: [PATCH 005/164] wasapi: Add paWinWasapiAutoConvert flag, which sets AUDCLNT_STREAMFLAGS_AUTOCONVERTPCM | AUDCLNT_STREAMFLAGS_SRC_DEFAULT_QUALITY for Shared mode streams. AUDCLNT_STREAMFLAGS_AUTOCONVERTPCM is required in order to allow for sample rates other than the system mixer configured sample rate. Otherwise, WASAPI is limited to a single system configured sample rate in Shared mode, which is a severe limitation compared to other APIs supported by PortAudio. AUDCLNT_STREAMFLAGS_SRC_DEFAULT_QUALITY is recommended to be used additionally. See for documentation. GetClosestFormat is modified to exit early when paWinWasapiAutoConvert is set in Shared mode because we trust the WASAPI conversions to succeed. We restrict these changes to Windows 7 (and later) because documentation does not clearly state the minimum required Windows version. Windows Vista was not available for testing. This patch has been in production in OpenMPT () since version 1.27.01.00 (2017-09-27). PortAudio WASAPI Shared mode is the default output device type in OpenMPT for Windows 7 (and later) and also for Wine setups. --- include/pa_win_wasapi.h | 9 ++++++++- src/hostapi/wasapi/pa_win_wasapi.c | 17 +++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/include/pa_win_wasapi.h b/include/pa_win_wasapi.h index 63b5d6a..9b827d1 100644 --- a/include/pa_win_wasapi.h +++ b/include/pa_win_wasapi.h @@ -78,7 +78,13 @@ typedef enum PaWasapiFlags /* force explicit sample format and do not allow PA to select suitable working format, API will fail if provided sample format is not supported by audio hardware in Exclusive mode or system mixer in Shared mode */ - paWinWasapiExplicitSampleFormat = (1 << 5) + paWinWasapiExplicitSampleFormat = (1 << 5), + + /* allow API to insert system-level channel matrix mixer and sample rate converter to allow + playback formats that do not match the current configured system settings. + this is in particular required for streams not matching the system mixer sample rate. + only applies in Shared mode. */ + paWinWasapiAutoConvert = (1 << 6) } PaWasapiFlags; #define paWinWasapiExclusive (paWinWasapiExclusive) @@ -87,6 +93,7 @@ PaWasapiFlags; #define paWinWasapiPolling (paWinWasapiPolling) #define paWinWasapiThreadPriority (paWinWasapiThreadPriority) #define paWinWasapiExplicitSampleFormat (paWinWasapiExplicitSampleFormat) +#define paWinWasapiAutoConvert (paWinWasapiAutoConvert) /* Stream state. diff --git a/src/hostapi/wasapi/pa_win_wasapi.c b/src/hostapi/wasapi/pa_win_wasapi.c index ffc4b11..c55c8b5 100644 --- a/src/hostapi/wasapi/pa_win_wasapi.c +++ b/src/hostapi/wasapi/pa_win_wasapi.c @@ -293,6 +293,13 @@ PA_THREAD_FUNC ProcThreadPoll(void *param); #define AUDCLNT_E_INVALID_DEVICE_PERIOD AUDCLNT_ERR(0x020) #endif +#ifndef AUDCLNT_STREAMFLAGS_SRC_DEFAULT_QUALITY + #define AUDCLNT_STREAMFLAGS_SRC_DEFAULT_QUALITY 0x08000000 +#endif +#ifndef AUDCLNT_STREAMFLAGS_AUTOCONVERTPCM + #define AUDCLNT_STREAMFLAGS_AUTOCONVERTPCM 0x80000000 +#endif + #define MAX_STR_LEN 512 #ifdef PA_WINRT @@ -2667,6 +2674,10 @@ static PaError GetClosestFormat(IAudioClient *client, double sampleRate, const P // Try standard approach, e.g. if data is > 16 bits it will be packed into 32-bit containers MakeWaveFormatFromParams(outWavex, ¶ms, sampleRate, FALSE); + if ((GetWindowsVersion() >= WINDOWS_7_SERVER2008R2) && (shareMode == AUDCLNT_SHAREMODE_SHARED) && _params->hostApiSpecificStreamInfo && (((PaWasapiStreamInfo *)_params->hostApiSpecificStreamInfo)->flags & paWinWasapiAutoConvert)) + { + return paFormatIsSupported; + } hr = IAudioClient_IsFormatSupported(client, shareMode, &outWavex->Format, (shareMode == AUDCLNT_SHAREMODE_SHARED ? &sharedClosestMatch : NULL)); // Exclusive mode can require packed format for some devices @@ -3586,6 +3597,9 @@ static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi, if (fullDuplex) stream->in.streamFlags = 0; // polling interface is implemented for full-duplex mode also + if ((GetWindowsVersion() >= WINDOWS_7_SERVER2008R2) && (stream->in.shareMode == AUDCLNT_SHAREMODE_SHARED) && (inputStreamInfo != NULL) && (inputStreamInfo->flags & paWinWasapiAutoConvert)) + stream->in.streamFlags |= AUDCLNT_STREAMFLAGS_AUTOCONVERTPCM | AUDCLNT_STREAMFLAGS_SRC_DEFAULT_QUALITY; + // Fill parameters for Audio Client creation stream->in.params.device_info = info; stream->in.params.stream_params = (*inputParameters); @@ -3714,6 +3728,9 @@ static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi, if (fullDuplex) stream->out.streamFlags = 0; // polling interface is implemented for full-duplex mode also + if ((GetWindowsVersion() >= WINDOWS_7_SERVER2008R2) && (stream->out.shareMode == AUDCLNT_SHAREMODE_SHARED) && (outputStreamInfo != NULL) && (outputStreamInfo->flags & paWinWasapiAutoConvert)) + stream->out.streamFlags |= AUDCLNT_STREAMFLAGS_AUTOCONVERTPCM | AUDCLNT_STREAMFLAGS_SRC_DEFAULT_QUALITY; + // Fill parameters for Audio Client creation stream->out.params.device_info = info; stream->out.params.stream_params = (*outputParameters); From c40b969e1b5fc555d5876c466b39d463ae2a1c1d Mon Sep 17 00:00:00 2001 From: dmitrykos Date: Fri, 5 Apr 2019 10:38:44 +0300 Subject: [PATCH 006/164] =?UTF-8?q?wasapi:=20some=20cleanup=20of=20J=C3=B6?= =?UTF-8?q?rn=20Heusipp's=20patch?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/hostapi/wasapi/pa_win_wasapi.c | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/src/hostapi/wasapi/pa_win_wasapi.c b/src/hostapi/wasapi/pa_win_wasapi.c index c55c8b5..8b27a4f 100644 --- a/src/hostapi/wasapi/pa_win_wasapi.c +++ b/src/hostapi/wasapi/pa_win_wasapi.c @@ -282,7 +282,7 @@ typedef struct _pa_AudioClientProperties { PA_THREAD_FUNC ProcThreadEvent(void *param); PA_THREAD_FUNC ProcThreadPoll(void *param); -// Availabe from Windows 7 +// Error codes (availabe since Windows 7) #ifndef AUDCLNT_E_BUFFER_ERROR #define AUDCLNT_E_BUFFER_ERROR AUDCLNT_ERR(0x018) #endif @@ -293,6 +293,7 @@ PA_THREAD_FUNC ProcThreadPoll(void *param); #define AUDCLNT_E_INVALID_DEVICE_PERIOD AUDCLNT_ERR(0x020) #endif +// Stream flags (availabe since Windows 7) #ifndef AUDCLNT_STREAMFLAGS_SRC_DEFAULT_QUALITY #define AUDCLNT_STREAMFLAGS_SRC_DEFAULT_QUALITY 0x08000000 #endif @@ -2674,10 +2675,13 @@ static PaError GetClosestFormat(IAudioClient *client, double sampleRate, const P // Try standard approach, e.g. if data is > 16 bits it will be packed into 32-bit containers MakeWaveFormatFromParams(outWavex, ¶ms, sampleRate, FALSE); - if ((GetWindowsVersion() >= WINDOWS_7_SERVER2008R2) && (shareMode == AUDCLNT_SHAREMODE_SHARED) && _params->hostApiSpecificStreamInfo && (((PaWasapiStreamInfo *)_params->hostApiSpecificStreamInfo)->flags & paWinWasapiAutoConvert)) - { + + // If built-in PCM converter requested then shared mode format will always succeed + if ((GetWindowsVersion() >= WINDOWS_7_SERVER2008R2) && + (shareMode == AUDCLNT_SHAREMODE_SHARED) && + ((streamInfo != NULL) && (streamInfo->flags & paWinWasapiAutoConvert))) return paFormatIsSupported; - } + hr = IAudioClient_IsFormatSupported(client, shareMode, &outWavex->Format, (shareMode == AUDCLNT_SHAREMODE_SHARED ? &sharedClosestMatch : NULL)); // Exclusive mode can require packed format for some devices @@ -3597,8 +3601,11 @@ static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi, if (fullDuplex) stream->in.streamFlags = 0; // polling interface is implemented for full-duplex mode also - if ((GetWindowsVersion() >= WINDOWS_7_SERVER2008R2) && (stream->in.shareMode == AUDCLNT_SHAREMODE_SHARED) && (inputStreamInfo != NULL) && (inputStreamInfo->flags & paWinWasapiAutoConvert)) - stream->in.streamFlags |= AUDCLNT_STREAMFLAGS_AUTOCONVERTPCM | AUDCLNT_STREAMFLAGS_SRC_DEFAULT_QUALITY; + // Use built-in PCM converter (channel count and sample rate) if requested + if ((GetWindowsVersion() >= WINDOWS_7_SERVER2008R2) && + (stream->in.shareMode == AUDCLNT_SHAREMODE_SHARED) && + ((inputStreamInfo != NULL) && (inputStreamInfo->flags & paWinWasapiAutoConvert))) + stream->in.streamFlags |= (AUDCLNT_STREAMFLAGS_AUTOCONVERTPCM | AUDCLNT_STREAMFLAGS_SRC_DEFAULT_QUALITY); // Fill parameters for Audio Client creation stream->in.params.device_info = info; @@ -3728,8 +3735,11 @@ static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi, if (fullDuplex) stream->out.streamFlags = 0; // polling interface is implemented for full-duplex mode also - if ((GetWindowsVersion() >= WINDOWS_7_SERVER2008R2) && (stream->out.shareMode == AUDCLNT_SHAREMODE_SHARED) && (outputStreamInfo != NULL) && (outputStreamInfo->flags & paWinWasapiAutoConvert)) - stream->out.streamFlags |= AUDCLNT_STREAMFLAGS_AUTOCONVERTPCM | AUDCLNT_STREAMFLAGS_SRC_DEFAULT_QUALITY; + // Use built-in PCM converter (channel count and sample rate) if requested + if ((GetWindowsVersion() >= WINDOWS_7_SERVER2008R2) && + (stream->out.shareMode == AUDCLNT_SHAREMODE_SHARED) && + ((outputStreamInfo != NULL) && (outputStreamInfo->flags & paWinWasapiAutoConvert))) + stream->out.streamFlags |= (AUDCLNT_STREAMFLAGS_AUTOCONVERTPCM | AUDCLNT_STREAMFLAGS_SRC_DEFAULT_QUALITY); // Fill parameters for Audio Client creation stream->out.params.device_info = info; From ab665735ad887dbfb7fdc6b4cbbec90d2124f011 Mon Sep 17 00:00:00 2001 From: Phil Burk Date: Fri, 26 Apr 2019 09:43:52 -0700 Subject: [PATCH 007/164] asio: remove unnecessary ASIO SDK files These files should be obtained directly from Steinberg. --- src/hostapi/asio/ASIOSDK/ASIO SDK 2.3.pdf | Bin 326940 -> 0 bytes .../Steinberg ASIO Licensing Agreement.pdf | Bin 62750 -> 0 bytes src/hostapi/asio/ASIOSDK/asio/asio.dsw | 41 - src/hostapi/asio/ASIOSDK/asio/asio.opt | Bin 53760 -> 0 bytes src/hostapi/asio/ASIOSDK/changes.txt | 12 - src/hostapi/asio/ASIOSDK/common/asio.cpp | 257 ---- src/hostapi/asio/ASIOSDK/common/asio.h | 1070 ----------------- src/hostapi/asio/ASIOSDK/common/asiodrvr.cpp | 139 --- src/hostapi/asio/ASIOSDK/common/asiodrvr.h | 76 -- src/hostapi/asio/ASIOSDK/common/asiosys.h | 82 -- src/hostapi/asio/ASIOSDK/common/combase.cpp | 202 ---- src/hostapi/asio/ASIOSDK/common/combase.h | 284 ----- .../asio/ASIOSDK/common/debugmessage.cpp | 14 - src/hostapi/asio/ASIOSDK/common/dllentry.cpp | 323 ----- src/hostapi/asio/ASIOSDK/common/iasiodrv.h | 37 - src/hostapi/asio/ASIOSDK/common/register.cpp | 332 ----- src/hostapi/asio/ASIOSDK/common/wxdebug.h | 326 ----- .../ASIOSDK/driver/asiosample/asiosample.def | 9 - .../ASIOSDK/driver/asiosample/asiosample.txt | 23 - .../asiosample/asiosample/asiosample.dsp | 151 --- .../asiosample/asiosample/asiosample.vcproj | 629 ---------- .../ASIOSDK/driver/asiosample/asiosmpl.cpp | 660 ---------- .../asio/ASIOSDK/driver/asiosample/asiosmpl.h | 148 --- .../ASIOSDK/driver/asiosample/macnanosecs.cpp | 15 - .../ASIOSDK/driver/asiosample/mactimer.cpp | 52 - .../ASIOSDK/driver/asiosample/makesamp.cpp | 6 - .../ASIOSDK/driver/asiosample/wintimer.cpp | 55 - .../asio/ASIOSDK/host/ASIOConvertSamples.cpp | 859 ------------- .../asio/ASIOSDK/host/ASIOConvertSamples.h | 62 - src/hostapi/asio/ASIOSDK/host/asiodrivers.cpp | 186 --- src/hostapi/asio/ASIOSDK/host/asiodrivers.h | 41 - src/hostapi/asio/ASIOSDK/host/ginclude.h | 38 - .../asio/ASIOSDK/host/mac/asioshlib.cpp | 342 ------ .../asio/ASIOSDK/host/mac/codefragments.cpp | 349 ------ .../asio/ASIOSDK/host/mac/codefragments.hpp | 30 - src/hostapi/asio/ASIOSDK/host/pc/asiolist.cpp | 268 ----- src/hostapi/asio/ASIOSDK/host/pc/asiolist.h | 46 - .../asio/ASIOSDK/host/sample/hostsample.cpp | 526 -------- .../asio/ASIOSDK/host/sample/hostsample.dsp | 134 --- .../ASIOSDK/host/sample/hostsample.vcproj | 571 --------- src/hostapi/asio/ASIOSDK/readme.txt | 55 - src/hostapi/asio/asiosdk2.3.zip | Bin 422934 -> 0 bytes 42 files changed, 8450 deletions(-) delete mode 100644 src/hostapi/asio/ASIOSDK/ASIO SDK 2.3.pdf delete mode 100644 src/hostapi/asio/ASIOSDK/Steinberg ASIO Licensing Agreement.pdf delete mode 100644 src/hostapi/asio/ASIOSDK/asio/asio.dsw delete mode 100644 src/hostapi/asio/ASIOSDK/asio/asio.opt delete mode 100644 src/hostapi/asio/ASIOSDK/changes.txt delete mode 100644 src/hostapi/asio/ASIOSDK/common/asio.cpp delete mode 100644 src/hostapi/asio/ASIOSDK/common/asio.h delete mode 100644 src/hostapi/asio/ASIOSDK/common/asiodrvr.cpp delete mode 100644 src/hostapi/asio/ASIOSDK/common/asiodrvr.h delete mode 100644 src/hostapi/asio/ASIOSDK/common/asiosys.h delete mode 100644 src/hostapi/asio/ASIOSDK/common/combase.cpp delete mode 100644 src/hostapi/asio/ASIOSDK/common/combase.h delete mode 100644 src/hostapi/asio/ASIOSDK/common/debugmessage.cpp delete mode 100644 src/hostapi/asio/ASIOSDK/common/dllentry.cpp delete mode 100644 src/hostapi/asio/ASIOSDK/common/iasiodrv.h delete mode 100644 src/hostapi/asio/ASIOSDK/common/register.cpp delete mode 100644 src/hostapi/asio/ASIOSDK/common/wxdebug.h delete mode 100644 src/hostapi/asio/ASIOSDK/driver/asiosample/asiosample.def delete mode 100644 src/hostapi/asio/ASIOSDK/driver/asiosample/asiosample.txt delete mode 100644 src/hostapi/asio/ASIOSDK/driver/asiosample/asiosample/asiosample.dsp delete mode 100644 src/hostapi/asio/ASIOSDK/driver/asiosample/asiosample/asiosample.vcproj delete mode 100644 src/hostapi/asio/ASIOSDK/driver/asiosample/asiosmpl.cpp delete mode 100644 src/hostapi/asio/ASIOSDK/driver/asiosample/asiosmpl.h delete mode 100644 src/hostapi/asio/ASIOSDK/driver/asiosample/macnanosecs.cpp delete mode 100644 src/hostapi/asio/ASIOSDK/driver/asiosample/mactimer.cpp delete mode 100644 src/hostapi/asio/ASIOSDK/driver/asiosample/makesamp.cpp delete mode 100644 src/hostapi/asio/ASIOSDK/driver/asiosample/wintimer.cpp delete mode 100644 src/hostapi/asio/ASIOSDK/host/ASIOConvertSamples.cpp delete mode 100644 src/hostapi/asio/ASIOSDK/host/ASIOConvertSamples.h delete mode 100644 src/hostapi/asio/ASIOSDK/host/asiodrivers.cpp delete mode 100644 src/hostapi/asio/ASIOSDK/host/asiodrivers.h delete mode 100644 src/hostapi/asio/ASIOSDK/host/ginclude.h delete mode 100644 src/hostapi/asio/ASIOSDK/host/mac/asioshlib.cpp delete mode 100644 src/hostapi/asio/ASIOSDK/host/mac/codefragments.cpp delete mode 100644 src/hostapi/asio/ASIOSDK/host/mac/codefragments.hpp delete mode 100644 src/hostapi/asio/ASIOSDK/host/pc/asiolist.cpp delete mode 100644 src/hostapi/asio/ASIOSDK/host/pc/asiolist.h delete mode 100644 src/hostapi/asio/ASIOSDK/host/sample/hostsample.cpp delete mode 100644 src/hostapi/asio/ASIOSDK/host/sample/hostsample.dsp delete mode 100644 src/hostapi/asio/ASIOSDK/host/sample/hostsample.vcproj delete mode 100644 src/hostapi/asio/ASIOSDK/readme.txt delete mode 100644 src/hostapi/asio/asiosdk2.3.zip diff --git a/src/hostapi/asio/ASIOSDK/ASIO SDK 2.3.pdf b/src/hostapi/asio/ASIOSDK/ASIO SDK 2.3.pdf deleted file mode 100644 index 378553c745df667963a1732bf35041a9799b546a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 326940 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

dedHuQ5L{k+@MS=E*X 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∋6!L?B7$0z1eJ&}rBwXZ4ED@0-^{)#@E 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

n$)FNg^zL3|p48)o}lgyeV{UIo+Su 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 qJV z>=}5T{tsNQBoMV36QgN0t4B7c%TK2xt?+wGR~o2iZMnkb!W5 z;`whjPJwj>x`2%UbS((RIM`PK1{{k)LP6y%uyMh_y&$R#&NEaQYLAFT@bEmS7;qhi z1-%>8UX28{`*7R^GPE6lrW9c8;X9BTgoG)8d%+!wA{ zsTiod0CqU&+8c*Q`wZ}XC=LOh@u*lwO+L^#ut`SX{S3$`plJ!&1_?(%*Q_`KyhjAM zL{zN@Tn6q{Q8D298A}36!!ZZk58jId3{YL5^h5XcusD!uwvMA>z&ReYS<(9~&}v5I z86f)$2k0I$NO~k_9#jl?zXghC3OWbiDCk^^qo8^jphXMkH)@vG0fYuWH`v>?rg^Y?hplb%(2EYZ05Ty$OV*o}`Ihl$9 z+aw4Es2&Qy009AofkXQd9#j(0IBK$mVkf{L!ubePDyTdSaPfcP0FUaqk-+v6j%!$I za}&~q`tusBANV~A6>~u5foldF*ruTU91oBo3=$dLYXPIs`5aID3#X_a4?+S42+sqw zq)|Ri2B&btx{xX8y#{p~3UfuFU}5{ifmQ(=+W`kCp9T#^3c9`ry_^5i#m~pa+0EXE zSzca9#?U#)p8DgWkc@$+r=Jj*nUH~yjE0AUrx36(Ap`Ia{whM|^2%hg8j+%WoCHcq zP#_VMFeGIqRV5|h$f`svNm=3l9%0E0ev|d}v+?o!*H4<%G>6AAi-@S|sxkjRL%9Jc diff --git a/src/hostapi/asio/ASIOSDK/Steinberg ASIO Licensing Agreement.pdf b/src/hostapi/asio/ASIOSDK/Steinberg ASIO Licensing Agreement.pdf deleted file mode 100644 index 492db7066508dd27fd84366c4dbd8ae7339fef80..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 62750 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 diff --git a/src/hostapi/asio/ASIOSDK/asio/asio.dsw b/src/hostapi/asio/ASIOSDK/asio/asio.dsw deleted file mode 100644 index 14bc965..0000000 --- a/src/hostapi/asio/ASIOSDK/asio/asio.dsw +++ /dev/null @@ -1,41 +0,0 @@ -Microsoft Developer Studio Workspace File, Format Version 6.00 -# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! - -############################################################################### - -Project: "asiosample"="..\driver\asiosample\asiosample\asiosample.dsp" - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "hostsample"="..\host\sample\hostsample.dsp" - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Global: - -Package=<5> -{{{ -}}} - -Package=<3> -{{{ -}}} - -############################################################################### - diff --git a/src/hostapi/asio/ASIOSDK/asio/asio.opt b/src/hostapi/asio/ASIOSDK/asio/asio.opt deleted file mode 100644 index ef444d622bbae39879cfb59221cbb93cd9751d6d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 53760 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 -#include "asiosys.h" // platform definition -#include "asio.h" - -#if MAC -#include "asiodrvr.h" - -#pragma export on - -AsioDriver *theAsioDriver = 0; - -extern "C" -{ - -long main() -{ - return 'ASIO'; -} - -#elif WINDOWS - -#include "windows.h" -#include "iasiodrv.h" -#include "asiodrivers.h" - -IASIO *theAsioDriver = 0; -extern AsioDrivers *asioDrivers; - -#elif SGI || SUN || BEOS || LINUX -#include "asiodrvr.h" -static AsioDriver *theAsioDriver = 0; -#endif - -//----------------------------------------------------------------------------------------------------- -ASIOError ASIOInit(ASIODriverInfo *info) -{ -#if MAC || SGI || SUN || BEOS || LINUX - if(theAsioDriver) - { - delete theAsioDriver; - theAsioDriver = 0; - } - info->driverVersion = 0; - strcpy(info->name, "No ASIO Driver"); - theAsioDriver = getDriver(); - if(!theAsioDriver) - { - strcpy(info->errorMessage, "Not enough memory for the ASIO driver!"); - return ASE_NotPresent; - } - if(!theAsioDriver->init(info->sysRef)) - { - theAsioDriver->getErrorMessage(info->errorMessage); - delete theAsioDriver; - theAsioDriver = 0; - return ASE_NotPresent; - } - strcpy(info->errorMessage, "No ASIO Driver Error"); - theAsioDriver->getDriverName(info->name); - info->driverVersion = theAsioDriver->getDriverVersion(); - return ASE_OK; - -#else - - info->driverVersion = 0; - strcpy(info->name, "No ASIO Driver"); - if(theAsioDriver) // must be loaded! - { - if(!theAsioDriver->init(info->sysRef)) - { - theAsioDriver->getErrorMessage(info->errorMessage); - theAsioDriver = 0; - return ASE_NotPresent; - } - - strcpy(info->errorMessage, "No ASIO Driver Error"); - theAsioDriver->getDriverName(info->name); - info->driverVersion = theAsioDriver->getDriverVersion(); - return ASE_OK; - } - return ASE_NotPresent; - -#endif // !MAC -} - -ASIOError ASIOExit(void) -{ - if(theAsioDriver) - { -#if WINDOWS - asioDrivers->removeCurrentDriver(); -#else - delete theAsioDriver; -#endif - } - theAsioDriver = 0; - return ASE_OK; -} - -ASIOError ASIOStart(void) -{ - if(!theAsioDriver) - return ASE_NotPresent; - return theAsioDriver->start(); -} - -ASIOError ASIOStop(void) -{ - if(!theAsioDriver) - return ASE_NotPresent; - return theAsioDriver->stop(); -} - -ASIOError ASIOGetChannels(long *numInputChannels, long *numOutputChannels) -{ - if(!theAsioDriver) - { - *numInputChannels = *numOutputChannels = 0; - return ASE_NotPresent; - } - return theAsioDriver->getChannels(numInputChannels, numOutputChannels); -} - -ASIOError ASIOGetLatencies(long *inputLatency, long *outputLatency) -{ - if(!theAsioDriver) - { - *inputLatency = *outputLatency = 0; - return ASE_NotPresent; - } - return theAsioDriver->getLatencies(inputLatency, outputLatency); -} - -ASIOError ASIOGetBufferSize(long *minSize, long *maxSize, long *preferredSize, long *granularity) -{ - if(!theAsioDriver) - { - *minSize = *maxSize = *preferredSize = *granularity = 0; - return ASE_NotPresent; - } - return theAsioDriver->getBufferSize(minSize, maxSize, preferredSize, granularity); -} - -ASIOError ASIOCanSampleRate(ASIOSampleRate sampleRate) -{ - if(!theAsioDriver) - return ASE_NotPresent; - return theAsioDriver->canSampleRate(sampleRate); -} - -ASIOError ASIOGetSampleRate(ASIOSampleRate *currentRate) -{ - if(!theAsioDriver) - return ASE_NotPresent; - return theAsioDriver->getSampleRate(currentRate); -} - -ASIOError ASIOSetSampleRate(ASIOSampleRate sampleRate) -{ - if(!theAsioDriver) - return ASE_NotPresent; - return theAsioDriver->setSampleRate(sampleRate); -} - -ASIOError ASIOGetClockSources(ASIOClockSource *clocks, long *numSources) -{ - if(!theAsioDriver) - { - *numSources = 0; - return ASE_NotPresent; - } - return theAsioDriver->getClockSources(clocks, numSources); -} - -ASIOError ASIOSetClockSource(long reference) -{ - if(!theAsioDriver) - return ASE_NotPresent; - return theAsioDriver->setClockSource(reference); -} - -ASIOError ASIOGetSamplePosition(ASIOSamples *sPos, ASIOTimeStamp *tStamp) -{ - if(!theAsioDriver) - return ASE_NotPresent; - return theAsioDriver->getSamplePosition(sPos, tStamp); -} - -ASIOError ASIOGetChannelInfo(ASIOChannelInfo *info) -{ - if(!theAsioDriver) - { - info->channelGroup = -1; - info->type = ASIOSTInt16MSB; - strcpy(info->name, "None"); - return ASE_NotPresent; - } - return theAsioDriver->getChannelInfo(info); -} - -ASIOError ASIOCreateBuffers(ASIOBufferInfo *bufferInfos, long numChannels, - long bufferSize, ASIOCallbacks *callbacks) -{ - if(!theAsioDriver) - { - ASIOBufferInfo *info = bufferInfos; - for(long i = 0; i < numChannels; i++, info++) - info->buffers[0] = info->buffers[1] = 0; - return ASE_NotPresent; - } - return theAsioDriver->createBuffers(bufferInfos, numChannels, bufferSize, callbacks); -} - -ASIOError ASIODisposeBuffers(void) -{ - if(!theAsioDriver) - return ASE_NotPresent; - return theAsioDriver->disposeBuffers(); -} - -ASIOError ASIOControlPanel(void) -{ - if(!theAsioDriver) - return ASE_NotPresent; - return theAsioDriver->controlPanel(); -} - -ASIOError ASIOFuture(long selector, void *opt) -{ - if(!theAsioDriver) - return ASE_NotPresent; - return theAsioDriver->future(selector, opt); -} - -ASIOError ASIOOutputReady(void) -{ - if(!theAsioDriver) - return ASE_NotPresent; - return theAsioDriver->outputReady(); -} - -#if MAC -} // extern "C" -#pragma export off -#endif - - diff --git a/src/hostapi/asio/ASIOSDK/common/asio.h b/src/hostapi/asio/ASIOSDK/common/asio.h deleted file mode 100644 index 341e755..0000000 --- a/src/hostapi/asio/ASIOSDK/common/asio.h +++ /dev/null @@ -1,1070 +0,0 @@ -//--------------------------------------------------------------------------------------------------- -//--------------------------------------------------------------------------------------------------- - -/* - Steinberg Audio Stream I/O API - (c) 1997 - 2013, Steinberg Media Technologies GmbH - - ASIO Interface Specification v 2.3 - - 2005 - Added support for DSD sample data (in cooperation with Sony) - 2012 - Added support for drop out detection - - - - basic concept is an i/o synchronous double-buffer scheme: - - on bufferSwitch(index == 0), host will read/write: - - after ASIOStart(), the - read first input buffer A (index 0) - | will be invalid (empty) - * ------------------------ - |------------------------|-----------------------| - | | | - | Input Buffer A (0) | Input Buffer B (1) | - | | | - |------------------------|-----------------------| - | | | - | Output Buffer A (0) | Output Buffer B (1) | - | | | - |------------------------|-----------------------| - * ------------------------- - | before calling ASIOStart(), - write host will have filled output - buffer B (index 1) already - - *please* take special care of proper statement of input - and output latencies (see ASIOGetLatencies()), these - control sequencer sync accuracy - -*/ - -//--------------------------------------------------------------------------------------------------- -//--------------------------------------------------------------------------------------------------- - -/* - -prototypes summary: - -ASIOError ASIOInit(ASIODriverInfo *info); -ASIOError ASIOExit(void); -ASIOError ASIOStart(void); -ASIOError ASIOStop(void); -ASIOError ASIOGetChannels(long *numInputChannels, long *numOutputChannels); -ASIOError ASIOGetLatencies(long *inputLatency, long *outputLatency); -ASIOError ASIOGetBufferSize(long *minSize, long *maxSize, long *preferredSize, long *granularity); -ASIOError ASIOCanSampleRate(ASIOSampleRate sampleRate); -ASIOError ASIOGetSampleRate(ASIOSampleRate *currentRate); -ASIOError ASIOSetSampleRate(ASIOSampleRate sampleRate); -ASIOError ASIOGetClockSources(ASIOClockSource *clocks, long *numSources); -ASIOError ASIOSetClockSource(long reference); -ASIOError ASIOGetSamplePosition (ASIOSamples *sPos, ASIOTimeStamp *tStamp); -ASIOError ASIOGetChannelInfo(ASIOChannelInfo *info); -ASIOError ASIOCreateBuffers(ASIOBufferInfo *bufferInfos, long numChannels, - long bufferSize, ASIOCallbacks *callbacks); -ASIOError ASIODisposeBuffers(void); -ASIOError ASIOControlPanel(void); -void *ASIOFuture(long selector, void *params); -ASIOError ASIOOutputReady(void); - -*/ - -//--------------------------------------------------------------------------------------------------- -//--------------------------------------------------------------------------------------------------- - -#ifndef __ASIO_H -#define __ASIO_H - -// force 4 byte alignment -#if defined(_MSC_VER) && !defined(__MWERKS__) -#pragma pack(push,4) -#elif PRAGMA_ALIGN_SUPPORTED -#pragma options align = native -#endif - -//- - - - - - - - - - - - - - - - - - - - - - - - - -// Type definitions -//- - - - - - - - - - - - - - - - - - - - - - - - - - -// number of samples data type is 64 bit integer -#if NATIVE_INT64 - typedef long long int ASIOSamples; -#else - typedef struct ASIOSamples { - unsigned long hi; - unsigned long lo; - } ASIOSamples; -#endif - -// Timestamp data type is 64 bit integer, -// Time format is Nanoseconds. -#if NATIVE_INT64 - typedef long long int ASIOTimeStamp ; -#else - typedef struct ASIOTimeStamp { - unsigned long hi; - unsigned long lo; - } ASIOTimeStamp; -#endif - -// Samplerates are expressed in IEEE 754 64 bit double float, -// native format as host computer -#if IEEE754_64FLOAT - typedef double ASIOSampleRate; -#else - typedef struct ASIOSampleRate { - char ieee[8]; - } ASIOSampleRate; -#endif - -// Boolean values are expressed as long -typedef long ASIOBool; -enum { - ASIOFalse = 0, - ASIOTrue = 1 -}; - -// Sample Types are expressed as long -typedef long ASIOSampleType; -enum { - ASIOSTInt16MSB = 0, - ASIOSTInt24MSB = 1, // used for 20 bits as well - ASIOSTInt32MSB = 2, - ASIOSTFloat32MSB = 3, // IEEE 754 32 bit float - ASIOSTFloat64MSB = 4, // IEEE 754 64 bit double float - - // these are used for 32 bit data buffer, with different alignment of the data inside - // 32 bit PCI bus systems can be more easily used with these - ASIOSTInt32MSB16 = 8, // 32 bit data with 16 bit alignment - ASIOSTInt32MSB18 = 9, // 32 bit data with 18 bit alignment - ASIOSTInt32MSB20 = 10, // 32 bit data with 20 bit alignment - ASIOSTInt32MSB24 = 11, // 32 bit data with 24 bit alignment - - ASIOSTInt16LSB = 16, - ASIOSTInt24LSB = 17, // used for 20 bits as well - ASIOSTInt32LSB = 18, - ASIOSTFloat32LSB = 19, // IEEE 754 32 bit float, as found on Intel x86 architecture - ASIOSTFloat64LSB = 20, // IEEE 754 64 bit double float, as found on Intel x86 architecture - - // these are used for 32 bit data buffer, with different alignment of the data inside - // 32 bit PCI bus systems can more easily used with these - ASIOSTInt32LSB16 = 24, // 32 bit data with 18 bit alignment - ASIOSTInt32LSB18 = 25, // 32 bit data with 18 bit alignment - ASIOSTInt32LSB20 = 26, // 32 bit data with 20 bit alignment - ASIOSTInt32LSB24 = 27, // 32 bit data with 24 bit alignment - - // ASIO DSD format. - ASIOSTDSDInt8LSB1 = 32, // DSD 1 bit data, 8 samples per byte. First sample in Least significant bit. - ASIOSTDSDInt8MSB1 = 33, // DSD 1 bit data, 8 samples per byte. First sample in Most significant bit. - ASIOSTDSDInt8NER8 = 40, // DSD 8 bit data, 1 sample per byte. No Endianness required. - - ASIOSTLastEntry -}; - -/*----------------------------------------------------------------------------- -// DSD operation and buffer layout -// Definition by Steinberg/Sony Oxford. -// -// We have tried to treat DSD as PCM and so keep a consistant structure across -// the ASIO interface. -// -// DSD's sample rate is normally referenced as a multiple of 44.1Khz, so -// the standard sample rate is refered to as 64Fs (or 2.8224Mhz). We looked -// at making a special case for DSD and adding a field to the ASIOFuture that -// would allow the user to select the Over Sampleing Rate (OSR) as a seperate -// entity but decided in the end just to treat it as a simple value of -// 2.8224Mhz and use the standard interface to set it. -// -// The second problem was the "word" size, in PCM the word size is always a -// greater than or equal to 8 bits (a byte). This makes life easy as we can -// then pack the samples into the "natural" size for the machine. -// In DSD the "word" size is 1 bit. This is not a major problem and can easily -// be dealt with if we ensure that we always deal with a multiple of 8 samples. -// -// DSD brings with it another twist to the Endianness religion. How are the -// samples packed into the byte. It would be nice to just say the most significant -// bit is always the first sample, however there would then be a performance hit -// on little endian machines. Looking at how some of the processing goes... -// Little endian machines like the first sample to be in the Least Significant Bit, -// this is because when you write it to memory the data is in the correct format -// to be shifted in and out of the words. -// Big endian machine prefer the first sample to be in the Most Significant Bit, -// again for the same reasion. -// -// And just when things were looking really muddy there is a proposed extension to -// DSD that uses 8 bit word sizes. It does not care what endianness you use. -// -// Switching the driver between DSD and PCM mode -// ASIOFuture allows for extending the ASIO API quite transparently. -// See kAsioSetIoFormat, kAsioGetIoFormat, kAsioCanDoIoFormat -// -//-----------------------------------------------------------------------------*/ - - -//- - - - - - - - - - - - - - - - - - - - - - - - - -// Error codes -//- - - - - - - - - - - - - - - - - - - - - - - - - - -typedef long ASIOError; -enum { - ASE_OK = 0, // This value will be returned whenever the call succeeded - ASE_SUCCESS = 0x3f4847a0, // unique success return value for ASIOFuture calls - ASE_NotPresent = -1000, // hardware input or output is not present or available - ASE_HWMalfunction, // hardware is malfunctioning (can be returned by any ASIO function) - ASE_InvalidParameter, // input parameter invalid - ASE_InvalidMode, // hardware is in a bad mode or used in a bad mode - ASE_SPNotAdvancing, // hardware is not running when sample position is inquired - ASE_NoClock, // sample clock or rate cannot be determined or is not present - ASE_NoMemory // not enough memory for completing the request -}; - -//--------------------------------------------------------------------------------------------------- -//--------------------------------------------------------------------------------------------------- - -//- - - - - - - - - - - - - - - - - - - - - - - - - -// Time Info support -//- - - - - - - - - - - - - - - - - - - - - - - - - - -typedef struct ASIOTimeCode -{ - double speed; // speed relation (fraction of nominal speed) - // optional; set to 0. or 1. if not supported - ASIOSamples timeCodeSamples; // time in samples - unsigned long flags; // some information flags (see below) - char future[64]; -} ASIOTimeCode; - -typedef enum ASIOTimeCodeFlags -{ - kTcValid = 1, - kTcRunning = 1 << 1, - kTcReverse = 1 << 2, - kTcOnspeed = 1 << 3, - kTcStill = 1 << 4, - - kTcSpeedValid = 1 << 8 -} ASIOTimeCodeFlags; - -typedef struct AsioTimeInfo -{ - double speed; // absolute speed (1. = nominal) - ASIOTimeStamp systemTime; // system time related to samplePosition, in nanoseconds - // on mac, must be derived from Microseconds() (not UpTime()!) - // on windows, must be derived from timeGetTime() - ASIOSamples samplePosition; - ASIOSampleRate sampleRate; // current rate - unsigned long flags; // (see below) - char reserved[12]; -} AsioTimeInfo; - -typedef enum AsioTimeInfoFlags -{ - kSystemTimeValid = 1, // must always be valid - kSamplePositionValid = 1 << 1, // must always be valid - kSampleRateValid = 1 << 2, - kSpeedValid = 1 << 3, - - kSampleRateChanged = 1 << 4, - kClockSourceChanged = 1 << 5 -} AsioTimeInfoFlags; - -typedef struct ASIOTime // both input/output -{ - long reserved[4]; // must be 0 - struct AsioTimeInfo timeInfo; // required - struct ASIOTimeCode timeCode; // optional, evaluated if (timeCode.flags & kTcValid) -} ASIOTime; - -/* - -using time info: -it is recommended to use the new method with time info even if the asio -device does not support timecode; continuous calls to ASIOGetSamplePosition -and ASIOGetSampleRate are avoided, and there is a more defined relationship -between callback time and the time info. - -see the example below. -to initiate time info mode, after you have received the callbacks pointer in -ASIOCreateBuffers, you will call the asioMessage callback with kAsioSupportsTimeInfo -as the argument. if this returns 1, host has accepted time info mode. -now host expects the new callback bufferSwitchTimeInfo to be used instead -of the old bufferSwitch method. the ASIOTime structure is assumed to be valid -and accessible until the callback returns. - -using time code: -if the device supports reading time code, it will call host's asioMessage callback -with kAsioSupportsTimeCode as the selector. it may then fill the according -fields and set the kTcValid flag. -host will call the future method with the kAsioEnableTimeCodeRead selector when -it wants to enable or disable tc reading by the device. you should also support -the kAsioCanTimeInfo and kAsioCanTimeCode selectors in ASIOFuture (see example). - -note: -the AsioTimeInfo/ASIOTimeCode pair is supposed to work in both directions. -as a matter of convention, the relationship between the sample -position counter and the time code at buffer switch time is -(ignoring offset between tc and sample pos when tc is running): - -on input: sample 0 -> input buffer sample 0 -> time code 0 -on output: sample 0 -> output buffer sample 0 -> time code 0 - -this means that for 'real' calculations, one has to take into account -the according latencies. - -example: - -ASIOTime asioTime; - -in createBuffers() -{ - memset(&asioTime, 0, sizeof(ASIOTime)); - AsioTimeInfo* ti = &asioTime.timeInfo; - ti->sampleRate = theSampleRate; - ASIOTimeCode* tc = &asioTime.timeCode; - tc->speed = 1.; - timeInfoMode = false; - canTimeCode = false; - if(callbacks->asioMessage(kAsioSupportsTimeInfo, 0, 0, 0) == 1) - { - timeInfoMode = true; -#if kCanTimeCode - if(callbacks->asioMessage(kAsioSupportsTimeCode, 0, 0, 0) == 1) - canTimeCode = true; -#endif - } -} - -void switchBuffers(long doubleBufferIndex, bool processNow) -{ - if(timeInfoMode) - { - AsioTimeInfo* ti = &asioTime.timeInfo; - ti->flags = kSystemTimeValid | kSamplePositionValid | kSampleRateValid; - ti->systemTime = theNanoSeconds; - ti->samplePosition = theSamplePosition; - if(ti->sampleRate != theSampleRate) - ti->flags |= kSampleRateChanged; - ti->sampleRate = theSampleRate; - -#if kCanTimeCode - if(canTimeCode && timeCodeEnabled) - { - ASIOTimeCode* tc = &asioTime.timeCode; - tc->timeCodeSamples = tcSamples; // tc in samples - tc->flags = kTcValid | kTcRunning | kTcOnspeed; // if so... - } - ASIOTime* bb = callbacks->bufferSwitchTimeInfo(&asioTime, doubleBufferIndex, processNow ? ASIOTrue : ASIOFalse); -#else - callbacks->bufferSwitchTimeInfo(&asioTime, doubleBufferIndex, processNow ? ASIOTrue : ASIOFalse); -#endif - } - else - callbacks->bufferSwitch(doubleBufferIndex, ASIOFalse); -} - -ASIOError ASIOFuture(long selector, void *params) -{ - switch(selector) - { - case kAsioEnableTimeCodeRead: - timeCodeEnabled = true; - return ASE_SUCCESS; - case kAsioDisableTimeCodeRead: - timeCodeEnabled = false; - return ASE_SUCCESS; - case kAsioCanTimeInfo: - return ASE_SUCCESS; - #if kCanTimeCode - case kAsioCanTimeCode: - return ASE_SUCCESS; - #endif - } - return ASE_NotPresent; -}; - -*/ - -//- - - - - - - - - - - - - - - - - - - - - - - - - -// application's audio stream handler callbacks -//- - - - - - - - - - - - - - - - - - - - - - - - - - -typedef struct ASIOCallbacks -{ - void (*bufferSwitch) (long doubleBufferIndex, ASIOBool directProcess); - // bufferSwitch indicates that both input and output are to be processed. - // the current buffer half index (0 for A, 1 for B) determines - // - the output buffer that the host should start to fill. the other buffer - // will be passed to output hardware regardless of whether it got filled - // in time or not. - // - the input buffer that is now filled with incoming data. Note that - // because of the synchronicity of i/o, the input always has at - // least one buffer latency in relation to the output. - // directProcess suggests to the host whether it should immedeately - // start processing (directProcess == ASIOTrue), or whether its process - // should be deferred because the call comes from a very low level - // (for instance, a high level priority interrupt), and direct processing - // would cause timing instabilities for the rest of the system. If in doubt, - // directProcess should be set to ASIOFalse. - // Note: bufferSwitch may be called at interrupt time for highest efficiency. - - void (*sampleRateDidChange) (ASIOSampleRate sRate); - // gets called when the AudioStreamIO detects a sample rate change - // If sample rate is unknown, 0 is passed (for instance, clock loss - // when externally synchronized). - - long (*asioMessage) (long selector, long value, void* message, double* opt); - // generic callback for various purposes, see selectors below. - // note this is only present if the asio version is 2 or higher - - ASIOTime* (*bufferSwitchTimeInfo) (ASIOTime* params, long doubleBufferIndex, ASIOBool directProcess); - // new callback with time info. makes ASIOGetSamplePosition() and various - // calls to ASIOGetSampleRate obsolete, - // and allows for timecode sync etc. to be preferred; will be used if - // the driver calls asioMessage with selector kAsioSupportsTimeInfo. -} ASIOCallbacks; - -// asioMessage selectors -enum -{ - kAsioSelectorSupported = 1, // selector in , returns 1L if supported, - // 0 otherwise - kAsioEngineVersion, // returns engine (host) asio implementation version, - // 2 or higher - kAsioResetRequest, // request driver reset. if accepted, this - // will close the driver (ASIO_Exit() ) and - // re-open it again (ASIO_Init() etc). some - // drivers need to reconfigure for instance - // when the sample rate changes, or some basic - // changes have been made in ASIO_ControlPanel(). - // returns 1L; note the request is merely passed - // to the application, there is no way to determine - // if it gets accepted at this time (but it usually - // will be). - kAsioBufferSizeChange, // not yet supported, will currently always return 0L. - // for now, use kAsioResetRequest instead. - // once implemented, the new buffer size is expected - // in , and on success returns 1L - kAsioResyncRequest, // the driver went out of sync, such that - // the timestamp is no longer valid. this - // is a request to re-start the engine and - // slave devices (sequencer). returns 1 for ok, - // 0 if not supported. - kAsioLatenciesChanged, // the drivers latencies have changed. The engine - // will refetch the latencies. - kAsioSupportsTimeInfo, // if host returns true here, it will expect the - // callback bufferSwitchTimeInfo to be called instead - // of bufferSwitch - kAsioSupportsTimeCode, // - kAsioMMCCommand, // unused - value: number of commands, message points to mmc commands - kAsioSupportsInputMonitor, // kAsioSupportsXXX return 1 if host supports this - kAsioSupportsInputGain, // unused and undefined - kAsioSupportsInputMeter, // unused and undefined - kAsioSupportsOutputGain, // unused and undefined - kAsioSupportsOutputMeter, // unused and undefined - kAsioOverload, // driver detected an overload - - kAsioNumMessageSelectors -}; - -//--------------------------------------------------------------------------------------------------- -//--------------------------------------------------------------------------------------------------- - -//- - - - - - - - - - - - - - - - - - - - - - - - - -// (De-)Construction -//- - - - - - - - - - - - - - - - - - - - - - - - - - -typedef struct ASIODriverInfo -{ - long asioVersion; // currently, 2 - long driverVersion; // driver specific - char name[32]; - char errorMessage[124]; - void *sysRef; // on input: system reference - // (Windows: application main window handle, Mac & SGI: 0) -} ASIODriverInfo; - -ASIOError ASIOInit(ASIODriverInfo *info); -/* Purpose: - Initialize the AudioStreamIO. - Parameter: - info: pointer to an ASIODriver structure: - - asioVersion: - - on input, the host version. *** Note *** this is 0 for earlier asio - implementations, and the asioMessage callback is implemeted - only if asioVersion is 2 or greater. sorry but due to a design fault - the driver doesn't have access to the host version in ASIOInit :-( - added selector for host (engine) version in the asioMessage callback - so we're ok from now on. - - on return, asio implementation version. - older versions are 1 - if you support this version (namely, ASIO_outputReady() ) - this should be 2 or higher. also see the note in - ASIO_getTimeStamp() ! - - version: on return, the driver version (format is driver specific) - - name: on return, a null-terminated string containing the driver's name - - error message: on return, should contain a user message describing - the type of error that occured during ASIOInit(), if any. - - sysRef: platform specific - Returns: - If neither input nor output is present ASE_NotPresent - will be returned. - ASE_NoMemory, ASE_HWMalfunction are other possible error conditions -*/ - -ASIOError ASIOExit(void); -/* Purpose: - Terminates the AudioStreamIO. - Parameter: - None. - Returns: - If neither input nor output is present ASE_NotPresent - will be returned. - Notes: this implies ASIOStop() and ASIODisposeBuffers(), - meaning that no host callbacks must be accessed after ASIOExit(). -*/ - -//- - - - - - - - - - - - - - - - - - - - - - - - - -// Start/Stop -//- - - - - - - - - - - - - - - - - - - - - - - - - - -ASIOError ASIOStart(void); -/* Purpose: - Start input and output processing synchronously. - This will - - reset the sample counter to zero - - start the hardware (both input and output) - The first call to the hosts' bufferSwitch(index == 0) then tells - the host to read from input buffer A (index 0), and start - processing to output buffer A while output buffer B (which - has been filled by the host prior to calling ASIOStart()) - is possibly sounding (see also ASIOGetLatencies()) - Parameter: - None. - Returns: - If neither input nor output is present, ASE_NotPresent - will be returned. - If the hardware fails to start, ASE_HWMalfunction will be returned. - Notes: - There is no restriction on the time that ASIOStart() takes - to perform (that is, it is not considered a realtime trigger). -*/ - -ASIOError ASIOStop(void); -/* Purpose: - Stops input and output processing altogether. - Parameter: - None. - Returns: - If neither input nor output is present ASE_NotPresent - will be returned. - Notes: - On return from ASIOStop(), the driver must in no - case call the hosts' bufferSwitch() routine. -*/ - -//- - - - - - - - - - - - - - - - - - - - - - - - - -// Inquiry methods and sample rate -//- - - - - - - - - - - - - - - - - - - - - - - - - - -ASIOError ASIOGetChannels(long *numInputChannels, long *numOutputChannels); -/* Purpose: - Returns number of individual input/output channels. - Parameter: - numInputChannels will hold the number of available input channels - numOutputChannels will hold the number of available output channels - Returns: - If no input/output is present ASE_NotPresent will be returned. - If only inputs, or only outputs are available, the according - other parameter will be zero, and ASE_OK is returned. -*/ - -ASIOError ASIOGetLatencies(long *inputLatency, long *outputLatency); -/* Purpose: - Returns the input and output latencies. This includes - device specific delays, like FIFOs etc. - Parameter: - inputLatency will hold the 'age' of the first sample frame - in the input buffer when the hosts reads it in bufferSwitch() - (this is theoretical, meaning it does not include the overhead - and delay between the actual physical switch, and the time - when bufferSitch() enters). - This will usually be the size of one block in sample frames, plus - device specific latencies. - - outputLatency will specify the time between the buffer switch, - and the time when the next play buffer will start to sound. - The next play buffer is defined as the one the host starts - processing after (or at) bufferSwitch(), indicated by the - index parameter (0 for buffer A, 1 for buffer B). - It will usually be either one block, if the host writes directly - to a dma buffer, or two or more blocks if the buffer is 'latched' by - the driver. As an example, on ASIOStart(), the host will have filled - the play buffer at index 1 already; when it gets the callback (with - the parameter index == 0), this tells it to read from the input - buffer 0, and start to fill the play buffer 0 (assuming that now - play buffer 1 is already sounding). In this case, the output - latency is one block. If the driver decides to copy buffer 1 - at that time, and pass it to the hardware at the next slot (which - is most commonly done, but should be avoided), the output latency - becomes two blocks instead, resulting in a total i/o latency of at least - 3 blocks. As memory access is the main bottleneck in native dsp processing, - and to acheive less latency, it is highly recommended to try to avoid - copying (this is also why the driver is the owner of the buffers). To - summarize, the minimum i/o latency can be acheived if the input buffer - is processed by the host into the output buffer which will physically - start to sound on the next time slice. Also note that the host expects - the bufferSwitch() callback to be accessed for each time slice in order - to retain sync, possibly recursively; if it fails to process a block in - time, it will suspend its operation for some time in order to recover. - Returns: - If no input/output is present ASE_NotPresent will be returned. -*/ - -ASIOError ASIOGetBufferSize(long *minSize, long *maxSize, long *preferredSize, long *granularity); -/* Purpose: - Returns min, max, and preferred buffer sizes for input/output - Parameter: - minSize will hold the minimum buffer size - maxSize will hold the maxium possible buffer size - preferredSize will hold the preferred buffer size (a size which - best fits performance and hardware requirements) - granularity will hold the granularity at which buffer sizes - may differ. Usually, the buffer size will be a power of 2; - in this case, granularity will hold -1 on return, signalling - possible buffer sizes starting from minSize, increased in - powers of 2 up to maxSize. - Returns: - If no input/output is present ASE_NotPresent will be returned. - Notes: - When minimum and maximum buffer size are equal, - the preferred buffer size has to be the same value as well; granularity - should be 0 in this case. -*/ - -ASIOError ASIOCanSampleRate(ASIOSampleRate sampleRate); -/* Purpose: - Inquires the hardware for the available sample rates. - Parameter: - sampleRate is the rate in question. - Returns: - If the inquired sample rate is not supported, ASE_NoClock will be returned. - If no input/output is present ASE_NotPresent will be returned. -*/ -ASIOError ASIOGetSampleRate(ASIOSampleRate *currentRate); -/* Purpose: - Get the current sample Rate. - Parameter: - currentRate will hold the current sample rate on return. - Returns: - If sample rate is unknown, sampleRate will be 0 and ASE_NoClock will be returned. - If no input/output is present ASE_NotPresent will be returned. - Notes: -*/ - -ASIOError ASIOSetSampleRate(ASIOSampleRate sampleRate); -/* Purpose: - Set the hardware to the requested sample Rate. If sampleRate == 0, - enable external sync. - Parameter: - sampleRate: on input, the requested rate - Returns: - If sampleRate is unknown ASE_NoClock will be returned. - If the current clock is external, and sampleRate is != 0, - ASE_InvalidMode will be returned - If no input/output is present ASE_NotPresent will be returned. - Notes: -*/ - -typedef struct ASIOClockSource -{ - long index; // as used for ASIOSetClockSource() - long associatedChannel; // for instance, S/PDIF or AES/EBU - long associatedGroup; // see channel groups (ASIOGetChannelInfo()) - ASIOBool isCurrentSource; // ASIOTrue if this is the current clock source - char name[32]; // for user selection -} ASIOClockSource; - -ASIOError ASIOGetClockSources(ASIOClockSource *clocks, long *numSources); -/* Purpose: - Get the available external audio clock sources - Parameter: - clocks points to an array of ASIOClockSource structures: - - index: this is used to identify the clock source - when ASIOSetClockSource() is accessed, should be - an index counting from zero - - associatedInputChannel: the first channel of an associated - input group, if any. - - associatedGroup: the group index of that channel. - groups of channels are defined to seperate for - instance analog, S/PDIF, AES/EBU, ADAT connectors etc, - when present simultaniously. Note that associated channel - is enumerated according to numInputs/numOutputs, means it - is independant from a group (see also ASIOGetChannelInfo()) - inputs are associated to a clock if the physical connection - transfers both data and clock (like S/PDIF, AES/EBU, or - ADAT inputs). if there is no input channel associated with - the clock source (like Word Clock, or internal oscillator), both - associatedChannel and associatedGroup should be set to -1. - - isCurrentSource: on exit, ASIOTrue if this is the current clock - source, ASIOFalse else - - name: a null-terminated string for user selection of the available sources. - numSources: - on input: the number of allocated array members - on output: the number of available clock sources, at least - 1 (internal clock generator). - Returns: - If no input/output is present ASE_NotPresent will be returned. - Notes: -*/ - -ASIOError ASIOSetClockSource(long index); -/* Purpose: - Set the audio clock source - Parameter: - index as obtained from an inquiry to ASIOGetClockSources() - Returns: - If no input/output is present ASE_NotPresent will be returned. - If the clock can not be selected because an input channel which - carries the current clock source is active, ASE_InvalidMode - *may* be returned (this depends on the properties of the driver - and/or hardware). - Notes: - Should *not* return ASE_NoClock if there is no clock signal present - at the selected source; this will be inquired via ASIOGetSampleRate(). - It should call the host callback procedure sampleRateHasChanged(), - if the switch causes a sample rate change, or if no external clock - is present at the selected source. -*/ - -ASIOError ASIOGetSamplePosition (ASIOSamples *sPos, ASIOTimeStamp *tStamp); -/* Purpose: - Inquires the sample position/time stamp pair. - Parameter: - sPos will hold the sample position on return. The sample - position is reset to zero when ASIOStart() gets called. - tStamp will hold the system time when the sample position - was latched. - Returns: - If no input/output is present, ASE_NotPresent will be returned. - If there is no clock, ASE_SPNotAdvancing will be returned. - Notes: - - in order to be able to synchronise properly, - the sample position / time stamp pair must refer to the current block, - that is, the engine will call ASIOGetSamplePosition() in its bufferSwitch() - callback and expect the time for the current block. thus, when requested - in the very first bufferSwitch after ASIO_Start(), the sample position - should be zero, and the time stamp should refer to the very time where - the stream was started. it also means that the sample position must be - block aligned. the driver must ensure proper interpolation if the system - time can not be determined for the block position. the driver is responsible - for precise time stamps as it usually has most direct access to lower - level resources. proper behaviour of ASIO_GetSamplePosition() and ASIO_GetLatencies() - are essential for precise media synchronization! -*/ - -typedef struct ASIOChannelInfo -{ - long channel; // on input, channel index - ASIOBool isInput; // on input - ASIOBool isActive; // on exit - long channelGroup; // dto - ASIOSampleType type; // dto - char name[32]; // dto -} ASIOChannelInfo; - -ASIOError ASIOGetChannelInfo(ASIOChannelInfo *info); -/* Purpose: - retreive information about the nature of a channel - Parameter: - info: pointer to a ASIOChannelInfo structure with - - channel: on input, the channel index of the channel in question. - - isInput: on input, ASIOTrue if info for an input channel is - requested, else output - - channelGroup: on return, the channel group that the channel - belongs to. For drivers which support different types of - channels, like analog, S/PDIF, AES/EBU, ADAT etc interfaces, - there should be a reasonable grouping of these types. Groups - are always independant form a channel index, that is, a channel - index always counts from 0 to numInputs/numOutputs regardless - of the group it may belong to. - There will always be at least one group (group 0). Please - also note that by default, the host may decide to activate - channels 0 and 1; thus, these should belong to the most - useful type (analog i/o, if present). - - type: on return, contains the sample type of the channel - - isActive: on return, ASIOTrue if channel is active as it was - installed by ASIOCreateBuffers(), ASIOFalse else - - name: describing the type of channel in question. Used to allow - for user selection, and enabling of specific channels. examples: - "Analog In", "SPDIF Out" etc - Returns: - If no input/output is present ASE_NotPresent will be returned. - Notes: - If possible, the string should be organised such that the first - characters are most significantly describing the nature of the - port, to allow for identification even if the view showing the - port name is too small to display more than 8 characters, for - instance. -*/ - -//- - - - - - - - - - - - - - - - - - - - - - - - - -// Buffer preparation -//- - - - - - - - - - - - - - - - - - - - - - - - - - -typedef struct ASIOBufferInfo -{ - ASIOBool isInput; // on input: ASIOTrue: input, else output - long channelNum; // on input: channel index - void *buffers[2]; // on output: double buffer addresses -} ASIOBufferInfo; - -ASIOError ASIOCreateBuffers(ASIOBufferInfo *bufferInfos, long numChannels, - long bufferSize, ASIOCallbacks *callbacks); - -/* Purpose: - Allocates input/output buffers for all input and output channels to be activated. - Parameter: - bufferInfos is a pointer to an array of ASIOBufferInfo structures: - - isInput: on input, ASIOTrue if the buffer is to be allocated - for an input, output buffer else - - channelNum: on input, the index of the channel in question - (counting from 0) - - buffers: on exit, 2 pointers to the halves of the channels' double-buffer. - the size of the buffer(s) of course depend on both the ASIOSampleType - as obtained from ASIOGetChannelInfo(), and bufferSize - numChannels is the sum of all input and output channels to be created; - thus bufferInfos is a pointer to an array of numChannels ASIOBufferInfo - structures. - bufferSize selects one of the possible buffer sizes as obtained from - ASIOGetBufferSizes(). - callbacks is a pointer to an ASIOCallbacks structure. - Returns: - If not enough memory is available ASE_NoMemory will be returned. - If no input/output is present ASE_NotPresent will be returned. - If bufferSize is not supported, or one or more of the bufferInfos elements - contain invalid settings, ASE_InvalidMode will be returned. - Notes: - If individual channel selection is not possible but requested, - the driver has to handle this. namely, bufferSwitch() will only - have filled buffers of enabled outputs. If possible, processing - and buss activities overhead should be avoided for channels which - were not enabled here. -*/ - -ASIOError ASIODisposeBuffers(void); -/* Purpose: - Releases all buffers for the device. - Parameter: - None. - Returns: - If no buffer were ever prepared, ASE_InvalidMode will be returned. - If no input/output is present ASE_NotPresent will be returned. - Notes: - This implies ASIOStop(). -*/ - -ASIOError ASIOControlPanel(void); -/* Purpose: - request the driver to start a control panel component - for device specific user settings. This will not be - accessed on some platforms (where the component is accessed - instead). - Parameter: - None. - Returns: - If no panel is available ASE_NotPresent will be returned. - Actually, the return code is ignored. - Notes: - if the user applied settings which require a re-configuration - of parts or all of the enigine and/or driver (such as a change of - the block size), the asioMessage callback can be used (see - ASIO_Callbacks). -*/ - -ASIOError ASIOFuture(long selector, void *params); -/* Purpose: - various - Parameter: - selector: operation Code as to be defined. zero is reserved for - testing purposes. - params: depends on the selector; usually pointer to a structure - for passing and retreiving any type and amount of parameters. - Returns: - the return value is also selector dependant. if the selector - is unknown, ASE_InvalidParameter should be returned to prevent - further calls with this selector. on success, ASE_SUCCESS - must be returned (note: ASE_OK is *not* sufficient!) - Notes: - see selectors defined below. -*/ - -enum -{ - kAsioEnableTimeCodeRead = 1, // no arguments - kAsioDisableTimeCodeRead, // no arguments - kAsioSetInputMonitor, // ASIOInputMonitor* in params - kAsioTransport, // ASIOTransportParameters* in params - kAsioSetInputGain, // ASIOChannelControls* in params, apply gain - kAsioGetInputMeter, // ASIOChannelControls* in params, fill meter - kAsioSetOutputGain, // ASIOChannelControls* in params, apply gain - kAsioGetOutputMeter, // ASIOChannelControls* in params, fill meter - kAsioCanInputMonitor, // no arguments for kAsioCanXXX selectors - kAsioCanTimeInfo, - kAsioCanTimeCode, - kAsioCanTransport, - kAsioCanInputGain, - kAsioCanInputMeter, - kAsioCanOutputGain, - kAsioCanOutputMeter, - kAsioOptionalOne, - - // DSD support - // The following extensions are required to allow switching - // and control of the DSD subsystem. - kAsioSetIoFormat = 0x23111961, /* ASIOIoFormat * in params. */ - kAsioGetIoFormat = 0x23111983, /* ASIOIoFormat * in params. */ - kAsioCanDoIoFormat = 0x23112004, /* ASIOIoFormat * in params. */ - - // Extension for drop out detection - kAsioCanReportOverload = 0x24042012, /* return ASE_SUCCESS if driver can detect and report overloads */ - - kAsioGetInternalBufferSamples = 0x25042012 /* ASIOInternalBufferInfo * in params. Deliver size of driver internal buffering, return ASE_SUCCESS if supported */ -}; - -typedef struct ASIOInputMonitor -{ - long input; // this input was set to monitor (or off), -1: all - long output; // suggested output for monitoring the input (if so) - long gain; // suggested gain, ranging 0 - 0x7fffffffL (-inf to +12 dB) - ASIOBool state; // ASIOTrue => on, ASIOFalse => off - long pan; // suggested pan, 0 => all left, 0x7fffffff => right -} ASIOInputMonitor; - -typedef struct ASIOChannelControls -{ - long channel; // on input, channel index - ASIOBool isInput; // on input - long gain; // on input, ranges 0 thru 0x7fffffff - long meter; // on return, ranges 0 thru 0x7fffffff - char future[32]; -} ASIOChannelControls; - -typedef struct ASIOTransportParameters -{ - long command; // see enum below - ASIOSamples samplePosition; - long track; - long trackSwitches[16]; // 512 tracks on/off - char future[64]; -} ASIOTransportParameters; - -enum -{ - kTransStart = 1, - kTransStop, - kTransLocate, // to samplePosition - kTransPunchIn, - kTransPunchOut, - kTransArmOn, // track - kTransArmOff, // track - kTransMonitorOn, // track - kTransMonitorOff, // track - kTransArm, // trackSwitches - kTransMonitor // trackSwitches -}; - -/* -// DSD support -// Some notes on how to use ASIOIoFormatType. -// -// The caller will fill the format with the request types. -// If the board can do the request then it will leave the -// values unchanged. If the board does not support the -// request then it will change that entry to Invalid (-1) -// -// So to request DSD then -// -// ASIOIoFormat NeedThis={kASIODSDFormat}; -// -// if(ASE_SUCCESS != ASIOFuture(kAsioSetIoFormat,&NeedThis) ){ -// // If the board did not accept one of the parameters then the -// // whole call will fail and the failing parameter will -// // have had its value changes to -1. -// } -// -// Note: Switching between the formats need to be done before the "prepared" -// state (see ASIO 2 documentation) is entered. -*/ -typedef long int ASIOIoFormatType; -enum ASIOIoFormatType_e -{ - kASIOFormatInvalid = -1, - kASIOPCMFormat = 0, - kASIODSDFormat = 1, -}; - -typedef struct ASIOIoFormat_s -{ - ASIOIoFormatType FormatType; - char future[512-sizeof(ASIOIoFormatType)]; -} ASIOIoFormat; - -// Extension for drop detection -// Note: Refers to buffering that goes beyond the double buffer e.g. used by USB driver designs -typedef struct ASIOInternalBufferInfo -{ - long inputSamples; // size of driver's internal input buffering which is included in getLatencies - long outputSamples; // size of driver's internal output buffering which is included in getLatencies -} ASIOInternalBufferInfo; - - -ASIOError ASIOOutputReady(void); -/* Purpose: - this tells the driver that the host has completed processing - the output buffers. if the data format required by the hardware - differs from the supported asio formats, but the hardware - buffers are DMA buffers, the driver will have to convert - the audio stream data; as the bufferSwitch callback is - usually issued at dma block switch time, the driver will - have to convert the *previous* host buffer, which increases - the output latency by one block. - when the host finds out that ASIOOutputReady() returns - true, it will issue this call whenever it completed - output processing. then the driver can convert the - host data directly to the dma buffer to be played next, - reducing output latency by one block. - another way to look at it is, that the buffer switch is called - in order to pass the *input* stream to the host, so that it can - process the input into the output, and the output stream is passed - to the driver when the host has completed its process. - Parameter: - None - Returns: - only if the above mentioned scenario is given, and a reduction - of output latency can be acheived by this mechanism, should - ASE_OK be returned. otherwise (and usually), ASE_NotPresent - should be returned in order to prevent further calls to this - function. note that the host may want to determine if it is - to use this when the system is not yet fully initialized, so - ASE_OK should always be returned if the mechanism makes sense. - Notes: - please remeber to adjust ASIOGetLatencies() according to - whether ASIOOutputReady() was ever called or not, if your - driver supports this scenario. - also note that the engine may fail to call ASIO_OutputReady() - in time in overload cases. as already mentioned, bufferSwitch - should be called for every block regardless of whether a block - could be processed in time. -*/ - -// restore old alignment -#if defined(_MSC_VER) && !defined(__MWERKS__) -#pragma pack(pop) -#elif PRAGMA_ALIGN_SUPPORTED -#pragma options align = reset -#endif - -#endif - diff --git a/src/hostapi/asio/ASIOSDK/common/asiodrvr.cpp b/src/hostapi/asio/ASIOSDK/common/asiodrvr.cpp deleted file mode 100644 index 6ada6f6..0000000 --- a/src/hostapi/asio/ASIOSDK/common/asiodrvr.cpp +++ /dev/null @@ -1,139 +0,0 @@ -/* - Steinberg Audio Stream I/O API - (c) 1996, Steinberg Soft- und Hardware GmbH - charlie (May 1996) - - asiodrvr.cpp - c++ superclass to implement asio functionality. from this, - you can derive whatever required -*/ - -#include -#include "asiosys.h" -#include "asiodrvr.h" - -#if WINDOWS -#error do not use this -AsioDriver::AsioDriver (LPUNKNOWN pUnk, HRESULT *phr) : CUnknown("My AsioDriver", pUnk, phr) -{ -} - -#else - -AsioDriver::AsioDriver() -{ -} - -#endif - -AsioDriver::~AsioDriver() -{ -} - -ASIOBool AsioDriver::init(void *sysRef) -{ - return ASE_NotPresent; -} - -void AsioDriver::getDriverName(char *name) -{ - strcpy(name, "No Driver"); -} - -long AsioDriver::getDriverVersion() -{ - return 0; -} - -void AsioDriver::getErrorMessage(char *string) -{ - strcpy(string, "ASIO Driver Implementation Error!"); -} - -ASIOError AsioDriver::start() -{ - return ASE_NotPresent; -} - -ASIOError AsioDriver::stop() -{ - return ASE_NotPresent; -} - -ASIOError AsioDriver::getChannels(long *numInputChannels, long *numOutputChannels) -{ - return ASE_NotPresent; -} - -ASIOError AsioDriver::getLatencies(long *inputLatency, long *outputLatency) -{ - return ASE_NotPresent; -} - -ASIOError AsioDriver::getBufferSize(long *minSize, long *maxSize, - long *preferredSize, long *granularity) -{ - return ASE_NotPresent; -} - -ASIOError AsioDriver::canSampleRate(ASIOSampleRate sampleRate) -{ - return ASE_NotPresent; -} - -ASIOError AsioDriver::getSampleRate(ASIOSampleRate *sampleRate) -{ - return ASE_NotPresent; -} - -ASIOError AsioDriver::setSampleRate(ASIOSampleRate sampleRate) -{ - return ASE_NotPresent; -} - -ASIOError AsioDriver::getClockSources(ASIOClockSource *clocks, long *numSources) -{ - *numSources = 0; - return ASE_NotPresent; -} - -ASIOError AsioDriver::setClockSource(long reference) -{ - return ASE_NotPresent; -} - -ASIOError AsioDriver::getSamplePosition(ASIOSamples *sPos, ASIOTimeStamp *tStamp) -{ - return ASE_NotPresent; -} - -ASIOError AsioDriver::getChannelInfo(ASIOChannelInfo *info) -{ - return ASE_NotPresent; -} - -ASIOError AsioDriver::createBuffers(ASIOBufferInfo *channelInfos, long numChannels, - long bufferSize, ASIOCallbacks *callbacks) -{ - return ASE_NotPresent; -} - -ASIOError AsioDriver::disposeBuffers() -{ - return ASE_NotPresent; -} - -ASIOError AsioDriver::controlPanel() -{ - return ASE_NotPresent; -} - -ASIOError AsioDriver::future(long selector, void *opt) -{ - return ASE_NotPresent; -} - -ASIOError AsioDriver::outputReady() -{ - return ASE_NotPresent; -} \ No newline at end of file diff --git a/src/hostapi/asio/ASIOSDK/common/asiodrvr.h b/src/hostapi/asio/ASIOSDK/common/asiodrvr.h deleted file mode 100644 index 1670dfa..0000000 --- a/src/hostapi/asio/ASIOSDK/common/asiodrvr.h +++ /dev/null @@ -1,76 +0,0 @@ -/* - Steinberg Audio Stream I/O API - (c) 1996, Steinberg Soft- und Hardware GmbH - charlie (May 1996) - - asiodrvr.h - c++ superclass to implement asio functionality. from this, - you can derive whatever required -*/ - -#ifndef _asiodrvr_ -#define _asiodrvr_ - -// cpu and os system we are running on -#include "asiosys.h" -// basic "C" interface -#include "asio.h" - -class AsioDriver; -extern AsioDriver *getDriver(); // for generic constructor - -#if WINDOWS -#include -#include "combase.h" -#include "iasiodrv.h" -class AsioDriver : public IASIO ,public CUnknown -{ -public: - AsioDriver(LPUNKNOWN pUnk, HRESULT *phr); - - DECLARE_IUNKNOWN - // Factory method - static CUnknown *CreateInstance(LPUNKNOWN pUnk, HRESULT *phr); - // IUnknown - virtual HRESULT STDMETHODCALLTYPE NonDelegatingQueryInterface(REFIID riid,void **ppvObject); - -#else - -class AsioDriver -{ -public: - AsioDriver(); -#endif - virtual ~AsioDriver(); - - virtual ASIOBool init(void* sysRef); - virtual void getDriverName(char *name); // max 32 bytes incl. terminating zero - virtual long getDriverVersion(); - virtual void getErrorMessage(char *string); // max 124 bytes incl. - - virtual ASIOError start(); - virtual ASIOError stop(); - - virtual ASIOError getChannels(long *numInputChannels, long *numOutputChannels); - virtual ASIOError getLatencies(long *inputLatency, long *outputLatency); - virtual ASIOError getBufferSize(long *minSize, long *maxSize, - long *preferredSize, long *granularity); - - virtual ASIOError canSampleRate(ASIOSampleRate sampleRate); - virtual ASIOError getSampleRate(ASIOSampleRate *sampleRate); - virtual ASIOError setSampleRate(ASIOSampleRate sampleRate); - virtual ASIOError getClockSources(ASIOClockSource *clocks, long *numSources); - virtual ASIOError setClockSource(long reference); - - virtual ASIOError getSamplePosition(ASIOSamples *sPos, ASIOTimeStamp *tStamp); - virtual ASIOError getChannelInfo(ASIOChannelInfo *info); - - virtual ASIOError createBuffers(ASIOBufferInfo *bufferInfos, long numChannels, - long bufferSize, ASIOCallbacks *callbacks); - virtual ASIOError disposeBuffers(); - - virtual ASIOError controlPanel(); - virtual ASIOError future(long selector, void *opt); - virtual ASIOError outputReady(); -}; -#endif diff --git a/src/hostapi/asio/ASIOSDK/common/asiosys.h b/src/hostapi/asio/ASIOSDK/common/asiosys.h deleted file mode 100644 index b4c7a8b..0000000 --- a/src/hostapi/asio/ASIOSDK/common/asiosys.h +++ /dev/null @@ -1,82 +0,0 @@ -#ifndef __asiosys__ - #define __asiosys__ - - #if defined(_WIN32) || defined(_WIN64) - #undef MAC - #define PPC 0 - #define WINDOWS 1 - #define SGI 0 - #define SUN 0 - #define LINUX 0 - #define BEOS 0 - - #define NATIVE_INT64 0 - #define IEEE754_64FLOAT 1 - - #elif BEOS - #define MAC 0 - #define PPC 0 - #define WINDOWS 0 - #define PC 0 - #define SGI 0 - #define SUN 0 - #define LINUX 0 - - #define NATIVE_INT64 0 - #define IEEE754_64FLOAT 1 - - #ifndef DEBUG - #define DEBUG 0 - #if DEBUG - void DEBUGGERMESSAGE(char *string); - #else - #define DEBUGGERMESSAGE(a) - #endif - #endif - - #elif SGI - #define MAC 0 - #define PPC 0 - #define WINDOWS 0 - #define PC 0 - #define SUN 0 - #define LINUX 0 - #define BEOS 0 - - #define NATIVE_INT64 0 - #define IEEE754_64FLOAT 1 - - #ifndef DEBUG - #define DEBUG 0 - #if DEBUG - void DEBUGGERMESSAGE(char *string); - #else - #define DEBUGGERMESSAGE(a) - #endif - #endif - - #else // MAC - - #define MAC 1 - #define PPC 1 - #define WINDOWS 0 - #define PC 0 - #define SGI 0 - #define SUN 0 - #define LINUX 0 - #define BEOS 0 - - #define NATIVE_INT64 0 - #define IEEE754_64FLOAT 1 - - #ifndef DEBUG - #define DEBUG 0 - #if DEBUG - void DEBUGGERMESSAGE(char *string); - #else - #define DEBUGGERMESSAGE(a) - #endif - #endif - #endif - -#endif diff --git a/src/hostapi/asio/ASIOSDK/common/combase.cpp b/src/hostapi/asio/ASIOSDK/common/combase.cpp deleted file mode 100644 index 84b64f8..0000000 --- a/src/hostapi/asio/ASIOSDK/common/combase.cpp +++ /dev/null @@ -1,202 +0,0 @@ -//==========================================================================; -// -// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY -// KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -// IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR -// PURPOSE. -// -// Copyright (c) 1992 - 1996 Microsoft Corporation. All Rights Reserved. -// -//--------------------------------------------------------------------------; - -// Base class hierachy for creating COM objects, December 1994 - -#include -#include "wxdebug.h" -#include "combase.h" -#pragma warning( disable : 4514 ) // Disable warnings re unused inline functions - - -/* Define the static member variable */ - -LONG CBaseObject::m_cObjects = 0; - - -/* Constructor */ - -CBaseObject::CBaseObject(TCHAR *pName) -{ - /* Increment the number of active objects */ - InterlockedIncrement(&m_cObjects); - -#ifdef DEBUG - m_dwCookie = DbgRegisterObjectCreation(pName); -#endif -} - - -/* Destructor */ - -CBaseObject::~CBaseObject() -{ - /* Decrement the number of objects active */ - InterlockedDecrement(&m_cObjects); - -#ifdef DEBUG - DbgRegisterObjectDestruction(m_dwCookie); -#endif -} - - -/* Constructor */ - -// We know we use "this" in the initialization list, we also know we don't modify *phr. -#pragma warning( disable : 4355 4100 ) -CUnknown::CUnknown(TCHAR *pName, LPUNKNOWN pUnk, HRESULT *phr) -: CBaseObject(pName) -/* Start the object with a reference count of zero - when the */ -/* object is queried for it's first interface this may be */ -/* incremented depending on whether or not this object is */ -/* currently being aggregated upon */ -, m_cRef(0) -/* Set our pointer to our IUnknown interface. */ -/* If we have an outer, use its, otherwise use ours. */ -/* This pointer effectivly points to the owner of */ -/* this object and can be accessed by the GetOwner() method. */ -, m_pUnknown( pUnk != 0 ? pUnk : reinterpret_cast( static_cast(this) ) ) - /* Why the double cast? Well, the inner cast is a type-safe cast */ - /* to pointer to a type from which we inherit. The second is */ - /* type-unsafe but works because INonDelegatingUnknown "behaves */ - /* like" IUnknown. (Only the names on the methods change.) */ -{ - // Everything we need to do has been done in the initializer list -} -#pragma warning( default : 4355 4100 ) - -/* QueryInterface */ - -STDMETHODIMP CUnknown::NonDelegatingQueryInterface(REFIID riid, void ** ppv) -{ - CheckPointer(ppv,E_POINTER); - ValidateReadWritePtr(ppv,sizeof(PVOID)); - - /* We know only about IUnknown */ - - if (riid == IID_IUnknown) { - GetInterface((LPUNKNOWN) (PNDUNKNOWN) this, ppv); - return NOERROR; - } else { - *ppv = NULL; - return E_NOINTERFACE; - } -} - -/* We have to ensure that we DON'T use a max macro, since these will typically */ -/* lead to one of the parameters being evaluated twice. Since we are worried */ -/* about concurrency, we can't afford to access the m_cRef twice since we can't */ -/* afford to run the risk that its value having changed between accesses. */ -#ifdef max - #undef max -#endif - -template inline static T max( const T & a, const T & b ) -{ - return a > b ? a : b; -} - -/* AddRef */ - -STDMETHODIMP_(ULONG) CUnknown::NonDelegatingAddRef() -{ - LONG lRef = InterlockedIncrement( &m_cRef ); - ASSERT(lRef > 0); - DbgLog((LOG_MEMORY,3,TEXT(" Obj %d ref++ = %d"), - m_dwCookie, m_cRef)); - return max(ULONG(m_cRef), 1ul); -} - - - -/* Release */ - -STDMETHODIMP_(ULONG) CUnknown::NonDelegatingRelease() -{ - /* If the reference count drops to zero delete ourselves */ - - LONG lRef = InterlockedDecrement( &m_cRef ); - ASSERT(lRef >= 0); - - DbgLog((LOG_MEMORY,3,TEXT(" Object %d ref-- = %d"), - m_dwCookie, m_cRef)); - if (lRef == 0) { - - // COM rules say we must protect against re-entrancy. - // If we are an aggregator and we hold our own interfaces - // on the aggregatee, the QI for these interfaces will - // addref ourselves. So after doing the QI we must release - // a ref count on ourselves. Then, before releasing the - // private interface, we must addref ourselves. When we do - // this from the destructor here it will result in the ref - // count going to 1 and then back to 0 causing us to - // re-enter the destructor. Hence we add an extra refcount here - // once we know we will delete the object. - // for an example aggregator see filgraph\distrib.cpp. - - m_cRef++; - - delete this; - return ULONG(0); - } else { - return max(ULONG(m_cRef), 1ul); - } -} - - -/* Return an interface pointer to a requesting client - performing a thread safe AddRef as necessary */ - -HRESULT CUnknown::GetInterface(LPUNKNOWN pUnk, void **ppv) -{ - CheckPointer(ppv, E_POINTER); - *ppv = pUnk; - pUnk->AddRef(); - return NOERROR; -} - - -/* Compares two interfaces and returns TRUE if they are on the same object */ - -BOOL IsEqualObject(IUnknown *pFirst, IUnknown *pSecond) -{ - /* Different objects can't have the same interface pointer for - any interface - */ - if (pFirst == pSecond) { - return TRUE; - } - /* OK - do it the hard way - check if they have the same - IUnknown pointers - a single object can only have one of these - */ - LPUNKNOWN pUnknown1; // Retrieve the IUnknown interface - LPUNKNOWN pUnknown2; // Retrieve the other IUnknown interface - HRESULT hr; // General OLE return code - - ASSERT(pFirst); - ASSERT(pSecond); - - /* See if the IUnknown pointers match */ - - hr = pFirst->QueryInterface(IID_IUnknown,(void **) &pUnknown1); - ASSERT(SUCCEEDED(hr)); - ASSERT(pUnknown1); - - hr = pSecond->QueryInterface(IID_IUnknown,(void **) &pUnknown2); - ASSERT(SUCCEEDED(hr)); - ASSERT(pUnknown2); - - /* Release the extra interfaces we hold */ - - pUnknown1->Release(); - pUnknown2->Release(); - return (pUnknown1 == pUnknown2); -} diff --git a/src/hostapi/asio/ASIOSDK/common/combase.h b/src/hostapi/asio/ASIOSDK/common/combase.h deleted file mode 100644 index 6141803..0000000 --- a/src/hostapi/asio/ASIOSDK/common/combase.h +++ /dev/null @@ -1,284 +0,0 @@ -//==========================================================================; -// -// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY -// KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -// IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR -// PURPOSE. -// -// Copyright (c) 1992 - 1996 Microsoft Corporation. All Rights Reserved. -// -//--------------------------------------------------------------------------; - -// Base class hierachy for creating COM objects, December 1994 - -/* - -a. Derive your COM object from CUnknown - -b. Make a static CreateInstance function that takes an LPUNKNOWN, an HRESULT * - and a TCHAR *. The LPUNKNOWN defines the object to delegate IUnknown calls - to. The HRESULT * allows error codes to be passed around constructors and - the TCHAR * is a descriptive name that can be printed on the debugger. - - It is important that constructors only change the HRESULT * if they have - to set an ERROR code, if it was successful then leave it alone or you may - overwrite an error code from an object previously created. - - When you call a constructor the descriptive name should be in static store - as we do not copy the string. To stop large amounts of memory being used - in retail builds by all these static strings use the NAME macro, - - CMyFilter = new CImplFilter(NAME("My filter"),pUnknown,phr); - if (FAILED(hr)) { - return hr; - } - - In retail builds NAME(_x_) compiles to NULL, the base CBaseObject class - knows not to do anything with objects that don't have a name. - -c. Have a constructor for your object that passes the LPUNKNOWN, HRESULT * and - TCHAR * to the CUnknown constructor. You can set the HRESULT if you have an - error, or just simply pass it through to the constructor. - - The object creation will fail in the class factory if the HRESULT indicates - an error (ie FAILED(HRESULT) == TRUE) - -d. Create a FactoryTemplate with your object's class id and CreateInstance - function. - -Then (for each interface) either - -Multiple inheritance - -1. Also derive it from ISomeInterface -2. Include DECLARE_IUNKNOWN in your class definition to declare - implementations of QueryInterface, AddRef and Release that - call the outer unknown -3. Override NonDelegatingQueryInterface to expose ISomeInterface by - code something like - - if (riid == IID_ISomeInterface) { - return GetInterface((ISomeInterface *) this, ppv); - } else { - return CUnknown::NonDelegatingQueryInterface(riid, ppv); - } - -4. Declare and implement the member functions of ISomeInterface. - -or: Nested interfaces - -1. Declare a class derived from CUnknown -2. Include DECLARE_IUNKNOWN in your class definition -3. Override NonDelegatingQueryInterface to expose ISomeInterface by - code something like - - if (riid == IID_ISomeInterface) { - return GetInterface((ISomeInterface *) this, ppv); - } else { - return CUnknown::NonDelegatingQueryInterface(riid, ppv); - } - -4. Implement the member functions of ISomeInterface. Use GetOwner() to - access the COM object class. - -And in your COM object class: - -5. Make the nested class a friend of the COM object class, and declare - an instance of the nested class as a member of the COM object class. - - NOTE that because you must always pass the outer unknown and an hResult - to the CUnknown constructor you cannot use a default constructor, in - other words you will have to make the member variable a pointer to the - class and make a NEW call in your constructor to actually create it. - -6. override the NonDelegatingQueryInterface with code like this: - - if (riid == IID_ISomeInterface) { - return m_pImplFilter-> - NonDelegatingQueryInterface(IID_ISomeInterface, ppv); - } else { - return CUnknown::NonDelegatingQueryInterface(riid, ppv); - } - -You can have mixed classes which support some interfaces via multiple -inheritance and some via nested classes - -*/ - -#ifndef __COMBASE__ -#define __COMBASE__ - -/* The DLLENTRY module initialises the module handle on loading */ - -extern HINSTANCE g_hInst; - -/* On DLL load remember which platform we are running on */ - -extern DWORD g_amPlatform; -extern OSVERSIONINFO g_osInfo; // Filled in by GetVersionEx - -/* Version of IUnknown that is renamed to allow a class to support both - non delegating and delegating IUnknowns in the same COM object */ - -DECLARE_INTERFACE(INonDelegatingUnknown) -{ - STDMETHOD(NonDelegatingQueryInterface) (THIS_ REFIID, LPVOID *) PURE; - STDMETHOD_(ULONG, NonDelegatingAddRef)(THIS) PURE; - STDMETHOD_(ULONG, NonDelegatingRelease)(THIS) PURE; -}; - -typedef INonDelegatingUnknown *PNDUNKNOWN; - - -/* This is the base object class that supports active object counting. As - part of the debug facilities we trace every time a C++ object is created - or destroyed. The name of the object has to be passed up through the class - derivation list during construction as you cannot call virtual functions - in the constructor. The downside of all this is that every single object - constructor has to take an object name parameter that describes it */ - -class CBaseObject -{ - -private: - - // Disable the copy constructor and assignment by default so you will get - // compiler errors instead of unexpected behaviour if you pass objects - // by value or assign objects. - CBaseObject(const CBaseObject& objectSrc); // no implementation - void operator=(const CBaseObject& objectSrc); // no implementation - -private: - static LONG m_cObjects; /* Total number of objects active */ - -protected: -#ifdef DEBUG - DWORD m_dwCookie; /* Cookie identifying this object */ -#endif - - -public: - - /* These increment and decrement the number of active objects */ - - CBaseObject(TCHAR *pName); - ~CBaseObject(); - - /* Call this to find if there are any CUnknown derived objects active */ - - static LONG ObjectsActive() { - return m_cObjects; - }; -}; - - -/* An object that supports one or more COM interfaces will be based on - this class. It supports counting of total objects for DLLCanUnloadNow - support, and an implementation of the core non delegating IUnknown */ - -class CUnknown : public INonDelegatingUnknown, - public CBaseObject -{ - -private: - const LPUNKNOWN m_pUnknown; /* Owner of this object */ - -protected: /* So we can override NonDelegatingRelease() */ - volatile LONG m_cRef; /* Number of reference counts */ - -public: - - CUnknown(TCHAR *pName, LPUNKNOWN pUnk, HRESULT *phr); - virtual ~CUnknown() {}; - - /* Return the owner of this object */ - - LPUNKNOWN GetOwner() const { - return m_pUnknown; - }; - - /* Called from the class factory to create a new instance, it is - pure virtual so it must be overriden in your derived class */ - - /* static CUnknown *CreateInstance(LPUNKNOWN, HRESULT *) */ - - /* Non delegating unknown implementation */ - - STDMETHODIMP NonDelegatingQueryInterface(REFIID, void **); - STDMETHODIMP_(ULONG) NonDelegatingAddRef(); - STDMETHODIMP_(ULONG) NonDelegatingRelease(); - - /* Return an interface pointer to a requesting client - performing a thread safe AddRef as necessary */ - - HRESULT GetInterface(LPUNKNOWN pUnk, void **ppv); - - -}; - -#if WINVER < 0x0501 - -/* The standard InterlockedXXX functions won't take volatiles */ -static inline LONG InterlockedIncrement( volatile LONG * plong ) -{ return InterlockedIncrement( const_cast( plong ) ); } - -static inline LONG InterlockedDecrement( volatile LONG * plong ) -{ return InterlockedDecrement( const_cast( plong ) ); } - -static inline LONG InterlockedExchange( volatile LONG * plong, LONG new_value ) -{ return InterlockedExchange( const_cast( plong ), new_value ); } - -#endif - -/* A function that can create a new COM object */ - -typedef CUnknown *(*LPFNNewCOMObject)(LPUNKNOWN pUnkOuter, HRESULT *phr); - -/* A function (can be NULL) which is called from the DLL entrypoint - routine for each factory template: - - bLoading - TRUE on DLL load, FALSE on DLL unload - rclsid - the m_ClsID of the entry -*/ -typedef void (*LPFNInitRoutine)(BOOL bLoading, const CLSID *rclsid); - -/* Create one of these per object class in an array so that - the default class factory code can create new instances */ - -class CFactoryTemplate { - -public: - - const WCHAR *m_Name; - const CLSID *m_ClsID; - LPFNNewCOMObject m_lpfnNew; - LPFNInitRoutine m_lpfnInit; - - BOOL IsClassID(REFCLSID rclsid) const { - return (IsEqualCLSID(*m_ClsID,rclsid)); - }; - - CUnknown *CreateInstance(LPUNKNOWN pUnk, HRESULT *phr) const { - return m_lpfnNew(pUnk, phr); - }; -}; - - -/* You must override the (pure virtual) NonDelegatingQueryInterface to return - interface pointers (using GetInterface) to the interfaces your derived - class supports (the default implementation only supports IUnknown) */ - -#define DECLARE_IUNKNOWN \ - STDMETHODIMP QueryInterface(REFIID riid, void **ppv) { \ - return GetOwner()->QueryInterface(riid,ppv); \ - }; \ - STDMETHODIMP_(ULONG) AddRef() { \ - return GetOwner()->AddRef(); \ - }; \ - STDMETHODIMP_(ULONG) Release() { \ - return GetOwner()->Release(); \ - }; - -#endif /* __COMBASE__ */ - - diff --git a/src/hostapi/asio/ASIOSDK/common/debugmessage.cpp b/src/hostapi/asio/ASIOSDK/common/debugmessage.cpp deleted file mode 100644 index 2f47926..0000000 --- a/src/hostapi/asio/ASIOSDK/common/debugmessage.cpp +++ /dev/null @@ -1,14 +0,0 @@ -#include "asiosys.h" - -#if DEBUG -#if MAC -#include -void DEBUGGERMESSAGE(char *string) -{ - c2pstr(string); - DebugStr((unsigned char *)string); -} -#else -#error debugmessage -#endif -#endif diff --git a/src/hostapi/asio/ASIOSDK/common/dllentry.cpp b/src/hostapi/asio/ASIOSDK/common/dllentry.cpp deleted file mode 100644 index be717d4..0000000 --- a/src/hostapi/asio/ASIOSDK/common/dllentry.cpp +++ /dev/null @@ -1,323 +0,0 @@ -//==========================================================================; -// -// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY -// KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -// IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR -// PURPOSE. -// -// Copyright (c) 1992 - 1996 Microsoft Corporation. All Rights Reserved. -// -//--------------------------------------------------------------------------; - -// -// classes used to support dll entrypoints for COM objects. -// -// #include "switches.h" - -#include -#include "wxdebug.h" -#include "combase.h" -#ifdef DEBUG -#include -#endif - -#include - -extern CFactoryTemplate g_Templates[]; -extern int g_cTemplates; - -HINSTANCE hinstance = 0; -DWORD g_amPlatform; // VER_PLATFORM_WIN32_WINDOWS etc... (from GetVersionEx) -OSVERSIONINFO g_osInfo; - -// -// an instance of this is created by the DLLGetClassObject entrypoint -// it uses the CFactoryTemplate object it is given to support the -// IClassFactory interface - -class CClassFactory : public IClassFactory -{ - -private: - const CFactoryTemplate * m_pTemplate; - - ULONG m_cRef; - - static int m_cLocked; -public: - CClassFactory(const CFactoryTemplate *); - - // IUnknown - STDMETHODIMP QueryInterface(REFIID riid, void ** ppv); - STDMETHODIMP_(ULONG)AddRef(); - STDMETHODIMP_(ULONG)Release(); - - // IClassFactory - STDMETHODIMP CreateInstance(LPUNKNOWN pUnkOuter, REFIID riid, void **pv); - STDMETHODIMP LockServer(BOOL fLock); - - // allow DLLGetClassObject to know about global server lock status - static BOOL IsLocked() { - return (m_cLocked > 0); - }; -}; - -// process-wide dll locked state -int CClassFactory::m_cLocked = 0; - -CClassFactory::CClassFactory(const CFactoryTemplate *pTemplate) -{ - m_cRef = 0; - m_pTemplate = pTemplate; -} - - -STDMETHODIMP CClassFactory::QueryInterface(REFIID riid,void **ppv) -{ - CheckPointer(ppv,E_POINTER) - ValidateReadWritePtr(ppv,sizeof(PVOID)); - *ppv = NULL; - - // any interface on this object is the object pointer. - if ((riid == IID_IUnknown) || (riid == IID_IClassFactory)) { - *ppv = (LPVOID) this; - // AddRef returned interface pointer - ((LPUNKNOWN) *ppv)->AddRef(); - return NOERROR; - } - - return ResultFromScode(E_NOINTERFACE); -} - - -STDMETHODIMP_(ULONG) CClassFactory::AddRef() -{ - return ++m_cRef; -} - -STDMETHODIMP_(ULONG) CClassFactory::Release() -{ - LONG rc; - - if (--m_cRef == 0) { - delete this; - rc = 0; - } else rc = m_cRef; - - return rc; -} - -STDMETHODIMP CClassFactory::CreateInstance(LPUNKNOWN pUnkOuter,REFIID riid,void **pv) -{ - CheckPointer(pv,E_POINTER) - ValidateReadWritePtr(pv,sizeof(void *)); - - /* Enforce the normal OLE rules regarding interfaces and delegation */ - - if (pUnkOuter != NULL) { - if (IsEqualIID(riid,IID_IUnknown) == FALSE) { - return ResultFromScode(E_NOINTERFACE); - } - } - - /* Create the new object through the derived class's create function */ - - HRESULT hr = NOERROR; - CUnknown *pObj = m_pTemplate->CreateInstance(pUnkOuter, &hr); - - if (pObj == NULL) { - return E_OUTOFMEMORY; - } - - /* Delete the object if we got a construction error */ - - if (FAILED(hr)) { - delete pObj; - return hr; - } - - /* Get a reference counted interface on the object */ - - /* We wrap the non-delegating QI with NDAddRef & NDRelease. */ - /* This protects any outer object from being prematurely */ - /* released by an inner object that may have to be created */ - /* in order to supply the requested interface. */ - pObj->NonDelegatingAddRef(); - hr = pObj->NonDelegatingQueryInterface(riid, pv); - pObj->NonDelegatingRelease(); - /* Note that if NonDelegatingQueryInterface fails, it will */ - /* not increment the ref count, so the NonDelegatingRelease */ - /* will drop the ref back to zero and the object will "self-*/ - /* destruct". Hence we don't need additional tidy-up code */ - /* to cope with NonDelegatingQueryInterface failing. */ - - if (SUCCEEDED(hr)) { - ASSERT(*pv); - } - - return hr; -} - -STDMETHODIMP CClassFactory::LockServer(BOOL fLock) -{ - if (fLock) { - m_cLocked++; - } else { - m_cLocked--; - } - return NOERROR; -} - - -// --- COM entrypoints ----------------------------------------- -// DllRegisterServer - -//called by COM to get the class factory object for a given class -STDAPI DllGetClassObject(REFCLSID rClsID,REFIID riid,void **pv) -{ - // DebugBreak(); - - if (!(riid == IID_IUnknown) && !(riid == IID_IClassFactory)) { - return E_NOINTERFACE; - } - - // traverse the array of templates looking for one with this - // class id - for (int i = 0; i < g_cTemplates; i++) { - const CFactoryTemplate * pT = &g_Templates[i]; - if (pT->IsClassID(rClsID)) { - - // found a template - make a class factory based on this - // template - - *pv = (LPVOID) (LPUNKNOWN) new CClassFactory(pT); - if (*pv == NULL) { - return E_OUTOFMEMORY; - } - ((LPUNKNOWN)*pv)->AddRef(); - return NOERROR; - } - } - return CLASS_E_CLASSNOTAVAILABLE; -} - -// -// Call any initialization routines -// -void DllInitClasses(BOOL bLoading) -{ - int i; - - // DebugBreak(); - - // traverse the array of templates calling the init routine - // if they have one - for (i = 0; i < g_cTemplates; i++) { - const CFactoryTemplate * pT = &g_Templates[i]; - if (pT->m_lpfnInit != NULL) { - (*pT->m_lpfnInit)(bLoading, pT->m_ClsID); - } - } - -} - -// called by COM to determine if this dll can be unloaded -// return ok unless there are outstanding objects or a lock requested -// by IClassFactory::LockServer -// -// CClassFactory has a static function that can tell us about the locks, -// and CCOMObject has a static function that can tell us about the active -// object count -STDAPI DllCanUnloadNow() -{ - // DebugBreak(); - - DbgLog((LOG_MEMORY,2,TEXT("DLLCanUnloadNow called - IsLocked = %d, Active objects = %d"), - CClassFactory::IsLocked(), - CBaseObject::ObjectsActive())); - - if (CClassFactory::IsLocked() || CBaseObject::ObjectsActive()) { - - return S_FALSE; - } - else { - return S_OK; - } -} - - -// --- standard WIN32 entrypoints -------------------------------------- - - -//extern "C" BOOL WINAPI DllEntryPoint(HINSTANCE, ULONG, LPVOID); -//BOOL WINAPI DllEntryPoint(HINSTANCE hInstance,ULONG ulReason,LPVOID pv) -//BOOL WINAPI DllMain (HINSTANCE hInstance,ULONG ulReason,LPVOID pv) -BOOL WINAPI DllEntryPoint (HINSTANCE hInstance,ULONG ulReason,LPVOID pv) -{ - - // DebugBreak(); - - switch (ulReason) { - - case DLL_PROCESS_ATTACH: - DisableThreadLibraryCalls(hInstance); - DbgInitialise(hInstance); - { - // The platform identifier is used to work out whether - // full unicode support is available or not. Hence the - // default will be the lowest common denominator - i.e. N/A - g_amPlatform = VER_PLATFORM_WIN32_WINDOWS; // win95 assumed in case GetVersionEx fails - - g_osInfo.dwOSVersionInfoSize = sizeof(g_osInfo); - if (GetVersionEx(&g_osInfo)) { - g_amPlatform = g_osInfo.dwPlatformId; - } - else { - DbgLog((LOG_ERROR, 1, "Failed to get the OS platform, assuming Win95")); - } - } - hinstance = hInstance; - DllInitClasses(TRUE); - - break; - - case DLL_PROCESS_DETACH: - DllInitClasses(FALSE); - -#ifdef DEBUG - if (CBaseObject::ObjectsActive()) { - DbgSetModuleLevel(LOG_MEMORY, 2); - TCHAR szInfo[512]; - extern TCHAR m_ModuleName[]; // Cut down module name - - TCHAR FullName[_MAX_PATH]; // Load the full path and module name - TCHAR *pName; // Searches from the end for a backslash - - GetModuleFileName(NULL,FullName,_MAX_PATH); - pName = _tcsrchr(FullName,'\\'); - if (pName == NULL) { - pName = FullName; - } - else { - pName++; - } - - DWORD cch = wsprintf(szInfo, TEXT("Executable: %s Pid %x Tid %x. "), - pName, GetCurrentProcessId(), GetCurrentThreadId()); - - wsprintf(szInfo+cch, TEXT("Module %s, %d objects left active!"), - m_ModuleName, CBaseObject::ObjectsActive()); - DbgAssert(szInfo, TEXT(__FILE__),__LINE__); - - // If running remotely wait for the Assert to be acknowledged - // before dumping out the object register - DbgDumpObjectRegister(); - } - DbgTerminate(); -#endif - break; - } - return TRUE; -} - - diff --git a/src/hostapi/asio/ASIOSDK/common/iasiodrv.h b/src/hostapi/asio/ASIOSDK/common/iasiodrv.h deleted file mode 100644 index 1496f0f..0000000 --- a/src/hostapi/asio/ASIOSDK/common/iasiodrv.h +++ /dev/null @@ -1,37 +0,0 @@ -#include "asiosys.h" -#include "asio.h" - -/* Forward Declarations */ - -#ifndef __ASIODRIVER_FWD_DEFINED__ -#define __ASIODRIVER_FWD_DEFINED__ -typedef interface IASIO IASIO; -#endif /* __ASIODRIVER_FWD_DEFINED__ */ - -interface IASIO : public IUnknown -{ - - virtual ASIOBool init(void *sysHandle) = 0; - virtual void getDriverName(char *name) = 0; - virtual long getDriverVersion() = 0; - virtual void getErrorMessage(char *string) = 0; - virtual ASIOError start() = 0; - virtual ASIOError stop() = 0; - virtual ASIOError getChannels(long *numInputChannels, long *numOutputChannels) = 0; - virtual ASIOError getLatencies(long *inputLatency, long *outputLatency) = 0; - virtual ASIOError getBufferSize(long *minSize, long *maxSize, - long *preferredSize, long *granularity) = 0; - virtual ASIOError canSampleRate(ASIOSampleRate sampleRate) = 0; - virtual ASIOError getSampleRate(ASIOSampleRate *sampleRate) = 0; - virtual ASIOError setSampleRate(ASIOSampleRate sampleRate) = 0; - virtual ASIOError getClockSources(ASIOClockSource *clocks, long *numSources) = 0; - virtual ASIOError setClockSource(long reference) = 0; - virtual ASIOError getSamplePosition(ASIOSamples *sPos, ASIOTimeStamp *tStamp) = 0; - virtual ASIOError getChannelInfo(ASIOChannelInfo *info) = 0; - virtual ASIOError createBuffers(ASIOBufferInfo *bufferInfos, long numChannels, - long bufferSize, ASIOCallbacks *callbacks) = 0; - virtual ASIOError disposeBuffers() = 0; - virtual ASIOError controlPanel() = 0; - virtual ASIOError future(long selector,void *opt) = 0; - virtual ASIOError outputReady() = 0; -}; diff --git a/src/hostapi/asio/ASIOSDK/common/register.cpp b/src/hostapi/asio/ASIOSDK/common/register.cpp deleted file mode 100644 index 8c6cbea..0000000 --- a/src/hostapi/asio/ASIOSDK/common/register.cpp +++ /dev/null @@ -1,332 +0,0 @@ -#include -#include - -typedef struct keylist -{ - HKEY mainKey; - HKEY subKey; - char *keyname; - struct keylist *next; -} KEYLIST, *LPKEYLIST; - -#define CLSID_STRING_LEN 100 -#define MAX_PATH_LEN 360 - -#define DEV_ERR_SELFREG -100 -#define ERRSREG_MODULE_NOT_FOUND DEV_ERR_SELFREG-1 -#define ERRSREG_MODPATH_NOT_FOUND DEV_ERR_SELFREG-2 -#define ERRSREG_STRING_FROM_CLSID DEV_ERR_SELFREG-3 -#define ERRSREG_CHAR_TO_MULTIBYTE DEV_ERR_SELFREG-4 - -#define SZREGSTR_DESCRIPTION "Description" -#define SZREGSTR_CLSID "CLSID" -#define SZREGSTR_INPROCSERVER32 "InprocServer32" -#define SZREGSTR_THREADINGMODEL "ThreadingModel" -#define SZREGSTR_SOFTWARE "SOFTWARE" -#define SZREGSTR_ASIO "ASIO" - -LONG RegisterAsioDriver (CLSID,char *,char *,char *,char *); -LONG UnregisterAsioDriver (CLSID,char *,char *); - -static LONG findRegPath (HKEY,char *); -static LONG createRegPath (HKEY,char *,char *); -static LONG createRegStringValue (HKEY,char *,char *,char *); -static LONG getRegString (HKEY,char *,char *,LPVOID,DWORD); -static LPKEYLIST findAllSubKeys (HKEY,HKEY,DWORD,char *,LPKEYLIST); -static LONG deleteRegPath (HKEY,char *,char *); - -static char subkeybuf[MAX_PATH_LEN]; - - -// ------------------------------------------ -// Global Functions -// ------------------------------------------ -LONG RegisterAsioDriver (CLSID clsid,char *szdllname,char *szregname,char *szasiodesc,char *szthreadmodel) -{ - HMODULE hMod; - char szDLLPath[MAX_PATH_LEN]; - char szModuleName[MAX_PATH_LEN]; - char szregpath[MAX_PATH_LEN]; - char szclsid[CLSID_STRING_LEN]; - LPOLESTR wszCLSID = NULL; - BOOL newregentry = FALSE; - LONG rc; - - hMod = GetModuleHandle(szdllname); - if (!hMod) return ERRSREG_MODULE_NOT_FOUND; - szModuleName[0] = 0; - GetModuleFileName(hMod,szModuleName,MAX_PATH_LEN); - if (!szModuleName[0]) return ERRSREG_MODPATH_NOT_FOUND; - CharLower((LPTSTR)szModuleName); - - rc = (LONG)StringFromCLSID(clsid,&wszCLSID); - if (rc != S_OK) return ERRSREG_STRING_FROM_CLSID; - rc = (LONG)WideCharToMultiByte(CP_ACP,0,(LPWSTR)wszCLSID,-1,szclsid,CLSID_STRING_LEN,0,0); - if (!rc) return ERRSREG_CHAR_TO_MULTIBYTE; - - sprintf(szregpath,"%s\\%s",SZREGSTR_CLSID,szclsid); - rc = findRegPath(HKEY_CLASSES_ROOT,szregpath); - if (rc) { - sprintf(szregpath,"%s\\%s\\%s",SZREGSTR_CLSID,szclsid,SZREGSTR_INPROCSERVER32); - getRegString (HKEY_CLASSES_ROOT,szregpath,0,(LPVOID)szDLLPath,MAX_PATH_LEN); - CharLower((LPTSTR)szDLLPath); - rc = (LONG)strcmp(szDLLPath,szModuleName); - if (rc) { - // delete old regentry - sprintf(szregpath,"%s",SZREGSTR_CLSID); - deleteRegPath(HKEY_CLASSES_ROOT,szregpath,szclsid); - newregentry = TRUE; - } - } - else newregentry = TRUE; - - if (newregentry) { - // HKEY_CLASSES_ROOT\CLSID\{...} - sprintf(szregpath,"%s",SZREGSTR_CLSID); - createRegPath (HKEY_CLASSES_ROOT,szregpath,szclsid); - // HKEY_CLASSES_ROOT\CLSID\{...} -> Description - sprintf(szregpath,"%s\\%s",SZREGSTR_CLSID,szclsid); - createRegStringValue(HKEY_CLASSES_ROOT,szregpath,0,szasiodesc); - // HKEY_CLASSES_ROOT\CLSID\InProcServer32 - sprintf(szregpath,"%s\\%s",SZREGSTR_CLSID,szclsid); - createRegPath (HKEY_CLASSES_ROOT,szregpath,SZREGSTR_INPROCSERVER32); - // HKEY_CLASSES_ROOT\CLSID\InProcServer32 -> DLL path - sprintf(szregpath,"%s\\%s\\%s",SZREGSTR_CLSID,szclsid,SZREGSTR_INPROCSERVER32); - createRegStringValue(HKEY_CLASSES_ROOT,szregpath,0,szModuleName); - // HKEY_CLASSES_ROOT\CLSID\InProcServer32 -> ThreadingModel - createRegStringValue(HKEY_CLASSES_ROOT,szregpath,SZREGSTR_THREADINGMODEL,szthreadmodel); - } - - // HKEY_LOCAL_MACHINE\SOFTWARE\ASIO - sprintf(szregpath,"%s\\%s",SZREGSTR_SOFTWARE,SZREGSTR_ASIO); - rc = findRegPath(HKEY_LOCAL_MACHINE,szregpath); - if (rc) { - sprintf(szregpath,"%s\\%s\\%s",SZREGSTR_SOFTWARE,SZREGSTR_ASIO,szregname); - rc = findRegPath(HKEY_LOCAL_MACHINE,szregpath); - if (rc) { - sprintf(szregpath,"%s\\%s",SZREGSTR_SOFTWARE,SZREGSTR_ASIO); - deleteRegPath(HKEY_LOCAL_MACHINE,szregpath,szregname); - } - } - else { - // HKEY_LOCAL_MACHINE\SOFTWARE\ASIO - sprintf(szregpath,"%s",SZREGSTR_SOFTWARE); - createRegPath (HKEY_LOCAL_MACHINE,szregpath,SZREGSTR_ASIO); - } - - // HKEY_LOCAL_MACHINE\SOFTWARE\ASIO\ - sprintf(szregpath,"%s\\%s",SZREGSTR_SOFTWARE,SZREGSTR_ASIO); - createRegPath (HKEY_LOCAL_MACHINE,szregpath,szregname); - - // HKEY_LOCAL_MACHINE\SOFTWARE\ASIO\ -> CLSID - // HKEY_LOCAL_MACHINE\SOFTWARE\ASIO\ -> Description - sprintf(szregpath,"%s\\%s\\%s",SZREGSTR_SOFTWARE,SZREGSTR_ASIO,szregname); - createRegStringValue(HKEY_LOCAL_MACHINE,szregpath,SZREGSTR_CLSID,szclsid); - createRegStringValue(HKEY_LOCAL_MACHINE,szregpath,SZREGSTR_DESCRIPTION,szasiodesc); - - return 0; -} - - -LONG UnregisterAsioDriver (CLSID clsid,char *szdllname,char *szregname) -{ - LONG rc; - HMODULE hMod; - char szregpath[MAX_PATH_LEN]; - char szModuleName[MAX_PATH_LEN]; - char szclsid[CLSID_STRING_LEN]; - LPOLESTR wszCLSID = NULL; - - - hMod = GetModuleHandle(szdllname); - if (!hMod) return ERRSREG_MODULE_NOT_FOUND; - szModuleName[0] = 0; - GetModuleFileName(hMod,szModuleName,MAX_PATH_LEN); - if (!szModuleName[0]) return ERRSREG_MODPATH_NOT_FOUND; - CharLower((LPTSTR)szModuleName); - - rc = (LONG)StringFromCLSID(clsid,&wszCLSID) ; - if (rc != S_OK) return ERRSREG_STRING_FROM_CLSID; - rc = (LONG)WideCharToMultiByte(CP_ACP,0,(LPWSTR)wszCLSID,-1,szclsid,CLSID_STRING_LEN,0,0); - if (!rc) return ERRSREG_CHAR_TO_MULTIBYTE; - - - sprintf(szregpath,"%s\\%s",SZREGSTR_CLSID,szclsid); - rc = findRegPath(HKEY_CLASSES_ROOT,szregpath); - if (rc) { - // delete old regentry - sprintf(szregpath,"%s",SZREGSTR_CLSID); - deleteRegPath(HKEY_CLASSES_ROOT,szregpath,szclsid); - } - - - // HKEY_LOCAL_MACHINE\SOFTWARE\ASIO - sprintf(szregpath,"%s\\%s",SZREGSTR_SOFTWARE,SZREGSTR_ASIO); - rc = findRegPath(HKEY_LOCAL_MACHINE,szregpath); - if (rc) { - sprintf(szregpath,"%s\\%s\\%s",SZREGSTR_SOFTWARE,SZREGSTR_ASIO,szregname); - rc = findRegPath(HKEY_LOCAL_MACHINE,szregpath); - if (rc) { - sprintf(szregpath,"%s\\%s",SZREGSTR_SOFTWARE,SZREGSTR_ASIO); - deleteRegPath(HKEY_LOCAL_MACHINE,szregpath,szregname); - } - } - - return 0; -} - - -// ------------------------------------------ -// Local Functions -// ------------------------------------------ -static LONG findRegPath (HKEY mainkey,char *szregpath) -{ - HKEY hkey; - LONG cr,rc = -1; - - if (szregpath) { - if ((cr = RegOpenKey(mainkey,szregpath,&hkey)) == ERROR_SUCCESS) { - RegCloseKey(hkey); - rc = 1; - } - else rc = 0; - } - - return rc; -} - -static LONG createRegPath (HKEY mainkey,char *szregpath,char *sznewpath) -{ - HKEY hkey,hksub; - LONG cr,rc = -1; - char newregpath[MAX_PATH_LEN]; - - sprintf(newregpath,"%s\\%s",szregpath,sznewpath); - if (!(cr = findRegPath(mainkey,newregpath))) { - if ((cr = RegOpenKey(mainkey,szregpath,&hkey)) == ERROR_SUCCESS) { - if ((cr = RegCreateKey(hkey,sznewpath,&hksub)) == ERROR_SUCCESS) { - RegCloseKey(hksub); - rc = 0; - } - RegCloseKey(hkey); - } - } - else if (cr > 0) rc = 0; - - return rc; -} - -static LONG createRegStringValue (HKEY mainkey,char *szregpath,char *valname,char *szvalstr) -{ - LONG cr,rc = -1; - HKEY hkey; - - if (szregpath) { - if ((cr = RegOpenKey(mainkey,szregpath,&hkey)) == ERROR_SUCCESS) { - cr = RegSetValueEx(hkey,(LPCTSTR)valname,0,REG_SZ,(const BYTE *)szvalstr,(DWORD)strlen(szvalstr)); - RegCloseKey(hkey); - if (cr == ERROR_SUCCESS) rc = 0; - } - } - - return rc; -} - - -static LONG getRegString (HKEY mainkey,char *szregpath,char *valname,LPVOID pval,DWORD vsize) -{ - HKEY hkey; - LONG cr,rc = -1; - DWORD hsize,htype; - - if (szregpath) { - if ((cr = RegOpenKey(mainkey,szregpath,&hkey)) == ERROR_SUCCESS) { - cr = RegQueryValueEx(hkey,valname,0,&htype,0,&hsize); - if (cr == ERROR_SUCCESS) { - if (hsize <= vsize) { - cr = RegQueryValueEx(hkey,valname,0,&htype,(LPBYTE)pval,&hsize); - rc = 0; - } - } - RegCloseKey(hkey); - } - } - return rc; -} - -static LPKEYLIST findAllSubKeys (HKEY hkey,HKEY hksub,DWORD index,char *keyname,LPKEYLIST kl) -{ - HKEY hknew = 0; - char *newkey; - LONG cr; - - if (!hksub) { - cr = RegOpenKeyEx(hkey,(LPCTSTR)keyname,0,KEY_ALL_ACCESS,&hknew); - if (cr != ERROR_SUCCESS) return kl; - } - else hknew = hksub; - - cr = RegEnumKey(hknew,index,(LPTSTR)subkeybuf,MAX_PATH_LEN); - if (cr == ERROR_SUCCESS) { - newkey = new char[strlen(subkeybuf)+1]; - strcpy(newkey,subkeybuf); - - kl = findAllSubKeys(hknew,0,0,newkey,kl); - kl = findAllSubKeys(hkey,hknew,index+1,keyname,kl); - - return kl; - - } - - if (!kl->next) { - kl->next = new KEYLIST[1]; - kl = kl->next; - kl->mainKey = hkey; - kl->subKey = hknew; - kl->keyname = keyname; - kl->next = 0; - } - - return kl; -} - -static LONG deleteRegPath (HKEY mainkey,char *szregpath,char *szdelpath) -{ - HKEY hkey; - LONG cr,rc = -1; - KEYLIST klist; - LPKEYLIST pkl,k; - char *keyname = 0; - - if ((cr = RegOpenKey(mainkey,szregpath,&hkey)) == ERROR_SUCCESS) { - - keyname = new char[strlen(szdelpath)+1]; - if (!keyname) { - RegCloseKey(hkey); - return rc; - } - strcpy(keyname,szdelpath); - klist.next = 0; - - findAllSubKeys(hkey,0,0,keyname,&klist); - - if (klist.next) { - pkl = klist.next; - - while (pkl) { - RegCloseKey(pkl->subKey); - cr = RegDeleteKey(pkl->mainKey,pkl->keyname); - delete pkl->keyname; - k = pkl; - pkl = pkl->next; - delete k; - } - rc = 0; - } - - RegCloseKey(hkey); - } - - return rc; -} - diff --git a/src/hostapi/asio/ASIOSDK/common/wxdebug.h b/src/hostapi/asio/ASIOSDK/common/wxdebug.h deleted file mode 100644 index 9273eeb..0000000 --- a/src/hostapi/asio/ASIOSDK/common/wxdebug.h +++ /dev/null @@ -1,326 +0,0 @@ -//==========================================================================; -// -// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY -// KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -// IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR -// PURPOSE. -// -// Copyright (c) 1992 - 1996 Microsoft Corporation. All Rights Reserved. -// -//--------------------------------------------------------------------------; - -// Debugging facilities, January 1995 - -#ifndef __WXDEBUG__ -#define __WXDEBUG__ - -// Avoid conflict with MFC -#undef ASSERT - -// This library provides fairly straight forward debugging functionality, this -// is split into two main sections. The first is assertion handling, there are -// three types of assertions provided here. The most commonly used one is the -// ASSERT(condition) macro which will pop up a message box including the file -// and line number if the condition evaluates to FALSE. Then there is the -// EXECUTE_ASSERT macro which is the same as ASSERT except the condition will -// still be executed in NON debug builds. The final type of assertion is the -// KASSERT macro which is more suitable for pure (perhaps kernel) filters as -// the condition is printed onto the debugger rather than in a message box. -// -// The other part of the debug module facilties is general purpose logging. -// This is accessed by calling DbgLog(). The function takes a type and level -// field which define the type of informational string you are presenting and -// it's relative importance. The type field can be a combination (one or more) -// of LOG_TIMING, LOG_TRACE, LOG_MEMORY, LOG_LOCKING and LOG_ERROR. The level -// is a DWORD value where zero defines highest important. Use of zero as the -// debug logging level is to be encouraged ONLY for major errors or events as -// they will ALWAYS be displayed on the debugger. Other debug output has it's -// level matched against the current debug output level stored in the registry -// for this module and if less than the current setting it will be displayed. -// -// Each module or executable has it's own debug output level for each of the -// five types. These are read in when the DbgInitialise function is called -// for DLLs linking to STRMBASE.LIB this is done automatically when the DLL -// is loaded, executables must call it explicitely with the module instance -// handle given to them through the WINMAIN entry point. An executable must -// also call DbgTerminate when they have finished to clean up the resources -// the debug library uses, once again this is done automatically for DLLs - -// These are the five different categories of logging information - -enum { LOG_TIMING = 0x01, // Timing and performance measurements - LOG_TRACE = 0x02, // General step point call tracing - LOG_MEMORY = 0x04, // Memory and object allocation/destruction - LOG_LOCKING = 0x08, // Locking/unlocking of critical sections - LOG_ERROR = 0x10 }; // Debug error notification - -enum { CDISP_HEX = 0x01, - CDISP_DEC = 0x02}; - -// For each object created derived from CBaseObject (in debug builds) we -// create a descriptor that holds it's name (statically allocated memory) -// and a cookie we assign it. We keep a list of all the active objects -// we have registered so that we can dump a list of remaining objects - -typedef struct tag_ObjectDesc { - TCHAR *m_pName; - DWORD m_dwCookie; - tag_ObjectDesc *m_pNext; -} ObjectDesc; - -#define DLLIMPORT __declspec(dllimport) -#define DLLEXPORT __declspec(dllexport) - -#ifdef DEBUG - - #define NAME(x) TEXT(x) - - // These are used internally by the debug library (PRIVATE) - - void DbgInitKeyLevels(HKEY hKey); - void DbgInitGlobalSettings(); - void DbgInitModuleSettings(); - void DbgInitModuleName(); - DWORD DbgRegisterObjectCreation(TCHAR *pObjectName); - BOOL DbgRegisterObjectDestruction(DWORD dwCookie); - - // These are the PUBLIC entry points - - BOOL DbgCheckModuleLevel(DWORD Type,DWORD Level); - void DbgSetModuleLevel(DWORD Type,DWORD Level); - - // Initialise the library with the module handle - - void DbgInitialise(HINSTANCE hInst); - void DbgTerminate(); - - void DbgDumpObjectRegister(); - - // Display error and logging to the user - - void DbgAssert(const TCHAR *pCondition,const TCHAR *pFileName,INT iLine); - void DbgBreakPoint(const TCHAR *pCondition,const TCHAR *pFileName,INT iLine); - void DbgKernelAssert(const TCHAR *pCondition,const TCHAR *pFileName,INT iLine); - void DbgLogInfo(DWORD Type,DWORD Level,const TCHAR *pFormat,...); - void DbgOutString(LPCTSTR psz); - - // Debug infinite wait stuff - DWORD DbgWaitForSingleObject(HANDLE h); - DWORD DbgWaitForMultipleObjects(DWORD nCount, - CONST HANDLE *lpHandles, - BOOL bWaitAll); - void DbgSetWaitTimeout(DWORD dwTimeout); - -#ifdef __strmif_h__ - void DisplayType(LPSTR label, const AM_MEDIA_TYPE *pmtIn); -#endif - - #define KASSERT(_x_) if (!(_x_)) \ - DbgKernelAssert(TEXT(#_x_),TEXT(__FILE__),__LINE__) - - // Break on the debugger without putting up a message box - // message goes to debugger instead - - #define KDbgBreak(_x_) \ - DbgKernelAssert(TEXT(#_x_),TEXT(__FILE__),__LINE__) - - #define ASSERT(_x_) if (!(_x_)) \ - DbgAssert(TEXT(#_x_),TEXT(__FILE__),__LINE__) - - // Put up a message box informing the user of a halt - // condition in the program - - #define DbgBreak(_x_) \ - DbgBreakPoint(TEXT(#_x_),TEXT(__FILE__),__LINE__) - - #define EXECUTE_ASSERT(_x_) ASSERT(_x_) - #define DbgLog(_x_) DbgLogInfo _x_ - - // MFC style trace macros - - #define NOTE(_x_) DbgLog((LOG_TRACE,5,TEXT(_x_))); - #define NOTE1(_x_,a) DbgLog((LOG_TRACE,5,TEXT(_x_),a)); - #define NOTE2(_x_,a,b) DbgLog((LOG_TRACE,5,TEXT(_x_),a,b)); - #define NOTE3(_x_,a,b,c) DbgLog((LOG_TRACE,5,TEXT(_x_),a,b,c)); - #define NOTE4(_x_,a,b,c,d) DbgLog((LOG_TRACE,5,TEXT(_x_),a,b,c,d)); - #define NOTE5(_x_,a,b,c,d,e) DbgLog((LOG_TRACE,5,TEXT(_x_),a,b,c,d,e)); - -#else - - // Retail builds make public debug functions inert - WARNING the source - // files do not define or build any of the entry points in debug builds - // (public entry points compile to nothing) so if you go trying to call - // any of the private entry points in your source they won't compile - - #define NAME(_x_) NULL - - #define DbgInitialise(hInst) - #define DbgTerminate() - #define DbgLog(_x_) - #define DbgOutString(psz) - - #define DbgRegisterObjectCreation(pObjectName) - #define DbgRegisterObjectDestruction(dwCookie) - #define DbgDumpObjectRegister() - - #define DbgCheckModuleLevel(Type,Level) - #define DbgSetModuleLevel(Type,Level) - - #define DbgWaitForSingleObject(h) WaitForSingleObject(h, INFINITE) - #define DbgWaitForMultipleObjects(nCount, lpHandles, bWaitAll) \ - WaitForMultipleObjects(nCount, lpHandles, bWaitAll, INFINITE) - #define DbgSetWaitTimeout(dwTimeout) - - #define KDbgBreak(_x_) - #define DbgBreak(_x_) - - #define KASSERT(_x_) - #define ASSERT(_x_) - #define EXECUTE_ASSERT(_x_) _x_ - - // MFC style trace macros - - #define NOTE(_x_) - #define NOTE1(_x_,a) - #define NOTE2(_x_,a,b) - #define NOTE3(_x_,a,b,c) - #define NOTE4(_x_,a,b,c,d) - #define NOTE5(_x_,a,b,c,d,e) - - #define DisplayType(label, pmtIn) - -#endif - - -// Checks a pointer which should be non NULL - can be used as follows. - -#define CheckPointer(p,ret) {if((p)==NULL) return (ret);} - -// HRESULT Foo(VOID *pBar) -// { -// CheckPointer(pBar,E_INVALIDARG) -// } -// -// Or if the function returns a boolean -// -// BOOL Foo(VOID *pBar) -// { -// CheckPointer(pBar,FALSE) -// } - -// These validate pointers when symbol VFWROBUST is defined -// This will normally be defined in debug not retail builds - -#ifdef DEBUG - #define VFWROBUST -#endif - -#ifdef VFWROBUST - - #define ValidateReadPtr(p,cb) \ - {if(IsBadReadPtr((PVOID)p,cb) == TRUE) \ - DbgBreak("Invalid read pointer");} - - #define ValidateWritePtr(p,cb) \ - {if(IsBadWritePtr((PVOID)p,cb) == TRUE) \ - DbgBreak("Invalid write pointer");} - - #define ValidateReadWritePtr(p,cb) \ - {ValidateReadPtr(p,cb) ValidateWritePtr(p,cb)} - - #define ValidateStringPtr(p) \ - {if(IsBadStringPtr((LPCTSTR)p,INFINITE) == TRUE) \ - DbgBreak("Invalid string pointer");} - - #define ValidateStringPtrA(p) \ - {if(IsBadStringPtrA((LPCSTR)p,INFINITE) == TRUE) \ - DbgBreak("Invalid ANSII string pointer");} - - #define ValidateStringPtrW(p) \ - {if(IsBadStringPtrW((LPCWSTR)p,INFINITE) == TRUE) \ - DbgBreak("Invalid UNICODE string pointer");} - -#else - #define ValidateReadPtr(p,cb) - #define ValidateWritePtr(p,cb) - #define ValidateReadWritePtr(p,cb) - #define ValidateStringPtr(p) - #define ValidateStringPtrA(p) - #define ValidateStringPtrW(p) -#endif - - -#ifdef _OBJBASE_H_ - - // Outputting GUID names. If you want to include the name - // associated with a GUID (eg CLSID_...) then - // - // GuidNames[yourGUID] - // - // Returns the name defined in uuids.h as a string - - typedef struct { - TCHAR *szName; - GUID guid; - } GUID_STRING_ENTRY; - - class CGuidNameList { - public: - TCHAR *operator [] (const GUID& guid); - }; - - extern CGuidNameList GuidNames; - -#endif - - -// REMIND macro - generates warning as reminder to complete coding -// (eg) usage: -// -// #pragma message (REMIND("Add automation support")) - - -#define QUOTE(x) #x -#define QQUOTE(y) QUOTE(y) -#define REMIND(str) __FILE__ "(" QQUOTE(__LINE__) ") : " str - - -// Hack to display objects in a useful format -// -// eg If you want to display a LONGLONG ll in a debug string do (eg) -// -// DbgLog((LOG_TRACE, n, TEXT("Value is %s"), (LPCTSTR)CDisp(ll, CDISP_HEX))); - - -class CDispBasic -{ -public: - CDispBasic() { m_pString = m_String; }; - ~CDispBasic(); -protected: - PTCHAR m_pString; // normally points to m_String... unless too much data - TCHAR m_String[50]; -}; -class CDisp : public CDispBasic -{ -public: - CDisp(LONGLONG ll, int Format = CDISP_HEX); // Display a LONGLONG in CDISP_HEX or CDISP_DEC form - CDisp(REFCLSID clsid); // Display a GUID - CDisp(double d); // Display a floating point number -#ifdef __strmif_h__ -#ifdef __STREAMS__ - CDisp(CRefTime t); // Display a Reference Time -#endif - CDisp(IPin *pPin); // Display a pin as {filter clsid}(pin name) -#endif // __strmif_h__ - ~CDisp(); - - // Implement cast to (LPCTSTR) as parameter to logger - operator LPCTSTR() - { - return (LPCTSTR)m_pString; - }; -}; - -#endif // __WXDEBUG__ - diff --git a/src/hostapi/asio/ASIOSDK/driver/asiosample/asiosample.def b/src/hostapi/asio/ASIOSDK/driver/asiosample/asiosample.def deleted file mode 100644 index 963b98c..0000000 --- a/src/hostapi/asio/ASIOSDK/driver/asiosample/asiosample.def +++ /dev/null @@ -1,9 +0,0 @@ -LIBRARY ASIOSample -DESCRIPTION 'ASIO Sample Driver' -PROTMODE -EXPORTS - DllMain - DllGetClassObject - DllCanUnloadNow - DllRegisterServer - DllUnregisterServer diff --git a/src/hostapi/asio/ASIOSDK/driver/asiosample/asiosample.txt b/src/hostapi/asio/ASIOSDK/driver/asiosample/asiosample.txt deleted file mode 100644 index 8f28b9b..0000000 --- a/src/hostapi/asio/ASIOSDK/driver/asiosample/asiosample.txt +++ /dev/null @@ -1,23 +0,0 @@ -Asiosample - -This sample driver illustrates the implementation of an ASIO driver. - - - -Windows notes: - -For Windows a COM implementation is provided. The final driver can be -installed in the system by dragging the asiosample.dll onto the -regsvr32.exe in the windows\system directory. - -It is normal that the LNK4104 warning is issued for the following 4 -exported symbols: - -DllGetClassObject -DllCanUnloadNow -DllRegisterServer -DllUnregisterServer - - -Macintosh notes: -The supplied project is created with CodeWarrior Pro 5. diff --git a/src/hostapi/asio/ASIOSDK/driver/asiosample/asiosample/asiosample.dsp b/src/hostapi/asio/ASIOSDK/driver/asiosample/asiosample/asiosample.dsp deleted file mode 100644 index f0a0b01..0000000 --- a/src/hostapi/asio/ASIOSDK/driver/asiosample/asiosample/asiosample.dsp +++ /dev/null @@ -1,151 +0,0 @@ -# Microsoft Developer Studio Project File - Name="asiosample" - Package Owner=<4> -# Microsoft Developer Studio Generated Build File, Format Version 6.00 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 - -CFG=asiosample - Win32 Debug -!MESSAGE This is not a valid makefile. To build this project using NMAKE, -!MESSAGE use the Export Makefile command and run -!MESSAGE -!MESSAGE NMAKE /f "asiosample.mak". -!MESSAGE -!MESSAGE You can specify a configuration when running NMAKE -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "asiosample.mak" CFG="asiosample - Win32 Debug" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "asiosample - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") -!MESSAGE "asiosample - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") -!MESSAGE - -# Begin Project -# PROP AllowPerConfigDependencies 0 -# PROP Scc_ProjName "" -# PROP Scc_LocalPath "" -CPP=cl.exe -MTL=midl.exe -RSC=rc.exe - -!IF "$(CFG)" == "asiosample - Win32 Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "Release" -# PROP BASE Intermediate_Dir "Release" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "Release" -# PROP Intermediate_Dir "Release" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c -# ADD CPP /nologo /MT /W3 /GX /O2 /I "..\..\..\Common" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c -# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 -# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 -# ADD BASE RSC /l 0x409 /d "NDEBUG" -# ADD RSC /l 0x409 /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /machine:I386 -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib winmm.lib /nologo /subsystem:windows /dll /machine:I386 - -!ELSEIF "$(CFG)" == "asiosample - Win32 Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "Debug" -# PROP BASE Intermediate_Dir "Debug" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "Debug" -# PROP Intermediate_Dir "Debug" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /GZ /c -# ADD CPP /nologo /G5 /MTd /W3 /Gm /GX /Zi /Od /I "..\..\..\Common" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /GZ /c -# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 -# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 -# ADD BASE RSC /l 0x409 /d "_DEBUG" -# ADD RSC /l 0x409 /d "_DEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /debug /machine:I386 /pdbtype:sept -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib winmm.lib /nologo /subsystem:windows /dll /debug /machine:I386 /pdbtype:sept - -!ENDIF - -# Begin Target - -# Name "asiosample - Win32 Release" -# Name "asiosample - Win32 Debug" -# Begin Group "Source Files" - -# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" -# Begin Source File - -SOURCE=..\asiosample.def -# End Source File -# Begin Source File - -SOURCE=..\asiosmpl.cpp -# End Source File -# Begin Source File - -SOURCE=..\..\..\common\combase.cpp -# End Source File -# Begin Source File - -SOURCE=..\..\..\common\dllentry.cpp -# End Source File -# Begin Source File - -SOURCE=..\..\..\common\register.cpp -# End Source File -# Begin Source File - -SOURCE=..\wintimer.cpp -# End Source File -# End Group -# Begin Group "Header Files" - -# PROP Default_Filter "h;hpp;hxx;hm;inl" -# Begin Source File - -SOURCE=..\..\..\common\asio.h -# End Source File -# Begin Source File - -SOURCE=..\..\Common\Asiodrvr.h -# End Source File -# Begin Source File - -SOURCE=..\asiosmpl.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\common\asiosys.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\common\combase.h -# End Source File -# Begin Source File - -SOURCE=..\..\..\common\iasiodrv.h -# End Source File -# End Group -# Begin Group "Resource Files" - -# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" -# End Group -# End Target -# End Project diff --git a/src/hostapi/asio/ASIOSDK/driver/asiosample/asiosample/asiosample.vcproj b/src/hostapi/asio/ASIOSDK/driver/asiosample/asiosample/asiosample.vcproj deleted file mode 100644 index 9f49594..0000000 --- a/src/hostapi/asio/ASIOSDK/driver/asiosample/asiosample/asiosample.vcproj +++ /dev/null @@ -1,629 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/hostapi/asio/ASIOSDK/driver/asiosample/asiosmpl.cpp b/src/hostapi/asio/ASIOSDK/driver/asiosample/asiosmpl.cpp deleted file mode 100644 index ca72be7..0000000 --- a/src/hostapi/asio/ASIOSDK/driver/asiosample/asiosmpl.cpp +++ /dev/null @@ -1,660 +0,0 @@ -/* - Steinberg Audio Stream I/O API - (c) 1996, Steinberg Soft- und Hardware GmbH - charlie (May 1996) - - asiosmpl.cpp - - sample implementation of asio. can be set to simulate input with some - stupid oscillators. - this driver doesn't output sound at all... - timing is done via the extended time manager on the mac, and - a simple thread on pc. - you may test various configurations by changing the kNumInputs/Outputs, - and kBlockFrames. note that when using wave generation, as i/o is not optimized - at all, it moves quite a bit of memory, too many i/o channels may make it - pretty slow. - - if you use this file as a template, make sure to resolve places where the - search string !!! can be found... -*/ - -#include -#include -#include "asiosmpl.h" -//#include "virtape.h" - -//------------------------------------------------------------------------------------------ - -// extern -void getNanoSeconds(ASIOTimeStamp *time); - -// local - -double AsioSamples2double (ASIOSamples* samples); - -static const double twoRaisedTo32 = 4294967296.; -static const double twoRaisedTo32Reciprocal = 1. / twoRaisedTo32; - -//------------------------------------------------------------------------------------------ -// on windows, we do the COM stuff. - -#if WINDOWS -#include "windows.h" -#include "mmsystem.h" - -// class id. !!! NOTE: !!! you will obviously have to create your own class id! -// {188135E1-D565-11d2-854F-00A0C99F5D19} -CLSID IID_ASIO_DRIVER = { 0x188135e1, 0xd565, 0x11d2, { 0x85, 0x4f, 0x0, 0xa0, 0xc9, 0x9f, 0x5d, 0x19 } }; - -CFactoryTemplate g_Templates[1] = { - {L"ASIOSAMPLE", &IID_ASIO_DRIVER, AsioSample::CreateInstance} -}; -int g_cTemplates = sizeof(g_Templates) / sizeof(g_Templates[0]); - -CUnknown* AsioSample::CreateInstance (LPUNKNOWN pUnk, HRESULT *phr) -{ - return (CUnknown*)new AsioSample (pUnk,phr); -}; - -STDMETHODIMP AsioSample::NonDelegatingQueryInterface (REFIID riid, void ** ppv) -{ - if (riid == IID_ASIO_DRIVER) - { - return GetInterface (this, ppv); - } - return CUnknown::NonDelegatingQueryInterface (riid, ppv); -} - -// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -// Register ASIO Driver -// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -extern LONG RegisterAsioDriver (CLSID,char *,char *,char *,char *); -extern LONG UnregisterAsioDriver (CLSID,char *,char *); - -// -// Server registration, called on REGSVR32.EXE "the dllname.dll" -// -HRESULT _stdcall DllRegisterServer() -{ - LONG rc; - char errstr[128]; - - rc = RegisterAsioDriver (IID_ASIO_DRIVER,"ASIOSample.dll","ASIO Sample Driver","ASIO Sample","Apartment"); - - if (rc) { - memset(errstr,0,128); - sprintf(errstr,"Register Server failed ! (%d)",rc); - MessageBox(0,(LPCTSTR)errstr,(LPCTSTR)"ASIO sample Driver",MB_OK); - return -1; - } - - return S_OK; -} - -// -// Server unregistration -// -HRESULT _stdcall DllUnregisterServer() -{ - LONG rc; - char errstr[128]; - - rc = UnregisterAsioDriver (IID_ASIO_DRIVER,"ASIOSample.dll","ASIO Sample Driver"); - - if (rc) { - memset(errstr,0,128); - sprintf(errstr,"Unregister Server failed ! (%d)",rc); - MessageBox(0,(LPCTSTR)errstr,(LPCTSTR)"ASIO Korg1212 I/O Driver",MB_OK); - return -1; - } - - return S_OK; -} - -//------------------------------------------------------------------------------------------ -//------------------------------------------------------------------------------------------ -AsioSample::AsioSample (LPUNKNOWN pUnk, HRESULT *phr) - : CUnknown("ASIOSAMPLE", pUnk, phr) - -//------------------------------------------------------------------------------------------ - -#else - -// when not on windows, we derive from AsioDriver -AsioSample::AsioSample () : AsioDriver () - -#endif -{ - long i; - - blockFrames = kBlockFrames; - inputLatency = blockFrames; // typically - outputLatency = blockFrames * 2; - // typically blockFrames * 2; try to get 1 by offering direct buffer - // access, and using asioPostOutput for lower latency - samplePosition = 0; - sampleRate = 44100.; - milliSeconds = (long)((double)(kBlockFrames * 1000) / sampleRate); - active = false; - started = false; - timeInfoMode = false; - tcRead = false; - for (i = 0; i < kNumInputs; i++) - { - inputBuffers[i] = 0; - inMap[i] = 0; - } -#if TESTWAVES - sawTooth = sineWave = 0; -#endif - for (i = 0; i < kNumOutputs; i++) - { - outputBuffers[i] = 0; - outMap[i] = 0; - } - callbacks = 0; - activeInputs = activeOutputs = 0; - toggle = 0; -} - -//------------------------------------------------------------------------------------------ -AsioSample::~AsioSample () -{ - stop (); - outputClose (); - inputClose (); - disposeBuffers (); -} - -//------------------------------------------------------------------------------------------ -void AsioSample::getDriverName (char *name) -{ - strcpy (name, "Sample ASIO"); -} - -//------------------------------------------------------------------------------------------ -long AsioSample::getDriverVersion () -{ - return 0x00000001L; -} - -//------------------------------------------------------------------------------------------ -void AsioSample::getErrorMessage (char *string) -{ - strcpy (string, errorMessage); -} - -//------------------------------------------------------------------------------------------ -ASIOBool AsioSample::init (void* sysRef) -{ - sysRef = sysRef; - if (active) - return true; - strcpy (errorMessage, "ASIO Driver open Failure!"); - if (inputOpen ()) - { - if (outputOpen ()) - { - active = true; - return true; - } - } - timerOff (); // de-activate 'hardware' - - outputClose (); - inputClose (); - return false; -} - -//------------------------------------------------------------------------------------------ -ASIOError AsioSample::start () -{ - if (callbacks) - { - started = false; - samplePosition = 0; - theSystemTime.lo = theSystemTime.hi = 0; - toggle = 0; - - timerOn (); // activate 'hardware' - started = true; - - return ASE_OK; - } - return ASE_NotPresent; -} - -//------------------------------------------------------------------------------------------ -ASIOError AsioSample::stop () -{ - started = false; - timerOff (); // de-activate 'hardware' - return ASE_OK; -} - -//------------------------------------------------------------------------------------------ -ASIOError AsioSample::getChannels (long *numInputChannels, long *numOutputChannels) -{ - *numInputChannels = kNumInputs; - *numOutputChannels = kNumOutputs; - return ASE_OK; -} - -//------------------------------------------------------------------------------------------ -ASIOError AsioSample::getLatencies (long *_inputLatency, long *_outputLatency) -{ - *_inputLatency = inputLatency; - *_outputLatency = outputLatency; - return ASE_OK; -} - -//------------------------------------------------------------------------------------------ -ASIOError AsioSample::getBufferSize (long *minSize, long *maxSize, - long *preferredSize, long *granularity) -{ - *minSize = *maxSize = *preferredSize = blockFrames; // allow this size only - *granularity = 0; - return ASE_OK; -} - -//------------------------------------------------------------------------------------------ -ASIOError AsioSample::canSampleRate (ASIOSampleRate sampleRate) -{ - if (sampleRate == 44100. || sampleRate == 48000.) // allow these rates only - return ASE_OK; - return ASE_NoClock; -} - -//------------------------------------------------------------------------------------------ -ASIOError AsioSample::getSampleRate (ASIOSampleRate *sampleRate) -{ - *sampleRate = this->sampleRate; - return ASE_OK; -} - -//------------------------------------------------------------------------------------------ -ASIOError AsioSample::setSampleRate (ASIOSampleRate sampleRate) -{ - if (sampleRate != 44100. && sampleRate != 48000.) - return ASE_NoClock; - if (sampleRate != this->sampleRate) - { - this->sampleRate = sampleRate; - asioTime.timeInfo.sampleRate = sampleRate; - asioTime.timeInfo.flags |= kSampleRateChanged; - milliSeconds = (long)((double)(kBlockFrames * 1000) / this->sampleRate); - if (callbacks && callbacks->sampleRateDidChange) - callbacks->sampleRateDidChange (this->sampleRate); - } - return ASE_OK; -} - -//------------------------------------------------------------------------------------------ -ASIOError AsioSample::getClockSources (ASIOClockSource *clocks, long *numSources) -{ - // internal - clocks->index = 0; - clocks->associatedChannel = -1; - clocks->associatedGroup = -1; - clocks->isCurrentSource = ASIOTrue; - strcpy(clocks->name, "Internal"); - *numSources = 1; - return ASE_OK; -} - -//------------------------------------------------------------------------------------------ -ASIOError AsioSample::setClockSource (long index) -{ - if (!index) - { - asioTime.timeInfo.flags |= kClockSourceChanged; - return ASE_OK; - } - return ASE_NotPresent; -} - -//------------------------------------------------------------------------------------------ -ASIOError AsioSample::getSamplePosition (ASIOSamples *sPos, ASIOTimeStamp *tStamp) -{ - tStamp->lo = theSystemTime.lo; - tStamp->hi = theSystemTime.hi; - if (samplePosition >= twoRaisedTo32) - { - sPos->hi = (unsigned long)(samplePosition * twoRaisedTo32Reciprocal); - sPos->lo = (unsigned long)(samplePosition - (sPos->hi * twoRaisedTo32)); - } - else - { - sPos->hi = 0; - sPos->lo = (unsigned long)samplePosition; - } - return ASE_OK; -} - -//------------------------------------------------------------------------------------------ -ASIOError AsioSample::getChannelInfo (ASIOChannelInfo *info) -{ - if (info->channel < 0 || (info->isInput ? info->channel >= kNumInputs : info->channel >= kNumOutputs)) - return ASE_InvalidParameter; -#if WINDOWS - info->type = ASIOSTInt16LSB; -#else - info->type = ASIOSTInt16MSB; -#endif - info->channelGroup = 0; - info->isActive = ASIOFalse; - long i; - if (info->isInput) - { - for (i = 0; i < activeInputs; i++) - { - if (inMap[i] == info->channel) - { - info->isActive = ASIOTrue; - break; - } - } - } - else - { - for (i = 0; i < activeOutputs; i++) - { - if (outMap[i] == info->channel) - { - info->isActive = ASIOTrue; - break; - } - } - } - strcpy(info->name, "Sample "); - return ASE_OK; -} - -//------------------------------------------------------------------------------------------ -ASIOError AsioSample::createBuffers (ASIOBufferInfo *bufferInfos, long numChannels, - long bufferSize, ASIOCallbacks *callbacks) -{ - ASIOBufferInfo *info = bufferInfos; - long i; - bool notEnoughMem = false; - - activeInputs = 0; - activeOutputs = 0; - blockFrames = bufferSize; - for (i = 0; i < numChannels; i++, info++) - { - if (info->isInput) - { - if (info->channelNum < 0 || info->channelNum >= kNumInputs) - goto error; - inMap[activeInputs] = info->channelNum; - inputBuffers[activeInputs] = new short[blockFrames * 2]; // double buffer - if (inputBuffers[activeInputs]) - { - info->buffers[0] = inputBuffers[activeInputs]; - info->buffers[1] = inputBuffers[activeInputs] + blockFrames; - } - else - { - info->buffers[0] = info->buffers[1] = 0; - notEnoughMem = true; - } - activeInputs++; - if (activeInputs > kNumInputs) - { -error: - disposeBuffers(); - return ASE_InvalidParameter; - } - } - else // output - { - if (info->channelNum < 0 || info->channelNum >= kNumOutputs) - goto error; - outMap[activeOutputs] = info->channelNum; - outputBuffers[activeOutputs] = new short[blockFrames * 2]; // double buffer - if (outputBuffers[activeOutputs]) - { - info->buffers[0] = outputBuffers[activeOutputs]; - info->buffers[1] = outputBuffers[activeOutputs] + blockFrames; - } - else - { - info->buffers[0] = info->buffers[1] = 0; - notEnoughMem = true; - } - activeOutputs++; - if (activeOutputs > kNumOutputs) - { - activeOutputs--; - disposeBuffers(); - return ASE_InvalidParameter; - } - } - } - if (notEnoughMem) - { - disposeBuffers(); - return ASE_NoMemory; - } - - this->callbacks = callbacks; - if (callbacks->asioMessage (kAsioSupportsTimeInfo, 0, 0, 0)) - { - timeInfoMode = true; - asioTime.timeInfo.speed = 1.; - asioTime.timeInfo.systemTime.hi = asioTime.timeInfo.systemTime.lo = 0; - asioTime.timeInfo.samplePosition.hi = asioTime.timeInfo.samplePosition.lo = 0; - asioTime.timeInfo.sampleRate = sampleRate; - asioTime.timeInfo.flags = kSystemTimeValid | kSamplePositionValid | kSampleRateValid; - - asioTime.timeCode.speed = 1.; - asioTime.timeCode.timeCodeSamples.lo = asioTime.timeCode.timeCodeSamples.hi = 0; - asioTime.timeCode.flags = kTcValid | kTcRunning ; - } - else - timeInfoMode = false; - return ASE_OK; -} - -//--------------------------------------------------------------------------------------------- -ASIOError AsioSample::disposeBuffers() -{ - long i; - - callbacks = 0; - stop(); - for (i = 0; i < activeInputs; i++) - delete inputBuffers[i]; - activeInputs = 0; - for (i = 0; i < activeOutputs; i++) - delete outputBuffers[i]; - activeOutputs = 0; - return ASE_OK; -} - -//--------------------------------------------------------------------------------------------- -ASIOError AsioSample::controlPanel() -{ - return ASE_NotPresent; -} - -//--------------------------------------------------------------------------------------------- -ASIOError AsioSample::future (long selector, void* opt) // !!! check properties -{ - ASIOTransportParameters* tp = (ASIOTransportParameters*)opt; - switch (selector) - { - case kAsioEnableTimeCodeRead: tcRead = true; return ASE_SUCCESS; - case kAsioDisableTimeCodeRead: tcRead = false; return ASE_SUCCESS; - case kAsioSetInputMonitor: return ASE_SUCCESS; // for testing!!! - case kAsioCanInputMonitor: return ASE_SUCCESS; // for testing!!! - case kAsioCanTimeInfo: return ASE_SUCCESS; - case kAsioCanTimeCode: return ASE_SUCCESS; - } - return ASE_NotPresent; -} - -//-------------------------------------------------------------------------------------------------------- -// private methods -//-------------------------------------------------------------------------------------------------------- - -//-------------------------------------------------------------------------------------------------------- -// input -//-------------------------------------------------------------------------------------------------------- - -//--------------------------------------------------------------------------------------------- -bool AsioSample::inputOpen () -{ -#if TESTWAVES - sineWave = new short[blockFrames]; - if (!sineWave) - { - strcpy (errorMessage, "ASIO Sample Driver: Out of Memory!"); - return false; - } - makeSine (sineWave); - - sawTooth = new short[blockFrames]; - if (!sawTooth) - { - strcpy(errorMessage, "ASIO Sample Driver: Out of Memory!"); - return false; - } - makeSaw(sawTooth); -#endif - return true; -} - -#if TESTWAVES - -#include - -const double pi = 0.3141592654; - -//--------------------------------------------------------------------------------------------- -void AsioSample::makeSine (short *wave) -{ - double frames = (double)blockFrames; - double i, f = (pi * 2.) / frames; - - for (i = 0; i < frames; i++) - *wave++ = (short)((double)0x7fff * sin(f * i)); -} - -//--------------------------------------------------------------------------------------------- -void AsioSample::makeSaw(short *wave) -{ - double frames = (double)blockFrames; - double i, f = 2. / frames; - - for (i = 0; i < frames; i++) - *wave++ = (short)((double)0x7fff * (-1. + f * i)); -} -#endif - -//--------------------------------------------------------------------------------------------- -void AsioSample::inputClose () -{ -#if TESTWAVES - if (sineWave) - delete sineWave; - sineWave = 0; - if (sawTooth) - delete sawTooth; - sawTooth = 0; -#endif -} - -//--------------------------------------------------------------------------------------------- -void AsioSample::input() -{ -#if TESTWAVES - long i; - short *in = 0; - - for (i = 0; i < activeInputs; i++) - { - in = inputBuffers[i]; - if (in) - { - if (toggle) - in += blockFrames; - if ((i & 1) && sawTooth) - memcpy(in, sawTooth, (unsigned long)(blockFrames * 2)); - else if (sineWave) - memcpy(in, sineWave, (unsigned long)(blockFrames * 2)); - } - } -#endif -} - -//------------------------------------------------------------------------------------------------------------------ -// output -//------------------------------------------------------------------------------------------------------------------ - -//--------------------------------------------------------------------------------------------- -bool AsioSample::outputOpen() -{ - return true; -} - -//--------------------------------------------------------------------------------------------- -void AsioSample::outputClose () -{ -} - -//--------------------------------------------------------------------------------------------- -void AsioSample::output () -{ -} - -//--------------------------------------------------------------------------------------------- -void AsioSample::bufferSwitch () -{ - if (started && callbacks) - { - getNanoSeconds(&theSystemTime); // latch system time - input(); - output(); - samplePosition += blockFrames; - if (timeInfoMode) - bufferSwitchX (); - else - callbacks->bufferSwitch (toggle, ASIOFalse); - toggle = toggle ? 0 : 1; - } -} - -//--------------------------------------------------------------------------------------------- -// asio2 buffer switch -void AsioSample::bufferSwitchX () -{ - getSamplePosition (&asioTime.timeInfo.samplePosition, &asioTime.timeInfo.systemTime); - long offset = toggle ? blockFrames : 0; - if (tcRead) - { // Create a fake time code, which is 10 minutes ahead of the card's sample position - // Please note that for simplicity here time code will wrap after 32 bit are reached - asioTime.timeCode.timeCodeSamples.lo = asioTime.timeInfo.samplePosition.lo + 600.0 * sampleRate; - asioTime.timeCode.timeCodeSamples.hi = 0; - } - callbacks->bufferSwitchTimeInfo (&asioTime, toggle, ASIOFalse); - asioTime.timeInfo.flags &= ~(kSampleRateChanged | kClockSourceChanged); -} - -//--------------------------------------------------------------------------------------------- -ASIOError AsioSample::outputReady () -{ - return ASE_NotPresent; -} - -//--------------------------------------------------------------------------------------------- -double AsioSamples2double (ASIOSamples* samples) -{ - double a = (double)(samples->lo); - if (samples->hi) - a += (double)(samples->hi) * twoRaisedTo32; - return a; -} - diff --git a/src/hostapi/asio/ASIOSDK/driver/asiosample/asiosmpl.h b/src/hostapi/asio/ASIOSDK/driver/asiosample/asiosmpl.h deleted file mode 100644 index 8316f12..0000000 --- a/src/hostapi/asio/ASIOSDK/driver/asiosample/asiosmpl.h +++ /dev/null @@ -1,148 +0,0 @@ -/* - Steinberg Audio Stream I/O API - (c) 1999, Steinberg Soft- und Hardware GmbH - - asiosmpl.h - - test implementation of asio -*/ - -#ifndef _asiosmpl_ -#define _asiosmpl_ - -#include "asiosys.h" - -#define TESTWAVES 1 -// when true, will feed the left input (to host) with -// a sine wave, and the right one with a sawtooth - -enum -{ - kBlockFrames = 256, - kNumInputs = 16, - kNumOutputs = 16 -}; - -#if WINDOWS - -#include "rpc.h" -#include "rpcndr.h" -#ifndef COM_NO_WINDOWS_H -#include -#include "ole2.h" -#endif - -#include "combase.h" -#include "iasiodrv.h" - -class AsioSample : public IASIO, public CUnknown -{ -public: - AsioSample(LPUNKNOWN pUnk, HRESULT *phr); - ~AsioSample(); - - DECLARE_IUNKNOWN - //STDMETHODIMP QueryInterface(REFIID riid, void **ppv) { \ - // return GetOwner()->QueryInterface(riid,ppv); \ - //}; \ - //STDMETHODIMP_(ULONG) AddRef() { \ - // return GetOwner()->AddRef(); \ - //}; \ - //STDMETHODIMP_(ULONG) Release() { \ - // return GetOwner()->Release(); \ - //}; - - // Factory method - static CUnknown *CreateInstance(LPUNKNOWN pUnk, HRESULT *phr); - // IUnknown - virtual HRESULT STDMETHODCALLTYPE NonDelegatingQueryInterface(REFIID riid,void **ppvObject); -#else - -#include "asiodrvr.h" - -//--------------------------------------------------------------------------------------------- -class AsioSample : public AsioDriver -{ -public: - AsioSample (); - ~AsioSample (); -#endif - - ASIOBool init (void* sysRef); - void getDriverName (char *name); // max 32 bytes incl. terminating zero - long getDriverVersion (); - void getErrorMessage (char *string); // max 128 bytes incl. - - ASIOError start (); - ASIOError stop (); - - ASIOError getChannels (long *numInputChannels, long *numOutputChannels); - ASIOError getLatencies (long *inputLatency, long *outputLatency); - ASIOError getBufferSize (long *minSize, long *maxSize, - long *preferredSize, long *granularity); - - ASIOError canSampleRate (ASIOSampleRate sampleRate); - ASIOError getSampleRate (ASIOSampleRate *sampleRate); - ASIOError setSampleRate (ASIOSampleRate sampleRate); - ASIOError getClockSources (ASIOClockSource *clocks, long *numSources); - ASIOError setClockSource (long index); - - ASIOError getSamplePosition (ASIOSamples *sPos, ASIOTimeStamp *tStamp); - ASIOError getChannelInfo (ASIOChannelInfo *info); - - ASIOError createBuffers (ASIOBufferInfo *bufferInfos, long numChannels, - long bufferSize, ASIOCallbacks *callbacks); - ASIOError disposeBuffers (); - - ASIOError controlPanel (); - ASIOError future (long selector, void *opt); - ASIOError outputReady (); - - void bufferSwitch (); - long getMilliSeconds () {return milliSeconds;} - -private: -friend void myTimer(); - - bool inputOpen (); -#if TESTWAVES - void makeSine (short *wave); - void makeSaw (short *wave); -#endif - void inputClose (); - void input (); - - bool outputOpen (); - void outputClose (); - void output (); - - void timerOn (); - void timerOff (); - void bufferSwitchX (); - - double samplePosition; - double sampleRate; - ASIOCallbacks *callbacks; - ASIOTime asioTime; - ASIOTimeStamp theSystemTime; - short *inputBuffers[kNumInputs * 2]; - short *outputBuffers[kNumOutputs * 2]; -#if TESTWAVES - short *sineWave, *sawTooth; -#endif - long inMap[kNumInputs]; - long outMap[kNumOutputs]; - long blockFrames; - long inputLatency; - long outputLatency; - long activeInputs; - long activeOutputs; - long toggle; - long milliSeconds; - bool active, started; - bool timeInfoMode, tcRead; - char errorMessage[128]; -}; - -#endif - diff --git a/src/hostapi/asio/ASIOSDK/driver/asiosample/macnanosecs.cpp b/src/hostapi/asio/ASIOSDK/driver/asiosample/macnanosecs.cpp deleted file mode 100644 index 3a46fb2..0000000 --- a/src/hostapi/asio/ASIOSDK/driver/asiosample/macnanosecs.cpp +++ /dev/null @@ -1,15 +0,0 @@ -#include "asio.h" -#include - -void getNanoSeconds(ASIOTimeStamp *time); - -static const double twoRaisedTo32 = 4294967296.; - -void getNanoSeconds(ASIOTimeStamp *time) -{ - UnsignedWide ys; - Microseconds(&ys); - double r = 1000. * ((double)ys.hi * twoRaisedTo32 + (double)ys.lo); - time->hi = (unsigned long)(r / twoRaisedTo32); - time->lo = (unsigned long)(r - (double)time->hi * twoRaisedTo32); -} diff --git a/src/hostapi/asio/ASIOSDK/driver/asiosample/mactimer.cpp b/src/hostapi/asio/ASIOSDK/driver/asiosample/mactimer.cpp deleted file mode 100644 index 1f0008b..0000000 --- a/src/hostapi/asio/ASIOSDK/driver/asiosample/mactimer.cpp +++ /dev/null @@ -1,52 +0,0 @@ -/* - Steinberg Audio Stream I/O API - (c) 1996, Steinberg Soft- und Hardware GmbH - charlie (May 1996) - - asiosmpl.cpp - - sample implementation of asio. - time manager irq - **** mac os specific **** -*/ - -#include -#include -#include -#include "asiosmpl.h" - -static TMTask myTmTask; -static bool tmTaskOn = false; -static AsioSample *theSound = 0; - -void myTimer(); -void myTimer() -{ - if(theSound) - theSound->bufferSwitch(); - PrimeTime((QElemPtr)&myTmTask, theSound->milliSeconds); -} - -void AsioSample::timerOn() -{ - theSound = this; // for irq - if(!tmTaskOn) - { - memset(&myTmTask, 0, sizeof(TMTask)); - myTmTask.tmAddr = NewTimerProc(myTimer); - myTmTask.tmWakeUp = 0; - tmTaskOn = true; - InsXTime((QElemPtr)&myTmTask); - PrimeTime((QElemPtr)&myTmTask, theSound->milliSeconds); - } -} - -void AsioSample::timerOff() -{ - if(tmTaskOn) - { - RmvTime((QElemPtr)&myTmTask); - tmTaskOn = false; - } - theSound = 0; -} diff --git a/src/hostapi/asio/ASIOSDK/driver/asiosample/makesamp.cpp b/src/hostapi/asio/ASIOSDK/driver/asiosample/makesamp.cpp deleted file mode 100644 index 25a2f41..0000000 --- a/src/hostapi/asio/ASIOSDK/driver/asiosample/makesamp.cpp +++ /dev/null @@ -1,6 +0,0 @@ -#include "asiosmpl.h" - -AsioDriver *getDriver() -{ - return new AsioSample(); -} diff --git a/src/hostapi/asio/ASIOSDK/driver/asiosample/wintimer.cpp b/src/hostapi/asio/ASIOSDK/driver/asiosample/wintimer.cpp deleted file mode 100644 index c861bb3..0000000 --- a/src/hostapi/asio/ASIOSDK/driver/asiosample/wintimer.cpp +++ /dev/null @@ -1,55 +0,0 @@ -#include -#include "asiosmpl.h" - -static DWORD __stdcall ASIOThread (void *param); -static HANDLE ASIOThreadHandle = 0; -static bool done = false; -const double twoRaisedTo32 = 4294967296.; - -AsioSample* theDriver = 0; - -//------------------------------------------------------------------------------------------ -void getNanoSeconds (ASIOTimeStamp* ts) -{ - double nanoSeconds = (double)((unsigned long)timeGetTime ()) * 1000000.; - ts->hi = (unsigned long)(nanoSeconds / twoRaisedTo32); - ts->lo = (unsigned long)(nanoSeconds - (ts->hi * twoRaisedTo32)); -} - -//------------------------------------------------------------------------------------------ -void AsioSample::timerOn () -{ - theDriver = this; - DWORD asioId; - done = false; - ASIOThreadHandle = CreateThread (0, 0, &ASIOThread, 0, 0, &asioId); -} - -//------------------------------------------------------------------------------------------ -void AsioSample::timerOff () -{ - done = true; - if (ASIOThreadHandle) - WaitForSingleObject(ASIOThreadHandle, 1000); - ASIOThreadHandle = 0; -} - -//------------------------------------------------------------------------------------------ -static DWORD __stdcall ASIOThread (void *param) -{ - do - { - if (theDriver) - { - theDriver->bufferSwitch (); - Sleep (theDriver->getMilliSeconds ()); - } - else - { - double a = 1000. / 44100.; - Sleep ((long)(a * (double)kBlockFrames)); - - } - } while (!done); - return 0; -} diff --git a/src/hostapi/asio/ASIOSDK/host/ASIOConvertSamples.cpp b/src/hostapi/asio/ASIOSDK/host/ASIOConvertSamples.cpp deleted file mode 100644 index 16e441e..0000000 --- a/src/hostapi/asio/ASIOSDK/host/ASIOConvertSamples.cpp +++ /dev/null @@ -1,859 +0,0 @@ -#include "ginclude.h" -#include "ASIOConvertSamples.h" -#include - -#if MAC -#define TRUNCATE 0 - -#elif ASIO_CPU_X86 || ASIO_CPU_SPARC || ASIO_CPU_MIPS -#define TRUNCATE 1 -#undef MAXFLOAT -#define MAXFLOAT 0x7fffff00L -#endif - -ASIOConvertSamples::ASIOConvertSamples() -{ -} - - -//------------------------------------------------------------------------------------------- -// mono - -void ASIOConvertSamples::convertMono8Unsigned(long *source, char *dest, long frames) -{ - unsigned char *c = (unsigned char *)source; - unsigned char a; - - dest--; - while(--frames >= 0) - { -#if ASIO_LITTLE_ENDIAN - a = c[3]; -#else - a = c[0]; -#endif - c += 4; - a -= 0x80U; - *++dest = a; - } -} - -void ASIOConvertSamples::convertMono8(long *source, char *dest, long frames) -{ - char *c = (char *)source; - char a; - - dest--; - while(--frames >= 0) - { -#if ASIO_LITTLE_ENDIAN - a = c[3]; -#else - a = c[0]; -#endif - c += 4; - *++dest = a; - } -} - -void ASIOConvertSamples::convertMono16(long *source, short *dest, long frames) -{ -#if ASIO_LITTLE_ENDIAN - char* s = (char*)source; - char* d = (char*)dest; - while(--frames >= 0) - { - *d++ = s[3]; // dest big endian, msb first - *d++ = s[2]; - s += 4; - } -#else - long l; - - source--; - dest--; - while(--frames >= 0) - { - l = *++source; - *++dest = (short)(l >> 16); - } -#endif -} - -void ASIOConvertSamples::convertMono24(long *source, char *dest, long frames) -{ - // work with chars in order to prevent misalignments - char *s = (char *)source; - char a, b, c; - - dest--; - while(--frames >= 0) - { -#if ASIO_LITTLE_ENDIAN - a = s[3]; // msb - b = s[2]; - c = s[1]; // lsb -#else - a = s[0]; - b = s[1]; - c = s[2]; -#endif - s += 4; - *++dest = a; // big endian, msb first - *++dest = b; - *++dest = c; - } -} - -// small endian - -void ASIOConvertSamples::convertMono16SmallEndian(long *source, short *dest, long frames) -{ - char *s = (char *)source; - char *d = (char *)dest; - char a, b; - - d--; - while(--frames >= 0) - { -#if ASIO_LITTLE_ENDIAN - a = s[3]; - b = s[2]; -#else - a = s[0]; - b = s[1]; -#endif - s += 4; - *++d = b; // dest small endian, lsb first - *++d = a; - } -} - -void ASIOConvertSamples::convertMono24SmallEndian(long *source, char *dest, long frames) -{ - // work with chars in order to prevent misalignments - char *s = (char *)source; - char a, b, c; - - dest--; - while(--frames >= 0) - { -#if ASIO_LITTLE_ENDIAN - a = s[3]; - b = s[2]; - c = s[1]; -#else - a = s[0]; - b = s[1]; - c = s[2]; -#endif - s += 4; - *++dest = c; // lsb first - *++dest = b; - *++dest = a; - } -} - - -//------------------------------------------------------------------------------------------- -// stereo interleaved - -void ASIOConvertSamples::convertStereo8InterleavedUnsigned(long *left, long *right, char *dest, long frames) -{ - unsigned char *cl = (unsigned char *)left; - unsigned char *cr = (unsigned char *)right; - unsigned char a, b; - - dest--; - while(--frames >= 0) - { -#if ASIO_LITTLE_ENDIAN - a = cl[3]; - b = cr[3]; -#else - a = cl[0]; - b = cr[0]; -#endif - cl += 4; - cr += 4; - a -= 0x80U; - b -= 0x80U; - *++dest = a; - *++dest = b; - } -} - -void ASIOConvertSamples::convertStereo8Interleaved(long *left, long *right, char *dest, long frames) -{ - unsigned char *cl = (unsigned char *)left; - unsigned char *cr = (unsigned char *)right; - unsigned char a, b; - - dest--; - while(--frames >= 0) - { -#if ASIO_LITTLE_ENDIAN - a = cl[3]; - b = cr[3]; -#else - a = cl[0]; - b = cr[0]; -#endif - cl += 4; - cr += 4; - *++dest = a; - *++dest = b; - } -} - -void ASIOConvertSamples::convertStereo16Interleaved(long *left, long *right, short *dest, long frames) -{ -#if ASIO_LITTLE_ENDIAN - char* sl = (char*)left; - char* sr = (char*)right; - char* d = (char*)dest; - while(--frames >= 0) - { - *d++ = sl[3]; // msb first - *d++ = sl[2]; - *d++ = sr[3]; - *d++ = sr[2]; - sl += 4; - sr += 4; - } -#else - long l, r; - - left--; - right--; - dest--; - while(--frames >= 0) - { - l = *++left; - r = *++right; - *++dest = (short)(l >> 16); - *++dest = (short)(r >> 16); - } -#endif -} - -void ASIOConvertSamples::convertStereo24Interleaved(long *left, long *right, char *dest, long frames) -{ - // work with chars in order to prevent misalignments - char *sl = (char *)left; - char *sr = (char *)right; - char al, bl, cl, ar, br, cr; - - dest--; - while(--frames >= 0) - { -#if ASIO_LITTLE_ENDIAN - al = sl[3]; - bl = sl[2]; - cl = sl[1]; - ar = sr[3]; - br = sr[2]; - cr = sr[1]; -#else - al = sl[0]; - bl = sl[1]; - cl = sl[2]; - ar = sr[0]; - br = sr[1]; - cr = sr[2]; -#endif - sl += 4; - sr += 4; - *++dest = al; - *++dest = bl; - *++dest = cl; - *++dest = ar; - *++dest = br; - *++dest = cr; - } -} - -void ASIOConvertSamples::convertStereo16InterleavedSmallEndian(long *left, long *right, short *dest, long frames) -{ - char *sl = (char *)left; - char *sr = (char *)right; - char *d = (char *)dest; - char al, bl, ar, br; - - d--; - while(--frames >= 0) - { -#if ASIO_LITTLE_ENDIAN - al = sl[3]; - bl = sl[2]; - ar = sr[3]; - br = sr[2]; -#else - al = sl[0]; - bl = sl[1]; - ar = sr[0]; - br = sr[1]; -#endif - sl += 4; - sr += 4; - *++d = bl; // lsb first - *++d = al; - *++d = br; - *++d = ar; - } -} - -void ASIOConvertSamples::convertStereo24InterleavedSmallEndian(long *left, long *right, char *dest, long frames) -{ - // work with chars in order to prevent misalignments - char *sl = (char *)left; - char *sr = (char *)right; - char al, bl, cl, ar, br, cr; - - dest--; - while(--frames >= 0) - { -#if ASIO_LITTLE_ENDIAN - al = sl[3]; - bl = sl[2]; - cl = sl[1]; - ar = sr[3]; - br = sr[2]; - cr = sr[1]; -#else - al = sl[0]; - bl = sl[1]; - cl = sl[2]; - ar = sr[0]; - br = sr[1]; - cr = sr[2]; -#endif - sl += 4; - sr += 4; - *++dest = cl; - *++dest = bl; - *++dest = al; - *++dest = cr; - *++dest = br; - *++dest = ar; - } -} - - -//------------------------------------------------------------------------------------------- -// stereo split - -void ASIOConvertSamples::convertStereo8Unsigned(long *left, long *right, char *dLeft, char *dRight, long frames) -{ - unsigned char *cl = (unsigned char *)left; - unsigned char *cr = (unsigned char *)right; - unsigned char a, b; - - dLeft--; - dRight--; - while(--frames >= 0) - { -#if ASIO_LITTLE_ENDIAN - a = cl[3]; - b = cr[3]; -#else - a = cl[0]; - b = cr[0]; -#endif - cl += 4; - cr += 4; - a -= 0x80U; - b -= 0x80U; - *++dLeft = a; - *++dRight = b; - } -} - -void ASIOConvertSamples::convertStereo8(long *left, long *right, char *dLeft, char *dRight, long frames) -{ - unsigned char *cl = (unsigned char *)left; - unsigned char *cr = (unsigned char *)right; - unsigned char a, b; - - dLeft--; - dRight--; - while(--frames >= 0) - { -#if ASIO_LITTLE_ENDIAN - a = cl[3]; - b = cr[3]; -#else - a = cl[0]; - b = cr[0]; -#endif - cl += 4; - cr += 4; - *++dLeft = a; - *++dRight = b; - } -} - -void ASIOConvertSamples::convertStereo16(long *left, long *right, short *dLeft, short *dRight, long frames) -{ -#if ASIO_LITTLE_ENDIAN - char* sl = (char*)left; - char* sr = (char*)right; - char* dl = (char*)dLeft; - char* dr = (char*)dRight; - while(--frames >= 0) - { - *dl++ = sl[3]; // msb first - *dl++ = sl[2]; - *dr++ = sr[3]; - *dr++ = sr[2]; - sl += 4; - sr += 4; - } -#else - long l, r; - - left--; - right--; - dLeft--; - dRight--; - while(--frames >= 0) - { - l = *++left; - r = *++right; - *++dLeft = (short)(l >> 16); - *++dRight = (short)(r >> 16); - } -#endif -} - -void ASIOConvertSamples::convertStereo24(long *left, long *right, char *dLeft, char *dRight, long frames) -{ - // work with chars in order to prevent misalignments - char *sl = (char *)left; - char *sr = (char *)right; - char al, bl, cl, ar, br, cr; - - dLeft--; - dRight--; - while(--frames >= 0) - { -#if ASIO_LITTLE_ENDIAN - al = sl[3]; - bl = sl[2]; - cl = sl[1]; - ar = sr[3]; - br = sr[2]; - cr = sr[1]; -#else - al = sl[0]; - bl = sl[1]; - cl = sl[2]; - ar = sr[0]; - br = sr[1]; - cr = sr[2]; -#endif - sl += 4; - sr += 4; - *++dLeft = al; - *++dLeft = bl; - *++dLeft = cl; - *++dRight = ar; - *++dRight = br; - *++dRight = cr; - } -} - -// small endian -void ASIOConvertSamples::convertStereo16SmallEndian(long *left, long *right, short *dLeft, short *dRight, long frames) -{ - char *sl = (char *)left; - char *sr = (char *)right; - char *dl = (char *)dLeft; - char *dr = (char *)dRight; - char al, bl, ar, br; - - dl--; - dr--; - while(--frames >= 0) - { -#if ASIO_LITTLE_ENDIAN - al = sl[3]; - bl = sl[2]; - ar = sr[3]; - br = sr[2]; -#else - al = sl[0]; - bl = sl[1]; - ar = sr[0]; - br = sr[1]; -#endif - sl += 4; - sr += 4; - *++dl = bl; - *++dl = al; - *++dr = br; - *++dr = ar; - } -} - -void ASIOConvertSamples::convertStereo24SmallEndian(long *left, long *right, char *dLeft, char *dRight, long frames) -{ - // work with chars in order to prevent misalignments - char *sl = (char *)left; - char *sr = (char *)right; - char al, bl, cl, ar, br, cr; - - dLeft--; - dRight--; - while(--frames >= 0) - { -#if ASIO_LITTLE_ENDIAN - al = sl[3]; - bl = sl[2]; - cl = sl[1]; - ar = sr[3]; - br = sr[2]; - cr = sr[1]; -#else - al = sl[0]; - bl = sl[1]; - cl = sl[2]; - ar = sr[0]; - br = sr[1]; - cr = sr[2]; -#endif - sl += 4; - sr += 4; - *++dLeft = cl; - *++dLeft = bl; - *++dLeft = al; - *++dRight = cr; - *++dRight = br; - *++dRight = ar; - } -} - -//------------------------------------------------------------------------------------------ -// in place integer conversions - -void ASIOConvertSamples::int32msb16to16inPlace(long *in, long frames) -{ - short *d1 = (short *)in; - short* out = d1; -#if ASIO_LITTLE_ENDIAN - d1++; -#endif - while(--frames >= 0) - { - *out++ = *d1; - d1 += 2; - } -} - -void ASIOConvertSamples::int32lsb16to16inPlace(long *in, long frames) -{ - short *d1 = (short *)in; - short* out = d1; -#if !ASIO_LITTLE_ENDIAN - d1++; -#endif - while(--frames >= 0) - { - *out++ = *d1; - d1 += 2; - } -} - -void ASIOConvertSamples::int32msb16shiftedTo16inPlace(long *in, long frames, long shift) -{ - short* out = (short*)in; - while(--frames >= 0) - *out++ = (short)(*in++ >> shift); -} - -void ASIOConvertSamples::int24msbto16inPlace(unsigned char *in, long frames) -{ - short a; - short* out = (short*)in; - while(--frames >= 0) - { -#if ASIO_LITTLE_ENDIAN - a = (short)in[2]; - a <<= 8; - a |= (in[1] & 0xff); -#else - a = (short)in[0]; - a <<= 8; - a |= (in[1] & 0xff); -#endif - *out++ = a; - in += 3; - } -} - -//----------------------------------------------------------------------------------------- - -void ASIOConvertSamples::shift32(void* buffer, long shiftAmount, long targetByteWidth, - bool revertEndian, long sampleFrames) -{ - long a; - long frames = sampleFrames; - long* source = (long*)buffer; - if(revertEndian) - { - reverseEndian(buffer, 4, sampleFrames); - revertEndian = false; - } - - if(targetByteWidth == 2) - { - short* dest = (short*)buffer; - short* al = (short*)&a; -#if ASIO_LITTLE_ENDIAN - al++; -#endif - while(--frames >= 0) - { - a = *source++; - a <<= shiftAmount; - *dest++ = *al; - } - } - - else if(targetByteWidth == 3) - { - char* dest = (char*)buffer; - long* source = (long*)buffer; - char* aa = (char*)&a; - while(--frames >= 0) - { - a = *source++; - a <<= shiftAmount; -#if ASIO_LITTLE_ENDIAN - dest[0] = aa[1]; // lsb - dest[1] = aa[2]; - dest[2] = aa[3]; // msb -#else - dest[0] = aa[0]; // msb - dest[1] = aa[1]; - dest[2] = aa[2]; // lsb -#endif - dest += 3; - } - } - - else if(targetByteWidth == 4) - { - long* dest = source; - while(--frames >= 0) - *dest++ = *source++ << shiftAmount; - } -} - -void ASIOConvertSamples::reverseEndian(void* buffer, long byteWidth, long frames) -{ - char* a = (char*)buffer; - char* b = a; - char c; - if(byteWidth == 2) - { - while(--frames >= 0) - { - c = a[0]; - a[0] = a[1]; - a[1] = c; - a += 2; - } - } - else if(byteWidth == 3) - { - while(--frames >= 0) - { - c = a[0]; - a[0] = a[2]; - a[2] = c; - a += 3; - } - } - else if(byteWidth == 4) - { - while(--frames >= 0) - { - c = a[0]; - a[0] = a[3]; - a[3] = c; - c = a[1]; - a[1] = a[2]; - a[2] = c; - a += 4; - } - } -} - -//------------------------------------------------------------------------------------------------- - -void ASIOConvertSamples::int32to16inPlace(void* buffer, long frames) -{ - short* in = (short*)buffer; - short* out = in; -#if ASIO_LITTLE_ENDIAN - in++; -#endif - while(--frames >= 0) - { - *out++ = *in; - in += 2; - } -} - -void ASIOConvertSamples::int24to16inPlace(void* buffer, long frames) -{ - char* from = (char*)buffer; - char* to = from; - while(--frames >= 0) - { -#if ASIO_LITTLE_ENDIAN - to[0] = from[1]; - to[1] = from[2]; -#else - to[0] = from[0]; - to[1] = from[1]; -#endif - from += 3; - to += 2; - } -} - -void ASIOConvertSamples::int32to24inPlace(void* buffer, long frames) -{ - long* in = (long*)buffer; - char* out = (char*)buffer; - long a; - while(--frames >= 0) - { - a = *in++; - a >>= 8; // 32->24 -#if ASIO_LITTLE_ENDIAN - out[0] = (char)a; // lsb - a >>= 8; - out[1] = (char)a; - a >>= 8; - out[2] = (char)a; -#else - out[2] = (char)a; // lsb - a >>= 8; - out[1] = (char)a; - a >>= 8; - out[0] = (char)a; -#endif - out += 3; - } -} - -void ASIOConvertSamples::int16to24inPlace(void* buffer, long frames) -{ - char* in = (char*)buffer; - char* out = (char*)buffer; - in += frames * 2; - out += frames * 3; - while(--frames >= 0) - { - out -= 3; - in -= 2; -#if ASIO_LITTLE_ENDIAN - out[2] = in[1]; // msb - out[1] = in[0]; // lsb - out[0] = 0; -#else - out[2] = 0; - out[1] = in[1]; // lsb - out[0] = in[0]; // msb -#endif - } -} - -void ASIOConvertSamples::int24to32inPlace(void* buffer, long frames) -{ - long a, b, c; - char* in = (char*)buffer; - long* out = (long*)buffer; - in += (frames * 3); - out += frames; - while(--frames >= 0) - { -#if ASIO_LITTLE_ENDIAN - a = (long)in[-1]; // msb - b = (long)in[-2]; - c = (long)in[-3]; -#else - a = (long)in[-3]; // msb - b = (long)in[-2]; - c = (long)in[-1]; -#endif - a <<= 24; - b <<= 16; - b &= 0x00ff0000; - a |= b; - c <<= 8; - c &= 0x0000ff00; - a |= c; - *--out = a; - in -= 3; - } -} - -void ASIOConvertSamples::int16to32inPlace(void* buffer, long frames) -{ - short* in = (short*)buffer; - long* out = (long*)buffer; - in += frames; - out += frames; - while(--frames >= 0) - *--out = ((long)(*--in)) << 16; -} - -//------------------------------------------------------------------------------------------ -// float to int - -const double fScaler16 = (double)0x7fffL; -const double fScaler24 = (double)0x7fffffL; -const double fScaler32 = (double)0x7fffffffL; - -void ASIOConvertSamples::float32toInt16inPlace(float* buffer, long frames) -{ - double sc = fScaler16 + .49999; - short* b = (short*)buffer; - while(--frames >= 0) - *b++ = (short)((double)(*buffer++) * sc); -} - -void ASIOConvertSamples::float32toInt24inPlace(float* buffer, long frames) -{ - double sc = fScaler24 + .49999; - long a; - char* b = (char*)buffer; - char* aa = (char*)&a; - - while(--frames >= 0) - { - a = (long)((double)(*buffer++) * sc); -#if ASIO_LITTLE_ENDIAN - *b++ = aa[3]; - *b++ = aa[2]; - *b++ = aa[1]; -#else - *b++ = aa[1]; - *b++ = aa[2]; - *b++ = aa[3]; -#endif - } -} - -void ASIOConvertSamples::float32toInt32inPlace(float* buffer, long frames) -{ - double sc = fScaler32 + .49999; - long* b = (long*)buffer; - while(--frames >= 0) - *b++ = (long)((double)(*buffer++) * sc); -} - diff --git a/src/hostapi/asio/ASIOSDK/host/ASIOConvertSamples.h b/src/hostapi/asio/ASIOSDK/host/ASIOConvertSamples.h deleted file mode 100644 index d1918a2..0000000 --- a/src/hostapi/asio/ASIOSDK/host/ASIOConvertSamples.h +++ /dev/null @@ -1,62 +0,0 @@ -#ifndef __ASIOConvertSamples__ -#define __ASIOConvertSamples__ - -class ASIOConvertSamples -{ -public: - ASIOConvertSamples(); - ~ASIOConvertSamples() {} - - // format converters, input 32 bit integer - // mono - void convertMono8(long *source, char *dest, long frames); - void convertMono8Unsigned(long *source, char *dest, long frames); - void convertMono16(long *source, short *dest, long frames); - void convertMono16SmallEndian(long *source, short *dest, long frames); - void convertMono24(long *source, char *dest, long frames); - void convertMono24SmallEndian(long *source, char *dest, long frames); - - // stereo interleaved - void convertStereo8Interleaved(long *left, long *right, char *dest, long frames); - void convertStereo8InterleavedUnsigned(long *left, long *right, char *dest, long frames); - void convertStereo16Interleaved(long *left, long *right, short *dest, long frames); - void convertStereo16InterleavedSmallEndian(long *left, long *right, short *dest, long frames); - void convertStereo24Interleaved(long *left, long *right, char *dest, long frames); - void convertStereo24InterleavedSmallEndian(long *left, long *right, char *dest, long frames); - - // stereo split - void convertStereo8(long *left, long *right, char *dLeft, char *dRight, long frames); - void convertStereo8Unsigned(long *left, long *right, char *dLeft, char *dRight, long frames); - void convertStereo16(long *left, long *right, short *dLeft, short *dRight, long frames); - void convertStereo16SmallEndian(long *left, long *right, short *dLeft, short *dRight, long frames); - void convertStereo24(long *left, long *right, char *dLeft, char *dRight, long frames); - void convertStereo24SmallEndian(long *left, long *right, char *dLeft, char *dRight, long frames); - - // integer in place conversions - - void int32msb16to16inPlace(long *in, long frames); - void int32lsb16to16inPlace(long *in, long frames); - void int32msb16shiftedTo16inPlace(long *in1, long frames, long shift); - void int24msbto16inPlace(unsigned char *in, long frames); - - // integer to integer - - void shift32(void* buffer, long shiftAmount, long targetByteWidth, - bool reverseEndian, long frames); - void reverseEndian(void* buffer, long byteWidth, long frames); - - void int32to16inPlace(void* buffer, long frames); - void int24to16inPlace(void* buffer, long frames); - void int32to24inPlace(void* buffer, long frames); - void int16to24inPlace(void* buffer, long frames); - void int24to32inPlace(void* buffer, long frames); - void int16to32inPlace(void* buffer, long frames); - - // float to integer - - void float32toInt16inPlace(float* buffer, long frames); - void float32toInt24inPlace(float* buffer, long frames); - void float32toInt32inPlace(float* buffer, long frames); -}; - -#endif diff --git a/src/hostapi/asio/ASIOSDK/host/asiodrivers.cpp b/src/hostapi/asio/ASIOSDK/host/asiodrivers.cpp deleted file mode 100644 index 4067bc0..0000000 --- a/src/hostapi/asio/ASIOSDK/host/asiodrivers.cpp +++ /dev/null @@ -1,186 +0,0 @@ -#include -#include "asiodrivers.h" - -AsioDrivers* asioDrivers = 0; - -bool loadAsioDriver(char *name); - -bool loadAsioDriver(char *name) -{ - if(!asioDrivers) - asioDrivers = new AsioDrivers(); - if(asioDrivers) - return asioDrivers->loadDriver(name); - return false; -} - -//------------------------------------------------------------------------------------ - -#if MAC - -bool resolveASIO(unsigned long aconnID); - -AsioDrivers::AsioDrivers() : CodeFragments("ASIO Drivers", 'AsDr', 'Asio') -{ - connID = -1; - curIndex = -1; -} - -AsioDrivers::~AsioDrivers() -{ - removeCurrentDriver(); -} - -bool AsioDrivers::getCurrentDriverName(char *name) -{ - if(curIndex >= 0) - return getName(curIndex, name); - return false; -} - -long AsioDrivers::getDriverNames(char **names, long maxDrivers) -{ - for(long i = 0; i < getNumFragments() && i < maxDrivers; i++) - getName(i, names[i]); - return getNumFragments() < maxDrivers ? getNumFragments() : maxDrivers; -} - -bool AsioDrivers::loadDriver(char *name) -{ - char dname[64]; - unsigned long newID; - - for(long i = 0; i < getNumFragments(); i++) - { - if(getName(i, dname) && !strcmp(name, dname)) - { - if(newInstance(i, &newID)) - { - if(resolveASIO(newID)) - { - if(connID != -1) - removeInstance(curIndex, connID); - curIndex = i; - connID = newID; - return true; - } - } - break; - } - } - return false; -} - -void AsioDrivers::removeCurrentDriver() -{ - if(connID != -1) - removeInstance(curIndex, connID); - connID = -1; - curIndex = -1; -} - -//------------------------------------------------------------------------------------ - -#elif WINDOWS - -#include "iasiodrv.h" - -extern IASIO* theAsioDriver; - -AsioDrivers::AsioDrivers() : AsioDriverList() -{ - curIndex = -1; -} - -AsioDrivers::~AsioDrivers() -{ -} - -bool AsioDrivers::getCurrentDriverName(char *name) -{ - if(curIndex >= 0) - return asioGetDriverName(curIndex, name, 32) == 0 ? true : false; - name[0] = 0; - return false; -} - -long AsioDrivers::getDriverNames(char **names, long maxDrivers) -{ - for(long i = 0; i < asioGetNumDev() && i < maxDrivers; i++) - asioGetDriverName(i, names[i], 32); - return asioGetNumDev() < maxDrivers ? asioGetNumDev() : maxDrivers; -} - -bool AsioDrivers::loadDriver(char *name) -{ - char dname[64]; - char curName[64]; - - for(long i = 0; i < asioGetNumDev(); i++) - { - if(!asioGetDriverName(i, dname, 32) && !strcmp(name, dname)) - { - curName[0] = 0; - getCurrentDriverName(curName); // in case we fail... - removeCurrentDriver(); - - if(!asioOpenDriver(i, (void **)&theAsioDriver)) - { - curIndex = i; - return true; - } - else - { - theAsioDriver = 0; - if(curName[0] && strcmp(dname, curName)) - loadDriver(curName); // try restore - } - break; - } - } - return false; -} - -void AsioDrivers::removeCurrentDriver() -{ - if(curIndex != -1) - asioCloseDriver(curIndex); - curIndex = -1; -} - -#elif SGI || BEOS - -#include "asiolist.h" - -AsioDrivers::AsioDrivers() - : AsioDriverList() -{ - curIndex = -1; -} - -AsioDrivers::~AsioDrivers() -{ -} - -bool AsioDrivers::getCurrentDriverName(char *name) -{ - return false; -} - -long AsioDrivers::getDriverNames(char **names, long maxDrivers) -{ - return 0; -} - -bool AsioDrivers::loadDriver(char *name) -{ - return false; -} - -void AsioDrivers::removeCurrentDriver() -{ -} - -#else -#error implement me -#endif diff --git a/src/hostapi/asio/ASIOSDK/host/asiodrivers.h b/src/hostapi/asio/ASIOSDK/host/asiodrivers.h deleted file mode 100644 index 511f2ea..0000000 --- a/src/hostapi/asio/ASIOSDK/host/asiodrivers.h +++ /dev/null @@ -1,41 +0,0 @@ -#ifndef __AsioDrivers__ -#define __AsioDrivers__ - -#include "ginclude.h" - -#if MAC -#include "CodeFragments.hpp" - -class AsioDrivers : public CodeFragments - -#elif WINDOWS -#include -#include "asiolist.h" - -class AsioDrivers : public AsioDriverList - -#elif SGI || BEOS -#include "asiolist.h" - -class AsioDrivers : public AsioDriverList - -#else -#error implement me -#endif - -{ -public: - AsioDrivers(); - ~AsioDrivers(); - - bool getCurrentDriverName(char *name); - long getDriverNames(char **names, long maxDrivers); - bool loadDriver(char *name); - void removeCurrentDriver(); - long getCurrentDriverIndex() {return curIndex;} -protected: - unsigned long connID; - long curIndex; -}; - -#endif diff --git a/src/hostapi/asio/ASIOSDK/host/ginclude.h b/src/hostapi/asio/ASIOSDK/host/ginclude.h deleted file mode 100644 index 97cb7b7..0000000 --- a/src/hostapi/asio/ASIOSDK/host/ginclude.h +++ /dev/null @@ -1,38 +0,0 @@ -#ifndef __gInclude__ -#define __gInclude__ - -#if SGI - #undef BEOS - #undef MAC - #undef WINDOWS - // - #define ASIO_BIG_ENDIAN 1 - #define ASIO_CPU_MIPS 1 -#elif defined(_WIN32) || defined(_WIN64) - #undef BEOS - #undef MAC - #undef SGI - #define WINDOWS 1 - #define ASIO_LITTLE_ENDIAN 1 - #define ASIO_CPU_X86 1 -#elif BEOS - #undef MAC - #undef SGI - #undef WINDOWS - #define ASIO_LITTLE_ENDIAN 1 - #define ASIO_CPU_X86 1 - // -#else - #define MAC 1 - #undef BEOS - #undef WINDOWS - #undef SGI - #define ASIO_BIG_ENDIAN 1 - #define ASIO_CPU_PPC 1 -#endif - -// always -#define NATIVE_INT64 0 -#define IEEE754_64FLOAT 1 - -#endif // __gInclude__ diff --git a/src/hostapi/asio/ASIOSDK/host/mac/asioshlib.cpp b/src/hostapi/asio/ASIOSDK/host/mac/asioshlib.cpp deleted file mode 100644 index 77163e5..0000000 --- a/src/hostapi/asio/ASIOSDK/host/mac/asioshlib.cpp +++ /dev/null @@ -1,342 +0,0 @@ -// asio code fragment 'linker' -// mac specific -// loads the symbols via the fragment manager, and -// translates them into function pointers. this -// means no asio lib must be linked, as the -// 'real' asio functions are here - -#include "ginclude.h" -#include -#include -#include -#include "asio.h" - -// Macro below has to 0 if external drivers will be used. -// Can be set to 1 if a specific ASIO driver should be linked into the program -#define ASIOINCLUDED 0 - - - -// export -bool resolveASIO(unsigned long aconnID); - -//------------------------------------------------------------------------------------------------------ -// private - -#if ASIOINCLUDED -bool resolveASIO(unsigned long aconnID) {aconnID = aconnID; return true;} -#else - -enum -{ - kASIOInit = 0, - kASIOExit, - kASIOStart, - kASIOStop, - kASIOGetChannels, - kASIOGetLatencies, - kASIOGetBufferSize, - kASIOCanSampleRate, - kASIOGetSampleRate, - kASIOSetSampleRate, - kASIOGetClockSources, - kASIOSetClockSource, - kASIOGetSamplePosition, - kASIOGetChannelInfo, - kASIOCreateBuffers, - kASIODisposeBuffers, - kASIOControlPanel, - kASIOFuture, - - kASIOOutputReady, - - kNumSymbols, - kRequiredSymbols = kNumSymbols - 1 -}; - -static char *asioTable[kNumSymbols] = -{ - "ASIOInit", - "ASIOExit", - "ASIOStart", - "ASIOStop", - "ASIOGetChannels", - "ASIOGetLatencies", - "ASIOGetBufferSize", - "ASIOCanSampleRate", - "ASIOGetSampleRate", - "ASIOSetSampleRate", - "ASIOGetClockSources", - "ASIOSetClockSource", - "ASIOGetSamplePosition", - "ASIOGetChannelInfo", - "ASIOCreateBuffers", - "ASIODisposeBuffers", - "ASIOControlPanel", - "ASIOFuture", - "ASIOOutputReady" -}; - -typedef ASIOError (*fasioInit) (ASIODriverInfo *info); -typedef ASIOError (*fasioExit) (void); -typedef ASIOError (*fasioStart) (void); -typedef ASIOError (*fasioStop) (void); -typedef ASIOError (*asioGetChannels) (long *numInputChannels, long *numOutputChannels); -typedef ASIOError (*asioGetLatencies) (long *inputLatency, long *outputLatency); -typedef ASIOError (*asioGetBufferSize) (long *minSize, long *maxSize, long *preferredSize, long *granularity); -typedef ASIOError (*asioCanSampleRate) (ASIOSampleRate sampleRate); -typedef ASIOError (*asioGetSampleRate) (ASIOSampleRate *currentRate); -typedef ASIOError (*asioSetSampleRate) (ASIOSampleRate sampleRate); -typedef ASIOError (*asioGetClockSources) (ASIOClockSource *clocks, long *numSources); -typedef ASIOError (*asioSetClockSource) (long reference); -typedef ASIOError (*asioGetSamplePosition) (ASIOSamples *sPos, ASIOTimeStamp *tStamp); -typedef ASIOError (*asioGetChannelInfo) (ASIOChannelInfo *info); -typedef ASIOError (*asioCreateBuffers) (ASIOBufferInfo *channelInfos, long numChannels, - long bufferSize, ASIOCallbacks *callbacks); -typedef ASIOError (*asioDisposeBuffers) (void); -typedef ASIOError (*asioControlPanel) (void); -typedef ASIOError (*asioFuture)(long selector, void *opt); -typedef ASIOError (*asioOutputReady) (void); - -static void *functionTable[kNumSymbols] = {0}; -static bool inited = false; - -//--------------------------------------------------------------------------------------------------------- - -#include - -bool resolveASIO(unsigned long aconnID) -{ - OSErr err; - CFragConnectionID connID = (CFragConnectionID)aconnID; - CFragSymbolClass symClass; - Ptr symAddr = nil; - Str255 myName; - long myCount = 0; - - err = CountSymbols(connID, &myCount); - if(err != noErr || myCount < (kRequiredSymbols + 1)) // there must be a main() - return false; - - long n, c = 0; - for(n = kRequiredSymbols; n < kNumSymbols; n++) - functionTable[n] = 0; - for(n = 0; n < myCount; n++) - { - // we can't use FindSymbol(), as the compiler adds mangling - // (such as ASIOInit__Fv). also, the symbols don't appear - // in the order they are declared or implemented. - // so we use strncmp() - err = GetIndSymbol(connID, n, myName, &symAddr, &symClass); - if(err != noErr) - break; - PtoCstr(myName); - if(!strncmp((char *)myName, "main", 4L)) - c++; - else - { - for(long i = 0; i < kNumSymbols; i++) - { - long sc = strlen(asioTable[i]); - if(!strncmp((char *)myName, asioTable[i], sc)) - { - functionTable[i] = symAddr; - if(i < kRequiredSymbols) - c++; - break; - } - } - } - // if(c >= kNumSymbols + 1) - // break; - } - if(c >= kRequiredSymbols + 1) - { - inited = true; - return true; - } - return false; -} - -//--------------------------------------------------------------------------------------------------- -//--------------------------------------------------------------------------------------------------- - -#pragma export on - -static short curRes = 0; -#define saveRes() curRes = CurResFile() -#define restRes() UseResFile(curRes); - - -ASIOError ASIOInit(ASIODriverInfo *info) -{ - saveRes(); - strcpy(info->errorMessage, "No ASIO Driver could be Loaded!"); - if(!inited) - return ASE_NotPresent; - fasioInit f = (fasioInit)functionTable[kASIOInit]; - ASIOError e = (*f)(info); - restRes(); - return e; -} - -ASIOError ASIOExit(void) -{ - if(!inited) - return ASE_NotPresent; - saveRes(); - fasioExit f = (fasioExit)functionTable[kASIOExit]; - ASIOError e = (*f)(); - restRes(); - return e; -} - -ASIOError ASIOStart(void) -{ - if(!inited) - return ASE_NotPresent; - fasioStart f = (fasioStart)functionTable[kASIOStart]; - return (*f)(); -} - -ASIOError ASIOStop(void) -{ - if(!inited) - return ASE_NotPresent; - fasioStop f = (fasioStop)functionTable[kASIOStop]; - return (*f)(); -} - -ASIOError ASIOGetChannels(long *numInputChannels, long *numOutputChannels) -{ - if(!inited) - return ASE_NotPresent; - asioGetChannels f = (asioGetChannels)functionTable[kASIOGetChannels]; - return (*f)(numInputChannels, numOutputChannels); -} - -ASIOError ASIOGetLatencies(long *inputLatency, long *outputLatency) -{ - if(!inited) - return ASE_NotPresent; - asioGetLatencies f = (asioGetLatencies)functionTable[kASIOGetLatencies]; - return (*f)(inputLatency, outputLatency); -} - -ASIOError ASIOGetBufferSize(long *minSize, long *maxSize, long *preferredSize, long *granularity) -{ - if(!inited) - return ASE_NotPresent; - asioGetBufferSize f = (asioGetBufferSize)functionTable[kASIOGetBufferSize]; - return (*f)(minSize, maxSize, preferredSize, granularity); -} - -ASIOError ASIOCanSampleRate(ASIOSampleRate sampleRate) -{ - if(!inited) - return ASE_NotPresent; - asioCanSampleRate f = (asioCanSampleRate)functionTable[kASIOCanSampleRate]; - return (*f)(sampleRate); -} - -ASIOError ASIOGetSampleRate(ASIOSampleRate *currentRate) -{ - if(!inited) - return ASE_NotPresent; - asioGetSampleRate f = (asioGetSampleRate)functionTable[kASIOGetSampleRate]; - return (*f)(currentRate); -} - -ASIOError ASIOSetSampleRate(ASIOSampleRate sampleRate) -{ - if(!inited) - return ASE_NotPresent; - asioSetSampleRate f = (asioSetSampleRate)functionTable[kASIOSetSampleRate]; - return (*f)(sampleRate); -} - -ASIOError ASIOGetClockSources(ASIOClockSource *clocks, long *numSources) -{ - if(!inited) - return ASE_NotPresent; - asioGetClockSources f = (asioGetClockSources)functionTable[kASIOGetClockSources]; - return (*f)(clocks, numSources); -} - -ASIOError ASIOSetClockSource(long reference) -{ - if(!inited) - return ASE_NotPresent; - asioSetClockSource f = (asioSetClockSource)functionTable[kASIOSetClockSource]; - return (*f)(reference); -} - -ASIOError ASIOGetSamplePosition(ASIOSamples *sPos, ASIOTimeStamp *tStamp) -{ - if(!inited) - return ASE_NotPresent; - asioGetSamplePosition f = (asioGetSamplePosition)functionTable[kASIOGetSamplePosition]; - return (*f)(sPos, tStamp); -} - -ASIOError ASIOGetChannelInfo(ASIOChannelInfo *info) -{ - if(!inited) - return ASE_NotPresent; - asioGetChannelInfo f = (asioGetChannelInfo)functionTable[kASIOGetChannelInfo]; - return (*f)(info); -} - -ASIOError ASIOCreateBuffers(ASIOBufferInfo *channelInfos, long numChannels, long bufferSize, ASIOCallbacks *callbacks) -{ - if(!inited) - return ASE_NotPresent; - saveRes(); - asioCreateBuffers f = (asioCreateBuffers)functionTable[kASIOCreateBuffers]; - ASIOError e = (*f)(channelInfos, numChannels, bufferSize, callbacks); - restRes(); - return e; -} - -ASIOError ASIODisposeBuffers(void) -{ - if(!inited) - return ASE_NotPresent; - asioDisposeBuffers f = (asioDisposeBuffers)functionTable[kASIODisposeBuffers]; - return (*f)(); -} - -ASIOError ASIOControlPanel(void) -{ - if(!inited) - return ASE_NotPresent; - saveRes(); - asioControlPanel f = (asioControlPanel)functionTable[kASIOControlPanel]; - ASIOError e = (*f)(); - restRes(); - return e; -} - -ASIOError ASIOFuture(long selector, void *opt) -{ - if(!inited) - return 0; - saveRes(); - asioFuture f = (asioFuture)functionTable[kASIOFuture]; - ASIOError e = (*f)(selector, opt); - restRes(); - return e; -} - -ASIOError ASIOOutputReady(void) -{ - asioOutputReady f = (asioControlPanel)functionTable[kASIOOutputReady]; - if(!inited || !f) - return ASE_NotPresent; - return (*f)(); -} - -#pragma export off - -#endif // ASIOINCLUDED - diff --git a/src/hostapi/asio/ASIOSDK/host/mac/codefragments.cpp b/src/hostapi/asio/ASIOSDK/host/mac/codefragments.cpp deleted file mode 100644 index 6b3cb07..0000000 --- a/src/hostapi/asio/ASIOSDK/host/mac/codefragments.cpp +++ /dev/null @@ -1,349 +0,0 @@ -// very MAC specific; generic code fragment handler -#include "ginclude.h" -#include -#include -#include -#include -#include "CodeFragments.hpp" - -enum -{ - kNewCFragCopy = kPrivateCFragCopy -}; - -class CodeFragmentInstance -{ -private: -friend class CodeFragment; - CodeFragmentInstance() {next = 0; handle = 0; connID = (void*)-1;} - ~CodeFragmentInstance() {CloseConnection((CFragConnectionID*)&connID); DisposeHandle(handle);} - - CodeFragmentInstance *next; - Handle handle; - void* connID; -}; - -class CodeFragment -{ -public: - CodeFragment(); - ~CodeFragment(); - - bool newInstance(void** cID); - void removeInstance(void* id); - bool getName(char *name) {if(!resName[0]) return false; strcpy(name, resName); return true;} - -private: -friend class CodeFragments; - - CodeFragment *next; - CodeFragmentInstance *root; - Handle handle; - long numInstances; - long index; - char resName[64]; -}; - -//------------------------------------------------------------------------------------------ - -CodeFragment::CodeFragment() -{ - next = 0; - root = 0; - handle = 0; - numInstances = 0; - index = 0; - resName[0] = 0; -} - -CodeFragment::~CodeFragment() -{ - // could delete all instances - // rather omit it... -} - -bool CodeFragment::newInstance(void** cID) -{ - Ptr myMainAddr; - Str255 myErrName; - char pname[256]; - - *cID = (void*)-1; - if(!handle) - return false; - CodeFragmentInstance *c = new CodeFragmentInstance(); - if(!c) - return false; - c->handle = this->handle; - OSErr err = HandToHand(&c->handle); - if(err == noErr) - { - // use fragment loader - myMainAddr = 0; - strcpy(pname, resName); - CtoPstr(pname); - err = GetMemFragment(*handle, GetHandleSize(handle), - (unsigned char *)pname, kNewCFragCopy, (CFragConnectionID*)&c->connID, - &myMainAddr, myErrName); - if(err == noErr && myMainAddr) - { - if(!root) - root = c; - else - { - CodeFragmentInstance *cc = root; - while(cc->next) - cc = cc->next; - cc->next = c; - } - numInstances++; - *cID = c->connID; - return true; - } - } - return false; -} - -void CodeFragment::removeInstance(void* id) -{ - CodeFragmentInstance *c = root, *last = root; - while(c) - { - if(c->connID == id) - { - if(c == root) - root = root->next; - else - last->next = c->next; - delete c; - numInstances--; - return; - } - last = c; - c = c->next; - } -} - -//---------------------------------------------------------------------------------------- -//---------------------------------------------------------------------------------------- - -CodeFragments::CodeFragments(char *folderName, long fileType, long resType) -{ - root = 0; - numFragments = 0; - gARefNum = -1; - - if(setFolder(folderName)) - { - loadFragments(gARefNum, fileType, resType); - SetVol(0L, defVol); - } -} - -CodeFragments::~CodeFragments() -{ - while(root) - { - CodeFragment *c = root->next; - delete root; - root = c; - } -} - -bool CodeFragments::newInstance(long index, unsigned long* cID) -{ - *cID = -1; - CodeFragment *c = root; - while(c) - { - if(c->index == index) - return c->newInstance((void**)cID); - c = c->next; - } - return false; -} - -void CodeFragments::removeInstance(long index, unsigned long cID) -{ - CodeFragment *c = root; - while(c) - { - if(c->index == index) - { - c->removeInstance((void*)cID); - break; - } - c = c->next; - } -} - -bool CodeFragments::getName(long index, char *name) -{ - CodeFragment *c = root; - while(c) - { - if(c->index == index) - { - strcpy(name, c->resName); - return true; - } - c = c->next; - } - return false; -} - -//------------------------------------------------------------------------------------ -// private - -void CodeFragments::loadFragments(short folderRef, long fileType, long resType) -{ - Str255 fileName; - HFileParam parmblock; - short resRef,index = 1,lindex; - short resID; - ResType resourceType; - Str255 resName; - Handle h; - short curResFile = CurResFile(); - - while(true) - { - // find any file in the folder - memset (&parmblock,0,(long)sizeof(HFileParam)); - parmblock.ioNamePtr = fileName; - parmblock.ioVRefNum = folderRef; - parmblock.ioFDirIndex = index; - if(PBHGetFInfoSync ((HParmBlkPtr)&parmblock) != noErr) - break; - - // see if the file type matches - if(parmblock.ioFlFndrInfo.fdType == fileType) - { - resRef = OpenResFile(fileName); - if(ResError()==noErr) - { - UseResFile(resRef); - lindex = 1; - // search resources in the file found which match - while(true) - { - h = Get1IndResource(resType, lindex); - if(h) - { - CodeFragment *c = new CodeFragment; - if(!root) - root = c; - else - { - CodeFragment *cc = root; - while(cc->next) - cc = cc->next; - cc->next = c; - } - GetResInfo(h, &resID, &resourceType, resName); - // PtoCstr(fileName); - // strcpy(c->fileName, (char *)fileName); - PtoCstr(resName); - strcpy(c->resName, (char*)resName); - DetachResource(h); - HLockHi(h); - c->handle = h; - c->index = numFragments; - numFragments++; - } - else - break; - lindex++; - } - CloseResFile(resRef); - } - } - index++; - } - UseResFile(curResFile); -} - -//----------------------------------------------------------------------------------------- - -bool CodeFragments::setFolder(char *folderName) -{ - FSSpec fss; - - if(gARefNum == -1) - { - if(!getFrontProcessDirectory(&fss)) - return false; - if(!openFragmentFolder(&fss, folderName, &gARefNum)) - return false; - } - defVol = getDefVol(); - SetVol(0L, gARefNum); - return true; -} - -bool CodeFragments::getFrontProcessDirectory(void *specs) -{ - FSSpec *fss = (FSSpec *)specs; - ProcessInfoRec pif; - ProcessSerialNumber psn; - - memset(&psn,0,(long)sizeof(ProcessSerialNumber)); - if(GetFrontProcess(&psn) == noErr) - { - pif.processName = 0; //(StringPtr)name; - pif.processAppSpec = fss; - pif.processInfoLength = sizeof(ProcessInfoRec); - if(GetProcessInformation(&psn, &pif) == noErr) - return true; - } - return false; -} - -bool CodeFragments::openFragmentFolder(void *specs, char *foldername, short *found_vref) -{ - FSSpec *fss = (FSSpec *)specs; - WDPBRec funcparms,homefolder; - HFileInfo my_funcfolder; - char funcFolder_name[32]; - - *found_vref = -1; - strcpy(funcFolder_name,foldername); - CtoPstr(funcFolder_name); - - memset (&homefolder,0,(long)sizeof(WDPBRec)); - homefolder.ioVRefNum = fss->vRefNum; - homefolder.ioWDDirID = fss->parID; - if(PBOpenWDSync(&homefolder) != noErr) - return false; - memset(&my_funcfolder,0,(long)sizeof(CInfoPBRec)); - my_funcfolder.ioNamePtr = (StringPtr)funcFolder_name; - my_funcfolder.ioVRefNum = homefolder.ioVRefNum; - if(PBGetCatInfoSync((CInfoPBPtr)&my_funcfolder) != noErr) - { - PBCloseWDSync(&homefolder); - return false; - } - memset (&funcparms,0,(long)sizeof(WDPBRec)); - funcparms.ioWDProcID = 'stCA'; - funcparms.ioVRefNum = my_funcfolder.ioVRefNum; - funcparms.ioWDDirID = my_funcfolder.ioDirID; - if(PBOpenWDSync(&funcparms) != noErr) - { - PBCloseWDSync(&homefolder); - return false; - } - PBCloseWDSync(&homefolder); - *found_vref = funcparms.ioVRefNum; - return true; -} - -short CodeFragments::getDefVol() -{ - unsigned char text[32]; - short vol_ref = 0; - - *text=0; - if(GetVol(text, &vol_ref) == noErr) - return (vol_ref); - return 0; -} diff --git a/src/hostapi/asio/ASIOSDK/host/mac/codefragments.hpp b/src/hostapi/asio/ASIOSDK/host/mac/codefragments.hpp deleted file mode 100644 index 2eb6ba2..0000000 --- a/src/hostapi/asio/ASIOSDK/host/mac/codefragments.hpp +++ /dev/null @@ -1,30 +0,0 @@ -#ifndef __CodeFragments__ -#define __CodeFragments__ - -class CodeFragment; - -class CodeFragments -{ -public: - CodeFragments(char *folderName, long fileType, long resType); - ~CodeFragments(); - - long getNumFragments() {return numFragments;} - bool newInstance(long index, unsigned long *cID); - void removeInstance(long index, unsigned long cID); - bool getName(long index, char *name); - -protected: - void loadFragments(short folderRef, long fileType, long resType); - bool setFolder(char *folderName); - bool openFragmentFolder(void *specs, char *foldername, short *found_vref); - bool getFrontProcessDirectory(void *specs); - short getDefVol(); - - CodeFragment *root; - long numFragments; - short gARefNum; - short defVol; -}; - -#endif diff --git a/src/hostapi/asio/ASIOSDK/host/pc/asiolist.cpp b/src/hostapi/asio/ASIOSDK/host/pc/asiolist.cpp deleted file mode 100644 index 88b1632..0000000 --- a/src/hostapi/asio/ASIOSDK/host/pc/asiolist.cpp +++ /dev/null @@ -1,268 +0,0 @@ -#include -#include "iasiodrv.h" -#include "asiolist.h" - -#define ASIODRV_DESC "description" -#define INPROC_SERVER "InprocServer32" -#define ASIO_PATH "software\\asio" -#define COM_CLSID "clsid" - -// ****************************************************************** -// Local Functions -// ****************************************************************** -static LONG findDrvPath (char *clsidstr,char *dllpath,int dllpathsize) -{ - HKEY hkEnum,hksub,hkpath; - char databuf[512]; - LONG cr,rc = -1; - DWORD datatype,datasize; - DWORD index; - OFSTRUCT ofs; - HFILE hfile; - BOOL found = FALSE; - - CharLowerBuff(clsidstr,strlen(clsidstr)); - if ((cr = RegOpenKey(HKEY_CLASSES_ROOT,COM_CLSID,&hkEnum)) == ERROR_SUCCESS) { - - index = 0; - while (cr == ERROR_SUCCESS && !found) { - cr = RegEnumKey(hkEnum,index++,(LPTSTR)databuf,512); - if (cr == ERROR_SUCCESS) { - CharLowerBuff(databuf,strlen(databuf)); - if (!(strcmp(databuf,clsidstr))) { - if ((cr = RegOpenKeyEx(hkEnum,(LPCTSTR)databuf,0,KEY_READ,&hksub)) == ERROR_SUCCESS) { - if ((cr = RegOpenKeyEx(hksub,(LPCTSTR)INPROC_SERVER,0,KEY_READ,&hkpath)) == ERROR_SUCCESS) { - datatype = REG_SZ; datasize = (DWORD)dllpathsize; - cr = RegQueryValueEx(hkpath,0,0,&datatype,(LPBYTE)dllpath,&datasize); - if (cr == ERROR_SUCCESS) { - memset(&ofs,0,sizeof(OFSTRUCT)); - ofs.cBytes = sizeof(OFSTRUCT); - hfile = OpenFile(dllpath,&ofs,OF_EXIST); - if (hfile) rc = 0; - } - RegCloseKey(hkpath); - } - RegCloseKey(hksub); - } - found = TRUE; // break out - } - } - } - RegCloseKey(hkEnum); - } - return rc; -} - - -static LPASIODRVSTRUCT newDrvStruct (HKEY hkey,char *keyname,int drvID,LPASIODRVSTRUCT lpdrv) -{ - HKEY hksub; - char databuf[256]; - char dllpath[MAXPATHLEN]; - WORD wData[100]; - CLSID clsid; - DWORD datatype,datasize; - LONG cr,rc; - - if (!lpdrv) { - if ((cr = RegOpenKeyEx(hkey,(LPCTSTR)keyname,0,KEY_READ,&hksub)) == ERROR_SUCCESS) { - - datatype = REG_SZ; datasize = 256; - cr = RegQueryValueEx(hksub,COM_CLSID,0,&datatype,(LPBYTE)databuf,&datasize); - if (cr == ERROR_SUCCESS) { - rc = findDrvPath (databuf,dllpath,MAXPATHLEN); - if (rc == 0) { - lpdrv = new ASIODRVSTRUCT[1]; - if (lpdrv) { - memset(lpdrv,0,sizeof(ASIODRVSTRUCT)); - lpdrv->drvID = drvID; - MultiByteToWideChar(CP_ACP,0,(LPCSTR)databuf,-1,(LPWSTR)wData,100); - if ((cr = CLSIDFromString((LPOLESTR)wData,(LPCLSID)&clsid)) == S_OK) { - memcpy(&lpdrv->clsid,&clsid,sizeof(CLSID)); - } - - datatype = REG_SZ; datasize = 256; - cr = RegQueryValueEx(hksub,ASIODRV_DESC,0,&datatype,(LPBYTE)databuf,&datasize); - if (cr == ERROR_SUCCESS) { - strcpy(lpdrv->drvname,databuf); - } - else strcpy(lpdrv->drvname,keyname); - } - } - } - RegCloseKey(hksub); - } - } - else lpdrv->next = newDrvStruct(hkey,keyname,drvID+1,lpdrv->next); - - return lpdrv; -} - -static void deleteDrvStruct (LPASIODRVSTRUCT lpdrv) -{ - IASIO *iasio; - - if (lpdrv != 0) { - deleteDrvStruct(lpdrv->next); - if (lpdrv->asiodrv) { - iasio = (IASIO *)lpdrv->asiodrv; - iasio->Release(); - } - delete lpdrv; - } -} - - -static LPASIODRVSTRUCT getDrvStruct (int drvID,LPASIODRVSTRUCT lpdrv) -{ - while (lpdrv) { - if (lpdrv->drvID == drvID) return lpdrv; - lpdrv = lpdrv->next; - } - return 0; -} -// ****************************************************************** - - -// ****************************************************************** -// AsioDriverList -// ****************************************************************** -AsioDriverList::AsioDriverList () -{ - HKEY hkEnum = 0; - char keyname[MAXDRVNAMELEN]; - LPASIODRVSTRUCT pdl; - LONG cr; - DWORD index = 0; - BOOL fin = FALSE; - - numdrv = 0; - lpdrvlist = 0; - - cr = RegOpenKey(HKEY_LOCAL_MACHINE,ASIO_PATH,&hkEnum); - while (cr == ERROR_SUCCESS) { - if ((cr = RegEnumKey(hkEnum,index++,(LPTSTR)keyname,MAXDRVNAMELEN))== ERROR_SUCCESS) { - lpdrvlist = newDrvStruct (hkEnum,keyname,0,lpdrvlist); - } - else fin = TRUE; - } - if (hkEnum) RegCloseKey(hkEnum); - - pdl = lpdrvlist; - while (pdl) { - numdrv++; - pdl = pdl->next; - } - - if (numdrv) CoInitialize(0); // initialize COM -} - -AsioDriverList::~AsioDriverList () -{ - if (numdrv) { - deleteDrvStruct(lpdrvlist); - CoUninitialize(); - } -} - - -LONG AsioDriverList::asioGetNumDev (VOID) -{ - return (LONG)numdrv; -} - - -LONG AsioDriverList::asioOpenDriver (int drvID,LPVOID *asiodrv) -{ - LPASIODRVSTRUCT lpdrv = 0; - long rc; - - if (!asiodrv) return DRVERR_INVALID_PARAM; - - if ((lpdrv = getDrvStruct(drvID,lpdrvlist)) != 0) { - if (!lpdrv->asiodrv) { - rc = CoCreateInstance(lpdrv->clsid,0,CLSCTX_INPROC_SERVER,lpdrv->clsid,asiodrv); - if (rc == S_OK) { - lpdrv->asiodrv = *asiodrv; - return 0; - } - // else if (rc == REGDB_E_CLASSNOTREG) - // strcpy (info->messageText, "Driver not registered in the Registration Database!"); - } - else rc = DRVERR_DEVICE_ALREADY_OPEN; - } - else rc = DRVERR_DEVICE_NOT_FOUND; - - return rc; -} - - -LONG AsioDriverList::asioCloseDriver (int drvID) -{ - LPASIODRVSTRUCT lpdrv = 0; - IASIO *iasio; - - if ((lpdrv = getDrvStruct(drvID,lpdrvlist)) != 0) { - if (lpdrv->asiodrv) { - iasio = (IASIO *)lpdrv->asiodrv; - iasio->Release(); - lpdrv->asiodrv = 0; - } - } - - return 0; -} - -LONG AsioDriverList::asioGetDriverName (int drvID,char *drvname,int drvnamesize) -{ - LPASIODRVSTRUCT lpdrv = 0; - - if (!drvname) return DRVERR_INVALID_PARAM; - - if ((lpdrv = getDrvStruct(drvID,lpdrvlist)) != 0) { - if (strlen(lpdrv->drvname) < (unsigned int)drvnamesize) { - strcpy(drvname,lpdrv->drvname); - } - else { - memcpy(drvname,lpdrv->drvname,drvnamesize-4); - drvname[drvnamesize-4] = '.'; - drvname[drvnamesize-3] = '.'; - drvname[drvnamesize-2] = '.'; - drvname[drvnamesize-1] = 0; - } - return 0; - } - return DRVERR_DEVICE_NOT_FOUND; -} - -LONG AsioDriverList::asioGetDriverPath (int drvID,char *dllpath,int dllpathsize) -{ - LPASIODRVSTRUCT lpdrv = 0; - - if (!dllpath) return DRVERR_INVALID_PARAM; - - if ((lpdrv = getDrvStruct(drvID,lpdrvlist)) != 0) { - if (strlen(lpdrv->dllpath) < (unsigned int)dllpathsize) { - strcpy(dllpath,lpdrv->dllpath); - return 0; - } - dllpath[0] = 0; - return DRVERR_INVALID_PARAM; - } - return DRVERR_DEVICE_NOT_FOUND; -} - -LONG AsioDriverList::asioGetDriverCLSID (int drvID,CLSID *clsid) -{ - LPASIODRVSTRUCT lpdrv = 0; - - if (!clsid) return DRVERR_INVALID_PARAM; - - if ((lpdrv = getDrvStruct(drvID,lpdrvlist)) != 0) { - memcpy(clsid,&lpdrv->clsid,sizeof(CLSID)); - return 0; - } - return DRVERR_DEVICE_NOT_FOUND; -} - - diff --git a/src/hostapi/asio/ASIOSDK/host/pc/asiolist.h b/src/hostapi/asio/ASIOSDK/host/pc/asiolist.h deleted file mode 100644 index 1f504af..0000000 --- a/src/hostapi/asio/ASIOSDK/host/pc/asiolist.h +++ /dev/null @@ -1,46 +0,0 @@ -#ifndef __asiolist__ -#define __asiolist__ - -#define DRVERR -5000 -#define DRVERR_INVALID_PARAM DRVERR-1 -#define DRVERR_DEVICE_ALREADY_OPEN DRVERR-2 -#define DRVERR_DEVICE_NOT_FOUND DRVERR-3 - -#define MAXPATHLEN 512 -#define MAXDRVNAMELEN 128 - -struct asiodrvstruct -{ - int drvID; - CLSID clsid; - char dllpath[MAXPATHLEN]; - char drvname[MAXDRVNAMELEN]; - LPVOID asiodrv; - struct asiodrvstruct *next; -}; - -typedef struct asiodrvstruct ASIODRVSTRUCT; -typedef ASIODRVSTRUCT *LPASIODRVSTRUCT; - -class AsioDriverList { -public: - AsioDriverList(); - ~AsioDriverList(); - - LONG asioOpenDriver (int,VOID **); - LONG asioCloseDriver (int); - - // nice to have - LONG asioGetNumDev (VOID); - LONG asioGetDriverName (int,char *,int); - LONG asioGetDriverPath (int,char *,int); - LONG asioGetDriverCLSID (int,CLSID *); - - // or use directly access - LPASIODRVSTRUCT lpdrvlist; - int numdrv; -}; - -typedef class AsioDriverList *LPASIODRIVERLIST; - -#endif diff --git a/src/hostapi/asio/ASIOSDK/host/sample/hostsample.cpp b/src/hostapi/asio/ASIOSDK/host/sample/hostsample.cpp deleted file mode 100644 index 16283bc..0000000 --- a/src/hostapi/asio/ASIOSDK/host/sample/hostsample.cpp +++ /dev/null @@ -1,526 +0,0 @@ -// hostsample.cpp : a simple ASIO host example. -// - instantiates the driver -// - get the information from the driver -// - built up some audio channels -// - plays silence for 20 seconds -// - destruct the driver -// Note: This sample cannot work with the "ASIO DirectX Driver" as it does -// not have a valid Application Window handle, which is used as sysRef -// on the Windows platform. - -#include -#include -#include "asiosys.h" -#include "asio.h" -#include "asiodrivers.h" - -// name of the ASIO device to be used -#if WINDOWS -// #define ASIO_DRIVER_NAME "ASIO Multimedia Driver" - #define ASIO_DRIVER_NAME "ASIO Sample" -#elif MAC -// #define ASIO_DRIVER_NAME "Apple Sound Manager" - #define ASIO_DRIVER_NAME "ASIO Sample" -#endif - -#define TEST_RUN_TIME 20.0 // run for 20 seconds - - -enum { - // number of input and outputs supported by the host application - // you can change these to higher or lower values - kMaxInputChannels = 32, - kMaxOutputChannels = 32 -}; - - -// internal data storage -typedef struct DriverInfo -{ - // ASIOInit() - ASIODriverInfo driverInfo; - - // ASIOGetChannels() - long inputChannels; - long outputChannels; - - // ASIOGetBufferSize() - long minSize; - long maxSize; - long preferredSize; - long granularity; - - // ASIOGetSampleRate() - ASIOSampleRate sampleRate; - - // ASIOOutputReady() - bool postOutput; - - // ASIOGetLatencies () - long inputLatency; - long outputLatency; - - // ASIOCreateBuffers () - long inputBuffers; // becomes number of actual created input buffers - long outputBuffers; // becomes number of actual created output buffers - ASIOBufferInfo bufferInfos[kMaxInputChannels + kMaxOutputChannels]; // buffer info's - - // ASIOGetChannelInfo() - ASIOChannelInfo channelInfos[kMaxInputChannels + kMaxOutputChannels]; // channel info's - // The above two arrays share the same indexing, as the data in them are linked together - - // Information from ASIOGetSamplePosition() - // data is converted to double floats for easier use, however 64 bit integer can be used, too - double nanoSeconds; - double samples; - double tcSamples; // time code samples - - // bufferSwitchTimeInfo() - ASIOTime tInfo; // time info state - unsigned long sysRefTime; // system reference time, when bufferSwitch() was called - - // Signal the end of processing in this example - bool stopped; -} DriverInfo; - - -DriverInfo asioDriverInfo = {0}; -ASIOCallbacks asioCallbacks; - -//---------------------------------------------------------------------------------- -// some external references -extern AsioDrivers* asioDrivers; -bool loadAsioDriver(char *name); - -// internal prototypes (required for the Metrowerks CodeWarrior compiler) -int main(int argc, char* argv[]); -long init_asio_static_data (DriverInfo *asioDriverInfo); -ASIOError create_asio_buffers (DriverInfo *asioDriverInfo); -unsigned long get_sys_reference_time(); - - -// callback prototypes -void bufferSwitch(long index, ASIOBool processNow); -ASIOTime *bufferSwitchTimeInfo(ASIOTime *timeInfo, long index, ASIOBool processNow); -void sampleRateChanged(ASIOSampleRate sRate); -long asioMessages(long selector, long value, void* message, double* opt); - - - -//---------------------------------------------------------------------------------- -long init_asio_static_data (DriverInfo *asioDriverInfo) -{ // collect the informational data of the driver - // get the number of available channels - if(ASIOGetChannels(&asioDriverInfo->inputChannels, &asioDriverInfo->outputChannels) == ASE_OK) - { - printf ("ASIOGetChannels (inputs: %d, outputs: %d);\n", asioDriverInfo->inputChannels, asioDriverInfo->outputChannels); - - // get the usable buffer sizes - if(ASIOGetBufferSize(&asioDriverInfo->minSize, &asioDriverInfo->maxSize, &asioDriverInfo->preferredSize, &asioDriverInfo->granularity) == ASE_OK) - { - printf ("ASIOGetBufferSize (min: %d, max: %d, preferred: %d, granularity: %d);\n", - asioDriverInfo->minSize, asioDriverInfo->maxSize, - asioDriverInfo->preferredSize, asioDriverInfo->granularity); - - // get the currently selected sample rate - if(ASIOGetSampleRate(&asioDriverInfo->sampleRate) == ASE_OK) - { - printf ("ASIOGetSampleRate (sampleRate: %f);\n", asioDriverInfo->sampleRate); - if (asioDriverInfo->sampleRate <= 0.0 || asioDriverInfo->sampleRate > 96000.0) - { - // Driver does not store it's internal sample rate, so set it to a know one. - // Usually you should check beforehand, that the selected sample rate is valid - // with ASIOCanSampleRate(). - if(ASIOSetSampleRate(44100.0) == ASE_OK) - { - if(ASIOGetSampleRate(&asioDriverInfo->sampleRate) == ASE_OK) - printf ("ASIOGetSampleRate (sampleRate: %f);\n", asioDriverInfo->sampleRate); - else - return -6; - } - else - return -5; - } - - // check wether the driver requires the ASIOOutputReady() optimization - // (can be used by the driver to reduce output latency by one block) - if(ASIOOutputReady() == ASE_OK) - asioDriverInfo->postOutput = true; - else - asioDriverInfo->postOutput = false; - printf ("ASIOOutputReady(); - %s\n", asioDriverInfo->postOutput ? "Supported" : "Not supported"); - - return 0; - } - return -3; - } - return -2; - } - return -1; -} - - -//---------------------------------------------------------------------------------- -// conversion from 64 bit ASIOSample/ASIOTimeStamp to double float -#if NATIVE_INT64 - #define ASIO64toDouble(a) (a) -#else - const double twoRaisedTo32 = 4294967296.; - #define ASIO64toDouble(a) ((a).lo + (a).hi * twoRaisedTo32) -#endif - -ASIOTime *bufferSwitchTimeInfo(ASIOTime *timeInfo, long index, ASIOBool processNow) -{ // the actual processing callback. - // Beware that this is normally in a seperate thread, hence be sure that you take care - // about thread synchronization. This is omitted here for simplicity. - static long processedSamples = 0; - - // store the timeInfo for later use - asioDriverInfo.tInfo = *timeInfo; - - // get the time stamp of the buffer, not necessary if no - // synchronization to other media is required - if (timeInfo->timeInfo.flags & kSystemTimeValid) - asioDriverInfo.nanoSeconds = ASIO64toDouble(timeInfo->timeInfo.systemTime); - else - asioDriverInfo.nanoSeconds = 0; - - if (timeInfo->timeInfo.flags & kSamplePositionValid) - asioDriverInfo.samples = ASIO64toDouble(timeInfo->timeInfo.samplePosition); - else - asioDriverInfo.samples = 0; - - if (timeInfo->timeCode.flags & kTcValid) - asioDriverInfo.tcSamples = ASIO64toDouble(timeInfo->timeCode.timeCodeSamples); - else - asioDriverInfo.tcSamples = 0; - - // get the system reference time - asioDriverInfo.sysRefTime = get_sys_reference_time(); - -#if WINDOWS && _DEBUG - // a few debug messages for the Windows device driver developer - // tells you the time when driver got its interrupt and the delay until the app receives - // the event notification. - static double last_samples = 0; - char tmp[128]; - sprintf (tmp, "diff: %d / %d ms / %d ms / %d samples \n", asioDriverInfo.sysRefTime - (long)(asioDriverInfo.nanoSeconds / 1000000.0), asioDriverInfo.sysRefTime, (long)(asioDriverInfo.nanoSeconds / 1000000.0), (long)(asioDriverInfo.samples - last_samples)); - OutputDebugString (tmp); - last_samples = asioDriverInfo.samples; -#endif - - // buffer size in samples - long buffSize = asioDriverInfo.preferredSize; - - // perform the processing - for (int i = 0; i < asioDriverInfo.inputBuffers + asioDriverInfo.outputBuffers; i++) - { - if (asioDriverInfo.bufferInfos[i].isInput == false) - { - // OK do processing for the outputs only - switch (asioDriverInfo.channelInfos[i].type) - { - case ASIOSTInt16LSB: - memset (asioDriverInfo.bufferInfos[i].buffers[index], 0, buffSize * 2); - break; - case ASIOSTInt24LSB: // used for 20 bits as well - memset (asioDriverInfo.bufferInfos[i].buffers[index], 0, buffSize * 3); - break; - case ASIOSTInt32LSB: - memset (asioDriverInfo.bufferInfos[i].buffers[index], 0, buffSize * 4); - break; - case ASIOSTFloat32LSB: // IEEE 754 32 bit float, as found on Intel x86 architecture - memset (asioDriverInfo.bufferInfos[i].buffers[index], 0, buffSize * 4); - break; - case ASIOSTFloat64LSB: // IEEE 754 64 bit double float, as found on Intel x86 architecture - memset (asioDriverInfo.bufferInfos[i].buffers[index], 0, buffSize * 8); - break; - - // these are used for 32 bit data buffer, with different alignment of the data inside - // 32 bit PCI bus systems can more easily used with these - case ASIOSTInt32LSB16: // 32 bit data with 18 bit alignment - case ASIOSTInt32LSB18: // 32 bit data with 18 bit alignment - case ASIOSTInt32LSB20: // 32 bit data with 20 bit alignment - case ASIOSTInt32LSB24: // 32 bit data with 24 bit alignment - memset (asioDriverInfo.bufferInfos[i].buffers[index], 0, buffSize * 4); - break; - - case ASIOSTInt16MSB: - memset (asioDriverInfo.bufferInfos[i].buffers[index], 0, buffSize * 2); - break; - case ASIOSTInt24MSB: // used for 20 bits as well - memset (asioDriverInfo.bufferInfos[i].buffers[index], 0, buffSize * 3); - break; - case ASIOSTInt32MSB: - memset (asioDriverInfo.bufferInfos[i].buffers[index], 0, buffSize * 4); - break; - case ASIOSTFloat32MSB: // IEEE 754 32 bit float, as found on Intel x86 architecture - memset (asioDriverInfo.bufferInfos[i].buffers[index], 0, buffSize * 4); - break; - case ASIOSTFloat64MSB: // IEEE 754 64 bit double float, as found on Intel x86 architecture - memset (asioDriverInfo.bufferInfos[i].buffers[index], 0, buffSize * 8); - break; - - // these are used for 32 bit data buffer, with different alignment of the data inside - // 32 bit PCI bus systems can more easily used with these - case ASIOSTInt32MSB16: // 32 bit data with 18 bit alignment - case ASIOSTInt32MSB18: // 32 bit data with 18 bit alignment - case ASIOSTInt32MSB20: // 32 bit data with 20 bit alignment - case ASIOSTInt32MSB24: // 32 bit data with 24 bit alignment - memset (asioDriverInfo.bufferInfos[i].buffers[index], 0, buffSize * 4); - break; - } - } - } - - // finally if the driver supports the ASIOOutputReady() optimization, do it here, all data are in place - if (asioDriverInfo.postOutput) - ASIOOutputReady(); - - if (processedSamples >= asioDriverInfo.sampleRate * TEST_RUN_TIME) // roughly measured - asioDriverInfo.stopped = true; - else - processedSamples += buffSize; - - return 0L; -} - -//---------------------------------------------------------------------------------- -void bufferSwitch(long index, ASIOBool processNow) -{ // the actual processing callback. - // Beware that this is normally in a seperate thread, hence be sure that you take care - // about thread synchronization. This is omitted here for simplicity. - - // as this is a "back door" into the bufferSwitchTimeInfo a timeInfo needs to be created - // though it will only set the timeInfo.samplePosition and timeInfo.systemTime fields and the according flags - ASIOTime timeInfo; - memset (&timeInfo, 0, sizeof (timeInfo)); - - // get the time stamp of the buffer, not necessary if no - // synchronization to other media is required - if(ASIOGetSamplePosition(&timeInfo.timeInfo.samplePosition, &timeInfo.timeInfo.systemTime) == ASE_OK) - timeInfo.timeInfo.flags = kSystemTimeValid | kSamplePositionValid; - - bufferSwitchTimeInfo (&timeInfo, index, processNow); -} - - -//---------------------------------------------------------------------------------- -void sampleRateChanged(ASIOSampleRate sRate) -{ - // do whatever you need to do if the sample rate changed - // usually this only happens during external sync. - // Audio processing is not stopped by the driver, actual sample rate - // might not have even changed, maybe only the sample rate status of an - // AES/EBU or S/PDIF digital input at the audio device. - // You might have to update time/sample related conversion routines, etc. -} - -//---------------------------------------------------------------------------------- -long asioMessages(long selector, long value, void* message, double* opt) -{ - // currently the parameters "value", "message" and "opt" are not used. - long ret = 0; - switch(selector) - { - case kAsioSelectorSupported: - if(value == kAsioResetRequest - || value == kAsioEngineVersion - || value == kAsioResyncRequest - || value == kAsioLatenciesChanged - // the following three were added for ASIO 2.0, you don't necessarily have to support them - || value == kAsioSupportsTimeInfo - || value == kAsioSupportsTimeCode - || value == kAsioSupportsInputMonitor) - ret = 1L; - break; - case kAsioResetRequest: - // defer the task and perform the reset of the driver during the next "safe" situation - // You cannot reset the driver right now, as this code is called from the driver. - // Reset the driver is done by completely destruct is. I.e. ASIOStop(), ASIODisposeBuffers(), Destruction - // Afterwards you initialize the driver again. - asioDriverInfo.stopped; // In this sample the processing will just stop - ret = 1L; - break; - case kAsioResyncRequest: - // This informs the application, that the driver encountered some non fatal data loss. - // It is used for synchronization purposes of different media. - // Added mainly to work around the Win16Mutex problems in Windows 95/98 with the - // Windows Multimedia system, which could loose data because the Mutex was hold too long - // by another thread. - // However a driver can issue it in other situations, too. - ret = 1L; - break; - case kAsioLatenciesChanged: - // This will inform the host application that the drivers were latencies changed. - // Beware, it this does not mean that the buffer sizes have changed! - // You might need to update internal delay data. - ret = 1L; - break; - case kAsioEngineVersion: - // return the supported ASIO version of the host application - // If a host applications does not implement this selector, ASIO 1.0 is assumed - // by the driver - ret = 2L; - break; - case kAsioSupportsTimeInfo: - // informs the driver wether the asioCallbacks.bufferSwitchTimeInfo() callback - // is supported. - // For compatibility with ASIO 1.0 drivers the host application should always support - // the "old" bufferSwitch method, too. - ret = 1; - break; - case kAsioSupportsTimeCode: - // informs the driver wether application is interested in time code info. - // If an application does not need to know about time code, the driver has less work - // to do. - ret = 0; - break; - } - return ret; -} - - -//---------------------------------------------------------------------------------- -ASIOError create_asio_buffers (DriverInfo *asioDriverInfo) -{ // create buffers for all inputs and outputs of the card with the - // preferredSize from ASIOGetBufferSize() as buffer size - long i; - ASIOError result; - - // fill the bufferInfos from the start without a gap - ASIOBufferInfo *info = asioDriverInfo->bufferInfos; - - // prepare inputs (Though this is not necessaily required, no opened inputs will work, too - if (asioDriverInfo->inputChannels > kMaxInputChannels) - asioDriverInfo->inputBuffers = kMaxInputChannels; - else - asioDriverInfo->inputBuffers = asioDriverInfo->inputChannels; - for(i = 0; i < asioDriverInfo->inputBuffers; i++, info++) - { - info->isInput = ASIOTrue; - info->channelNum = i; - info->buffers[0] = info->buffers[1] = 0; - } - - // prepare outputs - if (asioDriverInfo->outputChannels > kMaxOutputChannels) - asioDriverInfo->outputBuffers = kMaxOutputChannels; - else - asioDriverInfo->outputBuffers = asioDriverInfo->outputChannels; - for(i = 0; i < asioDriverInfo->outputBuffers; i++, info++) - { - info->isInput = ASIOFalse; - info->channelNum = i; - info->buffers[0] = info->buffers[1] = 0; - } - - // create and activate buffers - result = ASIOCreateBuffers(asioDriverInfo->bufferInfos, - asioDriverInfo->inputBuffers + asioDriverInfo->outputBuffers, - asioDriverInfo->preferredSize, &asioCallbacks); - if (result == ASE_OK) - { - // now get all the buffer details, sample word length, name, word clock group and activation - for (i = 0; i < asioDriverInfo->inputBuffers + asioDriverInfo->outputBuffers; i++) - { - asioDriverInfo->channelInfos[i].channel = asioDriverInfo->bufferInfos[i].channelNum; - asioDriverInfo->channelInfos[i].isInput = asioDriverInfo->bufferInfos[i].isInput; - result = ASIOGetChannelInfo(&asioDriverInfo->channelInfos[i]); - if (result != ASE_OK) - break; - } - - if (result == ASE_OK) - { - // get the input and output latencies - // Latencies often are only valid after ASIOCreateBuffers() - // (input latency is the age of the first sample in the currently returned audio block) - // (output latency is the time the first sample in the currently returned audio block requires to get to the output) - result = ASIOGetLatencies(&asioDriverInfo->inputLatency, &asioDriverInfo->outputLatency); - if (result == ASE_OK) - printf ("ASIOGetLatencies (input: %d, output: %d);\n", asioDriverInfo->inputLatency, asioDriverInfo->outputLatency); - } - } - return result; -} - -int main(int argc, char* argv[]) -{ - // load the driver, this will setup all the necessary internal data structures - if (loadAsioDriver (ASIO_DRIVER_NAME)) - { - // initialize the driver - if (ASIOInit (&asioDriverInfo.driverInfo) == ASE_OK) - { - printf ("asioVersion: %d\n" - "driverVersion: %d\n" - "Name: %s\n" - "ErrorMessage: %s\n", - asioDriverInfo.driverInfo.asioVersion, asioDriverInfo.driverInfo.driverVersion, - asioDriverInfo.driverInfo.name, asioDriverInfo.driverInfo.errorMessage); - if (init_asio_static_data (&asioDriverInfo) == 0) - { - // ASIOControlPanel(); you might want to check wether the ASIOControlPanel() can open - - // set up the asioCallback structure and create the ASIO data buffer - asioCallbacks.bufferSwitch = &bufferSwitch; - asioCallbacks.sampleRateDidChange = &sampleRateChanged; - asioCallbacks.asioMessage = &asioMessages; - asioCallbacks.bufferSwitchTimeInfo = &bufferSwitchTimeInfo; - if (create_asio_buffers (&asioDriverInfo) == ASE_OK) - { - if (ASIOStart() == ASE_OK) - { - // Now all is up and running - fprintf (stdout, "\nASIO Driver started succefully.\n\n"); - while (!asioDriverInfo.stopped) - { -#if WINDOWS - Sleep(100); // goto sleep for 100 milliseconds -#elif MAC - unsigned long dummy; - Delay (6, &dummy); -#endif - fprintf (stdout, "%d ms / %d ms / %d samples", asioDriverInfo.sysRefTime, (long)(asioDriverInfo.nanoSeconds / 1000000.0), (long)asioDriverInfo.samples); - - // create a more readable time code format (the quick and dirty way) - double remainder = asioDriverInfo.tcSamples; - long hours = (long)(remainder / (asioDriverInfo.sampleRate * 3600)); - remainder -= hours * asioDriverInfo.sampleRate * 3600; - long minutes = (long)(remainder / (asioDriverInfo.sampleRate * 60)); - remainder -= minutes * asioDriverInfo.sampleRate * 60; - long seconds = (long)(remainder / asioDriverInfo.sampleRate); - remainder -= seconds * asioDriverInfo.sampleRate; - fprintf (stdout, " / TC: %2.2d:%2.2d:%2.2d:%5.5d", (long)hours, (long)minutes, (long)seconds, (long)remainder); - - fprintf (stdout, " \r"); - #if !MAC - fflush (stdout); - #endif - } - ASIOStop(); - } - ASIODisposeBuffers(); - } - } - ASIOExit(); - } - asioDrivers->removeCurrentDriver(); - } - return 0; -} - - -unsigned long get_sys_reference_time() -{ // get the system reference time -#if WINDOWS - return timeGetTime(); -#elif MAC -static const double twoRaisedTo32 = 4294967296.; - UnsignedWide ys; - Microseconds(&ys); - double r = ((double)ys.hi * twoRaisedTo32 + (double)ys.lo); - return (unsigned long)(r / 1000.); -#endif -} diff --git a/src/hostapi/asio/ASIOSDK/host/sample/hostsample.dsp b/src/hostapi/asio/ASIOSDK/host/sample/hostsample.dsp deleted file mode 100644 index 1c38f06..0000000 --- a/src/hostapi/asio/ASIOSDK/host/sample/hostsample.dsp +++ /dev/null @@ -1,134 +0,0 @@ -# Microsoft Developer Studio Project File - Name="hostsample" - Package Owner=<4> -# Microsoft Developer Studio Generated Build File, Format Version 6.00 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Console Application" 0x0103 - -CFG=hostsample - Win32 Debug -!MESSAGE This is not a valid makefile. To build this project using NMAKE, -!MESSAGE use the Export Makefile command and run -!MESSAGE -!MESSAGE NMAKE /f "hostsample.mak". -!MESSAGE -!MESSAGE You can specify a configuration when running NMAKE -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "hostsample.mak" CFG="hostsample - Win32 Debug" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "hostsample - Win32 Release" (based on "Win32 (x86) Console Application") -!MESSAGE "hostsample - Win32 Debug" (based on "Win32 (x86) Console Application") -!MESSAGE - -# Begin Project -# PROP AllowPerConfigDependencies 0 -# PROP Scc_ProjName "" -# PROP Scc_LocalPath "" -CPP=cl.exe -RSC=rc.exe - -!IF "$(CFG)" == "hostsample - Win32 Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "Release" -# PROP BASE Intermediate_Dir "Release" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "Release" -# PROP Intermediate_Dir "Release" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /Yu"stdafx.h" /FD /c -# ADD CPP /nologo /W3 /GX /O2 /I "../../common" /I "../../host" /I "../../host/pc" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c -# ADD BASE RSC /l 0x809 /d "NDEBUG" -# ADD RSC /l 0x809 /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib winmm.lib /nologo /subsystem:console /machine:I386 - -!ELSEIF "$(CFG)" == "hostsample - Win32 Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "Debug" -# PROP BASE Intermediate_Dir "Debug" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "Debug" -# PROP Intermediate_Dir "Debug" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /Yu"stdafx.h" /FD /GZ /c -# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "../../common" /I "../../host" /I "../../host/pc" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /FR /YX /FD /GZ /c -# ADD BASE RSC /l 0x809 /d "_DEBUG" -# ADD RSC /l 0x809 /d "_DEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib winmm.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept - -!ENDIF - -# Begin Target - -# Name "hostsample - Win32 Release" -# Name "hostsample - Win32 Debug" -# Begin Group "Source Files" - -# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" -# Begin Source File - -SOURCE=..\..\common\asio.cpp -# End Source File -# Begin Source File - -SOURCE=..\asiodrivers.cpp -# End Source File -# Begin Source File - -SOURCE=..\pc\asiolist.cpp -# End Source File -# Begin Source File - -SOURCE=.\hostsample.cpp -# End Source File -# End Group -# Begin Group "Header Files" - -# PROP Default_Filter "h;hpp;hxx;hm;inl" -# Begin Source File - -SOURCE=..\..\common\asio.h -# End Source File -# Begin Source File - -SOURCE=..\asiodrivers.h -# End Source File -# Begin Source File - -SOURCE=..\pc\asiolist.h -# End Source File -# Begin Source File - -SOURCE=..\ginclude.h -# End Source File -# End Group -# Begin Group "Resource Files" - -# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" -# End Group -# Begin Source File - -SOURCE=.\ReadMe.txt -# End Source File -# End Target -# End Project diff --git a/src/hostapi/asio/ASIOSDK/host/sample/hostsample.vcproj b/src/hostapi/asio/ASIOSDK/host/sample/hostsample.vcproj deleted file mode 100644 index 130fc5c..0000000 --- a/src/hostapi/asio/ASIOSDK/host/sample/hostsample.vcproj +++ /dev/null @@ -1,571 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/hostapi/asio/ASIOSDK/readme.txt b/src/hostapi/asio/ASIOSDK/readme.txt deleted file mode 100644 index 35f62e6..0000000 --- a/src/hostapi/asio/ASIOSDK/readme.txt +++ /dev/null @@ -1,55 +0,0 @@ -ASIO 2.3 SDK Contents ---------------------- - -readme.txt - this file -changes.txt - contains change information between - SDK releases -ASIO SDK 2.3.pdf - ASIO SDK 2.3 specification -Steinberg ASIO Licensing Agreement.pdf - Licencing Agreement - -common: -asio.h - ASIO C definition -iasiodrv.h - interface definition for the ASIO driver class -asio.cpp - asio host interface (not used on Mac) -asiodrvr.h -asiodrvr.cpp - ASIO driver class base definition -combase.h -combase.cpp - COM base definitions (PC only) -dllentry.cpp - DLL functions (PC only) -register.cpp - driver self registration functionality -wxdebug.h -debugmessage.cpp - some debugging help - -host: -asiodrivers.h -asiodrivers.cpp - ASIO driver managment (enumeration and instantiation) -ASIOConvertSamples.h -ASIOConvertSamples.cpp - sample data format conversion class -ginclude.h - platform specific definitions - -host/mac: -asioshlib.cpp - asio.cpp for the Mac, resolves the symbols -codefragments.hpp -codefragments.cpp - code fragment loader - -host/pc: -asiolist.h -asiolist.cpp - instantiates an ASIO driver via the COM model - -host/sample: -hostsample.cpp - a simple console app which shows ASIO hosting -hostsample.dsp - MSVC++ 5.0 project -hostsample.vcproj - Visual Studio 2005 project (32 and 64 bit targets) - -driver/asiosample: -asiosmpl.h -asiosmpl.cpp - ASIO 2.0 sample driver -wintimer.cpp - bufferSwitch() wakeup thread (Windows) -asiosample.def - Windows DLL module export definition -mactimer.cpp - bufferSwitch() wakeup thread (Macintosh) -macnanosecs.cpp - Macintosh system reference time -makesamp.cpp - Macintosh driver object instantiation - -driver/asiosample/asiosample: -asiosample.dsp - MSVC++ 5.0 project -asiosample.vcproj - Visual Studio 2005 project (32 and 64 bit targets) diff --git a/src/hostapi/asio/asiosdk2.3.zip b/src/hostapi/asio/asiosdk2.3.zip deleted file mode 100644 index fc513a0ba678d5503ac92b96b612794d60e6f094..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 422934 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

///

-/// This documentation mainly provides information specific to PortAudioCpp. For a more complete explaination of all of the +/// This documentation mainly provides information specific to PortAudioCpp. For a more complete explanation of all of the /// concepts used, please consult the PortAudio documentation. ///

///

diff --git a/bindings/cpp/include/portaudiocpp/Stream.hxx b/bindings/cpp/include/portaudiocpp/Stream.hxx index 1aed747..a731930 100644 --- a/bindings/cpp/include/portaudiocpp/Stream.hxx +++ b/bindings/cpp/include/portaudiocpp/Stream.hxx @@ -29,7 +29,7 @@ namespace portaudio /// clients need to explicitly call close() to ensure the stream closed successfully. /// /// The Stream object can be used to manipulate the Stream's state. Also, time-constant - /// and time-varying information about the Stream can be retreived. + /// and time-varying information about the Stream can be retrieved. ////// class Stream { diff --git a/bindings/cpp/include/portaudiocpp/System.hxx b/bindings/cpp/include/portaudiocpp/System.hxx index d5ff9dd..a159dc3 100644 --- a/bindings/cpp/include/portaudiocpp/System.hxx +++ b/bindings/cpp/include/portaudiocpp/System.hxx @@ -26,7 +26,7 @@ namespace portaudio /// @brief System singleton which represents the PortAudio system. /// /// The System is used to initialize/terminate PortAudio and provide - /// a single acccess point to the PortAudio System (instance()). + /// a single access point to the PortAudio System (instance()). /// It can be used to iterate through all HostApi 's in the System as /// well as all devices in the System. It also provides some utility /// functionality of PortAudio. diff --git a/bindings/cpp/source/portaudiocpp/StreamParameters.cxx b/bindings/cpp/source/portaudiocpp/StreamParameters.cxx index 5b9e897..5857710 100644 --- a/bindings/cpp/source/portaudiocpp/StreamParameters.cxx +++ b/bindings/cpp/source/portaudiocpp/StreamParameters.cxx @@ -39,7 +39,7 @@ namespace portaudio ////// /// Sets the requested sample rate. If this sample rate isn't supported by the hardware, the /// Stream will fail to open. The real-life sample rate used might differ slightly due to - /// imperfections in the sound card hardware; use Stream::sampleRate() to retreive the + /// imperfections in the sound card hardware; use Stream::sampleRate() to retrieve the /// best known estimate for this value. ////// void StreamParameters::setSampleRate(double sampleRate) diff --git a/bindings/java/jportaudio/jtests/com/portaudio/TestBasic.java b/bindings/java/jportaudio/jtests/com/portaudio/TestBasic.java index b05750d..43b8fa7 100644 --- a/bindings/java/jportaudio/jtests/com/portaudio/TestBasic.java +++ b/bindings/java/jportaudio/jtests/com/portaudio/TestBasic.java @@ -219,7 +219,7 @@ public class TestBasic extends TestCase e.printStackTrace(); } - assertTrue( "caught no expection", (caught != null) ); + assertTrue( "caught no exception", (caught != null) ); assertTrue( "exception should say stream is stopped", caught .getMessage().contains( "stopped" ) ); @@ -233,7 +233,7 @@ public class TestBasic extends TestCase caught = e; e.printStackTrace(); } - assertTrue( "caught no expection", (caught != null) ); + assertTrue( "caught no exception", (caught != null) ); assertTrue( "exception should say stream is stopped", caught .getMessage().contains( "null" ) ); @@ -251,7 +251,7 @@ public class TestBasic extends TestCase e.printStackTrace(); } - assertTrue( "caught no expection", (caught != null) ); + assertTrue( "caught no exception", (caught != null) ); assertTrue( "exception should say tried to", caught.getMessage() .contains( "Tried to write short" ) ); diff --git a/build/msvc/readme.txt b/build/msvc/readme.txt index 5fe5e28..07421ff 100644 --- a/build/msvc/readme.txt +++ b/build/msvc/readme.txt @@ -24,7 +24,7 @@ This DLL contains all 5 current Win32 PA APIS (MME/DS/ASIO/WASAPI/WDMKS) Service pack 5: Latest known URL: http://msdn2.microsoft.com/en-us/vstudio/aa718363.aspx - Yes there EXISTS a service pack 6 , but the processor pack (below) isnt compatible with it. + Yes there EXISTS a service pack 6 , but the processor pack (below) isn't compatible with it. Processor Pack(only works with above SP5) Latest known URL: diff --git a/doc/src/api_overview.dox b/doc/src/api_overview.dox index 98a0dbd..e5704ce 100644 --- a/doc/src/api_overview.dox +++ b/doc/src/api_overview.dox @@ -112,7 +112,7 @@ Many of the tests in the /tests directory of the PortAudio distribution implemen @subsection read_write_io_method The Read/Write I/O Method -As an alternative to the callback I/O method, PortAudio provides a synchronous read/write interface for acquiring and playing audio. This can be useful for applications that don't require the lowest possibly latency, or don't warrant the increased complexity of synchronising with an asynchronous callback funciton. This I/O method is also useful when calling PortAudio from programming languages that don't support asynchronous callbacks. +As an alternative to the callback I/O method, PortAudio provides a synchronous read/write interface for acquiring and playing audio. This can be useful for applications that don't require the lowest possibly latency, or don't warrant the increased complexity of synchronising with an asynchronous callback function. This I/O method is also useful when calling PortAudio from programming languages that don't support asynchronous callbacks. To open a Stream in read/write mode you pass a NULL stream callback function pointer to Pa_OpenStream(). diff --git a/doc/src/tutorial/compile_cmake.dox b/doc/src/tutorial/compile_cmake.dox index ab2a239..8db400e 100644 --- a/doc/src/tutorial/compile_cmake.dox +++ b/doc/src/tutorial/compile_cmake.dox @@ -23,7 +23,7 @@ The "-G" option specifies the type of build metadata which will be generated. Yo "make install" should install the same set of files that are installed using the usual configure script included with PortAudio along with a few extra files (similar to pkg-config metadata files) which make it easier for other CMake projects to use the installed libraries. -On Windows, you can use CMake to generate Visual Studio project files which can be used to create the PortAudio libraries. The following serves as an example (and should be done from a directory outside the PortAudio tree) which will create Visual Studio 2015 project files targetting a 64-bit build: +On Windows, you can use CMake to generate Visual Studio project files which can be used to create the PortAudio libraries. The following serves as an example (and should be done from a directory outside the PortAudio tree) which will create Visual Studio 2015 project files targeting a 64-bit build: C:\PABUILD> cmake {portaudio path} -G "Visual Studio 14 2015 Win64" diff --git a/doc/src/tutorial/compile_linux.dox b/doc/src/tutorial/compile_linux.dox index e227d75..2c993ca 100644 --- a/doc/src/tutorial/compile_linux.dox +++ b/doc/src/tutorial/compile_linux.dox @@ -47,7 +47,7 @@ On some systems you may need to use: cp /usr/local/lib/libportaudio.a /YOUR/PROJECT/DIR @endcode -You may also need to copy portaudio.h, located in the include/ directory of PortAudio into your project. Note that you will usually need to link with the approriate libraries that you used, such as ALSA and JACK, as well as with librt and libpthread. For example: +You may also need to copy portaudio.h, located in the include/ directory of PortAudio into your project. Note that you will usually need to link with the appropriate libraries that you used, such as ALSA and JACK, as well as with librt and libpthread. For example: @code gcc main.c libportaudio.a -lrt -lm -lasound -ljack -pthread -o YOUR_BINARY diff --git a/doc/src/tutorial/start_stop_abort.dox b/doc/src/tutorial/start_stop_abort.dox index 6d4f777..0ddb460 100644 --- a/doc/src/tutorial/start_stop_abort.dox +++ b/doc/src/tutorial/start_stop_abort.dox @@ -10,7 +10,7 @@ PortAudio will not start playing back audio until you start the stream. After ca if( err != paNoError ) goto error; @endcode -You can communicate with your callback routine through the data structure you passed in on the open call, or through global variables, or using other interprocess communication techniques, but please be aware that your callback function may be called at interrupt time when your foreground process is least expecting it. So avoid sharing complex data structures that are easily corrupted like double linked lists, and avoid using locks such as mutexs as this may cause your callback function to block and therefore drop audio. Such techniques may even cause deadlock on some platforms. +You can communicate with your callback routine through the data structure you passed in on the open call, or through global variables, or using other interprocess communication techniques, but please be aware that your callback function may be called at interrupt time when your foreground process is least expecting it. So avoid sharing complex data structures that are easily corrupted like double linked lists, and avoid using locks such as mutexes as this may cause your callback function to block and therefore drop audio. Such techniques may even cause deadlock on some platforms. PortAudio will continue to call your callback and process audio until you stop the stream. This can be done in one of several ways, but, before we do so, we'll want to see that some of our audio gets processed by sleeping for a few seconds. This is easy to do with Pa_Sleep(), which is used by many of the examples in the patests/ directory for exactly this purpose. Note that, for a variety of reasons, you can not rely on this function for accurate scheduling, so your stream may not run for exactly the same amount of time as you expect, but it's good enough for our example. diff --git a/examples/pa_fuzz.c b/examples/pa_fuzz.c index d5f99ec..337e06d 100644 --- a/examples/pa_fuzz.c +++ b/examples/pa_fuzz.c @@ -176,7 +176,7 @@ int main(void) error: Pa_Terminate(); - fprintf( stderr, "An error occured while using the portaudio stream\n" ); + fprintf( stderr, "An error occurred while using the portaudio stream\n" ); fprintf( stderr, "Error number: %d\n", err ); fprintf( stderr, "Error message: %s\n", Pa_GetErrorText( err ) ); return -1; diff --git a/examples/paex_mono_asio_channel_select.c b/examples/paex_mono_asio_channel_select.c index a141ac0..71b0198 100644 --- a/examples/paex_mono_asio_channel_select.c +++ b/examples/paex_mono_asio_channel_select.c @@ -160,7 +160,7 @@ int main(void) return err; error: Pa_Terminate(); - fprintf( stderr, "An error occured while using the portaudio stream\n" ); + fprintf( stderr, "An error occurred while using the portaudio stream\n" ); fprintf( stderr, "Error number: %d\n", err ); fprintf( stderr, "Error message: %s\n", Pa_GetErrorText( err ) ); return err; diff --git a/examples/paex_ocean_shore.c b/examples/paex_ocean_shore.c index 7eb7f20..ae645d6 100644 --- a/examples/paex_ocean_shore.c +++ b/examples/paex_ocean_shore.c @@ -526,7 +526,7 @@ int main(void) error: Pa_Terminate(); - fprintf( stderr, "An error occured while using the portaudio stream\n" ); + fprintf( stderr, "An error occurred while using the portaudio stream\n" ); fprintf( stderr, "Error number: %d\n", err ); fprintf( stderr, "Error message: %s\n", Pa_GetErrorText( err ) ); return 0; diff --git a/examples/paex_pink.c b/examples/paex_pink.c index 3714ba7..cd84324 100644 --- a/examples/paex_pink.c +++ b/examples/paex_pink.c @@ -272,7 +272,7 @@ int main(void) return 0; error: Pa_Terminate(); - fprintf( stderr, "An error occured while using the portaudio stream\n" ); + fprintf( stderr, "An error occurred while using the portaudio stream\n" ); fprintf( stderr, "Error number: %d\n", err ); fprintf( stderr, "Error message: %s\n", Pa_GetErrorText( err ) ); return 0; diff --git a/examples/paex_read_write_wire.c b/examples/paex_read_write_wire.c index 4208a01..813c74d 100644 --- a/examples/paex_read_write_wire.c +++ b/examples/paex_read_write_wire.c @@ -197,7 +197,7 @@ error2: Pa_CloseStream( stream ); } Pa_Terminate(); - fprintf( stderr, "An error occured while using the portaudio stream\n" ); + fprintf( stderr, "An error occurred while using the portaudio stream\n" ); fprintf( stderr, "Error number: %d\n", err ); fprintf( stderr, "Error message: %s\n", Pa_GetErrorText( err ) ); return -1; diff --git a/examples/paex_record.c b/examples/paex_record.c index 99226fc..4c9105c 100644 --- a/examples/paex_record.c +++ b/examples/paex_record.c @@ -344,7 +344,7 @@ done: free( data.recordedSamples ); if( err != paNoError ) { - fprintf( stderr, "An error occured while using the portaudio stream\n" ); + fprintf( stderr, "An error occurred while using the portaudio stream\n" ); fprintf( stderr, "Error number: %d\n", err ); fprintf( stderr, "Error message: %s\n", Pa_GetErrorText( err ) ); err = 1; /* Always return 0 or 1, but no other return codes. */ diff --git a/examples/paex_record_file.c b/examples/paex_record_file.c index 1f1211f..1e1f473 100644 --- a/examples/paex_record_file.c +++ b/examples/paex_record_file.c @@ -448,7 +448,7 @@ done: PaUtil_FreeMemory( data.ringBufferData ); if( err != paNoError ) { - fprintf( stderr, "An error occured while using the portaudio stream\n" ); + fprintf( stderr, "An error occurred while using the portaudio stream\n" ); fprintf( stderr, "Error number: %d\n", err ); fprintf( stderr, "Error message: %s\n", Pa_GetErrorText( err ) ); err = 1; /* Always return 0 or 1, but no other return codes. */ diff --git a/examples/paex_saw.c b/examples/paex_saw.c index 235f247..6f477b8 100644 --- a/examples/paex_saw.c +++ b/examples/paex_saw.c @@ -126,7 +126,7 @@ int main(void) return err; error: Pa_Terminate(); - fprintf( stderr, "An error occured while using the portaudio stream\n" ); + fprintf( stderr, "An error occurred while using the portaudio stream\n" ); fprintf( stderr, "Error number: %d\n", err ); fprintf( stderr, "Error message: %s\n", Pa_GetErrorText( err ) ); return err; diff --git a/examples/paex_sine.c b/examples/paex_sine.c index bda290b..99fecf7 100644 --- a/examples/paex_sine.c +++ b/examples/paex_sine.c @@ -168,7 +168,7 @@ int main(void) return err; error: Pa_Terminate(); - fprintf( stderr, "An error occured while using the portaudio stream\n" ); + fprintf( stderr, "An error occurred while using the portaudio stream\n" ); fprintf( stderr, "Error number: %d\n", err ); fprintf( stderr, "Error message: %s\n", Pa_GetErrorText( err ) ); return err; diff --git a/examples/paex_sine_c++.cpp b/examples/paex_sine_c++.cpp index 2859a57..64d7829 100644 --- a/examples/paex_sine_c++.cpp +++ b/examples/paex_sine_c++.cpp @@ -268,7 +268,7 @@ int main(void) return paNoError; error: - fprintf( stderr, "An error occured while using the portaudio stream\n" ); + fprintf( stderr, "An error occurred while using the portaudio stream\n" ); fprintf( stderr, "Error number: %d\n", paInit.result() ); fprintf( stderr, "Error message: %s\n", Pa_GetErrorText( paInit.result() ) ); return 1; diff --git a/examples/paex_wmme_ac3.c b/examples/paex_wmme_ac3.c index e59c571..ac9212a 100644 --- a/examples/paex_wmme_ac3.c +++ b/examples/paex_wmme_ac3.c @@ -213,7 +213,7 @@ error: Pa_Terminate(); free( data.buffer ); - fprintf( stderr, "An error occured while using the portaudio stream\n" ); + fprintf( stderr, "An error occurred while using the portaudio stream\n" ); fprintf( stderr, "Error number: %d\n", err ); fprintf( stderr, "Error message: %s\n", Pa_GetErrorText( err ) ); return err; diff --git a/examples/paex_wmme_surround.c b/examples/paex_wmme_surround.c index ddab73d..dfccc99 100644 --- a/examples/paex_wmme_surround.c +++ b/examples/paex_wmme_surround.c @@ -203,7 +203,7 @@ int main(int argc, char* argv[]) return err; error: Pa_Terminate(); - fprintf( stderr, "An error occured while using the portaudio stream\n" ); + fprintf( stderr, "An error occurred while using the portaudio stream\n" ); fprintf( stderr, "Error number: %d\n", err ); fprintf( stderr, "Error message: %s\n", Pa_GetErrorText( err ) ); return err; diff --git a/examples/paex_write_sine.c b/examples/paex_write_sine.c index f5ead3f..9021b94 100644 --- a/examples/paex_write_sine.c +++ b/examples/paex_write_sine.c @@ -151,7 +151,7 @@ int main(void) return err; error: - fprintf( stderr, "An error occured while using the portaudio stream\n" ); + fprintf( stderr, "An error occurred while using the portaudio stream\n" ); fprintf( stderr, "Error number: %d\n", err ); fprintf( stderr, "Error message: %s\n", Pa_GetErrorText( err ) ); // Print more information about the error. diff --git a/examples/paex_write_sine_nonint.c b/examples/paex_write_sine_nonint.c index 3a038e1..bc266c0 100644 --- a/examples/paex_write_sine_nonint.c +++ b/examples/paex_write_sine_nonint.c @@ -160,7 +160,7 @@ int main(void) return err; error: Pa_Terminate(); - fprintf( stderr, "An error occured while using the portaudio stream\n" ); + fprintf( stderr, "An error occurred while using the portaudio stream\n" ); fprintf( stderr, "Error number: %d\n", err ); fprintf( stderr, "Error message: %s\n", Pa_GetErrorText( err ) ); return err; diff --git a/include/pa_asio.h b/include/pa_asio.h index 9c606a9..e612aa3 100644 --- a/include/pa_asio.h +++ b/include/pa_asio.h @@ -52,7 +52,7 @@ extern "C" #endif /* __cplusplus */ -/** Retrieve legal native buffer sizes for the specificed device, in sample frames. +/** Retrieve legal native buffer sizes for the specified device, in sample frames. @param device The global index of the device about which the query is being made. @param minBufferSizeFrames A pointer to the location which will receive the minimum buffer size value. @@ -112,7 +112,7 @@ PaError PaAsio_GetOutputChannelName( PaDeviceIndex device, int channelIndex, @param stream The stream to operate on. @param sampleRate The new sample rate. - Note that this function may fail if the stream is alredy running and the + Note that this function may fail if the stream is already running and the ASIO driver does not support switching the sample rate of a running stream. Returns paIncompatibleStreamHostApi if stream is not a paASIO stream. diff --git a/include/pa_mac_core.h b/include/pa_mac_core.h index 83e40a6..85ecc03 100644 --- a/include/pa_mac_core.h +++ b/include/pa_mac_core.h @@ -112,20 +112,20 @@ AudioDeviceID PaMacCore_GetStreamOutputDevice( PaStream* s ); * Returns a statically allocated string with the device's name * for the given channel. NULL will be returned on failure. * - * This function's implemenation is not complete! + * This function's implementation is not complete! * * @param device The PortAudio device index. * @param channel The channel number who's name is requested. * @return a statically allocated string with the name of the device. * Because this string is statically allocated, it must be - * coppied if it is to be saved and used by the user after + * copied if it is to be saved and used by the user after * another call to this function. * */ const char *PaMacCore_GetChannelName( int device, int channelIndex, bool input ); -/** Retrieve the range of legal native buffer sizes for the specificed device, in sample frames. +/** Retrieve the range of legal native buffer sizes for the specified device, in sample frames. @param device The global index of the PortAudio device about which the query is being made. @param minBufferSizeFrames A pointer to the location which will receive the minimum buffer size value. @@ -158,7 +158,7 @@ PaError PaMacCore_GetBufferSizeRange( PaDeviceIndex device, * are supported by the device. */ #define paMacCoreFailIfConversionRequired (0x02) -/** These flags set the SR conversion quality, if required. The wierd ordering +/** These flags set the SR conversion quality, if required. The weird ordering * allows Maximum Quality to be the default.*/ #define paMacCoreConversionQualityMin (0x0100) #define paMacCoreConversionQualityMedium (0x0200) diff --git a/include/pa_win_wasapi.h b/include/pa_win_wasapi.h index e8b93b6..ab5d541 100644 --- a/include/pa_win_wasapi.h +++ b/include/pa_win_wasapi.h @@ -267,7 +267,7 @@ PaWasapiJackDescription; /** Stream category. Note: - values are equal to WASAPI AUDIO_STREAM_CATEGORY enum - - supported since Windows 8.0, noop on earler versions + - supported since Windows 8.0, noop on earlier versions - values 1,2 are deprecated on Windows 10 and not included into enumeration @version Available as of 19.6.0 @@ -291,7 +291,7 @@ PaWasapiStreamCategory; /** Stream option. Note: - values are equal to WASAPI AUDCLNT_STREAMOPTIONS enum - - supported since Windows 8.1, noop on earler versions + - supported since Windows 8.1, noop on earlier versions @version Available as of 19.6.0 */ @@ -380,7 +380,7 @@ PaError PaWasapi_UpdateDeviceList(); /** Get current audio format of the device assigned to the opened stream. Format is represented by PaWinWaveFormat or WAVEFORMATEXTENSIBLE structure. - Use this function to reconfirm format if PA's processor is overriden and + Use this function to reconfirm format if PA's processor is overridden and paWinWasapiRedirectHostProcessor flag is specified. @param pStream Pointer to PaStream object. @@ -388,7 +388,7 @@ PaError PaWasapi_UpdateDeviceList(); @param formatSize Size of PaWinWaveFormat or WAVEFORMATEXTENSIBLE structure in bytes. @param bOutput TRUE (1) for output stream, FALSE (0) for input stream. - @return Non-negative value indicating the number of bytes copied into format decriptor + @return Non-negative value indicating the number of bytes copied into format descriptor or, a PaErrorCode (which is always negative) if PortAudio is not initialized or an error is encountered. */ @@ -404,7 +404,7 @@ int PaWasapi_GetDeviceCurrentFormat( PaStream *pStream, void *pFormat, unsigned @param formatSize Size of PaWinWaveFormat or WAVEFORMATEXTENSIBLE structure in bytes. @param device Device index. - @return Non-negative value indicating the number of bytes copied into format decriptor + @return Non-negative value indicating the number of bytes copied into format descriptor or, a PaErrorCode (which is always negative) if PortAudio is not initialized or an error is encountered. */ @@ -420,7 +420,7 @@ int PaWasapi_GetDeviceDefaultFormat( void *pFormat, unsigned int formatSize, PaD @param formatSize Size of PaWinWaveFormat or WAVEFORMATEXTENSIBLE structure in bytes. @param device Device index. - @return Non-negative value indicating the number of bytes copied into format decriptor + @return Non-negative value indicating the number of bytes copied into format descriptor or, a PaErrorCode (which is always negative) if PortAudio is not initialized or an error is encountered. */ @@ -468,7 +468,7 @@ PaError PaWasapi_ThreadPriorityRevert( void *pTask ); /** Get number of frames per host buffer. It is max value of frames of WASAPI buffer which can be locked for operations. - Use this method as helper to findout max values of inputFrames/outputFrames + Use this method as helper to find out max values of inputFrames/outputFrames of PaWasapiHostProcessorCallback. @param pStream Pointer to PaStream object. @@ -624,7 +624,7 @@ PaError PaWasapiWinrt_PopulateDeviceList( const unsigned short **pId, const unsi under Windows Vista x64 when application is WOW64(32-bit) and Event-Driven method simply times out (event handle is never signalled on buffer completion). Please note, such WOW64 bug does not exist in Vista x86 or Windows 7. - Polling can be setup by speciying 'paWinWasapiPolling' flag. Our WASAPI implementation detects + Polling can be setup by specifying 'paWinWasapiPolling' flag. Our WASAPI implementation detects WOW64 bug and sets 'paWinWasapiPolling' automatically. Thread priority: diff --git a/include/pa_win_wmme.h b/include/pa_win_wmme.h index f84b68b..b80743c 100644 --- a/include/pa_win_wmme.h +++ b/include/pa_win_wmme.h @@ -109,7 +109,7 @@ typedef struct PaWinMmeStreamInfo{ If devices are specified here, the corresponding device parameter to Pa_OpenStream() should be set to paUseHostApiSpecificDeviceSpecification, otherwise an paInvalidDevice error will result. - The total number of channels accross all specified devices + The total number of channels across all specified devices must agree with the corresponding channelCount parameter to Pa_OpenStream() otherwise a paInvalidChannelCount error will result. */ diff --git a/ltmain.sh b/ltmain.sh index a356aca..d668a02 100644 --- a/ltmain.sh +++ b/ltmain.sh @@ -189,7 +189,7 @@ func_basename () # to NONDIR_REPLACEMENT. # value returned in "$func_dirname_result" # basename: Compute filename of FILE. -# value retuned in "$func_basename_result" +# value returned in "$func_basename_result" # Implementation must be kept synchronized with func_dirname # and func_basename. For efficiency, we do not delegate to # those functions but instead duplicate the functionality here. @@ -4394,7 +4394,7 @@ EOF { /* however, if there is an option in the LTWRAPPER_OPTION_PREFIX namespace, but it is not one of the ones we know about and - have already dealt with, above (inluding dump-script), then + have already dealt with, above (including dump-script), then report an error. Otherwise, targets might begin to believe they are allowed to use options in the LTWRAPPER_OPTION_PREFIX namespace. The first time any user complains about this, we'll diff --git a/pablio/test_rw.c b/pablio/test_rw.c index 1388246..029240d 100644 --- a/pablio/test_rw.c +++ b/pablio/test_rw.c @@ -98,7 +98,7 @@ int main(void) error: Pa_Terminate(); - fprintf( stderr, "An error occured while using the portaudio stream\n" ); + fprintf( stderr, "An error occurred while using the portaudio stream\n" ); fprintf( stderr, "Error number: %d\n", err ); fprintf( stderr, "Error message: %s\n", Pa_GetErrorText( err ) ); return -1; diff --git a/pablio/test_rw_echo.c b/pablio/test_rw_echo.c index 470b4b0..431587c 100644 --- a/pablio/test_rw_echo.c +++ b/pablio/test_rw_echo.c @@ -122,7 +122,7 @@ int main(void) return 0; error: - fprintf( stderr, "An error occured while using PortAudio\n" ); + fprintf( stderr, "An error occurred while using PortAudio\n" ); fprintf( stderr, "Error number: %d\n", err ); fprintf( stderr, "Error message: %s\n", Pa_GetErrorText( err ) ); return -1; diff --git a/pablio/test_w_saw.c b/pablio/test_w_saw.c index 39efe9e..2303d20 100644 --- a/pablio/test_w_saw.c +++ b/pablio/test_w_saw.c @@ -107,7 +107,7 @@ int main(void) return 0; error: - fprintf( stderr, "An error occured while using PABLIO\n" ); + fprintf( stderr, "An error occurred while using PABLIO\n" ); fprintf( stderr, "Error number: %d\n", err ); fprintf( stderr, "Error message: %s\n", Pa_GetErrorText( err ) ); return -1; diff --git a/pablio/test_w_saw8.c b/pablio/test_w_saw8.c index b62c820..70686c1 100644 --- a/pablio/test_w_saw8.c +++ b/pablio/test_w_saw8.c @@ -105,7 +105,7 @@ int main(void) return 0; error: - fprintf( stderr, "An error occured while using PABLIO\n" ); + fprintf( stderr, "An error occurred while using PABLIO\n" ); fprintf( stderr, "Error number: %d\n", err ); fprintf( stderr, "Error message: %s\n", Pa_GetErrorText( err ) ); return -1; diff --git a/qa/loopback/src/audio_analyzer.h b/qa/loopback/src/audio_analyzer.h index 2a86798..c98acbb 100644 --- a/qa/loopback/src/audio_analyzer.h +++ b/qa/loopback/src/audio_analyzer.h @@ -130,7 +130,7 @@ void PaQa_SetupSineGenerator( PaQaSineGenerator *generator, double frequency, do /*================= Recordings ===================================*/ /*================================================================*/ /** - * Allocate memory for containg a mono audio signal. Set up recording for writing. + * Allocate memory for containing a mono audio signal. Set up recording for writing. */ int PaQa_InitializeRecording( PaQaRecording *recording, int maxSamples, int sampleRate ); diff --git a/qa/loopback/src/paqa.c b/qa/loopback/src/paqa.c index cb7100d..ac8e841 100644 --- a/qa/loopback/src/paqa.c +++ b/qa/loopback/src/paqa.c @@ -891,7 +891,7 @@ static int PaQa_SingleLoopBackTest( UserOptions *userOptions, TestParameters *te printf( "OK" ); } - // Print the # errors so far to make it easier to see where the error occured. + // Print the # errors so far to make it easier to see where the error occurred. printf( " - #errs = %d\n", g_testsFailed ); PaQa_TeardownLoopbackContext( &loopbackContext ); @@ -1304,7 +1304,7 @@ static int CheckLoopbackAndScan( UserOptions *userOptions, /** * Scan every combination of output to input device. * If a loopback is found the analyse the combination. - * The scan can be overriden using the -i and -o command line options. + * The scan can be overridden using the -i and -o command line options. */ static int ScanForLoopback(UserOptions *userOptions) { diff --git a/qa/loopback/src/paqa_tools.c b/qa/loopback/src/paqa_tools.c index 97b5058..3f04ada 100644 --- a/qa/loopback/src/paqa_tools.c +++ b/qa/loopback/src/paqa_tools.c @@ -146,7 +146,7 @@ void PaQa_ConvertFromFloat( const float *input, int numSamples, PaSampleFormat o for( i=0; iint16 -rb */ + float samp = *src * const_1_div_32768_; /* FIXME: i'm concerned about this being asymmetrical with float->int16 -rb */ *dest = samp; src += sourceStride; diff --git a/src/common/pa_converters.h b/src/common/pa_converters.h index 469f075..1a912eb 100644 --- a/src/common/pa_converters.h +++ b/src/common/pa_converters.h @@ -59,7 +59,7 @@ struct PaUtilTriangularDitherGenerator; /** Choose an available sample format which is most appropriate for representing the requested format. If the requested format is not available - higher quality formats are considered before lower quality formates. + higher quality formats are considered before lower quality formats. @param availableFormats A variable containing the logical OR of all available formats. @param format The desired format. @@ -211,7 +211,7 @@ typedef struct{ PaUtil_SelectConverter() uses this table to lookup the appropriate conversion functions. The fields of this structure are initialized with default conversion functions. Fields may be NULL, indicating that - no conversion function is available. User code may substitue optimised + no conversion function is available. User code may substitute optimised conversion functions by assigning different function pointers to these fields. @@ -242,7 +242,7 @@ typedef struct{ /** A table of pointers to all required zeroer functions. PaUtil_SelectZeroer() uses this table to lookup the appropriate conversion functions. The fields of this structure are initialized - with default conversion functions. User code may substitue optimised + with default conversion functions. User code may substitute optimised conversion functions by assigning different function pointers to these fields. diff --git a/src/common/pa_endianness.h b/src/common/pa_endianness.h index 9e8e059..7496651 100644 --- a/src/common/pa_endianness.h +++ b/src/common/pa_endianness.h @@ -54,7 +54,7 @@ example. A PA_VALIDATE_ENDIANNESS macro is provided to compare the compile time - and runtime endiannes and raise an assertion if they don't match. + and runtime endianness and raise an assertion if they don't match. */ @@ -65,7 +65,7 @@ extern "C" /* If this is an apple, we need to do detect endianness this way */ #if defined(__APPLE__) - /* we need to do some endian detection that is sensitive to harware arch */ + /* we need to do some endian detection that is sensitive to hardware arch */ #if defined(__LITTLE_ENDIAN__) #if !defined( PA_LITTLE_ENDIAN ) #define PA_LITTLE_ENDIAN @@ -83,7 +83,7 @@ extern "C" #endif #else /* this is not an apple, so first check the existing defines, and, failing that, - detect well-known architechtures. */ + detect well-known architectures. */ #if defined(PA_LITTLE_ENDIAN) || defined(PA_BIG_ENDIAN) /* endianness define has been set externally, such as by autoconf */ diff --git a/src/common/pa_front.c b/src/common/pa_front.c index 9d30f48..9a258eb 100644 --- a/src/common/pa_front.c +++ b/src/common/pa_front.c @@ -74,7 +74,7 @@ #include "pa_types.h" #include "pa_hostapi.h" #include "pa_stream.h" -#include "pa_trace.h" /* still usefull?*/ +#include "pa_trace.h" /* still useful?*/ #include "pa_debugprint.h" #ifndef PA_GIT_REVISION @@ -805,7 +805,7 @@ static int SampleFormatIsValid( PaSampleFormat format ) } /* - NOTE: make sure this validation list is kept syncronised with the one in + NOTE: make sure this validation list is kept synchronised with the one in pa_hostapi.h ValidateOpenStreamParameters() checks that parameters to Pa_OpenStream() @@ -884,7 +884,7 @@ static PaError ValidateOpenStreamParameters( PaDeviceIndex *hostApiInputDevice, PaDeviceIndex *hostApiOutputDevice ) { - int inputHostApiIndex = -1, /* Surpress uninitialised var warnings: compiler does */ + int inputHostApiIndex = -1, /* Suppress uninitialised var warnings: compiler does */ outputHostApiIndex = -1; /* not see that if inputParameters and outputParame- */ /* ters are both nonzero, these indices are set. */ @@ -1195,7 +1195,7 @@ PaError Pa_OpenStream( PaStream** stream, } /* Check for parameter errors. - NOTE: make sure this validation list is kept syncronised with the one + NOTE: make sure this validation list is kept synchronised with the one in pa_hostapi.h */ diff --git a/src/common/pa_process.h b/src/common/pa_process.h index 37b91d7..803144a 100644 --- a/src/common/pa_process.h +++ b/src/common/pa_process.h @@ -78,7 +78,7 @@ When a stream is opened, the buffer processor should be initialized using PaUtil_InitializeBufferProcessor. This function initializes internal state - and allocates temporary buffers as neccesary according to the supplied + and allocates temporary buffers as necessary according to the supplied configuration parameters. Some of the parameters correspond to those requested by the user in their call to Pa_OpenStream(), others reflect the requirements of the host API implementation - they indicate host buffer sizes, formats, @@ -119,7 +119,7 @@ PaUtil_SetInterleavedInputChannels, PaUtil_SetNonInterleavedInputChannel. Which function you call will depend on whether the host buffer(s) are interleaved or not. - - If the available host data is split accross two buffers (for example a + - If the available host data is split across two buffers (for example a data range at the end of a circular buffer and another range at the beginning of the circular buffer), also call PaUtil_Set2ndInputFrameCount, PaUtil_Set2ndInputChannel, @@ -134,7 +134,7 @@ PaUtil_SetInterleavedOutputChannels, PaUtil_SetNonInterleavedOutputChannel. Which function you call will depend on whether the host buffer(s) are interleaved or not. - - If the available host output buffer space is split accross two buffers + - If the available host output buffer space is split across two buffers (for example a data range at the end of a circular buffer and another range at the beginning of the circular buffer), call PaUtil_Set2ndOutputFrameCount, PaUtil_Set2ndOutputChannel, @@ -237,7 +237,7 @@ typedef enum { }PaUtilHostBufferSizeMode; -/** @brief An auxilliary data structure used internally by the buffer processor +/** @brief An auxiliary data structure used internally by the buffer processor to represent host input and output buffers. */ typedef struct PaUtilChannelDescriptor{ void *data; @@ -452,10 +452,10 @@ void PaUtil_SetInputFrameCount( PaUtilBufferProcessor* bufferProcessor, unsigned long frameCount ); -/** Indicate that no input is avalable. This function should be used when +/** Indicate that no input is available. This function should be used when priming the output of a full-duplex stream opened with the paPrimeOutputBuffersUsingStreamCallback flag. Note that it is not necessary - to call this or any othe PaUtil_Set*Input* functions for ouput-only streams. + to call this or any other PaUtil_Set*Input* functions for ouput-only streams. @param bufferProcessor The buffer processor. */ @@ -648,11 +648,11 @@ void PaUtil_BeginBufferProcessing( PaUtilBufferProcessor* bufferProcessor, If the stream callback is called its result is stored in *callbackResult. If the stream callback returns paComplete or paAbort, all output buffers will be - full of valid data - some of which may be zeros to acount for data that + full of valid data - some of which may be zeros to account for data that wasn't generated by the terminating callback. @return The number of frames processed. This usually corresponds to the - number of frames specified by the PaUtil_Set*FrameCount functions, exept in + number of frames specified by the PaUtil_Set*FrameCount functions, except in the paUtilVariableHostBufferSizePartialUsageAllowed buffer size mode when a smaller value may be returned. */ @@ -660,7 +660,7 @@ unsigned long PaUtil_EndBufferProcessing( PaUtilBufferProcessor* bufferProcessor int *callbackResult ); -/** Determine whether any callback generated output remains in the bufffer +/** Determine whether any callback generated output remains in the buffer processor's internal buffers. This method may be used to determine when to continue calling PaUtil_EndBufferProcessing() after the callback has returned a callbackResult of paComplete. diff --git a/src/common/pa_util.h b/src/common/pa_util.h index ad5dac5..43ea894 100644 --- a/src/common/pa_util.h +++ b/src/common/pa_util.h @@ -65,7 +65,7 @@ struct PaUtilHostApiRepresentation; host api specific extension functions which aren't passed a rep pointer by pa_front.c. - @param hostApi A pointer to a host API represenation pointer. Apon success + @param hostApi A pointer to a host API representation pointer. Upon success this will receive the requested representation pointer. @param type A valid host API type identifier. @@ -79,7 +79,7 @@ PaError PaUtil_GetHostApiRepresentation( struct PaUtilHostApiRepresentation **ho /** Convert a PortAudio device index into a host API specific device index. - @param hostApiDevice Pointer to a device index, on success this will recieve the + @param hostApiDevice Pointer to a device index, on success this will receive the converted device index value. @param device The PortAudio device index to convert. @param hostApi The host api which the index should be converted for. @@ -121,7 +121,7 @@ void PaUtil_SetLastHostErrorInfo( PaHostApiTypeId hostApiType, long errorCode, void *PaUtil_AllocateMemory( long size ); -/** Realease block if non-NULL. block may be NULL */ +/** Release block if non-NULL. block may be NULL */ void PaUtil_FreeMemory( void *block ); diff --git a/src/hostapi/alsa/pa_linux_alsa.c b/src/hostapi/alsa/pa_linux_alsa.c index 5539d9d..4dfdc75 100644 --- a/src/hostapi/alsa/pa_linux_alsa.c +++ b/src/hostapi/alsa/pa_linux_alsa.c @@ -1962,7 +1962,7 @@ static PaError PaAlsaStreamComponent_InitialConfigure( PaAlsaStreamComponent *se { /* Configuration consists of setting all of ALSA's parameters. * These parameters come in two flavors: hardware parameters - * and software paramters. Hardware parameters will affect + * and software parameters. Hardware parameters will affect * the way the device is initialized, software parameters * affect the way ALSA interacts with me, the user-level client. */ @@ -1976,7 +1976,7 @@ static PaError PaAlsaStreamComponent_InitialConfigure( PaAlsaStreamComponent *se /* self->framesPerPeriod = framesPerHostBuffer; */ - /* ... fill up the configuration space with all possibile + /* ... fill up the configuration space with all possible * combinations of parameters this device will accept */ ENSURE_( alsa_snd_pcm_hw_params_any( pcm, hwParams ), paUnanticipatedHostError ); @@ -2161,7 +2161,7 @@ static PaError PaAlsaStream_Initialize( PaAlsaStream *self, PaAlsaHostApiReprese self->framesPerUserBuffer = framesPerUserBuffer; self->neverDropInput = streamFlags & paNeverDropInput; - /* XXX: Ignore paPrimeOutputBuffersUsingStreamCallback untill buffer priming is fully supported in pa_process.c */ + /* XXX: Ignore paPrimeOutputBuffersUsingStreamCallback until buffer priming is fully supported in pa_process.c */ /* if( outParams & streamFlags & paPrimeOutputBuffersUsingStreamCallback ) self->primeBuffers = 1; @@ -2389,7 +2389,7 @@ static PaError PaAlsaStreamComponent_DetermineFramesPerBuffer( PaAlsaStreamCompo { framesPerHostBuffer *= 2; } - /* One extra period is preferrable to one less (should be more robust) */ + /* One extra period is preferable to one less (should be more robust) */ if( bufferSize / framesPerHostBuffer < numPeriods ) { framesPerHostBuffer /= 2; @@ -4186,7 +4186,7 @@ error: * directly is obtained from ALSA, we then request as much directly accessible memory as possible within this amount * from ALSA. The buffer memory is registered with the PA buffer processor and processing is carried out with * PaUtil_EndBufferProcessing. Finally, the number of processed frames is reported to ALSA. The processing can - * happen in several iterations untill we have consumed the known number of available frames (or an xrun is detected). + * happen in several iterations until we have consumed the known number of available frames (or an xrun is detected). */ static void *CallbackThreadFunc( void *userData ) { @@ -4272,7 +4272,7 @@ static void *CallbackThreadFunc( void *userData ) /* There is still buffered output that needs to be processed */ } - /* Wait for data to become available, this comes down to polling the ALSA file descriptors untill we have + /* Wait for data to become available, this comes down to polling the ALSA file descriptors until we have * a number of available frames. */ PA_ENSURE( PaAlsaStream_WaitForFrames( stream, &framesAvail, &xrun ) ); diff --git a/src/hostapi/asio/pa_asio.cpp b/src/hostapi/asio/pa_asio.cpp index f230d87..c9ca786 100644 --- a/src/hostapi/asio/pa_asio.cpp +++ b/src/hostapi/asio/pa_asio.cpp @@ -46,7 +46,7 @@ 08-20-01 More conversion, PA_StreamTime, Pa_GetHostError : Stephane Letz 08-21-01 PaUInt8 bug correction, implementation of ASIOSTFloat32LSB and ASIOSTFloat32MSB native formats : Stephane Letz 08-24-01 MAX_INT32_FP hack, another Uint8 fix : Stephane and Phil - 08-27-01 Implementation of hostBufferSize < userBufferSize case, better management of the ouput buffer when + 08-27-01 Implementation of hostBufferSize < userBufferSize case, better management of the output buffer when the stream is stopped : Stephane Letz 08-28-01 Check the stream pointer for null in bufferSwitchTimeInfo, correct bug in bufferSwitchTimeInfo when the stream is stopped : Stephane Letz @@ -55,11 +55,11 @@ 10-26-01 Management of hostBufferSize and userBufferSize of any size : Stephane Letz 10-27-01 Improve calculus of hostBufferSize to be multiple or divisor of userBufferSize if possible : Stephane and Phil 10-29-01 Change MAX_INT32_FP to (2147483520.0f) to prevent roundup to 0x80000000 : Phil Burk - 10-31-01 Clear the ouput buffer and user buffers in PaHost_StartOutput, correct bug in GetFirstMultiple : Stephane Letz + 10-31-01 Clear the output buffer and user buffers in PaHost_StartOutput, correct bug in GetFirstMultiple : Stephane Letz 11-06-01 Rename functions : Stephane Letz 11-08-01 New Pa_ASIO_Adaptor_Init function to init Callback adpatation variables, cleanup of Pa_ASIO_Callback_Input: Stephane Letz 11-29-01 Break apart device loading to debug random failure in Pa_ASIO_QueryDeviceInfo ; Phil Burk - 01-03-02 Desallocate all resources in PaHost_Term for cases where Pa_CloseStream is not called properly : Stephane Letz + 01-03-02 Deallocate all resources in PaHost_Term for cases where Pa_CloseStream is not called properly : Stephane Letz 02-01-02 Cleanup, test of multiple-stream opening : Stephane Letz 19-02-02 New Pa_ASIO_loadDriver that calls CoInitialize on each thread on Windows : Stephane Letz 09-04-02 Correct error code management in PaHost_Term, removes various compiler warning : Stephane Letz @@ -69,7 +69,7 @@ 12-06-02 Rehashed into new multi-api infrastructure, added support for all ASIO sample formats : Ross Bencina 18-06-02 Added pa_asio.h, PaAsio_GetAvailableLatencyValues() : Ross B. 21-06-02 Added SelectHostBufferSize() which selects host buffer size based on user latency parameters : Ross Bencina - ** NOTE maintanance history is now stored in CVS ** + ** NOTE maintenance history is now stored in CVS ** */ /** @file @@ -103,7 +103,7 @@ #include "pa_win_coinitialize.h" -/* This version of pa_asio.cpp is currently only targetted at Win32, +/* This version of pa_asio.cpp is currently only targeted at Win32, It would require a few tweaks to work with pre-OS X Macintosh. To make configuration easier, we define WIN32 here to make sure that the ASIO SDK knows this is Win32. @@ -2549,7 +2549,7 @@ static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi, enough to store at least two complete data blocks. 1) Determine the amount of latency to be added to the - prefered ASIO latency. + preferred ASIO latency. 2) Make sure we have at lest one additional latency frame. 3) Divide the number of frames by the desired block size to get the number (rounded up to pure integer) of blocks to @@ -2568,7 +2568,7 @@ static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi, while( lBlockingBufferSize > (lBlockingBufferSizePow2<<=1) ); lBlockingBufferSize = lBlockingBufferSizePow2; - /* Compute total intput latency in seconds */ + /* Compute total input latency in seconds */ stream->streamRepresentation.streamInfo.inputLatency = (double)( PaUtil_GetBufferProcessorInputLatencyFrames(&stream->bufferProcessor ) + PaUtil_GetBufferProcessorInputLatencyFrames(&stream->blockingState->bufferProcessor) @@ -2635,7 +2635,7 @@ static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi, enough to store at least two complete data blocks. 1) Determine the amount of latency to be added to the - prefered ASIO latency. + preferred ASIO latency. 2) Make sure we have at lest one additional latency frame. 3) Divide the number of frames by the desired block size to get the number (rounded up to pure integer) of blocks to @@ -2872,7 +2872,7 @@ static void bufferSwitch(long index, ASIOBool directProcess) //TAKEN FROM THE ASIO SDK // the actual processing callback. - // Beware that this is normally in a seperate thread, hence be sure that + // Beware that this is normally in a separate thread, hence be sure that // you take care about thread synchronization. This is omitted here for // simplicity. @@ -2904,7 +2904,7 @@ static void bufferSwitch(long index, ASIOBool directProcess) static ASIOTime *bufferSwitchTimeInfo( ASIOTime *timeInfo, long index, ASIOBool directProcess ) { // the actual processing callback. - // Beware that this is normally in a seperate thread, hence be sure that + // Beware that this is normally in a separate thread, hence be sure that // you take care about thread synchronization. @@ -3269,7 +3269,7 @@ static long asioMessages(long selector, long value, void* message, double* opt) break; case kAsioSupportsTimeInfo: - // informs the driver wether the asioCallbacks.bufferSwitchTimeInfo() callback + // informs the driver whether the asioCallbacks.bufferSwitchTimeInfo() callback // is supported. // For compatibility with ASIO 1.0 drivers the host application should always support // the "old" bufferSwitch method, too. @@ -3277,7 +3277,7 @@ static long asioMessages(long selector, long value, void* message, double* opt) break; case kAsioSupportsTimeCode: - // informs the driver wether application is interested in time code info. + // informs the driver whether application is interested in time code info. // If an application does not need to know about time code, the driver has less work // to do. ret = 0; @@ -3423,7 +3423,7 @@ static PaError StopStream( PaStream *s ) blockingState->stopFlag = TRUE; /* Wait until requested number of buffers has been freed. Time - out after twice the blocking i/o ouput buffer could have + out after twice the blocking i/o output buffer could have been consumed. */ DWORD timeout = (DWORD)( 2 * blockingState->writeRingBuffer.bufferSize * 1000 / stream->streamRepresentation.streamInfo.sampleRate ); @@ -3762,7 +3762,7 @@ static PaError WriteStream( PaStream *s , unsigned int i; /* Just a counter. */ - /* Check if the stream ist still available ready to recieve new data. */ + /* Check if the stream is still available ready to receive new data. */ if( blockingState->stopFlag || !stream->isActive ) { PA_DEBUG(("Warning! Stream no longer available for writing in WriteStream()\n")); diff --git a/src/hostapi/coreaudio/notes.txt b/src/hostapi/coreaudio/notes.txt index 145afe1..4db0b0e 100644 --- a/src/hostapi/coreaudio/notes.txt +++ b/src/hostapi/coreaudio/notes.txt @@ -81,7 +81,7 @@ latency will be provided even if a large latency setting is selected. - Latency: Latency settings are generally ignored. They may be used as a hint for buffer size in paHostFramesPerBufferUnspecified, or the value may be used in cases where additional buffering is needed, such as doing input and -output on seperate devices. Latency settings are always automatically bound +output on separate devices. Latency settings are always automatically bound to "safe" values, however, so setting extreme values here should not be an issue. diff --git a/src/hostapi/coreaudio/pa_mac_core.c b/src/hostapi/coreaudio/pa_mac_core.c index a0eb6fd..1766734 100644 --- a/src/hostapi/coreaudio/pa_mac_core.c +++ b/src/hostapi/coreaudio/pa_mac_core.c @@ -121,7 +121,7 @@ static bool ensureChannelNameSize( int size ) return true; } /* - * Function declared in pa_mac_core.h. retrives channel names. + * Function declared in pa_mac_core.h. retrieves channel names. */ const char *PaMacCore_GetChannelName( int device, int channelIndex, bool input ) { @@ -1358,7 +1358,7 @@ static PaError OpenAndSetupOneAudioUnit( /* set device format first, but only touch the device if the user asked */ if( inStreamParams ) { /*The callback never calls back if we don't set the FPB */ - /*This seems wierd, because I would think setting anything on the device + /*This seems weird, because I would think setting anything on the device would be disruptive.*/ paResult = setBestFramesPerBuffer( *audioDevice, FALSE, requestedFramesPerBuffer, @@ -1376,7 +1376,7 @@ static PaError OpenAndSetupOneAudioUnit( } if( outStreamParams && !inStreamParams ) { /*The callback never calls back if we don't set the FPB */ - /*This seems wierd, because I would think setting anything on the device + /*This seems weird, because I would think setting anything on the device would be disruptive.*/ paResult = setBestFramesPerBuffer( *audioDevice, TRUE, requestedFramesPerBuffer, @@ -1758,7 +1758,7 @@ static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi, else { inputChannelCount = 0; - inputSampleFormat = hostInputSampleFormat = paFloat32; /* Surpress 'uninitialised var' warnings. */ + inputSampleFormat = hostInputSampleFormat = paFloat32; /* Suppress 'uninitialised var' warnings. */ } if( outputParameters ) @@ -1788,7 +1788,7 @@ static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi, else { outputChannelCount = 0; - outputSampleFormat = hostOutputSampleFormat = paFloat32; /* Surpress 'uninitialized var' warnings. */ + outputSampleFormat = hostOutputSampleFormat = paFloat32; /* Suppress 'uninitialized var' warnings. */ } /* validate platform specific flags */ @@ -2182,8 +2182,8 @@ static OSStatus AudioIOProc( void *inRefCon, /* -----------------------------------------------------------------*\ This output may be useful for debugging, - But printing durring the callback is a bad enough idea that - this is not enabled by enableing the usual debugging calls. + But printing during the callback is a bad enough idea that + this is not enabled by enabling the usual debugging calls. \* -----------------------------------------------------------------*/ /* static int renderCount = 0; @@ -2622,7 +2622,7 @@ stop_stream: static PaError CloseStream( PaStream* s ) { /* This may be called from a failed OpenStream. - Therefore, each piece of info is treated seperately. */ + Therefore, each piece of info is treated separately. */ PaError result = paNoError; PaMacCoreStream *stream = (PaMacCoreStream*)s; diff --git a/src/hostapi/coreaudio/pa_mac_core_blocking.c b/src/hostapi/coreaudio/pa_mac_core_blocking.c index 679c6ba..e99d55e 100644 --- a/src/hostapi/coreaudio/pa_mac_core_blocking.c +++ b/src/hostapi/coreaudio/pa_mac_core_blocking.c @@ -213,7 +213,7 @@ PaError blioSetIsInputEmpty( PaMacBlio *blio, bool isEmpty ) goto done; /* we need to update the value. Here's what we do: - * - Lock the mutex, so noone else can write. + * - Lock the mutex, so no one else can write. * - update the value. * - unlock. * - broadcast to all listeners. @@ -239,7 +239,7 @@ PaError blioSetIsOutputFull( PaMacBlio *blio, bool isFull ) goto done; /* we need to update the value. Here's what we do: - * - Lock the mutex, so noone else can write. + * - Lock the mutex, so no one else can write. * - update the value. * - unlock. * - broadcast to all listeners. @@ -334,7 +334,7 @@ PaError destroyBlioRingBuffers( PaMacBlio *blio ) } /* - * this is the BlioCallback function. It expects to recieve a PaMacBlio Object + * this is the BlioCallback function. It expects to receive a PaMacBlio Object * pointer as userData. * */ diff --git a/src/hostapi/coreaudio/pa_mac_core_utilities.c b/src/hostapi/coreaudio/pa_mac_core_utilities.c index f3563ee..c6d8605 100644 --- a/src/hostapi/coreaudio/pa_mac_core_utilities.c +++ b/src/hostapi/coreaudio/pa_mac_core_utilities.c @@ -168,7 +168,7 @@ PaError PaMacCore_SetError(OSStatus error, int line, int isError) errorText = "Audio Unit: Format Not Supported"; result = paInternalError; break; case kAudioUnitErr_Uninitialized: - errorText = "Audio Unit: Unitialized"; + errorText = "Audio Unit: Uninitialized"; result = paInternalError; break; case kAudioUnitErr_InvalidScope: errorText = "Audio Unit: Invalid Scope"; @@ -296,12 +296,12 @@ long computeRingBufferSize( const PaStreamParameters *inputParameters, /* - * Durring testing of core audio, I found that serious crashes could occur + * During testing of core audio, I found that serious crashes could occur * if properties such as sample rate were changed multiple times in rapid * succession. The function below could be used to with a condition variable. * to prevent propertychanges from happening until the last property * change is acknowledged. Instead, I implemented a busy-wait, which is simpler - * to implement b/c in second round of testing (nov '09) property changes occured + * to implement b/c in second round of testing (nov '09) property changes occurred * quickly and so there was no real way to test the condition variable implementation. * therefore, this function is not used, but it is aluded to in commented code below, * since it represents a theoretically better implementation. @@ -505,7 +505,7 @@ PaError setBestSampleRateForDevice( const AudioDeviceID device, if( err ) return ERR( err ); - /* -- otherwise, something wierd happened: we didn't set the rate, and we got no errors. Just bail. */ + /* -- otherwise, something weird happened: we didn't set the rate, and we got no errors. Just bail. */ return paInternalError; } @@ -516,7 +516,7 @@ PaError setBestSampleRateForDevice( const AudioDeviceID device, is available, it uses the smallest available size. actualFramesPerBuffer will be set to the actual value on successful return. OK to pass NULL to actualFramesPerBuffer. - The logic is very simmilar too setBestSampleRate only failure here is + The logic is very similar too setBestSampleRate only failure here is not usually catastrophic. */ PaError setBestFramesPerBuffer( const AudioDeviceID device, diff --git a/src/hostapi/coreaudio/pa_mac_core_utilities.h b/src/hostapi/coreaudio/pa_mac_core_utilities.h index fc65868..e63b3cb 100644 --- a/src/hostapi/coreaudio/pa_mac_core_utilities.h +++ b/src/hostapi/coreaudio/pa_mac_core_utilities.h @@ -81,7 +81,7 @@ #define INPUT_ELEMENT (1) #define OUTPUT_ELEMENT (0) -/* Normal level of debugging: fine for most apps that don't mind the occational warning being printf'ed */ +/* Normal level of debugging: fine for most apps that don't mind the occasional warning being printf'ed */ /* */ #define MAC_CORE_DEBUG @@ -91,7 +91,7 @@ # define DBUG(MSG) #endif -/* Verbose Debugging: useful for developement */ +/* Verbose Debugging: useful for development */ /* #define MAC_CORE_VERBOSE_DEBUG */ @@ -183,7 +183,7 @@ PaError setBestSampleRateForDevice( const AudioDeviceID device, is available, it uses the smallest available size. actualFramesPerBuffer will be set to the actual value on successful return. OK to pass NULL to actualFramesPerBuffer. - The logic is very simmilar too setBestSampleRate only failure here is + The logic is very similar too setBestSampleRate only failure here is not usually catastrophic. */ PaError setBestFramesPerBuffer( const AudioDeviceID device, diff --git a/src/hostapi/dsound/pa_win_ds.c b/src/hostapi/dsound/pa_win_ds.c index 204004d..f3cb67f 100644 --- a/src/hostapi/dsound/pa_win_ds.c +++ b/src/hostapi/dsound/pa_win_ds.c @@ -58,7 +58,7 @@ /* - Use the earliest version of DX required, no need to polute the namespace + Use the earliest version of DX required, no need to pollute the namespace */ #ifdef PAWIN_USE_DIRECTSOUNDFULLDUPLEXCREATE #define DIRECTSOUND_VERSION 0x0800 @@ -667,7 +667,7 @@ static GUID pawin_IID_IKsPropertySet = property, and the other is using DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE. I tried both methods and only the second worked. I found two postings on the net from people who had the same problem with the first method, so I think the method used here is - more common/likely to work. The probem is that IKsPropertySet_Get returns S_OK + more common/likely to work. The problem is that IKsPropertySet_Get returns S_OK but the fields of the device description are not filled in. The mechanism we use works by registering an enumeration callback which is called for @@ -757,7 +757,7 @@ static double defaultSampleRateSearchOrder_[] = /************************************************************************************ ** Extract capabilities from an output device, and add it to the device info list ** if successful. This function assumes that there is enough room in the -** device info list to accomodate all entries. +** device info list to accommodate all entries. ** ** The device will not be added to the device list if any errors are encountered. */ @@ -1014,7 +1014,7 @@ static PaError AddOutputDeviceInfoFromDirectSound( /************************************************************************************ ** Extract capabilities from an input device, and add it to the device info list ** if successful. This function assumes that there is enough room in the -** device info list to accomodate all entries. +** device info list to accommodate all entries. ** ** The device will not be added to the device list if any errors are encountered. */ @@ -2255,7 +2255,7 @@ static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi, /* create half duplex buffers. also used for full-duplex streams which didn't succeed when using the full duplex API. that could happen because - DX8 or greater isnt installed, the i/o devices aren't the same + DX8 or greater isn't installed, the i/o devices aren't the same physical device. etc. */ @@ -2798,7 +2798,7 @@ PA_THREAD_FUNC ProcessingThreadProc( void *pArg ) #else - /* tick using WaitForSingleObject timout */ + /* tick using WaitForSingleObject timeout */ while ( WaitForSingleObject( stream->processingCompleted, timerPeriodMs ) == WAIT_TIMEOUT ) { TimerCallback( 0, 0, (DWORD_PTR)pArg, 0, 0 ); diff --git a/src/hostapi/dsound/pa_win_ds_dynlink.c b/src/hostapi/dsound/pa_win_ds_dynlink.c index c4e3c4e..fdfc8bd 100644 --- a/src/hostapi/dsound/pa_win_ds_dynlink.c +++ b/src/hostapi/dsound/pa_win_ds_dynlink.c @@ -210,7 +210,7 @@ void PaWinDs_TerminateDSoundEntryPoints(void) { if( paWinDsDSoundEntryPoints.hInstance_ != NULL ) { - /* ensure that we crash reliably if the entry points arent initialised */ + /* ensure that we crash reliably if the entry points aren't initialised */ paWinDsDSoundEntryPoints.DirectSoundCreate = 0; paWinDsDSoundEntryPoints.DirectSoundEnumerateW = 0; paWinDsDSoundEntryPoints.DirectSoundEnumerateA = 0; diff --git a/src/hostapi/dsound/pa_win_ds_dynlink.h b/src/hostapi/dsound/pa_win_ds_dynlink.h index fd6d8fe..0fcf967 100644 --- a/src/hostapi/dsound/pa_win_ds_dynlink.h +++ b/src/hostapi/dsound/pa_win_ds_dynlink.h @@ -56,7 +56,7 @@ #endif /* - Use the earliest version of DX required, no need to polute the namespace + Use the earliest version of DX required, no need to pollute the namespace */ #ifdef PAWIN_USE_DIRECTSOUNDFULLDUPLEXCREATE #define DIRECTSOUND_VERSION 0x0800 diff --git a/src/hostapi/oss/pa_unix_oss.c b/src/hostapi/oss/pa_unix_oss.c index 51e9630..9e18d6d 100644 --- a/src/hostapi/oss/pa_unix_oss.c +++ b/src/hostapi/oss/pa_unix_oss.c @@ -466,7 +466,7 @@ static PaError QueryDevice( char *deviceName, PaOSSHostApiRepresentation *ossApi /* douglas: we have to do this querying in a slightly different order. apparently - some sound cards will give you different info based on their settins. + some sound cards will give you different info based on their settings. e.g. a card might give you stereo at 22kHz but only mono at 44kHz. the correct order for OSS is: format, channels, sample rate */ @@ -1335,7 +1335,7 @@ static PaError PaOssStream_WaitForFrames( PaOssStream *stream, unsigned long *fr #ifdef PTHREAD_CANCELED pthread_testcancel(); #else - /* avoid indefinite waiting on thread not supporting cancelation */ + /* avoid indefinite waiting on thread not supporting cancellation */ if( stream->callbackStop || stream->callbackAbort ) { PA_DEBUG(( "Cancelling PaOssStream_WaitForFrames\n" )); @@ -1369,7 +1369,7 @@ static PaError PaOssStream_WaitForFrames( PaOssStream *stream, unsigned long *fr #ifdef PTHREAD_CANCELED pthread_testcancel(); #else - /* avoid indefinite waiting on thread not supporting cancelation */ + /* avoid indefinite waiting on thread not supporting cancellation */ if( stream->callbackStop || stream->callbackAbort ) { PA_DEBUG(( "Cancelling PaOssStream_WaitForFrames\n" )); @@ -1640,7 +1640,7 @@ static void *PaOSS_AudioThreadProc( void *userData ) #ifdef PTHREAD_CANCELED pthread_testcancel(); #else - if( stream->callbackAbort ) /* avoid indefinite waiting on thread not supporting cancelation */ + if( stream->callbackAbort ) /* avoid indefinite waiting on thread not supporting cancellation */ { PA_DEBUG(( "Aborting callback thread\n" )); break; @@ -1681,7 +1681,7 @@ static void *PaOSS_AudioThreadProc( void *userData ) callbackResult = paComplete; } - if( stream->callbackAbort ) /* avoid indefinite waiting on thread not supporting cancelation */ + if( stream->callbackAbort ) /* avoid indefinite waiting on thread not supporting cancellation */ { PA_DEBUG(( "Aborting callback thread\n" )); break; @@ -1793,7 +1793,7 @@ static PaError CloseStream( PaStream* s ) * * Aspect StreamState: After returning, the stream shall be in the Active state, implying that an eventual * callback will be repeatedly called in a separate thread. If a separate thread is started this function - * will block untill it has started processing audio, otherwise audio processing is started directly. + * will block until it has started processing audio, otherwise audio processing is started directly. */ static PaError StartStream( PaStream *s ) { diff --git a/src/hostapi/skeleton/pa_hostapi_skeleton.c b/src/hostapi/skeleton/pa_hostapi_skeleton.c index 6edc22c..cc31435 100644 --- a/src/hostapi/skeleton/pa_hostapi_skeleton.c +++ b/src/hostapi/skeleton/pa_hostapi_skeleton.c @@ -413,7 +413,7 @@ static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi, else { inputChannelCount = 0; - inputSampleFormat = hostInputSampleFormat = paInt16; /* Surpress 'uninitialised var' warnings. */ + inputSampleFormat = hostInputSampleFormat = paInt16; /* Suppress 'uninitialised var' warnings. */ } if( outputParameters ) @@ -442,7 +442,7 @@ static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi, else { outputChannelCount = 0; - outputSampleFormat = hostOutputSampleFormat = paInt16; /* Surpress 'uninitialized var' warnings. */ + outputSampleFormat = hostOutputSampleFormat = paInt16; /* Suppress 'uninitialized var' warnings. */ } /* diff --git a/src/hostapi/wasapi/mingw-include/ksproxy.h b/src/hostapi/wasapi/mingw-include/ksproxy.h index e6e049d..99de340 100644 --- a/src/hostapi/wasapi/mingw-include/ksproxy.h +++ b/src/hostapi/wasapi/mingw-include/ksproxy.h @@ -182,7 +182,7 @@ typedef KS_LogicalMemoryType *PKS_LogicalMemoryType; typedef struct _PIPE_TERMINATION { ULONG Flags; ULONG OutsideFactors; - ULONG Weigth; + ULONG Weight; KS_FRAMING_RANGE PhysicalRange; KS_FRAMING_RANGE_WEIGHTED OptimalRange; KS_COMPRESSION Compression; diff --git a/src/hostapi/wasapi/pa_win_wasapi.c b/src/hostapi/wasapi/pa_win_wasapi.c index 216796e..86c08c2 100644 --- a/src/hostapi/wasapi/pa_win_wasapi.c +++ b/src/hostapi/wasapi/pa_win_wasapi.c @@ -310,7 +310,7 @@ typedef struct _pa_AudioClientProperties { PA_THREAD_FUNC ProcThreadEvent(void *param); PA_THREAD_FUNC ProcThreadPoll(void *param); -// Error codes (availabe since Windows 7) +// Error codes (available since Windows 7) #ifndef AUDCLNT_E_BUFFER_ERROR #define AUDCLNT_E_BUFFER_ERROR AUDCLNT_ERR(0x018) #endif @@ -321,7 +321,7 @@ PA_THREAD_FUNC ProcThreadPoll(void *param); #define AUDCLNT_E_INVALID_DEVICE_PERIOD AUDCLNT_ERR(0x020) #endif -// Stream flags (availabe since Windows 7) +// Stream flags (available since Windows 7) #ifndef AUDCLNT_STREAMFLAGS_SRC_DEFAULT_QUALITY #define AUDCLNT_STREAMFLAGS_SRC_DEFAULT_QUALITY 0x08000000 #endif @@ -489,7 +489,7 @@ typedef struct PaWinUtilComInitializationResult comInitializationResult; - // this is the REAL number of devices, whether they are usefull to PA or not! + // this is the REAL number of devices, whether they are useful to PA or not! UINT32 deviceCount; PaWasapiDeviceInfo *devInfo; @@ -783,7 +783,7 @@ static PaError __LogPaError(PaError err, const char *func, const char *file, int // ------------------------------------------------------------------------------------------ /*! \class ThreadSleepScheduler Allows to emulate thread sleep of less than 1 millisecond under Windows. Scheduler - calculates number of times the thread must run untill next sleep of 1 millisecond. + calculates number of times the thread must run until next sleep of 1 millisecond. It does not make thread sleeping for real number of microseconds but rather controls how many of imaginary microseconds the thread task can allow thread to sleep. */ @@ -3168,7 +3168,7 @@ static void _CalculateAlignedPeriod(PaWasapiSubStream *pSub, UINT32 *nFramesPerL // Align frames to HD Audio packet size of 128 bytes for Exclusive mode only. // Not aligning on Windows Vista will cause Event timeout, although Windows 7 will // return AUDCLNT_E_BUFFER_SIZE_NOT_ALIGNED error to realign buffer. Aligning is necessary - // for Exclusive mode only! when audio data is feeded directly to hardware. + // for Exclusive mode only! when audio data is fed directly to hardware. if (pSub->shareMode == AUDCLNT_SHAREMODE_EXCLUSIVE) { (*nFramesPerLatency) = AlignFramesPerBuffer((*nFramesPerLatency), @@ -3205,7 +3205,7 @@ static void _CalculatePeriodicity(PaWasapiSubStream *pSub, BOOL output, REFERENC REFERENCE_TIME userPeriodicity; // Align frames backwards, so device will likely make buffer read ready when we are ready - // to read it (our sheduling will wait for amount of millisoconds of frames_per_buffer) + // to read it (our scheduling will wait for amount of millisoconds of frames_per_buffer) alignedFrames = AlignFramesPerBuffer(pSub->params.frames_per_buffer, pSub->wavex.Format.nSamplesPerSec, pSub->wavex.Format.nBlockAlign, ALIGN_BWD); @@ -3562,7 +3562,7 @@ static HRESULT CreateAudioClient(PaWasapiStream *pStream, PaWasapiSubStream *pSu _RecalculateBuffersCount(pSub, userFramesPerBuffer, MakeFramesFromHns(pSub->period, pSub->wavex.Format.nSamplesPerSec), fullDuplex); - // No error, client is succesfully created + // No error, client is successfully created (*pa_error) = paNoError; done: @@ -3904,7 +3904,7 @@ static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi, else { inputChannelCount = 0; - inputSampleFormat = hostInputSampleFormat = paInt16; /* Surpress 'uninitialised var' warnings. */ + inputSampleFormat = hostInputSampleFormat = paInt16; /* Suppress 'uninitialised var' warnings. */ } // Try create device: Output @@ -4007,7 +4007,7 @@ static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi, else { outputChannelCount = 0; - outputSampleFormat = hostOutputSampleFormat = paInt16; /* Surpress 'uninitialized var' warnings. */ + outputSampleFormat = hostOutputSampleFormat = paInt16; /* Suppress 'uninitialized var' warnings. */ } // log full-duplex @@ -4065,7 +4065,7 @@ static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi, // serious problem #2 - No, Not a problem, as framesPerHostCallback take into account // sample size while it is not a problem for PA full-duplex, we must care of - // preriod only! + // period only! /*if (stream->out.framesPerHostCallback != stream->in.framesPerHostCallback) { PRINT(("WASAPI: OpenStream: framesPerHostCallback discrepancy\n")); @@ -4636,7 +4636,7 @@ static PaError ReadStream( PaStream* s, void *_buffer, unsigned long frames ) ((BYTE **)user_buffer)[i] = ((BYTE **)_buffer)[i]; } - // Findout if there are tail frames, flush them all before reading hardware + // Find out if there are tail frames, flush them all before reading hardware if ((available = PaUtil_GetRingBufferReadAvailable(stream->in.tailBuffer)) != 0) { ring_buffer_size_t buf1_size = 0, buf2_size = 0, read, desired; @@ -4815,7 +4815,7 @@ static PaError WriteStream( PaStream* s, const void *_buffer, unsigned long fram ((const BYTE **)user_buffer)[i] = ((const BYTE **)_buffer)[i]; } - // Blocking (potentially, untill 'frames' are consumed) loop + // Blocking (potentially, until 'frames' are consumed) loop while (frames != 0) { // Check if blocking call must be interrupted @@ -5694,7 +5694,7 @@ static HRESULT ProcessInputBuffer(PaWasapiStream *stream, PaWasapiHostProcessor if (WaitForSingleObject(stream->hCloseRequest, 0) != WAIT_TIMEOUT) break; - // Findout if any frames available + // Find out if any frames available frames = 0; if ((hr = _PollGetInputFramesAvailable(stream, &frames)) != S_OK) return hr; @@ -6033,7 +6033,7 @@ static UINT32 GetSleepTime(PaWasapiStream *stream, UINT32 sleepTimeIn, UINT32 sl UINT32 sleepTime; // According to the issue [https://github.com/PortAudio/portaudio/issues/303] glitches may occur when user frames - // equal to 1/2 of the host buffer frames, therefore the emperical workaround for this problem is to lower + // equal to 1/2 of the host buffer frames, therefore the empirical workaround for this problem is to lower // the sleep time by 2 if (userFramesOut != 0) { @@ -6157,7 +6157,7 @@ PA_THREAD_FUNC ProcThreadPoll(void *param) // Request fine (1 ms) granularity of the system timer functions to guarantee correct logic around WaitForSingleObject SystemTimer_SetGranularity(&timer, 1); - // Claculate sleep time of the processing loop (inside WaitForSingleObject) + // Calculate sleep time of the processing loop (inside WaitForSingleObject) sleepTime = ConfigureLoopSleepTimeAndScheduler(stream, &scheduler); // Setup data processors @@ -6376,10 +6376,10 @@ PA_THREAD_FUNC ProcThreadPoll(void *param) break; } - // process equal ammount of frames + // process equal amount of frames if (o_frames >= i_frames) { - // process input ammount of frames + // process input amount of frames UINT32 o_processed = i_frames; // get host output buffer diff --git a/src/hostapi/wdmks/pa_win_wdmks.c b/src/hostapi/wdmks/pa_win_wdmks.c index add663b..f30ee95 100644 --- a/src/hostapi/wdmks/pa_win_wdmks.c +++ b/src/hostapi/wdmks/pa_win_wdmks.c @@ -4380,7 +4380,7 @@ static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi, else { userInputChannels = 0; - inputSampleFormat = hostInputSampleFormat = paInt16; /* Supress 'uninitialised var' warnings. */ + inputSampleFormat = hostInputSampleFormat = paInt16; /* Suppress 'uninitialised var' warnings. */ } if( outputParameters ) @@ -4415,7 +4415,7 @@ static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi, else { userOutputChannels = 0; - outputSampleFormat = hostOutputSampleFormat = paInt16; /* Supress 'uninitialized var' warnings. */ + outputSampleFormat = hostOutputSampleFormat = paInt16; /* Suppress 'uninitialized var' warnings. */ } /* validate platform specific flags */ diff --git a/src/hostapi/wdmks/readme.txt b/src/hostapi/wdmks/readme.txt index c4c349c..611acc7 100644 --- a/src/hostapi/wdmks/readme.txt +++ b/src/hostapi/wdmks/readme.txt @@ -52,7 +52,7 @@ by the user, and can be limited in functionality or difficult to use. This is where the PortAudio "WDM-KS" host implementation comes in. It directly connects PortAudio to the same Kernel Streaming API which -those ASIO bridges use. This avoids the mixing penatly of DirectX, +those ASIO bridges use. This avoids the mixing penalty of DirectX, giving at least as good latency as any ASIO driver, but it has the advantage of working with ANY Windows audio hardware which is available through the normal MME/DirectX routes without the user requiring diff --git a/src/hostapi/wmme/pa_win_wmme.c b/src/hostapi/wmme/pa_win_wmme.c index 422c867..8a07bab 100644 --- a/src/hostapi/wmme/pa_win_wmme.c +++ b/src/hostapi/wmme/pa_win_wmme.c @@ -58,7 +58,7 @@ RDB20020417 - stopped counting WAVE_MAPPER when there were no real devices refactoring, renaming and fixed a few edge case bugs RDB20020531 - converted to V19 framework - ** NOTE maintanance history is now stored in CVS ** + ** NOTE maintenance history is now stored in CVS ** */ /** @file @@ -192,7 +192,7 @@ /* When client suggestedLatency could result in many host buffers, we aim to have around 8, based off Windows documentation that suggests that the kmixer uses 8 buffers. This choice - is somewhat arbitrary here, since we havn't observed significant stability degredation + is somewhat arbitrary here, since we haven't observed significant stability degredation with using either more, or less buffers. */ #define PA_MME_TARGET_HOST_BUFFER_COUNT_ 8 @@ -2563,7 +2563,7 @@ static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi, stream->primeStreamUsingCallback = ( (streamFlags&paPrimeOutputBuffersUsingStreamCallback) && streamCallback ) ? 1 : 0; /* time to sleep when throttling due to >100% cpu usage. - -a quater of a buffer's duration */ + -a quarter of a buffer's duration */ stream->throttledSleepMsecs = (unsigned long)(stream->bufferProcessor.framesPerHostBuffer * stream->bufferProcessor.samplePeriod * .25 * 1000); @@ -2886,7 +2886,7 @@ PA_THREAD_FUNC ProcessingThreadProc( void *pArg ) if( waitResult == WAIT_FAILED ) { result = paUnanticipatedHostError; - /** @todo FIXME/REVIEW: can't return host error info from an asyncronous thread. see http://www.portaudio.com/trac/ticket/143 */ + /** @todo FIXME/REVIEW: can't return host error info from an asynchronous thread. see http://www.portaudio.com/trac/ticket/143 */ done = 1; } else if( waitResult == WAIT_TIMEOUT ) @@ -3161,7 +3161,7 @@ PA_THREAD_FUNC ProcessingThreadProc( void *pArg ) if( outputUnderflow && !done && !stream->stopProcessing ) { /* Recover from underflow in the case where the - underflow occured while processing the buffer + underflow occurred while processing the buffer we just finished */ result = CatchUpOutputBuffers( stream ); @@ -3359,7 +3359,7 @@ static PaError StartStream( PaStream *s ) } } - /* we queue all channels of a single buffer frame (accross all + /* we queue all channels of a single buffer frame (across all devices, because some multidevice multichannel drivers work better this way */ for( j=0; joutput.deviceCount; ++j ) diff --git a/src/os/unix/pa_unix_util.h b/src/os/unix/pa_unix_util.h index c401f19..2a62fe8 100644 --- a/src/os/unix/pa_unix_util.h +++ b/src/os/unix/pa_unix_util.h @@ -182,7 +182,7 @@ PaError PaUnixThreading_Initialize( void ); /** Spawn a thread. * * Intended for spawning the callback thread from the main thread. This function can even block (for a certain - * time or indefinitely) untill notified by the callback thread (using PaUnixThread_NotifyParent), which can be + * time or indefinitely) until notified by the callback thread (using PaUnixThread_NotifyParent), which can be * useful in order to make sure that callback has commenced before returning from Pa_StartStream. * @param threadFunc: The function to be executed in the child thread. * @param waitForChild: If not 0, wait for child thread to call PaUnixThread_NotifyParent. Less than 0 means @@ -195,7 +195,7 @@ PaError PaUnixThread_New( PaUnixThread* self, void* (*threadFunc)( void* ), void /** Terminate thread. * - * @param wait: If true, request that background thread stop and wait untill it does, else cancel it. + * @param wait: If true, request that background thread stop and wait until it does, else cancel it. * @param exitResult: If non-null this will upon return contain the exit status of the thread. */ PaError PaUnixThread_Terminate( PaUnixThread* self, int wait, PaError* exitResult ); diff --git a/src/os/win/pa_win_waveformat.c b/src/os/win/pa_win_waveformat.c index 5c6f29d..933cb78 100644 --- a/src/os/win/pa_win_waveformat.c +++ b/src/os/win/pa_win_waveformat.c @@ -134,7 +134,7 @@ PaWinWaveFormatChannelMask PaWin_DefaultChannelMask( int numChannels ) /* case 7: */ case 8: /* RoBi: PAWIN_SPEAKER_7POINT1_SURROUND fits normal surround sound setups better than PAWIN_SPEAKER_7POINT1, f.i. NVidia HDMI Audio - output is silent on channels 5&6 with NVidia drivers, and channel 7&8 with Micrsoft HD Audio driver using PAWIN_SPEAKER_7POINT1. + output is silent on channels 5&6 with NVidia drivers, and channel 7&8 with Microsoft HD Audio driver using PAWIN_SPEAKER_7POINT1. With PAWIN_SPEAKER_7POINT1_SURROUND both setups work OK. */ return PAWIN_SPEAKER_7POINT1_SURROUND; } @@ -149,7 +149,7 @@ PaWinWaveFormatChannelMask PaWin_DefaultChannelMask( int numChannels ) /* Note that Alec Rogers proposed the following as an alternate method to generate the default channel mask, however it doesn't seem to be an improvement over the above, since some drivers will matrix outputs mapping to non-present - speakers accross multiple physical speakers. + speakers across multiple physical speakers. if(nChannels==1) { pwfFormat->dwChannelMask = SPEAKER_FRONT_CENTER; diff --git a/src/os/win/pa_win_wdmks_utils.h b/src/os/win/pa_win_wdmks_utils.h index b8e923a..5a7a338 100644 --- a/src/os/win/pa_win_wdmks_utils.h +++ b/src/os/win/pa_win_wdmks_utils.h @@ -51,7 +51,7 @@ extern "C" { specified device. Returns 0 if the query fails for any reason. @param wcharDevicePath A system level PnP interface path, supplied as a WCHAR unicode string. - Declard as void* to avoid introducing a dependency on wchar_t here. + Declared as void* to avoid introducing a dependency on wchar_t here. @param isInput A flag specifying whether to query for input (non-zero) or output (zero) channels. */ diff --git a/src/os/win/pa_x86_plain_converters.c b/src/os/win/pa_x86_plain_converters.c index ae43d28..44a6d67 100644 --- a/src/os/win/pa_x86_plain_converters.c +++ b/src/os/win/pa_x86_plain_converters.c @@ -55,7 +55,7 @@ TODO: o- inline dither code o- implement Dither only (no-clip) versions o- implement int8 and uint8 versions - o- test thouroughly + o- test thoroughly o- the packed 24 bit functions could benefit from unrolling and avoiding byte and word sized register access. @@ -116,7 +116,7 @@ TODO: /* -EMT64/AMD64 uses different asm - -VC2005 doesnt allow _WIN64 with inline assembly either! + -VC2005 doesn't allow _WIN64 with inline assembly either! */ void PaUtil_InitializeX86PlainConverters( void ) { diff --git a/test/pa_minlat.c b/test/pa_minlat.c index 0106cf3..a91f9e0 100644 --- a/test/pa_minlat.c +++ b/test/pa_minlat.c @@ -198,7 +198,7 @@ int main( int argc, char **argv ) return 0; error: Pa_Terminate(); - fprintf( stderr, "An error occured while using the portaudio stream\n" ); + fprintf( stderr, "An error occurred while using the portaudio stream\n" ); fprintf( stderr, "Error number: %d\n", err ); fprintf( stderr, "Error message: %s\n", Pa_GetErrorText( err ) ); return 1; diff --git a/test/patest1.c b/test/patest1.c index a0fae47..2ad9c38 100644 --- a/test/patest1.c +++ b/test/patest1.c @@ -121,7 +121,7 @@ int main(int argc, char* argv[]) data.phase = 0; data.sampsToGo = SAMPLE_RATE * 20; /* 20 seconds. */ - /* initialise portaudio subsytem */ + /* initialise portaudio subsystem */ err = Pa_Initialize(); inputParameters.device = Pa_GetDefaultInputDevice(); /* default input device */ @@ -179,7 +179,7 @@ done: if( err != paNoError ) { - fprintf( stderr, "An error occured while using portaudio\n" ); + fprintf( stderr, "An error occurred while using portaudio\n" ); if( err == paUnanticipatedHostError ) { fprintf( stderr, " unanticipated host error.\n"); diff --git a/test/patest_buffer.c b/test/patest_buffer.c index 830b3ac..090b529 100644 --- a/test/patest_buffer.c +++ b/test/patest_buffer.c @@ -198,7 +198,7 @@ PaError TestOnce( int buffersize, PaDeviceIndex device ) return paNoError; error: Pa_Terminate(); - fprintf( stderr, "An error occured while using the portaudio stream\n" ); + fprintf( stderr, "An error occurred while using the portaudio stream\n" ); fprintf( stderr, "Error number: %d\n", err ); fprintf( stderr, "Error message: %s\n", Pa_GetErrorText( err ) ); fprintf( stderr, "Host Error message: %s\n", Pa_GetLastHostErrorInfo()->errorText ); diff --git a/test/patest_callbackstop.c b/test/patest_callbackstop.c index bd6e829..aa7f7fd 100644 --- a/test/patest_callbackstop.c +++ b/test/patest_callbackstop.c @@ -245,7 +245,7 @@ int main(void) return err; error: Pa_Terminate(); - fprintf( stderr, "An error occured while using the portaudio stream\n" ); + fprintf( stderr, "An error occurred while using the portaudio stream\n" ); fprintf( stderr, "Error number: %d\n", err ); fprintf( stderr, "Error message: %s\n", Pa_GetErrorText( err ) ); return err; diff --git a/test/patest_clip.c b/test/patest_clip.c index e86d0ac..97ef211 100644 --- a/test/patest_clip.c +++ b/test/patest_clip.c @@ -135,7 +135,7 @@ int main(void) return 0; error: - fprintf( stderr, "An error occured while using the portaudio stream\n" ); + fprintf( stderr, "An error occurred while using the portaudio stream\n" ); fprintf( stderr, "Error number: %d\n", err ); fprintf( stderr, "Error message: %s\n", Pa_GetErrorText( err ) ); return 1; diff --git a/test/patest_dither.c b/test/patest_dither.c index e694c8b..5f471b1 100644 --- a/test/patest_dither.c +++ b/test/patest_dither.c @@ -179,7 +179,7 @@ int main(void) done: if (err) { - fprintf( stderr, "An error occured while using the portaudio stream\n" ); + fprintf( stderr, "An error occurred while using the portaudio stream\n" ); fprintf( stderr, "Error number: %d\n", err ); fprintf( stderr, "Error message: %s\n", Pa_GetErrorText( err ) ); err = 1; /* Though PlaySine() already called Pa_Terminate(), */ diff --git a/test/patest_dsound_low_level_latency_params.c b/test/patest_dsound_low_level_latency_params.c index a1e7c7e..59734e2 100644 --- a/test/patest_dsound_low_level_latency_params.c +++ b/test/patest_dsound_low_level_latency_params.c @@ -179,7 +179,7 @@ int main(int argc, char* argv[]) return err; error: Pa_Terminate(); - fprintf( stderr, "An error occured while using the portaudio stream\n" ); + fprintf( stderr, "An error occurred while using the portaudio stream\n" ); fprintf( stderr, "Error number: %d\n", err ); fprintf( stderr, "Error message: %s\n", Pa_GetErrorText( err ) ); return err; diff --git a/test/patest_dsound_surround.c b/test/patest_dsound_surround.c index 3ffd151..e39bc91 100644 --- a/test/patest_dsound_surround.c +++ b/test/patest_dsound_surround.c @@ -197,7 +197,7 @@ int main(int argc, char* argv[]) return err; error: Pa_Terminate(); - fprintf( stderr, "An error occured while using the portaudio stream\n" ); + fprintf( stderr, "An error occurred while using the portaudio stream\n" ); fprintf( stderr, "Error number: %d\n", err ); fprintf( stderr, "Error message: %s\n", Pa_GetErrorText( err ) ); return err; diff --git a/test/patest_hang.c b/test/patest_hang.c index 6bda629..e317261 100644 --- a/test/patest_hang.c +++ b/test/patest_hang.c @@ -157,7 +157,7 @@ int main(void) return err; error: Pa_Terminate(); - fprintf( stderr, "An error occured while using the portaudio stream\n" ); + fprintf( stderr, "An error occurred while using the portaudio stream\n" ); fprintf( stderr, "Error number: %d\n", err ); fprintf( stderr, "Error message: %s\n", Pa_GetErrorText( err ) ); return err; diff --git a/test/patest_in_overflow.c b/test/patest_in_overflow.c index 1f2a837..5ce50d3 100644 --- a/test/patest_in_overflow.c +++ b/test/patest_in_overflow.c @@ -5,7 +5,7 @@ This test uses the same method to overload the stream as does patest_out_underflow.c -- it generates sine waves until the cpu load exceeds a certain level. However this test is only concerned with - input and so doesn't ouput any sound. + input and so doesn't output any sound. @author Ross Bencina @author Phil Burk @@ -229,7 +229,7 @@ int main(void) return err; error: Pa_Terminate(); - fprintf( stderr, "An error occured while using the portaudio stream\n" ); + fprintf( stderr, "An error occurred while using the portaudio stream\n" ); fprintf( stderr, "Error number: %d\n", err ); fprintf( stderr, "Error message: %s\n", Pa_GetErrorText( err ) ); return err; diff --git a/test/patest_jack_wasapi.c b/test/patest_jack_wasapi.c index f01297a..6175f88 100644 --- a/test/patest_jack_wasapi.c +++ b/test/patest_jack_wasapi.c @@ -305,7 +305,7 @@ int main(void) int jackCount = 0; int isInput = 0; - printf("PortAudio Test: WASAPI Jack Configuratin"); + printf("PortAudio Test: WASAPI Jack Configuration"); err = Pa_Initialize(); if( err != paNoError ) goto error; @@ -336,7 +336,7 @@ int main(void) error: Pa_Terminate(); - fprintf( stderr, "An error occured while using the portaudio stream\n" ); + fprintf( stderr, "An error occurred while using the portaudio stream\n" ); fprintf( stderr, "Error number: %d\n", err ); fprintf( stderr, "Error message: %s\n", Pa_GetErrorText( err ) ); return err; diff --git a/test/patest_latency.c b/test/patest_latency.c index bbc6fe6..2078a04 100644 --- a/test/patest_latency.c +++ b/test/patest_latency.c @@ -186,7 +186,7 @@ int main(void) return err; error: Pa_Terminate(); - fprintf( stderr, "An error occured while using the portaudio stream\n" ); + fprintf( stderr, "An error occurred while using the portaudio stream\n" ); fprintf( stderr, "Error number: %d\n", err ); fprintf( stderr, "Error message: %s\n", Pa_GetErrorText( err ) ); return err; diff --git a/test/patest_leftright.c b/test/patest_leftright.c index 33ccf12..11ce463 100644 --- a/test/patest_leftright.c +++ b/test/patest_leftright.c @@ -178,7 +178,7 @@ int main(void) return err; error: Pa_Terminate(); - fprintf( stderr, "An error occured while using the portaudio stream\n" ); + fprintf( stderr, "An error occurred while using the portaudio stream\n" ); fprintf( stderr, "Error number: %d\n", err ); fprintf( stderr, "Error message: %s\n", Pa_GetErrorText( err ) ); return err; diff --git a/test/patest_longsine.c b/test/patest_longsine.c index 3eba0ce..e466ff3 100644 --- a/test/patest_longsine.c +++ b/test/patest_longsine.c @@ -144,7 +144,7 @@ int main(void) error: Pa_Terminate(); - fprintf( stderr, "An error occured while using the portaudio stream\n" ); + fprintf( stderr, "An error occurred while using the portaudio stream\n" ); fprintf( stderr, "Error number: %d\n", err ); fprintf( stderr, "Error message: %s\n", Pa_GetErrorText( err ) ); return err; diff --git a/test/patest_many.c b/test/patest_many.c index 083fdb4..b6bc314 100644 --- a/test/patest_many.c +++ b/test/patest_many.c @@ -203,7 +203,7 @@ PaError TestOnce( void ) return paNoError; error: Pa_Terminate(); - fprintf( stderr, "An error occured while using the portaudio stream\n" ); + fprintf( stderr, "An error occurred while using the portaudio stream\n" ); fprintf( stderr, "Error number: %d\n", err ); fprintf( stderr, "Error message: %s\n", Pa_GetErrorText( err ) ); return err; diff --git a/test/patest_maxsines.c b/test/patest_maxsines.c index 49db8d2..672a492 100644 --- a/test/patest_maxsines.c +++ b/test/patest_maxsines.c @@ -209,7 +209,7 @@ int main(void) return err; error: Pa_Terminate(); - fprintf( stderr, "An error occured while using the portaudio stream\n" ); + fprintf( stderr, "An error occurred while using the portaudio stream\n" ); fprintf( stderr, "Error number: %d\n", err ); fprintf( stderr, "Error message: %s\n", Pa_GetErrorText( err ) ); return err; diff --git a/test/patest_mono.c b/test/patest_mono.c index 40c9d64..3af09f5 100644 --- a/test/patest_mono.c +++ b/test/patest_mono.c @@ -148,7 +148,7 @@ int main(void) return err; error: Pa_Terminate(); - fprintf( stderr, "An error occured while using the portaudio stream\n" ); + fprintf( stderr, "An error occurred while using the portaudio stream\n" ); fprintf( stderr, "Error number: %d\n", err ); fprintf( stderr, "Error message: %s\n", Pa_GetErrorText( err ) ); return err; diff --git a/test/patest_multi_sine.c b/test/patest_multi_sine.c index 2b11bfc..ad3db44 100644 --- a/test/patest_multi_sine.c +++ b/test/patest_multi_sine.c @@ -196,7 +196,7 @@ int main(void) done: if (err) { - fprintf(stderr, "An error occured while using the portaudio stream\n"); + fprintf(stderr, "An error occurred while using the portaudio stream\n"); fprintf(stderr, "Error number: %d\n", err ); fprintf(stderr, "Error message: %s\n", Pa_GetErrorText(err)); } diff --git a/test/patest_out_underflow.c b/test/patest_out_underflow.c index dee90f8..86a35cb 100644 --- a/test/patest_out_underflow.c +++ b/test/patest_out_underflow.c @@ -244,7 +244,7 @@ int main(void) return err; error: Pa_Terminate(); - fprintf( stderr, "An error occured while using the portaudio stream\n" ); + fprintf( stderr, "An error occurred while using the portaudio stream\n" ); fprintf( stderr, "Error number: %d\n", err ); fprintf( stderr, "Error message: %s\n", Pa_GetErrorText( err ) ); return err; diff --git a/test/patest_prime.c b/test/patest_prime.c index 045757e..98acd60 100644 --- a/test/patest_prime.c +++ b/test/patest_prime.c @@ -92,7 +92,7 @@ static int patestCallback( const void *inputBuffer, void *outputBuffer, unsigned int i; int result = paContinue; - /* supress unused parameter warnings */ + /* suppress unused parameter warnings */ (void) inputBuffer; (void) timeInfo; (void) statusFlags; @@ -227,7 +227,7 @@ int main(void) return err; error: Pa_Terminate(); - fprintf( stderr, "An error occured while using the portaudio stream\n" ); + fprintf( stderr, "An error occurred while using the portaudio stream\n" ); fprintf( stderr, "Error number: %d\n", err ); fprintf( stderr, "Error message: %s\n", Pa_GetErrorText( err ) ); return err; diff --git a/test/patest_read_record.c b/test/patest_read_record.c index e8e5561..ae92ea2 100644 --- a/test/patest_read_record.c +++ b/test/patest_read_record.c @@ -236,7 +236,7 @@ int main(void) error: Pa_Terminate(); - fprintf( stderr, "An error occured while using the portaudio stream\n" ); + fprintf( stderr, "An error occurred while using the portaudio stream\n" ); fprintf( stderr, "Error number: %d\n", err ); fprintf( stderr, "Error message: %s\n", Pa_GetErrorText( err ) ); return -1; diff --git a/test/patest_sine8.c b/test/patest_sine8.c index c00319a..3688dd1 100644 --- a/test/patest_sine8.c +++ b/test/patest_sine8.c @@ -209,7 +209,7 @@ int main(void) return err; error: Pa_Terminate(); - fprintf( stderr, "An error occured while using the portaudio stream\n" ); + fprintf( stderr, "An error occurred while using the portaudio stream\n" ); fprintf( stderr, "Error number: %d\n", err ); fprintf( stderr, "Error message: %s\n", Pa_GetErrorText( err ) ); return err; diff --git a/test/patest_sine_channelmaps.c b/test/patest_sine_channelmaps.c index 3d0d4c0..83608b8 100644 --- a/test/patest_sine_channelmaps.c +++ b/test/patest_sine_channelmaps.c @@ -183,7 +183,7 @@ int main(void) return err; error: Pa_Terminate(); - fprintf( stderr, "An error occured while using the portaudio stream\n" ); + fprintf( stderr, "An error occurred while using the portaudio stream\n" ); fprintf( stderr, "Error number: %d\n", err ); fprintf( stderr, "Error message: %s\n", Pa_GetErrorText( err ) ); return err; diff --git a/test/patest_sine_formats.c b/test/patest_sine_formats.c index 5d01155..eb28334 100644 --- a/test/patest_sine_formats.c +++ b/test/patest_sine_formats.c @@ -196,7 +196,7 @@ int main(void) return err; error: Pa_Terminate(); - fprintf( stderr, "An error occured while using the portaudio stream\n" ); + fprintf( stderr, "An error occurred while using the portaudio stream\n" ); fprintf( stderr, "Error number: %d\n", err ); fprintf( stderr, "Error message: %s\n", Pa_GetErrorText( err ) ); return err; diff --git a/test/patest_sine_srate.c b/test/patest_sine_srate.c index 106a972..5fd07bd 100644 --- a/test/patest_sine_srate.c +++ b/test/patest_sine_srate.c @@ -175,7 +175,7 @@ int main(void) return err; error: Pa_Terminate(); - fprintf( stderr, "An error occured while using the portaudio stream\n" ); + fprintf( stderr, "An error occurred while using the portaudio stream\n" ); fprintf( stderr, "Error number: %d\n", err ); fprintf( stderr, "Error message: %s\n", Pa_GetErrorText( err ) ); return err; diff --git a/test/patest_sine_time.c b/test/patest_sine_time.c index 0d6a1da..1d4f551 100644 --- a/test/patest_sine_time.c +++ b/test/patest_sine_time.c @@ -212,7 +212,7 @@ int main(void) error: Pa_Terminate(); - fprintf( stderr, "An error occured while using the portaudio stream\n" ); + fprintf( stderr, "An error occurred while using the portaudio stream\n" ); fprintf( stderr, "Error number: %d\n", err ); fprintf( stderr, "Error message: %s\n", Pa_GetErrorText( err ) ); return err; diff --git a/test/patest_start_stop.c b/test/patest_start_stop.c index cf82b67..ec902cf 100644 --- a/test/patest_start_stop.c +++ b/test/patest_start_stop.c @@ -167,7 +167,7 @@ int main(void) return err; error: Pa_Terminate(); - fprintf( stderr, "An error occured while using the portaudio stream\n" ); + fprintf( stderr, "An error occurred while using the portaudio stream\n" ); fprintf( stderr, "Error number: %d\n", err ); fprintf( stderr, "Error message: %s\n", Pa_GetErrorText( err ) ); return err; diff --git a/test/patest_stop.c b/test/patest_stop.c index bc417cc..2ebd97a 100644 --- a/test/patest_stop.c +++ b/test/patest_stop.c @@ -317,7 +317,7 @@ int TestStopMode( paTestData *data ) error: Pa_Terminate(); - fprintf( stderr, "An error occured while using the portaudio stream\n" ); + fprintf( stderr, "An error occurred while using the portaudio stream\n" ); fprintf( stderr, "Error number: %d\n", err ); fprintf( stderr, "Error message: %s\n", Pa_GetErrorText( err ) ); return err; diff --git a/test/patest_stop_playout.c b/test/patest_stop_playout.c index 9a451eb..17e09f3 100644 --- a/test/patest_stop_playout.c +++ b/test/patest_stop_playout.c @@ -471,7 +471,7 @@ int main(void) error: Pa_Terminate(); - fprintf( stderr, "An error occured while using the portaudio stream\n" ); + fprintf( stderr, "An error occurred while using the portaudio stream\n" ); fprintf( stderr, "Error number: %d\n", err ); fprintf( stderr, "Error message: %s\n", Pa_GetErrorText( err ) ); return err; diff --git a/test/patest_suggested_vs_streaminfo_latency.c b/test/patest_suggested_vs_streaminfo_latency.c index 0b7f21d..204e964 100644 --- a/test/patest_suggested_vs_streaminfo_latency.c +++ b/test/patest_suggested_vs_streaminfo_latency.c @@ -262,7 +262,7 @@ int main( int argc, const char* argv[] ) return err; error: Pa_Terminate(); - fprintf( stderr, "An error occured while using the portaudio stream\n" ); + fprintf( stderr, "An error occurred while using the portaudio stream\n" ); fprintf( stderr, "Error number: %d\n", err ); fprintf( stderr, "Error message: %s\n", Pa_GetErrorText( err ) ); return err; diff --git a/test/patest_sync.c b/test/patest_sync.c index a064be1..d3a8c0f 100644 --- a/test/patest_sync.c +++ b/test/patest_sync.c @@ -264,7 +264,7 @@ int main(void) return err; error: Pa_Terminate(); - fprintf( stderr, "An error occured while using the portaudio stream\n" ); + fprintf( stderr, "An error occurred while using the portaudio stream\n" ); fprintf( stderr, "Error number: %d\n", err ); fprintf( stderr, "Error message: %s\n", Pa_GetErrorText( err ) ); return err; diff --git a/test/patest_timing.c b/test/patest_timing.c index ed8a11a..659ec24 100644 --- a/test/patest_timing.c +++ b/test/patest_timing.c @@ -166,7 +166,7 @@ int main(void) return err; error: Pa_Terminate(); - fprintf( stderr, "An error occured while using the portaudio stream\n" ); + fprintf( stderr, "An error occurred while using the portaudio stream\n" ); fprintf( stderr, "Error number: %d\n", err ); fprintf( stderr, "Error message: %s\n", Pa_GetErrorText( err ) ); return err; diff --git a/test/patest_toomanysines.c b/test/patest_toomanysines.c index 4722f5e..072b022 100644 --- a/test/patest_toomanysines.c +++ b/test/patest_toomanysines.c @@ -193,7 +193,7 @@ int main(void) return err; error: Pa_Terminate(); - fprintf( stderr, "An error occured while using the portaudio stream\n" ); + fprintf( stderr, "An error occurred while using the portaudio stream\n" ); fprintf( stderr, "Error number: %d\n", err ); fprintf( stderr, "Error message: %s\n", Pa_GetErrorText( err ) ); return err; diff --git a/test/patest_two_rates.c b/test/patest_two_rates.c index 5a2b178..5148fe7 100644 --- a/test/patest_two_rates.c +++ b/test/patest_two_rates.c @@ -171,7 +171,7 @@ int main(void) return err; error: Pa_Terminate(); - fprintf( stderr, "An error occured while using the portaudio stream\n" ); + fprintf( stderr, "An error occurred while using the portaudio stream\n" ); fprintf( stderr, "Error number: %d\n", err ); fprintf( stderr, "Error message: %s\n", Pa_GetErrorText( err ) ); return err; diff --git a/test/patest_underflow.c b/test/patest_underflow.c index e1726a6..430de62 100644 --- a/test/patest_underflow.c +++ b/test/patest_underflow.c @@ -155,7 +155,7 @@ int main(void) return err; error: Pa_Terminate(); - fprintf( stderr, "An error occured while using the portaudio stream\n" ); + fprintf( stderr, "An error occurred while using the portaudio stream\n" ); fprintf( stderr, "Error number: %d\n", err ); fprintf( stderr, "Error message: %s\n", Pa_GetErrorText( err ) ); return err; diff --git a/test/patest_unplug.c b/test/patest_unplug.c index ba55b7d..e546921 100644 --- a/test/patest_unplug.c +++ b/test/patest_unplug.c @@ -235,7 +235,7 @@ int main(int argc, char **args) return paNoError; error: Pa_Terminate(); - fprintf( stderr, "An error occured while using the portaudio stream\n" ); + fprintf( stderr, "An error occurred while using the portaudio stream\n" ); fprintf( stderr, "Error number: %d\n", err ); fprintf( stderr, "Error message: %s\n", Pa_GetErrorText( err ) ); fprintf( stderr, "Host Error message: %s\n", Pa_GetLastHostErrorInfo()->errorText ); diff --git a/test/patest_wire.c b/test/patest_wire.c index ba3477b..a5f3ffc 100644 --- a/test/patest_wire.c +++ b/test/patest_wire.c @@ -246,7 +246,7 @@ done: error: Pa_Terminate(); - fprintf( stderr, "An error occured while using the portaudio stream\n" ); + fprintf( stderr, "An error occurred while using the portaudio stream\n" ); fprintf( stderr, "Error number: %d\n", err ); fprintf( stderr, "Error message: %s\n", Pa_GetErrorText( err ) ); printf("Hit ENTER to quit.\n"); fflush(stdout); diff --git a/test/patest_wmme_find_best_latency_params.c b/test/patest_wmme_find_best_latency_params.c index 618b97e..0149f9e 100644 --- a/test/patest_wmme_find_best_latency_params.c +++ b/test/patest_wmme_find_best_latency_params.c @@ -62,7 +62,7 @@ #define CHANNEL_COUNT (2) -/* seach parameters. we test all buffer counts in this range */ +/* search parameters. we test all buffer counts in this range */ #define MIN_WMME_BUFFER_COUNT (2) #define MAX_WMME_BUFFER_COUNT (12) @@ -510,7 +510,7 @@ int main(int argc, char* argv[]) return err; error: Pa_Terminate(); - fprintf( stderr, "An error occured while using the portaudio stream\n" ); + fprintf( stderr, "An error occurred while using the portaudio stream\n" ); fprintf( stderr, "Error number: %d\n", err ); fprintf( stderr, "Error message: %s\n", Pa_GetErrorText( err ) ); return err; diff --git a/test/patest_wmme_low_level_latency_params.c b/test/patest_wmme_low_level_latency_params.c index a28c88b..aa4d71e 100644 --- a/test/patest_wmme_low_level_latency_params.c +++ b/test/patest_wmme_low_level_latency_params.c @@ -184,7 +184,7 @@ int main(int argc, char* argv[]) return err; error: Pa_Terminate(); - fprintf( stderr, "An error occured while using the portaudio stream\n" ); + fprintf( stderr, "An error occurred while using the portaudio stream\n" ); fprintf( stderr, "Error number: %d\n", err ); fprintf( stderr, "Error message: %s\n", Pa_GetErrorText( err ) ); return err; diff --git a/test/patest_write_stop.c b/test/patest_write_stop.c index 243e774..ce5b597 100644 --- a/test/patest_write_stop.c +++ b/test/patest_write_stop.c @@ -158,7 +158,7 @@ int main(void) return err; error: Pa_Terminate(); - fprintf( stderr, "An error occured while using the portaudio stream\n" ); + fprintf( stderr, "An error occurred while using the portaudio stream\n" ); fprintf( stderr, "Error number: %d\n", err ); fprintf( stderr, "Error message: %s\n", Pa_GetErrorText( err ) ); return err; diff --git a/test/patest_write_stop_hang_illegal.c b/test/patest_write_stop_hang_illegal.c index ed93425..5521c8d 100644 --- a/test/patest_write_stop_hang_illegal.c +++ b/test/patest_write_stop_hang_illegal.c @@ -161,7 +161,7 @@ int main(void) return err; error: Pa_Terminate(); - fprintf( stderr, "An error occured while using the portaudio stream\n" ); + fprintf( stderr, "An error occurred while using the portaudio stream\n" ); fprintf( stderr, "Error number: %d\n", err ); fprintf( stderr, "Error message: %s\n", Pa_GetErrorText( err ) ); return err; From 0588b306c4791665a260096616607452b24b1430 Mon Sep 17 00:00:00 2001 From: luzpaz Date: Sat, 12 Dec 2020 21:35:50 -0500 Subject: [PATCH 045/164] Revert typo Co-authored-by: Phil Burk --- src/hostapi/wasapi/mingw-include/ksproxy.h | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/hostapi/wasapi/mingw-include/ksproxy.h b/src/hostapi/wasapi/mingw-include/ksproxy.h index 99de340..fcbc6b3 100644 --- a/src/hostapi/wasapi/mingw-include/ksproxy.h +++ b/src/hostapi/wasapi/mingw-include/ksproxy.h @@ -182,7 +182,7 @@ typedef KS_LogicalMemoryType *PKS_LogicalMemoryType; typedef struct _PIPE_TERMINATION { ULONG Flags; ULONG OutsideFactors; - ULONG Weight; + ULONG Weigth; KS_FRAMING_RANGE PhysicalRange; KS_FRAMING_RANGE_WEIGHTED OptimalRange; KS_COMPRESSION Compression; @@ -636,4 +636,3 @@ DECLARE_INTERFACE_(IKsTopology,IUnknown) #endif #endif /* __KSPROXY__ */ - From 8f63b5180830ad3da103597305f4504fa4935148 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Sch=C3=BCrmann?= Date: Mon, 14 Dec 2020 08:03:04 +0100 Subject: [PATCH 046/164] Don't crash for alsa_snd_pcm_poll_descriptors fail in another case --- src/hostapi/alsa/pa_linux_alsa.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/hostapi/alsa/pa_linux_alsa.c b/src/hostapi/alsa/pa_linux_alsa.c index 0564351..22c30f1 100644 --- a/src/hostapi/alsa/pa_linux_alsa.c +++ b/src/hostapi/alsa/pa_linux_alsa.c @@ -3805,14 +3805,19 @@ static PaError PaAlsaStream_WaitForFrames( PaAlsaStream *self, unsigned long *fr if( pollCapture ) { capturePfds = self->pfds; - PA_ENSURE( PaAlsaStreamComponent_BeginPolling( &self->capture, capturePfds ) ); + PaError res = PaAlsaStreamComponent_BeginPolling( &self->capture, capturePfds ); + if( res != paNoError) + { + xrun = 1; + goto end; + } totalFds += self->capture.nfds; } if( pollPlayback ) { /* self->pfds is in effect an array of fds; if necessary, index past the capture fds */ playbackPfds = self->pfds + (pollCapture ? self->capture.nfds : 0); - int res = PaAlsaStreamComponent_BeginPolling( &self->playback, playbackPfds ); + PaError res = PaAlsaStreamComponent_BeginPolling( &self->playback, playbackPfds ); if( res != paNoError) { xrun = 1; From 9ddb047ab1028add40e9499d2b1a5f1e78e70e6a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Sch=C3=BCrmann?= Date: Mon, 14 Dec 2020 08:21:34 +0100 Subject: [PATCH 047/164] Improve code style --- src/hostapi/alsa/pa_linux_alsa.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/hostapi/alsa/pa_linux_alsa.c b/src/hostapi/alsa/pa_linux_alsa.c index 22c30f1..12aee58 100644 --- a/src/hostapi/alsa/pa_linux_alsa.c +++ b/src/hostapi/alsa/pa_linux_alsa.c @@ -3639,16 +3639,15 @@ error: */ static PaError PaAlsaStreamComponent_BeginPolling( PaAlsaStreamComponent* self, struct pollfd* pfds ) { - PaError result = paNoError; - int ret = alsa_snd_pcm_poll_descriptors( self->pcm, pfds, self->nfds ); - /* If alsa returns anything else, like -EPIPE return*/ - if( ret != self->nfds ) + int nfds = alsa_snd_pcm_poll_descriptors( self->pcm, pfds, self->nfds ); + /* If alsa returns anything else, like -EPIPE return */ + if( nfds != self->nfds ) { - return paUnanticipatedHostError; + return paUnanticipatedHostError; } self->ready = 0; - return result; + return paNoError; } /** Examine results from poll(). From e5cb1a620fe2ab2b505ede66533850cd2f0c7f5f Mon Sep 17 00:00:00 2001 From: MichalPetryka <35800402+MichalPetryka@users.noreply.github.com> Date: Tue, 15 Dec 2020 19:39:22 +0100 Subject: [PATCH 048/164] Update def files for #340 --- build/msvc/portaudio.def | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build/msvc/portaudio.def b/build/msvc/portaudio.def index c08243a..94d938b 100644 --- a/build/msvc/portaudio.def +++ b/build/msvc/portaudio.def @@ -52,5 +52,5 @@ PaWasapi_ThreadPriorityRevert @63 PaWasapi_GetFramesPerHostBuffer @64 PaWasapi_GetJackCount @65 PaWasapi_GetJackDescription @66 -PaWasapi_SetDefaultInterfaceId @67 -PaWasapi_SetStreamStateHandler @68 \ No newline at end of file +PaWasapiWinrt_SetDefaultDeviceId @67 +PaWasapi_SetStreamStateHandler @68 From b900df6d9d810689c101061ddef31af400ba61b6 Mon Sep 17 00:00:00 2001 From: MichalPetryka <35800402+MichalPetryka@users.noreply.github.com> Date: Thu, 17 Dec 2020 09:53:16 +0100 Subject: [PATCH 049/164] Add PaWasapiWinrt_PopulateDeviceList --- build/msvc/portaudio.def | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/build/msvc/portaudio.def b/build/msvc/portaudio.def index 94d938b..25a9376 100644 --- a/build/msvc/portaudio.def +++ b/build/msvc/portaudio.def @@ -52,5 +52,6 @@ PaWasapi_ThreadPriorityRevert @63 PaWasapi_GetFramesPerHostBuffer @64 PaWasapi_GetJackCount @65 PaWasapi_GetJackDescription @66 -PaWasapiWinrt_SetDefaultDeviceId @67 -PaWasapi_SetStreamStateHandler @68 +PaWasapi_SetStreamStateHandler @67 +PaWasapiWinrt_SetDefaultDeviceId @68 +PaWasapiWinrt_PopulateDeviceList @69 From 11a3e23917b22cd022f7cacaa5d7f5edf56edbd6 Mon Sep 17 00:00:00 2001 From: MichalPetryka <35800402+MichalPetryka@users.noreply.github.com> Date: Thu, 17 Dec 2020 10:53:44 +0100 Subject: [PATCH 050/164] Update portaudio.def --- build/msvc/portaudio.def | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build/msvc/portaudio.def b/build/msvc/portaudio.def index 25a9376..8f1738f 100644 --- a/build/msvc/portaudio.def +++ b/build/msvc/portaudio.def @@ -52,6 +52,6 @@ PaWasapi_ThreadPriorityRevert @63 PaWasapi_GetFramesPerHostBuffer @64 PaWasapi_GetJackCount @65 PaWasapi_GetJackDescription @66 -PaWasapi_SetStreamStateHandler @67 -PaWasapiWinrt_SetDefaultDeviceId @68 +PaWasapi_SetStreamStateHandler @68 +PaWasapiWinrt_SetDefaultDeviceId @67 PaWasapiWinrt_PopulateDeviceList @69 From 1c54d71e2ae8c3c99e939fd1dbb29db363d82da6 Mon Sep 17 00:00:00 2001 From: John Melas Date: Fri, 18 Dec 2020 11:48:08 +0200 Subject: [PATCH 051/164] use DWORD for thread id --- src/os/win/pa_win_coinitialize.c | 2 +- src/os/win/pa_win_coinitialize.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/os/win/pa_win_coinitialize.c b/src/os/win/pa_win_coinitialize.c index c4c6dde..ace97f5 100644 --- a/src/os/win/pa_win_coinitialize.c +++ b/src/os/win/pa_win_coinitialize.c @@ -135,7 +135,7 @@ void PaWinUtil_CoUninitialize( PaHostApiTypeId hostApiType, PaWinUtilComInitiali DWORD currentThreadId = GetCurrentThreadId(); if( comInitializationResult->initializingThreadId != currentThreadId ) { - PA_DEBUG(("ERROR: failed PaWinUtil_CoUninitialize calling thread[%d] does not match initializing thread[%d]\n", + PA_DEBUG(("ERROR: failed PaWinUtil_CoUninitialize calling thread[%lu] does not match initializing thread[%lu]\n", currentThreadId, comInitializationResult->initializingThreadId)); } else diff --git a/src/os/win/pa_win_coinitialize.h b/src/os/win/pa_win_coinitialize.h index 687ab83..63fac7c 100644 --- a/src/os/win/pa_win_coinitialize.h +++ b/src/os/win/pa_win_coinitialize.h @@ -55,7 +55,7 @@ extern "C" */ typedef struct PaWinUtilComInitializationResult{ int state; - int initializingThreadId; + DWORD initializingThreadId; } PaWinUtilComInitializationResult; From 7503d9f2393af401370d557dbf2be44d8cf6c139 Mon Sep 17 00:00:00 2001 From: John Melas Date: Fri, 18 Dec 2020 11:26:33 +0200 Subject: [PATCH 052/164] fix non latin1 character in pa_debugprint.c --- src/common/pa_debugprint.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/common/pa_debugprint.c b/src/common/pa_debugprint.c index f34d4bb..7e9e628 100644 --- a/src/common/pa_debugprint.c +++ b/src/common/pa_debugprint.c @@ -71,7 +71,7 @@ void PaUtil_SetDebugPrintFunction(PaUtilLogCallback cb) } /* - If your platform doesn’t have vsnprintf, you are stuck with a + If your platform doesn't have vsnprintf, you are stuck with a VERY dangerous alternative, vsprintf (with no n) */ #if _MSC_VER From 609b998334139d60d1b6cd8fa0b1f772e2f78469 Mon Sep 17 00:00:00 2001 From: Ross Bencina Date: Fri, 18 Dec 2020 18:32:45 +1100 Subject: [PATCH 053/164] Fix compiler warnings: 'type cast': conversion from 'int' to 'HWAVEIN' of greater size. See ticket #370 --- src/hostapi/wmme/pa_win_wmme.c | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/src/hostapi/wmme/pa_win_wmme.c b/src/hostapi/wmme/pa_win_wmme.c index 8a07bab..b62693b 100644 --- a/src/hostapi/wmme/pa_win_wmme.c +++ b/src/hostapi/wmme/pa_win_wmme.c @@ -667,13 +667,16 @@ static void DetectDefaultSampleRate( PaWinMmeDeviceInfo *winMmeDeviceInfo, int w #ifdef PAWIN_USE_WDMKS_DEVICE_INFO -static int QueryWaveInKSFilterMaxChannels( int waveInDeviceId, int *maxChannels ) +static int QueryWaveInKSFilterMaxChannels( UINT waveInDeviceId, int *maxChannels ) { void *devicePath; DWORD devicePathSize; int result = 0; - if( waveInMessage((HWAVEIN)waveInDeviceId, DRV_QUERYDEVICEINTERFACESIZE, + /* pass UINT ID via punned HWAVEIN, as per DRV_QUERYDEVICEINTERFACESIZE documentation */ + HWAVEIN hDeviceId = (HWAVEIN)((UINT_PTR)waveInDeviceId); + + if( waveInMessage(hDeviceId, DRV_QUERYDEVICEINTERFACESIZE, (DWORD_PTR)&devicePathSize, 0 ) != MMSYSERR_NOERROR ) return 0; @@ -682,7 +685,7 @@ static int QueryWaveInKSFilterMaxChannels( int waveInDeviceId, int *maxChannels return 0; /* apparently DRV_QUERYDEVICEINTERFACE returns a unicode interface path, although this is undocumented */ - if( waveInMessage((HWAVEIN)waveInDeviceId, DRV_QUERYDEVICEINTERFACE, + if( waveInMessage(hDeviceId, DRV_QUERYDEVICEINTERFACE, (DWORD_PTR)devicePath, devicePathSize ) == MMSYSERR_NOERROR ) { int count = PaWin_WDMKS_QueryFilterMaximumChannelCount( devicePath, /* isInput= */ 1 ); @@ -797,13 +800,16 @@ error: #ifdef PAWIN_USE_WDMKS_DEVICE_INFO -static int QueryWaveOutKSFilterMaxChannels( int waveOutDeviceId, int *maxChannels ) +static int QueryWaveOutKSFilterMaxChannels( UINT waveOutDeviceId, int *maxChannels ) { void *devicePath; DWORD devicePathSize; int result = 0; - if( waveOutMessage((HWAVEOUT)waveOutDeviceId, DRV_QUERYDEVICEINTERFACESIZE, + /* pass UINT ID via punned HWAVEOUT, as per DRV_QUERYDEVICEINTERFACESIZE documentation */ + HWAVEOUT hDeviceId = (HWAVEOUT)((UINT_PTR)waveOutDeviceId); + + if( waveOutMessage(hDeviceId, DRV_QUERYDEVICEINTERFACESIZE, (DWORD_PTR)&devicePathSize, 0 ) != MMSYSERR_NOERROR ) return 0; @@ -812,7 +818,7 @@ static int QueryWaveOutKSFilterMaxChannels( int waveOutDeviceId, int *maxChannel return 0; /* apparently DRV_QUERYDEVICEINTERFACE returns a unicode interface path, although this is undocumented */ - if( waveOutMessage((HWAVEOUT)waveOutDeviceId, DRV_QUERYDEVICEINTERFACE, + if( waveOutMessage(hDeviceId, DRV_QUERYDEVICEINTERFACE, (DWORD_PTR)devicePath, devicePathSize ) == MMSYSERR_NOERROR ) { int count = PaWin_WDMKS_QueryFilterMaximumChannelCount( devicePath, /* isInput= */ 0 ); @@ -1017,11 +1023,11 @@ PaError PaWinMme_Initialize( PaUtilHostApiRepresentation **hostApi, PaHostApiInd /* the following calls assume that if wave*Message fails the preferred device parameter won't be modified */ preferredDeviceStatusFlags = 0; waveInPreferredDevice = -1; - waveInMessage( (HWAVEIN)WAVE_MAPPER, DRVM_MAPPER_PREFERRED_GET, (DWORD_PTR)&waveInPreferredDevice, (DWORD_PTR)&preferredDeviceStatusFlags ); + waveInMessage( (HWAVEIN)((UINT_PTR)WAVE_MAPPER), DRVM_MAPPER_PREFERRED_GET, (DWORD_PTR)&waveInPreferredDevice, (DWORD_PTR)&preferredDeviceStatusFlags ); preferredDeviceStatusFlags = 0; waveOutPreferredDevice = -1; - waveOutMessage( (HWAVEOUT)WAVE_MAPPER, DRVM_MAPPER_PREFERRED_GET, (DWORD_PTR)&waveOutPreferredDevice, (DWORD_PTR)&preferredDeviceStatusFlags ); + waveOutMessage( (HWAVEOUT)((UINT_PTR)WAVE_MAPPER), DRVM_MAPPER_PREFERRED_GET, (DWORD_PTR)&waveOutPreferredDevice, (DWORD_PTR)&preferredDeviceStatusFlags ); maximumPossibleDeviceCount = 0; From 4ce9f0d0a86667cf5c5b428356cdb8702f76888b Mon Sep 17 00:00:00 2001 From: Ross Bencina Date: Mon, 14 Dec 2020 19:20:43 +1100 Subject: [PATCH 054/164] fix issue #321 broken MSVC build. Always define PaWasapi_UpdateDeviceList() even when it is a no-op because it is mentioned in the .def file. --- src/hostapi/wasapi/pa_win_wasapi.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/hostapi/wasapi/pa_win_wasapi.c b/src/hostapi/wasapi/pa_win_wasapi.c index 86c08c2..9bae24c 100644 --- a/src/hostapi/wasapi/pa_win_wasapi.c +++ b/src/hostapi/wasapi/pa_win_wasapi.c @@ -2498,12 +2498,14 @@ static PaError UpdateDeviceList() } // ------------------------------------------------------------------------------------------ -#if defined(PA_WASAPI_MAX_CONST_DEVICE_COUNT) && (PA_WASAPI_MAX_CONST_DEVICE_COUNT > 0) PaError PaWasapi_UpdateDeviceList() { +#if defined(PA_WASAPI_MAX_CONST_DEVICE_COUNT) && (PA_WASAPI_MAX_CONST_DEVICE_COUNT > 0) return UpdateDeviceList(); -} +#else + return paNoError; #endif +} // ------------------------------------------------------------------------------------------ int PaWasapi_GetDeviceCurrentFormat( PaStream *pStream, void *pFormat, unsigned int formatSize, int bOutput ) From 1a5c410f7f09042d2d7ce1509ec3cf0b6091c7f8 Mon Sep 17 00:00:00 2001 From: Ross Bencina Date: Fri, 18 Dec 2020 17:53:42 +1100 Subject: [PATCH 055/164] return paInternalError from PaWasapi_UpdateDeviceList() when it is disabled --- src/hostapi/wasapi/pa_win_wasapi.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hostapi/wasapi/pa_win_wasapi.c b/src/hostapi/wasapi/pa_win_wasapi.c index 9bae24c..d791b66 100644 --- a/src/hostapi/wasapi/pa_win_wasapi.c +++ b/src/hostapi/wasapi/pa_win_wasapi.c @@ -2503,7 +2503,7 @@ PaError PaWasapi_UpdateDeviceList() #if defined(PA_WASAPI_MAX_CONST_DEVICE_COUNT) && (PA_WASAPI_MAX_CONST_DEVICE_COUNT > 0) return UpdateDeviceList(); #else - return paNoError; + return paInternalError; #endif } From 5f869e787e2127d9ddd640df9af7be610d03dd08 Mon Sep 17 00:00:00 2001 From: Phil Burk Date: Sat, 19 Dec 2020 15:59:23 -0800 Subject: [PATCH 056/164] paqa_devs: test default device Use sine wave instead of sawtooth because it is easier to hear glitches. Add some options: -a - Test ALL devices, otherwise just the default devices. -i - Test INPUT only. -o - Test OUTPUT only. --- qa/paqa_devs.c | 192 +++++++++++++++++++++++++++++++++++-------------- 1 file changed, 137 insertions(+), 55 deletions(-) diff --git a/qa/paqa_devs.c b/qa/paqa_devs.c index 721b07f..fae9f25 100644 --- a/qa/paqa_devs.c +++ b/qa/paqa_devs.c @@ -1,13 +1,13 @@ /** @file paqa_devs.c - @ingroup qa_src + @ingroup qa_src @brief Self Testing Quality Assurance app for PortAudio - Try to open each device and run through all the - possible configurations. This test does not verify + Try to open the default devices and run through all the + possible configurations. This test does not verify that the configuration works well. It just verifies that it does not crash. It requires a human to listen to - the outputs. + the sine wave outputs. - @author Phil Burk http://www.softsynth.com + @author Phil Burk http://www.softsynth.com Pieter adapted to V19 API. Test now relies heavily on Pa_IsFormatSupported(). Uses same 'standard' sample rates @@ -52,14 +52,20 @@ */ #include +#include +#include #include #include "portaudio.h" #include "pa_trace.h" /****************************************** Definitions ***********/ -#define MODE_INPUT (0) -#define MODE_OUTPUT (1) -#define MAX_TEST_CHANNELS 4 +#define MODE_INPUT (0) +#define MODE_OUTPUT (1) +#define MAX_TEST_CHANNELS (4) +#define LOWEST_FREQUENCY (300.0) +#define LOWEST_SAMPLE_RATE (8000.0) +#define PHASE_INCREMENT (2.0 * M_PI * LOWEST_FREQUENCY / LOWEST_SAMPLE_RATE) +#define SINE_AMPLITUDE (0.2) typedef struct PaQaData { @@ -67,13 +73,13 @@ typedef struct PaQaData int numChannels; int bytesPerSample; int mode; - short sawPhase; + float phase; PaSampleFormat format; } PaQaData; /****************************************** Prototypes ***********/ -static void TestDevices( int mode ); +static void TestDevices( int mode, int allDevices ); static void TestFormats( int mode, PaDeviceIndex deviceID, double sampleRate, int numChannels ); static int TestAdvance( int mode, PaDeviceIndex deviceID, double sampleRate, @@ -107,6 +113,14 @@ static int gNumFailed = 0; } \ } while(0) +static float NextSineSample( PaQaData *data ) +{ + float phase = data->phase + PHASE_INCREMENT; + if( phase > M_PI ) phase -= 2.0 * M_PI; + data->phase = phase; + return sinf(phase) * SINE_AMPLITUDE; +} + /*******************************************************************/ /* This routine will be called by the PortAudio engine when audio is needed. ** It may be called at interrupt level on some machines so don't do anything @@ -118,27 +132,26 @@ static int QaCallback( const void *inputBuffer, void *outputBuffer, PaStreamCallbackFlags statusFlags, void *userData ) { - unsigned long i; - short phase; + unsigned long frameIndex; + unsigned long channelIndex; + float sample; PaQaData *data = (PaQaData *) userData; (void) inputBuffer; - /* Play simple sawtooth wave. */ + /* Play simple sine wave. */ if( data->mode == MODE_OUTPUT ) { - phase = data->sawPhase; switch( data->format ) { case paFloat32: { float *out = (float *) outputBuffer; - for( i=0; inumChannels == 2 ) + sample = NextSineSample( data ); + for( channelIndex = 0; channelIndex < data->numChannels; channelIndex++ ) { - *out++ = (float) (phase * (1.0 / 32768.0)); + *out++ = sample; } } } @@ -147,13 +160,12 @@ static int QaCallback( const void *inputBuffer, void *outputBuffer, case paInt32: { int *out = (int *) outputBuffer; - for( i=0; inumChannels == 2 ) + sample = NextSineSample( data ); + for( channelIndex = 0; channelIndex < data->numChannels; channelIndex++ ) { - *out++ = ((int) phase ) << 16; + *out++ = ((int)(sample * 0x00800000)) << 8; } } } @@ -162,13 +174,12 @@ static int QaCallback( const void *inputBuffer, void *outputBuffer, case paInt16: { short *out = (short *) outputBuffer; - for( i=0; inumChannels == 2 ) + sample = NextSineSample( data ); + for( channelIndex = 0; channelIndex < data->numChannels; channelIndex++ ) { - *out++ = phase; + *out++ = (short)(sample * 32767); } } } @@ -178,14 +189,10 @@ static int QaCallback( const void *inputBuffer, void *outputBuffer, { unsigned char *out = (unsigned char *) outputBuffer; unsigned long numBytes = framesPerBuffer * data->numChannels * data->bytesPerSample; - for( i=0; isawPhase = phase; } /* Are we through yet? */ if( data->framesLeft > framesPerBuffer ) @@ -203,15 +210,78 @@ static int QaCallback( const void *inputBuffer, void *outputBuffer, } /*******************************************************************/ -int main(void); -int main(void) +static void usage( const char *name ) { + printf("%s [-a]\n", name); + printf(" -a - Test ALL devices, otherwise just the default devices.\n"); + printf(" -i - Test INPUT only.\n"); + printf(" -o - Test OUTPUT only.\n"); + printf(" -? - Help\n"); +} + +/*******************************************************************/ +int main( int argc, char **argv ); +int main( int argc, char **argv ) +{ + int i; PaError result; + int allDevices = 0; + int testOutput = 1; + int testInput = 1; + char *executableName = argv[0]; + + /* Parse command line parameters. */ + i = 1; + while( imaxInputChannels : pdi->maxOutputChannels); + + if( mode == MODE_INPUT ) { + maxChannels = pdi->maxInputChannels; + isDefault = ( id == Pa_GetDefaultInputDevice()); + } else { + maxChannels = pdi->maxOutputChannels; + isDefault = ( id == Pa_GetDefaultOutputDevice()); + } if( maxChannels > MAX_TEST_CHANNELS ) maxChannels = MAX_TEST_CHANNELS; + + if (!allDevices && !isDefault) continue; // skip this device for( jc=1; jc<=maxChannels; jc++ ) { - printf("\n========================================================================\n"); + printf("\n===========================================================\n"); printf(" Device = %s\n", pdi->name ); - printf("========================================================================\n"); + printf("===========================================================\n"); /* Try each standard sample rate. */ for( i=0; standardSampleRates[i] > 0; i++ ) { @@ -299,32 +378,35 @@ static int TestAdvance( int mode, PaDeviceIndex deviceID, double sampleRate, inputParameters.device = deviceID; inputParameters.channelCount = numChannels; inputParameters.sampleFormat = format; - inputParameters.suggestedLatency = Pa_GetDeviceInfo( inputParameters.device )->defaultLowInputLatency; + inputParameters.suggestedLatency = + Pa_GetDeviceInfo( inputParameters.device )->defaultLowInputLatency; inputParameters.hostApiSpecificStreamInfo = NULL; ipp = &inputParameters; } else { - ipp = NULL; - } - + ipp = NULL; + } + if( mode == MODE_OUTPUT ) { outputParameters.device = deviceID; outputParameters.channelCount = numChannels; outputParameters.sampleFormat = format; - outputParameters.suggestedLatency = Pa_GetDeviceInfo( outputParameters.device )->defaultLowOutputLatency; + outputParameters.suggestedLatency = + Pa_GetDeviceInfo( outputParameters.device )->defaultLowOutputLatency; outputParameters.hostApiSpecificStreamInfo = NULL; opp = &outputParameters; } else { - opp = NULL; - } - + opp = NULL; + } + if(paFormatIsSupported == Pa_IsFormatSupported( ipp, opp, sampleRate )) { - printf("------ TestAdvance: %s, device = %d, rate = %g, numChannels = %d, format = %lu -------\n", + printf("------ TestAdvance: %s, device = %d, rate = %g" + ", numChannels = %d, format = %lu -------\n", ( mode == MODE_INPUT ) ? "INPUT" : "OUTPUT", deviceID, sampleRate, numChannels, (unsigned long)format); EXPECT( ((result = Pa_OpenStream( &stream, @@ -353,7 +435,7 @@ static int TestAdvance( int mode, PaDeviceIndex deviceID, double sampleRate, oldStamp = Pa_GetStreamTime(stream); Pa_Sleep(msec); newStamp = Pa_GetStreamTime(stream); - printf("oldStamp = %9.6f, newStamp = %9.6f\n", oldStamp, newStamp ); /**/ + printf("oldStamp = %9.6f, newStamp = %9.6f\n", oldStamp, newStamp ); /**/ EXPECT( (oldStamp < newStamp) ); /* Check to make sure callback is decrementing framesLeft. */ oldFrames = myData.framesLeft; From d68a78d30bc445b50ccbca505ddba45006e6c102 Mon Sep 17 00:00:00 2001 From: Phil Burk Date: Sat, 26 Dec 2020 08:32:40 -0800 Subject: [PATCH 057/164] paqa_devs.c: remove some white space --- qa/paqa_devs.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/qa/paqa_devs.c b/qa/paqa_devs.c index fae9f25..87b074c 100644 --- a/qa/paqa_devs.c +++ b/qa/paqa_devs.c @@ -8,8 +8,8 @@ the sine wave outputs. @author Phil Burk http://www.softsynth.com - - Pieter adapted to V19 API. Test now relies heavily on + + Pieter adapted to V19 API. Test now relies heavily on Pa_IsFormatSupported(). Uses same 'standard' sample rates as in test pa_devs.c. */ @@ -41,13 +41,13 @@ */ /* - * The text above constitutes the entire PortAudio license; however, + * The text above constitutes the entire PortAudio license; however, * the PortAudio community also makes the following non-binding requests: * * 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. It is also - * requested that these non-binding requests be included along with the + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the * license above. */ @@ -170,7 +170,7 @@ static int QaCallback( const void *inputBuffer, void *outputBuffer, } } break; - + case paInt16: { short *out = (short *) outputBuffer; @@ -317,7 +317,7 @@ static void TestDevices( int mode, int allDevices ) maxChannels = MAX_TEST_CHANNELS; if (!allDevices && !isDefault) continue; // skip this device - + for( jc=1; jc<=maxChannels; jc++ ) { printf("\n===========================================================\n"); @@ -352,7 +352,7 @@ static int TestAdvance( int mode, PaDeviceIndex deviceID, double sampleRate, PaQaData myData; #define FRAMES_PER_BUFFER (64) const int kNumSeconds = 100; - + /* Setup data for synthesis thread. */ myData.framesLeft = (unsigned long) (sampleRate * kNumSeconds); myData.numChannels = numChannels; From 63bbb63343876d997a4b3914d21e638f92172979 Mon Sep 17 00:00:00 2001 From: Phil Burk Date: Sat, 26 Dec 2020 08:33:26 -0800 Subject: [PATCH 058/164] paqa_devs.c: improve file comment --- qa/paqa_devs.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/qa/paqa_devs.c b/qa/paqa_devs.c index 87b074c..a7d19a2 100644 --- a/qa/paqa_devs.c +++ b/qa/paqa_devs.c @@ -1,11 +1,12 @@ /** @file paqa_devs.c @ingroup qa_src @brief Self Testing Quality Assurance app for PortAudio - Try to open the default devices and run through all the - possible configurations. This test does not verify - that the configuration works well. It just verifies - that it does not crash. It requires a human to listen to - the sine wave outputs. + Try to open devices and run through all possible configurations. + By default, open only the default devices. Command line options support + opening every device, or all input devices, or all output devices. + This test does not verify that the configuration works well. + It just verifies that it does not crash. It requires a human to + listen to the sine wave outputs. @author Phil Burk http://www.softsynth.com From a7bda88e6b628c4c9879cac2b4b4c68da3a1a6b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-Micha=C3=ABl=20Celerier?= Date: Mon, 21 Dec 2020 19:22:16 +0100 Subject: [PATCH 059/164] Fix a GCC warning due to unsigned substraction Given unsigned int reqRate, setRate, deviation; then setRate - reqRate is also an unsigned int - the code works "by chance" as `abs` casts that to an int which overflows and is technically undefined behaviour, for instance for setRate = 44100 and reqRate = 48000. Thus cast them to int when computing the absolute value to ensure no UB. --- src/hostapi/alsa/pa_linux_alsa.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hostapi/alsa/pa_linux_alsa.c b/src/hostapi/alsa/pa_linux_alsa.c index 462034c..be76c64 100644 --- a/src/hostapi/alsa/pa_linux_alsa.c +++ b/src/hostapi/alsa/pa_linux_alsa.c @@ -3204,7 +3204,7 @@ static int SetApproximateSampleRate( snd_pcm_t *pcm, snd_pcm_hw_params_t *hwPara ENSURE_( alsa_snd_pcm_hw_params_set_rate_near( pcm, hwParams, &setRate, NULL ), paUnanticipatedHostError ); /* The value actually set will be put in 'setRate' (may be way off); check the deviation as a proportion * of the requested-rate with reference to the max-deviate-ratio (larger values allow less deviation) */ - deviation = abs( setRate - reqRate ); + deviation = abs( (int)setRate - (int)reqRate ); if( deviation > 0 && deviation * RATE_MAX_DEVIATE_RATIO > reqRate ) result = paInvalidSampleRate; From cdd1cf69fe3717651e4b066249d883efef6c7995 Mon Sep 17 00:00:00 2001 From: Ross Bencina Date: Mon, 21 Dec 2020 17:25:42 +1100 Subject: [PATCH 060/164] Add new GitHub action to build PortAudio using the MSVC project file. Fixes #368. --- .github/workflows/MSBuild.yml | 96 +++++++++++++++++++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100644 .github/workflows/MSBuild.yml diff --git a/.github/workflows/MSBuild.yml b/.github/workflows/MSBuild.yml new file mode 100644 index 0000000..b6f52b8 --- /dev/null +++ b/.github/workflows/MSBuild.yml @@ -0,0 +1,96 @@ +name: MSBuild + +on: [push] + +env: + # Path to the solution file relative to the root of the project. + SOLUTION_FILE_PATH: ./build/msvc/portaudio.sln + VCPROJ_FILE_PATH: ./build/msvc/portaudio.vcproj + VCXPROJ_FILE_PATH: ./build/msvc/portaudio.vcxproj + VCXPROJ_FILTERS_FILE_PATH: ./build/msvc/portaudio.vcxproj.filters + VCXPROJ_USER_FILE_PATH: ./build/msvc/portaudio.vcxproj.user + DEF_FILE_PATH: ./build/msvc/portaudio.def + +jobs: + build: + runs-on: windows-latest + strategy: + matrix: + BUILD_CONFIGURATION: [Release] + BUILD_PLATFORM: [Win32, x64] + + steps: + - name: Add MSBuild to PATH + uses: microsoft/setup-msbuild@v1 + + - uses: actions/checkout@v2 + + - name: Upgrade Solution + # We maintain our vcproj file in an old format to maintain backwards compatibility + # This step upgrades the project to the latest version of MSVC + # see https://docs.microsoft.com/en-us/visualstudio/ide/reference/upgrade-devenv-exe?view=vs-2019 + # pipe to file to ensure that it terminates https://stackoverflow.com/questions/48896010/occasionally-occurring-msbuild-error-msb3428/48918105#48918105 + # discussion of using vswhere.exe here: https://stackoverflow.com/questions/65287456/how-to-upgrade-a-visual-studio-project-from-within-a-github-action/65311868#65311868 + run: | + $devenv = & vswhere.exe '-property' productPath + Write-Output "$devenv" + & $devenv "${{env.VCPROJ_FILE_PATH}}" /Upgrade /NoSplash | Out-Null + Write-Output "devenv launched" + while (!(Test-Path "${{env.VCXPROJ_FILE_PATH}}")) { Start-Sleep -Seconds 10 } + Write-Output "vcxproj found" + while (!(Test-Path "${{env.VCXPROJ_FILTERS_FILE_PATH}}")) { Start-Sleep -Seconds 10 } + Write-Output "vcxproj.filters found" + Start-Sleep -Seconds 10 + Write-Output "done." + + - name: Remove ASIO Files + # Process the project files to remove ASIO-related sources and includes (since we can not access the ASIO SDK in a public build) + run: | + # Process .vcxproj file: remove source files + $xdoc = new-object System.Xml.XmlDocument + $vcxprojFile = resolve-path("${{env.VCXPROJ_FILE_PATH}}") + $xdoc.load($vcxprojFile) + $namespace = New-Object -TypeName "Xml.XmlNamespaceManager" -ArgumentList $xdoc.NameTable + $namespace.AddNamespace("vs", $xdoc.DocumentElement.NamespaceURI) + $nodes = $xdoc.SelectNodes("//vs:ClCompile[contains(@Include, '..\src\hostapi\asio')]", $namespace) + Write-Output "deleting ASIO related compilation nodes from .vcxproj:" + Write-Output $nodes + ForEach($node in $nodes) { + $parent = $node.ParentNode + $parent.RemoveChild($node) + } + # Enable DirectSound host API + $nodes = $xdoc.SelectNodes("//vs:PreprocessorDefinitions[contains(., 'PA_USE_DS=0')]", $namespace) + ForEach($node in $nodes) { + $text = $node.InnerText + $node.InnerText = $text -replace 'PA_USE_DS=0', 'PA_USE_DS=1' + } + $xdoc.save($vcxprojFile) + # Process .vcxproj.filters file: remove source files and includes + $vcxprojFiltersFile = resolve-path("${{env.VCXPROJ_FILTERS_FILE_PATH}}") + $xdoc.load($vcxprojFiltersFile) + $namespace = New-Object -TypeName "Xml.XmlNamespaceManager" -ArgumentList $xdoc.NameTable + $namespace.AddNamespace("vs", $xdoc.DocumentElement.NamespaceURI) + $nodes = $xdoc.SelectNodes("//vs:ClCompile[contains(@Include, '..\src\hostapi\asio')]", $namespace) + Write-Output "deleting ASIO related compilation nodes from .vcxproj.filters:" + Write-Output $nodes + ForEach($node in $nodes) { + $parent = $node.ParentNode + $parent.RemoveChild($node) + } + $nodes = $xdoc.SelectNodes("//vs:ClInclude[contains(@Include, 'pa_asio.h')]", $namespace) + Write-Output "deleting ASIO related include nodes from .vcxproj.filters:" + Write-Output $nodes + ForEach($node in $nodes) { + $parent = $node.ParentNode + $parent.RemoveChild($node) + } + $xdoc.save($vcxprojFiltersFile) + # Process .def file: remove PaAsio_ symbols + Set-Content -Path "${{env.DEF_FILE_PATH}}" -Value (Get-Content -Path "${{env.DEF_FILE_PATH}}" | Select-String -Pattern 'PaAsio_' -NotMatch) + + - name: Build + working-directory: ${{env.GITHUB_WORKSPACE}} + # Add additional options to the MSBuild command line here (like platform or verbosity level). + # See https://docs.microsoft.com/visualstudio/msbuild/msbuild-command-line-reference + run: msbuild /m /p:Configuration=${{matrix.BUILD_CONFIGURATION}} /p:Platform=${{matrix.BUILD_PLATFORM}} ${{env.VCXPROJ_FILE_PATH}} From fb9b6463ebbff946047840dfcc643c86a6fe5518 Mon Sep 17 00:00:00 2001 From: Ross Bencina Date: Mon, 21 Dec 2020 17:31:34 +1100 Subject: [PATCH 061/164] Rename build steps for clarity. --- .github/workflows/MSBuild.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/MSBuild.yml b/.github/workflows/MSBuild.yml index b6f52b8..4a78bec 100644 --- a/.github/workflows/MSBuild.yml +++ b/.github/workflows/MSBuild.yml @@ -25,7 +25,7 @@ jobs: - uses: actions/checkout@v2 - - name: Upgrade Solution + - name: Upgrade VC Project File # We maintain our vcproj file in an old format to maintain backwards compatibility # This step upgrades the project to the latest version of MSVC # see https://docs.microsoft.com/en-us/visualstudio/ide/reference/upgrade-devenv-exe?view=vs-2019 @@ -43,7 +43,7 @@ jobs: Start-Sleep -Seconds 10 Write-Output "done." - - name: Remove ASIO Files + - name: Remove ASIO Files and Enable PA_USE_DS=1 # Process the project files to remove ASIO-related sources and includes (since we can not access the ASIO SDK in a public build) run: | # Process .vcxproj file: remove source files From 6a676d3ecb9a493750b18387d56e586305f5749e Mon Sep 17 00:00:00 2001 From: Ross Bencina Date: Tue, 22 Dec 2020 18:57:23 +1100 Subject: [PATCH 062/164] wdmks: Reset packet->Header.OptionsFlags = 0 for each packet. Fixes issue with Focusrite Scarlett 2i4 (1st Gen). Fixes #310 --- src/hostapi/wdmks/pa_win_wdmks.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/hostapi/wdmks/pa_win_wdmks.c b/src/hostapi/wdmks/pa_win_wdmks.c index f30ee95..21f944d 100644 --- a/src/hostapi/wdmks/pa_win_wdmks.c +++ b/src/hostapi/wdmks/pa_win_wdmks.c @@ -6548,6 +6548,7 @@ static PaError PaPinCaptureSubmitHandler_WaveCyclic(PaProcessThreadInfo* pInfo, assert(packet != 0); PA_HP_TRACE((pInfo->stream->hLog, "Capture submit: %u", eventIndex)); packet->Header.DataUsed = 0; /* Reset for reuse */ + packet->Header.OptionsFlags = 0; /* Reset for reuse. Required for e.g. Focusrite Scarlett 2i4 (1st Gen) see #310 */ ResetEvent(packet->Signal.hEvent); result = PinRead(pInfo->stream->capture.pPin->handle, packet); ++pInfo->pending; From 7ffe61ea26bcc6822ce647e58e9b7f8504703b36 Mon Sep 17 00:00:00 2001 From: Ross Bencina Date: Mon, 21 Dec 2020 18:11:12 +1100 Subject: [PATCH 063/164] Fix uninitialized variable warnings. Improved solution for PR #377 --- src/hostapi/wdmks/pa_win_wdmks.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/hostapi/wdmks/pa_win_wdmks.c b/src/hostapi/wdmks/pa_win_wdmks.c index 21f944d..7224e13 100644 --- a/src/hostapi/wdmks/pa_win_wdmks.c +++ b/src/hostapi/wdmks/pa_win_wdmks.c @@ -4380,7 +4380,7 @@ static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi, else { userInputChannels = 0; - inputSampleFormat = hostInputSampleFormat = paInt16; /* Suppress 'uninitialised var' warnings. */ + inputSampleFormat = paInt16; /* Suppress 'uninitialised var' warnings. */ } if( outputParameters ) @@ -4415,7 +4415,7 @@ static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi, else { userOutputChannels = 0; - outputSampleFormat = hostOutputSampleFormat = paInt16; /* Suppress 'uninitialized var' warnings. */ + outputSampleFormat = paInt16; /* Suppress 'uninitialized var' warnings. */ } /* validate platform specific flags */ @@ -4600,6 +4600,8 @@ static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi, } else { + hostInputSampleFormat = (PaSampleFormat)0; /* Avoid uninitialized variable warning */ + stream->capture.pPin = NULL; stream->capture.bytesPerFrame = 0; } @@ -4724,6 +4726,8 @@ static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi, } else { + hostOutputSampleFormat = (PaSampleFormat)0; /* Avoid uninitialized variable warning */ + stream->render.pPin = NULL; stream->render.bytesPerFrame = 0; } From 17b895bb8f4c103d88bde3defd5124cbb164db6e Mon Sep 17 00:00:00 2001 From: petris Date: Tue, 22 Dec 2020 18:30:19 +0100 Subject: [PATCH 064/164] Fix ANSI in MME and DSound --- src/hostapi/dsound/pa_win_ds.c | 11 ------ src/hostapi/wmme/pa_win_wmme.c | 70 ++++++++++------------------------ 2 files changed, 21 insertions(+), 60 deletions(-) diff --git a/src/hostapi/dsound/pa_win_ds.c b/src/hostapi/dsound/pa_win_ds.c index f3cb67f..f2dcf90 100644 --- a/src/hostapi/dsound/pa_win_ds.c +++ b/src/hostapi/dsound/pa_win_ds.c @@ -408,16 +408,6 @@ static char *DuplicateDeviceNameString( PaUtilAllocationGroup *allocations, cons if( src != NULL ) { -#if !defined(_UNICODE) && !defined(UNICODE) - size_t len = WideCharToMultiByte(CP_ACP, 0, src, -1, NULL, 0, NULL, NULL); - - result = (char*)PaUtil_GroupAllocateMemory( allocations, (long)(len + 1) ); - if( result ) { - if (WideCharToMultiByte(CP_ACP, 0, src, -1, result, (int)len, NULL, NULL) == 0) { - result = 0; - } - } -#else size_t len = WideCharToMultiByte(CP_UTF8, 0, src, -1, NULL, 0, NULL, NULL); result = (char*)PaUtil_GroupAllocateMemory( allocations, (long)(len + 1) ); @@ -426,7 +416,6 @@ static char *DuplicateDeviceNameString( PaUtilAllocationGroup *allocations, cons result = 0; } } -#endif } else { diff --git a/src/hostapi/wmme/pa_win_wmme.c b/src/hostapi/wmme/pa_win_wmme.c index b62693b..bf48be5 100644 --- a/src/hostapi/wmme/pa_win_wmme.c +++ b/src/hostapi/wmme/pa_win_wmme.c @@ -204,12 +204,9 @@ static const char constOutputMapperSuffix_[] = " - Output"; /********************************************************************/ -/* Copy null-terminated TCHAR string to explicit char string using UTF8 encoding */ -static char *CopyTCharStringToUtf8CString(char *destination, size_t destLengthBytes, const TCHAR *source) +/* Copy null-terminated WCHAR string to explicit char string using UTF8 encoding */ +static char *CopyWCharStringToUtf8CString(char *destination, size_t destLengthBytes, const WCHAR *source) { -#if !defined(_UNICODE) && !defined(UNICODE) - return strcpy(destination, source); -#else /* The cbMultiByte parameter ["destLengthBytes" below] is: """ Size, in bytes, of the buffer indicated by lpMultiByteStr ["destination" below]. @@ -237,18 +234,13 @@ static char *CopyTCharStringToUtf8CString(char *destination, size_t destLengthBy if (WideCharToMultiByte(CP_UTF8, 0, source, -1, destination, /*cbMultiByte=*/intDestLengthBytes, NULL, NULL) == 0) return NULL; return destination; -#endif } /* returns required length (in bytes) of destination buffer when - converting TCHAR string to UTF8 bytes, not including the terminating null. */ -static size_t TCharStringLen(const TCHAR *str) + converting WCHAR string to UTF8 bytes, not including the terminating null. */ +static size_t WCharStringLen(const WCHAR *str) { -#if !defined(_UNICODE) && !defined(UNICODE) - return strlen(str); -#else - return WideCharToMultiByte(CP_UTF8, 0, str, -1, NULL, 0, NULL, NULL); -#endif + return WideCharToMultiByte(CP_UTF8, 0, str, -1, NULL, 0, NULL, NULL); } /********************************************************************/ @@ -298,14 +290,12 @@ static signed long GetStreamWriteAvailable( PaStream* stream ); /* macros for setting last host error information */ -#ifdef UNICODE - #define PA_MME_SET_LAST_WAVEIN_ERROR( mmresult ) \ { \ wchar_t mmeErrorTextWide[ MAXERRORLENGTH ]; \ char mmeErrorText[ MAXERRORLENGTH ]; \ - waveInGetErrorText( mmresult, mmeErrorTextWide, MAXERRORLENGTH ); \ - WideCharToMultiByte( CP_ACP, WC_COMPOSITECHECK | WC_DEFAULTCHAR,\ + waveInGetErrorTextW( mmresult, mmeErrorTextWide, MAXERRORLENGTH ); \ + WideCharToMultiByte( CP_UTF8, WC_COMPOSITECHECK | WC_DEFAULTCHAR,\ mmeErrorTextWide, -1, mmeErrorText, MAXERRORLENGTH, NULL, NULL ); \ PaUtil_SetLastHostErrorInfo( paMME, mmresult, mmeErrorText ); \ } @@ -314,29 +304,11 @@ static signed long GetStreamWriteAvailable( PaStream* stream ); { \ wchar_t mmeErrorTextWide[ MAXERRORLENGTH ]; \ char mmeErrorText[ MAXERRORLENGTH ]; \ - waveOutGetErrorText( mmresult, mmeErrorTextWide, MAXERRORLENGTH ); \ - WideCharToMultiByte( CP_ACP, WC_COMPOSITECHECK | WC_DEFAULTCHAR,\ + waveOutGetErrorTextW( mmresult, mmeErrorTextWide, MAXERRORLENGTH ); \ + WideCharToMultiByte( CP_UTF8, WC_COMPOSITECHECK | WC_DEFAULTCHAR,\ mmeErrorTextWide, -1, mmeErrorText, MAXERRORLENGTH, NULL, NULL ); \ PaUtil_SetLastHostErrorInfo( paMME, mmresult, mmeErrorText ); \ } - -#else /* !UNICODE */ - -#define PA_MME_SET_LAST_WAVEIN_ERROR( mmresult ) \ - { \ - char mmeErrorText[ MAXERRORLENGTH ]; \ - waveInGetErrorText( mmresult, mmeErrorText, MAXERRORLENGTH ); \ - PaUtil_SetLastHostErrorInfo( paMME, mmresult, mmeErrorText ); \ - } - -#define PA_MME_SET_LAST_WAVEOUT_ERROR( mmresult ) \ - { \ - char mmeErrorText[ MAXERRORLENGTH ]; \ - waveOutGetErrorText( mmresult, mmeErrorText, MAXERRORLENGTH ); \ - PaUtil_SetLastHostErrorInfo( paMME, mmresult, mmeErrorText ); \ - } - -#endif /* UNICODE */ static void PaMme_SetLastSystemError( DWORD errorCode ) @@ -709,13 +681,13 @@ static PaError InitializeInputDeviceInfo( PaWinMmeHostApiRepresentation *winMmeH PaError result = paNoError; char *deviceName; /* non-const ptr */ MMRESULT mmresult; - WAVEINCAPS wic; + WAVEINCAPSW wic; PaDeviceInfo *deviceInfo = &winMmeDeviceInfo->inheritedDeviceInfo; size_t len; *success = 0; - mmresult = waveInGetDevCaps( winMmeInputDeviceId, &wic, sizeof( WAVEINCAPS ) ); + mmresult = waveInGetDevCapsW( winMmeInputDeviceId, &wic, sizeof( WAVEINCAPSW ) ); if( mmresult == MMSYSERR_NOMEM ) { result = paInsufficientMemory; @@ -735,7 +707,7 @@ static PaError InitializeInputDeviceInfo( PaWinMmeHostApiRepresentation *winMmeH so we are limited to displaying only the first 31 characters of the device name. */ if( winMmeInputDeviceId == WAVE_MAPPER ) { - len = TCharStringLen( wic.szPname ) + 1 + sizeof(constInputMapperSuffix_); + len = WCharStringLen( wic.szPname ) + 1 + sizeof(constInputMapperSuffix_); /* Append I/O suffix to WAVE_MAPPER device. */ deviceName = (char*)PaUtil_GroupAllocateMemory( winMmeHostApi->allocations, @@ -745,12 +717,12 @@ static PaError InitializeInputDeviceInfo( PaWinMmeHostApiRepresentation *winMmeH result = paInsufficientMemory; goto error; } - CopyTCharStringToUtf8CString( deviceName, len, wic.szPname ); + CopyWCharStringToUtf8CString( deviceName, len, wic.szPname ); strcat( deviceName, constInputMapperSuffix_ ); } else { - len = TCharStringLen( wic.szPname ) + 1; + len = WCharStringLen( wic.szPname ) + 1; deviceName = (char*)PaUtil_GroupAllocateMemory( winMmeHostApi->allocations, (long)len ); @@ -759,7 +731,7 @@ static PaError InitializeInputDeviceInfo( PaWinMmeHostApiRepresentation *winMmeH result = paInsufficientMemory; goto error; } - CopyTCharStringToUtf8CString( deviceName, len, wic.szPname ); + CopyWCharStringToUtf8CString( deviceName, len, wic.szPname ); } deviceInfo->name = deviceName; @@ -842,7 +814,7 @@ static PaError InitializeOutputDeviceInfo( PaWinMmeHostApiRepresentation *winMme PaError result = paNoError; char *deviceName; /* non-const ptr */ MMRESULT mmresult; - WAVEOUTCAPS woc; + WAVEOUTCAPSW woc; PaDeviceInfo *deviceInfo = &winMmeDeviceInfo->inheritedDeviceInfo; size_t len; #ifdef PAWIN_USE_WDMKS_DEVICE_INFO @@ -851,7 +823,7 @@ static PaError InitializeOutputDeviceInfo( PaWinMmeHostApiRepresentation *winMme *success = 0; - mmresult = waveOutGetDevCaps( winMmeOutputDeviceId, &woc, sizeof( WAVEOUTCAPS ) ); + mmresult = waveOutGetDevCapsW( winMmeOutputDeviceId, &woc, sizeof( WAVEOUTCAPSW ) ); if( mmresult == MMSYSERR_NOMEM ) { result = paInsufficientMemory; @@ -872,7 +844,7 @@ static PaError InitializeOutputDeviceInfo( PaWinMmeHostApiRepresentation *winMme if( winMmeOutputDeviceId == WAVE_MAPPER ) { /* Append I/O suffix to WAVE_MAPPER device. */ - len = TCharStringLen( woc.szPname ) + 1 + sizeof(constOutputMapperSuffix_); + len = WCharStringLen( woc.szPname ) + 1 + sizeof(constOutputMapperSuffix_); deviceName = (char*)PaUtil_GroupAllocateMemory( winMmeHostApi->allocations, (long)len ); @@ -881,12 +853,12 @@ static PaError InitializeOutputDeviceInfo( PaWinMmeHostApiRepresentation *winMme result = paInsufficientMemory; goto error; } - CopyTCharStringToUtf8CString( deviceName, len, woc.szPname ); + CopyWCharStringToUtf8CString( deviceName, len, woc.szPname ); strcat( deviceName, constOutputMapperSuffix_ ); } else { - len = TCharStringLen( woc.szPname ) + 1; + len = WCharStringLen( woc.szPname ) + 1; deviceName = (char*)PaUtil_GroupAllocateMemory( winMmeHostApi->allocations, (long)len ); @@ -895,7 +867,7 @@ static PaError InitializeOutputDeviceInfo( PaWinMmeHostApiRepresentation *winMme result = paInsufficientMemory; goto error; } - CopyTCharStringToUtf8CString( deviceName, len, woc.szPname ); + CopyWCharStringToUtf8CString( deviceName, len, woc.szPname ); } deviceInfo->name = deviceName; From 6f90db9612f80c9dd781969959820cb1610b8184 Mon Sep 17 00:00:00 2001 From: MichalPetryka <35800402+MichalPetryka@users.noreply.github.com> Date: Tue, 22 Dec 2020 21:00:53 +0100 Subject: [PATCH 065/164] Update pa_win_wmme.c --- src/hostapi/wmme/pa_win_wmme.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/hostapi/wmme/pa_win_wmme.c b/src/hostapi/wmme/pa_win_wmme.c index bf48be5..020cfc0 100644 --- a/src/hostapi/wmme/pa_win_wmme.c +++ b/src/hostapi/wmme/pa_win_wmme.c @@ -295,7 +295,7 @@ static signed long GetStreamWriteAvailable( PaStream* stream ); wchar_t mmeErrorTextWide[ MAXERRORLENGTH ]; \ char mmeErrorText[ MAXERRORLENGTH ]; \ waveInGetErrorTextW( mmresult, mmeErrorTextWide, MAXERRORLENGTH ); \ - WideCharToMultiByte( CP_UTF8, WC_COMPOSITECHECK | WC_DEFAULTCHAR,\ + WideCharToMultiByte( CP_UTF8, 0, \ mmeErrorTextWide, -1, mmeErrorText, MAXERRORLENGTH, NULL, NULL ); \ PaUtil_SetLastHostErrorInfo( paMME, mmresult, mmeErrorText ); \ } @@ -305,7 +305,7 @@ static signed long GetStreamWriteAvailable( PaStream* stream ); wchar_t mmeErrorTextWide[ MAXERRORLENGTH ]; \ char mmeErrorText[ MAXERRORLENGTH ]; \ waveOutGetErrorTextW( mmresult, mmeErrorTextWide, MAXERRORLENGTH ); \ - WideCharToMultiByte( CP_UTF8, WC_COMPOSITECHECK | WC_DEFAULTCHAR,\ + WideCharToMultiByte( CP_UTF8, 0, \ mmeErrorTextWide, -1, mmeErrorText, MAXERRORLENGTH, NULL, NULL ); \ PaUtil_SetLastHostErrorInfo( paMME, mmresult, mmeErrorText ); \ } From f4a9023400f5a0e7b86c616e217ea2579a56e3ba Mon Sep 17 00:00:00 2001 From: MichalPetryka <35800402+MichalPetryka@users.noreply.github.com> Date: Wed, 23 Dec 2020 13:06:48 +0100 Subject: [PATCH 066/164] Align slashes --- src/hostapi/wmme/pa_win_wmme.c | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/src/hostapi/wmme/pa_win_wmme.c b/src/hostapi/wmme/pa_win_wmme.c index 020cfc0..d5337b8 100644 --- a/src/hostapi/wmme/pa_win_wmme.c +++ b/src/hostapi/wmme/pa_win_wmme.c @@ -290,24 +290,24 @@ static signed long GetStreamWriteAvailable( PaStream* stream ); /* macros for setting last host error information */ -#define PA_MME_SET_LAST_WAVEIN_ERROR( mmresult ) \ - { \ - wchar_t mmeErrorTextWide[ MAXERRORLENGTH ]; \ - char mmeErrorText[ MAXERRORLENGTH ]; \ - waveInGetErrorTextW( mmresult, mmeErrorTextWide, MAXERRORLENGTH ); \ - WideCharToMultiByte( CP_UTF8, 0, \ - mmeErrorTextWide, -1, mmeErrorText, MAXERRORLENGTH, NULL, NULL ); \ - PaUtil_SetLastHostErrorInfo( paMME, mmresult, mmeErrorText ); \ +#define PA_MME_SET_LAST_WAVEIN_ERROR( mmresult ) \ + { \ + wchar_t mmeErrorTextWide[ MAXERRORLENGTH ]; \ + char mmeErrorText[ MAXERRORLENGTH ]; \ + waveInGetErrorTextW( mmresult, mmeErrorTextWide, MAXERRORLENGTH ); \ + WideCharToMultiByte( CP_UTF8, 0, mmeErrorTextWide, -1, \ + mmeErrorText, MAXERRORLENGTH, NULL, NULL ); \ + PaUtil_SetLastHostErrorInfo( paMME, mmresult, mmeErrorText ); \ } -#define PA_MME_SET_LAST_WAVEOUT_ERROR( mmresult ) \ - { \ - wchar_t mmeErrorTextWide[ MAXERRORLENGTH ]; \ - char mmeErrorText[ MAXERRORLENGTH ]; \ - waveOutGetErrorTextW( mmresult, mmeErrorTextWide, MAXERRORLENGTH ); \ - WideCharToMultiByte( CP_UTF8, 0, \ - mmeErrorTextWide, -1, mmeErrorText, MAXERRORLENGTH, NULL, NULL ); \ - PaUtil_SetLastHostErrorInfo( paMME, mmresult, mmeErrorText ); \ +#define PA_MME_SET_LAST_WAVEOUT_ERROR( mmresult ) \ + { \ + wchar_t mmeErrorTextWide[ MAXERRORLENGTH ]; \ + char mmeErrorText[ MAXERRORLENGTH ]; \ + waveOutGetErrorTextW( mmresult, mmeErrorTextWide, MAXERRORLENGTH ); \ + WideCharToMultiByte( CP_UTF8, 0, mmeErrorTextWide, -1, \ + mmeErrorText, MAXERRORLENGTH, NULL, NULL ); \ + PaUtil_SetLastHostErrorInfo( paMME, mmresult, mmeErrorText ); \ } From 2d8c7eb0f72931e9ef7847db298ce8a15f40c5a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Damstedt=20Rasmussen?= Date: Tue, 29 Dec 2020 07:31:58 +0100 Subject: [PATCH 067/164] Report thread running so Pa_StartStream can return prior to PaStreamCallback StartStream() calls WaitForSingleObject(stream->hThreadStart, 60*1000) but it will not be able to return until X number of PaStreamCallback have been performed by ProcessOutputBuffer(). The above behaviour will cause a deadlock if the user supplied PaStreamCallback tries to access a shared lock currently held by the function calling Pa_StartStream(). Also it's a bit weird that you start receiving PaStreamCallbacks before Pa_StartStream() is able to complete. --- src/hostapi/wasapi/pa_win_wasapi.c | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/hostapi/wasapi/pa_win_wasapi.c b/src/hostapi/wasapi/pa_win_wasapi.c index d791b66..1914550 100644 --- a/src/hostapi/wasapi/pa_win_wasapi.c +++ b/src/hostapi/wasapi/pa_win_wasapi.c @@ -5890,6 +5890,12 @@ PA_THREAD_FUNC ProcThreadEvent(void *param) goto thread_error; } + // Signal: stream running + stream->running = TRUE; + + // Notify: thread started + SetEvent(stream->hThreadStart); + // Initialize event & start INPUT stream if (stream->in.clientProc) { @@ -5940,12 +5946,6 @@ PA_THREAD_FUNC ProcThreadEvent(void *param) } - // Signal: stream running - stream->running = TRUE; - - // Notify: thread started - SetEvent(stream->hThreadStart); - // Notify: state NotifyStateChanged(stream, paWasapiStreamStateThreadStart, ERROR_SUCCESS); @@ -6171,6 +6171,12 @@ PA_THREAD_FUNC ProcThreadPoll(void *param) // Boost thread priority PaWasapi_ThreadPriorityBoost((void **)&stream->hAvTask, stream->nThreadPriority); + // Signal: stream running + stream->running = TRUE; + + // Notify: thread started + SetEvent(stream->hThreadStart); + // Initialize event & start INPUT stream if (stream->in.clientProc) { @@ -6238,12 +6244,6 @@ PA_THREAD_FUNC ProcThreadPoll(void *param) } } - // Signal: stream running - stream->running = TRUE; - - // Notify: thread started - SetEvent(stream->hThreadStart); - // Notify: state NotifyStateChanged(stream, paWasapiStreamStateThreadStart, ERROR_SUCCESS); From 159b415af0325ec385cae167727964c45285702b Mon Sep 17 00:00:00 2001 From: John Melas Date: Fri, 18 Dec 2020 16:53:35 +0200 Subject: [PATCH 068/164] fix signed/unsigned mismatch warning --- src/hostapi/wasapi/pa_win_wasapi.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/hostapi/wasapi/pa_win_wasapi.c b/src/hostapi/wasapi/pa_win_wasapi.c index d791b66..7eec93e 100644 --- a/src/hostapi/wasapi/pa_win_wasapi.c +++ b/src/hostapi/wasapi/pa_win_wasapi.c @@ -841,8 +841,8 @@ static BOOL SystemTimer_SetGranularity(SystemTimer *timer, UINT32 granularity) if (timeGetDevCaps(&caps, sizeof(caps)) == MMSYSERR_NOERROR) { - if (timer->granularity < caps.wPeriodMin) - timer->granularity = caps.wPeriodMin; + if (timer->granularity < (INT32)caps.wPeriodMin) + timer->granularity = (INT32)caps.wPeriodMin; } if (timeBeginPeriod(timer->granularity) != TIMERR_NOERROR) From 5b75613f065dd948365d8263ffd75764c8752f95 Mon Sep 17 00:00:00 2001 From: Etienne Dechamps Date: Fri, 1 Jan 2021 15:35:13 +0000 Subject: [PATCH 069/164] Add missing PaWasapi_GetDeviceMixFormat cmake DLL export This omission made it impossible to use PaWasapi_GetDeviceMixFormat() from a PortAudio DLL built using CMake. --- cmake_support/template_portaudio.def | 1 + 1 file changed, 1 insertion(+) diff --git a/cmake_support/template_portaudio.def b/cmake_support/template_portaudio.def index d05da59..8044d43 100644 --- a/cmake_support/template_portaudio.def +++ b/cmake_support/template_portaudio.def @@ -51,3 +51,4 @@ PaUtil_SetDebugPrintFunction @55 @DEF_EXCLUDE_WASAPI_SYMBOLS@PaWasapi_GetFramesPerHostBuffer @60 @DEF_EXCLUDE_WASAPI_SYMBOLS@PaWasapi_GetJackDescription @61 @DEF_EXCLUDE_WASAPI_SYMBOLS@PaWasapi_GetJackCount @62 +@DEF_EXCLUDE_WASAPI_SYMBOLS@PaWasapi_GetDeviceMixFormat @63 From 3532e567847b69131cf66fd8b7165e9064969fd9 Mon Sep 17 00:00:00 2001 From: Blue Cat Audio Date: Thu, 7 Jan 2021 12:24:41 +0100 Subject: [PATCH 070/164] Fix: WASAPI should not fail with error if no device found --- src/hostapi/wasapi/pa_win_wasapi.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/hostapi/wasapi/pa_win_wasapi.c b/src/hostapi/wasapi/pa_win_wasapi.c index 39a09db..9273cb6 100644 --- a/src/hostapi/wasapi/pa_win_wasapi.c +++ b/src/hostapi/wasapi/pa_win_wasapi.c @@ -2110,7 +2110,7 @@ static PaError CreateDeviceList(PaWasapiHostApiRepresentation *paWasapi, PaHostA { PaUtilHostApiRepresentation *hostApi = (PaUtilHostApiRepresentation *)paWasapi; PaError result = paNoError; - PaDeviceInfo *deviceInfoArray; + PaDeviceInfo *deviceInfoArray = NULL; UINT32 i; WCHAR *defaultRenderId = NULL; WCHAR *defaultCaptureId = NULL; @@ -2228,7 +2228,7 @@ static PaError CreateDeviceList(PaWasapiHostApiRepresentation *paWasapi, PaHostA #endif // Allocate memory for the device list - if ((deviceInfoArray = AllocateDeviceListMemory(paWasapi)) == NULL) + if ((paWasapi->deviceCount != 0) && ((deviceInfoArray = AllocateDeviceListMemory(paWasapi)) == NULL)) { result = paInsufficientMemory; goto error; @@ -2262,7 +2262,7 @@ static PaError CreateDeviceList(PaWasapiHostApiRepresentation *paWasapi, PaHostA // Fill the remaining slots with inactive device info #if defined(PA_WASAPI_MAX_CONST_DEVICE_COUNT) && (PA_WASAPI_MAX_CONST_DEVICE_COUNT > 0) - if (hostApi->info.deviceCount < PA_WASAPI_MAX_CONST_DEVICE_COUNT) + if ((hostApi->info.deviceCount != 0) && (hostApi->info.deviceCount < PA_WASAPI_MAX_CONST_DEVICE_COUNT)) { for (i = hostApi->info.deviceCount; i < PA_WASAPI_MAX_CONST_DEVICE_COUNT; ++i) { From 0377f169b7b365318c0edfcac16430e05eb3d7df Mon Sep 17 00:00:00 2001 From: Be Date: Wed, 13 Jan 2021 06:12:54 -0600 Subject: [PATCH 071/164] remove index.html This file does not belong in a code repository. --- index.html | 105 ----------------------------------------------------- 1 file changed, 105 deletions(-) delete mode 100644 index.html diff --git a/index.html b/index.html deleted file mode 100644 index 55f9ed6..0000000 --- a/index.html +++ /dev/null @@ -1,105 +0,0 @@ - - - - - - - - - PortAudio Implementations for DirectSound - - -  -

- - - -
-
-

-PortAudio - Portable Audio Library

-
- -

PortAudio is a cross platform, open-source, audio -I/O library proposed by Ross Bencina to the music-dsp -mailing list. It lets you write simple audio programs in 'C' that will -compile and run on Windows, Macintosh, Unix, BeOS. PortAudio is -intended to promote the exchange of audio synthesis software between developers -on different platforms. -

For complete information on PortAudio and to download the latest releases, -please visit "http://www.portaudio.com". -
  -
  -

-

-Click here for Documentation

- -

-

- -

-Contacts and E-Mail List

- -
    -
  • -If you are using or implementing PortAudio then please join the PortAudio -mail list .
  • - -
  • -If you find bugs in one of these implementations, or have suggestions, -please e-mail them to Phil Burk.
  • - -
  • -If you make improvements to the library, please send them to us so we can -incorporate the improvements.
  • -
- -

-License

- - -
-

-PortAudio Portable Real-Time Audio Library -
Copyright © 1999-2006 Ross Bencina and 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. -

-

-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 ON INFRINGEMENT. -
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. -

- -

-The text above constitutes the entire PortAudio license; however, -the PortAudio community also makes the following non-binding requests: -

-

-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. It is also -requested that these non-binding requests be included along with the -license above. -

- -
- - - -
  - - From 91debabf3f0697c1ebda2dd1afc051d9acc6ab79 Mon Sep 17 00:00:00 2001 From: Be Date: Wed, 13 Jan 2021 05:16:58 -0600 Subject: [PATCH 072/164] remove unused and undocumented fixdir.bat & fixfile.bat --- fixdir.bat | 19 ------------------- fixfile.bat | 7 ------- 2 files changed, 26 deletions(-) delete mode 100755 fixdir.bat delete mode 100755 fixfile.bat diff --git a/fixdir.bat b/fixdir.bat deleted file mode 100755 index 92d6c74..0000000 --- a/fixdir.bat +++ /dev/null @@ -1,19 +0,0 @@ -rem Use Astyle to fix style in 'C' files -cd %1% - -fixlines -p *.c -fixlines -p *.cpp -fixlines -p *.cc - -astyle --style=ansi -c -o --convert-tabs --indent-preprocessor *.c -astyle --style=ansi -c -o --convert-tabs --indent-preprocessor *.cpp -astyle --style=ansi -c -o --convert-tabs --indent-preprocessor *.cc -del *.orig -@rem convert line terminators to Unix style LFs -fixlines -u *.c -fixlines -u *.cpp -fixlines -u *.cc -fixlines -u *.h -del *.bak - -cd ..\ diff --git a/fixfile.bat b/fixfile.bat deleted file mode 100755 index 48f6fbc..0000000 --- a/fixfile.bat +++ /dev/null @@ -1,7 +0,0 @@ -rem Use Astyle to fix style in a file -fixlines -p %1% -astyle --style=ansi -c -o --convert-tabs --indent-preprocessor %1% -del %1%.orig -@rem convert line terminators to Unix style LFs -fixlines -u %1% -del %1%.bak From f13ab77c46eeafa4c1b206912fd215467cf255c4 Mon Sep 17 00:00:00 2001 From: Ed Maste Date: Tue, 19 Jan 2021 16:09:01 -0500 Subject: [PATCH 073/164] OSS: include both /dev/dsp and /dev/dsp0 On FreeBSD /dev/dsp is the default device but may not be /dev/dsp0. PortAudio in the FreeBSD ports collection initially had a patch to replace the default device with /dev/dsp (for example, with three devices and /dev/dsp1 as the default we'd have /dev/dsp0, /dev/dsp, /dev/dsp2). This caused some trouble (the first device is no longer default) and was later replaced with this change, leaving /dev/dsp as the first entry, and just adding each /dev/dsp%d that exists. FreeBSD bugs 208968 and 236118. --- src/hostapi/oss/pa_unix_oss.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/hostapi/oss/pa_unix_oss.c b/src/hostapi/oss/pa_unix_oss.c index 9e18d6d..4ca3788 100644 --- a/src/hostapi/oss/pa_unix_oss.c +++ b/src/hostapi/oss/pa_unix_oss.c @@ -535,13 +535,13 @@ static PaError BuildDeviceList( PaOSSHostApiRepresentation *ossApi ) * add it to a linked list. * A: Set an arbitrary of 100 devices, should probably be a smarter way. */ - for( i = 0; i < 100; i++ ) + for( i = -1; i < 100; i++ ) { char deviceName[32]; PaDeviceInfo *deviceInfo; int testResult; - if( i == 0 ) + if( i == -1 ) snprintf(deviceName, sizeof (deviceName), "%s", DEVICE_NAME_BASE); else snprintf(deviceName, sizeof (deviceName), "%s%d", DEVICE_NAME_BASE, i); From fc2a24d3945ccf1a3905750b2ab59ce22f21cb1f Mon Sep 17 00:00:00 2001 From: Ed Maste Date: Tue, 19 Jan 2021 15:00:09 -0500 Subject: [PATCH 074/164] OSS: correct test for unsupported formats Previously GetAvailableFormats returned paSampleFormatNotSupported if AFMT_S16_NE was not supported, regardless of the supported state of any other formats. Instead, return paSampleFormatNotSupported if no supported formats are found. --- src/hostapi/oss/pa_unix_oss.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hostapi/oss/pa_unix_oss.c b/src/hostapi/oss/pa_unix_oss.c index 4ca3788..83ab558 100644 --- a/src/hostapi/oss/pa_unix_oss.c +++ b/src/hostapi/oss/pa_unix_oss.c @@ -961,7 +961,7 @@ static PaError GetAvailableFormats( PaOssStreamComponent *component, PaSampleFor frmts |= paInt8; if( mask & AFMT_S16_NE ) frmts |= paInt16; - else + if( frmts == 0 ) result = paSampleFormatNotSupported; *availableFormats = frmts; From afc6591519f6c0a21e9d3f55c76b5f2e491bb8e9 Mon Sep 17 00:00:00 2001 From: John Melas Date: Thu, 26 Nov 2020 13:23:36 +0200 Subject: [PATCH 075/164] fix logging warnings --- src/hostapi/coreaudio/pa_mac_core.c | 16 ++++++++-------- src/hostapi/coreaudio/pa_mac_core_utilities.c | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/hostapi/coreaudio/pa_mac_core.c b/src/hostapi/coreaudio/pa_mac_core.c index 1766734..4f66f8c 100644 --- a/src/hostapi/coreaudio/pa_mac_core.c +++ b/src/hostapi/coreaudio/pa_mac_core.c @@ -373,7 +373,7 @@ static PaError gatherDeviceInfo(PaMacAUHAL *auhalHostApi) { int i; for( i=0; idevCount; ++i ) - printf( "Device %d\t: %ld\n", i, auhalHostApi->devIds[i] ); + printf( "Device %d\t: %ld\n", i, (long)auhalHostApi->devIds[i] ); } #endif @@ -420,8 +420,8 @@ static PaError gatherDeviceInfo(PaMacAUHAL *auhalHostApi) } } - VDBUG( ( "Default in : %ld\n", auhalHostApi->defaultIn ) ); - VDBUG( ( "Default out: %ld\n", auhalHostApi->defaultOut ) ); + VDBUG( ( "Default in : %ld\n", (long)auhalHostApi->defaultIn ) ); + VDBUG( ( "Default out: %ld\n", (long)auhalHostApi->defaultOut ) ); return paNoError; } @@ -1606,15 +1606,15 @@ static PaError OpenAndSetupOneAudioUnit( if( inStreamParams && outStreamParams ) { - VDBUG( ("Opened device %ld for input and output.\n", *audioDevice ) ); + VDBUG( ("Opened device %ld for input and output.\n", (long)*audioDevice ) ); } else if( inStreamParams ) { - VDBUG( ("Opened device %ld for input.\n", *audioDevice ) ); + VDBUG( ("Opened device %ld for input.\n", (long)*audioDevice ) ); } else if( outStreamParams ) { - VDBUG( ("Opened device %ld for output.\n", *audioDevice ) ); + VDBUG( ("Opened device %ld for output.\n", (long)*audioDevice ) ); } return paNoError; #undef ERR_WRAP @@ -1676,7 +1676,7 @@ static UInt32 CalculateOptimalBufferSize( PaMacAUHAL *auhalHostApi, }else{ VDBUG( ("Block Size unspecified. Based on Latency, the user wants a Block Size near: %ld.\n", - resultBufferSizeFrames ) ); + (long)resultBufferSizeFrames ) ); } // Clip to the capabilities of the device. @@ -1691,7 +1691,7 @@ static UInt32 CalculateOptimalBufferSize( PaMacAUHAL *auhalHostApi, ClipToDeviceBufferSize( auhalHostApi->devIds[outputParameters->device], false, resultBufferSizeFrames, &resultBufferSizeFrames ); } - VDBUG(("After querying hardware, setting block size to %ld.\n", resultBufferSizeFrames)); + VDBUG(("After querying hardware, setting block size to %ld.\n", (long)resultBufferSizeFrames)); return resultBufferSizeFrames; } diff --git a/src/hostapi/coreaudio/pa_mac_core_utilities.c b/src/hostapi/coreaudio/pa_mac_core_utilities.c index c6d8605..73c7f8c 100644 --- a/src/hostapi/coreaudio/pa_mac_core_utilities.c +++ b/src/hostapi/coreaudio/pa_mac_core_utilities.c @@ -428,7 +428,7 @@ PaError setBestSampleRateForDevice( const AudioDeviceID device, int i=0; Float64 max = -1; /*the maximum rate available*/ Float64 best = -1; /*the lowest sample rate still greater than desired rate*/ - VDBUG(("Setting sample rate for device %ld to %g.\n",device,(float)desiredSrate)); + VDBUG(("Setting sample rate for device %ld to %g.\n",(long)device,(float)desiredSrate)); /* -- try setting the sample rate -- */ srate = 0; From 98ea697d33ad8d21d2fd7a720a565d73c9855635 Mon Sep 17 00:00:00 2001 From: John Melas Date: Thu, 26 Nov 2020 14:28:17 +0200 Subject: [PATCH 076/164] new hal --- src/hostapi/coreaudio/pa_mac_core.c | 241 +++++++++++++----- src/hostapi/coreaudio/pa_mac_core_utilities.c | 212 +++++++++++++-- src/hostapi/coreaudio/pa_mac_core_utilities.h | 75 +++++- 3 files changed, 448 insertions(+), 80 deletions(-) diff --git a/src/hostapi/coreaudio/pa_mac_core.c b/src/hostapi/coreaudio/pa_mac_core.c index 4f66f8c..155c6ba 100644 --- a/src/hostapi/coreaudio/pa_mac_core.c +++ b/src/hostapi/coreaudio/pa_mac_core.c @@ -138,7 +138,7 @@ const char *PaMacCore_GetChannelName( int device, int channelIndex, bool input ) /* First try with CFString */ UInt32 size = sizeof(nameRef); - error = AudioDeviceGetProperty( hostApiDevice, + error = pa_AudioDeviceGetProperty( hostApiDevice, channelIndex + 1, input, kAudioDevicePropertyChannelNameCFString, @@ -148,18 +148,17 @@ const char *PaMacCore_GetChannelName( int device, int channelIndex, bool input ) { /* try the C String */ size = 0; - error = AudioDeviceGetPropertyInfo( hostApiDevice, + error = pa_AudioDeviceGetPropertySize( hostApiDevice, channelIndex + 1, input, kAudioDevicePropertyChannelName, - &size, - NULL); + &size); if( !error ) { if( !ensureChannelNameSize( size ) ) return NULL; - - error = AudioDeviceGetProperty( hostApiDevice, + + error = pa_AudioDeviceGetProperty( hostApiDevice, channelIndex + 1, input, kAudioDevicePropertyChannelName, @@ -223,8 +222,8 @@ PaError PaMacCore_GetBufferSizeRange( PaDeviceIndex device, Boolean isInput = 0; if( macCoreHostApi->inheritedHostApiRep.deviceInfos[hostApiDeviceIndex]->maxOutputChannels == 0 ) isInput = 1; - - result = WARNING(AudioDeviceGetProperty( macCoreDeviceId, 0, isInput, kAudioDevicePropertyBufferFrameSizeRange, &propSize, &audioRange ) ); + + result = WARNING(pa_AudioDeviceGetProperty( macCoreDeviceId, 0, isInput, kAudioDevicePropertyBufferFrameSizeRange, &propSize, &audioRange ) ); *minBufferSizeFrames = audioRange.mMinimum; *maxBufferSizeFrames = audioRange.mMaximum; @@ -353,9 +352,8 @@ static PaError gatherDeviceInfo(PaMacAUHAL *auhalHostApi) auhalHostApi->devIds = NULL; /* -- figure out how many devices there are -- */ - AudioHardwareGetPropertyInfo( kAudioHardwarePropertyDevices, - &propsize, - NULL ); + pa_AudioHardwareGetPropertySize( kAudioHardwarePropertyDevices, + &propsize); auhalHostApi->devCount = propsize / sizeof( AudioDeviceID ); VDBUG( ( "Found %ld device(s).\n", auhalHostApi->devCount ) ); @@ -366,7 +364,7 @@ static PaError gatherDeviceInfo(PaMacAUHAL *auhalHostApi) propsize ); if( !auhalHostApi->devIds ) return paInsufficientMemory; - AudioHardwareGetProperty( kAudioHardwarePropertyDevices, + pa_AudioHardwareGetProperty( kAudioHardwarePropertyDevices, &propsize, auhalHostApi->devIds ); #ifdef MAC_CORE_VERBOSE_DEBUG @@ -385,7 +383,7 @@ static PaError gatherDeviceInfo(PaMacAUHAL *auhalHostApi) /* I am not sure how these calls to AudioHardwareGetProperty() could fail, but in case they do, we use the first available device as the default. */ - if( 0 != AudioHardwareGetProperty(kAudioHardwarePropertyDefaultInputDevice, + if( 0 != pa_AudioHardwareGetProperty(kAudioHardwarePropertyDefaultInputDevice, &size, &auhalHostApi->defaultIn) ) { int i; @@ -401,8 +399,8 @@ static PaError gatherDeviceInfo(PaMacAUHAL *auhalHostApi) break; } } - } - if( 0 != AudioHardwareGetProperty(kAudioHardwarePropertyDefaultOutputDevice, + } + if( 0 != pa_AudioHardwareGetProperty(kAudioHardwarePropertyDefaultOutputDevice, &size, &auhalHostApi->defaultOut) ) { int i; @@ -437,7 +435,7 @@ static PaError ClipToDeviceBufferSize( AudioDeviceID macCoreDeviceId, UInt32 resultSize = desiredSize; AudioValueRange audioRange; UInt32 propSize = sizeof( audioRange ); - PaError err = WARNING(AudioDeviceGetProperty( macCoreDeviceId, 0, isInput, kAudioDevicePropertyBufferFrameSizeRange, &propSize, &audioRange ) ); + PaError err = WARNING(pa_AudioDeviceGetProperty( macCoreDeviceId, 0, isInput, kAudioDevicePropertyBufferFrameSizeRange, &propSize, &audioRange ) ); resultSize = MAX( resultSize, audioRange.mMinimum ); resultSize = MIN( resultSize, audioRange.mMaximum ); *allowedSize = resultSize; @@ -487,7 +485,7 @@ static void DumpDeviceProperties( AudioDeviceID macCoreDeviceId, printf("Stream #%d = %d---------------------- \n", i, streamIDs[i] ); propSize = sizeof(UInt32); - err = WARNING(AudioStreamGetProperty(streamIDs[i], 0, kAudioStreamPropertyLatency, &propSize, &streamLatency)); + err = WARNING(p_AudioStreamGetProperty(streamIDs[i], 0, kAudioStreamPropertyLatency, &propSize, &streamLatency)); printf(" kAudioStreamPropertyLatency: err = %d, propSize = %d, value = %d\n", err, propSize, streamLatency ); } } @@ -517,20 +515,20 @@ static PaError CalculateFixedDeviceLatency( AudioDeviceID macCoreDeviceId, int i // To get stream latency we have to get a streamID from the device. // We are only going to look at the first stream so only fetch one stream. propSize = sizeof(streamIDs); - err = WARNING(AudioDeviceGetProperty(macCoreDeviceId, 0, isInput, kAudioDevicePropertyStreams, &propSize, &streamIDs[0])); + err = WARNING(pa_AudioDeviceGetProperty(macCoreDeviceId, 0, isInput, kAudioDevicePropertyStreams, &propSize, &streamIDs[0])); if( err != paNoError ) goto error; if( propSize == sizeof(AudioStreamID) ) { propSize = sizeof(UInt32); - err = WARNING(AudioStreamGetProperty(streamIDs[0], 0, kAudioStreamPropertyLatency, &propSize, &streamLatency)); + err = WARNING(pa_AudioStreamGetProperty(streamIDs[0], 0, kAudioStreamPropertyLatency, &propSize, &streamLatency)); } propSize = sizeof(UInt32); - err = WARNING(AudioDeviceGetProperty(macCoreDeviceId, 0, isInput, kAudioDevicePropertySafetyOffset, &propSize, &safetyOffset)); + err = WARNING(pa_AudioDeviceGetProperty(macCoreDeviceId, 0, isInput, kAudioDevicePropertySafetyOffset, &propSize, &safetyOffset)); if( err != paNoError ) goto error; propSize = sizeof(UInt32); - err = WARNING(AudioDeviceGetProperty(macCoreDeviceId, 0, isInput, kAudioDevicePropertyLatency, &propSize, &deviceLatency)); + err = WARNING(pa_AudioDeviceGetProperty(macCoreDeviceId, 0, isInput, kAudioDevicePropertyLatency, &propSize, &deviceLatency)); if( err != paNoError ) goto error; *fixedLatencyPtr = deviceLatency + streamLatency + safetyOffset; @@ -560,7 +558,7 @@ static PaError CalculateDefaultDeviceLatencies( AudioDeviceID macCoreDeviceId, // For high latency use the default device buffer size. propSize = sizeof(UInt32); - err = WARNING(AudioDeviceGetProperty(macCoreDeviceId, 0, isInput, kAudioDevicePropertyBufferFrameSize, &propSize, &bufferFrames)); + err = WARNING(pa_AudioDeviceGetProperty(macCoreDeviceId, 0, isInput, kAudioDevicePropertyBufferFrameSize, &propSize, &bufferFrames)); if( err != paNoError ) goto error; *lowLatencyFramesPtr = fixedLatency + clippedMinBufferSize; @@ -589,14 +587,14 @@ static PaError GetChannelInfo( PaMacAUHAL *auhalHostApi, /* Get the number of channels from the stream configuration. Fail if we can't get this. */ - err = ERR(AudioDeviceGetPropertyInfo(macCoreDeviceId, 0, isInput, kAudioDevicePropertyStreamConfiguration, &propSize, NULL)); + err = ERR(pa_AudioDeviceGetPropertySize(macCoreDeviceId, 0, isInput, kAudioDevicePropertyStreamConfiguration, &propSize)); if (err) return err; buflist = PaUtil_AllocateMemory(propSize); if( !buflist ) return paInsufficientMemory; - err = ERR(AudioDeviceGetProperty(macCoreDeviceId, 0, isInput, kAudioDevicePropertyStreamConfiguration, &propSize, buflist)); + err = ERR(pa_AudioDeviceGetProperty(macCoreDeviceId, 0, isInput, kAudioDevicePropertyStreamConfiguration, &propSize, buflist)); if (err) goto error; @@ -664,18 +662,18 @@ static PaError InitializeDeviceInfo( PaMacAUHAL *auhalHostApi, /* Get the device name using CFString */ propSize = sizeof(nameRef); - err = ERR(AudioDeviceGetProperty(macCoreDeviceId, 0, 0, kAudioDevicePropertyDeviceNameCFString, &propSize, &nameRef)); + err = ERR(pa_AudioDeviceGetProperty(macCoreDeviceId, 0, 0, kAudioDevicePropertyDeviceNameCFString, &propSize, &nameRef)); if (err) { /* Get the device name using c string. Fail if we can't get it. */ - err = ERR(AudioDeviceGetPropertyInfo(macCoreDeviceId, 0, 0, kAudioDevicePropertyDeviceName, &propSize, NULL)); + err = ERR(pa_AudioDeviceGetPropertySize(macCoreDeviceId, 0, 0, kAudioDevicePropertyDeviceName, &propSize)); if (err) return err; name = PaUtil_GroupAllocateMemory(auhalHostApi->allocations,propSize+1); if ( !name ) return paInsufficientMemory; - err = ERR(AudioDeviceGetProperty(macCoreDeviceId, 0, 0, kAudioDevicePropertyDeviceName, &propSize, name)); + err = ERR(pa_AudioDeviceGetProperty(macCoreDeviceId, 0, 0, kAudioDevicePropertyDeviceName, &propSize, name)); if (err) return err; } @@ -696,7 +694,7 @@ static PaError InitializeDeviceInfo( PaMacAUHAL *auhalHostApi, /* Try to get the default sample rate. Don't fail if we can't get this. */ propSize = sizeof(Float64); - err = ERR(AudioDeviceGetProperty(macCoreDeviceId, 0, 0, kAudioDevicePropertyNominalSampleRate, &propSize, &sampleRate)); + err = ERR(pa_AudioDeviceGetProperty(macCoreDeviceId, 0, 0, kAudioDevicePropertyNominalSampleRate, &propSize, &sampleRate)); if (err) deviceInfo->defaultSampleRate = 0.0; else @@ -1045,7 +1043,7 @@ static OSStatus UpdateSampleRateFromDeviceProperty( PaMacCoreStream *stream, Aud Float64 sampleRate = 0.0; UInt32 propSize = sizeof(Float64); - OSStatus osErr = AudioDeviceGetProperty( deviceID, 0, isInput, sampleRatePropertyID, &propSize, &sampleRate); + OSStatus osErr = pa_AudioDeviceGetProperty( deviceID, 0, isInput, sampleRatePropertyID, &propSize, &sampleRate); if( (osErr == noErr) && (sampleRate > 1000.0) ) /* avoid divide by zero if there's an error */ { deviceProperties->sampleRate = sampleRate; @@ -1054,6 +1052,23 @@ static OSStatus UpdateSampleRateFromDeviceProperty( PaMacCoreStream *stream, Aud return osErr; } +#if PA_NEW_HAL +static OSStatus AudioDevicePropertyActualSampleRateListenerProc(AudioObjectID inDevice, UInt32 inNumberAddresses, const AudioObjectPropertyAddress * inAddresses, void * inClientData) +{ + PaMacCoreStream * stream = (PaMacCoreStream *) inClientData; + bool isInput = inAddresses->mScope == kAudioDevicePropertyScopeInput; + + // Make sure the callback is operating on a stream that is still valid! + assert(stream->streamRepresentation.magic == PA_STREAM_MAGIC); + + OSStatus osErr = UpdateSampleRateFromDeviceProperty(stream, inDevice, isInput, kAudioDevicePropertyActualSampleRate); + if (osErr == noErr) + { + UpdateTimeStampOffsets(stream); + } + return osErr; +} +#else static OSStatus AudioDevicePropertyActualSampleRateListenerProc( AudioDeviceID inDevice, UInt32 inChannel, Boolean isInput, AudioDevicePropertyID inPropertyID, void *inClientData ) { PaMacCoreStream *stream = (PaMacCoreStream*)inClientData; @@ -1068,13 +1083,13 @@ static OSStatus AudioDevicePropertyActualSampleRateListenerProc( AudioDeviceID i } return osErr; } - +#endif /* ================================================================================= */ static OSStatus QueryUInt32DeviceProperty( AudioDeviceID deviceID, Boolean isInput, AudioDevicePropertyID propertyID, UInt32 *outValue ) { UInt32 propertyValue = 0; UInt32 propertySize = sizeof(UInt32); - OSStatus osErr = AudioDeviceGetProperty( deviceID, 0, isInput, propertyID, &propertySize, &propertyValue); + OSStatus osErr = pa_AudioDeviceGetProperty( deviceID, 0, isInput, propertyID, &propertySize, &propertyValue); if( osErr == noErr ) { *outValue = propertyValue; @@ -1082,6 +1097,44 @@ static OSStatus QueryUInt32DeviceProperty( AudioDeviceID deviceID, Boolean isInp return osErr; } +#if PA_NEW_HAL +static OSStatus AudioDevicePropertyGenericListenerProc(AudioObjectID inDevice, UInt32 inNumberAddresses, const AudioObjectPropertyAddress * inAddresses, void * inClientData) +{ + OSStatus osErr = noErr; + PaMacCoreStream * stream = (PaMacCoreStream *) inClientData; + bool isInput = inAddresses->mScope == kAudioDevicePropertyScopeInput; + AudioDevicePropertyID inPropertyID = inAddresses->mSelector; + + // Make sure the callback is operating on a stream that is still valid! + assert(stream->streamRepresentation.magic == PA_STREAM_MAGIC); + + PaMacCoreDeviceProperties * deviceProperties = isInput ? &stream->inputProperties : &stream->outputProperties; + UInt32 * valuePtr = NULL; + switch (inPropertyID) + { + case kAudioDevicePropertySafetyOffset: + valuePtr = &deviceProperties->safetyOffset; + break; + + case kAudioDevicePropertyLatency: + valuePtr = &deviceProperties->deviceLatency; + break; + + case kAudioDevicePropertyBufferFrameSize: + valuePtr = &deviceProperties->bufferFrameSize; + break; + } + if (valuePtr != NULL) + { + osErr = QueryUInt32DeviceProperty(inDevice, isInput, inPropertyID, valuePtr); + if (osErr == noErr) + { + UpdateTimeStampOffsets(stream); + } + } + return osErr; +} +#else static OSStatus AudioDevicePropertyGenericListenerProc( AudioDeviceID inDevice, UInt32 inChannel, Boolean isInput, AudioDevicePropertyID inPropertyID, void *inClientData ) { OSStatus osErr = noErr; @@ -1116,6 +1169,7 @@ static OSStatus AudioDevicePropertyGenericListenerProc( AudioDeviceID inDevice, } return osErr; } +#endif /* ================================================================================= */ /* @@ -1131,31 +1185,31 @@ static OSStatus SetupDevicePropertyListeners( PaMacCoreStream *stream, AudioDevi kAudioDevicePropertyBufferFrameSize, &deviceProperties->bufferFrameSize )) != noErr ) return osErr; if( (osErr = QueryUInt32DeviceProperty( deviceID, isInput, kAudioDevicePropertySafetyOffset, &deviceProperties->safetyOffset )) != noErr ) return osErr; - - AudioDeviceAddPropertyListener( deviceID, 0, isInput, kAudioDevicePropertyActualSampleRate, + + pa_AudioDeviceAddPropertyListener( deviceID, 0, isInput, kAudioDevicePropertyActualSampleRate, AudioDevicePropertyActualSampleRateListenerProc, stream ); - - AudioDeviceAddPropertyListener( deviceID, 0, isInput, kAudioStreamPropertyLatency, - AudioDevicePropertyGenericListenerProc, stream ); - AudioDeviceAddPropertyListener( deviceID, 0, isInput, kAudioDevicePropertyBufferFrameSize, - AudioDevicePropertyGenericListenerProc, stream ); - AudioDeviceAddPropertyListener( deviceID, 0, isInput, kAudioDevicePropertySafetyOffset, - AudioDevicePropertyGenericListenerProc, stream ); - + + pa_AudioDeviceAddPropertyListener( deviceID, 0, isInput, kAudioStreamPropertyLatency, + AudioDevicePropertyGenericListenerProc, stream ); + pa_AudioDeviceAddPropertyListener( deviceID, 0, isInput, kAudioDevicePropertyBufferFrameSize, + AudioDevicePropertyGenericListenerProc, stream ); + pa_AudioDeviceAddPropertyListener( deviceID, 0, isInput, kAudioDevicePropertySafetyOffset, + AudioDevicePropertyGenericListenerProc, stream ); + return osErr; } static void CleanupDevicePropertyListeners( PaMacCoreStream *stream, AudioDeviceID deviceID, Boolean isInput ) -{ - AudioDeviceRemovePropertyListener( deviceID, 0, isInput, kAudioDevicePropertyActualSampleRate, - AudioDevicePropertyActualSampleRateListenerProc ); - - AudioDeviceRemovePropertyListener( deviceID, 0, isInput, kAudioDevicePropertyLatency, - AudioDevicePropertyGenericListenerProc ); - AudioDeviceRemovePropertyListener( deviceID, 0, isInput, kAudioDevicePropertyBufferFrameSize, - AudioDevicePropertyGenericListenerProc ); - AudioDeviceRemovePropertyListener( deviceID, 0, isInput, kAudioDevicePropertySafetyOffset, - AudioDevicePropertyGenericListenerProc ); +{ + pa_AudioDeviceRemovePropertyListener( deviceID, 0, isInput, kAudioDevicePropertyActualSampleRate, + AudioDevicePropertyActualSampleRateListenerProc, stream ); + + pa_AudioDeviceRemovePropertyListener( deviceID, 0, isInput, kAudioDevicePropertyLatency, + AudioDevicePropertyGenericListenerProc, stream ); + pa_AudioDeviceRemovePropertyListener( deviceID, 0, isInput, kAudioDevicePropertyBufferFrameSize, + AudioDevicePropertyGenericListenerProc, stream ); + pa_AudioDeviceRemovePropertyListener( deviceID, 0, isInput, kAudioDevicePropertySafetyOffset, + AudioDevicePropertyGenericListenerProc, stream ); } /* ================================================================================= */ @@ -1329,7 +1383,7 @@ static PaError OpenAndSetupOneAudioUnit( sizeof(AudioDeviceID) ) ); } /* -- add listener for dropouts -- */ - result = AudioDeviceAddPropertyListener( *audioDevice, + result = pa_AudioDeviceAddPropertyListener( *audioDevice, 0, outStreamParams ? false : true, kAudioDeviceProcessorOverload, @@ -2128,9 +2182,43 @@ PaTime GetStreamTime( PaStream *s ) #define RING_BUFFER_EMPTY (1000) -static OSStatus ringBufferIOProc( AudioConverterRef inAudioConverter, - UInt32*ioDataSize, - void** outData, +#if PA_NEW_HAL +static OSStatus ringBufferIOProc( + AudioConverterRef inAudioConverter, + UInt32* ioNumberDataPackets, + AudioBufferList* ioData, + AudioStreamPacketDescription** outDataPacketDescription, + void* inUserData) +{ + UInt32 * ioDataSize = &ioData->mBuffers[0].mDataByteSize; + void ** outData = &ioData->mBuffers[0].mData; + + void *dummyData; + ring_buffer_size_t dummySize; + PaUtilRingBuffer *rb = (PaUtilRingBuffer *) inUserData; + + VVDBUG(("ringBufferIOProc()\n")); + + if( PaUtil_GetRingBufferReadAvailable( rb ) == 0 ) { + *outData = NULL; + *ioDataSize = 0; + return RING_BUFFER_EMPTY; + } + assert(sizeof(UInt32) == sizeof(ring_buffer_size_t)); + assert( ( (*ioDataSize) / rb->elementSizeBytes ) * rb->elementSizeBytes == (*ioDataSize) ) ; + (*ioDataSize) /= rb->elementSizeBytes ; + PaUtil_GetRingBufferReadRegions( rb, *ioDataSize, + outData, (ring_buffer_size_t *)ioDataSize, + &dummyData, &dummySize ); + assert( *ioDataSize ); + PaUtil_AdvanceRingBufferReadIndex( rb, *ioDataSize ); + (*ioDataSize) *= rb->elementSizeBytes ; + return noErr; +} +#else +static OSStatus ringBufferIOProc( AudioConverterRef inAudioConverter, + UInt32*ioDataSize, + void** outData, void*inUserData ) { void *dummyData; @@ -2156,6 +2244,7 @@ static OSStatus ringBufferIOProc( AudioConverterRef inAudioConverter, return noErr; } +#endif /* * Called by the AudioUnit API to process audio from the sound card. @@ -2377,12 +2466,27 @@ static OSStatus AudioIOProc( void *inRefCon, UInt32 size; float data[ inChan * frames ]; size = sizeof( data ); - err = AudioConverterFillBuffer( +#if PA_NEW_HAL + AudioBufferList bufferList; + bufferList.mNumberBuffers = 1; + bufferList.mBuffers[0].mNumberChannels = inChan; + bufferList.mBuffers[0].mDataByteSize = size; + bufferList.mBuffers[0].mData = data; + err = AudioConverterFillComplexBuffer( + stream->inputSRConverter, + ringBufferIOProc, + &stream->inputRingBuffer, + &size, + &bufferList, + NULL); +#else + err = AudioConverterFillBuffer( stream->inputSRConverter, ringBufferIOProc, &stream->inputRingBuffer, &size, (void *)&data ); +#endif if( err == RING_BUFFER_EMPTY ) { /* the ring buffer callback underflowed */ err = 0; @@ -2562,12 +2666,27 @@ static OSStatus AudioIOProc( void *inRefCon, long f; size = sizeof( data ); - err = AudioConverterFillBuffer( +#if PA_NEW_HAL + AudioBufferList bufferList; + bufferList.mNumberBuffers = 1; + bufferList.mBuffers[0].mNumberChannels = chan; + bufferList.mBuffers[0].mDataByteSize = size; + bufferList.mBuffers[0].mData = data; + err = AudioConverterFillComplexBuffer( + stream->inputSRConverter, + ringBufferIOProc, + &stream->inputRingBuffer, + &size, + &bufferList, + NULL); +#else + err = AudioConverterFillBuffer( stream->inputSRConverter, ringBufferIOProc, &stream->inputRingBuffer, &size, (void *)data ); +#endif if( err != RING_BUFFER_EMPTY ) ERR( err ); if( err != noErr && err != RING_BUFFER_EMPTY ) @@ -2646,20 +2765,20 @@ static PaError CloseStream( PaStream* s ) if( stream->outputUnit ) { int count = removeFromXRunListenerList( stream ); if( count == 0 ) - AudioDeviceRemovePropertyListener( stream->outputDevice, + pa_AudioDeviceRemovePropertyListener( stream->outputDevice, 0, false, kAudioDeviceProcessorOverload, - xrunCallback ); + xrunCallback, NULL ); //todo: do we need to pass actual node? } if( stream->inputUnit && stream->outputUnit != stream->inputUnit ) { int count = removeFromXRunListenerList( stream ); if( count == 0 ) - AudioDeviceRemovePropertyListener( stream->inputDevice, + pa_AudioDeviceRemovePropertyListener( stream->inputDevice, 0, true, kAudioDeviceProcessorOverload, - xrunCallback ); + xrunCallback, NULL ); //todo: do we need to pass actual node? } if( stream->outputUnit && stream->outputUnit != stream->inputUnit ) { AudioUnitUninitialize( stream->outputUnit ); diff --git a/src/hostapi/coreaudio/pa_mac_core_utilities.c b/src/hostapi/coreaudio/pa_mac_core_utilities.c index 73c7f8c..4563a93 100644 --- a/src/hostapi/coreaudio/pa_mac_core_utilities.c +++ b/src/hostapi/coreaudio/pa_mac_core_utilities.c @@ -63,6 +63,131 @@ #include #include +OSStatus pa_AudioHardwareGetProperty( + AudioHardwarePropertyID inPropertyID, + UInt32* ioPropertyDataSize, + void* outPropertyData) +{ +#if PA_NEW_HAL + AudioObjectPropertyAddress address = { inPropertyID, kAudioObjectPropertyScopeGlobal, kAudioObjectPropertyElementMaster }; + return AudioObjectGetPropertyData(kAudioObjectSystemObject, &address, 0, NULL, ioPropertyDataSize, outPropertyData); +#else + macErr = AudioHardwareGetProperty(inPropertyID, ioPropertyDataSize, outPropertyData); +#endif +} + +OSStatus pa_AudioHardwareGetPropertySize( + AudioHardwarePropertyID inPropertyID, + UInt32* outSize) +{ +#if PA_NEW_HAL + AudioObjectPropertyAddress address = { inPropertyID, kAudioObjectPropertyScopeGlobal, kAudioObjectPropertyElementMaster }; + return AudioObjectGetPropertyDataSize(kAudioObjectSystemObject, &address, 0, NULL, outSize); +#else + macErr = AudioHardwareGetPropertyInfo(inPropertyID, outSize, NULL); +#endif +} + +OSStatus pa_AudioDeviceGetProperty( + AudioDeviceID inDevice, + UInt32 inChannel, + Boolean isInput, + AudioDevicePropertyID inPropertyID, + UInt32* ioPropertyDataSize, + void* outPropertyData) +{ +#if PA_NEW_HAL + AudioObjectPropertyScope scope = isInput ? kAudioDevicePropertyScopeInput : kAudioDevicePropertyScopeOutput; + AudioObjectPropertyAddress address = { inPropertyID, scope, inChannel }; + return AudioObjectGetPropertyData(inDevice, &address, 0, NULL, ioPropertyDataSize, outPropertyData); +#else + macErr = AudioDeviceGetProperty(inDevice, inChannel, isInput, inPropertyID, ioPropertyDataSize, outPropertyData); +#endif +} + +OSStatus pa_AudioDeviceSetProperty( + AudioDeviceID inDevice, + const AudioTimeStamp* inWhen, + UInt32 inChannel, + Boolean isInput, + AudioDevicePropertyID inPropertyID, + UInt32 inPropertyDataSize, + const void* inPropertyData) +{ +#if PA_NEW_HAL + AudioObjectPropertyScope scope = isInput ? kAudioDevicePropertyScopeInput : kAudioDevicePropertyScopeOutput; + AudioObjectPropertyAddress address = { inPropertyID, scope, inChannel }; + return AudioObjectSetPropertyData(inDevice, &address, 0, NULL, inPropertyDataSize, inPropertyData); +#else + return AudioDeviceSetProperty(inDevice, inWhen, inChannel, isInput, inPropertyID, inPropertyDataSize, inPropertyData); +#endif +} + +OSStatus pa_AudioDeviceGetPropertySize( + AudioDeviceID inDevice, + UInt32 inChannel, + Boolean isInput, + AudioDevicePropertyID inPropertyID, + UInt32* outSize) +{ +#if PA_NEW_HAL + AudioObjectPropertyScope scope = isInput ? kAudioDevicePropertyScopeInput : kAudioDevicePropertyScopeOutput; + AudioObjectPropertyAddress address = { inPropertyID, scope, inChannel }; + return AudioObjectGetPropertyDataSize(inDevice, &address, 0, NULL, outSize); +#else + return AudioDeviceGetPropertyInfo(inDevice, inChannel, isInput, inPropertyID, outSize, NULL); +#endif +} + +OSStatus pa_AudioDeviceAddPropertyListener( + AudioDeviceID inDevice, + UInt32 inChannel, + Boolean isInput, + AudioDevicePropertyID inPropertyID, + pa_AudioDevicePropertyListenerProc inProc, + void* inClientData) +{ +#if PA_NEW_HAL + AudioObjectPropertyScope scope = isInput ? kAudioDevicePropertyScopeInput : kAudioDevicePropertyScopeOutput; + AudioObjectPropertyAddress address = { inPropertyID, scope, inChannel }; + return AudioObjectAddPropertyListener(inDevice, &address, inProc, inClientData); +#else + return AudioDeviceAddPropertyListener(inDevice, inChannel, isInput, inPropertyID, inProc, inClientData); +#endif +} + +OSStatus pa_AudioDeviceRemovePropertyListener( + AudioDeviceID inDevice, + UInt32 inChannel, + Boolean isInput, + AudioDevicePropertyID inPropertyID, + pa_AudioDevicePropertyListenerProc inProc, + void* inClientData) +{ +#if PA_NEW_HAL + AudioObjectPropertyScope scope = isInput ? kAudioDevicePropertyScopeInput : kAudioDevicePropertyScopeOutput; + AudioObjectPropertyAddress address = { inPropertyID, scope, inChannel }; + return AudioObjectRemovePropertyListener(inDevice, &address, inProc, inClientData); +#else + return AudioDeviceRemovePropertyListener(inDevice, inChannel, isInput, inPropertyID, inProc); +#endif +} + +OSStatus pa_AudioStreamGetProperty( + AudioStreamID inStream, + UInt32 inChannel, + AudioDevicePropertyID inPropertyID, + UInt32* ioPropertyDataSize, + void* outPropertyData) +{ +#if PA_NEW_HAL + AudioObjectPropertyAddress address = { inPropertyID, kAudioObjectPropertyScopeGlobal, kAudioObjectPropertyElementMaster }; + return AudioObjectGetPropertyData(inStream, &address, 0, NULL, ioPropertyDataSize, outPropertyData); +#else + return AudioStreamGetProperty(inStream, inChannel, inPropertyID, ioPropertyDataSize, outPropertyData); +#endif +} + PaError PaMacCore_SetUnixError( int err, int line ) { PaError ret; @@ -149,12 +274,14 @@ PaError PaMacCore_SetError(OSStatus error, int line, int isError) case kAudioUnitErr_TooManyFramesToProcess: errorText = "Audio Unit: Too Many Frames"; result = paInternalError; break; +#if ! PA_NEW_HAL case kAudioUnitErr_IllegalInstrument: errorText = "Audio Unit: Illegal Instrument"; result = paInternalError; break; case kAudioUnitErr_InstrumentTypeNotFound: errorText = "Audio Unit: Instrument Type Not Found"; result = paInternalError; break; +#endif case kAudioUnitErr_InvalidFile: errorText = "Audio Unit: Invalid File"; result = paInternalError; break; @@ -307,6 +434,17 @@ long computeRingBufferSize( const PaStreamParameters *inputParameters, * since it represents a theoretically better implementation. */ +#if PA_NEW_HAL +OSStatus propertyProc( + AudioObjectID inObjectID, + UInt32 inNumberAddresses, + const AudioObjectPropertyAddress* inAddresses, + void* inClientData) +{ + // this is where we would set the condition variable + return noErr; +} +#else OSStatus propertyProc( AudioDeviceID inDevice, UInt32 inChannel, @@ -317,6 +455,7 @@ OSStatus propertyProc( // this is where we would set the condition variable return noErr; } +#endif /* sets the value of the given property and waits for the change to be acknowledged, and returns the final value, which is not guaranteed @@ -340,8 +479,8 @@ PaError AudioDeviceSetPropertyNowAndWaitForChange( UInt32 outPropertyDataSize = inPropertyDataSize; /* First, see if it already has that value. If so, return. */ - macErr = AudioDeviceGetProperty( inDevice, inChannel, - isInput, inPropertyID, + macErr = pa_AudioDeviceGetProperty( inDevice, inChannel, + isInput, inPropertyID, &outPropertyDataSize, outPropertyData ); if( macErr ) { memset( outPropertyData, 0, inPropertyDataSize ); @@ -357,7 +496,7 @@ PaError AudioDeviceSetPropertyNowAndWaitForChange( /* If we were using a cond variable, we'd do something useful here, but for now, this is just to make 10.6 happy. */ - macErr = AudioDeviceAddPropertyListener( inDevice, inChannel, isInput, + macErr = pa_AudioDeviceAddPropertyListener( inDevice, inChannel, isInput, inPropertyID, propertyProc, NULL ); if( macErr ) @@ -365,7 +504,7 @@ PaError AudioDeviceSetPropertyNowAndWaitForChange( goto failMac; /* set property */ - macErr = AudioDeviceSetProperty( inDevice, NULL, inChannel, + macErr = pa_AudioDeviceSetProperty( inDevice, NULL, inChannel, isInput, inPropertyID, inPropertyDataSize, inPropertyData ); if( macErr ) @@ -380,8 +519,8 @@ PaError AudioDeviceSetPropertyNowAndWaitForChange( memcpy( &tv2, &tv1, sizeof( struct timeval ) ); while( tv2.tv_sec - tv1.tv_sec < 30 ) { /* now read the property back out */ - macErr = AudioDeviceGetProperty( inDevice, inChannel, - isInput, inPropertyID, + macErr = pa_AudioDeviceGetProperty( inDevice, inChannel, + isInput, inPropertyID, &outPropertyDataSize, outPropertyData ); if( macErr ) { memset( outPropertyData, 0, inPropertyDataSize ); @@ -389,7 +528,7 @@ PaError AudioDeviceSetPropertyNowAndWaitForChange( } /* and compare... */ if( 0==memcmp( outPropertyData, inPropertyData, outPropertyDataSize ) ) { - AudioDeviceRemovePropertyListener( inDevice, inChannel, isInput, inPropertyID, propertyProc ); + pa_AudioDeviceRemovePropertyListener( inDevice, inChannel, isInput, inPropertyID, propertyProc, NULL); return paNoError; } /* No match yet, so let's sleep and try again. */ @@ -397,12 +536,12 @@ PaError AudioDeviceSetPropertyNowAndWaitForChange( gettimeofday( &tv2, NULL ); } DBUG( ("Timeout waiting for device setting.\n" ) ); - - AudioDeviceRemovePropertyListener( inDevice, inChannel, isInput, inPropertyID, propertyProc ); + + pa_AudioDeviceRemovePropertyListener( inDevice, inChannel, isInput, inPropertyID, propertyProc, NULL ); return paNoError; failMac: - AudioDeviceRemovePropertyListener( inDevice, inChannel, isInput, inPropertyID, propertyProc ); + pa_AudioDeviceRemovePropertyListener( inDevice, inChannel, isInput, inPropertyID, propertyProc, NULL ); return ERR( macErr ); } @@ -448,15 +587,15 @@ PaError setBestSampleRateForDevice( const AudioDeviceID device, return paInvalidSampleRate; /* -- generate a list of available sample rates -- */ - err = AudioDeviceGetPropertyInfo( device, 0, isInput, + err = pa_AudioDeviceGetPropertySize( device, 0, isInput, kAudioDevicePropertyAvailableNominalSampleRates, - &propsize, NULL ); + &propsize ); if( err ) return ERR( err ); ranges = (AudioValueRange *)calloc( 1, propsize ); if( !ranges ) return paInsufficientMemory; - err = AudioDeviceGetProperty( device, 0, isInput, + err = pa_AudioDeviceGetProperty( device, 0, isInput, kAudioDevicePropertyAvailableNominalSampleRates, &propsize, ranges ); if( err ) @@ -536,10 +675,10 @@ PaError setBestFramesPerBuffer( const AudioDeviceID device, } /* -- try and set exact FPB -- */ - err = AudioDeviceSetProperty( device, NULL, 0, isInput, + err = pa_AudioDeviceSetProperty( device, NULL, 0, isInput, kAudioDevicePropertyBufferFrameSize, propsize, &requestedFramesPerBuffer); - err = AudioDeviceGetProperty( device, 0, isInput, + err = pa_AudioDeviceGetProperty( device, 0, isInput, kAudioDevicePropertyBufferFrameSize, &propsize, actualFramesPerBuffer); if( err ) @@ -554,7 +693,7 @@ PaError setBestFramesPerBuffer( const AudioDeviceID device, // Clip requested value against legal range for the device. propsize = sizeof(AudioValueRange); - err = AudioDeviceGetProperty( device, 0, isInput, + err = pa_AudioDeviceGetProperty( device, 0, isInput, kAudioDevicePropertyBufferFrameSizeRange, &propsize, &range ); if( err ) @@ -572,11 +711,11 @@ PaError setBestFramesPerBuffer( const AudioDeviceID device, /* --- set the buffer size (ignore errors) -- */ propsize = sizeof( UInt32 ); - err = AudioDeviceSetProperty( device, NULL, 0, isInput, + err = pa_AudioDeviceSetProperty( device, NULL, 0, isInput, kAudioDevicePropertyBufferFrameSize, propsize, &requestedFramesPerBuffer ); /* --- read the property to check that it was set -- */ - err = AudioDeviceGetProperty( device, 0, isInput, + err = pa_AudioDeviceGetProperty( device, 0, isInput, kAudioDevicePropertyBufferFrameSize, &propsize, actualFramesPerBuffer ); @@ -605,6 +744,42 @@ static PaMacXRunListNode firstXRunListNode; static int xRunListSize; static pthread_mutex_t xrunMutex; +#if PA_NEW_HAL +OSStatus xrunCallback( + AudioObjectID inDevice, + UInt32 inNumberAddresses, + const AudioObjectPropertyAddress* inAddresses, + void * inClientData) +{ + PaMacXRunListNode *node = (PaMacXRunListNode *) inClientData; + bool isInput = inAddresses->mScope == kAudioDevicePropertyScopeInput; + + int ret = pthread_mutex_trylock( &xrunMutex ) ; + + if( ret == 0 ) { + node = node->next ; //skip the first node + + for( ; node; node=node->next ) { + PaMacCoreStream *stream = node->stream; + + if( stream->state != ACTIVE ) + continue; //if the stream isn't active, we don't care if the device is dropping + + if( isInput ) { + if( stream->inputDevice == inDevice ) + OSAtomicOr32( paInputOverflow, &stream->xrunFlags ); + } else { + if( stream->outputDevice == inDevice ) + OSAtomicOr32( paOutputUnderflow, &stream->xrunFlags ); + } + } + + pthread_mutex_unlock( &xrunMutex ); + } + + return 0; +} +#else OSStatus xrunCallback( AudioDeviceID inDevice, UInt32 inChannel, @@ -640,6 +815,7 @@ OSStatus xrunCallback( return 0; } +#endif int initializeXRunListenerList( void ) { diff --git a/src/hostapi/coreaudio/pa_mac_core_utilities.h b/src/hostapi/coreaudio/pa_mac_core_utilities.h index e63b3cb..e6e0c6e 100644 --- a/src/hostapi/coreaudio/pa_mac_core_utilities.h +++ b/src/hostapi/coreaudio/pa_mac_core_utilities.h @@ -111,9 +111,66 @@ # define VVDBUG(MSG) #endif +#if (MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5) +#define PA_NEW_HAL 1 +#else +#define PA_NEW_HAL 0 +#endif +#if PA_NEW_HAL +typedef AudioObjectPropertyListenerProc pa_AudioDevicePropertyListenerProc; +#else +typedef AudioDevicePropertyListenerProc pa_AudioDevicePropertyListenerProc; +#endif - +OSStatus pa_AudioHardwareGetProperty( + AudioHardwarePropertyID inPropertyID, + UInt32* ioPropertyDataSize, + void* outPropertyData); +OSStatus pa_AudioHardwareGetPropertySize( + AudioHardwarePropertyID inPropertyID, + UInt32* outSize); +OSStatus pa_AudioDeviceGetProperty( + AudioDeviceID inDevice, + UInt32 inChannel, + Boolean isInput, + AudioDevicePropertyID inPropertyID, + UInt32* ioPropertyDataSize, + void* outPropertyData); +OSStatus pa_AudioDeviceSetProperty( + AudioDeviceID inDevice, + const AudioTimeStamp* inWhen, + UInt32 inChannel, + Boolean isInput, + AudioDevicePropertyID inPropertyID, + UInt32 inPropertyDataSize, + const void* inPropertyData); +OSStatus pa_AudioDeviceGetPropertySize( + AudioDeviceID inDevice, + UInt32 inChannel, + Boolean isInput, + AudioDevicePropertyID inPropertyID, + UInt32* outSize); +OSStatus pa_AudioDeviceAddPropertyListener( + AudioDeviceID inDevice, + UInt32 inChannel, + Boolean isInput, + AudioDevicePropertyID inPropertyID, + pa_AudioDevicePropertyListenerProc inProc, + void* inClientData); +OSStatus pa_AudioDeviceRemovePropertyListener( + AudioDeviceID inDevice, + UInt32 inChannel, + Boolean isInput, + AudioDevicePropertyID inPropertyID, + pa_AudioDevicePropertyListenerProc inProc, + void* inClientData); +OSStatus pa_AudioStreamGetProperty( + AudioStreamID inStream, + UInt32 inChannel, + AudioDevicePropertyID inPropertyID, + UInt32* ioPropertyDataSize, + void* outPropertyData); #define UNIX_ERR(err) PaMacCore_SetUnixError( err, __LINE__ ) @@ -143,12 +200,20 @@ long computeRingBufferSize( const PaStreamParameters *inputParameters, long outputFramesPerBuffer, double sampleRate ); +#if PA_NEW_HAL +OSStatus propertyProc( + AudioObjectID inObjectID, + UInt32 inNumberAddresses, + const AudioObjectPropertyAddress* inAddresses, + void* inClientData); +#else OSStatus propertyProc( AudioDeviceID inDevice, UInt32 inChannel, Boolean isInput, AudioDevicePropertyID inPropertyID, void* inClientData ); +#endif /* sets the value of the given property and waits for the change to be acknowledged, and returns the final value, which is not guaranteed @@ -198,12 +263,20 @@ PaError setBestFramesPerBuffer( const AudioDeviceID device, * *********************/ +#if PA_NEW_HAL +OSStatus xrunCallback( + AudioObjectID inObjectID, + UInt32 inNumberAddresses, + const AudioObjectPropertyAddress* inAddresses, + void * inClientData ); +#else OSStatus xrunCallback( AudioDeviceID inDevice, UInt32 inChannel, Boolean isInput, AudioDevicePropertyID inPropertyID, void* inClientData ) ; +#endif /** returns zero on success or a unix style error code. */ int initializeXRunListenerList( void ); From 992e84387fddc202dd8d3940c8cfc8584c064660 Mon Sep 17 00:00:00 2001 From: John Melas Date: Fri, 27 Nov 2020 09:05:47 +0200 Subject: [PATCH 077/164] fix compile error --- src/hostapi/coreaudio/pa_mac_core_utilities.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/hostapi/coreaudio/pa_mac_core_utilities.c b/src/hostapi/coreaudio/pa_mac_core_utilities.c index 4563a93..2e85907 100644 --- a/src/hostapi/coreaudio/pa_mac_core_utilities.c +++ b/src/hostapi/coreaudio/pa_mac_core_utilities.c @@ -72,7 +72,7 @@ OSStatus pa_AudioHardwareGetProperty( AudioObjectPropertyAddress address = { inPropertyID, kAudioObjectPropertyScopeGlobal, kAudioObjectPropertyElementMaster }; return AudioObjectGetPropertyData(kAudioObjectSystemObject, &address, 0, NULL, ioPropertyDataSize, outPropertyData); #else - macErr = AudioHardwareGetProperty(inPropertyID, ioPropertyDataSize, outPropertyData); + return AudioHardwareGetProperty(inPropertyID, ioPropertyDataSize, outPropertyData); #endif } @@ -84,7 +84,7 @@ OSStatus pa_AudioHardwareGetPropertySize( AudioObjectPropertyAddress address = { inPropertyID, kAudioObjectPropertyScopeGlobal, kAudioObjectPropertyElementMaster }; return AudioObjectGetPropertyDataSize(kAudioObjectSystemObject, &address, 0, NULL, outSize); #else - macErr = AudioHardwareGetPropertyInfo(inPropertyID, outSize, NULL); + return AudioHardwareGetPropertyInfo(inPropertyID, outSize, NULL); #endif } @@ -101,7 +101,7 @@ OSStatus pa_AudioDeviceGetProperty( AudioObjectPropertyAddress address = { inPropertyID, scope, inChannel }; return AudioObjectGetPropertyData(inDevice, &address, 0, NULL, ioPropertyDataSize, outPropertyData); #else - macErr = AudioDeviceGetProperty(inDevice, inChannel, isInput, inPropertyID, ioPropertyDataSize, outPropertyData); + return AudioDeviceGetProperty(inDevice, inChannel, isInput, inPropertyID, ioPropertyDataSize, outPropertyData); #endif } From f4ca4385995edc83ff59404332342d918b540d77 Mon Sep 17 00:00:00 2001 From: John Melas Date: Fri, 27 Nov 2020 09:09:00 +0200 Subject: [PATCH 078/164] formatting and #ifdef comment --- src/hostapi/coreaudio/pa_mac_core.c | 11 +++++----- src/hostapi/coreaudio/pa_mac_core_utilities.c | 20 +++++++++---------- src/hostapi/coreaudio/pa_mac_core_utilities.h | 13 +++++++++--- 3 files changed, 26 insertions(+), 18 deletions(-) diff --git a/src/hostapi/coreaudio/pa_mac_core.c b/src/hostapi/coreaudio/pa_mac_core.c index 155c6ba..21bd788 100644 --- a/src/hostapi/coreaudio/pa_mac_core.c +++ b/src/hostapi/coreaudio/pa_mac_core.c @@ -1083,7 +1083,8 @@ static OSStatus AudioDevicePropertyActualSampleRateListenerProc( AudioDeviceID i } return osErr; } -#endif +#endif /* PA_NEW_HAL */ + /* ================================================================================= */ static OSStatus QueryUInt32DeviceProperty( AudioDeviceID deviceID, Boolean isInput, AudioDevicePropertyID propertyID, UInt32 *outValue ) { @@ -1169,7 +1170,7 @@ static OSStatus AudioDevicePropertyGenericListenerProc( AudioDeviceID inDevice, } return osErr; } -#endif +#endif /* PA_NEW_HAL */ /* ================================================================================= */ /* @@ -2244,7 +2245,7 @@ static OSStatus ringBufferIOProc( AudioConverterRef inAudioConverter, return noErr; } -#endif +#endif /* PA_NEW_HAL */ /* * Called by the AudioUnit API to process audio from the sound card. @@ -2486,7 +2487,7 @@ static OSStatus AudioIOProc( void *inRefCon, &stream->inputRingBuffer, &size, (void *)&data ); -#endif +#endif /* PA_NEW_HAL */ if( err == RING_BUFFER_EMPTY ) { /* the ring buffer callback underflowed */ err = 0; @@ -2686,7 +2687,7 @@ static OSStatus AudioIOProc( void *inRefCon, &stream->inputRingBuffer, &size, (void *)data ); -#endif +#endif /* PA_NEW_HAL */ if( err != RING_BUFFER_EMPTY ) ERR( err ); if( err != noErr && err != RING_BUFFER_EMPTY ) diff --git a/src/hostapi/coreaudio/pa_mac_core_utilities.c b/src/hostapi/coreaudio/pa_mac_core_utilities.c index 2e85907..711d5ca 100644 --- a/src/hostapi/coreaudio/pa_mac_core_utilities.c +++ b/src/hostapi/coreaudio/pa_mac_core_utilities.c @@ -73,7 +73,7 @@ OSStatus pa_AudioHardwareGetProperty( return AudioObjectGetPropertyData(kAudioObjectSystemObject, &address, 0, NULL, ioPropertyDataSize, outPropertyData); #else return AudioHardwareGetProperty(inPropertyID, ioPropertyDataSize, outPropertyData); -#endif +#endif /* PA_NEW_HAL */ } OSStatus pa_AudioHardwareGetPropertySize( @@ -85,7 +85,7 @@ OSStatus pa_AudioHardwareGetPropertySize( return AudioObjectGetPropertyDataSize(kAudioObjectSystemObject, &address, 0, NULL, outSize); #else return AudioHardwareGetPropertyInfo(inPropertyID, outSize, NULL); -#endif +#endif /* PA_NEW_HAL */ } OSStatus pa_AudioDeviceGetProperty( @@ -102,7 +102,7 @@ OSStatus pa_AudioDeviceGetProperty( return AudioObjectGetPropertyData(inDevice, &address, 0, NULL, ioPropertyDataSize, outPropertyData); #else return AudioDeviceGetProperty(inDevice, inChannel, isInput, inPropertyID, ioPropertyDataSize, outPropertyData); -#endif +#endif /* PA_NEW_HAL */ } OSStatus pa_AudioDeviceSetProperty( @@ -120,7 +120,7 @@ OSStatus pa_AudioDeviceSetProperty( return AudioObjectSetPropertyData(inDevice, &address, 0, NULL, inPropertyDataSize, inPropertyData); #else return AudioDeviceSetProperty(inDevice, inWhen, inChannel, isInput, inPropertyID, inPropertyDataSize, inPropertyData); -#endif +#endif /* PA_NEW_HAL */ } OSStatus pa_AudioDeviceGetPropertySize( @@ -136,7 +136,7 @@ OSStatus pa_AudioDeviceGetPropertySize( return AudioObjectGetPropertyDataSize(inDevice, &address, 0, NULL, outSize); #else return AudioDeviceGetPropertyInfo(inDevice, inChannel, isInput, inPropertyID, outSize, NULL); -#endif +#endif /* PA_NEW_HAL */ } OSStatus pa_AudioDeviceAddPropertyListener( @@ -153,7 +153,7 @@ OSStatus pa_AudioDeviceAddPropertyListener( return AudioObjectAddPropertyListener(inDevice, &address, inProc, inClientData); #else return AudioDeviceAddPropertyListener(inDevice, inChannel, isInput, inPropertyID, inProc, inClientData); -#endif +#endif /* PA_NEW_HAL */ } OSStatus pa_AudioDeviceRemovePropertyListener( @@ -170,7 +170,7 @@ OSStatus pa_AudioDeviceRemovePropertyListener( return AudioObjectRemovePropertyListener(inDevice, &address, inProc, inClientData); #else return AudioDeviceRemovePropertyListener(inDevice, inChannel, isInput, inPropertyID, inProc); -#endif +#endif /* PA_NEW_HAL */ } OSStatus pa_AudioStreamGetProperty( @@ -185,7 +185,7 @@ OSStatus pa_AudioStreamGetProperty( return AudioObjectGetPropertyData(inStream, &address, 0, NULL, ioPropertyDataSize, outPropertyData); #else return AudioStreamGetProperty(inStream, inChannel, inPropertyID, ioPropertyDataSize, outPropertyData); -#endif +#endif /* PA_NEW_HAL */ } PaError PaMacCore_SetUnixError( int err, int line ) @@ -455,7 +455,7 @@ OSStatus propertyProc( // this is where we would set the condition variable return noErr; } -#endif +#endif /* PA_NEW_HAL */ /* sets the value of the given property and waits for the change to be acknowledged, and returns the final value, which is not guaranteed @@ -815,7 +815,7 @@ OSStatus xrunCallback( return 0; } -#endif +#endif /* PA_NEW_HAL */ int initializeXRunListenerList( void ) { diff --git a/src/hostapi/coreaudio/pa_mac_core_utilities.h b/src/hostapi/coreaudio/pa_mac_core_utilities.h index e6e0c6e..8888a36 100644 --- a/src/hostapi/coreaudio/pa_mac_core_utilities.h +++ b/src/hostapi/coreaudio/pa_mac_core_utilities.h @@ -121,15 +121,17 @@ typedef AudioObjectPropertyListenerProc pa_AudioDevicePropertyListenerProc; #else typedef AudioDevicePropertyListenerProc pa_AudioDevicePropertyListenerProc; -#endif +#endif /* PA_NEW_HAL */ OSStatus pa_AudioHardwareGetProperty( AudioHardwarePropertyID inPropertyID, UInt32* ioPropertyDataSize, void* outPropertyData); + OSStatus pa_AudioHardwareGetPropertySize( AudioHardwarePropertyID inPropertyID, UInt32* outSize); + OSStatus pa_AudioDeviceGetProperty( AudioDeviceID inDevice, UInt32 inChannel, @@ -137,6 +139,7 @@ OSStatus pa_AudioDeviceGetProperty( AudioDevicePropertyID inPropertyID, UInt32* ioPropertyDataSize, void* outPropertyData); + OSStatus pa_AudioDeviceSetProperty( AudioDeviceID inDevice, const AudioTimeStamp* inWhen, @@ -145,12 +148,14 @@ OSStatus pa_AudioDeviceSetProperty( AudioDevicePropertyID inPropertyID, UInt32 inPropertyDataSize, const void* inPropertyData); + OSStatus pa_AudioDeviceGetPropertySize( AudioDeviceID inDevice, UInt32 inChannel, Boolean isInput, AudioDevicePropertyID inPropertyID, UInt32* outSize); + OSStatus pa_AudioDeviceAddPropertyListener( AudioDeviceID inDevice, UInt32 inChannel, @@ -158,6 +163,7 @@ OSStatus pa_AudioDeviceAddPropertyListener( AudioDevicePropertyID inPropertyID, pa_AudioDevicePropertyListenerProc inProc, void* inClientData); + OSStatus pa_AudioDeviceRemovePropertyListener( AudioDeviceID inDevice, UInt32 inChannel, @@ -165,6 +171,7 @@ OSStatus pa_AudioDeviceRemovePropertyListener( AudioDevicePropertyID inPropertyID, pa_AudioDevicePropertyListenerProc inProc, void* inClientData); + OSStatus pa_AudioStreamGetProperty( AudioStreamID inStream, UInt32 inChannel, @@ -213,7 +220,7 @@ OSStatus propertyProc( Boolean isInput, AudioDevicePropertyID inPropertyID, void* inClientData ); -#endif +#endif /* PA_NEW_HAL */ /* sets the value of the given property and waits for the change to be acknowledged, and returns the final value, which is not guaranteed @@ -276,7 +283,7 @@ OSStatus xrunCallback( Boolean isInput, AudioDevicePropertyID inPropertyID, void* inClientData ) ; -#endif +#endif /* PA_NEW_HAL */ /** returns zero on success or a unix style error code. */ int initializeXRunListenerList( void ); From 1d3a239fd081263721e9c3997b8e007f7a1c4127 Mon Sep 17 00:00:00 2001 From: John Melas Date: Wed, 16 Dec 2020 12:45:30 +0200 Subject: [PATCH 079/164] remove support for OS X 10.4, rename functions pa_ -> PaMacCore_ --- src/hostapi/coreaudio/pa_mac_core.c | 201 +++++------------- src/hostapi/coreaudio/pa_mac_core_utilities.c | 158 +++----------- src/hostapi/coreaudio/pa_mac_core_utilities.h | 70 ++---- 3 files changed, 103 insertions(+), 326 deletions(-) diff --git a/src/hostapi/coreaudio/pa_mac_core.c b/src/hostapi/coreaudio/pa_mac_core.c index 21bd788..24883a8 100644 --- a/src/hostapi/coreaudio/pa_mac_core.c +++ b/src/hostapi/coreaudio/pa_mac_core.c @@ -138,7 +138,7 @@ const char *PaMacCore_GetChannelName( int device, int channelIndex, bool input ) /* First try with CFString */ UInt32 size = sizeof(nameRef); - error = pa_AudioDeviceGetProperty( hostApiDevice, + error = PaMacCore_AudioDeviceGetProperty( hostApiDevice, channelIndex + 1, input, kAudioDevicePropertyChannelNameCFString, @@ -148,7 +148,7 @@ const char *PaMacCore_GetChannelName( int device, int channelIndex, bool input ) { /* try the C String */ size = 0; - error = pa_AudioDeviceGetPropertySize( hostApiDevice, + error = PaMacCore_AudioDeviceGetPropertySize( hostApiDevice, channelIndex + 1, input, kAudioDevicePropertyChannelName, @@ -158,7 +158,7 @@ const char *PaMacCore_GetChannelName( int device, int channelIndex, bool input ) if( !ensureChannelNameSize( size ) ) return NULL; - error = pa_AudioDeviceGetProperty( hostApiDevice, + error = PaMacCore_AudioDeviceGetProperty( hostApiDevice, channelIndex + 1, input, kAudioDevicePropertyChannelName, @@ -223,7 +223,7 @@ PaError PaMacCore_GetBufferSizeRange( PaDeviceIndex device, if( macCoreHostApi->inheritedHostApiRep.deviceInfos[hostApiDeviceIndex]->maxOutputChannels == 0 ) isInput = 1; - result = WARNING(pa_AudioDeviceGetProperty( macCoreDeviceId, 0, isInput, kAudioDevicePropertyBufferFrameSizeRange, &propSize, &audioRange ) ); + result = WARNING(PaMacCore_AudioDeviceGetProperty( macCoreDeviceId, 0, isInput, kAudioDevicePropertyBufferFrameSizeRange, &propSize, &audioRange ) ); *minBufferSizeFrames = audioRange.mMinimum; *maxBufferSizeFrames = audioRange.mMaximum; @@ -352,7 +352,7 @@ static PaError gatherDeviceInfo(PaMacAUHAL *auhalHostApi) auhalHostApi->devIds = NULL; /* -- figure out how many devices there are -- */ - pa_AudioHardwareGetPropertySize( kAudioHardwarePropertyDevices, + PaMacCore_AudioHardwareGetPropertySize( kAudioHardwarePropertyDevices, &propsize); auhalHostApi->devCount = propsize / sizeof( AudioDeviceID ); @@ -364,7 +364,7 @@ static PaError gatherDeviceInfo(PaMacAUHAL *auhalHostApi) propsize ); if( !auhalHostApi->devIds ) return paInsufficientMemory; - pa_AudioHardwareGetProperty( kAudioHardwarePropertyDevices, + PaMacCore_AudioHardwareGetProperty( kAudioHardwarePropertyDevices, &propsize, auhalHostApi->devIds ); #ifdef MAC_CORE_VERBOSE_DEBUG @@ -383,7 +383,7 @@ static PaError gatherDeviceInfo(PaMacAUHAL *auhalHostApi) /* I am not sure how these calls to AudioHardwareGetProperty() could fail, but in case they do, we use the first available device as the default. */ - if( 0 != pa_AudioHardwareGetProperty(kAudioHardwarePropertyDefaultInputDevice, + if( 0 != PaMacCore_AudioHardwareGetProperty(kAudioHardwarePropertyDefaultInputDevice, &size, &auhalHostApi->defaultIn) ) { int i; @@ -400,7 +400,7 @@ static PaError gatherDeviceInfo(PaMacAUHAL *auhalHostApi) } } } - if( 0 != pa_AudioHardwareGetProperty(kAudioHardwarePropertyDefaultOutputDevice, + if( 0 != PaMacCore_AudioHardwareGetProperty(kAudioHardwarePropertyDefaultOutputDevice, &size, &auhalHostApi->defaultOut) ) { int i; @@ -435,7 +435,7 @@ static PaError ClipToDeviceBufferSize( AudioDeviceID macCoreDeviceId, UInt32 resultSize = desiredSize; AudioValueRange audioRange; UInt32 propSize = sizeof( audioRange ); - PaError err = WARNING(pa_AudioDeviceGetProperty( macCoreDeviceId, 0, isInput, kAudioDevicePropertyBufferFrameSizeRange, &propSize, &audioRange ) ); + PaError err = WARNING(PaMacCore_AudioDeviceGetProperty( macCoreDeviceId, 0, isInput, kAudioDevicePropertyBufferFrameSizeRange, &propSize, &audioRange ) ); resultSize = MAX( resultSize, audioRange.mMinimum ); resultSize = MIN( resultSize, audioRange.mMaximum ); *allowedSize = resultSize; @@ -485,7 +485,7 @@ static void DumpDeviceProperties( AudioDeviceID macCoreDeviceId, printf("Stream #%d = %d---------------------- \n", i, streamIDs[i] ); propSize = sizeof(UInt32); - err = WARNING(p_AudioStreamGetProperty(streamIDs[i], 0, kAudioStreamPropertyLatency, &propSize, &streamLatency)); + err = WARNING(PaMacCore_AudioStreamGetProperty(streamIDs[i], 0, kAudioStreamPropertyLatency, &propSize, &streamLatency)); printf(" kAudioStreamPropertyLatency: err = %d, propSize = %d, value = %d\n", err, propSize, streamLatency ); } } @@ -515,20 +515,20 @@ static PaError CalculateFixedDeviceLatency( AudioDeviceID macCoreDeviceId, int i // To get stream latency we have to get a streamID from the device. // We are only going to look at the first stream so only fetch one stream. propSize = sizeof(streamIDs); - err = WARNING(pa_AudioDeviceGetProperty(macCoreDeviceId, 0, isInput, kAudioDevicePropertyStreams, &propSize, &streamIDs[0])); + err = WARNING(PaMacCore_AudioDeviceGetProperty(macCoreDeviceId, 0, isInput, kAudioDevicePropertyStreams, &propSize, &streamIDs[0])); if( err != paNoError ) goto error; if( propSize == sizeof(AudioStreamID) ) { propSize = sizeof(UInt32); - err = WARNING(pa_AudioStreamGetProperty(streamIDs[0], 0, kAudioStreamPropertyLatency, &propSize, &streamLatency)); + err = WARNING(PaMacCore_AudioStreamGetProperty(streamIDs[0], 0, kAudioStreamPropertyLatency, &propSize, &streamLatency)); } propSize = sizeof(UInt32); - err = WARNING(pa_AudioDeviceGetProperty(macCoreDeviceId, 0, isInput, kAudioDevicePropertySafetyOffset, &propSize, &safetyOffset)); + err = WARNING(PaMacCore_AudioDeviceGetProperty(macCoreDeviceId, 0, isInput, kAudioDevicePropertySafetyOffset, &propSize, &safetyOffset)); if( err != paNoError ) goto error; propSize = sizeof(UInt32); - err = WARNING(pa_AudioDeviceGetProperty(macCoreDeviceId, 0, isInput, kAudioDevicePropertyLatency, &propSize, &deviceLatency)); + err = WARNING(PaMacCore_AudioDeviceGetProperty(macCoreDeviceId, 0, isInput, kAudioDevicePropertyLatency, &propSize, &deviceLatency)); if( err != paNoError ) goto error; *fixedLatencyPtr = deviceLatency + streamLatency + safetyOffset; @@ -558,7 +558,7 @@ static PaError CalculateDefaultDeviceLatencies( AudioDeviceID macCoreDeviceId, // For high latency use the default device buffer size. propSize = sizeof(UInt32); - err = WARNING(pa_AudioDeviceGetProperty(macCoreDeviceId, 0, isInput, kAudioDevicePropertyBufferFrameSize, &propSize, &bufferFrames)); + err = WARNING(PaMacCore_AudioDeviceGetProperty(macCoreDeviceId, 0, isInput, kAudioDevicePropertyBufferFrameSize, &propSize, &bufferFrames)); if( err != paNoError ) goto error; *lowLatencyFramesPtr = fixedLatency + clippedMinBufferSize; @@ -587,14 +587,14 @@ static PaError GetChannelInfo( PaMacAUHAL *auhalHostApi, /* Get the number of channels from the stream configuration. Fail if we can't get this. */ - err = ERR(pa_AudioDeviceGetPropertySize(macCoreDeviceId, 0, isInput, kAudioDevicePropertyStreamConfiguration, &propSize)); + err = ERR(PaMacCore_AudioDeviceGetPropertySize(macCoreDeviceId, 0, isInput, kAudioDevicePropertyStreamConfiguration, &propSize)); if (err) return err; buflist = PaUtil_AllocateMemory(propSize); if( !buflist ) return paInsufficientMemory; - err = ERR(pa_AudioDeviceGetProperty(macCoreDeviceId, 0, isInput, kAudioDevicePropertyStreamConfiguration, &propSize, buflist)); + err = ERR(PaMacCore_AudioDeviceGetProperty(macCoreDeviceId, 0, isInput, kAudioDevicePropertyStreamConfiguration, &propSize, buflist)); if (err) goto error; @@ -662,18 +662,18 @@ static PaError InitializeDeviceInfo( PaMacAUHAL *auhalHostApi, /* Get the device name using CFString */ propSize = sizeof(nameRef); - err = ERR(pa_AudioDeviceGetProperty(macCoreDeviceId, 0, 0, kAudioDevicePropertyDeviceNameCFString, &propSize, &nameRef)); + err = ERR(PaMacCore_AudioDeviceGetProperty(macCoreDeviceId, 0, 0, kAudioDevicePropertyDeviceNameCFString, &propSize, &nameRef)); if (err) { /* Get the device name using c string. Fail if we can't get it. */ - err = ERR(pa_AudioDeviceGetPropertySize(macCoreDeviceId, 0, 0, kAudioDevicePropertyDeviceName, &propSize)); + err = ERR(PaMacCore_AudioDeviceGetPropertySize(macCoreDeviceId, 0, 0, kAudioDevicePropertyDeviceName, &propSize)); if (err) return err; name = PaUtil_GroupAllocateMemory(auhalHostApi->allocations,propSize+1); if ( !name ) return paInsufficientMemory; - err = ERR(pa_AudioDeviceGetProperty(macCoreDeviceId, 0, 0, kAudioDevicePropertyDeviceName, &propSize, name)); + err = ERR(PaMacCore_AudioDeviceGetProperty(macCoreDeviceId, 0, 0, kAudioDevicePropertyDeviceName, &propSize, name)); if (err) return err; } @@ -694,7 +694,7 @@ static PaError InitializeDeviceInfo( PaMacAUHAL *auhalHostApi, /* Try to get the default sample rate. Don't fail if we can't get this. */ propSize = sizeof(Float64); - err = ERR(pa_AudioDeviceGetProperty(macCoreDeviceId, 0, 0, kAudioDevicePropertyNominalSampleRate, &propSize, &sampleRate)); + err = ERR(PaMacCore_AudioDeviceGetProperty(macCoreDeviceId, 0, 0, kAudioDevicePropertyNominalSampleRate, &propSize, &sampleRate)); if (err) deviceInfo->defaultSampleRate = 0.0; else @@ -1043,7 +1043,7 @@ static OSStatus UpdateSampleRateFromDeviceProperty( PaMacCoreStream *stream, Aud Float64 sampleRate = 0.0; UInt32 propSize = sizeof(Float64); - OSStatus osErr = pa_AudioDeviceGetProperty( deviceID, 0, isInput, sampleRatePropertyID, &propSize, &sampleRate); + OSStatus osErr = PaMacCore_AudioDeviceGetProperty( deviceID, 0, isInput, sampleRatePropertyID, &propSize, &sampleRate); if( (osErr == noErr) && (sampleRate > 1000.0) ) /* avoid divide by zero if there's an error */ { deviceProperties->sampleRate = sampleRate; @@ -1052,45 +1052,28 @@ static OSStatus UpdateSampleRateFromDeviceProperty( PaMacCoreStream *stream, Aud return osErr; } -#if PA_NEW_HAL static OSStatus AudioDevicePropertyActualSampleRateListenerProc(AudioObjectID inDevice, UInt32 inNumberAddresses, const AudioObjectPropertyAddress * inAddresses, void * inClientData) { - PaMacCoreStream * stream = (PaMacCoreStream *) inClientData; + PaMacCoreStream *stream = (PaMacCoreStream*)inClientData; bool isInput = inAddresses->mScope == kAudioDevicePropertyScopeInput; - // Make sure the callback is operating on a stream that is still valid! - assert(stream->streamRepresentation.magic == PA_STREAM_MAGIC); - - OSStatus osErr = UpdateSampleRateFromDeviceProperty(stream, inDevice, isInput, kAudioDevicePropertyActualSampleRate); - if (osErr == noErr) - { - UpdateTimeStampOffsets(stream); - } - return osErr; -} -#else -static OSStatus AudioDevicePropertyActualSampleRateListenerProc( AudioDeviceID inDevice, UInt32 inChannel, Boolean isInput, AudioDevicePropertyID inPropertyID, void *inClientData ) -{ - PaMacCoreStream *stream = (PaMacCoreStream*)inClientData; - // Make sure the callback is operating on a stream that is still valid! assert( stream->streamRepresentation.magic == PA_STREAM_MAGIC ); - OSStatus osErr = UpdateSampleRateFromDeviceProperty( stream, inDevice, isInput, kAudioDevicePropertyActualSampleRate ); + OSStatus osErr = UpdateSampleRateFromDeviceProperty( stream, inDevice, isInput, kAudioDevicePropertyActualSampleRate ); if( osErr == noErr ) { UpdateTimeStampOffsets( stream ); } return osErr; } -#endif /* PA_NEW_HAL */ /* ================================================================================= */ static OSStatus QueryUInt32DeviceProperty( AudioDeviceID deviceID, Boolean isInput, AudioDevicePropertyID propertyID, UInt32 *outValue ) { UInt32 propertyValue = 0; UInt32 propertySize = sizeof(UInt32); - OSStatus osErr = pa_AudioDeviceGetProperty( deviceID, 0, isInput, propertyID, &propertySize, &propertyValue); + OSStatus osErr = PaMacCore_AudioDeviceGetProperty( deviceID, 0, isInput, propertyID, &propertySize, &propertyValue); if( osErr == noErr ) { *outValue = propertyValue; @@ -1098,49 +1081,13 @@ static OSStatus QueryUInt32DeviceProperty( AudioDeviceID deviceID, Boolean isInp return osErr; } -#if PA_NEW_HAL static OSStatus AudioDevicePropertyGenericListenerProc(AudioObjectID inDevice, UInt32 inNumberAddresses, const AudioObjectPropertyAddress * inAddresses, void * inClientData) { OSStatus osErr = noErr; - PaMacCoreStream * stream = (PaMacCoreStream *) inClientData; + PaMacCoreStream *stream = (PaMacCoreStream*)inClientData; bool isInput = inAddresses->mScope == kAudioDevicePropertyScopeInput; AudioDevicePropertyID inPropertyID = inAddresses->mSelector; - // Make sure the callback is operating on a stream that is still valid! - assert(stream->streamRepresentation.magic == PA_STREAM_MAGIC); - - PaMacCoreDeviceProperties * deviceProperties = isInput ? &stream->inputProperties : &stream->outputProperties; - UInt32 * valuePtr = NULL; - switch (inPropertyID) - { - case kAudioDevicePropertySafetyOffset: - valuePtr = &deviceProperties->safetyOffset; - break; - - case kAudioDevicePropertyLatency: - valuePtr = &deviceProperties->deviceLatency; - break; - - case kAudioDevicePropertyBufferFrameSize: - valuePtr = &deviceProperties->bufferFrameSize; - break; - } - if (valuePtr != NULL) - { - osErr = QueryUInt32DeviceProperty(inDevice, isInput, inPropertyID, valuePtr); - if (osErr == noErr) - { - UpdateTimeStampOffsets(stream); - } - } - return osErr; -} -#else -static OSStatus AudioDevicePropertyGenericListenerProc( AudioDeviceID inDevice, UInt32 inChannel, Boolean isInput, AudioDevicePropertyID inPropertyID, void *inClientData ) -{ - OSStatus osErr = noErr; - PaMacCoreStream *stream = (PaMacCoreStream*)inClientData; - // Make sure the callback is operating on a stream that is still valid! assert( stream->streamRepresentation.magic == PA_STREAM_MAGIC ); @@ -1170,7 +1117,6 @@ static OSStatus AudioDevicePropertyGenericListenerProc( AudioDeviceID inDevice, } return osErr; } -#endif /* PA_NEW_HAL */ /* ================================================================================= */ /* @@ -1187,14 +1133,14 @@ static OSStatus SetupDevicePropertyListeners( PaMacCoreStream *stream, AudioDevi if( (osErr = QueryUInt32DeviceProperty( deviceID, isInput, kAudioDevicePropertySafetyOffset, &deviceProperties->safetyOffset )) != noErr ) return osErr; - pa_AudioDeviceAddPropertyListener( deviceID, 0, isInput, kAudioDevicePropertyActualSampleRate, + PaMacCore_AudioDeviceAddPropertyListener( deviceID, 0, isInput, kAudioDevicePropertyActualSampleRate, AudioDevicePropertyActualSampleRateListenerProc, stream ); - pa_AudioDeviceAddPropertyListener( deviceID, 0, isInput, kAudioStreamPropertyLatency, + PaMacCore_AudioDeviceAddPropertyListener( deviceID, 0, isInput, kAudioStreamPropertyLatency, AudioDevicePropertyGenericListenerProc, stream ); - pa_AudioDeviceAddPropertyListener( deviceID, 0, isInput, kAudioDevicePropertyBufferFrameSize, + PaMacCore_AudioDeviceAddPropertyListener( deviceID, 0, isInput, kAudioDevicePropertyBufferFrameSize, AudioDevicePropertyGenericListenerProc, stream ); - pa_AudioDeviceAddPropertyListener( deviceID, 0, isInput, kAudioDevicePropertySafetyOffset, + PaMacCore_AudioDeviceAddPropertyListener( deviceID, 0, isInput, kAudioDevicePropertySafetyOffset, AudioDevicePropertyGenericListenerProc, stream ); return osErr; @@ -1202,14 +1148,14 @@ static OSStatus SetupDevicePropertyListeners( PaMacCoreStream *stream, AudioDevi static void CleanupDevicePropertyListeners( PaMacCoreStream *stream, AudioDeviceID deviceID, Boolean isInput ) { - pa_AudioDeviceRemovePropertyListener( deviceID, 0, isInput, kAudioDevicePropertyActualSampleRate, + PaMacCore_AudioDeviceRemovePropertyListener( deviceID, 0, isInput, kAudioDevicePropertyActualSampleRate, AudioDevicePropertyActualSampleRateListenerProc, stream ); - pa_AudioDeviceRemovePropertyListener( deviceID, 0, isInput, kAudioDevicePropertyLatency, + PaMacCore_AudioDeviceRemovePropertyListener( deviceID, 0, isInput, kAudioDevicePropertyLatency, AudioDevicePropertyGenericListenerProc, stream ); - pa_AudioDeviceRemovePropertyListener( deviceID, 0, isInput, kAudioDevicePropertyBufferFrameSize, + PaMacCore_AudioDeviceRemovePropertyListener( deviceID, 0, isInput, kAudioDevicePropertyBufferFrameSize, AudioDevicePropertyGenericListenerProc, stream ); - pa_AudioDeviceRemovePropertyListener( deviceID, 0, isInput, kAudioDevicePropertySafetyOffset, + PaMacCore_AudioDeviceRemovePropertyListener( deviceID, 0, isInput, kAudioDevicePropertySafetyOffset, AudioDevicePropertyGenericListenerProc, stream ); } @@ -1384,7 +1330,7 @@ static PaError OpenAndSetupOneAudioUnit( sizeof(AudioDeviceID) ) ); } /* -- add listener for dropouts -- */ - result = pa_AudioDeviceAddPropertyListener( *audioDevice, + result = PaMacCore_AudioDeviceAddPropertyListener( *audioDevice, 0, outStreamParams ? false : true, kAudioDeviceProcessorOverload, @@ -2183,7 +2129,6 @@ PaTime GetStreamTime( PaStream *s ) #define RING_BUFFER_EMPTY (1000) -#if PA_NEW_HAL static OSStatus ringBufferIOProc( AudioConverterRef inAudioConverter, UInt32* ioNumberDataPackets, @@ -2200,34 +2145,6 @@ static OSStatus ringBufferIOProc( VVDBUG(("ringBufferIOProc()\n")); - if( PaUtil_GetRingBufferReadAvailable( rb ) == 0 ) { - *outData = NULL; - *ioDataSize = 0; - return RING_BUFFER_EMPTY; - } - assert(sizeof(UInt32) == sizeof(ring_buffer_size_t)); - assert( ( (*ioDataSize) / rb->elementSizeBytes ) * rb->elementSizeBytes == (*ioDataSize) ) ; - (*ioDataSize) /= rb->elementSizeBytes ; - PaUtil_GetRingBufferReadRegions( rb, *ioDataSize, - outData, (ring_buffer_size_t *)ioDataSize, - &dummyData, &dummySize ); - assert( *ioDataSize ); - PaUtil_AdvanceRingBufferReadIndex( rb, *ioDataSize ); - (*ioDataSize) *= rb->elementSizeBytes ; - return noErr; -} -#else -static OSStatus ringBufferIOProc( AudioConverterRef inAudioConverter, - UInt32*ioDataSize, - void** outData, - void*inUserData ) -{ - void *dummyData; - ring_buffer_size_t dummySize; - PaUtilRingBuffer *rb = (PaUtilRingBuffer *) inUserData; - - VVDBUG(("ringBufferIOProc()\n")); - if( PaUtil_GetRingBufferReadAvailable( rb ) == 0 ) { *outData = NULL; *ioDataSize = 0; @@ -2245,7 +2162,6 @@ static OSStatus ringBufferIOProc( AudioConverterRef inAudioConverter, return noErr; } -#endif /* PA_NEW_HAL */ /* * Called by the AudioUnit API to process audio from the sound card. @@ -2467,7 +2383,6 @@ static OSStatus AudioIOProc( void *inRefCon, UInt32 size; float data[ inChan * frames ]; size = sizeof( data ); -#if PA_NEW_HAL AudioBufferList bufferList; bufferList.mNumberBuffers = 1; bufferList.mBuffers[0].mNumberChannels = inChan; @@ -2480,14 +2395,6 @@ static OSStatus AudioIOProc( void *inRefCon, &size, &bufferList, NULL); -#else - err = AudioConverterFillBuffer( - stream->inputSRConverter, - ringBufferIOProc, - &stream->inputRingBuffer, - &size, - (void *)&data ); -#endif /* PA_NEW_HAL */ if( err == RING_BUFFER_EMPTY ) { /* the ring buffer callback underflowed */ err = 0; @@ -2667,27 +2574,18 @@ static OSStatus AudioIOProc( void *inRefCon, long f; size = sizeof( data ); -#if PA_NEW_HAL - AudioBufferList bufferList; - bufferList.mNumberBuffers = 1; - bufferList.mBuffers[0].mNumberChannels = chan; - bufferList.mBuffers[0].mDataByteSize = size; - bufferList.mBuffers[0].mData = data; - err = AudioConverterFillComplexBuffer( - stream->inputSRConverter, - ringBufferIOProc, - &stream->inputRingBuffer, - &size, - &bufferList, - NULL); -#else - err = AudioConverterFillBuffer( - stream->inputSRConverter, - ringBufferIOProc, - &stream->inputRingBuffer, - &size, - (void *)data ); -#endif /* PA_NEW_HAL */ + AudioBufferList bufferList; + bufferList.mNumberBuffers = 1; + bufferList.mBuffers[0].mNumberChannels = chan; + bufferList.mBuffers[0].mDataByteSize = size; + bufferList.mBuffers[0].mData = data; + err = AudioConverterFillComplexBuffer( + stream->inputSRConverter, + ringBufferIOProc, + &stream->inputRingBuffer, + &size, + &bufferList, + NULL); if( err != RING_BUFFER_EMPTY ) ERR( err ); if( err != noErr && err != RING_BUFFER_EMPTY ) @@ -2695,7 +2593,6 @@ static OSStatus AudioIOProc( void *inRefCon, goto stop_stream; } - f = size / ( chan * sizeof(float) ); PaUtil_SetInputFrameCount( &(stream->bufferProcessor), f ); if( f ) @@ -2766,7 +2663,7 @@ static PaError CloseStream( PaStream* s ) if( stream->outputUnit ) { int count = removeFromXRunListenerList( stream ); if( count == 0 ) - pa_AudioDeviceRemovePropertyListener( stream->outputDevice, + PaMacCore_AudioDeviceRemovePropertyListener( stream->outputDevice, 0, false, kAudioDeviceProcessorOverload, @@ -2775,7 +2672,7 @@ static PaError CloseStream( PaStream* s ) if( stream->inputUnit && stream->outputUnit != stream->inputUnit ) { int count = removeFromXRunListenerList( stream ); if( count == 0 ) - pa_AudioDeviceRemovePropertyListener( stream->inputDevice, + PaMacCore_AudioDeviceRemovePropertyListener( stream->inputDevice, 0, true, kAudioDeviceProcessorOverload, diff --git a/src/hostapi/coreaudio/pa_mac_core_utilities.c b/src/hostapi/coreaudio/pa_mac_core_utilities.c index 711d5ca..5d93706 100644 --- a/src/hostapi/coreaudio/pa_mac_core_utilities.c +++ b/src/hostapi/coreaudio/pa_mac_core_utilities.c @@ -63,32 +63,24 @@ #include #include -OSStatus pa_AudioHardwareGetProperty( +OSStatus PaMacCore_AudioHardwareGetProperty( AudioHardwarePropertyID inPropertyID, UInt32* ioPropertyDataSize, void* outPropertyData) { -#if PA_NEW_HAL AudioObjectPropertyAddress address = { inPropertyID, kAudioObjectPropertyScopeGlobal, kAudioObjectPropertyElementMaster }; return AudioObjectGetPropertyData(kAudioObjectSystemObject, &address, 0, NULL, ioPropertyDataSize, outPropertyData); -#else - return AudioHardwareGetProperty(inPropertyID, ioPropertyDataSize, outPropertyData); -#endif /* PA_NEW_HAL */ } -OSStatus pa_AudioHardwareGetPropertySize( +OSStatus PaMacCore_AudioHardwareGetPropertySize( AudioHardwarePropertyID inPropertyID, UInt32* outSize) { -#if PA_NEW_HAL AudioObjectPropertyAddress address = { inPropertyID, kAudioObjectPropertyScopeGlobal, kAudioObjectPropertyElementMaster }; return AudioObjectGetPropertyDataSize(kAudioObjectSystemObject, &address, 0, NULL, outSize); -#else - return AudioHardwareGetPropertyInfo(inPropertyID, outSize, NULL); -#endif /* PA_NEW_HAL */ } -OSStatus pa_AudioDeviceGetProperty( +OSStatus PaMacCore_AudioDeviceGetProperty( AudioDeviceID inDevice, UInt32 inChannel, Boolean isInput, @@ -96,16 +88,12 @@ OSStatus pa_AudioDeviceGetProperty( UInt32* ioPropertyDataSize, void* outPropertyData) { -#if PA_NEW_HAL AudioObjectPropertyScope scope = isInput ? kAudioDevicePropertyScopeInput : kAudioDevicePropertyScopeOutput; AudioObjectPropertyAddress address = { inPropertyID, scope, inChannel }; return AudioObjectGetPropertyData(inDevice, &address, 0, NULL, ioPropertyDataSize, outPropertyData); -#else - return AudioDeviceGetProperty(inDevice, inChannel, isInput, inPropertyID, ioPropertyDataSize, outPropertyData); -#endif /* PA_NEW_HAL */ } -OSStatus pa_AudioDeviceSetProperty( +OSStatus PaMacCore_AudioDeviceSetProperty( AudioDeviceID inDevice, const AudioTimeStamp* inWhen, UInt32 inChannel, @@ -114,78 +102,58 @@ OSStatus pa_AudioDeviceSetProperty( UInt32 inPropertyDataSize, const void* inPropertyData) { -#if PA_NEW_HAL AudioObjectPropertyScope scope = isInput ? kAudioDevicePropertyScopeInput : kAudioDevicePropertyScopeOutput; AudioObjectPropertyAddress address = { inPropertyID, scope, inChannel }; return AudioObjectSetPropertyData(inDevice, &address, 0, NULL, inPropertyDataSize, inPropertyData); -#else - return AudioDeviceSetProperty(inDevice, inWhen, inChannel, isInput, inPropertyID, inPropertyDataSize, inPropertyData); -#endif /* PA_NEW_HAL */ } -OSStatus pa_AudioDeviceGetPropertySize( +OSStatus PaMacCore_AudioDeviceGetPropertySize( AudioDeviceID inDevice, UInt32 inChannel, Boolean isInput, AudioDevicePropertyID inPropertyID, UInt32* outSize) { -#if PA_NEW_HAL AudioObjectPropertyScope scope = isInput ? kAudioDevicePropertyScopeInput : kAudioDevicePropertyScopeOutput; AudioObjectPropertyAddress address = { inPropertyID, scope, inChannel }; return AudioObjectGetPropertyDataSize(inDevice, &address, 0, NULL, outSize); -#else - return AudioDeviceGetPropertyInfo(inDevice, inChannel, isInput, inPropertyID, outSize, NULL); -#endif /* PA_NEW_HAL */ } -OSStatus pa_AudioDeviceAddPropertyListener( - AudioDeviceID inDevice, - UInt32 inChannel, - Boolean isInput, - AudioDevicePropertyID inPropertyID, - pa_AudioDevicePropertyListenerProc inProc, - void* inClientData) +OSStatus PaMacCore_AudioDeviceAddPropertyListener( + AudioDeviceID inDevice, + UInt32 inChannel, + Boolean isInput, + AudioDevicePropertyID inPropertyID, + AudioObjectPropertyListenerProc inProc, + void* inClientData) { -#if PA_NEW_HAL AudioObjectPropertyScope scope = isInput ? kAudioDevicePropertyScopeInput : kAudioDevicePropertyScopeOutput; AudioObjectPropertyAddress address = { inPropertyID, scope, inChannel }; return AudioObjectAddPropertyListener(inDevice, &address, inProc, inClientData); -#else - return AudioDeviceAddPropertyListener(inDevice, inChannel, isInput, inPropertyID, inProc, inClientData); -#endif /* PA_NEW_HAL */ } -OSStatus pa_AudioDeviceRemovePropertyListener( - AudioDeviceID inDevice, - UInt32 inChannel, - Boolean isInput, - AudioDevicePropertyID inPropertyID, - pa_AudioDevicePropertyListenerProc inProc, - void* inClientData) +OSStatus PaMacCore_AudioDeviceRemovePropertyListener( + AudioDeviceID inDevice, + UInt32 inChannel, + Boolean isInput, + AudioDevicePropertyID inPropertyID, + AudioObjectPropertyListenerProc inProc, + void* inClientData) { -#if PA_NEW_HAL AudioObjectPropertyScope scope = isInput ? kAudioDevicePropertyScopeInput : kAudioDevicePropertyScopeOutput; AudioObjectPropertyAddress address = { inPropertyID, scope, inChannel }; return AudioObjectRemovePropertyListener(inDevice, &address, inProc, inClientData); -#else - return AudioDeviceRemovePropertyListener(inDevice, inChannel, isInput, inPropertyID, inProc); -#endif /* PA_NEW_HAL */ } -OSStatus pa_AudioStreamGetProperty( +OSStatus PaMacCore_AudioStreamGetProperty( AudioStreamID inStream, UInt32 inChannel, AudioDevicePropertyID inPropertyID, UInt32* ioPropertyDataSize, void* outPropertyData) { -#if PA_NEW_HAL AudioObjectPropertyAddress address = { inPropertyID, kAudioObjectPropertyScopeGlobal, kAudioObjectPropertyElementMaster }; return AudioObjectGetPropertyData(inStream, &address, 0, NULL, ioPropertyDataSize, outPropertyData); -#else - return AudioStreamGetProperty(inStream, inChannel, inPropertyID, ioPropertyDataSize, outPropertyData); -#endif /* PA_NEW_HAL */ } PaError PaMacCore_SetUnixError( int err, int line ) @@ -274,14 +242,6 @@ PaError PaMacCore_SetError(OSStatus error, int line, int isError) case kAudioUnitErr_TooManyFramesToProcess: errorText = "Audio Unit: Too Many Frames"; result = paInternalError; break; -#if ! PA_NEW_HAL - case kAudioUnitErr_IllegalInstrument: - errorText = "Audio Unit: Illegal Instrument"; - result = paInternalError; break; - case kAudioUnitErr_InstrumentTypeNotFound: - errorText = "Audio Unit: Instrument Type Not Found"; - result = paInternalError; break; -#endif case kAudioUnitErr_InvalidFile: errorText = "Audio Unit: Invalid File"; result = paInternalError; break; @@ -434,7 +394,6 @@ long computeRingBufferSize( const PaStreamParameters *inputParameters, * since it represents a theoretically better implementation. */ -#if PA_NEW_HAL OSStatus propertyProc( AudioObjectID inObjectID, UInt32 inNumberAddresses, @@ -444,18 +403,6 @@ OSStatus propertyProc( // this is where we would set the condition variable return noErr; } -#else -OSStatus propertyProc( - AudioDeviceID inDevice, - UInt32 inChannel, - Boolean isInput, - AudioDevicePropertyID inPropertyID, - void* inClientData ) -{ - // this is where we would set the condition variable - return noErr; -} -#endif /* PA_NEW_HAL */ /* sets the value of the given property and waits for the change to be acknowledged, and returns the final value, which is not guaranteed @@ -479,7 +426,7 @@ PaError AudioDeviceSetPropertyNowAndWaitForChange( UInt32 outPropertyDataSize = inPropertyDataSize; /* First, see if it already has that value. If so, return. */ - macErr = pa_AudioDeviceGetProperty( inDevice, inChannel, + macErr = PaMacCore_AudioDeviceGetProperty( inDevice, inChannel, isInput, inPropertyID, &outPropertyDataSize, outPropertyData ); if( macErr ) { @@ -496,7 +443,7 @@ PaError AudioDeviceSetPropertyNowAndWaitForChange( /* If we were using a cond variable, we'd do something useful here, but for now, this is just to make 10.6 happy. */ - macErr = pa_AudioDeviceAddPropertyListener( inDevice, inChannel, isInput, + macErr = PaMacCore_AudioDeviceAddPropertyListener( inDevice, inChannel, isInput, inPropertyID, propertyProc, NULL ); if( macErr ) @@ -504,7 +451,7 @@ PaError AudioDeviceSetPropertyNowAndWaitForChange( goto failMac; /* set property */ - macErr = pa_AudioDeviceSetProperty( inDevice, NULL, inChannel, + macErr = PaMacCore_AudioDeviceSetProperty( inDevice, NULL, inChannel, isInput, inPropertyID, inPropertyDataSize, inPropertyData ); if( macErr ) @@ -519,7 +466,7 @@ PaError AudioDeviceSetPropertyNowAndWaitForChange( memcpy( &tv2, &tv1, sizeof( struct timeval ) ); while( tv2.tv_sec - tv1.tv_sec < 30 ) { /* now read the property back out */ - macErr = pa_AudioDeviceGetProperty( inDevice, inChannel, + macErr = PaMacCore_AudioDeviceGetProperty( inDevice, inChannel, isInput, inPropertyID, &outPropertyDataSize, outPropertyData ); if( macErr ) { @@ -528,7 +475,7 @@ PaError AudioDeviceSetPropertyNowAndWaitForChange( } /* and compare... */ if( 0==memcmp( outPropertyData, inPropertyData, outPropertyDataSize ) ) { - pa_AudioDeviceRemovePropertyListener( inDevice, inChannel, isInput, inPropertyID, propertyProc, NULL); + PaMacCore_AudioDeviceRemovePropertyListener( inDevice, inChannel, isInput, inPropertyID, propertyProc, NULL); return paNoError; } /* No match yet, so let's sleep and try again. */ @@ -537,11 +484,11 @@ PaError AudioDeviceSetPropertyNowAndWaitForChange( } DBUG( ("Timeout waiting for device setting.\n" ) ); - pa_AudioDeviceRemovePropertyListener( inDevice, inChannel, isInput, inPropertyID, propertyProc, NULL ); + PaMacCore_AudioDeviceRemovePropertyListener( inDevice, inChannel, isInput, inPropertyID, propertyProc, NULL ); return paNoError; failMac: - pa_AudioDeviceRemovePropertyListener( inDevice, inChannel, isInput, inPropertyID, propertyProc, NULL ); + PaMacCore_AudioDeviceRemovePropertyListener( inDevice, inChannel, isInput, inPropertyID, propertyProc, NULL ); return ERR( macErr ); } @@ -587,7 +534,7 @@ PaError setBestSampleRateForDevice( const AudioDeviceID device, return paInvalidSampleRate; /* -- generate a list of available sample rates -- */ - err = pa_AudioDeviceGetPropertySize( device, 0, isInput, + err = PaMacCore_AudioDeviceGetPropertySize( device, 0, isInput, kAudioDevicePropertyAvailableNominalSampleRates, &propsize ); if( err ) @@ -595,7 +542,7 @@ PaError setBestSampleRateForDevice( const AudioDeviceID device, ranges = (AudioValueRange *)calloc( 1, propsize ); if( !ranges ) return paInsufficientMemory; - err = pa_AudioDeviceGetProperty( device, 0, isInput, + err = PaMacCore_AudioDeviceGetProperty( device, 0, isInput, kAudioDevicePropertyAvailableNominalSampleRates, &propsize, ranges ); if( err ) @@ -675,10 +622,10 @@ PaError setBestFramesPerBuffer( const AudioDeviceID device, } /* -- try and set exact FPB -- */ - err = pa_AudioDeviceSetProperty( device, NULL, 0, isInput, + err = PaMacCore_AudioDeviceSetProperty( device, NULL, 0, isInput, kAudioDevicePropertyBufferFrameSize, propsize, &requestedFramesPerBuffer); - err = pa_AudioDeviceGetProperty( device, 0, isInput, + err = PaMacCore_AudioDeviceGetProperty( device, 0, isInput, kAudioDevicePropertyBufferFrameSize, &propsize, actualFramesPerBuffer); if( err ) @@ -693,7 +640,7 @@ PaError setBestFramesPerBuffer( const AudioDeviceID device, // Clip requested value against legal range for the device. propsize = sizeof(AudioValueRange); - err = pa_AudioDeviceGetProperty( device, 0, isInput, + err = PaMacCore_AudioDeviceGetProperty( device, 0, isInput, kAudioDevicePropertyBufferFrameSizeRange, &propsize, &range ); if( err ) @@ -711,11 +658,11 @@ PaError setBestFramesPerBuffer( const AudioDeviceID device, /* --- set the buffer size (ignore errors) -- */ propsize = sizeof( UInt32 ); - err = pa_AudioDeviceSetProperty( device, NULL, 0, isInput, + err = PaMacCore_AudioDeviceSetProperty( device, NULL, 0, isInput, kAudioDevicePropertyBufferFrameSize, propsize, &requestedFramesPerBuffer ); /* --- read the property to check that it was set -- */ - err = pa_AudioDeviceGetProperty( device, 0, isInput, + err = PaMacCore_AudioDeviceGetProperty( device, 0, isInput, kAudioDevicePropertyBufferFrameSize, &propsize, actualFramesPerBuffer ); @@ -744,7 +691,6 @@ static PaMacXRunListNode firstXRunListNode; static int xRunListSize; static pthread_mutex_t xrunMutex; -#if PA_NEW_HAL OSStatus xrunCallback( AudioObjectID inDevice, UInt32 inNumberAddresses, @@ -756,41 +702,6 @@ OSStatus xrunCallback( int ret = pthread_mutex_trylock( &xrunMutex ) ; - if( ret == 0 ) { - node = node->next ; //skip the first node - - for( ; node; node=node->next ) { - PaMacCoreStream *stream = node->stream; - - if( stream->state != ACTIVE ) - continue; //if the stream isn't active, we don't care if the device is dropping - - if( isInput ) { - if( stream->inputDevice == inDevice ) - OSAtomicOr32( paInputOverflow, &stream->xrunFlags ); - } else { - if( stream->outputDevice == inDevice ) - OSAtomicOr32( paOutputUnderflow, &stream->xrunFlags ); - } - } - - pthread_mutex_unlock( &xrunMutex ); - } - - return 0; -} -#else -OSStatus xrunCallback( - AudioDeviceID inDevice, - UInt32 inChannel, - Boolean isInput, - AudioDevicePropertyID inPropertyID, - void* inClientData) -{ - PaMacXRunListNode *node = (PaMacXRunListNode *) inClientData; - - int ret = pthread_mutex_trylock( &xrunMutex ) ; - if( ret == 0 ) { node = node->next ; //skip the first node @@ -815,7 +726,6 @@ OSStatus xrunCallback( return 0; } -#endif /* PA_NEW_HAL */ int initializeXRunListenerList( void ) { diff --git a/src/hostapi/coreaudio/pa_mac_core_utilities.h b/src/hostapi/coreaudio/pa_mac_core_utilities.h index 8888a36..091ee65 100644 --- a/src/hostapi/coreaudio/pa_mac_core_utilities.h +++ b/src/hostapi/coreaudio/pa_mac_core_utilities.h @@ -111,28 +111,16 @@ # define VVDBUG(MSG) #endif -#if (MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5) -#define PA_NEW_HAL 1 -#else -#define PA_NEW_HAL 0 -#endif - -#if PA_NEW_HAL -typedef AudioObjectPropertyListenerProc pa_AudioDevicePropertyListenerProc; -#else -typedef AudioDevicePropertyListenerProc pa_AudioDevicePropertyListenerProc; -#endif /* PA_NEW_HAL */ - -OSStatus pa_AudioHardwareGetProperty( +OSStatus PaMacCore_AudioHardwareGetProperty( AudioHardwarePropertyID inPropertyID, UInt32* ioPropertyDataSize, void* outPropertyData); -OSStatus pa_AudioHardwareGetPropertySize( +OSStatus PaMacCore_AudioHardwareGetPropertySize( AudioHardwarePropertyID inPropertyID, UInt32* outSize); -OSStatus pa_AudioDeviceGetProperty( +OSStatus PaMacCore_AudioDeviceGetProperty( AudioDeviceID inDevice, UInt32 inChannel, Boolean isInput, @@ -140,7 +128,7 @@ OSStatus pa_AudioDeviceGetProperty( UInt32* ioPropertyDataSize, void* outPropertyData); -OSStatus pa_AudioDeviceSetProperty( +OSStatus PaMacCore_AudioDeviceSetProperty( AudioDeviceID inDevice, const AudioTimeStamp* inWhen, UInt32 inChannel, @@ -149,30 +137,30 @@ OSStatus pa_AudioDeviceSetProperty( UInt32 inPropertyDataSize, const void* inPropertyData); -OSStatus pa_AudioDeviceGetPropertySize( +OSStatus PaMacCore_AudioDeviceGetPropertySize( AudioDeviceID inDevice, UInt32 inChannel, Boolean isInput, AudioDevicePropertyID inPropertyID, UInt32* outSize); -OSStatus pa_AudioDeviceAddPropertyListener( - AudioDeviceID inDevice, - UInt32 inChannel, - Boolean isInput, - AudioDevicePropertyID inPropertyID, - pa_AudioDevicePropertyListenerProc inProc, - void* inClientData); +OSStatus PaMacCore_AudioDeviceAddPropertyListener( + AudioDeviceID inDevice, + UInt32 inChannel, + Boolean isInput, + AudioDevicePropertyID inPropertyID, + AudioObjectPropertyListenerProc inProc, + void* inClientData); -OSStatus pa_AudioDeviceRemovePropertyListener( - AudioDeviceID inDevice, - UInt32 inChannel, - Boolean isInput, - AudioDevicePropertyID inPropertyID, - pa_AudioDevicePropertyListenerProc inProc, - void* inClientData); +OSStatus PaMacCore_AudioDeviceRemovePropertyListener( + AudioDeviceID inDevice, + UInt32 inChannel, + Boolean isInput, + AudioDevicePropertyID inPropertyID, + AudioObjectPropertyListenerProc inProc, + void* inClientData); -OSStatus pa_AudioStreamGetProperty( +OSStatus PaMacCore_AudioStreamGetProperty( AudioStreamID inStream, UInt32 inChannel, AudioDevicePropertyID inPropertyID, @@ -207,20 +195,11 @@ long computeRingBufferSize( const PaStreamParameters *inputParameters, long outputFramesPerBuffer, double sampleRate ); -#if PA_NEW_HAL OSStatus propertyProc( AudioObjectID inObjectID, UInt32 inNumberAddresses, const AudioObjectPropertyAddress* inAddresses, void* inClientData); -#else -OSStatus propertyProc( - AudioDeviceID inDevice, - UInt32 inChannel, - Boolean isInput, - AudioDevicePropertyID inPropertyID, - void* inClientData ); -#endif /* PA_NEW_HAL */ /* sets the value of the given property and waits for the change to be acknowledged, and returns the final value, which is not guaranteed @@ -270,20 +249,11 @@ PaError setBestFramesPerBuffer( const AudioDeviceID device, * *********************/ -#if PA_NEW_HAL OSStatus xrunCallback( AudioObjectID inObjectID, UInt32 inNumberAddresses, const AudioObjectPropertyAddress* inAddresses, void * inClientData ); -#else -OSStatus xrunCallback( - AudioDeviceID inDevice, - UInt32 inChannel, - Boolean isInput, - AudioDevicePropertyID inPropertyID, - void* inClientData ) ; -#endif /* PA_NEW_HAL */ /** returns zero on success or a unix style error code. */ int initializeXRunListenerList( void ); From 61c402f941b7948cf3b497897b8181d1ebc3cbce Mon Sep 17 00:00:00 2001 From: John Melas Date: Sun, 20 Dec 2020 14:35:24 +0200 Subject: [PATCH 080/164] fix ringBufferIOProc --- src/hostapi/coreaudio/pa_mac_core.c | 40 +++++++++++++++++------------ 1 file changed, 23 insertions(+), 17 deletions(-) diff --git a/src/hostapi/coreaudio/pa_mac_core.c b/src/hostapi/coreaudio/pa_mac_core.c index 24883a8..e6cb4db 100644 --- a/src/hostapi/coreaudio/pa_mac_core.c +++ b/src/hostapi/coreaudio/pa_mac_core.c @@ -2136,29 +2136,35 @@ static OSStatus ringBufferIOProc( AudioStreamPacketDescription** outDataPacketDescription, void* inUserData) { - UInt32 * ioDataSize = &ioData->mBuffers[0].mDataByteSize; - void ** outData = &ioData->mBuffers[0].mData; - - void *dummyData; - ring_buffer_size_t dummySize; - PaUtilRingBuffer *rb = (PaUtilRingBuffer *) inUserData; - VVDBUG(("ringBufferIOProc()\n")); + PaUtilRingBuffer *rb = (PaUtilRingBuffer *) inUserData; + if( PaUtil_GetRingBufferReadAvailable( rb ) == 0 ) { - *outData = NULL; - *ioDataSize = 0; + ioData->mBuffers[0].mData = NULL; + ioData->mBuffers[0].mDataByteSize = 0; + *ioNumberDataPackets = 0; + VVDBUG(("Ring buffer empty!\n")); return RING_BUFFER_EMPTY; } - assert(sizeof(UInt32) == sizeof(ring_buffer_size_t)); - assert( ( (*ioDataSize) / rb->elementSizeBytes ) * rb->elementSizeBytes == (*ioDataSize) ) ; - (*ioDataSize) /= rb->elementSizeBytes ; - PaUtil_GetRingBufferReadRegions( rb, *ioDataSize, - outData, (ring_buffer_size_t *)ioDataSize, + + UInt32 packetSize = sizeof(float) * ioData->mBuffers[0].mNumberChannels; + UInt32 dataSize = *ioNumberDataPackets * packetSize; + assert(dataSize % rb->elementSizeBytes == 0); + UInt32 rbElements = dataSize / rb->elementSizeBytes; + ring_buffer_size_t rbElementsRead = rbElements; + void *dummyData; + ring_buffer_size_t dummySize; + PaUtil_GetRingBufferReadRegions( rb, rbElements, + &ioData->mBuffers[0].mData, &rbElementsRead, &dummyData, &dummySize ); - assert( *ioDataSize ); - PaUtil_AdvanceRingBufferReadIndex( rb, *ioDataSize ); - (*ioDataSize) *= rb->elementSizeBytes ; + assert(rbElementsRead > 0); + VVDBUG(("RingBuffer read elements %u of %u\n", rbElementsRead, rbElements)); + PaUtil_AdvanceRingBufferReadIndex( rb, rbElementsRead ); + + UInt32 bytesRead = rbElementsRead * rb->elementSizeBytes; + ioData->mBuffers[0].mDataByteSize = bytesRead; + *ioNumberDataPackets = bytesRead / packetSize; return noErr; } From ac76dea010a73fa7af4e1b228572a64aa1c34a15 Mon Sep 17 00:00:00 2001 From: John Melas Date: Sun, 20 Dec 2020 20:00:44 +0200 Subject: [PATCH 081/164] pass input size in AudioConverterFillComplexBuffer as number of packets --- src/hostapi/coreaudio/pa_mac_core.c | 22 +++++++++------------- 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/src/hostapi/coreaudio/pa_mac_core.c b/src/hostapi/coreaudio/pa_mac_core.c index e6cb4db..4c14a42 100644 --- a/src/hostapi/coreaudio/pa_mac_core.c +++ b/src/hostapi/coreaudio/pa_mac_core.c @@ -2386,24 +2386,24 @@ static OSStatus AudioIOProc( void *inRefCon, if( stream->inputSRConverter ) { OSStatus err; - UInt32 size; float data[ inChan * frames ]; - size = sizeof( data ); AudioBufferList bufferList; bufferList.mNumberBuffers = 1; bufferList.mBuffers[0].mNumberChannels = inChan; - bufferList.mBuffers[0].mDataByteSize = size; + bufferList.mBuffers[0].mDataByteSize = sizeof( data ); bufferList.mBuffers[0].mData = data; + UInt32 packets = frames; err = AudioConverterFillComplexBuffer( stream->inputSRConverter, ringBufferIOProc, &stream->inputRingBuffer, - &size, + &packets, &bufferList, NULL); if( err == RING_BUFFER_EMPTY ) { /* the ring buffer callback underflowed */ err = 0; + UInt32 size = packets * bytesPerFrame; bzero( ((char *)data) + size, sizeof(data)-size ); /* The ring buffer can underflow normally when the stream is stopping. * So only report an error if the stream is active. */ @@ -2576,20 +2576,17 @@ static OSStatus AudioIOProc( void *inRefCon, OSStatus err; do { /* Run the buffer processor until we are out of data. */ - UInt32 size; - long f; - - size = sizeof( data ); AudioBufferList bufferList; bufferList.mNumberBuffers = 1; bufferList.mBuffers[0].mNumberChannels = chan; - bufferList.mBuffers[0].mDataByteSize = size; + bufferList.mBuffers[0].mDataByteSize = sizeof( data ); bufferList.mBuffers[0].mData = data; + UInt32 packets = inNumberFrames; err = AudioConverterFillComplexBuffer( stream->inputSRConverter, ringBufferIOProc, &stream->inputRingBuffer, - &size, + &packets, &bufferList, NULL); if( err != RING_BUFFER_EMPTY ) @@ -2599,9 +2596,8 @@ static OSStatus AudioIOProc( void *inRefCon, goto stop_stream; } - f = size / ( chan * sizeof(float) ); - PaUtil_SetInputFrameCount( &(stream->bufferProcessor), f ); - if( f ) + PaUtil_SetInputFrameCount( &(stream->bufferProcessor), packets ); + if( packets > 0 ) { PaUtil_BeginBufferProcessing( &(stream->bufferProcessor), &timeInfo, From 9a1fa587737533b7281fa052a7c4f9589948d644 Mon Sep 17 00:00:00 2001 From: John Melas Date: Tue, 29 Dec 2020 16:48:04 +0200 Subject: [PATCH 082/164] remove todo comments --- src/hostapi/coreaudio/pa_mac_core.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/hostapi/coreaudio/pa_mac_core.c b/src/hostapi/coreaudio/pa_mac_core.c index 4c14a42..08f938c 100644 --- a/src/hostapi/coreaudio/pa_mac_core.c +++ b/src/hostapi/coreaudio/pa_mac_core.c @@ -2669,7 +2669,7 @@ static PaError CloseStream( PaStream* s ) 0, false, kAudioDeviceProcessorOverload, - xrunCallback, NULL ); //todo: do we need to pass actual node? + xrunCallback, NULL ); //no need to pass actual node } if( stream->inputUnit && stream->outputUnit != stream->inputUnit ) { int count = removeFromXRunListenerList( stream ); @@ -2678,7 +2678,7 @@ static PaError CloseStream( PaStream* s ) 0, true, kAudioDeviceProcessorOverload, - xrunCallback, NULL ); //todo: do we need to pass actual node? + xrunCallback, NULL ); //no need to pass actual node } if( stream->outputUnit && stream->outputUnit != stream->inputUnit ) { AudioUnitUninitialize( stream->outputUnit ); From 51e075d3dcc0a5bb8b869d720af980c903f86258 Mon Sep 17 00:00:00 2001 From: John Melas Date: Tue, 29 Dec 2020 16:51:28 +0200 Subject: [PATCH 083/164] alignment fixes --- src/hostapi/coreaudio/pa_mac_core.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/hostapi/coreaudio/pa_mac_core.c b/src/hostapi/coreaudio/pa_mac_core.c index 08f938c..310422c 100644 --- a/src/hostapi/coreaudio/pa_mac_core.c +++ b/src/hostapi/coreaudio/pa_mac_core.c @@ -1137,11 +1137,11 @@ static OSStatus SetupDevicePropertyListeners( PaMacCoreStream *stream, AudioDevi AudioDevicePropertyActualSampleRateListenerProc, stream ); PaMacCore_AudioDeviceAddPropertyListener( deviceID, 0, isInput, kAudioStreamPropertyLatency, - AudioDevicePropertyGenericListenerProc, stream ); + AudioDevicePropertyGenericListenerProc, stream ); PaMacCore_AudioDeviceAddPropertyListener( deviceID, 0, isInput, kAudioDevicePropertyBufferFrameSize, - AudioDevicePropertyGenericListenerProc, stream ); + AudioDevicePropertyGenericListenerProc, stream ); PaMacCore_AudioDeviceAddPropertyListener( deviceID, 0, isInput, kAudioDevicePropertySafetyOffset, - AudioDevicePropertyGenericListenerProc, stream ); + AudioDevicePropertyGenericListenerProc, stream ); return osErr; } @@ -1149,14 +1149,14 @@ static OSStatus SetupDevicePropertyListeners( PaMacCoreStream *stream, AudioDevi static void CleanupDevicePropertyListeners( PaMacCoreStream *stream, AudioDeviceID deviceID, Boolean isInput ) { PaMacCore_AudioDeviceRemovePropertyListener( deviceID, 0, isInput, kAudioDevicePropertyActualSampleRate, - AudioDevicePropertyActualSampleRateListenerProc, stream ); + AudioDevicePropertyActualSampleRateListenerProc, stream ); PaMacCore_AudioDeviceRemovePropertyListener( deviceID, 0, isInput, kAudioDevicePropertyLatency, - AudioDevicePropertyGenericListenerProc, stream ); + AudioDevicePropertyGenericListenerProc, stream ); PaMacCore_AudioDeviceRemovePropertyListener( deviceID, 0, isInput, kAudioDevicePropertyBufferFrameSize, - AudioDevicePropertyGenericListenerProc, stream ); + AudioDevicePropertyGenericListenerProc, stream ); PaMacCore_AudioDeviceRemovePropertyListener( deviceID, 0, isInput, kAudioDevicePropertySafetyOffset, - AudioDevicePropertyGenericListenerProc, stream ); + AudioDevicePropertyGenericListenerProc, stream ); } /* ================================================================================= */ From c441223dfac41f0bb04bf360e3adcb48351c5d2e Mon Sep 17 00:00:00 2001 From: Ross Bencina Date: Thu, 21 Jan 2021 14:19:22 +1100 Subject: [PATCH 084/164] Clean up whitespace in include/ in preparation for .editorconfig. (#415) * Clean up whitespace in include/ in preparation for .editorconfig. Convert tabs to 4 spaces. Indent by 4 spaces. Strip trailing whitespace. Ensure EOL at EOF. --- include/pa_asio.h | 18 ++-- include/pa_jack.h | 6 +- include/pa_linux_alsa.h | 6 +- include/pa_mac_core.h | 18 ++-- include/pa_win_ds.h | 14 ++-- include/pa_win_wasapi.h | 24 +++--- include/pa_win_waveformat.h | 162 ++++++++++++++++++------------------ include/pa_win_wdmks.h | 8 +- include/pa_win_wmme.h | 16 ++-- include/portaudio.h | 122 +++++++++++++-------------- 10 files changed, 197 insertions(+), 197 deletions(-) diff --git a/include/pa_asio.h b/include/pa_asio.h index e612aa3..27cbd3b 100644 --- a/include/pa_asio.h +++ b/include/pa_asio.h @@ -28,13 +28,13 @@ */ /* - * The text above constitutes the entire PortAudio license; however, + * The text above constitutes the entire PortAudio license; however, * the PortAudio community also makes the following non-binding requests: * * 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. It is also - * requested that these non-binding requests be included along with the + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the * license above. */ @@ -68,7 +68,7 @@ extern "C" #define that maps PaAsio_GetAvailableLatencyValues to this function for backwards compatibility. */ PaError PaAsio_GetAvailableBufferSizes( PaDeviceIndex device, - long *minBufferSizeFrames, long *maxBufferSizeFrames, long *preferredBufferSizeFrames, long *granularity ); + long *minBufferSizeFrames, long *maxBufferSizeFrames, long *preferredBufferSizeFrames, long *granularity ); /** Backwards compatibility alias for PaAsio_GetAvailableBufferSizes @@ -97,7 +97,7 @@ PaError PaAsio_ShowControlPanel( PaDeviceIndex device, void* systemSpecific ); PaError PaAsio_GetInputChannelName( PaDeviceIndex device, int channelIndex, const char** channelName ); - + /** Retrieve a pointer to a string containing the name of the specified input channel. The string is valid until Pa_Terminate is called. @@ -108,11 +108,11 @@ PaError PaAsio_GetOutputChannelName( PaDeviceIndex device, int channelIndex, /** Set the sample rate of an open paASIO stream. - - @param stream The stream to operate on. - @param sampleRate The new sample rate. - Note that this function may fail if the stream is already running and the + @param stream The stream to operate on. + @param sampleRate The new sample rate. + + Note that this function may fail if the stream is already running and the ASIO driver does not support switching the sample rate of a running stream. Returns paIncompatibleStreamHostApi if stream is not a paASIO stream. diff --git a/include/pa_jack.h b/include/pa_jack.h index 99ef833..750d116 100644 --- a/include/pa_jack.h +++ b/include/pa_jack.h @@ -29,13 +29,13 @@ */ /* - * The text above constitutes the entire PortAudio license; however, + * The text above constitutes the entire PortAudio license; however, * the PortAudio community also makes the following non-binding requests: * * 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. It is also - * requested that these non-binding requests be included along with the + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the * license above. */ diff --git a/include/pa_linux_alsa.h b/include/pa_linux_alsa.h index 7ac6736..c940615 100644 --- a/include/pa_linux_alsa.h +++ b/include/pa_linux_alsa.h @@ -29,13 +29,13 @@ */ /* - * The text above constitutes the entire PortAudio license; however, + * The text above constitutes the entire PortAudio license; however, * the PortAudio community also makes the following non-binding requests: * * 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. It is also - * requested that these non-binding requests be included along with the + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the * license above. */ diff --git a/include/pa_mac_core.h b/include/pa_mac_core.h index 85ecc03..beb5396 100644 --- a/include/pa_mac_core.h +++ b/include/pa_mac_core.h @@ -28,13 +28,13 @@ */ /* - * The text above constitutes the entire PortAudio license; however, + * The text above constitutes the entire PortAudio license; however, * the PortAudio community also makes the following non-binding requests: * * 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. It is also - * requested that these non-binding requests be included along with the + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the * license above. */ @@ -66,8 +66,8 @@ typedef struct PaHostApiTypeId hostApiType; /**host API for which this data is intended */ unsigned long version; /**structure version */ unsigned long flags; /** flags to modify behaviour */ - SInt32 const * channelMap; /** Channel map for HAL channel mapping , if not needed, use NULL;*/ - unsigned long channelMapSize; /** Channel map size for HAL channel mapping , if not needed, use 0;*/ + SInt32 const * channelMap; /** Channel map for HAL channel mapping , if not needed, use NULL;*/ + unsigned long channelMapSize; /** Channel map size for HAL channel mapping , if not needed, use 0;*/ } PaMacCoreStreamInfo; /** @@ -98,7 +98,7 @@ void PaMacCore_SetupChannelMap( PaMacCoreStreamInfo *data, const SInt32 * const * @return A valid AudioDeviceID, or NULL if an error occurred. */ AudioDeviceID PaMacCore_GetStreamInputDevice( PaStream* s ); - + /** * Retrieve the AudioDeviceID of the output device assigned to an open stream * @@ -124,13 +124,13 @@ AudioDeviceID PaMacCore_GetStreamOutputDevice( PaStream* s ); */ const char *PaMacCore_GetChannelName( int device, int channelIndex, bool input ); - + /** Retrieve the range of legal native buffer sizes for the specified device, in sample frames. - + @param device The global index of the PortAudio device about which the query is being made. @param minBufferSizeFrames A pointer to the location which will receive the minimum buffer size value. @param maxBufferSizeFrames A pointer to the location which will receive the maximum buffer size value. - + @see kAudioDevicePropertyBufferFrameSizeRange in the CoreAudio SDK. */ PaError PaMacCore_GetBufferSizeRange( PaDeviceIndex device, diff --git a/include/pa_win_ds.h b/include/pa_win_ds.h index 5d38641..8081abd 100644 --- a/include/pa_win_ds.h +++ b/include/pa_win_ds.h @@ -28,13 +28,13 @@ */ /* - * The text above constitutes the entire PortAudio license; however, + * The text above constitutes the entire PortAudio license; however, * the PortAudio community also makes the following non-binding requests: * * 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. It is also - * requested that these non-binding requests be included along with the + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the * license above. */ @@ -63,11 +63,11 @@ typedef struct PaWinDirectSoundStreamInfo{ unsigned long flags; /**< enable other features of this struct */ - /** + /** low-level latency setting support Sets the size of the DirectSound host buffer. When flags contains the paWinDirectSoundUseLowLevelLatencyParameters - this size will be used instead of interpreting the generic latency + this size will be used instead of interpreting the generic latency parameters to Pa_OpenStream(). If the flag is not set this value is ignored. If the stream is a full duplex stream the implementation requires that @@ -77,7 +77,7 @@ typedef struct PaWinDirectSoundStreamInfo{ /** support for WAVEFORMATEXTENSIBLE channel masks. If flags contains - paWinDirectSoundUseChannelMask this allows you to specify which speakers + paWinDirectSoundUseChannelMask this allows you to specify which speakers to address in a multichannel stream. Constants for channelMask are specified in pa_win_waveformat.h @@ -92,4 +92,4 @@ typedef struct PaWinDirectSoundStreamInfo{ } #endif /* __cplusplus */ -#endif /* PA_WIN_DS_H */ +#endif /* PA_WIN_DS_H */ diff --git a/include/pa_win_wasapi.h b/include/pa_win_wasapi.h index ab5d541..e7cb421 100644 --- a/include/pa_win_wasapi.h +++ b/include/pa_win_wasapi.h @@ -551,7 +551,7 @@ PaError PaWasapi_SetStreamStateHandler( PaStream *pStream, PaWasapiStreamStateCa @param bOutput TRUE (1) for output (render), FALSE (0) for input (capture). @return Error code indicating success or failure. Will return paIncompatibleStreamHostApi if library is not compiled - for UWP/WinRT platform. If Id is longer than PA_WASAPI_DEVICE_ID_LEN characters paBufferTooBig will + for UWP/WinRT platform. If Id is longer than PA_WASAPI_DEVICE_ID_LEN characters paBufferTooBig will be returned. */ PaError PaWasapiWinrt_SetDefaultDeviceId( const unsigned short *pId, int bOutput ); @@ -559,11 +559,11 @@ PaError PaWasapiWinrt_SetDefaultDeviceId( const unsigned short *pId, int bOutput /** Populate the device list. - By default the implementation will rely on DEVINTERFACE_AUDIO_RENDER and DEVINTERFACE_AUDIO_CAPTURE as - default devices. If device Id is provided by PaWasapiWinrt_SetDefaultDeviceId() then those + By default the implementation will rely on DEVINTERFACE_AUDIO_RENDER and DEVINTERFACE_AUDIO_CAPTURE as + default devices. If device Id is provided by PaWasapiWinrt_SetDefaultDeviceId() then those device Ids will be used as default and only devices for the device list. - By populating the device list you can provide an additional available audio devices of the system to PA + By populating the device list you can provide an additional available audio devices of the system to PA which are obtainable by: Windows::Devices::Enumeration::DeviceInformation::FindAllAsync(selector) where selector is obtainable by Windows::Media::Devices::MediaDevice::GetAudioRenderSelector() or @@ -571,14 +571,14 @@ PaError PaWasapiWinrt_SetDefaultDeviceId( const unsigned short *pId, int bOutput After the call completes, memory referenced by pointers can be freed, as implementation keeps its own copy. - You must call PaWasapi_UpdateDeviceList() to update the internal device list of the implementation after + You must call PaWasapi_UpdateDeviceList() to update the internal device list of the implementation after calling this function. See an example in the IMPORTANT notes. @note UWP/WinRT platform only. - @param pId Array of device Ids, pointer to the array of pointers of 16-bit Unicode string (WCHAR). If NULL + @param pId Array of device Ids, pointer to the array of pointers of 16-bit Unicode string (WCHAR). If NULL and count is also 0 then device Ids will be reset to the default. Required. @param pName Array of device Names, pointer to the array of pointers of 16-bit Unicode string (WCHAR). Optional. @param pRole Array of device Roles, see PaWasapiDeviceRole and PaWasapi_GetDeviceRole() for more details. Optional. @@ -587,11 +587,11 @@ PaError PaWasapiWinrt_SetDefaultDeviceId( const unsigned short *pId, int bOutput @param bOutput TRUE (1) for output (render), FALSE (0) for input (capture). @return Error code indicating success or failure. Will return paIncompatibleStreamHostApi if library is not compiled - for UWP/WinRT platform. If Id is longer than PA_WASAPI_DEVICE_ID_LEN characters paBufferTooBig will - be returned. If Name is longer than PA_WASAPI_DEVICE_NAME_LEN characters paBufferTooBig will + for UWP/WinRT platform. If Id is longer than PA_WASAPI_DEVICE_ID_LEN characters paBufferTooBig will + be returned. If Name is longer than PA_WASAPI_DEVICE_NAME_LEN characters paBufferTooBig will be returned. */ -PaError PaWasapiWinrt_PopulateDeviceList( const unsigned short **pId, const unsigned short **pName, +PaError PaWasapiWinrt_PopulateDeviceList( const unsigned short **pId, const unsigned short **pName, const PaWasapiDeviceRole *pRole, unsigned int count, int bOutput ); @@ -676,11 +676,11 @@ PaError PaWasapiWinrt_PopulateDeviceList( const unsigned short **pId, const unsi UWP/WinRT: - This platform has number of limitations which do not allow to enumerate audio devices without + This platform has number of limitations which do not allow to enumerate audio devices without an additional external help. Enumeration is possible though from C++/CX, check the related API Windows::Devices::Enumeration::DeviceInformation::FindAllAsync(). - The main limitation is an absence of the device enumeration from inside the PA's implementation. + The main limitation is an absence of the device enumeration from inside the PA's implementation. This problem can be solved by using the following functions: PaWasapiWinrt_SetDefaultDeviceId() - to set default input/output device, @@ -706,7 +706,7 @@ PaError PaWasapiWinrt_PopulateDeviceList( const unsigned short **pId, const unsi } PaWasapiWinrt_SetDefaultDeviceId((const UINT16 *)default_device_id.c_str(), !capture); - PaWasapiWinrt_PopulateDeviceList(ids.data(), names.data(), role.data(), count, !capture); + PaWasapiWinrt_PopulateDeviceList(ids.data(), names.data(), role.data(), count, !capture); PaWasapi_UpdateDeviceList(); ---------------- diff --git a/include/pa_win_waveformat.h b/include/pa_win_waveformat.h index 2c00267..251562d 100644 --- a/include/pa_win_waveformat.h +++ b/include/pa_win_waveformat.h @@ -29,13 +29,13 @@ */ /* - * The text above constitutes the entire PortAudio license; however, + * The text above constitutes the entire PortAudio license; however, * the PortAudio community also makes the following non-binding requests: * * 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. It is also - * requested that these non-binding requests be included along with the + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the * license above. */ @@ -49,87 +49,87 @@ extern "C" { #endif /* - The following #defines for speaker channel masks are the same - as those in ksmedia.h, except with PAWIN_ prepended, KSAUDIO_ removed - in some cases, and casts to PaWinWaveFormatChannelMask added. + The following #defines for speaker channel masks are the same + as those in ksmedia.h, except with PAWIN_ prepended, KSAUDIO_ removed + in some cases, and casts to PaWinWaveFormatChannelMask added. */ typedef unsigned long PaWinWaveFormatChannelMask; /* Speaker Positions: */ -#define PAWIN_SPEAKER_FRONT_LEFT ((PaWinWaveFormatChannelMask)0x1) -#define PAWIN_SPEAKER_FRONT_RIGHT ((PaWinWaveFormatChannelMask)0x2) -#define PAWIN_SPEAKER_FRONT_CENTER ((PaWinWaveFormatChannelMask)0x4) -#define PAWIN_SPEAKER_LOW_FREQUENCY ((PaWinWaveFormatChannelMask)0x8) -#define PAWIN_SPEAKER_BACK_LEFT ((PaWinWaveFormatChannelMask)0x10) -#define PAWIN_SPEAKER_BACK_RIGHT ((PaWinWaveFormatChannelMask)0x20) -#define PAWIN_SPEAKER_FRONT_LEFT_OF_CENTER ((PaWinWaveFormatChannelMask)0x40) -#define PAWIN_SPEAKER_FRONT_RIGHT_OF_CENTER ((PaWinWaveFormatChannelMask)0x80) -#define PAWIN_SPEAKER_BACK_CENTER ((PaWinWaveFormatChannelMask)0x100) -#define PAWIN_SPEAKER_SIDE_LEFT ((PaWinWaveFormatChannelMask)0x200) -#define PAWIN_SPEAKER_SIDE_RIGHT ((PaWinWaveFormatChannelMask)0x400) -#define PAWIN_SPEAKER_TOP_CENTER ((PaWinWaveFormatChannelMask)0x800) -#define PAWIN_SPEAKER_TOP_FRONT_LEFT ((PaWinWaveFormatChannelMask)0x1000) -#define PAWIN_SPEAKER_TOP_FRONT_CENTER ((PaWinWaveFormatChannelMask)0x2000) -#define PAWIN_SPEAKER_TOP_FRONT_RIGHT ((PaWinWaveFormatChannelMask)0x4000) -#define PAWIN_SPEAKER_TOP_BACK_LEFT ((PaWinWaveFormatChannelMask)0x8000) -#define PAWIN_SPEAKER_TOP_BACK_CENTER ((PaWinWaveFormatChannelMask)0x10000) -#define PAWIN_SPEAKER_TOP_BACK_RIGHT ((PaWinWaveFormatChannelMask)0x20000) +#define PAWIN_SPEAKER_FRONT_LEFT ((PaWinWaveFormatChannelMask)0x1) +#define PAWIN_SPEAKER_FRONT_RIGHT ((PaWinWaveFormatChannelMask)0x2) +#define PAWIN_SPEAKER_FRONT_CENTER ((PaWinWaveFormatChannelMask)0x4) +#define PAWIN_SPEAKER_LOW_FREQUENCY ((PaWinWaveFormatChannelMask)0x8) +#define PAWIN_SPEAKER_BACK_LEFT ((PaWinWaveFormatChannelMask)0x10) +#define PAWIN_SPEAKER_BACK_RIGHT ((PaWinWaveFormatChannelMask)0x20) +#define PAWIN_SPEAKER_FRONT_LEFT_OF_CENTER ((PaWinWaveFormatChannelMask)0x40) +#define PAWIN_SPEAKER_FRONT_RIGHT_OF_CENTER ((PaWinWaveFormatChannelMask)0x80) +#define PAWIN_SPEAKER_BACK_CENTER ((PaWinWaveFormatChannelMask)0x100) +#define PAWIN_SPEAKER_SIDE_LEFT ((PaWinWaveFormatChannelMask)0x200) +#define PAWIN_SPEAKER_SIDE_RIGHT ((PaWinWaveFormatChannelMask)0x400) +#define PAWIN_SPEAKER_TOP_CENTER ((PaWinWaveFormatChannelMask)0x800) +#define PAWIN_SPEAKER_TOP_FRONT_LEFT ((PaWinWaveFormatChannelMask)0x1000) +#define PAWIN_SPEAKER_TOP_FRONT_CENTER ((PaWinWaveFormatChannelMask)0x2000) +#define PAWIN_SPEAKER_TOP_FRONT_RIGHT ((PaWinWaveFormatChannelMask)0x4000) +#define PAWIN_SPEAKER_TOP_BACK_LEFT ((PaWinWaveFormatChannelMask)0x8000) +#define PAWIN_SPEAKER_TOP_BACK_CENTER ((PaWinWaveFormatChannelMask)0x10000) +#define PAWIN_SPEAKER_TOP_BACK_RIGHT ((PaWinWaveFormatChannelMask)0x20000) /* Bit mask locations reserved for future use */ -#define PAWIN_SPEAKER_RESERVED ((PaWinWaveFormatChannelMask)0x7FFC0000) +#define PAWIN_SPEAKER_RESERVED ((PaWinWaveFormatChannelMask)0x7FFC0000) /* Used to specify that any possible permutation of speaker configurations */ -#define PAWIN_SPEAKER_ALL ((PaWinWaveFormatChannelMask)0x80000000) +#define PAWIN_SPEAKER_ALL ((PaWinWaveFormatChannelMask)0x80000000) /* DirectSound Speaker Config */ -#define PAWIN_SPEAKER_DIRECTOUT 0 -#define PAWIN_SPEAKER_MONO (PAWIN_SPEAKER_FRONT_CENTER) -#define PAWIN_SPEAKER_STEREO (PAWIN_SPEAKER_FRONT_LEFT | PAWIN_SPEAKER_FRONT_RIGHT) -#define PAWIN_SPEAKER_QUAD (PAWIN_SPEAKER_FRONT_LEFT | PAWIN_SPEAKER_FRONT_RIGHT | \ - PAWIN_SPEAKER_BACK_LEFT | PAWIN_SPEAKER_BACK_RIGHT) -#define PAWIN_SPEAKER_SURROUND (PAWIN_SPEAKER_FRONT_LEFT | PAWIN_SPEAKER_FRONT_RIGHT | \ - PAWIN_SPEAKER_FRONT_CENTER | PAWIN_SPEAKER_BACK_CENTER) -#define PAWIN_SPEAKER_5POINT1 (PAWIN_SPEAKER_FRONT_LEFT | PAWIN_SPEAKER_FRONT_RIGHT | \ - PAWIN_SPEAKER_FRONT_CENTER | PAWIN_SPEAKER_LOW_FREQUENCY | \ - PAWIN_SPEAKER_BACK_LEFT | PAWIN_SPEAKER_BACK_RIGHT) -#define PAWIN_SPEAKER_7POINT1 (PAWIN_SPEAKER_FRONT_LEFT | PAWIN_SPEAKER_FRONT_RIGHT | \ - PAWIN_SPEAKER_FRONT_CENTER | PAWIN_SPEAKER_LOW_FREQUENCY | \ - PAWIN_SPEAKER_BACK_LEFT | PAWIN_SPEAKER_BACK_RIGHT | \ - PAWIN_SPEAKER_FRONT_LEFT_OF_CENTER | PAWIN_SPEAKER_FRONT_RIGHT_OF_CENTER) -#define PAWIN_SPEAKER_5POINT1_SURROUND (PAWIN_SPEAKER_FRONT_LEFT | PAWIN_SPEAKER_FRONT_RIGHT | \ - PAWIN_SPEAKER_FRONT_CENTER | PAWIN_SPEAKER_LOW_FREQUENCY | \ - PAWIN_SPEAKER_SIDE_LEFT | PAWIN_SPEAKER_SIDE_RIGHT) -#define PAWIN_SPEAKER_7POINT1_SURROUND (PAWIN_SPEAKER_FRONT_LEFT | PAWIN_SPEAKER_FRONT_RIGHT | \ - PAWIN_SPEAKER_FRONT_CENTER | PAWIN_SPEAKER_LOW_FREQUENCY | \ - PAWIN_SPEAKER_BACK_LEFT | PAWIN_SPEAKER_BACK_RIGHT | \ - PAWIN_SPEAKER_SIDE_LEFT | PAWIN_SPEAKER_SIDE_RIGHT) +#define PAWIN_SPEAKER_DIRECTOUT 0 +#define PAWIN_SPEAKER_MONO (PAWIN_SPEAKER_FRONT_CENTER) +#define PAWIN_SPEAKER_STEREO (PAWIN_SPEAKER_FRONT_LEFT | PAWIN_SPEAKER_FRONT_RIGHT) +#define PAWIN_SPEAKER_QUAD (PAWIN_SPEAKER_FRONT_LEFT | PAWIN_SPEAKER_FRONT_RIGHT | \ + PAWIN_SPEAKER_BACK_LEFT | PAWIN_SPEAKER_BACK_RIGHT) +#define PAWIN_SPEAKER_SURROUND (PAWIN_SPEAKER_FRONT_LEFT | PAWIN_SPEAKER_FRONT_RIGHT | \ + PAWIN_SPEAKER_FRONT_CENTER | PAWIN_SPEAKER_BACK_CENTER) +#define PAWIN_SPEAKER_5POINT1 (PAWIN_SPEAKER_FRONT_LEFT | PAWIN_SPEAKER_FRONT_RIGHT | \ + PAWIN_SPEAKER_FRONT_CENTER | PAWIN_SPEAKER_LOW_FREQUENCY | \ + PAWIN_SPEAKER_BACK_LEFT | PAWIN_SPEAKER_BACK_RIGHT) +#define PAWIN_SPEAKER_7POINT1 (PAWIN_SPEAKER_FRONT_LEFT | PAWIN_SPEAKER_FRONT_RIGHT | \ + PAWIN_SPEAKER_FRONT_CENTER | PAWIN_SPEAKER_LOW_FREQUENCY | \ + PAWIN_SPEAKER_BACK_LEFT | PAWIN_SPEAKER_BACK_RIGHT | \ + PAWIN_SPEAKER_FRONT_LEFT_OF_CENTER | PAWIN_SPEAKER_FRONT_RIGHT_OF_CENTER) +#define PAWIN_SPEAKER_5POINT1_SURROUND (PAWIN_SPEAKER_FRONT_LEFT | PAWIN_SPEAKER_FRONT_RIGHT | \ + PAWIN_SPEAKER_FRONT_CENTER | PAWIN_SPEAKER_LOW_FREQUENCY | \ + PAWIN_SPEAKER_SIDE_LEFT | PAWIN_SPEAKER_SIDE_RIGHT) +#define PAWIN_SPEAKER_7POINT1_SURROUND (PAWIN_SPEAKER_FRONT_LEFT | PAWIN_SPEAKER_FRONT_RIGHT | \ + PAWIN_SPEAKER_FRONT_CENTER | PAWIN_SPEAKER_LOW_FREQUENCY | \ + PAWIN_SPEAKER_BACK_LEFT | PAWIN_SPEAKER_BACK_RIGHT | \ + PAWIN_SPEAKER_SIDE_LEFT | PAWIN_SPEAKER_SIDE_RIGHT) /* According to the Microsoft documentation: The following are obsolete 5.1 and 7.1 settings (they lack side speakers). Note this means that the default 5.1 and 7.1 settings (KSAUDIO_SPEAKER_5POINT1 and KSAUDIO_SPEAKER_7POINT1 are similarly obsolete but are unchanged for compatibility reasons). */ -#define PAWIN_SPEAKER_5POINT1_BACK PAWIN_SPEAKER_5POINT1 -#define PAWIN_SPEAKER_7POINT1_WIDE PAWIN_SPEAKER_7POINT1 +#define PAWIN_SPEAKER_5POINT1_BACK PAWIN_SPEAKER_5POINT1 +#define PAWIN_SPEAKER_7POINT1_WIDE PAWIN_SPEAKER_7POINT1 /* DVD Speaker Positions */ -#define PAWIN_SPEAKER_GROUND_FRONT_LEFT PAWIN_SPEAKER_FRONT_LEFT -#define PAWIN_SPEAKER_GROUND_FRONT_CENTER PAWIN_SPEAKER_FRONT_CENTER -#define PAWIN_SPEAKER_GROUND_FRONT_RIGHT PAWIN_SPEAKER_FRONT_RIGHT -#define PAWIN_SPEAKER_GROUND_REAR_LEFT PAWIN_SPEAKER_BACK_LEFT -#define PAWIN_SPEAKER_GROUND_REAR_RIGHT PAWIN_SPEAKER_BACK_RIGHT -#define PAWIN_SPEAKER_TOP_MIDDLE PAWIN_SPEAKER_TOP_CENTER -#define PAWIN_SPEAKER_SUPER_WOOFER PAWIN_SPEAKER_LOW_FREQUENCY +#define PAWIN_SPEAKER_GROUND_FRONT_LEFT PAWIN_SPEAKER_FRONT_LEFT +#define PAWIN_SPEAKER_GROUND_FRONT_CENTER PAWIN_SPEAKER_FRONT_CENTER +#define PAWIN_SPEAKER_GROUND_FRONT_RIGHT PAWIN_SPEAKER_FRONT_RIGHT +#define PAWIN_SPEAKER_GROUND_REAR_LEFT PAWIN_SPEAKER_BACK_LEFT +#define PAWIN_SPEAKER_GROUND_REAR_RIGHT PAWIN_SPEAKER_BACK_RIGHT +#define PAWIN_SPEAKER_TOP_MIDDLE PAWIN_SPEAKER_TOP_CENTER +#define PAWIN_SPEAKER_SUPER_WOOFER PAWIN_SPEAKER_LOW_FREQUENCY /* - PaWinWaveFormat is defined here to provide compatibility with - compilation environments which don't have headers defining - WAVEFORMATEXTENSIBLE (e.g. older versions of MSVC, Borland C++ etc. + PaWinWaveFormat is defined here to provide compatibility with + compilation environments which don't have headers defining + WAVEFORMATEXTENSIBLE (e.g. older versions of MSVC, Borland C++ etc. - The fields for WAVEFORMATEX and WAVEFORMATEXTENSIBLE are declared as an - unsigned char array here to avoid clients who include this file having + The fields for WAVEFORMATEX and WAVEFORMATEXTENSIBLE are declared as an + unsigned char array here to avoid clients who include this file having a dependency on windows.h and mmsystem.h, and also to to avoid having to write separate packing pragmas for each compiler. */ @@ -138,24 +138,24 @@ typedef unsigned long PaWinWaveFormatChannelMask; typedef struct{ unsigned char fields[ PAWIN_SIZEOF_WAVEFORMATEXTENSIBLE ]; - unsigned long extraLongForAlignment; /* ensure that compiler aligns struct to DWORD */ + unsigned long extraLongForAlignment; /* ensure that compiler aligns struct to DWORD */ } PaWinWaveFormat; /* WAVEFORMATEXTENSIBLE fields: - + union { - WORD wValidBitsPerSample; - WORD wSamplesPerBlock; - WORD wReserved; + WORD wValidBitsPerSample; + WORD wSamplesPerBlock; + WORD wReserved; } Samples; - DWORD dwChannelMask; + DWORD dwChannelMask; GUID SubFormat; */ -#define PAWIN_INDEXOF_WVALIDBITSPERSAMPLE (PAWIN_SIZEOF_WAVEFORMATEX+0) -#define PAWIN_INDEXOF_DWCHANNELMASK (PAWIN_SIZEOF_WAVEFORMATEX+2) -#define PAWIN_INDEXOF_SUBFORMAT (PAWIN_SIZEOF_WAVEFORMATEX+6) +#define PAWIN_INDEXOF_WVALIDBITSPERSAMPLE (PAWIN_SIZEOF_WAVEFORMATEX+0) +#define PAWIN_INDEXOF_DWCHANNELMASK (PAWIN_SIZEOF_WAVEFORMATEX+2) +#define PAWIN_INDEXOF_SUBFORMAT (PAWIN_SIZEOF_WAVEFORMATEX+6) /* @@ -163,10 +163,10 @@ typedef struct{ PaWin_InitializeWaveFormatExtensible functions below. These must match the standard Windows WAVE_FORMAT_* values. */ -#define PAWIN_WAVE_FORMAT_PCM (1) -#define PAWIN_WAVE_FORMAT_IEEE_FLOAT (3) -#define PAWIN_WAVE_FORMAT_DOLBY_AC3_SPDIF (0x0092) -#define PAWIN_WAVE_FORMAT_WMA_SPDIF (0x0164) +#define PAWIN_WAVE_FORMAT_PCM (1) +#define PAWIN_WAVE_FORMAT_IEEE_FLOAT (3) +#define PAWIN_WAVE_FORMAT_DOLBY_AC3_SPDIF (0x0092) +#define PAWIN_WAVE_FORMAT_WMA_SPDIF (0x0164) /* @@ -176,16 +176,16 @@ typedef struct{ int PaWin_SampleFormatToLinearWaveFormatTag( PaSampleFormat sampleFormat ); /* - Use the following two functions to initialize the waveformat structure. + Use the following two functions to initialize the waveformat structure. */ -void PaWin_InitializeWaveFormatEx( PaWinWaveFormat *waveFormat, - int numChannels, PaSampleFormat sampleFormat, int waveFormatTag, double sampleRate ); +void PaWin_InitializeWaveFormatEx( PaWinWaveFormat *waveFormat, + int numChannels, PaSampleFormat sampleFormat, int waveFormatTag, double sampleRate ); -void PaWin_InitializeWaveFormatExtensible( PaWinWaveFormat *waveFormat, - int numChannels, PaSampleFormat sampleFormat, int waveFormatTag, double sampleRate, - PaWinWaveFormatChannelMask channelMask ); +void PaWin_InitializeWaveFormatExtensible( PaWinWaveFormat *waveFormat, + int numChannels, PaSampleFormat sampleFormat, int waveFormatTag, double sampleRate, + PaWinWaveFormatChannelMask channelMask ); /* Map a channel count to a speaker channel mask */ @@ -196,4 +196,4 @@ PaWinWaveFormatChannelMask PaWin_DefaultChannelMask( int numChannels ); } #endif /* __cplusplus */ -#endif /* PA_WIN_WAVEFORMAT_H */ \ No newline at end of file +#endif /* PA_WIN_WAVEFORMAT_H */ diff --git a/include/pa_win_wdmks.h b/include/pa_win_wdmks.h index 3592962..bc2f689 100644 --- a/include/pa_win_wdmks.h +++ b/include/pa_win_wdmks.h @@ -28,13 +28,13 @@ */ /* - * The text above constitutes the entire PortAudio license; however, + * The text above constitutes the entire PortAudio license; however, * the PortAudio community also makes the following non-binding requests: * * 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. It is also - * requested that these non-binding requests be included along with the + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the * license above. */ @@ -134,4 +134,4 @@ extern "C" } #endif /* __cplusplus */ -#endif /* PA_WIN_DS_H */ +#endif /* PA_WIN_DS_H */ diff --git a/include/pa_win_wmme.h b/include/pa_win_wmme.h index b80743c..814022b 100644 --- a/include/pa_win_wmme.h +++ b/include/pa_win_wmme.h @@ -28,13 +28,13 @@ */ /* - * The text above constitutes the entire PortAudio license; however, + * The text above constitutes the entire PortAudio license; however, * the PortAudio community also makes the following non-binding requests: * * 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. It is also - * requested that these non-binding requests be included along with the + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the * license above. */ @@ -52,7 +52,7 @@ extern "C" #endif /* __cplusplus */ -/* The following are flags which can be set in +/* The following are flags which can be set in PaWinMmeStreamInfo's flags field. */ @@ -100,7 +100,7 @@ typedef struct PaWinMmeStreamInfo{ Pa_OpenStream(). */ unsigned long framesPerBuffer; - unsigned long bufferCount; /* formerly numBuffers */ + unsigned long bufferCount; /* formerly numBuffers */ /* multiple devices per direction support If flags contains the PaWinMmeUseMultipleDevices flag, @@ -118,7 +118,7 @@ typedef struct PaWinMmeStreamInfo{ /* support for WAVEFORMATEXTENSIBLE channel masks. If flags contains - paWinMmeUseChannelMask this allows you to specify which speakers + paWinMmeUseChannelMask this allows you to specify which speakers to address in a multichannel stream. Constants for channelMask are specified in pa_win_waveformat.h @@ -155,7 +155,7 @@ HWAVEIN PaWinMME_GetStreamInputHandle( PaStream* stream, int handleIndex ); /** Retrieve the number of wave out handles used by a PortAudio WinMME stream. Returns zero if the stream is input only. - + @return A non-negative value indicating the number of wave out handles or, a PaErrorCode (which are always negative) if PortAudio is not initialized or an error is encountered. @@ -182,4 +182,4 @@ HWAVEOUT PaWinMME_GetStreamOutputHandle( PaStream* stream, int handleIndex ); } #endif /* __cplusplus */ -#endif /* PA_WIN_WMME_H */ +#endif /* PA_WIN_WMME_H */ diff --git a/include/portaudio.h b/include/portaudio.h index 738080d..0c5b6a4 100644 --- a/include/portaudio.h +++ b/include/portaudio.h @@ -29,13 +29,13 @@ */ /* - * The text above constitutes the entire PortAudio license; however, + * The text above constitutes the entire PortAudio license; however, * the PortAudio community also makes the following non-binding requests: * * 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. It is also - * requested that these non-binding requests be included along with the + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the * license above. */ @@ -100,7 +100,7 @@ typedef struct PaVersionInfo { /** Version as a string, for example "PortAudio V19.5.0-devel, revision 1952M" */ const char *versionText; } PaVersionInfo; - + /** Retrieve version information for the currently running PortAudio build. @return A pointer to an immutable PaVersionInfo structure. @@ -167,9 +167,9 @@ const char *Pa_GetErrorText( PaError errorCode ); and Pa_GetErrorText(), this function MUST be called before using any other PortAudio API functions. - If Pa_Initialize() is called multiple times, each successful - call must be matched with a corresponding call to Pa_Terminate(). - Pairs of calls to Pa_Initialize()/Pa_Terminate() may overlap, and are not + If Pa_Initialize() is called multiple times, each successful + call must be matched with a corresponding call to Pa_Terminate(). + Pairs of calls to Pa_Initialize()/Pa_Terminate() may overlap, and are not required to be fully nested. Note that if Pa_Initialize() returns an error code, Pa_Terminate() should @@ -196,7 +196,7 @@ PaError Pa_Initialize( void ); @return paNoError if successful, otherwise an error code indicating the cause of failure. - + @see Pa_Initialize */ PaError Pa_Terminate( void ); @@ -320,7 +320,7 @@ typedef struct PaHostApiInfo if no default output device is available. */ PaDeviceIndex defaultOutputDevice; - + } PaHostApiInfo; @@ -349,7 +349,7 @@ const PaHostApiInfo * Pa_GetHostApiInfo( PaHostApiIndex hostApi ); @return A valid PaHostApiIndex ranging from 0 to (Pa_GetHostApiCount()-1) or, a PaErrorCode (which are always negative) if PortAudio is not initialized or an error is encountered. - + The paHostApiNotFound error code indicates that the host API specified by the type parameter is not available. @@ -376,7 +376,7 @@ PaHostApiIndex Pa_HostApiTypeIdToHostApiIndex( PaHostApiTypeId type ); A paInvalidDevice error code indicates that the hostApiDeviceIndex parameter is out of range. - + @see PaHostApiInfo */ PaDeviceIndex Pa_HostApiDeviceIndexToDeviceIndex( PaHostApiIndex hostApi, @@ -449,12 +449,12 @@ PaDeviceIndex Pa_GetDefaultInputDevice( void ); PaDeviceIndex Pa_GetDefaultOutputDevice( void ); -/** The type used to represent monotonic time in seconds. PaTime is - used for the fields of the PaStreamCallbackTimeInfo argument to the +/** The type used to represent monotonic time in seconds. PaTime is + used for the fields of the PaStreamCallbackTimeInfo argument to the PaStreamCallback and as the result of Pa_GetStreamTime(). PaTime values have unspecified origin. - + @see PaStreamCallback, PaStreamCallbackTimeInfo, Pa_GetStreamTime */ typedef double PaTime; @@ -472,7 +472,7 @@ typedef double PaTime; paUInt8 is an unsigned 8 bit format where 128 is considered "ground" - The paNonInterleaved flag indicates that audio data is passed as an array + The paNonInterleaved flag indicates that audio data is passed as an array of pointers to separate buffers, one buffer for each channel. Usually, when this flag is not used, audio data is passed as a single buffer with all channels interleaved. @@ -502,7 +502,7 @@ typedef struct PaDeviceInfo int structVersion; /* this is struct version 2 */ const char *name; PaHostApiIndex hostApi; /**< note this is a host API index, not a type id*/ - + int maxInputChannels; int maxOutputChannels; @@ -544,7 +544,7 @@ typedef struct PaStreamParameters This field must not be set to paNoDevice. */ PaDeviceIndex device; - + /** The number of channels of sound to be delivered to the stream callback or accessed by Pa_ReadStream() or Pa_WriteStream(). It can range from 1 to the value of maxInputChannels in the @@ -619,9 +619,9 @@ PaError Pa_IsFormatSupported( const PaStreamParameters *inputParameters, A single PaStream can provide multiple channels of real-time streaming audio input and output to a client application. A stream provides access to audio hardware represented by one or more - PaDevices. Depending on the underlying Host API, it may be possible - to open multiple streams using the same device, however this behavior - is implementation defined. Portable applications should assume that + PaDevices. Depending on the underlying Host API, it may be possible + to open multiple streams using the same device, however this behavior + is implementation defined. Portable applications should assume that a PaDevice may be simultaneously used by at most one PaStream. Pointers to PaStream objects are passed between PortAudio functions that @@ -679,7 +679,7 @@ typedef unsigned long PaStreamFlags; /** Call the stream callback to fill initial output buffers, rather than the default behavior of priming the buffers with zeros (silence). This flag has no effect for input-only and blocking read/write streams. - + @see PaStreamFlags */ #define paPrimeOutputBuffersUsingStreamCallback ((PaStreamFlags) 0x00000008) @@ -693,7 +693,7 @@ typedef unsigned long PaStreamFlags; Timing information for the buffers passed to the stream callback. Time values are expressed in seconds and are synchronised with the time base used by Pa_GetStreamTime() for the associated stream. - + @see PaStreamCallback, Pa_GetStreamTime */ typedef struct PaStreamCallbackTimeInfo{ @@ -764,41 +764,41 @@ typedef enum PaStreamCallbackResult active PortAudio stream. When a stream is running, PortAudio calls the stream callback periodically. - The callback function is responsible for processing buffers of audio samples + The callback function is responsible for processing buffers of audio samples passed via the input and output parameters. The PortAudio stream callback runs at very high or real-time priority. - It is required to consistently meet its time deadlines. Do not allocate - memory, access the file system, call library functions or call other functions + It is required to consistently meet its time deadlines. Do not allocate + memory, access the file system, call library functions or call other functions from the stream callback that may block or take an unpredictable amount of time to complete. In order for a stream to maintain glitch-free operation the callback must consume and return audio data faster than it is recorded and/or - played. PortAudio anticipates that each callback invocation may execute for - a duration approaching the duration of frameCount audio frames at the stream + played. PortAudio anticipates that each callback invocation may execute for + a duration approaching the duration of frameCount audio frames at the stream sample rate. It is reasonable to expect to be able to utilise 70% or more of - the available CPU time in the PortAudio callback. However, due to buffer size - adaption and other factors, not all host APIs are able to guarantee audio - stability under heavy CPU load with arbitrary fixed callback buffer sizes. - When high callback CPU utilisation is required the most robust behavior - can be achieved by using paFramesPerBufferUnspecified as the + the available CPU time in the PortAudio callback. However, due to buffer size + adaption and other factors, not all host APIs are able to guarantee audio + stability under heavy CPU load with arbitrary fixed callback buffer sizes. + When high callback CPU utilisation is required the most robust behavior + can be achieved by using paFramesPerBufferUnspecified as the Pa_OpenStream() framesPerBuffer parameter. - + @param input and @param output are either arrays of interleaved samples or; - if non-interleaved samples were requested using the paNonInterleaved sample - format flag, an array of buffer pointers, one non-interleaved buffer for + if non-interleaved samples were requested using the paNonInterleaved sample + format flag, an array of buffer pointers, one non-interleaved buffer for each channel. The format, packing and number of channels used by the buffers are determined by parameters to Pa_OpenStream(). - + @param frameCount The number of sample frames to be processed by the stream callback. @param timeInfo Timestamps indicating the ADC capture time of the first sample in the input buffer, the DAC output time of the first sample in the output buffer - and the time the callback was invoked. + and the time the callback was invoked. See PaStreamCallbackTimeInfo and Pa_GetStreamTime() @param statusFlags Flags indicating whether input and/or output buffers @@ -836,10 +836,10 @@ typedef int PaStreamCallback( /** Opens a stream for either input, output or both. - + @param stream The address of a PaStream pointer which will receive a pointer to the newly opened stream. - + @param inputParameters A structure that describes the input parameters used by the opened stream. See PaStreamParameters for a description of these parameters. inputParameters must be NULL for output-only streams. @@ -847,10 +847,10 @@ typedef int PaStreamCallback( @param outputParameters A structure that describes the output parameters used by the opened stream. See PaStreamParameters for a description of these parameters. outputParameters must be NULL for input-only streams. - + @param sampleRate The desired sampleRate. For full-duplex streams it is the sample rate for both input and output - + @param framesPerBuffer The number of frames passed to the stream callback function, or the preferred block granularity for a blocking read/write stream. The special value paFramesPerBufferUnspecified (0) may be used to request that @@ -862,11 +862,11 @@ typedef int PaStreamCallback( will be kept to the theoretical minimum however, it is strongly recommended that a non-zero framesPerBuffer value only be used when your algorithm requires a fixed number of frames per stream callback. - + @param streamFlags Flags which modify the behavior of the streaming process. This parameter may contain a combination of flags ORed together. Some flags may only be relevant to certain buffer formats. - + @param streamCallback A pointer to a client supplied function that is responsible for processing and filling input and output buffers. If this parameter is NULL the stream will be opened in 'blocking read/write' mode. In blocking mode, @@ -879,7 +879,7 @@ typedef int PaStreamCallback( function. It could for example, contain a pointer to instance data necessary for processing the audio buffers. This parameter is ignored if streamCallback is NULL. - + @return Upon success Pa_OpenStream() returns paNoError and places a pointer to a valid PaStream in the stream argument. The stream is inactive (stopped). @@ -904,7 +904,7 @@ PaError Pa_OpenStream( PaStream** stream, @param stream The address of a PaStream pointer which will receive a pointer to the newly opened stream. - + @param numInputChannels The number of channels of sound that will be supplied to the stream callback or returned by Pa_ReadStream. It can range from 1 to the value of maxInputChannels in the PaDeviceInfo record for the default input @@ -919,7 +919,7 @@ PaError Pa_OpenStream( PaStream** stream, provided to the callback or passed to and from Pa_ReadStream and Pa_WriteStream. sampleFormat may be any of the formats described by the PaSampleFormat enumeration. - + @param sampleRate Same as Pa_OpenStream parameter of the same name. @param framesPerBuffer Same as Pa_OpenStream parameter of the same name. @param streamCallback Same as Pa_OpenStream parameter of the same name. @@ -945,7 +945,7 @@ PaError Pa_OpenDefaultStream( PaStream** stream, PaError Pa_CloseStream( PaStream *stream ); -/** Functions of type PaStreamFinishedCallback are implemented by PortAudio +/** Functions of type PaStreamFinishedCallback are implemented by PortAudio clients. They can be registered with a stream using the Pa_SetStreamFinishedCallback function. Once registered they are called when the stream becomes inactive (ie once a call to Pa_StopStream() will not block). @@ -954,7 +954,7 @@ PaError Pa_CloseStream( PaStream *stream ); output, if the stream callback returns paComplete, or Pa_StopStream() is called, the stream finished callback will not be called until all generated sample data has been played. - + @param userData The userData parameter supplied to Pa_OpenStream() @see Pa_SetStreamFinishedCallback @@ -962,12 +962,12 @@ PaError Pa_CloseStream( PaStream *stream ); typedef void PaStreamFinishedCallback( void *userData ); -/** Register a stream finished callback function which will be called when the - stream becomes inactive. See the description of PaStreamFinishedCallback for +/** Register a stream finished callback function which will be called when the + stream becomes inactive. See the description of PaStreamFinishedCallback for further details about when the callback will be called. @param stream a pointer to a PaStream that is in the stopped state - if the - stream is not stopped, the stream's finished callback will remain unchanged + stream is not stopped, the stream's finished callback will remain unchanged and an error code will be returned. @param streamFinishedCallback a pointer to a function with the same signature @@ -980,7 +980,7 @@ typedef void PaStreamFinishedCallback( void *userData ); @see PaStreamFinishedCallback */ -PaError Pa_SetStreamFinishedCallback( PaStream *stream, PaStreamFinishedCallback* streamFinishedCallback ); +PaError Pa_SetStreamFinishedCallback( PaStream *stream, PaStreamFinishedCallback* streamFinishedCallback ); /** Commences audio processing. @@ -1065,7 +1065,7 @@ typedef struct PaStreamInfo parameter passed to Pa_OpenStream(). */ double sampleRate; - + } PaStreamInfo; @@ -1087,15 +1087,15 @@ const PaStreamInfo* Pa_GetStreamInfo( PaStream *stream ); /** Returns the current time in seconds for a stream according to the same clock used to generate callback PaStreamCallbackTimeInfo timestamps. The time values are - monotonically increasing and have unspecified origin. - + monotonically increasing and have unspecified origin. + Pa_GetStreamTime returns valid time values for the entire life of the stream, from when the stream is opened until it is closed. Starting and stopping the stream does not affect the passage of time returned by Pa_GetStreamTime. - This time may be used for synchronizing other events to the audio stream, for + This time may be used for synchronizing other events to the audio stream, for example synchronizing audio to MIDI. - + @return The stream's current time in seconds, or 0 if an error occurred. @see PaTime, PaStreamCallback, PaStreamCallbackTimeInfo @@ -1110,7 +1110,7 @@ PaTime Pa_GetStreamTime( PaStream *stream ); This function may be called from the stream callback function or the application. - + @return A floating point value, typically between 0.0 and 1.0, where 1.0 indicates that the stream callback is consuming the maximum number of CPU cycles possible @@ -1127,12 +1127,12 @@ double Pa_GetStreamCpuLoad( PaStream* stream ); system to supply the data. @param stream A pointer to an open stream previously created with Pa_OpenStream. - + @param buffer A pointer to a buffer of sample frames. The buffer contains samples in the format specified by the inputParameters->sampleFormat field used to open the stream, and the number of channels specified by inputParameters->numChannels. If non-interleaved samples were requested using - the paNonInterleaved sample format flag, buffer is a pointer to the first element + the paNonInterleaved sample format flag, buffer is a pointer to the first element of an array of buffer pointers, one non-interleaved buffer for each channel. @param frames The number of frames to be read into buffer. This parameter @@ -1158,7 +1158,7 @@ PaError Pa_ReadStream( PaStream* stream, samples in the format specified by the outputParameters->sampleFormat field used to open the stream, and the number of channels specified by outputParameters->numChannels. If non-interleaved samples were requested using - the paNonInterleaved sample format flag, buffer is a pointer to the first element + the paNonInterleaved sample format flag, buffer is a pointer to the first element of an array of buffer pointers, one non-interleaved buffer for each channel. @param frames The number of frames to be written from buffer. This parameter From 20a971df57b55e621665adff6c97dbeeb8bc4c42 Mon Sep 17 00:00:00 2001 From: Ross Bencina Date: Thu, 21 Jan 2021 21:58:54 +1100 Subject: [PATCH 085/164] Clean up whitespace in src/hostapi/{asihpi, jack, oss, skeleton} in preparation for .editorconfig. (#414) * Clean up whitespace in src/hostapi/{asihpi, jack, oss, skeleton} in preparation for .editorconfig. Convert tabs to 4 spaces. Indent by 4 spaces. Strip trailing whitespace. Ensure EOL at EOF. * Additional formatting cleanups. --- src/hostapi/asihpi/pa_linux_asihpi.c | 44 ++++---- src/hostapi/jack/pa_jack.c | 16 +-- src/hostapi/oss/pa_unix_oss.c | 123 ++++++++++----------- src/hostapi/oss/recplay.c | 2 +- src/hostapi/skeleton/pa_hostapi_skeleton.c | 60 +++++----- 5 files changed, 122 insertions(+), 123 deletions(-) diff --git a/src/hostapi/asihpi/pa_linux_asihpi.c b/src/hostapi/asihpi/pa_linux_asihpi.c index f5a5290..79eb1d7 100644 --- a/src/hostapi/asihpi/pa_linux_asihpi.c +++ b/src/hostapi/asihpi/pa_linux_asihpi.c @@ -199,27 +199,27 @@ /* If HPI error occurred */ \ if( UNLIKELY( hpiError ) ) \ { \ - char szError[256]; \ - HPI_GetErrorText( hpiError, szError ); \ - PA_DEBUG(( "HPI error %d occurred: %s\n", hpiError, szError )); \ - /* This message will always be displayed, even if debug info is disabled */ \ + char szError[256]; \ + HPI_GetErrorText( hpiError, szError ); \ + PA_DEBUG(( "HPI error %d occurred: %s\n", hpiError, szError )); \ + /* This message will always be displayed, even if debug info is disabled */ \ PA_DEBUG(( "Expression '" #expr "' failed in '" __FILE__ "', line: " STRINGIZE( __LINE__ ) "\n" )); \ if( (paError) == paUnanticipatedHostError ) \ - { \ - PA_DEBUG(( "Host error description: %s\n", szError )); \ - /* PaUtil_SetLastHostErrorInfo should only be used in the main thread */ \ - if( pthread_equal( pthread_self(), paUnixMainThread ) ) \ + { \ + PA_DEBUG(( "Host error description: %s\n", szError )); \ + /* PaUtil_SetLastHostErrorInfo should only be used in the main thread */ \ + if( pthread_equal( pthread_self(), paUnixMainThread ) ) \ { \ - PaUtil_SetLastHostErrorInfo( paInDevelopment, hpiError, szError ); \ + PaUtil_SetLastHostErrorInfo( paInDevelopment, hpiError, szError ); \ } \ - } \ - /* If paNoError is specified, continue as usual */ \ + } \ + /* If paNoError is specified, continue as usual */ \ /* (useful if you only want to print out the debug messages above) */ \ - if( (paError) < 0 ) \ - { \ - result = (paError); \ - goto error; \ - } \ + if( (paError) < 0 ) \ + { \ + result = (paError); \ + goto error; \ + } \ } \ } while( 0 ); @@ -231,9 +231,9 @@ PA_DEBUG(( "HPI error %d occurred: %s\n", hpiError, szError )); \ /* PaUtil_SetLastHostErrorInfo should only be used in the main thread */ \ if( pthread_equal( pthread_self(), paUnixMainThread ) ) \ - { \ - PaUtil_SetLastHostErrorInfo( paInDevelopment, (hpiErrorCode), szError ); \ - } \ + { \ + PaUtil_SetLastHostErrorInfo( paInDevelopment, (hpiErrorCode), szError ); \ + } \ } while( 0 ); /* Defaults */ @@ -556,7 +556,7 @@ static PaError PaAsiHpi_BuildDeviceList( PaAsiHpiHostApiRepresentation *hpiHostA continue; } hpiError = HPI_AdapterGetInfo( NULL, idx, &outStreams, &inStreams, - &version, &serial, &type ); + &version, &serial, &type ); /* Skip to next device on failure */ if( hpiError ) { @@ -738,7 +738,7 @@ PaError PaAsiHpi_Initialize( PaUtilHostApiRepresentation **hostApi, PaHostApiInd * interface and paNoError */ PA_DEBUG(( "Could not open HPI interface\n" )); - *hostApi = NULL; + *hostApi = NULL; return paNoError; } else @@ -1584,7 +1584,7 @@ static PaError PaAsiHpi_SetupBuffers( PaAsiHpiStreamComponent *streamComp, uint3 /* If BBM not supported, foreground transfers will be used, but not a show-stopper */ /* Anything else is an error */ else if (( hpiError != HPI_ERROR_INVALID_OPERATION ) && - ( hpiError != HPI_ERROR_INVALID_FUNC )) + ( hpiError != HPI_ERROR_INVALID_FUNC )) { PA_ASIHPI_REPORT_ERROR_( hpiError ); result = paUnanticipatedHostError; diff --git a/src/hostapi/jack/pa_jack.c b/src/hostapi/jack/pa_jack.c index 5ec55c6..0dad24f 100644 --- a/src/hostapi/jack/pa_jack.c +++ b/src/hostapi/jack/pa_jack.c @@ -277,10 +277,10 @@ static PaError BlockingTermFIFO( PaUtilRingBuffer *rbuf ) static int BlockingCallback( const void *inputBuffer, void *outputBuffer, - unsigned long framesPerBuffer, - const PaStreamCallbackTimeInfo* timeInfo, - PaStreamCallbackFlags statusFlags, - void *userData ) + unsigned long framesPerBuffer, + const PaStreamCallbackTimeInfo* timeInfo, + PaStreamCallbackFlags statusFlags, + void *userData ) { struct PaJackStream *stream = (PaJackStream *)userData; long numBytes = stream->bytesPerFrame * framesPerBuffer; @@ -918,7 +918,7 @@ static PaError IsFormatSupported( struct PaUtilHostApiRepresentation *hostApi, #define ABS(x) ( (x) > 0 ? (x) : -(x) ) if( ABS(sampleRate - jack_get_sample_rate(((PaJackHostApiRepresentation *) hostApi)->jack_client )) > 1 ) - return paInvalidSampleRate; + return paInvalidSampleRate; #undef ABS return paFormatIsSupported; @@ -1161,7 +1161,7 @@ static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi, #define ABS(x) ( (x) > 0 ? (x) : -(x) ) if( ABS(sampleRate - jackSr) > 1 ) - return paInvalidSampleRate; + return paInvalidSampleRate; #undef ABS UNLESS( stream = (PaJackStream*)PaUtil_AllocateMemory( sizeof(PaJackStream) ), paInsufficientMemory ); @@ -1610,7 +1610,7 @@ static PaError StartStream( PaStream *s ) { int r = jack_connect( stream->jack_client, jack_port_name( stream->remote_output_ports[i] ), jack_port_name( stream->local_input_ports[i] ) ); - UNLESS( 0 == r || EEXIST == r, paUnanticipatedHostError ); + UNLESS( 0 == r || EEXIST == r, paUnanticipatedHostError ); } } @@ -1620,7 +1620,7 @@ static PaError StartStream( PaStream *s ) { int r = jack_connect( stream->jack_client, jack_port_name( stream->local_output_ports[i] ), jack_port_name( stream->remote_input_ports[i] ) ); - UNLESS( 0 == r || EEXIST == r, paUnanticipatedHostError ); + UNLESS( 0 == r || EEXIST == r, paUnanticipatedHostError ); } } diff --git a/src/hostapi/oss/pa_unix_oss.c b/src/hostapi/oss/pa_unix_oss.c index 83ab558..80df4c3 100644 --- a/src/hostapi/oss/pa_unix_oss.c +++ b/src/hostapi/oss/pa_unix_oss.c @@ -537,40 +537,40 @@ static PaError BuildDeviceList( PaOSSHostApiRepresentation *ossApi ) for( i = -1; i < 100; i++ ) { - char deviceName[32]; - PaDeviceInfo *deviceInfo; - int testResult; + char deviceName[32]; + PaDeviceInfo *deviceInfo; + int testResult; - if( i == -1 ) - snprintf(deviceName, sizeof (deviceName), "%s", DEVICE_NAME_BASE); - else - snprintf(deviceName, sizeof (deviceName), "%s%d", DEVICE_NAME_BASE, i); + if( i == -1 ) + snprintf(deviceName, sizeof (deviceName), "%s", DEVICE_NAME_BASE); + else + snprintf(deviceName, sizeof (deviceName), "%s%d", DEVICE_NAME_BASE, i); - /* PA_DEBUG(("%s: trying device %s\n", __FUNCTION__, deviceName )); */ - if( (testResult = QueryDevice( deviceName, ossApi, &deviceInfo )) != paNoError ) - { - if( testResult != paDeviceUnavailable ) - PA_ENSURE( testResult ); + /* PA_DEBUG(("%s: trying device %s\n", __FUNCTION__, deviceName )); */ + if( (testResult = QueryDevice( deviceName, ossApi, &deviceInfo )) != paNoError ) + { + if( testResult != paDeviceUnavailable ) + PA_ENSURE( testResult ); - continue; - } + continue; + } - ++numDevices; - if( !deviceInfos || numDevices > maxDeviceInfos ) - { - maxDeviceInfos *= 2; - PA_UNLESS( deviceInfos = (PaDeviceInfo **) realloc( deviceInfos, maxDeviceInfos * sizeof (PaDeviceInfo *) ), - paInsufficientMemory ); - } - { - int devIdx = numDevices - 1; - deviceInfos[devIdx] = deviceInfo; + ++numDevices; + if( !deviceInfos || numDevices > maxDeviceInfos ) + { + maxDeviceInfos *= 2; + PA_UNLESS( deviceInfos = (PaDeviceInfo **) realloc( deviceInfos, maxDeviceInfos * sizeof (PaDeviceInfo *) ), + paInsufficientMemory ); + } + { + int devIdx = numDevices - 1; + deviceInfos[devIdx] = deviceInfo; - if( commonApi->info.defaultInputDevice == paNoDevice && deviceInfo->maxInputChannels > 0 ) - commonApi->info.defaultInputDevice = devIdx; - if( commonApi->info.defaultOutputDevice == paNoDevice && deviceInfo->maxOutputChannels > 0 ) - commonApi->info.defaultOutputDevice = devIdx; - } + if( commonApi->info.defaultInputDevice == paNoDevice && deviceInfo->maxInputChannels > 0 ) + commonApi->info.defaultInputDevice = devIdx; + if( commonApi->info.defaultOutputDevice == paNoDevice && deviceInfo->maxOutputChannels > 0 ) + commonApi->info.defaultOutputDevice = devIdx; + } } /* Make an array of PaDeviceInfo pointers out of the linked list */ @@ -670,14 +670,14 @@ static PaError IsFormatSupported( struct PaUtilHostApiRepresentation *hostApi, /* if full duplex, make sure that they're the same device */ if (inputChannelCount > 0 && outputChannelCount > 0 && - inputParameters->device != outputParameters->device) + inputParameters->device != outputParameters->device) return paInvalidDevice; /* if full duplex, also make sure that they're the same number of channels */ if (inputChannelCount > 0 && outputChannelCount > 0 && - inputChannelCount != outputChannelCount) - return paInvalidChannelCount; + inputChannelCount != outputChannelCount) + return paInvalidChannelCount; /* open the device so we can do more tests */ @@ -699,11 +699,11 @@ static PaError IsFormatSupported( struct PaUtilHostApiRepresentation *hostApi, flags = O_NONBLOCK; if (inputChannelCount > 0 && outputChannelCount > 0) - flags |= O_RDWR; + flags |= O_RDWR; else if (inputChannelCount > 0) - flags |= O_RDONLY; + flags |= O_RDONLY; else - flags |= O_WRONLY; + flags |= O_WRONLY; ENSURE_( tempDevHandle = open( deviceInfo->name, flags ), paDeviceUnavailable ); @@ -712,7 +712,7 @@ static PaError IsFormatSupported( struct PaUtilHostApiRepresentation *hostApi, /* everything succeeded! */ - error: +error: if( tempDevHandle >= 0 ) close( tempDevHandle ); @@ -734,8 +734,7 @@ static PaError ValidateParameters( const PaStreamParameters *parameters, const P return paInvalidDevice; } - maxChans = (mode == StreamMode_In ? deviceInfo->maxInputChannels : - deviceInfo->maxOutputChannels); + maxChans = (mode == StreamMode_In ? deviceInfo->maxInputChannels : deviceInfo->maxOutputChannels); if( parameters->channelCount > maxChans ) { return paInvalidChannelCount; @@ -1617,7 +1616,7 @@ static void *PaOSS_AudioThreadProc( void *userData ) assert( stream ); - pthread_cleanup_push( &OnExit, stream ); /* Execute OnExit when exiting */ + pthread_cleanup_push( &OnExit, stream ); /* Execute OnExit when exiting */ /* The first time the stream is started we use SNDCTL_DSP_TRIGGER to accurately start capture and * playback in sync, when the stream is restarted after being stopped we simply start by reading/ @@ -1948,19 +1947,19 @@ static PaError ReadStream( PaStream* s, { framesRequested = PA_MIN( frames, stream->capture->hostFrames ); - bytesRequested = framesRequested * PaOssStreamComponent_FrameSize( stream->capture ); - ENSURE_( (bytesRead = read( stream->capture->fd, stream->capture->buffer, bytesRequested )), - paUnanticipatedHostError ); - if ( bytesRequested != bytesRead ) - { - PA_DEBUG(( "Requested %d bytes, read %d\n", bytesRequested, bytesRead )); - return paUnanticipatedHostError; - } + bytesRequested = framesRequested * PaOssStreamComponent_FrameSize( stream->capture ); + ENSURE_( (bytesRead = read( stream->capture->fd, stream->capture->buffer, bytesRequested )), + paUnanticipatedHostError ); + if ( bytesRequested != bytesRead ) + { + PA_DEBUG(( "Requested %d bytes, read %d\n", bytesRequested, bytesRead )); + return paUnanticipatedHostError; + } - PaUtil_SetInputFrameCount( &stream->bufferProcessor, stream->capture->hostFrames ); - PaUtil_SetInterleavedInputChannels( &stream->bufferProcessor, 0, stream->capture->buffer, stream->capture->hostChannelCount ); + PaUtil_SetInputFrameCount( &stream->bufferProcessor, stream->capture->hostFrames ); + PaUtil_SetInterleavedInputChannels( &stream->bufferProcessor, 0, stream->capture->buffer, stream->capture->hostChannelCount ); PaUtil_CopyInput( &stream->bufferProcessor, &userBuffer, framesRequested ); - frames -= framesRequested; + frames -= framesRequested; } error: @@ -1989,21 +1988,21 @@ static PaError WriteStream( PaStream *s, const void *buffer, unsigned long frame while( frames ) { - PaUtil_SetOutputFrameCount( &stream->bufferProcessor, stream->playback->hostFrames ); - PaUtil_SetInterleavedOutputChannels( &stream->bufferProcessor, 0, stream->playback->buffer, stream->playback->hostChannelCount ); + PaUtil_SetOutputFrameCount( &stream->bufferProcessor, stream->playback->hostFrames ); + PaUtil_SetInterleavedOutputChannels( &stream->bufferProcessor, 0, stream->playback->buffer, stream->playback->hostChannelCount ); - framesConverted = PaUtil_CopyOutput( &stream->bufferProcessor, &userBuffer, frames ); - frames -= framesConverted; + framesConverted = PaUtil_CopyOutput( &stream->bufferProcessor, &userBuffer, frames ); + frames -= framesConverted; - bytesRequested = framesConverted * PaOssStreamComponent_FrameSize( stream->playback ); - ENSURE_( (bytesWritten = write( stream->playback->fd, stream->playback->buffer, bytesRequested )), - paUnanticipatedHostError ); + bytesRequested = framesConverted * PaOssStreamComponent_FrameSize( stream->playback ); + ENSURE_( (bytesWritten = write( stream->playback->fd, stream->playback->buffer, bytesRequested )), + paUnanticipatedHostError ); - if ( bytesRequested != bytesWritten ) - { - PA_DEBUG(( "Requested %d bytes, wrote %d\n", bytesRequested, bytesWritten )); - return paUnanticipatedHostError; - } + if ( bytesRequested != bytesWritten ) + { + PA_DEBUG(( "Requested %d bytes, wrote %d\n", bytesRequested, bytesWritten )); + return paUnanticipatedHostError; + } } error: diff --git a/src/hostapi/oss/recplay.c b/src/hostapi/oss/recplay.c index 9d4c78c..fe6dfdb 100644 --- a/src/hostapi/oss/recplay.c +++ b/src/hostapi/oss/recplay.c @@ -2,7 +2,7 @@ * recplay.c * Phil Burk * Minimal record and playback test. - * + * */ #include #include diff --git a/src/hostapi/skeleton/pa_hostapi_skeleton.c b/src/hostapi/skeleton/pa_hostapi_skeleton.c index cc31435..716ca7f 100644 --- a/src/hostapi/skeleton/pa_hostapi_skeleton.c +++ b/src/hostapi/skeleton/pa_hostapi_skeleton.c @@ -28,13 +28,13 @@ */ /* - * The text above constitutes the entire PortAudio license; however, + * The text above constitutes the entire PortAudio license; however, * the PortAudio community also makes the following non-binding requests: * * 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. It is also - * requested that these non-binding requests be included along with the + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the * license above. */ @@ -152,10 +152,10 @@ PaError PaSkeleton_Initialize( PaUtilHostApiRepresentation **hostApi, PaHostApiI (*hostApi)->info.defaultInputDevice = paNoDevice; /* IMPLEMENT ME */ (*hostApi)->info.defaultOutputDevice = paNoDevice; /* IMPLEMENT ME */ - (*hostApi)->info.deviceCount = 0; + (*hostApi)->info.deviceCount = 0; deviceCount = 0; /* IMPLEMENT ME */ - + if( deviceCount > 0 ) { (*hostApi)->deviceInfos = (PaDeviceInfo**)PaUtil_GroupAllocateMemory( @@ -193,14 +193,14 @@ PaError PaSkeleton_Initialize( PaUtilHostApiRepresentation **hostApi, PaHostApiI deviceInfo->maxInputChannels = 0; /* IMPLEMENT ME */ deviceInfo->maxOutputChannels = 0; /* IMPLEMENT ME */ - + deviceInfo->defaultLowInputLatency = 0.; /* IMPLEMENT ME */ deviceInfo->defaultLowOutputLatency = 0.; /* IMPLEMENT ME */ deviceInfo->defaultHighInputLatency = 0.; /* IMPLEMENT ME */ - deviceInfo->defaultHighOutputLatency = 0.; /* IMPLEMENT ME */ + deviceInfo->defaultHighOutputLatency = 0.; /* IMPLEMENT ME */ deviceInfo->defaultSampleRate = 0.; /* IMPLEMENT ME */ - + (*hostApi)->deviceInfos[i] = deviceInfo; ++(*hostApi)->info.deviceCount; } @@ -231,7 +231,7 @@ error: PaUtil_FreeAllAllocations( skeletonHostApi->allocations ); PaUtil_DestroyAllocationGroup( skeletonHostApi->allocations ); } - + PaUtil_FreeMemory( skeletonHostApi ); } return result; @@ -264,7 +264,7 @@ static PaError IsFormatSupported( struct PaUtilHostApiRepresentation *hostApi, { int inputChannelCount, outputChannelCount; PaSampleFormat inputSampleFormat, outputSampleFormat; - + if( inputParameters ) { inputChannelCount = inputParameters->channelCount; @@ -274,7 +274,7 @@ static PaError IsFormatSupported( struct PaUtilHostApiRepresentation *hostApi, this implementation doesn't support any custom sample formats */ if( inputSampleFormat & paCustomFormat ) return paSampleFormatNotSupported; - + /* unless alternate device specification is supported, reject the use of paUseHostApiSpecificDeviceSpecification */ @@ -303,7 +303,7 @@ static PaError IsFormatSupported( struct PaUtilHostApiRepresentation *hostApi, this implementation doesn't support any custom sample formats */ if( outputSampleFormat & paCustomFormat ) return paSampleFormatNotSupported; - + /* unless alternate device specification is supported, reject the use of paUseHostApiSpecificDeviceSpecification */ @@ -322,7 +322,7 @@ static PaError IsFormatSupported( struct PaUtilHostApiRepresentation *hostApi, { outputChannelCount = 0; } - + /* IMPLEMENT ME: @@ -420,7 +420,7 @@ static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi, { outputChannelCount = outputParameters->channelCount; outputSampleFormat = outputParameters->sampleFormat; - + /* unless alternate device specification is supported, reject the use of paUseHostApiSpecificDeviceSpecification */ @@ -499,10 +499,10 @@ static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi, /* we assume a fixed host buffer size in this example, but the buffer processor - can also support bounded and unknown host buffer sizes by passing + can also support bounded and unknown host buffer sizes by passing paUtilBoundedHostBufferSize or paUtilUnknownHostBufferSize instead of paUtilFixedHostBufferSize below. */ - + result = PaUtil_InitializeBufferProcessor( &stream->bufferProcessor, inputChannelCount, inputSampleFormat, hostInputSampleFormat, outputChannelCount, outputSampleFormat, hostOutputSampleFormat, @@ -523,7 +523,7 @@ static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi, (PaTime)PaUtil_GetBufferProcessorOutputLatencyFrames(&stream->bufferProcessor) / sampleRate; /* outputLatency is specified in _seconds_ */ stream->streamRepresentation.streamInfo.sampleRate = sampleRate; - + /* IMPLEMENT ME: - additional stream setup + opening @@ -545,7 +545,7 @@ error: /* ExampleHostProcessingLoop() illustrates the kind of processing which may occur in a host implementation. - + */ static void ExampleHostProcessingLoop( void *inputBuffer, void *outputBuffer, void *userData ) { @@ -553,9 +553,9 @@ static void ExampleHostProcessingLoop( void *inputBuffer, void *outputBuffer, vo PaStreamCallbackTimeInfo timeInfo = {0,0,0}; /* IMPLEMENT ME */ int callbackResult; unsigned long framesProcessed; - + PaUtil_BeginCpuLoadMeasurement( &stream->cpuLoadMeasurer ); - + /* IMPLEMENT ME: - generate timing information @@ -576,7 +576,7 @@ static void ExampleHostProcessingLoop( void *inputBuffer, void *outputBuffer, vo or a mixture, you will want to call PaUtil_SetInterleaved*Channels(), PaUtil_SetNonInterleaved*Channel() or PaUtil_Set*Channel() here. */ - + PaUtil_SetInputFrameCount( &stream->bufferProcessor, 0 /* default to host buffer size */ ); PaUtil_SetInterleavedInputChannels( &stream->bufferProcessor, 0, /* first channel of inputBuffer is channel 0 */ @@ -598,7 +598,7 @@ static void ExampleHostProcessingLoop( void *inputBuffer, void *outputBuffer, vo callbackResult = paContinue; framesProcessed = PaUtil_EndBufferProcessing( &stream->bufferProcessor, &callbackResult ); - + /* If you need to byte swap or shift outputBuffer to convert it to host format, do it here. @@ -694,7 +694,7 @@ static PaError AbortStream( PaStream *s ) /* suppress unused variable warnings */ (void) stream; - + /* IMPLEMENT ME, see portaudio.h for required behavior */ return result; @@ -707,7 +707,7 @@ static PaError IsStreamStopped( PaStream *s ) /* suppress unused variable warnings */ (void) stream; - + /* IMPLEMENT ME, see portaudio.h for required behavior */ return 0; @@ -720,7 +720,7 @@ static PaError IsStreamActive( PaStream *s ) /* suppress unused variable warnings */ (void) stream; - + /* IMPLEMENT ME, see portaudio.h for required behavior */ return 0; @@ -733,7 +733,7 @@ static PaTime GetStreamTime( PaStream *s ) /* suppress unused variable warnings */ (void) stream; - + /* IMPLEMENT ME, see portaudio.h for required behavior*/ return 0; @@ -764,7 +764,7 @@ static PaError ReadStream( PaStream* s, (void) buffer; (void) frames; (void) stream; - + /* IMPLEMENT ME, see portaudio.h for required behavior*/ return paNoError; @@ -781,7 +781,7 @@ static PaError WriteStream( PaStream* s, (void) buffer; (void) frames; (void) stream; - + /* IMPLEMENT ME, see portaudio.h for required behavior*/ return paNoError; @@ -794,7 +794,7 @@ static signed long GetStreamReadAvailable( PaStream* s ) /* suppress unused variable warnings */ (void) stream; - + /* IMPLEMENT ME, see portaudio.h for required behavior*/ return 0; @@ -807,7 +807,7 @@ static signed long GetStreamWriteAvailable( PaStream* s ) /* suppress unused variable warnings */ (void) stream; - + /* IMPLEMENT ME, see portaudio.h for required behavior*/ return 0; From 80c5f2712075f6cc361b32566a74c99449b5def6 Mon Sep 17 00:00:00 2001 From: Etienne Dechamps Date: Thu, 21 Jan 2021 11:16:44 +0000 Subject: [PATCH 086/164] Ignore the Visual Studio CMake settings file. (#422) When using CMake, this file is written by Visual Studio to hold custom CMake parameters. --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index 8efca60..9b787f9 100644 --- a/.gitignore +++ b/.gitignore @@ -46,3 +46,6 @@ portaudio-2.0.pc # Visual Studio CMake build output folder out/ + +# Visual Studio CMake settings file +CMakeSettings.json From f476839ab8ab8523fdecaf087984c51d9a3746f7 Mon Sep 17 00:00:00 2001 From: Ross Bencina Date: Thu, 21 Jan 2021 22:17:17 +1100 Subject: [PATCH 087/164] Clean up whitespace in pa_asio.cpp in preparation for .editorconfig. Convert tabs to 4 spaces. Indent by 4 spaces. Strip trailing whitespace. Ensure EOL at EOF. (#411) --- src/hostapi/asio/pa_asio.cpp | 342 +++++++++++++++++------------------ 1 file changed, 171 insertions(+), 171 deletions(-) diff --git a/src/hostapi/asio/pa_asio.cpp b/src/hostapi/asio/pa_asio.cpp index c9ca786..ffb77ef 100644 --- a/src/hostapi/asio/pa_asio.cpp +++ b/src/hostapi/asio/pa_asio.cpp @@ -29,13 +29,13 @@ */ /* - * The text above constitutes the entire PortAudio license; however, + * The text above constitutes the entire PortAudio license; however, * the PortAudio community also makes the following non-binding requests: * * 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. It is also - * requested that these non-binding requests be included along with the + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the * license above. */ @@ -142,8 +142,8 @@ /* external reference to ASIO SDK's asioDrivers. - This is a bit messy because we want to explicitly manage - allocation/deallocation of this structure, but some layers of the SDK + This is a bit messy because we want to explicitly manage + allocation/deallocation of this structure, but some layers of the SDK which we currently use (eg the implementation in asio.cpp) still use this global version. @@ -295,7 +295,7 @@ typedef struct AsioDrivers *asioDrivers; void *systemSpecific; - + /* the ASIO C API only allows one ASIO driver to be open at a time, so we keep track of whether we have the driver open here, and use this information to return errors from OpenStream if the @@ -942,7 +942,7 @@ PaError PaAsio_GetAvailableBufferSizes( PaDeviceIndex device, */ static void UnloadAsioDriver( void ) { - ASIOExit(); + ASIOExit(); } /* @@ -1005,9 +1005,9 @@ static PaError LoadAsioDriver( PaAsioHostApiRepresentation *asioHostApi, const c error: if( asioIsInitialized ) - { - ASIOExit(); - } + { + ASIOExit(); + } return result; } @@ -1019,7 +1019,7 @@ static ASIOSampleRate defaultSampleRateSearchOrder_[] 192000.0, 16000.0, 12000.0, 11025.0, 9600.0, 8000.0 }; -static PaError InitPaDeviceInfoFromAsioDriver( PaAsioHostApiRepresentation *asioHostApi, +static PaError InitPaDeviceInfoFromAsioDriver( PaAsioHostApiRepresentation *asioHostApi, const char *driverName, int driverIndex, PaDeviceInfo *deviceInfo, PaAsioDeviceInfo *asioDeviceInfo ) { @@ -1083,11 +1083,11 @@ static PaError InitPaDeviceInfoFromAsioDriver( PaAsioHostApiRepresentation *asio paAsioDriver.info.bufferMaxSize / deviceInfo->defaultSampleRate; if( defaultHighLatency < defaultLowLatency ) - defaultHighLatency = defaultLowLatency; /* just in case the driver returns something strange */ - + defaultHighLatency = defaultLowLatency; /* just in case the driver returns something strange */ + deviceInfo->defaultHighInputLatency = defaultHighLatency; deviceInfo->defaultHighOutputLatency = defaultHighLatency; - + }else{ deviceInfo->defaultLowInputLatency = 0.; @@ -1192,7 +1192,7 @@ PaError PaAsio_Initialize( PaUtilHostApiRepresentation **hostApi, PaHostApiIndex There used to be code that initialized COM in other situations such as when creating a Stream. This made PA work when calling Pa_CreateStream - from a non-main thread. However we currently consider initialization + from a non-main thread. However we currently consider initialization of COM in non-main threads to be the caller's responsibility. */ result = PaWinUtil_CoInitialize( paASIO, &asioHostApi->comInitializationResult ); @@ -1214,7 +1214,7 @@ PaError PaAsio_Initialize( PaUtilHostApiRepresentation **hostApi, PaHostApiIndex try { asioHostApi->asioDrivers = new AsioDrivers(); /* invokes CoInitialize(0) in AsioDriverList::AsioDriverList */ - } + } catch (std::bad_alloc) { asioHostApi->asioDrivers = 0; @@ -1291,7 +1291,7 @@ PaError PaAsio_Initialize( PaUtilHostApiRepresentation **hostApi, PaHostApiIndex // we face fact that some drivers were not meant for it, drivers which act // like shells on top of REAL drivers, for instance. // so we get duplicate handles, locks and other problems. - // so lets NOT try to load any such wrappers. + // so lets NOT try to load any such wrappers. // The ones i [davidv] know of so far are: if ( strcmp (names[i],"ASIO DirectX Full Duplex Driver") == 0 @@ -1305,16 +1305,16 @@ PaError PaAsio_Initialize( PaUtilHostApiRepresentation **hostApi, PaHostApiIndex } - if( IsDebuggerPresent_ && IsDebuggerPresent_() ) + if( IsDebuggerPresent_ && IsDebuggerPresent_() ) { /* ASIO Digidesign Driver uses PACE copy protection which quits out if a debugger is running. So we don't load it if a debugger is running. */ - if( strcmp(names[i], "ASIO Digidesign Driver") == 0 ) + if( strcmp(names[i], "ASIO Digidesign Driver") == 0 ) { - PA_DEBUG(("BLACKLISTED!!! ASIO Digidesign Driver would quit the debugger\n")); + PA_DEBUG(("BLACKLISTED!!! ASIO Digidesign Driver would quit the debugger\n")); continue; - } - } + } + } /* Attempt to init device info from the asio driver... */ @@ -1332,8 +1332,8 @@ PaError PaAsio_Initialize( PaUtilHostApiRepresentation **hostApi, PaHostApiIndex (*hostApi)->deviceInfos[ (*hostApi)->info.deviceCount ] = deviceInfo; ++(*hostApi)->info.deviceCount; } - else - { + else + { PA_DEBUG(("Skipping ASIO device:%s\n",names[i])); continue; } @@ -1425,9 +1425,9 @@ static PaError IsFormatSupported( struct PaUtilHostApiRepresentation *hostApi, PaAsioDriverInfo *driverInfo = &asioHostApi->openAsioDriverInfo; int inputChannelCount, outputChannelCount; PaSampleFormat inputSampleFormat, outputSampleFormat; - PaDeviceIndex asioDeviceIndex; + PaDeviceIndex asioDeviceIndex; ASIOError asioError; - + if( inputParameters && outputParameters ) { /* full duplex ASIO stream must use the same device for input and output */ @@ -1435,7 +1435,7 @@ static PaError IsFormatSupported( struct PaUtilHostApiRepresentation *hostApi, if( inputParameters->device != outputParameters->device ) return paBadIODeviceCombination; } - + if( inputParameters ) { inputChannelCount = inputParameters->channelCount; @@ -1445,7 +1445,7 @@ static PaError IsFormatSupported( struct PaUtilHostApiRepresentation *hostApi, this implementation doesn't support any custom sample formats */ if( inputSampleFormat & paCustomFormat ) return paSampleFormatNotSupported; - + /* unless alternate device specification is supported, reject the use of paUseHostApiSpecificDeviceSpecification */ @@ -1473,7 +1473,7 @@ static PaError IsFormatSupported( struct PaUtilHostApiRepresentation *hostApi, this implementation doesn't support any custom sample formats */ if( outputSampleFormat & paCustomFormat ) return paSampleFormatNotSupported; - + /* unless alternate device specification is supported, reject the use of paUseHostApiSpecificDeviceSpecification */ @@ -1496,7 +1496,7 @@ static PaError IsFormatSupported( struct PaUtilHostApiRepresentation *hostApi, /* if an ASIO device is open we can only get format information for the currently open device */ - if( asioHostApi->openAsioDeviceIndex != paNoDevice + if( asioHostApi->openAsioDeviceIndex != paNoDevice && asioHostApi->openAsioDeviceIndex != asioDeviceIndex ) { return paDeviceUnavailable; @@ -1534,7 +1534,7 @@ static PaError IsFormatSupported( struct PaUtilHostApiRepresentation *hostApi, goto done; } } - + /* query for sample rate support */ asioError = ASIOCanSampleRate( sampleRate ); if( asioError == ASE_NoClock || asioError == ASE_NotPresent ) @@ -1659,9 +1659,9 @@ static void ZeroOutputBuffers( PaAsioStream *stream, long index ) } -/* return the next power of two >= x. - Returns the input parameter if it is already a power of two. - http://stackoverflow.com/questions/364985/algorithm-for-finding-the-smallest-power-of-two-thats-greater-or-equal-to-a-giv +/* return the next power of two >= x. + Returns the input parameter if it is already a power of two. + http://stackoverflow.com/questions/364985/algorithm-for-finding-the-smallest-power-of-two-thats-greater-or-equal-to-a-giv */ static unsigned long NextPowerOfTwo( unsigned long x ) { @@ -1671,8 +1671,8 @@ static unsigned long NextPowerOfTwo( unsigned long x ) x |= x >> 4; x |= x >> 8; x |= x >> 16; - /* If you needed to deal with numbers > 2^32 the following would be needed. - For latencies, we don't deal with values this large. + /* If you needed to deal with numbers > 2^32 the following would be needed. + For latencies, we don't deal with values this large. x |= x >> 16; */ @@ -1680,16 +1680,16 @@ static unsigned long NextPowerOfTwo( unsigned long x ) } -static unsigned long SelectHostBufferSizeForUnspecifiedUserFramesPerBuffer( +static unsigned long SelectHostBufferSizeForUnspecifiedUserFramesPerBuffer( unsigned long targetBufferingLatencyFrames, PaAsioDriverInfo *driverInfo ) { - /* Choose a host buffer size based only on targetBufferingLatencyFrames and the - device's supported buffer sizes. Always returns a valid value. - */ + /* Choose a host buffer size based only on targetBufferingLatencyFrames and the + device's supported buffer sizes. Always returns a valid value. + */ - unsigned long result; + unsigned long result; - if( targetBufferingLatencyFrames <= (unsigned long)driverInfo->bufferMinSize ) + if( targetBufferingLatencyFrames <= (unsigned long)driverInfo->bufferMinSize ) { result = driverInfo->bufferMinSize; } @@ -1699,18 +1699,18 @@ static unsigned long SelectHostBufferSizeForUnspecifiedUserFramesPerBuffer( } else { - if( driverInfo->bufferGranularity == 0 ) /* single fixed host buffer size */ + if( driverInfo->bufferGranularity == 0 ) /* single fixed host buffer size */ { - /* The documentation states that bufferGranularity should be zero - when bufferMinSize, bufferMaxSize and bufferPreferredSize are the + /* The documentation states that bufferGranularity should be zero + when bufferMinSize, bufferMaxSize and bufferPreferredSize are the same. We assume that is the case. */ result = driverInfo->bufferPreferredSize; } - else if( driverInfo->bufferGranularity == -1 ) /* power-of-two */ + else if( driverInfo->bufferGranularity == -1 ) /* power-of-two */ { - /* We assume bufferMinSize and bufferMaxSize are powers of two. */ + /* We assume bufferMinSize and bufferMaxSize are powers of two. */ result = NextPowerOfTwo( targetBufferingLatencyFrames ); @@ -1723,9 +1723,9 @@ static unsigned long SelectHostBufferSizeForUnspecifiedUserFramesPerBuffer( else /* modulo bufferGranularity */ { /* round up to the next multiple of granularity */ - unsigned long n = (targetBufferingLatencyFrames + driverInfo->bufferGranularity - 1) + unsigned long n = (targetBufferingLatencyFrames + driverInfo->bufferGranularity - 1) / driverInfo->bufferGranularity; - + result = n * driverInfo->bufferGranularity; if( result < (unsigned long)driverInfo->bufferMinSize ) @@ -1736,137 +1736,137 @@ static unsigned long SelectHostBufferSizeForUnspecifiedUserFramesPerBuffer( } } - return result; + return result; } -static unsigned long SelectHostBufferSizeForSpecifiedUserFramesPerBuffer( +static unsigned long SelectHostBufferSizeForSpecifiedUserFramesPerBuffer( unsigned long targetBufferingLatencyFrames, unsigned long userFramesPerBuffer, PaAsioDriverInfo *driverInfo ) { - /* Select a host buffer size conforming to targetBufferingLatencyFrames - and the device's supported buffer sizes. - The return value will always be a multiple of userFramesPerBuffer. - If a valid buffer size can not be found the function returns 0. + /* Select a host buffer size conforming to targetBufferingLatencyFrames + and the device's supported buffer sizes. + The return value will always be a multiple of userFramesPerBuffer. + If a valid buffer size can not be found the function returns 0. - The current implementation uses a simple iterative search for clarity. - Feel free to suggest a closed form solution. - */ - unsigned long result = 0; + The current implementation uses a simple iterative search for clarity. + Feel free to suggest a closed form solution. + */ + unsigned long result = 0; - assert( userFramesPerBuffer != 0 ); - - if( driverInfo->bufferGranularity == 0 ) /* single fixed host buffer size */ + assert( userFramesPerBuffer != 0 ); + + if( driverInfo->bufferGranularity == 0 ) /* single fixed host buffer size */ { - /* The documentation states that bufferGranularity should be zero - when bufferMinSize, bufferMaxSize and bufferPreferredSize are the + /* The documentation states that bufferGranularity should be zero + when bufferMinSize, bufferMaxSize and bufferPreferredSize are the same. We assume that is the case. */ - if( (driverInfo->bufferPreferredSize % userFramesPerBuffer) == 0 ) - result = driverInfo->bufferPreferredSize; + if( (driverInfo->bufferPreferredSize % userFramesPerBuffer) == 0 ) + result = driverInfo->bufferPreferredSize; } - else if( driverInfo->bufferGranularity == -1 ) /* power-of-two */ + else if( driverInfo->bufferGranularity == -1 ) /* power-of-two */ { - /* We assume bufferMinSize and bufferMaxSize are powers of two. */ + /* We assume bufferMinSize and bufferMaxSize are powers of two. */ - /* Search all powers of two in the range [bufferMinSize,bufferMaxSize] + /* Search all powers of two in the range [bufferMinSize,bufferMaxSize] for multiples of userFramesPerBuffer. We prefer the first multiple - that is equal or greater than targetBufferingLatencyFrames, or - failing that, the largest multiple less than + that is equal or greater than targetBufferingLatencyFrames, or + failing that, the largest multiple less than targetBufferingLatencyFrames. */ - unsigned long x = (unsigned long)driverInfo->bufferMinSize; - do { - if( (x % userFramesPerBuffer) == 0 ) - { + unsigned long x = (unsigned long)driverInfo->bufferMinSize; + do { + if( (x % userFramesPerBuffer) == 0 ) + { /* any multiple of userFramesPerBuffer is acceptable */ - result = x; - if( result >= targetBufferingLatencyFrames ) - break; /* stop. a value >= to targetBufferingLatencyFrames is ideal. */ - } + result = x; + if( result >= targetBufferingLatencyFrames ) + break; /* stop. a value >= to targetBufferingLatencyFrames is ideal. */ + } - x *= 2; - } while( x <= (unsigned long)driverInfo->bufferMaxSize ); + x *= 2; + } while( x <= (unsigned long)driverInfo->bufferMaxSize ); } else /* modulo granularity */ { - /* We assume bufferMinSize is a multiple of bufferGranularity. */ + /* We assume bufferMinSize is a multiple of bufferGranularity. */ - /* Search all multiples of bufferGranularity in the range - [bufferMinSize,bufferMaxSize] for multiples of userFramesPerBuffer. - We prefer the first multiple that is equal or greater than - targetBufferingLatencyFrames, or failing that, the largest multiple + /* Search all multiples of bufferGranularity in the range + [bufferMinSize,bufferMaxSize] for multiples of userFramesPerBuffer. + We prefer the first multiple that is equal or greater than + targetBufferingLatencyFrames, or failing that, the largest multiple less than targetBufferingLatencyFrames. */ - unsigned long x = (unsigned long)driverInfo->bufferMinSize; - do { - if( (x % userFramesPerBuffer) == 0 ) - { + unsigned long x = (unsigned long)driverInfo->bufferMinSize; + do { + if( (x % userFramesPerBuffer) == 0 ) + { /* any multiple of userFramesPerBuffer is acceptable */ - result = x; - if( result >= targetBufferingLatencyFrames ) - break; /* stop. a value >= to targetBufferingLatencyFrames is ideal. */ - } + result = x; + if( result >= targetBufferingLatencyFrames ) + break; /* stop. a value >= to targetBufferingLatencyFrames is ideal. */ + } - x += driverInfo->bufferGranularity; - } while( x <= (unsigned long)driverInfo->bufferMaxSize ); + x += driverInfo->bufferGranularity; + } while( x <= (unsigned long)driverInfo->bufferMaxSize ); } - return result; + return result; } -static unsigned long SelectHostBufferSize( - unsigned long targetBufferingLatencyFrames, +static unsigned long SelectHostBufferSize( + unsigned long targetBufferingLatencyFrames, unsigned long userFramesPerBuffer, PaAsioDriverInfo *driverInfo ) { unsigned long result = 0; - /* We select a host buffer size based on the following requirements + /* We select a host buffer size based on the following requirements (in priority order): - 1. The host buffer size must be permissible according to the ASIO - driverInfo buffer size constraints (min, max, granularity or + 1. The host buffer size must be permissible according to the ASIO + driverInfo buffer size constraints (min, max, granularity or powers-of-two). - 2. If the user specifies a non-zero framesPerBuffer parameter - (userFramesPerBuffer here) the host buffer should be a multiple of + 2. If the user specifies a non-zero framesPerBuffer parameter + (userFramesPerBuffer here) the host buffer should be a multiple of this (subject to the constraints in (1) above). - [NOTE: Where no permissible host buffer size is a multiple of - userFramesPerBuffer, we choose a value as if userFramesPerBuffer were - zero (i.e. we ignore it). This strategy is open for review ~ perhaps - there are still "more optimal" buffer sizes related to + [NOTE: Where no permissible host buffer size is a multiple of + userFramesPerBuffer, we choose a value as if userFramesPerBuffer were + zero (i.e. we ignore it). This strategy is open for review ~ perhaps + there are still "more optimal" buffer sizes related to userFramesPerBuffer that we could use.] - 3. The host buffer size should be greater than or equal to - targetBufferingLatencyFrames, subject to (1) and (2) above. Where it - is not possible to select a host buffer size equal or greater than - targetBufferingLatencyFrames, the highest buffer size conforming to + 3. The host buffer size should be greater than or equal to + targetBufferingLatencyFrames, subject to (1) and (2) above. Where it + is not possible to select a host buffer size equal or greater than + targetBufferingLatencyFrames, the highest buffer size conforming to (1) and (2) should be chosen. */ - if( userFramesPerBuffer != 0 ) - { - /* userFramesPerBuffer is specified, try to find a buffer size that's + if( userFramesPerBuffer != 0 ) + { + /* userFramesPerBuffer is specified, try to find a buffer size that's a multiple of it */ - result = SelectHostBufferSizeForSpecifiedUserFramesPerBuffer( + result = SelectHostBufferSizeForSpecifiedUserFramesPerBuffer( targetBufferingLatencyFrames, userFramesPerBuffer, driverInfo ); - } + } - if( result == 0 ) - { - /* either userFramesPerBuffer was not specified, or we couldn't find a - host buffer size that is a multiple of it. Select a host buffer size - according to targetBufferingLatencyFrames and the ASIO driverInfo + if( result == 0 ) + { + /* either userFramesPerBuffer was not specified, or we couldn't find a + host buffer size that is a multiple of it. Select a host buffer size + according to targetBufferingLatencyFrames and the ASIO driverInfo buffer size constraints. - */ - result = SelectHostBufferSizeForUnspecifiedUserFramesPerBuffer( + */ + result = SelectHostBufferSizeForUnspecifiedUserFramesPerBuffer( targetBufferingLatencyFrames, driverInfo ); - } + } - return result; + return result; } @@ -1893,10 +1893,10 @@ static PaError ValidateAsioSpecificStreamInfo( return paIncompatibleHostApiSpecificStreamInfo; for( int i=0; i < streamParameters->channelCount; ++i ){ - if( (*channelSelectors)[i] < 0 + if( (*channelSelectors)[i] < 0 || (*channelSelectors)[i] >= deviceChannelCount ){ return paInvalidChannelCount; - } + } } } @@ -1914,7 +1914,7 @@ static bool IsUsingExternalClockSource() /* davidv: listing ASIO Clock sources. there is an ongoing investigation by me about whether or not to call ASIOSetSampleRate if an external Clock is used. A few drivers expected different things here */ - + asioError = ASIOGetClockSources(clocks, &numSources); if( asioError != ASE_OK ){ PA_DEBUG(("ERROR: ASIOGetClockSources: %s\n", PaAsio_GetAsioErrorText(asioError) )); @@ -1922,7 +1922,7 @@ static bool IsUsingExternalClockSource() PA_DEBUG(("INFO ASIOGetClockSources listing %d clocks\n", numSources )); for (int i=0;ichannelNum = i; } - + info->buffers[0] = info->buffers[1] = 0; } @@ -2273,14 +2273,14 @@ static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi, else /* Using callback interface... */ { /* Select the host buffer size based on user framesPerBuffer and the - maximum of suggestedInputLatencyFrames and + maximum of suggestedInputLatencyFrames and suggestedOutputLatencyFrames. - We should subtract any fixed known driver latency from + We should subtract any fixed known driver latency from suggestedLatencyFrames before computing the host buffer size. - However, the ASIO API doesn't provide a method for determining fixed - latencies independent of the host buffer size. ASIOGetLatencies() - only returns latencies after the buffer size has been configured, so + However, the ASIO API doesn't provide a method for determining fixed + latencies independent of the host buffer size. ASIOGetLatencies() + only returns latencies after the buffer size has been configured, so we can't reliably use it to determine fixed latencies here. We could set the preferred buffer size and then subtract it from @@ -2288,12 +2288,12 @@ static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi, reliable, so we don't do it. */ - unsigned long targetBufferingLatencyFrames = + unsigned long targetBufferingLatencyFrames = (( suggestedInputLatencyFrames > suggestedOutputLatencyFrames ) - ? suggestedInputLatencyFrames + ? suggestedInputLatencyFrames : suggestedOutputLatencyFrames); - framesPerHostBuffer = SelectHostBufferSize( targetBufferingLatencyFrames, + framesPerHostBuffer = SelectHostBufferSize( targetBufferingLatencyFrames, framesPerBuffer, driverInfo ); } @@ -2404,8 +2404,8 @@ static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi, if( inputChannelCount > 0 ) { - /* FIXME: assume all channels use the same type for now - + /* FIXME: assume all channels use the same type for now + see: "ASIO devices with multiple sample formats are unsupported" http://www.portaudio.com/trac/ticket/106 */ @@ -2425,8 +2425,8 @@ static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi, if( outputChannelCount > 0 ) { - /* FIXME: assume all channels use the same type for now - + /* FIXME: assume all channels use the same type for now + see: "ASIO devices with multiple sample formats are unsupported" http://www.portaudio.com/trac/ticket/106 */ @@ -2444,7 +2444,7 @@ static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi, stream->outputBufferConverter = 0; } - /* Values returned by ASIOGetLatencies() include the latency introduced by + /* Values returned by ASIOGetLatencies() include the latency introduced by the ASIO double buffer. */ ASIOGetLatencies( &stream->asioInputLatencyFrames, &stream->asioOutputLatencyFrames ); @@ -2729,14 +2729,14 @@ static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi, // buffer processor latency. it reports the added latency separately PA_DEBUG(("PaAsio : ASIO InputLatency = %ld (%ld ms), added buffProc:%ld (%ld ms)\n", stream->asioInputLatencyFrames, - (long)((stream->asioInputLatencyFrames*1000)/ sampleRate), + (long)((stream->asioInputLatencyFrames*1000)/ sampleRate), PaUtil_GetBufferProcessorInputLatencyFrames(&stream->bufferProcessor), (long)((PaUtil_GetBufferProcessorInputLatencyFrames(&stream->bufferProcessor)*1000)/ sampleRate) )); PA_DEBUG(("PaAsio : ASIO OuputLatency = %ld (%ld ms), added buffProc:%ld (%ld ms)\n", stream->asioOutputLatencyFrames, - (long)((stream->asioOutputLatencyFrames*1000)/ sampleRate), + (long)((stream->asioOutputLatencyFrames*1000)/ sampleRate), PaUtil_GetBufferProcessorOutputLatencyFrames(&stream->bufferProcessor), (long)((PaUtil_GetBufferProcessorOutputLatencyFrames(&stream->bufferProcessor)*1000)/ sampleRate) )); @@ -2750,7 +2750,7 @@ static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi, stream->postOutput = driverInfo->postOutput; stream->isStopped = 1; stream->isActive = 0; - + asioHostApi->openAsioDeviceIndex = asioDeviceIndex; theAsioStream = stream; @@ -2806,9 +2806,9 @@ error: ASIODisposeBuffers(); if( asioIsInitialized ) - { - UnloadAsioDriver(); - } + { + UnloadAsioDriver(); + } return result; } @@ -2972,17 +2972,17 @@ static ASIOTime *bufferSwitchTimeInfo( ASIOTime *timeInfo, long index, ASIOBool } int buffersDone = 0; - + do { if( buffersDone > 0 ) { // this is a reentered buffer, we missed processing it on time // set the input overflow and output underflow flags as appropriate - + if( theAsioStream->inputChannelCount > 0 ) theAsioStream->callbackFlags |= paInputOverflow; - + if( theAsioStream->outputChannelCount > 0 ) theAsioStream->callbackFlags |= paOutputUnderflow; } @@ -3177,7 +3177,7 @@ previousTime = paTimeInfo.currentTime; } } } - + ++buffersDone; }while( PaAsio_AtomicDecrement(&theAsioStream->reenterCount) >= 0 ); @@ -3518,7 +3518,7 @@ static PaError AbortStream( PaStream *s ) static PaError IsStreamStopped( PaStream *s ) { PaAsioStream *stream = (PaAsioStream*)s; - + return stream->isStopped; } @@ -3677,7 +3677,7 @@ static PaError ReadStream( PaStream *s , &lRingBufferSize2nd); /* Set number of frames to be copied from the ring buffer. */ - PaUtil_SetInputFrameCount( pBp, lRingBufferSize1st ); + PaUtil_SetInputFrameCount( pBp, lRingBufferSize1st ); /* Setup ring buffer access. */ PaUtil_SetInterleavedInputChannels(pBp , /* Buffer processor. */ 0 , /* The first channel's index. */ @@ -3824,7 +3824,7 @@ static PaError WriteStream( PaStream *s , /* If block processing has stopped, abort! */ if( blockingState->stopFlag ) { return result = paStreamIsStopped; } - + /* If a timeout is encountered, give up eventually. */ return result = paTimedOut; } @@ -3849,7 +3849,7 @@ static PaError WriteStream( PaStream *s , &lRingBufferSize2nd); /* Set number of frames to be copied to the ring buffer. */ - PaUtil_SetOutputFrameCount( pBp, lRingBufferSize1st ); + PaUtil_SetOutputFrameCount( pBp, lRingBufferSize1st ); /* Setup ring buffer access. */ PaUtil_SetInterleavedOutputChannels(pBp , /* Buffer processor. */ 0 , /* The first channel's index. */ @@ -4093,10 +4093,10 @@ PaError PaAsio_ShowControlPanel( PaDeviceIndex device, void* systemSpecific ) } PA_DEBUG(("PaAsio_ShowControlPanel: ASIOInit(): %s\n", PaAsio_GetAsioErrorText(asioError) )); -PA_DEBUG(("asioVersion: ASIOInit(): %ld\n", asioDriverInfo.asioVersion )); -PA_DEBUG(("driverVersion: ASIOInit(): %ld\n", asioDriverInfo.driverVersion )); -PA_DEBUG(("Name: ASIOInit(): %s\n", asioDriverInfo.name )); -PA_DEBUG(("ErrorMessage: ASIOInit(): %s\n", asioDriverInfo.errorMessage )); +PA_DEBUG(("asioVersion: ASIOInit(): %ld\n", asioDriverInfo.asioVersion )); +PA_DEBUG(("driverVersion: ASIOInit(): %ld\n", asioDriverInfo.driverVersion )); +PA_DEBUG(("Name: ASIOInit(): %s\n", asioDriverInfo.name )); +PA_DEBUG(("ErrorMessage: ASIOInit(): %s\n", asioDriverInfo.errorMessage )); asioError = ASIOControlPanel(); if( asioError != ASE_OK ) @@ -4124,9 +4124,9 @@ PA_DEBUG(("PaAsio_ShowControlPanel: ASIOExit(): %s\n", PaAsio_GetAsioErrorText(a error: if( asioIsInitialized ) - { - ASIOExit(); - } + { + ASIOExit(); + } PaWinUtil_CoUninitialize( paASIO, &comInitializationResult ); @@ -4161,7 +4161,7 @@ PaError PaAsio_GetInputChannelName( PaDeviceIndex device, int channelIndex, *channelName = asioDeviceInfo->asioChannelInfos[channelIndex].name; return paNoError; - + error: return result; } @@ -4195,7 +4195,7 @@ PaError PaAsio_GetOutputChannelName( PaDeviceIndex device, int channelIndex, asioDeviceInfo->commonDeviceInfo.maxInputChannels + channelIndex].name; return paNoError; - + error: return result; } @@ -4211,7 +4211,7 @@ static PaError GetAsioStreamPointer( PaAsioStream **stream, PaStream *s ) PaError result; PaUtilHostApiRepresentation *hostApi; PaAsioHostApiRepresentation *asioHostApi; - + result = PaUtil_ValidateStreamPointer( s ); if( result != paNoError ) return result; @@ -4221,7 +4221,7 @@ static PaError GetAsioStreamPointer( PaAsioStream **stream, PaStream *s ) return result; asioHostApi = (PaAsioHostApiRepresentation*)hostApi; - + if( PA_STREAM_REP( s )->streamInterface == &asioHostApi->callbackStreamInterface || PA_STREAM_REP( s )->streamInterface == &asioHostApi->blockingStreamInterface ) { From 238d8db31a094eee59d187d734efd414245edb89 Mon Sep 17 00:00:00 2001 From: Ross Bencina Date: Thu, 21 Jan 2021 22:23:23 +1100 Subject: [PATCH 088/164] Clean up whitespace in examples/ in preparation for .editorconfig. Convert tabs to 4 spaces. Indent by 4 spaces. Strip trailing whitespace. Ensure EOL at EOF. (#416) --- examples/pa_devs.c | 26 +++---- examples/pa_fuzz.c | 20 +++--- examples/paex_mono_asio_channel_select.c | 24 +++---- examples/paex_ocean_shore.c | 48 ++++++------- examples/paex_pink.c | 42 +++++------ examples/paex_read_write_wire.c | 18 ++--- examples/paex_record.c | 18 ++--- examples/paex_record_file.c | 16 ++--- examples/paex_saw.c | 16 ++--- examples/paex_sine.c | 28 ++++---- examples/paex_sine_c++.cpp | 16 ++--- examples/paex_wmme_ac3.c | 52 +++++++------- examples/paex_wmme_surround.c | 92 ++++++++++++------------ examples/paex_write_sine.c | 42 +++++------ examples/paex_write_sine_nonint.c | 42 +++++------ 15 files changed, 250 insertions(+), 250 deletions(-) diff --git a/examples/pa_devs.c b/examples/pa_devs.c index 595a05d..27acfd5 100644 --- a/examples/pa_devs.c +++ b/examples/pa_devs.c @@ -1,7 +1,7 @@ /** @file pa_devs.c - @ingroup examples_src + @ingroup examples_src @brief List available devices, including device information. - @author Phil Burk http://www.softsynth.com + @author Phil Burk http://www.softsynth.com @note Define PA_USE_ASIO=0 to compile this code on Windows without ASIO support. @@ -34,13 +34,13 @@ */ /* - * The text above constitutes the entire PortAudio license; however, + * The text above constitutes the entire PortAudio license; however, * the PortAudio community also makes the following non-binding requests: * * 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. It is also - * requested that these non-binding requests be included along with the + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the * license above. */ @@ -106,14 +106,14 @@ int main(void) PaStreamParameters inputParameters, outputParameters; PaError err; - + err = Pa_Initialize(); if( err != paNoError ) { printf( "ERROR: Pa_Initialize returned 0x%x\n", err ); goto error; } - + printf( "PortAudio version: 0x%08X\n", Pa_GetVersion()); printf( "Version text: '%s'\n", Pa_GetVersionInfo()->versionText ); @@ -124,13 +124,13 @@ int main(void) err = numDevices; goto error; } - + printf( "Number of devices = %d\n", numDevices ); for( i=0; iname ); defaultDisplayed = 1; } - + if( i == Pa_GetDefaultOutputDevice() ) { printf( (defaultDisplayed ? "," : "[") ); @@ -154,7 +154,7 @@ int main(void) else if( i == Pa_GetHostApiInfo( deviceInfo->hostApi )->defaultOutputDevice ) { const PaHostApiInfo *hostInfo = Pa_GetHostApiInfo( deviceInfo->hostApi ); - printf( (defaultDisplayed ? "," : "[") ); + printf( (defaultDisplayed ? "," : "[") ); printf( " Default %s Output", hostInfo->name ); defaultDisplayed = 1; } @@ -188,7 +188,7 @@ int main(void) long minLatency, maxLatency, preferredLatency, granularity; err = PaAsio_GetAvailableLatencyValues( i, - &minLatency, &maxLatency, &preferredLatency, &granularity ); + &minLatency, &maxLatency, &preferredLatency, &granularity ); printf( "ASIO minimum buffer size = %ld\n", minLatency ); printf( "ASIO maximum buffer size = %ld\n", maxLatency ); @@ -210,7 +210,7 @@ int main(void) inputParameters.sampleFormat = paInt16; inputParameters.suggestedLatency = 0; /* ignored by Pa_IsFormatSupported() */ inputParameters.hostApiSpecificStreamInfo = NULL; - + outputParameters.device = i; outputParameters.channelCount = deviceInfo->maxOutputChannels; outputParameters.sampleFormat = paInt16; diff --git a/examples/pa_fuzz.c b/examples/pa_fuzz.c index 337e06d..0c24d35 100644 --- a/examples/pa_fuzz.c +++ b/examples/pa_fuzz.c @@ -1,7 +1,7 @@ /** @file pa_fuzz.c - @ingroup examples_src + @ingroup examples_src @brief Distort input like a fuzz box. - @author Phil Burk http://www.softsynth.com + @author Phil Burk http://www.softsynth.com */ /* * $Id$ @@ -31,13 +31,13 @@ */ /* - * The text above constitutes the entire PortAudio license; however, + * The text above constitutes the entire PortAudio license; however, * the PortAudio community also makes the following non-binding requests: * * 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. It is also - * requested that these non-binding requests be included along with the + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the * license above. */ @@ -116,7 +116,7 @@ static int fuzzCallback( const void *inputBuffer, void *outputBuffer, *out++ = *in++; /* right - clean */ } } - + return paContinue; } @@ -133,8 +133,8 @@ int main(void) inputParameters.device = Pa_GetDefaultInputDevice(); /* default input device */ if (inputParameters.device == paNoDevice) { - fprintf(stderr,"Error: No default input device.\n"); - goto error; + fprintf(stderr,"Error: No default input device.\n"); + goto error; } inputParameters.channelCount = 2; /* stereo input */ inputParameters.sampleFormat = PA_SAMPLE_TYPE; @@ -143,8 +143,8 @@ int main(void) outputParameters.device = Pa_GetDefaultOutputDevice(); /* default output device */ if (outputParameters.device == paNoDevice) { - fprintf(stderr,"Error: No default output device.\n"); - goto error; + fprintf(stderr,"Error: No default output device.\n"); + goto error; } outputParameters.channelCount = 2; /* stereo output */ outputParameters.sampleFormat = PA_SAMPLE_TYPE; diff --git a/examples/paex_mono_asio_channel_select.c b/examples/paex_mono_asio_channel_select.c index 71b0198..4b55d31 100644 --- a/examples/paex_mono_asio_channel_select.c +++ b/examples/paex_mono_asio_channel_select.c @@ -1,8 +1,8 @@ /** @file paex_mono_asio_channel_select.c - @ingroup examples_src - @brief Play a monophonic sine wave on a specific ASIO channel. - @author Ross Bencina - @author Phil Burk + @ingroup examples_src + @brief Play a monophonic sine wave on a specific ASIO channel. + @author Ross Bencina + @author Phil Burk */ /* * $Id$ @@ -36,13 +36,13 @@ */ /* - * The text above constitutes the entire PortAudio license; however, + * The text above constitutes the entire PortAudio license; however, * the PortAudio community also makes the following non-binding requests: * * 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. It is also - * requested that these non-binding requests be included along with the + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the * license above. */ @@ -114,7 +114,7 @@ int main(void) data.sine[i] = (float) (AMPLITUDE * sin( ((double)i/(double)TABLE_SIZE) * M_PI * 2. )); } data.phase = 0; - + err = Pa_Initialize(); if( err != paNoError ) goto error; @@ -123,7 +123,7 @@ int main(void) outputParameters.sampleFormat = paFloat32; /* 32 bit floating point output */ outputParameters.suggestedLatency = Pa_GetDeviceInfo( outputParameters.device )->defaultLowOutputLatency; - /* Use an ASIO specific structure. WARNING - this is not portable. */ + /* Use an ASIO specific structure. WARNING - this is not portable. */ asioOutputInfo.size = sizeof(PaAsioStreamInfo); asioOutputInfo.hostApiType = paASIO; asioOutputInfo.version = 1; @@ -145,16 +145,16 @@ int main(void) err = Pa_StartStream( stream ); if( err != paNoError ) goto error; - + printf("Play for %d seconds.\n", NUM_SECONDS ); fflush(stdout); Pa_Sleep( NUM_SECONDS * 1000 ); err = Pa_StopStream( stream ); if( err != paNoError ) goto error; - + err = Pa_CloseStream( stream ); if( err != paNoError ) goto error; - + Pa_Terminate(); printf("Test finished.\n"); return err; diff --git a/examples/paex_ocean_shore.c b/examples/paex_ocean_shore.c index ae645d6..9424e8b 100644 --- a/examples/paex_ocean_shore.c +++ b/examples/paex_ocean_shore.c @@ -1,21 +1,21 @@ -/** @file paex_ocean_shore.c - @ingroup examples_src - @brief Generate Pink Noise using Gardner method, and make "waves". Provides an example of how to +/** @file paex_ocean_shore.c + @ingroup examples_src + @brief Generate Pink Noise using Gardner method, and make "waves". Provides an example of how to post stuff to/from the audio callback using lock-free FIFOs implemented by the PA ringbuffer. - Optimization suggested by James McCartney uses a tree - to select which random value to replace. + Optimization suggested by James McCartney uses a tree + to select which random value to replace.
-	x x x x x x x x x x x x x x x x 
-	x   x   x   x   x   x   x   x   
-	x       x       x       x       
-	 x               x               
-	   x   
-
- Tree is generated by counting trailing zeros in an increasing index. - When the index is zero, no random number is selected. + x x x x x x x x x x x x x x x x + x x x x x x x x + x x x x + x x + x + + Tree is generated by counting trailing zeros in an increasing index. + When the index is zero, no random number is selected. - @author Phil Burk http://www.softsynth.com + @author Phil Burk http://www.softsynth.com Robert Bielik */ /* @@ -46,13 +46,13 @@ */ /* - * The text above constitutes the entire PortAudio license; however, + * The text above constitutes the entire PortAudio license; however, * the PortAudio community also makes the following non-binding requests: * * 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. It is also - * requested that these non-binding requests be included along with the + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the * license above. */ @@ -80,7 +80,7 @@ typedef struct } PinkNoise; -typedef struct +typedef struct { float bq_b0; float bq_b1; @@ -213,7 +213,7 @@ unsigned GenerateWave( OceanWave* wave, float* output, unsigned noOfFrames ) targetLevel = wave->wave_envelope_max_level; } /* Calculate lowpass biquad coeffs - + alpha = sin(w0)/(2*Q) b0 = (1 - cos(w0))/2 @@ -324,8 +324,8 @@ paTestData; static int patestCallback(const void* inputBuffer, void* outputBuffer, unsigned long framesPerBuffer, - const PaStreamCallbackTimeInfo* timeInfo, - PaStreamCallbackFlags statusFlags, + const PaStreamCallbackTimeInfo* timeInfo, + PaStreamCallbackFlags statusFlags, void* userData) { int i; @@ -427,8 +427,8 @@ int main(void) /* Open a stereo PortAudio stream so we can hear the result. */ outputParameters.device = Pa_GetDefaultOutputDevice(); /* Take the default output device. */ if (outputParameters.device == paNoDevice) { - fprintf(stderr,"Error: No default output device.\n"); - goto error; + fprintf(stderr,"Error: No default output device.\n"); + goto error; } outputParameters.channelCount = 2; /* Stereo output, most likely supported. */ outputParameters.hostApiSpecificStreamInfo = NULL; @@ -518,7 +518,7 @@ int main(void) { PaUtil_FreeMemory(data.rBufFromRTData); } - + Pa_Sleep(1000); Pa_Terminate(); diff --git a/examples/paex_pink.c b/examples/paex_pink.c index cd84324..519f979 100644 --- a/examples/paex_pink.c +++ b/examples/paex_pink.c @@ -1,20 +1,20 @@ /** @file paex_pink.c - @ingroup examples_src - @brief Generate Pink Noise using Gardner method. + @ingroup examples_src + @brief Generate Pink Noise using Gardner method. - Optimization suggested by James McCartney uses a tree - to select which random value to replace. + Optimization suggested by James McCartney uses a tree + to select which random value to replace.
-	x x x x x x x x x x x x x x x x 
-	x   x   x   x   x   x   x   x   
-	x       x       x       x       
-	 x               x               
-	   x   
-
- Tree is generated by counting trailing zeros in an increasing index. - When the index is zero, no random number is selected. + x x x x x x x x x x x x x x x x + x x x x x x x x + x x x x + x x + x + + Tree is generated by counting trailing zeros in an increasing index. + When the index is zero, no random number is selected. - @author Phil Burk http://www.softsynth.com + @author Phil Burk http://www.softsynth.com */ /* * $Id$ @@ -44,13 +44,13 @@ */ /* - * The text above constitutes the entire PortAudio license; however, + * The text above constitutes the entire PortAudio license; however, * the PortAudio community also makes the following non-binding requests: * * 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. It is also - * requested that these non-binding requests be included along with the + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the * license above. */ @@ -172,8 +172,8 @@ paTestData; static int patestCallback(const void* inputBuffer, void* outputBuffer, unsigned long framesPerBuffer, - const PaStreamCallbackTimeInfo* timeInfo, - PaStreamCallbackFlags statusFlags, + const PaStreamCallbackTimeInfo* timeInfo, + PaStreamCallbackFlags statusFlags, void* userData) { int finished; @@ -214,7 +214,7 @@ int main(void) int totalSamps; static const double SR = 44100.0; static const int FPB = 2048; /* Frames per buffer: 46 ms buffers. */ - + /* Initialize two pink noise signals with different numbers of rows. */ InitializePinkNoise( &data.leftPink, 12 ); InitializePinkNoise( &data.rightPink, 16 ); @@ -237,8 +237,8 @@ int main(void) /* Open a stereo PortAudio stream so we can hear the result. */ outputParameters.device = Pa_GetDefaultOutputDevice(); /* Take the default output device. */ if (outputParameters.device == paNoDevice) { - fprintf(stderr,"Error: No default output device.\n"); - goto error; + fprintf(stderr,"Error: No default output device.\n"); + goto error; } outputParameters.channelCount = 2; /* Stereo output, most likely supported. */ outputParameters.hostApiSpecificStreamInfo = NULL; diff --git a/examples/paex_read_write_wire.c b/examples/paex_read_write_wire.c index 813c74d..69f15ff 100644 --- a/examples/paex_read_write_wire.c +++ b/examples/paex_read_write_wire.c @@ -1,7 +1,7 @@ /** @file paex_read_write_wire.c - @ingroup examples_src - @brief Tests full duplex blocking I/O by passing input straight to output. - @author Bjorn Roche. XO Audio LLC for Z-Systems Engineering. + @ingroup examples_src + @brief Tests full duplex blocking I/O by passing input straight to output. + @author Bjorn Roche. XO Audio LLC for Z-Systems Engineering. @author based on code by: Phil Burk http://www.softsynth.com @author based on code by: Ross Bencina rossb@audiomulch.com */ @@ -179,22 +179,22 @@ int main(void) xrun: printf("err = %d\n", err); fflush(stdout); if( stream ) { - Pa_AbortStream( stream ); - Pa_CloseStream( stream ); + Pa_AbortStream( stream ); + Pa_CloseStream( stream ); } free( sampleBlock ); Pa_Terminate(); if( err & paInputOverflow ) - fprintf( stderr, "Input Overflow.\n" ); + fprintf( stderr, "Input Overflow.\n" ); if( err & paOutputUnderflow ) - fprintf( stderr, "Output Underflow.\n" ); + fprintf( stderr, "Output Underflow.\n" ); return -2; error1: free( sampleBlock ); error2: if( stream ) { - Pa_AbortStream( stream ); - Pa_CloseStream( stream ); + Pa_AbortStream( stream ); + Pa_CloseStream( stream ); } Pa_Terminate(); fprintf( stderr, "An error occurred while using the portaudio stream\n" ); diff --git a/examples/paex_record.c b/examples/paex_record.c index 4c9105c..4407787 100644 --- a/examples/paex_record.c +++ b/examples/paex_record.c @@ -1,7 +1,7 @@ /** @file paex_record.c - @ingroup examples_src - @brief Record input into an array; Save array to a file; Playback recorded data. - @author Phil Burk http://www.softsynth.com + @ingroup examples_src + @brief Record input into an array; Save array to a file; Playback recorded data. + @author Phil Burk http://www.softsynth.com */ /* * $Id$ @@ -31,13 +31,13 @@ */ /* - * The text above constitutes the entire PortAudio license; however, + * The text above constitutes the entire PortAudio license; however, * the PortAudio community also makes the following non-binding requests: * * 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. It is also - * requested that these non-binding requests be included along with the + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the * license above. */ @@ -326,15 +326,15 @@ int main(void) { err = Pa_StartStream( stream ); if( err != paNoError ) goto done; - + printf("Waiting for playback to finish.\n"); fflush(stdout); while( ( err = Pa_IsStreamActive( stream ) ) == 1 ) Pa_Sleep(100); if( err < 0 ) goto done; - + err = Pa_CloseStream( stream ); if( err != paNoError ) goto done; - + printf("Done.\n"); fflush(stdout); } diff --git a/examples/paex_record_file.c b/examples/paex_record_file.c index 1e1f473..c4e5b44 100644 --- a/examples/paex_record_file.c +++ b/examples/paex_record_file.c @@ -1,7 +1,7 @@ /** @file paex_record_file.c - @ingroup examples_src - @brief Record input into a file, then playback recorded data from file (Windows only at the moment) - @author Robert Bielik + @ingroup examples_src + @brief Record input into a file, then playback recorded data from file (Windows only at the moment) + @author Robert Bielik */ /* * $Id: paex_record_file.c 1752 2011-09-08 03:21:55Z philburk $ @@ -31,13 +31,13 @@ */ /* - * The text above constitutes the entire PortAudio license; however, + * The text above constitutes the entire PortAudio license; however, * the PortAudio community also makes the following non-binding requests: * * 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. It is also - * requested that these non-binding requests be included along with the + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the * license above. */ @@ -433,12 +433,12 @@ int main(void) } if( err < 0 ) goto done; } - + err = Pa_CloseStream( stream ); if( err != paNoError ) goto done; fclose(data.file); - + printf("Done.\n"); fflush(stdout); } diff --git a/examples/paex_saw.c b/examples/paex_saw.c index 6f477b8..caec0b0 100644 --- a/examples/paex_saw.c +++ b/examples/paex_saw.c @@ -1,7 +1,7 @@ /** @file paex_saw.c - @ingroup examples_src - @brief Play a simple (aliasing) sawtooth wave. - @author Phil Burk http://www.softsynth.com + @ingroup examples_src + @brief Play a simple (aliasing) sawtooth wave. + @author Phil Burk http://www.softsynth.com */ /* * $Id$ @@ -31,13 +31,13 @@ */ /* - * The text above constitutes the entire PortAudio license; however, + * The text above constitutes the entire PortAudio license; however, * the PortAudio community also makes the following non-binding requests: * * 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. It is also - * requested that these non-binding requests be included along with the + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the * license above. */ @@ -92,14 +92,14 @@ int main(void) { PaStream *stream; PaError err; - + printf("PortAudio Test: output sawtooth wave.\n"); /* Initialize our data for use by callback. */ data.left_phase = data.right_phase = 0.0; /* Initialize library before making any other calls. */ err = Pa_Initialize(); if( err != paNoError ) goto error; - + /* Open an audio I/O stream. */ err = Pa_OpenDefaultStream( &stream, 0, /* no input channels */ diff --git a/examples/paex_sine.c b/examples/paex_sine.c index 99fecf7..50ef205 100644 --- a/examples/paex_sine.c +++ b/examples/paex_sine.c @@ -1,7 +1,7 @@ /** @file paex_sine.c - @ingroup examples_src - @brief Play a sine wave for several seconds. - @author Ross Bencina + @ingroup examples_src + @brief Play a sine wave for several seconds. + @author Ross Bencina @author Phil Burk */ /* @@ -32,13 +32,13 @@ */ /* - * The text above constitutes the entire PortAudio license; however, + * The text above constitutes the entire PortAudio license; however, * the PortAudio community also makes the following non-binding requests: * * 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. It is also - * requested that these non-binding requests be included along with the + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the * license above. */ #include @@ -80,7 +80,7 @@ static int patestCallback( const void *inputBuffer, void *outputBuffer, (void) timeInfo; /* Prevent unused variable warnings. */ (void) statusFlags; (void) inputBuffer; - + for( i=0; isine[data->left_phase]; /* left */ @@ -90,7 +90,7 @@ static int patestCallback( const void *inputBuffer, void *outputBuffer, data->right_phase += 3; /* higher pitch so we can distinguish left and right. */ if( data->right_phase >= TABLE_SIZE ) data->right_phase -= TABLE_SIZE; } - + return paContinue; } @@ -99,8 +99,8 @@ static int patestCallback( const void *inputBuffer, void *outputBuffer, */ static void StreamFinished( void* userData ) { - paTestData *data = (paTestData *) userData; - printf( "Stream Completed: %s\n", data->message ); + paTestData *data = (paTestData *) userData; + printf( "Stream Completed: %s\n", data->message ); } /*******************************************************************/ @@ -121,14 +121,14 @@ int main(void) data.sine[i] = (float) sin( ((double)i/(double)TABLE_SIZE) * M_PI * 2. ); } data.left_phase = data.right_phase = 0; - + err = Pa_Initialize(); if( err != paNoError ) goto error; outputParameters.device = Pa_GetDefaultOutputDevice(); /* default output device */ if (outputParameters.device == paNoDevice) { - fprintf(stderr,"Error: No default output device.\n"); - goto error; + fprintf(stderr,"Error: No default output device.\n"); + goto error; } outputParameters.channelCount = 2; /* stereo output */ outputParameters.sampleFormat = paFloat32; /* 32 bit floating point output */ @@ -164,7 +164,7 @@ int main(void) Pa_Terminate(); printf("Test finished.\n"); - + return err; error: Pa_Terminate(); diff --git a/examples/paex_sine_c++.cpp b/examples/paex_sine_c++.cpp index 64d7829..5d96522 100644 --- a/examples/paex_sine_c++.cpp +++ b/examples/paex_sine_c++.cpp @@ -1,7 +1,7 @@ /** @file paex_sine.c - @ingroup examples_src - @brief Play a sine wave for several seconds. - @author Ross Bencina + @ingroup examples_src + @brief Play a sine wave for several seconds. + @author Ross Bencina @author Phil Burk */ /* @@ -32,13 +32,13 @@ */ /* - * The text above constitutes the entire PortAudio license; however, + * The text above constitutes the entire PortAudio license; however, * the PortAudio community also makes the following non-binding requests: * * 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. It is also - * requested that these non-binding requests be included along with the + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the * license above. */ #include @@ -189,7 +189,7 @@ private: PaStreamCallbackFlags statusFlags, void *userData ) { - /* Here we cast userData to Sine* type so we can call the instance method paCallbackMethod, we can do that since + /* Here we cast userData to Sine* type so we can call the instance method paCallbackMethod, we can do that since we called Pa_OpenStream with 'this' for userData */ return ((Sine*)userData)->paCallbackMethod(inputBuffer, outputBuffer, framesPerBuffer, @@ -247,7 +247,7 @@ int main(void) Sine sine; printf("PortAudio Test: output sine wave. SR = %d, BufSize = %d\n", SAMPLE_RATE, FRAMES_PER_BUFFER); - + ScopedPaHandler paInit; if( paInit.result() != paNoError ) goto error; diff --git a/examples/paex_wmme_ac3.c b/examples/paex_wmme_ac3.c index ac9212a..67c2786 100644 --- a/examples/paex_wmme_ac3.c +++ b/examples/paex_wmme_ac3.c @@ -1,7 +1,7 @@ /** @file paex_wmme_ac3.c - @ingroup examples_src - @brief Use WMME-specific interface to send raw AC3 data to a S/PDIF output. - @author Ross Bencina + @ingroup examples_src + @brief Use WMME-specific interface to send raw AC3 data to a S/PDIF output. + @author Ross Bencina */ /* * $Id: $ @@ -31,13 +31,13 @@ */ /* - * The text above constitutes the entire PortAudio license; however, + * The text above constitutes the entire PortAudio license; however, * the PortAudio community also makes the following non-binding requests: * * 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. It is also - * requested that these non-binding requests be included along with the + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the * license above. */ @@ -91,17 +91,17 @@ static int patestCallback( const void *inputBuffer, void *outputBuffer, (void) inputBuffer; /* stream out contents of data->buffer looping at end */ - + for( i=0; ibuffer[ data->playbackIndex++ ]; if( data->playbackIndex >= data->bufferSampleCount ) data->playbackIndex = 0; /* loop at end of buffer */ - } - } - + } + } + return paContinue; } @@ -120,10 +120,10 @@ int main(int argc, char* argv[]) printf("usage: patest_wmme_ac3 fileName [paDeviceIndex]\n"); printf("**IMPORTANT*** The provided file must include the spdif preamble at the start of every AC-3 frame. Using a normal ac3 file won't work.\n"); - printf("PortAudio Test: output a raw spdif ac3 stream. SR = %d, BufSize = %d, Chans = %d\n", + printf("PortAudio Test: output a raw spdif ac3 stream. SR = %d, BufSize = %d, Chans = %d\n", SAMPLE_RATE, FRAMES_PER_BUFFER, CHANNEL_COUNT); - + if( argc >= 2 ) fileName = argv[1]; @@ -154,14 +154,14 @@ int main(int argc, char* argv[]) err = Pa_Initialize(); if( err != paNoError ) goto error; - deviceIndex = Pa_GetHostApiInfo( Pa_HostApiTypeIdToHostApiIndex( paMME ) )->defaultOutputDevice; - if( argc >= 3 ){ - sscanf( argv[1], "%d", &deviceIndex ); - } + deviceIndex = Pa_GetHostApiInfo( Pa_HostApiTypeIdToHostApiIndex( paMME ) )->defaultOutputDevice; + if( argc >= 3 ){ + sscanf( argv[1], "%d", &deviceIndex ); + } + + printf( "using device id %d (%s)\n", deviceIndex, Pa_GetDeviceInfo(deviceIndex)->name ); - printf( "using device id %d (%s)\n", deviceIndex, Pa_GetDeviceInfo(deviceIndex)->name ); - outputParameters.device = deviceIndex; outputParameters.channelCount = CHANNEL_COUNT; outputParameters.sampleFormat = paInt16; /* IMPORTANT must use paInt16 for WMME AC3 */ @@ -169,17 +169,17 @@ int main(int argc, char* argv[]) outputParameters.hostApiSpecificStreamInfo = NULL; wmmeStreamInfo.size = sizeof(PaWinMmeStreamInfo); - wmmeStreamInfo.hostApiType = paMME; + wmmeStreamInfo.hostApiType = paMME; wmmeStreamInfo.version = 1; wmmeStreamInfo.flags = paWinMmeWaveFormatDolbyAc3Spdif; outputParameters.hostApiSpecificStreamInfo = &wmmeStreamInfo; - if( Pa_IsFormatSupported( 0, &outputParameters, SAMPLE_RATE ) == paFormatIsSupported ){ - printf( "Pa_IsFormatSupported reports device will support %d channels.\n", CHANNEL_COUNT ); - }else{ - printf( "Pa_IsFormatSupported reports device will not support %d channels.\n", CHANNEL_COUNT ); - } + if( Pa_IsFormatSupported( 0, &outputParameters, SAMPLE_RATE ) == paFormatIsSupported ){ + printf( "Pa_IsFormatSupported reports device will support %d channels.\n", CHANNEL_COUNT ); + }else{ + printf( "Pa_IsFormatSupported reports device will not support %d channels.\n", CHANNEL_COUNT ); + } err = Pa_OpenStream( &stream, @@ -207,7 +207,7 @@ int main(int argc, char* argv[]) Pa_Terminate(); free( data.buffer ); printf("Test finished.\n"); - + return err; error: Pa_Terminate(); diff --git a/examples/paex_wmme_surround.c b/examples/paex_wmme_surround.c index dfccc99..86a7e37 100644 --- a/examples/paex_wmme_surround.c +++ b/examples/paex_wmme_surround.c @@ -1,7 +1,7 @@ /** @file paex_wmme_surround.c - @ingroup examples_src - @brief Use WMME-specific channelMask to request 5.1 surround sound output. - @author Ross Bencina + @ingroup examples_src + @brief Use WMME-specific channelMask to request 5.1 surround sound output. + @author Ross Bencina */ /* * $Id: $ @@ -31,13 +31,13 @@ */ /* - * The text above constitutes the entire PortAudio license; however, + * The text above constitutes the entire PortAudio license; however, * the PortAudio community also makes the following non-binding requests: * * 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. It is also - * requested that these non-binding requests be included along with the + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the * license above. */ @@ -67,9 +67,9 @@ typedef struct { float sine[TABLE_SIZE]; - int phase; - int currentChannel; - int cycleCount; + int phase; + int currentChannel; + int cycleCount; } paTestData; @@ -90,31 +90,31 @@ static int patestCallback( const void *inputBuffer, void *outputBuffer, (void) timeInfo; /* Prevent unused variable warnings. */ (void) statusFlags; (void) inputBuffer; - + for( i=0; icurrentChannel && data->cycleCount < 4410 ){ - *out++ = data->sine[data->phase]; - data->phase += 1 + j; // play each channel at a different pitch so they can be distinguished - if( data->phase >= TABLE_SIZE ){ - data->phase -= TABLE_SIZE; - } - }else{ - *out++ = 0; - } - } - - data->cycleCount++; - if( data->cycleCount > 44100 ){ - data->cycleCount = 0; + for( j = 0; j < CHANNEL_COUNT; ++j ){ + if( j == data->currentChannel && data->cycleCount < 4410 ){ + *out++ = data->sine[data->phase]; + data->phase += 1 + j; // play each channel at a different pitch so they can be distinguished + if( data->phase >= TABLE_SIZE ){ + data->phase -= TABLE_SIZE; + } + }else{ + *out++ = 0; + } + } + + data->cycleCount++; + if( data->cycleCount > 44100 ){ + data->cycleCount = 0; + + ++data->currentChannel; + if( data->currentChannel >= CHANNEL_COUNT ) + data->currentChannel -= CHANNEL_COUNT; + } + } - ++data->currentChannel; - if( data->currentChannel >= CHANNEL_COUNT ) - data->currentChannel -= CHANNEL_COUNT; - } - } - return paContinue; } @@ -134,12 +134,12 @@ int main(int argc, char* argv[]) err = Pa_Initialize(); if( err != paNoError ) goto error; - deviceIndex = Pa_GetHostApiInfo( Pa_HostApiTypeIdToHostApiIndex( paMME ) )->defaultOutputDevice; - if( argc == 2 ){ - sscanf( argv[1], "%d", &deviceIndex ); - } + deviceIndex = Pa_GetHostApiInfo( Pa_HostApiTypeIdToHostApiIndex( paMME ) )->defaultOutputDevice; + if( argc == 2 ){ + sscanf( argv[1], "%d", &deviceIndex ); + } - printf( "using device id %d (%s)\n", deviceIndex, Pa_GetDeviceInfo(deviceIndex)->name ); + printf( "using device id %d (%s)\n", deviceIndex, Pa_GetDeviceInfo(deviceIndex)->name ); /* initialise sinusoidal wavetable */ for( i=0; i + @ingroup examples_src + @brief Play a sine wave for several seconds using the blocking API (Pa_WriteStream()) + @author Ross Bencina @author Phil Burk */ /* @@ -32,13 +32,13 @@ */ /* - * The text above constitutes the entire PortAudio license; however, + * The text above constitutes the entire PortAudio license; however, * the PortAudio community also makes the following non-binding requests: * * 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. It is also - * requested that these non-binding requests be included along with the + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the * license above. */ @@ -71,23 +71,23 @@ int main(void) int right_inc = 3; /* higher pitch so we can distinguish left and right. */ int i, j, k; int bufferCount; - + printf("PortAudio Test: output sine wave. SR = %d, BufSize = %d\n", SAMPLE_RATE, FRAMES_PER_BUFFER); - + /* initialise sinusoidal wavetable */ for( i=0; ierrorCode, hostErrorInfo->hostApiType ); - fprintf( stderr, "Host API error = %s\n", hostErrorInfo->errorText ); - } + // Print more information about the error. + if( err == paUnanticipatedHostError ) + { + const PaHostErrorInfo *hostErrorInfo = Pa_GetLastHostErrorInfo(); + fprintf( stderr, "Host API error = #%ld, hostApiType = %d\n", hostErrorInfo->errorCode, hostErrorInfo->hostApiType ); + fprintf( stderr, "Host API error = %s\n", hostErrorInfo->errorText ); + } Pa_Terminate(); return err; } diff --git a/examples/paex_write_sine_nonint.c b/examples/paex_write_sine_nonint.c index bc266c0..db78ed7 100644 --- a/examples/paex_write_sine_nonint.c +++ b/examples/paex_write_sine_nonint.c @@ -1,7 +1,7 @@ /** @file paex_write_sine_nonint.c - @ingroup examples_src - @brief Play a non-interleaved sine wave using the blocking API (Pa_WriteStream()) - @author Ross Bencina + @ingroup examples_src + @brief Play a non-interleaved sine wave using the blocking API (Pa_WriteStream()) + @author Ross Bencina @author Phil Burk */ /* @@ -32,13 +32,13 @@ */ /* - * The text above constitutes the entire PortAudio license; however, + * The text above constitutes the entire PortAudio license; however, * the PortAudio community also makes the following non-binding requests: * * 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. It is also - * requested that these non-binding requests be included along with the + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the * license above. */ @@ -63,11 +63,11 @@ int main(void) PaStreamParameters outputParameters; PaStream *stream; PaError err; - - float leftBuffer[FRAMES_PER_BUFFER]; + + float leftBuffer[FRAMES_PER_BUFFER]; float rightBuffer[FRAMES_PER_BUFFER]; void *buffers[2]; /* points to both non-interleaved buffers. */ - + float sine[TABLE_SIZE]; /* sine wavetable */ int left_phase = 0; int right_phase = 0; @@ -76,23 +76,23 @@ int main(void) int i, j, k; int bufferCount; - + printf("PortAudio Test: output sine wave NON-INTERLEAVED. SR = %d, BufSize = %d\n", SAMPLE_RATE, FRAMES_PER_BUFFER); - + /* initialise sinusoidal wavetable */ for( i=0; i Date: Thu, 21 Jan 2021 22:32:05 +1100 Subject: [PATCH 089/164] Clean up whitespace in src\hostapi\dsound in preparation for .editorconfig. Convert tabs to 4 spaces. Indent by 4 spaces. Strip trailing whitespace. Ensure EOL at EOF. (#412) --- src/hostapi/dsound/pa_win_ds.c | 254 ++++++++++++------------- src/hostapi/dsound/pa_win_ds_dynlink.c | 10 +- src/hostapi/dsound/pa_win_ds_dynlink.h | 10 +- 3 files changed, 137 insertions(+), 137 deletions(-) diff --git a/src/hostapi/dsound/pa_win_ds.c b/src/hostapi/dsound/pa_win_ds.c index f2dcf90..2a7f1a4 100644 --- a/src/hostapi/dsound/pa_win_ds.c +++ b/src/hostapi/dsound/pa_win_ds.c @@ -27,13 +27,13 @@ */ /* - * The text above constitutes the entire PortAudio license; however, + * The text above constitutes the entire PortAudio license; however, * the PortAudio community also makes the following non-binding requests: * * 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. It is also - * requested that these non-binding requests be included along with the + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the * license above. */ @@ -278,7 +278,7 @@ typedef struct PaWinDsStream UINT readOffset; /* last read position */ UINT inputBufferSizeBytes; - + int hostBufferSizeFrames; /* input and output host ringbuffers have the same number of frames */ double framesWritten; double secondsPerHostByte; /* Used to optimize latency calculation for outTime */ @@ -289,14 +289,14 @@ typedef struct PaWinDsStream PaStreamFlags streamFlags; int callbackResult; HANDLE processingCompleted; - + /* FIXME - move all below to PaUtilStreamRepresentation */ volatile int isStarted; volatile int isActive; volatile int stopProcessing; /* stop thread once existing buffers have been returned */ volatile int abortProcessing; /* stop thread immediately */ - UINT systemTimerResolutionPeriodMs; /* set to 0 if we were unable to set the timer period */ + UINT systemTimerResolutionPeriodMs; /* set to 0 if we were unable to set the timer period */ #ifdef PA_WIN_DS_USE_WMME_TIMER MMRESULT timerID; @@ -361,7 +361,7 @@ See: http://www.codeproject.com/Articles/678606/Part-Overcoming-Windows-s-deprec /************************************************************************* ** Return minimum workable latency required for this host. This is returned ** As the default stream latency in PaDeviceInfo. -** Latency can be optionally set by user by setting an environment variable. +** Latency can be optionally set by user by setting an environment variable. ** For example, to set latency to 200 msec, put: ** ** set PA_MIN_LATENCY_MSEC=200 @@ -405,7 +405,7 @@ static double PaWinDs_GetMinLatencySeconds( double sampleRate ) static char *DuplicateDeviceNameString( PaUtilAllocationGroup *allocations, const wchar_t* src ) { char *result = 0; - + if( src != NULL ) { size_t len = WideCharToMultiByte(CP_UTF8, 0, src, -1, NULL, 0, NULL, NULL); @@ -466,7 +466,7 @@ static PaError InitializeDSDeviceNameAndGUIDVector( guidVector->items = (DSDeviceNameAndGUID*)LocalAlloc( LMEM_FIXED, sizeof(DSDeviceNameAndGUID) * guidVector->free ); if( guidVector->items == NULL ) result = paInsufficientMemory; - + return result; } @@ -475,7 +475,7 @@ static PaError ExpandDSDeviceNameAndGUIDVector( DSDeviceNameAndGUIDVector *guidV PaError result = paNoError; DSDeviceNameAndGUID *newItems; int i; - + /* double size of vector */ int size = guidVector->count + guidVector->free; guidVector->free += size; @@ -504,7 +504,7 @@ static PaError ExpandDSDeviceNameAndGUIDVector( DSDeviceNameAndGUIDVector *guidV LocalFree( guidVector->items ); guidVector->items = newItems; - } + } return result; } @@ -528,7 +528,7 @@ static PaError TerminateDSDeviceNameAndGUIDVector( DSDeviceNameAndGUIDVector *gu } /************************************************************************************ -** Collect preliminary device information during DirectSound enumeration +** Collect preliminary device information during DirectSound enumeration */ static BOOL CALLBACK CollectGUIDsProcW(LPGUID lpGUID, LPCWSTR lpszDesc, @@ -549,7 +549,7 @@ static BOOL CALLBACK CollectGUIDsProcW(LPGUID lpGUID, return FALSE; } } - + /* Set GUID pointer, copy GUID to storage in DSDeviceNameAndGUIDVector. */ if( lpGUID == NULL ) { @@ -559,7 +559,7 @@ static BOOL CALLBACK CollectGUIDsProcW(LPGUID lpGUID, { namesAndGUIDs->items[namesAndGUIDs->count].lpGUID = &namesAndGUIDs->items[namesAndGUIDs->count].guid; - + memcpy( &namesAndGUIDs->items[namesAndGUIDs->count].guid, lpGUID, sizeof(GUID) ); } @@ -575,7 +575,7 @@ static BOOL CALLBACK CollectGUIDsProcW(LPGUID lpGUID, ++namesAndGUIDs->count; --namesAndGUIDs->free; - + return TRUE; } @@ -599,7 +599,7 @@ static BOOL CALLBACK KsPropertySetEnumerateCallback( PDSPROPERTY_DIRECTSOUNDDEVI DSDeviceNamesAndGUIDs *deviceNamesAndGUIDs = (DSDeviceNamesAndGUIDs*)context; /* - Apparently data->Interface can be NULL in some cases. + Apparently data->Interface can be NULL in some cases. Possibly virtual devices without hardware. So we check for NULLs now. See mailing list message November 10, 2012: "[Portaudio] portaudio initialization crash in KsPropertySetEnumerateCallback(pa_win_ds.c)" @@ -613,7 +613,7 @@ static BOOL CALLBACK KsPropertySetEnumerateCallback( PDSPROPERTY_DIRECTSOUNDDEVI if( deviceNamesAndGUIDs->outputNamesAndGUIDs.items[i].lpGUID && memcmp( &data->DeviceId, deviceNamesAndGUIDs->outputNamesAndGUIDs.items[i].lpGUID, sizeof(GUID) ) == 0 ) { - deviceNamesAndGUIDs->outputNamesAndGUIDs.items[i].pnpInterface = + deviceNamesAndGUIDs->outputNamesAndGUIDs.items[i].pnpInterface = (char*)DuplicateWCharString( deviceNamesAndGUIDs->winDsHostApi->allocations, data->Interface ); break; } @@ -626,7 +626,7 @@ static BOOL CALLBACK KsPropertySetEnumerateCallback( PDSPROPERTY_DIRECTSOUNDDEVI if( deviceNamesAndGUIDs->inputNamesAndGUIDs.items[i].lpGUID && memcmp( &data->DeviceId, deviceNamesAndGUIDs->inputNamesAndGUIDs.items[i].lpGUID, sizeof(GUID) ) == 0 ) { - deviceNamesAndGUIDs->inputNamesAndGUIDs.items[i].pnpInterface = + deviceNamesAndGUIDs->inputNamesAndGUIDs.items[i].pnpInterface = (char*)DuplicateWCharString( deviceNamesAndGUIDs->winDsHostApi->allocations, data->Interface ); break; } @@ -638,13 +638,13 @@ static BOOL CALLBACK KsPropertySetEnumerateCallback( PDSPROPERTY_DIRECTSOUNDDEVI } -static GUID pawin_CLSID_DirectSoundPrivate = +static GUID pawin_CLSID_DirectSoundPrivate = { 0x11ab3ec0, 0x25ec, 0x11d1, 0xa4, 0xd8, 0x00, 0xc0, 0x4f, 0xc2, 0x8a, 0xca }; -static GUID pawin_DSPROPSETID_DirectSoundDevice = +static GUID pawin_DSPROPSETID_DirectSoundDevice = { 0x84624f82, 0x25ec, 0x11d1, 0xa4, 0xd8, 0x00, 0xc0, 0x4f, 0xc2, 0x8a, 0xca }; -static GUID pawin_IID_IKsPropertySet = +static GUID pawin_IID_IKsPropertySet = { 0x31efac30, 0x515c, 0x11d0, 0xa9, 0xaa, 0x00, 0xaa, 0x00, 0x61, 0xbe, 0x93 }; @@ -652,17 +652,17 @@ static GUID pawin_IID_IKsPropertySet = FindDevicePnpInterfaces fills in the pnpInterface fields in deviceNamesAndGUIDs with UNICODE file paths to the devices. The DS documentation mentions at least two techniques by which these Interface paths can be found using IKsPropertySet on - the DirectSound class object. One is using the DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION + the DirectSound class object. One is using the DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION property, and the other is using DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE. I tried both methods and only the second worked. I found two postings on the - net from people who had the same problem with the first method, so I think the method used here is + net from people who had the same problem with the first method, so I think the method used here is more common/likely to work. The problem is that IKsPropertySet_Get returns S_OK but the fields of the device description are not filled in. - The mechanism we use works by registering an enumeration callback which is called for + The mechanism we use works by registering an enumeration callback which is called for every DSound device. Our callback searches for a device in our deviceNamesAndGUIDs list with the matching GUID and copies the pointer to the Interface path. - Note that we could have used this enumeration callback to perform the original + Note that we could have used this enumeration callback to perform the original device enumeration, however we choose not to so we can disable this step easily. Apparently the IKsPropertySet mechanism was added in DirectSound 9c 2004 @@ -673,11 +673,11 @@ static GUID pawin_IID_IKsPropertySet = static void FindDevicePnpInterfaces( DSDeviceNamesAndGUIDs *deviceNamesAndGUIDs ) { IClassFactory *pClassFactory; - + if( paWinDsDSoundEntryPoints.DllGetClassObject(&pawin_CLSID_DirectSoundPrivate, &IID_IClassFactory, (PVOID *) &pClassFactory) == S_OK ){ IKsPropertySet *pPropertySet; if( pClassFactory->lpVtbl->CreateInstance( pClassFactory, NULL, &pawin_IID_IKsPropertySet, (PVOID *) &pPropertySet) == S_OK ){ - + DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_W_DATA data; ULONG bytesReturned; @@ -693,14 +693,14 @@ static void FindDevicePnpInterfaces( DSDeviceNamesAndGUIDs *deviceNamesAndGUIDs sizeof(data), &bytesReturned ); - + IKsPropertySet_Release( pPropertySet ); } pClassFactory->lpVtbl->Release( pClassFactory ); } /* - The following code fragment, which I chose not to use, queries for the + The following code fragment, which I chose not to use, queries for the device interface for a device with a specific GUID: ULONG BytesReturned; @@ -708,7 +708,7 @@ static void FindDevicePnpInterfaces( DSDeviceNamesAndGUIDs *deviceNamesAndGUIDs memset (&Property, 0, sizeof(Property)); Property.DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_RENDER; - Property.DeviceId = *lpGUID; + Property.DeviceId = *lpGUID; hr = IKsPropertySet_Get( pPropertySet, &pawin_DSPROPSETID_DirectSoundDevice, @@ -729,7 +729,7 @@ static void FindDevicePnpInterfaces( DSDeviceNamesAndGUIDs *deviceNamesAndGUIDs #endif /* PAWIN_USE_WDMKS_DEVICE_INFO */ -/* +/* GUIDs for emulated devices which we blacklist below. are there more than two of them?? */ @@ -773,7 +773,7 @@ static PaError AddOutputDeviceInfoFromDirectSound( memcpy( &winDsDeviceInfo->guid, lpGUID, sizeof(GUID) ); winDsDeviceInfo->lpGUID = &winDsDeviceInfo->guid; } - + if( lpGUID ) { if (IsEqualGUID (&IID_IRolandVSCEmulated1,lpGUID) || @@ -804,7 +804,7 @@ static PaError AddOutputDeviceInfoFromDirectSound( hr = IDirectSound_Initialize( lpDirectSound, lpGUID ); } */ - + if( hr != DS_OK ) { if (hr == DSERR_ALLOCATED) @@ -830,7 +830,7 @@ static PaError AddOutputDeviceInfoFromDirectSound( else { /* Query device characteristics. */ - memset( &caps, 0, sizeof(caps) ); + memset( &caps, 0, sizeof(caps) ); caps.dwSize = sizeof(caps); hr = IDirectSound_GetCaps( lpDirectSound, &caps ); if( hr != DS_OK ) @@ -861,7 +861,7 @@ static PaError AddOutputDeviceInfoFromDirectSound( set deviceOutputChannelCountIsKnown to 0 (unknown). In this case OpenStream will try to open the device when the user requests more than 2 channels, rather than - returning an error. + returning an error. */ if( caps.dwFlags & DSCAPS_PRIMARYSTEREO ) { @@ -874,7 +874,7 @@ static PaError AddOutputDeviceInfoFromDirectSound( winDsDeviceInfo->deviceOutputChannelCountIsKnown = 1; } - /* Guess channels count from speaker configuration. We do it only when + /* Guess channels count from speaker configuration. We do it only when pnpInterface is NULL or when PAWIN_USE_WDMKS_DEVICE_INFO is undefined. */ #ifdef PAWIN_USE_WDMKS_DEVICE_INFO @@ -899,7 +899,7 @@ static PaError AddOutputDeviceInfoFromDirectSound( case DSSPEAKER_7POINT1: count = 8; break; #ifndef DSSPEAKER_7POINT1_SURROUND #define DSSPEAKER_7POINT1_SURROUND 0x00000008 -#endif +#endif case DSSPEAKER_7POINT1_SURROUND: count = 8; break; #ifndef DSSPEAKER_5POINT1_SURROUND #define DSSPEAKER_5POINT1_SURROUND 0x00000009 @@ -927,7 +927,7 @@ static PaError AddOutputDeviceInfoFromDirectSound( #endif /* PAWIN_USE_WDMKS_DEVICE_INFO */ /* initialize defaultSampleRate */ - + if( caps.dwFlags & DSCAPS_CONTINUOUSRATE ) { /* initialize to caps.dwMaxSecondarySampleRate incase none of the standard rates match */ @@ -973,7 +973,7 @@ static PaError AddOutputDeviceInfoFromDirectSound( else deviceInfo->defaultSampleRate = caps.dwMaxSecondarySampleRate; //printf( "min %d max %d\n", caps.dwMinSecondarySampleRate, caps.dwMaxSecondarySampleRate ); - // dwFlags | DSCAPS_CONTINUOUSRATE + // dwFlags | DSCAPS_CONTINUOUSRATE deviceInfo->defaultLowInputLatency = 0.; deviceInfo->defaultHighInputLatency = 0.; @@ -992,7 +992,7 @@ static PaError AddOutputDeviceInfoFromDirectSound( if( lpGUID == NULL ) hostApi->info.defaultOutputDevice = hostApi->info.deviceCount; - + hostApi->info.deviceCount++; } @@ -1018,7 +1018,7 @@ static PaError AddInputDeviceInfoFromDirectSoundCapture( DSCCAPS caps; int deviceOK = TRUE; PaError result = paNoError; - + /* Copy GUID to the device info structure. Set pointer. */ if( lpGUID == NULL ) { @@ -1150,12 +1150,12 @@ static PaError AddInputDeviceInfoFromDirectSoundCapture( deviceInfo->defaultLowInputLatency = PaWinDs_GetMinLatencySeconds( deviceInfo->defaultSampleRate ); deviceInfo->defaultHighInputLatency = deviceInfo->defaultLowInputLatency * 2; - + deviceInfo->defaultLowOutputLatency = 0.; deviceInfo->defaultHighOutputLatency = 0.; } } - + IDirectSoundCapture_Release( lpDirectSoundCapture ); } @@ -1215,12 +1215,12 @@ PaError PaWinDs_Initialize( PaUtilHostApiRepresentation **hostApi, PaHostApiInde (*hostApi)->info.structVersion = 1; (*hostApi)->info.type = paDirectSound; (*hostApi)->info.name = "Windows DirectSound"; - + (*hostApi)->info.deviceCount = 0; (*hostApi)->info.defaultInputDevice = paNoDevice; (*hostApi)->info.defaultOutputDevice = paNoDevice; - + /* DSound - enumerate devices to count them and to gather their GUIDs */ result = InitializeDSDeviceNameAndGUIDVector( &deviceNamesAndGUIDs.inputNamesAndGUIDs, winDsHostApi->allocations ); @@ -1305,7 +1305,7 @@ PaError PaWinDs_Initialize( PaUtilHostApiRepresentation **hostApi, PaHostApiInde if( result != paNoError ) goto error; } - } + } result = TerminateDSDeviceNameAndGUIDVector( &deviceNamesAndGUIDs.inputNamesAndGUIDs ); if( result != paNoError ) @@ -1315,7 +1315,7 @@ PaError PaWinDs_Initialize( PaUtilHostApiRepresentation **hostApi, PaHostApiInde if( result != paNoError ) goto error; - + (*hostApi)->Terminate = Terminate; (*hostApi)->OpenStream = OpenStream; (*hostApi)->IsFormatSupported = IsFormatSupported; @@ -1435,7 +1435,7 @@ static PaError IsFormatSupported( struct PaUtilHostApiRepresentation *hostApi, outputChannelCount = outputParameters->channelCount; outputSampleFormat = outputParameters->sampleFormat; - + /* unless alternate device specification is supported, reject the use of paUseHostApiSpecificDeviceSpecification */ @@ -1456,7 +1456,7 @@ static PaError IsFormatSupported( struct PaUtilHostApiRepresentation *hostApi, { outputChannelCount = 0; } - + /* IMPLEMENT ME: @@ -1486,12 +1486,12 @@ static PaError IsFormatSupported( struct PaUtilHostApiRepresentation *hostApi, static HRESULT InitFullDuplexInputOutputBuffers( PaWinDsStream *stream, PaWinDsDeviceInfo *inputDevice, PaSampleFormat hostInputSampleFormat, - WORD inputChannelCount, + WORD inputChannelCount, int bytesPerInputBuffer, PaWinWaveFormatChannelMask inputChannelMask, PaWinDsDeviceInfo *outputDevice, PaSampleFormat hostOutputSampleFormat, - WORD outputChannelCount, + WORD outputChannelCount, int bytesPerOutputBuffer, PaWinWaveFormatChannelMask outputChannelMask, unsigned long nFrameRate @@ -1508,7 +1508,7 @@ static HRESULT InitFullDuplexInputOutputBuffers( PaWinDsStream *stream, // capture buffer description // only try wave format extensible. assume it's available on all ds 8 systems - PaWin_InitializeWaveFormatExtensible( &captureWaveFormat, inputChannelCount, + PaWin_InitializeWaveFormatExtensible( &captureWaveFormat, inputChannelCount, hostInputSampleFormat, PaWin_SampleFormatToLinearWaveFormatTag( hostInputSampleFormat ), nFrameRate, inputChannelMask ); @@ -1520,7 +1520,7 @@ static HRESULT InitFullDuplexInputOutputBuffers( PaWinDsStream *stream, // render buffer description - PaWin_InitializeWaveFormatExtensible( &renderWaveFormat, outputChannelCount, + PaWin_InitializeWaveFormatExtensible( &renderWaveFormat, outputChannelCount, hostOutputSampleFormat, PaWin_SampleFormatToLinearWaveFormatTag( hostOutputSampleFormat ), nFrameRate, outputChannelMask ); @@ -1532,7 +1532,7 @@ static HRESULT InitFullDuplexInputOutputBuffers( PaWinDsStream *stream, /* note that we don't create a primary buffer here at all */ - hr = paWinDsDSoundEntryPoints.DirectSoundFullDuplexCreate8( + hr = paWinDsDSoundEntryPoints.DirectSoundFullDuplexCreate8( inputDevice->lpGUID, outputDevice->lpGUID, &captureDesc, &secondaryRenderDesc, GetDesktopWindow(), /* see InitOutputBuffer() for a discussion of whether this is a good idea */ @@ -1540,7 +1540,7 @@ static HRESULT InitFullDuplexInputOutputBuffers( PaWinDsStream *stream, &stream->pDirectSoundFullDuplex8, &pCaptureBuffer8, &pRenderBuffer8, - NULL /* pUnkOuter must be NULL */ + NULL /* pUnkOuter must be NULL */ ); if( hr == DS_OK ) @@ -1550,7 +1550,7 @@ static HRESULT InitFullDuplexInputOutputBuffers( PaWinDsStream *stream, /* retrieve the pre ds 8 buffer interfaces which are used by the rest of the code */ hr = IUnknown_QueryInterface( pCaptureBuffer8, &IID_IDirectSoundCaptureBuffer, (LPVOID *)&stream->pDirectSoundInputBuffer ); - + if( hr == DS_OK ) hr = IUnknown_QueryInterface( pRenderBuffer8, &IID_IDirectSoundBuffer, (LPVOID *)&stream->pDirectSoundOutputBuffer ); @@ -1571,7 +1571,7 @@ static HRESULT InitFullDuplexInputOutputBuffers( PaWinDsStream *stream, IUnknown_Release( stream->pDirectSoundOutputBuffer ); stream->pDirectSoundOutputBuffer = NULL; } - + IUnknown_Release( stream->pDirectSoundFullDuplex8 ); stream->pDirectSoundFullDuplex8 = NULL; } @@ -1586,22 +1586,22 @@ static HRESULT InitFullDuplexInputOutputBuffers( PaWinDsStream *stream, #endif /* PAWIN_USE_DIRECTSOUNDFULLDUPLEXCREATE */ -static HRESULT InitInputBuffer( PaWinDsStream *stream, - PaWinDsDeviceInfo *device, - PaSampleFormat sampleFormat, - unsigned long nFrameRate, - WORD nChannels, - int bytesPerBuffer, +static HRESULT InitInputBuffer( PaWinDsStream *stream, + PaWinDsDeviceInfo *device, + PaSampleFormat sampleFormat, + unsigned long nFrameRate, + WORD nChannels, + int bytesPerBuffer, PaWinWaveFormatChannelMask channelMask ) { DSCBUFFERDESC captureDesc; PaWinWaveFormat waveFormat; HRESULT result; - - if( (result = paWinDsDSoundEntryPoints.DirectSoundCaptureCreate( + + if( (result = paWinDsDSoundEntryPoints.DirectSoundCaptureCreate( device->lpGUID, &stream->pDirectSoundCapture, NULL) ) != DS_OK ){ - ERR_RPT(("PortAudio: DirectSoundCaptureCreate() failed!\n")); - return result; + ERR_RPT(("PortAudio: DirectSoundCaptureCreate() failed!\n")); + return result; } // Setup the secondary buffer description @@ -1610,18 +1610,18 @@ static HRESULT InitInputBuffer( PaWinDsStream *stream, captureDesc.dwFlags = 0; captureDesc.dwBufferBytes = bytesPerBuffer; captureDesc.lpwfxFormat = (WAVEFORMATEX*)&waveFormat; - + // Create the capture buffer // first try WAVEFORMATEXTENSIBLE. if this fails, fall back to WAVEFORMATEX - PaWin_InitializeWaveFormatExtensible( &waveFormat, nChannels, + PaWin_InitializeWaveFormatExtensible( &waveFormat, nChannels, sampleFormat, PaWin_SampleFormatToLinearWaveFormatTag( sampleFormat ), nFrameRate, channelMask ); if( IDirectSoundCapture_CreateCaptureBuffer( stream->pDirectSoundCapture, &captureDesc, &stream->pDirectSoundInputBuffer, NULL) != DS_OK ) { - PaWin_InitializeWaveFormatEx( &waveFormat, nChannels, sampleFormat, + PaWin_InitializeWaveFormatEx( &waveFormat, nChannels, sampleFormat, PaWin_SampleFormatToLinearWaveFormatTag( sampleFormat ), nFrameRate ); if ((result = IDirectSoundCapture_CreateCaptureBuffer( stream->pDirectSoundCapture, @@ -1633,9 +1633,9 @@ static HRESULT InitInputBuffer( PaWinDsStream *stream, } -static HRESULT InitOutputBuffer( PaWinDsStream *stream, PaWinDsDeviceInfo *device, - PaSampleFormat sampleFormat, unsigned long nFrameRate, - WORD nChannels, int bytesPerBuffer, +static HRESULT InitOutputBuffer( PaWinDsStream *stream, PaWinDsDeviceInfo *device, + PaSampleFormat sampleFormat, unsigned long nFrameRate, + WORD nChannels, int bytesPerBuffer, PaWinWaveFormatChannelMask channelMask ) { HRESULT result; @@ -1644,8 +1644,8 @@ static HRESULT InitOutputBuffer( PaWinDsStream *stream, PaWinDsDeviceInfo *devic PaWinWaveFormat waveFormat; DSBUFFERDESC primaryDesc; DSBUFFERDESC secondaryDesc; - - if( (hr = paWinDsDSoundEntryPoints.DirectSoundCreate( + + if( (hr = paWinDsDSoundEntryPoints.DirectSoundCreate( device->lpGUID, &stream->pDirectSound, NULL )) != DS_OK ){ ERR_RPT(("PortAudio: DirectSoundCreate() failed!\n")); return hr; @@ -1688,13 +1688,13 @@ static HRESULT InitOutputBuffer( PaWinDsStream *stream, PaWinDsDeviceInfo *devic // Set the primary buffer's format // first try WAVEFORMATEXTENSIBLE. if this fails, fall back to WAVEFORMATEX - PaWin_InitializeWaveFormatExtensible( &waveFormat, nChannels, + PaWin_InitializeWaveFormatExtensible( &waveFormat, nChannels, sampleFormat, PaWin_SampleFormatToLinearWaveFormatTag( sampleFormat ), nFrameRate, channelMask ); if( IDirectSoundBuffer_SetFormat( stream->pDirectSoundPrimaryBuffer, (WAVEFORMATEX*)&waveFormat) != DS_OK ) { - PaWin_InitializeWaveFormatEx( &waveFormat, nChannels, sampleFormat, + PaWin_InitializeWaveFormatEx( &waveFormat, nChannels, sampleFormat, PaWin_SampleFormatToLinearWaveFormatTag( sampleFormat ), nFrameRate ); if((result = IDirectSoundBuffer_SetFormat( stream->pDirectSoundPrimaryBuffer, (WAVEFORMATEX*)&waveFormat)) != DS_OK) @@ -1711,8 +1711,8 @@ static HRESULT InitOutputBuffer( PaWinDsStream *stream, PaWinDsDeviceInfo *devic // Create the secondary buffer if ((result = IDirectSound_CreateSoundBuffer( stream->pDirectSound, &secondaryDesc, &stream->pDirectSoundOutputBuffer, NULL)) != DS_OK) - goto error; - + goto error; + return DS_OK; error: @@ -1727,7 +1727,7 @@ error: } -static void CalculateBufferSettings( unsigned long *hostBufferSizeFrames, +static void CalculateBufferSettings( unsigned long *hostBufferSizeFrames, unsigned long *pollingPeriodFrames, int isFullDuplex, unsigned long suggestedInputLatencyFrames, @@ -1737,7 +1737,7 @@ static void CalculateBufferSettings( unsigned long *hostBufferSizeFrames, unsigned long minimumPollingPeriodFrames = (unsigned long)(sampleRate * PA_DS_MINIMUM_POLLING_PERIOD_SECONDS); unsigned long maximumPollingPeriodFrames = (unsigned long)(sampleRate * PA_DS_MAXIMUM_POLLING_PERIOD_SECONDS); unsigned long pollingJitterFrames = (unsigned long)(sampleRate * PA_DS_POLLING_JITTER_SECONDS); - + if( userFramesPerBuffer == paFramesPerBufferUnspecified ) { unsigned long targetBufferingLatencyFrames = max( suggestedInputLatencyFrames, suggestedOutputLatencyFrames ); @@ -1752,7 +1752,7 @@ static void CalculateBufferSettings( unsigned long *hostBufferSizeFrames, *pollingPeriodFrames = maximumPollingPeriodFrames; } - *hostBufferSizeFrames = *pollingPeriodFrames + *hostBufferSizeFrames = *pollingPeriodFrames + max( *pollingPeriodFrames + pollingJitterFrames, targetBufferingLatencyFrames); } else @@ -1763,14 +1763,14 @@ static void CalculateBufferSettings( unsigned long *hostBufferSizeFrames, /* In full duplex streams we know that the buffer adapter adds userFramesPerBuffer extra fixed latency. so we subtract it here as a fixed latency before computing the buffer size. being careful not to produce an unrepresentable negative result. - + Note: this only works as expected if output latency is greater than input latency. Otherwise we use input latency anyway since we do max(in,out). */ if( userFramesPerBuffer < suggestedOutputLatencyFrames ) { - unsigned long adjustedSuggestedOutputLatencyFrames = + unsigned long adjustedSuggestedOutputLatencyFrames = suggestedOutputLatencyFrames - userFramesPerBuffer; /* maximum of input and adjusted output suggested latency */ @@ -1783,9 +1783,9 @@ static void CalculateBufferSettings( unsigned long *hostBufferSizeFrames, /* maximum of input and output suggested latency */ if( suggestedOutputLatencyFrames > suggestedInputLatencyFrames ) targetBufferingLatencyFrames = suggestedOutputLatencyFrames; - } + } - *hostBufferSizeFrames = userFramesPerBuffer + *hostBufferSizeFrames = userFramesPerBuffer + max( userFramesPerBuffer + pollingJitterFrames, targetBufferingLatencyFrames); *pollingPeriodFrames = max( max(1, userFramesPerBuffer / 4), targetBufferingLatencyFrames / 16 ); @@ -1794,11 +1794,11 @@ static void CalculateBufferSettings( unsigned long *hostBufferSizeFrames, { *pollingPeriodFrames = maximumPollingPeriodFrames; } - } + } } -static void CalculatePollingPeriodFrames( unsigned long hostBufferSizeFrames, +static void CalculatePollingPeriodFrames( unsigned long hostBufferSizeFrames, unsigned long *pollingPeriodFrames, double sampleRate, unsigned long userFramesPerBuffer ) { @@ -1815,12 +1815,12 @@ static void CalculatePollingPeriodFrames( unsigned long hostBufferSizeFrames, } -static void SetStreamInfoLatencies( PaWinDsStream *stream, - unsigned long userFramesPerBuffer, +static void SetStreamInfoLatencies( PaWinDsStream *stream, + unsigned long userFramesPerBuffer, unsigned long pollingPeriodFrames, double sampleRate ) { - /* compute the stream info actual latencies based on framesPerBuffer, polling period, hostBufferSizeFrames, + /* compute the stream info actual latencies based on framesPerBuffer, polling period, hostBufferSizeFrames, and the configuration of the buffer processor */ unsigned long effectiveFramesPerBuffer = (userFramesPerBuffer == paFramesPerBufferUnspecified) @@ -1829,7 +1829,7 @@ static void SetStreamInfoLatencies( PaWinDsStream *stream, if( stream->bufferProcessor.inputChannelCount > 0 ) { - /* stream info input latency is the minimum buffering latency + /* stream info input latency is the minimum buffering latency (unlike suggested and default which are *maximums*) */ stream->streamRepresentation.streamInfo.inputLatency = (double)(PaUtil_GetBufferProcessorInputLatencyFrames(&stream->bufferProcessor) @@ -1894,7 +1894,7 @@ static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi, /* IDEA: the following 3 checks could be performed by default by pa_front unless some flag indicated otherwise */ - + /* unless alternate device specification is supported, reject the use of paUseHostApiSpecificDeviceSpecification */ if( inputParameters->device == paUseHostApiSpecificDeviceSpecification ) @@ -1904,7 +1904,7 @@ static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi, if( inputWinDsDeviceInfo->deviceInputChannelCountIsKnown && inputChannelCount > inputDeviceInfo->maxInputChannels ) return paInvalidChannelCount; - + /* validate hostApiSpecificStreamInfo */ inputStreamInfo = (PaWinDirectSoundStreamInfo*)inputParameters->hostApiSpecificStreamInfo; result = ValidateWinDirectSoundSpecificStreamInfo( inputParameters, inputStreamInfo ); @@ -1948,7 +1948,7 @@ static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi, /* validate hostApiSpecificStreamInfo */ outputStreamInfo = (PaWinDirectSoundStreamInfo*)outputParameters->hostApiSpecificStreamInfo; result = ValidateWinDirectSoundSpecificStreamInfo( outputParameters, outputStreamInfo ); - if( result != paNoError ) return result; + if( result != paNoError ) return result; if( outputStreamInfo && outputStreamInfo->flags & paWinDirectSoundUseLowLevelLatencyParameters ) userRequestedHostOutputBufferSizeFrames = outputStreamInfo->framesPerBuffer; @@ -2025,7 +2025,7 @@ static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi, PaUtil_InitializeStreamRepresentation( &stream->streamRepresentation, &winDsHostApi->blockingStreamInterface, streamCallback, userData ); } - + streamRepresentationIsInitialized = 1; stream->streamFlags = streamFlags; @@ -2074,12 +2074,12 @@ static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi, bufferProcessorIsInitialized = 1; - -/* DirectSound specific initialization */ + +/* DirectSound specific initialization */ { HRESULT hr; unsigned long integerSampleRate = (unsigned long) (sampleRate + 0.5); - + stream->processingCompleted = CreateEvent( NULL, /* bManualReset = */ TRUE, /* bInitialState = */ FALSE, NULL ); if( stream->processingCompleted == NULL ) { @@ -2122,7 +2122,7 @@ static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi, */ stream->hostBufferSizeFrames = max( userRequestedHostInputBufferSizeFrames, userRequestedHostOutputBufferSizeFrames ); - CalculatePollingPeriodFrames( + CalculatePollingPeriodFrames( stream->hostBufferSizeFrames, &pollingPeriodFrames, sampleRate, framesPerBuffer ); } @@ -2131,13 +2131,13 @@ static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi, CalculateBufferSettings( (unsigned long*)&stream->hostBufferSizeFrames, &pollingPeriodFrames, /* isFullDuplex = */ (inputParameters && outputParameters), suggestedInputLatencyFrames, - suggestedOutputLatencyFrames, + suggestedOutputLatencyFrames, sampleRate, framesPerBuffer ); } stream->pollingPeriodSeconds = pollingPeriodFrames / sampleRate; - DBUG(("DirectSound host buffer size frames: %d, polling period seconds: %f, @ sr: %f\n", + DBUG(("DirectSound host buffer size frames: %d, polling period seconds: %f, @ sr: %f\n", stream->hostBufferSizeFrames, stream->pollingPeriodSeconds, sampleRate )); @@ -2150,7 +2150,7 @@ static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi, PaDeviceInfo *deviceInfo = hostApi->deviceInfos[ outputParameters->device ]; DBUG(("PaHost_OpenStream: deviceID = 0x%x\n", outputParameters->device)); */ - + int sampleSizeBytes = Pa_GetSampleSize(hostOutputSampleFormat); stream->outputFrameSizeBytes = outputParameters->channelCount * sampleSizeBytes; @@ -2173,7 +2173,7 @@ static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi, stream->outputIsRunning = FALSE; stream->outputUnderflowCount = 0; - + /* perfCounterTicksPerBuffer is used by QueryOutputSpace for overflow detection */ if( QueryPerformanceFrequency( &counterFrequency ) ) { @@ -2192,7 +2192,7 @@ static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi, PaDeviceInfo *deviceInfo = hostApi->deviceInfos[ inputParameters->device ]; DBUG(("PaHost_OpenStream: deviceID = 0x%x\n", inputParameters->device)); */ - + int sampleSizeBytes = Pa_GetSampleSize(hostInputSampleFormat); stream->inputFrameSizeBytes = inputParameters->channelCount * sampleSizeBytes; @@ -2217,7 +2217,7 @@ static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi, assert( stream->pDirectSound == NULL ); assert( stream->pDirectSoundPrimaryBuffer == NULL ); assert( stream->pDirectSoundOutputBuffer == NULL ); - + if( inputParameters && outputParameters ) { @@ -2237,14 +2237,14 @@ static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi, integerSampleRate ); DBUG(("InitFullDuplexInputOutputBuffers() returns %x\n", hr)); - /* ignore any error returned by InitFullDuplexInputOutputBuffers. + /* ignore any error returned by InitFullDuplexInputOutputBuffers. we retry opening the buffers below */ #endif /* PAWIN_USE_DIRECTSOUNDFULLDUPLEXCREATE */ } - /* create half duplex buffers. also used for full-duplex streams which didn't + /* create half duplex buffers. also used for full-duplex streams which didn't succeed when using the full duplex API. that could happen because - DX8 or greater isn't installed, the i/o devices aren't the same + DX8 or greater isn't installed, the i/o devices aren't the same physical device. etc. */ @@ -2426,11 +2426,11 @@ static HRESULT QueryOutputSpace( PaWinDsStream *stream, long *bytesEmpty ) /* From MSDN: - The write cursor indicates the position at which it is safe + The write cursor indicates the position at which it is safe to write new data to the buffer. The write cursor always leads the play cursor, typically by about 15 milliseconds' worth of audio data. - It is always safe to change data that is behind the position + It is always safe to change data that is behind the position indicated by the lpdwCurrentPlayCursor parameter. */ @@ -2456,7 +2456,7 @@ static int TimeSlice( PaWinDsStream *stream ) double outputLatency = 0; double inputLatency = 0; PaStreamCallbackTimeInfo timeInfo = {0,0,0}; - + /* Input */ LPBYTE lpInBuf1 = NULL; LPBYTE lpInBuf2 = NULL; @@ -2489,7 +2489,7 @@ static int TimeSlice( PaWinDsStream *stream ) } // FIXME: what happens if IDirectSoundCaptureBuffer_GetCurrentPosition fails? - framesToXfer = numInFramesReady = bytesFilled / stream->inputFrameSizeBytes; + framesToXfer = numInFramesReady = bytesFilled / stream->inputFrameSizeBytes; /** @todo Check for overflow */ } @@ -2502,7 +2502,7 @@ static int TimeSlice( PaWinDsStream *stream ) framesToXfer = numOutFramesReady = bytesEmpty / stream->outputFrameSizeBytes; /* Check for underflow */ - /* FIXME QueryOutputSpace should not adjust underflow count as a side effect. + /* FIXME QueryOutputSpace should not adjust underflow count as a side effect. A query function should be a const operator on the stream and return a flag on underflow. */ if( stream->outputUnderflowCount != previousUnderflowCount ) stream->callbackFlags |= paOutputUnderflow; @@ -2532,11 +2532,11 @@ static int TimeSlice( PaWinDsStream *stream ) PaUtil_BeginBufferProcessing( &stream->bufferProcessor, &timeInfo, stream->callbackFlags ); stream->callbackFlags = 0; - + /* Input */ if( stream->bufferProcessor.inputChannelCount > 0 ) { - timeInfo.inputBufferAdcTime = timeInfo.currentTime - inputLatency; + timeInfo.inputBufferAdcTime = timeInfo.currentTime - inputLatency; bytesToXfer = framesToXfer * stream->inputFrameSizeBytes; hresult = IDirectSoundCaptureBuffer_Lock ( stream->pDirectSoundInputBuffer, @@ -2603,7 +2603,7 @@ static int TimeSlice( PaWinDsStream *stream ) numFrames = PaUtil_EndBufferProcessing( &stream->bufferProcessor, &stream->callbackResult ); stream->framesWritten += numFrames; - + if( stream->bufferProcessor.outputChannelCount > 0 ) { /* FIXME: an underflow could happen here */ @@ -2626,7 +2626,7 @@ error1: } error2: - PaUtil_EndCpuLoadMeasurement( &stream->cpuLoadMeasurer, numFrames ); + PaUtil_EndCpuLoadMeasurement( &stream->cpuLoadMeasurer, numFrames ); } if( stream->callbackResult == paComplete && !PaUtil_IsBufferProcessorOutputEmpty( &stream->bufferProcessor ) ) @@ -2684,7 +2684,7 @@ static void CALLBACK TimerCallback(UINT uID, UINT uMsg, DWORD_PTR dwUser, DWORD (void) uMsg; (void) dw1; (void) dw2; - + stream = (PaWinDsStream *) dwUser; if( stream == NULL ) return; @@ -2715,8 +2715,8 @@ static void CALLBACK TimerCallback(UINT uID, UINT uMsg, DWORD_PTR dwUser, DWORD int callbackResult = TimeSlice( stream ); if( callbackResult != paContinue ) { - /* FIXME implement handling of paComplete and paAbort if possible - At the moment this should behave as if paComplete was called and + /* FIXME implement handling of paComplete and paAbort if possible + At the moment this should behave as if paComplete was called and flush the buffer. */ @@ -2892,7 +2892,7 @@ static HRESULT ClearOutputBuffer( PaWinDsStream *stream ) // Unlock the DS buffer if ((hr = IDirectSoundBuffer_Unlock( stream->pDirectSoundOutputBuffer, pDSBuffData, dwDataLen, NULL, 0)) != DS_OK) return hr; - + // Let DSound set the starting write position because if we set it to zero, it looks like the // buffer is full to begin with. This causes a long pause before sound starts when using large buffers. if ((hr = IDirectSoundBuffer_GetCurrentPosition( stream->pDirectSoundOutputBuffer, @@ -2909,10 +2909,10 @@ static PaError StartStream( PaStream *s ) PaError result = paNoError; PaWinDsStream *stream = (PaWinDsStream*)s; HRESULT hr; - + stream->callbackResult = paContinue; PaUtil_ResetBufferProcessor( &stream->bufferProcessor ); - + ResetEvent( stream->processingCompleted ); #ifndef PA_WIN_DS_USE_WMME_TIMER @@ -3017,7 +3017,7 @@ static PaError StartStream( PaStream *s ) */ stream->timerID = timeSetEvent( timerPeriodMs, stream->systemTimerResolutionPeriodMs, (LPTIMECALLBACK) TimerCallback, (DWORD_PTR) stream, TIME_PERIODIC | TIME_KILL_SYNCHRONOUS ); - + if( stream->timerID == 0 ) { stream->isActive = 0; @@ -3112,7 +3112,7 @@ static PaError StopStream( PaStream *s ) if( stream->systemTimerResolutionPeriodMs > 0 ){ timeEndPeriod( stream->systemTimerResolutionPeriodMs ); stream->systemTimerResolutionPeriodMs = 0; - } + } if( stream->bufferProcessor.outputChannelCount > 0 ) { @@ -3252,7 +3252,7 @@ static signed long GetStreamWriteAvailable( PaStream* s ) /* suppress unused variable warnings */ (void) stream; - + /* IMPLEMENT ME, see portaudio.h for required behavior*/ return 0; diff --git a/src/hostapi/dsound/pa_win_ds_dynlink.c b/src/hostapi/dsound/pa_win_ds_dynlink.c index fdfc8bd..e54df99 100644 --- a/src/hostapi/dsound/pa_win_ds_dynlink.c +++ b/src/hostapi/dsound/pa_win_ds_dynlink.c @@ -29,13 +29,13 @@ */ /* - * The text above constitutes the entire PortAudio license; however, + * The text above constitutes the entire PortAudio license; however, * the PortAudio community also makes the following non-binding requests: * * 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. It is also - * requested that these non-binding requests be included along with the + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the * license above. */ @@ -180,7 +180,7 @@ void PaWinDs_InitializeDSoundEntryPoints(void) #ifdef PAWIN_USE_DIRECTSOUNDFULLDUPLEXCREATE paWinDsDSoundEntryPoints.DirectSoundFullDuplexCreate8 = (HRESULT (WINAPI *)(LPCGUID, LPCGUID, LPCDSCBUFFERDESC, LPCDSBUFFERDESC, - HWND, DWORD, LPDIRECTSOUNDFULLDUPLEX *, LPDIRECTSOUNDCAPTUREBUFFER8 *, + HWND, DWORD, LPDIRECTSOUNDFULLDUPLEX *, LPDIRECTSOUNDCAPTUREBUFFER8 *, LPDIRECTSOUNDBUFFER8 *, LPUNKNOWN)) GetProcAddress( paWinDsDSoundEntryPoints.hInstance_, "DirectSoundFullDuplexCreate" ); if( paWinDsDSoundEntryPoints.DirectSoundFullDuplexCreate8 == NULL ) @@ -221,4 +221,4 @@ void PaWinDs_TerminateDSoundEntryPoints(void) FreeLibrary( paWinDsDSoundEntryPoints.hInstance_ ); paWinDsDSoundEntryPoints.hInstance_ = NULL; } -} \ No newline at end of file +} diff --git a/src/hostapi/dsound/pa_win_ds_dynlink.h b/src/hostapi/dsound/pa_win_ds_dynlink.h index 0fcf967..2cdf6f0 100644 --- a/src/hostapi/dsound/pa_win_ds_dynlink.h +++ b/src/hostapi/dsound/pa_win_ds_dynlink.h @@ -29,13 +29,13 @@ */ /* - * The text above constitutes the entire PortAudio license; however, + * The text above constitutes the entire PortAudio license; however, * the PortAudio community also makes the following non-binding requests: * * 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. It is also - * requested that these non-binding requests be included along with the + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the * license above. */ @@ -74,7 +74,7 @@ extern "C" typedef struct { HINSTANCE hInstance_; - + HRESULT (WINAPI *DllGetClassObject)(REFCLSID , REFIID , LPVOID *); HRESULT (WINAPI *DirectSoundCreate)(LPGUID, LPDIRECTSOUND *, LPUNKNOWN); @@ -88,7 +88,7 @@ typedef struct #ifdef PAWIN_USE_DIRECTSOUNDFULLDUPLEXCREATE HRESULT (WINAPI *DirectSoundFullDuplexCreate8)( LPCGUID, LPCGUID, LPCDSCBUFFERDESC, LPCDSBUFFERDESC, - HWND, DWORD, LPDIRECTSOUNDFULLDUPLEX *, LPDIRECTSOUNDCAPTUREBUFFER8 *, + HWND, DWORD, LPDIRECTSOUNDFULLDUPLEX *, LPDIRECTSOUNDCAPTUREBUFFER8 *, LPDIRECTSOUNDBUFFER8 *, LPUNKNOWN ); #endif }PaWinDsDSoundEntryPoints; From af9f4e3e194f5697dcdd841ca2c43f0855bcb69d Mon Sep 17 00:00:00 2001 From: Ross Bencina Date: Thu, 21 Jan 2021 22:46:49 +1100 Subject: [PATCH 090/164] Clean up whitespace in pa_win_wmme.c in preparation for .editorconfig (#413) * Clean up whitespace in pa_win_wmme.c in preparation for .editorconfig. Convert tabs to 4 spaces. Indent by 4 spaces. Strip trailing whitespace. Ensure EOL at EOF. * vertically align trailing comments on 4 space boundary --- src/hostapi/wmme/pa_win_wmme.c | 450 ++++++++++++++++----------------- 1 file changed, 225 insertions(+), 225 deletions(-) diff --git a/src/hostapi/wmme/pa_win_wmme.c b/src/hostapi/wmme/pa_win_wmme.c index d5337b8..18256c8 100644 --- a/src/hostapi/wmme/pa_win_wmme.c +++ b/src/hostapi/wmme/pa_win_wmme.c @@ -1,8 +1,8 @@ /* * $Id$ * pa_win_wmme.c - * Implementation of PortAudio for Windows MultiMedia Extensions (WMME) - * + * Implementation of PortAudio for Windows MultiMedia Extensions (WMME) + * * PortAudio Portable Real-Time Audio Library * Latest Version at: http://www.portaudio.com * @@ -30,13 +30,13 @@ */ /* - * The text above constitutes the entire PortAudio license; however, + * The text above constitutes the entire PortAudio license; however, * the PortAudio community also makes the following non-binding requests: * * 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. It is also - * requested that these non-binding requests be included along with the + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the * license above. */ @@ -155,21 +155,21 @@ #define PA_MME_USE_HIGH_DEFAULT_LATENCY_ (0) /* For debugging glitches. */ #if PA_MME_USE_HIGH_DEFAULT_LATENCY_ - #define PA_MME_WIN_9X_DEFAULT_LATENCY_ (0.4) - #define PA_MME_MIN_HOST_OUTPUT_BUFFER_COUNT_ (4) - #define PA_MME_MIN_HOST_INPUT_BUFFER_COUNT_FULL_DUPLEX_ (4) - #define PA_MME_MIN_HOST_INPUT_BUFFER_COUNT_HALF_DUPLEX_ (4) - #define PA_MME_HOST_BUFFER_GRANULARITY_FRAMES_WHEN_UNSPECIFIED_ (16) - #define PA_MME_MAX_HOST_BUFFER_SECS_ (0.3) /* Do not exceed unless user buffer exceeds */ - #define PA_MME_MAX_HOST_BUFFER_BYTES_ (32 * 1024) /* Has precedence over PA_MME_MAX_HOST_BUFFER_SECS_, some drivers are known to crash with buffer sizes > 32k */ + #define PA_MME_WIN_9X_DEFAULT_LATENCY_ (0.4) + #define PA_MME_MIN_HOST_OUTPUT_BUFFER_COUNT_ (4) + #define PA_MME_MIN_HOST_INPUT_BUFFER_COUNT_FULL_DUPLEX_ (4) + #define PA_MME_MIN_HOST_INPUT_BUFFER_COUNT_HALF_DUPLEX_ (4) + #define PA_MME_HOST_BUFFER_GRANULARITY_FRAMES_WHEN_UNSPECIFIED_ (16) + #define PA_MME_MAX_HOST_BUFFER_SECS_ (0.3) /* Do not exceed unless user buffer exceeds */ + #define PA_MME_MAX_HOST_BUFFER_BYTES_ (32 * 1024) /* Has precedence over PA_MME_MAX_HOST_BUFFER_SECS_, some drivers are known to crash with buffer sizes > 32k */ #else - #define PA_MME_WIN_9X_DEFAULT_LATENCY_ (0.2) - #define PA_MME_MIN_HOST_OUTPUT_BUFFER_COUNT_ (2) - #define PA_MME_MIN_HOST_INPUT_BUFFER_COUNT_FULL_DUPLEX_ (3) /* always use at least 3 input buffers for full duplex */ - #define PA_MME_MIN_HOST_INPUT_BUFFER_COUNT_HALF_DUPLEX_ (2) - #define PA_MME_HOST_BUFFER_GRANULARITY_FRAMES_WHEN_UNSPECIFIED_ (16) - #define PA_MME_MAX_HOST_BUFFER_SECS_ (0.1) /* Do not exceed unless user buffer exceeds */ - #define PA_MME_MAX_HOST_BUFFER_BYTES_ (32 * 1024) /* Has precedence over PA_MME_MAX_HOST_BUFFER_SECS_, some drivers are known to crash with buffer sizes > 32k */ + #define PA_MME_WIN_9X_DEFAULT_LATENCY_ (0.2) + #define PA_MME_MIN_HOST_OUTPUT_BUFFER_COUNT_ (2) + #define PA_MME_MIN_HOST_INPUT_BUFFER_COUNT_FULL_DUPLEX_ (3) /* always use at least 3 input buffers for full duplex */ + #define PA_MME_MIN_HOST_INPUT_BUFFER_COUNT_HALF_DUPLEX_ (2) + #define PA_MME_HOST_BUFFER_GRANULARITY_FRAMES_WHEN_UNSPECIFIED_ (16) + #define PA_MME_MAX_HOST_BUFFER_SECS_ (0.1) /* Do not exceed unless user buffer exceeds */ + #define PA_MME_MAX_HOST_BUFFER_BYTES_ (32 * 1024) /* Has precedence over PA_MME_MAX_HOST_BUFFER_SECS_, some drivers are known to crash with buffer sizes > 32k */ #endif /* Use higher latency for NT because it is even worse at real-time @@ -181,7 +181,7 @@ survey of workable latency settings using patest_wmme_find_best_latency_params.c. See pdf attached to ticket 185 for a graph of the survey results: http://www.portaudio.com/trac/ticket/185 - + Workable latencies varied between 40ms and ~80ms on different systems (different combinations of hardware, 32 and 64 bit, WinXP, Vista and Win7. We didn't get enough Vista results to know if Vista has systemically worse latency. @@ -190,10 +190,10 @@ #define PA_MME_WIN_WDM_DEFAULT_LATENCY_ (0.090) -/* When client suggestedLatency could result in many host buffers, we aim to have around 8, +/* When client suggestedLatency could result in many host buffers, we aim to have around 8, based off Windows documentation that suggests that the kmixer uses 8 buffers. This choice - is somewhat arbitrary here, since we haven't observed significant stability degredation - with using either more, or less buffers. + is somewhat arbitrary here, since we haven't observed significant stability degredation + with using either more, or less buffers. */ #define PA_MME_TARGET_HOST_BUFFER_COUNT_ 8 @@ -209,8 +209,8 @@ static char *CopyWCharStringToUtf8CString(char *destination, size_t destLengthBy { /* The cbMultiByte parameter ["destLengthBytes" below] is: """ - Size, in bytes, of the buffer indicated by lpMultiByteStr ["destination" below]. - If this parameter is set to 0, the function returns the required buffer + Size, in bytes, of the buffer indicated by lpMultiByteStr ["destination" below]. + If this parameter is set to 0, the function returns the required buffer size for lpMultiByteStr and makes no use of the output parameter itself. """ Source: WideCharToMultiByte at MSDN: @@ -230,13 +230,13 @@ static char *CopyWCharStringToUtf8CString(char *destination, size_t destLengthBy { intDestLengthBytes = INT_MAX; } - + if (WideCharToMultiByte(CP_UTF8, 0, source, -1, destination, /*cbMultiByte=*/intDestLengthBytes, NULL, NULL) == 0) return NULL; return destination; } -/* returns required length (in bytes) of destination buffer when +/* returns required length (in bytes) of destination buffer when converting WCHAR string to UTF8 bytes, not including the terminating null. */ static size_t WCharStringLen(const WCHAR *str) { @@ -344,7 +344,7 @@ static PaError CreateEventWithPaError( HANDLE *handle, PaError result = paNoError; *handle = NULL; - + *handle = CreateEvent( lpEventAttributes, bManualReset, bInitialState, lpName ); if( *handle == NULL ) { @@ -376,7 +376,7 @@ static PaError ResetEventWithPaError( HANDLE handle ) static PaError CloseHandleWithPaError( HANDLE handle ) { PaError result = paNoError; - + if( handle ) { if( CloseHandle( handle ) == 0 ) @@ -385,7 +385,7 @@ static PaError CloseHandleWithPaError( HANDLE handle ) PA_MME_SET_LAST_SYSTEM_ERROR( GetLastError() ); } } - + return result; } @@ -399,14 +399,14 @@ typedef struct PaUtilStreamInterface blockingStreamInterface; PaUtilAllocationGroup *allocations; - + int inputDeviceCount, outputDeviceCount; /** winMmeDeviceIds is an array of WinMme device ids. fields in the range [0, inputDeviceCount) are input device ids, and [inputDeviceCount, inputDeviceCount + outputDeviceCount) are output device ids. - */ + */ UINT *winMmeDeviceIds; } PaWinMmeHostApiRepresentation; @@ -507,21 +507,21 @@ static int SampleFormatAndWinWmmeSpecificFlagsToLinearWaveFormatTag( PaSampleFor static PaError QueryInputWaveFormatEx( int deviceId, WAVEFORMATEX *waveFormatEx ) { MMRESULT mmresult; - + switch( mmresult = waveInOpen( NULL, deviceId, waveFormatEx, 0, 0, WAVE_FORMAT_QUERY ) ) { case MMSYSERR_NOERROR: return paNoError; case MMSYSERR_ALLOCATED: /* Specified resource is already allocated. */ return paDeviceUnavailable; - case MMSYSERR_NODRIVER: /* No device driver is present. */ + case MMSYSERR_NODRIVER: /* No device driver is present. */ return paDeviceUnavailable; - case MMSYSERR_NOMEM: /* Unable to allocate or lock memory. */ + case MMSYSERR_NOMEM: /* Unable to allocate or lock memory. */ return paInsufficientMemory; case WAVERR_BADFORMAT: /* Attempted to open with an unsupported waveform-audio format. */ return paSampleFormatNotSupported; - - case MMSYSERR_BADDEVICEID: /* Specified device identifier is out of range. */ + + case MMSYSERR_BADDEVICEID: /* Specified device identifier is out of range. */ /* falls through */ default: PA_MME_SET_LAST_WAVEIN_ERROR( mmresult ); @@ -533,21 +533,21 @@ static PaError QueryInputWaveFormatEx( int deviceId, WAVEFORMATEX *waveFormatEx static PaError QueryOutputWaveFormatEx( int deviceId, WAVEFORMATEX *waveFormatEx ) { MMRESULT mmresult; - + switch( mmresult = waveOutOpen( NULL, deviceId, waveFormatEx, 0, 0, WAVE_FORMAT_QUERY ) ) { case MMSYSERR_NOERROR: return paNoError; case MMSYSERR_ALLOCATED: /* Specified resource is already allocated. */ return paDeviceUnavailable; - case MMSYSERR_NODRIVER: /* No device driver is present. */ + case MMSYSERR_NODRIVER: /* No device driver is present. */ return paDeviceUnavailable; - case MMSYSERR_NOMEM: /* Unable to allocate or lock memory. */ + case MMSYSERR_NOMEM: /* Unable to allocate or lock memory. */ return paInsufficientMemory; case WAVERR_BADFORMAT: /* Attempted to open with an unsupported waveform-audio format. */ return paSampleFormatNotSupported; - - case MMSYSERR_BADDEVICEID: /* Specified device identifier is out of range. */ + + case MMSYSERR_BADDEVICEID: /* Specified device identifier is out of range. */ /* falls through */ default: PA_MME_SET_LAST_WAVEOUT_ERROR( mmresult ); @@ -564,14 +564,14 @@ static PaError QueryFormatSupported( PaDeviceInfo *deviceInfo, PaWinWaveFormat waveFormat; PaSampleFormat sampleFormat; int waveFormatTag; - + /* @todo at the moment we only query with 16 bit sample format and directout speaker config*/ sampleFormat = paInt16; waveFormatTag = SampleFormatAndWinWmmeSpecificFlagsToLinearWaveFormatTag( sampleFormat, winMmeSpecificFlags ); if( waveFormatTag == PaWin_SampleFormatToLinearWaveFormatTag( paInt16 ) ){ - + /* attempt bypass querying the device for linear formats */ if( sampleRate == 11025.0 @@ -597,7 +597,7 @@ static PaError QueryFormatSupported( PaDeviceInfo *deviceInfo, } - /* first, attempt to query the device using WAVEFORMATEXTENSIBLE, + /* first, attempt to query the device using WAVEFORMATEXTENSIBLE, if this fails we fall back to WAVEFORMATEX */ PaWin_InitializeWaveFormatExtensible( &waveFormat, channels, sampleFormat, waveFormatTag, @@ -622,12 +622,12 @@ static void DetectDefaultSampleRate( PaWinMmeDeviceInfo *winMmeDeviceInfo, int w { PaDeviceInfo *deviceInfo = &winMmeDeviceInfo->inheritedDeviceInfo; int i; - + deviceInfo->defaultSampleRate = 0.; for( i=0; i < PA_DEFAULTSAMPLERATESEARCHORDER_COUNT_; ++i ) { - double sampleRate = defaultSampleRateSearchOrder_[ i ]; + double sampleRate = defaultSampleRateSearchOrder_[ i ]; PaError paerror = QueryFormatSupported( deviceInfo, waveFormatExQueryFunction, winMmeDeviceId, maxChannels, sampleRate, 0 ); if( paerror == paNoError ) { @@ -684,7 +684,7 @@ static PaError InitializeInputDeviceInfo( PaWinMmeHostApiRepresentation *winMmeH WAVEINCAPSW wic; PaDeviceInfo *deviceInfo = &winMmeDeviceInfo->inheritedDeviceInfo; size_t len; - + *success = 0; mmresult = waveInGetDevCapsW( winMmeInputDeviceId, &wic, sizeof( WAVEINCAPSW ) ); @@ -701,7 +701,7 @@ static PaError InitializeInputDeviceInfo( PaWinMmeHostApiRepresentation *winMmeH the entire initialisation process. */ return paNoError; - } + } /* NOTE: the WAVEOUTCAPS.szPname is a null-terminated array of 32 characters, so we are limited to displaying only the first 31 characters of the device name. */ @@ -755,7 +755,7 @@ static PaError InitializeInputDeviceInfo( PaWinMmeHostApiRepresentation *winMmeH } #ifdef PAWIN_USE_WDMKS_DEVICE_INFO - winMmeDeviceInfo->deviceInputChannelCountIsKnown = + winMmeDeviceInfo->deviceInputChannelCountIsKnown = QueryWaveInKSFilterMaxChannels( winMmeInputDeviceId, &deviceInfo->maxInputChannels ); #endif /* PAWIN_USE_WDMKS_DEVICE_INFO */ @@ -765,7 +765,7 @@ static PaError InitializeInputDeviceInfo( PaWinMmeHostApiRepresentation *winMmeH QueryInputWaveFormatEx, deviceInfo->maxInputChannels ); *success = 1; - + error: return result; } @@ -846,7 +846,7 @@ static PaError InitializeOutputDeviceInfo( PaWinMmeHostApiRepresentation *winMme /* Append I/O suffix to WAVE_MAPPER device. */ len = WCharStringLen( woc.szPname ) + 1 + sizeof(constOutputMapperSuffix_); deviceName = (char*)PaUtil_GroupAllocateMemory( - winMmeHostApi->allocations, + winMmeHostApi->allocations, (long)len ); if( !deviceName ) { @@ -860,7 +860,7 @@ static PaError InitializeOutputDeviceInfo( PaWinMmeHostApiRepresentation *winMme { len = WCharStringLen( woc.szPname ) + 1; deviceName = (char*)PaUtil_GroupAllocateMemory( - winMmeHostApi->allocations, + winMmeHostApi->allocations, (long)len ); if( !deviceName ) { @@ -880,7 +880,7 @@ static PaError InitializeOutputDeviceInfo( PaWinMmeHostApiRepresentation *winMme * device*ChannelCountIsKnown is false, OpenStream will try whatever * channel count you supply. * see also InitializeInputDeviceInfo() above. - */ + */ PA_DEBUG(("Pa_GetDeviceInfo: Num output channels reported as %d! Changed to 2.\n", woc.wChannels )); deviceInfo->maxOutputChannels = 2; @@ -891,7 +891,7 @@ static PaError InitializeOutputDeviceInfo( PaWinMmeHostApiRepresentation *winMme } #ifdef PAWIN_USE_WDMKS_DEVICE_INFO - wdmksDeviceOutputChannelCountIsKnown = QueryWaveOutKSFilterMaxChannels( + wdmksDeviceOutputChannelCountIsKnown = QueryWaveOutKSFilterMaxChannels( winMmeOutputDeviceId, &deviceInfo->maxOutputChannels ); if( wdmksDeviceOutputChannelCountIsKnown && !winMmeDeviceInfo->deviceOutputChannelCountIsKnown ) winMmeDeviceInfo->deviceOutputChannelCountIsKnown = 1; @@ -903,7 +903,7 @@ static PaError InitializeOutputDeviceInfo( PaWinMmeHostApiRepresentation *winMme QueryOutputWaveFormatEx, deviceInfo->maxOutputChannels ); *success = 1; - + error: return result; } @@ -932,12 +932,12 @@ See: http://www.codeproject.com/Articles/678606/Part-Overcoming-Windows-s-deprec } else if(osvi.dwMajorVersion >= 5) { - *defaultLowLatency = PA_MME_WIN_WDM_DEFAULT_LATENCY_; + *defaultLowLatency = PA_MME_WIN_WDM_DEFAULT_LATENCY_; } else { - *defaultLowLatency = PA_MME_WIN_9X_DEFAULT_LATENCY_; - } + *defaultLowLatency = PA_MME_WIN_9X_DEFAULT_LATENCY_; + } *defaultHighLatency = *defaultLowLatency * 2; @@ -976,7 +976,7 @@ PaError PaWinMme_Initialize( PaUtilHostApiRepresentation **hostApi, PaHostApiInd (*hostApi)->info.type = paMME; (*hostApi)->info.name = "MME"; - + /* initialise device counts and default devices under the assumption that there are no devices. These values are incremented below if and when devices are successfully initialized. @@ -1005,11 +1005,11 @@ PaError PaWinMme_Initialize( PaUtilHostApiRepresentation **hostApi, PaHostApiInd inputDeviceCount = waveInGetNumDevs(); if( inputDeviceCount > 0 ) - maximumPossibleDeviceCount += inputDeviceCount + 1; /* assume there is a WAVE_MAPPER */ + maximumPossibleDeviceCount += inputDeviceCount + 1; /* assume there is a WAVE_MAPPER */ outputDeviceCount = waveOutGetNumDevs(); if( outputDeviceCount > 0 ) - maximumPossibleDeviceCount += outputDeviceCount + 1; /* assume there is a WAVE_MAPPER */ + maximumPossibleDeviceCount += outputDeviceCount + 1; /* assume there is a WAVE_MAPPER */ if( maximumPossibleDeviceCount > 0 ){ @@ -1069,7 +1069,7 @@ PaError PaWinMme_Initialize( PaUtilHostApiRepresentation **hostApi, PaHostApiInd if( (*hostApi)->info.defaultInputDevice == paNoDevice ){ /* if there is currently no default device, use the first one available */ (*hostApi)->info.defaultInputDevice = (*hostApi)->info.deviceCount; - + }else if( winMmeDeviceId == waveInPreferredDevice ){ /* set the default device to the system preferred device */ (*hostApi)->info.defaultInputDevice = (*hostApi)->info.deviceCount; @@ -1101,7 +1101,7 @@ PaError PaWinMme_Initialize( PaUtilHostApiRepresentation **hostApi, PaHostApiInd deviceInfo->defaultLowInputLatency = defaultLowLatency; deviceInfo->defaultLowOutputLatency = defaultLowLatency; deviceInfo->defaultHighInputLatency = defaultHighLatency; - deviceInfo->defaultHighOutputLatency = defaultHighLatency; + deviceInfo->defaultHighOutputLatency = defaultHighLatency; result = InitializeOutputDeviceInfo( winMmeHostApi, wmmeDeviceInfo, winMmeDeviceId, &deviceInfoInitializationSucceeded ); @@ -1127,7 +1127,7 @@ PaError PaWinMme_Initialize( PaUtilHostApiRepresentation **hostApi, PaHostApiInd } } } - + InitializeDefaultDeviceIdsFromEnv( winMmeHostApi ); (*hostApi)->Terminate = Terminate; @@ -1155,7 +1155,7 @@ error: PaUtil_FreeAllAllocations( winMmeHostApi->allocations ); PaUtil_DestroyAllocationGroup( winMmeHostApi->allocations ); } - + PaUtil_FreeMemory( winMmeHostApi ); } @@ -1185,7 +1185,7 @@ static PaError IsInputChannelCountSupported( PaWinMmeDeviceInfo* deviceInfo, int && deviceInfo->deviceInputChannelCountIsKnown && channelCount > deviceInfo->inheritedDeviceInfo.maxInputChannels ){ - result = paInvalidChannelCount; + result = paInvalidChannelCount; } return result; @@ -1199,7 +1199,7 @@ static PaError IsOutputChannelCountSupported( PaWinMmeDeviceInfo* deviceInfo, in && deviceInfo->deviceOutputChannelCountIsKnown && channelCount > deviceInfo->inheritedDeviceInfo.maxOutputChannels ){ - result = paInvalidChannelCount; + result = paInvalidChannelCount; } return result; @@ -1225,14 +1225,14 @@ static PaError IsFormatSupported( struct PaUtilHostApiRepresentation *hostApi, then the only thing that could fail is the sample rate. This isn't strictly true, but I can't think of a better way to test that the sample rate is valid. - */ - + */ + if( inputParameters ) { inputChannelCount = inputParameters->channelCount; inputSampleFormat = inputParameters->sampleFormat; inputStreamInfo = inputParameters->hostApiSpecificStreamInfo; - + /* all standard sample formats are supported by the buffer adapter, this implementation doesn't support any custom sample formats */ if( inputSampleFormat & paCustomFormat ) @@ -1245,29 +1245,29 @@ static PaError IsFormatSupported( struct PaUtilHostApiRepresentation *hostApi, for( i=0; i< inputStreamInfo->deviceCount; ++i ) { inputMultipleDeviceChannelCount += inputStreamInfo->devices[i].channelCount; - + inputDeviceInfo = hostApi->deviceInfos[ inputStreamInfo->devices[i].device ]; /* check that input device can support inputChannelCount */ if( inputStreamInfo->devices[i].channelCount < 1 ) return paInvalidChannelCount; - paerror = IsInputChannelCountSupported( (PaWinMmeDeviceInfo*)inputDeviceInfo, + paerror = IsInputChannelCountSupported( (PaWinMmeDeviceInfo*)inputDeviceInfo, inputStreamInfo->devices[i].channelCount ); if( paerror != paNoError ) return paerror; /* test for valid sample rate, see comment above */ winMmeInputDeviceId = LocalDeviceIndexToWinMmeDeviceId( winMmeHostApi, inputStreamInfo->devices[i].device ); - paerror = QueryFormatSupported( inputDeviceInfo, QueryInputWaveFormatEx, - winMmeInputDeviceId, inputStreamInfo->devices[i].channelCount, sampleRate, + paerror = QueryFormatSupported( inputDeviceInfo, QueryInputWaveFormatEx, + winMmeInputDeviceId, inputStreamInfo->devices[i].channelCount, sampleRate, ((inputStreamInfo) ? inputStreamInfo->flags : 0) ); if( paerror != paNoError ) return paInvalidSampleRate; } - + if( inputMultipleDeviceChannelCount != inputChannelCount ) - return paIncompatibleHostApiSpecificStreamInfo; + return paIncompatibleHostApiSpecificStreamInfo; } else { @@ -1283,7 +1283,7 @@ static PaError IsFormatSupported( struct PaUtilHostApiRepresentation *hostApi, /* test for valid sample rate, see comment above */ winMmeInputDeviceId = LocalDeviceIndexToWinMmeDeviceId( winMmeHostApi, inputParameters->device ); - paerror = QueryFormatSupported( inputDeviceInfo, QueryInputWaveFormatEx, + paerror = QueryFormatSupported( inputDeviceInfo, QueryInputWaveFormatEx, winMmeInputDeviceId, inputChannelCount, sampleRate, ((inputStreamInfo) ? inputStreamInfo->flags : 0) ); if( paerror != paNoError ) @@ -1309,29 +1309,29 @@ static PaError IsFormatSupported( struct PaUtilHostApiRepresentation *hostApi, for( i=0; i< outputStreamInfo->deviceCount; ++i ) { outputMultipleDeviceChannelCount += outputStreamInfo->devices[i].channelCount; - + outputDeviceInfo = hostApi->deviceInfos[ outputStreamInfo->devices[i].device ]; /* check that output device can support outputChannelCount */ if( outputStreamInfo->devices[i].channelCount < 1 ) return paInvalidChannelCount; - paerror = IsOutputChannelCountSupported( (PaWinMmeDeviceInfo*)outputDeviceInfo, + paerror = IsOutputChannelCountSupported( (PaWinMmeDeviceInfo*)outputDeviceInfo, outputStreamInfo->devices[i].channelCount ); if( paerror != paNoError ) return paerror; /* test for valid sample rate, see comment above */ winMmeOutputDeviceId = LocalDeviceIndexToWinMmeDeviceId( winMmeHostApi, outputStreamInfo->devices[i].device ); - paerror = QueryFormatSupported( outputDeviceInfo, QueryOutputWaveFormatEx, + paerror = QueryFormatSupported( outputDeviceInfo, QueryOutputWaveFormatEx, winMmeOutputDeviceId, outputStreamInfo->devices[i].channelCount, sampleRate, ((outputStreamInfo) ? outputStreamInfo->flags : 0) ); if( paerror != paNoError ) return paInvalidSampleRate; } - + if( outputMultipleDeviceChannelCount != outputChannelCount ) - return paIncompatibleHostApiSpecificStreamInfo; + return paIncompatibleHostApiSpecificStreamInfo; } else { @@ -1347,24 +1347,24 @@ static PaError IsFormatSupported( struct PaUtilHostApiRepresentation *hostApi, /* test for valid sample rate, see comment above */ winMmeOutputDeviceId = LocalDeviceIndexToWinMmeDeviceId( winMmeHostApi, outputParameters->device ); - paerror = QueryFormatSupported( outputDeviceInfo, QueryOutputWaveFormatEx, + paerror = QueryFormatSupported( outputDeviceInfo, QueryOutputWaveFormatEx, winMmeOutputDeviceId, outputChannelCount, sampleRate, ((outputStreamInfo) ? outputStreamInfo->flags : 0) ); if( paerror != paNoError ) return paInvalidSampleRate; } } - + /* - - if a full duplex stream is requested, check that the combination - of input and output parameters is supported + - if a full duplex stream is requested, check that the combination + of input and output parameters is supported - - check that the device supports sampleRate + - check that the device supports sampleRate - for mme all we can do is test that the input and output devices - support the requested sample rate and number of channels. we - cannot test for full duplex compatibility. - */ + for mme all we can do is test that the input and output devices + support the requested sample rate and number of channels. we + cannot test for full duplex compatibility. + */ return paFormatIsSupported; } @@ -1375,7 +1375,7 @@ static unsigned long ComputeHostBufferCountForFixedBufferSizeFrames( unsigned long hostBufferSizeFrames, unsigned long minimumBufferCount ) { - /* Calculate the number of buffers of length hostFramesPerBuffer + /* Calculate the number of buffers of length hostFramesPerBuffer that fit in suggestedLatencyFrames, rounding up to the next integer. The value (hostBufferSizeFrames - 1) below is to ensure the buffer count is rounded up. @@ -1394,11 +1394,11 @@ static unsigned long ComputeHostBufferCountForFixedBufferSizeFrames( } -static unsigned long ComputeHostBufferSizeGivenHardUpperLimit( +static unsigned long ComputeHostBufferSizeGivenHardUpperLimit( unsigned long userFramesPerBuffer, unsigned long absoluteMaximumBufferSizeFrames ) { - static unsigned long primes_[] = { 2, 3, 5, 7, 11, 13, 17, 19, 23, + static unsigned long primes_[] = { 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 0 }; /* zero terminated */ unsigned long result = userFramesPerBuffer; @@ -1406,15 +1406,15 @@ static unsigned long ComputeHostBufferSizeGivenHardUpperLimit( assert( absoluteMaximumBufferSizeFrames > 67 ); /* assume maximum is large and we're only factoring by small primes */ - /* search for the largest integer factor of userFramesPerBuffer less + /* search for the largest integer factor of userFramesPerBuffer less than or equal to absoluteMaximumBufferSizeFrames */ - /* repeatedly divide by smallest prime factors until a buffer size + /* repeatedly divide by smallest prime factors until a buffer size smaller than absoluteMaximumBufferSizeFrames is found */ while( result > absoluteMaximumBufferSizeFrames ){ /* search for the smallest prime factor of result */ - for( i=0; primes_[i] != 0; ++i ) + for( i=0; primes_[i] != 0; ++i ) { unsigned long p = primes_[i]; unsigned long divided = result / p; @@ -1467,17 +1467,17 @@ static PaError SelectHostBufferSizeFramesAndHostBufferCount( effectiveUserFramesPerBuffer = ComputeHostBufferSizeGivenHardUpperLimit( userFramesPerBuffer, absoluteMaximumBufferSizeFrames ); assert( effectiveUserFramesPerBuffer <= absoluteMaximumBufferSizeFrames ); - /* try to ensure that duration of host buffering is at least as + /* try to ensure that duration of host buffering is at least as large as duration of user buffer. */ if( suggestedLatencyFrames < userFramesPerBuffer ) - suggestedLatencyFrames = userFramesPerBuffer; + suggestedLatencyFrames = userFramesPerBuffer; }else{ effectiveUserFramesPerBuffer = userFramesPerBuffer; } } - + /* compute a host buffer count based on suggestedLatencyFrames and our granularity */ *hostBufferSizeFrames = effectiveUserFramesPerBuffer; @@ -1488,12 +1488,12 @@ static PaError SelectHostBufferSizeFramesAndHostBufferCount( if( *hostBufferSizeFrames >= userFramesPerBuffer ) { /* - If there are too many host buffers we would like to coalesce + If there are too many host buffers we would like to coalesce them by packing an integer number of user buffers into each host buffer. - We try to coalesce such that hostBufferCount will lie between + We try to coalesce such that hostBufferCount will lie between PA_MME_TARGET_HOST_BUFFER_COUNT_ and (PA_MME_TARGET_HOST_BUFFER_COUNT_*2)-1. We limit coalescing to avoid exceeding either absoluteMaximumBufferSizeFrames and - preferredMaximumBufferSizeFrames. + preferredMaximumBufferSizeFrames. First, compute a coalescing factor: the number of user buffers per host buffer. The goal is to achieve PA_MME_TARGET_HOST_BUFFER_COUNT_ total buffer count. @@ -1503,7 +1503,7 @@ static PaError SelectHostBufferSizeFramesAndHostBufferCount( The + (PA_MME_TARGET_HOST_BUFFER_COUNT_-2) term below is intended to round up. */ numberOfUserBuffersPerHostBuffer = ((*hostBufferCount - 1) + (PA_MME_TARGET_HOST_BUFFER_COUNT_-2)) / (PA_MME_TARGET_HOST_BUFFER_COUNT_ - 1); - + if( numberOfUserBuffersPerHostBuffer > 1 ) { unsigned long maxCoalescedBufferSizeFrames = (absoluteMaximumBufferSizeFrames < preferredMaximumBufferSizeFrames) /* minimum of our limits */ @@ -1534,8 +1534,8 @@ static PaError CalculateMaxHostSampleFrameSizeBytes( int *hostSampleFrameSizeBytes ) { unsigned int i; - /* PA WMME streams may aggregate multiple WMME devices. When the stream addresses - more than one device in a single direction, maxDeviceChannelCount is the maximum + /* PA WMME streams may aggregate multiple WMME devices. When the stream addresses + more than one device in a single direction, maxDeviceChannelCount is the maximum number of channels used by a single device. */ int maxDeviceChannelCount = channelCount; @@ -1576,11 +1576,11 @@ static PaError CalculateBufferSettings( double sampleRate, unsigned long userFramesPerBuffer ) { PaError result = paNoError; - + if( inputChannelCount > 0 ) /* stream has input */ { int hostInputFrameSizeBytes; - result = CalculateMaxHostSampleFrameSizeBytes( + result = CalculateMaxHostSampleFrameSizeBytes( inputChannelCount, hostInputSampleFormat, inputStreamInfo, &hostInputFrameSizeBytes ); if( result != paNoError ) goto error; @@ -1602,7 +1602,7 @@ static PaError CalculateBufferSettings( } else { - /* input - not using low level latency parameters, so compute + /* input - not using low level latency parameters, so compute hostFramesPerInputBuffer and hostInputBufferCount based on userFramesPerBuffer and suggestedInputLatency. */ @@ -1615,7 +1615,7 @@ static PaError CalculateBufferSettings( userFramesPerBuffer, minimumBufferCount, (unsigned long)(PA_MME_MAX_HOST_BUFFER_SECS_ * sampleRate), /* in frames. preferred maximum */ - (PA_MME_MAX_HOST_BUFFER_BYTES_ / hostInputFrameSizeBytes), /* in frames. a hard limit. note truncation due to + (PA_MME_MAX_HOST_BUFFER_BYTES_ / hostInputFrameSizeBytes), /* in frames. a hard limit. note truncation due to division is intentional here to limit max bytes */ hostFramesPerInputBuffer, hostInputBufferCount ); @@ -1654,7 +1654,7 @@ static PaError CalculateBufferSettings( { if( inputStreamInfo && ( inputStreamInfo->flags & paWinMmeUseLowLevelLatencyParameters ) ) - { + { /* a custom StreamInfo was used for specifying both input and output buffer sizes. We require that the larger buffer size must be a multiple of the smaller buffer size */ @@ -1675,7 +1675,7 @@ static PaError CalculateBufferSettings( result = paIncompatibleHostApiSpecificStreamInfo; goto error; } - } + } } else { @@ -1685,8 +1685,8 @@ static PaError CalculateBufferSettings( *hostFramesPerInputBuffer = *hostFramesPerOutputBuffer; *hostInputBufferCount = ComputeHostBufferCountForFixedBufferSizeFrames( - (unsigned long)(suggestedInputLatency * sampleRate), - *hostFramesPerInputBuffer, + (unsigned long)(suggestedInputLatency * sampleRate), + *hostFramesPerInputBuffer, PA_MME_MIN_HOST_INPUT_BUFFER_COUNT_FULL_DUPLEX_ ); } } @@ -1698,7 +1698,7 @@ static PaError CalculateBufferSettings( based on userFramesPerBuffer and suggestedOutputLatency. */ int hostOutputFrameSizeBytes; - result = CalculateMaxHostSampleFrameSizeBytes( + result = CalculateMaxHostSampleFrameSizeBytes( outputChannelCount, hostOutputSampleFormat, outputStreamInfo, &hostOutputFrameSizeBytes ); if( result != paNoError ) goto error; @@ -1710,7 +1710,7 @@ static PaError CalculateBufferSettings( userFramesPerBuffer, PA_MME_MIN_HOST_OUTPUT_BUFFER_COUNT_, (unsigned long)(PA_MME_MAX_HOST_BUFFER_SECS_ * sampleRate), /* in frames. preferred maximum */ - (PA_MME_MAX_HOST_BUFFER_BYTES_ / hostOutputFrameSizeBytes), /* in frames. a hard limit. note truncation due to + (PA_MME_MAX_HOST_BUFFER_BYTES_ / hostOutputFrameSizeBytes), /* in frames. a hard limit. note truncation due to division is intentional here to limit max bytes */ hostFramesPerOutputBuffer, hostOutputBufferCount ); @@ -1734,8 +1734,8 @@ static PaError CalculateBufferSettings( *hostFramesPerOutputBuffer = *hostFramesPerInputBuffer; *hostOutputBufferCount = ComputeHostBufferCountForFixedBufferSizeFrames( - (unsigned long)(suggestedOutputLatency * sampleRate), - *hostOutputBufferCount, + (unsigned long)(suggestedOutputLatency * sampleRate), + *hostOutputBufferCount, PA_MME_MIN_HOST_OUTPUT_BUFFER_COUNT_ ); } else @@ -1743,11 +1743,11 @@ static PaError CalculateBufferSettings( *hostFramesPerInputBuffer = *hostFramesPerOutputBuffer; *hostInputBufferCount = ComputeHostBufferCountForFixedBufferSizeFrames( - (unsigned long)(suggestedInputLatency * sampleRate), - *hostFramesPerInputBuffer, + (unsigned long)(suggestedInputLatency * sampleRate), + *hostFramesPerInputBuffer, PA_MME_MIN_HOST_INPUT_BUFFER_COUNT_FULL_DUPLEX_ ); } - } + } } } } @@ -1801,7 +1801,7 @@ static void InitializeSingleDirectionHandlesAndBuffers( PaWinMmeSingleDirectionH handlesAndBuffers->deviceCount = 0; handlesAndBuffers->waveHeaders = 0; handlesAndBuffers->bufferCount = 0; -} +} static PaError InitializeWaveHandles( PaWinMmeHostApiRepresentation *winMmeHostApi, PaWinMmeSingleDirectionHandlesAndBuffers *handlesAndBuffers, @@ -1817,7 +1817,7 @@ static PaError InitializeWaveHandles( PaWinMmeHostApiRepresentation *winMmeHostA int waveFormatTag; /* for error cleanup we expect that InitializeSingleDirectionHandlesAndBuffers() - has already been called to zero some fields */ + has already been called to zero some fields */ result = CreateEventWithPaError( &handlesAndBuffers->bufferEvent, NULL, FALSE, FALSE, NULL ); if( result != paNoError ) goto error; @@ -1850,25 +1850,25 @@ static PaError InitializeWaveHandles( PaWinMmeHostApiRepresentation *winMmeHostA { PaWinWaveFormat waveFormat; UINT winMmeDeviceId = LocalDeviceIndexToWinMmeDeviceId( winMmeHostApi, devices[i].device ); - - /* @todo: consider providing a flag or #define to not try waveformat extensible + + /* @todo: consider providing a flag or #define to not try waveformat extensible this could just initialize j to 1 the first time round. */ for( j = 0; j < 2; ++j ) { switch(j){ - case 0: - /* first, attempt to open the device using WAVEFORMATEXTENSIBLE, + case 0: + /* first, attempt to open the device using WAVEFORMATEXTENSIBLE, if this fails we fall back to WAVEFORMATEX */ - PaWin_InitializeWaveFormatExtensible( &waveFormat, devices[i].channelCount, + PaWin_InitializeWaveFormatExtensible( &waveFormat, devices[i].channelCount, sampleFormat, waveFormatTag, sampleRate, channelMask ); break; - + case 1: /* retry with WAVEFORMATEX */ - PaWin_InitializeWaveFormatEx( &waveFormat, devices[i].channelCount, + PaWin_InitializeWaveFormatEx( &waveFormat, devices[i].channelCount, sampleFormat, waveFormatTag, sampleRate ); break; } @@ -1879,13 +1879,13 @@ static PaError InitializeWaveHandles( PaWinMmeHostApiRepresentation *winMmeHostA if( isInput ) { - mmresult = waveInOpen( &((HWAVEIN*)handlesAndBuffers->waveHandles)[i], winMmeDeviceId, + mmresult = waveInOpen( &((HWAVEIN*)handlesAndBuffers->waveHandles)[i], winMmeDeviceId, (WAVEFORMATEX*)&waveFormat, (DWORD_PTR)handlesAndBuffers->bufferEvent, (DWORD_PTR)0, CALLBACK_EVENT ); } else { - mmresult = waveOutOpen( &((HWAVEOUT*)handlesAndBuffers->waveHandles)[i], winMmeDeviceId, + mmresult = waveOutOpen( &((HWAVEOUT*)handlesAndBuffers->waveHandles)[i], winMmeDeviceId, (WAVEFORMATEX*)&waveFormat, (DWORD_PTR)handlesAndBuffers->bufferEvent, (DWORD_PTR)0, CALLBACK_EVENT ); } @@ -1905,20 +1905,20 @@ static PaError InitializeWaveHandles( PaWinMmeHostApiRepresentation *winMmeHostA case MMSYSERR_ALLOCATED: /* Specified resource is already allocated. */ result = paDeviceUnavailable; break; - case MMSYSERR_NODRIVER: /* No device driver is present. */ + case MMSYSERR_NODRIVER: /* No device driver is present. */ result = paDeviceUnavailable; break; - case MMSYSERR_NOMEM: /* Unable to allocate or lock memory. */ + case MMSYSERR_NOMEM: /* Unable to allocate or lock memory. */ result = paInsufficientMemory; break; - case MMSYSERR_BADDEVICEID: /* Specified device identifier is out of range. */ + case MMSYSERR_BADDEVICEID: /* Specified device identifier is out of range. */ /* falls through */ case WAVERR_BADFORMAT: /* Attempted to open with an unsupported waveform-audio format. */ /* This can also occur if we try to open the device with an unsupported * number of channels. This is attempted when device*ChannelCountIsKnown is - * set to 0. + * set to 0. */ /* falls through */ default: @@ -1951,7 +1951,7 @@ static PaError TerminateWaveHandles( PaWinMmeSingleDirectionHandlesAndBuffers *h PaError result = paNoError; MMRESULT mmresult; signed int i; - + if( handlesAndBuffers->waveHandles ) { for( i = handlesAndBuffers->deviceCount-1; i >= 0; --i ) @@ -1996,7 +1996,7 @@ static PaError TerminateWaveHandles( PaWinMmeSingleDirectionHandlesAndBuffers *h result = CloseHandleWithPaError( handlesAndBuffers->bufferEvent ); handlesAndBuffers->bufferEvent = 0; } - + return result; } @@ -2015,7 +2015,7 @@ static PaError InitializeWaveHeaders( PaWinMmeSingleDirectionHandlesAndBuffers * /* for error cleanup we expect that InitializeSingleDirectionHandlesAndBuffers() has already been called to zero some fields */ - + /* allocate an array of pointers to arrays of wave headers, one array of wave headers per device */ @@ -2025,7 +2025,7 @@ static PaError InitializeWaveHeaders( PaWinMmeSingleDirectionHandlesAndBuffers * result = paInsufficientMemory; goto error; } - + for( i = 0; i < (signed int)handlesAndBuffers->deviceCount; ++i ) handlesAndBuffers->waveHeaders[i] = 0; @@ -2094,7 +2094,7 @@ static PaError InitializeWaveHeaders( PaWinMmeSingleDirectionHandlesAndBuffers * error: TerminateWaveHeaders( handlesAndBuffers, isInput ); - + return result; } @@ -2103,7 +2103,7 @@ static void TerminateWaveHeaders( PaWinMmeSingleDirectionHandlesAndBuffers *hand { signed int i, j; WAVEHDR *deviceWaveHeaders; - + if( handlesAndBuffers->waveHeaders ) { for( i = handlesAndBuffers->deviceCount-1; i >= 0 ; --i ) @@ -2156,7 +2156,7 @@ struct PaWinMmeStream HANDLE processingThread; 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 highThreadPriority; int throttledThreadPriority; @@ -2164,10 +2164,10 @@ struct PaWinMmeStream int isStopped; volatile int isActive; - volatile int stopProcessing; /* stop thread once existing buffers have been returned */ - volatile int abortProcessing; /* stop thread immediately */ + volatile int stopProcessing; /* stop thread once existing buffers have been returned */ + volatile int abortProcessing; /* stop thread immediately */ - DWORD allBuffersDurationMs; /* used to calculate timeouts */ + DWORD allBuffersDurationMs; /* used to calculate timeouts */ }; /* updates deviceCount if PaWinMmeUseMultipleDevices is used */ @@ -2191,14 +2191,14 @@ static PaError ValidateWinMmeSpecificStreamInfo( if( streamInfo->flags & paWinMmeDontThrottleOverloadedProcessingThread ) *throttleProcessingThreadOnOverload = 0; - + if( streamInfo->flags & paWinMmeUseMultipleDevices ) { if( streamParameters->device != paUseHostApiSpecificDeviceSpecification ) return paInvalidDevice; - + *deviceCount = streamInfo->deviceCount; - } + } } return paNoError; @@ -2215,7 +2215,7 @@ static PaError RetrieveDevicesFromStreamParameters( unsigned int i; int totalChannelCount; PaDeviceIndex hostApiDevice; - + if( streamInfo && streamInfo->flags & paWinMmeUseMultipleDevices ) { totalChannelCount = 0; @@ -2226,21 +2226,21 @@ static PaError RetrieveDevicesFromStreamParameters( streamInfo->devices[i].device, hostApi ); if( result != paNoError ) return result; - + devices[i].device = hostApiDevice; devices[i].channelCount = streamInfo->devices[i].channelCount; - + totalChannelCount += devices[i].channelCount; } - + if( totalChannelCount != streamParameters->channelCount ) { /* channelCount must match total channels specified by multiple devices */ return paInvalidChannelCount; /* REVIEW use of this error code */ } - } + } else - { + { devices[0].device = streamParameters->device; devices[0].channelCount = streamParameters->channelCount; } @@ -2262,7 +2262,7 @@ static PaError ValidateInputChannelCounts( if( devices[i].channelCount < 1 ) return paInvalidChannelCount; - inputDeviceInfo = + inputDeviceInfo = (PaWinMmeDeviceInfo*)hostApi->deviceInfos[ devices[i].device ]; paerror = IsInputChannelCountSupported( inputDeviceInfo, devices[i].channelCount ); @@ -2287,7 +2287,7 @@ static PaError ValidateOutputChannelCounts( if( devices[i].channelCount < 1 ) return paInvalidChannelCount; - outputDeviceInfo = + outputDeviceInfo = (PaWinMmeDeviceInfo*)hostApi->deviceInfos[ devices[i].device ]; paerror = IsOutputChannelCountSupported( outputDeviceInfo, devices[i].channelCount ); @@ -2331,15 +2331,15 @@ static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi, unsigned long framesPerHostOutputBuffer; unsigned long hostOutputBufferCount; unsigned long framesPerBufferProcessorCall; - PaWinMmeDeviceAndChannelCount *inputDevices = 0; /* contains all devices and channel counts as local host api ids, even when PaWinMmeUseMultipleDevices is not used */ + PaWinMmeDeviceAndChannelCount *inputDevices = 0; /* contains all devices and channel counts as local host api ids, even when PaWinMmeUseMultipleDevices is not used */ unsigned long winMmeSpecificInputFlags = 0; - unsigned long inputDeviceCount = 0; + unsigned long inputDeviceCount = 0; PaWinMmeDeviceAndChannelCount *outputDevices = 0; unsigned long winMmeSpecificOutputFlags = 0; unsigned long outputDeviceCount = 0; /* contains all devices and channel counts as local host api ids, even when PaWinMmeUseMultipleDevices is not used */ char throttleProcessingThreadOnOverload = 1; - + if( inputParameters ) { inputChannelCount = inputParameters->channelCount; @@ -2370,7 +2370,7 @@ static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi, if( inputDeviceCount != 1 ){ /* always use direct speakers when using multi-device multichannel mode */ - inputChannelMask = PAWIN_SPEAKER_DIRECTOUT; + inputChannelMask = PAWIN_SPEAKER_DIRECTOUT; } else { @@ -2420,7 +2420,7 @@ static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi, if( outputDeviceCount != 1 ){ /* always use direct speakers when using multi-device multichannel mode */ - outputChannelMask = PAWIN_SPEAKER_DIRECTOUT; + outputChannelMask = PAWIN_SPEAKER_DIRECTOUT; } else { @@ -2503,7 +2503,7 @@ static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi, else { assert( (framesPerHostInputBuffer % framesPerHostOutputBuffer) == 0 ); /* CalculateBufferSettings() should guarantee this condition */ - + framesPerBufferProcessorCall = framesPerHostOutputBuffer; } } @@ -2526,7 +2526,7 @@ static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi, framesPerBufferProcessorCall, paUtilFixedHostBufferSize, streamCallback, userData ); if( result != paNoError ) goto error; - + bufferProcessorIsInitialized = 1; /* stream info input latency is the minimum buffering latency (unlike suggested and default which are *maximums*) */ @@ -2563,7 +2563,7 @@ static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi, inputDevices, inputDeviceCount, inputChannelMask, 1 /* isInput */ ); if( result != paNoError ) goto error; } - + if( outputParameters ) { result = InitializeWaveHandles( winMmeHostApi, &stream->output, @@ -2593,7 +2593,7 @@ static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi, stream->allBuffersDurationMs = (DWORD) (1000.0 * (framesPerHostInputBuffer * stream->input.bufferCount) / sampleRate); } - + if( streamCallback ) { /* abort event is only needed for callback streams */ @@ -2611,7 +2611,7 @@ error: { if( stream->abortEvent ) CloseHandle( stream->abortEvent ); - + TerminateWaveHeaders( &stream->output, 0 /* not isInput */ ); TerminateWaveHeaders( &stream->input, 1 /* isInput */ ); @@ -2635,13 +2635,13 @@ error: static int BuffersAreDone( WAVEHDR **waveHeaders, unsigned int deviceCount, int bufferIndex ) { unsigned int i; - + for( i=0; i < deviceCount; ++i ) { if( !(waveHeaders[i][ bufferIndex ].dwFlags & WHDR_DONE) ) { return 0; - } + } } return 1; @@ -2686,13 +2686,13 @@ static int NoBuffersAreQueued( PaWinMmeSingleDirectionHandlesAndBuffers *handles #define PA_CIRCULAR_DECREMENT_( current, max )\ ( ((current) == 0) ? ((max)-1) : (current-1) ) - + static signed long GetAvailableFrames( PaWinMmeSingleDirectionHandlesAndBuffers *handlesAndBuffers ) { signed long result = 0; unsigned int i; - + if( BuffersAreDone( handlesAndBuffers->waveHeaders, handlesAndBuffers->deviceCount, handlesAndBuffers->currentBufferIndex ) ) { /* we could calculate the following in O(1) if we kept track of the @@ -2766,7 +2766,7 @@ static PaError AdvanceToNextOutputBuffer( PaWinMmeStream *stream ) PA_CIRCULAR_INCREMENT_( stream->output.currentBufferIndex, stream->output.bufferCount ); stream->output.framesUsedInCurrentBuffer = 0; - + return result; } @@ -2777,7 +2777,7 @@ static PaError CatchUpInputBuffers( PaWinMmeStream *stream ) { PaError result = paNoError; unsigned int i; - + for( i=0; i < stream->input.bufferCount - 1; ++i ) { result = AdvanceToNextInputBuffer( stream ); @@ -2836,7 +2836,7 @@ PA_THREAD_FUNC ProcessingThreadProc( void *pArg ) int done = 0; unsigned int channel, i; unsigned long framesProcessed; - + /* prepare event array for call to WaitForMultipleObjects() */ if( stream->input.bufferEvent ) events[eventCount++] = stream->input.bufferEvent; @@ -2845,7 +2845,7 @@ PA_THREAD_FUNC ProcessingThreadProc( void *pArg ) events[eventCount++] = stream->abortEvent; statusFlags = 0; /** @todo support paInputUnderflow, paOutputOverflow and paNeverDropInput */ - + /* loop until something causes us to stop */ do{ /* wait for MME to signal that a buffer is available, or for @@ -2905,7 +2905,7 @@ PA_THREAD_FUNC ProcessingThreadProc( void *pArg ) { hostInputBufferIndex = -1; hostOutputBufferIndex = -1; - + if( PA_IS_INPUT_STREAM_(stream) ) { if( CurrentInputBuffersAreDone( stream ) ) @@ -2939,7 +2939,7 @@ PA_THREAD_FUNC ProcessingThreadProc( void *pArg ) if( CurrentOutputBuffersAreDone( stream ) ) { /* ok, we have an output buffer */ - + if( NoBuffersAreQueued( &stream->output ) ) { /* @@ -2966,7 +2966,7 @@ PA_THREAD_FUNC ProcessingThreadProc( void *pArg ) } } - + if( (PA_IS_FULL_DUPLEX_STREAM_(stream) && hostInputBufferIndex != -1 && hostOutputBufferIndex != -1) || (PA_IS_HALF_DUPLEX_STREAM_(stream) && ( hostInputBufferIndex != -1 || hostOutputBufferIndex != -1 ) ) ) { @@ -2980,11 +2980,11 @@ PA_THREAD_FUNC ProcessingThreadProc( void *pArg ) MMTIME mmtime; double timeBeforeGetPosition, timeAfterGetPosition; double time; - long framesInBufferRing; + long framesInBufferRing; long writePosition; long playbackPosition; HWAVEOUT firstWaveOutDevice = ((HWAVEOUT*)stream->output.waveHandles)[0]; - + mmtime.wType = TIME_SAMPLES; timeBeforeGetPosition = PaUtil_GetTime(); waveOutGetPosition( firstWaveOutDevice, &mmtime, sizeof(MMTIME) ); @@ -2995,13 +2995,13 @@ PA_THREAD_FUNC ProcessingThreadProc( void *pArg ) /* approximate time at which wave out position was measured as half way between timeBeforeGetPosition and timeAfterGetPosition */ time = timeBeforeGetPosition + (timeAfterGetPosition - timeBeforeGetPosition) * .5; - + framesInBufferRing = stream->output.bufferCount * stream->bufferProcessor.framesPerHostBuffer; playbackPosition = mmtime.u.sample % framesInBufferRing; writePosition = stream->output.currentBufferIndex * stream->bufferProcessor.framesPerHostBuffer + stream->output.framesUsedInCurrentBuffer; - + if( playbackPosition >= writePosition ){ timeInfo.outputBufferDacTime = time + ((double)( writePosition + (framesInBufferRing - playbackPosition) ) * stream->bufferProcessor.samplePeriod ); @@ -3028,13 +3028,13 @@ PA_THREAD_FUNC ProcessingThreadProc( void *pArg ) { /* we have stored the number of channels in the buffer in dwUser */ int channelCount = (int)stream->input.waveHeaders[i][ hostInputBufferIndex ].dwUser; - + PaUtil_SetInterleavedInputChannels( &stream->bufferProcessor, channel, stream->input.waveHeaders[i][ hostInputBufferIndex ].lpData + stream->input.framesUsedInCurrentBuffer * channelCount * stream->bufferProcessor.bytesPerHostInputSample, channelCount ); - + channel += channelCount; } @@ -3043,7 +3043,7 @@ PA_THREAD_FUNC ProcessingThreadProc( void *pArg ) if( PA_IS_OUTPUT_STREAM_(stream) ) { PaUtil_SetOutputFrameCount( &stream->bufferProcessor, 0 /* default to host buffer size */ ); - + channel = 0; for( i=0; ioutput.deviceCount; ++i ) { @@ -3076,7 +3076,7 @@ PA_THREAD_FUNC ProcessingThreadProc( void *pArg ) { stream->abortProcessing = 1; done = 1; - /** @todo FIXME: should probably reset the output device immediately once the callback returns paAbort + /** @todo FIXME: should probably reset the output device immediately once the callback returns paAbort see: http://www.portaudio.com/trac/ticket/141 */ result = paNoError; @@ -3108,7 +3108,7 @@ PA_THREAD_FUNC ProcessingThreadProc( void *pArg ) done = 1; } - + if( PA_IS_OUTPUT_STREAM_(stream) && !stream->abortProcessing ) { if( stream->stopProcessing && @@ -3150,7 +3150,7 @@ PA_THREAD_FUNC ProcessingThreadProc( void *pArg ) } } } - + if( stream->throttleProcessingThreadOnOverload != 0 ) { if( stream->stopProcessing || stream->abortProcessing ) @@ -3201,7 +3201,7 @@ PA_THREAD_FUNC ProcessingThreadProc( void *pArg ) stream->streamRepresentation.streamFinishedCallback( stream->streamRepresentation.userData ); PaUtil_ResetCpuLoadMeasurer( &stream->cpuLoadMeasurer ); - + return result; } @@ -3217,13 +3217,13 @@ static PaError CloseStream( PaStream* s ) result = CloseHandleWithPaError( stream->abortEvent ); if( result != paNoError ) goto error; - + TerminateWaveHeaders( &stream->output, 0 /* not isInput */ ); TerminateWaveHeaders( &stream->input, 1 /* isInput */ ); TerminateWaveHandles( &stream->output, 0 /* not isInput */, 0 /* not currentlyProcessingAnError */ ); TerminateWaveHandles( &stream->input, 1 /* isInput */, 0 /* not currentlyProcessingAnError */ ); - + PaUtil_TerminateBufferProcessor( &stream->bufferProcessor ); PaUtil_TerminateStreamRepresentation( &stream->streamRepresentation ); PaUtil_FreeMemory( stream ); @@ -3244,9 +3244,9 @@ static PaError StartStream( PaStream *s ) unsigned int channel; unsigned long framesProcessed; PaStreamCallbackTimeInfo timeInfo = {0,0,0}; /** @todo implement this for stream priming */ - + PaUtil_ResetBufferProcessor( &stream->bufferProcessor ); - + if( PA_IS_INPUT_STREAM_(stream) ) { for( i=0; iinput.bufferCount; ++i ) @@ -3335,7 +3335,7 @@ static PaError StartStream( PaStream *s ) { ZeroMemory( stream->output.waveHeaders[j][i].lpData, stream->output.waveHeaders[j][i].dwBufferLength ); } - } + } /* we queue all channels of a single buffer frame (across all devices, because some multidevice multichannel drivers work @@ -3366,8 +3366,8 @@ static PaError StartStream( PaStream *s ) result = ResetEventWithPaError( stream->output.bufferEvent ); if( result != paNoError ) goto error; - - + + if( stream->streamRepresentation.streamCallback ) { /* callback stream */ @@ -3449,8 +3449,8 @@ static PaError StopStream( PaStream *s ) DWORD waitResult; MMRESULT mmresult; signed int hostOutputBufferIndex; - unsigned int channel, waitCount, i; - + unsigned int channel, waitCount, i; + /** @todo REVIEW: the error checking in this function needs review. the basic idea is to return from this function in a known state - for example @@ -3503,7 +3503,7 @@ static PaError StopStream( PaStream *s ) PaUtil_SetOutputFrameCount( &stream->bufferProcessor, stream->output.framesPerBuffer - stream->output.framesUsedInCurrentBuffer ); - + channel = 0; for( i=0; ioutput.deviceCount; ++i ) { @@ -3528,7 +3528,7 @@ static PaError StopStream( PaStream *s ) */ AdvanceToNextOutputBuffer( stream ); } - + timeout = (stream->allBuffersDurationMs / stream->output.bufferCount) + 1; if( timeout < PA_MME_MIN_TIMEOUT_MSEC_ ) @@ -3594,7 +3594,7 @@ static PaError AbortStream( PaStream *s ) DWORD waitResult; MMRESULT mmresult; unsigned int i; - + /** @todo REVIEW: the error checking in this function needs review. the basic idea is to return from this function in a known state - for example @@ -3605,7 +3605,7 @@ static PaError AbortStream( PaStream *s ) if( stream->processingThread ) { /* callback stream */ - + /* Tell processing thread to abort immediately */ stream->abortProcessing = 1; SetEvent( stream->abortEvent ); @@ -3642,14 +3642,14 @@ static PaError AbortStream( PaStream *s ) if( stream->processingThread ) { /* callback stream */ - + PA_DEBUG(("WinMME AbortStream: waiting for background thread.\n")); /* Calculate timeOut longer than longest time it could take to return all buffers. */ timeout = (int)(stream->allBuffersDurationMs * 1.5); if( timeout < PA_MME_MIN_TIMEOUT_MSEC_ ) timeout = PA_MME_MIN_TIMEOUT_MSEC_; - + waitResult = WaitForSingleObject( stream->processingThread, timeout ); if( waitResult == WAIT_TIMEOUT ) { @@ -3687,7 +3687,7 @@ static PaError IsStreamActive( PaStream *s ) static PaTime GetStreamTime( PaStream *s ) { (void) s; /* unused parameter */ - + return PaUtil_GetTime(); } @@ -3719,7 +3719,7 @@ static PaError ReadStream( PaStream* s, DWORD waitResult; DWORD timeout = (unsigned long)(stream->allBuffersDurationMs * 0.5); unsigned int channel, i; - + if( PA_IS_INPUT_STREAM_(stream) ) { /* make a local copy of the user buffer pointer(s). this is necessary @@ -3738,7 +3738,7 @@ static PaError ReadStream( PaStream* s, for( i = 0; ibufferProcessor.inputChannelCount; ++i ) ((void**)userBuffer)[i] = ((void**)buffer)[i]; } - + do{ if( CurrentInputBuffersAreDone( stream ) ) { @@ -3746,7 +3746,7 @@ static PaError ReadStream( PaStream* s, { /** @todo REVIEW: consider what to do if the input overflows. do we requeue all of the buffers? should we be running - a thread to make sure they are always queued? + a thread to make sure they are always queued? see: http://www.portaudio.com/trac/ticket/117 */ @@ -3757,7 +3757,7 @@ static PaError ReadStream( PaStream* s, PaUtil_SetInputFrameCount( &stream->bufferProcessor, stream->input.framesPerBuffer - stream->input.framesUsedInCurrentBuffer ); - + channel = 0; for( i=0; iinput.deviceCount; ++i ) { @@ -3772,7 +3772,7 @@ static PaError ReadStream( PaStream* s, channel += channelCount; } - + framesProcessed = PaUtil_CopyInput( &stream->bufferProcessor, &userBuffer, frames - framesRead ); stream->input.framesUsedInCurrentBuffer += framesProcessed; @@ -3783,7 +3783,7 @@ static PaError ReadStream( PaStream* s, break; } - framesRead += framesProcessed; + framesRead += framesProcessed; }else{ /* wait for MME to signal that a buffer is available */ @@ -3798,7 +3798,7 @@ static PaError ReadStream( PaStream* s, /* if a timeout is encountered, continue, perhaps we should give up eventually */ - } + } } }while( framesRead < frames ); } @@ -3825,7 +3825,7 @@ static PaError WriteStream( PaStream* s, DWORD timeout = (unsigned long)(stream->allBuffersDurationMs * 0.5); unsigned int channel, i; - + if( PA_IS_OUTPUT_STREAM_(stream) ) { /* make a local copy of the user buffer pointer(s). this is necessary @@ -3853,7 +3853,7 @@ static PaError WriteStream( PaStream* s, /** @todo REVIEW: consider what to do if the output underflows. do we requeue all the existing buffers with zeros? should we run a separate thread to keep the buffers - enqueued at all times? + enqueued at all times? see: http://www.portaudio.com/trac/ticket/117 */ @@ -3864,7 +3864,7 @@ static PaError WriteStream( PaStream* s, PaUtil_SetOutputFrameCount( &stream->bufferProcessor, stream->output.framesPerBuffer - stream->output.framesUsedInCurrentBuffer ); - + channel = 0; for( i=0; ioutput.deviceCount; ++i ) { @@ -3879,7 +3879,7 @@ static PaError WriteStream( PaStream* s, channel += channelCount; } - + framesProcessed = PaUtil_CopyOutput( &stream->bufferProcessor, &userBuffer, frames - framesWritten ); stream->output.framesUsedInCurrentBuffer += framesProcessed; @@ -3906,15 +3906,15 @@ static PaError WriteStream( PaStream* s, /* if a timeout is encountered, continue, perhaps we should give up eventually */ - } - } + } + } }while( framesWritten < frames ); } else { result = paCanNotWriteToAnInputOnlyStream; } - + return result; } @@ -3922,7 +3922,7 @@ static PaError WriteStream( PaStream* s, static signed long GetStreamReadAvailable( PaStream* s ) { PaWinMmeStream *stream = (PaWinMmeStream*)s; - + if( PA_IS_INPUT_STREAM_(stream) ) return GetAvailableFrames( &stream->input ); else @@ -3933,7 +3933,7 @@ static signed long GetStreamReadAvailable( PaStream* s ) static signed long GetStreamWriteAvailable( PaStream* s ) { PaWinMmeStream *stream = (PaWinMmeStream*)s; - + if( PA_IS_OUTPUT_STREAM_(stream) ) return GetAvailableFrames( &stream->output ); else @@ -3951,7 +3951,7 @@ static PaError GetWinMMEStreamPointer( PaWinMmeStream **stream, PaStream *s ) PaError result; PaUtilHostApiRepresentation *hostApi; PaWinMmeHostApiRepresentation *winMmeHostApi; - + result = PaUtil_ValidateStreamPointer( s ); if( result != paNoError ) return result; @@ -3961,10 +3961,10 @@ static PaError GetWinMMEStreamPointer( PaWinMmeStream **stream, PaStream *s ) return result; winMmeHostApi = (PaWinMmeHostApiRepresentation*)hostApi; - + /* note, the following would be easier if there was a generic way of testing that a stream belongs to a specific host API */ - + if( PA_STREAM_REP( s )->streamInterface == &winMmeHostApi->callbackStreamInterface || PA_STREAM_REP( s )->streamInterface == &winMmeHostApi->blockingStreamInterface ) { From fac71001ee55c62c71801979eb3216b92b009988 Mon Sep 17 00:00:00 2001 From: Ross Bencina Date: Thu, 21 Jan 2021 23:06:08 +1100 Subject: [PATCH 091/164] Clean up whitespace in src/common in preparation for .editorconfig. (#408) * Clean up whitespace in src/common in preparation for .editorconfig. Convert tabs to 4 spaces. Indent by 4 spaces. Strip trailing whitespace. --- src/common/pa_allocation.c | 16 +- src/common/pa_allocation.h | 8 +- src/common/pa_converters.c | 146 ++++++++-------- src/common/pa_converters.h | 12 +- src/common/pa_cpuload.c | 8 +- src/common/pa_cpuload.h | 8 +- src/common/pa_debugprint.c | 48 +++--- src/common/pa_debugprint.h | 16 +- src/common/pa_dither.c | 82 ++++----- src/common/pa_dither.h | 6 +- src/common/pa_endianness.h | 30 ++-- src/common/pa_front.c | 24 +-- src/common/pa_hostapi.h | 78 ++++----- src/common/pa_memorybarrier.h | 56 +++--- src/common/pa_process.c | 312 +++++++++++++++++----------------- src/common/pa_process.h | 50 +++--- src/common/pa_ringbuffer.c | 14 +- src/common/pa_ringbuffer.h | 18 +- src/common/pa_stream.c | 6 +- src/common/pa_stream.h | 10 +- src/common/pa_trace.c | 8 +- src/common/pa_trace.h | 16 +- src/common/pa_types.h | 8 +- src/common/pa_util.h | 8 +- 24 files changed, 494 insertions(+), 494 deletions(-) diff --git a/src/common/pa_allocation.c b/src/common/pa_allocation.c index 51fe15a..265a4e6 100644 --- a/src/common/pa_allocation.c +++ b/src/common/pa_allocation.c @@ -27,13 +27,13 @@ */ /* - * The text above constitutes the entire PortAudio license; however, + * The text above constitutes the entire PortAudio license; however, * the PortAudio community also makes the following non-binding requests: * * 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. It is also - * requested that these non-binding requests be included along with the + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the * license above. */ @@ -78,7 +78,7 @@ static struct PaUtilAllocationGroupLink *AllocateLinks( long count, { struct PaUtilAllocationGroupLink *result; int i; - + result = (struct PaUtilAllocationGroupLink *)PaUtil_AllocateMemory( sizeof(struct PaUtilAllocationGroupLink) * count ); if( result ) @@ -95,7 +95,7 @@ static struct PaUtilAllocationGroupLink *AllocateLinks( long count, } result[count-1].next = nextSpare; } - + return result; } @@ -147,7 +147,7 @@ void* PaUtil_GroupAllocateMemory( PaUtilAllocationGroup* group, long size ) { struct PaUtilAllocationGroupLink *links, *link; void *result = 0; - + /* allocate more links if necessary */ if( !group->spareLinks ) { @@ -176,7 +176,7 @@ void* PaUtil_GroupAllocateMemory( PaUtilAllocationGroup* group, long size ) } } - return result; + return result; } @@ -208,7 +208,7 @@ void PaUtil_GroupFreeMemory( PaUtilAllocationGroup* group, void *buffer ) break; } - + previous = current; current = current->next; } diff --git a/src/common/pa_allocation.h b/src/common/pa_allocation.h index bc1bb7d..5c3cf53 100644 --- a/src/common/pa_allocation.h +++ b/src/common/pa_allocation.h @@ -29,13 +29,13 @@ */ /* - * The text above constitutes the entire PortAudio license; however, + * The text above constitutes the entire PortAudio license; however, * the PortAudio community also makes the following non-binding requests: * * 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. It is also - * requested that these non-binding requests be included along with the + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the * license above. */ @@ -44,7 +44,7 @@ @brief Allocation Group prototypes. An Allocation Group makes it easy to allocate multiple blocks of memory and free them all at once. - + An allocation group is useful for keeping track of multiple blocks of memory which are allocated at the same time (such as during initialization) and need to be deallocated at the same time. The allocation group maintains diff --git a/src/common/pa_converters.c b/src/common/pa_converters.c index 16f5864..93e44a3 100644 --- a/src/common/pa_converters.c +++ b/src/common/pa_converters.c @@ -26,13 +26,13 @@ */ /* - * The text above constitutes the entire PortAudio license; however, + * The text above constitutes the entire PortAudio license; however, * the PortAudio community also makes the following non-binding requests: * * 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. It is also - * requested that these non-binding requests be included along with the + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the * license above. */ @@ -40,17 +40,17 @@ @ingroup common_src @brief Conversion function implementations. - + If the C9x function lrintf() is available, define PA_USE_C99_LRINTF to use it @todo Consider whether functions which dither but don't clip should exist, V18 automatically enabled clipping whenever dithering was selected. Perhaps - we should do the same. + we should do the same. see: "require clipping for dithering sample conversion functions?" http://www.portaudio.com/trac/ticket/112 @todo implement the converters marked IMPLEMENT ME: Int32_To_Int24_Dither, - Int32_To_UInt8_Dither, Int24_To_Int16_Dither, Int24_To_Int8_Dither, + Int32_To_UInt8_Dither, Int24_To_Int16_Dither, Int24_To_Int8_Dither, Int24_To_UInt8_Dither, Int16_To_Int8_Dither, Int16_To_UInt8_Dither see: "some conversion functions are not implemented in pa_converters.c" http://www.portaudio.com/trac/ticket/35 @@ -74,7 +74,7 @@ PaSampleFormat PaUtil_SelectClosestAvailableFormat( format &= ~paNonInterleaved; availableFormats &= ~paNonInterleaved; - + if( (format & availableFormats) == 0 ) { /* NOTE: this code depends on the sample format constants being in @@ -97,7 +97,7 @@ PaSampleFormat PaUtil_SelectClosestAvailableFormat( { result = 0; } - + if( result == 0 ){ /* scan for worse formats */ result = format; @@ -110,7 +110,7 @@ PaSampleFormat PaUtil_SelectClosestAvailableFormat( if( (result & availableFormats) == 0 ) result = paSampleFormatNotSupported; } - + }else{ result = format; } @@ -286,7 +286,7 @@ PaUtilConverterTable paConverters = { 0, /* PaUtilConverter *Int24_To_Int8_Dither; */ 0, /* PaUtilConverter *Int24_To_UInt8; */ 0, /* PaUtilConverter *Int24_To_UInt8_Dither; */ - + 0, /* PaUtilConverter *Int16_To_Float32; */ 0, /* PaUtilConverter *Int16_To_Int32; */ 0, /* PaUtilConverter *Int16_To_Int24; */ @@ -348,9 +348,9 @@ static void Float32_To_Int32( *dest = lrintf(scaled-0.5f); #else double scaled = *src * 0x7FFFFFFF; - *dest = (PaInt32) scaled; + *dest = (PaInt32) scaled; #endif - + src += sourceStride; dest += destinationStride; } @@ -395,7 +395,7 @@ static void Float32_To_Int32_Clip( float *src = (float*)sourceBuffer; PaInt32 *dest = (PaInt32*)destinationBuffer; (void) ditherGenerator; /* unused parameter */ - + while( count-- ) { /* REVIEW */ @@ -458,13 +458,13 @@ static void Float32_To_Int24( PaInt32 temp; (void) ditherGenerator; /* unused parameter */ - + while( count-- ) { /* convert to 32 bit and drop the low 8 bits */ double scaled = (double)(*src) * 2147483647.0; temp = (PaInt32) scaled; - + #if defined(PA_LITTLE_ENDIAN) dest[0] = (unsigned char)(temp >> 8); dest[1] = (unsigned char)(temp >> 16); @@ -498,7 +498,7 @@ static void Float32_To_Int24_Dither( double dither = PaUtil_GenerateFloatTriangularDither( ditherGenerator ); /* use smaller scaler to prevent overflow when we add the dither */ double dithered = ((double)*src * (2147483646.0)) + dither; - + temp = (PaInt32) dithered; #if defined(PA_LITTLE_ENDIAN) @@ -528,7 +528,7 @@ static void Float32_To_Int24_Clip( PaInt32 temp; (void) ditherGenerator; /* unused parameter */ - + while( count-- ) { /* convert to 32 bit and drop the low 8 bits */ @@ -561,16 +561,16 @@ static void Float32_To_Int24_DitherClip( float *src = (float*)sourceBuffer; unsigned char *dest = (unsigned char*)destinationBuffer; PaInt32 temp; - + while( count-- ) { /* convert to 32 bit and drop the low 8 bits */ - + double dither = PaUtil_GenerateFloatTriangularDither( ditherGenerator ); /* use smaller scaler to prevent overflow when we add the dither */ double dithered = ((double)*src * (2147483646.0)) + dither; PA_CLIP_( dithered, -2147483648., 2147483647. ); - + temp = (PaInt32) dithered; #if defined(PA_LITTLE_ENDIAN) @@ -728,7 +728,7 @@ static void Float32_To_Int8_Dither( { float *src = (float*)sourceBuffer; signed char *dest = (signed char*)destinationBuffer; - + while( count-- ) { float dither = PaUtil_GenerateFloatTriangularDither( ditherGenerator ); @@ -819,7 +819,7 @@ static void Float32_To_UInt8_Dither( { float *src = (float*)sourceBuffer; unsigned char *dest = (unsigned char*)destinationBuffer; - + while( count-- ) { float dither = PaUtil_GenerateFloatTriangularDither( ditherGenerator ); @@ -827,7 +827,7 @@ static void Float32_To_UInt8_Dither( float dithered = (*src * (126.0f)) + dither; PaInt32 samp = (PaInt32) dithered; *dest = (unsigned char) (128 + samp); - + src += sourceStride; dest += destinationStride; } @@ -910,10 +910,10 @@ static void Int32_To_Int24( PaInt32 *src = (PaInt32*)sourceBuffer; unsigned char *dest = (unsigned char*)destinationBuffer; (void) ditherGenerator; /* unused parameter */ - - while( count-- ) + + while( count-- ) { - /* REVIEW */ + /* REVIEW */ #if defined(PA_LITTLE_ENDIAN) dest[0] = (unsigned char)(*src >> 8); dest[1] = (unsigned char)(*src >> 16); @@ -1041,7 +1041,7 @@ static void Int32_To_UInt8( while( count-- ) { - (*dest) = (unsigned char)(((*src) >> 24) + 128); + (*dest) = (unsigned char)(((*src) >> 24) + 128); src += sourceStride; dest += destinationStride; @@ -1080,12 +1080,12 @@ static void Int24_To_Float32( PaInt32 temp; (void) ditherGenerator; /* unused parameter */ - + while( count-- ) { #if defined(PA_LITTLE_ENDIAN) - temp = (((PaInt32)src[0]) << 8); + temp = (((PaInt32)src[0]) << 8); temp = temp | (((PaInt32)src[1]) << 16); temp = temp | (((PaInt32)src[2]) << 24); #elif defined(PA_BIG_ENDIAN) @@ -1113,12 +1113,12 @@ static void Int24_To_Int32( PaInt32 temp; (void) ditherGenerator; /* unused parameter */ - + while( count-- ) { #if defined(PA_LITTLE_ENDIAN) - temp = (((PaInt32)src[0]) << 8); + temp = (((PaInt32)src[0]) << 8); temp = temp | (((PaInt32)src[1]) << 16); temp = temp | (((PaInt32)src[2]) << 24); #elif defined(PA_BIG_ENDIAN) @@ -1143,20 +1143,20 @@ static void Int24_To_Int16( { unsigned char *src = (unsigned char*)sourceBuffer; PaInt16 *dest = (PaInt16*)destinationBuffer; - + PaInt16 temp; (void) ditherGenerator; /* unused parameter */ - + while( count-- ) { - + #if defined(PA_LITTLE_ENDIAN) - /* src[0] is discarded */ + /* src[0] is discarded */ temp = (((PaInt16)src[1])); temp = temp | (PaInt16)(((PaInt16)src[2]) << 8); #elif defined(PA_BIG_ENDIAN) - /* src[2] is discarded */ + /* src[2] is discarded */ temp = (PaInt16)(((PaInt16)src[0]) << 8); temp = temp | (((PaInt16)src[1])); #endif @@ -1184,7 +1184,7 @@ static void Int24_To_Int16_Dither( { #if defined(PA_LITTLE_ENDIAN) - temp = (((PaInt32)src[0]) << 8); + temp = (((PaInt32)src[0]) << 8); temp = temp | (((PaInt32)src[1]) << 16); temp = temp | (((PaInt32)src[2]) << 24); #elif defined(PA_BIG_ENDIAN) @@ -1211,20 +1211,20 @@ static void Int24_To_Int8( { unsigned char *src = (unsigned char*)sourceBuffer; signed char *dest = (signed char*)destinationBuffer; - + (void) ditherGenerator; /* unused parameter */ - + while( count-- ) - { - + { + #if defined(PA_LITTLE_ENDIAN) - /* src[0] is discarded */ - /* src[1] is discarded */ + /* src[0] is discarded */ + /* src[1] is discarded */ *dest = src[2]; #elif defined(PA_BIG_ENDIAN) - /* src[2] is discarded */ - /* src[1] is discarded */ - *dest = src[0]; + /* src[2] is discarded */ + /* src[1] is discarded */ + *dest = src[0]; #endif src += sourceStride * 3; @@ -1241,14 +1241,14 @@ static void Int24_To_Int8_Dither( { unsigned char *src = (unsigned char*)sourceBuffer; signed char *dest = (signed char*)destinationBuffer; - + PaInt32 temp, dither; while( count-- ) { #if defined(PA_LITTLE_ENDIAN) - temp = (((PaInt32)src[0]) << 8); + temp = (((PaInt32)src[0]) << 8); temp = temp | (((PaInt32)src[1]) << 16); temp = temp | (((PaInt32)src[2]) << 24); #elif defined(PA_BIG_ENDIAN) @@ -1275,20 +1275,20 @@ static void Int24_To_UInt8( { unsigned char *src = (unsigned char*)sourceBuffer; unsigned char *dest = (unsigned char*)destinationBuffer; - + (void) ditherGenerator; /* unused parameter */ - + while( count-- ) { - + #if defined(PA_LITTLE_ENDIAN) - /* src[0] is discarded */ - /* src[1] is discarded */ + /* src[0] is discarded */ + /* src[1] is discarded */ *dest = (unsigned char)(src[2] + 128); #elif defined(PA_BIG_ENDIAN) *dest = (unsigned char)(src[0] + 128); - /* src[1] is discarded */ - /* src[2] is discarded */ + /* src[1] is discarded */ + /* src[2] is discarded */ #endif src += sourceStride * 3; @@ -1349,7 +1349,7 @@ static void Int16_To_Int32( /* REVIEW: we should consider something like (*src << 16) | (*src & 0xFFFF) */ - + *dest = *src << 16; src += sourceStride; @@ -1369,11 +1369,11 @@ static void Int16_To_Int24( PaInt16 temp; (void) ditherGenerator; /* unused parameter */ - + while( count-- ) { temp = *src; - + #if defined(PA_LITTLE_ENDIAN) dest[0] = 0; dest[1] = (unsigned char)(temp); @@ -1442,7 +1442,7 @@ static void Int16_To_UInt8( while( count-- ) { - (*dest) = (unsigned char)(((*src) >> 8) + 128); + (*dest) = (unsigned char)(((*src) >> 8) + 128); src += sourceStride; dest += destinationStride; @@ -1503,7 +1503,7 @@ static void Int8_To_Int32( while( count-- ) { - (*dest) = (*src) << 24; + (*dest) = (*src) << 24; src += sourceStride; dest += destinationStride; @@ -1613,7 +1613,7 @@ static void UInt8_To_Int32( while( count-- ) { - (*dest) = (*src - 128) << 24; + (*dest) = (*src - 128) << 24; src += sourceStride; dest += destinationStride; @@ -1627,11 +1627,11 @@ static void UInt8_To_Int24( void *sourceBuffer, signed int sourceStride, unsigned int count, struct PaUtilTriangularDitherGenerator *ditherGenerator ) { - unsigned char *src = (unsigned char*)sourceBuffer; + unsigned char *src = (unsigned char*)sourceBuffer; unsigned char *dest = (unsigned char*)destinationBuffer; (void) ditherGenerator; /* unused parameters */ - - while( count-- ) + + while( count-- ) { #if defined(PA_LITTLE_ENDIAN) @@ -1643,10 +1643,10 @@ static void UInt8_To_Int24( dest[1] = 0; dest[2] = 0; #endif - + src += sourceStride; - dest += destinationStride * 3; - } + dest += destinationStride * 3; + } } /* -------------------------------------------------------------------------- */ @@ -1698,7 +1698,7 @@ static void Copy_8_To_8( { unsigned char *src = (unsigned char*)sourceBuffer; unsigned char *dest = (unsigned char*)destinationBuffer; - + (void) ditherGenerator; /* unused parameter */ while( count-- ) @@ -1719,9 +1719,9 @@ static void Copy_16_To_16( { PaUint16 *src = (PaUint16 *)sourceBuffer; PaUint16 *dest = (PaUint16 *)destinationBuffer; - + (void) ditherGenerator; /* unused parameter */ - + while( count-- ) { *dest = *src; @@ -1742,7 +1742,7 @@ static void Copy_24_To_24( unsigned char *dest = (unsigned char*)destinationBuffer; (void) ditherGenerator; /* unused parameter */ - + while( count-- ) { dest[0] = src[0]; @@ -1765,7 +1765,7 @@ static void Copy_32_To_32( PaUint32 *src = (PaUint32 *)sourceBuffer; (void) ditherGenerator; /* unused parameter */ - + while( count-- ) { *dest = *src; @@ -1787,7 +1787,7 @@ PaUtilConverterTable paConverters = { Float32_To_Int24_Dither, /* PaUtilConverter *Float32_To_Int24_Dither; */ Float32_To_Int24_Clip, /* PaUtilConverter *Float32_To_Int24_Clip; */ Float32_To_Int24_DitherClip, /* PaUtilConverter *Float32_To_Int24_DitherClip; */ - + Float32_To_Int16, /* PaUtilConverter *Float32_To_Int16; */ Float32_To_Int16_Dither, /* PaUtilConverter *Float32_To_Int16_Dither; */ Float32_To_Int16_Clip, /* PaUtilConverter *Float32_To_Int16_Clip; */ diff --git a/src/common/pa_converters.h b/src/common/pa_converters.h index 1a912eb..96edf1c 100644 --- a/src/common/pa_converters.h +++ b/src/common/pa_converters.h @@ -28,13 +28,13 @@ */ /* - * The text above constitutes the entire PortAudio license; however, + * The text above constitutes the entire PortAudio license; however, * the PortAudio community also makes the following non-binding requests: * * 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. It is also - * requested that these non-binding requests be included along with the + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the * license above. */ @@ -119,7 +119,7 @@ PaUtilConverter* PaUtil_SelectConverter( PaSampleFormat sourceFormat, typedef void PaUtilZeroer( void *destinationBuffer, signed int destinationStride, unsigned int count ); - + /** Find a buffer zeroer function for the given destination format. @return A pointer to a PaUtilZeroer which will perform the requested @@ -145,7 +145,7 @@ typedef struct{ PaUtilConverter *Float32_To_Int24_Dither; PaUtilConverter *Float32_To_Int24_Clip; PaUtilConverter *Float32_To_Int24_DitherClip; - + PaUtilConverter *Float32_To_Int16; PaUtilConverter *Float32_To_Int16_Dither; PaUtilConverter *Float32_To_Int16_Clip; @@ -193,7 +193,7 @@ typedef struct{ PaUtilConverter *Int8_To_Int24; PaUtilConverter *Int8_To_Int16; PaUtilConverter *Int8_To_UInt8; - + PaUtilConverter *UInt8_To_Float32; PaUtilConverter *UInt8_To_Int32; PaUtilConverter *UInt8_To_Int24; diff --git a/src/common/pa_cpuload.c b/src/common/pa_cpuload.c index 4adf21a..de57db2 100644 --- a/src/common/pa_cpuload.c +++ b/src/common/pa_cpuload.c @@ -27,13 +27,13 @@ */ /* - * The text above constitutes the entire PortAudio license; however, + * The text above constitutes the entire PortAudio license; however, * the PortAudio community also makes the following non-binding requests: * * 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. It is also - * requested that these non-binding requests be included along with the + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the * license above. */ @@ -94,7 +94,7 @@ void PaUtil_EndCpuLoadMeasurement( PaUtilCpuLoadMeasurer* measurer, unsigned lon #define LOWPASS_COEFFICIENT_1 (0.99999 - LOWPASS_COEFFICIENT_0) measurer->averageLoad = (LOWPASS_COEFFICIENT_0 * measurer->averageLoad) + - (LOWPASS_COEFFICIENT_1 * measuredLoad); + (LOWPASS_COEFFICIENT_1 * measuredLoad); } } diff --git a/src/common/pa_cpuload.h b/src/common/pa_cpuload.h index 2a323aa..8d3f618 100644 --- a/src/common/pa_cpuload.h +++ b/src/common/pa_cpuload.h @@ -29,13 +29,13 @@ */ /* - * The text above constitutes the entire PortAudio license; however, + * The text above constitutes the entire PortAudio license; however, * the PortAudio community also makes the following non-binding requests: * * 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. It is also - * requested that these non-binding requests be included along with the + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the * license above. */ @@ -68,5 +68,5 @@ double PaUtil_GetCpuLoad( PaUtilCpuLoadMeasurer* measurer ); #ifdef __cplusplus } -#endif /* __cplusplus */ +#endif /* __cplusplus */ #endif /* PA_CPULOAD_H */ diff --git a/src/common/pa_debugprint.c b/src/common/pa_debugprint.c index 7e9e628..3e4024c 100644 --- a/src/common/pa_debugprint.c +++ b/src/common/pa_debugprint.c @@ -43,11 +43,11 @@ @brief Implements log function. PaUtil_SetLogPrintFunction can be user called to replace the provided - DefaultLogPrint function, which writes to stderr. - One can NOT pass var_args across compiler/dll boundaries as it is not - "byte code/abi portable". So the technique used here is to allocate a local - a static array, write in it, then callback the user with a pointer to its - start. + DefaultLogPrint function, which writes to stderr. + One can NOT pass var_args across compiler/dll boundaries as it is not + "byte code/abi portable". So the technique used here is to allocate a local + a static array, write in it, then callback the user with a pointer to its + start. */ #include @@ -57,8 +57,8 @@ // for OutputDebugStringA #if defined(_MSC_VER) && defined(PA_ENABLE_MSVC_DEBUG_OUTPUT) - #define WIN32_LEAN_AND_MEAN // exclude rare headers - #include "windows.h" + #define WIN32_LEAN_AND_MEAN // exclude rare headers + #include "windows.h" #endif // User callback @@ -75,32 +75,32 @@ void PaUtil_SetDebugPrintFunction(PaUtilLogCallback cb) VERY dangerous alternative, vsprintf (with no n) */ #if _MSC_VER - /* Some Windows Mobile SDKs don't define vsnprintf but all define _vsnprintf (hopefully). - According to MSDN "vsnprintf is identical to _vsnprintf". So we use _vsnprintf with MSC. - */ - #define VSNPRINTF _vsnprintf + /* Some Windows Mobile SDKs don't define vsnprintf but all define _vsnprintf (hopefully). + According to MSDN "vsnprintf is identical to _vsnprintf". So we use _vsnprintf with MSC. + */ + #define VSNPRINTF _vsnprintf #else - #define VSNPRINTF vsnprintf + #define VSNPRINTF vsnprintf #endif #define PA_LOG_BUF_SIZE 2048 void PaUtil_DebugPrint( const char *format, ... ) { - // Optional logging into Output console of Visual Studio + // Optional logging into Output console of Visual Studio #if defined(_MSC_VER) && defined(PA_ENABLE_MSVC_DEBUG_OUTPUT) - { - char buf[PA_LOG_BUF_SIZE]; - va_list ap; - va_start(ap, format); - VSNPRINTF(buf, sizeof(buf), format, ap); - buf[sizeof(buf)-1] = 0; - OutputDebugStringA(buf); - va_end(ap); - } + { + char buf[PA_LOG_BUF_SIZE]; + va_list ap; + va_start(ap, format); + VSNPRINTF(buf, sizeof(buf), format, ap); + buf[sizeof(buf)-1] = 0; + OutputDebugStringA(buf); + va_end(ap); + } #endif - // Output to User-Callback + // Output to User-Callback if (userCB != NULL) { char strdump[PA_LOG_BUF_SIZE]; @@ -112,7 +112,7 @@ void PaUtil_DebugPrint( const char *format, ... ) va_end(ap); } else - // Standard output to stderr + // Standard output to stderr { va_list ap; va_start(ap, format); diff --git a/src/common/pa_debugprint.h b/src/common/pa_debugprint.h index 5fba766..ca81724 100644 --- a/src/common/pa_debugprint.h +++ b/src/common/pa_debugprint.h @@ -101,7 +101,7 @@ void PaUtil_DebugPrint( const char *format, ... ); #ifdef PA_LOG_API_CALLS -#define PA_LOGAPI(x) PaUtil_DebugPrint x +#define PA_LOGAPI(x) PaUtil_DebugPrint x #define PA_LOGAPI_ENTER(functionName) PaUtil_DebugPrint( functionName " called.\n" ) @@ -110,16 +110,16 @@ void PaUtil_DebugPrint( const char *format, ... ); #define PA_LOGAPI_EXIT(functionName) PaUtil_DebugPrint( functionName " returned.\n" ) #define PA_LOGAPI_EXIT_PAERROR( functionName, result ) \ - PaUtil_DebugPrint( functionName " returned:\n" ); \ - PaUtil_DebugPrint("\tPaError: %d ( %s )\n", result, Pa_GetErrorText( result ) ) + PaUtil_DebugPrint( functionName " returned:\n" ); \ + PaUtil_DebugPrint("\tPaError: %d ( %s )\n", result, Pa_GetErrorText( result ) ) #define PA_LOGAPI_EXIT_T( functionName, resultFormatString, result ) \ - PaUtil_DebugPrint( functionName " returned:\n" ); \ - PaUtil_DebugPrint("\t" resultFormatString "\n", result ) + PaUtil_DebugPrint( functionName " returned:\n" ); \ + PaUtil_DebugPrint("\t" resultFormatString "\n", result ) #define PA_LOGAPI_EXIT_PAERROR_OR_T_RESULT( functionName, positiveResultFormatString, result ) \ - PaUtil_DebugPrint( functionName " returned:\n" ); \ - if( result > 0 ) \ + PaUtil_DebugPrint( functionName " returned:\n" ); \ + if( result > 0 ) \ PaUtil_DebugPrint("\t" positiveResultFormatString "\n", result ); \ else \ PaUtil_DebugPrint("\tPaError: %d ( %s )\n", result, Pa_GetErrorText( result ) ) @@ -133,7 +133,7 @@ void PaUtil_DebugPrint( const char *format, ... ); #define PA_LOGAPI_EXIT_PAERROR_OR_T_RESULT( functionName, positiveResultFormatString, result ) #endif - + typedef void (*PaUtilLogCallback ) (const char *log); /** diff --git a/src/common/pa_dither.c b/src/common/pa_dither.c index 140e480..0d1666a 100644 --- a/src/common/pa_dither.c +++ b/src/common/pa_dither.c @@ -26,13 +26,13 @@ */ /* - * The text above constitutes the entire PortAudio license; however, + * The text above constitutes the entire PortAudio license; however, * the PortAudio community also makes the following non-binding requests: * * 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. It is also - * requested that these non-binding requests be included along with the + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the * license above. */ @@ -72,10 +72,10 @@ PaInt32 PaUtil_Generate16BitTriangularDither( PaUtilTriangularDitherGenerator *s /* Generate triangular distribution about 0. * Shift before adding to prevent overflow which would skew the distribution. - * Also shift an extra bit for the high pass filter. + * Also shift an extra bit for the high pass filter. */ #define DITHER_SHIFT_ ((sizeof(PaInt32)*8 - PA_DITHER_BITS_) + 1) - + current = (((PaInt32)state->randSeed1)>>DITHER_SHIFT_) + (((PaInt32)state->randSeed2)>>DITHER_SHIFT_); @@ -100,7 +100,7 @@ float PaUtil_GenerateFloatTriangularDither( PaUtilTriangularDitherGenerator *sta /* Generate triangular distribution about 0. * Shift before adding to prevent overflow which would skew the distribution. - * Also shift an extra bit for the high pass filter. + * Also shift an extra bit for the high pass filter. */ current = (((PaInt32)state->randSeed1)>>DITHER_SHIFT_) + (((PaInt32)state->randSeed2)>>DITHER_SHIFT_); @@ -137,7 +137,7 @@ things like this: r3=(r1 & 0x7F)<<8; instead of calling rand() again. float s1, s2; //error feedback buffers float s = 0.5f; //set to 0.0f for no noise shaping float w = pow(2.0,bits-1); //word length (usually bits=16) - float wi= 1.0f/w; + float wi= 1.0f/w; float d = wi / RAND_MAX; //dither amplitude (2 lsb) float o = wi * 0.5f; //remove dc offset float in, tmp; @@ -148,19 +148,19 @@ things like this: r3=(r1 & 0x7F)<<8; instead of calling rand() again. r2=r1; //can make HP-TRI dither by r1=rand(); //subtracting previous rand() - + in += s * (s1 + s1 - s2); //error feedback - tmp = in + o + d * (float)(r1 - r2); //dc offset and dither - + tmp = in + o + d * (float)(r1 - r2); //dc offset and dither + out = (int)(w * tmp); //truncate downwards if(tmp<0.0f) out--; //this is faster than floor() - s2 = s1; + s2 = s1; s1 = in - wi * (float)out; //error --- +-- paul.kellett@maxim.abel.co.uk http://www.maxim.abel.co.uk */ @@ -172,7 +172,7 @@ http://www.maxim.abel.co.uk Type : First order error feedforward dithering code References : Posted by Jon Watte -Notes : +Notes : This is about as simple a dithering algorithm as you can implement, but it's likely to sound better than just truncating to N bits. @@ -183,36 +183,36 @@ and integer SIMD type instructions, or CMOV. Last, if sound quality is paramount (such as when going from > 16 bits to 16 bits) you probably want to use a higher-order dither function found elsewhere -on this site. +on this site. -Code : -// This code will down-convert and dither a 16-bit signed short -// mono signal into an 8-bit unsigned char signal, using a first -// order forward-feeding error term dither. +Code : +// This code will down-convert and dither a 16-bit signed short +// mono signal into an 8-bit unsigned char signal, using a first +// order forward-feeding error term dither. -#define uchar unsigned char +#define uchar unsigned char -void dither_one_channel_16_to_8( short * input, uchar * output, int count, int * memory ) -{ - int m = *memory; - while( count-- > 0 ) { - int i = *input++; - i += m; - int j = i + 32768 - 128; - uchar o; - if( j < 0 ) { - o = 0; - } - else if( j > 65535 ) { - o = 255; - } - else { - o = (uchar)((j>>8)&0xff); - } - m = ((j-32768+128)-i); - *output++ = o; - } - *memory = m; -} +void dither_one_channel_16_to_8( short * input, uchar * output, int count, int * memory ) +{ + int m = *memory; + while( count-- > 0 ) { + int i = *input++; + i += m; + int j = i + 32768 - 128; + uchar o; + if( j < 0 ) { + o = 0; + } + else if( j > 65535 ) { + o = 255; + } + else { + o = (uchar)((j>>8)&0xff); + } + m = ((j-32768+128)-i); + *output++ = o; + } + *memory = m; +} */ diff --git a/src/common/pa_dither.h b/src/common/pa_dither.h index 12ffc4f..4f81123 100644 --- a/src/common/pa_dither.h +++ b/src/common/pa_dither.h @@ -28,13 +28,13 @@ */ /* - * The text above constitutes the entire PortAudio license; however, + * The text above constitutes the entire PortAudio license; however, * the PortAudio community also makes the following non-binding requests: * * 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. It is also - * requested that these non-binding requests be included along with the + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the * license above. */ diff --git a/src/common/pa_endianness.h b/src/common/pa_endianness.h index 7496651..e074836 100644 --- a/src/common/pa_endianness.h +++ b/src/common/pa_endianness.h @@ -28,13 +28,13 @@ */ /* - * The text above constitutes the entire PortAudio license; however, + * The text above constitutes the entire PortAudio license; however, * the PortAudio community also makes the following non-binding requests: * * 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. It is also - * requested that these non-binding requests be included along with the + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the * license above. */ @@ -67,19 +67,19 @@ extern "C" #if defined(__APPLE__) /* we need to do some endian detection that is sensitive to hardware arch */ #if defined(__LITTLE_ENDIAN__) - #if !defined( PA_LITTLE_ENDIAN ) - #define PA_LITTLE_ENDIAN - #endif - #if defined( PA_BIG_ENDIAN ) - #undef PA_BIG_ENDIAN - #endif + #if !defined( PA_LITTLE_ENDIAN ) + #define PA_LITTLE_ENDIAN + #endif + #if defined( PA_BIG_ENDIAN ) + #undef PA_BIG_ENDIAN + #endif #else - #if !defined( PA_BIG_ENDIAN ) - #define PA_BIG_ENDIAN - #endif - #if defined( PA_LITTLE_ENDIAN ) - #undef PA_LITTLE_ENDIAN - #endif + #if !defined( PA_BIG_ENDIAN ) + #define PA_BIG_ENDIAN + #endif + #if defined( PA_LITTLE_ENDIAN ) + #undef PA_LITTLE_ENDIAN + #endif #endif #else /* this is not an apple, so first check the existing defines, and, failing that, diff --git a/src/common/pa_front.c b/src/common/pa_front.c index 9a258eb..6456e33 100644 --- a/src/common/pa_front.c +++ b/src/common/pa_front.c @@ -457,10 +457,10 @@ const char *Pa_GetErrorText( PaError errorCode ) case paIncompatibleStreamHostApi: result = "Incompatible stream host API"; break; case paBadBufferPtr: result = "Bad buffer pointer"; break; default: - if( errorCode > 0 ) - result = "Invalid error code (value greater than zero)"; + if( errorCode > 0 ) + result = "Invalid error code (value greater than zero)"; else - result = "Invalid error code"; + result = "Invalid error code"; break; } return result; @@ -637,7 +637,7 @@ const PaHostApiInfo* Pa_GetHostApiInfo( PaHostApiIndex hostApi ) } - return info; + return info; } @@ -884,9 +884,9 @@ static PaError ValidateOpenStreamParameters( PaDeviceIndex *hostApiInputDevice, PaDeviceIndex *hostApiOutputDevice ) { - int inputHostApiIndex = -1, /* Suppress uninitialised var warnings: compiler does */ - outputHostApiIndex = -1; /* not see that if inputParameters and outputParame- */ - /* ters are both nonzero, these indices are set. */ + int inputHostApiIndex = -1; /* Suppress uninitialised var warnings: compiler does */ + int outputHostApiIndex = -1; /* not see that if inputParameters and outputParameters */ + /* are both nonzero, these indices are set. */ if( (inputParameters == NULL) && (outputParameters == NULL) ) { @@ -1016,7 +1016,7 @@ static PaError ValidateOpenStreamParameters( { /* must be a callback stream */ if( !streamCallback ) - return paInvalidFlag; + return paInvalidFlag; /* must be a full duplex stream */ if( (inputParameters == NULL) || (outputParameters == NULL) ) @@ -1296,8 +1296,8 @@ PaError Pa_OpenDefaultStream( PaStream** stream, if( inputChannelCount > 0 ) { hostApiInputParameters.device = Pa_GetDefaultInputDevice(); - if( hostApiInputParameters.device == paNoDevice ) - return paDeviceUnavailable; + if( hostApiInputParameters.device == paNoDevice ) + return paDeviceUnavailable; hostApiInputParameters.channelCount = inputChannelCount; hostApiInputParameters.sampleFormat = sampleFormat; @@ -1319,8 +1319,8 @@ PaError Pa_OpenDefaultStream( PaStream** stream, if( outputChannelCount > 0 ) { hostApiOutputParameters.device = Pa_GetDefaultOutputDevice(); - if( hostApiOutputParameters.device == paNoDevice ) - return paDeviceUnavailable; + if( hostApiOutputParameters.device == paNoDevice ) + return paDeviceUnavailable; hostApiOutputParameters.channelCount = outputChannelCount; hostApiOutputParameters.sampleFormat = sampleFormat; diff --git a/src/common/pa_hostapi.h b/src/common/pa_hostapi.h index 54b527e..4ac3ab6 100644 --- a/src/common/pa_hostapi.h +++ b/src/common/pa_hostapi.h @@ -29,20 +29,20 @@ */ /* - * The text above constitutes the entire PortAudio license; however, + * The text above constitutes the entire PortAudio license; however, * the PortAudio community also makes the following non-binding requests: * * 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. It is also - * requested that these non-binding requests be included along with the + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the * license above. */ /** @file @ingroup common_src - @brief Interfaces and representation structures used by pa_front.c + @brief Interfaces and representation structures used by pa_front.c to manage and communicate with host API implementations. */ @@ -51,12 +51,12 @@ /** The PA_NO_* host API macros are now deprecated in favor of PA_USE_* macros. PA_USE_* indicates whether a particular host API will be initialized by PortAudio. -An undefined or 0 value indicates that the host API will not be used. A value of 1 -indicates that the host API will be used. PA_USE_* macros should be left undefined +An undefined or 0 value indicates that the host API will not be used. A value of 1 +indicates that the host API will be used. PA_USE_* macros should be left undefined or defined to either 0 or 1. The code below ensures that PA_USE_* macros are always defined and have value -0 or 1. Undefined symbols are defaulted to 0. Symbols that are neither 0 nor 1 +0 or 1. Undefined symbols are defaulted to 0. Symbols that are neither 0 nor 1 are defaulted to 1. */ @@ -65,7 +65,7 @@ are defaulted to 1. #elif (PA_USE_SKELETON != 0) && (PA_USE_SKELETON != 1) #undef PA_USE_SKELETON #define PA_USE_SKELETON 1 -#endif +#endif #if defined(PA_NO_ASIO) || defined(PA_NO_DS) || defined(PA_NO_WMME) || defined(PA_NO_WASAPI) || defined(PA_NO_WDMKS) #error "Portaudio: PA_NO_ is no longer supported, please remove definition and use PA_USE_ instead" @@ -76,35 +76,35 @@ are defaulted to 1. #elif (PA_USE_ASIO != 0) && (PA_USE_ASIO != 1) #undef PA_USE_ASIO #define PA_USE_ASIO 1 -#endif +#endif #ifndef PA_USE_DS #define PA_USE_DS 0 #elif (PA_USE_DS != 0) && (PA_USE_DS != 1) #undef PA_USE_DS #define PA_USE_DS 1 -#endif +#endif #ifndef PA_USE_WMME #define PA_USE_WMME 0 #elif (PA_USE_WMME != 0) && (PA_USE_WMME != 1) #undef PA_USE_WMME #define PA_USE_WMME 1 -#endif +#endif #ifndef PA_USE_WASAPI #define PA_USE_WASAPI 0 #elif (PA_USE_WASAPI != 0) && (PA_USE_WASAPI != 1) #undef PA_USE_WASAPI #define PA_USE_WASAPI 1 -#endif +#endif #ifndef PA_USE_WDMKS #define PA_USE_WDMKS 0 #elif (PA_USE_WDMKS != 0) && (PA_USE_WDMKS != 1) #undef PA_USE_WDMKS #define PA_USE_WDMKS 1 -#endif +#endif /* Set default values for Unix based APIs. */ #if defined(PA_NO_OSS) || defined(PA_NO_ALSA) || defined(PA_NO_JACK) || defined(PA_NO_COREAUDIO) || defined(PA_NO_SGI) || defined(PA_NO_ASIHPI) @@ -116,42 +116,42 @@ are defaulted to 1. #elif (PA_USE_OSS != 0) && (PA_USE_OSS != 1) #undef PA_USE_OSS #define PA_USE_OSS 1 -#endif +#endif #ifndef PA_USE_ALSA #define PA_USE_ALSA 0 #elif (PA_USE_ALSA != 0) && (PA_USE_ALSA != 1) #undef PA_USE_ALSA #define PA_USE_ALSA 1 -#endif +#endif #ifndef PA_USE_JACK #define PA_USE_JACK 0 #elif (PA_USE_JACK != 0) && (PA_USE_JACK != 1) #undef PA_USE_JACK #define PA_USE_JACK 1 -#endif +#endif #ifndef PA_USE_SGI #define PA_USE_SGI 0 #elif (PA_USE_SGI != 0) && (PA_USE_SGI != 1) #undef PA_USE_SGI #define PA_USE_SGI 1 -#endif +#endif #ifndef PA_USE_COREAUDIO #define PA_USE_COREAUDIO 0 #elif (PA_USE_COREAUDIO != 0) && (PA_USE_COREAUDIO != 1) #undef PA_USE_COREAUDIO #define PA_USE_COREAUDIO 1 -#endif +#endif #ifndef PA_USE_ASIHPI #define PA_USE_ASIHPI 0 #elif (PA_USE_ASIHPI != 0) && (PA_USE_ASIHPI != 1) #undef PA_USE_ASIHPI #define PA_USE_ASIHPI 1 -#endif +#endif #ifdef __cplusplus extern "C" @@ -216,13 +216,13 @@ typedef struct PaUtilHostApiRepresentation { The inputParameters and outputParameters pointers should not be saved as they will not remain valid after OpenStream is called. - + The following guarantees are made about parameters to (*OpenStream)(): [NOTE: the following list up to *END PA FRONT VALIDATIONS* should be kept in sync with the one for ValidateOpenStreamParameters and Pa_OpenStream in pa_front.c] - + PaHostApiRepresentation *hostApi - is valid for this implementation @@ -233,7 +233,7 @@ typedef struct PaUtilHostApiRepresentation { - if inputParameters & outputParmeters are both valid, that inputParameters->device & outputParmeters->device both use the same host api - + PaDeviceIndex inputParameters->device - is within range (0 to Pa_CountDevices-1) Or: - is paUseHostApiSpecificDeviceSpecification and @@ -243,30 +243,30 @@ typedef struct PaUtilHostApiRepresentation { int inputParameters->numChannels - if inputParameters->device is not paUseHostApiSpecificDeviceSpecification, numInputChannels is > 0 - upper bound is NOT validated against device capabilities - + PaSampleFormat inputParameters->sampleFormat - is one of the sample formats defined in portaudio.h void *inputParameters->hostApiSpecificStreamInfo - if supplied its hostApi field matches the input device's host Api - + PaDeviceIndex outputParmeters->device - is within range (0 to Pa_CountDevices-1) - + int outputParmeters->numChannels - if inputDevice is valid, numInputChannels is > 0 - upper bound is NOT validated against device capabilities - + PaSampleFormat outputParmeters->sampleFormat - is one of the sample formats defined in portaudio.h - + void *outputParmeters->hostApiSpecificStreamInfo - if supplied its hostApi field matches the output device's host Api - + double sampleRate - is not an 'absurd' rate (less than 1000. or greater than 384000.) - sampleRate is NOT validated against device capabilities - + PaStreamFlags streamFlags - unused platform neutral flags are zero - paNeverDropInput is only used for full-duplex callback streams @@ -278,7 +278,7 @@ typedef struct PaUtilHostApiRepresentation { The following validations MUST be performed by (*OpenStream)(): - check that input device can support numInputChannels - + - check that input device can support inputSampleFormat, or that we have the capability to convert from outputSampleFormat to a native format @@ -287,7 +287,7 @@ typedef struct PaUtilHostApiRepresentation { or return an error if no inputStreamInfo is expected - check that output device can support numOutputChannels - + - check that output device can support outputSampleFormat, or that we have the capability to convert from outputSampleFormat to a native format @@ -327,11 +327,11 @@ typedef struct PaUtilHostApiRepresentation { /** Prototype for the initialization function which must be implemented by every host API. - - This function should only return an error other than paNoError if it encounters - an unexpected and fatal error (memory allocation error for example). In general, - there may be conditions under which it returns a NULL interface pointer and also - returns paNoError. For example, if the ASIO implementation detects that ASIO is + + This function should only return an error other than paNoError if it encounters + an unexpected and fatal error (memory allocation error for example). In general, + there may be conditions under which it returns a NULL interface pointer and also + returns paNoError. For example, if the ASIO implementation detects that ASIO is not installed, it should return a NULL interface, and paNoError. @see paHostApiInitializers @@ -341,11 +341,11 @@ typedef PaError PaUtilHostApiInitializer( PaUtilHostApiRepresentation**, PaHostA /** paHostApiInitializers is a NULL-terminated array of host API initialization functions. These functions are called by pa_front.c to initialize the host APIs - when the client calls Pa_Initialize(). - + when the client calls Pa_Initialize(). + The initialization functions are invoked in order. - The first successfully initialized host API that has a default input *or* output + The first successfully initialized host API that has a default input *or* output device is used as the default PortAudio host API. This is based on the logic that there is only one default host API, and it must contain the default input and output devices (if defined). diff --git a/src/common/pa_memorybarrier.h b/src/common/pa_memorybarrier.h index 2879ce3..0dca6aa 100644 --- a/src/common/pa_memorybarrier.h +++ b/src/common/pa_memorybarrier.h @@ -30,13 +30,13 @@ */ /* - * The text above constitutes the entire PortAudio license; however, + * The text above constitutes the entire PortAudio license; however, * the PortAudio community also makes the following non-binding requests: * * 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. It is also - * requested that these non-binding requests be included along with the + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the * license above. */ @@ -71,32 +71,32 @@ #elif defined(__GNUC__) /* GCC >= 4.1 has built-in intrinsics. We'll use those */ # if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 1) -# define PaUtil_FullMemoryBarrier() __sync_synchronize() -# define PaUtil_ReadMemoryBarrier() __sync_synchronize() -# define PaUtil_WriteMemoryBarrier() __sync_synchronize() +# define PaUtil_FullMemoryBarrier() __sync_synchronize() +# define PaUtil_ReadMemoryBarrier() __sync_synchronize() +# define PaUtil_WriteMemoryBarrier() __sync_synchronize() /* as a fallback, GCC understands volatile asm and "memory" to mean it * should not reorder memory read/writes */ /* Note that it is not clear that any compiler actually defines __PPC__, * it can probably removed safely. */ # elif defined( __ppc__ ) || defined( __powerpc__) || defined( __PPC__ ) -# define PaUtil_FullMemoryBarrier() asm volatile("sync":::"memory") -# define PaUtil_ReadMemoryBarrier() asm volatile("sync":::"memory") -# define PaUtil_WriteMemoryBarrier() asm volatile("sync":::"memory") +# define PaUtil_FullMemoryBarrier() asm volatile("sync":::"memory") +# define PaUtil_ReadMemoryBarrier() asm volatile("sync":::"memory") +# define PaUtil_WriteMemoryBarrier() asm volatile("sync":::"memory") # elif defined( __i386__ ) || defined( __i486__ ) || defined( __i586__ ) || \ - defined( __i686__ ) || defined( __x86_64__ ) -# define PaUtil_FullMemoryBarrier() asm volatile("mfence":::"memory") -# define PaUtil_ReadMemoryBarrier() asm volatile("lfence":::"memory") -# define PaUtil_WriteMemoryBarrier() asm volatile("sfence":::"memory") + defined( __i686__ ) || defined( __x86_64__ ) +# define PaUtil_FullMemoryBarrier() asm volatile("mfence":::"memory") +# define PaUtil_ReadMemoryBarrier() asm volatile("lfence":::"memory") +# define PaUtil_WriteMemoryBarrier() asm volatile("sfence":::"memory") # else -# ifdef ALLOW_SMP_DANGERS -# warning Memory barriers not defined on this system or system unknown -# warning For SMP safety, you should fix this. -# define PaUtil_FullMemoryBarrier() -# define PaUtil_ReadMemoryBarrier() -# define PaUtil_WriteMemoryBarrier() -# else -# error Memory barriers are not defined on this system. You can still compile by defining ALLOW_SMP_DANGERS, but SMP safety will not be guaranteed. -# endif +# ifdef ALLOW_SMP_DANGERS +# warning Memory barriers not defined on this system or system unknown +# warning For SMP safety, you should fix this. +# define PaUtil_FullMemoryBarrier() +# define PaUtil_ReadMemoryBarrier() +# define PaUtil_WriteMemoryBarrier() +# else +# error Memory barriers are not defined on this system. You can still compile by defining ALLOW_SMP_DANGERS, but SMP safety will not be guaranteed. +# endif # endif #elif (_MSC_VER >= 1400) && !defined(_WIN32_WCE) # include @@ -117,12 +117,12 @@ # define PaUtil_WriteMemoryBarrier() _asm { lock add [esp], 0 } #else # ifdef ALLOW_SMP_DANGERS -# warning Memory barriers not defined on this system or system unknown -# warning For SMP safety, you should fix this. -# define PaUtil_FullMemoryBarrier() -# define PaUtil_ReadMemoryBarrier() -# define PaUtil_WriteMemoryBarrier() +# warning Memory barriers not defined on this system or system unknown +# warning For SMP safety, you should fix this. +# define PaUtil_FullMemoryBarrier() +# define PaUtil_ReadMemoryBarrier() +# define PaUtil_WriteMemoryBarrier() # else -# error Memory barriers are not defined on this system. You can still compile by defining ALLOW_SMP_DANGERS, but SMP safety will not be guaranteed. +# error Memory barriers are not defined on this system. You can still compile by defining ALLOW_SMP_DANGERS, but SMP safety will not be guaranteed. # endif #endif diff --git a/src/common/pa_process.c b/src/common/pa_process.c index 0faf841..084cabb 100644 --- a/src/common/pa_process.c +++ b/src/common/pa_process.c @@ -27,13 +27,13 @@ */ /* - * The text above constitutes the entire PortAudio license; however, + * The text above constitutes the entire PortAudio license; however, * the PortAudio community also makes the following non-binding requests: * * 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. It is also - * requested that these non-binding requests be included along with the + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the * license above. */ @@ -142,7 +142,7 @@ PaError PaUtil_InitializeBufferProcessor( PaUtilBufferProcessor* bp, } else /* unknown host buffer size */ { - bp->framesPerTempBuffer = PA_FRAMES_PER_TEMP_BUFFER_WHEN_HOST_BUFFER_SIZE_IS_UNKNOWN_; + bp->framesPerTempBuffer = PA_FRAMES_PER_TEMP_BUFFER_WHEN_HOST_BUFFER_SIZE_IS_UNKNOWN_; } } else @@ -198,7 +198,7 @@ PaError PaUtil_InitializeBufferProcessor( PaUtilBufferProcessor* bp, bp->framesInTempInputBuffer = bp->initialFramesInTempInputBuffer; bp->framesInTempOutputBuffer = bp->initialFramesInTempOutputBuffer; - + if( inputChannelCount > 0 ) { bytesPerSample = Pa_GetSampleSize( hostInputSampleFormat ); @@ -224,7 +224,7 @@ PaError PaUtil_InitializeBufferProcessor( PaUtilBufferProcessor* bp, } /* Under the assumption that no ADC in existence delivers better than 24bits resolution, - we disable dithering when host input format is paInt32 and user format is paInt24, + we disable dithering when host input format is paInt32 and user format is paInt24, since the host samples will just be padded with zeros anyway. */ tempInputStreamFlags = streamFlags; @@ -239,23 +239,23 @@ PaError PaUtil_InitializeBufferProcessor( PaUtilBufferProcessor* bp, PaUtil_SelectConverter( hostInputSampleFormat, userInputSampleFormat, tempInputStreamFlags ); bp->inputZeroer = PaUtil_SelectZeroer( userInputSampleFormat ); - + bp->userInputIsInterleaved = (userInputSampleFormat & paNonInterleaved)?0:1; - + bp->hostInputIsInterleaved = (hostInputSampleFormat & paNonInterleaved)?0:1; bp->userInputSampleFormatIsEqualToHost = ((userInputSampleFormat & ~paNonInterleaved) == (hostInputSampleFormat & ~paNonInterleaved)); tempInputBufferSize = bp->framesPerTempBuffer * bp->bytesPerUserInputSample * inputChannelCount; - + bp->tempInputBuffer = PaUtil_AllocateMemory( tempInputBufferSize ); if( bp->tempInputBuffer == 0 ) { result = paInsufficientMemory; goto error; } - + if( bp->framesInTempInputBuffer > 0 ) memset( bp->tempInputBuffer, 0, tempInputBufferSize ); @@ -328,7 +328,7 @@ PaError PaUtil_InitializeBufferProcessor( PaUtilBufferProcessor* bp, if( bp->framesInTempOutputBuffer > 0 ) memset( bp->tempOutputBuffer, 0, tempOutputBufferSize ); - + if( userOutputSampleFormat & paNonInterleaved ) { bp->tempOutputBufferPtrs = @@ -343,7 +343,7 @@ PaError PaUtil_InitializeBufferProcessor( PaUtilBufferProcessor* bp, bp->hostOutputChannels[0] = (PaUtilChannelDescriptor*) PaUtil_AllocateMemory( sizeof(PaUtilChannelDescriptor)*outputChannelCount * 2 ); if( bp->hostOutputChannels[0] == 0 ) - { + { result = paInsufficientMemory; goto error; } @@ -393,7 +393,7 @@ void PaUtil_TerminateBufferProcessor( PaUtilBufferProcessor* bp ) if( bp->hostInputChannels[0] ) PaUtil_FreeMemory( bp->hostInputChannels[0] ); - + if( bp->tempOutputBuffer ) PaUtil_FreeMemory( bp->tempOutputBuffer ); @@ -420,7 +420,7 @@ void PaUtil_ResetBufferProcessor( PaUtilBufferProcessor* bp ) } if( bp->framesInTempOutputBuffer > 0 ) - { + { tempOutputBufferSize = bp->framesPerTempBuffer * bp->bytesPerUserOutputSample * bp->outputChannelCount; memset( bp->tempOutputBuffer, 0, tempOutputBufferSize ); @@ -448,7 +448,7 @@ void PaUtil_SetInputFrameCount( PaUtilBufferProcessor* bp, else bp->hostInputFrameCount[0] = frameCount; } - + void PaUtil_SetNoInput( PaUtilBufferProcessor* bp ) { @@ -462,7 +462,7 @@ void PaUtil_SetInputChannel( PaUtilBufferProcessor* bp, unsigned int channel, void *data, unsigned int stride ) { assert( channel < bp->inputChannelCount ); - + bp->hostInputChannels[0][channel].data = data; bp->hostInputChannels[0][channel].stride = stride; } @@ -496,7 +496,7 @@ void PaUtil_SetNonInterleavedInputChannel( PaUtilBufferProcessor* bp, { assert( channel < bp->inputChannelCount ); assert( !bp->hostInputIsInterleaved ); - + bp->hostInputChannels[0][channel].data = data; bp->hostInputChannels[0][channel].stride = 1; } @@ -532,7 +532,7 @@ void PaUtil_Set2ndInterleavedInputChannels( PaUtilBufferProcessor* bp, assert( firstChannel < bp->inputChannelCount ); assert( firstChannel + channelCount <= bp->inputChannelCount ); assert( bp->hostInputIsInterleaved ); - + for( i=0; i< channelCount; ++i ) { bp->hostInputChannels[1][channel+i].data = p; @@ -541,13 +541,13 @@ void PaUtil_Set2ndInterleavedInputChannels( PaUtilBufferProcessor* bp, } } - + void PaUtil_Set2ndNonInterleavedInputChannel( PaUtilBufferProcessor* bp, unsigned int channel, void *data ) { assert( channel < bp->inputChannelCount ); assert( !bp->hostInputIsInterleaved ); - + bp->hostInputChannels[1][channel].data = data; bp->hostInputChannels[1][channel].stride = 1; } @@ -597,7 +597,7 @@ void PaUtil_SetInterleavedOutputChannels( PaUtilBufferProcessor* bp, assert( firstChannel < bp->outputChannelCount ); assert( firstChannel + channelCount <= bp->outputChannelCount ); assert( bp->hostOutputIsInterleaved ); - + for( i=0; i< channelCount; ++i ) { PaUtil_SetOutputChannel( bp, channel + i, p, channelCount ); @@ -647,7 +647,7 @@ void PaUtil_Set2ndInterleavedOutputChannels( PaUtilBufferProcessor* bp, assert( firstChannel < bp->outputChannelCount ); assert( firstChannel + channelCount <= bp->outputChannelCount ); assert( bp->hostOutputIsInterleaved ); - + for( i=0; i< channelCount; ++i ) { PaUtil_Set2ndOutputChannel( bp, channel + i, p, channelCount ); @@ -655,13 +655,13 @@ void PaUtil_Set2ndInterleavedOutputChannels( PaUtilBufferProcessor* bp, } } - + void PaUtil_Set2ndNonInterleavedOutputChannel( PaUtilBufferProcessor* bp, unsigned int channel, void *data ) { assert( channel < bp->outputChannelCount ); assert( !bp->hostOutputIsInterleaved ); - + PaUtil_Set2ndOutputChannel( bp, channel, data, 1 ); } @@ -673,11 +673,11 @@ void PaUtil_BeginBufferProcessing( PaUtilBufferProcessor* bp, /* the first streamCallback will be called to process samples which are currently in the input buffer before the ones starting at the timeInfo time */ - + bp->timeInfo->inputBufferAdcTime -= bp->framesInTempInputBuffer * bp->samplePeriod; - + /* We just pass through timeInfo->currentTime provided by the caller. This is - not strictly conformant to the word of the spec, since the buffer processor + not strictly conformant to the word of the spec, since the buffer processor might call the callback multiple times, and we never refresh currentTime. */ /* the first streamCallback will be called to generate samples which will be @@ -735,7 +735,7 @@ static unsigned long NonAdaptingProcess( PaUtilBufferProcessor *bp, } else /* there are input channels */ { - + destBytePtr = (unsigned char *)bp->tempInputBuffer; if( bp->userInputIsInterleaved ) @@ -779,7 +779,7 @@ static unsigned long NonAdaptingProcess( PaUtilBufferProcessor *bp, i * bp->bytesPerUserInputSample * frameCount; } } - + userInput = bp->tempInputBufferPtrs; } @@ -795,7 +795,7 @@ static unsigned long NonAdaptingProcess( PaUtilBufferProcessor *bp, } } else - { + { if( skipInputConvert ) { for( i=0; iinputChannelCount; ++i ) @@ -837,7 +837,7 @@ static unsigned long NonAdaptingProcess( PaUtilBufferProcessor *bp, /* process host buffer directly, or use temp buffer if formats differ or host buffer non-interleaved, * or if num channels differs between the host (set in stride) and the user (eg with some Alsa hw:) */ if( bp->userOutputSampleFormatIsEqualToHost && bp->hostOutputIsInterleaved - && bp->outputChannelCount == hostOutputChannels[0].stride ) + && bp->outputChannelCount == hostOutputChannels[0].stride ) { userOutput = hostOutputChannels[0].data; skipOutputConvert = 1; @@ -869,7 +869,7 @@ static unsigned long NonAdaptingProcess( PaUtilBufferProcessor *bp, userOutput = bp->tempOutputBufferPtrs; } } - + *streamCallbackResult = bp->streamCallback( userInput, userOutput, frameCount, bp->timeInfo, bp->callbackStatusFlags, bp->userData ); @@ -884,50 +884,50 @@ static unsigned long NonAdaptingProcess( PaUtilBufferProcessor *bp, bp->timeInfo->outputBufferDacTime += frameCount * bp->samplePeriod; /* convert output data (user -> host) */ - + if( bp->outputChannelCount != 0 && bp->hostOutputChannels[0][0].data ) { if( skipOutputConvert ) - { - for( i=0; ioutputChannelCount; ++i ) - { - /* advance dest ptr for next iteration */ - hostOutputChannels[i].data = ((unsigned char*)hostOutputChannels[i].data) + - frameCount * hostOutputChannels[i].stride * bp->bytesPerHostOutputSample; - } - } - else - { + { + for( i=0; ioutputChannelCount; ++i ) + { + /* advance dest ptr for next iteration */ + hostOutputChannels[i].data = ((unsigned char*)hostOutputChannels[i].data) + + frameCount * hostOutputChannels[i].stride * bp->bytesPerHostOutputSample; + } + } + else + { - srcBytePtr = (unsigned char *)bp->tempOutputBuffer; + srcBytePtr = (unsigned char *)bp->tempOutputBuffer; - if( bp->userOutputIsInterleaved ) - { - srcSampleStrideSamples = bp->outputChannelCount; - srcChannelStrideBytes = bp->bytesPerUserOutputSample; - } - else /* user output is not interleaved */ - { - srcSampleStrideSamples = 1; - srcChannelStrideBytes = frameCount * bp->bytesPerUserOutputSample; - } + if( bp->userOutputIsInterleaved ) + { + srcSampleStrideSamples = bp->outputChannelCount; + srcChannelStrideBytes = bp->bytesPerUserOutputSample; + } + else /* user output is not interleaved */ + { + srcSampleStrideSamples = 1; + srcChannelStrideBytes = frameCount * bp->bytesPerUserOutputSample; + } - for( i=0; ioutputChannelCount; ++i ) - { - bp->outputConverter( hostOutputChannels[i].data, - hostOutputChannels[i].stride, - srcBytePtr, srcSampleStrideSamples, - frameCount, &bp->ditherGenerator ); + for( i=0; ioutputChannelCount; ++i ) + { + bp->outputConverter( hostOutputChannels[i].data, + hostOutputChannels[i].stride, + srcBytePtr, srcSampleStrideSamples, + frameCount, &bp->ditherGenerator ); - srcBytePtr += srcChannelStrideBytes; /* skip to next source channel */ + srcBytePtr += srcChannelStrideBytes; /* skip to next source channel */ - /* advance dest ptr for next iteration */ - hostOutputChannels[i].data = ((unsigned char*)hostOutputChannels[i].data) + - frameCount * hostOutputChannels[i].stride * bp->bytesPerHostOutputSample; - } - } + /* advance dest ptr for next iteration */ + hostOutputChannels[i].data = ((unsigned char*)hostOutputChannels[i].data) + + frameCount * hostOutputChannels[i].stride * bp->bytesPerHostOutputSample; + } + } } - + framesProcessed += frameCount; framesToGo -= frameCount; @@ -982,7 +982,7 @@ static unsigned long AdaptingInputOnlyProcess( PaUtilBufferProcessor *bp, unsigned long frameCount; unsigned long framesToGo = framesToProcess; unsigned long framesProcessed = 0; - + userOutput = 0; do @@ -998,7 +998,7 @@ static unsigned long AdaptingInputOnlyProcess( PaUtilBufferProcessor *bp, destBytePtr = ((unsigned char*)bp->tempInputBuffer) + bp->bytesPerUserInputSample * bp->inputChannelCount * bp->framesInTempInputBuffer; - + destSampleStrideSamples = bp->inputChannelCount; destChannelStrideBytes = bp->bytesPerUserInputSample; @@ -1018,7 +1018,7 @@ static unsigned long AdaptingInputOnlyProcess( PaUtilBufferProcessor *bp, bp->tempInputBufferPtrs[i] = ((unsigned char*)bp->tempInputBuffer) + i * bp->bytesPerUserInputSample * bp->framesPerUserBuffer; } - + userInput = bp->tempInputBufferPtrs; } @@ -1058,7 +1058,7 @@ static unsigned long AdaptingInputOnlyProcess( PaUtilBufferProcessor *bp, bp->timeInfo->inputBufferAdcTime += bp->framesPerUserBuffer * bp->samplePeriod; } - + bp->framesInTempInputBuffer = 0; } @@ -1113,7 +1113,7 @@ static unsigned long AdaptingOutputOnlyProcess( PaUtilBufferProcessor *bp, } bp->timeInfo->inputBufferAdcTime = 0; - + *streamCallbackResult = bp->streamCallback( userInput, userOutput, bp->framesPerUserBuffer, bp->timeInfo, bp->callbackStatusFlags, bp->userData ); @@ -1150,7 +1150,7 @@ static unsigned long AdaptingOutputOnlyProcess( PaUtilBufferProcessor *bp, srcBytePtr = ((unsigned char*)bp->tempOutputBuffer) + bp->bytesPerUserOutputSample * (bp->framesPerUserBuffer - bp->framesInTempOutputBuffer); - + srcSampleStrideSamples = 1; srcChannelStrideBytes = bp->framesPerUserBuffer * bp->bytesPerUserOutputSample; } @@ -1191,9 +1191,9 @@ static unsigned long AdaptingOutputOnlyProcess( PaUtilBufferProcessor *bp, frameCount * hostOutputChannels[i].stride * bp->bytesPerHostOutputSample; } } - + framesProcessed += frameCount; - + framesToGo -= frameCount; }while( framesToGo > 0 ); @@ -1202,8 +1202,8 @@ static unsigned long AdaptingOutputOnlyProcess( PaUtilBufferProcessor *bp, } /* CopyTempOutputBuffersToHostOutputBuffers is called from AdaptingProcess to copy frames from - tempOutputBuffer to hostOutputChannels. This includes data conversion - and interleaving. + tempOutputBuffer to hostOutputChannels. This includes data conversion + and interleaving. */ static void CopyTempOutputBuffersToHostOutputBuffers( PaUtilBufferProcessor *bp) { @@ -1215,65 +1215,65 @@ static void CopyTempOutputBuffersToHostOutputBuffers( PaUtilBufferProcessor *bp) unsigned int srcChannelStrideBytes; /* stride from one channel to the next, in bytes */ unsigned int i; - /* copy frames from user to host output buffers */ - while( bp->framesInTempOutputBuffer > 0 && - ((bp->hostOutputFrameCount[0] + bp->hostOutputFrameCount[1]) > 0) ) - { - maxFramesToCopy = bp->framesInTempOutputBuffer; + /* copy frames from user to host output buffers */ + while( bp->framesInTempOutputBuffer > 0 && + ((bp->hostOutputFrameCount[0] + bp->hostOutputFrameCount[1]) > 0) ) + { + maxFramesToCopy = bp->framesInTempOutputBuffer; - /* select the output buffer set (1st or 2nd) */ - if( bp->hostOutputFrameCount[0] > 0 ) - { - hostOutputChannels = bp->hostOutputChannels[0]; - frameCount = PA_MIN_( bp->hostOutputFrameCount[0], maxFramesToCopy ); - } - else - { - hostOutputChannels = bp->hostOutputChannels[1]; - frameCount = PA_MIN_( bp->hostOutputFrameCount[1], maxFramesToCopy ); - } + /* select the output buffer set (1st or 2nd) */ + if( bp->hostOutputFrameCount[0] > 0 ) + { + hostOutputChannels = bp->hostOutputChannels[0]; + frameCount = PA_MIN_( bp->hostOutputFrameCount[0], maxFramesToCopy ); + } + else + { + hostOutputChannels = bp->hostOutputChannels[1]; + frameCount = PA_MIN_( bp->hostOutputFrameCount[1], maxFramesToCopy ); + } - if( bp->userOutputIsInterleaved ) - { - srcBytePtr = ((unsigned char*)bp->tempOutputBuffer) + - bp->bytesPerUserOutputSample * bp->outputChannelCount * - (bp->framesPerUserBuffer - bp->framesInTempOutputBuffer); - - srcSampleStrideSamples = bp->outputChannelCount; - srcChannelStrideBytes = bp->bytesPerUserOutputSample; - } - else /* user output is not interleaved */ - { - srcBytePtr = ((unsigned char*)bp->tempOutputBuffer) + - bp->bytesPerUserOutputSample * - (bp->framesPerUserBuffer - bp->framesInTempOutputBuffer); + if( bp->userOutputIsInterleaved ) + { + srcBytePtr = ((unsigned char*)bp->tempOutputBuffer) + + bp->bytesPerUserOutputSample * bp->outputChannelCount * + (bp->framesPerUserBuffer - bp->framesInTempOutputBuffer); - srcSampleStrideSamples = 1; - srcChannelStrideBytes = bp->framesPerUserBuffer * bp->bytesPerUserOutputSample; - } + srcSampleStrideSamples = bp->outputChannelCount; + srcChannelStrideBytes = bp->bytesPerUserOutputSample; + } + else /* user output is not interleaved */ + { + srcBytePtr = ((unsigned char*)bp->tempOutputBuffer) + + bp->bytesPerUserOutputSample * + (bp->framesPerUserBuffer - bp->framesInTempOutputBuffer); - for( i=0; ioutputChannelCount; ++i ) - { - assert( hostOutputChannels[i].data != NULL ); - bp->outputConverter( hostOutputChannels[i].data, - hostOutputChannels[i].stride, - srcBytePtr, srcSampleStrideSamples, - frameCount, &bp->ditherGenerator ); + srcSampleStrideSamples = 1; + srcChannelStrideBytes = bp->framesPerUserBuffer * bp->bytesPerUserOutputSample; + } - srcBytePtr += srcChannelStrideBytes; /* skip to next source channel */ + for( i=0; ioutputChannelCount; ++i ) + { + assert( hostOutputChannels[i].data != NULL ); + bp->outputConverter( hostOutputChannels[i].data, + hostOutputChannels[i].stride, + srcBytePtr, srcSampleStrideSamples, + frameCount, &bp->ditherGenerator ); - /* advance dest ptr for next iteration */ - hostOutputChannels[i].data = ((unsigned char*)hostOutputChannels[i].data) + - frameCount * hostOutputChannels[i].stride * bp->bytesPerHostOutputSample; - } + srcBytePtr += srcChannelStrideBytes; /* skip to next source channel */ - if( bp->hostOutputFrameCount[0] > 0 ) - bp->hostOutputFrameCount[0] -= frameCount; - else - bp->hostOutputFrameCount[1] -= frameCount; + /* advance dest ptr for next iteration */ + hostOutputChannels[i].data = ((unsigned char*)hostOutputChannels[i].data) + + frameCount * hostOutputChannels[i].stride * bp->bytesPerHostOutputSample; + } - bp->framesInTempOutputBuffer -= frameCount; - } + if( bp->hostOutputFrameCount[0] > 0 ) + bp->hostOutputFrameCount[0] -= frameCount; + else + bp->hostOutputFrameCount[1] -= frameCount; + + bp->framesInTempOutputBuffer -= frameCount; + } } /* @@ -1300,7 +1300,7 @@ static unsigned long AdaptingProcess( PaUtilBufferProcessor *bp, unsigned int destSampleStrideSamples; /* stride from one sample to the next within a channel, in samples */ unsigned int destChannelStrideBytes; /* stride from one channel to the next, in bytes */ unsigned int i, j; - + framesAvailable = bp->hostInputFrameCount[0] + bp->hostInputFrameCount[1];/* this is assumed to be the same as the output buffer's frame count */ @@ -1310,9 +1310,9 @@ static unsigned long AdaptingProcess( PaUtilBufferProcessor *bp, endProcessingMinFrameCount = (bp->framesPerUserBuffer - 1); /* Fill host output with remaining frames in user output (tempOutputBuffer) */ - CopyTempOutputBuffersToHostOutputBuffers( bp ); + CopyTempOutputBuffersToHostOutputBuffers( bp ); - while( framesAvailable > endProcessingMinFrameCount ) + while( framesAvailable > endProcessingMinFrameCount ) { if( bp->framesInTempOutputBuffer == 0 && *streamCallbackResult != paContinue ) @@ -1326,7 +1326,7 @@ static unsigned long AdaptingProcess( PaUtilBufferProcessor *bp, if( frameCount > 0 ) { hostOutputChannels = bp->hostOutputChannels[i]; - + for( j=0; joutputChannelCount; ++j ) { bp->outputZeroer( hostOutputChannels[j].data, @@ -1340,7 +1340,7 @@ static unsigned long AdaptingProcess( PaUtilBufferProcessor *bp, bp->hostOutputFrameCount[i] = 0; } } - } + } /* copy frames from host to user input buffers */ @@ -1398,7 +1398,7 @@ static unsigned long AdaptingProcess( PaUtilBufferProcessor *bp, bp->hostInputFrameCount[0] -= frameCount; else bp->hostInputFrameCount[1] -= frameCount; - + bp->framesInTempInputBuffer += frameCount; /* update framesAvailable and framesProcessed based on input consumed @@ -1470,13 +1470,13 @@ static unsigned long AdaptingProcess( PaUtilBufferProcessor *bp, } } - /* copy frames from user (tempOutputBuffer) to host output buffers (hostOutputChannels) + /* copy frames from user (tempOutputBuffer) to host output buffers (hostOutputChannels) Means to process the user output provided by the callback. Has to be called after each callback. */ - CopyTempOutputBuffersToHostOutputBuffers( bp ); + CopyTempOutputBuffersToHostOutputBuffers( bp ); } - + return framesProcessed; } @@ -1485,7 +1485,7 @@ unsigned long PaUtil_EndBufferProcessing( PaUtilBufferProcessor* bp, int *stream { unsigned long framesToProcess, framesToGo; unsigned long framesProcessed = 0; - + if( bp->inputChannelCount != 0 && bp->outputChannelCount != 0 && bp->hostInputChannels[0][0].data /* input was supplied (see PaUtil_SetNoInput) */ && bp->hostOutputChannels[0][0].data /* output was supplied (see PaUtil_SetNoOutput) */ ) @@ -1560,17 +1560,17 @@ unsigned long PaUtil_EndBufferProcessing( PaUtilBufferProcessor* bp, int *stream *hostOutputFrameCount ); assert( framesToProcess != 0 ); - + framesProcessedThisIteration = NonAdaptingProcess( bp, streamCallbackResult, hostInputChannels, hostOutputChannels, - framesToProcess ); + framesToProcess ); *hostInputFrameCount -= framesProcessedThisIteration; *hostOutputFrameCount -= framesProcessedThisIteration; framesProcessed += framesProcessedThisIteration; framesToGo -= framesProcessedThisIteration; - + }while( framesToGo > 0 ); } else @@ -1587,7 +1587,7 @@ unsigned long PaUtil_EndBufferProcessing( PaUtilBufferProcessor* bp, int *stream framesToProcess ); /* process second buffer if provided */ - + framesToProcess = (bp->inputChannelCount != 0) ? bp->hostInputFrameCount[1] : bp->hostOutputFrameCount[1]; @@ -1605,7 +1605,7 @@ unsigned long PaUtil_EndBufferProcessing( PaUtilBufferProcessor* bp, int *stream if( bp->inputChannelCount != 0 && bp->outputChannelCount != 0 ) { /* full duplex */ - + if( bp->hostBufferSizeMode == paUtilVariableHostBufferSizePartialUsageAllowed ) { framesProcessed = AdaptingProcess( bp, streamCallbackResult, @@ -1656,7 +1656,7 @@ unsigned long PaUtil_EndBufferProcessing( PaUtilBufferProcessor* bp, int *stream int PaUtil_IsBufferProcessorOutputEmpty( PaUtilBufferProcessor* bp ) { return (bp->framesInTempOutputBuffer) ? 0 : 1; -} +} unsigned long PaUtil_CopyInput( PaUtilBufferProcessor* bp, @@ -1676,7 +1676,7 @@ unsigned long PaUtil_CopyInput( PaUtilBufferProcessor* bp, if( bp->userInputIsInterleaved ) { destBytePtr = (unsigned char*)*buffer; - + destSampleStrideSamples = bp->inputChannelCount; destChannelStrideBytes = bp->bytesPerUserInputSample; @@ -1701,11 +1701,11 @@ unsigned long PaUtil_CopyInput( PaUtilBufferProcessor* bp, else { /* user input is not interleaved */ - + nonInterleavedDestPtrs = (void**)*buffer; destSampleStrideSamples = 1; - + for( i=0; iinputChannelCount; ++i ) { destBytePtr = (unsigned char*)nonInterleavedDestPtrs[i]; @@ -1718,7 +1718,7 @@ unsigned long PaUtil_CopyInput( PaUtilBufferProcessor* bp, /* advance callers dest pointer (nonInterleavedDestPtrs[i]) */ destBytePtr += bp->bytesPerUserInputSample * framesToCopy; nonInterleavedDestPtrs[i] = destBytePtr; - + /* advance source ptr for next iteration */ hostInputChannels[i].data = ((unsigned char*)hostInputChannels[i].data) + framesToCopy * hostInputChannels[i].stride * bp->bytesPerHostInputSample; @@ -1726,7 +1726,7 @@ unsigned long PaUtil_CopyInput( PaUtilBufferProcessor* bp, } bp->hostInputFrameCount[0] -= framesToCopy; - + return framesToCopy; } @@ -1747,7 +1747,7 @@ unsigned long PaUtil_CopyOutput( PaUtilBufferProcessor* bp, if( bp->userOutputIsInterleaved ) { srcBytePtr = (unsigned char*)*buffer; - + srcSampleStrideSamples = bp->outputChannelCount; srcChannelStrideBytes = bp->bytesPerUserOutputSample; @@ -1773,15 +1773,15 @@ unsigned long PaUtil_CopyOutput( PaUtilBufferProcessor* bp, else { /* user output is not interleaved */ - + nonInterleavedSrcPtrs = (void**)*buffer; srcSampleStrideSamples = 1; - + for( i=0; ioutputChannelCount; ++i ) { srcBytePtr = (unsigned char*)nonInterleavedSrcPtrs[i]; - + bp->outputConverter( hostOutputChannels[i].data, hostOutputChannels[i].stride, srcBytePtr, srcSampleStrideSamples, @@ -1791,7 +1791,7 @@ unsigned long PaUtil_CopyOutput( PaUtilBufferProcessor* bp, /* advance callers source pointer (nonInterleavedSrcPtrs[i]) */ srcBytePtr += bp->bytesPerUserOutputSample * framesToCopy; nonInterleavedSrcPtrs[i] = srcBytePtr; - + /* advance dest ptr for next iteration */ hostOutputChannels[i].data = ((unsigned char*)hostOutputChannels[i].data) + framesToCopy * hostOutputChannels[i].stride * bp->bytesPerHostOutputSample; @@ -1799,7 +1799,7 @@ unsigned long PaUtil_CopyOutput( PaUtilBufferProcessor* bp, } bp->hostOutputFrameCount[0] += framesToCopy; - + return framesToCopy; } @@ -1826,6 +1826,6 @@ unsigned long PaUtil_ZeroOutput( PaUtilBufferProcessor* bp, unsigned long frameC } bp->hostOutputFrameCount[0] += framesToZero; - + return framesToZero; } diff --git a/src/common/pa_process.h b/src/common/pa_process.h index 803144a..444bdf5 100644 --- a/src/common/pa_process.h +++ b/src/common/pa_process.h @@ -28,16 +28,16 @@ */ /* - * The text above constitutes the entire PortAudio license; however, + * The text above constitutes the entire PortAudio license; however, * the PortAudio community also makes the following non-binding requests: * * 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. It is also - * requested that these non-binding requests be included along with the + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the * license above. */ - + /** @file @ingroup common_src @@ -72,7 +72,7 @@ The following sections provide an overview of how to use the buffer processor. Interested readers are advised to consult the host API implementations for examples of buffer processor usage. - +

Initialization, resetting and termination

@@ -92,7 +92,7 @@ When the buffer processor is no longer used call PaUtil_TerminateBufferProcessor. - +

Using the buffer processor for a callback stream

The buffer processor's role in a callback stream is to take host input buffers @@ -176,7 +176,7 @@ host buffer(s), so the above steps need to be repeated until the user buffer(s) are full. - + To copy data to the host output buffer from the user buffers(s) supplied to Pa_WriteStream use the following calling sequence. @@ -192,7 +192,7 @@ -# Call PaUtil_CopyOutput with the user buffer pointer (or a copy of the array of buffer pointers for a non-interleaved stream) passed to Pa_WriteStream, along with the number of frames in the user buffer(s). - Be careful to pass a copy of the user buffer pointers to + Be careful to pass a copy of the user buffer pointers to PaUtil_CopyOutput because PaUtil_CopyOutput advances the pointers to the start of the next region to copy. - PaUtil_CopyOutput will not copy more data than fits in the host buffer(s), @@ -266,7 +266,7 @@ typedef struct { int userInputIsInterleaved; PaUtilConverter *inputConverter; PaUtilZeroer *inputZeroer; - + unsigned int outputChannelCount; unsigned int bytesPerHostOutputSample; unsigned int bytesPerUserOutputSample; @@ -327,7 +327,7 @@ typedef struct { @param userInputSampleFormat Format of user input samples, as passed to Pa_OpenStream. This parameter is ignored for ouput-only streams. - + @param hostInputSampleFormat Format of host input samples. This parameter is ignored for output-only streams. See note about host buffer interleave below. @@ -336,17 +336,17 @@ typedef struct { @param userOutputSampleFormat Format of user output samples, as passed to Pa_OpenStream. This parameter is ignored for input-only streams. - + @param hostOutputSampleFormat Format of host output samples. This parameter is ignored for input-only streams. See note about host buffer interleave below. @param sampleRate Sample rate of the stream. The more accurate this is the better - it is used for updating time stamps when adapting buffers. - + @param streamFlags Stream flags as passed to Pa_OpenStream, this parameter is used for selecting special sample conversion options such as clipping and dithering. - + @param framesPerUserBuffer Number of frames per user buffer, as requested by the framesPerBuffer parameter to Pa_OpenStream. This parameter may be zero to indicate that the user will accept any (and varying) buffer sizes. @@ -359,11 +359,11 @@ typedef struct { @param hostBufferSizeMode A mode flag indicating the size variability of host buffers that will be passed to the buffer processor. See PaUtilHostBufferSizeMode for further details. - + @param streamCallback The user stream callback passed to Pa_OpenStream. @param userData The user data field passed to Pa_OpenStream. - + @note The interleave flag is ignored for host buffer formats. Host interleave is determined by the use of different SetInput and SetOutput functions. @@ -371,7 +371,7 @@ typedef struct { @return An error code indicating whether the initialization was successful. If the error code is not PaNoError, the buffer processor was not initialized and should not be used. - + @see Pa_OpenStream, PaUtilHostBufferSizeMode, PaUtil_TerminateBufferProcessor */ PaError PaUtil_InitializeBufferProcessor( PaUtilBufferProcessor* bufferProcessor, @@ -389,7 +389,7 @@ PaError PaUtil_InitializeBufferProcessor( PaUtilBufferProcessor* bufferProcessor /** Terminate a buffer processor's representation. Deallocates any temporary buffers allocated by PaUtil_InitializeBufferProcessor. - + @param bufferProcessor The buffer processor structure to terminate. @see PaUtil_InitializeBufferProcessor. @@ -434,7 +434,7 @@ unsigned long PaUtil_GetBufferProcessorOutputLatencyFrames( PaUtilBufferProcesso Functions to set host input and output buffers, used by both callback streams and blocking read/write streams. */ -/*@{*/ +/*@{*/ /** Set the number of frames in the input host buffer(s) specified by the @@ -451,7 +451,7 @@ unsigned long PaUtil_GetBufferProcessorOutputLatencyFrames( PaUtilBufferProcesso void PaUtil_SetInputFrameCount( PaUtilBufferProcessor* bufferProcessor, unsigned long frameCount ); - + /** Indicate that no input is available. This function should be used when priming the output of a full-duplex stream opened with the paPrimeOutputBuffersUsingStreamCallback flag. Note that it is not necessary @@ -524,7 +524,7 @@ void PaUtil_Set2ndInterleavedInputChannels( PaUtilBufferProcessor* bufferProcess void PaUtil_Set2ndNonInterleavedInputChannel( PaUtilBufferProcessor* bufferProcessor, unsigned int channel, void *data ); - + /** Set the number of frames in the output host buffer(s) specified by the PaUtil_Set*OutputChannel functions. @@ -574,7 +574,7 @@ void PaUtil_SetOutputChannel( PaUtilBufferProcessor* bufferProcessor, void PaUtil_SetInterleavedOutputChannels( PaUtilBufferProcessor* bufferProcessor, unsigned int firstChannel, void *data, unsigned int channelCount ); - + /** Provide the buffer processor with a pointer to one non-interleaved host output channel. @@ -632,12 +632,12 @@ void PaUtil_Set2ndNonInterleavedOutputChannel( PaUtilBufferProcessor* bufferProc void PaUtil_BeginBufferProcessing( PaUtilBufferProcessor* bufferProcessor, PaStreamCallbackTimeInfo* timeInfo, PaStreamCallbackFlags callbackStatusFlags ); - + /** Finish processing a host buffer (or a pair of host buffers in the full-duplex case) for a callback stream. @param bufferProcessor The buffer processor. - + @param callbackResult On input, indicates a previous callback result, and on exit, the result of the user stream callback, if it is called. On entry callbackResult should contain one of { paContinue, paComplete, or @@ -666,7 +666,7 @@ unsigned long PaUtil_EndBufferProcessing( PaUtilBufferProcessor* bufferProcessor a callbackResult of paComplete. @param bufferProcessor The buffer processor. - + @return Returns non-zero when callback generated output remains in the internal buffer and zero (0) when there internal buffer contains no callback generated data. @@ -738,7 +738,7 @@ unsigned long PaUtil_CopyOutput( PaUtilBufferProcessor* bufferProcessor, @param bufferProcessor The buffer processor. @param frameCount The maximum number of frames to zero. - + @return The number of frames zeroed. */ unsigned long PaUtil_ZeroOutput( PaUtilBufferProcessor* bufferProcessor, diff --git a/src/common/pa_ringbuffer.c b/src/common/pa_ringbuffer.c index 93b3e43..b978d54 100644 --- a/src/common/pa_ringbuffer.c +++ b/src/common/pa_ringbuffer.c @@ -7,7 +7,7 @@ * modified for SMP safety on Mac OS X by Bjorn Roche * modified for SMP safety on Linux by Leland Lucius * also, allowed for const where possible - * modified for multiple-byte-sized data elements by Sven Fischer + * modified for multiple-byte-sized data elements by Sven Fischer * * Note that this is safe only for a single-thread reader and a * single-thread writer. @@ -37,13 +37,13 @@ */ /* - * The text above constitutes the entire PortAudio license; however, + * The text above constitutes the entire PortAudio license; however, * the PortAudio community also makes the following non-binding requests: * * 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. It is also - * requested that these non-binding requests be included along with the + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the * license above. */ @@ -138,7 +138,7 @@ ring_buffer_size_t PaUtil_GetRingBufferWriteRegions( PaUtilRingBuffer *rbuf, rin */ ring_buffer_size_t PaUtil_AdvanceRingBufferWriteIndex( PaUtilRingBuffer *rbuf, ring_buffer_size_t elementCount ) { - /* ensure that previous writes are seen before we update the write index + /* ensure that previous writes are seen before we update the write index (write after write) */ PaUtil_WriteMemoryBarrier(); @@ -176,7 +176,7 @@ ring_buffer_size_t PaUtil_GetRingBufferReadRegions( PaUtilRingBuffer *rbuf, ring *dataPtr2 = NULL; *sizePtr2 = 0; } - + if( available ) PaUtil_ReadMemoryBarrier(); /* (read-after-read) => read barrier */ @@ -186,7 +186,7 @@ ring_buffer_size_t PaUtil_GetRingBufferReadRegions( PaUtilRingBuffer *rbuf, ring */ ring_buffer_size_t PaUtil_AdvanceRingBufferReadIndex( PaUtilRingBuffer *rbuf, ring_buffer_size_t elementCount ) { - /* ensure that previous reads (copies out of the ring buffer) are always completed before updating (writing) the read index. + /* ensure that previous reads (copies out of the ring buffer) are always completed before updating (writing) the read index. (write-after-read) => full barrier */ PaUtil_FullMemoryBarrier(); diff --git a/src/common/pa_ringbuffer.h b/src/common/pa_ringbuffer.h index 9edba0d..400aaac 100644 --- a/src/common/pa_ringbuffer.h +++ b/src/common/pa_ringbuffer.h @@ -8,7 +8,7 @@ * Author: Phil Burk, http://www.softsynth.com * modified for SMP safety on OS X by Bjorn Roche. * also allowed for const where possible. - * modified for multiple-byte-sized data elements by Sven Fischer + * modified for multiple-byte-sized data elements by Sven Fischer * * Note that this is safe only for a single-thread reader * and a single-thread writer. @@ -38,13 +38,13 @@ */ /* - * The text above constitutes the entire PortAudio license; however, + * The text above constitutes the entire PortAudio license; however, * the PortAudio community also makes the following non-binding requests: * * 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. It is also - * requested that these non-binding requests be included along with the + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the * license above. */ @@ -58,15 +58,15 @@ a single reader and a single writer (ie. one thread or callback writes to the ring buffer, another thread or callback reads from it). - The PaUtilRingBuffer structure manages a ring buffer containing N - elements, where N must be a power of two. An element may be any size + The PaUtilRingBuffer structure manages a ring buffer containing N + elements, where N must be a power of two. An element may be any size (specified in bytes). - The memory area used to store the buffer elements must be allocated by + The memory area used to store the buffer elements must be allocated by the client prior to calling PaUtil_InitializeRingBuffer() and must outlive the use of the ring buffer. - - @note The ring buffer functions are not normally exposed in the PortAudio libraries. + + @note The ring buffer functions are not normally exposed in the PortAudio libraries. If you want to call them then you will need to add pa_ringbuffer.c to your application source code. */ diff --git a/src/common/pa_stream.c b/src/common/pa_stream.c index 03a0ee6..ffbf530 100644 --- a/src/common/pa_stream.c +++ b/src/common/pa_stream.c @@ -27,13 +27,13 @@ */ /* - * The text above constitutes the entire PortAudio license; however, + * The text above constitutes the entire PortAudio license; however, * the PortAudio community also makes the following non-binding requests: * * 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. It is also - * requested that these non-binding requests be included along with the + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the * license above. */ diff --git a/src/common/pa_stream.h b/src/common/pa_stream.h index 678e2ad..4afda39 100644 --- a/src/common/pa_stream.h +++ b/src/common/pa_stream.h @@ -29,13 +29,13 @@ */ /* - * The text above constitutes the entire PortAudio license; however, + * The text above constitutes the entire PortAudio license; however, * the PortAudio community also makes the following non-binding requests: * * 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. It is also - * requested that these non-binding requests be included along with the + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the * license above. */ @@ -164,7 +164,7 @@ void PaUtil_InitializeStreamRepresentation( PaUtilStreamInterface *streamInterface, PaStreamCallback *streamCallback, void *userData ); - + /** Clean up a PaUtilStreamRepresentation structure previously initialized by a call to PaUtil_InitializeStreamRepresentation. @@ -198,7 +198,7 @@ PaError PaUtil_ValidateStreamPointer( PaStream *stream ); PA_STREAM_REP( (stream) )->streamInterface - + #ifdef __cplusplus } #endif /* __cplusplus */ diff --git a/src/common/pa_trace.c b/src/common/pa_trace.c index 818abff..6763dfa 100644 --- a/src/common/pa_trace.c +++ b/src/common/pa_trace.c @@ -27,13 +27,13 @@ */ /* - * The text above constitutes the entire PortAudio license; however, + * The text above constitutes the entire PortAudio license; however, * the PortAudio community also makes the following non-binding requests: * * 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. It is also - * requested that these non-binding requests be included along with the + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the * license above. */ @@ -233,6 +233,6 @@ void PaUtil_DiscardHighSpeedLog( LogHandle hLog ) */ int PaUtil_TraceStubToSatisfyLinker(void) { - return 0; + return 0; } #endif /* TRACE_REALTIME_EVENTS */ diff --git a/src/common/pa_trace.h b/src/common/pa_trace.h index 6dfaeb7..7827766 100644 --- a/src/common/pa_trace.h +++ b/src/common/pa_trace.h @@ -29,13 +29,13 @@ */ /* - * The text above constitutes the entire PortAudio license; however, + * The text above constitutes the entire PortAudio license; however, * the PortAudio community also makes the following non-binding requests: * * 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. It is also - * requested that these non-binding requests be included along with the + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the * license above. */ @@ -45,8 +45,8 @@ @brief Real-time safe event trace logging facility for debugging. Allows data to be logged to a fixed size trace buffer in a real-time - execution context (such as at interrupt time). Each log entry consists - of a message comprising a string pointer and an int. The trace buffer + execution context (such as at interrupt time). Each log entry consists + of a message comprising a string pointer and an int. The trace buffer may be dumped to stdout later. This facility is only active if PA_TRACE_REALTIME_EVENTS is set to 1, @@ -57,8 +57,8 @@ @fn PaUtil_AddTraceMessage @brief Add a message to the trace buffer. A message consists of string and an int. - @param msg The string pointer must remain valid until PaUtil_DumpTraceMessages - is called. As a result, usually only string literals should be passed as + @param msg The string pointer must remain valid until PaUtil_DumpTraceMessages + is called. As a result, usually only string literals should be passed as the msg parameter. @fn PaUtil_DumpTraceMessages @@ -70,7 +70,7 @@ #endif #ifndef PA_MAX_TRACE_RECORDS -#define PA_MAX_TRACE_RECORDS (2048) /**< Maximum number of records stored in trace buffer */ +#define PA_MAX_TRACE_RECORDS (2048) /**< Maximum number of records stored in trace buffer */ #endif #ifdef __cplusplus diff --git a/src/common/pa_types.h b/src/common/pa_types.h index 5b647d6..f628783 100644 --- a/src/common/pa_types.h +++ b/src/common/pa_types.h @@ -1,7 +1,7 @@ #ifndef PA_TYPES_H #define PA_TYPES_H -/* +/* * Portable Audio I/O Library * integer type definitions * @@ -29,13 +29,13 @@ */ /* - * The text above constitutes the entire PortAudio license; however, + * The text above constitutes the entire PortAudio license; however, * the PortAudio community also makes the following non-binding requests: * * 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. It is also - * requested that these non-binding requests be included along with the + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the * license above. */ diff --git a/src/common/pa_util.h b/src/common/pa_util.h index 43ea894..08dc0ec 100644 --- a/src/common/pa_util.h +++ b/src/common/pa_util.h @@ -29,13 +29,13 @@ */ /* - * The text above constitutes the entire PortAudio license; however, + * The text above constitutes the entire PortAudio license; however, * the PortAudio community also makes the following non-binding requests: * * 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. It is also - * requested that these non-binding requests be included along with the + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the * license above. */ @@ -112,7 +112,7 @@ void PaUtil_SetLastHostErrorInfo( PaHostApiTypeId hostApiType, long errorCode, const char *errorText ); - + /* the following functions are implemented in a platform platform specific .c file */ From 4c673d1f2b84dacc16b27e6192ec5f3e5f4a7260 Mon Sep 17 00:00:00 2001 From: Ross Bencina Date: Thu, 21 Jan 2021 23:23:00 +1100 Subject: [PATCH 092/164] Clean up whitespace in src/os/win in preparation for .editorconfig. (#409) * Clean up whitespace in src/os/win in preparation for .editorconfig. Convert tabs to 4 spaces. Indent by 4 spaces. Strip trailing whitespace. Ensure EOL at EOF. --- src/os/win/pa_win_coinitialize.c | 30 +++---- src/os/win/pa_win_coinitialize.h | 16 ++-- src/os/win/pa_win_hostapis.c | 8 +- src/os/win/pa_win_util.c | 28 +++---- src/os/win/pa_win_waveformat.c | 100 ++++++++++++------------ src/os/win/pa_win_wdmks_utils.c | 40 +++++----- src/os/win/pa_win_wdmks_utils.h | 8 +- src/os/win/pa_x86_plain_converters.c | 112 +++++++++++++-------------- src/os/win/pa_x86_plain_converters.h | 6 +- 9 files changed, 174 insertions(+), 174 deletions(-) diff --git a/src/os/win/pa_win_coinitialize.c b/src/os/win/pa_win_coinitialize.c index ace97f5..cdb1fb9 100644 --- a/src/os/win/pa_win_coinitialize.c +++ b/src/os/win/pa_win_coinitialize.c @@ -72,14 +72,14 @@ PaError PaWinUtil_CoInitialize( PaHostApiTypeId hostApiType, PaWinUtilComInitial If COM is already initialized CoInitialize will either return FALSE, or RPC_E_CHANGED_MODE if it was initialised in a different threading mode. In either case we shouldn't consider it an error - but we need to be careful to not call CoUninitialize() if + but we need to be careful to not call CoUninitialize() if RPC_E_CHANGED_MODE was returned. */ #if !defined(WINAPI_FAMILY) || (WINAPI_FAMILY != WINAPI_FAMILY_APP) hr = CoInitialize(0); /* use legacy-safe equivalent to CoInitializeEx(NULL, COINIT_APARTMENTTHREADED) */ #else - hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED); + hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED); #endif if( FAILED(hr) && hr != RPC_E_CHANGED_MODE ) { @@ -111,8 +111,8 @@ PaError PaWinUtil_CoInitialize( PaHostApiTypeId hostApiType, PaWinUtilComInitial comInitializationResult->state = PAWINUTIL_COM_INITIALIZED; /* - Memorize calling thread id and report warning on Uninitialize if - calling thread is different as CoInitialize must match CoUninitialize + Memorize calling thread id and report warning on Uninitialize if + calling thread is different as CoInitialize must match CoUninitialize in the same thread. */ comInitializationResult->initializingThreadId = GetCurrentThreadId(); @@ -126,23 +126,23 @@ void PaWinUtil_CoUninitialize( PaHostApiTypeId hostApiType, PaWinUtilComInitiali { if( comInitializationResult->state != PAWINUTIL_COM_NOT_INITIALIZED && comInitializationResult->state != PAWINUTIL_COM_INITIALIZED ){ - + PA_DEBUG(("ERROR: PaWinUtil_CoUninitialize called without calling PaWinUtil_CoInitialize\n")); } if( comInitializationResult->state == PAWINUTIL_COM_INITIALIZED ) { DWORD currentThreadId = GetCurrentThreadId(); - if( comInitializationResult->initializingThreadId != currentThreadId ) - { - PA_DEBUG(("ERROR: failed PaWinUtil_CoUninitialize calling thread[%lu] does not match initializing thread[%lu]\n", - currentThreadId, comInitializationResult->initializingThreadId)); - } - else - { - CoUninitialize(); + if( comInitializationResult->initializingThreadId != currentThreadId ) + { + PA_DEBUG(("ERROR: failed PaWinUtil_CoUninitialize calling thread[%lu] does not match initializing thread[%lu]\n", + currentThreadId, comInitializationResult->initializingThreadId)); + } + else + { + CoUninitialize(); comInitializationResult->state = PAWINUTIL_COM_NOT_INITIALIZED; - } + } } -} \ No newline at end of file +} diff --git a/src/os/win/pa_win_coinitialize.h b/src/os/win/pa_win_coinitialize.h index 63fac7c..deb60c3 100644 --- a/src/os/win/pa_win_coinitialize.h +++ b/src/os/win/pa_win_coinitialize.h @@ -23,13 +23,13 @@ */ /* - * The text above constitutes the entire PortAudio license; however, + * The text above constitutes the entire PortAudio license; however, * the PortAudio community also makes the following non-binding requests: * * 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. It is also - * requested that these non-binding requests be included along with the + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the * license above. */ @@ -50,7 +50,7 @@ extern "C" /** @brief Data type used to hold the result of an attempt to initialize COM - using PaWinUtil_CoInitialize. Must be retained between a call to + using PaWinUtil_CoInitialize. Must be retained between a call to PaWinUtil_CoInitialize and a matching call to PaWinUtil_CoUninitialize. */ typedef struct PaWinUtilComInitializationResult{ @@ -64,9 +64,9 @@ typedef struct PaWinUtilComInitializationResult{ @param hostApiType the host API type id of the caller. Used for error reporting. - @param comInitializationResult An output parameter. The value pointed to by - this parameter stores information required by PaWinUtil_CoUninitialize - to correctly uninitialize COM. The value should be retained and later + @param comInitializationResult An output parameter. The value pointed to by + this parameter stores information required by PaWinUtil_CoUninitialize + to correctly uninitialize COM. The value should be retained and later passed to PaWinUtil_CoUninitialize. If PaWinUtil_CoInitialize returns paNoError, the caller must later call @@ -76,7 +76,7 @@ PaError PaWinUtil_CoInitialize( PaHostApiTypeId hostApiType, PaWinUtilComInitial /** - @brief Uninitialize the Microsoft COM subsystem on the current thread using + @brief Uninitialize the Microsoft COM subsystem on the current thread using the result of a previous call to PaWinUtil_CoInitialize. Must be called on the same thread as PaWinUtil_CoInitialize. diff --git a/src/os/win/pa_win_hostapis.c b/src/os/win/pa_win_hostapis.c index 9c9927a..942540c 100644 --- a/src/os/win/pa_win_hostapis.c +++ b/src/os/win/pa_win_hostapis.c @@ -26,13 +26,13 @@ */ /* - * The text above constitutes the entire PortAudio license; however, + * The text above constitutes the entire PortAudio license; however, * the PortAudio community also makes the following non-binding requests: * * 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. It is also - * requested that these non-binding requests be included along with the + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the * license above. */ @@ -85,7 +85,7 @@ PaUtilHostApiInitializer *paHostApiInitializers[] = #endif #if PA_USE_WASAPI - PaWasapi_Initialize, + PaWasapi_Initialize, #endif #if PA_USE_WDMKS diff --git a/src/os/win/pa_win_util.c b/src/os/win/pa_win_util.c index 1cd3525..b86f7af 100644 --- a/src/os/win/pa_win_util.c +++ b/src/os/win/pa_win_util.c @@ -27,13 +27,13 @@ */ /* - * The text above constitutes the entire PortAudio license; however, + * The text above constitutes the entire PortAudio license; however, * the PortAudio community also makes the following non-binding requests: * * 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. It is also - * requested that these non-binding requests be included along with the + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the * license above. */ @@ -42,16 +42,16 @@ @brief Win32 implementation of platform-specific PaUtil support functions. */ - + #include #if defined(WINAPI_FAMILY) && (WINAPI_FAMILY == WINAPI_FAMILY_APP) - #include /* for _ftime_s() */ + #include /* for _ftime_s() */ #else - #include /* for timeGetTime() */ - #if (defined(WIN32) && (defined(_MSC_VER) && (_MSC_VER >= 1200))) && !defined(_WIN32_WCE) /* MSC version 6 and above */ - #pragma comment( lib, "winmm.lib" ) - #endif + #include /* for timeGetTime() */ + #if (defined(WIN32) && (defined(_MSC_VER) && (_MSC_VER >= 1200))) && !defined(_WIN32_WCE) /* MSC version 6 and above */ + #pragma comment( lib, "winmm.lib" ) + #endif #endif #include "pa_util.h" @@ -135,7 +135,7 @@ double PaUtil_GetTime( void ) This is documented here: http://support.microsoft.com/default.aspx?scid=KB;EN-US;Q274323& - The work-arounds are not very paletable and involve querying GetTickCount + The work-arounds are not very paletable and involve querying GetTickCount at every time step. Using rdtsc is not a good option on multi-core systems. @@ -148,13 +148,13 @@ double PaUtil_GetTime( void ) else { #ifndef UNDER_CE - #if defined(WINAPI_FAMILY) && (WINAPI_FAMILY == WINAPI_FAMILY_APP) + #if defined(WINAPI_FAMILY) && (WINAPI_FAMILY == WINAPI_FAMILY_APP) return GetTickCount64() * .001; - #else + #else return timeGetTime() * .001; - #endif + #endif #else return GetTickCount() * .001; -#endif +#endif } } diff --git a/src/os/win/pa_win_waveformat.c b/src/os/win/pa_win_waveformat.c index 933cb78..0436a39 100644 --- a/src/os/win/pa_win_waveformat.c +++ b/src/os/win/pa_win_waveformat.c @@ -26,13 +26,13 @@ */ /* - * The text above constitutes the entire PortAudio license; however, + * The text above constitutes the entire PortAudio license; however, * the PortAudio community also makes the following non-binding requests: * * 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. It is also - * requested that these non-binding requests be included along with the + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the * license above. */ @@ -51,52 +51,52 @@ #endif -static GUID pawin_ksDataFormatSubtypeGuidBase = - { (USHORT)(WAVE_FORMAT_PCM), 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }; +static GUID pawin_ksDataFormatSubtypeGuidBase = + { (USHORT)(WAVE_FORMAT_PCM), 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }; int PaWin_SampleFormatToLinearWaveFormatTag( PaSampleFormat sampleFormat ) { if( sampleFormat == paFloat32 ) return PAWIN_WAVE_FORMAT_IEEE_FLOAT; - + return PAWIN_WAVE_FORMAT_PCM; } -void PaWin_InitializeWaveFormatEx( PaWinWaveFormat *waveFormat, - int numChannels, PaSampleFormat sampleFormat, int waveFormatTag, double sampleRate ) +void PaWin_InitializeWaveFormatEx( PaWinWaveFormat *waveFormat, + int numChannels, PaSampleFormat sampleFormat, int waveFormatTag, double sampleRate ) { - WAVEFORMATEX *waveFormatEx = (WAVEFORMATEX*)waveFormat; + WAVEFORMATEX *waveFormatEx = (WAVEFORMATEX*)waveFormat; int bytesPerSample = Pa_GetSampleSize(sampleFormat); - unsigned long bytesPerFrame = numChannels * bytesPerSample; - + unsigned long bytesPerFrame = numChannels * bytesPerSample; + waveFormatEx->wFormatTag = waveFormatTag; - waveFormatEx->nChannels = (WORD)numChannels; - waveFormatEx->nSamplesPerSec = (DWORD)sampleRate; - waveFormatEx->nAvgBytesPerSec = waveFormatEx->nSamplesPerSec * bytesPerFrame; - waveFormatEx->nBlockAlign = (WORD)bytesPerFrame; - waveFormatEx->wBitsPerSample = bytesPerSample * 8; - waveFormatEx->cbSize = 0; + waveFormatEx->nChannels = (WORD)numChannels; + waveFormatEx->nSamplesPerSec = (DWORD)sampleRate; + waveFormatEx->nAvgBytesPerSec = waveFormatEx->nSamplesPerSec * bytesPerFrame; + waveFormatEx->nBlockAlign = (WORD)bytesPerFrame; + waveFormatEx->wBitsPerSample = bytesPerSample * 8; + waveFormatEx->cbSize = 0; } -void PaWin_InitializeWaveFormatExtensible( PaWinWaveFormat *waveFormat, - int numChannels, PaSampleFormat sampleFormat, int waveFormatTag, double sampleRate, - PaWinWaveFormatChannelMask channelMask ) +void PaWin_InitializeWaveFormatExtensible( PaWinWaveFormat *waveFormat, + int numChannels, PaSampleFormat sampleFormat, int waveFormatTag, double sampleRate, + PaWinWaveFormatChannelMask channelMask ) { - WAVEFORMATEX *waveFormatEx = (WAVEFORMATEX*)waveFormat; + WAVEFORMATEX *waveFormatEx = (WAVEFORMATEX*)waveFormat; int bytesPerSample = Pa_GetSampleSize(sampleFormat); - unsigned long bytesPerFrame = numChannels * bytesPerSample; + unsigned long bytesPerFrame = numChannels * bytesPerSample; GUID guid; - waveFormatEx->wFormatTag = WAVE_FORMAT_EXTENSIBLE; - waveFormatEx->nChannels = (WORD)numChannels; - waveFormatEx->nSamplesPerSec = (DWORD)sampleRate; - waveFormatEx->nAvgBytesPerSec = waveFormatEx->nSamplesPerSec * bytesPerFrame; - waveFormatEx->nBlockAlign = (WORD)bytesPerFrame; - waveFormatEx->wBitsPerSample = bytesPerSample * 8; - waveFormatEx->cbSize = 22; + waveFormatEx->wFormatTag = WAVE_FORMAT_EXTENSIBLE; + waveFormatEx->nChannels = (WORD)numChannels; + waveFormatEx->nSamplesPerSec = (DWORD)sampleRate; + waveFormatEx->nAvgBytesPerSec = waveFormatEx->nSamplesPerSec * bytesPerFrame; + waveFormatEx->nBlockAlign = (WORD)bytesPerFrame; + waveFormatEx->wBitsPerSample = bytesPerSample * 8; + waveFormatEx->cbSize = 22; memcpy(&waveFormat->fields[PAWIN_INDEXOF_WVALIDBITSPERSAMPLE], &waveFormatEx->wBitsPerSample, sizeof(WORD)); @@ -111,42 +111,42 @@ void PaWin_InitializeWaveFormatExtensible( PaWinWaveFormat *waveFormat, PaWinWaveFormatChannelMask PaWin_DefaultChannelMask( int numChannels ) { - switch( numChannels ){ - case 1: - return PAWIN_SPEAKER_MONO; - case 2: - return PAWIN_SPEAKER_STEREO; - case 3: + switch( numChannels ){ + case 1: + return PAWIN_SPEAKER_MONO; + case 2: + return PAWIN_SPEAKER_STEREO; + case 3: return PAWIN_SPEAKER_FRONT_LEFT | PAWIN_SPEAKER_FRONT_CENTER | PAWIN_SPEAKER_FRONT_RIGHT; - case 4: - return PAWIN_SPEAKER_QUAD; - case 5: + case 4: + return PAWIN_SPEAKER_QUAD; + case 5: return PAWIN_SPEAKER_QUAD | PAWIN_SPEAKER_FRONT_CENTER; - case 6: + case 6: /* The meaning of the PAWIN_SPEAKER_5POINT1 flag has changed over time: http://msdn2.microsoft.com/en-us/library/aa474707.aspx We use PAWIN_SPEAKER_5POINT1 (not PAWIN_SPEAKER_5POINT1_SURROUND) - because on some cards (eg Audigy) PAWIN_SPEAKER_5POINT1_SURROUND - results in a virtual mixdown placing the rear output in the + because on some cards (eg Audigy) PAWIN_SPEAKER_5POINT1_SURROUND + results in a virtual mixdown placing the rear output in the front _and_ rear speakers. */ - return PAWIN_SPEAKER_5POINT1; + return PAWIN_SPEAKER_5POINT1; /* case 7: */ - case 8: + case 8: /* RoBi: PAWIN_SPEAKER_7POINT1_SURROUND fits normal surround sound setups better than PAWIN_SPEAKER_7POINT1, f.i. NVidia HDMI Audio - output is silent on channels 5&6 with NVidia drivers, and channel 7&8 with Microsoft HD Audio driver using PAWIN_SPEAKER_7POINT1. + output is silent on channels 5&6 with NVidia drivers, and channel 7&8 with Microsoft HD Audio driver using PAWIN_SPEAKER_7POINT1. With PAWIN_SPEAKER_7POINT1_SURROUND both setups work OK. */ - return PAWIN_SPEAKER_7POINT1_SURROUND; - } + return PAWIN_SPEAKER_7POINT1_SURROUND; + } - /* Apparently some Audigy drivers will output silence - if the direct-out constant (0) is used. So this is not ideal. + /* Apparently some Audigy drivers will output silence + if the direct-out constant (0) is used. So this is not ideal. RoBi 2012-12-19: Also, NVidia driver seem to output garbage instead. Again not very ideal. */ - return PAWIN_SPEAKER_DIRECTOUT; + return PAWIN_SPEAKER_DIRECTOUT; - /* Note that Alec Rogers proposed the following as an alternate method to + /* Note that Alec Rogers proposed the following as an alternate method to generate the default channel mask, however it doesn't seem to be an improvement over the above, since some drivers will matrix outputs mapping to non-present speakers across multiple physical speakers. diff --git a/src/os/win/pa_win_wdmks_utils.c b/src/os/win/pa_win_wdmks_utils.c index 4bd067a..3373146 100644 --- a/src/os/win/pa_win_wdmks_utils.c +++ b/src/os/win/pa_win_wdmks_utils.c @@ -25,13 +25,13 @@ */ /* - * The text above constitutes the entire PortAudio license; however, + * The text above constitutes the entire PortAudio license; however, * the PortAudio community also makes the following non-binding requests: * * 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. It is also - * requested that these non-binding requests be included along with the + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the * license above. */ @@ -39,14 +39,14 @@ #include #ifndef WAVE_FORMAT_IEEE_FLOAT #define WAVE_FORMAT_IEEE_FLOAT 0x0003 // MinGW32 does not define this -#endif +#endif #ifndef _WAVEFORMATEXTENSIBLE_ #define _WAVEFORMATEXTENSIBLE_ // MinGW32 does not define this #endif #ifndef _INC_MMREG #define _INC_MMREG // for STATIC_KSDATAFORMAT_SUBTYPE_IEEE_FLOAT #endif -#include // MinGW32 does not define this automatically +#include // MinGW32 does not define this automatically #if defined(__GNUC__) @@ -198,7 +198,7 @@ static KSPIN_DATAFLOW GetKSFilterPinPropertyDataflow( HANDLE deviceHandle, int p } -static int KSFilterPinPropertyIdentifiersInclude( +static int KSFilterPinPropertyIdentifiersInclude( HANDLE deviceHandle, int pinId, unsigned long property, const GUID *identifierSet, unsigned long identifierId ) { KSMULTIPLE_ITEM* item = NULL; @@ -208,13 +208,13 @@ static int KSFilterPinPropertyIdentifiersInclude( if( WdmGetPinPropertyMulti( deviceHandle, pinId, property, &item) != paNoError ) return 0; - + identifier = (KSIDENTIFIER*)(item+1); for( i = 0; i < (int)item->Count; i++ ) { if( !memcmp( (void*)&identifier[i].Set, (void*)identifierSet, sizeof( GUID ) ) && - ( identifier[i].Id == identifierId ) ) + ( identifier[i].Id == identifierId ) ) { result = 1; break; @@ -227,17 +227,17 @@ static int KSFilterPinPropertyIdentifiersInclude( } -/* return the maximum channel count supported by any pin on the device. +/* return the maximum channel count supported by any pin on the device. if isInput is non-zero we query input pins, otherwise output pins. */ int PaWin_WDMKS_QueryFilterMaximumChannelCount( void *wcharDevicePath, int isInput ) { HANDLE deviceHandle; - ULONG i; + ULONG i; int pinCount, pinId; int result = 0; KSPIN_DATAFLOW requiredDataflowDirection = (isInput ? KSPIN_DATAFLOW_OUT : KSPIN_DATAFLOW_IN ); - + if( !wcharDevicePath ) return 0; @@ -252,14 +252,14 @@ int PaWin_WDMKS_QueryFilterMaximumChannelCount( void *wcharDevicePath, int isInp KSPIN_DATAFLOW dataflow = GetKSFilterPinPropertyDataflow( deviceHandle, pinId ); if( ( dataflow == requiredDataflowDirection ) && (( communication == KSPIN_COMMUNICATION_SINK) || - ( communication == KSPIN_COMMUNICATION_BOTH)) - && ( KSFilterPinPropertyIdentifiersInclude( deviceHandle, pinId, + ( communication == KSPIN_COMMUNICATION_BOTH)) + && ( KSFilterPinPropertyIdentifiersInclude( deviceHandle, pinId, KSPROPERTY_PIN_INTERFACES, &pa_KSINTERFACESETID_Standard, KSINTERFACE_STANDARD_STREAMING ) - || KSFilterPinPropertyIdentifiersInclude( deviceHandle, pinId, + || KSFilterPinPropertyIdentifiersInclude( deviceHandle, pinId, KSPROPERTY_PIN_INTERFACES, &pa_KSINTERFACESETID_Standard, KSINTERFACE_STANDARD_LOOPED_STREAMING ) ) - && KSFilterPinPropertyIdentifiersInclude( deviceHandle, pinId, + && KSFilterPinPropertyIdentifiersInclude( deviceHandle, pinId, KSPROPERTY_PIN_MEDIUMS, &pa_KSMEDIUMSETID_Standard, KSMEDIUM_STANDARD_DEVIO ) ) - { + { KSMULTIPLE_ITEM* item = NULL; if( WdmGetPinPropertyMulti( deviceHandle, pinId, KSPROPERTY_PIN_DATARANGES, &item ) == paNoError ) { @@ -274,10 +274,10 @@ int PaWin_WDMKS_QueryFilterMaximumChannelCount( void *wcharDevicePath, int isInp && ( memcmp( (void*)&dataRange->SubFormat, (void*)&KSDATAFORMAT_SUBTYPE_WILDCARD, sizeof(GUID) ) == 0 ) ) ) { KSDATARANGE_AUDIO *dataRangeAudio = (KSDATARANGE_AUDIO*)dataRange; - + /* printf( ">>> %d %d %d %d %S\n", isInput, dataflow, communication, dataRangeAudio->MaximumChannels, devicePath ); - + if( memcmp((void*)&dataRange->Specifier, (void*)&KSDATAFORMAT_SPECIFIER_WAVEFORMATEX, sizeof(GUID) ) == 0 ) printf( "\tspecifier: KSDATAFORMAT_SPECIFIER_WAVEFORMATEX\n" ); else if( memcmp((void*)&dataRange->Specifier, (void*)&KSDATAFORMAT_SPECIFIER_DSOUND, sizeof(GUID) ) == 0 ) @@ -295,7 +295,7 @@ int PaWin_WDMKS_QueryFilterMaximumChannelCount( void *wcharDevicePath, int isInp if( dataRangeAudio->MaximumChannels < 0xFFFFUL && (int)dataRangeAudio->MaximumChannels > result ) result = (int)dataRangeAudio->MaximumChannels; } - + dataRange = (KSDATARANGE*)( ((char*)dataRange) + dataRange->FormatSize); } @@ -303,7 +303,7 @@ int PaWin_WDMKS_QueryFilterMaximumChannelCount( void *wcharDevicePath, int isInp } } } - + CloseHandle( deviceHandle ); return result; } diff --git a/src/os/win/pa_win_wdmks_utils.h b/src/os/win/pa_win_wdmks_utils.h index 5a7a338..f524cf7 100644 --- a/src/os/win/pa_win_wdmks_utils.h +++ b/src/os/win/pa_win_wdmks_utils.h @@ -28,13 +28,13 @@ */ /* - * The text above constitutes the entire PortAudio license; however, + * The text above constitutes the entire PortAudio license; however, * the PortAudio community also makes the following non-binding requests: * * 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. It is also - * requested that these non-binding requests be included along with the + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the * license above. */ @@ -62,4 +62,4 @@ int PaWin_WDMKS_QueryFilterMaximumChannelCount( void *wcharDevicePath, int isInp } #endif /* __cplusplus */ -#endif /* PA_WIN_WDMKS_UTILS_H */ \ No newline at end of file +#endif /* PA_WIN_WDMKS_UTILS_H */ diff --git a/src/os/win/pa_x86_plain_converters.c b/src/os/win/pa_x86_plain_converters.c index 44a6d67..1096994 100644 --- a/src/os/win/pa_x86_plain_converters.c +++ b/src/os/win/pa_x86_plain_converters.c @@ -23,13 +23,13 @@ */ /* - * The text above constitutes the entire PortAudio license; however, + * The text above constitutes the entire PortAudio license; however, * the PortAudio community also makes the following non-binding requests: * * 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. It is also - * requested that these non-binding requests be included along with the + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the * license above. */ @@ -115,8 +115,8 @@ TODO: #if defined(_WIN64) || defined(_WIN32_WCE) /* - -EMT64/AMD64 uses different asm - -VC2005 doesn't allow _WIN64 with inline assembly either! + -EMT64/AMD64 uses different asm + -VC2005 doesn't allow _WIN64 with inline assembly either! */ void PaUtil_InitializeX86PlainConverters( void ) { @@ -185,9 +185,9 @@ static void Float32_To_Int32( mov ecx, count imul ecx, eax add ecx, esi - + mov edi, destinationBuffer - + mov ebx, destinationStride imul ebx, edx @@ -195,7 +195,7 @@ static void Float32_To_Int32( fstcw savedFpuControlWord fldcw fpuControlWord_ - fld int32Scaler_ // stack: (int)0x7FFFFFFF + fld int32Scaler_ // stack: (int)0x7FFFFFFF Float32_To_Int32_loop: @@ -272,9 +272,9 @@ static void Float32_To_Int32_Clip( mov ecx, count imul ecx, eax add ecx, esi - + mov edi, destinationBuffer - + mov ebx, destinationStride imul ebx, edx @@ -282,7 +282,7 @@ static void Float32_To_Int32_Clip( fstcw savedFpuControlWord fldcw fpuControlWord_ - fld int32Scaler_ // stack: (int)0x7FFFFFFF + fld int32Scaler_ // stack: (int)0x7FFFFFFF Float32_To_Int32_Clip_loop: @@ -300,7 +300,7 @@ static void Float32_To_Int32_Clip( fmul st(0), st(1) // st(0) *= st(1), stack: value*0x7FFFFFFF, (int)0x7FFFFFFF fistp dword ptr [edi] // pop st(0) into dest, stack: (int)0x7FFFFFFF jmp Float32_To_Int32_Clip_stored - + Float32_To_Int32_Clip_clamp: mov edx, dword ptr [esi] // load floating point value into integer register shr edx, 31 // move sign bit into bit 0 @@ -311,7 +311,7 @@ static void Float32_To_Int32_Clip( Float32_To_Int32_Clip_stored: - //add edi, ebx // increment destination ptr + //add edi, ebx // increment destination ptr lea edi, [edi+ebx] cmp esi, ecx // has src ptr reached end? @@ -362,7 +362,7 @@ static void Float32_To_Int32_DitherClip( unsigned long ditherPrevious = ditherGenerator->previous; unsigned long ditherRandSeed1 = ditherGenerator->randSeed1; unsigned long ditherRandSeed2 = ditherGenerator->randSeed2; - + __asm{ // esi -> source ptr // eax -> source byte stride @@ -380,9 +380,9 @@ static void Float32_To_Int32_DitherClip( mov ecx, count imul ecx, eax add ecx, esi - + mov edi, destinationBuffer - + mov ebx, destinationStride imul ebx, edx @@ -412,8 +412,8 @@ static void Float32_To_Int32_DitherClip( mov sourceByteStride, eax // save eax mov sourceEnd, ecx // save ecx push ditherGenerator // pass ditherGenerator parameter on stack - call PaUtil_GenerateFloatTriangularDither // stack: dither, value*(int scaler), int scaler - pop edx // clear parameter off stack + call PaUtil_GenerateFloatTriangularDither // stack: dither, value*(int scaler), int scaler + pop edx // clear parameter off stack mov ecx, sourceEnd // restore ecx mov eax, sourceByteStride // restore eax */ @@ -435,7 +435,7 @@ static void Float32_To_Int32_DitherClip( shr edx, PA_DITHER_SHIFT_ mov ditherRandSeed2, eax shr eax, PA_DITHER_SHIFT_ - //add eax, edx // eax -> current + //add eax, edx // eax -> current lea eax, [eax+edx] mov edx, ditherPrevious neg edx @@ -446,11 +446,11 @@ static void Float32_To_Int32_DitherClip( fild highpassedDither fmul const_float_dither_scale_ // end generate dither, dither signal in st(0) - + faddp st(1), st(0) // stack: dither + value*(int scaler), int scaler fistp dword ptr [edi] // pop st(0) into dest, stack: int scaler jmp Float32_To_Int32_DitherClip_stored - + Float32_To_Int32_DitherClip_clamp: mov edx, dword ptr [esi] // load floating point value into integer register shr edx, 31 // move sign bit into bit 0 @@ -493,7 +493,7 @@ static void Float32_To_Int24( signed long temp; (void) ditherGenerator; // unused parameter - + while( count-- ) { // convert to 32 bit and drop the low 8 bits @@ -510,11 +510,11 @@ static void Float32_To_Int24( */ short savedFpuControlWord; - + signed long tempInt32; (void) ditherGenerator; /* unused parameter */ - + __asm{ // esi -> source ptr // eax -> source byte stride @@ -543,7 +543,7 @@ static void Float32_To_Int24( fstcw savedFpuControlWord fldcw fpuControlWord_ - fld int24Scaler_ // stack: (int)0x7FFFFF + fld int24Scaler_ // stack: (int)0x7FFFFF Float32_To_Int24_loop: @@ -561,7 +561,7 @@ static void Float32_To_Int24( //mov byte ptr [edi+2], DH mov word ptr [edi+1], DX - //add edi, ebx // increment destination ptr + //add edi, ebx // increment destination ptr lea edi, [edi+ebx] cmp esi, ecx // has src ptr reached end? @@ -589,7 +589,7 @@ static void Float32_To_Int24_Clip( signed long temp; (void) ditherGenerator; // unused parameter - + while( count-- ) { // convert to 32 bit and drop the low 8 bits @@ -607,11 +607,11 @@ static void Float32_To_Int24_Clip( */ short savedFpuControlWord; - + signed long tempInt32; (void) ditherGenerator; /* unused parameter */ - + __asm{ // esi -> source ptr // eax -> source byte stride @@ -640,7 +640,7 @@ static void Float32_To_Int24_Clip( fstcw savedFpuControlWord fldcw fpuControlWord_ - fld int24Scaler_ // stack: (int)0x7FFFFF + fld int24Scaler_ // stack: (int)0x7FFFFF Float32_To_Int24_Clip_loop: @@ -659,7 +659,7 @@ static void Float32_To_Int24_Clip( fistp tempInt32 // pop st(0) into tempInt32, stack: (int)0x7FFFFF mov edx, tempInt32 jmp Float32_To_Int24_Clip_store - + Float32_To_Int24_Clip_clamp: mov edx, dword ptr [esi] // load floating point value into integer register shr edx, 31 // move sign bit into bit 0 @@ -675,7 +675,7 @@ static void Float32_To_Int24_Clip( //mov byte ptr [edi+2], DH mov word ptr [edi+1], DX - //add edi, ebx // increment destination ptr + //add edi, ebx // increment destination ptr lea edi, [edi+ebx] cmp esi, ecx // has src ptr reached end? @@ -701,7 +701,7 @@ static void Float32_To_Int24_DitherClip( float *src = (float*)sourceBuffer; unsigned char *dest = (unsigned char*)destinationBuffer; signed long temp; - + while( count-- ) { // convert to 32 bit and drop the low 8 bits @@ -711,7 +711,7 @@ static void Float32_To_Int24_DitherClip( // use smaller scaler to prevent overflow when we add the dither double dithered = ((double)*src * (2147483646.0)) + dither; PA_CLIP_( dithered, -2147483648., 2147483647. ); - + temp = (signed long) dithered; dest[0] = (unsigned char)(temp >> 8); @@ -733,9 +733,9 @@ static void Float32_To_Int24_DitherClip( unsigned long ditherPrevious = ditherGenerator->previous; unsigned long ditherRandSeed1 = ditherGenerator->randSeed1; unsigned long ditherRandSeed2 = ditherGenerator->randSeed2; - + signed long tempInt32; - + __asm{ // esi -> source ptr // eax -> source byte stride @@ -786,12 +786,12 @@ static void Float32_To_Int24_DitherClip( mov sourceByteStride, eax // save eax mov sourceEnd, ecx // save ecx push ditherGenerator // pass ditherGenerator parameter on stack - call PaUtil_GenerateFloatTriangularDither // stack: dither, value*(int scaler), int scaler - pop edx // clear parameter off stack + call PaUtil_GenerateFloatTriangularDither // stack: dither, value*(int scaler), int scaler + pop edx // clear parameter off stack mov ecx, sourceEnd // restore ecx mov eax, sourceByteStride // restore eax */ - + // generate dither mov sourceByteStride, eax // save eax mov edx, 196314165 @@ -809,7 +809,7 @@ static void Float32_To_Int24_DitherClip( shr edx, PA_DITHER_SHIFT_ mov ditherRandSeed2, eax shr eax, PA_DITHER_SHIFT_ - //add eax, edx // eax -> current + //add eax, edx // eax -> current lea eax, [eax+edx] mov edx, ditherPrevious neg edx @@ -825,7 +825,7 @@ static void Float32_To_Int24_DitherClip( fistp tempInt32 // pop st(0) into tempInt32, stack: int scaler mov edx, tempInt32 jmp Float32_To_Int24_DitherClip_store - + Float32_To_Int24_DitherClip_clamp: mov edx, dword ptr [esi] // load floating point value into integer register shr edx, 31 // move sign bit into bit 0 @@ -841,7 +841,7 @@ static void Float32_To_Int24_DitherClip( //mov byte ptr [edi+2], DH mov word ptr [edi+1], DX - //add edi, ebx // increment destination ptr + //add edi, ebx // increment destination ptr lea edi, [edi+ebx] cmp esi, ecx // has src ptr reached end? @@ -884,7 +884,7 @@ static void Float32_To_Int16( */ short savedFpuControlWord; - + (void) ditherGenerator; /* unused parameter */ __asm{ @@ -928,7 +928,7 @@ static void Float32_To_Int16( add edi, ebx // increment destination ptr //lea edi, [edi+ebx] - + cmp esi, ecx // has src ptr reached end? jne Float32_To_Int16_loop @@ -965,7 +965,7 @@ static void Float32_To_Int16_Clip( */ short savedFpuControlWord; - + (void) ditherGenerator; /* unused parameter */ __asm{ @@ -1014,7 +1014,7 @@ static void Float32_To_Int16_Clip( fmul st(0), st(1) // st(0) *= st(1), stack: value*0x7FFF, (int)0x7FFF fistp word ptr [edi] // store scaled int into dest, stack: (int)0x7FFF jmp Float32_To_Int16_Clip_stored - + Float32_To_Int16_Clip_clamp: mov edx, dword ptr [esi] // load floating point value into integer register shr edx, 31 // move sign bit into bit 0 @@ -1027,7 +1027,7 @@ static void Float32_To_Int16_Clip( add edi, ebx // increment destination ptr //lea edi, [edi+ebx] - + cmp esi, ecx // has src ptr reached end? jne Float32_To_Int16_Clip_loop @@ -1056,7 +1056,7 @@ static void Float32_To_Int16_DitherClip( { float dither = PaUtil_GenerateFloatTriangularDither( ditherGenerator ); - // use smaller scaler to prevent overflow when we add the dither + // use smaller scaler to prevent overflow when we add the dither float dithered = (*src * (32766.0f)) + dither; signed long samp = (signed long) dithered; PA_CLIP_( samp, -0x8000, 0x7FFF ); @@ -1128,8 +1128,8 @@ static void Float32_To_Int16_DitherClip( mov sourceByteStride, eax // save eax mov sourceEnd, ecx // save ecx push ditherGenerator // pass ditherGenerator parameter on stack - call PaUtil_GenerateFloatTriangularDither // stack: dither, value*(int scaler), int scaler - pop edx // clear parameter off stack + call PaUtil_GenerateFloatTriangularDither // stack: dither, value*(int scaler), int scaler + pop edx // clear parameter off stack mov ecx, sourceEnd // restore ecx mov eax, sourceByteStride // restore eax */ @@ -1151,8 +1151,8 @@ static void Float32_To_Int16_DitherClip( shr edx, PA_DITHER_SHIFT_ mov ditherRandSeed2, eax shr eax, PA_DITHER_SHIFT_ - //add eax, edx // eax -> current - lea eax, [eax+edx] // current = randSeed1>>x + randSeed2>>x + //add eax, edx // eax -> current + lea eax, [eax+edx] // current = randSeed1>>x + randSeed2>>x mov edx, ditherPrevious neg edx lea edx, [eax+edx] // highpass = current - previous @@ -1162,11 +1162,11 @@ static void Float32_To_Int16_DitherClip( fild highpassedDither fmul const_float_dither_scale_ // end generate dither, dither signal in st(0) - + faddp st(1), st(0) // stack: dither * value*(int scaler), int scaler fistp word ptr [edi] // store scaled int into dest, stack: int scaler jmp Float32_To_Int16_DitherClip_stored - + Float32_To_Int16_DitherClip_clamp: mov edx, dword ptr [esi] // load floating point value into integer register shr edx, 31 // move sign bit into bit 0 @@ -1179,7 +1179,7 @@ static void Float32_To_Int16_DitherClip( add edi, ebx // increment destination ptr //lea edi, [edi+ebx] - + cmp esi, ecx // has src ptr reached end? jne Float32_To_Int16_DitherClip_loop @@ -1207,7 +1207,7 @@ void PaUtil_InitializeX86PlainConverters( void ) 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; diff --git a/src/os/win/pa_x86_plain_converters.h b/src/os/win/pa_x86_plain_converters.h index 1623115..8914ed1 100644 --- a/src/os/win/pa_x86_plain_converters.h +++ b/src/os/win/pa_x86_plain_converters.h @@ -23,13 +23,13 @@ */ /* - * The text above constitutes the entire PortAudio license; however, + * The text above constitutes the entire PortAudio license; however, * the PortAudio community also makes the following non-binding requests: * * 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. It is also - * requested that these non-binding requests be included along with the + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the * license above. */ From b251bdd7f82e87b3ec2f5eddf9106645a91639ec Mon Sep 17 00:00:00 2001 From: Ross Bencina Date: Thu, 21 Jan 2021 23:27:43 +1100 Subject: [PATCH 093/164] Clean up whitespace in src/os/unix in preparation for .editorconfig. Convert tabs to 4 spaces. Indent by 4 spaces. Strip trailing whitespace. Ensure EOL at EOF. (#410) --- src/os/unix/pa_unix_hostapis.c | 8 ++++---- src/os/unix/pa_unix_util.c | 34 +++++++++++++++++----------------- src/os/unix/pa_unix_util.h | 6 +++--- 3 files changed, 24 insertions(+), 24 deletions(-) diff --git a/src/os/unix/pa_unix_hostapis.c b/src/os/unix/pa_unix_hostapis.c index a9b4a05..7f1a51f 100644 --- a/src/os/unix/pa_unix_hostapis.c +++ b/src/os/unix/pa_unix_hostapis.c @@ -26,13 +26,13 @@ */ /* - * The text above constitutes the entire PortAudio license; however, + * The text above constitutes the entire PortAudio license; however, * the PortAudio community also makes the following non-binding requests: * * 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. It is also - * requested that these non-binding requests be included along with the + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the * license above. */ @@ -83,7 +83,7 @@ PaUtilHostApiInitializer *paHostApiInitializers[] = PaJack_Initialize, #endif /* Added for IRIX, Pieter, oct 2, 2003: */ -#if PA_USE_SGI +#if PA_USE_SGI PaSGI_Initialize, #endif diff --git a/src/os/unix/pa_unix_util.c b/src/os/unix/pa_unix_util.c index 5472336..a0d592d 100644 --- a/src/os/unix/pa_unix_util.c +++ b/src/os/unix/pa_unix_util.c @@ -27,20 +27,20 @@ */ /* - * The text above constitutes the entire PortAudio license; however, + * The text above constitutes the entire PortAudio license; however, * the PortAudio community also makes the following non-binding requests: * * 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. It is also - * requested that these non-binding requests be included along with the + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the * license above. */ /** @file @ingroup unix_src */ - + #include #include #include @@ -129,7 +129,7 @@ void Pa_Sleep( long msec ) /* Discussion on the CoreAudio mailing list suggests that calling gettimeofday (or anything else in the BSD layer) is not real-time - safe, so we use mach_absolute_time on OSX. This implementation is + safe, so we use mach_absolute_time on OSX. This implementation is based on these two links: Technical Q&A QA1398 - Mach Absolute Time Units @@ -140,7 +140,7 @@ void Pa_Sleep( long msec ) */ /* Scaler to convert the result of mach_absolute_time to seconds */ -static double machSecondsConversionScaler_ = 0.0; +static double machSecondsConversionScaler_ = 0.0; #endif void PaUtil_InitializeClock( void ) @@ -193,8 +193,8 @@ PaError PaUtil_CancelThreading( PaUtilThreading *threading, int wait, PaError *e if( exitResult ) *exitResult = paNoError; - /* If pthread_cancel is not supported (Android platform) whole this function can lead to indefinite waiting if - working thread (callbackThread) has'n received any stop signals from outside, please keep + /* If pthread_cancel is not supported (Android platform) whole this function can lead to indefinite waiting if + working thread (callbackThread) has'n received any stop signals from outside, please keep this in mind when considering using PaUtil_CancelThreading */ #ifdef PTHREAD_CANCELED @@ -220,7 +220,7 @@ PaError PaUtil_CancelThreading( PaUtilThreading *threading, int wait, PaError *e } /* Threading */ -/* paUnixMainThread +/* paUnixMainThread * We have to be a bit careful with defining this global variable, * as explained below. */ #ifdef __APPLE__ @@ -300,7 +300,7 @@ PaError PaUnixThread_New( PaUnixThread* self, void* (*threadFunc)( void* ), void PA_UNLESS( !pthread_attr_init( &attr ), paInternalError ); /* Priority relative to other processes */ - PA_UNLESS( !pthread_attr_setscope( &attr, PTHREAD_SCOPE_SYSTEM ), paInternalError ); + PA_UNLESS( !pthread_attr_setscope( &attr, PTHREAD_SCOPE_SYSTEM ), paInternalError ); PA_UNLESS( !pthread_create( &self->thread, &attr, threadFunc, threadArg ), paInternalError ); started = 1; @@ -350,7 +350,7 @@ PaError PaUnixThread_New( PaUnixThread* self, void* (*threadFunc)( void* ), void pthread_getschedparam(self->thread, &policy, &spm); } } - + if( self->parentWaiting ) { PaTime till; @@ -513,15 +513,15 @@ PaError PaUnixMutex_Terminate( PaUnixMutex* self ) /** Lock mutex. * - * We're disabling thread cancellation while the thread is holding a lock, so mutexes are + * We're disabling thread cancellation while the thread is holding a lock, so mutexes are * properly unlocked at termination time. */ PaError PaUnixMutex_Lock( PaUnixMutex* self ) { PaError result = paNoError; - + #ifdef PTHREAD_CANCEL - int oldState; + int oldState; PA_ENSURE_SYSTEM( pthread_setcancelstate( PTHREAD_CANCEL_DISABLE, &oldState ), 0 ); #endif PA_ENSURE_SYSTEM( pthread_mutex_lock( &self->mtx ), 0 ); @@ -540,7 +540,7 @@ PaError PaUnixMutex_Unlock( PaUnixMutex* self ) PA_ENSURE_SYSTEM( pthread_mutex_unlock( &self->mtx ), 0 ); #ifdef PTHREAD_CANCEL - int oldState; + int oldState; PA_ENSURE_SYSTEM( pthread_setcancelstate( PTHREAD_CANCEL_ENABLE, &oldState ), 0 ); #endif @@ -595,7 +595,7 @@ static void *WatchdogFunc( void *userData ) while( 1 ) { double lowpassCoeff = 0.9, lowpassCoeff1 = 0.99999 - lowpassCoeff; - + /* Test before and after in case whatever underlying sleep call isn't interrupted by pthread_cancel */ pthread_testcancel(); Pa_Sleep( intervalMsec ); @@ -680,7 +680,7 @@ error: /* Pass on error code */ pres = malloc( sizeof (PaError) ); *pres = result; - + pthread_exit( pres ); } diff --git a/src/os/unix/pa_unix_util.h b/src/os/unix/pa_unix_util.h index 2a62fe8..2228cb3 100644 --- a/src/os/unix/pa_unix_util.h +++ b/src/os/unix/pa_unix_util.h @@ -27,13 +27,13 @@ */ /* - * The text above constitutes the entire PortAudio license; however, + * The text above constitutes the entire PortAudio license; however, * the PortAudio community also makes the following non-binding requests: * * 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. It is also - * requested that these non-binding requests be included along with the + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the * license above. */ From f58b69dc36f26914b17d02c0b31ad6d1d6c8e117 Mon Sep 17 00:00:00 2001 From: Ross Bencina Date: Thu, 21 Jan 2021 23:45:10 +1100 Subject: [PATCH 094/164] Clean up whitespace in test/ in preparation for .editorconfig. (#417) * Clean up whitespace in test/ in preparation for .editorconfig. Convert tabs to 4 spaces. Indent by 4 spaces. Strip trailing whitespace. Ensure EOL at EOF. --- test/pa_minlat.c | 70 +-- test/patest1.c | 30 +- test/patest_buffer.c | 24 +- test/patest_callbackstop.c | 38 +- test/patest_clip.c | 26 +- test/patest_converters.c | 32 +- test/patest_dither.c | 32 +- test/patest_dsound_find_best_latency_params.c | 66 +-- test/patest_dsound_low_level_latency_params.c | 50 +- test/patest_dsound_surround.c | 86 ++-- test/patest_hang.c | 32 +- test/patest_in_overflow.c | 30 +- test/patest_jack_wasapi.c | 444 +++++++++--------- test/patest_latency.c | 20 +- test/patest_leftright.c | 70 +-- test/patest_longsine.c | 18 +- test/patest_many.c | 16 +- test/patest_maxsines.c | 26 +- test/patest_mono.c | 20 +- test/patest_multi_sine.c | 22 +- test/patest_out_underflow.c | 36 +- test/patest_prime.c | 30 +- test/patest_read_record.c | 28 +- test/patest_ringmix.c | 14 +- test/patest_sine8.c | 16 +- test/patest_sine_channelmaps.c | 26 +- test/patest_sine_formats.c | 12 +- test/patest_sine_srate.c | 52 +- test/patest_sine_time.c | 30 +- test/patest_start_stop.c | 28 +- test/patest_stop.c | 38 +- test/patest_stop_playout.c | 50 +- test/patest_suggested_vs_streaminfo_latency.c | 38 +- .../patest_suggested_vs_streaminfo_latency.py | 8 +- test/patest_sync.c | 58 +-- test/patest_timing.c | 26 +- test/patest_toomanysines.c | 58 +-- test/patest_two_rates.c | 72 +-- test/patest_underflow.c | 18 +- test/patest_unplug.c | 12 +- test/patest_wire.c | 32 +- test/patest_wmme_find_best_latency_params.c | 64 +-- test/patest_wmme_low_level_latency_params.c | 50 +- test/patest_write_stop.c | 28 +- test/patest_write_stop_hang_illegal.c | 8 +- 45 files changed, 992 insertions(+), 992 deletions(-) diff --git a/test/pa_minlat.c b/test/pa_minlat.c index a91f9e0..683b2bb 100644 --- a/test/pa_minlat.c +++ b/test/pa_minlat.c @@ -1,8 +1,8 @@ /** @file pa_minlat.c - @ingroup test_src + @ingroup test_src @brief Experiment with different numbers of buffers to determine the - minimum latency for a computer. - @author Phil Burk http://www.softsynth.com + minimum latency for a computer. + @author Phil Burk http://www.softsynth.com */ /* * $Id$ @@ -32,13 +32,13 @@ */ /* - * The text above constitutes the entire PortAudio license; however, + * The text above constitutes the entire PortAudio license; however, * the PortAudio community also makes the following non-binding requests: * * 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. It is also - * requested that these non-binding requests be included along with the + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the * license above. */ @@ -107,7 +107,7 @@ int main( int argc, char **argv ) int framesPerBuffer; double sampleRate = 44100.0; char str[256]; - char *line; + char *line; printf("pa_minlat - Determine minimum latency for your computer.\n"); printf(" usage: pa_minlat {userBufferSize}\n"); @@ -136,7 +136,7 @@ int main( int argc, char **argv ) outputParameters.sampleFormat = paFloat32; /* 32 bit floating point output. */ outputParameters.suggestedLatency = (double)outLatency / sampleRate; /* In seconds. */ outputParameters.hostApiSpecificStreamInfo = NULL; - + printf("Latency = %d frames = %6.1f msec.\n", outLatency, outputParameters.suggestedLatency * 1000.0 ); err = Pa_OpenStream( @@ -159,33 +159,33 @@ int main( int argc, char **argv ) printf("\nMove windows around to see if the sound glitches.\n"); printf("Latency now %d, enter new number of frames, or 'q' to quit: ", outLatency ); line = fgets( str, 256, stdin ); - if( line == NULL ) - { - go = 0; - } - else - { - { - /* Get rid of newline */ - size_t l = strlen( str ) - 1; - if( str[ l ] == '\n') - str[ l ] = '\0'; - } - - - if( str[0] == 'q' ) go = 0; - else - { - outLatency = atol( str ); - if( outLatency < minLatency ) - { - printf( "Latency below minimum of %d! Set to minimum!!!\n", minLatency ); - outLatency = minLatency; - } - } - - } - /* Stop sound until ENTER hit. */ + if( line == NULL ) + { + go = 0; + } + else + { + { + /* Get rid of newline */ + size_t l = strlen( str ) - 1; + if( str[ l ] == '\n') + str[ l ] = '\0'; + } + + + if( str[0] == 'q' ) go = 0; + else + { + outLatency = atol( str ); + if( outLatency < minLatency ) + { + printf( "Latency below minimum of %d! Set to minimum!!!\n", minLatency ); + outLatency = minLatency; + } + } + + } + /* Stop sound until ENTER hit. */ err = Pa_StopStream( stream ); if( err != paNoError ) goto error; err = Pa_CloseStream( stream ); diff --git a/test/patest1.c b/test/patest1.c index 2ad9c38..110deef 100644 --- a/test/patest1.c +++ b/test/patest1.c @@ -1,7 +1,7 @@ /** @file patest1.c - @ingroup test_src - @brief Ring modulate the audio input with a sine wave for 20 seconds. - @author Ross Bencina + @ingroup test_src + @brief Ring modulate the audio input with a sine wave for 20 seconds. + @author Ross Bencina */ /* * $Id$ @@ -31,13 +31,13 @@ */ /* - * The text above constitutes the entire PortAudio license; however, + * The text above constitutes the entire PortAudio license; however, * the PortAudio community also makes the following non-binding requests: * * 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. It is also - * requested that these non-binding requests be included along with the + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the * license above. */ @@ -98,7 +98,7 @@ static int patest1Callback( const void *inputBuffer, void *outputBuffer, *out++ = 0; /* left */ *out++ = 0; /* right */ } - + return finished; } @@ -114,7 +114,7 @@ int main(int argc, char* argv[]) printf("patest1.c\n"); fflush(stdout); printf("Ring modulate input for 20 seconds.\n"); fflush(stdout); - + /* initialise sinusoidal wavetable */ for( i=0; i<100; i++ ) data.sine[i] = sin( ((double)i/100.) * M_PI * 2. ); @@ -126,8 +126,8 @@ int main(int argc, char* argv[]) inputParameters.device = Pa_GetDefaultInputDevice(); /* default input device */ if (inputParameters.device == paNoDevice) { - fprintf(stderr,"Error: No input default device.\n"); - goto done; + printf(stderr,"Error: No input default device.\n"); + goto done; } inputParameters.channelCount = 2; /* stereo input */ inputParameters.sampleFormat = paFloat32; /* 32 bit floating point input */ @@ -136,8 +136,8 @@ int main(int argc, char* argv[]) outputParameters.device = Pa_GetDefaultOutputDevice(); /* default output device */ if (outputParameters.device == paNoDevice) { - fprintf(stderr,"Error: No default output device.\n"); - goto done; + fprintf(stderr,"Error: No default output device.\n"); + goto done; } outputParameters.channelCount = 2; /* stereo output */ outputParameters.sampleFormat = paFloat32; /* 32 bit floating point output */ @@ -157,14 +157,14 @@ int main(int argc, char* argv[]) err = Pa_StartStream( stream ); if( err != paNoError ) goto done; - + printf( "Press any key to end.\n" ); fflush(stdout); - + getc( stdin ); /* wait for input before exiting */ err = Pa_AbortStream( stream ); if( err != paNoError ) goto done; - + printf( "Waiting for stream to complete...\n" ); /* sleep until playback has finished */ diff --git a/test/patest_buffer.c b/test/patest_buffer.c index 090b529..d19e121 100644 --- a/test/patest_buffer.c +++ b/test/patest_buffer.c @@ -1,7 +1,7 @@ /** @file patest_buffer.c - @ingroup test_src - @brief Test opening streams with different buffer sizes. - @author Phil Burk http://www.softsynth.com + @ingroup test_src + @brief Test opening streams with different buffer sizes. + @author Phil Burk http://www.softsynth.com */ /* * $Id$ @@ -31,13 +31,13 @@ */ /* - * The text above constitutes the entire PortAudio license; however, + * The text above constitutes the entire PortAudio license; however, * the PortAudio community also makes the following non-binding requests: * * 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. It is also - * requested that these non-binding requests be included along with the + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the * license above. */ @@ -128,10 +128,10 @@ int main(int argc, char **args) PaError err; printf("Test opening streams with different buffer sizes\n"); if( argc > 1 ) { - device=atoi( args[1] ); - printf("Using device number %d.\n\n", device ); + device=atoi( args[1] ); + printf("Using device number %d.\n\n", device ); } else { - printf("Using default device.\n\n" ); + printf("Using default device.\n\n" ); } for (i = 0 ; i < BUFFER_TABLE; i++) @@ -162,15 +162,15 @@ PaError TestOnce( int buffersize, PaDeviceIndex device ) data.sampsToGo = totalSamps = NUM_SECONDS * SAMPLE_RATE; /* Play for a few seconds. */ err = Pa_Initialize(); if( err != paNoError ) goto error; - + if( device == -1 ) outputParameters.device = Pa_GetDefaultOutputDevice(); /* default output device */ else outputParameters.device = device ; if (outputParameters.device == paNoDevice) { - fprintf(stderr,"Error: No default output device.\n"); - goto error; + fprintf(stderr,"Error: No default output device.\n"); + goto error; } outputParameters.channelCount = 2; /* stereo output */ diff --git a/test/patest_callbackstop.c b/test/patest_callbackstop.c index aa7f7fd..fba9dca 100644 --- a/test/patest_callbackstop.c +++ b/test/patest_callbackstop.c @@ -1,7 +1,7 @@ /** @file patest_callbackstop.c - @ingroup test_src - @brief Test the paComplete callback result code. - @author Ross Bencina + @ingroup test_src + @brief Test the paComplete callback result code. + @author Ross Bencina */ /* * $Id$ @@ -31,13 +31,13 @@ */ /* - * The text above constitutes the entire PortAudio license; however, + * The text above constitutes the entire PortAudio license; however, * the PortAudio community also makes the following non-binding requests: * * 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. It is also - * requested that these non-binding requests be included along with the + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the * license above. */ @@ -86,18 +86,18 @@ static int TestCallback( const void *input, void *output, (void) timeInfo; (void) statusFlags; - + if( data->callbackReturnedPaComplete ) data->callbackInvokedAfterReturningPaComplete = 1; for( i=0; isine[ data->phase++ ]; if( data->phase >= TABLE_SIZE ) data->phase -= TABLE_SIZE; - + *out++ = x; /* left */ *out++ = x; /* right */ } @@ -119,8 +119,8 @@ static int TestCallback( const void *input, void *output, */ static void StreamFinished( void* userData ) { - TestData *data = (TestData *) userData; - printf( "Stream Completed: %s\n", data->message ); + TestData *data = (TestData *) userData; + printf( "Stream Completed: %s\n", data->message ); } @@ -134,23 +134,23 @@ int main(void) TestData data; int i, j; - + printf( "PortAudio Test: output sine wave. SR = %d, BufSize = %d\n", SAMPLE_RATE, FRAMES_PER_BUFFER ); - + /* initialise sinusoidal wavetable */ for( i=0; ileft_phase = data->right_phase = 0; data->amplitude = amplitude; - + err = Pa_Initialize(); if( err != paNoError ) goto error; outputParameters.device = Pa_GetDefaultOutputDevice(); /* default output device */ if (outputParameters.device == paNoDevice) { - fprintf(stderr,"Error: No default output device.\n"); - goto error; + fprintf(stderr,"Error: No default output device.\n"); + goto error; } outputParameters.channelCount = 2; /* stereo output */ outputParameters.sampleFormat = paFloat32; /* 32 bit floating point output */ outputParameters.suggestedLatency = Pa_GetDeviceInfo( outputParameters.device )->defaultLowOutputLatency; outputParameters.hostApiSpecificStreamInfo = NULL; - + err = Pa_OpenStream( &stream, NULL, /* no input */ @@ -182,7 +182,7 @@ PaError PlaySine( paTestData *data, unsigned long flags, float amplitude ) err = Pa_CloseStream( stream ); if( err != paNoError ) goto error; - + Pa_Terminate(); return paNoError; error: diff --git a/test/patest_converters.c b/test/patest_converters.c index 1474a71..f76738c 100644 --- a/test/patest_converters.c +++ b/test/patest_converters.c @@ -1,7 +1,7 @@ /** @file patest_converters.c - @ingroup test_src - @brief Tests the converter functions in pa_converters.c - @author Ross Bencina + @ingroup test_src + @brief Tests the converter functions in pa_converters.c + @author Ross Bencina Link with pa_dither.c and pa_converters.c @@ -35,13 +35,13 @@ */ /* - * The text above constitutes the entire PortAudio license; however, + * The text above constitutes the entire PortAudio license; however, * the PortAudio community also makes the following non-binding requests: * * 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. It is also - * requested that these non-binding requests be included along with the + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the * license above. */ #include @@ -65,14 +65,14 @@ #define SAMPLE_FORMAT_COUNT (6) -static PaSampleFormat sampleFormats_[ SAMPLE_FORMAT_COUNT ] = +static PaSampleFormat sampleFormats_[ SAMPLE_FORMAT_COUNT ] = { paFloat32, paInt32, paInt24, paInt16, paInt8, paUInt8 }; /* all standard PA sample formats */ -static const char* sampleFormatNames_[SAMPLE_FORMAT_COUNT] = +static const char* sampleFormatNames_[SAMPLE_FORMAT_COUNT] = { "paFloat32", "paInt32", "paInt24", "paInt16", "paInt8", "paUInt8" }; -static const char* abbreviatedSampleFormatNames_[SAMPLE_FORMAT_COUNT] = +static const char* abbreviatedSampleFormatNames_[SAMPLE_FORMAT_COUNT] = { "f32", "i32", "i24", "i16", " i8", "ui8" }; @@ -140,7 +140,7 @@ static void GenerateOneCycleSine( PaSampleFormat format, void *buffer, int frame unsigned char *out = (unsigned char*)buffer; for( i=0; i < frameCount; ++i ){ signed long temp = (PaInt32)(.9 * sin( ((double)i/(double)frameCount) * 2. * M_PI ) * 0x7FFFFFFF); - + #if defined(PA_LITTLE_ENDIAN) out[0] = (unsigned char)(temp >> 8) & 0xFF; out[1] = (unsigned char)(temp >> 16) & 0xFF; @@ -193,11 +193,11 @@ int TestNonZeroPresent( void *buffer, int size ) int i; for( i=0; i < size; ++i ){ - + if( *p != 0 ) return 1; ++p; - } + } return 0; } @@ -213,7 +213,7 @@ float MaximumAbsDifference( float* sourceBuffer, float* referenceBuffer, int cou } return result; -} +} int main( const char **argv, int argc ) { @@ -286,7 +286,7 @@ int main( const char **argv, int argc ) passFailMatrix[sourceFormatIndex][destinationFormatIndex] = 0; } - + /* try to measure the noise floor (comparing output signal to a float32 sine wave) */ if( passFailMatrix[sourceFormatIndex][destinationFormatIndex] ){ @@ -298,9 +298,9 @@ int main( const char **argv, int argc ) (*converter)( sourceBuffer, 1, destinationBuffer, 1, MAX_PER_CHANNEL_FRAME_COUNT, &ditherState ); if( TestNonZeroPresent( sourceBuffer, MAX_PER_CHANNEL_FRAME_COUNT * My_Pa_GetSampleSize( paFloat32 ) ) ){ - + noiseAmplitudeMatrix[sourceFormatIndex][destinationFormatIndex] = MaximumAbsDifference( (float*)sourceBuffer, (float*)referenceBuffer, MAX_PER_CHANNEL_FRAME_COUNT ); - + }else{ /* can't test noise floor because there is no conversion from dest format to float available */ noiseAmplitudeMatrix[sourceFormatIndex][destinationFormatIndex] = -1; // mark as failed diff --git a/test/patest_dither.c b/test/patest_dither.c index 5f471b1..fc402dc 100644 --- a/test/patest_dither.c +++ b/test/patest_dither.c @@ -1,10 +1,10 @@ /** @file patest_dither.c - @ingroup test_src - @brief Attempt to hear difference between dithered and non-dithered signal. + @ingroup test_src + @brief Attempt to hear difference between dithered and non-dithered signal. - This only has an effect if the native format is 16 bit. + This only has an effect if the native format is 16 bit. - @author Phil Burk http://www.softsynth.com + @author Phil Burk http://www.softsynth.com */ /* * $Id$ @@ -34,13 +34,13 @@ */ /* - * The text above constitutes the entire PortAudio license; however, + * The text above constitutes the entire PortAudio license; however, * the PortAudio community also makes the following non-binding requests: * * 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. It is also - * requested that these non-binding requests be included along with the + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the * license above. */ @@ -64,22 +64,22 @@ typedef struct paTestData int right_phase; } paTestData; - + /* This routine will be called by the PortAudio engine when audio is needed. ** It may called at interrupt level on some machines so don't do anything ** that could mess up the system like calling malloc() or free(). */ static int sineCallback( const void *inputBuffer, void *outputBuffer, unsigned long framesPerBuffer, - const PaStreamCallbackTimeInfo *timeInfo, - PaStreamCallbackFlags statusFlags, void *userData ) + const PaStreamCallbackTimeInfo *timeInfo, + PaStreamCallbackFlags statusFlags, void *userData ) { paTestData *data = (paTestData*)userData; float *out = (float*)outputBuffer; float amplitude = data->amplitude; unsigned int i; (void) inputBuffer; - + for( i=0; isine[data->left_phase]; /* left */ @@ -113,14 +113,14 @@ PaError PlaySine( paTestData *data, PaStreamFlags flags, float amplitude ) outputParameters.device = Pa_GetDefaultOutputDevice(); /* default output device */ if (outputParameters.device == paNoDevice) { - fprintf(stderr,"Error: No default output device.\n"); - goto done; + fprintf(stderr,"Error: No default output device.\n"); + goto done; } outputParameters.channelCount = 2; /* stereo output */ outputParameters.hostApiSpecificStreamInfo = NULL; outputParameters.sampleFormat = paFloat32; /* 32 bit floating point output. */ /* When you change this, also */ - /* adapt the callback routine! */ + /* adapt the callback routine! */ outputParameters.suggestedLatency = Pa_GetDeviceInfo( outputParameters.device ) ->defaultLowOutputLatency; /* Low latency. */ err = Pa_OpenStream( &stream, @@ -140,7 +140,7 @@ PaError PlaySine( paTestData *data, PaStreamFlags flags, float amplitude ) Pa_Sleep( NUM_SECONDS * 1000 ); printf("CPULoad = %8.6f\n", Pa_GetStreamCpuLoad(stream)); - + err = Pa_CloseStream( stream ); done: Pa_Sleep( 250 ); /* Just a small silence. */ @@ -157,7 +157,7 @@ int main(void) paTestData DATA; int i; float amplitude = 4.0 / (1<<15); - + printf("PortAudio Test: output EXTREMELY QUIET sine wave with and without dithering.\n"); /* initialise sinusoidal wavetable */ for( i=0; i #include -#define _WIN32_WINNT 0x0501 /* for GetNativeSystemInfo */ +#define _WIN32_WINNT 0x0501 /* for GetNativeSystemInfo */ #include //#include /* required when using pa_win_wmme.h */ @@ -102,11 +102,11 @@ static void printWindowsVersionInfo( FILE *fp ) osVersionInfoEx.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); GetVersionEx( &osVersionInfoEx ); - + if( osVersionInfoEx.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS ){ switch( osVersionInfoEx.dwMinorVersion ){ case 0: osName = "Windows 95"; break; - case 10: osName = "Windows 98"; break; // could also be 98SE (I've seen code discriminate based + case 10: osName = "Windows 98"; break; // could also be 98SE (I've seen code discriminate based // on osInfo.Version.Revision.ToString() == "2222A") case 90: osName = "Windows Me"; break; } @@ -132,13 +132,13 @@ static void printWindowsVersionInfo( FILE *fp ) }break; }break; case 6:switch( osVersionInfoEx.dwMinorVersion ){ - case 0: + case 0: if( osVersionInfoEx.wProductType == VER_NT_WORKSTATION ) osName = "Windows Vista"; else osName = "Windows Server 2008"; break; - case 1: + case 1: if( osVersionInfoEx.wProductType == VER_NT_WORKSTATION ) osName = "Windows 7"; else @@ -166,7 +166,7 @@ static void printWindowsVersionInfo( FILE *fp ) } else if(osVersionInfoEx.wProductType == VER_NT_SERVER) { - if(osVersionInfoEx.dwMinorVersion == 0) + if(osVersionInfoEx.dwMinorVersion == 0) { if((osVersionInfoEx.wSuiteMask & VER_SUITE_DATACENTER) == VER_SUITE_DATACENTER) osProductType = "Datacenter Server"; // Windows 2000 Datacenter Server @@ -201,8 +201,8 @@ static void printWindowsVersionInfo( FILE *fp ) fprintf( fp, "OS name and edition: %s %s\n", osName, osProductType ); - fprintf( fp, "OS version: %d.%d.%d %S\n", - osVersionInfoEx.dwMajorVersion, osVersionInfoEx.dwMinorVersion, + fprintf( fp, "OS version: %d.%d.%d %S\n", + osVersionInfoEx.dwMajorVersion, osVersionInfoEx.dwMinorVersion, osVersionInfoEx.dwBuildNumber, osVersionInfoEx.szCSDVersion ); fprintf( fp, "Processor architecture: %s\n", processorArchitecture ); fprintf( fp, "WoW64 process: %s\n", IsWow64() ? "Yes" : "No" ); @@ -225,7 +225,7 @@ static void printTimeAndDate( FILE *fp ) typedef struct { float sine[TABLE_SIZE]; - double phase; + double phase; double phaseIncrement; volatile int fadeIn; volatile int fadeOut; @@ -252,14 +252,14 @@ static int patestCallback( const void *inputBuffer, void *outputBuffer, (void) timeInfo; /* Prevent unused variable warnings. */ (void) statusFlags; (void) inputBuffer; - + for( i=0; isine[(int)data->phase]; data->phase += data->phaseIncrement; if( data->phase >= TABLE_SIZE ){ - data->phase -= TABLE_SIZE; - } + data->phase -= TABLE_SIZE; + } x *= data->amp; if( data->fadeIn ){ @@ -271,11 +271,11 @@ static int patestCallback( const void *inputBuffer, void *outputBuffer, data->amp -= .001; } - for( j = 0; j < CHANNEL_COUNT; ++j ){ + for( j = 0; j < CHANNEL_COUNT; ++j ){ *out++ = x; - } - } - + } + } + if( data->amp > 0 ) return paContinue; else @@ -287,7 +287,7 @@ static int patestCallback( const void *inputBuffer, void *outputBuffer, #define NO 0 -static int playUntilKeyPress( int deviceIndex, float sampleRate, +static int playUntilKeyPress( int deviceIndex, float sampleRate, int framesPerUserBuffer, int framesPerDSoundBuffer ) { PaStreamParameters outputParameters; @@ -303,7 +303,7 @@ static int playUntilKeyPress( int deviceIndex, float sampleRate, outputParameters.hostApiSpecificStreamInfo = NULL; directSoundStreamInfo.size = sizeof(PaWinDirectSoundStreamInfo); - directSoundStreamInfo.hostApiType = paDirectSound; + directSoundStreamInfo.hostApiType = paDirectSound; directSoundStreamInfo.version = 2; directSoundStreamInfo.flags = paWinDirectSoundUseLowLevelLatencyParameters; directSoundStreamInfo.framesPerBuffer = framesPerDSoundBuffer; @@ -373,7 +373,7 @@ static void usage( int dsoundHostApiIndex ) } /* - ideas: + ideas: o- could be testing with 80% CPU load o- could test with different channel counts */ @@ -401,15 +401,15 @@ int main(int argc, char* argv[]) if( argc > 3 ) usage(dsoundHostApiIndex); - deviceIndex = dsoundHostApiInfo->defaultOutputDevice; - if( argc >= 2 ){ + deviceIndex = dsoundHostApiInfo->defaultOutputDevice; + if( argc >= 2 ){ deviceIndex = -1; - if( sscanf( argv[1], "%d", &deviceIndex ) != 1 ) + if( sscanf( argv[1], "%d", &deviceIndex ) != 1 ) usage(dsoundHostApiInfo); if( deviceIndex < 0 || deviceIndex >= Pa_GetDeviceCount() || Pa_GetDeviceInfo(deviceIndex)->hostApi != dsoundHostApiIndex ){ usage(dsoundHostApiInfo); } - } + } printf( "Using device id %d (%s)\n", deviceIndex, Pa_GetDeviceInfo(deviceIndex)->name ); @@ -420,7 +420,7 @@ int main(int argc, char* argv[]) printf( "Testing with sample rate %f.\n", (float)sampleRate ); - + /* initialise sinusoidal wavetable */ for( i=0; iname ); fflush( resultsFp ); @@ -463,7 +463,7 @@ int main(int argc, char* argv[]) }else{ min = mid + 1; } - + }while( (min <= max) && (testResult == YES || testResult == NO) ); smallestWorkingBufferingLatencyFrames = smallestWorkingBufferSize; /* not strictly true, but we're using an unspecified callback size, so kind of */ @@ -490,7 +490,7 @@ int main(int argc, char* argv[]) } }while( (dsoundBufferSize <= (int)(sampleRate * .3)) && testResult == NO ); - + smallestWorkingBufferingLatencyFrames = smallestWorkingBufferSize; /* not strictly true, but we're using an unspecified callback size, so kind of */ fprintf( resultsFp, "%d, %d, %f\n", smallestWorkingBufferSize, smallestWorkingBufferingLatencyFrames, smallestWorkingBufferingLatencyFrames / sampleRate ); @@ -499,10 +499,10 @@ int main(int argc, char* argv[]) fprintf( resultsFp, "###\n" ); fclose( resultsFp ); - + Pa_Terminate(); printf("Test finished.\n"); - + return err; error: Pa_Terminate(); diff --git a/test/patest_dsound_low_level_latency_params.c b/test/patest_dsound_low_level_latency_params.c index 59734e2..85667a7 100644 --- a/test/patest_dsound_low_level_latency_params.c +++ b/test/patest_dsound_low_level_latency_params.c @@ -26,13 +26,13 @@ */ /* - * The text above constitutes the entire PortAudio license; however, + * The text above constitutes the entire PortAudio license; however, * the PortAudio community also makes the following non-binding requests: * * 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. It is also - * requested that these non-binding requests be included along with the + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the * license above. */ @@ -61,7 +61,7 @@ typedef struct { float sine[TABLE_SIZE]; - double phase; + double phase; } paTestData; @@ -82,20 +82,20 @@ static int patestCallback( const void *inputBuffer, void *outputBuffer, (void) timeInfo; /* Prevent unused variable warnings. */ (void) statusFlags; (void) inputBuffer; - + for( i=0; isine[(int)data->phase]; data->phase += 20; if( data->phase >= TABLE_SIZE ){ - data->phase -= TABLE_SIZE; - } + data->phase -= TABLE_SIZE; + } - for( j = 0; j < CHANNEL_COUNT; ++j ){ + for( j = 0; j < CHANNEL_COUNT; ++j ){ *out++ = x; - } - } - + } + } + return paContinue; } @@ -115,12 +115,12 @@ int main(int argc, char* argv[]) err = Pa_Initialize(); if( err != paNoError ) goto error; - deviceIndex = Pa_GetHostApiInfo( Pa_HostApiTypeIdToHostApiIndex( paDirectSound ) )->defaultOutputDevice; - if( argc == 2 ){ - sscanf( argv[1], "%d", &deviceIndex ); - } + deviceIndex = Pa_GetHostApiInfo( Pa_HostApiTypeIdToHostApiIndex( paDirectSound ) )->defaultOutputDevice; + if( argc == 2 ){ + sscanf( argv[1], "%d", &deviceIndex ); + } - printf( "using device id %d (%s)\n", deviceIndex, Pa_GetDeviceInfo(deviceIndex)->name ); + printf( "using device id %d (%s)\n", deviceIndex, Pa_GetDeviceInfo(deviceIndex)->name ); /* initialise sinusoidal wavetable */ for( i=0; icurrentChannel && data->cycleCount < 4410 ){ - *out++ = data->sine[data->phase]; - data->phase += 1 + j; // play each channel at a different pitch so they can be distinguished - if( data->phase >= TABLE_SIZE ){ - data->phase -= TABLE_SIZE; - } - }else{ - *out++ = 0; - } - } - - data->cycleCount++; - if( data->cycleCount > 44100 ){ - data->cycleCount = 0; + for( j = 0; j < CHANNEL_COUNT; ++j ){ + if( j == data->currentChannel && data->cycleCount < 4410 ){ + *out++ = data->sine[data->phase]; + data->phase += 1 + j; // play each channel at a different pitch so they can be distinguished + if( data->phase >= TABLE_SIZE ){ + data->phase -= TABLE_SIZE; + } + }else{ + *out++ = 0; + } + } + + data->cycleCount++; + if( data->cycleCount > 44100 ){ + data->cycleCount = 0; + + ++data->currentChannel; + if( data->currentChannel >= CHANNEL_COUNT ) + data->currentChannel -= CHANNEL_COUNT; + } + } - ++data->currentChannel; - if( data->currentChannel >= CHANNEL_COUNT ) - data->currentChannel -= CHANNEL_COUNT; - } - } - return paContinue; } @@ -129,12 +129,12 @@ int main(int argc, char* argv[]) err = Pa_Initialize(); if( err != paNoError ) goto error; - deviceIndex = Pa_GetHostApiInfo( Pa_HostApiTypeIdToHostApiIndex( paDirectSound ) )->defaultOutputDevice; - if( argc == 2 ){ - sscanf( argv[1], "%d", &deviceIndex ); - } + deviceIndex = Pa_GetHostApiInfo( Pa_HostApiTypeIdToHostApiIndex( paDirectSound ) )->defaultOutputDevice; + if( argc == 2 ){ + sscanf( argv[1], "%d", &deviceIndex ); + } - printf( "using device id %d (%s)\n", deviceIndex, Pa_GetDeviceInfo(deviceIndex)->name ); + printf( "using device id %d (%s)\n", deviceIndex, Pa_GetDeviceInfo(deviceIndex)->name ); /* initialise sinusoidal wavetable */ for( i=0; i - @author Phil Burk + @ingroup test_src + @brief Play a sine then hang audio callback to test watchdog. + @author Ross Bencina + @author Phil Burk */ /* * $Id$ @@ -32,13 +32,13 @@ */ /* - * The text above constitutes the entire PortAudio license; however, + * The text above constitutes the entire PortAudio license; however, * the PortAudio community also makes the following non-binding requests: * * 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. It is also - * requested that these non-binding requests be included along with the + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the * license above. */ @@ -77,7 +77,7 @@ static int patestCallback( const void *inputBuffer, void *outputBuffer, int finished = 0; double phaseInc = 0.02; double phase = data->phase; - + (void) inputBuffer; /* Prevent unused argument warning. */ for( i=0; isleepFor > 0 ) { Pa_Sleep( data->sleepFor ); } - + data->phase = phase; return finished; } @@ -106,7 +106,7 @@ int main(void) PaError err; int i; paTestData data = {0}; - + printf("PortAudio Test: output sine wave. SR = %d, BufSize = %d\n", SAMPLE_RATE, FRAMES_PER_BUFFER ); @@ -115,8 +115,8 @@ int main(void) outputParameters.device = Pa_GetDefaultOutputDevice(); /* Default output device. */ if (outputParameters.device == paNoDevice) { - fprintf(stderr,"Error: No default output device.\n"); - goto error; + fprintf(stderr,"Error: No default output device.\n"); + goto error; } outputParameters.channelCount = 1; /* Mono output. */ outputParameters.sampleFormat = paFloat32; /* 32 bit floating point. */ @@ -132,7 +132,7 @@ int main(void) patestCallback, &data); if (err != paNoError) goto error; - + err = Pa_StartStream( stream ); if( err != paNoError ) goto error; @@ -144,10 +144,10 @@ int main(void) data.sleepFor = i; Pa_Sleep( ((i<1000) ? 1000 : i) ); } - + printf("Suffer for 10 seconds.\n"); Pa_Sleep( 10000 ); - + err = Pa_StopStream( stream ); if( err != paNoError ) goto error; err = Pa_CloseStream( stream ); diff --git a/test/patest_in_overflow.c b/test/patest_in_overflow.c index 5ce50d3..31868bd 100644 --- a/test/patest_in_overflow.c +++ b/test/patest_in_overflow.c @@ -1,14 +1,14 @@ /** @file patest_in_overflow.c - @ingroup test_src - @brief Count input overflows (using paInputOverflow flag) under - overloaded and normal conditions. + @ingroup test_src + @brief Count input overflows (using paInputOverflow flag) under + overloaded and normal conditions. This test uses the same method to overload the stream as does patest_out_underflow.c -- it generates sine waves until the cpu load exceeds a certain level. However this test is only concerned with input and so doesn't output any sound. - + @author Ross Bencina - @author Phil Burk + @author Phil Burk */ /* * $Id$ @@ -38,13 +38,13 @@ */ /* - * The text above constitutes the entire PortAudio license; however, + * The text above constitutes the entire PortAudio license; however, * the PortAudio community also makes the following non-binding requests: * * 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. It is also - * requested that these non-binding requests be included along with the + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the * license above. */ @@ -141,8 +141,8 @@ int main(void) inputParameters.device = Pa_GetDefaultInputDevice(); /* default input device */ if (inputParameters.device == paNoDevice) { - fprintf(stderr,"Error: No default input device.\n"); - goto error; + fprintf(stderr,"Error: No default input device.\n"); + goto error; } inputParameters.channelCount = 1; /* mono output */ inputParameters.sampleFormat = paFloat32; /* 32 bit floating point output */ @@ -157,7 +157,7 @@ int main(void) FRAMES_PER_BUFFER, paClipOff, /* we won't output out of range samples so don't bother clipping them */ patestCallback, - &data ); + &data ); if( err != paNoError ) goto error; err = Pa_StartStream( stream ); if( err != paNoError ) goto error; @@ -187,7 +187,7 @@ int main(void) load = Pa_GetStreamCpuLoad( stream ); printf("STRESSING: sineCount = %d, CPU load = %f\n", data.sineCount, load ); } - + printf("Counting overflows for 5 seconds.\n"); data.countOverflows = 1; Pa_Sleep( 5000 ); @@ -209,14 +209,14 @@ int main(void) Pa_Sleep( 5000 ); safeOverflowCount = data.inputOverflowCount; - + printf("Stop stream.\n"); err = Pa_StopStream( stream ); if( err != paNoError ) goto error; - + err = Pa_CloseStream( stream ); if( err != paNoError ) goto error; - + Pa_Terminate(); if( stressedOverflowCount == 0 ) diff --git a/test/patest_jack_wasapi.c b/test/patest_jack_wasapi.c index 6175f88..bd79881 100644 --- a/test/patest_jack_wasapi.c +++ b/test/patest_jack_wasapi.c @@ -1,7 +1,7 @@ /** @file pa_test_jack_wasapi.c - @ingroup test_src - @brief Print out jack information for WASAPI endpoints - @author Reid Bishop + @ingroup test_src + @brief Print out jack information for WASAPI endpoints + @author Reid Bishop */ /* * $Id: pa_test_jack_wasapi.c 1368 2008-03-01 00:38:27Z rbishop $ @@ -31,13 +31,13 @@ */ /* - * The text above constitutes the entire PortAudio license; however, + * The text above constitutes the entire PortAudio license; however, * the PortAudio community also makes the following non-binding requests: * * 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. It is also - * requested that these non-binding requests be included along with the + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the * license above. */ #include @@ -51,7 +51,7 @@ */ static int IsInMask(int val, int val2) { - return ((val & val2) == val2); + return ((val & val2) == val2); } /* @@ -60,50 +60,50 @@ static int IsInMask(int val, int val2) static void EnumIJackChannels(int channelMapping) { - printf("Channel Mapping: "); - if(channelMapping == PAWIN_SPEAKER_DIRECTOUT) - { - printf("DIRECTOUT\n"); - return; - } - if(IsInMask(channelMapping, PAWIN_SPEAKER_FRONT_LEFT)) - printf("FRONT_LEFT, "); - if(IsInMask(channelMapping, PAWIN_SPEAKER_FRONT_RIGHT)) - printf("FRONT_RIGHT, "); - if(IsInMask(channelMapping, PAWIN_SPEAKER_FRONT_CENTER)) - printf("FRONT_CENTER, "); - if(IsInMask(channelMapping, PAWIN_SPEAKER_LOW_FREQUENCY)) - printf("LOW_FREQUENCY, "); - if(IsInMask(channelMapping, PAWIN_SPEAKER_BACK_LEFT)) - printf("BACK_LEFT, "); - if(IsInMask(channelMapping,PAWIN_SPEAKER_BACK_RIGHT)) - printf("BACK_RIGHT, "); - if(IsInMask(channelMapping, PAWIN_SPEAKER_FRONT_LEFT_OF_CENTER)) - printf("FRONT_LEFT_OF_CENTER, "); - if(IsInMask(channelMapping, PAWIN_SPEAKER_FRONT_RIGHT_OF_CENTER)) - printf("FRONT_RIGHT_OF_CENTER, "); - if(IsInMask(channelMapping, PAWIN_SPEAKER_BACK_CENTER)) - printf("BACK_CENTER, "); - if(IsInMask(channelMapping,PAWIN_SPEAKER_SIDE_LEFT)) - printf("SIDE_LEFT, "); - if(IsInMask(channelMapping,PAWIN_SPEAKER_SIDE_RIGHT)) - printf("SIDE_RIGHT, "); - if(IsInMask(channelMapping, PAWIN_SPEAKER_TOP_CENTER)) - printf("TOP_CENTER, "); - if(IsInMask(channelMapping, PAWIN_SPEAKER_TOP_FRONT_LEFT)) - printf("TOP_FRONT_LEFT, "); - if(IsInMask(channelMapping, PAWIN_SPEAKER_TOP_FRONT_CENTER)) - printf("TOP_FRONT_CENTER, "); - if(IsInMask(channelMapping, PAWIN_SPEAKER_TOP_FRONT_RIGHT)) - printf("TOP_FRONT_RIGHT, "); - if(IsInMask(channelMapping, PAWIN_SPEAKER_TOP_BACK_LEFT)) - printf("TOP_BACK_LEFT, "); - if(IsInMask(channelMapping, PAWIN_SPEAKER_TOP_BACK_CENTER)) - printf("TOP_BACK_CENTER, "); - if(IsInMask(channelMapping, PAWIN_SPEAKER_TOP_BACK_RIGHT)) - printf("TOP_BACK_RIGHT, "); + printf("Channel Mapping: "); + if(channelMapping == PAWIN_SPEAKER_DIRECTOUT) + { + printf("DIRECTOUT\n"); + return; + } + if(IsInMask(channelMapping, PAWIN_SPEAKER_FRONT_LEFT)) + printf("FRONT_LEFT, "); + if(IsInMask(channelMapping, PAWIN_SPEAKER_FRONT_RIGHT)) + printf("FRONT_RIGHT, "); + if(IsInMask(channelMapping, PAWIN_SPEAKER_FRONT_CENTER)) + printf("FRONT_CENTER, "); + if(IsInMask(channelMapping, PAWIN_SPEAKER_LOW_FREQUENCY)) + printf("LOW_FREQUENCY, "); + if(IsInMask(channelMapping, PAWIN_SPEAKER_BACK_LEFT)) + printf("BACK_LEFT, "); + if(IsInMask(channelMapping,PAWIN_SPEAKER_BACK_RIGHT)) + printf("BACK_RIGHT, "); + if(IsInMask(channelMapping, PAWIN_SPEAKER_FRONT_LEFT_OF_CENTER)) + printf("FRONT_LEFT_OF_CENTER, "); + if(IsInMask(channelMapping, PAWIN_SPEAKER_FRONT_RIGHT_OF_CENTER)) + printf("FRONT_RIGHT_OF_CENTER, "); + if(IsInMask(channelMapping, PAWIN_SPEAKER_BACK_CENTER)) + printf("BACK_CENTER, "); + if(IsInMask(channelMapping,PAWIN_SPEAKER_SIDE_LEFT)) + printf("SIDE_LEFT, "); + if(IsInMask(channelMapping,PAWIN_SPEAKER_SIDE_RIGHT)) + printf("SIDE_RIGHT, "); + if(IsInMask(channelMapping, PAWIN_SPEAKER_TOP_CENTER)) + printf("TOP_CENTER, "); + if(IsInMask(channelMapping, PAWIN_SPEAKER_TOP_FRONT_LEFT)) + printf("TOP_FRONT_LEFT, "); + if(IsInMask(channelMapping, PAWIN_SPEAKER_TOP_FRONT_CENTER)) + printf("TOP_FRONT_CENTER, "); + if(IsInMask(channelMapping, PAWIN_SPEAKER_TOP_FRONT_RIGHT)) + printf("TOP_FRONT_RIGHT, "); + if(IsInMask(channelMapping, PAWIN_SPEAKER_TOP_BACK_LEFT)) + printf("TOP_BACK_LEFT, "); + if(IsInMask(channelMapping, PAWIN_SPEAKER_TOP_BACK_CENTER)) + printf("TOP_BACK_CENTER, "); + if(IsInMask(channelMapping, PAWIN_SPEAKER_TOP_BACK_RIGHT)) + printf("TOP_BACK_RIGHT, "); - printf("\n"); + printf("\n"); } /* @@ -111,47 +111,47 @@ static void EnumIJackChannels(int channelMapping) */ static void EnumIJackConnectionType(int cType) { - printf("Connection Type: "); - switch(cType) - { - case eJackConnTypeUnknown: - printf("eJackConnTypeUnknown"); - break; - case eJackConnType3Point5mm: - printf("eJackConnType3Point5mm"); - break; - case eJackConnTypeQuarter: - printf("eJackConnTypeQuarter"); - break; - case eJackConnTypeAtapiInternal: - printf("eJackConnTypeAtapiInternal"); - break; - case eJackConnTypeRCA: - printf("eJackConnTypeRCA"); - break; - case eJackConnTypeOptical: - printf("eJackConnTypeOptical"); - break; - case eJackConnTypeOtherDigital: - printf("eJackConnTypeOtherDigital"); - break; - case eJackConnTypeOtherAnalog: - printf("eJackConnTypeOtherAnalog"); - break; - case eJackConnTypeMultichannelAnalogDIN: - printf("eJackConnTypeMultichannelAnalogDIN"); - break; - case eJackConnTypeXlrProfessional: - printf("eJackConnTypeXlrProfessional"); - break; - case eJackConnTypeRJ11Modem: - printf("eJackConnTypeRJ11Modem"); - break; - case eJackConnTypeCombination: - printf("eJackConnTypeCombination"); - break; - } - printf("\n"); + printf("Connection Type: "); + switch(cType) + { + case eJackConnTypeUnknown: + printf("eJackConnTypeUnknown"); + break; + case eJackConnType3Point5mm: + printf("eJackConnType3Point5mm"); + break; + case eJackConnTypeQuarter: + printf("eJackConnTypeQuarter"); + break; + case eJackConnTypeAtapiInternal: + printf("eJackConnTypeAtapiInternal"); + break; + case eJackConnTypeRCA: + printf("eJackConnTypeRCA"); + break; + case eJackConnTypeOptical: + printf("eJackConnTypeOptical"); + break; + case eJackConnTypeOtherDigital: + printf("eJackConnTypeOtherDigital"); + break; + case eJackConnTypeOtherAnalog: + printf("eJackConnTypeOtherAnalog"); + break; + case eJackConnTypeMultichannelAnalogDIN: + printf("eJackConnTypeMultichannelAnalogDIN"); + break; + case eJackConnTypeXlrProfessional: + printf("eJackConnTypeXlrProfessional"); + break; + case eJackConnTypeRJ11Modem: + printf("eJackConnTypeRJ11Modem"); + break; + case eJackConnTypeCombination: + printf("eJackConnTypeCombination"); + break; + } + printf("\n"); } /* @@ -159,50 +159,50 @@ static void EnumIJackConnectionType(int cType) */ static void EnumIJackGeoLocation(int iVal) { - printf("Geometric Location: "); - switch(iVal) - { - case eJackGeoLocRear: - printf("eJackGeoLocRear"); - break; - case eJackGeoLocFront: - printf("eJackGeoLocFront"); - break; - case eJackGeoLocLeft: - printf("eJackGeoLocLeft"); - break; - case eJackGeoLocRight: - printf("eJackGeoLocRight"); - break; - case eJackGeoLocTop: - printf("eJackGeoLocTop"); - break; - case eJackGeoLocBottom: - printf("eJackGeoLocBottom"); - break; - case eJackGeoLocRearPanel: - printf("eJackGeoLocRearPanel"); - break; - case eJackGeoLocRiser: - printf("eJackGeoLocRiser"); - break; - case eJackGeoLocInsideMobileLid: - printf("eJackGeoLocInsideMobileLid"); - break; - case eJackGeoLocDrivebay: - printf("eJackGeoLocDrivebay"); - break; - case eJackGeoLocHDMI: - printf("eJackGeoLocHDMI"); - break; - case eJackGeoLocOutsideMobileLid: - printf("eJackGeoLocOutsideMobileLid"); - break; - case eJackGeoLocATAPI: - printf("eJackGeoLocATAPI"); - break; - } - printf("\n"); + printf("Geometric Location: "); + switch(iVal) + { + case eJackGeoLocRear: + printf("eJackGeoLocRear"); + break; + case eJackGeoLocFront: + printf("eJackGeoLocFront"); + break; + case eJackGeoLocLeft: + printf("eJackGeoLocLeft"); + break; + case eJackGeoLocRight: + printf("eJackGeoLocRight"); + break; + case eJackGeoLocTop: + printf("eJackGeoLocTop"); + break; + case eJackGeoLocBottom: + printf("eJackGeoLocBottom"); + break; + case eJackGeoLocRearPanel: + printf("eJackGeoLocRearPanel"); + break; + case eJackGeoLocRiser: + printf("eJackGeoLocRiser"); + break; + case eJackGeoLocInsideMobileLid: + printf("eJackGeoLocInsideMobileLid"); + break; + case eJackGeoLocDrivebay: + printf("eJackGeoLocDrivebay"); + break; + case eJackGeoLocHDMI: + printf("eJackGeoLocHDMI"); + break; + case eJackGeoLocOutsideMobileLid: + printf("eJackGeoLocOutsideMobileLid"); + break; + case eJackGeoLocATAPI: + printf("eJackGeoLocATAPI"); + break; + } + printf("\n"); } /* @@ -210,23 +210,23 @@ static void EnumIJackGeoLocation(int iVal) */ static void EnumIJackGenLocation(int iVal) { - printf("General Location: "); - switch(iVal) - { - case eJackGenLocPrimaryBox: - printf("eJackGenLocPrimaryBox"); - break; - case eJackGenLocInternal: - printf("eJackGenLocInternal"); - break; - case eJackGenLocSeparate: - printf("eJackGenLocSeparate"); - break; - case eJackGenLocOther: - printf("eJackGenLocOther"); - break; - } - printf("\n"); + printf("General Location: "); + switch(iVal) + { + case eJackGenLocPrimaryBox: + printf("eJackGenLocPrimaryBox"); + break; + case eJackGenLocInternal: + printf("eJackGenLocInternal"); + break; + case eJackGenLocSeparate: + printf("eJackGenLocSeparate"); + break; + case eJackGenLocOther: + printf("eJackGenLocOther"); + break; + } + printf("\n"); } /* @@ -234,23 +234,23 @@ static void EnumIJackGenLocation(int iVal) */ static void EnumIJackPortConnection(int iVal) { - printf("Port Type: "); - switch(iVal) - { - case eJackPortConnJack: - printf("eJackPortConnJack"); - break; - case eJackPortConnIntegratedDevice: - printf("eJackPortConnIntegratedDevice"); - break; - case eJackPortConnBothIntegratedAndJack: - printf("eJackPortConnBothIntegratedAndJack"); - break; - case eJackPortConnUnknown: - printf("eJackPortConnUnknown"); - break; - } - printf("\n"); + printf("Port Type: "); + switch(iVal) + { + case eJackPortConnJack: + printf("eJackPortConnJack"); + break; + case eJackPortConnIntegratedDevice: + printf("eJackPortConnIntegratedDevice"); + break; + case eJackPortConnBothIntegratedAndJack: + printf("eJackPortConnBothIntegratedAndJack"); + break; + case eJackPortConnUnknown: + printf("eJackPortConnUnknown"); + break; + } + printf("\n"); } /* @@ -260,38 +260,38 @@ static void EnumIJackPortConnection(int iVal) static PaError GetJackInformation(int deviceId) { PaError err; - int i; - int jackCount = 0; - PaWasapiJackDescription jackDesc; + int i; + int jackCount = 0; + PaWasapiJackDescription jackDesc; - err = PaWasapi_GetJackCount(deviceId, &jackCount); - if( err != paNoError ) return err; + err = PaWasapi_GetJackCount(deviceId, &jackCount); + if( err != paNoError ) return err; - fprintf( stderr,"Number of Jacks: %d \n", jackCount ); + fprintf( stderr,"Number of Jacks: %d \n", jackCount ); - for( i = 0; ihostApi == Pa_HostApiTypeIdToHostApiIndex(paWASAPI) ) - { - if( device->maxOutputChannels == 0 ) - { - isInput = 1; - } - printf("------------------------------------------\n"); - printf("Device: %s",device->name); - if(isInput) - printf(" (Input) %d Channels\n",device->maxInputChannels); - else - printf(" (Output) %d Channels\n",device->maxOutputChannels); - // Try to see if this WASAPI device can provide Jack information - err = GetJackInformation(i); - if( err != paNoError ) goto error; - } - } + /* Find all WASAPI devices */ + for( i = 0; i < Pa_GetDeviceCount(); ++i ) + { + device = Pa_GetDeviceInfo(i); + if( Pa_GetDeviceInfo(i)->hostApi == Pa_HostApiTypeIdToHostApiIndex(paWASAPI) ) + { + if( device->maxOutputChannels == 0 ) + { + isInput = 1; + } + printf("------------------------------------------\n"); + printf("Device: %s",device->name); + if(isInput) + printf(" (Input) %d Channels\n",device->maxInputChannels); + else + printf(" (Output) %d Channels\n",device->maxOutputChannels); + // Try to see if this WASAPI device can provide Jack information + err = GetJackInformation(i); + if( err != paNoError ) goto error; + } + } Pa_Terminate(); printf("Test finished.\n"); return err; diff --git a/test/patest_latency.c b/test/patest_latency.c index 2078a04..7f622c1 100644 --- a/test/patest_latency.c +++ b/test/patest_latency.c @@ -1,8 +1,8 @@ /** @file - @ingroup test_src - @brief Hear the latency caused by big buffers. - Play a sine wave and change frequency based on letter input. - @author Phil Burk , and Darren Gibbs + @ingroup test_src + @brief Hear the latency caused by big buffers. + Play a sine wave and change frequency based on letter input. + @author Phil Burk , and Darren Gibbs */ /* * $Id$ @@ -32,13 +32,13 @@ */ /* - * The text above constitutes the entire PortAudio license; however, + * The text above constitutes the entire PortAudio license; however, * the PortAudio community also makes the following non-binding requests: * * 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. It is also - * requested that these non-binding requests be included along with the + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the * license above. */ @@ -136,14 +136,14 @@ int main(void) outputParameters.device = OUTPUT_DEVICE; if (outputParameters.device == paNoDevice) { - fprintf(stderr,"Error: No default output device.\n"); - goto error; + fprintf(stderr,"Error: No default output device.\n"); + goto error; } outputParameters.channelCount = 2; /* stereo output */ outputParameters.sampleFormat = paFloat32; /* 32 bit floating point output */ outputParameters.suggestedLatency = Pa_GetDeviceInfo( outputParameters.device )->defaultLowOutputLatency; outputParameters.hostApiSpecificStreamInfo = NULL; - + printf("Requested output latency = %.4f seconds.\n", outputParameters.suggestedLatency ); printf("%d frames per buffer.\n.", FRAMES_PER_BUFFER ); diff --git a/test/patest_leftright.c b/test/patest_leftright.c index 11ce463..e61a351 100644 --- a/test/patest_leftright.c +++ b/test/patest_leftright.c @@ -1,12 +1,12 @@ /** @file patest_leftright.c - @ingroup test_src - @brief Play different tone sine waves that - alternate between left and right channel. + @ingroup test_src + @brief Play different tone sine waves that + alternate between left and right channel. - The low tone should be on the left channel. + The low tone should be on the left channel. - @author Ross Bencina - @author Phil Burk + @author Ross Bencina + @author Phil Burk */ /* * $Id$ @@ -36,13 +36,13 @@ */ /* - * The text above constitutes the entire PortAudio license; however, + * The text above constitutes the entire PortAudio license; however, * the PortAudio community also makes the following non-binding requests: * * 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. It is also - * requested that these non-binding requests be included along with the + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the * license above. */ @@ -88,19 +88,19 @@ static int patestCallback( const void *inputBuffer, for( i=0; icurrentBalance < data->targetBalance ) - { - data->currentBalance += BALANCE_DELTA; - } - else if( data->currentBalance > data->targetBalance ) - { - data->currentBalance -= BALANCE_DELTA; - } - // Apply left/right balance. + // Smoothly pan between left and right. + if( data->currentBalance < data->targetBalance ) + { + data->currentBalance += BALANCE_DELTA; + } + else if( data->currentBalance > data->targetBalance ) + { + data->currentBalance -= BALANCE_DELTA; + } + // Apply left/right balance. *out++ = data->sine[data->left_phase] * (1.0f - data->currentBalance); /* left */ - *out++ = data->sine[data->right_phase] * data->currentBalance; /* right */ - + *out++ = data->sine[data->right_phase] * data->currentBalance; /* right */ + data->left_phase += 1; if( data->left_phase >= TABLE_SIZE ) data->left_phase -= TABLE_SIZE; data->right_phase += 3; /* higher pitch so we can distinguish left and right. */ @@ -118,10 +118,10 @@ int main(void) PaStreamParameters outputParameters; PaError err; paTestData data; - int i; + int i; printf("Play different tone sine waves that alternate between left and right channel.\n"); printf("The low tone should be on the left channel.\n"); - + /* initialise sinusoidal wavetable */ for( i=0; i #include @@ -111,8 +111,8 @@ int main(void) outputParameters.device = Pa_GetDefaultOutputDevice(); /* default output device */ if (outputParameters.device == paNoDevice) { - fprintf(stderr,"Error: No default output device.\n"); - goto error; + fprintf(stderr,"Error: No default output device.\n"); + goto error; } outputParameters.channelCount = 2; /* stereo output */ outputParameters.sampleFormat = paFloat32; /* 32 bit floating point output */ diff --git a/test/patest_many.c b/test/patest_many.c index b6bc314..76cc043 100644 --- a/test/patest_many.c +++ b/test/patest_many.c @@ -1,7 +1,7 @@ /** @file patest_many.c - @ingroup test_src - @brief Start and stop the PortAudio Driver multiple times. - @author Phil Burk http://www.softsynth.com + @ingroup test_src + @brief Start and stop the PortAudio Driver multiple times. + @author Phil Burk http://www.softsynth.com */ /* * $Id$ @@ -31,13 +31,13 @@ */ /* - * The text above constitutes the entire PortAudio license; however, + * The text above constitutes the entire PortAudio license; however, * the PortAudio community also makes the following non-binding requests: * * 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. It is also - * requested that these non-binding requests be included along with the + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the * license above. */ @@ -175,8 +175,8 @@ PaError TestOnce( void ) outputParameters.device = Pa_GetDefaultOutputDevice(); /* default output device */ if (outputParameters.device == paNoDevice) { - fprintf(stderr,"Error: No default output device.\n"); - goto error; + fprintf(stderr,"Error: No default output device.\n"); + goto error; } outputParameters.channelCount = 2; /* stereo output */ outputParameters.sampleFormat = paInt16; diff --git a/test/patest_maxsines.c b/test/patest_maxsines.c index 672a492..638a01a 100644 --- a/test/patest_maxsines.c +++ b/test/patest_maxsines.c @@ -1,8 +1,8 @@ /** @file patest_maxsines.c - @ingroup test_src - @brief How many sine waves can we calculate and play in less than 80% CPU Load. - @author Ross Bencina - @author Phil Burk + @ingroup test_src + @brief How many sine waves can we calculate and play in less than 80% CPU Load. + @author Ross Bencina + @author Phil Burk */ /* * $Id$ @@ -32,13 +32,13 @@ */ /* - * The text above constitutes the entire PortAudio license; however, + * The text above constitutes the entire PortAudio license; however, * the PortAudio community also makes the following non-binding requests: * * 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. It is also - * requested that these non-binding requests be included along with the + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the * license above. */ @@ -110,7 +110,7 @@ static int patestCallback(const void* inputBuffer, numForScale = data->numSines; if( numForScale < 8 ) numForScale = 8; /* prevent pops at beginning */ scaler = 1.0f / numForScale; - + for( i=0; i= 1.0 ) phase -= 1.0; - output += LookupSine(data, phase); + output += LookupSine(data, phase); data->phases[j] = phase; - + phaseInc *= 1.02f; if( phaseInc > MAX_PHASE_INC ) phaseInc = MIN_PHASE_INC; } @@ -141,7 +141,7 @@ static int patestCallback(const void* inputBuffer, int main(void); int main(void) { - int i; + int i; PaStream* stream; PaStreamParameters outputParameters; PaError err; @@ -162,8 +162,8 @@ int main(void) goto error; outputParameters.device = Pa_GetDefaultOutputDevice(); /* Default output device. */ if (outputParameters.device == paNoDevice) { - fprintf(stderr,"Error: No default output device.\n"); - goto error; + fprintf(stderr,"Error: No default output device.\n"); + goto error; } outputParameters.channelCount = 2; /* Stereo output. */ outputParameters.sampleFormat = paFloat32; /* 32 bit floating point output. */ diff --git a/test/patest_mono.c b/test/patest_mono.c index 3af09f5..c07e0bc 100644 --- a/test/patest_mono.c +++ b/test/patest_mono.c @@ -1,7 +1,7 @@ /** @file patest_mono.c - @ingroup test_src - @brief Play a monophonic sine wave using the Portable Audio api for several seconds. - @author Phil Burk http://www.softsynth.com + @ingroup test_src + @brief Play a monophonic sine wave using the Portable Audio api for several seconds. + @author Phil Burk http://www.softsynth.com */ /* * $Id$ @@ -35,13 +35,13 @@ */ /* - * The text above constitutes the entire PortAudio license; however, + * The text above constitutes the entire PortAudio license; however, * the PortAudio community also makes the following non-binding requests: * * 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. It is also - * requested that these non-binding requests be included along with the + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the * license above. */ @@ -110,7 +110,7 @@ int main(void) data.sine[i] = (float) (AMPLITUDE * sin( ((double)i/(double)TABLE_SIZE) * M_PI * 2. )); } data.phase = 0; - + err = Pa_Initialize(); if( err != paNoError ) goto error; @@ -133,16 +133,16 @@ int main(void) err = Pa_StartStream( stream ); if( err != paNoError ) goto error; - + printf("Play for %d seconds.\n", NUM_SECONDS ); fflush(stdout); Pa_Sleep( NUM_SECONDS * 1000 ); err = Pa_StopStream( stream ); if( err != paNoError ) goto error; - + err = Pa_CloseStream( stream ); if( err != paNoError ) goto error; - + Pa_Terminate(); printf("Test finished.\n"); return err; diff --git a/test/patest_multi_sine.c b/test/patest_multi_sine.c index ad3db44..ec9ed8c 100644 --- a/test/patest_multi_sine.c +++ b/test/patest_multi_sine.c @@ -1,7 +1,7 @@ /** @file patest_multi_sine.c - @ingroup test_src - @brief Play a different sine wave on each channel. - @author Phil Burk http://www.softsynth.com + @ingroup test_src + @brief Play a different sine wave on each channel. + @author Phil Burk http://www.softsynth.com */ /* * $Id$ @@ -31,16 +31,16 @@ */ /* - * The text above constitutes the entire PortAudio license; however, + * The text above constitutes the entire PortAudio license; however, * the PortAudio community also makes the following non-binding requests: * * 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. It is also - * requested that these non-binding requests be included along with the + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the * license above. */ - + #include #include @@ -125,8 +125,8 @@ int test(short interleaved) outputParameters.device = Pa_GetDefaultOutputDevice(); /* Default output device, max channels. */ if (outputParameters.device == paNoDevice) { - fprintf(stderr,"Error: No default output device.\n"); - return paInvalidDevice; + fprintf(stderr,"Error: No default output device.\n"); + return paInvalidDevice; } pdi = Pa_GetDeviceInfo(outputParameters.device); outputParameters.channelCount = pdi->maxOutputChannels; @@ -135,7 +135,7 @@ int test(short interleaved) outputParameters.sampleFormat = paFloat32; /* 32 bit floating point output */ outputParameters.suggestedLatency = pdi->defaultLowOutputLatency; outputParameters.hostApiSpecificStreamInfo = NULL; - + data.interleaved = interleaved; data.numChannels = outputParameters.channelCount; for (n = 0; n < data.numChannels; n++) @@ -169,7 +169,7 @@ int test(short interleaved) } Pa_CloseStream( stream ); } - return err; + return err; } diff --git a/test/patest_out_underflow.c b/test/patest_out_underflow.c index 86a35cb..a8c45ea 100644 --- a/test/patest_out_underflow.c +++ b/test/patest_out_underflow.c @@ -1,9 +1,9 @@ /** @file patest_out_underflow.c - @ingroup test_src - @brief Count output underflows (using paOutputUnderflow flag) - under overloaded and normal conditions. - @author Ross Bencina - @author Phil Burk + @ingroup test_src + @brief Count output underflows (using paOutputUnderflow flag) + under overloaded and normal conditions. + @author Ross Bencina + @author Phil Burk */ /* * $Id$ @@ -33,13 +33,13 @@ */ /* - * The text above constitutes the entire PortAudio license; however, + * The text above constitutes the entire PortAudio license; however, * the PortAudio community also makes the following non-binding requests: * * 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. It is also - * requested that these non-binding requests be included along with the + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the * license above. */ @@ -134,11 +134,11 @@ int main(void) err = Pa_Initialize(); if( err != paNoError ) goto error; - + outputParameters.device = Pa_GetDefaultOutputDevice(); /* default output device */ if (outputParameters.device == paNoDevice) { - fprintf(stderr,"Error: No default output device.\n"); - goto error; + fprintf(stderr,"Error: No default output device.\n"); + goto error; } outputParameters.channelCount = 1; /* mono output */ outputParameters.sampleFormat = paFloat32; /* 32 bit floating point output */ @@ -154,7 +154,7 @@ int main(void) FRAMES_PER_BUFFER, paClipOff, /* we won't output out of range samples so don't bother clipping them */ patestCallback, - &data ); + &data ); if( err != paNoError ) goto error; err = Pa_StartStream( stream ); if( err != paNoError ) goto error; @@ -163,12 +163,12 @@ int main(void) /* Determine number of sines required to get to 50% */ do - { + { Pa_Sleep( 100 ); load = Pa_GetStreamCpuLoad( stream ); printf("sineCount = %d, CPU load = %f\n", data.sineCount, load ); - + if( load < 0.3 ) { data.sineCount += 10; @@ -198,7 +198,7 @@ int main(void) load = Pa_GetStreamCpuLoad( stream ); printf("STRESSING: sineCount = %d, CPU load = %f\n", sineCount, load ); } - + printf("Counting underflows for 2 seconds.\n"); data.countUnderflows = 1; Pa_Sleep( 2000 ); @@ -220,14 +220,14 @@ int main(void) Pa_Sleep( 5000 ); safeUnderflowCount = data.outputUnderflowCount; - + printf("Stop stream.\n"); err = Pa_StopStream( stream ); if( err != paNoError ) goto error; - + err = Pa_CloseStream( stream ); if( err != paNoError ) goto error; - + Pa_Terminate(); printf("suggestedLatency = %f\n", suggestedLatency); diff --git a/test/patest_prime.c b/test/patest_prime.c index 98acd60..e943310 100644 --- a/test/patest_prime.c +++ b/test/patest_prime.c @@ -1,7 +1,7 @@ /** @file patest_prime.c - @ingroup test_src - @brief Test stream priming mode. - @author Ross Bencina http://www.audiomulch.com/~rossb + @ingroup test_src + @brief Test stream priming mode. + @author Ross Bencina http://www.audiomulch.com/~rossb */ /* @@ -32,16 +32,16 @@ */ /* - * The text above constitutes the entire PortAudio license; however, + * The text above constitutes the entire PortAudio license; however, * the PortAudio community also makes the following non-binding requests: * * 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. It is also - * requested that these non-binding requests be included along with the + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the * license above. */ - + #include #include #include "portaudio.h" @@ -83,8 +83,8 @@ static void InitializeTestData( paTestData *testData ) */ static int patestCallback( const void *inputBuffer, void *outputBuffer, unsigned long framesPerBuffer, - const PaStreamCallbackTimeInfo *timeInfo, - PaStreamCallbackFlags statusFlags, void *userData ) + const PaStreamCallbackTimeInfo *timeInfo, + PaStreamCallbackFlags statusFlags, void *userData ) { /* Cast data passed through stream to our structure. */ paTestData *data = (paTestData*)userData; @@ -105,7 +105,7 @@ static int patestCallback( const void *inputBuffer, void *outputBuffer, *out++ = 0.0; /* left */ *out++ = 0.0; /* right */ --data->idleCountdown; - + if( data->idleCountdown <= 0 ) result = paComplete; break; @@ -133,7 +133,7 @@ static int patestCallback( const void *inputBuffer, void *outputBuffer, break; } } - + return result; } @@ -145,12 +145,12 @@ static PaError DoTest( int flags ) paTestData data; PaStreamParameters outputParameters; - InitializeTestData( &data ); + InitializeTestData( &data ); outputParameters.device = Pa_GetDefaultOutputDevice(); if (outputParameters.device == paNoDevice) { - fprintf(stderr,"Error: No default output device.\n"); - goto error; + fprintf(stderr,"Error: No default output device.\n"); + goto error; } outputParameters.channelCount = 2; outputParameters.hostApiSpecificStreamInfo = NULL; @@ -200,7 +200,7 @@ int main(void) /* Initialize library before making any other calls. */ err = Pa_Initialize(); if( err != paNoError ) goto error; - + printf("PortAudio Test: Testing stream playback with no priming.\n"); printf("PortAudio Test: you should see BEEP before you hear it.\n"); printf("BEEP %d times.\n", NUM_BEEPS ); diff --git a/test/patest_read_record.c b/test/patest_read_record.c index ae92ea2..4c5f810 100644 --- a/test/patest_read_record.c +++ b/test/patest_read_record.c @@ -1,8 +1,8 @@ /** @file patest_read_record.c - @ingroup test_src - @brief Record input into an array; Save array to a file; Playback recorded + @ingroup test_src + @brief Record input into an array; Save array to a file; Playback recorded data. Implemented using the blocking API (Pa_ReadStream(), Pa_WriteStream() ) - @author Phil Burk http://www.softsynth.com + @author Phil Burk http://www.softsynth.com @author Ross Bencina rossb@audiomulch.com */ /* @@ -33,13 +33,13 @@ */ /* - * The text above constitutes the entire PortAudio license; however, + * The text above constitutes the entire PortAudio license; however, * the PortAudio community also makes the following non-binding requests: * * 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. It is also - * requested that these non-binding requests be included along with the + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the * license above. */ @@ -92,8 +92,8 @@ int main(void) int numSamples; int numBytes; SAMPLE max, average, val; - - + + printf("patest_read_record.c\n"); fflush(stdout); totalFrames = NUM_SECONDS * SAMPLE_RATE; /* Record for a few seconds. */ @@ -113,8 +113,8 @@ int main(void) inputParameters.device = Pa_GetDefaultInputDevice(); /* default input device */ if (inputParameters.device == paNoDevice) { - fprintf(stderr,"Error: No default input device.\n"); - goto error; + fprintf(stderr,"Error: No default input device.\n"); + goto error; } inputParameters.channelCount = NUM_CHANNELS; inputParameters.sampleFormat = PA_SAMPLE_TYPE; @@ -139,7 +139,7 @@ int main(void) err = Pa_ReadStream( stream, recordedSamples, totalFrames ); if( err != paNoError ) goto error; - + err = Pa_CloseStream( stream ); if( err != paNoError ) goto error; @@ -193,11 +193,11 @@ int main(void) #endif /* Playback recorded data. -------------------------------------------- */ - + outputParameters.device = Pa_GetDefaultOutputDevice(); /* default output device */ if (outputParameters.device == paNoDevice) { - fprintf(stderr,"Error: No default output device.\n"); - goto error; + fprintf(stderr,"Error: No default output device.\n"); + goto error; } outputParameters.channelCount = NUM_CHANNELS; outputParameters.sampleFormat = PA_SAMPLE_TYPE; diff --git a/test/patest_ringmix.c b/test/patest_ringmix.c index 2b365fb..2db6706 100644 --- a/test/patest_ringmix.c +++ b/test/patest_ringmix.c @@ -1,9 +1,9 @@ /** @file patest_ringmix.c - @ingroup test_src - @brief Ring modulate inputs to left output, mix inputs to right output. + @ingroup test_src + @brief Ring modulate inputs to left output, mix inputs to right output. */ /* - * $Id$ + * $Id$ * * This program uses the PortAudio Portable Audio Library. * For more information see: http://www.portaudio.com @@ -30,13 +30,13 @@ */ /* - * The text above constitutes the entire PortAudio license; however, + * The text above constitutes the entire PortAudio license; however, * the PortAudio community also makes the following non-binding requests: * * 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. It is also - * requested that these non-binding requests be included along with the + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the * license above. */ @@ -51,7 +51,7 @@ static int myCallback( const void *inputBuffer, void *outputBuffer, void *userData ) { const float *in = (const float *) inputBuffer; - float *out = (float *) outputBuffer; + float *out = (float *) outputBuffer; float leftInput, rightInput; unsigned int i; diff --git a/test/patest_sine8.c b/test/patest_sine8.c index 3688dd1..82de69d 100644 --- a/test/patest_sine8.c +++ b/test/patest_sine8.c @@ -1,7 +1,7 @@ /** @file patest_sine8.c - @ingroup test_src - @brief Test 8 bit data: play a sine wave for several seconds. - @author Ross Bencina + @ingroup test_src + @brief Test 8 bit data: play a sine wave for several seconds. + @author Ross Bencina */ /* * $Id$ @@ -31,13 +31,13 @@ */ /* - * The text above constitutes the entire PortAudio license; however, + * The text above constitutes the entire PortAudio license; however, * the PortAudio community also makes the following non-binding requests: * * 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. It is also - * requested that these non-binding requests be included along with the + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the * license above. */ @@ -150,8 +150,8 @@ int main(void) outputParameters.device = Pa_GetDefaultOutputDevice(); /* Default output device. */ if (outputParameters.device == paNoDevice) { - fprintf(stderr,"Error: No default output device.\n"); - goto error; + fprintf(stderr,"Error: No default output device.\n"); + goto error; } outputParameters.channelCount = 2; /* Stereo output. */ outputParameters.sampleFormat = TEST_FORMAT; diff --git a/test/patest_sine_channelmaps.c b/test/patest_sine_channelmaps.c index 83608b8..3476701 100644 --- a/test/patest_sine_channelmaps.c +++ b/test/patest_sine_channelmaps.c @@ -26,21 +26,21 @@ */ /* - * The text above constitutes the entire PortAudio license; however, + * The text above constitutes the entire PortAudio license; however, * the PortAudio community also makes the following non-binding requests: * * 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. It is also - * requested that these non-binding requests be included along with the + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the * license above. */ /** @file patest_sine_channelmaps.c - @ingroup test_src - @brief Plays sine waves using sme simple channel maps. + @ingroup test_src + @brief Plays sine waves using sme simple channel maps. Designed for use with CoreAudio, but should made to work with other APIs - @author Bjorn Roche + @author Bjorn Roche @author Ross Bencina @author Phil Burk */ @@ -87,7 +87,7 @@ static int patestCallback( const void *inputBuffer, void *outputBuffer, (void) timeInfo; /* Prevent unused variable warnings. */ (void) statusFlags; (void) inputBuffer; - + for( i=0; isine[data->left_phase]; /* left */ @@ -97,7 +97,7 @@ static int patestCallback( const void *inputBuffer, void *outputBuffer, data->right_phase += 3; /* higher pitch so we can distinguish left and right. */ if( data->right_phase >= TABLE_SIZE ) data->right_phase -= TABLE_SIZE; } - + return paContinue; } @@ -115,17 +115,17 @@ int main(void) #endif int i; - + printf("PortAudio Test: output sine wave. SR = %d, BufSize = %d\n", SAMPLE_RATE, FRAMES_PER_BUFFER); printf("Output will be mapped to channels 2 and 3 instead of 0 and 1.\n"); - + /* initialise sinusoidal wavetable */ for( i=0; i diff --git a/test/patest_sine_srate.c b/test/patest_sine_srate.c index 5fd07bd..d4ce81b 100644 --- a/test/patest_sine_srate.c +++ b/test/patest_sine_srate.c @@ -26,22 +26,22 @@ */ /* - * The text above constitutes the entire PortAudio license; however, + * The text above constitutes the entire PortAudio license; however, * the PortAudio community also makes the following non-binding requests: * * 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. It is also - * requested that these non-binding requests be included along with the + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the * license above. */ /** @file patest_sine_srate_mac.c - @ingroup test_src - @brief Plays sine waves at 44100 and 48000, + @ingroup test_src + @brief Plays sine waves at 44100 and 48000, and forces the hardware to change if this is a mac. Designed for use with CoreAudio. - @author Bjorn Roche + @author Bjorn Roche @author Ross Bencina @author Phil Burk */ @@ -89,7 +89,7 @@ static int patestCallback( const void *inputBuffer, void *outputBuffer, (void) timeInfo; /* Prevent unused variable warnings. */ (void) statusFlags; (void) inputBuffer; - + for( i=0; isine[data->left_phase]; /* left */ @@ -99,7 +99,7 @@ static int patestCallback( const void *inputBuffer, void *outputBuffer, data->right_phase += 3; /* higher pitch so we can distinguish left and right. */ if( data->right_phase >= TABLE_SIZE ) data->right_phase -= TABLE_SIZE; } - + return paContinue; } @@ -146,32 +146,32 @@ int main(void) outputParameters.hostApiSpecificStreamInfo = NULL; #endif err = Pa_OpenStream( - &stream, - NULL, /* no input */ - &outputParameters, - sr, - FRAMES_PER_BUFFER, - paClipOff, /* we won't output out of range samples so don't bother clipping them */ - patestCallback, - &data ); - if( err != paNoError ) goto error; + &stream, + NULL, /* no input */ + &outputParameters, + sr, + FRAMES_PER_BUFFER, + paClipOff, /* we won't output out of range samples so don't bother clipping them */ + patestCallback, + &data ); + if( err != paNoError ) goto error; - err = Pa_StartStream( stream ); - if( err != paNoError ) goto error; + err = Pa_StartStream( stream ); + if( err != paNoError ) goto error; - printf("Play for %d seconds.\n", NUM_SECONDS ); - Pa_Sleep( NUM_SECONDS * 1000 ); + printf("Play for %d seconds.\n", NUM_SECONDS ); + Pa_Sleep( NUM_SECONDS * 1000 ); - err = Pa_StopStream( stream ); - if( err != paNoError ) goto error; + err = Pa_StopStream( stream ); + if( err != paNoError ) goto error; - err = Pa_CloseStream( stream ); - if( err != paNoError ) goto error; + err = Pa_CloseStream( stream ); + if( err != paNoError ) goto error; } Pa_Terminate(); printf("Test finished.\n"); - + return err; error: Pa_Terminate(); diff --git a/test/patest_sine_time.c b/test/patest_sine_time.c index 1d4f551..c1d6097 100644 --- a/test/patest_sine_time.c +++ b/test/patest_sine_time.c @@ -1,9 +1,9 @@ /** @file patest_sine_time.c - @ingroup test_src - @brief Play a sine wave for several seconds, pausing in the middle. - Uses the Pa_GetStreamTime() call. - @author Ross Bencina - @author Phil Burk + @ingroup test_src + @brief Play a sine wave for several seconds, pausing in the middle. + Uses the Pa_GetStreamTime() call. + @author Ross Bencina + @author Phil Burk */ /* * $Id$ @@ -33,13 +33,13 @@ */ /* - * The text above constitutes the entire PortAudio license; however, + * The text above constitutes the entire PortAudio license; however, * the PortAudio community also makes the following non-binding requests: * * 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. It is also - * requested that these non-binding requests be included along with the + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the * license above. */ #include @@ -114,7 +114,7 @@ static void ReportStreamTime( PaStream *stream, paTestData *data ); static void ReportStreamTime( PaStream *stream, paTestData *data ) { PaTime streamTime, latency, outTime; - + streamTime = Pa_GetStreamTime( stream ); outTime = data->outTime; if( outTime < 0.0 ) @@ -167,7 +167,7 @@ int main(void) patestCallback, &data ); if( err != paNoError ) goto error; - + /* Watch until sound is halfway finished. */ printf("Play for %d seconds.\n", NUM_SECONDS/2 ); fflush(stdout); @@ -182,11 +182,11 @@ int main(void) ReportStreamTime( stream, &data ); Pa_Sleep(100); } while( (Pa_GetStreamTime( stream ) - startTime) < (NUM_SECONDS/2) ); - + /* Stop sound for 2 seconds. */ err = Pa_StopStream( stream ); if( err != paNoError ) goto error; - + printf("Pause for 2 seconds.\n"); fflush(stdout); Pa_Sleep( 2000 ); @@ -195,21 +195,21 @@ int main(void) if( err != paNoError ) goto error; startTime = Pa_GetStreamTime( stream ); - + printf("Play until sound is finished.\n"); fflush(stdout); do { ReportStreamTime( stream, &data ); Pa_Sleep(100); } while( (Pa_GetStreamTime( stream ) - startTime) < (NUM_SECONDS/2) ); - + err = Pa_CloseStream( stream ); if( err != paNoError ) goto error; Pa_Terminate(); printf("Test finished.\n"); return err; - + error: Pa_Terminate(); fprintf( stderr, "An error occurred while using the portaudio stream\n" ); diff --git a/test/patest_start_stop.c b/test/patest_start_stop.c index ec902cf..2470b26 100644 --- a/test/patest_start_stop.c +++ b/test/patest_start_stop.c @@ -1,9 +1,9 @@ /** @file patest_start_stop.c - @ingroup test_src - @brief Play a sine wave for several seconds. Start and stop the stream multiple times. - - @author Ross Bencina - @author Phil Burk + @ingroup test_src + @brief Play a sine wave for several seconds. Start and stop the stream multiple times. + + @author Ross Bencina + @author Phil Burk */ /* * $Id$ @@ -33,13 +33,13 @@ */ /* - * The text above constitutes the entire PortAudio license; however, + * The text above constitutes the entire PortAudio license; however, * the PortAudio community also makes the following non-binding requests: * * 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. It is also - * requested that these non-binding requests be included along with the + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the * license above. */ #include @@ -83,7 +83,7 @@ static int patestCallback( const void *inputBuffer, void *outputBuffer, (void) timeInfo; /* Prevent unused variable warnings. */ (void) statusFlags; (void) inputBuffer; - + for( i=0; isine[data->left_phase]; /* left */ @@ -93,7 +93,7 @@ static int patestCallback( const void *inputBuffer, void *outputBuffer, data->right_phase += 3; /* higher pitch so we can distinguish left and right. */ if( data->right_phase >= TABLE_SIZE ) data->right_phase -= TABLE_SIZE; } - + return paContinue; } @@ -107,16 +107,16 @@ int main(void) paTestData data; int i; - + printf("PortAudio Test: output sine wave. SR = %d, BufSize = %d\n", SAMPLE_RATE, FRAMES_PER_BUFFER); - + /* initialise sinusoidal wavetable */ for( i=0; i + @author Phil Burk */ /* * $Id$ @@ -41,13 +41,13 @@ */ /* - * The text above constitutes the entire PortAudio license; however, + * The text above constitutes the entire PortAudio license; however, * the PortAudio community also makes the following non-binding requests: * * 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. It is also - * requested that these non-binding requests be included along with the + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the * license above. */ #include @@ -96,7 +96,7 @@ int TestStopMode( paTestData *data ); float LookupWaveform( paTestData *data, float phase ); /****************************************************** - * Convert phase between 0.0 and 1.0 to waveform value + * Convert phase between 0.0 and 1.0 to waveform value * using linear interpolation. */ float LookupWaveform( paTestData *data, float phase ) @@ -132,7 +132,7 @@ static int patestCallback( const void *inputBuffer, void *outputBuffer, /* data->outTime = outTime; */ - + if( !data->done ) { for( i=0; idone = 0; data->phase = 0.0; data->frameCounter = 0; data->noteCounter = 0; data->repeatCounter = 0; data->phase_increment = data->tune[data->noteCounter]; - + err = Pa_Initialize(); if( err != paNoError ) goto error; @@ -257,7 +257,7 @@ int TestStopMode( paTestData *data ) outputParameters.sampleFormat = paFloat32; /* 32 bit floating point output */ outputParameters.suggestedLatency = LATENCY_SECONDS; outputParameters.hostApiSpecificStreamInfo = NULL; - + err = Pa_OpenStream( &stream, NULL, /* no input */ diff --git a/test/patest_stop_playout.c b/test/patest_stop_playout.c index 17e09f3..7e6932e 100644 --- a/test/patest_stop_playout.c +++ b/test/patest_stop_playout.c @@ -1,9 +1,9 @@ /** @file patest_stop_playout.c - @ingroup test_src - @brief Test whether all queued samples are played when Pa_StopStream() + @ingroup test_src + @brief Test whether all queued samples are played when Pa_StopStream() is used with a callback or read/write stream, or when the callback returns paComplete. - @author Ross Bencina + @author Ross Bencina */ /* * $Id$ @@ -33,13 +33,13 @@ */ /* - * The text above constitutes the entire PortAudio license; however, + * The text above constitutes the entire PortAudio license; however, * the PortAudio community also makes the following non-binding requests: * * 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. It is also - * requested that these non-binding requests be included along with the + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the * license above. */ #include @@ -66,10 +66,10 @@ typedef struct float sine[TABLE_SIZE+1]; int repeatCount; - + double phase; double lowIncrement, highIncrement; - + int gap1Length, toneLength, toneFadesLength, gap2Length, blipLength; int gap1Countdown, toneCountdown, gap2Countdown, blipCountdown; } @@ -105,7 +105,7 @@ static void InitTestSignalGenerator( TestData *data ) data->sine[TABLE_SIZE] = data->sine[0]; /* guard point for linear interpolation */ - + data->lowIncrement = (330. / SAMPLE_RATE) * TABLE_SIZE; data->highIncrement = (1760. / SAMPLE_RATE) * TABLE_SIZE; @@ -147,7 +147,7 @@ static void GenerateTestSignal( TestData *data, float *stereo, int frameCount ) data->gap1Countdown -= count; framesGenerated += count; } - + if( framesGenerated < frameCount && data->toneCountdown > 0 ){ count = MIN( frameCount - framesGenerated, data->toneCountdown ); for( i=0; i < count; ++i ) @@ -168,19 +168,19 @@ static void GenerateTestSignal( TestData *data, float *stereo, int frameCount ) /* cosine-bell fade out at end */ output *= (-cos(((float)data->toneCountdown / (float)data->toneFadesLength) * M_PI) + 1.) * .5; } - else if( data->toneCountdown > data->toneLength - data->toneFadesLength ) + else if( data->toneCountdown > data->toneLength - data->toneFadesLength ) { /* cosine-bell fade in at start */ output *= (cos(((float)(data->toneCountdown - (data->toneLength - data->toneFadesLength)) / (float)data->toneFadesLength) * M_PI) + 1.) * .5; } output *= .5; /* play tone half as loud as blip */ - + *stereo++ = output; *stereo++ = output; data->toneCountdown--; - } + } framesGenerated += count; } @@ -212,7 +212,7 @@ static void GenerateTestSignal( TestData *data, float *stereo, int frameCount ) /* cosine-bell envelope over whole blip */ output *= (-cos( ((float)data->blipCountdown / (float)data->blipLength) * 2. * M_PI) + 1.) * .5; - + *stereo++ = output; *stereo++ = output; @@ -227,7 +227,7 @@ static void GenerateTestSignal( TestData *data, float *stereo, int frameCount ) { RetriggerTestSignalGenerator( data ); data->repeatCount++; - } + } } if( framesGenerated < frameCount ) @@ -286,7 +286,7 @@ static int TestCallback2( const void *inputBuffer, void *outputBuffer, if( IsTestSignalFinished( (TestData*)userData ) ) testCallback2Finished = 1; - + return paContinue; } @@ -299,11 +299,11 @@ int main(void) PaError err; TestData data; float writeBuffer[ FRAMES_PER_BUFFER * 2 ]; - + printf("PortAudio Test: check that stopping stream plays out all queued samples. SR = %d, BufSize = %d\n", SAMPLE_RATE, FRAMES_PER_BUFFER); InitTestSignalGenerator( &data ); - + err = Pa_Initialize(); if( err != paNoError ) goto error; @@ -391,7 +391,7 @@ int main(void) ResetTestSignalGenerator( &data ); testCallback2Finished = 0; - + err = Pa_OpenStream( &stream, NULL, /* no input */ @@ -419,7 +419,7 @@ int main(void) err = Pa_StopStream( stream ); if( err != paNoError ) goto error; - + err = Pa_CloseStream( stream ); if( err != paNoError ) goto error; @@ -452,23 +452,23 @@ int main(void) GenerateTestSignal( &data, writeBuffer, FRAMES_PER_BUFFER ); err = Pa_WriteStream( stream, writeBuffer, FRAMES_PER_BUFFER ); if( err != paNoError ) goto error; - + }while( !IsTestSignalFinished( &data ) ); err = Pa_StopStream( stream ); if( err != paNoError ) goto error; - + err = Pa_CloseStream( stream ); if( err != paNoError ) goto error; /* -------------------------------------------------------------------------- */ - + Pa_Terminate(); printf("Test finished.\n"); - + return err; - + error: Pa_Terminate(); fprintf( stderr, "An error occurred while using the portaudio stream\n" ); diff --git a/test/patest_suggested_vs_streaminfo_latency.c b/test/patest_suggested_vs_streaminfo_latency.c index 204e964..c26d871 100644 --- a/test/patest_suggested_vs_streaminfo_latency.c +++ b/test/patest_suggested_vs_streaminfo_latency.c @@ -1,13 +1,13 @@ /** @file patest_suggested_vs_streaminfo_latency.c - @ingroup test_src - @brief Print suggested vs. PaStreamInfo reported actual latency - @author Ross Bencina + @ingroup test_src + @brief Print suggested vs. PaStreamInfo reported actual latency + @author Ross Bencina - Opens streams with a sequence of suggested latency values - from 0 to 2 seconds in .5ms intervals and gathers the resulting actual - latency values. Output a csv file and graph suggested vs. actual. Run - with framesPerBuffer unspecified, powers of 2 and multiples of 50 and - prime number buffer sizes. + Opens streams with a sequence of suggested latency values + from 0 to 2 seconds in .5ms intervals and gathers the resulting actual + latency values. Output a csv file and graph suggested vs. actual. Run + with framesPerBuffer unspecified, powers of 2 and multiples of 50 and + prime number buffer sizes. */ /* * $Id: patest_sine.c 1368 2008-03-01 00:38:27Z rossb $ @@ -37,13 +37,13 @@ */ /* - * The text above constitutes the entire PortAudio license; however, + * The text above constitutes the entire PortAudio license; however, * the PortAudio community also makes the following non-binding requests: * * 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. It is also - * requested that these non-binding requests be included along with the + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the * license above. */ #include @@ -129,8 +129,8 @@ int main( int argc, const char* argv[] ) if( inputParameters.device == -1 ){ inputParameters.device = Pa_GetDefaultInputDevice(); if (inputParameters.device == paNoDevice) { - fprintf(stderr,"Error: No default input device available.\n"); - goto error; + fprintf(stderr,"Error: No default input device available.\n"); + goto error; } }else{ deviceInfo = Pa_GetDeviceInfo(inputParameters.device); @@ -143,7 +143,7 @@ int main( int argc, const char* argv[] ) usage(); } } - + inputParameters.channelCount = NUM_CHANNELS; inputParameters.sampleFormat = paFloat32; /* 32 bit floating point output */ inputParameters.hostApiSpecificStreamInfo = NULL; @@ -158,8 +158,8 @@ int main( int argc, const char* argv[] ) if( outputParameters.device == -1 ){ outputParameters.device = Pa_GetDefaultOutputDevice(); if (outputParameters.device == paNoDevice) { - fprintf(stderr,"Error: No default output device available.\n"); - goto error; + fprintf(stderr,"Error: No default output device available.\n"); + goto error; } }else{ deviceInfo = Pa_GetDeviceInfo(outputParameters.device); @@ -214,7 +214,7 @@ int main( int argc, const char* argv[] ) err = Pa_OpenStream( &stream, - &inputParameters, + &inputParameters, NULL, /* no output */ sampleRate, framesPerBuffer, @@ -234,7 +234,7 @@ int main( int argc, const char* argv[] ) err = Pa_OpenStream( &stream, - &inputParameters, + &inputParameters, &outputParameters, sampleRate, framesPerBuffer, @@ -258,7 +258,7 @@ int main( int argc, const char* argv[] ) Pa_Terminate(); printf("# Test finished.\n"); - + return err; error: Pa_Terminate(); diff --git a/test/patest_suggested_vs_streaminfo_latency.py b/test/patest_suggested_vs_streaminfo_latency.py index 46c7434..8026787 100644 --- a/test/patest_suggested_vs_streaminfo_latency.py +++ b/test/patest_suggested_vs_streaminfo_latency.py @@ -88,7 +88,7 @@ compositeTestFramesPerBufferValues.append( 882 ) individualPlotFramesPerBufferValues = [0,64,128,256,512] #output separate plots for these -isFirst = True +isFirst = True for framesPerBuffer in compositeTestFramesPerBufferValues: commandString = testExeName + " " + str(inputDeviceIndex) + " " + str(outputDeviceIndex) + " " + str(sampleRate) + " " + str(framesPerBuffer) + ' > ' + dataFileName @@ -102,13 +102,13 @@ for framesPerBuffer in compositeTestFramesPerBufferValues: gcf().text(0.1, 0.0, "patest_suggested_vs_streaminfo_latency\n%s\n%s\n%s\n"%(d.inputDevice,d.outputDevice,d.sampleRate)) pdfFile.savefig() - - + + figure(2) # composite plot, includes all compositeTestFramesPerBufferValues if isFirst: plot( d.suggestedLatency, d.suggestedLatency, label="Suggested latency" ) - + plot( d.suggestedLatency, d.halfDuplexOutputLatency ) plot( d.suggestedLatency, d.halfDuplexInputLatency ) plot( d.suggestedLatency, d.fullDuplexOutputLatency ) diff --git a/test/patest_sync.c b/test/patest_sync.c index d3a8c0f..52df0fe 100644 --- a/test/patest_sync.c +++ b/test/patest_sync.c @@ -1,19 +1,19 @@ /** @file patest_sync.c - @ingroup test_src - @brief Test time stamping and synchronization of audio and video. + @ingroup test_src + @brief Test time stamping and synchronization of audio and video. - A high latency is used so we can hear the difference in time. - Random durations are used so we know we are hearing the right beep - and not the one before or after. + A high latency is used so we can hear the difference in time. + Random durations are used so we know we are hearing the right beep + and not the one before or after. - Sequence of events: - -# Foreground requests a beep. - -# Background randomly schedules a beep. - -# Foreground waits for the beep to be heard based on PaUtil_GetTime(). - -# Foreground outputs video (printf) in sync with audio. - -# Repeat. - - @author Phil Burk http://www.softsynth.com + Sequence of events: + -# Foreground requests a beep. + -# Background randomly schedules a beep. + -# Foreground waits for the beep to be heard based on PaUtil_GetTime(). + -# Foreground outputs video (printf) in sync with audio. + -# Repeat. + + @author Phil Burk http://www.softsynth.com */ /* * $Id$ @@ -43,13 +43,13 @@ */ /* - * The text above constitutes the entire PortAudio license; however, + * The text above constitutes the entire PortAudio license; however, * the PortAudio community also makes the following non-binding requests: * * 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. It is also - * requested that these non-binding requests be included along with the + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the * license above. */ @@ -97,8 +97,8 @@ static unsigned long GenerateRandomNumber( void ) */ static int patestCallback( const void *inputBuffer, void *outputBuffer, unsigned long framesPerBuffer, - const PaStreamCallbackTimeInfo *timeInfo, - PaStreamCallbackFlags statusFlags, void *userData ) + const PaStreamCallbackTimeInfo *timeInfo, + PaStreamCallbackFlags statusFlags, void *userData ) { /* Cast data passed through stream to our structure. */ paTestData *data = (paTestData*)userData; @@ -186,7 +186,7 @@ int main(void) /* Initialize library before making any other calls. */ err = Pa_Initialize(); if( err != paNoError ) goto error; - + outputParameters.device = Pa_GetDefaultOutputDevice(); if (outputParameters.device == paNoDevice) { fprintf(stderr,"Error: No default output device.\n"); @@ -198,16 +198,16 @@ int main(void) outputParameters.suggestedLatency = (double)LATENCY_MSEC / 1000; /* Open an audio I/O stream. */ - err = Pa_OpenStream( - &stream, - NULL, /* no input */ - &outputParameters, - SAMPLE_RATE, - FRAMES_PER_BUFFER, /* frames per buffer */ - paClipOff, /* we won't output out of range samples so don't bother clipping them */ - patestCallback, - &DATA ); - if( err != paNoError ) goto error; + err = Pa_OpenStream( + &stream, + NULL, /* no input */ + &outputParameters, + SAMPLE_RATE, + FRAMES_PER_BUFFER, /* frames per buffer */ + paClipOff, /* we won't output out of range samples so don't bother clipping them */ + patestCallback, + &DATA ); + if( err != paNoError ) goto error; err = Pa_StartStream( stream ); if( err != paNoError ) goto error; diff --git a/test/patest_timing.c b/test/patest_timing.c index 659ec24..2a240b4 100644 --- a/test/patest_timing.c +++ b/test/patest_timing.c @@ -1,8 +1,8 @@ /** @file patest_timing.c - @ingroup test_src - @brief Play a sine wave for several seconds, and spits out a ton of timing info while it's at it. Based on patest_sine.c - @author Bjorn Roche - @author Ross Bencina + @ingroup test_src + @brief Play a sine wave for several seconds, and spits out a ton of timing info while it's at it. Based on patest_sine.c + @author Bjorn Roche + @author Ross Bencina @author Phil Burk */ /* @@ -33,13 +33,13 @@ */ /* - * The text above constitutes the entire PortAudio license; however, + * The text above constitutes the entire PortAudio license; however, * the PortAudio community also makes the following non-binding requests: * * 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. It is also - * requested that these non-binding requests be included along with the + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the * license above. */ @@ -90,7 +90,7 @@ static int patestCallback( const void *inputBuffer, void *outputBuffer, timeInfo->outputBufferDacTime ); printf( "getStreamTime() returns: %g\n", Pa_GetStreamTime(data->stream) - data->start ); - + for( i=0; isine[data->left_phase]; /* left */ @@ -100,7 +100,7 @@ static int patestCallback( const void *inputBuffer, void *outputBuffer, data->right_phase += 3; /* higher pitch so we can distinguish left and right. */ if( data->right_phase >= TABLE_SIZE ) data->right_phase -= TABLE_SIZE; } - + return paContinue; } @@ -114,16 +114,16 @@ int main(void) paTestData data; int i; - + printf("PortAudio Test: output sine wave. SR = %d, BufSize = %d\n", SAMPLE_RATE, FRAMES_PER_BUFFER); - + /* initialise sinusoidal wavetable */ for( i=0; i - @author Phil Burk + @author Ross Bencina + @author Phil Burk */ /* * $Id$ @@ -33,13 +33,13 @@ */ /* - * The text above constitutes the entire PortAudio license; however, + * The text above constitutes the entire PortAudio license; however, * the PortAudio community also makes the following non-binding requests: * * 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. It is also - * requested that these non-binding requests be included along with the + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the * license above. */ @@ -120,7 +120,7 @@ int main(void) err = Pa_Initialize(); if( err != paNoError ) goto error; - + outputParameters.device = Pa_GetDefaultOutputDevice(); /* default output device */ if (outputParameters.device == paNoDevice) { fprintf(stderr,"Error: No default output device.\n"); @@ -139,7 +139,7 @@ int main(void) FRAMES_PER_BUFFER, paClipOff, /* we won't output out of range samples so don't bother clipping them */ patestCallback, - &data ); + &data ); if( err != paNoError ) goto error; err = Pa_StartStream( stream ); if( err != paNoError ) goto error; @@ -150,44 +150,44 @@ int main(void) load = Pa_GetStreamCpuLoad( stream ); printf("numSines = %d, CPU load = %f\n", data.numSines, load ); - - if( load < 0.3 ) - { - data.numSines += 10; - } - else if( load < 0.4 ) - { - data.numSines += 2; - } - else - { - data.numSines += 1; - } - + + if( load < 0.3 ) + { + data.numSines += 10; + } + else if( load < 0.4 ) + { + data.numSines += 2; + } + else + { + data.numSines += 1; + } + } while( load < 0.5 ); - + /* Calculate target stress value then ramp up to that level*/ numStress = (int) (2.0 * data.numSines * MAX_LOAD ); if( numStress > MAX_SINES ) - numStress = MAX_SINES; + numStress = MAX_SINES; for( ; data.numSines < numStress; data.numSines+=2 ) { Pa_Sleep( 200 ); load = Pa_GetStreamCpuLoad( stream ); printf("STRESSING: numSines = %d, CPU load = %f\n", data.numSines, load ); } - + printf("Suffer for 5 seconds.\n"); Pa_Sleep( 5000 ); - + printf("Stop stream.\n"); err = Pa_StopStream( stream ); if( err != paNoError ) goto error; - + err = Pa_CloseStream( stream ); if( err != paNoError ) goto error; - + Pa_Terminate(); printf("Test finished.\n"); return err; diff --git a/test/patest_two_rates.c b/test/patest_two_rates.c index 5148fe7..2116b1e 100644 --- a/test/patest_two_rates.c +++ b/test/patest_two_rates.c @@ -1,7 +1,7 @@ /** @file patest_two_rates.c - @ingroup test_src - @brief Play two streams at different rates to make sure they don't interfere. - @author Phil Burk + @ingroup test_src + @brief Play two streams at different rates to make sure they don't interfere. + @author Phil Burk */ /* * $Id$ @@ -33,13 +33,13 @@ */ /* - * The text above constitutes the entire PortAudio license; however, + * The text above constitutes the entire PortAudio license; however, * the PortAudio community also makes the following non-binding requests: * * 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. It is also - * requested that these non-binding requests be included along with the + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the * license above. */ @@ -68,10 +68,10 @@ typedef struct ** that could mess up the system like calling malloc() or free(). */ static int patestCallback( const void *inputBuffer, void *outputBuffer, - unsigned long framesPerBuffer, - const PaStreamCallbackTimeInfo* timeInfo, - PaStreamCallbackFlags statusFlags, - void *userData ) + unsigned long framesPerBuffer, + const PaStreamCallbackTimeInfo* timeInfo, + PaStreamCallbackFlags statusFlags, + void *userData ) { paTestData *data = (paTestData*)userData; float *out = (float*)outputBuffer; @@ -90,7 +90,7 @@ static int patestCallback( const void *inputBuffer, void *outputBuffer, data->phase += FREQ_INCR; if( data->phase >= (2.0 * M_PI) ) data->phase -= (2.0 * M_PI); } - data->numFrames += 1; + data->numFrames += 1; return 0; } @@ -108,28 +108,28 @@ int main(void) err = Pa_Initialize(); if( err != paNoError ) goto error; - + outputParameters.device = Pa_GetDefaultOutputDevice(); /* default output device */ if (outputParameters.device == paNoDevice) { - fprintf(stderr,"Error: No default output device.\n"); - goto error; + fprintf(stderr,"Error: No default output device.\n"); + goto error; } outputParameters.channelCount = 2; /* stereo output */ outputParameters.sampleFormat = paFloat32; /* 32 bit floating point output */ outputParameters.suggestedLatency = Pa_GetDeviceInfo( outputParameters.device )->defaultLowOutputLatency; outputParameters.hostApiSpecificStreamInfo = NULL; - /* Start first stream. **********************/ + /* Start first stream. **********************/ err = Pa_OpenStream( - &stream1, - NULL, /* no input */ - &outputParameters, - SAMPLE_RATE_1, - FRAMES_PER_BUFFER, - paClipOff, /* we won't output out of range samples so don't bother clipping them */ - patestCallback, - &data1 ); - if( err != paNoError ) goto error; + &stream1, + NULL, /* no input */ + &outputParameters, + SAMPLE_RATE_1, + FRAMES_PER_BUFFER, + paClipOff, /* we won't output out of range samples so don't bother clipping them */ + patestCallback, + &data1 ); + if( err != paNoError ) goto error; err = Pa_StartStream( stream1 ); if( err != paNoError ) goto error; @@ -138,34 +138,34 @@ int main(void) /* Start second stream. **********************/ err = Pa_OpenStream( - &stream2, - NULL, /* no input */ - &outputParameters, - SAMPLE_RATE_2, - FRAMES_PER_BUFFER, - paClipOff, /* we won't output out of range samples so don't bother clipping them */ - patestCallback, - &data2 ); + &stream2, + NULL, /* no input */ + &outputParameters, + SAMPLE_RATE_2, + FRAMES_PER_BUFFER, + paClipOff, /* we won't output out of range samples so don't bother clipping them */ + patestCallback, + &data2 ); if( err != paNoError ) goto error; err = Pa_StartStream( stream2 ); if( err != paNoError ) goto error; Pa_Sleep( 3 * 1000 ); - + err = Pa_StopStream( stream2 ); if( err != paNoError ) goto error; Pa_Sleep( 3 * 1000 ); - + err = Pa_StopStream( stream1 ); if( err != paNoError ) goto error; Pa_CloseStream( stream2 ); Pa_CloseStream( stream1 ); - + Pa_Terminate(); - + printf("NumFrames = %d on stream1, %d on stream2.\n", data1.numFrames, data2.numFrames ); printf("Test finished.\n"); return err; diff --git a/test/patest_underflow.c b/test/patest_underflow.c index 430de62..96216a6 100644 --- a/test/patest_underflow.c +++ b/test/patest_underflow.c @@ -1,9 +1,9 @@ /** @file patest_underflow.c - @ingroup test_src - @brief Simulate an output buffer underflow condition. - Tests whether the stream can be stopped when underflowing buffers. - @author Ross Bencina - @author Phil Burk + @ingroup test_src + @brief Simulate an output buffer underflow condition. + Tests whether the stream can be stopped when underflowing buffers. + @author Ross Bencina + @author Phil Burk */ /* * $Id$ @@ -33,13 +33,13 @@ */ /* - * The text above constitutes the entire PortAudio license; however, + * The text above constitutes the entire PortAudio license; however, * the PortAudio community also makes the following non-binding requests: * * 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. It is also - * requested that these non-binding requests be included along with the + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the * license above. */ @@ -116,7 +116,7 @@ int main(void) data.left_phase = data.right_phase = data.sleepTime = 0; err = Pa_Initialize(); if( err != paNoError ) goto error; - + outputParameters.device = Pa_GetDefaultOutputDevice(); /* default output device */ if (outputParameters.device == paNoDevice) { fprintf(stderr,"Error: No default output device.\n"); diff --git a/test/patest_unplug.c b/test/patest_unplug.c index e546921..0e4486e 100644 --- a/test/patest_unplug.c +++ b/test/patest_unplug.c @@ -1,7 +1,7 @@ /** @file patest_unplug.c - @ingroup test_src - @brief Debug a crash involving unplugging a USB device. - @author Phil Burk http://www.softsynth.com + @ingroup test_src + @brief Debug a crash involving unplugging a USB device. + @author Phil Burk http://www.softsynth.com */ /* * $Id$ @@ -131,10 +131,10 @@ int main(int argc, char **args) printf("Test unplugging a USB device.\n"); if( argc > 1 ) { - inputDevice = outputDevice = atoi( args[1] ); - printf("Using device number %d.\n\n", inputDevice ); + inputDevice = outputDevice = atoi( args[1] ); + printf("Using device number %d.\n\n", inputDevice ); } else { - printf("Using default device.\n\n" ); + printf("Using default device.\n\n" ); } memset(&data, 0, sizeof(data)); diff --git a/test/patest_wire.c b/test/patest_wire.c index a5f3ffc..f04e6be 100644 --- a/test/patest_wire.c +++ b/test/patest_wire.c @@ -1,13 +1,13 @@ /** @file patest_wire.c - @ingroup test_src - @brief Pass input directly to output. + @ingroup test_src + @brief Pass input directly to output. - Note that some HW devices, for example many ISA audio cards - on PCs, do NOT support full duplex! For a PC, you normally need - a PCI based audio card such as the SBLive. + Note that some HW devices, for example many ISA audio cards + on PCs, do NOT support full duplex! For a PC, you normally need + a PCI based audio card such as the SBLive. + + @author Phil Burk http://www.softsynth.com - @author Phil Burk http://www.softsynth.com - While adapting to V19-API, I excluded configs with framesPerCallback=0 because of an assert in file pa_common/pa_process.c. Pieter, Oct 9, 2003. @@ -40,13 +40,13 @@ */ /* - * The text above constitutes the entire PortAudio license; however, + * The text above constitutes the entire PortAudio license; however, * the PortAudio community also makes the following non-binding requests: * * 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. It is also - * requested that these non-binding requests be included along with the + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the * license above. */ @@ -138,7 +138,7 @@ static int wireCallback( const void *inputBuffer, void *outputBuffer, if( (statusFlags & paOutputOverflow) != 0 ) config->numOutputOverflows += 1; if( (statusFlags & paPrimingOutput) != 0 ) config->numPrimingOutputs += 1; config->numCallbacks += 1; - + inChannel=0, outChannel=0; while( !(inDone && outDone) ) { @@ -232,7 +232,7 @@ int main(void) } else if( err != paNoError ) goto error; } - } + } } } } @@ -260,7 +260,7 @@ static PaError TestConfiguration( WireConfig_t *config ) PaError err = paNoError; PaStream *stream; PaStreamParameters inputParameters, outputParameters; - + printf("input %sinterleaved!\n", (config->isInputInterleaved ? " " : "NOT ") ); printf("output %sinterleaved!\n", (config->isOutputInterleaved ? " " : "NOT ") ); printf("input channels = %d\n", config->numInputChannels ); @@ -304,13 +304,13 @@ static PaError TestConfiguration( WireConfig_t *config ) wireCallback, config ); if( err != paNoError ) goto error; - + err = Pa_StartStream( stream ); if( err != paNoError ) goto error; - + printf("Now recording and playing. - Hit ENTER for next configuration, or 'q' to quit.\n"); fflush(stdout); c = getchar(); - + printf("Closing stream.\n"); err = Pa_CloseStream( stream ); if( err != paNoError ) goto error; diff --git a/test/patest_wmme_find_best_latency_params.c b/test/patest_wmme_find_best_latency_params.c index 0149f9e..860cbc6 100644 --- a/test/patest_wmme_find_best_latency_params.c +++ b/test/patest_wmme_find_best_latency_params.c @@ -26,13 +26,13 @@ */ /* - * The text above constitutes the entire PortAudio license; however, + * The text above constitutes the entire PortAudio license; however, * the PortAudio community also makes the following non-binding requests: * * 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. It is also - * requested that these non-binding requests be included along with the + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the * license above. */ @@ -40,7 +40,7 @@ #include #include -#define _WIN32_WINNT 0x0501 /* for GetNativeSystemInfo */ +#define _WIN32_WINNT 0x0501 /* for GetNativeSystemInfo */ #include /* required when using pa_win_wmme.h */ #include /* required when using pa_win_wmme.h */ @@ -107,11 +107,11 @@ static void printWindowsVersionInfo( FILE *fp ) osVersionInfoEx.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); GetVersionEx( &osVersionInfoEx ); - + if( osVersionInfoEx.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS ){ switch( osVersionInfoEx.dwMinorVersion ){ case 0: osName = "Windows 95"; break; - case 10: osName = "Windows 98"; break; // could also be 98SE (I've seen code discriminate based + case 10: osName = "Windows 98"; break; // could also be 98SE (I've seen code discriminate based // on osInfo.Version.Revision.ToString() == "2222A") case 90: osName = "Windows Me"; break; } @@ -137,13 +137,13 @@ static void printWindowsVersionInfo( FILE *fp ) }break; }break; case 6:switch( osVersionInfoEx.dwMinorVersion ){ - case 0: + case 0: if( osVersionInfoEx.wProductType == VER_NT_WORKSTATION ) osName = "Windows Vista"; else osName = "Windows Server 2008"; break; - case 1: + case 1: if( osVersionInfoEx.wProductType == VER_NT_WORKSTATION ) osName = "Windows 7"; else @@ -171,7 +171,7 @@ static void printWindowsVersionInfo( FILE *fp ) } else if(osVersionInfoEx.wProductType == VER_NT_SERVER) { - if(osVersionInfoEx.dwMinorVersion == 0) + if(osVersionInfoEx.dwMinorVersion == 0) { if((osVersionInfoEx.wSuiteMask & VER_SUITE_DATACENTER) == VER_SUITE_DATACENTER) osProductType = "Datacenter Server"; // Windows 2000 Datacenter Server @@ -206,8 +206,8 @@ static void printWindowsVersionInfo( FILE *fp ) fprintf( fp, "OS name and edition: %s %s\n", osName, osProductType ); - fprintf( fp, "OS version: %d.%d.%d %S\n", - osVersionInfoEx.dwMajorVersion, osVersionInfoEx.dwMinorVersion, + fprintf( fp, "OS version: %d.%d.%d %S\n", + osVersionInfoEx.dwMajorVersion, osVersionInfoEx.dwMinorVersion, osVersionInfoEx.dwBuildNumber, osVersionInfoEx.szCSDVersion ); fprintf( fp, "Processor architecture: %s\n", processorArchitecture ); fprintf( fp, "WoW64 process: %s\n", IsWow64() ? "Yes" : "No" ); @@ -230,7 +230,7 @@ static void printTimeAndDate( FILE *fp ) typedef struct { float sine[TABLE_SIZE]; - double phase; + double phase; double phaseIncrement; volatile int fadeIn; volatile int fadeOut; @@ -257,14 +257,14 @@ static int patestCallback( const void *inputBuffer, void *outputBuffer, (void) timeInfo; /* Prevent unused variable warnings. */ (void) statusFlags; (void) inputBuffer; - + for( i=0; isine[(int)data->phase]; data->phase += data->phaseIncrement; if( data->phase >= TABLE_SIZE ){ - data->phase -= TABLE_SIZE; - } + data->phase -= TABLE_SIZE; + } x *= data->amp; if( data->fadeIn ){ @@ -276,11 +276,11 @@ static int patestCallback( const void *inputBuffer, void *outputBuffer, data->amp -= .001; } - for( j = 0; j < CHANNEL_COUNT; ++j ){ + for( j = 0; j < CHANNEL_COUNT; ++j ){ *out++ = x; - } - } - + } + } + if( data->amp > 0 ) return paContinue; else @@ -292,7 +292,7 @@ static int patestCallback( const void *inputBuffer, void *outputBuffer, #define NO 0 -static int playUntilKeyPress( int deviceIndex, float sampleRate, +static int playUntilKeyPress( int deviceIndex, float sampleRate, int framesPerUserBuffer, int framesPerWmmeBuffer, int wmmeBufferCount ) { PaStreamParameters outputParameters; @@ -308,7 +308,7 @@ static int playUntilKeyPress( int deviceIndex, float sampleRate, outputParameters.hostApiSpecificStreamInfo = NULL; wmmeStreamInfo.size = sizeof(PaWinMmeStreamInfo); - wmmeStreamInfo.hostApiType = paMME; + wmmeStreamInfo.hostApiType = paMME; wmmeStreamInfo.version = 1; wmmeStreamInfo.flags = paWinMmeUseLowLevelLatencyParameters | paWinMmeDontThrottleOverloadedProcessingThread; wmmeStreamInfo.framesPerBuffer = framesPerWmmeBuffer; @@ -379,7 +379,7 @@ static void usage( int wmmeHostApiIndex ) } /* - ideas: + ideas: o- could be testing with 80% CPU load o- could test with different channel counts */ @@ -409,15 +409,15 @@ int main(int argc, char* argv[]) if( argc > 5 ) usage(wmmeHostApiIndex); - deviceIndex = wmmeHostApiInfo->defaultOutputDevice; - if( argc >= 2 ){ + deviceIndex = wmmeHostApiInfo->defaultOutputDevice; + if( argc >= 2 ){ deviceIndex = -1; - if( sscanf( argv[1], "%d", &deviceIndex ) != 1 ) + if( sscanf( argv[1], "%d", &deviceIndex ) != 1 ) usage(wmmeHostApiIndex); if( deviceIndex < 0 || deviceIndex >= Pa_GetDeviceCount() || Pa_GetDeviceInfo(deviceIndex)->hostApi != wmmeHostApiIndex ){ usage(wmmeHostApiIndex); } - } + } printf( "Using device id %d (%s)\n", deviceIndex, Pa_GetDeviceInfo(deviceIndex)->name ); @@ -450,14 +450,14 @@ int main(int argc, char* argv[]) data.sine[i] = (float) sin( ((double)i/(double)TABLE_SIZE) * M_PI * 2. ); } - data.phase = 0; + data.phase = 0; resultsFp = fopen( "results.txt", "at" ); fprintf( resultsFp, "*** WMME smallest working output buffer sizes\n" ); printTimeAndDate( resultsFp ); printWindowsVersionInfo( resultsFp ); - + fprintf( resultsFp, "audio device: %s\n", Pa_GetDeviceInfo( deviceIndex )->name ); fflush( resultsFp ); @@ -465,7 +465,7 @@ int main(int argc, char* argv[]) fprintf( resultsFp, "Buffer count, Smallest working buffer size (frames), Smallest working buffering latency (frames), Smallest working buffering latency (Seconds)\n" ); for( wmmeBufferCount = wmmeMinBufferCount; wmmeBufferCount <= wmmeMaxBufferCount; ++wmmeBufferCount ){ - + printf( "Test %d of %d\n", (wmmeBufferCount - wmmeMinBufferCount) + 1, (wmmeMaxBufferCount-wmmeMinBufferCount) + 1 ); printf( "Testing with %d buffers...\n", wmmeBufferCount ); @@ -489,7 +489,7 @@ int main(int argc, char* argv[]) }else{ min = mid + 1; } - + }while( (min <= max) && (testResult == YES || testResult == NO) ); smallestWorkingBufferingLatencyFrames = smallestWorkingBufferSize * (wmmeBufferCount - 1); @@ -503,10 +503,10 @@ int main(int argc, char* argv[]) fprintf( resultsFp, "###\n" ); fclose( resultsFp ); - + Pa_Terminate(); printf("Test finished.\n"); - + return err; error: Pa_Terminate(); diff --git a/test/patest_wmme_low_level_latency_params.c b/test/patest_wmme_low_level_latency_params.c index aa4d71e..1ac0c78 100644 --- a/test/patest_wmme_low_level_latency_params.c +++ b/test/patest_wmme_low_level_latency_params.c @@ -26,13 +26,13 @@ */ /* - * The text above constitutes the entire PortAudio license; however, + * The text above constitutes the entire PortAudio license; however, * the PortAudio community also makes the following non-binding requests: * * 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. It is also - * requested that these non-binding requests be included along with the + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the * license above. */ @@ -65,7 +65,7 @@ typedef struct { float sine[TABLE_SIZE]; - double phase; + double phase; } paTestData; @@ -86,20 +86,20 @@ static int patestCallback( const void *inputBuffer, void *outputBuffer, (void) timeInfo; /* Prevent unused variable warnings. */ (void) statusFlags; (void) inputBuffer; - + for( i=0; isine[(int)data->phase]; data->phase += 20; if( data->phase >= TABLE_SIZE ){ - data->phase -= TABLE_SIZE; - } + data->phase -= TABLE_SIZE; + } - for( j = 0; j < CHANNEL_COUNT; ++j ){ + for( j = 0; j < CHANNEL_COUNT; ++j ){ *out++ = x; - } - } - + } + } + return paContinue; } @@ -119,12 +119,12 @@ int main(int argc, char* argv[]) err = Pa_Initialize(); if( err != paNoError ) goto error; - deviceIndex = Pa_GetHostApiInfo( Pa_HostApiTypeIdToHostApiIndex( paMME ) )->defaultOutputDevice; - if( argc == 2 ){ - sscanf( argv[1], "%d", &deviceIndex ); - } + deviceIndex = Pa_GetHostApiInfo( Pa_HostApiTypeIdToHostApiIndex( paMME ) )->defaultOutputDevice; + if( argc == 2 ){ + sscanf( argv[1], "%d", &deviceIndex ); + } - printf( "using device id %d (%s)\n", deviceIndex, Pa_GetDeviceInfo(deviceIndex)->name ); + printf( "using device id %d (%s)\n", deviceIndex, Pa_GetDeviceInfo(deviceIndex)->name ); /* initialise sinusoidal wavetable */ for( i=0; i> 1; const float framesBy2f = (float) framesBy2 ; - + printf( "PortAudio Test: output silence, followed by one buffer of a ramped sine wave. SR = %d, BufSize = %d\n", SAMPLE_RATE, FRAMES_PER_BUFFER); - + /* initialise sinusoidal wavetable */ for( i=0; i Date: Fri, 22 Jan 2021 00:00:40 +1100 Subject: [PATCH 095/164] Clean up whitespace in qa/ in preparation for .editorconfig. (#418) * Clean up whitespace in qa/ in preparation for .editorconfig. Convert tabs to 4 spaces. Indent by 4 spaces. Strip trailing whitespace. Ensure EOL at EOF. --- qa/loopback/src/audio_analyzer.c | 888 ++++----- qa/loopback/src/audio_analyzer.h | 78 +- qa/loopback/src/biquad_filter.c | 143 +- qa/loopback/src/biquad_filter.h | 24 +- qa/loopback/src/paqa.c | 2442 ++++++++++++------------- qa/loopback/src/paqa_tools.c | 222 +-- qa/loopback/src/paqa_tools.h | 6 +- qa/loopback/src/qa_tools.h | 48 +- qa/loopback/src/test_audio_analyzer.c | 972 +++++----- qa/loopback/src/test_audio_analyzer.h | 6 +- qa/loopback/src/write_wav.c | 104 +- qa/loopback/src/write_wav.h | 14 +- qa/paqa_devs.c | 6 +- qa/paqa_errs.c | 34 +- qa/paqa_latency.c | 80 +- 15 files changed, 2534 insertions(+), 2533 deletions(-) diff --git a/qa/loopback/src/audio_analyzer.c b/qa/loopback/src/audio_analyzer.c index 0a3dbdf..ddbd32c 100644 --- a/qa/loopback/src/audio_analyzer.c +++ b/qa/loopback/src/audio_analyzer.c @@ -26,13 +26,13 @@ */ /* - * The text above constitutes the entire PortAudio license; however, + * The text above constitutes the entire PortAudio license; however, * the PortAudio community also makes the following non-binding requests: * * 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. It is also - * requested that these non-binding requests be included along with the + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the * license above. */ @@ -50,153 +50,153 @@ /*==========================================================================================*/ double PaQa_GetNthFrequency( double baseFrequency, int index ) { - // Use 13 tone equal tempered scale because it does not generate harmonic ratios. - return baseFrequency * pow( 2.0, index / 13.0 ); + // Use 13 tone equal tempered scale because it does not generate harmonic ratios. + return baseFrequency * pow( 2.0, index / 13.0 ); } /*==========================================================================================*/ void PaQa_EraseBuffer( float *buffer, int numFrames, int samplesPerFrame ) { - int i; - int numSamples = numFrames * samplesPerFrame; - for( i=0; iphase = 0.0; - generator->amplitude = amplitude; - generator->frequency = frequency; - generator->phaseIncrement = 2.0 * frequency * MATH_PI / frameRate; + generator->phase = 0.0; + generator->amplitude = amplitude; + generator->frequency = frequency; + generator->phaseIncrement = 2.0 * frequency * MATH_PI / frameRate; } /*==========================================================================================*/ void PaQa_MixSine( PaQaSineGenerator *generator, float *buffer, int numSamples, int stride ) { - int i; - for( i=0; iphase ) * generator->amplitude; - *buffer += value; // Mix with existing value. - buffer += stride; - // Advance phase and wrap around. - generator->phase += generator->phaseIncrement; - if (generator->phase > MATH_TWO_PI) - { - generator->phase -= MATH_TWO_PI; - } - } + int i; + for( i=0; iphase ) * generator->amplitude; + *buffer += value; // Mix with existing value. + buffer += stride; + // Advance phase and wrap around. + generator->phase += generator->phaseIncrement; + if (generator->phase > MATH_TWO_PI) + { + generator->phase -= MATH_TWO_PI; + } + } } /*==========================================================================================*/ void PaQa_GenerateCrackDISABLED( float *buffer, int numSamples, int stride ) { - int i; - int offset = numSamples/2; - for( i=0; ibuffer = (float*)malloc(numBytes); - QA_ASSERT_TRUE( "Allocate recording buffer.", (recording->buffer != NULL) ); - recording->maxFrames = maxFrames; recording->sampleRate = frameRate; - recording->numFrames = 0; - return 0; + int numBytes = maxFrames * sizeof(float); + recording->buffer = (float*)malloc(numBytes); + QA_ASSERT_TRUE( "Allocate recording buffer.", (recording->buffer != NULL) ); + recording->maxFrames = maxFrames; recording->sampleRate = frameRate; + recording->numFrames = 0; + return 0; error: - return 1; + return 1; } /*==========================================================================================*/ void PaQa_TerminateRecording( PaQaRecording *recording ) -{ - if (recording->buffer != NULL) - { - free( recording->buffer ); - recording->buffer = NULL; - } - recording->maxFrames = 0; +{ + if (recording->buffer != NULL) + { + free( recording->buffer ); + recording->buffer = NULL; + } + recording->maxFrames = 0; } /*==========================================================================================*/ int PaQa_WriteRecording( PaQaRecording *recording, float *buffer, int numFrames, int stride ) { - int i; - int framesToWrite; + int i; + int framesToWrite; float *data = &recording->buffer[recording->numFrames]; framesToWrite = numFrames; - if ((framesToWrite + recording->numFrames) > recording->maxFrames) - { - framesToWrite = recording->maxFrames - recording->numFrames; - } - - for( i=0; inumFrames += framesToWrite; - return (recording->numFrames >= recording->maxFrames); + if ((framesToWrite + recording->numFrames) > recording->maxFrames) + { + framesToWrite = recording->maxFrames - recording->numFrames; + } + + for( i=0; inumFrames += framesToWrite; + return (recording->numFrames >= recording->maxFrames); } /*==========================================================================================*/ int PaQa_WriteSilence( PaQaRecording *recording, int numFrames ) { - int i; - int framesToRecord; + int i; + int framesToRecord; float *data = &recording->buffer[recording->numFrames]; framesToRecord = numFrames; - if ((framesToRecord + recording->numFrames) > recording->maxFrames) - { - framesToRecord = recording->maxFrames - recording->numFrames; - } - - for( i=0; inumFrames += framesToRecord; - return (recording->numFrames >= recording->maxFrames); + if ((framesToRecord + recording->numFrames) > recording->maxFrames) + { + framesToRecord = recording->maxFrames - recording->numFrames; + } + + for( i=0; inumFrames += framesToRecord; + return (recording->numFrames >= recording->maxFrames); } /*==========================================================================================*/ int PaQa_RecordFreeze( PaQaRecording *recording, int numFrames ) { - int i; - int framesToRecord; + int i; + int framesToRecord; float *data = &recording->buffer[recording->numFrames]; framesToRecord = numFrames; - if ((framesToRecord + recording->numFrames) > recording->maxFrames) - { - framesToRecord = recording->maxFrames - recording->numFrames; - } - - for( i=0; inumFrames += framesToRecord; - return (recording->numFrames >= recording->maxFrames); + if ((framesToRecord + recording->numFrames) > recording->maxFrames) + { + framesToRecord = recording->maxFrames - recording->numFrames; + } + + for( i=0; inumFrames += framesToRecord; + return (recording->numFrames >= recording->maxFrames); } /*==========================================================================================*/ @@ -209,37 +209,37 @@ int PaQa_SaveRecordingToWaveFile( PaQaRecording *recording, const char *filename int result = 0; #define NUM_SAMPLES (200) short data[NUM_SAMPLES]; - const int samplesPerFrame = 1; + const int samplesPerFrame = 1; int numLeft = recording->numFrames; - float *buffer = &recording->buffer[0]; + float *buffer = &recording->buffer[0]; result = Audio_WAV_OpenWriter( &writer, filename, recording->sampleRate, samplesPerFrame ); if( result < 0 ) goto error; - - while( numLeft > 0 ) + + while( numLeft > 0 ) { - int i; + int i; int numToSave = (numLeft > NUM_SAMPLES) ? NUM_SAMPLES : numLeft; - // Convert double samples to shorts. - for( i=0; i 32767 ) ival = 32767; - else if( ival < -32768 ) ival = -32768; - data[i] = ival; - } - result = Audio_WAV_WriteShorts( &writer, data, numToSave ); + // Convert double samples to shorts. + for( i=0; i 32767 ) ival = 32767; + else if( ival < -32768 ) ival = -32768; + data[i] = ival; + } + result = Audio_WAV_WriteShorts( &writer, data, numToSave ); if( result < 0 ) goto error; - numLeft -= numToSave; + numLeft -= numToSave; } - + result = Audio_WAV_CloseWriter( &writer ); if( result < 0 ) goto error; - + return 0; - + error: printf("ERROR: result = %d\n", result ); return result; @@ -250,29 +250,29 @@ error: double PaQa_MeasureCrossingSlope( float *buffer, int numFrames ) { - int i; - double slopeTotal = 0.0; - int slopeCount = 0; - float previous; - double averageSlope = 0.0; - - previous = buffer[0]; - for( i=1; i 0.0) && (previous < 0.0) ) - { - double delta = current - previous; - slopeTotal += delta; - slopeCount += 1; - } - previous = current; - } - if( slopeCount > 0 ) - { - averageSlope = slopeTotal / slopeCount; - } - return averageSlope; + int i; + double slopeTotal = 0.0; + int slopeCount = 0; + float previous; + double averageSlope = 0.0; + + previous = buffer[0]; + for( i=1; i 0.0) && (previous < 0.0) ) + { + double delta = current - previous; + slopeTotal += delta; + slopeCount += 1; + } + previous = current; + } + if( slopeCount > 0 ) + { + averageSlope = slopeTotal / slopeCount; + } + return averageSlope; } /*==========================================================================================*/ @@ -285,63 +285,63 @@ double PaQa_MeasureCrossingSlope( float *buffer, int numFrames ) * */ double PaQa_MeasureSineAmplitudeBySlope( PaQaRecording *recording, - double frequency, double frameRate, - int startFrame, int numFrames ) + double frequency, double frameRate, + int startFrame, int numFrames ) { - float *buffer = &recording->buffer[startFrame]; - double measuredSlope = PaQa_MeasureCrossingSlope( buffer, numFrames ); - double unitySlope = sin( MATH_TWO_PI * frequency / frameRate ); - double estimatedAmplitude = measuredSlope / unitySlope; - return estimatedAmplitude; + float *buffer = &recording->buffer[startFrame]; + double measuredSlope = PaQa_MeasureCrossingSlope( buffer, numFrames ); + double unitySlope = sin( MATH_TWO_PI * frequency / frameRate ); + double estimatedAmplitude = measuredSlope / unitySlope; + return estimatedAmplitude; } /*==========================================================================================*/ double PaQa_CorrelateSine( PaQaRecording *recording, double frequency, double frameRate, - int startFrame, int numFrames, double *phasePtr ) + int startFrame, int numFrames, double *phasePtr ) { - double magnitude = 0.0; + double magnitude = 0.0; int numLeft = numFrames; - double phase = 0.0; - double phaseIncrement = 2.0 * MATH_PI * frequency / frameRate; - double sinAccumulator = 0.0; - double cosAccumulator = 0.0; - float *data = &recording->buffer[startFrame]; + double phase = 0.0; + double phaseIncrement = 2.0 * MATH_PI * frequency / frameRate; + double sinAccumulator = 0.0; + double cosAccumulator = 0.0; + float *data = &recording->buffer[startFrame]; QA_ASSERT_TRUE( "startFrame out of bounds", (startFrame < recording->numFrames) ); - QA_ASSERT_TRUE( "numFrames out of bounds", ((startFrame+numFrames) <= recording->numFrames) ); + QA_ASSERT_TRUE( "numFrames out of bounds", ((startFrame+numFrames) <= recording->numFrames) ); - while( numLeft > 0 ) - { - double sample = (double) *data++; - sinAccumulator += sample * sin( phase ); - cosAccumulator += sample * cos( phase ); - phase += phaseIncrement; - if (phase > MATH_TWO_PI) - { - phase -= MATH_TWO_PI; - } - numLeft -= 1; - } - sinAccumulator = sinAccumulator / numFrames; - cosAccumulator = cosAccumulator / numFrames; - // TODO Why do I have to multiply by 2.0? Need it to make result come out right. - magnitude = 2.0 * sqrt( (sinAccumulator * sinAccumulator) + (cosAccumulator * cosAccumulator )); - if( phasePtr != NULL ) - { - double phase = atan2( cosAccumulator, sinAccumulator ); - *phasePtr = phase; - } - return magnitude; + while( numLeft > 0 ) + { + double sample = (double) *data++; + sinAccumulator += sample * sin( phase ); + cosAccumulator += sample * cos( phase ); + phase += phaseIncrement; + if (phase > MATH_TWO_PI) + { + phase -= MATH_TWO_PI; + } + numLeft -= 1; + } + sinAccumulator = sinAccumulator / numFrames; + cosAccumulator = cosAccumulator / numFrames; + // TODO Why do I have to multiply by 2.0? Need it to make result come out right. + magnitude = 2.0 * sqrt( (sinAccumulator * sinAccumulator) + (cosAccumulator * cosAccumulator )); + if( phasePtr != NULL ) + { + double phase = atan2( cosAccumulator, sinAccumulator ); + *phasePtr = phase; + } + return magnitude; error: - return -1.0; + return -1.0; } /*==========================================================================================*/ void PaQa_FilterRecording( PaQaRecording *input, PaQaRecording *output, BiquadFilter *filter ) { - int numToFilter = (input->numFrames > output->maxFrames) ? output->maxFrames : input->numFrames; - BiquadFilter_Filter( filter, &input->buffer[0], &output->buffer[0], numToFilter ); - output->numFrames = numToFilter; + int numToFilter = (input->numFrames > output->maxFrames) ? output->maxFrames : input->numFrames; + BiquadFilter_Filter( filter, &input->buffer[0], &output->buffer[0], numToFilter ); + output->numFrames = numToFilter; } /*==========================================================================================*/ @@ -351,92 +351,92 @@ void PaQa_FilterRecording( PaQaRecording *input, PaQaRecording *output, BiquadFi */ double PaQa_FindFirstMatch( PaQaRecording *recording, float *buffer, int numFrames, double threshold ) { - int ic,is; - // How many buffers will fit in the recording? - int maxCorrelations = recording->numFrames - numFrames; - double maxSum = 0.0; - int peakIndex = -1; - double inverseMaxSum = 0.0; - int inversePeakIndex = -1; - double location = -1.0; + int ic,is; + // How many buffers will fit in the recording? + int maxCorrelations = recording->numFrames - numFrames; + double maxSum = 0.0; + int peakIndex = -1; + double inverseMaxSum = 0.0; + int inversePeakIndex = -1; + double location = -1.0; QA_ASSERT_TRUE( "numFrames out of bounds", (numFrames < recording->numFrames) ); - for( ic=0; icbuffer[ ic ]; - for( is=0; is maxSum) ) - { - maxSum = sum; - peakIndex = ic; - } - if( ((-sum) > inverseMaxSum) ) - { - inverseMaxSum = -sum; - inversePeakIndex = ic; - } - pastPeak = (maxSum > threshold) && (sum < 0.5*maxSum); - inversePastPeak = (inverseMaxSum > threshold) && ((-sum) < 0.5*inverseMaxSum); - //printf("PaQa_FindFirstMatch: ic = %4d, sum = %8f, maxSum = %8f, inverseMaxSum = %8f\n", ic, sum, maxSum, inverseMaxSum ); - if( pastPeak && inversePastPeak ) - { - if( maxSum > inverseMaxSum ) - { - location = peakIndex; - } - else - { - location = inversePeakIndex; - } - break; - } - - } - //printf("PaQa_FindFirstMatch: location = %4d\n", (int)location ); - return location; + for( ic=0; icbuffer[ ic ]; + for( is=0; is maxSum) ) + { + maxSum = sum; + peakIndex = ic; + } + if( ((-sum) > inverseMaxSum) ) + { + inverseMaxSum = -sum; + inversePeakIndex = ic; + } + pastPeak = (maxSum > threshold) && (sum < 0.5*maxSum); + inversePastPeak = (inverseMaxSum > threshold) && ((-sum) < 0.5*inverseMaxSum); + //printf("PaQa_FindFirstMatch: ic = %4d, sum = %8f, maxSum = %8f, inverseMaxSum = %8f\n", ic, sum, maxSum, inverseMaxSum ); + if( pastPeak && inversePastPeak ) + { + if( maxSum > inverseMaxSum ) + { + location = peakIndex; + } + else + { + location = inversePeakIndex; + } + break; + } + + } + //printf("PaQa_FindFirstMatch: location = %4d\n", (int)location ); + return location; error: - return -1.0; + return -1.0; } /*==========================================================================================*/ // Measure the area under the curve by summing absolute value of each value. double PaQa_MeasureArea( float *buffer, int numFrames, int stride ) { - int is; - double area = 0.0; - for( is=0; isnumFrames) ); + QA_ASSERT_TRUE( "startAt+numFrames out of bounds", ((startAt+numFrames) < recording->numFrames) ); { - double recordedArea = PaQa_MeasureArea( &recording->buffer[startAt], numFrames, 1 ); - double bufferArea = PaQa_MeasureArea( buffer, numFrames, 1 ); - if( bufferArea == 0.0 ) return 100000000.0; - return recordedArea / bufferArea; + double recordedArea = PaQa_MeasureArea( &recording->buffer[startAt], numFrames, 1 ); + double bufferArea = PaQa_MeasureArea( buffer, numFrames, 1 ); + if( bufferArea == 0.0 ) return 100000000.0; + return recordedArea / bufferArea; } error: - return -1.0; + return -1.0; } /*==========================================================================================*/ double PaQa_ComputePhaseDifference( double phase1, double phase2 ) { - double delta = phase1 - phase2; - while( delta > MATH_PI ) - { - delta -= MATH_TWO_PI; - } - while( delta < -MATH_PI ) - { - delta += MATH_TWO_PI; - } - return delta; + double delta = phase1 - phase2; + while( delta > MATH_PI ) + { + delta -= MATH_TWO_PI; + } + while( delta < -MATH_PI ) + { + delta += MATH_TWO_PI; + } + return delta; } /*==========================================================================================*/ int PaQa_MeasureLatency( PaQaRecording *recording, PaQaTestTone *testTone, PaQaAnalysisResult *analysisResult ) { - double threshold; - PaQaSineGenerator generator; + double threshold; + PaQaSineGenerator generator; #define MAX_BUFFER_SIZE 2048 - float buffer[MAX_BUFFER_SIZE]; - double period = testTone->sampleRate / testTone->frequency; - int cycleSize = (int) (period + 0.5); - //printf("PaQa_AnalyseRecording: frequency = %8f, frameRate = %8f, period = %8f, cycleSize = %8d\n", - // testTone->frequency, testTone->sampleRate, period, cycleSize ); - analysisResult->latency = -1; - analysisResult->valid = (0); - - // Set up generator to find matching first cycle. - QA_ASSERT_TRUE( "cycleSize out of bounds", (cycleSize < MAX_BUFFER_SIZE) ); - PaQa_SetupSineGenerator( &generator, testTone->frequency, testTone->amplitude, testTone->sampleRate ); - PaQa_EraseBuffer( buffer, cycleSize, testTone->samplesPerFrame ); - PaQa_MixSine( &generator, buffer, cycleSize, testTone->samplesPerFrame ); + float buffer[MAX_BUFFER_SIZE]; + double period = testTone->sampleRate / testTone->frequency; + int cycleSize = (int) (period + 0.5); + //printf("PaQa_AnalyseRecording: frequency = %8f, frameRate = %8f, period = %8f, cycleSize = %8d\n", + // testTone->frequency, testTone->sampleRate, period, cycleSize ); + analysisResult->latency = -1; + analysisResult->valid = (0); - threshold = cycleSize * 0.02; - analysisResult->latency = PaQa_FindFirstMatch( recording, buffer, cycleSize, threshold ); - QA_ASSERT_TRUE( "Could not find the start of the signal.", (analysisResult->latency >= 0) ); - analysisResult->amplitudeRatio = PaQa_CompareAmplitudes( recording, analysisResult->latency, buffer, cycleSize ); - return 0; + // Set up generator to find matching first cycle. + QA_ASSERT_TRUE( "cycleSize out of bounds", (cycleSize < MAX_BUFFER_SIZE) ); + PaQa_SetupSineGenerator( &generator, testTone->frequency, testTone->amplitude, testTone->sampleRate ); + PaQa_EraseBuffer( buffer, cycleSize, testTone->samplesPerFrame ); + PaQa_MixSine( &generator, buffer, cycleSize, testTone->samplesPerFrame ); + + threshold = cycleSize * 0.02; + analysisResult->latency = PaQa_FindFirstMatch( recording, buffer, cycleSize, threshold ); + QA_ASSERT_TRUE( "Could not find the start of the signal.", (analysisResult->latency >= 0) ); + analysisResult->amplitudeRatio = PaQa_CompareAmplitudes( recording, analysisResult->latency, buffer, cycleSize ); + return 0; error: - return -1; + return -1; } /*==========================================================================================*/ // Apply cosine squared window. void PaQa_FadeInRecording( PaQaRecording *recording, int startFrame, int count ) { - int is; - double phase = 0.5 * MATH_PI; - // Advance a quarter wave - double phaseIncrement = 0.25 * 2.0 * MATH_PI / count; - + int is; + double phase = 0.5 * MATH_PI; + // Advance a quarter wave + double phaseIncrement = 0.25 * 2.0 * MATH_PI / count; + assert( startFrame >= 0 ); - assert( count > 0 ); - + assert( count > 0 ); + /* Zero out initial part of the recording. */ - for( is=0; isbuffer[ is ] = 0.0f; } /* Fade in where signal begins. */ for( is=0; isbuffer[ is + startFrame ]; - float y = x * w; - //printf("FADE %d : w=%f, x=%f, y=%f\n", is, w, x, y ); - recording->buffer[ is + startFrame ] = y; + double c = cos( phase ); + double w = c * c; + float x = recording->buffer[ is + startFrame ]; + float y = x * w; + //printf("FADE %d : w=%f, x=%f, y=%f\n", is, w, x, y ); + recording->buffer[ is + startFrame ] = y; phase += phaseIncrement; - } + } } @@ -539,146 +539,146 @@ void PaQa_FadeInRecording( PaQaRecording *recording, int startFrame, int count ) /** Apply notch filter and high pass filter then detect remaining energy. */ int PaQa_DetectPop( PaQaRecording *recording, PaQaTestTone *testTone, PaQaAnalysisResult *analysisResult ) -{ +{ int result = 0; - int i; + int i; double maxAmplitude; - int maxPosition; + int maxPosition; + + PaQaRecording notchOutput = { 0 }; + BiquadFilter notchFilter; + + PaQaRecording hipassOutput = { 0 }; + BiquadFilter hipassFilter; + + int frameRate = (int) recording->sampleRate; + + analysisResult->popPosition = -1; + analysisResult->popAmplitude = 0.0; + + result = PaQa_InitializeRecording( ¬chOutput, recording->numFrames, frameRate ); + QA_ASSERT_EQUALS( "PaQa_InitializeRecording failed", 0, result ); + + result = PaQa_InitializeRecording( &hipassOutput, recording->numFrames, frameRate ); + QA_ASSERT_EQUALS( "PaQa_InitializeRecording failed", 0, result ); + + // Use notch filter to remove test tone. + BiquadFilter_SetupNotch( ¬chFilter, testTone->frequency / frameRate, 0.5 ); + PaQa_FilterRecording( recording, ¬chOutput, ¬chFilter ); + //result = PaQa_SaveRecordingToWaveFile( ¬chOutput, "notch_output.wav" ); + //QA_ASSERT_EQUALS( "PaQa_SaveRecordingToWaveFile failed", 0, result ); + + // Apply fade-in window. + PaQa_FadeInRecording( ¬chOutput, (int) analysisResult->latency, 500 ); + + // Use high pass to accentuate the edges of a pop. At higher frequency! + BiquadFilter_SetupHighPass( &hipassFilter, 2.0 * testTone->frequency / frameRate, 0.5 ); + PaQa_FilterRecording( ¬chOutput, &hipassOutput, &hipassFilter ); + //result = PaQa_SaveRecordingToWaveFile( &hipassOutput, "hipass_output.wav" ); + //QA_ASSERT_EQUALS( "PaQa_SaveRecordingToWaveFile failed", 0, result ); + + // Scan remaining signal looking for peak. + maxAmplitude = 0.0; + maxPosition = -1; + for( i=(int) analysisResult->latency; i maxAmplitude ) + { + maxAmplitude = mag; + maxPosition = i; + } + } + + if( maxAmplitude > PAQA_POP_THRESHOLD ) + { + analysisResult->popPosition = maxPosition; + analysisResult->popAmplitude = maxAmplitude; + } + + PaQa_TerminateRecording( ¬chOutput ); + PaQa_TerminateRecording( &hipassOutput ); + return 0; - PaQaRecording notchOutput = { 0 }; - BiquadFilter notchFilter; - - PaQaRecording hipassOutput = { 0 }; - BiquadFilter hipassFilter; - - int frameRate = (int) recording->sampleRate; - - analysisResult->popPosition = -1; - analysisResult->popAmplitude = 0.0; - - result = PaQa_InitializeRecording( ¬chOutput, recording->numFrames, frameRate ); - QA_ASSERT_EQUALS( "PaQa_InitializeRecording failed", 0, result ); - - result = PaQa_InitializeRecording( &hipassOutput, recording->numFrames, frameRate ); - QA_ASSERT_EQUALS( "PaQa_InitializeRecording failed", 0, result ); - - // Use notch filter to remove test tone. - BiquadFilter_SetupNotch( ¬chFilter, testTone->frequency / frameRate, 0.5 ); - PaQa_FilterRecording( recording, ¬chOutput, ¬chFilter ); - //result = PaQa_SaveRecordingToWaveFile( ¬chOutput, "notch_output.wav" ); - //QA_ASSERT_EQUALS( "PaQa_SaveRecordingToWaveFile failed", 0, result ); - - // Apply fade-in window. - PaQa_FadeInRecording( ¬chOutput, (int) analysisResult->latency, 500 ); - - // Use high pass to accentuate the edges of a pop. At higher frequency! - BiquadFilter_SetupHighPass( &hipassFilter, 2.0 * testTone->frequency / frameRate, 0.5 ); - PaQa_FilterRecording( ¬chOutput, &hipassOutput, &hipassFilter ); - //result = PaQa_SaveRecordingToWaveFile( &hipassOutput, "hipass_output.wav" ); - //QA_ASSERT_EQUALS( "PaQa_SaveRecordingToWaveFile failed", 0, result ); - - // Scan remaining signal looking for peak. - maxAmplitude = 0.0; - maxPosition = -1; - for( i=(int) analysisResult->latency; i maxAmplitude ) - { - maxAmplitude = mag; - maxPosition = i; - } - } - - if( maxAmplitude > PAQA_POP_THRESHOLD ) - { - analysisResult->popPosition = maxPosition; - analysisResult->popAmplitude = maxAmplitude; - } - - PaQa_TerminateRecording( ¬chOutput ); - PaQa_TerminateRecording( &hipassOutput ); - return 0; - error: - PaQa_TerminateRecording( ¬chOutput ); - PaQa_TerminateRecording( &hipassOutput ); - return -1; + PaQa_TerminateRecording( ¬chOutput ); + PaQa_TerminateRecording( &hipassOutput ); + return -1; } /*==========================================================================================*/ int PaQa_DetectPhaseError( PaQaRecording *recording, PaQaTestTone *testTone, PaQaAnalysisResult *analysisResult ) -{ - int i; - double period = testTone->sampleRate / testTone->frequency; - int cycleSize = (int) (period + 0.5); - - double maxAddedFrames = 0.0; - double maxDroppedFrames = 0.0; - - double previousPhase = 0.0; - double previousFrameError = 0; - int loopCount = 0; - int skip = cycleSize; - int windowSize = cycleSize; +{ + int i; + double period = testTone->sampleRate / testTone->frequency; + int cycleSize = (int) (period + 0.5); + + double maxAddedFrames = 0.0; + double maxDroppedFrames = 0.0; + + double previousPhase = 0.0; + double previousFrameError = 0; + int loopCount = 0; + int skip = cycleSize; + int windowSize = cycleSize; // Scan recording starting with first cycle, looking for phase errors. - analysisResult->numDroppedFrames = 0.0; - analysisResult->numAddedFrames = 0.0; - analysisResult->droppedFramesPosition = -1.0; - analysisResult->addedFramesPosition = -1.0; - - for( i=analysisResult->latency; i<(recording->numFrames - windowSize); i += skip ) - { - double expectedPhase = previousPhase + (skip * MATH_TWO_PI / period); - double expectedPhaseIncrement = PaQa_ComputePhaseDifference( expectedPhase, previousPhase ); + analysisResult->numDroppedFrames = 0.0; + analysisResult->numAddedFrames = 0.0; + analysisResult->droppedFramesPosition = -1.0; + analysisResult->addedFramesPosition = -1.0; - double phase = 666.0; - double mag = PaQa_CorrelateSine( recording, testTone->frequency, testTone->sampleRate, i, windowSize, &phase ); - if( (loopCount > 1) && (mag > 0.0) ) - { - double phaseDelta = PaQa_ComputePhaseDifference( phase, previousPhase ); - double phaseError = PaQa_ComputePhaseDifference( phaseDelta, expectedPhaseIncrement ); - // Convert phaseError to equivalent number of frames. - double frameError = period * phaseError / MATH_TWO_PI; - double consecutiveFrameError = frameError + previousFrameError; -// if( fabs(frameError) > 0.01 ) -// { -// printf("FFFFFFFFFFFFF frameError = %f, at %d\n", frameError, i ); -// } - if( consecutiveFrameError > 0.8 ) - { - double droppedFrames = consecutiveFrameError; - if (droppedFrames > (maxDroppedFrames * 1.001)) - { - analysisResult->numDroppedFrames = droppedFrames; - analysisResult->droppedFramesPosition = i + (windowSize/2); - maxDroppedFrames = droppedFrames; - } - } - else if( consecutiveFrameError < -0.8 ) - { - double addedFrames = 0 - consecutiveFrameError; - if (addedFrames > (maxAddedFrames * 1.001)) - { - analysisResult->numAddedFrames = addedFrames; - analysisResult->addedFramesPosition = i + (windowSize/2); - maxAddedFrames = addedFrames; - } - } - previousFrameError = frameError; - + for( i=analysisResult->latency; i<(recording->numFrames - windowSize); i += skip ) + { + double expectedPhase = previousPhase + (skip * MATH_TWO_PI / period); + double expectedPhaseIncrement = PaQa_ComputePhaseDifference( expectedPhase, previousPhase ); - //if( i<8000 ) - //{ - // printf("%d: phase = %8f, expected = %8f, delta = %8f, frameError = %8f\n", i, phase, expectedPhaseIncrement, phaseDelta, frameError ); - //} - } - previousPhase = phase; - loopCount += 1; - } - return 0; + double phase = 666.0; + double mag = PaQa_CorrelateSine( recording, testTone->frequency, testTone->sampleRate, i, windowSize, &phase ); + if( (loopCount > 1) && (mag > 0.0) ) + { + double phaseDelta = PaQa_ComputePhaseDifference( phase, previousPhase ); + double phaseError = PaQa_ComputePhaseDifference( phaseDelta, expectedPhaseIncrement ); + // Convert phaseError to equivalent number of frames. + double frameError = period * phaseError / MATH_TWO_PI; + double consecutiveFrameError = frameError + previousFrameError; +// if( fabs(frameError) > 0.01 ) +// { +// printf("FFFFFFFFFFFFF frameError = %f, at %d\n", frameError, i ); +// } + if( consecutiveFrameError > 0.8 ) + { + double droppedFrames = consecutiveFrameError; + if (droppedFrames > (maxDroppedFrames * 1.001)) + { + analysisResult->numDroppedFrames = droppedFrames; + analysisResult->droppedFramesPosition = i + (windowSize/2); + maxDroppedFrames = droppedFrames; + } + } + else if( consecutiveFrameError < -0.8 ) + { + double addedFrames = 0 - consecutiveFrameError; + if (addedFrames > (maxAddedFrames * 1.001)) + { + analysisResult->numAddedFrames = addedFrames; + analysisResult->addedFramesPosition = i + (windowSize/2); + maxAddedFrames = addedFrames; + } + } + previousFrameError = frameError; + + + //if( i<8000 ) + //{ + // printf("%d: phase = %8f, expected = %8f, delta = %8f, frameError = %8f\n", i, phase, expectedPhaseIncrement, phaseDelta, frameError ); + //} + } + previousPhase = phase; + loopCount += 1; + } + return 0; } /*==========================================================================================*/ @@ -686,22 +686,22 @@ int PaQa_AnalyseRecording( PaQaRecording *recording, PaQaTestTone *testTone, PaQ { int result = 0; - memset( analysisResult, 0, sizeof(PaQaAnalysisResult) ); - result = PaQa_MeasureLatency( recording, testTone, analysisResult ); + memset( analysisResult, 0, sizeof(PaQaAnalysisResult) ); + result = PaQa_MeasureLatency( recording, testTone, analysisResult ); QA_ASSERT_EQUALS( "latency measurement", 0, result ); - - if( (analysisResult->latency >= 0) && (analysisResult->amplitudeRatio > 0.1) ) - { - analysisResult->valid = (1); - - result = PaQa_DetectPop( recording, testTone, analysisResult ); - QA_ASSERT_EQUALS( "detect pop", 0, result ); - result = PaQa_DetectPhaseError( recording, testTone, analysisResult ); - QA_ASSERT_EQUALS( "detect phase error", 0, result ); - } - return 0; + if( (analysisResult->latency >= 0) && (analysisResult->amplitudeRatio > 0.1) ) + { + analysisResult->valid = (1); + + result = PaQa_DetectPop( recording, testTone, analysisResult ); + QA_ASSERT_EQUALS( "detect pop", 0, result ); + + result = PaQa_DetectPhaseError( recording, testTone, analysisResult ); + QA_ASSERT_EQUALS( "detect phase error", 0, result ); + } + return 0; error: - return -1; + return -1; } diff --git a/qa/loopback/src/audio_analyzer.h b/qa/loopback/src/audio_analyzer.h index c98acbb..8d9f1ee 100644 --- a/qa/loopback/src/audio_analyzer.h +++ b/qa/loopback/src/audio_analyzer.h @@ -26,13 +26,13 @@ */ /* - * The text above constitutes the entire PortAudio license; however, + * The text above constitutes the entire PortAudio license; however, * the PortAudio community also makes the following non-binding requests: * * 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. It is also - * requested that these non-binding requests be included along with the + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the * license above. */ @@ -46,44 +46,44 @@ typedef struct PaQaSineGenerator_s { - double phase; - double phaseIncrement; - double frequency; - double amplitude; + double phase; + double phaseIncrement; + double frequency; + double amplitude; } PaQaSineGenerator; -/** Container for a monophonic audio sample in memory. */ +/** Container for a monophonic audio sample in memory. */ typedef struct PaQaRecording_s { - /** Maximum number of frames that can fit in the allocated buffer. */ - int maxFrames; - float *buffer; - /** Actual number of valid frames in the buffer. */ - int numFrames; - int sampleRate; + /** Maximum number of frames that can fit in the allocated buffer. */ + int maxFrames; + float *buffer; + /** Actual number of valid frames in the buffer. */ + int numFrames; + int sampleRate; } PaQaRecording; typedef struct PaQaTestTone_s { - int samplesPerFrame; - int startDelay; - double sampleRate; - double frequency; - double amplitude; + int samplesPerFrame; + int startDelay; + double sampleRate; + double frequency; + double amplitude; } PaQaTestTone; typedef struct PaQaAnalysisResult_s { - int valid; - /** Latency in samples from output to input. */ - double latency; - double amplitudeRatio; - double popAmplitude; - double popPosition; - double numDroppedFrames; - double droppedFramesPosition; - double numAddedFrames; - double addedFramesPosition; + int valid; + /** Latency in samples from output to input. */ + double latency; + double amplitudeRatio; + double popAmplitude; + double popPosition; + double numDroppedFrames; + double droppedFramesPosition; + double numAddedFrames; + double addedFramesPosition; } PaQaAnalysisResult; @@ -101,7 +101,7 @@ void PaQa_EraseBuffer( float *buffer, int numFrames, int samplesPerFrame ); void PaQa_MixSine( PaQaSineGenerator *generator, float *buffer, int numSamples, int stride ); void PaQa_WriteSine( float *buffer, int numSamples, int stride, - double frequency, double amplitude ); + double frequency, double amplitude ); /** * Generate a signal with a sharp edge in the middle that can be recognized despite some phase shift. @@ -133,12 +133,12 @@ void PaQa_SetupSineGenerator( PaQaSineGenerator *generator, double frequency, do * Allocate memory for containing a mono audio signal. Set up recording for writing. */ int PaQa_InitializeRecording( PaQaRecording *recording, int maxSamples, int sampleRate ); - + /** * Free memory allocated by PaQa_InitializeRecording. */ void PaQa_TerminateRecording( PaQaRecording *recording ); - + /** * Apply a biquad filter to the audio from the input recording and write it to the output recording. */ @@ -146,29 +146,29 @@ void PaQa_FilterRecording( PaQaRecording *input, PaQaRecording *output, BiquadFi int PaQa_SaveRecordingToWaveFile( PaQaRecording *recording, const char *filename ); - + /** * @param stride is the spacing of samples to skip in the input buffer. To use every samples pass 1. To use every other sample pass 2. */ int PaQa_WriteRecording( PaQaRecording *recording, float *buffer, int numSamples, int stride ); - + /** Write zeros into a recording. */ int PaQa_WriteSilence( PaQaRecording *recording, int numSamples ); - + int PaQa_RecordFreeze( PaQaRecording *recording, int numSamples ); double PaQa_CorrelateSine( PaQaRecording *recording, double frequency, double frameRate, - int startFrame, int numSamples, double *phasePtr ); + int startFrame, int numSamples, double *phasePtr ); double PaQa_FindFirstMatch( PaQaRecording *recording, float *buffer, int numSamples, double tolerance ); -/** +/** * Estimate the original amplitude of a clipped sine wave by measuring * its average slope at the zero crossings. */ double PaQa_MeasureSineAmplitudeBySlope( PaQaRecording *recording, - double frequency, double frameRate, - int startFrame, int numFrames ); + double frequency, double frameRate, + int startFrame, int numFrames ); double PaQa_MeasureRootMeanSquare( float *buffer, int numFrames ); diff --git a/qa/loopback/src/biquad_filter.c b/qa/loopback/src/biquad_filter.c index 1bc4a23..1715fa3 100755 --- a/qa/loopback/src/biquad_filter.c +++ b/qa/loopback/src/biquad_filter.c @@ -4,9 +4,10 @@ #include "biquad_filter.h" /** - * Unit_BiquadFilter implements a second order IIR filter. - Here is the equation that we use for this filter: - y(n) = a0*x(n) + a1*x(n-1) + a2*x(n-2) - b1*y(n-1) - b2*y(n-2) + * Unit_BiquadFilter implements a second order IIR filter. + * + * Here is the equation that we use for this filter: + * y(n) = a0*x(n) + a1*x(n-1) + a2*x(n-2) - b1*y(n-1) - b2*y(n-2) * * @author (C) 2002 Phil Burk, SoftSynth.com, All Rights Reserved */ @@ -17,17 +18,17 @@ */ static void BiquadFilter_CalculateCommon( BiquadFilter *filter, double ratio, double Q ) { - double omega; - - memset( filter, 0, sizeof(BiquadFilter) ); + double omega; + + memset( filter, 0, sizeof(BiquadFilter) ); /* Don't let frequency get too close to Nyquist or filter will blow up. */ - if( ratio >= 0.499 ) ratio = 0.499; - omega = 2.0 * (double)FILTER_PI * ratio; + if( ratio >= 0.499 ) ratio = 0.499; + omega = 2.0 * (double)FILTER_PI * ratio; - filter->cos_omega = (double) cos( omega ); - filter->sin_omega = (double) sin( omega ); - filter->alpha = filter->sin_omega / (2.0 * Q); + filter->cos_omega = (double) cos( omega ); + filter->sin_omega = (double) sin( omega ); + filter->alpha = filter->sin_omega / (2.0 * Q); } /********************************************************************************* @@ -35,21 +36,21 @@ static void BiquadFilter_CalculateCommon( BiquadFilter *filter, double ratio, do */ void BiquadFilter_SetupHighPass( BiquadFilter *filter, double ratio, double Q ) { - double scalar, opc; - - if( ratio < BIQUAD_MIN_RATIO ) ratio = BIQUAD_MIN_RATIO; - if( Q < BIQUAD_MIN_Q ) Q = BIQUAD_MIN_Q; - - BiquadFilter_CalculateCommon( filter, ratio, Q ); - - scalar = 1.0 / (1.0 + filter->alpha); - opc = (1.0 + filter->cos_omega); - - filter->a0 = opc * 0.5 * scalar; - filter->a1 = - opc * scalar; + double scalar, opc; + + if( ratio < BIQUAD_MIN_RATIO ) ratio = BIQUAD_MIN_RATIO; + if( Q < BIQUAD_MIN_Q ) Q = BIQUAD_MIN_Q; + + BiquadFilter_CalculateCommon( filter, ratio, Q ); + + scalar = 1.0 / (1.0 + filter->alpha); + opc = (1.0 + filter->cos_omega); + + filter->a0 = opc * 0.5 * scalar; + filter->a1 = - opc * scalar; filter->a2 = filter->a0; - filter->b1 = -2.0 * filter->cos_omega * scalar; - filter->b2 = (1.0 - filter->alpha) * scalar; + filter->b1 = -2.0 * filter->cos_omega * scalar; + filter->b2 = (1.0 - filter->alpha) * scalar; } @@ -58,21 +59,21 @@ void BiquadFilter_SetupHighPass( BiquadFilter *filter, double ratio, double Q ) */ void BiquadFilter_SetupNotch( BiquadFilter *filter, double ratio, double Q ) { - double scalar, opc; - - if( ratio < BIQUAD_MIN_RATIO ) ratio = BIQUAD_MIN_RATIO; - if( Q < BIQUAD_MIN_Q ) Q = BIQUAD_MIN_Q; - - BiquadFilter_CalculateCommon( filter, ratio, Q ); - - scalar = 1.0 / (1.0 + filter->alpha); - opc = (1.0 + filter->cos_omega); - - filter->a0 = scalar; - filter->a1 = -2.0 * filter->cos_omega * scalar; + double scalar, opc; + + if( ratio < BIQUAD_MIN_RATIO ) ratio = BIQUAD_MIN_RATIO; + if( Q < BIQUAD_MIN_Q ) Q = BIQUAD_MIN_Q; + + BiquadFilter_CalculateCommon( filter, ratio, Q ); + + scalar = 1.0 / (1.0 + filter->alpha); + opc = (1.0 + filter->cos_omega); + + filter->a0 = scalar; + filter->a1 = -2.0 * filter->cos_omega * scalar; filter->a2 = filter->a0; - filter->b1 = filter->a1; - filter->b2 = (1.0 - filter->alpha) * scalar; + filter->b1 = filter->a1; + filter->b2 = (1.0 - filter->alpha) * scalar; } /***************************************************************** @@ -80,43 +81,43 @@ void BiquadFilter_SetupNotch( BiquadFilter *filter, double ratio, double Q ) */ void BiquadFilter_Filter( BiquadFilter *filter, float *inputs, float *outputs, int numSamples ) { - int i; + int i; double xn, yn; - // Pull values from structure to speed up the calculation. - double a0 = filter->a0; - double a1 = filter->a1; - double a2 = filter->a2; - double b1 = filter->b1; - double b2 = filter->b2; - double xn1 = filter->xn1; - double xn2 = filter->xn2; - double yn1 = filter->yn1; - double yn2 = filter->yn2; + // Pull values from structure to speed up the calculation. + double a0 = filter->a0; + double a1 = filter->a1; + double a2 = filter->a2; + double b1 = filter->b1; + double b2 = filter->b2; + double xn1 = filter->xn1; + double xn2 = filter->xn2; + double yn1 = filter->yn1; + double yn2 = filter->yn2; - for( i=0; ixn1 = xn1; - filter->xn2 = xn2; - filter->yn1 = yn1; - filter->yn2 = yn2; + + if( (i & 7) == 0 ) + { + // Apply a small bipolar impulse to filter to prevent arithmetic underflow. + // Underflows can cause the FPU to interrupt the CPU. + yn1 += (double) 1.0E-26; + yn2 -= (double) 1.0E-26; + } + } + + filter->xn1 = xn1; + filter->xn2 = xn2; + filter->yn1 = yn1; + filter->yn2 = yn2; } diff --git a/qa/loopback/src/biquad_filter.h b/qa/loopback/src/biquad_filter.h index cbac688..0895aba 100755 --- a/qa/loopback/src/biquad_filter.h +++ b/qa/loopback/src/biquad_filter.h @@ -3,7 +3,7 @@ /** - * Unit_BiquadFilter implements a second order IIR filter. + * Unit_BiquadFilter implements a second order IIR filter. * * @author (C) 2002 Phil Burk, SoftSynth.com, All Rights Reserved */ @@ -14,20 +14,20 @@ typedef struct BiquadFilter_s { double xn1; // storage for delayed signals - double xn2; - double yn1; - double yn2; + double xn2; + double yn1; + double yn2; - double a0; // coefficients - double a1; - double a2; + double a0; // coefficients + double a1; + double a2; - double b1; - double b2; + double b1; + double b2; - double cos_omega; - double sin_omega; - double alpha; + double cos_omega; + double sin_omega; + double alpha; } BiquadFilter; void BiquadFilter_SetupHighPass( BiquadFilter *filter, double ratio, double Q ); diff --git a/qa/loopback/src/paqa.c b/qa/loopback/src/paqa.c index ac8e841..5eb6283 100644 --- a/qa/loopback/src/paqa.c +++ b/qa/loopback/src/paqa.c @@ -26,13 +26,13 @@ */ /* - * The text above constitutes the entire PortAudio license; however, + * The text above constitutes the entire PortAudio license; however, * the PortAudio community also makes the following non-binding requests: * * 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. It is also - * requested that these non-binding requests be included along with the + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the * license above. */ @@ -69,76 +69,76 @@ int g_testsFailed = 0; const char * s_FlagOnNames[] = { - "Two Streams (Half Duplex)", - "Blocking Read/Write" + "Two Streams (Half Duplex)", + "Blocking Read/Write" }; const char * s_FlagOffNames[] = { - "One Stream (Full Duplex)", - "Callback" + "One Stream (Full Duplex)", + "Callback" }; /** Parameters that describe a single test run. */ typedef struct TestParameters_s { - PaStreamParameters inputParameters; - PaStreamParameters outputParameters; - double sampleRate; - int samplesPerFrame; - int framesPerBuffer; - int maxFrames; - double baseFrequency; - double amplitude; + PaStreamParameters inputParameters; + PaStreamParameters outputParameters; + double sampleRate; + int samplesPerFrame; + int framesPerBuffer; + int maxFrames; + double baseFrequency; + double amplitude; PaStreamFlags streamFlags; // paClipOff, etc - int flags; // PAQA_FLAG_TWO_STREAMS, PAQA_FLAG_USE_BLOCKING_IO + int flags; // PAQA_FLAG_TWO_STREAMS, PAQA_FLAG_USE_BLOCKING_IO } TestParameters; typedef struct LoopbackContext_s { - // Generate a unique signal on each channel. - PaQaSineGenerator generators[MAX_NUM_GENERATORS]; - // Record each channel individually. - PaQaRecording recordings[MAX_NUM_RECORDINGS]; - - // Reported by the stream after it's opened - PaTime streamInfoInputLatency; - PaTime streamInfoOutputLatency; + // Generate a unique signal on each channel. + PaQaSineGenerator generators[MAX_NUM_GENERATORS]; + // Record each channel individually. + PaQaRecording recordings[MAX_NUM_RECORDINGS]; + + // Reported by the stream after it's opened + PaTime streamInfoInputLatency; + PaTime streamInfoOutputLatency; + + // Measured at runtime. + volatile int callbackCount; // incremented for each callback + volatile int inputBufferCount; // incremented if input buffer not NULL + int inputUnderflowCount; + int inputOverflowCount; + + volatile int outputBufferCount; // incremented if output buffer not NULL + int outputOverflowCount; + int outputUnderflowCount; - // Measured at runtime. - volatile int callbackCount; // incremented for each callback - volatile int inputBufferCount; // incremented if input buffer not NULL - int inputUnderflowCount; - int inputOverflowCount; - - volatile int outputBufferCount; // incremented if output buffer not NULL - int outputOverflowCount; - int outputUnderflowCount; - // Measure whether input or output is lagging behind. volatile int minInputOutputDelta; volatile int maxInputOutputDelta; - - int minFramesPerBuffer; - int maxFramesPerBuffer; - int primingCount; - TestParameters *test; - volatile int done; + + int minFramesPerBuffer; + int maxFramesPerBuffer; + int primingCount; + TestParameters *test; + volatile int done; } LoopbackContext; typedef struct UserOptions_s { - int sampleRate; - int framesPerBuffer; - int inputLatency; - int outputLatency; - int saveBadWaves; - int verbose; - int waveFileCount; - const char *waveFilePath; - PaDeviceIndex inputDevice; - PaDeviceIndex outputDevice; + int sampleRate; + int framesPerBuffer; + int inputLatency; + int outputLatency; + int saveBadWaves; + int verbose; + int waveFileCount; + const char *waveFilePath; + PaDeviceIndex inputDevice; + PaDeviceIndex outputDevice; } UserOptions; #define BIG_BUFFER_SIZE (sizeof(float) * 2 * 2 * 1024) @@ -150,105 +150,105 @@ static unsigned char g_ConversionBuffer[CONVERSION_BUFFER_SIZE]; /*******************************************************************/ static int RecordAndPlaySinesCallback( const void *inputBuffer, void *outputBuffer, - unsigned long framesPerBuffer, - const PaStreamCallbackTimeInfo* timeInfo, - PaStreamCallbackFlags statusFlags, - void *userData ) + unsigned long framesPerBuffer, + const PaStreamCallbackTimeInfo* timeInfo, + PaStreamCallbackFlags statusFlags, + void *userData ) { - int i; - LoopbackContext *loopbackContext = (LoopbackContext *) userData; - - - loopbackContext->callbackCount += 1; - if( statusFlags & paInputUnderflow ) loopbackContext->inputUnderflowCount += 1; - if( statusFlags & paInputOverflow ) loopbackContext->inputOverflowCount += 1; - if( statusFlags & paOutputUnderflow ) loopbackContext->outputUnderflowCount += 1; - if( statusFlags & paOutputOverflow ) loopbackContext->outputOverflowCount += 1; - if( statusFlags & paPrimingOutput ) loopbackContext->primingCount += 1; - if( framesPerBuffer > loopbackContext->maxFramesPerBuffer ) - { - loopbackContext->maxFramesPerBuffer = framesPerBuffer; - } - if( framesPerBuffer < loopbackContext->minFramesPerBuffer ) - { - loopbackContext->minFramesPerBuffer = framesPerBuffer; - } - + int i; + LoopbackContext *loopbackContext = (LoopbackContext *) userData; + + + loopbackContext->callbackCount += 1; + if( statusFlags & paInputUnderflow ) loopbackContext->inputUnderflowCount += 1; + if( statusFlags & paInputOverflow ) loopbackContext->inputOverflowCount += 1; + if( statusFlags & paOutputUnderflow ) loopbackContext->outputUnderflowCount += 1; + if( statusFlags & paOutputOverflow ) loopbackContext->outputOverflowCount += 1; + if( statusFlags & paPrimingOutput ) loopbackContext->primingCount += 1; + if( framesPerBuffer > loopbackContext->maxFramesPerBuffer ) + { + loopbackContext->maxFramesPerBuffer = framesPerBuffer; + } + if( framesPerBuffer < loopbackContext->minFramesPerBuffer ) + { + loopbackContext->minFramesPerBuffer = framesPerBuffer; + } + /* This may get called with NULL inputBuffer during initial setup. - * We may also use the same callback with output only streams. - */ - if( inputBuffer != NULL) - { - int channelsPerFrame = loopbackContext->test->inputParameters.channelCount; - float *in = (float *)inputBuffer; - PaSampleFormat inFormat = loopbackContext->test->inputParameters.sampleFormat; - - loopbackContext->inputBufferCount += 1; - - if( inFormat != paFloat32 ) - { - int samplesToConvert = framesPerBuffer * channelsPerFrame; - in = (float *) g_ConversionBuffer; - if( samplesToConvert > MAX_CONVERSION_SAMPLES ) - { - // Hack to prevent buffer overflow. - // @todo Loop with small buffer instead of failing. - printf("Format conversion buffer too small!\n"); - return paComplete; - } - PaQa_ConvertToFloat( inputBuffer, samplesToConvert, inFormat, (float *) g_ConversionBuffer ); - } - - // Read each channel from the buffer. - for( i=0; idone |= PaQa_WriteRecording( &loopbackContext->recordings[i], - in + i, - framesPerBuffer, - channelsPerFrame ); - } - } - - if( outputBuffer != NULL ) - { - int channelsPerFrame = loopbackContext->test->outputParameters.channelCount; - float *out = (float *)outputBuffer; - PaSampleFormat outFormat = loopbackContext->test->outputParameters.sampleFormat; - - loopbackContext->outputBufferCount += 1; - - if( outFormat != paFloat32 ) - { - // If we need to convert then mix to the g_ConversionBuffer and then convert into the PA outputBuffer. - out = (float *) g_ConversionBuffer; - } - - PaQa_EraseBuffer( out, framesPerBuffer, channelsPerFrame ); - for( i=0; igenerators[i], - out + i, - framesPerBuffer, - channelsPerFrame ); - } - - if( outFormat != paFloat32 ) - { - int samplesToConvert = framesPerBuffer * channelsPerFrame; - if( samplesToConvert > MAX_CONVERSION_SAMPLES ) - { - printf("Format conversion buffer too small!\n"); - return paComplete; - } - PaQa_ConvertFromFloat( out, framesPerBuffer * channelsPerFrame, outFormat, outputBuffer ); - } - - } - + * We may also use the same callback with output only streams. + */ + if( inputBuffer != NULL) + { + int channelsPerFrame = loopbackContext->test->inputParameters.channelCount; + float *in = (float *)inputBuffer; + PaSampleFormat inFormat = loopbackContext->test->inputParameters.sampleFormat; + + loopbackContext->inputBufferCount += 1; + + if( inFormat != paFloat32 ) + { + int samplesToConvert = framesPerBuffer * channelsPerFrame; + in = (float *) g_ConversionBuffer; + if( samplesToConvert > MAX_CONVERSION_SAMPLES ) + { + // Hack to prevent buffer overflow. + // @todo Loop with small buffer instead of failing. + printf("Format conversion buffer too small!\n"); + return paComplete; + } + PaQa_ConvertToFloat( inputBuffer, samplesToConvert, inFormat, (float *) g_ConversionBuffer ); + } + + // Read each channel from the buffer. + for( i=0; idone |= PaQa_WriteRecording( &loopbackContext->recordings[i], + in + i, + framesPerBuffer, + channelsPerFrame ); + } + } + + if( outputBuffer != NULL ) + { + int channelsPerFrame = loopbackContext->test->outputParameters.channelCount; + float *out = (float *)outputBuffer; + PaSampleFormat outFormat = loopbackContext->test->outputParameters.sampleFormat; + + loopbackContext->outputBufferCount += 1; + + if( outFormat != paFloat32 ) + { + // If we need to convert then mix to the g_ConversionBuffer and then convert into the PA outputBuffer. + out = (float *) g_ConversionBuffer; + } + + PaQa_EraseBuffer( out, framesPerBuffer, channelsPerFrame ); + for( i=0; igenerators[i], + out + i, + framesPerBuffer, + channelsPerFrame ); + } + + if( outFormat != paFloat32 ) + { + int samplesToConvert = framesPerBuffer * channelsPerFrame; + if( samplesToConvert > MAX_CONVERSION_SAMPLES ) + { + printf("Format conversion buffer too small!\n"); + return paComplete; + } + PaQa_ConvertFromFloat( out, framesPerBuffer * channelsPerFrame, outFormat, outputBuffer ); + } + + } + // Measure whether the input or output are lagging behind. // Don't measure lag at end. if( !loopbackContext->done ) - { + { int inputOutputDelta = loopbackContext->inputBufferCount - loopbackContext->outputBufferCount; if( loopbackContext->maxInputOutputDelta < inputOutputDelta ) { @@ -259,21 +259,21 @@ static int RecordAndPlaySinesCallback( const void *inputBuffer, void *outputBuff loopbackContext->minInputOutputDelta = inputOutputDelta; } } - - return loopbackContext->done ? paComplete : paContinue; + + return loopbackContext->done ? paComplete : paContinue; } static void CopyStreamInfoToLoopbackContext( LoopbackContext *loopbackContext, PaStream *inputStream, PaStream *outputStream ) { - const PaStreamInfo *inputStreamInfo = Pa_GetStreamInfo( inputStream ); - const PaStreamInfo *outputStreamInfo = Pa_GetStreamInfo( outputStream ); + const PaStreamInfo *inputStreamInfo = Pa_GetStreamInfo( inputStream ); + const PaStreamInfo *outputStreamInfo = Pa_GetStreamInfo( outputStream ); - loopbackContext->streamInfoInputLatency = inputStreamInfo ? inputStreamInfo->inputLatency : -1; - loopbackContext->streamInfoOutputLatency = outputStreamInfo ? outputStreamInfo->outputLatency : -1; + loopbackContext->streamInfoInputLatency = inputStreamInfo ? inputStreamInfo->inputLatency : -1; + loopbackContext->streamInfoOutputLatency = outputStreamInfo ? outputStreamInfo->outputLatency : -1; } /*******************************************************************/ -/** +/** * Open a full duplex audio stream. * Generate sine waves on the output channels and record the input channels. * Then close the stream. @@ -281,47 +281,47 @@ static void CopyStreamInfoToLoopbackContext( LoopbackContext *loopbackContext, P */ int PaQa_RunLoopbackFullDuplex( LoopbackContext *loopbackContext ) { - PaStream *stream = NULL; - PaError err = 0; - TestParameters *test = loopbackContext->test; - loopbackContext->done = 0; - // Use one full duplex stream. - err = Pa_OpenStream( - &stream, - &test->inputParameters, - &test->outputParameters, - test->sampleRate, - test->framesPerBuffer, - paClipOff, /* we won't output out of range samples so don't bother clipping them */ - RecordAndPlaySinesCallback, - loopbackContext ); - if( err != paNoError ) goto error; - - CopyStreamInfoToLoopbackContext( loopbackContext, stream, stream ); + PaStream *stream = NULL; + PaError err = 0; + TestParameters *test = loopbackContext->test; + loopbackContext->done = 0; + // Use one full duplex stream. + err = Pa_OpenStream( + &stream, + &test->inputParameters, + &test->outputParameters, + test->sampleRate, + test->framesPerBuffer, + paClipOff, /* we won't output out of range samples so don't bother clipping them */ + RecordAndPlaySinesCallback, + loopbackContext ); + if( err != paNoError ) goto error; - err = Pa_StartStream( stream ); - if( err != paNoError ) goto error; - - // Wait for stream to finish. - while( loopbackContext->done == 0 ) - { - Pa_Sleep(PAQA_WAIT_STREAM_MSEC); - } - - err = Pa_StopStream( stream ); - if( err != paNoError ) goto error; + CopyStreamInfoToLoopbackContext( loopbackContext, stream, stream ); + + err = Pa_StartStream( stream ); + if( err != paNoError ) goto error; + + // Wait for stream to finish. + while( loopbackContext->done == 0 ) + { + Pa_Sleep(PAQA_WAIT_STREAM_MSEC); + } + + err = Pa_StopStream( stream ); + if( err != paNoError ) goto error; + + err = Pa_CloseStream( stream ); + if( err != paNoError ) goto error; + + return 0; - err = Pa_CloseStream( stream ); - if( err != paNoError ) goto error; - - return 0; - error: - return err; + return err; } /*******************************************************************/ -/** +/** * Open two audio streams, one for input and one for output. * Generate sine waves on the output channels and record the input channels. * Then close the stream. @@ -330,25 +330,25 @@ error: int PaQa_WaitForStream( LoopbackContext *loopbackContext ) { - int timeoutMSec = 1000 * PAQA_TEST_DURATION * 2; - - // Wait for stream to finish or timeout. - while( (loopbackContext->done == 0) && (timeoutMSec > 0) ) - { - Pa_Sleep(PAQA_WAIT_STREAM_MSEC); - timeoutMSec -= PAQA_WAIT_STREAM_MSEC; - } - - if( loopbackContext->done == 0 ) - { - printf("ERROR - stream completion timed out!"); - return paTimedOut; - } - return 0; + int timeoutMSec = 1000 * PAQA_TEST_DURATION * 2; + + // Wait for stream to finish or timeout. + while( (loopbackContext->done == 0) && (timeoutMSec > 0) ) + { + Pa_Sleep(PAQA_WAIT_STREAM_MSEC); + timeoutMSec -= PAQA_WAIT_STREAM_MSEC; + } + + if( loopbackContext->done == 0 ) + { + printf("ERROR - stream completion timed out!"); + return paTimedOut; + } + return 0; } /*******************************************************************/ -/** +/** * Open two audio streams, one for input and one for output. * Generate sine waves on the output channels and record the input channels. * Then close the stream. @@ -356,67 +356,67 @@ int PaQa_WaitForStream( LoopbackContext *loopbackContext ) */ int PaQa_RunLoopbackHalfDuplex( LoopbackContext *loopbackContext ) { - PaStream *inStream = NULL; - PaStream *outStream = NULL; - PaError err = 0; - int timedOut = 0; - TestParameters *test = loopbackContext->test; - loopbackContext->done = 0; - - // Use two half duplex streams. - err = Pa_OpenStream( - &inStream, - &test->inputParameters, - NULL, - test->sampleRate, - test->framesPerBuffer, - test->streamFlags, - RecordAndPlaySinesCallback, - loopbackContext ); - if( err != paNoError ) goto error; - err = Pa_OpenStream( - &outStream, - NULL, - &test->outputParameters, - test->sampleRate, - test->framesPerBuffer, - test->streamFlags, - RecordAndPlaySinesCallback, - loopbackContext ); - if( err != paNoError ) goto error; + PaStream *inStream = NULL; + PaStream *outStream = NULL; + PaError err = 0; + int timedOut = 0; + TestParameters *test = loopbackContext->test; + loopbackContext->done = 0; - CopyStreamInfoToLoopbackContext( loopbackContext, inStream, outStream ); + // Use two half duplex streams. + err = Pa_OpenStream( + &inStream, + &test->inputParameters, + NULL, + test->sampleRate, + test->framesPerBuffer, + test->streamFlags, + RecordAndPlaySinesCallback, + loopbackContext ); + if( err != paNoError ) goto error; + err = Pa_OpenStream( + &outStream, + NULL, + &test->outputParameters, + test->sampleRate, + test->framesPerBuffer, + test->streamFlags, + RecordAndPlaySinesCallback, + loopbackContext ); + if( err != paNoError ) goto error; + + CopyStreamInfoToLoopbackContext( loopbackContext, inStream, outStream ); + + err = Pa_StartStream( inStream ); + if( err != paNoError ) goto error; + + // Start output later so we catch the beginning of the waveform. + err = Pa_StartStream( outStream ); + if( err != paNoError ) goto error; + + timedOut = PaQa_WaitForStream( loopbackContext ); + + err = Pa_StopStream( inStream ); + if( err != paNoError ) goto error; + + err = Pa_StopStream( outStream ); + if( err != paNoError ) goto error; + + err = Pa_CloseStream( inStream ); + if( err != paNoError ) goto error; + + err = Pa_CloseStream( outStream ); + if( err != paNoError ) goto error; + + return timedOut; - err = Pa_StartStream( inStream ); - if( err != paNoError ) goto error; - - // Start output later so we catch the beginning of the waveform. - err = Pa_StartStream( outStream ); - if( err != paNoError ) goto error; - - timedOut = PaQa_WaitForStream( loopbackContext ); - - err = Pa_StopStream( inStream ); - if( err != paNoError ) goto error; - - err = Pa_StopStream( outStream ); - if( err != paNoError ) goto error; - - err = Pa_CloseStream( inStream ); - if( err != paNoError ) goto error; - - err = Pa_CloseStream( outStream ); - if( err != paNoError ) goto error; - - return timedOut; - error: - return err; + return err; } /*******************************************************************/ -/** +/** * Open one audio streams, just for input. * Record background level. * Then close the stream. @@ -424,120 +424,120 @@ error: */ int PaQa_RunInputOnly( LoopbackContext *loopbackContext ) { - PaStream *inStream = NULL; - PaError err = 0; - int timedOut = 0; - TestParameters *test = loopbackContext->test; - loopbackContext->done = 0; - - // Just open an input stream. - err = Pa_OpenStream( - &inStream, - &test->inputParameters, - NULL, - test->sampleRate, - test->framesPerBuffer, - paClipOff, /* We won't output out of range samples so don't bother clipping them. */ - RecordAndPlaySinesCallback, - loopbackContext ); - if( err != paNoError ) goto error; + PaStream *inStream = NULL; + PaError err = 0; + int timedOut = 0; + TestParameters *test = loopbackContext->test; + loopbackContext->done = 0; + + // Just open an input stream. + err = Pa_OpenStream( + &inStream, + &test->inputParameters, + NULL, + test->sampleRate, + test->framesPerBuffer, + paClipOff, /* We won't output out of range samples so don't bother clipping them. */ + RecordAndPlaySinesCallback, + loopbackContext ); + if( err != paNoError ) goto error; + + err = Pa_StartStream( inStream ); + if( err != paNoError ) goto error; + + timedOut = PaQa_WaitForStream( loopbackContext ); + + err = Pa_StopStream( inStream ); + if( err != paNoError ) goto error; + + err = Pa_CloseStream( inStream ); + if( err != paNoError ) goto error; + + return timedOut; - err = Pa_StartStream( inStream ); - if( err != paNoError ) goto error; - - timedOut = PaQa_WaitForStream( loopbackContext ); - - err = Pa_StopStream( inStream ); - if( err != paNoError ) goto error; - - err = Pa_CloseStream( inStream ); - if( err != paNoError ) goto error; - - return timedOut; - error: - return err; + return err; } /*******************************************************************/ static int RecordAndPlayBlockingIO( PaStream *inStream, - PaStream *outStream, - LoopbackContext *loopbackContext - ) -{ - int i; - float *in = (float *)g_ReadWriteBuffer; - float *out = (float *)g_ReadWriteBuffer; - PaError err; - int done = 0; - long available; - const long maxPerBuffer = 64; - TestParameters *test = loopbackContext->test; - long framesPerBuffer = test->framesPerBuffer; - if( framesPerBuffer <= 0 ) - { - framesPerBuffer = maxPerBuffer; // bigger values might run past end of recording - } - - // Read in audio. - err = Pa_ReadStream( inStream, in, framesPerBuffer ); - // Ignore an overflow on the first read. - //if( !((loopbackContext->callbackCount == 0) && (err == paInputOverflowed)) ) - if( err != paInputOverflowed ) - { - QA_ASSERT_EQUALS( "Pa_ReadStream failed", paNoError, err ); - } - else - { - loopbackContext->inputOverflowCount += 1; - } + PaStream *outStream, + LoopbackContext *loopbackContext + ) +{ + int i; + float *in = (float *)g_ReadWriteBuffer; + float *out = (float *)g_ReadWriteBuffer; + PaError err; + int done = 0; + long available; + const long maxPerBuffer = 64; + TestParameters *test = loopbackContext->test; + long framesPerBuffer = test->framesPerBuffer; + if( framesPerBuffer <= 0 ) + { + framesPerBuffer = maxPerBuffer; // bigger values might run past end of recording + } - - // Save in a recording. - for( i=0; itest->inputParameters.channelCount; i++ ) - { - done |= PaQa_WriteRecording( &loopbackContext->recordings[i], - in + i, - framesPerBuffer, - loopbackContext->test->inputParameters.channelCount ); - } - - // Synthesize audio. - available = Pa_GetStreamWriteAvailable( outStream ); - if( available > (2*framesPerBuffer) ) available = (2*framesPerBuffer); - PaQa_EraseBuffer( out, available, loopbackContext->test->outputParameters.channelCount ); - for( i=0; itest->outputParameters.channelCount; i++ ) - { - PaQa_MixSine( &loopbackContext->generators[i], - out + i, - available, - loopbackContext->test->outputParameters.channelCount ); - } - - // Write out audio. - err = Pa_WriteStream( outStream, out, available ); - // Ignore an underflow on the first write. - //if( !((loopbackContext->callbackCount == 0) && (err == paOutputUnderflowed)) ) - if( err != paOutputUnderflowed ) - { - QA_ASSERT_EQUALS( "Pa_WriteStream failed", paNoError, err ); - } - else - { - loopbackContext->outputUnderflowCount += 1; - } - - - loopbackContext->callbackCount += 1; - - return done; + // Read in audio. + err = Pa_ReadStream( inStream, in, framesPerBuffer ); + // Ignore an overflow on the first read. + //if( !((loopbackContext->callbackCount == 0) && (err == paInputOverflowed)) ) + if( err != paInputOverflowed ) + { + QA_ASSERT_EQUALS( "Pa_ReadStream failed", paNoError, err ); + } + else + { + loopbackContext->inputOverflowCount += 1; + } + + + // Save in a recording. + for( i=0; itest->inputParameters.channelCount; i++ ) + { + done |= PaQa_WriteRecording( &loopbackContext->recordings[i], + in + i, + framesPerBuffer, + loopbackContext->test->inputParameters.channelCount ); + } + + // Synthesize audio. + available = Pa_GetStreamWriteAvailable( outStream ); + if( available > (2*framesPerBuffer) ) available = (2*framesPerBuffer); + PaQa_EraseBuffer( out, available, loopbackContext->test->outputParameters.channelCount ); + for( i=0; itest->outputParameters.channelCount; i++ ) + { + PaQa_MixSine( &loopbackContext->generators[i], + out + i, + available, + loopbackContext->test->outputParameters.channelCount ); + } + + // Write out audio. + err = Pa_WriteStream( outStream, out, available ); + // Ignore an underflow on the first write. + //if( !((loopbackContext->callbackCount == 0) && (err == paOutputUnderflowed)) ) + if( err != paOutputUnderflowed ) + { + QA_ASSERT_EQUALS( "Pa_WriteStream failed", paNoError, err ); + } + else + { + loopbackContext->outputUnderflowCount += 1; + } + + + loopbackContext->callbackCount += 1; + + return done; error: - return err; + return err; } /*******************************************************************/ -/** +/** * Open two audio streams with non-blocking IO. * Generate sine waves on the output channels and record the input channels. * Then close the stream. @@ -545,73 +545,73 @@ error: */ int PaQa_RunLoopbackHalfDuplexBlockingIO( LoopbackContext *loopbackContext ) { - PaStream *inStream = NULL; - PaStream *outStream = NULL; - PaError err = 0; - TestParameters *test = loopbackContext->test; - - // Use two half duplex streams. - err = Pa_OpenStream( - &inStream, - &test->inputParameters, - NULL, - test->sampleRate, - test->framesPerBuffer, - paClipOff, /* we won't output out of range samples so don't bother clipping them */ - NULL, // causes non-blocking IO - NULL ); - if( err != paNoError ) goto error1; - err = Pa_OpenStream( - &outStream, - NULL, - &test->outputParameters, - test->sampleRate, - test->framesPerBuffer, - paClipOff, /* we won't output out of range samples so don't bother clipping them */ - NULL, // causes non-blocking IO - NULL ); - if( err != paNoError ) goto error2; - - CopyStreamInfoToLoopbackContext( loopbackContext, inStream, outStream ); + PaStream *inStream = NULL; + PaStream *outStream = NULL; + PaError err = 0; + TestParameters *test = loopbackContext->test; + + // Use two half duplex streams. + err = Pa_OpenStream( + &inStream, + &test->inputParameters, + NULL, + test->sampleRate, + test->framesPerBuffer, + paClipOff, /* we won't output out of range samples so don't bother clipping them */ + NULL, // causes non-blocking IO + NULL ); + if( err != paNoError ) goto error1; + err = Pa_OpenStream( + &outStream, + NULL, + &test->outputParameters, + test->sampleRate, + test->framesPerBuffer, + paClipOff, /* we won't output out of range samples so don't bother clipping them */ + NULL, // causes non-blocking IO + NULL ); + if( err != paNoError ) goto error2; + + CopyStreamInfoToLoopbackContext( loopbackContext, inStream, outStream ); + + err = Pa_StartStream( outStream ); + if( err != paNoError ) goto error3; + + err = Pa_StartStream( inStream ); + if( err != paNoError ) goto error3; + + while( err == 0 ) + { + err = RecordAndPlayBlockingIO( inStream, outStream, loopbackContext ); + if( err < 0 ) goto error3; + } + + err = Pa_StopStream( inStream ); + if( err != paNoError ) goto error3; + + err = Pa_StopStream( outStream ); + if( err != paNoError ) goto error3; + + err = Pa_CloseStream( outStream ); + if( err != paNoError ) goto error2; + + err = Pa_CloseStream( inStream ); + if( err != paNoError ) goto error1; + + + return 0; - err = Pa_StartStream( outStream ); - if( err != paNoError ) goto error3; - - err = Pa_StartStream( inStream ); - if( err != paNoError ) goto error3; - - while( err == 0 ) - { - err = RecordAndPlayBlockingIO( inStream, outStream, loopbackContext ); - if( err < 0 ) goto error3; - } - - err = Pa_StopStream( inStream ); - if( err != paNoError ) goto error3; - - err = Pa_StopStream( outStream ); - if( err != paNoError ) goto error3; - - err = Pa_CloseStream( outStream ); - if( err != paNoError ) goto error2; - - err = Pa_CloseStream( inStream ); - if( err != paNoError ) goto error1; - - - return 0; - error3: - Pa_CloseStream( outStream ); + Pa_CloseStream( outStream ); error2: - Pa_CloseStream( inStream ); + Pa_CloseStream( inStream ); error1: - return err; + return err; } /*******************************************************************/ -/** +/** * Open one audio stream with non-blocking IO. * Generate sine waves on the output channels and record the input channels. * Then close the stream. @@ -619,669 +619,669 @@ error1: */ int PaQa_RunLoopbackFullDuplexBlockingIO( LoopbackContext *loopbackContext ) { - PaStream *stream = NULL; - PaError err = 0; - TestParameters *test = loopbackContext->test; - - // Use one full duplex stream. - err = Pa_OpenStream( - &stream, - &test->inputParameters, - &test->outputParameters, - test->sampleRate, - test->framesPerBuffer, - paClipOff, /* we won't output out of range samples so don't bother clipping them */ - NULL, // causes non-blocking IO - NULL ); - if( err != paNoError ) goto error1; - - CopyStreamInfoToLoopbackContext( loopbackContext, stream, stream ); + PaStream *stream = NULL; + PaError err = 0; + TestParameters *test = loopbackContext->test; + + // Use one full duplex stream. + err = Pa_OpenStream( + &stream, + &test->inputParameters, + &test->outputParameters, + test->sampleRate, + test->framesPerBuffer, + paClipOff, /* we won't output out of range samples so don't bother clipping them */ + NULL, // causes non-blocking IO + NULL ); + if( err != paNoError ) goto error1; + + CopyStreamInfoToLoopbackContext( loopbackContext, stream, stream ); + + err = Pa_StartStream( stream ); + if( err != paNoError ) goto error2; + + while( err == 0 ) + { + err = RecordAndPlayBlockingIO( stream, stream, loopbackContext ); + if( err < 0 ) goto error2; + } + + err = Pa_StopStream( stream ); + if( err != paNoError ) goto error2; + + + err = Pa_CloseStream( stream ); + if( err != paNoError ) goto error1; + + + return 0; - err = Pa_StartStream( stream ); - if( err != paNoError ) goto error2; - - while( err == 0 ) - { - err = RecordAndPlayBlockingIO( stream, stream, loopbackContext ); - if( err < 0 ) goto error2; - } - - err = Pa_StopStream( stream ); - if( err != paNoError ) goto error2; - - - err = Pa_CloseStream( stream ); - if( err != paNoError ) goto error1; - - - return 0; - error2: - Pa_CloseStream( stream ); + Pa_CloseStream( stream ); error1: - return err; + return err; } /*******************************************************************/ -/** +/** * Run some kind of loopback test. * @return 0 if OK or negative error. */ int PaQa_RunLoopback( LoopbackContext *loopbackContext ) { - PaError err = 0; - TestParameters *test = loopbackContext->test; - - - if( test->flags & PAQA_FLAG_TWO_STREAMS ) - { - if( test->flags & PAQA_FLAG_USE_BLOCKING_IO ) - { - err = PaQa_RunLoopbackHalfDuplexBlockingIO( loopbackContext ); - } - else - { - err = PaQa_RunLoopbackHalfDuplex( loopbackContext ); - } - } - else - { - if( test->flags & PAQA_FLAG_USE_BLOCKING_IO ) - { - err = PaQa_RunLoopbackFullDuplexBlockingIO( loopbackContext ); - } - else - { - err = PaQa_RunLoopbackFullDuplex( loopbackContext ); - } - } - - if( err != paNoError ) - { - printf("PortAudio error = %s\n", Pa_GetErrorText( err ) ); - } - return err; + PaError err = 0; + TestParameters *test = loopbackContext->test; + + + if( test->flags & PAQA_FLAG_TWO_STREAMS ) + { + if( test->flags & PAQA_FLAG_USE_BLOCKING_IO ) + { + err = PaQa_RunLoopbackHalfDuplexBlockingIO( loopbackContext ); + } + else + { + err = PaQa_RunLoopbackHalfDuplex( loopbackContext ); + } + } + else + { + if( test->flags & PAQA_FLAG_USE_BLOCKING_IO ) + { + err = PaQa_RunLoopbackFullDuplexBlockingIO( loopbackContext ); + } + else + { + err = PaQa_RunLoopbackFullDuplex( loopbackContext ); + } + } + + if( err != paNoError ) + { + printf("PortAudio error = %s\n", Pa_GetErrorText( err ) ); + } + return err; } /*******************************************************************/ static int PaQa_SaveTestResultToWaveFile( UserOptions *userOptions, PaQaRecording *recording ) { - if( userOptions->saveBadWaves ) - { - char filename[256]; + if( userOptions->saveBadWaves ) + { + char filename[256]; #ifdef WIN32 _snprintf( filename, sizeof(filename), "%s\\paloopback_%d.wav", userOptions->waveFilePath, userOptions->waveFileCount++ ); #else - snprintf( filename, sizeof(filename), "%s/paloopback_%d.wav", userOptions->waveFilePath, userOptions->waveFileCount++ ); -#endif - printf( "\"%s\", ", filename ); - return PaQa_SaveRecordingToWaveFile( recording, filename ); - } - return 0; + snprintf( filename, sizeof(filename), "%s/paloopback_%d.wav", userOptions->waveFilePath, userOptions->waveFileCount++ ); +#endif + printf( "\"%s\", ", filename ); + return PaQa_SaveRecordingToWaveFile( recording, filename ); + } + return 0; } /*******************************************************************/ static int PaQa_SetupLoopbackContext( LoopbackContext *loopbackContextPtr, TestParameters *testParams ) { - int i; - // Setup loopback context. - memset( loopbackContextPtr, 0, sizeof(LoopbackContext) ); - loopbackContextPtr->test = testParams; - for( i=0; isamplesPerFrame; i++ ) - { - int err = PaQa_InitializeRecording( &loopbackContextPtr->recordings[i], testParams->maxFrames, testParams->sampleRate ); - QA_ASSERT_EQUALS( "PaQa_InitializeRecording failed", paNoError, err ); - } - for( i=0; isamplesPerFrame; i++ ) - { - PaQa_SetupSineGenerator( &loopbackContextPtr->generators[i], PaQa_GetNthFrequency( testParams->baseFrequency, i ), - testParams->amplitude, testParams->sampleRate ); - } - loopbackContextPtr->minFramesPerBuffer = 0x0FFFFFFF; - return 0; + int i; + // Setup loopback context. + memset( loopbackContextPtr, 0, sizeof(LoopbackContext) ); + loopbackContextPtr->test = testParams; + for( i=0; isamplesPerFrame; i++ ) + { + int err = PaQa_InitializeRecording( &loopbackContextPtr->recordings[i], testParams->maxFrames, testParams->sampleRate ); + QA_ASSERT_EQUALS( "PaQa_InitializeRecording failed", paNoError, err ); + } + for( i=0; isamplesPerFrame; i++ ) + { + PaQa_SetupSineGenerator( &loopbackContextPtr->generators[i], PaQa_GetNthFrequency( testParams->baseFrequency, i ), + testParams->amplitude, testParams->sampleRate ); + } + loopbackContextPtr->minFramesPerBuffer = 0x0FFFFFFF; + return 0; error: - return -1; + return -1; } /*******************************************************************/ static void PaQa_TeardownLoopbackContext( LoopbackContext *loopbackContextPtr ) { - int i; - if( loopbackContextPtr->test != NULL ) - { - for( i=0; itest->samplesPerFrame; i++ ) - { - PaQa_TerminateRecording( &loopbackContextPtr->recordings[i] ); - } - } + int i; + if( loopbackContextPtr->test != NULL ) + { + for( i=0; itest->samplesPerFrame; i++ ) + { + PaQa_TerminateRecording( &loopbackContextPtr->recordings[i] ); + } + } } /*******************************************************************/ static void PaQa_PrintShortErrorReport( PaQaAnalysisResult *analysisResultPtr, int channel ) { - printf("channel %d ", channel); - if( analysisResultPtr->popPosition > 0 ) - { - printf("POP %0.3f at %d, ", (double)analysisResultPtr->popAmplitude, (int)analysisResultPtr->popPosition ); - } - else - { - if( analysisResultPtr->addedFramesPosition > 0 ) - { - printf("ADD %d at %d ", (int)analysisResultPtr->numAddedFrames, (int)analysisResultPtr->addedFramesPosition ); - } - - if( analysisResultPtr->droppedFramesPosition > 0 ) - { - printf("DROP %d at %d ", (int)analysisResultPtr->numDroppedFrames, (int)analysisResultPtr->droppedFramesPosition ); - } - } + printf("channel %d ", channel); + if( analysisResultPtr->popPosition > 0 ) + { + printf("POP %0.3f at %d, ", (double)analysisResultPtr->popAmplitude, (int)analysisResultPtr->popPosition ); + } + else + { + if( analysisResultPtr->addedFramesPosition > 0 ) + { + printf("ADD %d at %d ", (int)analysisResultPtr->numAddedFrames, (int)analysisResultPtr->addedFramesPosition ); + } + + if( analysisResultPtr->droppedFramesPosition > 0 ) + { + printf("DROP %d at %d ", (int)analysisResultPtr->numDroppedFrames, (int)analysisResultPtr->droppedFramesPosition ); + } + } } /*******************************************************************/ static void PaQa_PrintFullErrorReport( PaQaAnalysisResult *analysisResultPtr, int channel ) { - printf("\n=== Loopback Analysis ===================\n"); - printf(" channel: %d\n", channel ); - printf(" latency: %10.3f\n", analysisResultPtr->latency ); - printf(" amplitudeRatio: %10.3f\n", (double)analysisResultPtr->amplitudeRatio ); - printf(" popPosition: %10.3f\n", (double)analysisResultPtr->popPosition ); - printf(" popAmplitude: %10.3f\n", (double)analysisResultPtr->popAmplitude ); - printf(" num added frames: %10.3f\n", analysisResultPtr->numAddedFrames ); - printf(" added frames at: %10.3f\n", analysisResultPtr->addedFramesPosition ); - printf(" num dropped frames: %10.3f\n", analysisResultPtr->numDroppedFrames ); - printf(" dropped frames at: %10.3f\n", analysisResultPtr->droppedFramesPosition ); + printf("\n=== Loopback Analysis ===================\n"); + printf(" channel: %d\n", channel ); + printf(" latency: %10.3f\n", analysisResultPtr->latency ); + printf(" amplitudeRatio: %10.3f\n", (double)analysisResultPtr->amplitudeRatio ); + printf(" popPosition: %10.3f\n", (double)analysisResultPtr->popPosition ); + printf(" popAmplitude: %10.3f\n", (double)analysisResultPtr->popAmplitude ); + printf(" num added frames: %10.3f\n", analysisResultPtr->numAddedFrames ); + printf(" added frames at: %10.3f\n", analysisResultPtr->addedFramesPosition ); + printf(" num dropped frames: %10.3f\n", analysisResultPtr->numDroppedFrames ); + printf(" dropped frames at: %10.3f\n", analysisResultPtr->droppedFramesPosition ); } /*******************************************************************/ -/** +/** * Test loopback connection using the given parameters. * @return number of channels with glitches, or negative error. */ static int PaQa_SingleLoopBackTest( UserOptions *userOptions, TestParameters *testParams ) { - int i; - LoopbackContext loopbackContext; - PaError err = paNoError; - PaQaTestTone testTone; - PaQaAnalysisResult analysisResult; - int numBadChannels = 0; - - printf("| %5d | %6d | ", ((int)(testParams->sampleRate+0.5)), testParams->framesPerBuffer ); - fflush(stdout); - - testTone.samplesPerFrame = testParams->samplesPerFrame; - testTone.sampleRate = testParams->sampleRate; - testTone.amplitude = testParams->amplitude; - testTone.startDelay = 0; - - err = PaQa_SetupLoopbackContext( &loopbackContext, testParams ); - if( err ) return err; - - err = PaQa_RunLoopback( &loopbackContext ); - QA_ASSERT_TRUE("loopback did not run", (loopbackContext.callbackCount > 1) ); + int i; + LoopbackContext loopbackContext; + PaError err = paNoError; + PaQaTestTone testTone; + PaQaAnalysisResult analysisResult; + int numBadChannels = 0; - printf( "%7.2f %7.2f %7.2f | ", - loopbackContext.streamInfoInputLatency * 1000.0, - loopbackContext.streamInfoOutputLatency * 1000.0, - (loopbackContext.streamInfoInputLatency + loopbackContext.streamInfoOutputLatency) * 1000.0 - ); + printf("| %5d | %6d | ", ((int)(testParams->sampleRate+0.5)), testParams->framesPerBuffer ); + fflush(stdout); - printf( "%4d/%4d/%4d, %4d/%4d/%4d | ", - loopbackContext.inputOverflowCount, - loopbackContext.inputUnderflowCount, - loopbackContext.inputBufferCount, - loopbackContext.outputOverflowCount, - loopbackContext.outputUnderflowCount, - loopbackContext.outputBufferCount - ); - - // Analyse recording to detect glitches. - for( i=0; isamplesPerFrame; i++ ) - { - double freq = PaQa_GetNthFrequency( testParams->baseFrequency, i ); - testTone.frequency = freq; - - PaQa_AnalyseRecording( &loopbackContext.recordings[i], &testTone, &analysisResult ); - - if( i==0 ) - { + testTone.samplesPerFrame = testParams->samplesPerFrame; + testTone.sampleRate = testParams->sampleRate; + testTone.amplitude = testParams->amplitude; + testTone.startDelay = 0; + + err = PaQa_SetupLoopbackContext( &loopbackContext, testParams ); + if( err ) return err; + + err = PaQa_RunLoopback( &loopbackContext ); + QA_ASSERT_TRUE("loopback did not run", (loopbackContext.callbackCount > 1) ); + + printf( "%7.2f %7.2f %7.2f | ", + loopbackContext.streamInfoInputLatency * 1000.0, + loopbackContext.streamInfoOutputLatency * 1000.0, + (loopbackContext.streamInfoInputLatency + loopbackContext.streamInfoOutputLatency) * 1000.0 + ); + + printf( "%4d/%4d/%4d, %4d/%4d/%4d | ", + loopbackContext.inputOverflowCount, + loopbackContext.inputUnderflowCount, + loopbackContext.inputBufferCount, + loopbackContext.outputOverflowCount, + loopbackContext.outputUnderflowCount, + loopbackContext.outputBufferCount + ); + + // Analyse recording to detect glitches. + for( i=0; isamplesPerFrame; i++ ) + { + double freq = PaQa_GetNthFrequency( testParams->baseFrequency, i ); + testTone.frequency = freq; + + PaQa_AnalyseRecording( &loopbackContext.recordings[i], &testTone, &analysisResult ); + + if( i==0 ) + { double latencyMSec; - printf( "%4d-%4d | ", - loopbackContext.minFramesPerBuffer, - loopbackContext.maxFramesPerBuffer - ); - - latencyMSec = 1000.0 * analysisResult.latency / testParams->sampleRate; - printf("%7.2f | ", latencyMSec ); - - } - - if( analysisResult.valid ) - { - int badChannel = ( (analysisResult.popPosition > 0) - || (analysisResult.addedFramesPosition > 0) - || (analysisResult.droppedFramesPosition > 0) ); - - if( badChannel ) - { - if( userOptions->verbose ) - { - PaQa_PrintFullErrorReport( &analysisResult, i ); - } - else - { - PaQa_PrintShortErrorReport( &analysisResult, i ); - } - PaQa_SaveTestResultToWaveFile( userOptions, &loopbackContext.recordings[i] ); - } - numBadChannels += badChannel; - } - else - { - printf( "[%d] No or low signal, ampRatio = %f", i, analysisResult.amplitudeRatio ); - numBadChannels += 1; - } + printf( "%4d-%4d | ", + loopbackContext.minFramesPerBuffer, + loopbackContext.maxFramesPerBuffer + ); - } - if( numBadChannels == 0 ) - { - printf( "OK" ); - } + latencyMSec = 1000.0 * analysisResult.latency / testParams->sampleRate; + printf("%7.2f | ", latencyMSec ); + + } + + if( analysisResult.valid ) + { + int badChannel = ( (analysisResult.popPosition > 0) + || (analysisResult.addedFramesPosition > 0) + || (analysisResult.droppedFramesPosition > 0) ); + + if( badChannel ) + { + if( userOptions->verbose ) + { + PaQa_PrintFullErrorReport( &analysisResult, i ); + } + else + { + PaQa_PrintShortErrorReport( &analysisResult, i ); + } + PaQa_SaveTestResultToWaveFile( userOptions, &loopbackContext.recordings[i] ); + } + numBadChannels += badChannel; + } + else + { + printf( "[%d] No or low signal, ampRatio = %f", i, analysisResult.amplitudeRatio ); + numBadChannels += 1; + } + + } + if( numBadChannels == 0 ) + { + printf( "OK" ); + } // Print the # errors so far to make it easier to see where the error occurred. - printf( " - #errs = %d\n", g_testsFailed ); + printf( " - #errs = %d\n", g_testsFailed ); + + PaQa_TeardownLoopbackContext( &loopbackContext ); + if( numBadChannels > 0 ) + { + g_testsFailed += 1; + } + return numBadChannels; - PaQa_TeardownLoopbackContext( &loopbackContext ); - if( numBadChannels > 0 ) - { - g_testsFailed += 1; - } - return numBadChannels; - error: - PaQa_TeardownLoopbackContext( &loopbackContext ); - printf( "\n" ); - g_testsFailed += 1; - return err; + PaQa_TeardownLoopbackContext( &loopbackContext ); + printf( "\n" ); + g_testsFailed += 1; + return err; } /*******************************************************************/ static void PaQa_SetDefaultTestParameters( TestParameters *testParamsPtr, PaDeviceIndex inputDevice, PaDeviceIndex outputDevice ) { - memset( testParamsPtr, 0, sizeof(TestParameters) ); - - testParamsPtr->samplesPerFrame = 2; - testParamsPtr->amplitude = 0.5; - testParamsPtr->sampleRate = 44100; - testParamsPtr->maxFrames = (int) (PAQA_TEST_DURATION * testParamsPtr->sampleRate); - testParamsPtr->framesPerBuffer = DEFAULT_FRAMES_PER_BUFFER; - testParamsPtr->baseFrequency = 200.0; - testParamsPtr->flags = PAQA_FLAG_TWO_STREAMS; + memset( testParamsPtr, 0, sizeof(TestParameters) ); + + testParamsPtr->samplesPerFrame = 2; + testParamsPtr->amplitude = 0.5; + testParamsPtr->sampleRate = 44100; + testParamsPtr->maxFrames = (int) (PAQA_TEST_DURATION * testParamsPtr->sampleRate); + testParamsPtr->framesPerBuffer = DEFAULT_FRAMES_PER_BUFFER; + testParamsPtr->baseFrequency = 200.0; + testParamsPtr->flags = PAQA_FLAG_TWO_STREAMS; testParamsPtr->streamFlags = paClipOff; /* we won't output out of range samples so don't bother clipping them */ - - testParamsPtr->inputParameters.device = inputDevice; - testParamsPtr->inputParameters.sampleFormat = paFloat32; - testParamsPtr->inputParameters.channelCount = testParamsPtr->samplesPerFrame; - testParamsPtr->inputParameters.suggestedLatency = Pa_GetDeviceInfo( inputDevice )->defaultLowInputLatency; - //testParamsPtr->inputParameters.suggestedLatency = Pa_GetDeviceInfo( inputDevice )->defaultHighInputLatency; - - testParamsPtr->outputParameters.device = outputDevice; - testParamsPtr->outputParameters.sampleFormat = paFloat32; - testParamsPtr->outputParameters.channelCount = testParamsPtr->samplesPerFrame; - testParamsPtr->outputParameters.suggestedLatency = Pa_GetDeviceInfo( outputDevice )->defaultLowOutputLatency; - //testParamsPtr->outputParameters.suggestedLatency = Pa_GetDeviceInfo( outputDevice )->defaultHighOutputLatency; + + testParamsPtr->inputParameters.device = inputDevice; + testParamsPtr->inputParameters.sampleFormat = paFloat32; + testParamsPtr->inputParameters.channelCount = testParamsPtr->samplesPerFrame; + testParamsPtr->inputParameters.suggestedLatency = Pa_GetDeviceInfo( inputDevice )->defaultLowInputLatency; + //testParamsPtr->inputParameters.suggestedLatency = Pa_GetDeviceInfo( inputDevice )->defaultHighInputLatency; + + testParamsPtr->outputParameters.device = outputDevice; + testParamsPtr->outputParameters.sampleFormat = paFloat32; + testParamsPtr->outputParameters.channelCount = testParamsPtr->samplesPerFrame; + testParamsPtr->outputParameters.suggestedLatency = Pa_GetDeviceInfo( outputDevice )->defaultLowOutputLatency; + //testParamsPtr->outputParameters.suggestedLatency = Pa_GetDeviceInfo( outputDevice )->defaultHighOutputLatency; } /*******************************************************************/ static void PaQa_OverrideTestParameters( TestParameters *testParamsPtr, UserOptions *userOptions ) { - // Check to see if a specific value was requested. - if( userOptions->sampleRate >= 0 ) - { - testParamsPtr->sampleRate = userOptions->sampleRate; - testParamsPtr->maxFrames = (int) (PAQA_TEST_DURATION * testParamsPtr->sampleRate); - } - if( userOptions->framesPerBuffer >= 0 ) - { - testParamsPtr->framesPerBuffer = userOptions->framesPerBuffer; - } - if( userOptions->inputLatency >= 0 ) - { - testParamsPtr->inputParameters.suggestedLatency = userOptions->inputLatency * 0.001; - } - if( userOptions->outputLatency >= 0 ) - { - testParamsPtr->outputParameters.suggestedLatency = userOptions->outputLatency * 0.001; - } - printf( " Running with suggested latency (msec): input = %5.2f, out = %5.2f\n", - (testParamsPtr->inputParameters.suggestedLatency * 1000.0), - (testParamsPtr->outputParameters.suggestedLatency * 1000.0) ); + // Check to see if a specific value was requested. + if( userOptions->sampleRate >= 0 ) + { + testParamsPtr->sampleRate = userOptions->sampleRate; + testParamsPtr->maxFrames = (int) (PAQA_TEST_DURATION * testParamsPtr->sampleRate); + } + if( userOptions->framesPerBuffer >= 0 ) + { + testParamsPtr->framesPerBuffer = userOptions->framesPerBuffer; + } + if( userOptions->inputLatency >= 0 ) + { + testParamsPtr->inputParameters.suggestedLatency = userOptions->inputLatency * 0.001; + } + if( userOptions->outputLatency >= 0 ) + { + testParamsPtr->outputParameters.suggestedLatency = userOptions->outputLatency * 0.001; + } + printf( " Running with suggested latency (msec): input = %5.2f, out = %5.2f\n", + (testParamsPtr->inputParameters.suggestedLatency * 1000.0), + (testParamsPtr->outputParameters.suggestedLatency * 1000.0) ); } /*******************************************************************/ -/** +/** * Run a series of tests on this loopback connection. * @return number of bad channel results */ static int PaQa_AnalyzeLoopbackConnection( UserOptions *userOptions, PaDeviceIndex inputDevice, PaDeviceIndex outputDevice ) { - int iFlags; - int iRate; - int iSize; - int iFormat; - int savedValue; - TestParameters testParams; - const PaDeviceInfo *inputDeviceInfo = Pa_GetDeviceInfo( inputDevice ); - const PaDeviceInfo *outputDeviceInfo = Pa_GetDeviceInfo( outputDevice ); + int iFlags; + int iRate; + int iSize; + int iFormat; + int savedValue; + TestParameters testParams; + const PaDeviceInfo *inputDeviceInfo = Pa_GetDeviceInfo( inputDevice ); + const PaDeviceInfo *outputDeviceInfo = Pa_GetDeviceInfo( outputDevice ); int totalBadChannels = 0; - // test half duplex first because it is more likely to work. - int flagSettings[] = { PAQA_FLAG_TWO_STREAMS, 0 }; - int numFlagSettings = (sizeof(flagSettings)/sizeof(int)); + // test half duplex first because it is more likely to work. + int flagSettings[] = { PAQA_FLAG_TWO_STREAMS, 0 }; + int numFlagSettings = (sizeof(flagSettings)/sizeof(int)); + + double sampleRates[] = { 8000.0, 11025.0, 16000.0, 22050.0, 32000.0, 44100.0, 48000.0, 96000.0 }; + int numRates = (sizeof(sampleRates)/sizeof(double)); + + // framesPerBuffer==0 means PA decides on the buffer size. + int framesPerBuffers[] = { 0, 16, 32, 40, 64, 100, 128, 256, 512, 1024 }; + int numBufferSizes = (sizeof(framesPerBuffers)/sizeof(int)); + + PaSampleFormat sampleFormats[] = { paFloat32, paUInt8, paInt8, paInt16, paInt32 }; + const char *sampleFormatNames[] = { "paFloat32", "paUInt8", "paInt8", "paInt16", "paInt32" }; + int numSampleFormats = (sizeof(sampleFormats)/sizeof(PaSampleFormat)); - double sampleRates[] = { 8000.0, 11025.0, 16000.0, 22050.0, 32000.0, 44100.0, 48000.0, 96000.0 }; - int numRates = (sizeof(sampleRates)/sizeof(double)); - - // framesPerBuffer==0 means PA decides on the buffer size. - int framesPerBuffers[] = { 0, 16, 32, 40, 64, 100, 128, 256, 512, 1024 }; - int numBufferSizes = (sizeof(framesPerBuffers)/sizeof(int)); - - PaSampleFormat sampleFormats[] = { paFloat32, paUInt8, paInt8, paInt16, paInt32 }; - const char *sampleFormatNames[] = { "paFloat32", "paUInt8", "paInt8", "paInt16", "paInt32" }; - int numSampleFormats = (sizeof(sampleFormats)/sizeof(PaSampleFormat)); - printf( "=============== Analysing Loopback %d to %d =====================\n", outputDevice, inputDevice ); - printf( " Devices: %s => %s\n", outputDeviceInfo->name, inputDeviceInfo->name); - - PaQa_SetDefaultTestParameters( &testParams, inputDevice, outputDevice ); - - PaQa_OverrideTestParameters( &testParams, userOptions ); - - // Loop though combinations of audio parameters. - for( iFlags=0; iFlags %s\n", outputDeviceInfo->name, inputDeviceInfo->name); - testParams.flags = flagSettings[iFlags]; - printf( "\n************ Mode = %s ************\n", - (( testParams.flags & 1 ) ? s_FlagOnNames[0] : s_FlagOffNames[0]) ); + PaQa_SetDefaultTestParameters( &testParams, inputDevice, outputDevice ); - printf("|- requested -|- stream info latency -|- measured ------------------------------\n"); - printf("|-sRate-|-fr/buf-|- in - out - total -|- over/under/calls for in, out -|- frm/buf -|-latency-|- channel results -\n"); + PaQa_OverrideTestParameters( &testParams, userOptions ); - // Loop though various sample rates. - if( userOptions->sampleRate < 0 ) - { - savedValue = testParams.sampleRate; - for( iRate=0; iRatesampleRate < 0 ) + { + savedValue = testParams.sampleRate; + for( iRate=0; iRateframesPerBuffer < 0 ) - { - savedValue = testParams.framesPerBuffer; - for( iSize=0; iSizeframesPerBuffer < 0 ) + { + savedValue = testParams.framesPerBuffer; + for( iSize=0; iSizetest; - - // Start in the middle assuming past latency. - int startFrame = testParamsPtr->maxFrames/2; - int numFrames = testParamsPtr->maxFrames/2; - - // Check to see if the signal is clipped. - double amplitudeLeft = PaQa_MeasureSineAmplitudeBySlope( &loopbackContextPtr->recordings[0], - testParamsPtr->baseFrequency, testParamsPtr->sampleRate, - startFrame, numFrames ); - double gainLeft = amplitudeLeft / testParamsPtr->amplitude; - double amplitudeRight = PaQa_MeasureSineAmplitudeBySlope( &loopbackContextPtr->recordings[1], - testParamsPtr->baseFrequency, testParamsPtr->sampleRate, - startFrame, numFrames ); - double gainRight = amplitudeLeft / testParamsPtr->amplitude; - printf(" Loop gain: left = %f, right = %f\n", gainLeft, gainRight ); + int clipped = 0; + TestParameters *testParamsPtr = loopbackContextPtr->test; - if( (amplitudeLeft > 1.0 ) || (amplitudeRight > 1.0) ) - { - printf("ERROR - loop gain is too high. Should be around than 1.0. Please lower output level and/or input gain.\n" ); - clipped = 1; - } - return clipped; + // Start in the middle assuming past latency. + int startFrame = testParamsPtr->maxFrames/2; + int numFrames = testParamsPtr->maxFrames/2; + + // Check to see if the signal is clipped. + double amplitudeLeft = PaQa_MeasureSineAmplitudeBySlope( &loopbackContextPtr->recordings[0], + testParamsPtr->baseFrequency, testParamsPtr->sampleRate, + startFrame, numFrames ); + double gainLeft = amplitudeLeft / testParamsPtr->amplitude; + double amplitudeRight = PaQa_MeasureSineAmplitudeBySlope( &loopbackContextPtr->recordings[1], + testParamsPtr->baseFrequency, testParamsPtr->sampleRate, + startFrame, numFrames ); + double gainRight = amplitudeLeft / testParamsPtr->amplitude; + printf(" Loop gain: left = %f, right = %f\n", gainLeft, gainRight ); + + if( (amplitudeLeft > 1.0 ) || (amplitudeRight > 1.0) ) + { + printf("ERROR - loop gain is too high. Should be around than 1.0. Please lower output level and/or input gain.\n" ); + clipped = 1; + } + return clipped; } /*******************************************************************/ int PaQa_MeasureBackgroundNoise( LoopbackContext *loopbackContextPtr, double *rmsPtr ) { - int result = 0; - *rmsPtr = 0.0; - // Rewind so we can record some input. - loopbackContextPtr->recordings[0].numFrames = 0; - loopbackContextPtr->recordings[1].numFrames = 0; - result = PaQa_RunInputOnly( loopbackContextPtr ); - if( result == 0 ) - { - double leftRMS = PaQa_MeasureRootMeanSquare( loopbackContextPtr->recordings[0].buffer, - loopbackContextPtr->recordings[0].numFrames ); - double rightRMS = PaQa_MeasureRootMeanSquare( loopbackContextPtr->recordings[1].buffer, - loopbackContextPtr->recordings[1].numFrames ); - *rmsPtr = (leftRMS + rightRMS) / 2.0; - } - return result; + int result = 0; + *rmsPtr = 0.0; + // Rewind so we can record some input. + loopbackContextPtr->recordings[0].numFrames = 0; + loopbackContextPtr->recordings[1].numFrames = 0; + result = PaQa_RunInputOnly( loopbackContextPtr ); + if( result == 0 ) + { + double leftRMS = PaQa_MeasureRootMeanSquare( loopbackContextPtr->recordings[0].buffer, + loopbackContextPtr->recordings[0].numFrames ); + double rightRMS = PaQa_MeasureRootMeanSquare( loopbackContextPtr->recordings[1].buffer, + loopbackContextPtr->recordings[1].numFrames ); + *rmsPtr = (leftRMS + rightRMS) / 2.0; + } + return result; } /*******************************************************************/ -/** +/** * Output a sine wave then try to detect it on input. * * @return 1 if loopback connected, 0 if not, or negative error. */ int PaQa_CheckForLoopBack( UserOptions *userOptions, PaDeviceIndex inputDevice, PaDeviceIndex outputDevice ) { - TestParameters testParams; - LoopbackContext loopbackContext; - const PaDeviceInfo *inputDeviceInfo; - const PaDeviceInfo *outputDeviceInfo; - PaError err = paNoError; - double minAmplitude; - int loopbackIsConnected; + TestParameters testParams; + LoopbackContext loopbackContext; + const PaDeviceInfo *inputDeviceInfo; + const PaDeviceInfo *outputDeviceInfo; + PaError err = paNoError; + double minAmplitude; + int loopbackIsConnected; int startFrame, numFrames; double magLeft, magRight; - inputDeviceInfo = Pa_GetDeviceInfo( inputDevice ); - if( inputDeviceInfo == NULL ) - { - printf("ERROR - Pa_GetDeviceInfo for input returned NULL.\n"); - return paInvalidDevice; - } - if( inputDeviceInfo->maxInputChannels < 2 ) - { - return 0; - } - - outputDeviceInfo = Pa_GetDeviceInfo( outputDevice ); - if( outputDeviceInfo == NULL ) - { - printf("ERROR - Pa_GetDeviceInfo for output returned NULL.\n"); - return paInvalidDevice; - } - if( outputDeviceInfo->maxOutputChannels < 2 ) - { - return 0; - } - - printf( "Look for loopback cable between \"%s\" => \"%s\"\n", outputDeviceInfo->name, inputDeviceInfo->name); - - printf( " Default suggested input latency (msec): low = %5.2f, high = %5.2f\n", - (inputDeviceInfo->defaultLowInputLatency * 1000.0), - (inputDeviceInfo->defaultHighInputLatency * 1000.0) ); - printf( " Default suggested output latency (msec): low = %5.2f, high = %5.2f\n", - (outputDeviceInfo->defaultLowOutputLatency * 1000.0), - (outputDeviceInfo->defaultHighOutputLatency * 1000.0) ); - - PaQa_SetDefaultTestParameters( &testParams, inputDevice, outputDevice ); - - PaQa_OverrideTestParameters( &testParams, userOptions ); - - testParams.maxFrames = (int) (LOOPBACK_DETECTION_DURATION_SECONDS * testParams.sampleRate); - minAmplitude = testParams.amplitude / 4.0; - - // Check to see if the selected formats are supported. - if( Pa_IsFormatSupported( &testParams.inputParameters, NULL, testParams.sampleRate ) != paFormatIsSupported ) - { - printf( "Input not supported for this format!\n" ); - return 0; - } - if( Pa_IsFormatSupported( NULL, &testParams.outputParameters, testParams.sampleRate ) != paFormatIsSupported ) - { - printf( "Output not supported for this format!\n" ); - return 0; - } - - PaQa_SetupLoopbackContext( &loopbackContext, &testParams ); - - if( inputDevice == outputDevice ) - { - // Use full duplex if checking for loopback on one device. - testParams.flags &= ~PAQA_FLAG_TWO_STREAMS; - } - else - { - // Use half duplex if checking for loopback on two different device. - testParams.flags = PAQA_FLAG_TWO_STREAMS; - } - err = PaQa_RunLoopback( &loopbackContext ); - QA_ASSERT_TRUE("loopback detection callback did not run", (loopbackContext.callbackCount > 1) ); - - // Analyse recording to see if we captured the output. - // Start in the middle assuming past latency. - startFrame = testParams.maxFrames/2; - numFrames = testParams.maxFrames/2; - magLeft = PaQa_CorrelateSine( &loopbackContext.recordings[0], - loopbackContext.generators[0].frequency, - testParams.sampleRate, - startFrame, numFrames, NULL ); - magRight = PaQa_CorrelateSine( &loopbackContext.recordings[1], - loopbackContext.generators[1].frequency, - testParams.sampleRate, - startFrame, numFrames, NULL ); - printf(" Amplitudes: left = %f, right = %f\n", magLeft, magRight ); - - // Check for backwards cable. + inputDeviceInfo = Pa_GetDeviceInfo( inputDevice ); + if( inputDeviceInfo == NULL ) + { + printf("ERROR - Pa_GetDeviceInfo for input returned NULL.\n"); + return paInvalidDevice; + } + if( inputDeviceInfo->maxInputChannels < 2 ) + { + return 0; + } + + outputDeviceInfo = Pa_GetDeviceInfo( outputDevice ); + if( outputDeviceInfo == NULL ) + { + printf("ERROR - Pa_GetDeviceInfo for output returned NULL.\n"); + return paInvalidDevice; + } + if( outputDeviceInfo->maxOutputChannels < 2 ) + { + return 0; + } + + printf( "Look for loopback cable between \"%s\" => \"%s\"\n", outputDeviceInfo->name, inputDeviceInfo->name); + + printf( " Default suggested input latency (msec): low = %5.2f, high = %5.2f\n", + (inputDeviceInfo->defaultLowInputLatency * 1000.0), + (inputDeviceInfo->defaultHighInputLatency * 1000.0) ); + printf( " Default suggested output latency (msec): low = %5.2f, high = %5.2f\n", + (outputDeviceInfo->defaultLowOutputLatency * 1000.0), + (outputDeviceInfo->defaultHighOutputLatency * 1000.0) ); + + PaQa_SetDefaultTestParameters( &testParams, inputDevice, outputDevice ); + + PaQa_OverrideTestParameters( &testParams, userOptions ); + + testParams.maxFrames = (int) (LOOPBACK_DETECTION_DURATION_SECONDS * testParams.sampleRate); + minAmplitude = testParams.amplitude / 4.0; + + // Check to see if the selected formats are supported. + if( Pa_IsFormatSupported( &testParams.inputParameters, NULL, testParams.sampleRate ) != paFormatIsSupported ) + { + printf( "Input not supported for this format!\n" ); + return 0; + } + if( Pa_IsFormatSupported( NULL, &testParams.outputParameters, testParams.sampleRate ) != paFormatIsSupported ) + { + printf( "Output not supported for this format!\n" ); + return 0; + } + + PaQa_SetupLoopbackContext( &loopbackContext, &testParams ); + + if( inputDevice == outputDevice ) + { + // Use full duplex if checking for loopback on one device. + testParams.flags &= ~PAQA_FLAG_TWO_STREAMS; + } + else + { + // Use half duplex if checking for loopback on two different device. + testParams.flags = PAQA_FLAG_TWO_STREAMS; + } + err = PaQa_RunLoopback( &loopbackContext ); + QA_ASSERT_TRUE("loopback detection callback did not run", (loopbackContext.callbackCount > 1) ); + + // Analyse recording to see if we captured the output. + // Start in the middle assuming past latency. + startFrame = testParams.maxFrames/2; + numFrames = testParams.maxFrames/2; + magLeft = PaQa_CorrelateSine( &loopbackContext.recordings[0], + loopbackContext.generators[0].frequency, + testParams.sampleRate, + startFrame, numFrames, NULL ); + magRight = PaQa_CorrelateSine( &loopbackContext.recordings[1], + loopbackContext.generators[1].frequency, + testParams.sampleRate, + startFrame, numFrames, NULL ); + printf(" Amplitudes: left = %f, right = %f\n", magLeft, magRight ); + + // Check for backwards cable. loopbackIsConnected = ((magLeft > minAmplitude) && (magRight > minAmplitude)); - if( !loopbackIsConnected ) - { - double magLeftReverse = PaQa_CorrelateSine( &loopbackContext.recordings[0], - loopbackContext.generators[1].frequency, - testParams.sampleRate, - startFrame, numFrames, NULL ); - - double magRightReverse = PaQa_CorrelateSine( &loopbackContext.recordings[1], - loopbackContext.generators[0].frequency, - testParams.sampleRate, - startFrame, numFrames, NULL ); - - if ((magLeftReverse > minAmplitude) && (magRightReverse>minAmplitude)) - { - printf("ERROR - You seem to have the left and right channels swapped on the loopback cable!\n"); - } - } - else - { - double rms = 0.0; - if( PaQa_CheckForClippedLoopback( &loopbackContext ) ) - { - // Clipped so don't use this loopback. - loopbackIsConnected = 0; - } - - err = PaQa_MeasureBackgroundNoise( &loopbackContext, &rms ); - printf(" Background noise = %f\n", rms ); - if( err ) - { - printf("ERROR - Could not measure background noise on this input!\n"); - loopbackIsConnected = 0; - } - else if( rms > MAX_BACKGROUND_NOISE_RMS ) - { - printf("ERROR - There is too much background noise on this input!\n"); - loopbackIsConnected = 0; - } - } - - PaQa_TeardownLoopbackContext( &loopbackContext ); - return loopbackIsConnected; - + if( !loopbackIsConnected ) + { + double magLeftReverse = PaQa_CorrelateSine( &loopbackContext.recordings[0], + loopbackContext.generators[1].frequency, + testParams.sampleRate, + startFrame, numFrames, NULL ); + + double magRightReverse = PaQa_CorrelateSine( &loopbackContext.recordings[1], + loopbackContext.generators[0].frequency, + testParams.sampleRate, + startFrame, numFrames, NULL ); + + if ((magLeftReverse > minAmplitude) && (magRightReverse>minAmplitude)) + { + printf("ERROR - You seem to have the left and right channels swapped on the loopback cable!\n"); + } + } + else + { + double rms = 0.0; + if( PaQa_CheckForClippedLoopback( &loopbackContext ) ) + { + // Clipped so don't use this loopback. + loopbackIsConnected = 0; + } + + err = PaQa_MeasureBackgroundNoise( &loopbackContext, &rms ); + printf(" Background noise = %f\n", rms ); + if( err ) + { + printf("ERROR - Could not measure background noise on this input!\n"); + loopbackIsConnected = 0; + } + else if( rms > MAX_BACKGROUND_NOISE_RMS ) + { + printf("ERROR - There is too much background noise on this input!\n"); + loopbackIsConnected = 0; + } + } + + PaQa_TeardownLoopbackContext( &loopbackContext ); + return loopbackIsConnected; + error: - PaQa_TeardownLoopbackContext( &loopbackContext ); - return err; + PaQa_TeardownLoopbackContext( &loopbackContext ); + return err; } /*******************************************************************/ @@ -1289,17 +1289,17 @@ error: * If there is a loopback connection then run the analysis. */ static int CheckLoopbackAndScan( UserOptions *userOptions, - PaDeviceIndex iIn, PaDeviceIndex iOut ) + PaDeviceIndex iIn, PaDeviceIndex iOut ) { - int loopbackConnected = PaQa_CheckForLoopBack( userOptions, iIn, iOut ); - if( loopbackConnected > 0 ) - { - PaQa_AnalyzeLoopbackConnection( userOptions, iIn, iOut ); - return 1; - } - return 0; + int loopbackConnected = PaQa_CheckForLoopBack( userOptions, iIn, iOut ); + if( loopbackConnected > 0 ) + { + PaQa_AnalyzeLoopbackConnection( userOptions, iIn, iOut ); + return 1; + } + return 0; } - + /*******************************************************************/ /** * Scan every combination of output to input device. @@ -1308,294 +1308,294 @@ static int CheckLoopbackAndScan( UserOptions *userOptions, */ static int ScanForLoopback(UserOptions *userOptions) { - PaDeviceIndex iIn,iOut; - int numLoopbacks = 0; + PaDeviceIndex iIn,iOut; + int numLoopbacks = 0; int numDevices; - numDevices = Pa_GetDeviceCount(); - - // If both devices are specified then just use that combination. - if ((userOptions->inputDevice >= 0) && (userOptions->outputDevice >= 0)) - { - numLoopbacks += CheckLoopbackAndScan( userOptions, userOptions->inputDevice, userOptions->outputDevice ); - } - else if (userOptions->inputDevice >= 0) - { - // Just scan for output. - for( iOut=0; iOutinputDevice, iOut ); - } - } - else if (userOptions->outputDevice >= 0) - { - // Just scan for input. - for( iIn=0; iInoutputDevice ); - } - } - else - { - // Scan both. - for( iOut=0; iOut 0) ); - return numLoopbacks; - + numDevices = Pa_GetDeviceCount(); + + // If both devices are specified then just use that combination. + if ((userOptions->inputDevice >= 0) && (userOptions->outputDevice >= 0)) + { + numLoopbacks += CheckLoopbackAndScan( userOptions, userOptions->inputDevice, userOptions->outputDevice ); + } + else if (userOptions->inputDevice >= 0) + { + // Just scan for output. + for( iOut=0; iOutinputDevice, iOut ); + } + } + else if (userOptions->outputDevice >= 0) + { + // Just scan for input. + for( iIn=0; iInoutputDevice ); + } + } + else + { + // Scan both. + for( iOut=0; iOut 0) ); + return numLoopbacks; + error: - return -1; + return -1; } /*==========================================================================================*/ int TestSampleFormatConversion( void ) { - int i; - const float floatInput[] = { 1.0, 0.5, -0.5, -1.0 }; - - const char charInput[] = { 127, 64, -64, -128 }; - const unsigned char ucharInput[] = { 255, 128+64, 64, 0 }; - const short shortInput[] = { 32767, 32768/2, -32768/2, -32768 }; - const int intInput[] = { 2147483647, 2147483647/2, -1073741824 /*-2147483648/2 doesn't work in msvc*/, -2147483648 }; - - float floatOutput[4]; - short shortOutput[4]; - int intOutput[4]; - unsigned char ucharOutput[4]; - char charOutput[4]; - - QA_ASSERT_EQUALS("int must be 32-bit", 4, (int) sizeof(int) ); - QA_ASSERT_EQUALS("short must be 16-bit", 2, (int) sizeof(short) ); - - // from Float ====== - PaQa_ConvertFromFloat( floatInput, 4, paUInt8, ucharOutput ); - for( i=0; i<4; i++ ) - { - QA_ASSERT_CLOSE_INT( "paFloat32 -> paUInt8 -> error", ucharInput[i], ucharOutput[i], 1 ); - } - - PaQa_ConvertFromFloat( floatInput, 4, paInt8, charOutput ); - for( i=0; i<4; i++ ) - { - QA_ASSERT_CLOSE_INT( "paFloat32 -> paInt8 -> error", charInput[i], charOutput[i], 1 ); - } - - PaQa_ConvertFromFloat( floatInput, 4, paInt16, shortOutput ); - for( i=0; i<4; i++ ) - { - QA_ASSERT_CLOSE_INT( "paFloat32 -> paInt16 error", shortInput[i], shortOutput[i], 1 ); - } - - PaQa_ConvertFromFloat( floatInput, 4, paInt32, intOutput ); - for( i=0; i<4; i++ ) - { - QA_ASSERT_CLOSE_INT( "paFloat32 -> paInt32 error", intInput[i], intOutput[i], 0x00010000 ); - } - - - // to Float ====== - memset( floatOutput, 0, sizeof(floatOutput) ); - PaQa_ConvertToFloat( ucharInput, 4, paUInt8, floatOutput ); - for( i=0; i<4; i++ ) - { - QA_ASSERT_CLOSE( "paUInt8 -> paFloat32 error", floatInput[i], floatOutput[i], 0.01 ); - } - - memset( floatOutput, 0, sizeof(floatOutput) ); - PaQa_ConvertToFloat( charInput, 4, paInt8, floatOutput ); - for( i=0; i<4; i++ ) - { - QA_ASSERT_CLOSE( "paInt8 -> paFloat32 error", floatInput[i], floatOutput[i], 0.01 ); - } - - memset( floatOutput, 0, sizeof(floatOutput) ); - PaQa_ConvertToFloat( shortInput, 4, paInt16, floatOutput ); - for( i=0; i<4; i++ ) - { - QA_ASSERT_CLOSE( "paInt16 -> paFloat32 error", floatInput[i], floatOutput[i], 0.001 ); - } - - memset( floatOutput, 0, sizeof(floatOutput) ); - PaQa_ConvertToFloat( intInput, 4, paInt32, floatOutput ); - for( i=0; i<4; i++ ) - { - QA_ASSERT_CLOSE( "paInt32 -> paFloat32 error", floatInput[i], floatOutput[i], 0.00001 ); - } - - return 0; - + int i; + const float floatInput[] = { 1.0, 0.5, -0.5, -1.0 }; + + const char charInput[] = { 127, 64, -64, -128 }; + const unsigned char ucharInput[] = { 255, 128+64, 64, 0 }; + const short shortInput[] = { 32767, 32768/2, -32768/2, -32768 }; + const int intInput[] = { 2147483647, 2147483647/2, -1073741824 /*-2147483648/2 doesn't work in msvc*/, -2147483648 }; + + float floatOutput[4]; + short shortOutput[4]; + int intOutput[4]; + unsigned char ucharOutput[4]; + char charOutput[4]; + + QA_ASSERT_EQUALS("int must be 32-bit", 4, (int) sizeof(int) ); + QA_ASSERT_EQUALS("short must be 16-bit", 2, (int) sizeof(short) ); + + // from Float ====== + PaQa_ConvertFromFloat( floatInput, 4, paUInt8, ucharOutput ); + for( i=0; i<4; i++ ) + { + QA_ASSERT_CLOSE_INT( "paFloat32 -> paUInt8 -> error", ucharInput[i], ucharOutput[i], 1 ); + } + + PaQa_ConvertFromFloat( floatInput, 4, paInt8, charOutput ); + for( i=0; i<4; i++ ) + { + QA_ASSERT_CLOSE_INT( "paFloat32 -> paInt8 -> error", charInput[i], charOutput[i], 1 ); + } + + PaQa_ConvertFromFloat( floatInput, 4, paInt16, shortOutput ); + for( i=0; i<4; i++ ) + { + QA_ASSERT_CLOSE_INT( "paFloat32 -> paInt16 error", shortInput[i], shortOutput[i], 1 ); + } + + PaQa_ConvertFromFloat( floatInput, 4, paInt32, intOutput ); + for( i=0; i<4; i++ ) + { + QA_ASSERT_CLOSE_INT( "paFloat32 -> paInt32 error", intInput[i], intOutput[i], 0x00010000 ); + } + + + // to Float ====== + memset( floatOutput, 0, sizeof(floatOutput) ); + PaQa_ConvertToFloat( ucharInput, 4, paUInt8, floatOutput ); + for( i=0; i<4; i++ ) + { + QA_ASSERT_CLOSE( "paUInt8 -> paFloat32 error", floatInput[i], floatOutput[i], 0.01 ); + } + + memset( floatOutput, 0, sizeof(floatOutput) ); + PaQa_ConvertToFloat( charInput, 4, paInt8, floatOutput ); + for( i=0; i<4; i++ ) + { + QA_ASSERT_CLOSE( "paInt8 -> paFloat32 error", floatInput[i], floatOutput[i], 0.01 ); + } + + memset( floatOutput, 0, sizeof(floatOutput) ); + PaQa_ConvertToFloat( shortInput, 4, paInt16, floatOutput ); + for( i=0; i<4; i++ ) + { + QA_ASSERT_CLOSE( "paInt16 -> paFloat32 error", floatInput[i], floatOutput[i], 0.001 ); + } + + memset( floatOutput, 0, sizeof(floatOutput) ); + PaQa_ConvertToFloat( intInput, 4, paInt32, floatOutput ); + for( i=0; i<4; i++ ) + { + QA_ASSERT_CLOSE( "paInt32 -> paFloat32 error", floatInput[i], floatOutput[i], 0.00001 ); + } + + return 0; + error: - return -1; + return -1; } /*******************************************************************/ void usage( const char *name ) { - printf("%s [-i# -o# -l# -r# -s# -m -w -dDir]\n", name); - printf(" -i# - Input device ID. Will scan for loopback cable if not specified.\n"); - printf(" -o# - Output device ID. Will scan for loopback if not specified.\n"); - printf(" -l# - Latency for both input and output in milliseconds.\n"); - printf(" --inputLatency # Input latency in milliseconds.\n"); - printf(" --outputLatency # Output latency in milliseconds.\n"); - printf(" -r# - Sample Rate in Hz. Will use multiple common rates if not specified.\n"); - printf(" -s# - Size of callback buffer in frames, framesPerBuffer. Will use common values if not specified.\n"); - printf(" -w - Save bad recordings in a WAV file.\n"); - printf(" -dDir - Path for Directory for WAV files. Default is current directory.\n"); - printf(" -m - Just test the DSP Math code and not the audio devices.\n"); - printf(" -v - Verbose reports.\n"); + printf("%s [-i# -o# -l# -r# -s# -m -w -dDir]\n", name); + printf(" -i# - Input device ID. Will scan for loopback cable if not specified.\n"); + printf(" -o# - Output device ID. Will scan for loopback if not specified.\n"); + printf(" -l# - Latency for both input and output in milliseconds.\n"); + printf(" --inputLatency # Input latency in milliseconds.\n"); + printf(" --outputLatency # Output latency in milliseconds.\n"); + printf(" -r# - Sample Rate in Hz. Will use multiple common rates if not specified.\n"); + printf(" -s# - Size of callback buffer in frames, framesPerBuffer. Will use common values if not specified.\n"); + printf(" -w - Save bad recordings in a WAV file.\n"); + printf(" -dDir - Path for Directory for WAV files. Default is current directory.\n"); + printf(" -m - Just test the DSP Math code and not the audio devices.\n"); + printf(" -v - Verbose reports.\n"); } /*******************************************************************/ int main( int argc, char **argv ) { int i; - UserOptions userOptions; - int result = 0; - int justMath = 0; + UserOptions userOptions; + int result = 0; + int justMath = 0; char *executableName = argv[0]; - printf("PortAudio LoopBack Test built " __DATE__ " at " __TIME__ "\n"); + printf("PortAudio LoopBack Test built " __DATE__ " at " __TIME__ "\n"); - if( argc > 1 ){ - printf("running with arguments:"); - for(i=1; i < argc; ++i ) - printf(" %s", argv[i] ); - printf("\n"); - }else{ - printf("running with no arguments\n"); - } - - memset(&userOptions, 0, sizeof(userOptions)); - userOptions.inputDevice = paNoDevice; - userOptions.outputDevice = paNoDevice; - userOptions.sampleRate = -1; - userOptions.framesPerBuffer = -1; - userOptions.inputLatency = -1; - userOptions.outputLatency = -1; - userOptions.waveFilePath = "."; - - // Process arguments. Skip name of executable. - i = 1; - while( i 1 ){ + printf("running with arguments:"); + for(i=1; i < argc; ++i ) + printf(" %s", argv[i] ); + printf("\n"); + }else{ + printf("running with no arguments\n"); + } - } - break; - - - default: - printf("Illegal option: %s\n", arg); - usage( executableName ); - exit(1); - break; - } - } - else - { - printf("Illegal argument: %s\n", arg); - usage( executableName ); - exit(1); + memset(&userOptions, 0, sizeof(userOptions)); + userOptions.inputDevice = paNoDevice; + userOptions.outputDevice = paNoDevice; + userOptions.sampleRate = -1; + userOptions.framesPerBuffer = -1; + userOptions.inputLatency = -1; + userOptions.outputLatency = -1; + userOptions.waveFilePath = "."; - } - i += 1; - } - - result = PaQa_TestAnalyzer(); - - // Test sample format conversion tool. - result = TestSampleFormatConversion(); - - if( (result == 0) && (justMath == 0) ) - { - Pa_Initialize(); - printf( "PortAudio version number = %d\nPortAudio version text = '%s'\n", - Pa_GetVersion(), Pa_GetVersionText() ); - printf( "=============== PortAudio Devices ========================\n" ); - PaQa_ListAudioDevices(); + // Process arguments. Skip name of executable. + i = 1; + while( imaxInputChannels ); printf( ", %2d out", deviceInfo->maxOutputChannels ); - printf( ", %s", deviceInfo->name ); + printf( ", %s", deviceInfo->name ); printf( ", on %s\n", Pa_GetHostApiInfo( deviceInfo->hostApi )->name ); - } + } } /*******************************************************************/ void PaQa_ConvertToFloat( const void *input, int numSamples, PaSampleFormat inFormat, float *output ) { - int i; - switch( inFormat ) - { - case paUInt8: - { - unsigned char *data = (unsigned char *)input; - for( i=0; i> 8; - float fval = (float) (value / ((double) 0x00800000)); - *output++ = fval; - } - } - break; - } - + int i; + switch( inFormat ) + { + case paUInt8: + { + unsigned char *data = (unsigned char *)input; + for( i=0; i> 8; + float fval = (float) (value / ((double) 0x00800000)); + *output++ = fval; + } + } + break; + } + } /*******************************************************************/ void PaQa_ConvertFromFloat( const float *input, int numSamples, PaSampleFormat outFormat, void *output ) { - int i; - switch( outFormat ) - { - case paUInt8: - { - unsigned char *data = (unsigned char *)output; - for( i=0; i(tolerance)) \ - { \ - printf( "%s:%d - ERROR - %s, expected %f, got %f, tol=%f\n", __FILE__, __LINE__, message, ((double)(expected)), ((double)(actual)), ((double)(tolerance)) ); \ - g_testsFailed++; \ - goto error; \ - } \ - else g_testsPassed++; + if (fabs((expected)-(actual))>(tolerance)) \ + { \ + printf( "%s:%d - ERROR - %s, expected %f, got %f, tol=%f\n", __FILE__, __LINE__, message, ((double)(expected)), ((double)(actual)), ((double)(tolerance)) ); \ + g_testsFailed++; \ + goto error; \ + } \ + else g_testsPassed++; #define QA_ASSERT_CLOSE_INT( message, expected, actual, tolerance ) \ if (abs((expected)-(actual))>(tolerance)) \ diff --git a/qa/loopback/src/test_audio_analyzer.c b/qa/loopback/src/test_audio_analyzer.c index add57d4..82fa859 100644 --- a/qa/loopback/src/test_audio_analyzer.c +++ b/qa/loopback/src/test_audio_analyzer.c @@ -26,13 +26,13 @@ */ /* - * The text above constitutes the entire PortAudio license; however, + * The text above constitutes the entire PortAudio license; however, * the PortAudio community also makes the following non-binding requests: * * 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. It is also - * requested that these non-binding requests be included along with the + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the * license above. */ @@ -56,48 +56,48 @@ */ static int TestSingleMonoTone( void ) { - int result = 0; - PaQaSineGenerator generator; - PaQaRecording recording; - float buffer[FRAMES_PER_BLOCK]; - double sampleRate = 44100.0; - int maxFrames = ((int)sampleRate) * 1; - int samplesPerFrame = 1; - int stride = 1; + int result = 0; + PaQaSineGenerator generator; + PaQaRecording recording; + float buffer[FRAMES_PER_BLOCK]; + double sampleRate = 44100.0; + int maxFrames = ((int)sampleRate) * 1; + int samplesPerFrame = 1; + int stride = 1; int done = 0; - double freq = 234.5; - double amp = 0.5; - + double freq = 234.5; + double amp = 0.5; + double mag1, mag2; - // Setup a sine oscillator. - PaQa_SetupSineGenerator( &generator, freq, amp, sampleRate ); - - result = PaQa_InitializeRecording( &recording, maxFrames, (int) sampleRate ); - QA_ASSERT_EQUALS( "PaQa_InitializeRecording failed", 0, result ); + // Setup a sine oscillator. + PaQa_SetupSineGenerator( &generator, freq, amp, sampleRate ); + + result = PaQa_InitializeRecording( &recording, maxFrames, (int) sampleRate ); + QA_ASSERT_EQUALS( "PaQa_InitializeRecording failed", 0, result ); + + done = 0; + while (!done) + { + PaQa_EraseBuffer( buffer, FRAMES_PER_BLOCK, samplesPerFrame ); + PaQa_MixSine( &generator, buffer, FRAMES_PER_BLOCK, stride ); + done = PaQa_WriteRecording( &recording, buffer, FRAMES_PER_BLOCK, samplesPerFrame ); + } + + mag1 = PaQa_CorrelateSine( &recording, freq, sampleRate, 0, recording.numFrames, NULL ); + QA_ASSERT_CLOSE( "exact frequency match", amp, mag1, 0.01 ); + + mag2 = PaQa_CorrelateSine( &recording, freq * 1.23, sampleRate, 0, recording.numFrames, NULL ); + QA_ASSERT_CLOSE( "wrong frequency", 0.0, mag2, 0.01 ); + + PaQa_TerminateRecording( &recording ); + return 0; - done = 0; - while (!done) - { - PaQa_EraseBuffer( buffer, FRAMES_PER_BLOCK, samplesPerFrame ); - PaQa_MixSine( &generator, buffer, FRAMES_PER_BLOCK, stride ); - done = PaQa_WriteRecording( &recording, buffer, FRAMES_PER_BLOCK, samplesPerFrame ); - } - - mag1 = PaQa_CorrelateSine( &recording, freq, sampleRate, 0, recording.numFrames, NULL ); - QA_ASSERT_CLOSE( "exact frequency match", amp, mag1, 0.01 ); - - mag2 = PaQa_CorrelateSine( &recording, freq * 1.23, sampleRate, 0, recording.numFrames, NULL ); - QA_ASSERT_CLOSE( "wrong frequency", 0.0, mag2, 0.01 ); - - PaQa_TerminateRecording( &recording ); - return 0; - error: - PaQa_TerminateRecording( &recording); - return 1; - + PaQa_TerminateRecording( &recording); + return 1; + } /*==========================================================================================*/ @@ -107,60 +107,60 @@ error: static int TestMixedMonoTones( void ) { - int i; - int result = 0; + int i; + int result = 0; #define NUM_TONES (5) - PaQaSineGenerator generators[NUM_TONES]; - PaQaRecording recording; - float buffer[FRAMES_PER_BLOCK]; - double sampleRate = 44100.0; - int maxFrames = ((int)sampleRate) * 1; - int samplesPerFrame = 1; - - double baseFreq = 234.5; - double amp = 0.1; - + PaQaSineGenerator generators[NUM_TONES]; + PaQaRecording recording; + float buffer[FRAMES_PER_BLOCK]; + double sampleRate = 44100.0; + int maxFrames = ((int)sampleRate) * 1; + int samplesPerFrame = 1; + + double baseFreq = 234.5; + double amp = 0.1; + double mag2; int stride = samplesPerFrame; - int done = 0; + int done = 0; + + // Setup a sine oscillator. + for( i=0; istartDelay; - - int stride = 1; - // Record some initial silence. - int done = PaQa_WriteSilence( recording, testTone->startDelay ); - - // Setup a sine oscillator. - PaQa_SetupSineGenerator( &generator, testTone->frequency, testTone->amplitude, testTone->sampleRate ); - - while (!done) - { - int framesThisLoop = BUFFER_SIZE; - - if( frameCounter == glitchPosition ) - { - if( framesToAdd > 0 ) - { - // Record some frozen data without advancing the sine generator. - done = PaQa_RecordFreeze( recording, framesToAdd ); - frameCounter += framesToAdd; - } - else if( framesToAdd < 0 ) - { - // Advance sine generator a few frames. - PaQa_MixSine( &generator, buffer, 0 - framesToAdd, stride ); - } + float buffer[BUFFER_SIZE]; - } - else if( (frameCounter < glitchPosition) && ((frameCounter + framesThisLoop) > glitchPosition) ) - { - // Go right up to the glitchPosition. - framesThisLoop = glitchPosition - frameCounter; - } - - if( framesThisLoop > 0 ) - { - PaQa_EraseBuffer( buffer, framesThisLoop, testTone->samplesPerFrame ); - PaQa_MixSine( &generator, buffer, framesThisLoop, stride ); - done = PaQa_WriteRecording( recording, buffer, framesThisLoop, testTone->samplesPerFrame ); - } - frameCounter += framesThisLoop; - } + int frameCounter = testTone->startDelay; + + int stride = 1; + // Record some initial silence. + int done = PaQa_WriteSilence( recording, testTone->startDelay ); + + // Setup a sine oscillator. + PaQa_SetupSineGenerator( &generator, testTone->frequency, testTone->amplitude, testTone->sampleRate ); + + while (!done) + { + int framesThisLoop = BUFFER_SIZE; + + if( frameCounter == glitchPosition ) + { + if( framesToAdd > 0 ) + { + // Record some frozen data without advancing the sine generator. + done = PaQa_RecordFreeze( recording, framesToAdd ); + frameCounter += framesToAdd; + } + else if( framesToAdd < 0 ) + { + // Advance sine generator a few frames. + PaQa_MixSine( &generator, buffer, 0 - framesToAdd, stride ); + } + + } + else if( (frameCounter < glitchPosition) && ((frameCounter + framesThisLoop) > glitchPosition) ) + { + // Go right up to the glitchPosition. + framesThisLoop = glitchPosition - frameCounter; + } + + if( framesThisLoop > 0 ) + { + PaQa_EraseBuffer( buffer, framesThisLoop, testTone->samplesPerFrame ); + PaQa_MixSine( &generator, buffer, framesThisLoop, stride ); + done = PaQa_WriteRecording( recording, buffer, framesThisLoop, testTone->samplesPerFrame ); + } + frameCounter += framesThisLoop; + } } @@ -227,24 +227,24 @@ static void MakeRecordingWithAddedFrames( PaQaRecording *recording, PaQaTestTone static void MakeCleanRecording( PaQaRecording *recording, PaQaTestTone *testTone ) { - PaQaSineGenerator generator; + PaQaSineGenerator generator; #define BUFFER_SIZE 512 - float buffer[BUFFER_SIZE]; - - int stride = 1; - // Record some initial silence. - int done = PaQa_WriteSilence( recording, testTone->startDelay ); - - // Setup a sine oscillator. - PaQa_SetupSineGenerator( &generator, testTone->frequency, testTone->amplitude, testTone->sampleRate ); - - // Generate recording with good phase. - while (!done) - { - PaQa_EraseBuffer( buffer, BUFFER_SIZE, testTone->samplesPerFrame ); - PaQa_MixSine( &generator, buffer, BUFFER_SIZE, stride ); - done = PaQa_WriteRecording( recording, buffer, BUFFER_SIZE, testTone->samplesPerFrame ); - } + float buffer[BUFFER_SIZE]; + + int stride = 1; + // Record some initial silence. + int done = PaQa_WriteSilence( recording, testTone->startDelay ); + + // Setup a sine oscillator. + PaQa_SetupSineGenerator( &generator, testTone->frequency, testTone->amplitude, testTone->sampleRate ); + + // Generate recording with good phase. + while (!done) + { + PaQa_EraseBuffer( buffer, BUFFER_SIZE, testTone->samplesPerFrame ); + PaQa_MixSine( &generator, buffer, BUFFER_SIZE, stride ); + done = PaQa_WriteRecording( recording, buffer, BUFFER_SIZE, testTone->samplesPerFrame ); + } } /*==========================================================================================*/ @@ -254,22 +254,22 @@ static void MakeCleanRecording( PaQaRecording *recording, PaQaTestTone *testTone static void MakeRecordingWithPop( PaQaRecording *recording, PaQaTestTone *testTone, int popPosition, int popWidth, double popAmplitude ) { - int i; - - MakeCleanRecording( recording, testTone ); - - // Apply glitch to good recording. - if( (popPosition + popWidth) >= recording->numFrames ) - { - popWidth = (recording->numFrames - popPosition) - 1; - } - - for( i=0; ibuffer[i+popPosition]; - float bad = (good > 0.0) ? (good - popAmplitude) : (good + popAmplitude); - recording->buffer[i+popPosition] = bad; - } + int i; + + MakeCleanRecording( recording, testTone ); + + // Apply glitch to good recording. + if( (popPosition + popWidth) >= recording->numFrames ) + { + popWidth = (recording->numFrames - popPosition) - 1; + } + + for( i=0; ibuffer[i+popPosition]; + float bad = (good > 0.0) ? (good - popAmplitude) : (good + popAmplitude); + recording->buffer[i+popPosition] = bad; + } } /*==========================================================================================*/ @@ -278,54 +278,54 @@ static void MakeRecordingWithPop( PaQaRecording *recording, PaQaTestTone *testTo */ static int TestDetectSinglePhaseError( double sampleRate, int cycleSize, int latencyFrames, int glitchPosition, int framesAdded ) { - int result = 0; - PaQaRecording recording; - PaQaTestTone testTone; - PaQaAnalysisResult analysisResult = { 0.0 }; - int framesDropped = 0; + int result = 0; + PaQaRecording recording; + PaQaTestTone testTone; + PaQaAnalysisResult analysisResult = { 0.0 }; + int framesDropped = 0; int maxFrames = ((int)sampleRate) * 2; - testTone.samplesPerFrame = 1; - testTone.sampleRate = sampleRate; - testTone.frequency = sampleRate / cycleSize; - testTone.amplitude = 0.5; - testTone.startDelay = latencyFrames; - - result = PaQa_InitializeRecording( &recording, maxFrames, (int) sampleRate ); - QA_ASSERT_EQUALS( "PaQa_InitializeRecording failed", 0, result ); - - MakeRecordingWithAddedFrames( &recording, &testTone, glitchPosition, framesAdded ); - - PaQa_AnalyseRecording( &recording, &testTone, &analysisResult ); - - if( framesAdded < 0 ) - { - framesDropped = -framesAdded; - framesAdded = 0; - } - -#if PRINT_REPORTS - printf("\n=== Dropped Frame Analysis ===================\n"); - printf(" expected actual\n"); - printf(" latency: %10.3f %10.3f\n", (double)latencyFrames, analysisResult.latency ); - printf(" num added frames: %10.3f %10.3f\n", (double)framesAdded, analysisResult.numAddedFrames ); - printf(" added frames at: %10.3f %10.3f\n", (double)glitchPosition, analysisResult.addedFramesPosition ); - printf(" num dropped frames: %10.3f %10.3f\n", (double)framesDropped, analysisResult.numDroppedFrames ); - printf(" dropped frames at: %10.3f %10.3f\n", (double)glitchPosition, analysisResult.droppedFramesPosition ); -#endif - - QA_ASSERT_CLOSE( "PaQa_AnalyseRecording latency", latencyFrames, analysisResult.latency, 0.5 ); - QA_ASSERT_CLOSE( "PaQa_AnalyseRecording framesAdded", framesAdded, analysisResult.numAddedFrames, 1.0 ); - QA_ASSERT_CLOSE( "PaQa_AnalyseRecording framesDropped", framesDropped, analysisResult.numDroppedFrames, 1.0 ); -// QA_ASSERT_CLOSE( "PaQa_AnalyseRecording glitchPosition", glitchPosition, analysisResult.glitchPosition, cycleSize ); + testTone.samplesPerFrame = 1; + testTone.sampleRate = sampleRate; + testTone.frequency = sampleRate / cycleSize; + testTone.amplitude = 0.5; + testTone.startDelay = latencyFrames; + + result = PaQa_InitializeRecording( &recording, maxFrames, (int) sampleRate ); + QA_ASSERT_EQUALS( "PaQa_InitializeRecording failed", 0, result ); + + MakeRecordingWithAddedFrames( &recording, &testTone, glitchPosition, framesAdded ); + + PaQa_AnalyseRecording( &recording, &testTone, &analysisResult ); + + if( framesAdded < 0 ) + { + framesDropped = -framesAdded; + framesAdded = 0; + } + +#if PRINT_REPORTS + printf("\n=== Dropped Frame Analysis ===================\n"); + printf(" expected actual\n"); + printf(" latency: %10.3f %10.3f\n", (double)latencyFrames, analysisResult.latency ); + printf(" num added frames: %10.3f %10.3f\n", (double)framesAdded, analysisResult.numAddedFrames ); + printf(" added frames at: %10.3f %10.3f\n", (double)glitchPosition, analysisResult.addedFramesPosition ); + printf(" num dropped frames: %10.3f %10.3f\n", (double)framesDropped, analysisResult.numDroppedFrames ); + printf(" dropped frames at: %10.3f %10.3f\n", (double)glitchPosition, analysisResult.droppedFramesPosition ); +#endif + + QA_ASSERT_CLOSE( "PaQa_AnalyseRecording latency", latencyFrames, analysisResult.latency, 0.5 ); + QA_ASSERT_CLOSE( "PaQa_AnalyseRecording framesAdded", framesAdded, analysisResult.numAddedFrames, 1.0 ); + QA_ASSERT_CLOSE( "PaQa_AnalyseRecording framesDropped", framesDropped, analysisResult.numDroppedFrames, 1.0 ); +// QA_ASSERT_CLOSE( "PaQa_AnalyseRecording glitchPosition", glitchPosition, analysisResult.glitchPosition, cycleSize ); + + PaQa_TerminateRecording( &recording ); + return 0; - PaQa_TerminateRecording( &recording ); - return 0; - error: - PaQa_TerminateRecording( &recording); - return 1; -} + PaQa_TerminateRecording( &recording); + return 1; +} /*==========================================================================================*/ /** @@ -333,34 +333,34 @@ error: */ static int TestDetectPhaseErrors( void ) { - int result; - - result = TestDetectSinglePhaseError( 44100, 200, 477, -1, 0 ); - if( result < 0 ) return result; + int result; + + result = TestDetectSinglePhaseError( 44100, 200, 477, -1, 0 ); + if( result < 0 ) return result; /* - result = TestDetectSinglePhaseError( 44100, 200, 77, -1, 0 ); - if( result < 0 ) return result; - - result = TestDetectSinglePhaseError( 44100, 200, 83, 3712, 9 ); - if( result < 0 ) return result; - - result = TestDetectSinglePhaseError( 44100, 280, 83, 3712, 27 ); - if( result < 0 ) return result; - - result = TestDetectSinglePhaseError( 44100, 200, 234, 3712, -9 ); - if( result < 0 ) return result; - - result = TestDetectSinglePhaseError( 44100, 200, 2091, 8923, -2 ); - if( result < 0 ) return result; - - result = TestDetectSinglePhaseError( 44100, 120, 1782, 5772, -18 ); - if( result < 0 ) return result; - - // Note that if the frequency is too high then it is hard to detect single dropped frames. - result = TestDetectSinglePhaseError( 44100, 200, 500, 4251, -1 ); - if( result < 0 ) return result; + result = TestDetectSinglePhaseError( 44100, 200, 77, -1, 0 ); + if( result < 0 ) return result; + + result = TestDetectSinglePhaseError( 44100, 200, 83, 3712, 9 ); + if( result < 0 ) return result; + + result = TestDetectSinglePhaseError( 44100, 280, 83, 3712, 27 ); + if( result < 0 ) return result; + + result = TestDetectSinglePhaseError( 44100, 200, 234, 3712, -9 ); + if( result < 0 ) return result; + + result = TestDetectSinglePhaseError( 44100, 200, 2091, 8923, -2 ); + if( result < 0 ) return result; + + result = TestDetectSinglePhaseError( 44100, 120, 1782, 5772, -18 ); + if( result < 0 ) return result; + + // Note that if the frequency is too high then it is hard to detect single dropped frames. + result = TestDetectSinglePhaseError( 44100, 200, 500, 4251, -1 ); + if( result < 0 ) return result; */ - return 0; + return 0; } /*==========================================================================================*/ @@ -369,53 +369,53 @@ static int TestDetectPhaseErrors( void ) */ static int TestDetectSinglePop( double sampleRate, int cycleSize, int latencyFrames, int popPosition, int popWidth, double popAmplitude ) { - int result = 0; - PaQaRecording recording; - PaQaTestTone testTone; - PaQaAnalysisResult analysisResult = { 0.0 }; - int maxFrames = ((int)sampleRate) * 2; + int result = 0; + PaQaRecording recording; + PaQaTestTone testTone; + PaQaAnalysisResult analysisResult = { 0.0 }; + int maxFrames = ((int)sampleRate) * 2; + + testTone.samplesPerFrame = 1; + testTone.sampleRate = sampleRate; + testTone.frequency = sampleRate / cycleSize; + testTone.amplitude = 0.5; + testTone.startDelay = latencyFrames; + + result = PaQa_InitializeRecording( &recording, maxFrames, (int) sampleRate ); + QA_ASSERT_EQUALS( "PaQa_InitializeRecording failed", 0, result ); + + MakeRecordingWithPop( &recording, &testTone, popPosition, popWidth, popAmplitude ); + + PaQa_AnalyseRecording( &recording, &testTone, &analysisResult ); - testTone.samplesPerFrame = 1; - testTone.sampleRate = sampleRate; - testTone.frequency = sampleRate / cycleSize; - testTone.amplitude = 0.5; - testTone.startDelay = latencyFrames; - - result = PaQa_InitializeRecording( &recording, maxFrames, (int) sampleRate ); - QA_ASSERT_EQUALS( "PaQa_InitializeRecording failed", 0, result ); - - MakeRecordingWithPop( &recording, &testTone, popPosition, popWidth, popAmplitude ); - - PaQa_AnalyseRecording( &recording, &testTone, &analysisResult ); - #if PRINT_REPORTS - printf("\n=== Pop Analysis ===================\n"); - printf(" expected actual\n"); - printf(" latency: %10.3f %10.3f\n", (double)latencyFrames, analysisResult.latency ); - printf(" popPosition: %10.3f %10.3f\n", (double)popPosition, analysisResult.popPosition ); - printf(" popAmplitude: %10.3f %10.3f\n", popAmplitude, analysisResult.popAmplitude ); - printf(" cycleSize: %6d\n", cycleSize ); - printf(" num added frames: %10.3f\n", analysisResult.numAddedFrames ); - printf(" added frames at: %10.3f\n", analysisResult.addedFramesPosition ); - printf(" num dropped frames: %10.3f\n", analysisResult.numDroppedFrames ); - printf(" dropped frames at: %10.3f\n", analysisResult.droppedFramesPosition ); + printf("\n=== Pop Analysis ===================\n"); + printf(" expected actual\n"); + printf(" latency: %10.3f %10.3f\n", (double)latencyFrames, analysisResult.latency ); + printf(" popPosition: %10.3f %10.3f\n", (double)popPosition, analysisResult.popPosition ); + printf(" popAmplitude: %10.3f %10.3f\n", popAmplitude, analysisResult.popAmplitude ); + printf(" cycleSize: %6d\n", cycleSize ); + printf(" num added frames: %10.3f\n", analysisResult.numAddedFrames ); + printf(" added frames at: %10.3f\n", analysisResult.addedFramesPosition ); + printf(" num dropped frames: %10.3f\n", analysisResult.numDroppedFrames ); + printf(" dropped frames at: %10.3f\n", analysisResult.droppedFramesPosition ); #endif - - QA_ASSERT_CLOSE( "PaQa_AnalyseRecording latency", latencyFrames, analysisResult.latency, 0.5 ); - QA_ASSERT_CLOSE( "PaQa_AnalyseRecording popPosition", popPosition, analysisResult.popPosition, 10 ); - if( popWidth > 0 ) - { - QA_ASSERT_CLOSE( "PaQa_AnalyseRecording popAmplitude", popAmplitude, analysisResult.popAmplitude, 0.1 * popAmplitude ); - } - - PaQa_TerminateRecording( &recording ); - return 0; - + + QA_ASSERT_CLOSE( "PaQa_AnalyseRecording latency", latencyFrames, analysisResult.latency, 0.5 ); + QA_ASSERT_CLOSE( "PaQa_AnalyseRecording popPosition", popPosition, analysisResult.popPosition, 10 ); + if( popWidth > 0 ) + { + QA_ASSERT_CLOSE( "PaQa_AnalyseRecording popAmplitude", popAmplitude, analysisResult.popAmplitude, 0.1 * popAmplitude ); + } + + PaQa_TerminateRecording( &recording ); + return 0; + error: - PaQa_SaveRecordingToWaveFile( &recording, "bad_recording.wav" ); - PaQa_TerminateRecording( &recording); - return 1; -} + PaQa_SaveRecordingToWaveFile( &recording, "bad_recording.wav" ); + PaQa_TerminateRecording( &recording); + return 1; +} /*==========================================================================================*/ /** @@ -423,73 +423,73 @@ error: */ static int TestSingleInitialSpike( double sampleRate, int stepPosition, int cycleSize, int latencyFrames, double stepAmplitude ) { - int i; - int result = 0; - // Account for highpass filter offset. - int expectedLatency = latencyFrames + 1; - PaQaRecording recording; - - PaQaRecording hipassOutput = { 0 }; - BiquadFilter hipassFilter; - - PaQaTestTone testTone; - PaQaAnalysisResult analysisResult = { 0.0 }; - int maxFrames = ((int)sampleRate) * 2; - - testTone.samplesPerFrame = 1; - testTone.sampleRate = sampleRate; - testTone.frequency = sampleRate / cycleSize; - testTone.amplitude = -0.5; - testTone.startDelay = latencyFrames; - - result = PaQa_InitializeRecording( &recording, maxFrames, (int) sampleRate ); - QA_ASSERT_EQUALS( "PaQa_InitializeRecording failed", 0, result ); - - result = PaQa_InitializeRecording( &hipassOutput, maxFrames, (int) sampleRate ); - QA_ASSERT_EQUALS( "PaQa_InitializeRecording failed", 0, result ); - - MakeCleanRecording( &recording, &testTone ); - - // Apply DC step. - for( i=stepPosition; i>8); - *addr++ = (unsigned char) (data>>16); - *addr++ = (unsigned char) (data>>24); - *addrPtr = addr; + unsigned char *addr = *addrPtr; + *addr++ = (unsigned char) data; + *addr++ = (unsigned char) (data>>8); + *addr++ = (unsigned char) (data>>16); + *addr++ = (unsigned char) (data>>24); + *addrPtr = addr; } /* Write short word data to a little endian format byte array. */ static void WriteShortLE( unsigned char **addrPtr, unsigned short data ) { - unsigned char *addr = *addrPtr; - *addr++ = (unsigned char) data; - *addr++ = (unsigned char) (data>>8); - *addrPtr = addr; + unsigned char *addr = *addrPtr; + *addr++ = (unsigned char) data; + *addr++ = (unsigned char) (data>>8); + *addrPtr = addr; } /* Write IFF ChunkType data to a byte array. */ static void WriteChunkType( unsigned char **addrPtr, unsigned long cktyp ) { - unsigned char *addr = *addrPtr; - *addr++ = (unsigned char) (cktyp>>24); - *addr++ = (unsigned char) (cktyp>>16); - *addr++ = (unsigned char) (cktyp>>8); - *addr++ = (unsigned char) cktyp; - *addrPtr = addr; + unsigned char *addr = *addrPtr; + *addr++ = (unsigned char) (cktyp>>24); + *addr++ = (unsigned char) (cktyp>>16); + *addr++ = (unsigned char) (cktyp>>8); + *addr++ = (unsigned char) cktyp; + *addrPtr = addr; } #define WAV_HEADER_SIZE (4 + 4 + 4 + /* RIFF+size+WAVE */ \ @@ -87,14 +87,14 @@ static void WriteChunkType( unsigned char **addrPtr, unsigned long cktyp ) */ long Audio_WAV_OpenWriter( WAV_Writer *writer, const char *fileName, int frameRate, int samplesPerFrame ) { - unsigned int bytesPerSecond; + unsigned int bytesPerSecond; unsigned char header[ WAV_HEADER_SIZE ]; - unsigned char *addr = header; + unsigned char *addr = header; int numWritten; - + writer->dataSize = 0; writer->dataSizeOffset = 0; - + writer->fid = fopen( fileName, "wb" ); if( writer->fid == NULL ) { @@ -102,35 +102,35 @@ long Audio_WAV_OpenWriter( WAV_Writer *writer, const char *fileName, int frameRa } /* Write RIFF header. */ - WriteChunkType( &addr, RIFF_ID ); + WriteChunkType( &addr, RIFF_ID ); /* Write RIFF size as zero for now. Will patch later. */ - WriteLongLE( &addr, 0 ); + WriteLongLE( &addr, 0 ); /* Write WAVE form ID. */ - WriteChunkType( &addr, WAVE_ID ); + WriteChunkType( &addr, WAVE_ID ); /* Write format chunk based on AudioSample structure. */ - WriteChunkType( &addr, FMT_ID ); + WriteChunkType( &addr, FMT_ID ); WriteLongLE( &addr, 16 ); WriteShortLE( &addr, WAVE_FORMAT_PCM ); - bytesPerSecond = frameRate * samplesPerFrame * sizeof( short); - WriteShortLE( &addr, (short) samplesPerFrame ); - WriteLongLE( &addr, frameRate ); - WriteLongLE( &addr, bytesPerSecond ); - WriteShortLE( &addr, (short) (samplesPerFrame * sizeof( short)) ); /* bytesPerBlock */ - WriteShortLE( &addr, (short) 16 ); /* bits per sample */ + bytesPerSecond = frameRate * samplesPerFrame * sizeof( short); + WriteShortLE( &addr, (short) samplesPerFrame ); + WriteLongLE( &addr, frameRate ); + WriteLongLE( &addr, bytesPerSecond ); + WriteShortLE( &addr, (short) (samplesPerFrame * sizeof( short)) ); /* bytesPerBlock */ + WriteShortLE( &addr, (short) 16 ); /* bits per sample */ /* Write ID and size for 'data' chunk. */ - WriteChunkType( &addr, DATA_ID ); + WriteChunkType( &addr, DATA_ID ); /* Save offset so we can patch it later. */ writer->dataSizeOffset = (int) (addr - header); - WriteLongLE( &addr, 0 ); + WriteLongLE( &addr, 0 ); numWritten = fwrite( header, 1, sizeof(header), writer->fid ); if( numWritten != sizeof(header) ) return -1; - return (int) numWritten; + return (int) numWritten; } /********************************************************************************* @@ -138,31 +138,31 @@ long Audio_WAV_OpenWriter( WAV_Writer *writer, const char *fileName, int frameRa * Returns bytes written or negative error code. */ long Audio_WAV_WriteShorts( WAV_Writer *writer, - short *samples, - int numSamples - ) + short *samples, + int numSamples + ) { - unsigned char buffer[2]; + unsigned char buffer[2]; unsigned char *bufferPtr; - int i; - short *p = samples; + int i; + short *p = samples; int numWritten; int bytesWritten; - if( numSamples <= 0 ) - { - return -1; - } + if( numSamples <= 0 ) + { + return -1; + } for( i=0; ifid ); if( numWritten != sizeof(buffer) ) return -1; - } + } bytesWritten = numSamples * sizeof(short); writer->dataSize += bytesWritten; - return (int) bytesWritten; + return (int) bytesWritten; } /********************************************************************************* @@ -171,7 +171,7 @@ long Audio_WAV_WriteShorts( WAV_Writer *writer, */ long Audio_WAV_CloseWriter( WAV_Writer *writer ) { - unsigned char buffer[4]; + unsigned char buffer[4]; unsigned char *bufferPtr; int numWritten; int riffSize; @@ -212,7 +212,7 @@ int main( void ) #define NUM_SAMPLES (200) short data[NUM_SAMPLES]; short saw = 0; - + for( i=0; i #include @@ -103,14 +103,14 @@ static int gNumFailed = 0; static int QaCallback( const void* inputBuffer, void* outputBuffer, unsigned long framesPerBuffer, - const PaStreamCallbackTimeInfo* timeInfo, - PaStreamCallbackFlags statusFlags, + const PaStreamCallbackTimeInfo* timeInfo, + PaStreamCallbackFlags statusFlags, void* userData ) { unsigned long i; unsigned char* out = (unsigned char *) outputBuffer; PaQaData* data = (PaQaData *) userData; - + (void)inputBuffer; /* Prevent "unused variable" warnings. */ /* Zero out buffer so we don't hear terrible noise. */ @@ -174,7 +174,7 @@ static int TestBadOpens( void ) PaStreamParameters ipp, opp; const PaDeviceInfo* info = NULL; - + /* Setup data for synthesis thread. */ myData.framesLeft = (unsigned long) (SAMPLE_RATE * 100); /* 100 seconds */ myData.numChannels = 1; @@ -222,7 +222,7 @@ static int TestBadOpens( void ) ipp.hostApiSpecificStreamInfo = opp.hostApiSpecificStreamInfo = NULL; ipp.sampleFormat = opp.sampleFormat = paFloat32; ipp.channelCount = 0; ipp.device = Pa_GetDefaultInputDevice(); - opp.channelCount = 0; opp.device = paNoDevice; /* And no output device, and no output channels. */ + opp.channelCount = 0; opp.device = paNoDevice; /* And no output device, and no output channels. */ HOPEFOR(((result = Pa_OpenStream(&stream, &ipp, NULL, SAMPLE_RATE, FRAMES_PER_BUFFER, paClipOff, QaCallback, &myData )) == paInvalidChannelCount)); @@ -274,7 +274,7 @@ static int TestBadOpens( void ) HOPEFOR(((result = Pa_OpenStream(&stream, NULL, &opp, 1.0, FRAMES_PER_BUFFER, /* 1 cycle per second (1 Hz) is too low. */ paClipOff, QaCallback, &myData )) == paInvalidSampleRate)); - + /*----------------------------- High sample rate: */ ipp.hostApiSpecificStreamInfo = opp.hostApiSpecificStreamInfo = NULL; ipp.sampleFormat = opp.sampleFormat = paFloat32; @@ -286,7 +286,7 @@ static int TestBadOpens( void ) /*----------------------------- NULL callback: */ /* NULL callback is valid in V19 -- it means use blocking read/write stream - + ipp.hostApiSpecificStreamInfo = opp.hostApiSpecificStreamInfo = NULL; ipp.sampleFormat = opp.sampleFormat = paFloat32; ipp.channelCount = 0; ipp.device = paNoDevice; @@ -366,7 +366,7 @@ static int TestBadActions( void ) SAMPLE_RATE, FRAMES_PER_BUFFER, paClipOff, QaCallback, &myData )) == paNoError)); } - + HOPEFOR(((deviceInfo = Pa_GetDeviceInfo(paNoDevice)) == NULL)); HOPEFOR(((deviceInfo = Pa_GetDeviceInfo(87654)) == NULL)); HOPEFOR(((result = Pa_StartStream(NULL)) == paBadStreamPtr)); @@ -392,7 +392,7 @@ int main(void); int main(void) { PaError result; - + EXPECT(((result = Pa_Initialize()) == paNoError)); TestBadOpens(); TestBadActions(); diff --git a/qa/paqa_latency.c b/qa/paqa_latency.c index 389c065..a70807b 100644 --- a/qa/paqa_latency.c +++ b/qa/paqa_latency.c @@ -1,7 +1,7 @@ /** @file paqa_latency.c - @ingroup qa_src - @brief Test latency estimates. - @author Ross Bencina + @ingroup qa_src + @brief Test latency estimates. + @author Ross Bencina @author Phil Burk */ /* @@ -32,13 +32,13 @@ */ /* - * The text above constitutes the entire PortAudio license; however, + * The text above constitutes the entire PortAudio license; however, * the PortAudio community also makes the following non-binding requests: * * 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. It is also - * requested that these non-binding requests be included along with the + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the * license above. */ #include @@ -91,7 +91,7 @@ static int patestCallback( const void *inputBuffer, void *outputBuffer, (void) timeInfo; /* Prevent unused variable warnings. */ (void) statusFlags; (void) inputBuffer; - + if( data->minFramesPerBuffer > framesPerBuffer ) { data->minFramesPerBuffer = framesPerBuffer; @@ -100,7 +100,7 @@ static int patestCallback( const void *inputBuffer, void *outputBuffer, { data->maxFramesPerBuffer = framesPerBuffer; } - + /* Measure min and max output time stamp delta. */ if( data->callbackCount > 0 ) { @@ -115,7 +115,7 @@ static int patestCallback( const void *inputBuffer, void *outputBuffer, } } data->previousTimeInfo = *timeInfo; - + for( i=0; isine[data->left_phase]; /* left */ @@ -125,12 +125,12 @@ static int patestCallback( const void *inputBuffer, void *outputBuffer, data->right_phase += 3; /* higher pitch so we can distinguish left and right. */ if( data->right_phase >= TABLE_SIZE ) data->right_phase -= TABLE_SIZE; } - + data->callbackCount += 1; return paContinue; } -PaError paqaCheckLatency( PaStreamParameters *outputParamsPtr, +PaError paqaCheckLatency( PaStreamParameters *outputParamsPtr, paTestData *dataPtr, double sampleRate, unsigned long framesPerBuffer ) { PaError err; @@ -142,7 +142,7 @@ PaError paqaCheckLatency( PaStreamParameters *outputParamsPtr, dataPtr->minDeltaDacTime = 9999999.0; dataPtr->maxDeltaDacTime = 0.0; dataPtr->callbackCount = 0; - + printf("Stream parameter: suggestedOutputLatency = %g\n", outputParamsPtr->suggestedLatency ); if( framesPerBuffer == paFramesPerBufferUnspecified ){ printf("Stream parameter: user framesPerBuffer = paFramesPerBufferUnspecified\n" ); @@ -159,7 +159,7 @@ PaError paqaCheckLatency( PaStreamParameters *outputParamsPtr, patestCallback, dataPtr ); if( err != paNoError ) goto error1; - + streamInfo = Pa_GetStreamInfo( stream ); printf("Stream info: inputLatency = %g\n", streamInfo->inputLatency ); printf("Stream info: outputLatency = %g\n", streamInfo->outputLatency ); @@ -169,7 +169,7 @@ PaError paqaCheckLatency( PaStreamParameters *outputParamsPtr, printf("Play for %d seconds.\n", NUM_SECONDS ); Pa_Sleep( NUM_SECONDS * 1000 ); - + printf(" minFramesPerBuffer = %4d\n", dataPtr->minFramesPerBuffer ); printf(" maxFramesPerBuffer = %4d\n", dataPtr->maxFramesPerBuffer ); printf(" minDeltaDacTime = %f\n", dataPtr->minDeltaDacTime ); @@ -181,7 +181,7 @@ PaError paqaCheckLatency( PaStreamParameters *outputParamsPtr, err = Pa_CloseStream( stream ); Pa_Sleep( 1 * 1000 ); - + printf("-------------------------------------\n"); return err; error2: @@ -245,26 +245,26 @@ static int paqaCheckMultipleSuggested( PaDeviceIndex deviceIndex, int isInput ) streamParameters.hostApiSpecificStreamInfo = NULL; streamParameters.sampleFormat = paFloat32; sampleRate = pdi->defaultSampleRate; - + printf(" lowLatency = %g\n", lowLatency ); printf(" highLatency = %g\n", highLatency ); printf(" numChannels = %d\n", numChannels ); printf(" sampleRate = %g\n", sampleRate ); - + if( (highLatency - lowLatency) < 0.001 ) { numLoops = 1; } for( i=0; iinputLatency; @@ -317,7 +317,7 @@ static int paqaVerifySuggestedLatency( void ) int result = 0; const PaDeviceInfo *pdi; int numDevices = Pa_GetDeviceCount(); - + printf("\n ------------------------ paqaVerifySuggestedLatency\n"); for( id=0; iddefaultLowOutputLatency; err = paqaCheckLatency( &outputParameters, &data, sampleRate, framesPerBuffer ); if( err != paNoError ) goto error; - + printf("------------- 64 frame buffer with 1.1 * defaultLow latency.\n"); framesPerBuffer = 64; outputParameters.suggestedLatency = deviceInfo->defaultLowOutputLatency * 1.1; err = paqaCheckLatency( &outputParameters, &data, sampleRate, framesPerBuffer ); if( err != paNoError ) goto error; - + // Try to create a huge buffer that is bigger than the allowed device maximum. printf("------------- Try a huge buffer.\n"); framesPerBuffer = 16*1024; outputParameters.suggestedLatency = ((double)framesPerBuffer) / sampleRate; // approximate err = paqaCheckLatency( &outputParameters, &data, sampleRate, framesPerBuffer ); if( err != paNoError ) goto error; - + printf("------------- Try suggestedLatency = 0.0\n"); outputParameters.suggestedLatency = 0.0; err = paqaCheckLatency( &outputParameters, &data, sampleRate, paFramesPerBufferUnspecified ); if( err != paNoError ) goto error; - + printf("------------- Try suggestedLatency = defaultLowOutputLatency\n"); outputParameters.suggestedLatency = deviceInfo->defaultLowOutputLatency; err = paqaCheckLatency( &outputParameters, &data, sampleRate, paFramesPerBufferUnspecified ); if( err != paNoError ) goto error; - + printf("------------- Try suggestedLatency = defaultHighOutputLatency\n"); outputParameters.suggestedLatency = deviceInfo->defaultHighOutputLatency; err = paqaCheckLatency( &outputParameters, &data, sampleRate, paFramesPerBufferUnspecified ); if( err != paNoError ) goto error; - + printf("------------- Try suggestedLatency = defaultHighOutputLatency * 4\n"); outputParameters.suggestedLatency = deviceInfo->defaultHighOutputLatency * 4; err = paqaCheckLatency( &outputParameters, &data, sampleRate, paFramesPerBufferUnspecified ); if( err != paNoError ) goto error; - + Pa_Terminate(); printf("SUCCESS - test finished.\n"); return err; - + error: Pa_Terminate(); fprintf( stderr, "ERROR - test failed.\n" ); From f7efb6b53cf134ec9165da7f6a3c0172371b820a Mon Sep 17 00:00:00 2001 From: Phil Burk Date: Thu, 21 Jan 2021 08:17:27 -0800 Subject: [PATCH 096/164] docs: Pa_OpenStream() fails if sampleRate unavailable (#446) It was not clear in the previous docs. Fixes #443 --- include/portaudio.h | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/include/portaudio.h b/include/portaudio.h index 0c5b6a4..5d84731 100644 --- a/include/portaudio.h +++ b/include/portaudio.h @@ -849,7 +849,10 @@ typedef int PaStreamCallback( outputParameters must be NULL for input-only streams. @param sampleRate The desired sampleRate. For full-duplex streams it is the - sample rate for both input and output + sample rate for both input and output. Note that the actual sampleRate + may differ very slightly from the desired rate because of hardware limitations. + The exact rate can be queried using Pa_GetStreamInfo(). If nothing close + to the desired sampleRate is available then the open will fail and return an error. @param framesPerBuffer The number of frames passed to the stream callback function, or the preferred block granularity for a blocking read/write stream. From 2d0a88a618cfecc16af9e4324522448cb11da377 Mon Sep 17 00:00:00 2001 From: petris Date: Fri, 22 Jan 2021 14:17:52 +0100 Subject: [PATCH 097/164] Whitespace cleanup in qa --- qa/loopback/src/audio_analyzer.c | 1 - 1 file changed, 1 deletion(-) diff --git a/qa/loopback/src/audio_analyzer.c b/qa/loopback/src/audio_analyzer.c index ddbd32c..fbdd631 100644 --- a/qa/loopback/src/audio_analyzer.c +++ b/qa/loopback/src/audio_analyzer.c @@ -704,4 +704,3 @@ int PaQa_AnalyseRecording( PaQaRecording *recording, PaQaTestTone *testTone, PaQ error: return -1; } - From 92e7210603d11f7ced7bdb6dcf66f05ec4cdd2c3 Mon Sep 17 00:00:00 2001 From: petris Date: Fri, 22 Jan 2021 14:20:29 +0100 Subject: [PATCH 098/164] Whitespace cleanup in examples --- examples/paex_read_write_wire.c | 1 - examples/paex_record.c | 1 - examples/paex_record_file.c | 1 - examples/paex_wmme_ac3.c | 1 - examples/paex_wmme_surround.c | 1 - 5 files changed, 5 deletions(-) diff --git a/examples/paex_read_write_wire.c b/examples/paex_read_write_wire.c index 69f15ff..b5046af 100644 --- a/examples/paex_read_write_wire.c +++ b/examples/paex_read_write_wire.c @@ -202,4 +202,3 @@ error2: fprintf( stderr, "Error message: %s\n", Pa_GetErrorText( err ) ); return -1; } - diff --git a/examples/paex_record.c b/examples/paex_record.c index 4407787..53bf571 100644 --- a/examples/paex_record.c +++ b/examples/paex_record.c @@ -351,4 +351,3 @@ done: } return err; } - diff --git a/examples/paex_record_file.c b/examples/paex_record_file.c index c4e5b44..562a8e9 100644 --- a/examples/paex_record_file.c +++ b/examples/paex_record_file.c @@ -455,4 +455,3 @@ done: } return err; } - diff --git a/examples/paex_wmme_ac3.c b/examples/paex_wmme_ac3.c index 67c2786..74daa96 100644 --- a/examples/paex_wmme_ac3.c +++ b/examples/paex_wmme_ac3.c @@ -218,4 +218,3 @@ error: fprintf( stderr, "Error message: %s\n", Pa_GetErrorText( err ) ); return err; } - diff --git a/examples/paex_wmme_surround.c b/examples/paex_wmme_surround.c index 86a7e37..55fc255 100644 --- a/examples/paex_wmme_surround.c +++ b/examples/paex_wmme_surround.c @@ -208,4 +208,3 @@ error: fprintf( stderr, "Error message: %s\n", Pa_GetErrorText( err ) ); return err; } - From 85f7602a3cf407c97623bb4a238d04fb0d1a788f Mon Sep 17 00:00:00 2001 From: petris Date: Fri, 22 Jan 2021 14:14:12 +0100 Subject: [PATCH 099/164] Whitespace cleanup in test --- test/patest_dsound_find_best_latency_params.c | 1 - test/patest_dsound_low_level_latency_params.c | 1 - test/patest_dsound_surround.c | 1 - test/patest_mono.c | 1 - test/patest_read_record.c | 1 - test/patest_wmme_find_best_latency_params.c | 1 - test/patest_wmme_low_level_latency_params.c | 1 - 7 files changed, 7 deletions(-) diff --git a/test/patest_dsound_find_best_latency_params.c b/test/patest_dsound_find_best_latency_params.c index f3cfef2..1c074ab 100644 --- a/test/patest_dsound_find_best_latency_params.c +++ b/test/patest_dsound_find_best_latency_params.c @@ -511,4 +511,3 @@ error: fprintf( stderr, "Error message: %s\n", Pa_GetErrorText( err ) ); return err; } - diff --git a/test/patest_dsound_low_level_latency_params.c b/test/patest_dsound_low_level_latency_params.c index 85667a7..d583e69 100644 --- a/test/patest_dsound_low_level_latency_params.c +++ b/test/patest_dsound_low_level_latency_params.c @@ -184,4 +184,3 @@ error: fprintf( stderr, "Error message: %s\n", Pa_GetErrorText( err ) ); return err; } - diff --git a/test/patest_dsound_surround.c b/test/patest_dsound_surround.c index 3aa01d6..b7c887d 100644 --- a/test/patest_dsound_surround.c +++ b/test/patest_dsound_surround.c @@ -202,4 +202,3 @@ error: fprintf( stderr, "Error message: %s\n", Pa_GetErrorText( err ) ); return err; } - diff --git a/test/patest_mono.c b/test/patest_mono.c index c07e0bc..e7d7d1b 100644 --- a/test/patest_mono.c +++ b/test/patest_mono.c @@ -153,4 +153,3 @@ error: fprintf( stderr, "Error message: %s\n", Pa_GetErrorText( err ) ); return err; } - diff --git a/test/patest_read_record.c b/test/patest_read_record.c index 4c5f810..bd9c7fe 100644 --- a/test/patest_read_record.c +++ b/test/patest_read_record.c @@ -241,4 +241,3 @@ error: fprintf( stderr, "Error message: %s\n", Pa_GetErrorText( err ) ); return -1; } - diff --git a/test/patest_wmme_find_best_latency_params.c b/test/patest_wmme_find_best_latency_params.c index 860cbc6..5c715f9 100644 --- a/test/patest_wmme_find_best_latency_params.c +++ b/test/patest_wmme_find_best_latency_params.c @@ -515,4 +515,3 @@ error: fprintf( stderr, "Error message: %s\n", Pa_GetErrorText( err ) ); return err; } - diff --git a/test/patest_wmme_low_level_latency_params.c b/test/patest_wmme_low_level_latency_params.c index 1ac0c78..31c8892 100644 --- a/test/patest_wmme_low_level_latency_params.c +++ b/test/patest_wmme_low_level_latency_params.c @@ -189,4 +189,3 @@ error: fprintf( stderr, "Error message: %s\n", Pa_GetErrorText( err ) ); return err; } - From 6a86d4bd3bc3b7208ccbcf6e704ff95b01cfa670 Mon Sep 17 00:00:00 2001 From: orbea Date: Wed, 20 Jan 2021 18:23:43 -0800 Subject: [PATCH 100/164] autoconf build: add src dir src/hostapi/skeleton to fix out of tree builds." --- Makefile.in | 1 + 1 file changed, 1 insertion(+) diff --git a/Makefile.in b/Makefile.in index 5e1a764..967bba3 100644 --- a/Makefile.in +++ b/Makefile.in @@ -146,6 +146,7 @@ SRC_DIRS = \ src/hostapi/dsound \ src/hostapi/jack \ src/hostapi/oss \ + src/hostapi/skeleton \ src/hostapi/wasapi \ src/hostapi/wdmks \ src/hostapi/wmme \ From 68e1c5685b974c0e500def2af5cc869142b0a7cf Mon Sep 17 00:00:00 2001 From: Phil Burk Date: Sun, 24 Jan 2021 14:54:28 -0800 Subject: [PATCH 101/164] Fix patest1 printf (#467) * Fix patest1.c printf Got changed from fprintf() accidentally. Fixes #466 --- test/patest1.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/patest1.c b/test/patest1.c index 110deef..25d6e3f 100644 --- a/test/patest1.c +++ b/test/patest1.c @@ -126,7 +126,7 @@ int main(int argc, char* argv[]) inputParameters.device = Pa_GetDefaultInputDevice(); /* default input device */ if (inputParameters.device == paNoDevice) { - printf(stderr,"Error: No input default device.\n"); + fprintf(stderr, "Error: No input default device.\n"); goto done; } inputParameters.channelCount = 2; /* stereo input */ From fa525d61997f3b62eaf0c14a47d663abe9e1b821 Mon Sep 17 00:00:00 2001 From: Phil Burk Date: Tue, 26 Jan 2021 15:25:10 -0800 Subject: [PATCH 102/164] mac autoconf: support current and future SDKs (#470) Improve the way we generate the path to the SDK so that it it not tied to specific Mac versions. Also changed macosx-version-min to 10.6 Fixes #378 Fixes #468 Use xcrun instead of xcodebuild Note that "configure" was generated using autoconf on Linux. --- .gitignore | 1 + configure | Bin 576931 -> 574696 bytes configure.in | 39 +++++---------------------------------- 3 files changed, 6 insertions(+), 34 deletions(-) diff --git a/.gitignore b/.gitignore index 9b787f9..ed72e3d 100644 --- a/.gitignore +++ b/.gitignore @@ -17,6 +17,7 @@ lib-stamp lib/* libtool portaudio-2.0.pc +autom4te.cache/* # Precompiled Headers *.gch diff --git a/configure b/configure index 34a341bdd51bb1616ed8d3eb63ae12868f780726..81c70f92476227dc2e9c9fdaf7b0c6847f6a678e 100755 GIT binary patch delta 172 zcmZ2HTlqz&azhJa3sVbo3rh=Y3)>cUCNIUJ(mVxS-QtvNh1|sC{Nf5j13goaKt_H! zNL06A`b8i1P)5_~AN<(0G*vVzk_qZaEXmNEe%FKDpV17gOAVVY6gxmVl-kup*te^P IaMV-+050)3x&QzG delta 1044 zcmaFSsl0f$azhJa3sVbo3rh=Y3)>cUCa>v9?(9N>y2UBk3b~2N`Nb86270Cn0n?Se z*h8o5c(Q9xk9TJm)xuDaSdx*T#HD}&QgbrX6s9M*vx}e^Xa+Tq$wX=TM-O(f=@Y!z zg|Qh7R7jG+=ENEdR7jG+7Q`A1R7jG+mc$wiREXbTA=EfAG{9-HHl|9_j5Z|NXrM~c zj5Z?LXrM~cj5a3PXrM~cj5Z^/dev/null 2>&1 ; then - mac_version_min="-mmacosx-version-min=10.3" - mac_sysroot="-isysroot `xcodebuild -version -sdk macosx10.5 Path`" - elif xcodebuild -version -sdk macosx10.6 Path >/dev/null 2>&1 ; then - mac_version_min="-mmacosx-version-min=10.4" - mac_sysroot="-isysroot `xcodebuild -version -sdk macosx10.6 Path`" - elif xcodebuild -version -sdk macosx10.7 Path >/dev/null 2>&1 ; then - mac_version_min="-mmacosx-version-min=10.4" - mac_sysroot="-isysroot `xcodebuild -version -sdk macosx10.7 Path`" - elif xcodebuild -version -sdk macosx10.8 Path >/dev/null 2>&1 ; then - mac_version_min="-mmacosx-version-min=10.4" - mac_sysroot="-isysroot `xcodebuild -version -sdk macosx10.8 Path`" - elif xcodebuild -version -sdk macosx10.9 Path >/dev/null 2>&1 ; then - mac_version_min="-mmacosx-version-min=10.4" - mac_sysroot="-isysroot `xcodebuild -version -sdk macosx10.9 Path`" - elif xcodebuild -version -sdk macosx10.10 Path >/dev/null 2>&1 ; then - mac_version_min="-mmacosx-version-min=10.4" - mac_sysroot="-isysroot `xcodebuild -version -sdk macosx10.10 Path`" - elif xcodebuild -version -sdk macosx10.11 Path >/dev/null 2>&1 ; then - mac_version_min="-mmacosx-version-min=10.4" - mac_sysroot="-isysroot `xcodebuild -version -sdk macosx10.11 Path`" - elif xcodebuild -version -sdk macosx10.12 Path >/dev/null 2>&1 ; then - mac_version_min="-mmacosx-version-min=10.4" - mac_sysroot="-isysroot `xcodebuild -version -sdk macosx10.12 Path`" - elif xcodebuild -version -sdk macosx10.13 Path >/dev/null 2>&1 ; then - mac_version_min="-mmacosx-version-min=10.4" - mac_sysroot="-isysroot `xcodebuild -version -sdk macosx10.13 Path`" - elif xcodebuild -version -sdk macosx10.14 Path >/dev/null 2>&1 ; then - mac_version_min="-mmacosx-version-min=10.4" - mac_sysroot="-isysroot `xcodebuild -version -sdk macosx10.14 Path`" - elif xcodebuild -version -sdk macosx10.15 Path >/dev/null 2>&1 ; then - mac_version_min="-mmacosx-version-min=10.4" - mac_sysroot="-isysroot `xcodebuild -version -sdk macosx10.15 Path`" + if xcrun --sdk macosx10.5 --show-sdk-path >/dev/null 2>&1 ; then + mac_version_min="-mmacosx-version-min=10.5" + mac_sysroot="-isysroot $(xcrun --sdk macosx10.5 --show-sdk-path)" else - AC_MSG_ERROR([Could not find 10.5 to 10.13 SDK.]) + mac_version_min="-mmacosx-version-min=10.6" + mac_sysroot="-isysroot $(xcrun --sdk macosx --show-sdk-path)" fi esac From 358d153564111f31bc32bd564b0d9c53ed17f910 Mon Sep 17 00:00:00 2001 From: Ross Bencina Date: Wed, 27 Jan 2021 23:50:10 +1100 Subject: [PATCH 103/164] Run MSBuild MSVC project CI for pull requests (#419) --- .github/workflows/MSBuild.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/MSBuild.yml b/.github/workflows/MSBuild.yml index 4a78bec..fa61d1a 100644 --- a/.github/workflows/MSBuild.yml +++ b/.github/workflows/MSBuild.yml @@ -1,6 +1,6 @@ -name: MSBuild +name: MSBuild MSVC Project File CI -on: [push] +on: [push, pull_request] env: # Path to the solution file relative to the root of the project. From b50bca981ebe3616dbbb1ed97b4f0fe528c6e91c Mon Sep 17 00:00:00 2001 From: John Melas Date: Thu, 28 Jan 2021 03:29:24 +0200 Subject: [PATCH 104/164] use variadic arguments in DEFINE_GUID also for MSVC (#374) The fix for DEFINE_GUID that was recently added in pa_win_wdmks.c is also needed for the MSVC compiler. Latest versions of the compiler support the /Zc:preprocessor option which is conforming to C99 and later standards https://docs.microsoft.com/en-us/cpp/build/reference/zc-preprocessor?view=msvc-160 so it generates the exact same error as Clang (too many arguments error). Co-authored-by: John Melas --- src/hostapi/wdmks/pa_win_wdmks.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/hostapi/wdmks/pa_win_wdmks.c b/src/hostapi/wdmks/pa_win_wdmks.c index 7224e13..a5e25ad 100644 --- a/src/hostapi/wdmks/pa_win_wdmks.c +++ b/src/hostapi/wdmks/pa_win_wdmks.c @@ -163,7 +163,7 @@ Default is to use the pin category. #define DYNAMIC_GUID(data) {data} #define _NTRTL_ /* Turn off default definition of DEFINE_GUIDEX */ #undef DEFINE_GUID -#ifdef __clang__ /* clang-cl: avoid too many arguments error */ +#if defined(__clang__) || (defined(_MSVC_TRADITIONAL) && !_MSVC_TRADITIONAL) /* clang-cl and new msvc preprocessor: avoid too many arguments error */ #define DEFINE_GUID(n, ...) EXTERN_C const GUID n = {__VA_ARGS__} #define DEFINE_GUID_THUNK(n, ...) DEFINE_GUID(n, __VA_ARGS__) #define DEFINE_GUIDEX(n) DEFINE_GUID_THUNK(n, STATIC_##n) @@ -171,7 +171,7 @@ Default is to use the pin category. #define DEFINE_GUID(n, data) EXTERN_C const GUID n = {data} #define DEFINE_GUID_THUNK(n, data) DEFINE_GUID(n, data) #define DEFINE_GUIDEX(n) DEFINE_GUID_THUNK(n, STATIC_##n) -#endif /* __clang__ */ +#endif /* __clang__, !_MSVC_TRADITIONAL */ #endif #include From 52b1026c1f2ca2d6499bbcb6ddebd94ec2029f2c Mon Sep 17 00:00:00 2001 From: luz paz Date: Sun, 24 Jan 2021 07:39:59 -0500 Subject: [PATCH 105/164] Fix user-facing and non-user-facing typos Found via `codespell v2.1.dev0` `codespell -q 3 -L chello,gord,guid,numer,pres,uint,wirth` --- doc/src/tutorial/writing_a_callback.dox | 2 +- include/pa_win_wasapi.h | 2 +- ltmain.sh | 2 +- src/hostapi/coreaudio/notes.txt | 2 +- src/hostapi/coreaudio/pa_mac_core.c | 2 +- src/hostapi/coreaudio/pa_mac_core_old.c | 2 +- src/hostapi/dsound/pa_win_ds.c | 4 ++-- src/hostapi/wasapi/pa_win_wasapi.c | 6 +++--- src/hostapi/wdmks/pa_win_wdmks.c | 2 +- src/hostapi/wmme/pa_win_wmme.c | 6 +++--- src/os/unix/pa_unix_util.c | 2 +- test/patest_write_stop_hang_illegal.c | 2 +- 12 files changed, 17 insertions(+), 17 deletions(-) diff --git a/doc/src/tutorial/writing_a_callback.dox b/doc/src/tutorial/writing_a_callback.dox index 7c2f8d3..f7d71b1 100644 --- a/doc/src/tutorial/writing_a_callback.dox +++ b/doc/src/tutorial/writing_a_callback.dox @@ -10,7 +10,7 @@ The next task is to write your own "callback" function. The "callback" is a func Before we begin, it's important to realize that the callback is a delicate place. This is because some systems perform the callback in a special thread, or interrupt handler, and it is rarely treated the same as the rest of your code. For most modern systems, you won't be able to cause crashes by making disallowed calls in the callback, but if you want your code to produce glitch-free audio, you will have to make sure you avoid function calls that may take an unbounded amount of time to execute. Exactly what these are depend on your platform but almost certainly include the following: memory allocation/deallocation, I/O (including file I/O as well as console I/O, such as printf()), context switching (such as exec() or -yield()), mutex operations, or anything else that might rely on the OS. If you think short critical sections are safe please go read about priority inversion. Windows amd Mac OS schedulers have no real-time safe priority inversion prevention. Other platforms require special mutex flags. In addition, it is not safe to call any PortAudio API functions in the callback except as explicitly permitted in the documentation. +yield()), mutex operations, or anything else that might rely on the OS. If you think short critical sections are safe please go read about priority inversion. Windows and Mac OS schedulers have no real-time safe priority inversion prevention. Other platforms require special mutex flags. In addition, it is not safe to call any PortAudio API functions in the callback except as explicitly permitted in the documentation. Your callback function must return an int and accept the exact parameters specified in this typedef: diff --git a/include/pa_win_wasapi.h b/include/pa_win_wasapi.h index e7cb421..a3d82ee 100644 --- a/include/pa_win_wasapi.h +++ b/include/pa_win_wasapi.h @@ -332,7 +332,7 @@ typedef struct PaWasapiStreamInfo /** Specifies thread priority explicitly. Will be used only if paWinWasapiThreadPriority flag is specified. - Please note, if Input/Output streams are opened simultaniously (Full-Duplex mode) + Please note, if Input/Output streams are opened simultaneously (Full-Duplex mode) you shall specify same value for threadPriority or othervise one of the values will be used to setup thread priority. */ diff --git a/ltmain.sh b/ltmain.sh index d668a02..4a1ede7 100644 --- a/ltmain.sh +++ b/ltmain.sh @@ -602,7 +602,7 @@ func_quote_for_eval () case $func_quote_for_eval_unquoted_result in # Double-quote args containing shell metacharacters to delay - # word splitting, command substitution and and variable + # word splitting, command substitution and variable # expansion for a subsequent eval. # Many Bourne shells cannot handle close brackets correctly # in scan sets, so we specify it separately. diff --git a/src/hostapi/coreaudio/notes.txt b/src/hostapi/coreaudio/notes.txt index 4db0b0e..281cf01 100644 --- a/src/hostapi/coreaudio/notes.txt +++ b/src/hostapi/coreaudio/notes.txt @@ -64,7 +64,7 @@ the extent to which PA will attempt to "play nice" and to what extent it will interrupt other apps to improve performance. For example, if 44100 Hz sample rate is requested but the device is set at 48000 Hz, PA can either change the device for optimal playback ("Pro" mode), which may interrupt -other programs playing back audio, or simple use a sample-rate coversion, +other programs playing back audio, or simple use a sample-rate conversion, which allows for friendlier sharing of the device ("Play Nice" mode). Additionally, the user may define a "channel mapping" by calling diff --git a/src/hostapi/coreaudio/pa_mac_core.c b/src/hostapi/coreaudio/pa_mac_core.c index 310422c..cac2018 100644 --- a/src/hostapi/coreaudio/pa_mac_core.c +++ b/src/hostapi/coreaudio/pa_mac_core.c @@ -2200,7 +2200,7 @@ static OSStatus AudioIOProc( void *inRefCon, /* static int renderCount = 0; static int inputCount = 0; - printf( "------------------- starting reder/input\n" ); + printf( "------------------- starting render/input\n" ); if( isRender ) printf("Render callback (%d):\t", ++renderCount); else diff --git a/src/hostapi/coreaudio/pa_mac_core_old.c b/src/hostapi/coreaudio/pa_mac_core_old.c index 0e9b357..6c9c6a1 100644 --- a/src/hostapi/coreaudio/pa_mac_core_old.c +++ b/src/hostapi/coreaudio/pa_mac_core_old.c @@ -96,7 +96,7 @@ typedef struct PaMacCore_S // HANDLE processingThread; // DWORD processingThreadId; - char throttleProcessingThreadOnOverload; // 0 -> don't throtte, non-0 -> throttle + char throttleProcessingThreadOnOverload; // 0 -> don't throttle, non-0 -> throttle int processingThreadPriority; int highThreadPriority; int throttledThreadPriority; diff --git a/src/hostapi/dsound/pa_win_ds.c b/src/hostapi/dsound/pa_win_ds.c index 2a7f1a4..8bcf659 100644 --- a/src/hostapi/dsound/pa_win_ds.c +++ b/src/hostapi/dsound/pa_win_ds.c @@ -42,7 +42,7 @@ */ /* Until May 2011 PA/DS has used a multimedia timer to perform the callback. - We're replacing this with a new implementation using a thread and a different timer mechanim. + We're replacing this with a new implementation using a thread and a different timer mechanism. Defining PA_WIN_DS_USE_WMME_TIMER uses the old (pre-May 2011) behavior. */ //#define PA_WIN_DS_USE_WMME_TIMER @@ -322,7 +322,7 @@ static double PaWinDS_GetMinSystemLatencySeconds( void ) NOTE: GetVersionEx() is deprecated as of Windows 8.1 and can not be used to reliably detect versions of Windows higher than Windows 8 (due to manifest requirements for reporting higher versions). Microsoft recommends switching to VerifyVersionInfo (available on Win 2k and later), however GetVersionEx -is is faster, for now we just disable the deprecation warning. +is faster, for now we just disable the deprecation warning. See: https://msdn.microsoft.com/en-us/library/windows/desktop/ms724451(v=vs.85).aspx See: http://www.codeproject.com/Articles/678606/Part-Overcoming-Windows-s-deprecation-of-GetVe */ diff --git a/src/hostapi/wasapi/pa_win_wasapi.c b/src/hostapi/wasapi/pa_win_wasapi.c index 9273cb6..533dcac 100644 --- a/src/hostapi/wasapi/pa_win_wasapi.c +++ b/src/hostapi/wasapi/pa_win_wasapi.c @@ -365,7 +365,7 @@ enum { WASAPI_PACKETS_PER_INPUT_BUFFER = 6 }; // Mixer function typedef void (*MixMonoToStereoF) (void *__to, const void *__from, UINT32 count); -// AVRT is the new "multimedia schedulling stuff" +// AVRT is the new "multimedia scheduling stuff" #ifndef PA_WINRT typedef BOOL (WINAPI *FAvRtCreateThreadOrderingGroup) (PHANDLE,PLARGE_INTEGER,GUID*,PLARGE_INTEGER); typedef BOOL (WINAPI *FAvRtDeleteThreadOrderingGroup) (HANDLE); @@ -3610,7 +3610,7 @@ static PaError ActivateAudioClientOutput(PaWasapiStream *stream) // Correct buffer to max size if it maxed out result of GetBufferSize stream->out.bufferSize = maxBufferSize; - // Get interface latency (actually uneeded as we calculate latency from the size of maxBufferSize) + // Get interface latency (actually unneeded as we calculate latency from the size of maxBufferSize) if (FAILED(hr = IAudioClient_GetStreamLatency(stream->out.clientParent, &stream->out.deviceLatency))) { LogHostError(hr); @@ -3677,7 +3677,7 @@ static PaError ActivateAudioClientInput(PaWasapiStream *stream) // Correct buffer to max size if it maxed out result of GetBufferSize stream->in.bufferSize = maxBufferSize; - // Get interface latency (actually uneeded as we calculate latency from the size + // Get interface latency (actually unneeded as we calculate latency from the size // of maxBufferSize). if (FAILED(hr = IAudioClient_GetStreamLatency(stream->in.clientParent, &stream->in.deviceLatency))) { diff --git a/src/hostapi/wdmks/pa_win_wdmks.c b/src/hostapi/wdmks/pa_win_wdmks.c index a5e25ad..7fae184 100644 --- a/src/hostapi/wdmks/pa_win_wdmks.c +++ b/src/hostapi/wdmks/pa_win_wdmks.c @@ -653,7 +653,7 @@ static BOOL IsEarlierThanVista() NOTE: GetVersionEx() is deprecated as of Windows 8.1 and can not be used to reliably detect versions of Windows higher than Windows 8 (due to manifest requirements for reporting higher versions). Microsoft recommends switching to VerifyVersionInfo (available on Win 2k and later), however GetVersionEx -is is faster, for now we just disable the deprecation warning. +is faster, for now we just disable the deprecation warning. See: https://msdn.microsoft.com/en-us/library/windows/desktop/ms724451(v=vs.85).aspx See: http://www.codeproject.com/Articles/678606/Part-Overcoming-Windows-s-deprecation-of-GetVe */ diff --git a/src/hostapi/wmme/pa_win_wmme.c b/src/hostapi/wmme/pa_win_wmme.c index 18256c8..f8b1d7e 100644 --- a/src/hostapi/wmme/pa_win_wmme.c +++ b/src/hostapi/wmme/pa_win_wmme.c @@ -192,7 +192,7 @@ /* When client suggestedLatency could result in many host buffers, we aim to have around 8, based off Windows documentation that suggests that the kmixer uses 8 buffers. This choice - is somewhat arbitrary here, since we haven't observed significant stability degredation + is somewhat arbitrary here, since we haven't observed significant stability degradation with using either more, or less buffers. */ #define PA_MME_TARGET_HOST_BUFFER_COUNT_ 8 @@ -915,7 +915,7 @@ static void GetDefaultLatencies( PaTime *defaultLowLatency, PaTime *defaultHighL NOTE: GetVersionEx() is deprecated as of Windows 8.1 and can not be used to reliably detect versions of Windows higher than Windows 8 (due to manifest requirements for reporting higher versions). Microsoft recommends switching to VerifyVersionInfo (available on Win 2k and later), however GetVersionEx -is is faster, for now we just disable the deprecation warning. +is faster, for now we just disable the deprecation warning. See: https://msdn.microsoft.com/en-us/library/windows/desktop/ms724451(v=vs.85).aspx See: http://www.codeproject.com/Articles/678606/Part-Overcoming-Windows-s-deprecation-of-GetVe */ @@ -2156,7 +2156,7 @@ struct PaWinMmeStream HANDLE processingThread; PA_THREAD_ID processingThreadId; - char throttleProcessingThreadOnOverload; /* 0 -> don't throtte, non-0 -> throttle */ + char throttleProcessingThreadOnOverload; /* 0 -> don't throttle, non-0 -> throttle */ int processingThreadPriority; int highThreadPriority; int throttledThreadPriority; diff --git a/src/os/unix/pa_unix_util.c b/src/os/unix/pa_unix_util.c index a0d592d..459b2be 100644 --- a/src/os/unix/pa_unix_util.c +++ b/src/os/unix/pa_unix_util.c @@ -231,7 +231,7 @@ PaError PaUtil_CancelThreading( PaUtilThreading *threading, int wait, PaError *e */ pthread_t paUnixMainThread = 0; #else -/*pthreads are opaque. We don't know that asigning it an int value +/*pthreads are opaque. We don't know that assigning it an int value always makes sense, so we don't initialize it unless we have to.*/ pthread_t paUnixMainThread = 0; #endif diff --git a/test/patest_write_stop_hang_illegal.c b/test/patest_write_stop_hang_illegal.c index 39bc487..3d53d4f 100644 --- a/test/patest_write_stop_hang_illegal.c +++ b/test/patest_write_stop_hang_illegal.c @@ -69,7 +69,7 @@ static float s_buffer[FRAMES_PER_BUFFER][2]; /* stereo output buffer */ * illegal way, it may fail for reasons that are not PA bugs. */ -/* Wait for awhile then abort the stream. */ +/* Wait awhile then abort the stream. */ void *stop_thread_proc(void *arg) { PaStream *stream = (PaStream *)arg; From 813b281826399ad0b774d61435cebbc4e00f5d4a Mon Sep 17 00:00:00 2001 From: Davide Gerhard Date: Thu, 28 Jan 2021 08:33:55 +0100 Subject: [PATCH 106/164] pa_mac_core.c: add missing definition to fix build on older systems thanks to @kencu --- src/hostapi/coreaudio/pa_mac_core.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/hostapi/coreaudio/pa_mac_core.c b/src/hostapi/coreaudio/pa_mac_core.c index cac2018..402c512 100644 --- a/src/hostapi/coreaudio/pa_mac_core.c +++ b/src/hostapi/coreaudio/pa_mac_core.c @@ -71,6 +71,10 @@ #include "pa_mac_core_utilities.h" #include "pa_mac_core_blocking.h" +#ifndef MAC_OS_X_VERSION_10_6 +#define MAC_OS_X_VERSION_10_6 1060 +#endif + #ifdef __cplusplus extern "C" From 3686f2f0539c01bbe22722161fbdeca9e2c7d3f0 Mon Sep 17 00:00:00 2001 From: Ross Bencina Date: Thu, 4 Feb 2021 12:17:00 +1100 Subject: [PATCH 107/164] Clean up whitespace in src/hostapi/alsa in preparation for .editorconfig. Indent by 4 spaces. (#475) --- src/hostapi/alsa/pa_linux_alsa.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/hostapi/alsa/pa_linux_alsa.c b/src/hostapi/alsa/pa_linux_alsa.c index be76c64..a66f90d 100644 --- a/src/hostapi/alsa/pa_linux_alsa.c +++ b/src/hostapi/alsa/pa_linux_alsa.c @@ -2052,7 +2052,7 @@ static PaError PaAlsaStreamComponent_InitialConfigure( PaAlsaStreamComponent *se } else { - PA_ENSURE( paUnanticipatedHostError ); + PA_ENSURE( paUnanticipatedHostError ); } ENSURE_( alsa_snd_pcm_hw_params_set_channels( pcm, hwParams, self->numHostChannels ), paInvalidChannelCount ); @@ -3807,8 +3807,8 @@ static PaError PaAlsaStream_WaitForFrames( PaAlsaStream *self, unsigned long *fr PaError res = PaAlsaStreamComponent_BeginPolling( &self->capture, capturePfds ); if( res != paNoError) { - xrun = 1; - goto end; + xrun = 1; + goto end; } totalFds += self->capture.nfds; } @@ -3819,8 +3819,8 @@ static PaError PaAlsaStream_WaitForFrames( PaAlsaStream *self, unsigned long *fr PaError res = PaAlsaStreamComponent_BeginPolling( &self->playback, playbackPfds ); if( res != paNoError) { - xrun = 1; - goto end; + xrun = 1; + goto end; } totalFds += self->playback.nfds; } From bfb9b7f7e7fa2457a59a481fdec9a9d458ab9e8a Mon Sep 17 00:00:00 2001 From: Ross Bencina Date: Thu, 4 Feb 2021 12:17:16 +1100 Subject: [PATCH 108/164] Clean up whitespace in src/hostapi/wdmks in preparation for .editorconfig. Indent by 4 spaces. Strip trailing whitespace. (#476) --- src/hostapi/wdmks/pa_win_wdmks.c | 148 +++++++++++++++---------------- 1 file changed, 74 insertions(+), 74 deletions(-) diff --git a/src/hostapi/wdmks/pa_win_wdmks.c b/src/hostapi/wdmks/pa_win_wdmks.c index 7fae184..161c264 100644 --- a/src/hostapi/wdmks/pa_win_wdmks.c +++ b/src/hostapi/wdmks/pa_win_wdmks.c @@ -27,13 +27,13 @@ */ /* -* The text above constitutes the entire PortAudio license; however, +* The text above constitutes the entire PortAudio license; however, * the PortAudio community also makes the following non-binding requests: * * 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. It is also -* requested that these non-binding requests be included along with the +* they can be incorporated into the canonical version. It is also +* requested that these non-binding requests be included along with the * license above. */ @@ -164,13 +164,13 @@ Default is to use the pin category. #define _NTRTL_ /* Turn off default definition of DEFINE_GUIDEX */ #undef DEFINE_GUID #if defined(__clang__) || (defined(_MSVC_TRADITIONAL) && !_MSVC_TRADITIONAL) /* clang-cl and new msvc preprocessor: avoid too many arguments error */ - #define DEFINE_GUID(n, ...) EXTERN_C const GUID n = {__VA_ARGS__} - #define DEFINE_GUID_THUNK(n, ...) DEFINE_GUID(n, __VA_ARGS__) - #define DEFINE_GUIDEX(n) DEFINE_GUID_THUNK(n, STATIC_##n) + #define DEFINE_GUID(n, ...) EXTERN_C const GUID n = {__VA_ARGS__} + #define DEFINE_GUID_THUNK(n, ...) DEFINE_GUID(n, __VA_ARGS__) + #define DEFINE_GUIDEX(n) DEFINE_GUID_THUNK(n, STATIC_##n) #else - #define DEFINE_GUID(n, data) EXTERN_C const GUID n = {data} - #define DEFINE_GUID_THUNK(n, data) DEFINE_GUID(n, data) - #define DEFINE_GUIDEX(n) DEFINE_GUID_THUNK(n, STATIC_##n) + #define DEFINE_GUID(n, data) EXTERN_C const GUID n = {data} + #define DEFINE_GUID_THUNK(n, data) DEFINE_GUID(n, data) + #define DEFINE_GUIDEX(n) DEFINE_GUID_THUNK(n, STATIC_##n) #endif /* __clang__, !_MSVC_TRADITIONAL */ #endif @@ -229,7 +229,7 @@ typedef struct static PaWinWDMKSAvRtEntryPoints paWinWDMKSAvRtEntryPoints = {0}; /* An unspecified channel count (-1) is not treated correctly, so we replace it with -* an arbitrarily large number */ +* an arbitrarily large number */ #define MAXIMUM_NUMBER_OF_CHANNELS 256 /* Forward definition to break circular type reference between pin and filter */ @@ -371,7 +371,7 @@ typedef struct __PaWinWdmIOInfo HANDLE *events; /* noOfPackets handles (WaveCyclic) 1 (WaveRT) */ DATAPACKET *packets; /* noOfPackets packets (WaveCyclic) 2 (WaveRT) */ /* WaveRT polled mode */ - unsigned lastPosition; + unsigned lastPosition; unsigned pollCntr; } PaWinWdmIOInfo; @@ -414,7 +414,7 @@ struct __PaWinWdmStream }; /* Gather all processing variables in a struct */ -struct __PaProcessThreadInfo +struct __PaProcessThreadInfo { PaWinWdmStream *stream; PaStreamCallbackTimeInfo ti; @@ -434,7 +434,7 @@ struct __PaProcessThreadInfo /* Used for transferring device infos during scanning / rescanning */ typedef struct __PaWinWDMScanDeviceInfosResults -{ +{ PaDeviceInfo **deviceInfos; PaDeviceIndex defaultInputDevice; PaDeviceIndex defaultOutputDevice; @@ -735,9 +735,9 @@ static PaError WdmSyncIoctl( if (!bRes) { unsigned long error = GetLastError(); - if ( !(((error == ERROR_INSUFFICIENT_BUFFER ) || ( error == ERROR_MORE_DATA )) && + if ( !(((error == ERROR_INSUFFICIENT_BUFFER ) || ( error == ERROR_MORE_DATA )) && ( ioctlNumber == IOCTL_KS_PROPERTY ) && - ( outBufferCount == 0 ) ) ) + ( outBufferCount == 0 ) ) ) { KSPROPERTY* ksProperty = (KSPROPERTY*)inBuffer; @@ -1092,15 +1092,15 @@ static const KSTOPOLOGY_CONNECTION* FindStartConnectionTo(ULONG startPin, PaWinW static ULONG GetConnectedPin(ULONG startPin, BOOL forward, PaWinWdmFilter* filter, int muxPosition, ULONG *muxInputPinId, ULONG *muxNodeId) { int limit=1000; - const KSTOPOLOGY_CONNECTION *conn = NULL; + const KSTOPOLOGY_CONNECTION *conn = NULL; TFnGetConnection fnGetConnection = forward ? GetConnectionTo : GetConnectionFrom ; PA_LOGE_; while (1) { limit--; if (limit == 0) { - PA_DEBUG(("GetConnectedPin: LOOP LIMIT REACHED\n")); - break; + PA_DEBUG(("GetConnectedPin: LOOP LIMIT REACHED\n")); + break; } if (conn == NULL) @@ -1164,7 +1164,7 @@ static void DumpConnectionsAndNodes(PaWinWdmFilter* filter) for (i=0; i < filter->connections->Count; ++i) { const KSTOPOLOGY_CONNECTION* pConn = connections + i; - PA_DEBUG((" Connection: %u - FromNode=%u,FromPin=%u -> ToNode=%u,ToPin=%u\n", + PA_DEBUG((" Connection: %u - FromNode=%u,FromPin=%u -> ToNode=%u,ToPin=%u\n", i, pConn->FromNode, pConn->FromNodePin, pConn->ToNode, pConn->ToNodePin @@ -1187,7 +1187,7 @@ static void DumpConnectionsAndNodes(PaWinWdmFilter* filter) } -typedef struct __PaUsbTerminalGUIDToName +typedef struct __PaUsbTerminalGUIDToName { USHORT usbGUID; wchar_t name[64]; @@ -1797,7 +1797,7 @@ static PaWinWdmPin* PinNew(PaWinWdmFilter* parentFilter, unsigned long pinId, Pa PA_DEBUG(("PinNew: Pin name '%s'\n", pin->friendlyName)); #else PA_DEBUG(("PinNew: Pin name '%S'\n", pin->friendlyName)); -#endif +#endif /* Set endpoint pin ID (this is the topology INPUT pin, since portmixer will always traverse the filter in audio streaming direction, see http://msdn.microsoft.com/en-us/library/windows/hardware/ff536331(v=vs.85).aspx @@ -1927,7 +1927,7 @@ static PaWinWdmPin* PinNew(PaWinWdmFilter* parentFilter, unsigned long pinId, Pa FALSE, pin->parentFilter->topologyFilter, muxPos, - &pin->inputs[i]->muxPinId, + &pin->inputs[i]->muxPinId, &pin->inputs[i]->muxNodeId); if (endpointPinId != KSFILTER_NODE) @@ -2232,7 +2232,7 @@ static PaError PinIsFormatSupported(PaWinWdmPin* pin, const WAVEFORMATEX* format dataRange = (KSDATARANGE_AUDIO*)pin->dataRanges; for(count = 0; countdataRangesItem->Count; - count++, + count++, dataRange = (KSDATARANGE_AUDIO*)( ((char*)dataRange) + dataRange->DataRange.FormatSize)) /* Need to update dataRange here, due to 'continue' !! */ { /* Check major format*/ @@ -2263,7 +2263,7 @@ static PaError PinIsFormatSupported(PaWinWdmPin* pin, const WAVEFORMATEX* format PA_DEBUG(("\tBits:%d-%d\n",dataRange->MinimumBitsPerSample,dataRange->MaximumBitsPerSample)); PA_DEBUG(("\tSampleRate:%d-%d\n",dataRange->MinimumSampleFrequency,dataRange->MaximumSampleFrequency)); - if( dataRange->MaximumChannels != (ULONG)-1 && + if( dataRange->MaximumChannels != (ULONG)-1 && dataRange->MaximumChannels < format->nChannels ) { result = paInvalidChannelCount; @@ -2320,7 +2320,7 @@ static PaError PinQueryNotificationSupport(PaWinWdmPin* pPin, BOOL* pbResult) sizeof(BOOL), NULL); - if (result != paNoError) + if (result != paNoError) { PA_DEBUG(("Failed PinQueryNotificationSupport\n")); } @@ -2351,13 +2351,13 @@ static PaError PinGetBufferWithNotification(PaWinWdmPin* pPin, void** pBuffer, D sizeof(KSRTAUDIO_BUFFER), NULL); - if (result == paNoError) + if (result == paNoError) { *pBuffer = propOut.BufferAddress; *pRequestedBufSize = propOut.ActualBufferSize; *pbCallMemBarrier = propOut.CallMemoryBarrier; } - else + else { PA_DEBUG(("Failed to get buffer with notification\n")); } @@ -2393,7 +2393,7 @@ static PaError PinGetBufferWithoutNotification(PaWinWdmPin* pPin, void** pBuffer *pRequestedBufSize = propOut.ActualBufferSize; *pbCallMemBarrier = propOut.CallMemoryBarrier; } - else + else { PA_DEBUG(("Failed to get buffer without notification\n")); } @@ -2423,8 +2423,8 @@ static PaError PinGetBuffer(PaWinWdmPin* pPin, void** pBuffer, DWORD* pRequested { limit--; if (limit == 0) { - PA_DEBUG(("PinGetBuffer: LOOP LIMIT REACHED\n")); - break; + PA_DEBUG(("PinGetBuffer: LOOP LIMIT REACHED\n")); + break; } if (pPin->pinKsSubType != SubType_kPolled) @@ -2474,7 +2474,7 @@ static PaError PinGetBuffer(PaWinWdmPin* pPin, void** pBuffer, DWORD* pRequested return result; } -static PaError PinRegisterPositionRegister(PaWinWdmPin* pPin) +static PaError PinRegisterPositionRegister(PaWinWdmPin* pPin) { PaError result = paNoError; KSRTAUDIO_HWREGISTER_PROPERTY propIn; @@ -2494,7 +2494,7 @@ static PaError PinRegisterPositionRegister(PaWinWdmPin* pPin) sizeof(KSRTAUDIO_HWREGISTER), NULL); - if (result == paNoError) + if (result == paNoError) { pPin->positionRegister = (ULONG*)propOut.Register; } @@ -2508,7 +2508,7 @@ static PaError PinRegisterPositionRegister(PaWinWdmPin* pPin) return result; } -static PaError PinRegisterNotificationHandle(PaWinWdmPin* pPin, HANDLE handle) +static PaError PinRegisterNotificationHandle(PaWinWdmPin* pPin, HANDLE handle) { PaError result = paNoError; KSRTAUDIO_NOTIFICATION_EVENT_PROPERTY prop; @@ -2537,7 +2537,7 @@ static PaError PinRegisterNotificationHandle(PaWinWdmPin* pPin, HANDLE handle) return result; } -static PaError PinUnregisterNotificationHandle(PaWinWdmPin* pPin, HANDLE handle) +static PaError PinUnregisterNotificationHandle(PaWinWdmPin* pPin, HANDLE handle) { PaError result = paNoError; KSRTAUDIO_NOTIFICATION_EVENT_PROPERTY prop; @@ -2681,7 +2681,7 @@ static PaError PinGetAudioPositionViaIOCTLWrite(PaWinWdmPin* pPin, ULONG* pPosit /***********************************************************************************************/ /** -* Create a new filter object. +* Create a new filter object. */ static PaWinWdmFilter* FilterNew( PaWDMKSType type, DWORD devNode, const wchar_t* filterName, const wchar_t* friendlyName, PaError* error ) { @@ -2828,7 +2828,7 @@ PaError FilterInitializePins( PaWinWdmFilter* filter ) return paNoError; if (filter->pins != NULL) - return paNoError; + return paNoError; /* Allocate pointer array to hold the pins */ filter->pins = (PaWinWdmPin**)PaUtil_AllocateMemory( sizeof(PaWinWdmPin*) * filter->pinCount ); @@ -3054,10 +3054,10 @@ static void TrimString(wchar_t* str, size_t length) /** * Build the list of available filters -* Use the SetupDi API to enumerate all devices in the KSCATEGORY_AUDIO which -* have a KSCATEGORY_RENDER or KSCATEGORY_CAPTURE alias. For each of these -* devices initialise a PaWinWdmFilter structure by calling our NewFilter() -* function. We enumerate devices twice, once to count how many there are, +* Use the SetupDi API to enumerate all devices in the KSCATEGORY_AUDIO which +* have a KSCATEGORY_RENDER or KSCATEGORY_CAPTURE alias. For each of these +* devices initialise a PaWinWdmFilter structure by calling our NewFilter() +* function. We enumerate devices twice, once to count how many there are, * and once to initialize the PaWinWdmFilter structures. * * Vista and later: Also check KSCATEGORY_REALTIME for WaveRT devices. @@ -3235,7 +3235,7 @@ PaWinWdmFilter** BuildFilterList( int* pFilterCount, int* pNoOfPaDevices, PaErro very literate. */ if (!SetupDiGetDeviceRegistryPropertyW(handle, &devInfoData, - SPDRP_LOCATION_INFORMATION, + SPDRP_LOCATION_INFORMATION, &type, (BYTE*)friendlyName, sizeof(friendlyName), @@ -3269,7 +3269,7 @@ PaWinWdmFilter** BuildFilterList( int* pFilterCount, int* pNoOfPaDevices, PaErro TrimString(friendlyName, sizeFriendlyName); - newFilter = FilterNew(streamingType, + newFilter = FilterNew(streamingType, devInfoData.DevInst, devInterfaceDetails->DevicePath, friendlyName, @@ -3350,7 +3350,7 @@ static ULONG GetNameHash(const wchar_t* str, const BOOL input) static PaError CreateHashEntry(PaNameHashObject* obj, const wchar_t* name, const BOOL input) { - ULONG hash = GetNameHash(name, input); + ULONG hash = GetNameHash(name, input); PaNameHashIndex * pLast = NULL; PaNameHashIndex * p = obj->list; while (p != 0) @@ -3432,7 +3432,7 @@ static void DeinitNameHashObject(PaNameHashObject* obj) static unsigned GetNameIndex(PaNameHashObject* obj, const wchar_t* name, const BOOL input) { - ULONG hash = GetNameHash(name, input); + ULONG hash = GetNameHash(name, input); PaNameHashIndex* p = obj->list; while (p != NULL) { @@ -3653,7 +3653,7 @@ static PaError ScanDeviceInfos( struct PaUtilHostApiRepresentation *hostApi, PaH case Type_kWaveCyclic: if (IsEarlierThanVista()) { - /* XP doesn't tolerate low latency, unless the Process Priority Class is set to REALTIME_PRIORITY_CLASS + /* XP doesn't tolerate low latency, unless the Process Priority Class is set to REALTIME_PRIORITY_CLASS through SetPriorityClass, then 10 ms is quite feasible. However, one should then bear in mind that ALL of the process is running in REALTIME_PRIORITY_CLASS, which might not be appropriate for an application with a GUI . In this case it is advisable to separate the audio engine in another process and use IPC to communicate @@ -4016,7 +4016,7 @@ static PaError IsFormatSupported( struct PaUtilHostApiRepresentation *hostApi, /* Check that the input format is supported */ channelMask = PaWin_DefaultChannelMask(inputChannelCount); PaWin_InitializeWaveFormatExtensible((PaWinWaveFormat*)&wfx, - inputChannelCount, + inputChannelCount, testFormat, PaWin_SampleFormatToLinearWaveFormatTag(testFormat), sampleRate, @@ -4031,7 +4031,7 @@ static PaError IsFormatSupported( struct PaUtilHostApiRepresentation *hostApi, { /* Try a WAVE_FORMAT_PCM instead */ PaWin_InitializeWaveFormatEx((PaWinWaveFormat*)&wfx, - inputChannelCount, + inputChannelCount, testFormat, PaWin_SampleFormatToLinearWaveFormatTag(testFormat), sampleRate); @@ -4127,7 +4127,7 @@ static PaError IsFormatSupported( struct PaUtilHostApiRepresentation *hostApi, /* Check that the output format is supported */ channelMask = PaWin_DefaultChannelMask(outputChannelCount); PaWin_InitializeWaveFormatExtensible((PaWinWaveFormat*)&wfx, - outputChannelCount, + outputChannelCount, testFormat, PaWin_SampleFormatToLinearWaveFormatTag(testFormat), sampleRate, @@ -4143,7 +4143,7 @@ static PaError IsFormatSupported( struct PaUtilHostApiRepresentation *hostApi, { /* Try a WAVE_FORMAT_PCM instead */ PaWin_InitializeWaveFormatEx((PaWinWaveFormat*)&wfx, - outputChannelCount, + outputChannelCount, testFormat, PaWin_SampleFormatToLinearWaveFormatTag(testFormat), sampleRate); @@ -4197,7 +4197,7 @@ static PaError IsFormatSupported( struct PaUtilHostApiRepresentation *hostApi, return result; } -static void ResetStreamEvents(PaWinWdmStream* stream) +static void ResetStreamEvents(PaWinWdmStream* stream) { unsigned i; ResetEvent(stream->eventAbort); @@ -4221,7 +4221,7 @@ static void ResetStreamEvents(PaWinWdmStream* stream) } } -static void CloseStreamEvents(PaWinWdmStream* stream) +static void CloseStreamEvents(PaWinWdmStream* stream) { unsigned i; PaWinWdmIOInfo* ios[2] = { &stream->capture, &stream->render }; @@ -4506,7 +4506,7 @@ static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi, while (1) { PaWin_InitializeWaveFormatExtensible((PaWinWaveFormat*)&wfx, - channelsToProbe, + channelsToProbe, hostInputSampleFormat, PaWin_SampleFormatToLinearWaveFormatTag(hostInputSampleFormat), sampleRate, @@ -4523,7 +4523,7 @@ static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi, { /* Try a WAVE_FORMAT_PCM instead */ PaWin_InitializeWaveFormatEx((PaWinWaveFormat*)&wfx, - channelsToProbe, + channelsToProbe, hostInputSampleFormat, PaWin_SampleFormatToLinearWaveFormatTag(hostInputSampleFormat), sampleRate); @@ -4658,7 +4658,7 @@ static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi, while (1) { PaWin_InitializeWaveFormatExtensible((PaWinWaveFormat*)&wfx, - channelsToProbe, + channelsToProbe, hostOutputSampleFormat, PaWin_SampleFormatToLinearWaveFormatTag(hostOutputSampleFormat), sampleRate, @@ -4674,7 +4674,7 @@ static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi, if( result != paNoError && result != paDeviceUnavailable ) { PaWin_InitializeWaveFormatEx((PaWinWaveFormat*)&wfx, - channelsToProbe, + channelsToProbe, hostOutputSampleFormat, PaWin_SampleFormatToLinearWaveFormatTag(hostOutputSampleFormat), sampleRate); @@ -4797,7 +4797,7 @@ static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi, stream->userInputChannels, inputSampleFormat, hostInputSampleFormat, stream->userOutputChannels, outputSampleFormat, hostOutputSampleFormat, sampleRate, streamFlags, framesPerUserBuffer, - max(stream->capture.framesPerBuffer, stream->render.framesPerBuffer), + max(stream->capture.framesPerBuffer, stream->render.framesPerBuffer), paUtilBoundedHostBufferSize, streamCallback, userData ); if( result != paNoError ) @@ -4844,7 +4844,7 @@ static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi, ULONG hwFifoLatency = 0; ULONG dummy; result = PinGetBuffer(stream->capture.pPin, (void**)&stream->capture.hostBuffer, &dwRequestedSize, &bCallMemoryBarrier); - if (!result) + if (!result) { PA_DEBUG(("Input buffer start = %p, size = %u\n", stream->capture.hostBuffer, dwRequestedSize)); if (dwRequestedSize != dwTotalSize) @@ -4868,7 +4868,7 @@ static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi, stream->capture.pPin->fnMemBarrier = bCallMemoryBarrier ? MemoryBarrierRead : MemoryBarrierDummy; } - else + else { PA_DEBUG(("Failed to get input buffer (WaveRT)\n")); PaWinWDM_SetLastErrorInfo(paUnanticipatedHostError, "Failed to get input buffer (WaveRT)"); @@ -4900,7 +4900,7 @@ static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi, goto error; } } - else + else { stream->capture.hostBuffer = 0; } @@ -4939,7 +4939,7 @@ static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi, ULONG hwFifoLatency = 0; ULONG dummy; result = PinGetBuffer(stream->render.pPin, (void**)&stream->render.hostBuffer, &dwRequestedSize, &bCallMemoryBarrier); - if (!result) + if (!result) { PA_DEBUG(("Output buffer start = %p, size = %u, membarrier = %u\n", stream->render.hostBuffer, dwRequestedSize, bCallMemoryBarrier)); if (dwRequestedSize != dwTotalSize) @@ -4963,7 +4963,7 @@ static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi, stream->render.pPin->fnMemBarrier = bCallMemoryBarrier ? MemoryBarrierWrite : MemoryBarrierDummy; } - else + else { PA_DEBUG(("Failed to get output buffer (with notification)\n")); PaWinWDM_SetLastErrorInfo(paUnanticipatedHostError, "Failed to get output buffer (with notification)"); @@ -4995,7 +4995,7 @@ static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi, goto error; } } - else + else { stream->render.hostBuffer = 0; } @@ -5121,7 +5121,7 @@ static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi, PaWinWDM_SetLastErrorInfo(paUnanticipatedHostError, "Failed to read capture position register (IOCTL)"); result = paUnanticipatedHostError; goto error; - } + } } else { @@ -5516,19 +5516,19 @@ static void DuplicateFirstChannelInt32(void* buffer, int channels, int samples) } /* -Increase the priority of the calling thread to RT +Increase the priority of the calling thread to RT */ -static HANDLE BumpThreadPriority() +static HANDLE BumpThreadPriority() { HANDLE hThread = GetCurrentThread(); DWORD dwTask = 0; HANDLE hAVRT = NULL; /* If we have access to AVRT.DLL (Vista and later), use it */ - if (paWinWDMKSAvRtEntryPoints.AvSetMmThreadCharacteristics != NULL) + if (paWinWDMKSAvRtEntryPoints.AvSetMmThreadCharacteristics != NULL) { hAVRT = paWinWDMKSAvRtEntryPoints.AvSetMmThreadCharacteristics("Pro Audio", &dwTask); - if (hAVRT != NULL && hAVRT != INVALID_HANDLE_VALUE) + if (hAVRT != NULL && hAVRT != INVALID_HANDLE_VALUE) { BOOL bret = paWinWDMKSAvRtEntryPoints.AvSetMmThreadPriority(hAVRT, PA_AVRT_PRIORITY_CRITICAL); if (!bret) @@ -5565,7 +5565,7 @@ static void DropThreadPriority(HANDLE hAVRT) { HANDLE hThread = GetCurrentThread(); - if (hAVRT != NULL) + if (hAVRT != NULL) { paWinWDMKSAvRtEntryPoints.AvSetMmThreadPriority(hAVRT, PA_AVRT_PRIORITY_NORMAL); paWinWDMKSAvRtEntryPoints.AvRevertMmThreadCharacteristics(hAVRT); @@ -5635,7 +5635,7 @@ static PaError PreparePinsForStart(PaProcessThreadInfo* pInfo) pInfo->priming += pInfo->stream->render.noOfPackets; ++pInfo->pending; SetEvent(pInfo->stream->render.events[0]); - if (pInfo->stream->render.pPin->parentFilter->devInfo.streamingType == Type_kWaveCyclic) + if (pInfo->stream->render.pPin->parentFilter->devInfo.streamingType == Type_kWaveCyclic) { unsigned i; for(i=1; i < pInfo->stream->render.noOfPackets; ++i) @@ -5805,7 +5805,7 @@ static PaError PaDoProcessing(PaProcessThreadInfo* pInfo) framesProcessed = 0; } } - else + else { framesProcessed = PaUtil_EndBufferProcessing(&pInfo->stream->bufferProcessor, &pInfo->cbResult); } @@ -5951,7 +5951,7 @@ PA_THREAD_FUNC ProcessingThread(void* pParam) assert(noOfHandles <= (info.stream->capture.noOfPackets + info.stream->render.noOfPackets + 1)); /* Prepare render and capture pins */ - if ((result = PreparePinsForStart(&info)) != paNoError) + if ((result = PreparePinsForStart(&info)) != paNoError) { PA_DEBUG(("Failed to prepare device(s)!\n")); goto error; @@ -6032,7 +6032,7 @@ PA_THREAD_FUNC ProcessingThread(void* pParam) unsigned eventSignalled = wait - WAIT_OBJECT_0; DWORD dwCurrentTime = 0; - if (wait == WAIT_FAILED) + if (wait == WAIT_FAILED) { PA_DEBUG(("Wait failed = %ld! \n",wait)); break; @@ -6065,7 +6065,7 @@ PA_THREAD_FUNC ProcessingThread(void* pParam) /* Get event time */ dwCurrentTime = GetCurrentTimeInMillisecs(); - /* Since we can mix capture/render devices between WaveCyclic, WaveRT polled and WaveRT notification (3x3 combinations), + /* Since we can mix capture/render devices between WaveCyclic, WaveRT polled and WaveRT notification (3x3 combinations), we can't rely on the timeout of WFMO to check for device timeouts, we need to keep tally. */ if (info.stream->capture.pPin && (dwCurrentTime - timeStamp[0]) >= info.timeout) { @@ -6524,7 +6524,7 @@ static PaError PaPinCaptureEventHandler_WaveCyclic(PaProcessThreadInfo* pInfo, u { 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 + /* 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); From d36033d5daeafe59ad715ffdb4d2a4028ed1f6c0 Mon Sep 17 00:00:00 2001 From: Ross Bencina Date: Thu, 4 Feb 2021 12:17:29 +1100 Subject: [PATCH 109/164] Clean up whitespace in src/hostapi/wasapi in preparation for .editorconfig. Indent by 4 spaces. Strip trailing whitespace. (#477) --- src/hostapi/wasapi/pa_win_wasapi.c | 286 ++++++++++++++--------------- 1 file changed, 143 insertions(+), 143 deletions(-) diff --git a/src/hostapi/wasapi/pa_win_wasapi.c b/src/hostapi/wasapi/pa_win_wasapi.c index 533dcac..34fb52b 100644 --- a/src/hostapi/wasapi/pa_win_wasapi.c +++ b/src/hostapi/wasapi/pa_win_wasapi.c @@ -54,10 +54,10 @@ #define PA_WASAPI_MAX_CONST_DEVICE_COUNT 0 // Force basic behavior by defining 0 if not defined by user #endif -// Fallback from Event to the Polling method in case if latency is higher than 21.33ms, as it allows to use +// Fallback from Event to the Polling method in case if latency is higher than 21.33ms, as it allows to use // 100% of CPU inside the PA's callback. -// Note: Some USB DAC drivers are buggy when Polling method is forced in Exclusive mode, audio output becomes -// unstable with a lot of interruptions, therefore this define is optional. The default behavior is to +// Note: Some USB DAC drivers are buggy when Polling method is forced in Exclusive mode, audio output becomes +// unstable with a lot of interruptions, therefore this define is optional. The default behavior is to // not change the Event mode to Polling and use the mode which user provided. //#define PA_WASAPI_FORCE_POLL_IF_LARGE_BUFFER @@ -108,7 +108,7 @@ #include "pa_win_coinitialize.h" #if !defined(NTDDI_VERSION) || (defined(__GNUC__) && (__GNUC__ <= 6) && !defined(__MINGW64__)) - + #undef WINVER #undef _WIN32_WINNT #define WINVER 0x0600 // VISTA @@ -121,7 +121,7 @@ #ifndef __unaligned #define __unaligned #endif - + #ifndef __C89_NAMELESS #define __C89_NAMELESS #endif @@ -167,7 +167,7 @@ #define FASTCALL #include #include - #else + #else typedef struct _BYTE_BLOB { unsigned long clSize; @@ -181,18 +181,18 @@ #ifndef NT_SUCCESS typedef LONG NTSTATUS; #endif - + #ifndef WAVE_FORMAT_IEEE_FLOAT #define WAVE_FORMAT_IEEE_FLOAT 0x0003 // 32-bit floating-point - #endif - + #endif + #ifndef __MINGW_EXTENSION #if defined(__GNUC__) || defined(__GNUG__) #define __MINGW_EXTENSION __extension__ #else #define __MINGW_EXTENSION #endif - #endif + #endif #include #include @@ -213,7 +213,7 @@ #define DEVICE_STATE_ACTIVE 0x00000001 typedef enum _EDataFlow - { + { eRender = 0, eCapture = ( eRender + 1 ) , eAll = ( eCapture + 1 ) , @@ -222,7 +222,7 @@ EDataFlow; typedef enum _EndpointFormFactor - { + { RemoteNetworkDevice = 0, Speakers = ( RemoteNetworkDevice + 1 ) , LineLevel = ( Speakers + 1 ) , @@ -233,8 +233,8 @@ UnknownDigitalPassthrough = ( Handset + 1 ) , SPDIF = ( UnknownDigitalPassthrough + 1 ) , HDMI = ( SPDIF + 1 ) , - UnknownFormFactor = ( HDMI + 1 ) - } + UnknownFormFactor = ( HDMI + 1 ) + } EndpointFormFactor; #endif @@ -280,7 +280,7 @@ __DEFINE_GUID(pa_KSDATAFORMAT_SUBTYPE_ADPCM, 0x00000002, 0x0000, 0x0010, 0x __DEFINE_GUID(pa_KSDATAFORMAT_SUBTYPE_IEEE_FLOAT, 0x00000003, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 ); #ifdef __IAudioClient2_INTERFACE_DEFINED__ -typedef enum _pa_AUDCLNT_STREAMOPTIONS { +typedef enum _pa_AUDCLNT_STREAMOPTIONS { pa_AUDCLNT_STREAMOPTIONS_NONE = 0x00, pa_AUDCLNT_STREAMOPTIONS_RAW = 0x01, pa_AUDCLNT_STREAMOPTIONS_MATCH_FORMAT = 0x02 @@ -678,7 +678,7 @@ typedef struct PaWasapiWinrtDeviceListContextEntry PaWasapiWinrtDeviceListContextEntry; typedef struct PaWasapiWinrtDeviceListContext { - PaWasapiWinrtDeviceListContextEntry devices[PA_WASAPI_DEVICE_MAX_COUNT * 2]; + PaWasapiWinrtDeviceListContextEntry devices[PA_WASAPI_DEVICE_MAX_COUNT * 2]; } PaWasapiWinrtDeviceListContext; #endif @@ -855,7 +855,7 @@ static BOOL SystemTimer_SetGranularity(SystemTimer *timer, UINT32 granularity) #else (void)granularity; - // UWP does not support increase of the timer precision change and thus calling WaitForSingleObject with anything + // UWP does not support increase of the timer precision change and thus calling WaitForSingleObject with anything // below 10 milliseconds will cause underruns for input and output stream. timer->granularity = 10; #endif @@ -974,7 +974,7 @@ static WORD PaSampleFormatToBitsPerSample(PaSampleFormat format_id) // Note: paCustomFormat stands for 8.24 format (24-bits inside 32-bit containers) static PaSampleFormat GetSampleFormatForIO(PaSampleFormat format_id) { - return ((format_id & ~paNonInterleaved) == paCustomFormat ? + return ((format_id & ~paNonInterleaved) == paCustomFormat ? (paInt32 | (format_id & paNonInterleaved ? paNonInterleaved : 0)) : format_id); } @@ -1210,8 +1210,8 @@ static EWindowsVersion GetWindowsVersion() if (version == WINDOWS_UNKNOWN) { DWORD dwMajorVersion = 0xFFFFFFFFU, dwMinorVersion = 0, dwBuild = 0; - - // RTL_OSVERSIONINFOW equals OSVERSIONINFOW but it is missing inb MinGW winnt.h header, + + // RTL_OSVERSIONINFOW equals OSVERSIONINFOW but it is missing inb MinGW winnt.h header, // thus use OSVERSIONINFOW for greater portability typedef NTSTATUS (WINAPI *LPFN_RTLGETVERSION)(POSVERSIONINFOW lpVersionInformation); LPFN_RTLGETVERSION fnRtlGetVersion; @@ -1370,11 +1370,11 @@ static const IID *GetAudioClientIID() // ------------------------------------------------------------------------------------------ typedef enum EMixDirection -{ +{ MIX_DIR__1TO2, //!< mix one channel to L and R MIX_DIR__2TO1, //!< mix L and R channels to one channel MIX_DIR__2TO1_L //!< mix only L channel (of total 2 channels) to one channel -} +} EMixDirection; // ------------------------------------------------------------------------------------------ @@ -1438,7 +1438,7 @@ static void _MixMonoToStereo_1TO2_16(void *__to, const void *__from, UINT32 coun static void _MixMonoToStereo_1TO2_8_24(void *__to, const void *__from, UINT32 count) { _WASAPI_MONO_TO_STEREO_MIXER_1_TO_2(int); /* !!! int24 data is contained in 32-bit containers*/ } static void _MixMonoToStereo_1TO2_32(void *__to, const void *__from, UINT32 count) { _WASAPI_MONO_TO_STEREO_MIXER_1_TO_2(int); } static void _MixMonoToStereo_1TO2_32f(void *__to, const void *__from, UINT32 count) { _WASAPI_MONO_TO_STEREO_MIXER_1_TO_2(float); } -static void _MixMonoToStereo_1TO2_24(void *__to, const void *__from, UINT32 count) +static void _MixMonoToStereo_1TO2_24(void *__to, const void *__from, UINT32 count) { const UCHAR * __restrict from = (const UCHAR *)__from; UCHAR * __restrict to = (UCHAR *)__to; @@ -1461,7 +1461,7 @@ static void _MixMonoToStereo_2TO1_16(void *__to, const void *__from, UINT32 coun static void _MixMonoToStereo_2TO1_8_24(void *__to, const void *__from, UINT32 count) { _WASAPI_MONO_TO_STEREO_MIXER_2_TO_1_INT32(int); /* !!! int24 data is contained in 32-bit containers*/ } static void _MixMonoToStereo_2TO1_32(void *__to, const void *__from, UINT32 count) { _WASAPI_MONO_TO_STEREO_MIXER_2_TO_1_INT64(int); } static void _MixMonoToStereo_2TO1_32f(void *__to, const void *__from, UINT32 count) { _WASAPI_MONO_TO_STEREO_MIXER_2_TO_1_FLT32(float); } -static void _MixMonoToStereo_2TO1_24(void *__to, const void *__from, UINT32 count) +static void _MixMonoToStereo_2TO1_24(void *__to, const void *__from, UINT32 count) { const UCHAR * __restrict from = (const UCHAR *)__from; UCHAR * __restrict to = (UCHAR *)__to; @@ -1470,11 +1470,11 @@ static void _MixMonoToStereo_2TO1_24(void *__to, const void *__from, UINT32 coun while (to != end) { - tempL = (((PaInt32)from[0]) << 8); + tempL = (((PaInt32)from[0]) << 8); tempL = tempL | (((PaInt32)from[1]) << 16); tempL = tempL | (((PaInt32)from[2]) << 24); - tempR = (((PaInt32)from[3]) << 8); + tempR = (((PaInt32)from[3]) << 8); tempR = tempR | (((PaInt32)from[4]) << 16); tempR = tempR | (((PaInt32)from[5]) << 24); @@ -1495,7 +1495,7 @@ static void _MixMonoToStereo_2TO1_16_L(void *__to, const void *__from, UINT32 co static void _MixMonoToStereo_2TO1_8_24_L(void *__to, const void *__from, UINT32 count) { _WASAPI_MONO_TO_STEREO_MIXER_2_TO_1_L(int); /* !!! int24 data is contained in 32-bit containers*/ } static void _MixMonoToStereo_2TO1_32_L(void *__to, const void *__from, UINT32 count) { _WASAPI_MONO_TO_STEREO_MIXER_2_TO_1_L(int); } static void _MixMonoToStereo_2TO1_32f_L(void *__to, const void *__from, UINT32 count) { _WASAPI_MONO_TO_STEREO_MIXER_2_TO_1_L(float); } -static void _MixMonoToStereo_2TO1_24_L(void *__to, const void *__from, UINT32 count) +static void _MixMonoToStereo_2TO1_24_L(void *__to, const void *__from, UINT32 count) { const UCHAR * __restrict from = (const UCHAR *)__from; UCHAR * __restrict to = (UCHAR *)__to; @@ -1516,7 +1516,7 @@ static void _MixMonoToStereo_2TO1_24_L(void *__to, const void *__from, UINT32 co static MixMonoToStereoF GetMonoToStereoMixer(const WAVEFORMATEXTENSIBLE *fmtext, EMixDirection dir) { PaSampleFormat format = WaveToPaFormat(fmtext); - + switch (dir) { case MIX_DIR__1TO2: @@ -1577,15 +1577,15 @@ typedef struct PaActivateAudioInterfaceCompletionHandler } PaActivateAudioInterfaceCompletionHandler; -static HRESULT (STDMETHODCALLTYPE PaActivateAudioInterfaceCompletionHandler_QueryInterface)( +static HRESULT (STDMETHODCALLTYPE PaActivateAudioInterfaceCompletionHandler_QueryInterface)( IActivateAudioInterfaceCompletionHandler *This, REFIID riid, void **ppvObject) { PaActivateAudioInterfaceCompletionHandler *handler = (PaActivateAudioInterfaceCompletionHandler *)This; // From MSDN: - // "The IAgileObject interface is a marker interface that indicates that an object + // "The IAgileObject interface is a marker interface that indicates that an object // is free threaded and can be called from any apartment." - if (IsEqualIID(riid, &IID_IUnknown) || + if (IsEqualIID(riid, &IID_IUnknown) || IsEqualIID(riid, &IID_IAgileObject)) { IActivateAudioInterfaceCompletionHandler_AddRef((IActivateAudioInterfaceCompletionHandler *)handler); @@ -1595,16 +1595,16 @@ static HRESULT (STDMETHODCALLTYPE PaActivateAudioInterfaceCompletionHandler_Quer return E_NOINTERFACE; } - -static ULONG (STDMETHODCALLTYPE PaActivateAudioInterfaceCompletionHandler_AddRef)( + +static ULONG (STDMETHODCALLTYPE PaActivateAudioInterfaceCompletionHandler_AddRef)( IActivateAudioInterfaceCompletionHandler *This) { PaActivateAudioInterfaceCompletionHandler *handler = (PaActivateAudioInterfaceCompletionHandler *)This; return InterlockedIncrement(&handler->refs); } - -static ULONG (STDMETHODCALLTYPE PaActivateAudioInterfaceCompletionHandler_Release)( + +static ULONG (STDMETHODCALLTYPE PaActivateAudioInterfaceCompletionHandler_Release)( IActivateAudioInterfaceCompletionHandler *This) { PaActivateAudioInterfaceCompletionHandler *handler = (PaActivateAudioInterfaceCompletionHandler *)This; @@ -1618,8 +1618,8 @@ static ULONG (STDMETHODCALLTYPE PaActivateAudioInterfaceCompletionHandler_Releas return refs; } - -static HRESULT (STDMETHODCALLTYPE PaActivateAudioInterfaceCompletionHandler_ActivateCompleted)( + +static HRESULT (STDMETHODCALLTYPE PaActivateAudioInterfaceCompletionHandler_ActivateCompleted)( IActivateAudioInterfaceCompletionHandler *This, IActivateAudioInterfaceAsyncOperation *activateOperation) { PaActivateAudioInterfaceCompletionHandler *handler = (PaActivateAudioInterfaceCompletionHandler *)This; @@ -1627,7 +1627,7 @@ static HRESULT (STDMETHODCALLTYPE PaActivateAudioInterfaceCompletionHandler_Acti HRESULT hr = S_OK; HRESULT hrActivateResult = S_OK; IUnknown *punkAudioInterface = NULL; - + // Check for a successful activation result hr = IActivateAudioInterfaceAsyncOperation_GetActivateResult(activateOperation, &hrActivateResult, &punkAudioInterface); if (SUCCEEDED(hr) && SUCCEEDED(hrActivateResult)) @@ -1643,7 +1643,7 @@ static HRESULT (STDMETHODCALLTYPE PaActivateAudioInterfaceCompletionHandler_Acti handler->out.hr = hrActivateResult; else handler->out.hr = hr; - + // Got client object, stop busy waiting in ActivateAudioInterface InterlockedExchange(&handler->done, TRUE); @@ -1653,9 +1653,9 @@ static HRESULT (STDMETHODCALLTYPE PaActivateAudioInterfaceCompletionHandler_Acti static IActivateAudioInterfaceCompletionHandler *CreateActivateAudioInterfaceCompletionHandler(const IID *iid, void **client) { PaActivateAudioInterfaceCompletionHandler *handler = PaUtil_AllocateMemory(sizeof(PaActivateAudioInterfaceCompletionHandler)); - + memset(handler, 0, sizeof(*handler)); - + handler->parent.lpVtbl = PaUtil_AllocateMemory(sizeof(*handler->parent.lpVtbl)); handler->parent.lpVtbl->QueryInterface = &PaActivateAudioInterfaceCompletionHandler_QueryInterface; handler->parent.lpVtbl->AddRef = &PaActivateAudioInterfaceCompletionHandler_AddRef; @@ -1664,7 +1664,7 @@ static IActivateAudioInterfaceCompletionHandler *CreateActivateAudioInterfaceCom handler->refs = 1; handler->in.iid = iid; handler->in.obj = client; - + return (IActivateAudioInterfaceCompletionHandler *)handler; } #endif @@ -1689,7 +1689,7 @@ static HRESULT WinRT_GetDefaultDeviceId(WCHAR *deviceId, UINT32 deviceIdMax, EDa break; default: return S_FALSE; - } + } return S_OK; } @@ -1698,15 +1698,15 @@ static HRESULT WinRT_GetDefaultDeviceId(WCHAR *deviceId, UINT32 deviceIdMax, EDa // ------------------------------------------------------------------------------------------ #ifdef PA_WINRT static HRESULT WinRT_ActivateAudioInterface(const WCHAR *deviceId, const IID *iid, void **client) -{ +{ PaError result = paNoError; HRESULT hr = S_OK; IActivateAudioInterfaceAsyncOperation *asyncOp = NULL; IActivateAudioInterfaceCompletionHandler *handler = CreateActivateAudioInterfaceCompletionHandler(iid, client); PaActivateAudioInterfaceCompletionHandler *handlerImpl = (PaActivateAudioInterfaceCompletionHandler *)handler; UINT32 sleepToggle = 0; - - // Async operation will call back to IActivateAudioInterfaceCompletionHandler::ActivateCompleted + + // Async operation will call back to IActivateAudioInterfaceCompletionHandler::ActivateCompleted // which must be an agile interface implementation hr = ActivateAudioInterfaceAsync(deviceId, iid, NULL, handler, &asyncOp); IF_FAILED_INTERNAL_ERROR_JUMP(hr, result, error); @@ -1730,7 +1730,7 @@ error: #endif // ------------------------------------------------------------------------------------------ -static HRESULT ActivateAudioInterface(const PaWasapiDeviceInfo *deviceInfo, const PaWasapiStreamInfo *streamInfo, +static HRESULT ActivateAudioInterface(const PaWasapiDeviceInfo *deviceInfo, const PaWasapiStreamInfo *streamInfo, IAudioClient **client) { HRESULT hr; @@ -1783,7 +1783,7 @@ static HRESULT ActivateAudioInterface(const PaWasapiDeviceInfo *deviceInfo, cons // ------------------------------------------------------------------------------------------ #ifdef PA_WINRT // Windows 10 SDK 10.0.15063.0 has SignalObjectAndWait defined again (unlike in 10.0.14393.0 and lower) -#if !defined(WDK_NTDDI_VERSION) || (WDK_NTDDI_VERSION < NTDDI_WIN10_RS2) +#if !defined(WDK_NTDDI_VERSION) || (WDK_NTDDI_VERSION < NTDDI_WIN10_RS2) static DWORD SignalObjectAndWait(HANDLE hObjectToSignal, HANDLE hObjectToWaitOn, DWORD dwMilliseconds, BOOL bAlertable) { SetEvent(hObjectToSignal); @@ -1800,7 +1800,7 @@ static void NotifyStateChanged(PaWasapiStream *stream, UINT32 flags, HRESULT hr) if (FAILED(hr)) flags |= paWasapiStreamStateError; - + stream->fnStateHandler((PaStream *)stream, flags, hr, stream->pStateHandlerUserData); } @@ -1828,7 +1828,7 @@ static PaError FillInactiveDeviceInfo(PaWasapiHostApiRepresentation *paWasapi, P } // ------------------------------------------------------------------------------------------ -static PaError FillDeviceInfo(PaWasapiHostApiRepresentation *paWasapi, void *pEndPoints, INT32 index, const WCHAR *defaultRenderId, +static PaError FillDeviceInfo(PaWasapiHostApiRepresentation *paWasapi, void *pEndPoints, INT32 index, const WCHAR *defaultRenderId, const WCHAR *defaultCaptureId, PaDeviceInfo *deviceInfo, PaWasapiDeviceInfo *wasapiDeviceInfo #ifdef PA_WINRT , PaWasapiWinrtDeviceListContext *deviceListContext @@ -1894,7 +1894,7 @@ static PaError FillDeviceInfo(PaWasapiHostApiRepresentation *paWasapi, void *pEn WideCharToMultiByte(CP_UTF8, 0, value.pwszVal, (INT32)wcslen(value.pwszVal), (char *)deviceInfo->name, PA_WASAPI_DEVICE_NAME_LEN - 1, 0, 0); else _snprintf((char *)deviceInfo->name, PA_WASAPI_DEVICE_NAME_LEN - 1, "baddev%d", index); - + PropVariantClear(&value); PA_DEBUG(("WASAPI:%d| name[%s]\n", index, deviceInfo->name)); @@ -1908,7 +1908,7 @@ static PaError FillDeviceInfo(PaWasapiHostApiRepresentation *paWasapi, void *pEn IF_FAILED_INTERNAL_ERROR_JUMP(hr, result, error); memcpy(&wasapiDeviceInfo->DefaultFormat, value.blob.pBlobData, min(sizeof(wasapiDeviceInfo->DefaultFormat), value.blob.cbSize)); - + PropVariantClear(&value); } @@ -1969,7 +1969,7 @@ static PaError FillDeviceInfo(PaWasapiHostApiRepresentation *paWasapi, void *pEn // Set default Output/Input devices if ((defaultRenderId != NULL) && (wcsncmp(wasapiDeviceInfo->deviceId, defaultRenderId, PA_WASAPI_DEVICE_NAME_LEN - 1) == 0)) - hostApi->info.defaultOutputDevice = hostApi->info.deviceCount; + hostApi->info.defaultOutputDevice = hostApi->info.deviceCount; if ((defaultCaptureId != NULL) && (wcsncmp(wasapiDeviceInfo->deviceId, defaultCaptureId, PA_WASAPI_DEVICE_NAME_LEN - 1) == 0)) hostApi->info.defaultInputDevice = hostApi->info.deviceCount; @@ -1994,7 +1994,7 @@ static PaError FillDeviceInfo(PaWasapiHostApiRepresentation *paWasapi, void *pEn // ignore error, let continue further without failing with paInternalError hr = S_OK; } - + // Get mix format hr = IAudioClient_GetMixFormat(tmpClient, &mixFormat); if (SUCCEEDED(hr)) @@ -2028,7 +2028,7 @@ static PaError FillDeviceInfo(PaWasapiHostApiRepresentation *paWasapi, void *pEn goto error; } } - + // Fill basic device data deviceInfo->maxInputChannels = 0; deviceInfo->maxOutputChannels = 0; @@ -2070,7 +2070,7 @@ static PaDeviceInfo *AllocateDeviceListMemory(PaWasapiHostApiRepresentation *paW PaUtilHostApiRepresentation *hostApi = (PaUtilHostApiRepresentation *)paWasapi; PaDeviceInfo *deviceInfoArray = NULL; - if ((paWasapi->devInfo = (PaWasapiDeviceInfo *)PaUtil_GroupAllocateMemory(paWasapi->allocations, + if ((paWasapi->devInfo = (PaWasapiDeviceInfo *)PaUtil_GroupAllocateMemory(paWasapi->allocations, sizeof(PaWasapiDeviceInfo) * paWasapi->deviceCount)) == NULL) { return NULL; @@ -2085,7 +2085,7 @@ static PaDeviceInfo *AllocateDeviceListMemory(PaWasapiHostApiRepresentation *paW deviceCount = PA_WASAPI_MAX_CONST_DEVICE_COUNT; #endif - if ((hostApi->deviceInfos = (PaDeviceInfo **)PaUtil_GroupAllocateMemory(paWasapi->allocations, + if ((hostApi->deviceInfos = (PaDeviceInfo **)PaUtil_GroupAllocateMemory(paWasapi->allocations, sizeof(PaDeviceInfo *) * deviceCount)) == NULL) { return NULL; @@ -2094,7 +2094,7 @@ static PaDeviceInfo *AllocateDeviceListMemory(PaWasapiHostApiRepresentation *paW hostApi->deviceInfos[i] = NULL; // Allocate all device info structs in a contiguous block - if ((deviceInfoArray = (PaDeviceInfo *)PaUtil_GroupAllocateMemory(paWasapi->allocations, + if ((deviceInfoArray = (PaDeviceInfo *)PaUtil_GroupAllocateMemory(paWasapi->allocations, sizeof(PaDeviceInfo) * deviceCount)) == NULL) { return NULL; @@ -2131,7 +2131,7 @@ static PaError CreateDeviceList(PaWasapiHostApiRepresentation *paWasapi, PaHostA return paInternalError; #ifndef PA_WINRT - hr = CoCreateInstance(&pa_CLSID_IMMDeviceEnumerator, NULL, CLSCTX_INPROC_SERVER, + hr = CoCreateInstance(&pa_CLSID_IMMDeviceEnumerator, NULL, CLSCTX_INPROC_SERVER, &pa_IID_IMMDeviceEnumerator, (void **)&pEnumerator); IF_FAILED_INTERNAL_ERROR_JUMP(hr, result, error); @@ -2142,7 +2142,7 @@ static PaError CreateDeviceList(PaWasapiHostApiRepresentation *paWasapi, PaHostA hr = IMMDeviceEnumerator_GetDefaultAudioEndpoint(pEnumerator, eRender, eMultimedia, &device); if (hr != S_OK) { - if (hr != E_NOTFOUND) + if (hr != E_NOTFOUND) { IF_FAILED_INTERNAL_ERROR_JUMP(hr, result, error); } @@ -2157,7 +2157,7 @@ static PaError CreateDeviceList(PaWasapiHostApiRepresentation *paWasapi, PaHostA hr = IMMDeviceEnumerator_GetDefaultAudioEndpoint(pEnumerator, eCapture, eMultimedia, &device); if (hr != S_OK) { - if (hr != E_NOTFOUND) + if (hr != E_NOTFOUND) { IF_FAILED_INTERNAL_ERROR_JUMP(hr, result, error); } @@ -2202,7 +2202,7 @@ static PaError CreateDeviceList(PaWasapiHostApiRepresentation *paWasapi, PaHostA deviceListContext.devices[paWasapi->deviceCount].info = &g_DeviceListInfo.render.devices[i]; deviceListContext.devices[paWasapi->deviceCount].flow = eRender; paWasapi->deviceCount++; - } + } } if (g_DeviceListInfo.capture.deviceCount == 0) @@ -2212,7 +2212,7 @@ static PaError CreateDeviceList(PaWasapiHostApiRepresentation *paWasapi, PaHostA deviceListContext.devices[paWasapi->deviceCount].info = &defaultCapture; deviceListContext.devices[paWasapi->deviceCount].flow = eCapture; paWasapi->deviceCount++; - + SAFE_RELEASE(tmpClient); } } @@ -2223,7 +2223,7 @@ static PaError CreateDeviceList(PaWasapiHostApiRepresentation *paWasapi, PaHostA deviceListContext.devices[paWasapi->deviceCount].info = &g_DeviceListInfo.capture.devices[i]; deviceListContext.devices[paWasapi->deviceCount].flow = eCapture; paWasapi->deviceCount++; - } + } } #endif @@ -2244,11 +2244,11 @@ static PaError CreateDeviceList(PaWasapiHostApiRepresentation *paWasapi, PaHostA FillBaseDeviceInfo(deviceInfo, hostApiIndex); - if ((result = FillDeviceInfo(paWasapi, pEndPoints, i, defaultRenderId, defaultCaptureId, + if ((result = FillDeviceInfo(paWasapi, pEndPoints, i, defaultRenderId, defaultCaptureId, deviceInfo, &paWasapi->devInfo[i] #ifdef PA_WINRT , &deviceListContext - #endif + #endif )) != paNoError) { // Faulty device is made inactive @@ -2263,7 +2263,7 @@ static PaError CreateDeviceList(PaWasapiHostApiRepresentation *paWasapi, PaHostA // Fill the remaining slots with inactive device info #if defined(PA_WASAPI_MAX_CONST_DEVICE_COUNT) && (PA_WASAPI_MAX_CONST_DEVICE_COUNT > 0) if ((hostApi->info.deviceCount != 0) && (hostApi->info.deviceCount < PA_WASAPI_MAX_CONST_DEVICE_COUNT)) - { + { for (i = hostApi->info.deviceCount; i < PA_WASAPI_MAX_CONST_DEVICE_COUNT; ++i) { PaDeviceInfo *deviceInfo = &deviceInfoArray[i]; @@ -2296,7 +2296,7 @@ done: return result; error: - + // Safety if error was not set so that we do not think initialize was a success if (result == paNoError) result = paInternalError; @@ -2325,7 +2325,7 @@ PaError PaWasapi_Initialize( PaUtilHostApiRepresentation **hostApi, PaHostApiInd { result = paInsufficientMemory; goto error; - } + } memset(paWasapi, 0, sizeof(PaWasapiHostApiRepresentation)); /* ensure all fields are zeroed. especially paWasapi->allocations */ // Initialize COM subsystem @@ -2516,7 +2516,7 @@ int PaWasapi_GetDeviceCurrentFormat( PaStream *pStream, void *pFormat, unsigned PaWasapiStream *stream = (PaWasapiStream *)pStream; if (stream == NULL) return paBadStreamPtr; - + format = (bOutput == TRUE ? &stream->out.wavex : &stream->in.wavex); size = min(formatSize, (UINT32)sizeof(*format)); @@ -2551,7 +2551,7 @@ int PaWasapi_GetDeviceDefaultFormat( void *pFormat, unsigned int formatSize, PaD // Validate index if ((UINT32)index >= paWasapi->deviceCount) return paInvalidDevice; - + size = min(formatSize, (UINT32)sizeof(paWasapi->devInfo[ index ].DefaultFormat)); memcpy(pFormat, &paWasapi->devInfo[ index ].DefaultFormat, size); @@ -2584,7 +2584,7 @@ int PaWasapi_GetDeviceMixFormat( void *pFormat, unsigned int formatSize, PaDevic // Validate index if ((UINT32)index >= paWasapi->deviceCount) return paInvalidDevice; - + size = min(formatSize, (UINT32)sizeof(paWasapi->devInfo[ index ].MixFormat)); memcpy(pFormat, &paWasapi->devInfo[ index ].MixFormat, size); @@ -2671,7 +2671,7 @@ static void LogWAVEFORMATEXTENSIBLE(const WAVEFORMATEXTENSIBLE *in) case WAVE_FORMAT_PCM: PRINT(("wFormatTag =WAVE_FORMAT_PCM\n")); break; case WAVE_FORMAT_IEEE_FLOAT: PRINT(("wFormatTag =WAVE_FORMAT_IEEE_FLOAT\n")); break; - default: + default: PRINT(("wFormatTag =UNKNOWN(%d)\n",old->wFormatTag)); break; } @@ -2805,7 +2805,7 @@ static PaError MakeWaveFormatFromParams(WAVEFORMATEXTENSIBLE *wavex, const PaStr case 7: wavex->dwChannelMask = PAWIN_SPEAKER_5POINT1_SURROUND|SPEAKER_BACK_CENTER; break; #else case 7: wavex->dwChannelMask = PAWIN_SPEAKER_5POINT1|SPEAKER_BACK_CENTER; break; -#endif +#endif #ifdef PAWIN_SPEAKER_7POINT1_SURROUND case 8: wavex->dwChannelMask = PAWIN_SPEAKER_7POINT1_SURROUND; break; #else @@ -2824,7 +2824,7 @@ static PaError MakeWaveFormatFromParams(WAVEFORMATEXTENSIBLE *wavex, const PaStr } // ------------------------------------------------------------------------------------------ -static HRESULT GetAlternativeSampleFormatExclusive(IAudioClient *client, double sampleRate, +static HRESULT GetAlternativeSampleFormatExclusive(IAudioClient *client, double sampleRate, const PaStreamParameters *params, WAVEFORMATEXTENSIBLE *outWavex, BOOL packedSampleFormatOnly) { HRESULT hr = !S_OK; @@ -2880,12 +2880,12 @@ static HRESULT GetAlternativeSampleFormatExclusive(IAudioClient *client, double } } } - + return hr; } // ------------------------------------------------------------------------------------------ -static PaError GetClosestFormat(IAudioClient *client, double sampleRate, const PaStreamParameters *_params, +static PaError GetClosestFormat(IAudioClient *client, double sampleRate, const PaStreamParameters *_params, AUDCLNT_SHAREMODE shareMode, WAVEFORMATEXTENSIBLE *outWavex, BOOL output) { PaWasapiStreamInfo *streamInfo = (PaWasapiStreamInfo *)_params->hostApiSpecificStreamInfo; @@ -2905,21 +2905,21 @@ static PaError GetClosestFormat(IAudioClient *client, double sampleRate, const P // Try standard approach, e.g. if data is > 16 bits it will be packed into 32-bit containers MakeWaveFormatFromParams(outWavex, ¶ms, sampleRate, FALSE); - + // If built-in PCM converter requested then shared mode format will always succeed - if ((GetWindowsVersion() >= WINDOWS_7_SERVER2008R2) && - (shareMode == AUDCLNT_SHAREMODE_SHARED) && + if ((GetWindowsVersion() >= WINDOWS_7_SERVER2008R2) && + (shareMode == AUDCLNT_SHAREMODE_SHARED) && ((streamInfo != NULL) && (streamInfo->flags & paWinWasapiAutoConvert))) return paFormatIsSupported; hr = IAudioClient_IsFormatSupported(client, shareMode, &outWavex->Format, (shareMode == AUDCLNT_SHAREMODE_SHARED ? &sharedClosestMatch : NULL)); - + // Exclusive mode can require packed format for some devices if ((hr != S_OK) && (shareMode == AUDCLNT_SHAREMODE_EXCLUSIVE)) { // Enforce packed only format, e.g. data bits will not be packed into 32-bit containers in any case MakeWaveFormatFromParams(outWavex, ¶ms, sampleRate, TRUE); - hr = IAudioClient_IsFormatSupported(client, shareMode, &outWavex->Format, NULL); + hr = IAudioClient_IsFormatSupported(client, shareMode, &outWavex->Format, NULL); } if (hr == S_OK) @@ -3185,7 +3185,7 @@ static void _CalculateAlignedPeriod(PaWasapiSubStream *pSub, UINT32 *nFramesPerL static void _CalculatePeriodicity(PaWasapiSubStream *pSub, BOOL output, REFERENCE_TIME *periodicity) { // Note: according Microsoft docs for IAudioClient::Initialize we can set periodicity of the buffer - // only for Exclusive mode. By setting periodicity almost equal to the user buffer frames we can + // only for Exclusive mode. By setting periodicity almost equal to the user buffer frames we can // achieve high quality (less glitchy) low-latency audio. if (pSub->shareMode == AUDCLNT_SHAREMODE_EXCLUSIVE) { @@ -3195,14 +3195,14 @@ static void _CalculatePeriodicity(PaWasapiSubStream *pSub, BOOL output, REFERENC (*periodicity) = pSub->period; // Try make buffer ready for I/O once we request the buffer readiness for it. Only Polling mode - // because for Event mode buffer size and periodicity must be equal according Microsoft + // because for Event mode buffer size and periodicity must be equal according Microsoft // documentation for IAudioClient::Initialize. - // + // // TO-DO: try spread to capture and full-duplex cases (not tested and therefore disabled) // - if (((pSub->streamFlags & AUDCLNT_STREAMFLAGS_EVENTCALLBACK) == 0) && + if (((pSub->streamFlags & AUDCLNT_STREAMFLAGS_EVENTCALLBACK) == 0) && (output && !pSub->params.full_duplex)) - { + { UINT32 alignedFrames; REFERENCE_TIME userPeriodicity; @@ -3220,7 +3220,7 @@ static void _CalculatePeriodicity(PaWasapiSubStream *pSub, BOOL output, REFERENC // Must not be smaller than minimum supported by the device if (userPeriodicity < pInfo->MinimumDevicePeriod) userPeriodicity = pInfo->MinimumDevicePeriod; - + (*periodicity) = userPeriodicity; } } @@ -3410,7 +3410,7 @@ static HRESULT CreateAudioClient(PaWasapiStream *pStream, PaWasapiSubStream *pSu // Set device scheduling period (always 0 in Shared mode according Microsoft docs) _CalculatePeriodicity(pSub, output, &eventPeriodicity); - + // Open the stream and associate it with an audio session hr = IAudioClient_Initialize(audioClient, pSub->shareMode, @@ -3419,9 +3419,9 @@ static HRESULT CreateAudioClient(PaWasapiStream *pStream, PaWasapiSubStream *pSu eventPeriodicity, &pSub->wavex.Format, NULL); - - // [Output only] Check if buffer size is the one we requested in Exclusive mode, for UAC1 USB DACs WASAPI - // can allocate internal buffer equal to 8 times of pSub->period that has to be corrected in order to match + + // [Output only] Check if buffer size is the one we requested in Exclusive mode, for UAC1 USB DACs WASAPI + // can allocate internal buffer equal to 8 times of pSub->period that has to be corrected in order to match // the requested latency if (output && SUCCEEDED(hr) && (pSub->shareMode == AUDCLNT_SHAREMODE_EXCLUSIVE)) { @@ -3442,7 +3442,7 @@ static HRESULT CreateAudioClient(PaWasapiStream *pStream, PaWasapiSubStream *pSu UINT32 ratio = maxBufferFrames / framesPerLatency; PRINT(("WASAPI: CreateAudioClient: detected %d times larger buffer than requested, correct to match user latency\n", ratio)); - + // Get new aligned frames lowered by calculated ratio framesPerLatency = MakeFramesFromHns(pSub->period / ratio, pSub->wavex.Format.nSamplesPerSec); _CalculateAlignedPeriod(pSub, &framesPerLatency, ALIGN_BWD); @@ -3450,7 +3450,7 @@ static HRESULT CreateAudioClient(PaWasapiStream *pStream, PaWasapiSubStream *pSu // Make sure we are not below the minimum period if (pSub->period < pInfo->MinimumDevicePeriod) pSub->period = pInfo->MinimumDevicePeriod; - + // Release previous client SAFE_RELEASE(audioClient); @@ -3549,7 +3549,7 @@ static HRESULT CreateAudioClient(PaWasapiStream *pStream, PaWasapiSubStream *pSu } // Error has no workaround, fail completely - if (FAILED(hr)) + if (FAILED(hr)) { (*pa_error) = paInvalidDevice; LogHostError(hr); @@ -3832,8 +3832,8 @@ static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi, stream->in.streamFlags = 0; // polling interface is implemented for full-duplex mode also // Use built-in PCM converter (channel count and sample rate) if requested - if ((GetWindowsVersion() >= WINDOWS_7_SERVER2008R2) && - (stream->in.shareMode == AUDCLNT_SHAREMODE_SHARED) && + if ((GetWindowsVersion() >= WINDOWS_7_SERVER2008R2) && + (stream->in.shareMode == AUDCLNT_SHAREMODE_SHARED) && ((inputStreamInfo != NULL) && (inputStreamInfo->flags & paWinWasapiAutoConvert))) stream->in.streamFlags |= (AUDCLNT_STREAMFLAGS_AUTOCONVERTPCM | AUDCLNT_STREAMFLAGS_SRC_DEFAULT_QUALITY); @@ -3966,8 +3966,8 @@ static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi, stream->out.streamFlags = 0; // polling interface is implemented for full-duplex mode also // Use built-in PCM converter (channel count and sample rate) if requested - if ((GetWindowsVersion() >= WINDOWS_7_SERVER2008R2) && - (stream->out.shareMode == AUDCLNT_SHAREMODE_SHARED) && + if ((GetWindowsVersion() >= WINDOWS_7_SERVER2008R2) && + (stream->out.shareMode == AUDCLNT_SHAREMODE_SHARED) && ((outputStreamInfo != NULL) && (outputStreamInfo->flags & paWinWasapiAutoConvert))) stream->out.streamFlags |= (AUDCLNT_STREAMFLAGS_AUTOCONVERTPCM | AUDCLNT_STREAMFLAGS_SRC_DEFAULT_QUALITY); @@ -4183,7 +4183,7 @@ static PaError CloseStream( PaStream* s ) } // ------------------------------------------------------------------------------------------ -HRESULT UnmarshalSubStreamComPointers(PaWasapiSubStream *substream) +HRESULT UnmarshalSubStreamComPointers(PaWasapiSubStream *substream) { #ifndef PA_WINRT HRESULT hResult = S_OK; @@ -4193,7 +4193,7 @@ HRESULT UnmarshalSubStreamComPointers(PaWasapiSubStream *substream) // IAudioClient hResult = CoGetInterfaceAndReleaseStream(substream->clientStream, GetAudioClientIID(), (LPVOID*)&substream->clientProc); substream->clientStream = NULL; - if (hResult != S_OK) + if (hResult != S_OK) { hFirstBadResult = (hFirstBadResult == S_OK) ? hResult : hFirstBadResult; } @@ -4207,7 +4207,7 @@ HRESULT UnmarshalSubStreamComPointers(PaWasapiSubStream *substream) } // ------------------------------------------------------------------------------------------ -HRESULT UnmarshalStreamComPointers(PaWasapiStream *stream) +HRESULT UnmarshalStreamComPointers(PaWasapiStream *stream) { #ifndef PA_WINRT HRESULT hResult = S_OK; @@ -4217,11 +4217,11 @@ HRESULT UnmarshalStreamComPointers(PaWasapiStream *stream) stream->in.clientProc = NULL; stream->out.clientProc = NULL; - if (NULL != stream->in.clientParent) + if (NULL != stream->in.clientParent) { // SubStream pointers hResult = UnmarshalSubStreamComPointers(&stream->in); - if (hResult != S_OK) + if (hResult != S_OK) { hFirstBadResult = (hFirstBadResult == S_OK) ? hResult : hFirstBadResult; } @@ -4229,17 +4229,17 @@ HRESULT UnmarshalStreamComPointers(PaWasapiStream *stream) // IAudioCaptureClient hResult = CoGetInterfaceAndReleaseStream(stream->captureClientStream, &pa_IID_IAudioCaptureClient, (LPVOID*)&stream->captureClient); stream->captureClientStream = NULL; - if (hResult != S_OK) + if (hResult != S_OK) { hFirstBadResult = (hFirstBadResult == S_OK) ? hResult : hFirstBadResult; } } - if (NULL != stream->out.clientParent) + if (NULL != stream->out.clientParent) { // SubStream pointers hResult = UnmarshalSubStreamComPointers(&stream->out); - if (hResult != S_OK) + if (hResult != S_OK) { hFirstBadResult = (hFirstBadResult == S_OK) ? hResult : hFirstBadResult; } @@ -4247,7 +4247,7 @@ HRESULT UnmarshalStreamComPointers(PaWasapiStream *stream) // IAudioRenderClient hResult = CoGetInterfaceAndReleaseStream(stream->renderClientStream, &pa_IID_IAudioRenderClient, (LPVOID*)&stream->renderClient); stream->renderClientStream = NULL; - if (hResult != S_OK) + if (hResult != S_OK) { hFirstBadResult = (hFirstBadResult == S_OK) ? hResult : hFirstBadResult; } @@ -4284,13 +4284,13 @@ HRESULT UnmarshalStreamComPointers(PaWasapiStream *stream) } // ----------------------------------------------------------------------------------------- -void ReleaseUnmarshaledSubComPointers(PaWasapiSubStream *substream) +void ReleaseUnmarshaledSubComPointers(PaWasapiSubStream *substream) { SAFE_RELEASE(substream->clientProc); } // ----------------------------------------------------------------------------------------- -void ReleaseUnmarshaledComPointers(PaWasapiStream *stream) +void ReleaseUnmarshaledComPointers(PaWasapiStream *stream) { // Release AudioClient services first SAFE_RELEASE(stream->captureClient); @@ -4302,7 +4302,7 @@ void ReleaseUnmarshaledComPointers(PaWasapiStream *stream) } // ------------------------------------------------------------------------------------------ -HRESULT MarshalSubStreamComPointers(PaWasapiSubStream *substream) +HRESULT MarshalSubStreamComPointers(PaWasapiSubStream *substream) { #ifndef PA_WINRT HRESULT hResult; @@ -4328,7 +4328,7 @@ marshal_sub_error: } // ------------------------------------------------------------------------------------------ -HRESULT MarshalStreamComPointers(PaWasapiStream *stream) +HRESULT MarshalStreamComPointers(PaWasapiStream *stream) { #ifndef PA_WINRT HRESULT hResult = S_OK; @@ -4337,29 +4337,29 @@ HRESULT MarshalStreamComPointers(PaWasapiStream *stream) stream->renderClientStream = NULL; stream->out.clientStream = NULL; - if (NULL != stream->in.clientParent) + if (NULL != stream->in.clientParent) { // SubStream pointers hResult = MarshalSubStreamComPointers(&stream->in); - if (hResult != S_OK) + if (hResult != S_OK) goto marshal_error; // IAudioCaptureClient hResult = CoMarshalInterThreadInterfaceInStream(&pa_IID_IAudioCaptureClient, (LPUNKNOWN)stream->captureClientParent, &stream->captureClientStream); - if (hResult != S_OK) + if (hResult != S_OK) goto marshal_error; } - if (NULL != stream->out.clientParent) + if (NULL != stream->out.clientParent) { // SubStream pointers hResult = MarshalSubStreamComPointers(&stream->out); - if (hResult != S_OK) + if (hResult != S_OK) goto marshal_error; // IAudioRenderClient hResult = CoMarshalInterThreadInterfaceInStream(&pa_IID_IAudioRenderClient, (LPUNKNOWN)stream->renderClientParent, &stream->renderClientStream); - if (hResult != S_OK) + if (hResult != S_OK) goto marshal_error; } @@ -4394,7 +4394,7 @@ static PaError StartStream( PaStream *s ) _StreamCleanup(stream); // Create close event - if ((stream->hCloseRequest = CreateEvent(NULL, TRUE, FALSE, NULL)) == NULL) + if ((stream->hCloseRequest = CreateEvent(NULL, TRUE, FALSE, NULL)) == NULL) { result = paInsufficientMemory; goto start_error; @@ -4413,7 +4413,7 @@ static PaError StartStream( PaStream *s ) } // Marshal WASAPI interface pointers for safe use in thread created below. - if ((hr = MarshalStreamComPointers(stream)) != S_OK) + if ((hr = MarshalStreamComPointers(stream)) != S_OK) { PRINT(("Failed marshaling stream COM pointers.")); result = paUnanticipatedHostError; @@ -4423,7 +4423,7 @@ static PaError StartStream( PaStream *s ) if ((stream->in.clientParent && (stream->in.streamFlags & AUDCLNT_STREAMFLAGS_EVENTCALLBACK)) || (stream->out.clientParent && (stream->out.streamFlags & AUDCLNT_STREAMFLAGS_EVENTCALLBACK))) { - if ((stream->hThread = CREATE_THREAD(ProcThreadEvent)) == NULL) + if ((stream->hThread = CREATE_THREAD(ProcThreadEvent)) == NULL) { PRINT(("Failed creating thread: ProcThreadEvent.")); result = paUnanticipatedHostError; @@ -4432,7 +4432,7 @@ static PaError StartStream( PaStream *s ) } else { - if ((stream->hThread = CREATE_THREAD(ProcThreadPoll)) == NULL) + if ((stream->hThread = CREATE_THREAD(ProcThreadPoll)) == NULL) { PRINT(("Failed creating thread: ProcThreadPoll.")); result = paUnanticipatedHostError; @@ -4441,7 +4441,7 @@ static PaError StartStream( PaStream *s ) } // Wait for thread to start - if (WaitForSingleObject(stream->hThreadStart, 60*1000) == WAIT_TIMEOUT) + if (WaitForSingleObject(stream->hThreadStart, 60*1000) == WAIT_TIMEOUT) { PRINT(("Failed starting thread: timeout.")); result = paUnanticipatedHostError; @@ -4451,17 +4451,17 @@ static PaError StartStream( PaStream *s ) else { // Create blocking operation events (non-signaled event means - blocking operation is pending) - if (stream->out.clientParent != NULL) + if (stream->out.clientParent != NULL) { - if ((stream->hBlockingOpStreamWR = CreateEvent(NULL, TRUE, TRUE, NULL)) == NULL) + if ((stream->hBlockingOpStreamWR = CreateEvent(NULL, TRUE, TRUE, NULL)) == NULL) { result = paInsufficientMemory; goto start_error; } } - if (stream->in.clientParent != NULL) + if (stream->in.clientParent != NULL) { - if ((stream->hBlockingOpStreamRD = CreateEvent(NULL, TRUE, TRUE, NULL)) == NULL) + if ((stream->hBlockingOpStreamRD = CreateEvent(NULL, TRUE, TRUE, NULL)) == NULL) { result = paInsufficientMemory; goto start_error; @@ -4648,7 +4648,7 @@ static PaError ReadStream( PaStream* s, void *_buffer, unsigned long frames ) desired = available; if ((UINT32)desired > frames) desired = frames; - + // Get pointers to read regions read = PaUtil_GetRingBufferReadRegions(stream->in.tailBuffer, desired, &buf1, &buf1_size, &buf2, &buf2_size); @@ -4861,7 +4861,7 @@ static PaError WriteStream( PaStream* s, const void *_buffer, unsigned long fram goto end; } - // Keep waiting again (on Vista it was noticed that WASAPI could SOMETIMES return NULL pointer + // Keep waiting again (on Vista it was noticed that WASAPI could SOMETIMES return NULL pointer // to buffer without returning AUDCLNT_E_BUFFER_TOO_LARGE instead) if (wasapi_buffer == NULL) continue; @@ -5074,10 +5074,10 @@ static PaError MMCSS_activate(PaWasapiThreadPriority nPriorityClass, HANDLE *ret DWORD task_idx = 0; HANDLE hTask; - + if ((UINT32)nPriorityClass >= STATIC_ARRAY_SIZE(mmcs_name)) return paUnanticipatedHostError; - + if ((hTask = pAvSetMmThreadCharacteristics(mmcs_name[nPriorityClass], &task_idx)) == NULL) { PRINT(("WASAPI: AvSetMmThreadCharacteristics failed: error[%d]\n", GetLastError())); @@ -5498,7 +5498,7 @@ PaError PaWasapiWinrt_SetDefaultDeviceId( const unsigned short *pId, int bOutput } // ------------------------------------------------------------------------------------------ -PaError PaWasapiWinrt_PopulateDeviceList( const unsigned short **pId, const unsigned short **pName, +PaError PaWasapiWinrt_PopulateDeviceList( const unsigned short **pId, const unsigned short **pName, const PaWasapiDeviceRole *pRole, unsigned int count, int bOutput ) { #ifdef PA_WINRT @@ -5595,7 +5595,7 @@ HRESULT _PollGetInputFramesAvailable(PaWasapiStream *stream, UINT32 *available) (*available) = 0; - // GetCurrentPadding() has opposite meaning to Output stream + // GetCurrentPadding() has opposite meaning to Output stream if ((hr = IAudioClient_GetCurrentPadding(stream->in.clientProc, available)) != S_OK) return LogHostError(hr); @@ -5763,14 +5763,14 @@ static HRESULT ProcessInputBuffer(PaWasapiStream *stream, PaWasapiHostProcessor void _StreamOnStop(PaWasapiStream *stream) { // Stop INPUT/OUTPUT clients - if (!stream->bBlocking) + if (!stream->bBlocking) { if (stream->in.clientProc != NULL) IAudioClient_Stop(stream->in.clientProc); if (stream->out.clientProc != NULL) IAudioClient_Stop(stream->out.clientProc); - } - else + } + else { if (stream->in.clientParent != NULL) IAudioClient_Stop(stream->in.clientParent); @@ -5799,7 +5799,7 @@ static BOOL PrepareComPointers(PaWasapiStream *stream, BOOL *threadComInitialize If COM is already initialized CoInitialize will either return FALSE, or RPC_E_CHANGED_MODE if it was initialized in a different threading mode. In either case we shouldn't consider it an error - but we need to be careful to not call CoUninitialize() if + but we need to be careful to not call CoUninitialize() if RPC_E_CHANGED_MODE was returned. */ hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED); @@ -6035,7 +6035,7 @@ static UINT32 GetSleepTime(PaWasapiStream *stream, UINT32 sleepTimeIn, UINT32 sl UINT32 sleepTime; // According to the issue [https://github.com/PortAudio/portaudio/issues/303] glitches may occur when user frames - // equal to 1/2 of the host buffer frames, therefore the empirical workaround for this problem is to lower + // equal to 1/2 of the host buffer frames, therefore the empirical workaround for this problem is to lower // the sleep time by 2 if (userFramesOut != 0) { @@ -6067,7 +6067,7 @@ static UINT32 ConfigureLoopSleepTimeAndScheduler(PaWasapiStream *stream, ThreadI // polled according its packet length if (stream->bufferMode != paUtilFixedHostBufferSize) { - userFramesOut = (stream->bufferProcessor.framesPerUserBuffer ? stream->bufferProcessor.framesPerUserBuffer : + userFramesOut = (stream->bufferProcessor.framesPerUserBuffer ? stream->bufferProcessor.framesPerUserBuffer : stream->out.params.frames_per_buffer); } @@ -6099,7 +6099,7 @@ static UINT32 ConfigureLoopSleepTimeAndScheduler(PaWasapiStream *stream, ThreadI } // ------------------------------------------------------------------------------------------ -static inline INT32 GetNextSleepTime(SystemTimer *timer, ThreadIdleScheduler *scheduler, LONGLONG startTime, +static inline INT32 GetNextSleepTime(SystemTimer *timer, ThreadIdleScheduler *scheduler, LONGLONG startTime, UINT32 sleepTime) { INT32 nextSleepTime; @@ -6302,8 +6302,8 @@ PA_THREAD_FUNC ProcThreadPoll(void *param) UINT32 framesProc = stream->out.framesPerBuffer; // If we got less frames avoid sleeping again as it might be the corner case and buffer - // has sufficient number of frames now, in case 'out.framesPerBuffer' is 1/2 of the host - // buffer sleeping again may cause underruns. Do short busy waiting (normally might take + // has sufficient number of frames now, in case 'out.framesPerBuffer' is 1/2 of the host + // buffer sleeping again may cause underruns. Do short busy waiting (normally might take // 1-2 iterations) if (framesAvail < framesProc) { @@ -6352,7 +6352,7 @@ PA_THREAD_FUNC ProcThreadPoll(void *param) UINT32 i_frames = 0, i_processed = 0, o_frames = 0; BYTE *i_data = NULL, *o_data = NULL, *o_data_host = NULL; DWORD i_flags = 0; - + startTime = SystemTimer_GetTime(&timer); #ifdef PA_WASAPI_LOG_TIME_SLOTS From 67dc808f69477aba92bf5c372f0bc8e420db50c0 Mon Sep 17 00:00:00 2001 From: MichalPetryka <35800402+MichalPetryka@users.noreply.github.com> Date: Thu, 4 Feb 2021 02:18:29 +0100 Subject: [PATCH 110/164] Cleanup newlines at EOF in src/hostapi/asio (#483) --- src/hostapi/asio/pa_asio.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/hostapi/asio/pa_asio.cpp b/src/hostapi/asio/pa_asio.cpp index ffb77ef..bc5f0e4 100644 --- a/src/hostapi/asio/pa_asio.cpp +++ b/src/hostapi/asio/pa_asio.cpp @@ -4248,4 +4248,3 @@ PaError PaAsio_SetStreamSampleRate( PaStream* s, double sampleRate ) return ValidateAndSetSampleRate( sampleRate ); } - From b5a55169b9cda66b5e58ec3649d80c3422d2e265 Mon Sep 17 00:00:00 2001 From: MichalPetryka <35800402+MichalPetryka@users.noreply.github.com> Date: Thu, 4 Feb 2021 02:19:23 +0100 Subject: [PATCH 111/164] Cleanup newlines at EOF in src/common (#482) --- src/common/pa_allocation.c | 1 - src/common/pa_front.c | 1 - 2 files changed, 2 deletions(-) diff --git a/src/common/pa_allocation.c b/src/common/pa_allocation.c index 265a4e6..7e3298a 100644 --- a/src/common/pa_allocation.c +++ b/src/common/pa_allocation.c @@ -240,4 +240,3 @@ void PaUtil_FreeAllAllocations( PaUtilAllocationGroup* group ) group->allocations = 0; } } - diff --git a/src/common/pa_front.c b/src/common/pa_front.c index 6456e33..a6b5f61 100644 --- a/src/common/pa_front.c +++ b/src/common/pa_front.c @@ -1808,4 +1808,3 @@ PaError Pa_GetSampleSize( PaSampleFormat format ) return (PaError) result; } - From 74fa59a036b9828265ca88fdbd573114345d7505 Mon Sep 17 00:00:00 2001 From: MichalPetryka <35800402+MichalPetryka@users.noreply.github.com> Date: Thu, 4 Feb 2021 02:19:45 +0100 Subject: [PATCH 112/164] Cleanup newlines at EOF in src/os/win (#481) --- src/os/win/pa_win_hostapis.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/os/win/pa_win_hostapis.c b/src/os/win/pa_win_hostapis.c index 942540c..f8a4651 100644 --- a/src/os/win/pa_win_hostapis.c +++ b/src/os/win/pa_win_hostapis.c @@ -98,5 +98,3 @@ PaUtilHostApiInitializer *paHostApiInitializers[] = 0 /* NULL terminated array */ }; - - From 9a5c7cb346ca490a772a75cb33fb10f0b4dc8d2f Mon Sep 17 00:00:00 2001 From: MichalPetryka <35800402+MichalPetryka@users.noreply.github.com> Date: Thu, 4 Feb 2021 02:20:11 +0100 Subject: [PATCH 113/164] Cleanup newlines at EOF in skeleton (#480) --- src/hostapi/skeleton/pa_hostapi_skeleton.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/hostapi/skeleton/pa_hostapi_skeleton.c b/src/hostapi/skeleton/pa_hostapi_skeleton.c index 716ca7f..46808d2 100644 --- a/src/hostapi/skeleton/pa_hostapi_skeleton.c +++ b/src/hostapi/skeleton/pa_hostapi_skeleton.c @@ -812,7 +812,3 @@ static signed long GetStreamWriteAvailable( PaStream* s ) return 0; } - - - - From 9756c8606130881bd70904128c79ebad8e61ba28 Mon Sep 17 00:00:00 2001 From: Phil Burk Date: Fri, 29 Jan 2021 12:15:15 -0800 Subject: [PATCH 114/164] configure: add INCLUDES for mingw build Previously, only portaudio.h was installed when building under mingw using make. This behavior differs from CMakeLists.txt PA_PUBLIC_INCLUDES where pa_win_*.h header files are installed. To cross-compile using MXE (https://mxe.cc/) we need pa_win_*.h headers. Add them to configure.in so that they are installed. Patch by Stefan Hajnoczi --- configure | Bin 574696 -> 574988 bytes configure.in | 5 +++++ 2 files changed, 5 insertions(+) diff --git a/configure b/configure index 81c70f92476227dc2e9c9fdaf7b0c6847f6a678e..511ae76b33a4aca2bc1647cd01138562dc341d43 100755 GIT binary patch delta 240 zcmaFSsoc|}+|a_3nN|0`uz;z%sc%m>PFO`f<&dinu(cBSoe!`QztfeqsU z8<3Kl4Kxp;cREln`}S3l?Cy+U74l#exw)zMEQDy{ie{e*(WC%zS8-xNCU$Mp6(2B3 Pw6Bd}-@Z16!#V>1yeU-L delta 112 zcmeC_QGU^>+|a_ Date: Fri, 29 Jan 2021 12:34:13 -0800 Subject: [PATCH 115/164] configure: add arm64 for Mac M1 Add additional architecture to builds. Fixes #445 --- configure | Bin 574988 -> 574994 bytes configure.in | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/configure b/configure index 511ae76b33a4aca2bc1647cd01138562dc341d43..c95c18b412a5db3eedd22f75beb15eca895af584 100755 GIT binary patch delta 38 tcmeC_QJ&PJ+|a_g$?H@!KGs{jYE4Y2?K delta 33 ocmbQ#qukS@+|a_ Date: Wed, 3 Feb 2021 21:11:03 -0500 Subject: [PATCH 116/164] OSS: support 32-bit signed format AFMT_S32_NE (#462) It may not be provided by all OSS implementations, so wrap the cases in `#ifdef AFMT_S32_NE`. --- src/hostapi/oss/pa_unix_oss.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/hostapi/oss/pa_unix_oss.c b/src/hostapi/oss/pa_unix_oss.c index 80df4c3..b66b2c1 100644 --- a/src/hostapi/oss/pa_unix_oss.c +++ b/src/hostapi/oss/pa_unix_oss.c @@ -937,6 +937,11 @@ static PaError Pa2OssFormat( PaSampleFormat paFormat, int *ossFormat ) case paInt16: *ossFormat = AFMT_S16_NE; break; +#ifdef AFMT_S32_NE + case paInt32: + *ossFormat = AFMT_S32_NE; + break; +#endif default: return paInternalError; /* This shouldn't happen */ } @@ -960,6 +965,10 @@ static PaError GetAvailableFormats( PaOssStreamComponent *component, PaSampleFor frmts |= paInt8; if( mask & AFMT_S16_NE ) frmts |= paInt16; +#ifdef AFMT_S32_NE + if( mask & AFMT_S32_NE ) + frmts |= paInt32; +#endif if( frmts == 0 ) result = paSampleFormatNotSupported; From dd857f610851c444ba44c7bbed883eda0325dd4a Mon Sep 17 00:00:00 2001 From: John Melas Date: Mon, 21 Dec 2020 12:14:19 +0200 Subject: [PATCH 117/164] replace Carbon with CoreFoundation and CoreServices --- CMakeLists.txt | 9 +++++---- configure | Bin 574994 -> 575026 bytes configure.in | 2 +- doc/src/tutorial/compile_mac_coreaudio.dox | 2 +- 4 files changed, 7 insertions(+), 6 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 5c5f748..122fe93 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -264,11 +264,12 @@ ELSE() FIND_LIBRARY(COREAUDIO_LIBRARY CoreAudio REQUIRED) FIND_LIBRARY(AUDIOTOOLBOX_LIBRARY AudioToolbox REQUIRED) FIND_LIBRARY(AUDIOUNIT_LIBRARY AudioUnit REQUIRED) - FIND_LIBRARY(CARBON_LIBRARY Carbon REQUIRED) - MARK_AS_ADVANCED(COREAUDIO_LIBRARY AUDIOTOOLBOX_LIBRARY AUDIOUNIT_LIBRARY CARBON_LIBRARY) - SET(PA_LIBRARY_DEPENDENCIES ${PA_LIBRARY_DEPENDENCIES} ${COREAUDIO_LIBRARY} ${AUDIOTOOLBOX_LIBRARY} ${AUDIOUNIT_LIBRARY} ${CARBON_LIBRARY}) + FIND_LIBRARY(COREFOUNDATION_LIBRARY CoreFoundation REQUIRED) + FIND_LIBRARY(CORESERVICES_LIBRARY CoreServices REQUIRED) + MARK_AS_ADVANCED(COREAUDIO_LIBRARY AUDIOTOOLBOX_LIBRARY AUDIOUNIT_LIBRARY COREFOUNDATION_LIBRARY CORESERVICES_LIBRARY) + SET(PA_LIBRARY_DEPENDENCIES ${PA_LIBRARY_DEPENDENCIES} ${COREAUDIO_LIBRARY} ${AUDIOTOOLBOX_LIBRARY} ${AUDIOUNIT_LIBRARY} ${COREFOUNDATION_LIBRARY} ${CORESERVICES_LIBRARY}) SET(PA_PRIVATE_COMPILE_DEFINITIONS ${PA_PRIVATE_COMPILE_DEFINITIONS} PA_USE_COREAUDIO) - SET(PA_PKGCONFIG_LDFLAGS "${PA_PKGCONFIG_LDFLAGS} -framework CoreAudio -framework AudioToolbox -framework AudioUnit -framework Carbon") + SET(PA_PKGCONFIG_LDFLAGS "${PA_PKGCONFIG_LDFLAGS} -framework CoreAudio -framework AudioToolbox -framework AudioUnit -framework CoreFoundation -framework CoreServices") ENDIF() ELSEIF(UNIX) diff --git a/configure b/configure index c95c18b412a5db3eedd22f75beb15eca895af584..42d22a02fc63476e5c34f013cc70cbad2667c288 100755 GIT binary patch delta 71 zcmbQ#qr9m{xuJ!zg{g(Pg{6hHg>4HvpSx;)QL0;hX4HvpF3+}QBr Date: Wed, 20 Jan 2021 21:46:12 -0800 Subject: [PATCH 118/164] build: Fix builds with parallel make. --- Makefile.in | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Makefile.in b/Makefile.in index 967bba3..7788b13 100644 --- a/Makefile.in +++ b/Makefile.in @@ -221,16 +221,16 @@ clean: distclean: clean $(RM) config.log config.status Makefile libtool portaudio-2.0.pc -%.o: %.c $(MAKEFILE) $(PAINC) +%.o: %.c $(MAKEFILE) $(PAINC) lib-stamp $(CC) -c $(CFLAGS) $< -o $@ -%.lo: %.c $(MAKEFILE) $(PAINC) +%.lo: %.c $(MAKEFILE) $(PAINC) lib-stamp $(LIBTOOL) --mode=compile $(CC) -c $(CFLAGS) $< -o $@ -%.lo: %.cpp $(MAKEFILE) $(PAINC) +%.lo: %.cpp $(MAKEFILE) $(PAINC) lib-stamp $(LIBTOOL) --mode=compile --tag=CXX $(CXX) -c $(CXXFLAGS) $< -o $@ -%.o: %.cpp $(MAKEFILE) $(PAINC) +%.o: %.cpp $(MAKEFILE) $(PAINC) lib-stamp $(CXX) -c $(CXXFLAGS) $< -o $@ %.o: %.asm From 0f26679b88feef3d58605262604e3a16ca495b23 Mon Sep 17 00:00:00 2001 From: Peter Ross Date: Wed, 10 Feb 2021 07:26:20 +1100 Subject: [PATCH 119/164] cmake_support/template_portaudio.def: make symbol numbers consistent with build/msvc/portaudio.def --- cmake_support/template_portaudio.def | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/cmake_support/template_portaudio.def b/cmake_support/template_portaudio.def index 8044d43..462c4ca 100644 --- a/cmake_support/template_portaudio.def +++ b/cmake_support/template_portaudio.def @@ -44,11 +44,17 @@ Pa_Sleep @34 @DEF_EXCLUDE_ASIO_SYMBOLS@PaAsio_GetInputChannelName @53 @DEF_EXCLUDE_ASIO_SYMBOLS@PaAsio_GetOutputChannelName @54 PaUtil_SetDebugPrintFunction @55 -@DEF_EXCLUDE_WASAPI_SYMBOLS@PaWasapi_GetDeviceDefaultFormat @56 -@DEF_EXCLUDE_WASAPI_SYMBOLS@PaWasapi_GetDeviceRole @57 -@DEF_EXCLUDE_WASAPI_SYMBOLS@PaWasapi_ThreadPriorityBoost @58 -@DEF_EXCLUDE_WASAPI_SYMBOLS@PaWasapi_ThreadPriorityRevert @59 -@DEF_EXCLUDE_WASAPI_SYMBOLS@PaWasapi_GetFramesPerHostBuffer @60 -@DEF_EXCLUDE_WASAPI_SYMBOLS@PaWasapi_GetJackDescription @61 -@DEF_EXCLUDE_WASAPI_SYMBOLS@PaWasapi_GetJackCount @62 -@DEF_EXCLUDE_WASAPI_SYMBOLS@PaWasapi_GetDeviceMixFormat @63 +@DEF_EXCLUDE_WASAPI_SYMBOLS@PaWasapi_GetAudioClient @56 +@DEF_EXCLUDE_WASAPI_SYMBOLS@PaWasapi_UpdateDeviceList @57 +@DEF_EXCLUDE_WASAPI_SYMBOLS@PaWasapi_GetDeviceCurrentFormat @58 +@DEF_EXCLUDE_WASAPI_SYMBOLS@PaWasapi_GetDeviceDefaultFormat @59 +@DEF_EXCLUDE_WASAPI_SYMBOLS@PaWasapi_GetDeviceMixFormat @60 +@DEF_EXCLUDE_WASAPI_SYMBOLS@PaWasapi_GetDeviceRole @61 +@DEF_EXCLUDE_WASAPI_SYMBOLS@PaWasapi_ThreadPriorityBoost @62 +@DEF_EXCLUDE_WASAPI_SYMBOLS@PaWasapi_ThreadPriorityRevert @63 +@DEF_EXCLUDE_WASAPI_SYMBOLS@PaWasapi_GetFramesPerHostBuffer @64 +@DEF_EXCLUDE_WASAPI_SYMBOLS@PaWasapi_GetJackCount @65 +@DEF_EXCLUDE_WASAPI_SYMBOLS@PaWasapi_GetJackDescription @66 +@DEF_EXCLUDE_WASAPI_SYMBOLS@PaWasapi_SetStreamStateHandler @68 +@DEF_EXCLUDE_WASAPI_SYMBOLS@PaWasapiWinrt_SetDefaultDeviceId @67 +@DEF_EXCLUDE_WASAPI_SYMBOLS@PaWasapiWinrt_PopulateDeviceList @69 From 38eba25bccee5e9d1da07afa4c41e50f87f4b3b3 Mon Sep 17 00:00:00 2001 From: Peter Ross Date: Tue, 9 Feb 2021 14:55:41 +1100 Subject: [PATCH 120/164] WASAPI: Add PaWaspi_GetIMMDevice function The IMMDevice pointer enables access to audio device capabiltiies not exposed by PortAudio. https://docs.microsoft.com/en-us/windows/win32/api/mmdeviceapi/nn-mmdeviceapi-immdevice --- build/msvc/portaudio.def | 1 + cmake_support/template_portaudio.def | 1 + include/pa_win_wasapi.h | 10 ++++++++++ src/hostapi/wasapi/pa_win_wasapi.c | 21 +++++++++++++++++++++ 4 files changed, 33 insertions(+) diff --git a/build/msvc/portaudio.def b/build/msvc/portaudio.def index 8f1738f..6ecb142 100644 --- a/build/msvc/portaudio.def +++ b/build/msvc/portaudio.def @@ -55,3 +55,4 @@ PaWasapi_GetJackDescription @66 PaWasapi_SetStreamStateHandler @68 PaWasapiWinrt_SetDefaultDeviceId @67 PaWasapiWinrt_PopulateDeviceList @69 +PaWasapi_GetIMMDevice @70 diff --git a/cmake_support/template_portaudio.def b/cmake_support/template_portaudio.def index 462c4ca..9cf0dc3 100644 --- a/cmake_support/template_portaudio.def +++ b/cmake_support/template_portaudio.def @@ -58,3 +58,4 @@ PaUtil_SetDebugPrintFunction @55 @DEF_EXCLUDE_WASAPI_SYMBOLS@PaWasapi_SetStreamStateHandler @68 @DEF_EXCLUDE_WASAPI_SYMBOLS@PaWasapiWinrt_SetDefaultDeviceId @67 @DEF_EXCLUDE_WASAPI_SYMBOLS@PaWasapiWinrt_PopulateDeviceList @69 +@DEF_EXCLUDE_WASAPI_SYMBOLS@PaWasapi_GetIMMDevice @70 diff --git a/include/pa_win_wasapi.h b/include/pa_win_wasapi.h index a3d82ee..c046afd 100644 --- a/include/pa_win_wasapi.h +++ b/include/pa_win_wasapi.h @@ -437,6 +437,16 @@ int PaWasapi_GetDeviceMixFormat( void *pFormat, unsigned int formatSize, PaDevic int/*PaWasapiDeviceRole*/ PaWasapi_GetDeviceRole( PaDeviceIndex device ); +/** Get device IMMDevice pointer + + @param device Device index. + @param pAudioClient Pointer to pointer of IMMDevice. + + @return Error code indicating success or failure. +*/ +PaError PaWasapi_GetIMMDevice( PaDeviceIndex device, void **pIMMDevice ); + + /** Boost thread priority of calling thread (MMCSS). Use it for Blocking Interface only inside the thread which makes calls to Pa_WriteStream/Pa_ReadStream. diff --git a/src/hostapi/wasapi/pa_win_wasapi.c b/src/hostapi/wasapi/pa_win_wasapi.c index 34fb52b..edb252d 100644 --- a/src/hostapi/wasapi/pa_win_wasapi.c +++ b/src/hostapi/wasapi/pa_win_wasapi.c @@ -2614,6 +2614,27 @@ int PaWasapi_GetDeviceRole( PaDeviceIndex device ) return paWasapi->devInfo[ index ].formFactor; } +// ------------------------------------------------------------------------------------------ +int PaWasapi_GetIMMDevice( PaDeviceIndex device, void **pIMMDevice ) +{ + PaError ret; + PaDeviceIndex index; + + PaWasapiHostApiRepresentation *paWasapi = _GetHostApi(&ret); + if (paWasapi == NULL) + return paNotInitialized; + + ret = PaUtil_DeviceIndexToHostApiDeviceIndex(&index, device, &paWasapi->inheritedHostApiRep); + if (ret != paNoError) + return ret; + + if ((UINT32)index >= paWasapi->deviceCount) + return paInvalidDevice; + + *pIMMDevice = paWasapi->devInfo[ index ].device; + return paNoError; +} + // ------------------------------------------------------------------------------------------ PaError PaWasapi_GetFramesPerHostBuffer( PaStream *pStream, unsigned int *pInput, unsigned int *pOutput ) { From fa42d1284e69c3769a526442131a9375ff285b3c Mon Sep 17 00:00:00 2001 From: Phil Burk Date: Fri, 5 Feb 2021 10:23:48 -0800 Subject: [PATCH 121/164] macos: consider major version 11 Change version logic to allow for major 11 or later. Partial fix for #492 --- src/hostapi/coreaudio/pa_mac_core.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hostapi/coreaudio/pa_mac_core.c b/src/hostapi/coreaudio/pa_mac_core.c index 402c512..2d98a3b 100644 --- a/src/hostapi/coreaudio/pa_mac_core.c +++ b/src/hostapi/coreaudio/pa_mac_core.c @@ -733,7 +733,7 @@ PaError PaMacCore_Initialize( PaUtilHostApiRepresentation **hostApi, PaHostApiIn Gestalt(gestaltSystemVersionMinor, &minor); // Starting with 10.6 systems, the HAL notification thread is created internally - if (major == 10 && minor >= 6) { + if ( major > 10 || (major == 10 && minor >= 6) ) { CFRunLoopRef theRunLoop = NULL; AudioObjectPropertyAddress theAddress = { kAudioHardwarePropertyRunLoop, kAudioObjectPropertyScopeGlobal, kAudioObjectPropertyElementMaster }; OSStatus osErr = AudioObjectSetPropertyData (kAudioObjectSystemObject, &theAddress, 0, NULL, sizeof(CFRunLoopRef), &theRunLoop); From b2a4d5cb80251e7109b8483dfea3be72da4dec8d Mon Sep 17 00:00:00 2001 From: Peter Ross Date: Thu, 11 Feb 2021 12:37:23 +1100 Subject: [PATCH 122/164] configure/make: export PaWasapi_* and PaWasapiWinrt_* symbols (#500) --- Makefile.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile.in b/Makefile.in index 7788b13..8eb7342 100644 --- a/Makefile.in +++ b/Makefile.in @@ -44,7 +44,7 @@ PALIB = libportaudio.la PAINC = include/portaudio.h PA_LDFLAGS = $(LDFLAGS) $(SHARED_FLAGS) -rpath $(libdir) -no-undefined \ - -export-symbols-regex "(Pa|PaMacCore|PaJack|PaAlsa|PaAsio|PaOSS)_.*" \ + -export-symbols-regex "(Pa|PaMacCore|PaJack|PaAlsa|PaAsio|PaOSS|PaWasapi|PaWasapiWinrt)_.*" \ -version-info $(LT_CURRENT):$(LT_REVISION):$(LT_AGE) COMMON_OBJS = \ From 94e4cf69c3c77eee578bd61977f695ab12ac56e8 Mon Sep 17 00:00:00 2001 From: MichalPetryka <35800402+MichalPetryka@users.noreply.github.com> Date: Thu, 11 Feb 2021 04:02:22 +0100 Subject: [PATCH 123/164] Cleanup newlines at EOF in dsound (#490) --- src/hostapi/dsound/pa_win_ds.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/hostapi/dsound/pa_win_ds.c b/src/hostapi/dsound/pa_win_ds.c index 8bcf659..2ccb4f8 100644 --- a/src/hostapi/dsound/pa_win_ds.c +++ b/src/hostapi/dsound/pa_win_ds.c @@ -3257,4 +3257,3 @@ static signed long GetStreamWriteAvailable( PaStream* s ) return 0; } - From 73291bb1f53ed0a78ef5bd04526e281378244bde Mon Sep 17 00:00:00 2001 From: MichalPetryka <35800402+MichalPetryka@users.noreply.github.com> Date: Thu, 11 Feb 2021 04:02:46 +0100 Subject: [PATCH 124/164] Cleanup newlines at EOF in oss (#491) --- src/hostapi/oss/pa_unix_oss.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/hostapi/oss/pa_unix_oss.c b/src/hostapi/oss/pa_unix_oss.c index b66b2c1..20113e2 100644 --- a/src/hostapi/oss/pa_unix_oss.c +++ b/src/hostapi/oss/pa_unix_oss.c @@ -2050,4 +2050,3 @@ error: return result; #endif } - From 0ac93f8634d113cf90aa5801c204e1e8adbc14e8 Mon Sep 17 00:00:00 2001 From: Phil Burk Date: Fri, 12 Feb 2021 08:00:25 -0800 Subject: [PATCH 125/164] coreaudio: remove pa_mac_core_old.c It has not been used for years. Fixes #493 --- src/hostapi/coreaudio/pa_mac_core_old.c | 913 ------------------------ 1 file changed, 913 deletions(-) delete mode 100644 src/hostapi/coreaudio/pa_mac_core_old.c diff --git a/src/hostapi/coreaudio/pa_mac_core_old.c b/src/hostapi/coreaudio/pa_mac_core_old.c deleted file mode 100644 index 6c9c6a1..0000000 --- a/src/hostapi/coreaudio/pa_mac_core_old.c +++ /dev/null @@ -1,913 +0,0 @@ -/* - * $Id$ - * pa_mac_core.c - * Implementation of PortAudio for Mac OS X CoreAudio - * - * PortAudio Portable Real-Time Audio Library - * Latest Version at: http://www.portaudio.com - * - * Authors: Ross Bencina and Phil Burk - * Copyright (c) 1999-2000 Ross Bencina and 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. - * - * 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. - */ - -/* - * The text above constitutes the entire PortAudio license; however, - * the PortAudio community also makes the following non-binding requests: - * - * 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. It is also - * requested that these non-binding requests be included along with the - * license above. - */ - -#include -#include -#include -#include -#include -#include - -#include "portaudio.h" -#include "pa_trace.h" -#include "pa_util.h" -#include "pa_allocation.h" -#include "pa_hostapi.h" -#include "pa_stream.h" -#include "pa_cpuload.h" -#include "pa_process.h" - -// ===== constants ===== - -// ===== structs ===== -#pragma mark structs - -// PaMacCoreHostApiRepresentation - host api datastructure specific to this implementation -typedef struct PaMacCore_HAR -{ - PaUtilHostApiRepresentation inheritedHostApiRep; - PaUtilStreamInterface callbackStreamInterface; - PaUtilStreamInterface blockingStreamInterface; - - PaUtilAllocationGroup *allocations; - AudioDeviceID *macCoreDeviceIds; -} -PaMacCoreHostApiRepresentation; - -typedef struct PaMacCore_DI -{ - PaDeviceInfo inheritedDeviceInfo; -} -PaMacCoreDeviceInfo; - -// PaMacCoreStream - a stream data structure specifically for this implementation -typedef struct PaMacCore_S -{ - PaUtilStreamRepresentation streamRepresentation; - PaUtilCpuLoadMeasurer cpuLoadMeasurer; - PaUtilBufferProcessor bufferProcessor; - - int primeStreamUsingCallback; - - AudioDeviceID inputDevice; - AudioDeviceID outputDevice; - - // Processing thread management -------------- -// HANDLE abortEvent; -// HANDLE processingThread; -// DWORD processingThreadId; - - char throttleProcessingThreadOnOverload; // 0 -> don't throttle, non-0 -> throttle - int processingThreadPriority; - int highThreadPriority; - int throttledThreadPriority; - unsigned long throttledSleepMsecs; - - int isStopped; - volatile int isActive; - volatile int stopProcessing; // stop thread once existing buffers have been returned - volatile int abortProcessing; // stop thread immediately - -// DWORD allBuffersDurationMs; // used to calculate timeouts -} -PaMacCoreStream; - -// Data needed by the CoreAudio callback functions -typedef struct PaMacCore_CD -{ - PaMacCoreStream *stream; - PaStreamCallback *callback; - void *userData; - PaUtilConverter *inputConverter; - PaUtilConverter *outputConverter; - void *inputBuffer; - void *outputBuffer; - int inputChannelCount; - int outputChannelCount; - PaSampleFormat inputSampleFormat; - PaSampleFormat outputSampleFormat; - PaUtilTriangularDitherGenerator *ditherGenerator; -} -PaMacClientData; - -// ===== CoreAudio-PortAudio bridge functions ===== -#pragma mark CoreAudio-PortAudio bridge functions - -// Maps CoreAudio OSStatus codes to PortAudio PaError codes -static PaError conv_err(OSStatus error) -{ - PaError result; - - switch (error) { - case kAudioHardwareNoError: - result = paNoError; break; - case kAudioHardwareNotRunningError: - result = paInternalError; break; - case kAudioHardwareUnspecifiedError: - result = paInternalError; break; - case kAudioHardwareUnknownPropertyError: - result = paInternalError; break; - case kAudioHardwareBadPropertySizeError: - result = paInternalError; break; - case kAudioHardwareIllegalOperationError: - result = paInternalError; break; - case kAudioHardwareBadDeviceError: - result = paInvalidDevice; break; - case kAudioHardwareBadStreamError: - result = paBadStreamPtr; break; - case kAudioHardwareUnsupportedOperationError: - result = paInternalError; break; - case kAudioDeviceUnsupportedFormatError: - result = paSampleFormatNotSupported; break; - case kAudioDevicePermissionsError: - result = paDeviceUnavailable; break; - default: - result = paInternalError; - } - - return result; -} - -/* This function is unused -static AudioStreamBasicDescription *InitializeStreamDescription(const PaStreamParameters *parameters, double sampleRate) -{ - struct AudioStreamBasicDescription *streamDescription = PaUtil_AllocateMemory(sizeof(AudioStreamBasicDescription)); - streamDescription->mSampleRate = sampleRate; - streamDescription->mFormatID = kAudioFormatLinearPCM; - streamDescription->mFormatFlags = 0; - streamDescription->mFramesPerPacket = 1; - - if (parameters->sampleFormat & paNonInterleaved) { - streamDescription->mFormatFlags |= kLinearPCMFormatFlagIsNonInterleaved; - streamDescription->mChannelsPerFrame = 1; - streamDescription->mBytesPerFrame = Pa_GetSampleSize(parameters->sampleFormat); - streamDescription->mBytesPerPacket = Pa_GetSampleSize(parameters->sampleFormat); - } - else { - streamDescription->mChannelsPerFrame = parameters->channelCount; - } - - streamDescription->mBytesPerFrame = Pa_GetSampleSize(parameters->sampleFormat) * streamDescription->mChannelsPerFrame; - streamDescription->mBytesPerPacket = streamDescription->mBytesPerFrame * streamDescription->mFramesPerPacket; - - if (parameters->sampleFormat & paFloat32) { - streamDescription->mFormatFlags |= kLinearPCMFormatFlagIsFloat; - streamDescription->mBitsPerChannel = 32; - } - else if (parameters->sampleFormat & paInt32) { - streamDescription->mFormatFlags |= kLinearPCMFormatFlagIsSignedInteger; - streamDescription->mBitsPerChannel = 32; - } - else if (parameters->sampleFormat & paInt24) { - streamDescription->mFormatFlags |= kLinearPCMFormatFlagIsSignedInteger; - streamDescription->mBitsPerChannel = 24; - } - else if (parameters->sampleFormat & paInt16) { - streamDescription->mFormatFlags |= kLinearPCMFormatFlagIsSignedInteger; - streamDescription->mBitsPerChannel = 16; - } - else if (parameters->sampleFormat & paInt8) { - streamDescription->mFormatFlags |= kLinearPCMFormatFlagIsSignedInteger; - streamDescription->mBitsPerChannel = 8; - } - else if (parameters->sampleFormat & paInt32) { - streamDescription->mBitsPerChannel = 8; - } - - return streamDescription; -} -*/ - -static PaStreamCallbackTimeInfo *InitializeTimeInfo(const AudioTimeStamp* now, const AudioTimeStamp* inputTime, const AudioTimeStamp* outputTime) -{ - PaStreamCallbackTimeInfo *timeInfo = PaUtil_AllocateMemory(sizeof(PaStreamCallbackTimeInfo)); - - timeInfo->inputBufferAdcTime = inputTime->mSampleTime; - timeInfo->currentTime = now->mSampleTime; - timeInfo->outputBufferDacTime = outputTime->mSampleTime; - - return timeInfo; -} - -// ===== support functions ===== -#pragma mark support functions - -static void CleanUp(PaMacCoreHostApiRepresentation *macCoreHostApi) -{ - if( macCoreHostApi->allocations ) - { - PaUtil_FreeAllAllocations( macCoreHostApi->allocations ); - PaUtil_DestroyAllocationGroup( macCoreHostApi->allocations ); - } - - PaUtil_FreeMemory( macCoreHostApi ); -} - -static PaError GetChannelInfo(PaDeviceInfo *deviceInfo, AudioDeviceID macCoreDeviceId, int isInput) -{ - UInt32 propSize; - PaError err = paNoError; - UInt32 i; - int numChannels = 0; - AudioBufferList *buflist; - - err = conv_err(AudioDeviceGetPropertyInfo(macCoreDeviceId, 0, isInput, kAudioDevicePropertyStreamConfiguration, &propSize, NULL)); - buflist = PaUtil_AllocateMemory(propSize); - err = conv_err(AudioDeviceGetProperty(macCoreDeviceId, 0, isInput, kAudioDevicePropertyStreamConfiguration, &propSize, buflist)); - if (!err) { - for (i = 0; i < buflist->mNumberBuffers; ++i) { - numChannels += buflist->mBuffers[i].mNumberChannels; - } - - if (isInput) - deviceInfo->maxInputChannels = numChannels; - else - deviceInfo->maxOutputChannels = numChannels; - - int frameLatency; - propSize = sizeof(UInt32); - err = conv_err(AudioDeviceGetProperty(macCoreDeviceId, 0, isInput, kAudioDevicePropertyLatency, &propSize, &frameLatency)); - if (!err) { - double secondLatency = frameLatency / deviceInfo->defaultSampleRate; - if (isInput) { - deviceInfo->defaultLowInputLatency = secondLatency; - deviceInfo->defaultHighInputLatency = secondLatency; - } - else { - deviceInfo->defaultLowOutputLatency = secondLatency; - deviceInfo->defaultHighOutputLatency = secondLatency; - } - } - } - PaUtil_FreeMemory(buflist); - - return err; -} - -static PaError InitializeDeviceInfo(PaMacCoreDeviceInfo *macCoreDeviceInfo, AudioDeviceID macCoreDeviceId, PaHostApiIndex hostApiIndex ) -{ - PaDeviceInfo *deviceInfo = &macCoreDeviceInfo->inheritedDeviceInfo; - deviceInfo->structVersion = 2; - deviceInfo->hostApi = hostApiIndex; - - PaError err = paNoError; - UInt32 propSize; - - err = conv_err(AudioDeviceGetPropertyInfo(macCoreDeviceId, 0, 0, kAudioDevicePropertyDeviceName, &propSize, NULL)); - // FIXME: this allocation should be part of the allocations group - char *name = PaUtil_AllocateMemory(propSize); - err = conv_err(AudioDeviceGetProperty(macCoreDeviceId, 0, 0, kAudioDevicePropertyDeviceName, &propSize, name)); - if (!err) { - deviceInfo->name = name; - } - - Float64 sampleRate; - propSize = sizeof(Float64); - err = conv_err(AudioDeviceGetProperty(macCoreDeviceId, 0, 0, kAudioDevicePropertyNominalSampleRate, &propSize, &sampleRate)); - if (!err) { - deviceInfo->defaultSampleRate = sampleRate; - } - - - // Get channel info - err = GetChannelInfo(deviceInfo, macCoreDeviceId, 1); - err = GetChannelInfo(deviceInfo, macCoreDeviceId, 0); - - return err; -} - -static PaError InitializeDeviceInfos( PaMacCoreHostApiRepresentation *macCoreHostApi, PaHostApiIndex hostApiIndex ) -{ - PaError result = paNoError; - PaUtilHostApiRepresentation *hostApi; - PaMacCoreDeviceInfo *deviceInfoArray; - - // initialise device counts and default devices under the assumption that there are no devices. These values are incremented below if and when devices are successfully initialized. - hostApi = &macCoreHostApi->inheritedHostApiRep; - hostApi->info.deviceCount = 0; - hostApi->info.defaultInputDevice = paNoDevice; - hostApi->info.defaultOutputDevice = paNoDevice; - - UInt32 propsize; - AudioHardwareGetPropertyInfo(kAudioHardwarePropertyDevices, &propsize, NULL); - int numDevices = propsize / sizeof(AudioDeviceID); - hostApi->info.deviceCount = numDevices; - if (numDevices > 0) { - hostApi->deviceInfos = (PaDeviceInfo**)PaUtil_GroupAllocateMemory( - macCoreHostApi->allocations, sizeof(PaDeviceInfo*) * numDevices ); - if( !hostApi->deviceInfos ) - { - return paInsufficientMemory; - } - - // allocate all device info structs in a contiguous block - deviceInfoArray = (PaMacCoreDeviceInfo*)PaUtil_GroupAllocateMemory( - macCoreHostApi->allocations, sizeof(PaMacCoreDeviceInfo) * numDevices ); - if( !deviceInfoArray ) - { - return paInsufficientMemory; - } - - macCoreHostApi->macCoreDeviceIds = PaUtil_GroupAllocateMemory(macCoreHostApi->allocations, propsize); - AudioHardwareGetProperty(kAudioHardwarePropertyDevices, &propsize, macCoreHostApi->macCoreDeviceIds); - - AudioDeviceID defaultInputDevice, defaultOutputDevice; - propsize = sizeof(AudioDeviceID); - AudioHardwareGetProperty(kAudioHardwarePropertyDefaultInputDevice, &propsize, &defaultInputDevice); - AudioHardwareGetProperty(kAudioHardwarePropertyDefaultOutputDevice, &propsize, &defaultOutputDevice); - - UInt32 i; - for (i = 0; i < numDevices; ++i) { - if (macCoreHostApi->macCoreDeviceIds[i] == defaultInputDevice) { - hostApi->info.defaultInputDevice = i; - } - if (macCoreHostApi->macCoreDeviceIds[i] == defaultOutputDevice) { - hostApi->info.defaultOutputDevice = i; - } - InitializeDeviceInfo(&deviceInfoArray[i], macCoreHostApi->macCoreDeviceIds[i], hostApiIndex); - hostApi->deviceInfos[i] = &(deviceInfoArray[i].inheritedDeviceInfo); - } - } - - return result; -} - -static OSStatus CheckFormat(AudioDeviceID macCoreDeviceId, const PaStreamParameters *parameters, double sampleRate, int isInput) -{ - UInt32 propSize = sizeof(AudioStreamBasicDescription); - AudioStreamBasicDescription *streamDescription = PaUtil_AllocateMemory(propSize); - - streamDescription->mSampleRate = sampleRate; - streamDescription->mFormatID = 0; - streamDescription->mFormatFlags = 0; - streamDescription->mBytesPerPacket = 0; - streamDescription->mFramesPerPacket = 0; - streamDescription->mBytesPerFrame = 0; - streamDescription->mChannelsPerFrame = 0; - streamDescription->mBitsPerChannel = 0; - streamDescription->mReserved = 0; - - OSStatus result = AudioDeviceGetProperty(macCoreDeviceId, 0, isInput, kAudioDevicePropertyStreamFormatSupported, &propSize, streamDescription); - PaUtil_FreeMemory(streamDescription); - return result; -} - -static OSStatus CopyInputData(PaMacClientData* destination, const AudioBufferList *source, unsigned long frameCount) -{ - int frameSpacing, channelSpacing; - if (destination->inputSampleFormat & paNonInterleaved) { - frameSpacing = 1; - channelSpacing = destination->inputChannelCount; - } - else { - frameSpacing = destination->inputChannelCount; - channelSpacing = 1; - } - - AudioBuffer const *inputBuffer = &source->mBuffers[0]; - void *coreAudioBuffer = inputBuffer->mData; - void *portAudioBuffer = destination->inputBuffer; - UInt32 i, streamNumber, streamChannel; - for (i = streamNumber = streamChannel = 0; i < destination->inputChannelCount; ++i, ++streamChannel) { - if (streamChannel >= inputBuffer->mNumberChannels) { - ++streamNumber; - inputBuffer = &source->mBuffers[streamNumber]; - coreAudioBuffer = inputBuffer->mData; - streamChannel = 0; - } - destination->inputConverter(portAudioBuffer, frameSpacing, coreAudioBuffer, inputBuffer->mNumberChannels, frameCount, destination->ditherGenerator); - coreAudioBuffer += sizeof(Float32); - portAudioBuffer += Pa_GetSampleSize(destination->inputSampleFormat) * channelSpacing; - } - return noErr; -} - -static OSStatus CopyOutputData(AudioBufferList* destination, PaMacClientData *source, unsigned long frameCount) -{ - int frameSpacing, channelSpacing; - if (source->outputSampleFormat & paNonInterleaved) { - frameSpacing = 1; - channelSpacing = source->outputChannelCount; - } - else { - frameSpacing = source->outputChannelCount; - channelSpacing = 1; - } - - AudioBuffer *outputBuffer = &destination->mBuffers[0]; - void *coreAudioBuffer = outputBuffer->mData; - void *portAudioBuffer = source->outputBuffer; - UInt32 i, streamNumber, streamChannel; - for (i = streamNumber = streamChannel = 0; i < source->outputChannelCount; ++i, ++streamChannel) { - if (streamChannel >= outputBuffer->mNumberChannels) { - ++streamNumber; - outputBuffer = &destination->mBuffers[streamNumber]; - coreAudioBuffer = outputBuffer->mData; - streamChannel = 0; - } - source->outputConverter(coreAudioBuffer, outputBuffer->mNumberChannels, portAudioBuffer, frameSpacing, frameCount, NULL); - coreAudioBuffer += sizeof(Float32); - portAudioBuffer += Pa_GetSampleSize(source->outputSampleFormat) * channelSpacing; - } - return noErr; -} - -static OSStatus AudioIOProc( AudioDeviceID inDevice, - const AudioTimeStamp* inNow, - const AudioBufferList* inInputData, - const AudioTimeStamp* inInputTime, - AudioBufferList* outOutputData, - const AudioTimeStamp* inOutputTime, - void* inClientData) -{ - PaMacClientData *clientData = (PaMacClientData *)inClientData; - PaStreamCallbackTimeInfo *timeInfo = InitializeTimeInfo(inNow, inInputTime, inOutputTime); - - PaUtil_BeginCpuLoadMeasurement( &clientData->stream->cpuLoadMeasurer ); - - AudioBuffer *outputBuffer = &outOutputData->mBuffers[0]; - unsigned long frameCount = outputBuffer->mDataByteSize / (outputBuffer->mNumberChannels * sizeof(Float32)); - - if (clientData->inputBuffer) { - CopyInputData(clientData, inInputData, frameCount); - } - PaStreamCallbackResult result = clientData->callback(clientData->inputBuffer, clientData->outputBuffer, frameCount, timeInfo, paNoFlag, clientData->userData); - if (clientData->outputBuffer) { - CopyOutputData(outOutputData, clientData, frameCount); - } - - PaUtil_EndCpuLoadMeasurement( &clientData->stream->cpuLoadMeasurer, frameCount ); - - if (result == paComplete || result == paAbort) { - Pa_StopStream(clientData->stream); - } - - PaUtil_FreeMemory( timeInfo ); - return noErr; -} - -// This is not for input-only streams, this is for streams where the input device is different from the output device -static OSStatus AudioInputProc( AudioDeviceID inDevice, - const AudioTimeStamp* inNow, - const AudioBufferList* inInputData, - const AudioTimeStamp* inInputTime, - AudioBufferList* outOutputData, - const AudioTimeStamp* inOutputTime, - void* inClientData) -{ - PaMacClientData *clientData = (PaMacClientData *)inClientData; - PaStreamCallbackTimeInfo *timeInfo = InitializeTimeInfo(inNow, inInputTime, inOutputTime); - - PaUtil_BeginCpuLoadMeasurement( &clientData->stream->cpuLoadMeasurer ); - - AudioBuffer const *inputBuffer = &inInputData->mBuffers[0]; - unsigned long frameCount = inputBuffer->mDataByteSize / (inputBuffer->mNumberChannels * sizeof(Float32)); - - CopyInputData(clientData, inInputData, frameCount); - PaStreamCallbackResult result = clientData->callback(clientData->inputBuffer, clientData->outputBuffer, frameCount, timeInfo, paNoFlag, clientData->userData); - - PaUtil_EndCpuLoadMeasurement( &clientData->stream->cpuLoadMeasurer, frameCount ); - if( result == paComplete || result == paAbort ) - Pa_StopStream(clientData->stream); - PaUtil_FreeMemory( timeInfo ); - return noErr; -} - -// This is not for output-only streams, this is for streams where the input device is different from the output device -static OSStatus AudioOutputProc( AudioDeviceID inDevice, - const AudioTimeStamp* inNow, - const AudioBufferList* inInputData, - const AudioTimeStamp* inInputTime, - AudioBufferList* outOutputData, - const AudioTimeStamp* inOutputTime, - void* inClientData) -{ - PaMacClientData *clientData = (PaMacClientData *)inClientData; - //PaStreamCallbackTimeInfo *timeInfo = InitializeTimeInfo(inNow, inInputTime, inOutputTime); - - PaUtil_BeginCpuLoadMeasurement( &clientData->stream->cpuLoadMeasurer ); - - AudioBuffer *outputBuffer = &outOutputData->mBuffers[0]; - unsigned long frameCount = outputBuffer->mDataByteSize / (outputBuffer->mNumberChannels * sizeof(Float32)); - - //clientData->callback(NULL, clientData->outputBuffer, frameCount, timeInfo, paNoFlag, clientData->userData); - - CopyOutputData(outOutputData, clientData, frameCount); - - PaUtil_EndCpuLoadMeasurement( &clientData->stream->cpuLoadMeasurer, frameCount ); - return noErr; -} - -static PaError SetSampleRate(AudioDeviceID device, double sampleRate, int isInput) -{ - PaError result = paNoError; - - double actualSampleRate; - UInt32 propSize = sizeof(double); - result = conv_err(AudioDeviceSetProperty(device, NULL, 0, isInput, kAudioDevicePropertyNominalSampleRate, propSize, &sampleRate)); - - result = conv_err(AudioDeviceGetProperty(device, 0, isInput, kAudioDevicePropertyNominalSampleRate, &propSize, &actualSampleRate)); - - if (result == paNoError && actualSampleRate != sampleRate) { - result = paInvalidSampleRate; - } - - return result; -} - -static PaError SetFramesPerBuffer(AudioDeviceID device, unsigned long framesPerBuffer, int isInput) -{ - PaError result = paNoError; - UInt32 preferredFramesPerBuffer = framesPerBuffer; - // while (preferredFramesPerBuffer > UINT32_MAX) { - // preferredFramesPerBuffer /= 2; - // } - - UInt32 actualFramesPerBuffer; - UInt32 propSize = sizeof(UInt32); - result = conv_err(AudioDeviceSetProperty(device, NULL, 0, isInput, kAudioDevicePropertyBufferFrameSize, propSize, &preferredFramesPerBuffer)); - - result = conv_err(AudioDeviceGetProperty(device, 0, isInput, kAudioDevicePropertyBufferFrameSize, &propSize, &actualFramesPerBuffer)); - - if (result != paNoError) { - // do nothing - } - else if (actualFramesPerBuffer > framesPerBuffer) { - result = paBufferTooSmall; - } - else if (actualFramesPerBuffer < framesPerBuffer) { - result = paBufferTooBig; - } - - return result; -} - -static PaError SetUpUnidirectionalStream(AudioDeviceID device, double sampleRate, unsigned long framesPerBuffer, int isInput) -{ - PaError err = paNoError; - err = SetSampleRate(device, sampleRate, isInput); - if( err == paNoError ) - err = SetFramesPerBuffer(device, framesPerBuffer, isInput); - return err; -} - -// ===== PortAudio functions ===== -#pragma mark PortAudio functions - -#ifdef __cplusplus -extern "C" -{ -#endif // __cplusplus - - PaError PaMacCore_Initialize( PaUtilHostApiRepresentation **hostApi, PaHostApiIndex index ); - -#ifdef __cplusplus -} -#endif // __cplusplus - -static void Terminate( struct PaUtilHostApiRepresentation *hostApi ) -{ - PaMacCoreHostApiRepresentation *macCoreHostApi = (PaMacCoreHostApiRepresentation*)hostApi; - - CleanUp(macCoreHostApi); -} - -static PaError IsFormatSupported( struct PaUtilHostApiRepresentation *hostApi, - const PaStreamParameters *inputParameters, - const PaStreamParameters *outputParameters, - double sampleRate ) -{ - PaMacCoreHostApiRepresentation *macCoreHostApi = (PaMacCoreHostApiRepresentation*)hostApi; - PaDeviceInfo *deviceInfo; - - PaError result = paNoError; - if (inputParameters) { - deviceInfo = macCoreHostApi->inheritedHostApiRep.deviceInfos[inputParameters->device]; - if (inputParameters->channelCount > deviceInfo->maxInputChannels) - result = paInvalidChannelCount; - else if (CheckFormat(macCoreHostApi->macCoreDeviceIds[inputParameters->device], inputParameters, sampleRate, 1) != kAudioHardwareNoError) { - result = paInvalidSampleRate; - } - } - if (outputParameters && result == paNoError) { - deviceInfo = macCoreHostApi->inheritedHostApiRep.deviceInfos[outputParameters->device]; - if (outputParameters->channelCount > deviceInfo->maxOutputChannels) - result = paInvalidChannelCount; - else if (CheckFormat(macCoreHostApi->macCoreDeviceIds[outputParameters->device], outputParameters, sampleRate, 0) != kAudioHardwareNoError) { - result = paInvalidSampleRate; - } - } - - return result; -} - -static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi, - PaStream** s, - const PaStreamParameters *inputParameters, - const PaStreamParameters *outputParameters, - double sampleRate, - unsigned long framesPerBuffer, - PaStreamFlags streamFlags, - PaStreamCallback *streamCallback, - void *userData ) -{ - PaError err = paNoError; - PaMacCoreHostApiRepresentation *macCoreHostApi = (PaMacCoreHostApiRepresentation *)hostApi; - PaMacCoreStream *stream = PaUtil_AllocateMemory(sizeof(PaMacCoreStream)); - stream->isActive = 0; - stream->isStopped = 1; - stream->inputDevice = kAudioDeviceUnknown; - stream->outputDevice = kAudioDeviceUnknown; - - PaUtil_InitializeStreamRepresentation( &stream->streamRepresentation, - ( (streamCallback) - ? &macCoreHostApi->callbackStreamInterface - : &macCoreHostApi->blockingStreamInterface ), - streamCallback, userData ); - PaUtil_InitializeCpuLoadMeasurer( &stream->cpuLoadMeasurer, sampleRate ); - - *s = (PaStream*)stream; - PaMacClientData *clientData = PaUtil_AllocateMemory(sizeof(PaMacClientData)); - clientData->stream = stream; - clientData->callback = streamCallback; - clientData->userData = userData; - clientData->inputBuffer = 0; - clientData->outputBuffer = 0; - clientData->ditherGenerator = PaUtil_AllocateMemory(sizeof(PaUtilTriangularDitherGenerator)); - PaUtil_InitializeTriangularDitherState(clientData->ditherGenerator); - - if (inputParameters != NULL) { - stream->inputDevice = macCoreHostApi->macCoreDeviceIds[inputParameters->device]; - clientData->inputConverter = PaUtil_SelectConverter(paFloat32, inputParameters->sampleFormat, streamFlags); - clientData->inputBuffer = PaUtil_AllocateMemory(Pa_GetSampleSize(inputParameters->sampleFormat) * framesPerBuffer * inputParameters->channelCount); - clientData->inputChannelCount = inputParameters->channelCount; - clientData->inputSampleFormat = inputParameters->sampleFormat; - err = SetUpUnidirectionalStream(stream->inputDevice, sampleRate, framesPerBuffer, 1); - } - - if (err == paNoError && outputParameters != NULL) { - stream->outputDevice = macCoreHostApi->macCoreDeviceIds[outputParameters->device]; - clientData->outputConverter = PaUtil_SelectConverter(outputParameters->sampleFormat, paFloat32, streamFlags); - clientData->outputBuffer = PaUtil_AllocateMemory(Pa_GetSampleSize(outputParameters->sampleFormat) * framesPerBuffer * outputParameters->channelCount); - clientData->outputChannelCount = outputParameters->channelCount; - clientData->outputSampleFormat = outputParameters->sampleFormat; - err = SetUpUnidirectionalStream(stream->outputDevice, sampleRate, framesPerBuffer, 0); - } - - if (inputParameters == NULL || outputParameters == NULL || stream->inputDevice == stream->outputDevice) { - AudioDeviceID device = (inputParameters == NULL) ? stream->outputDevice : stream->inputDevice; - - AudioDeviceAddIOProc(device, AudioIOProc, clientData); - } - else { - // using different devices for input and output - AudioDeviceAddIOProc(stream->inputDevice, AudioInputProc, clientData); - AudioDeviceAddIOProc(stream->outputDevice, AudioOutputProc, clientData); - } - - return err; -} - -// Note: When CloseStream() is called, the multi-api layer ensures that the stream has already been stopped or aborted. -static PaError CloseStream( PaStream* s ) -{ - PaError err = paNoError; - PaMacCoreStream *stream = (PaMacCoreStream*)s; - - PaUtil_ResetCpuLoadMeasurer( &stream->cpuLoadMeasurer ); - - if (stream->inputDevice != kAudioDeviceUnknown) { - if (stream->outputDevice == kAudioDeviceUnknown || stream->outputDevice == stream->inputDevice) { - err = conv_err(AudioDeviceRemoveIOProc(stream->inputDevice, AudioIOProc)); - } - else { - err = conv_err(AudioDeviceRemoveIOProc(stream->inputDevice, AudioInputProc)); - err = conv_err(AudioDeviceRemoveIOProc(stream->outputDevice, AudioOutputProc)); - } - } - else { - err = conv_err(AudioDeviceRemoveIOProc(stream->outputDevice, AudioIOProc)); - } - - return err; -} - - -static PaError StartStream( PaStream *s ) -{ - PaError err = paNoError; - PaMacCoreStream *stream = (PaMacCoreStream*)s; - - if (stream->inputDevice != kAudioDeviceUnknown) { - if (stream->outputDevice == kAudioDeviceUnknown || stream->outputDevice == stream->inputDevice) { - err = conv_err(AudioDeviceStart(stream->inputDevice, AudioIOProc)); - } - else { - err = conv_err(AudioDeviceStart(stream->inputDevice, AudioInputProc)); - err = conv_err(AudioDeviceStart(stream->outputDevice, AudioOutputProc)); - } - } - else { - err = conv_err(AudioDeviceStart(stream->outputDevice, AudioIOProc)); - } - - stream->isActive = 1; - stream->isStopped = 0; - return err; -} - -static PaError AbortStream( PaStream *s ) -{ - PaError err = paNoError; - PaMacCoreStream *stream = (PaMacCoreStream*)s; - - if (stream->inputDevice != kAudioDeviceUnknown) { - if (stream->outputDevice == kAudioDeviceUnknown || stream->outputDevice == stream->inputDevice) { - err = conv_err(AudioDeviceStop(stream->inputDevice, AudioIOProc)); - } - else { - err = conv_err(AudioDeviceStop(stream->inputDevice, AudioInputProc)); - err = conv_err(AudioDeviceStop(stream->outputDevice, AudioOutputProc)); - } - } - else { - err = conv_err(AudioDeviceStop(stream->outputDevice, AudioIOProc)); - } - - stream->isActive = 0; - stream->isStopped = 1; - return err; -} - -static PaError StopStream( PaStream *s ) -{ - // TODO: this should be nicer than abort - return AbortStream(s); -} - -static PaError IsStreamStopped( PaStream *s ) -{ - PaMacCoreStream *stream = (PaMacCoreStream*)s; - - return stream->isStopped; -} - - -static PaError IsStreamActive( PaStream *s ) -{ - PaMacCoreStream *stream = (PaMacCoreStream*)s; - - return stream->isActive; -} - - -static PaTime GetStreamTime( PaStream *s ) -{ - OSStatus err; - PaTime result; - PaMacCoreStream *stream = (PaMacCoreStream*)s; - - AudioTimeStamp *timeStamp = PaUtil_AllocateMemory(sizeof(AudioTimeStamp)); - if (stream->inputDevice != kAudioDeviceUnknown) { - err = AudioDeviceGetCurrentTime(stream->inputDevice, timeStamp); - } - else { - err = AudioDeviceGetCurrentTime(stream->outputDevice, timeStamp); - } - - result = err ? 0 : timeStamp->mSampleTime; - PaUtil_FreeMemory(timeStamp); - - return result; -} - - -static double GetStreamCpuLoad( PaStream* s ) -{ - PaMacCoreStream *stream = (PaMacCoreStream*)s; - - return PaUtil_GetCpuLoad( &stream->cpuLoadMeasurer ); -} - - -// As separate stream interfaces are used for blocking and callback streams, the following functions can be guaranteed to only be called for blocking streams. - -static PaError ReadStream( PaStream* s, - void *buffer, - unsigned long frames ) -{ - return paInternalError; -} - - -static PaError WriteStream( PaStream* s, - const void *buffer, - unsigned long frames ) -{ - return paInternalError; -} - - -static signed long GetStreamReadAvailable( PaStream* s ) -{ - return paInternalError; -} - - -static signed long GetStreamWriteAvailable( PaStream* s ) -{ - return paInternalError; -} - -// HostAPI-specific initialization function -PaError PaMacCore_Initialize( PaUtilHostApiRepresentation **hostApi, PaHostApiIndex hostApiIndex ) -{ - PaError result = paNoError; - PaMacCoreHostApiRepresentation *macCoreHostApi = (PaMacCoreHostApiRepresentation *)PaUtil_AllocateMemory( sizeof(PaMacCoreHostApiRepresentation) ); - if( !macCoreHostApi ) - { - result = paInsufficientMemory; - goto error; - } - - macCoreHostApi->allocations = PaUtil_CreateAllocationGroup(); - if( !macCoreHostApi->allocations ) - { - result = paInsufficientMemory; - goto error; - } - - *hostApi = &macCoreHostApi->inheritedHostApiRep; - (*hostApi)->info.structVersion = 1; - (*hostApi)->info.type = paCoreAudio; - (*hostApi)->info.name = "CoreAudio"; - - result = InitializeDeviceInfos(macCoreHostApi, hostApiIndex); - if (result != paNoError) { - goto error; - } - - // Set up the proper callbacks to this HostApi's functions - (*hostApi)->Terminate = Terminate; - (*hostApi)->OpenStream = OpenStream; - (*hostApi)->IsFormatSupported = IsFormatSupported; - - PaUtil_InitializeStreamInterface( &macCoreHostApi->callbackStreamInterface, CloseStream, StartStream, - StopStream, AbortStream, IsStreamStopped, IsStreamActive, - GetStreamTime, GetStreamCpuLoad, - PaUtil_DummyRead, PaUtil_DummyWrite, - PaUtil_DummyGetReadAvailable, PaUtil_DummyGetWriteAvailable ); - - PaUtil_InitializeStreamInterface( &macCoreHostApi->blockingStreamInterface, CloseStream, StartStream, - StopStream, AbortStream, IsStreamStopped, IsStreamActive, - GetStreamTime, PaUtil_DummyGetCpuLoad, - ReadStream, WriteStream, GetStreamReadAvailable, GetStreamWriteAvailable ); - - return result; - -error: - if( macCoreHostApi ) { - CleanUp(macCoreHostApi); - } - - return result; -} From 7926e3a8ee2ea12e08426578d63fb69212fa7b13 Mon Sep 17 00:00:00 2001 From: dmitrykos Date: Tue, 16 Feb 2021 12:15:00 +0200 Subject: [PATCH 126/164] wasapi: Fixed glitchy audio in case of Exclusive mode, 24-bit packed format and USB DAC (other audio devices using the same audio format could be affected too). --- src/hostapi/wasapi/pa_win_wasapi.c | 80 ++++++++++++++---------------- 1 file changed, 38 insertions(+), 42 deletions(-) diff --git a/src/hostapi/wasapi/pa_win_wasapi.c b/src/hostapi/wasapi/pa_win_wasapi.c index edb252d..9936838 100644 --- a/src/hostapi/wasapi/pa_win_wasapi.c +++ b/src/hostapi/wasapi/pa_win_wasapi.c @@ -1026,27 +1026,26 @@ static UINT32 ALIGN_NEXT_POW2(UINT32 v) // Aligns WASAPI buffer to 128 byte packet boundary. HD Audio will fail to play if buffer // is misaligned. This problem was solved in Windows 7 were AUDCLNT_E_BUFFER_SIZE_NOT_ALIGNED // is thrown although we must align for Vista anyway. -static UINT32 AlignFramesPerBuffer(UINT32 nFrames, UINT32 nSamplesPerSec, UINT32 nBlockAlign, - ALIGN_FUNC pAlignFunc) +static UINT32 AlignFramesPerBuffer(UINT32 nFrames, UINT32 nBlockAlign, ALIGN_FUNC pAlignFunc) { #define HDA_PACKET_SIZE (128) - long frame_bytes = nFrames * nBlockAlign; - long packets; - (void)nSamplesPerSec; + UINT32 bytes = nFrames * nBlockAlign; + UINT32 packets; - // align to packet size - frame_bytes = pAlignFunc(frame_bytes, HDA_PACKET_SIZE); // use ALIGN_FWD if bigger but safer period is more desired + // align to a HD Audio packet size + bytes = pAlignFunc(bytes, HDA_PACKET_SIZE); // atlest 1 frame must be available - if (frame_bytes < HDA_PACKET_SIZE) - frame_bytes = HDA_PACKET_SIZE; + if (bytes < HDA_PACKET_SIZE) + bytes = HDA_PACKET_SIZE; - nFrames = frame_bytes / nBlockAlign; - packets = frame_bytes / HDA_PACKET_SIZE; + packets = bytes / HDA_PACKET_SIZE; + bytes = packets * HDA_PACKET_SIZE; + nFrames = bytes / nBlockAlign; - frame_bytes = packets * HDA_PACKET_SIZE; - nFrames = frame_bytes / nBlockAlign; + // WASAPI frames are always aligned to at least 8 + nFrames = ALIGN_FWD(nFrames, 8); return nFrames; @@ -3161,27 +3160,33 @@ static PaUint32 _GetFramesPerHostBuffer(PaUint32 userFramesPerBuffer, PaTime sug } // ------------------------------------------------------------------------------------------ -static void _RecalculateBuffersCount(PaWasapiSubStream *sub, UINT32 userFramesPerBuffer, UINT32 framesPerLatency, BOOL fullDuplex) +static void _RecalculateBuffersCount(PaWasapiSubStream *sub, UINT32 userFramesPerBuffer, UINT32 framesPerLatency, + BOOL fullDuplex, BOOL output) { // Count buffers (must be at least 1) - sub->buffers = (userFramesPerBuffer ? framesPerLatency / userFramesPerBuffer : 0); + sub->buffers = (userFramesPerBuffer != 0 ? framesPerLatency / userFramesPerBuffer : 1); if (sub->buffers == 0) sub->buffers = 1; - // Determine amount of buffers used: - // - Full-duplex mode will lead to period difference, thus only 1. - // - Input mode, only 1, as WASAPI allows extraction of only 1 packet. - // - For Shared mode we use double buffering. + // Determine number of buffers used: + // - Full-duplex mode will lead to period difference, thus only 1 + // - Input mode, only 1, as WASAPI allows extraction of only 1 packet + // - For Shared mode we use double buffering if ((sub->shareMode == AUDCLNT_SHAREMODE_EXCLUSIVE) || fullDuplex) { + BOOL eventMode = ((sub->streamFlags & AUDCLNT_STREAMFLAGS_EVENTCALLBACK) == AUDCLNT_STREAMFLAGS_EVENTCALLBACK); + // Exclusive mode does not allow >1 buffers be used for Event interface, e.g. GetBuffer // call must acquire max buffer size and it all must be processed. - if (sub->streamFlags & AUDCLNT_STREAMFLAGS_EVENTCALLBACK) + if (eventMode) sub->userBufferAndHostMatch = 1; - // Use paUtilBoundedHostBufferSize because exclusive mode will starve and produce - // bad quality of audio - sub->buffers = 1; + // Full-duplex or Event mode: prefer paUtilBoundedHostBufferSize because exclusive mode will starve + // and produce glitchy audio + // Output Polling mode: prefer paUtilFixedHostBufferSize (buffers != 1) for polling mode is it allows + // to consume user data by fixed size data chunks and thus lowers memory movement (less CPU usage) + if (fullDuplex || eventMode || !output) + sub->buffers = 1; } } @@ -3195,7 +3200,7 @@ static void _CalculateAlignedPeriod(PaWasapiSubStream *pSub, UINT32 *nFramesPerL if (pSub->shareMode == AUDCLNT_SHAREMODE_EXCLUSIVE) { (*nFramesPerLatency) = AlignFramesPerBuffer((*nFramesPerLatency), - pSub->wavex.Format.nSamplesPerSec, pSub->wavex.Format.nBlockAlign, pAlignFunc); + pSub->wavex.Format.nBlockAlign, pAlignFunc); } // Calculate period @@ -3205,7 +3210,7 @@ static void _CalculateAlignedPeriod(PaWasapiSubStream *pSub, UINT32 *nFramesPerL // ------------------------------------------------------------------------------------------ static void _CalculatePeriodicity(PaWasapiSubStream *pSub, BOOL output, REFERENCE_TIME *periodicity) { - // Note: according Microsoft docs for IAudioClient::Initialize we can set periodicity of the buffer + // Note: according to Microsoft docs for IAudioClient::Initialize we can set periodicity of the buffer // only for Exclusive mode. By setting periodicity almost equal to the user buffer frames we can // achieve high quality (less glitchy) low-latency audio. if (pSub->shareMode == AUDCLNT_SHAREMODE_EXCLUSIVE) @@ -3216,7 +3221,7 @@ static void _CalculatePeriodicity(PaWasapiSubStream *pSub, BOOL output, REFERENC (*periodicity) = pSub->period; // Try make buffer ready for I/O once we request the buffer readiness for it. Only Polling mode - // because for Event mode buffer size and periodicity must be equal according Microsoft + // because for Event mode buffer size and periodicity must be equal according to Microsoft // documentation for IAudioClient::Initialize. // // TO-DO: try spread to capture and full-duplex cases (not tested and therefore disabled) @@ -3230,7 +3235,7 @@ static void _CalculatePeriodicity(PaWasapiSubStream *pSub, BOOL output, REFERENC // Align frames backwards, so device will likely make buffer read ready when we are ready // to read it (our scheduling will wait for amount of millisoconds of frames_per_buffer) alignedFrames = AlignFramesPerBuffer(pSub->params.frames_per_buffer, - pSub->wavex.Format.nSamplesPerSec, pSub->wavex.Format.nBlockAlign, ALIGN_BWD); + pSub->wavex.Format.nBlockAlign, ALIGN_BWD); userPeriodicity = MakeHnsPeriod(alignedFrames, pSub->wavex.Format.nSamplesPerSec); @@ -3429,7 +3434,7 @@ static HRESULT CreateAudioClient(PaWasapiStream *pStream, PaWasapiSubStream *pSu } } - // Set device scheduling period (always 0 in Shared mode according Microsoft docs) + // Set device scheduling period (always 0 in Shared mode according to Microsoft docs) _CalculatePeriodicity(pSub, output, &eventPeriodicity); // Open the stream and associate it with an audio session @@ -3483,7 +3488,7 @@ static HRESULT CreateAudioClient(PaWasapiStream *pStream, PaWasapiSubStream *pSu goto done; } - // Set device scheduling period (always 0 in Shared mode according Microsoft docs) + // Set device scheduling period (always 0 in Shared mode according to Microsoft docs) _CalculatePeriodicity(pSub, output, &eventPeriodicity); // Open the stream and associate it with an audio session @@ -3523,7 +3528,7 @@ static HRESULT CreateAudioClient(PaWasapiStream *pStream, PaWasapiSubStream *pSu goto done; } - // Set device scheduling period (always 0 in Shared mode according Microsoft docs) + // Set device scheduling period (always 0 in Shared mode according to Microsoft docs) _CalculatePeriodicity(pSub, output, &eventPeriodicity); // Open the stream and associate it with an audio session @@ -3556,7 +3561,7 @@ static HRESULT CreateAudioClient(PaWasapiStream *pStream, PaWasapiSubStream *pSu goto done; } - // Set device scheduling period (always 0 in Shared mode according Microsoft docs) + // Set device scheduling period (always 0 in Shared mode according to Microsoft docs) _CalculatePeriodicity(pSub, output, &eventPeriodicity); // Open the stream and associate it with an audio session @@ -3583,7 +3588,7 @@ static HRESULT CreateAudioClient(PaWasapiStream *pStream, PaWasapiSubStream *pSu // Recalculate buffers count _RecalculateBuffersCount(pSub, userFramesPerBuffer, MakeFramesFromHns(pSub->period, pSub->wavex.Format.nSamplesPerSec), - fullDuplex); + fullDuplex, output); // No error, client is successfully created (*pa_error) = paNoError; @@ -3631,15 +3636,6 @@ static PaError ActivateAudioClientOutput(PaWasapiStream *stream) // Correct buffer to max size if it maxed out result of GetBufferSize stream->out.bufferSize = maxBufferSize; - // Get interface latency (actually unneeded as we calculate latency from the size of maxBufferSize) - if (FAILED(hr = IAudioClient_GetStreamLatency(stream->out.clientParent, &stream->out.deviceLatency))) - { - LogHostError(hr); - LogPaError(result = paInvalidDevice); - goto error; - } - //stream->out.latencySeconds = nano100ToSeconds(stream->out.deviceLatency); - // Number of frames that are required at each period stream->out.framesPerHostCallback = maxBufferSize; @@ -6085,7 +6081,7 @@ static UINT32 ConfigureLoopSleepTimeAndScheduler(PaWasapiStream *stream, ThreadI UINT32 userFramesOut = stream->out.framesPerBuffer; // Adjust polling time for non-paUtilFixedHostBufferSize, input stream is not adjustable as it is being - // polled according its packet length + // polled according to its packet length if (stream->bufferMode != paUtilFixedHostBufferSize) { userFramesOut = (stream->bufferProcessor.framesPerUserBuffer ? stream->bufferProcessor.framesPerUserBuffer : From 712685c71acfec2a3640fe493ef1de86bebc2954 Mon Sep 17 00:00:00 2001 From: dmitrykos Date: Tue, 16 Feb 2021 12:43:58 +0200 Subject: [PATCH 127/164] wasapi: Fixed compilation for UWP platform, minor cleanup and refactoring. --- src/hostapi/wasapi/pa_win_wasapi.c | 189 ++++++++++++----------------- 1 file changed, 80 insertions(+), 109 deletions(-) diff --git a/src/hostapi/wasapi/pa_win_wasapi.c b/src/hostapi/wasapi/pa_win_wasapi.c index 9936838..23f41a1 100644 --- a/src/hostapi/wasapi/pa_win_wasapi.c +++ b/src/hostapi/wasapi/pa_win_wasapi.c @@ -2525,73 +2525,7 @@ int PaWasapi_GetDeviceCurrentFormat( PaStream *pStream, void *pFormat, unsigned } // ------------------------------------------------------------------------------------------ -int PaWasapi_GetDeviceDefaultFormat( void *pFormat, unsigned int formatSize, PaDeviceIndex device ) -{ - PaError ret; - PaWasapiHostApiRepresentation *paWasapi; - UINT32 size; - PaDeviceIndex index; - - if (pFormat == NULL) - return paBadBufferPtr; - if (formatSize <= 0) - return paBufferTooSmall; - - // Get API - paWasapi = _GetHostApi(&ret); - if (paWasapi == NULL) - return ret; - - // Get device index - ret = PaUtil_DeviceIndexToHostApiDeviceIndex(&index, device, &paWasapi->inheritedHostApiRep); - if (ret != paNoError) - return ret; - - // Validate index - if ((UINT32)index >= paWasapi->deviceCount) - return paInvalidDevice; - - size = min(formatSize, (UINT32)sizeof(paWasapi->devInfo[ index ].DefaultFormat)); - memcpy(pFormat, &paWasapi->devInfo[ index ].DefaultFormat, size); - - return size; -} - -// ------------------------------------------------------------------------------------------ -int PaWasapi_GetDeviceMixFormat( void *pFormat, unsigned int formatSize, PaDeviceIndex device ) -{ - PaError ret; - PaWasapiHostApiRepresentation *paWasapi; - UINT32 size; - PaDeviceIndex index; - - if (pFormat == NULL) - return paBadBufferPtr; - if (formatSize <= 0) - return paBufferTooSmall; - - // Get API - paWasapi = _GetHostApi(&ret); - if (paWasapi == NULL) - return ret; - - // Get device index - ret = PaUtil_DeviceIndexToHostApiDeviceIndex(&index, device, &paWasapi->inheritedHostApiRep); - if (ret != paNoError) - return ret; - - // Validate index - if ((UINT32)index >= paWasapi->deviceCount) - return paInvalidDevice; - - size = min(formatSize, (UINT32)sizeof(paWasapi->devInfo[ index ].MixFormat)); - memcpy(pFormat, &paWasapi->devInfo[ index ].MixFormat, size); - - return size; -} - -// ------------------------------------------------------------------------------------------ -int PaWasapi_GetDeviceRole( PaDeviceIndex device ) +static PaError _GetWasapiDeviceInfoByDeviceIndex( PaWasapiDeviceInfo **info, PaDeviceIndex device ) { PaError ret; PaDeviceIndex index; @@ -2602,36 +2536,93 @@ int PaWasapi_GetDeviceRole( PaDeviceIndex device ) return paNotInitialized; // Get device index - ret = PaUtil_DeviceIndexToHostApiDeviceIndex(&index, device, &paWasapi->inheritedHostApiRep); - if (ret != paNoError) + if ((ret = PaUtil_DeviceIndexToHostApiDeviceIndex(&index, device, &paWasapi->inheritedHostApiRep)) != paNoError) return ret; // Validate index if ((UINT32)index >= paWasapi->deviceCount) return paInvalidDevice; - return paWasapi->devInfo[ index ].formFactor; + (*info) = &paWasapi->devInfo[ index ]; + + return paNoError; } // ------------------------------------------------------------------------------------------ -int PaWasapi_GetIMMDevice( PaDeviceIndex device, void **pIMMDevice ) +int PaWasapi_GetDeviceDefaultFormat( void *pFormat, unsigned int formatSize, PaDeviceIndex device ) { - PaError ret; - PaDeviceIndex index; + PaError ret; + PaWasapiDeviceInfo *deviceInfo; + UINT32 size; - PaWasapiHostApiRepresentation *paWasapi = _GetHostApi(&ret); - if (paWasapi == NULL) - return paNotInitialized; + if (pFormat == NULL) + return paBadBufferPtr; + if (formatSize <= 0) + return paBufferTooSmall; - ret = PaUtil_DeviceIndexToHostApiDeviceIndex(&index, device, &paWasapi->inheritedHostApiRep); - if (ret != paNoError) - return ret; + if ((ret = _GetWasapiDeviceInfoByDeviceIndex(&deviceInfo, device)) != paNoError) + return ret; - if ((UINT32)index >= paWasapi->deviceCount) - return paInvalidDevice; + size = min(formatSize, (UINT32)sizeof(deviceInfo->DefaultFormat)); + memcpy(pFormat, &deviceInfo->DefaultFormat, size); - *pIMMDevice = paWasapi->devInfo[ index ].device; - return paNoError; + return size; +} + +// ------------------------------------------------------------------------------------------ +int PaWasapi_GetDeviceMixFormat( void *pFormat, unsigned int formatSize, PaDeviceIndex device ) +{ + PaError ret; + PaWasapiDeviceInfo *deviceInfo; + UINT32 size; + + if (pFormat == NULL) + return paBadBufferPtr; + if (formatSize <= 0) + return paBufferTooSmall; + + if ((ret = _GetWasapiDeviceInfoByDeviceIndex(&deviceInfo, device)) != paNoError) + return ret; + + size = min(formatSize, (UINT32)sizeof(deviceInfo->MixFormat)); + memcpy(pFormat, &deviceInfo->MixFormat, size); + + return size; +} + +// ------------------------------------------------------------------------------------------ +int PaWasapi_GetDeviceRole( PaDeviceIndex device ) +{ + PaError ret; + PaWasapiDeviceInfo *deviceInfo; + + if ((ret = _GetWasapiDeviceInfoByDeviceIndex(&deviceInfo, device)) != paNoError) + return ret; + + return deviceInfo->formFactor; +} + +// ------------------------------------------------------------------------------------------ +PaError PaWasapi_GetIMMDevice( PaDeviceIndex device, void **pIMMDevice ) +{ +#ifndef PA_WINRT + PaError ret; + PaWasapiDeviceInfo *deviceInfo; + + if (pIMMDevice == NULL) + return paBadBufferPtr; + + if ((ret = _GetWasapiDeviceInfoByDeviceIndex(&deviceInfo, device)) != paNoError) + return ret; + + (*pIMMDevice) = deviceInfo->device; + + return paNoError; +#else + (void)device; + (void)pIMMDevice; + return paIncompatibleStreamHostApi; +#endif } // ------------------------------------------------------------------------------------------ @@ -5197,7 +5188,7 @@ PaError PaWasapi_GetJackCount(PaDeviceIndex device, int *pJackCount) #ifndef PA_WINRT PaError ret; HRESULT hr = S_OK; - PaDeviceIndex index; + PaWasapiDeviceInfo *deviceInfo; IDeviceTopology *pDeviceTopology = NULL; IConnector *pConnFrom = NULL; IConnector *pConnTo = NULL; @@ -5205,24 +5196,14 @@ PaError PaWasapi_GetJackCount(PaDeviceIndex device, int *pJackCount) IKsJackDescription *pJackDesc = NULL; UINT jackCount = 0; - PaWasapiHostApiRepresentation *paWasapi = _GetHostApi(&ret); - if (paWasapi == NULL) - return paNotInitialized; - if (pJackCount == NULL) return paUnanticipatedHostError; - // Get device index - ret = PaUtil_DeviceIndexToHostApiDeviceIndex(&index, device, &paWasapi->inheritedHostApiRep); - if (ret != paNoError) + if ((ret = _GetWasapiDeviceInfoByDeviceIndex(&deviceInfo, device)) != paNoError) return ret; - // Validate index - if ((UINT32)index >= paWasapi->deviceCount) - return paInvalidDevice; - // Get the endpoint device's IDeviceTopology interface - hr = IMMDevice_Activate(paWasapi->devInfo[index].device, &pa_IID_IDeviceTopology, + hr = IMMDevice_Activate(deviceInfo->device, &pa_IID_IDeviceTopology, CLSCTX_INPROC_SERVER, NULL, (void**)&pDeviceTopology); IF_FAILED_JUMP(hr, error); @@ -5372,7 +5353,7 @@ PaError PaWasapi_GetJackDescription(PaDeviceIndex device, int jackIndex, PaWasap #ifndef PA_WINRT PaError ret; HRESULT hr = S_OK; - PaDeviceIndex index; + PaWasapiDeviceInfo *deviceInfo; IDeviceTopology *pDeviceTopology = NULL; IConnector *pConnFrom = NULL; IConnector *pConnTo = NULL; @@ -5380,21 +5361,11 @@ PaError PaWasapi_GetJackDescription(PaDeviceIndex device, int jackIndex, PaWasap IKsJackDescription *pJackDesc = NULL; KSJACK_DESCRIPTION jack = { 0 }; - PaWasapiHostApiRepresentation *paWasapi = _GetHostApi(&ret); - if (paWasapi == NULL) - return paNotInitialized; - - // Get device index - ret = PaUtil_DeviceIndexToHostApiDeviceIndex(&index, device, &paWasapi->inheritedHostApiRep); - if (ret != paNoError) + if ((ret = _GetWasapiDeviceInfoByDeviceIndex(&deviceInfo, device)) != paNoError) return ret; - // Validate index - if ((UINT32)index >= paWasapi->deviceCount) - return paInvalidDevice; - // Get the endpoint device's IDeviceTopology interface - hr = IMMDevice_Activate(paWasapi->devInfo[index].device, &pa_IID_IDeviceTopology, + hr = IMMDevice_Activate(deviceInfo->device, &pa_IID_IDeviceTopology, CLSCTX_INPROC_SERVER, NULL, (void**)&pDeviceTopology); IF_FAILED_JUMP(hr, error); From 9ef2c28bb8e5dbb4c3612cb63885336f49d83369 Mon Sep 17 00:00:00 2001 From: Francesco Lamonica Date: Tue, 16 Feb 2021 22:11:01 +0100 Subject: [PATCH 128/164] fixed VS2010 compilation --- src/hostapi/wasapi/pa_win_wasapi.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/hostapi/wasapi/pa_win_wasapi.c b/src/hostapi/wasapi/pa_win_wasapi.c index 23f41a1..0cd59bb 100644 --- a/src/hostapi/wasapi/pa_win_wasapi.c +++ b/src/hostapi/wasapi/pa_win_wasapi.c @@ -87,6 +87,10 @@ #include #include // Used to get IKsJackDescription interface #undef INITGUID +// Visual Studio 2010 does not support the inline keyword +#if (_MSC_VER <= 1600) + #define inline _inline +#endif #endif #ifndef __MWERKS__ #include @@ -2078,6 +2082,7 @@ static PaDeviceInfo *AllocateDeviceListMemory(PaWasapiHostApiRepresentation *paW if (paWasapi->deviceCount != 0) { + UINT32 i; UINT32 deviceCount = paWasapi->deviceCount; #if defined(PA_WASAPI_MAX_CONST_DEVICE_COUNT) && (PA_WASAPI_MAX_CONST_DEVICE_COUNT > 0) if (deviceCount < PA_WASAPI_MAX_CONST_DEVICE_COUNT) @@ -2089,7 +2094,7 @@ static PaDeviceInfo *AllocateDeviceListMemory(PaWasapiHostApiRepresentation *paW { return NULL; } - for (UINT32 i = 0; i < deviceCount; ++i) + for (i = 0; i < deviceCount; ++i) hostApi->deviceInfos[i] = NULL; // Allocate all device info structs in a contiguous block @@ -6091,6 +6096,7 @@ static inline INT32 GetNextSleepTime(SystemTimer *timer, ThreadIdleScheduler *sc UINT32 sleepTime) { INT32 nextSleepTime; + INT32 procTime; // Get next sleep time if (sleepTime == 0) @@ -6104,7 +6110,7 @@ static inline INT32 GetNextSleepTime(SystemTimer *timer, ThreadIdleScheduler *sc // // [9],{2},[8],{1},[9],{1},[9],{3},[7],{2},[8],{3},[7],{2},[8],{2},[8],{3},[7],{2},[8],... // - INT32 procTime = (INT32)(SystemTimer_GetTime(timer) - startTime); + procTime = (INT32)(SystemTimer_GetTime(timer) - startTime); nextSleepTime -= procTime; if (nextSleepTime < timer->granularity) nextSleepTime = 0; From 79932a5919177172d10ca673542f04f3148a9153 Mon Sep 17 00:00:00 2001 From: Ross Bencina Date: Thu, 18 Feb 2021 12:11:14 +1100 Subject: [PATCH 129/164] Clean up whitespace in src/hostapi/coreaudio in preparation for .editorconfig. (#502) * Clean up whitespace in src/hostapi/coreaudio in preparation for .editorconfig. Convert tabs to 4 spaces. Indent by 4 spaces. Strip trailing whitespace. Ensure only one EOL at EOF. --- src/hostapi/coreaudio/pa_mac_core.c | 2767 ++++++++--------- src/hostapi/coreaudio/pa_mac_core_blocking.c | 681 ++-- src/hostapi/coreaudio/pa_mac_core_blocking.h | 22 +- src/hostapi/coreaudio/pa_mac_core_internal.h | 37 +- src/hostapi/coreaudio/pa_mac_core_utilities.c | 787 ++--- src/hostapi/coreaudio/pa_mac_core_utilities.h | 68 +- 6 files changed, 2191 insertions(+), 2171 deletions(-) diff --git a/src/hostapi/coreaudio/pa_mac_core.c b/src/hostapi/coreaudio/pa_mac_core.c index 2d98a3b..26b814c 100644 --- a/src/hostapi/coreaudio/pa_mac_core.c +++ b/src/hostapi/coreaudio/pa_mac_core.c @@ -15,7 +15,7 @@ * Olivier Tristan for feedback and testing * Glenn Zelniker and Z-Systems engineering for sponsoring the Blocking I/O * interface. - * + * * * Based on the Open Source API proposed by Ross Bencina * Copyright (c) 1999-2002 Ross Bencina, Phil Burk @@ -41,13 +41,13 @@ */ /* - * The text above constitutes the entire PortAudio license; however, + * The text above constitutes the entire PortAudio license; however, * the PortAudio community also makes the following non-binding requests: * * 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. It is also - * requested that these non-binding requests be included along with the + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the * license above. */ @@ -80,10 +80,10 @@ extern "C" { #endif /* __cplusplus */ - + /* This is a reasonable size for a small buffer based on experience. */ #define PA_MAC_SMALL_BUFFER_SIZE (64) - + /* prototypes for functions declared in this file */ PaError PaMacCore_Initialize( PaUtilHostApiRepresentation **hostApi, PaHostApiIndex index ); @@ -93,13 +93,13 @@ PaError PaMacCore_Initialize( PaUtilHostApiRepresentation **hostApi, PaHostApiIn */ void PaMacCore_SetupStreamInfo( PaMacCoreStreamInfo *data, const unsigned long flags ) { - bzero( data, sizeof( PaMacCoreStreamInfo ) ); - data->size = sizeof( PaMacCoreStreamInfo ); - data->hostApiType = paCoreAudio; - data->version = 0x01; - data->flags = flags; - data->channelMap = NULL; - data->channelMapSize = 0; + bzero( data, sizeof( PaMacCoreStreamInfo ) ); + data->size = sizeof( PaMacCoreStreamInfo ); + data->hostApiType = paCoreAudio; + data->version = 0x01; + data->flags = flags; + data->channelMap = NULL; + data->channelMapSize = 0; } /* @@ -107,110 +107,110 @@ void PaMacCore_SetupStreamInfo( PaMacCoreStreamInfo *data, const unsigned long */ void PaMacCore_SetupChannelMap( PaMacCoreStreamInfo *data, const SInt32 * const channelMap, const unsigned long channelMapSize ) { - data->channelMap = channelMap; - data->channelMapSize = channelMapSize; + data->channelMap = channelMap; + data->channelMapSize = channelMapSize; } static char *channelName = NULL; static int channelNameSize = 0; static bool ensureChannelNameSize( int size ) { - if( size >= channelNameSize ) { - free( channelName ); - channelName = (char *) malloc( ( channelNameSize = size ) + 1 ); - if( !channelName ) { - channelNameSize = 0; - return false; - } - } - return true; + if( size >= channelNameSize ) { + free( channelName ); + channelName = (char *) malloc( ( channelNameSize = size ) + 1 ); + if( !channelName ) { + channelNameSize = 0; + return false; + } + } + return true; } /* * Function declared in pa_mac_core.h. retrieves channel names. */ const char *PaMacCore_GetChannelName( int device, int channelIndex, bool input ) { - struct PaUtilHostApiRepresentation *hostApi; - PaError err; - OSStatus error; - err = PaUtil_GetHostApiRepresentation( &hostApi, paCoreAudio ); - assert(err == paNoError); - if( err != paNoError ) - return NULL; - PaMacAUHAL *macCoreHostApi = (PaMacAUHAL*)hostApi; - AudioDeviceID hostApiDevice = macCoreHostApi->devIds[device]; - CFStringRef nameRef; - - /* First try with CFString */ - UInt32 size = sizeof(nameRef); - error = PaMacCore_AudioDeviceGetProperty( hostApiDevice, - channelIndex + 1, - input, - kAudioDevicePropertyChannelNameCFString, - &size, - &nameRef ); - if( error ) - { - /* try the C String */ - size = 0; - error = PaMacCore_AudioDeviceGetPropertySize( hostApiDevice, - channelIndex + 1, - input, - kAudioDevicePropertyChannelName, - &size); - if( !error ) - { - if( !ensureChannelNameSize( size ) ) - return NULL; + struct PaUtilHostApiRepresentation *hostApi; + PaError err; + OSStatus error; + err = PaUtil_GetHostApiRepresentation( &hostApi, paCoreAudio ); + assert(err == paNoError); + if( err != paNoError ) + return NULL; + PaMacAUHAL *macCoreHostApi = (PaMacAUHAL*)hostApi; + AudioDeviceID hostApiDevice = macCoreHostApi->devIds[device]; + CFStringRef nameRef; - error = PaMacCore_AudioDeviceGetProperty( hostApiDevice, - channelIndex + 1, - input, - kAudioDevicePropertyChannelName, - &size, - channelName ); - - - if( !error ) - return channelName; - } - - /* as a last-ditch effort, we use the device name and append the channel number. */ - nameRef = CFStringCreateWithFormat( NULL, NULL, CFSTR( "%s: %d"), hostApi->deviceInfos[device]->name, channelIndex + 1 ); - - - size = CFStringGetMaximumSizeForEncoding(CFStringGetLength(nameRef), kCFStringEncodingUTF8);; - if( !ensureChannelNameSize( size ) ) - { - CFRelease( nameRef ); - return NULL; - } - CFStringGetCString( nameRef, channelName, size+1, kCFStringEncodingUTF8 ); - CFRelease( nameRef ); - } - else - { - size = CFStringGetMaximumSizeForEncoding(CFStringGetLength(nameRef), kCFStringEncodingUTF8);; - if( !ensureChannelNameSize( size ) ) - { - CFRelease( nameRef ); - return NULL; - } - CFStringGetCString( nameRef, channelName, size+1, kCFStringEncodingUTF8 ); - CFRelease( nameRef ); - } - - return channelName; + /* First try with CFString */ + UInt32 size = sizeof(nameRef); + error = PaMacCore_AudioDeviceGetProperty( hostApiDevice, + channelIndex + 1, + input, + kAudioDevicePropertyChannelNameCFString, + &size, + &nameRef ); + if( error ) + { + /* try the C String */ + size = 0; + error = PaMacCore_AudioDeviceGetPropertySize( hostApiDevice, + channelIndex + 1, + input, + kAudioDevicePropertyChannelName, + &size ); + if( !error ) + { + if( !ensureChannelNameSize( size ) ) + return NULL; + + error = PaMacCore_AudioDeviceGetProperty( hostApiDevice, + channelIndex + 1, + input, + kAudioDevicePropertyChannelName, + &size, + channelName ); + + + if( !error ) + return channelName; + } + + /* as a last-ditch effort, we use the device name and append the channel number. */ + nameRef = CFStringCreateWithFormat( NULL, NULL, CFSTR( "%s: %d"), hostApi->deviceInfos[device]->name, channelIndex + 1 ); + + + size = CFStringGetMaximumSizeForEncoding(CFStringGetLength(nameRef), kCFStringEncodingUTF8);; + if( !ensureChannelNameSize( size ) ) + { + CFRelease( nameRef ); + return NULL; + } + CFStringGetCString( nameRef, channelName, size+1, kCFStringEncodingUTF8 ); + CFRelease( nameRef ); + } + else + { + size = CFStringGetMaximumSizeForEncoding(CFStringGetLength(nameRef), kCFStringEncodingUTF8);; + if( !ensureChannelNameSize( size ) ) + { + CFRelease( nameRef ); + return NULL; + } + CFStringGetCString( nameRef, channelName, size+1, kCFStringEncodingUTF8 ); + CFRelease( nameRef ); + } + + return channelName; } - + PaError PaMacCore_GetBufferSizeRange( PaDeviceIndex device, long *minBufferSizeFrames, long *maxBufferSizeFrames ) { PaError result; PaUtilHostApiRepresentation *hostApi; - + result = PaUtil_GetHostApiRepresentation( &hostApi, paCoreAudio ); - + if( result == paNoError ) { PaDeviceIndex hostApiDeviceIndex; @@ -221,7 +221,7 @@ PaError PaMacCore_GetBufferSizeRange( PaDeviceIndex device, AudioDeviceID macCoreDeviceId = macCoreHostApi->devIds[hostApiDeviceIndex]; AudioValueRange audioRange; UInt32 propSize = sizeof( audioRange ); - + // return the size range for the output scope unless we only have inputs Boolean isInput = 0; if( macCoreHostApi->inheritedHostApiRep.deviceInfos[hostApiDeviceIndex]->maxOutputChannels == 0 ) @@ -233,7 +233,7 @@ PaError PaMacCore_GetBufferSizeRange( PaDeviceIndex device, *maxBufferSizeFrames = audioRange.mMaximum; } } - + return result; } @@ -282,11 +282,11 @@ static PaError IsStreamStopped( PaStream *s ); static PaError IsStreamActive( PaStream *stream ); static PaTime GetStreamTime( PaStream *stream ); static OSStatus AudioIOProc( void *inRefCon, - AudioUnitRenderActionFlags *ioActionFlags, - const AudioTimeStamp *inTimeStamp, - UInt32 inBusNumber, - UInt32 inNumberFrames, - AudioBufferList *ioData ); + AudioUnitRenderActionFlags *ioActionFlags, + const AudioTimeStamp *inTimeStamp, + UInt32 inBusNumber, + UInt32 inNumberFrames, + AudioBufferList *ioData ); static double GetStreamCpuLoad( PaStream* stream ); static PaError GetChannelInfo( PaMacAUHAL *auhalHostApi, @@ -294,19 +294,18 @@ static PaError GetChannelInfo( PaMacAUHAL *auhalHostApi, AudioDeviceID macCoreDeviceId, int isInput); -static PaError OpenAndSetupOneAudioUnit( - const PaMacCoreStream *stream, - const PaStreamParameters *inStreamParams, - const PaStreamParameters *outStreamParams, - const UInt32 requestedFramesPerBuffer, - UInt32 *actualInputFramesPerBuffer, - UInt32 *actualOutputFramesPerBuffer, - const PaMacAUHAL *auhalHostApi, - AudioUnit *audioUnit, - AudioConverterRef *srConverter, - AudioDeviceID *audioDevice, - const double sampleRate, - void *refCon ); +static PaError OpenAndSetupOneAudioUnit( const PaMacCoreStream *stream, + const PaStreamParameters *inStreamParams, + const PaStreamParameters *outStreamParams, + const UInt32 requestedFramesPerBuffer, + UInt32 *actualInputFramesPerBuffer, + UInt32 *actualOutputFramesPerBuffer, + const PaMacAUHAL *auhalHostApi, + AudioUnit *audioUnit, + AudioConverterRef *srConverter, + AudioDeviceID *audioDevice, + const double sampleRate, + void *refCon ); /* for setting errors. */ #define PA_AUHAL_SET_LAST_HOST_ERROR( errorCode, errorText ) \ @@ -316,30 +315,30 @@ static PaError OpenAndSetupOneAudioUnit( * Callback called when starting or stopping a stream. */ static void startStopCallback( - void * inRefCon, - AudioUnit ci, - AudioUnitPropertyID inID, - AudioUnitScope inScope, - AudioUnitElement inElement ) + void * inRefCon, + AudioUnit ci, + AudioUnitPropertyID inID, + AudioUnitScope inScope, + AudioUnitElement inElement ) { - PaMacCoreStream *stream = (PaMacCoreStream *) inRefCon; - UInt32 isRunning; - UInt32 size = sizeof( isRunning ); - OSStatus err; - err = AudioUnitGetProperty( ci, kAudioOutputUnitProperty_IsRunning, inScope, inElement, &isRunning, &size ); - assert( !err ); - if( err ) - isRunning = false; //it's very unclear what to do in case of error here. There's no real way to notify the user, and crashing seems unreasonable. - if( isRunning ) - return; //We are only interested in when we are stopping - // -- if we are using 2 I/O units, we only need one notification! - if( stream->inputUnit && stream->outputUnit && stream->inputUnit != stream->outputUnit && ci == stream->inputUnit ) - return; - PaStreamFinishedCallback *sfc = stream->streamRepresentation.streamFinishedCallback; - if( stream->state == STOPPING ) - stream->state = STOPPED ; - if( sfc ) - sfc( stream->streamRepresentation.userData ); + PaMacCoreStream *stream = (PaMacCoreStream *) inRefCon; + UInt32 isRunning; + UInt32 size = sizeof( isRunning ); + OSStatus err; + err = AudioUnitGetProperty( ci, kAudioOutputUnitProperty_IsRunning, inScope, inElement, &isRunning, &size ); + assert( !err ); + if( err ) + isRunning = false; //it's very unclear what to do in case of error here. There's no real way to notify the user, and crashing seems unreasonable. + if( isRunning ) + return; //We are only interested in when we are stopping + // -- if we are using 2 I/O units, we only need one notification! + if( stream->inputUnit && stream->outputUnit && stream->inputUnit != stream->outputUnit && ci == stream->inputUnit ) + return; + PaStreamFinishedCallback *sfc = stream->streamRepresentation.streamFinishedCallback; + if( stream->state == STOPPING ) + stream->state = STOPPED ; + if( sfc ) + sfc( stream->streamRepresentation.userData ); } @@ -357,25 +356,25 @@ static PaError gatherDeviceInfo(PaMacAUHAL *auhalHostApi) /* -- figure out how many devices there are -- */ PaMacCore_AudioHardwareGetPropertySize( kAudioHardwarePropertyDevices, - &propsize); + &propsize); auhalHostApi->devCount = propsize / sizeof( AudioDeviceID ); VDBUG( ( "Found %ld device(s).\n", auhalHostApi->devCount ) ); /* -- copy the device IDs -- */ auhalHostApi->devIds = (AudioDeviceID *)PaUtil_GroupAllocateMemory( - auhalHostApi->allocations, - propsize ); + auhalHostApi->allocations, + propsize ); if( !auhalHostApi->devIds ) return paInsufficientMemory; PaMacCore_AudioHardwareGetProperty( kAudioHardwarePropertyDevices, - &propsize, - auhalHostApi->devIds ); + &propsize, + auhalHostApi->devIds ); #ifdef MAC_CORE_VERBOSE_DEBUG { - int i; - for( i=0; idevCount; ++i ) - printf( "Device %d\t: %ld\n", i, (long)auhalHostApi->devIds[i] ); + int i; + for( i=0; idevCount; ++i ) + printf( "Device %d\t: %ld\n", i, (long)auhalHostApi->devIds[i] ); } #endif @@ -388,39 +387,39 @@ static PaError gatherDeviceInfo(PaMacAUHAL *auhalHostApi) could fail, but in case they do, we use the first available device as the default. */ if( 0 != PaMacCore_AudioHardwareGetProperty(kAudioHardwarePropertyDefaultInputDevice, - &size, - &auhalHostApi->defaultIn) ) { - int i; - auhalHostApi->defaultIn = kAudioDeviceUnknown; - VDBUG(("Failed to get default input device from OS.")); - VDBUG((" I will substitute the first available input Device.")); - for( i=0; idevCount; ++i ) { - PaDeviceInfo devInfo; - if( 0 != GetChannelInfo( auhalHostApi, &devInfo, - auhalHostApi->devIds[i], TRUE ) ) - if( devInfo.maxInputChannels ) { - auhalHostApi->defaultIn = auhalHostApi->devIds[i]; - break; - } - } + &size, + &auhalHostApi->defaultIn) ) { + int i; + auhalHostApi->defaultIn = kAudioDeviceUnknown; + VDBUG(("Failed to get default input device from OS.")); + VDBUG((" I will substitute the first available input Device.")); + for( i=0; idevCount; ++i ) { + PaDeviceInfo devInfo; + if( 0 != GetChannelInfo( auhalHostApi, &devInfo, + auhalHostApi->devIds[i], TRUE ) ) + if( devInfo.maxInputChannels ) { + auhalHostApi->defaultIn = auhalHostApi->devIds[i]; + break; + } + } } if( 0 != PaMacCore_AudioHardwareGetProperty(kAudioHardwarePropertyDefaultOutputDevice, - &size, - &auhalHostApi->defaultOut) ) { - int i; - auhalHostApi->defaultIn = kAudioDeviceUnknown; - VDBUG(("Failed to get default output device from OS.")); - VDBUG((" I will substitute the first available output Device.")); - for( i=0; idevCount; ++i ) { - PaDeviceInfo devInfo; - if( 0 != GetChannelInfo( auhalHostApi, &devInfo, - auhalHostApi->devIds[i], FALSE ) ) - if( devInfo.maxOutputChannels ) { - auhalHostApi->defaultOut = auhalHostApi->devIds[i]; - break; - } - } - } + &size, + &auhalHostApi->defaultOut) ) { + int i; + auhalHostApi->defaultIn = kAudioDeviceUnknown; + VDBUG(("Failed to get default output device from OS.")); + VDBUG((" I will substitute the first available output Device.")); + for( i=0; idevCount; ++i ) { + PaDeviceInfo devInfo; + if( 0 != GetChannelInfo( auhalHostApi, &devInfo, + auhalHostApi->devIds[i], FALSE ) ) + if( devInfo.maxOutputChannels ) { + auhalHostApi->defaultOut = auhalHostApi->devIds[i]; + break; + } + } + } VDBUG( ( "Default in : %ld\n", (long)auhalHostApi->defaultIn ) ); VDBUG( ( "Default out: %ld\n", (long)auhalHostApi->defaultOut ) ); @@ -434,22 +433,22 @@ static PaError gatherDeviceInfo(PaMacAUHAL *auhalHostApi) * @brief Clip the desired size against the allowed IO buffer size range for the device. */ static PaError ClipToDeviceBufferSize( AudioDeviceID macCoreDeviceId, - int isInput, UInt32 desiredSize, UInt32 *allowedSize ) + int isInput, UInt32 desiredSize, UInt32 *allowedSize ) { - UInt32 resultSize = desiredSize; - AudioValueRange audioRange; - UInt32 propSize = sizeof( audioRange ); - PaError err = WARNING(PaMacCore_AudioDeviceGetProperty( macCoreDeviceId, 0, isInput, kAudioDevicePropertyBufferFrameSizeRange, &propSize, &audioRange ) ); - resultSize = MAX( resultSize, audioRange.mMinimum ); - resultSize = MIN( resultSize, audioRange.mMaximum ); - *allowedSize = resultSize; - return err; + UInt32 resultSize = desiredSize; + AudioValueRange audioRange; + UInt32 propSize = sizeof( audioRange ); + PaError err = WARNING(PaMacCore_AudioDeviceGetProperty( macCoreDeviceId, 0, isInput, kAudioDevicePropertyBufferFrameSizeRange, &propSize, &audioRange ) ); + resultSize = MAX( resultSize, audioRange.mMinimum ); + resultSize = MIN( resultSize, audioRange.mMaximum ); + *allowedSize = resultSize; + return err; } /* =================================================================================================== */ #if 0 static void DumpDeviceProperties( AudioDeviceID macCoreDeviceId, - int isInput ) + int isInput ) { PaError err; int i; @@ -459,27 +458,27 @@ static void DumpDeviceProperties( AudioDeviceID macCoreDeviceId, UInt32 bufferFrames; UInt32 safetyOffset; AudioStreamID streamIDs[128]; - - printf("\n======= latency query : macCoreDeviceId = %d, isInput %d =======\n", (int)macCoreDeviceId, isInput ); - + + printf("\n======= latency query : macCoreDeviceId = %d, isInput %d =======\n", (int)macCoreDeviceId, isInput ); + propSize = sizeof(UInt32); err = WARNING(AudioDeviceGetProperty(macCoreDeviceId, 0, isInput, kAudioDevicePropertyBufferFrameSize, &propSize, &bufferFrames)); printf("kAudioDevicePropertyBufferFrameSize: err = %d, propSize = %d, value = %d\n", err, propSize, bufferFrames ); - + propSize = sizeof(UInt32); err = WARNING(AudioDeviceGetProperty(macCoreDeviceId, 0, isInput, kAudioDevicePropertySafetyOffset, &propSize, &safetyOffset)); printf("kAudioDevicePropertySafetyOffset: err = %d, propSize = %d, value = %d\n", err, propSize, safetyOffset ); - + propSize = sizeof(UInt32); err = WARNING(AudioDeviceGetProperty(macCoreDeviceId, 0, isInput, kAudioDevicePropertyLatency, &propSize, &deviceLatency)); printf("kAudioDevicePropertyLatency: err = %d, propSize = %d, value = %d\n", err, propSize, deviceLatency ); - + AudioValueRange audioRange; propSize = sizeof( audioRange ); err = WARNING(AudioDeviceGetProperty( macCoreDeviceId, 0, isInput, kAudioDevicePropertyBufferFrameSizeRange, &propSize, &audioRange ) ); printf("kAudioDevicePropertyBufferFrameSizeRange: err = %d, propSize = %u, minimum = %g\n", err, propSize, audioRange.mMinimum); printf("kAudioDevicePropertyBufferFrameSizeRange: err = %d, propSize = %u, maximum = %g\n", err, propSize, audioRange.mMaximum ); - + /* Get the streams from the device and query their latency. */ propSize = sizeof(streamIDs); err = WARNING(AudioDeviceGetProperty(macCoreDeviceId, 0, isInput, kAudioDevicePropertyStreams, &propSize, &streamIDs[0])); @@ -487,7 +486,7 @@ static void DumpDeviceProperties( AudioDeviceID macCoreDeviceId, for( i=0; imaxInputChannels = numChannels; else deviceInfo->maxOutputChannels = numChannels; - + if (numChannels > 0) /* do not try to retrieve the latency if there are no channels. */ { /* Get the latency. Don't fail if we can't get this. */ @@ -617,13 +616,13 @@ static PaError GetChannelInfo( PaMacAUHAL *auhalHostApi, deviceInfo->defaultLowInputLatency = .01; deviceInfo->defaultHighInputLatency = .10; deviceInfo->defaultLowOutputLatency = .01; - deviceInfo->defaultHighOutputLatency = .10; + deviceInfo->defaultHighOutputLatency = .10; UInt32 lowLatencyFrames = 0; UInt32 highLatencyFrames = 0; err = CalculateDefaultDeviceLatencies( macCoreDeviceId, isInput, &lowLatencyFrames, &highLatencyFrames ); if( err == 0 ) { - + double lowLatencySeconds = lowLatencyFrames / deviceInfo->defaultSampleRate; double highLatencySeconds = highLatencyFrames / deviceInfo->defaultSampleRate; if (isInput) @@ -640,7 +639,7 @@ static PaError GetChannelInfo( PaMacAUHAL *auhalHostApi, } PaUtil_FreeMemory( buflist ); return paNoError; - error: +error: PaUtil_FreeMemory( buflist ); return err; } @@ -654,7 +653,7 @@ static PaError InitializeDeviceInfo( PaMacAUHAL *auhalHostApi, Float64 sampleRate; char *name; PaError err = paNoError; - CFStringRef nameRef; + CFStringRef nameRef; UInt32 propSize; VVDBUG(("InitializeDeviceInfo(): macCoreDeviceId=%ld\n", macCoreDeviceId)); @@ -663,37 +662,37 @@ static PaError InitializeDeviceInfo( PaMacAUHAL *auhalHostApi, deviceInfo->structVersion = 2; deviceInfo->hostApi = hostApiIndex; - + /* Get the device name using CFString */ - propSize = sizeof(nameRef); + propSize = sizeof(nameRef); err = ERR(PaMacCore_AudioDeviceGetProperty(macCoreDeviceId, 0, 0, kAudioDevicePropertyDeviceNameCFString, &propSize, &nameRef)); if (err) { - /* Get the device name using c string. Fail if we can't get it. */ - err = ERR(PaMacCore_AudioDeviceGetPropertySize(macCoreDeviceId, 0, 0, kAudioDevicePropertyDeviceName, &propSize)); - if (err) - return err; + /* Get the device name using c string. Fail if we can't get it. */ + err = ERR(PaMacCore_AudioDeviceGetPropertySize(macCoreDeviceId, 0, 0, kAudioDevicePropertyDeviceName, &propSize)); + if (err) + return err; - name = PaUtil_GroupAllocateMemory(auhalHostApi->allocations,propSize+1); - if ( !name ) - return paInsufficientMemory; - err = ERR(PaMacCore_AudioDeviceGetProperty(macCoreDeviceId, 0, 0, kAudioDevicePropertyDeviceName, &propSize, name)); - if (err) - return err; - } - else - { - /* valid CFString so we just allocate a c string big enough to contain the data */ - propSize = CFStringGetMaximumSizeForEncoding(CFStringGetLength(nameRef), kCFStringEncodingUTF8); - name = PaUtil_GroupAllocateMemory(auhalHostApi->allocations, propSize+1); - if ( !name ) - { - CFRelease(nameRef); - return paInsufficientMemory; - } - CFStringGetCString(nameRef, name, propSize+1, kCFStringEncodingUTF8); - CFRelease(nameRef); - } + name = PaUtil_GroupAllocateMemory(auhalHostApi->allocations,propSize+1); + if ( !name ) + return paInsufficientMemory; + err = ERR(PaMacCore_AudioDeviceGetProperty(macCoreDeviceId, 0, 0, kAudioDevicePropertyDeviceName, &propSize, name)); + if (err) + return err; + } + else + { + /* valid CFString so we just allocate a c string big enough to contain the data */ + propSize = CFStringGetMaximumSizeForEncoding(CFStringGetLength(nameRef), kCFStringEncodingUTF8); + name = PaUtil_GroupAllocateMemory(auhalHostApi->allocations, propSize+1); + if ( !name ) + { + CFRelease(nameRef); + return paInsufficientMemory; + } + CFStringGetCString(nameRef, name, propSize+1, kCFStringEncodingUTF8); + CFRelease(nameRef); + } deviceInfo->name = name; /* Try to get the default sample rate. Don't fail if we can't get this. */ @@ -726,25 +725,25 @@ PaError PaMacCore_Initialize( PaUtilHostApiRepresentation **hostApi, PaHostApiIn int unixErr; VVDBUG(("PaMacCore_Initialize(): hostApiIndex=%d\n", hostApiIndex)); - - SInt32 major; - SInt32 minor; - Gestalt(gestaltSystemVersionMajor, &major); - Gestalt(gestaltSystemVersionMinor, &minor); - - // Starting with 10.6 systems, the HAL notification thread is created internally - if ( major > 10 || (major == 10 && minor >= 6) ) { - CFRunLoopRef theRunLoop = NULL; - AudioObjectPropertyAddress theAddress = { kAudioHardwarePropertyRunLoop, kAudioObjectPropertyScopeGlobal, kAudioObjectPropertyElementMaster }; - OSStatus osErr = AudioObjectSetPropertyData (kAudioObjectSystemObject, &theAddress, 0, NULL, sizeof(CFRunLoopRef), &theRunLoop); - if (osErr != noErr) { - goto error; - } - } - + + SInt32 major; + SInt32 minor; + Gestalt(gestaltSystemVersionMajor, &major); + Gestalt(gestaltSystemVersionMinor, &minor); + + // Starting with 10.6 systems, the HAL notification thread is created internally + if ( major > 10 || (major == 10 && minor >= 6) ) { + CFRunLoopRef theRunLoop = NULL; + AudioObjectPropertyAddress theAddress = { kAudioHardwarePropertyRunLoop, kAudioObjectPropertyScopeGlobal, kAudioObjectPropertyElementMaster }; + OSStatus osErr = AudioObjectSetPropertyData (kAudioObjectSystemObject, &theAddress, 0, NULL, sizeof(CFRunLoopRef), &theRunLoop); + if (osErr != noErr) { + goto error; + } + } + unixErr = initializeXRunListenerList(); if( 0 != unixErr ) { - return UNIX_ERR(unixErr); + return UNIX_ERR(unixErr); } auhalHostApi = (PaMacAUHAL*)PaUtil_AllocateMemory( sizeof(PaMacAUHAL) ); @@ -767,7 +766,7 @@ PaError PaMacCore_Initialize( PaUtilHostApiRepresentation **hostApi, PaHostApiIn /* get the info we need about the devices */ result = gatherDeviceInfo( auhalHostApi ); if( result != paNoError ) - goto error; + goto error; *hostApi = &auhalHostApi->inheritedHostApiRep; (*hostApi)->info.structVersion = 1; @@ -777,7 +776,7 @@ PaError PaMacCore_Initialize( PaUtilHostApiRepresentation **hostApi, PaHostApiIn (*hostApi)->info.defaultInputDevice = paNoDevice; (*hostApi)->info.defaultOutputDevice = paNoDevice; - (*hostApi)->info.deviceCount = 0; + (*hostApi)->info.deviceCount = 0; if( auhalHostApi->devCount > 0 ) { @@ -802,10 +801,10 @@ PaError PaMacCore_Initialize( PaUtilHostApiRepresentation **hostApi, PaHostApiIn { int err; err = InitializeDeviceInfo( auhalHostApi, &deviceInfoArray[i], - auhalHostApi->devIds[i], - hostApiIndex ); + auhalHostApi->devIds[i], + hostApiIndex ); if (err == paNoError) - { /* copy some info and set the defaults */ + { /* copy some info and set the defaults */ (*hostApi)->deviceInfos[(*hostApi)->info.deviceCount] = &deviceInfoArray[i]; if (auhalHostApi->devIds[i] == auhalHostApi->defaultIn) (*hostApi)->info.defaultInputDevice = (*hostApi)->info.deviceCount; @@ -814,11 +813,11 @@ PaError PaMacCore_Initialize( PaUtilHostApiRepresentation **hostApi, PaHostApiIn (*hostApi)->info.deviceCount++; } else - { /* there was an error. we need to shift the devices down, so we ignore this one */ + { /* there was an error. we need to shift the devices down, so we ignore this one */ int j; auhalHostApi->devCount--; for( j=i; jdevCount; ++j ) - auhalHostApi->devIds[j] = auhalHostApi->devIds[j+1]; + auhalHostApi->devIds[j] = auhalHostApi->devIds[j+1]; i--; } } @@ -856,7 +855,7 @@ error: PaUtil_FreeAllAllocations( auhalHostApi->allocations ); PaUtil_DestroyAllocationGroup( auhalHostApi->allocations ); } - + PaUtil_FreeMemory( auhalHostApi ); } return result; @@ -873,7 +872,7 @@ static void Terminate( struct PaUtilHostApiRepresentation *hostApi ) unixErr = destroyXRunListenerList(); if( 0 != unixErr ) - UNIX_ERR(unixErr); + UNIX_ERR(unixErr); /* IMPLEMENT ME: @@ -900,12 +899,12 @@ static PaError IsFormatSupported( struct PaUtilHostApiRepresentation *hostApi, PaSampleFormat inputSampleFormat, outputSampleFormat; VVDBUG(("IsFormatSupported(): in chan=%d, in fmt=%ld, out chan=%d, out fmt=%ld sampleRate=%g\n", - inputParameters ? inputParameters->channelCount : -1, - inputParameters ? inputParameters->sampleFormat : -1, - outputParameters ? outputParameters->channelCount : -1, - outputParameters ? outputParameters->sampleFormat : -1, - (float) sampleRate )); - + inputParameters ? inputParameters->channelCount : -1, + inputParameters ? inputParameters->sampleFormat : -1, + outputParameters ? outputParameters->channelCount : -1, + outputParameters ? outputParameters->sampleFormat : -1, + (float) sampleRate )); + /** These first checks are standard PA checks. We do some fancier checks later. */ if( inputParameters ) @@ -917,7 +916,7 @@ static PaError IsFormatSupported( struct PaUtilHostApiRepresentation *hostApi, this implementation doesn't support any custom sample formats */ if( inputSampleFormat & paCustomFormat ) return paSampleFormatNotSupported; - + /* unless alternate device specification is supported, reject the use of paUseHostApiSpecificDeviceSpecification */ @@ -942,7 +941,7 @@ static PaError IsFormatSupported( struct PaUtilHostApiRepresentation *hostApi, this implementation doesn't support any custom sample formats */ if( outputSampleFormat & paCustomFormat ) return paSampleFormatNotSupported; - + /* unless alternate device specification is supported, reject the use of paUseHostApiSpecificDeviceSpecification */ @@ -958,7 +957,7 @@ static PaError IsFormatSupported( struct PaUtilHostApiRepresentation *hostApi, { outputChannelCount = 0; } - + /* FEEDBACK */ /* I think the only way to check a given format SR combo is */ /* to try opening it. This could be disruptive, is that Okay? */ @@ -969,21 +968,21 @@ static PaError IsFormatSupported( struct PaUtilHostApiRepresentation *hostApi, /* The following code opens the device with the requested parameters to see if it works. */ { - PaError err; - PaStream *s; - err = OpenStream( hostApi, &s, inputParameters, outputParameters, - sampleRate, 1024, 0, (PaStreamCallback *)1, NULL ); - if( err != paNoError && err != paInvalidSampleRate ) - DBUG( ( "OpenStream @ %g returned: %d: %s\n", - (float) sampleRate, err, Pa_GetErrorText( err ) ) ); - if( err ) - return err; - err = CloseStream( s ); - if( err ) { - /* FEEDBACK: is this more serious? should we assert? */ - DBUG( ( "WARNING: could not close Stream. %d: %s\n", - err, Pa_GetErrorText( err ) ) ); - } + PaError err; + PaStream *s; + err = OpenStream( hostApi, &s, inputParameters, outputParameters, + sampleRate, 1024, 0, (PaStreamCallback *)1, NULL ); + if( err != paNoError && err != paInvalidSampleRate ) + DBUG( ( "OpenStream @ %g returned: %d: %s\n", + (float) sampleRate, err, Pa_GetErrorText( err ) ) ); + if( err ) + return err; + err = CloseStream( s ); + if( err ) { + /* FEEDBACK: is this more serious? should we assert? */ + DBUG( ( "WARNING: could not close Stream. %d: %s\n", + err, Pa_GetErrorText( err ) ) ); + } } return paFormatIsSupported; @@ -1018,45 +1017,47 @@ static void UpdateTimeStampOffsets( PaMacCoreStream *stream ) Float64 inputHardwareLatency = 0.0; Float64 outputSoftwareLatency = 0.0; Float64 outputHardwareLatency = 0.0; - + if( stream->inputUnit != NULL ) { inputSoftwareLatency = CalculateSoftwareLatencyFromProperties( stream, &stream->inputProperties ); inputHardwareLatency = CalculateHardwareLatencyFromProperties( stream, &stream->inputProperties ); - } + } if( stream->outputUnit != NULL ) { outputSoftwareLatency = CalculateSoftwareLatencyFromProperties( stream, &stream->outputProperties ); outputHardwareLatency = CalculateHardwareLatencyFromProperties( stream, &stream->outputProperties ); - } - + } + /* We only need a mutex around setting these variables as a group. */ - pthread_mutex_lock( &stream->timingInformationMutex ); + pthread_mutex_lock( &stream->timingInformationMutex ); stream->timestampOffsetCombined = inputSoftwareLatency + outputSoftwareLatency; stream->timestampOffsetInputDevice = inputHardwareLatency; stream->timestampOffsetOutputDevice = outputHardwareLatency; - pthread_mutex_unlock( &stream->timingInformationMutex ); + pthread_mutex_unlock( &stream->timingInformationMutex ); } /* ================================================================================= */ /* can be used to update from nominal or actual sample rate */ -static OSStatus UpdateSampleRateFromDeviceProperty( PaMacCoreStream *stream, AudioDeviceID deviceID, Boolean isInput, AudioDevicePropertyID sampleRatePropertyID ) +static OSStatus UpdateSampleRateFromDeviceProperty( PaMacCoreStream *stream, AudioDeviceID deviceID, + Boolean isInput, AudioDevicePropertyID sampleRatePropertyID ) { PaMacCoreDeviceProperties * deviceProperties = isInput ? &stream->inputProperties : &stream->outputProperties; - - Float64 sampleRate = 0.0; - UInt32 propSize = sizeof(Float64); + + Float64 sampleRate = 0.0; + UInt32 propSize = sizeof(Float64); OSStatus osErr = PaMacCore_AudioDeviceGetProperty( deviceID, 0, isInput, sampleRatePropertyID, &propSize, &sampleRate); - if( (osErr == noErr) && (sampleRate > 1000.0) ) /* avoid divide by zero if there's an error */ - { + if( (osErr == noErr) && (sampleRate > 1000.0) ) /* avoid divide by zero if there's an error */ + { deviceProperties->sampleRate = sampleRate; deviceProperties->samplePeriod = 1.0 / sampleRate; } return osErr; } -static OSStatus AudioDevicePropertyActualSampleRateListenerProc(AudioObjectID inDevice, UInt32 inNumberAddresses, const AudioObjectPropertyAddress * inAddresses, void * inClientData) +static OSStatus AudioDevicePropertyActualSampleRateListenerProc( AudioObjectID inDevice, UInt32 inNumberAddresses, + const AudioObjectPropertyAddress * inAddresses, void * inClientData ) { PaMacCoreStream *stream = (PaMacCoreStream*)inClientData; bool isInput = inAddresses->mScope == kAudioDevicePropertyScopeInput; @@ -1075,17 +1076,18 @@ static OSStatus AudioDevicePropertyActualSampleRateListenerProc(AudioObjectID in /* ================================================================================= */ static OSStatus QueryUInt32DeviceProperty( AudioDeviceID deviceID, Boolean isInput, AudioDevicePropertyID propertyID, UInt32 *outValue ) { - UInt32 propertyValue = 0; - UInt32 propertySize = sizeof(UInt32); - OSStatus osErr = PaMacCore_AudioDeviceGetProperty( deviceID, 0, isInput, propertyID, &propertySize, &propertyValue); - if( osErr == noErr ) - { + UInt32 propertyValue = 0; + UInt32 propertySize = sizeof(UInt32); + OSStatus osErr = PaMacCore_AudioDeviceGetProperty( deviceID, 0, isInput, propertyID, &propertySize, &propertyValue); + if( osErr == noErr ) + { *outValue = propertyValue; - } + } return osErr; } -static OSStatus AudioDevicePropertyGenericListenerProc(AudioObjectID inDevice, UInt32 inNumberAddresses, const AudioObjectPropertyAddress * inAddresses, void * inClientData) +static OSStatus AudioDevicePropertyGenericListenerProc( AudioObjectID inDevice, UInt32 inNumberAddresses, + const AudioObjectPropertyAddress * inAddresses, void * inClientData ) { OSStatus osErr = noErr; PaMacCoreStream *stream = (PaMacCoreStream*)inClientData; @@ -1094,22 +1096,22 @@ static OSStatus AudioDevicePropertyGenericListenerProc(AudioObjectID inDevice, U // Make sure the callback is operating on a stream that is still valid! assert( stream->streamRepresentation.magic == PA_STREAM_MAGIC ); - + PaMacCoreDeviceProperties *deviceProperties = isInput ? &stream->inputProperties : &stream->outputProperties; UInt32 *valuePtr = NULL; switch( inPropertyID ) { - case kAudioDevicePropertySafetyOffset: - valuePtr = &deviceProperties->safetyOffset; - break; - - case kAudioDevicePropertyLatency: - valuePtr = &deviceProperties->deviceLatency; - break; - - case kAudioDevicePropertyBufferFrameSize: - valuePtr = &deviceProperties->bufferFrameSize; - break; + case kAudioDevicePropertySafetyOffset: + valuePtr = &deviceProperties->safetyOffset; + break; + + case kAudioDevicePropertyLatency: + valuePtr = &deviceProperties->deviceLatency; + break; + + case kAudioDevicePropertyBufferFrameSize: + valuePtr = &deviceProperties->bufferFrameSize; + break; } if( valuePtr != NULL ) { @@ -1129,23 +1131,23 @@ static OSStatus SetupDevicePropertyListeners( PaMacCoreStream *stream, AudioDevi { OSStatus osErr = noErr; PaMacCoreDeviceProperties *deviceProperties = isInput ? &stream->inputProperties : &stream->outputProperties; - + if( (osErr = QueryUInt32DeviceProperty( deviceID, isInput, - kAudioDevicePropertyLatency, &deviceProperties->deviceLatency )) != noErr ) return osErr; + kAudioDevicePropertyLatency, &deviceProperties->deviceLatency )) != noErr ) return osErr; if( (osErr = QueryUInt32DeviceProperty( deviceID, isInput, - kAudioDevicePropertyBufferFrameSize, &deviceProperties->bufferFrameSize )) != noErr ) return osErr; + kAudioDevicePropertyBufferFrameSize, &deviceProperties->bufferFrameSize )) != noErr ) return osErr; if( (osErr = QueryUInt32DeviceProperty( deviceID, isInput, - kAudioDevicePropertySafetyOffset, &deviceProperties->safetyOffset )) != noErr ) return osErr; + kAudioDevicePropertySafetyOffset, &deviceProperties->safetyOffset )) != noErr ) return osErr; PaMacCore_AudioDeviceAddPropertyListener( deviceID, 0, isInput, kAudioDevicePropertyActualSampleRate, - AudioDevicePropertyActualSampleRateListenerProc, stream ); + AudioDevicePropertyActualSampleRateListenerProc, stream ); PaMacCore_AudioDeviceAddPropertyListener( deviceID, 0, isInput, kAudioStreamPropertyLatency, - AudioDevicePropertyGenericListenerProc, stream ); + AudioDevicePropertyGenericListenerProc, stream ); PaMacCore_AudioDeviceAddPropertyListener( deviceID, 0, isInput, kAudioDevicePropertyBufferFrameSize, - AudioDevicePropertyGenericListenerProc, stream ); + AudioDevicePropertyGenericListenerProc, stream ); PaMacCore_AudioDeviceAddPropertyListener( deviceID, 0, isInput, kAudioDevicePropertySafetyOffset, - AudioDevicePropertyGenericListenerProc, stream ); + AudioDevicePropertyGenericListenerProc, stream ); return osErr; } @@ -1153,30 +1155,30 @@ static OSStatus SetupDevicePropertyListeners( PaMacCoreStream *stream, AudioDevi static void CleanupDevicePropertyListeners( PaMacCoreStream *stream, AudioDeviceID deviceID, Boolean isInput ) { PaMacCore_AudioDeviceRemovePropertyListener( deviceID, 0, isInput, kAudioDevicePropertyActualSampleRate, - AudioDevicePropertyActualSampleRateListenerProc, stream ); + AudioDevicePropertyActualSampleRateListenerProc, stream ); PaMacCore_AudioDeviceRemovePropertyListener( deviceID, 0, isInput, kAudioDevicePropertyLatency, - AudioDevicePropertyGenericListenerProc, stream ); + AudioDevicePropertyGenericListenerProc, stream ); PaMacCore_AudioDeviceRemovePropertyListener( deviceID, 0, isInput, kAudioDevicePropertyBufferFrameSize, - AudioDevicePropertyGenericListenerProc, stream ); + AudioDevicePropertyGenericListenerProc, stream ); PaMacCore_AudioDeviceRemovePropertyListener( deviceID, 0, isInput, kAudioDevicePropertySafetyOffset, - AudioDevicePropertyGenericListenerProc, stream ); + AudioDevicePropertyGenericListenerProc, stream ); } /* ================================================================================= */ static PaError OpenAndSetupOneAudioUnit( - const PaMacCoreStream *stream, - const PaStreamParameters *inStreamParams, - const PaStreamParameters *outStreamParams, - const UInt32 requestedFramesPerBuffer, - UInt32 *actualInputFramesPerBuffer, - UInt32 *actualOutputFramesPerBuffer, - const PaMacAUHAL *auhalHostApi, - AudioUnit *audioUnit, - AudioConverterRef *srConverter, - AudioDeviceID *audioDevice, - const double sampleRate, - void *refCon ) + const PaMacCoreStream *stream, + const PaStreamParameters *inStreamParams, + const PaStreamParameters *outStreamParams, + const UInt32 requestedFramesPerBuffer, + UInt32 *actualInputFramesPerBuffer, + UInt32 *actualOutputFramesPerBuffer, + const PaMacAUHAL *auhalHostApi, + AudioUnit *audioUnit, + AudioConverterRef *srConverter, + AudioDeviceID *audioDevice, + const double sampleRate, + void *refCon ) { #if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_6 AudioComponentDescription desc; @@ -1200,39 +1202,35 @@ static PaError OpenAndSetupOneAudioUnit( unsigned long outChannelMapSize = 0; VVDBUG(("OpenAndSetupOneAudioUnit(): in chan=%d, in fmt=%ld, out chan=%d, out fmt=%ld, requestedFramesPerBuffer=%ld\n", - inStreamParams ? inStreamParams->channelCount : -1, - inStreamParams ? inStreamParams->sampleFormat : -1, - outStreamParams ? outStreamParams->channelCount : -1, - outStreamParams ? outStreamParams->sampleFormat : -1, - requestedFramesPerBuffer )); + inStreamParams ? inStreamParams->channelCount : -1, + inStreamParams ? inStreamParams->sampleFormat : -1, + outStreamParams ? outStreamParams->channelCount : -1, + outStreamParams ? outStreamParams->sampleFormat : -1, + requestedFramesPerBuffer )); /* -- handle the degenerate case -- */ if( !inStreamParams && !outStreamParams ) { - *audioUnit = NULL; - *audioDevice = kAudioDeviceUnknown; - return paNoError; + *audioUnit = NULL; + *audioDevice = kAudioDeviceUnknown; + return paNoError; } /* -- get the user's api specific info, if they set any -- */ if( inStreamParams && inStreamParams->hostApiSpecificStreamInfo ) { - macInputStreamFlags= + macInputStreamFlags= ((PaMacCoreStreamInfo*)inStreamParams->hostApiSpecificStreamInfo) - ->flags; - inChannelMap = ((PaMacCoreStreamInfo*)inStreamParams->hostApiSpecificStreamInfo) - ->channelMap; - inChannelMapSize = ((PaMacCoreStreamInfo*)inStreamParams->hostApiSpecificStreamInfo) - ->channelMapSize; + ->flags; + inChannelMap = ((PaMacCoreStreamInfo*)inStreamParams->hostApiSpecificStreamInfo)->channelMap; + inChannelMapSize = ((PaMacCoreStreamInfo*)inStreamParams->hostApiSpecificStreamInfo)->channelMapSize; } if( outStreamParams && outStreamParams->hostApiSpecificStreamInfo ) { - macOutputStreamFlags= + macOutputStreamFlags= ((PaMacCoreStreamInfo*)outStreamParams->hostApiSpecificStreamInfo) - ->flags; - outChannelMap = ((PaMacCoreStreamInfo*)outStreamParams->hostApiSpecificStreamInfo) - ->channelMap; - outChannelMapSize = ((PaMacCoreStreamInfo*)outStreamParams->hostApiSpecificStreamInfo) - ->channelMapSize; + ->flags; + outChannelMap = ((PaMacCoreStreamInfo*)outStreamParams->hostApiSpecificStreamInfo)->channelMap; + outChannelMapSize = ((PaMacCoreStreamInfo*)outStreamParams->hostApiSpecificStreamInfo)->channelMapSize; } /* Override user's flags here, if desired for testing. */ @@ -1262,10 +1260,10 @@ static PaError OpenAndSetupOneAudioUnit( #endif if( !comp ) { - DBUG( ( "AUHAL component not found." ) ); - *audioUnit = NULL; - *audioDevice = kAudioDeviceUnknown; - return paUnanticipatedHostError; + DBUG( ( "AUHAL component not found." ) ); + *audioUnit = NULL; + *audioDevice = kAudioDeviceUnknown; + return paUnanticipatedHostError; } /* -- open it -- */ #if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_6 @@ -1275,10 +1273,10 @@ static PaError OpenAndSetupOneAudioUnit( #endif if( result ) { - DBUG( ( "Failed to open AUHAL component." ) ); - *audioUnit = NULL; - *audioDevice = kAudioDeviceUnknown; - return ERR( result ); + DBUG( ( "Failed to open AUHAL component." ) ); + *audioUnit = NULL; + *audioDevice = kAudioDeviceUnknown; + return ERR( result ); } /* -- prepare a little error handling logic / hackery -- */ #define ERR_WRAP(mac_err) do { result = mac_err ; line = __LINE__ ; if ( result != noErr ) goto error ; } while(0) @@ -1286,24 +1284,24 @@ static PaError OpenAndSetupOneAudioUnit( /* -- if there is input, we have to explicitly enable input -- */ if( inStreamParams ) { - UInt32 enableIO = 1; - ERR_WRAP( AudioUnitSetProperty( *audioUnit, - kAudioOutputUnitProperty_EnableIO, - kAudioUnitScope_Input, - INPUT_ELEMENT, - &enableIO, - sizeof(enableIO) ) ); + UInt32 enableIO = 1; + ERR_WRAP( AudioUnitSetProperty( *audioUnit, + kAudioOutputUnitProperty_EnableIO, + kAudioUnitScope_Input, + INPUT_ELEMENT, + &enableIO, + sizeof(enableIO) ) ); } /* -- if there is no output, we must explicitly disable output -- */ if( !outStreamParams ) { - UInt32 enableIO = 0; - ERR_WRAP( AudioUnitSetProperty( *audioUnit, - kAudioOutputUnitProperty_EnableIO, - kAudioUnitScope_Output, - OUTPUT_ELEMENT, - &enableIO, - sizeof(enableIO) ) ); + UInt32 enableIO = 0; + ERR_WRAP( AudioUnitSetProperty( *audioUnit, + kAudioOutputUnitProperty_EnableIO, + kAudioUnitScope_Output, + OUTPUT_ELEMENT, + &enableIO, + sizeof(enableIO) ) ); } /* -- set the devices -- */ @@ -1311,40 +1309,40 @@ static PaError OpenAndSetupOneAudioUnit( output. */ if( inStreamParams && outStreamParams ) { - assert( outStreamParams->device == inStreamParams->device ); + assert( outStreamParams->device == inStreamParams->device ); } if( inStreamParams ) { - *audioDevice = auhalHostApi->devIds[inStreamParams->device] ; - ERR_WRAP( AudioUnitSetProperty( *audioUnit, - kAudioOutputUnitProperty_CurrentDevice, - kAudioUnitScope_Global, - INPUT_ELEMENT, - audioDevice, - sizeof(AudioDeviceID) ) ); + *audioDevice = auhalHostApi->devIds[inStreamParams->device] ; + ERR_WRAP( AudioUnitSetProperty( *audioUnit, + kAudioOutputUnitProperty_CurrentDevice, + kAudioUnitScope_Global, + INPUT_ELEMENT, + audioDevice, + sizeof(AudioDeviceID) ) ); } if( outStreamParams && outStreamParams != inStreamParams ) { - *audioDevice = auhalHostApi->devIds[outStreamParams->device] ; - ERR_WRAP( AudioUnitSetProperty( *audioUnit, - kAudioOutputUnitProperty_CurrentDevice, - kAudioUnitScope_Global, - OUTPUT_ELEMENT, - audioDevice, - sizeof(AudioDeviceID) ) ); + *audioDevice = auhalHostApi->devIds[outStreamParams->device] ; + ERR_WRAP( AudioUnitSetProperty( *audioUnit, + kAudioOutputUnitProperty_CurrentDevice, + kAudioUnitScope_Global, + OUTPUT_ELEMENT, + audioDevice, + sizeof(AudioDeviceID) ) ); } /* -- add listener for dropouts -- */ result = PaMacCore_AudioDeviceAddPropertyListener( *audioDevice, - 0, - outStreamParams ? false : true, - kAudioDeviceProcessorOverload, - xrunCallback, - addToXRunListenerList( (void *)stream ) ) ; + 0, + outStreamParams ? false : true, + kAudioDeviceProcessorOverload, + xrunCallback, + addToXRunListenerList( (void *)stream ) ) ; if( result == kAudioHardwareIllegalOperationError ) { - // -- already registered, we're good + // -- already registered, we're good } else { - // -- not already registered, just check for errors - ERR_WRAP( result ); + // -- not already registered, just check for errors + ERR_WRAP( result ); } /* -- listen for stream start and stop -- */ ERR_WRAP( AudioUnitAddPropertyListener( *audioUnit, @@ -1362,100 +1360,100 @@ static PaError OpenAndSetupOneAudioUnit( result = 0; /* set device format first, but only touch the device if the user asked */ if( inStreamParams ) { - /*The callback never calls back if we don't set the FPB */ - /*This seems weird, because I would think setting anything on the device - would be disruptive.*/ - paResult = setBestFramesPerBuffer( *audioDevice, FALSE, - requestedFramesPerBuffer, - actualInputFramesPerBuffer ); - if( paResult ) goto error; - if( macInputStreamFlags & paMacCoreChangeDeviceParameters ) { - bool requireExact; - requireExact=macInputStreamFlags & paMacCoreFailIfConversionRequired; - paResult = setBestSampleRateForDevice( *audioDevice, FALSE, - requireExact, sampleRate ); - if( paResult ) goto error; - } - if( actualInputFramesPerBuffer && actualOutputFramesPerBuffer ) - *actualOutputFramesPerBuffer = *actualInputFramesPerBuffer ; + /*The callback never calls back if we don't set the FPB */ + /*This seems weird, because I would think setting anything on the device + would be disruptive.*/ + paResult = setBestFramesPerBuffer( *audioDevice, FALSE, + requestedFramesPerBuffer, + actualInputFramesPerBuffer ); + if( paResult ) goto error; + if( macInputStreamFlags & paMacCoreChangeDeviceParameters ) { + bool requireExact; + requireExact=macInputStreamFlags & paMacCoreFailIfConversionRequired; + paResult = setBestSampleRateForDevice( *audioDevice, FALSE, + requireExact, sampleRate ); + if( paResult ) goto error; + } + if( actualInputFramesPerBuffer && actualOutputFramesPerBuffer ) + *actualOutputFramesPerBuffer = *actualInputFramesPerBuffer ; } if( outStreamParams && !inStreamParams ) { - /*The callback never calls back if we don't set the FPB */ - /*This seems weird, because I would think setting anything on the device - would be disruptive.*/ - paResult = setBestFramesPerBuffer( *audioDevice, TRUE, - requestedFramesPerBuffer, - actualOutputFramesPerBuffer ); - if( paResult ) goto error; - if( macOutputStreamFlags & paMacCoreChangeDeviceParameters ) { - bool requireExact; - requireExact=macOutputStreamFlags & paMacCoreFailIfConversionRequired; - paResult = setBestSampleRateForDevice( *audioDevice, TRUE, - requireExact, sampleRate ); - if( paResult ) goto error; - } + /*The callback never calls back if we don't set the FPB */ + /*This seems weird, because I would think setting anything on the device + would be disruptive.*/ + paResult = setBestFramesPerBuffer( *audioDevice, TRUE, + requestedFramesPerBuffer, + actualOutputFramesPerBuffer ); + if( paResult ) goto error; + if( macOutputStreamFlags & paMacCoreChangeDeviceParameters ) { + bool requireExact; + requireExact=macOutputStreamFlags & paMacCoreFailIfConversionRequired; + paResult = setBestSampleRateForDevice( *audioDevice, TRUE, + requireExact, sampleRate ); + if( paResult ) goto error; + } } /* -- set the quality of the output converter -- */ if( outStreamParams ) { - UInt32 value = kAudioConverterQuality_Max; - switch( macOutputStreamFlags & 0x0700 ) { - case 0x0100: /*paMacCore_ConversionQualityMin:*/ - value=kRenderQuality_Min; - break; - case 0x0200: /*paMacCore_ConversionQualityLow:*/ - value=kRenderQuality_Low; - break; - case 0x0300: /*paMacCore_ConversionQualityMedium:*/ - value=kRenderQuality_Medium; - break; - case 0x0400: /*paMacCore_ConversionQualityHigh:*/ - value=kRenderQuality_High; - break; - } - ERR_WRAP( AudioUnitSetProperty( *audioUnit, - kAudioUnitProperty_RenderQuality, - kAudioUnitScope_Global, - OUTPUT_ELEMENT, - &value, - sizeof(value) ) ); + UInt32 value = kAudioConverterQuality_Max; + switch( macOutputStreamFlags & 0x0700 ) { + case 0x0100: /*paMacCore_ConversionQualityMin:*/ + value=kRenderQuality_Min; + break; + case 0x0200: /*paMacCore_ConversionQualityLow:*/ + value=kRenderQuality_Low; + break; + case 0x0300: /*paMacCore_ConversionQualityMedium:*/ + value=kRenderQuality_Medium; + break; + case 0x0400: /*paMacCore_ConversionQualityHigh:*/ + value=kRenderQuality_High; + break; + } + ERR_WRAP( AudioUnitSetProperty( *audioUnit, + kAudioUnitProperty_RenderQuality, + kAudioUnitScope_Global, + OUTPUT_ELEMENT, + &value, + sizeof(value) ) ); } /* now set the format on the Audio Units. */ if( outStreamParams ) { - desiredFormat.mSampleRate =sampleRate; - desiredFormat.mBytesPerPacket=sizeof(float)*outStreamParams->channelCount; - desiredFormat.mBytesPerFrame =sizeof(float)*outStreamParams->channelCount; - desiredFormat.mChannelsPerFrame = outStreamParams->channelCount; - ERR_WRAP( AudioUnitSetProperty( *audioUnit, - kAudioUnitProperty_StreamFormat, - kAudioUnitScope_Input, - OUTPUT_ELEMENT, - &desiredFormat, - sizeof(AudioStreamBasicDescription) ) ); + desiredFormat.mSampleRate =sampleRate; + desiredFormat.mBytesPerPacket=sizeof(float)*outStreamParams->channelCount; + desiredFormat.mBytesPerFrame =sizeof(float)*outStreamParams->channelCount; + desiredFormat.mChannelsPerFrame = outStreamParams->channelCount; + ERR_WRAP( AudioUnitSetProperty( *audioUnit, + kAudioUnitProperty_StreamFormat, + kAudioUnitScope_Input, + OUTPUT_ELEMENT, + &desiredFormat, + sizeof(AudioStreamBasicDescription) ) ); } if( inStreamParams ) { - AudioStreamBasicDescription sourceFormat; - UInt32 size = sizeof( AudioStreamBasicDescription ); + AudioStreamBasicDescription sourceFormat; + UInt32 size = sizeof( AudioStreamBasicDescription ); - /* keep the sample rate of the device, or we confuse AUHAL */ - ERR_WRAP( AudioUnitGetProperty( *audioUnit, - kAudioUnitProperty_StreamFormat, - kAudioUnitScope_Input, - INPUT_ELEMENT, - &sourceFormat, - &size ) ); - desiredFormat.mSampleRate = sourceFormat.mSampleRate; - desiredFormat.mBytesPerPacket=sizeof(float)*inStreamParams->channelCount; - desiredFormat.mBytesPerFrame =sizeof(float)*inStreamParams->channelCount; - desiredFormat.mChannelsPerFrame = inStreamParams->channelCount; - ERR_WRAP( AudioUnitSetProperty( *audioUnit, - kAudioUnitProperty_StreamFormat, - kAudioUnitScope_Output, - INPUT_ELEMENT, - &desiredFormat, - sizeof(AudioStreamBasicDescription) ) ); + /* keep the sample rate of the device, or we confuse AUHAL */ + ERR_WRAP( AudioUnitGetProperty( *audioUnit, + kAudioUnitProperty_StreamFormat, + kAudioUnitScope_Input, + INPUT_ELEMENT, + &sourceFormat, + &size ) ); + desiredFormat.mSampleRate = sourceFormat.mSampleRate; + desiredFormat.mBytesPerPacket=sizeof(float)*inStreamParams->channelCount; + desiredFormat.mBytesPerFrame =sizeof(float)*inStreamParams->channelCount; + desiredFormat.mChannelsPerFrame = inStreamParams->channelCount; + ERR_WRAP( AudioUnitSetProperty( *audioUnit, + kAudioUnitProperty_StreamFormat, + kAudioUnitScope_Output, + INPUT_ELEMENT, + &desiredFormat, + sizeof(AudioStreamBasicDescription) ) ); } /* set the maximumFramesPerSlice */ /* not doing this causes real problems @@ -1464,36 +1462,36 @@ static PaError OpenAndSetupOneAudioUnit( to actually get the frame size we requested in the callback with the minimum latency. */ if( outStreamParams ) { - UInt32 size = sizeof( *actualOutputFramesPerBuffer ); - ERR_WRAP( AudioUnitSetProperty( *audioUnit, - kAudioUnitProperty_MaximumFramesPerSlice, - kAudioUnitScope_Input, - OUTPUT_ELEMENT, - actualOutputFramesPerBuffer, - sizeof(*actualOutputFramesPerBuffer) ) ); - ERR_WRAP( AudioUnitGetProperty( *audioUnit, - kAudioUnitProperty_MaximumFramesPerSlice, - kAudioUnitScope_Global, - OUTPUT_ELEMENT, - actualOutputFramesPerBuffer, - &size ) ); + UInt32 size = sizeof( *actualOutputFramesPerBuffer ); + ERR_WRAP( AudioUnitSetProperty( *audioUnit, + kAudioUnitProperty_MaximumFramesPerSlice, + kAudioUnitScope_Input, + OUTPUT_ELEMENT, + actualOutputFramesPerBuffer, + sizeof(*actualOutputFramesPerBuffer) ) ); + ERR_WRAP( AudioUnitGetProperty( *audioUnit, + kAudioUnitProperty_MaximumFramesPerSlice, + kAudioUnitScope_Global, + OUTPUT_ELEMENT, + actualOutputFramesPerBuffer, + &size ) ); } if( inStreamParams ) { - /*UInt32 size = sizeof( *actualInputFramesPerBuffer );*/ - ERR_WRAP( AudioUnitSetProperty( *audioUnit, - kAudioUnitProperty_MaximumFramesPerSlice, - kAudioUnitScope_Output, - INPUT_ELEMENT, - actualInputFramesPerBuffer, - sizeof(*actualInputFramesPerBuffer) ) ); -/* Don't know why this causes problems - ERR_WRAP( AudioUnitGetProperty( *audioUnit, - kAudioUnitProperty_MaximumFramesPerSlice, - kAudioUnitScope_Global, //Output, - INPUT_ELEMENT, - actualInputFramesPerBuffer, - &size ) ); -*/ + /*UInt32 size = sizeof( *actualInputFramesPerBuffer );*/ + ERR_WRAP( AudioUnitSetProperty( *audioUnit, + kAudioUnitProperty_MaximumFramesPerSlice, + kAudioUnitScope_Output, + INPUT_ELEMENT, + actualInputFramesPerBuffer, + sizeof(*actualInputFramesPerBuffer) ) ); + /* Don't know why this causes problems + ERR_WRAP( AudioUnitGetProperty( *audioUnit, + kAudioUnitProperty_MaximumFramesPerSlice, + kAudioUnitScope_Global, //Output, + INPUT_ELEMENT, + actualInputFramesPerBuffer, + &size ) ); + */ } /* -- if we have input, we may need to setup an SR converter -- */ @@ -1501,83 +1499,78 @@ static PaError OpenAndSetupOneAudioUnit( the conversion in case another program changes the underlying SR. */ /* FIXME: I think we need to monitor stream and change the converter if the incoming format changes. */ if( inStreamParams ) { - AudioStreamBasicDescription desiredFormat; - AudioStreamBasicDescription sourceFormat; - UInt32 sourceSize = sizeof( sourceFormat ); - bzero( &desiredFormat, sizeof(desiredFormat) ); - desiredFormat.mSampleRate = sampleRate; - desiredFormat.mFormatID = kAudioFormatLinearPCM ; - desiredFormat.mFormatFlags = kAudioFormatFlagsNativeFloatPacked; - desiredFormat.mFramesPerPacket = 1; - desiredFormat.mBitsPerChannel = sizeof( float ) * 8; - desiredFormat.mBytesPerPacket=sizeof(float)*inStreamParams->channelCount; - desiredFormat.mBytesPerFrame =sizeof(float)*inStreamParams->channelCount; - desiredFormat.mChannelsPerFrame = inStreamParams->channelCount; + AudioStreamBasicDescription desiredFormat; + AudioStreamBasicDescription sourceFormat; + UInt32 sourceSize = sizeof( sourceFormat ); + bzero( &desiredFormat, sizeof(desiredFormat) ); + desiredFormat.mSampleRate = sampleRate; + desiredFormat.mFormatID = kAudioFormatLinearPCM ; + desiredFormat.mFormatFlags = kAudioFormatFlagsNativeFloatPacked; + desiredFormat.mFramesPerPacket = 1; + desiredFormat.mBitsPerChannel = sizeof( float ) * 8; + desiredFormat.mBytesPerPacket=sizeof(float)*inStreamParams->channelCount; + desiredFormat.mBytesPerFrame =sizeof(float)*inStreamParams->channelCount; + desiredFormat.mChannelsPerFrame = inStreamParams->channelCount; - /* get the source format */ - ERR_WRAP( AudioUnitGetProperty( - *audioUnit, - kAudioUnitProperty_StreamFormat, - kAudioUnitScope_Output, - INPUT_ELEMENT, - &sourceFormat, - &sourceSize ) ); + /* get the source format */ + ERR_WRAP( AudioUnitGetProperty( *audioUnit, + kAudioUnitProperty_StreamFormat, + kAudioUnitScope_Output, + INPUT_ELEMENT, + &sourceFormat, + &sourceSize ) ); - if( desiredFormat.mSampleRate != sourceFormat.mSampleRate ) - { - UInt32 value = kAudioConverterQuality_Max; - switch( macInputStreamFlags & 0x0700 ) { - case 0x0100: /*paMacCore_ConversionQualityMin:*/ - value=kAudioConverterQuality_Min; - break; - case 0x0200: /*paMacCore_ConversionQualityLow:*/ - value=kAudioConverterQuality_Low; - break; - case 0x0300: /*paMacCore_ConversionQualityMedium:*/ - value=kAudioConverterQuality_Medium; - break; - case 0x0400: /*paMacCore_ConversionQualityHigh:*/ - value=kAudioConverterQuality_High; - break; - } - VDBUG(( "Creating sample rate converter for input" - " to convert from %g to %g\n", - (float)sourceFormat.mSampleRate, - (float)desiredFormat.mSampleRate ) ); - /* create our converter */ - ERR_WRAP( AudioConverterNew( - &sourceFormat, - &desiredFormat, - srConverter ) ); - /* Set quality */ - ERR_WRAP( AudioConverterSetProperty( - *srConverter, - kAudioConverterSampleRateConverterQuality, - sizeof( value ), - &value ) ); - } + if( desiredFormat.mSampleRate != sourceFormat.mSampleRate ) + { + UInt32 value = kAudioConverterQuality_Max; + switch( macInputStreamFlags & 0x0700 ) { + case 0x0100: /*paMacCore_ConversionQualityMin:*/ + value=kAudioConverterQuality_Min; + break; + case 0x0200: /*paMacCore_ConversionQualityLow:*/ + value=kAudioConverterQuality_Low; + break; + case 0x0300: /*paMacCore_ConversionQualityMedium:*/ + value=kAudioConverterQuality_Medium; + break; + case 0x0400: /*paMacCore_ConversionQualityHigh:*/ + value=kAudioConverterQuality_High; + break; + } + VDBUG(( "Creating sample rate converter for input" + " to convert from %g to %g\n", + (float)sourceFormat.mSampleRate, + (float)desiredFormat.mSampleRate ) ); + /* create our converter */ + ERR_WRAP( AudioConverterNew( &sourceFormat, + &desiredFormat, + srConverter ) ); + /* Set quality */ + ERR_WRAP( AudioConverterSetProperty( *srConverter, + kAudioConverterSampleRateConverterQuality, + sizeof( value ), + &value ) ); + } } /* -- set IOProc (callback) -- */ callbackKey = outStreamParams ? kAudioUnitProperty_SetRenderCallback - : kAudioOutputUnitProperty_SetInputCallback ; + : kAudioOutputUnitProperty_SetInputCallback ; rcbs.inputProc = AudioIOProc; rcbs.inputProcRefCon = refCon; - ERR_WRAP( AudioUnitSetProperty( - *audioUnit, - callbackKey, - kAudioUnitScope_Output, - outStreamParams ? OUTPUT_ELEMENT : INPUT_ELEMENT, - &rcbs, - sizeof(rcbs)) ); + ERR_WRAP( AudioUnitSetProperty( *audioUnit, + callbackKey, + kAudioUnitScope_Output, + outStreamParams ? OUTPUT_ELEMENT : INPUT_ELEMENT, + &rcbs, + sizeof(rcbs)) ); if( inStreamParams && outStreamParams && *srConverter ) - ERR_WRAP( AudioUnitSetProperty( - *audioUnit, - kAudioOutputUnitProperty_SetInputCallback, - kAudioUnitScope_Output, - INPUT_ELEMENT, - &rcbs, - sizeof(rcbs)) ); + ERR_WRAP( AudioUnitSetProperty( *audioUnit, + kAudioOutputUnitProperty_SetInputCallback, + kAudioUnitScope_Output, + INPUT_ELEMENT, + &rcbs, + sizeof(rcbs)) ); /* channel mapping. */ if(inChannelMap) @@ -1586,12 +1579,12 @@ static PaError OpenAndSetupOneAudioUnit( //for each channel of desired input, map the channel from //the device's output channel. - ERR_WRAP( AudioUnitSetProperty(*audioUnit, - kAudioOutputUnitProperty_ChannelMap, - kAudioUnitScope_Output, - INPUT_ELEMENT, - inChannelMap, - mapSize)); + ERR_WRAP( AudioUnitSetProperty( *audioUnit, + kAudioOutputUnitProperty_ChannelMap, + kAudioUnitScope_Output, + INPUT_ELEMENT, + inChannelMap, + mapSize) ); } if(outChannelMap) { @@ -1599,12 +1592,12 @@ static PaError OpenAndSetupOneAudioUnit( //for each channel of desired output, map the channel from //the device's output channel. - ERR_WRAP(AudioUnitSetProperty(*audioUnit, - kAudioOutputUnitProperty_ChannelMap, - kAudioUnitScope_Output, - OUTPUT_ELEMENT, - outChannelMap, - mapSize)); + ERR_WRAP(AudioUnitSetProperty( *audioUnit, + kAudioOutputUnitProperty_ChannelMap, + kAudioUnitScope_Output, + OUTPUT_ELEMENT, + outChannelMap, + mapSize) ); } /* initialize the audio unit */ ERR_WRAP( AudioUnitInitialize(*audioUnit) ); @@ -1624,30 +1617,30 @@ static PaError OpenAndSetupOneAudioUnit( return paNoError; #undef ERR_WRAP - error: +error: #if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_6 - AudioComponentInstanceDispose( *audioUnit ); + AudioComponentInstanceDispose( *audioUnit ); #else - CloseComponent( *audioUnit ); + CloseComponent( *audioUnit ); #endif - *audioUnit = NULL; - if( result ) - return PaMacCore_SetError( result, line, 1 ); - return paResult; + *audioUnit = NULL; + if( result ) + return PaMacCore_SetError( result, line, 1 ); + return paResult; } /* =================================================================================================== */ static UInt32 CalculateOptimalBufferSize( PaMacAUHAL *auhalHostApi, - const PaStreamParameters *inputParameters, - const PaStreamParameters *outputParameters, - UInt32 fixedInputLatency, - UInt32 fixedOutputLatency, - double sampleRate, - UInt32 requestedFramesPerBuffer ) + const PaStreamParameters *inputParameters, + const PaStreamParameters *outputParameters, + UInt32 fixedInputLatency, + UInt32 fixedOutputLatency, + double sampleRate, + UInt32 requestedFramesPerBuffer ) { - UInt32 resultBufferSizeFrames = 0; + UInt32 resultBufferSizeFrames = 0; // Use maximum of suggested input and output latencies. if( inputParameters ) { @@ -1655,46 +1648,46 @@ static UInt32 CalculateOptimalBufferSize( PaMacAUHAL *auhalHostApi, // Calculate a buffer size assuming we are double buffered. SInt32 variableLatencyFrames = suggestedLatencyFrames - fixedInputLatency; // Prevent negative latency. - variableLatencyFrames = MAX( variableLatencyFrames, 0 ); + variableLatencyFrames = MAX( variableLatencyFrames, 0 ); resultBufferSizeFrames = MAX( resultBufferSizeFrames, (UInt32) variableLatencyFrames ); } if( outputParameters ) - { + { UInt32 suggestedLatencyFrames = outputParameters->suggestedLatency * sampleRate; SInt32 variableLatencyFrames = suggestedLatencyFrames - fixedOutputLatency; variableLatencyFrames = MAX( variableLatencyFrames, 0 ); resultBufferSizeFrames = MAX( resultBufferSizeFrames, (UInt32) variableLatencyFrames ); } - + // can't have zero frames. code to round up to next user buffer requires non-zero resultBufferSizeFrames = MAX( resultBufferSizeFrames, 1 ); - + if( requestedFramesPerBuffer != paFramesPerBufferUnspecified ) { // make host buffer the next highest integer multiple of user frames per buffer UInt32 n = (resultBufferSizeFrames + requestedFramesPerBuffer - 1) / requestedFramesPerBuffer; resultBufferSizeFrames = n * requestedFramesPerBuffer; - + // FIXME: really we should be searching for a multiple of requestedFramesPerBuffer // that is >= suggested latency and also fits within device buffer min/max - - }else{ - VDBUG( ("Block Size unspecified. Based on Latency, the user wants a Block Size near: %ld.\n", - (long)resultBufferSizeFrames ) ); + + } else { + VDBUG( ("Block Size unspecified. Based on Latency, the user wants a Block Size near: %ld.\n", + (long)resultBufferSizeFrames ) ); } - + // Clip to the capabilities of the device. if( inputParameters ) { ClipToDeviceBufferSize( auhalHostApi->devIds[inputParameters->device], - true, // In the old code isInput was false! - resultBufferSizeFrames, &resultBufferSizeFrames ); + true, // In the old code isInput was false! + resultBufferSizeFrames, &resultBufferSizeFrames ); } if( outputParameters ) { ClipToDeviceBufferSize( auhalHostApi->devIds[outputParameters->device], - false, resultBufferSizeFrames, &resultBufferSizeFrames ); + false, resultBufferSizeFrames, &resultBufferSizeFrames ); } VDBUG(("After querying hardware, setting block size to %ld.\n", (long)resultBufferSizeFrames)); @@ -1725,28 +1718,28 @@ static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi, UInt32 inputLatencyFrames = 0; UInt32 outputLatencyFrames = 0; UInt32 suggestedLatencyFramesPerBuffer = requestedFramesPerBuffer; - + VVDBUG(("OpenStream(): in chan=%d, in fmt=%ld, out chan=%d, out fmt=%ld SR=%g, FPB=%ld\n", - inputParameters ? inputParameters->channelCount : -1, - inputParameters ? inputParameters->sampleFormat : -1, - outputParameters ? outputParameters->channelCount : -1, - outputParameters ? outputParameters->sampleFormat : -1, - (float) sampleRate, - requestedFramesPerBuffer )); + inputParameters ? inputParameters->channelCount : -1, + inputParameters ? inputParameters->sampleFormat : -1, + outputParameters ? outputParameters->channelCount : -1, + outputParameters ? outputParameters->sampleFormat : -1, + (float) sampleRate, + requestedFramesPerBuffer )); VDBUG( ("Opening Stream.\n") ); - + /* These first few bits of code are from paSkeleton with few modifications. */ if( inputParameters ) { inputChannelCount = inputParameters->channelCount; inputSampleFormat = inputParameters->sampleFormat; - /* @todo Blocking read/write on Mac is not yet supported. */ - if( !streamCallback && inputSampleFormat & paNonInterleaved ) - { - return paSampleFormatNotSupported; - } - + /* @todo Blocking read/write on Mac is not yet supported. */ + if( !streamCallback && inputSampleFormat & paNonInterleaved ) + { + return paSampleFormatNotSupported; + } + /* unless alternate device specification is supported, reject the use of paUseHostApiSpecificDeviceSpecification */ @@ -1770,13 +1763,13 @@ static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi, { outputChannelCount = outputParameters->channelCount; outputSampleFormat = outputParameters->sampleFormat; - - /* @todo Blocking read/write on Mac is not yet supported. */ - if( !streamCallback && outputSampleFormat & paNonInterleaved ) - { - return paSampleFormatNotSupported; - } - + + /* @todo Blocking read/write on Mac is not yet supported. */ + if( !streamCallback && outputSampleFormat & paNonInterleaved ) + { + return paSampleFormatNotSupported; + } + /* unless alternate device specification is supported, reject the use of paUseHostApiSpecificDeviceSpecification */ @@ -1813,7 +1806,7 @@ static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi, been touched. */ bzero( stream, sizeof( PaMacCoreStream ) ); - + /* stream->blio.inputRingBuffer.buffer = NULL; stream->blio.outputRingBuffer.buffer = NULL; @@ -1827,223 +1820,223 @@ static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi, if( streamCallback ) { PaUtil_InitializeStreamRepresentation( &stream->streamRepresentation, - &auhalHostApi->callbackStreamInterface, - streamCallback, userData ); + &auhalHostApi->callbackStreamInterface, + streamCallback, userData ); } else { PaUtil_InitializeStreamRepresentation( &stream->streamRepresentation, - &auhalHostApi->blockingStreamInterface, - BlioCallback, &stream->blio ); + &auhalHostApi->blockingStreamInterface, + BlioCallback, &stream->blio ); } PaUtil_InitializeCpuLoadMeasurer( &stream->cpuLoadMeasurer, sampleRate ); - + if( inputParameters ) { CalculateFixedDeviceLatency( auhalHostApi->devIds[inputParameters->device], true, &fixedInputLatency ); inputLatencyFrames += fixedInputLatency; } if( outputParameters ) - { + { CalculateFixedDeviceLatency( auhalHostApi->devIds[outputParameters->device], false, &fixedOutputLatency ); outputLatencyFrames += fixedOutputLatency; } - + suggestedLatencyFramesPerBuffer = CalculateOptimalBufferSize( auhalHostApi, inputParameters, outputParameters, - fixedInputLatency, fixedOutputLatency, - sampleRate, requestedFramesPerBuffer ); + fixedInputLatency, fixedOutputLatency, + sampleRate, requestedFramesPerBuffer ); if( requestedFramesPerBuffer == paFramesPerBufferUnspecified ) - { + { requestedFramesPerBuffer = suggestedLatencyFramesPerBuffer; } /* -- Now we actually open and setup streams. -- */ if( inputParameters && outputParameters && outputParameters->device == inputParameters->device ) - { /* full duplex. One device. */ - UInt32 inputFramesPerBuffer = (UInt32) stream->inputFramesPerBuffer; - UInt32 outputFramesPerBuffer = (UInt32) stream->outputFramesPerBuffer; - result = OpenAndSetupOneAudioUnit( stream, - inputParameters, - outputParameters, - suggestedLatencyFramesPerBuffer, - &inputFramesPerBuffer, - &outputFramesPerBuffer, - auhalHostApi, - &(stream->inputUnit), - &(stream->inputSRConverter), - &(stream->inputDevice), - sampleRate, - stream ); - stream->inputFramesPerBuffer = inputFramesPerBuffer; - stream->outputFramesPerBuffer = outputFramesPerBuffer; - stream->outputUnit = stream->inputUnit; - stream->outputDevice = stream->inputDevice; - if( result != paNoError ) - goto error; + { /* full duplex. One device. */ + UInt32 inputFramesPerBuffer = (UInt32) stream->inputFramesPerBuffer; + UInt32 outputFramesPerBuffer = (UInt32) stream->outputFramesPerBuffer; + result = OpenAndSetupOneAudioUnit( stream, + inputParameters, + outputParameters, + suggestedLatencyFramesPerBuffer, + &inputFramesPerBuffer, + &outputFramesPerBuffer, + auhalHostApi, + &(stream->inputUnit), + &(stream->inputSRConverter), + &(stream->inputDevice), + sampleRate, + stream ); + stream->inputFramesPerBuffer = inputFramesPerBuffer; + stream->outputFramesPerBuffer = outputFramesPerBuffer; + stream->outputUnit = stream->inputUnit; + stream->outputDevice = stream->inputDevice; + if( result != paNoError ) + goto error; } else - { /* full duplex, different devices OR simplex */ - UInt32 outputFramesPerBuffer = (UInt32) stream->outputFramesPerBuffer; - UInt32 inputFramesPerBuffer = (UInt32) stream->inputFramesPerBuffer; - result = OpenAndSetupOneAudioUnit( stream, - NULL, - outputParameters, - suggestedLatencyFramesPerBuffer, - NULL, - &outputFramesPerBuffer, - auhalHostApi, - &(stream->outputUnit), - NULL, - &(stream->outputDevice), - sampleRate, - stream ); - if( result != paNoError ) - goto error; - result = OpenAndSetupOneAudioUnit( stream, - inputParameters, - NULL, - suggestedLatencyFramesPerBuffer, - &inputFramesPerBuffer, - NULL, - auhalHostApi, - &(stream->inputUnit), - &(stream->inputSRConverter), - &(stream->inputDevice), - sampleRate, - stream ); - if( result != paNoError ) - goto error; - stream->inputFramesPerBuffer = inputFramesPerBuffer; - stream->outputFramesPerBuffer = outputFramesPerBuffer; + { /* full duplex, different devices OR simplex */ + UInt32 outputFramesPerBuffer = (UInt32) stream->outputFramesPerBuffer; + UInt32 inputFramesPerBuffer = (UInt32) stream->inputFramesPerBuffer; + result = OpenAndSetupOneAudioUnit( stream, + NULL, + outputParameters, + suggestedLatencyFramesPerBuffer, + NULL, + &outputFramesPerBuffer, + auhalHostApi, + &(stream->outputUnit), + NULL, + &(stream->outputDevice), + sampleRate, + stream ); + if( result != paNoError ) + goto error; + result = OpenAndSetupOneAudioUnit( stream, + inputParameters, + NULL, + suggestedLatencyFramesPerBuffer, + &inputFramesPerBuffer, + NULL, + auhalHostApi, + &(stream->inputUnit), + &(stream->inputSRConverter), + &(stream->inputDevice), + sampleRate, + stream ); + if( result != paNoError ) + goto error; + stream->inputFramesPerBuffer = inputFramesPerBuffer; + stream->outputFramesPerBuffer = outputFramesPerBuffer; } - + inputLatencyFrames += stream->inputFramesPerBuffer; outputLatencyFrames += stream->outputFramesPerBuffer; - + if( stream->inputUnit ) { - const size_t szfl = sizeof(float); - /* setup the AudioBufferList used for input */ - bzero( &stream->inputAudioBufferList, sizeof( AudioBufferList ) ); - stream->inputAudioBufferList.mNumberBuffers = 1; - stream->inputAudioBufferList.mBuffers[0].mNumberChannels - = inputChannelCount; - stream->inputAudioBufferList.mBuffers[0].mDataByteSize - = stream->inputFramesPerBuffer*inputChannelCount*szfl; - stream->inputAudioBufferList.mBuffers[0].mData - = (float *) calloc( - stream->inputFramesPerBuffer*inputChannelCount, - szfl ); - if( !stream->inputAudioBufferList.mBuffers[0].mData ) - { - result = paInsufficientMemory; - goto error; - } - - /* - * If input and output devs are different or we are doing SR conversion, - * we also need a ring buffer to store input data while waiting for - * output data. - */ - if( (stream->outputUnit && (stream->inputUnit != stream->outputUnit)) - || stream->inputSRConverter ) - { - /* May want the ringSize or initial position in - ring buffer to depend somewhat on sample rate change */ + const size_t szfl = sizeof(float); + /* setup the AudioBufferList used for input */ + bzero( &stream->inputAudioBufferList, sizeof( AudioBufferList ) ); + stream->inputAudioBufferList.mNumberBuffers = 1; + stream->inputAudioBufferList.mBuffers[0].mNumberChannels + = inputChannelCount; + stream->inputAudioBufferList.mBuffers[0].mDataByteSize + = stream->inputFramesPerBuffer*inputChannelCount*szfl; + stream->inputAudioBufferList.mBuffers[0].mData + = (float *) calloc( + stream->inputFramesPerBuffer*inputChannelCount, + szfl ); + if( !stream->inputAudioBufferList.mBuffers[0].mData ) + { + result = paInsufficientMemory; + goto error; + } - void *data; - long ringSize; + /* + * If input and output devs are different or we are doing SR conversion, + * we also need a ring buffer to store input data while waiting for + * output data. + */ + if( (stream->outputUnit && (stream->inputUnit != stream->outputUnit)) + || stream->inputSRConverter ) + { + /* May want the ringSize or initial position in + ring buffer to depend somewhat on sample rate change */ - ringSize = computeRingBufferSize( inputParameters, - outputParameters, - stream->inputFramesPerBuffer, - stream->outputFramesPerBuffer, - sampleRate ); - /*ringSize <<= 4; *//*16x bigger, for testing */ + void *data; + long ringSize; + + ringSize = computeRingBufferSize( inputParameters, + outputParameters, + stream->inputFramesPerBuffer, + stream->outputFramesPerBuffer, + sampleRate ); + /*ringSize <<= 4; *//*16x bigger, for testing */ - /*now, we need to allocate memory for the ring buffer*/ - data = calloc( ringSize, szfl*inputParameters->channelCount ); - if( !data ) - { - result = paInsufficientMemory; - goto error; - } + /*now, we need to allocate memory for the ring buffer*/ + data = calloc( ringSize, szfl*inputParameters->channelCount ); + if( !data ) + { + result = paInsufficientMemory; + goto error; + } - /* now we can initialize the ring buffer */ - result = PaUtil_InitializeRingBuffer( &stream->inputRingBuffer, szfl*inputParameters->channelCount, ringSize, data ); - if( result != 0 ) - { - /* The only reason this should fail is if ringSize is not a power of 2, which we do not anticipate happening. */ - result = paUnanticipatedHostError; - free(data); - goto error; - } + /* now we can initialize the ring buffer */ + result = PaUtil_InitializeRingBuffer( &stream->inputRingBuffer, szfl*inputParameters->channelCount, ringSize, data ); + if( result != 0 ) + { + /* The only reason this should fail is if ringSize is not a power of 2, which we do not anticipate happening. */ + result = paUnanticipatedHostError; + free(data); + goto error; + } - /* advance the read point a little, so we are reading from the - middle of the buffer */ - if( stream->outputUnit ) - PaUtil_AdvanceRingBufferWriteIndex( &stream->inputRingBuffer, ringSize / RING_BUFFER_ADVANCE_DENOMINATOR ); - - // Just adds to input latency between input device and PA full duplex callback. - inputLatencyFrames += ringSize; - } + /* advance the read point a little, so we are reading from the + middle of the buffer */ + if( stream->outputUnit ) + PaUtil_AdvanceRingBufferWriteIndex( &stream->inputRingBuffer, ringSize / RING_BUFFER_ADVANCE_DENOMINATOR ); + + // Just adds to input latency between input device and PA full duplex callback. + inputLatencyFrames += ringSize; + } } /* -- initialize Blio Buffer Processors -- */ if( !streamCallback ) { - long ringSize; + long ringSize; + + ringSize = computeRingBufferSize( inputParameters, + outputParameters, + stream->inputFramesPerBuffer, + stream->outputFramesPerBuffer, + sampleRate ); + result = initializeBlioRingBuffers( &stream->blio, + inputParameters ? inputParameters->sampleFormat : 0, + outputParameters ? outputParameters->sampleFormat : 0, + ringSize, + inputParameters ? inputChannelCount : 0, + outputParameters ? outputChannelCount : 0 ); + if( result != paNoError ) + goto error; - ringSize = computeRingBufferSize( inputParameters, - outputParameters, - stream->inputFramesPerBuffer, - stream->outputFramesPerBuffer, - sampleRate ); - result = initializeBlioRingBuffers( &stream->blio, - inputParameters ? inputParameters->sampleFormat : 0, - outputParameters ? outputParameters->sampleFormat : 0, - ringSize, - inputParameters ? inputChannelCount : 0, - outputParameters ? outputChannelCount : 0 ) ; - if( result != paNoError ) - goto error; - inputLatencyFrames += ringSize; outputLatencyFrames += ringSize; - + } /* -- initialize Buffer Processor -- */ { - unsigned long maxHostFrames = stream->inputFramesPerBuffer; - if( stream->outputFramesPerBuffer > maxHostFrames ) - maxHostFrames = stream->outputFramesPerBuffer; - result = PaUtil_InitializeBufferProcessor( &stream->bufferProcessor, - inputChannelCount, inputSampleFormat, - hostInputSampleFormat, - outputChannelCount, outputSampleFormat, - hostOutputSampleFormat, - sampleRate, - streamFlags, - requestedFramesPerBuffer, - /* If sample rate conversion takes place, the buffer size - will not be known. */ - maxHostFrames, - stream->inputSRConverter - ? paUtilUnknownHostBufferSize - : paUtilBoundedHostBufferSize, - streamCallback ? streamCallback : BlioCallback, - streamCallback ? userData : &stream->blio ); - if( result != paNoError ) - goto error; + unsigned long maxHostFrames = stream->inputFramesPerBuffer; + if( stream->outputFramesPerBuffer > maxHostFrames ) + maxHostFrames = stream->outputFramesPerBuffer; + result = PaUtil_InitializeBufferProcessor( &stream->bufferProcessor, + inputChannelCount, inputSampleFormat, + hostInputSampleFormat, + outputChannelCount, outputSampleFormat, + hostOutputSampleFormat, + sampleRate, + streamFlags, + requestedFramesPerBuffer, + /* If sample rate conversion takes place, the buffer size + will not be known. */ + maxHostFrames, + stream->inputSRConverter + ? paUtilUnknownHostBufferSize + : paUtilBoundedHostBufferSize, + streamCallback ? streamCallback : BlioCallback, + streamCallback ? userData : &stream->blio ); + if( result != paNoError ) + goto error; } stream->bufferProcessorIsInitialized = TRUE; // Calculate actual latency from the sum of individual latencies. - if( inputParameters ) + if( inputParameters ) { inputLatencyFrames += PaUtil_GetBufferProcessorInputLatencyFrames(&stream->bufferProcessor); stream->streamRepresentation.streamInfo.inputLatency = inputLatencyFrames / sampleRate; @@ -2052,8 +2045,8 @@ static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi, { stream->streamRepresentation.streamInfo.inputLatency = 0.0; } - - if( outputParameters ) + + if( outputParameters ) { outputLatencyFrames += PaUtil_GetBufferProcessorOutputLatencyFrames(&stream->bufferProcessor); stream->streamRepresentation.streamInfo.outputLatency = outputLatencyFrames / sampleRate; @@ -2062,49 +2055,49 @@ static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi, { stream->streamRepresentation.streamInfo.outputLatency = 0.0; } - + stream->streamRepresentation.streamInfo.sampleRate = sampleRate; stream->sampleRate = sampleRate; - + stream->userInChan = inputChannelCount; stream->userOutChan = outputChannelCount; // Setup property listeners for timestamp and latency calculations. - pthread_mutex_init( &stream->timingInformationMutex, NULL ); - stream->timingInformationMutexIsInitialized = 1; + pthread_mutex_init( &stream->timingInformationMutex, NULL ); + stream->timingInformationMutexIsInitialized = 1; InitializeDeviceProperties( &stream->inputProperties ); // zeros the struct. doesn't actually init it to useful values InitializeDeviceProperties( &stream->outputProperties ); // zeros the struct. doesn't actually init it to useful values - if( stream->outputUnit ) + if( stream->outputUnit ) { Boolean isInput = FALSE; - + // Start with the current values for the device properties. // Init with nominal sample rate. Use actual sample rate where available - - result = ERR( UpdateSampleRateFromDeviceProperty( - stream, stream->outputDevice, isInput, kAudioDevicePropertyNominalSampleRate ) ); + + result = ERR( UpdateSampleRateFromDeviceProperty( + stream, stream->outputDevice, isInput, kAudioDevicePropertyNominalSampleRate ) ); if( result ) goto error; /* fail if we can't even get a nominal device sample rate */ - + UpdateSampleRateFromDeviceProperty( stream, stream->outputDevice, isInput, kAudioDevicePropertyActualSampleRate ); - + SetupDevicePropertyListeners( stream, stream->outputDevice, isInput ); } - if( stream->inputUnit ) + if( stream->inputUnit ) { Boolean isInput = TRUE; - + // as above - result = ERR( UpdateSampleRateFromDeviceProperty( - stream, stream->inputDevice, isInput, kAudioDevicePropertyNominalSampleRate ) ); + result = ERR( UpdateSampleRateFromDeviceProperty( + stream, stream->inputDevice, isInput, kAudioDevicePropertyNominalSampleRate ) ); if( result ) goto error; - + UpdateSampleRateFromDeviceProperty( stream, stream->inputDevice, isInput, kAudioDevicePropertyActualSampleRate ); - + SetupDevicePropertyListeners( stream, stream->inputDevice, isInput ); - } + } UpdateTimeStampOffsets( stream ); // Setup timestamp copies to be used by audio callback. stream->timestampOffsetCombined_ioProcCopy = stream->timestampOffsetCombined; @@ -2128,7 +2121,7 @@ error: PaTime GetStreamTime( PaStream *s ) { - return HOST_TIME_TO_PA_TIME( AudioGetCurrentHostTime() ); + return HOST_TIME_TO_PA_TIME( AudioGetCurrentHostTime() ); } #define RING_BUFFER_EMPTY (1000) @@ -2140,37 +2133,37 @@ static OSStatus ringBufferIOProc( AudioStreamPacketDescription** outDataPacketDescription, void* inUserData) { - VVDBUG(("ringBufferIOProc()\n")); + VVDBUG(("ringBufferIOProc()\n")); - PaUtilRingBuffer *rb = (PaUtilRingBuffer *) inUserData; + PaUtilRingBuffer *rb = (PaUtilRingBuffer *) inUserData; - if( PaUtil_GetRingBufferReadAvailable( rb ) == 0 ) { - ioData->mBuffers[0].mData = NULL; - ioData->mBuffers[0].mDataByteSize = 0; - *ioNumberDataPackets = 0; - VVDBUG(("Ring buffer empty!\n")); - return RING_BUFFER_EMPTY; - } + if( PaUtil_GetRingBufferReadAvailable( rb ) == 0 ) { + ioData->mBuffers[0].mData = NULL; + ioData->mBuffers[0].mDataByteSize = 0; + *ioNumberDataPackets = 0; + VVDBUG(("Ring buffer empty!\n")); + return RING_BUFFER_EMPTY; + } - UInt32 packetSize = sizeof(float) * ioData->mBuffers[0].mNumberChannels; - UInt32 dataSize = *ioNumberDataPackets * packetSize; - assert(dataSize % rb->elementSizeBytes == 0); - UInt32 rbElements = dataSize / rb->elementSizeBytes; - ring_buffer_size_t rbElementsRead = rbElements; - void *dummyData; - ring_buffer_size_t dummySize; - PaUtil_GetRingBufferReadRegions( rb, rbElements, - &ioData->mBuffers[0].mData, &rbElementsRead, - &dummyData, &dummySize ); - assert(rbElementsRead > 0); - VVDBUG(("RingBuffer read elements %u of %u\n", rbElementsRead, rbElements)); - PaUtil_AdvanceRingBufferReadIndex( rb, rbElementsRead ); + UInt32 packetSize = sizeof(float) * ioData->mBuffers[0].mNumberChannels; + UInt32 dataSize = *ioNumberDataPackets * packetSize; + assert(dataSize % rb->elementSizeBytes == 0); + UInt32 rbElements = dataSize / rb->elementSizeBytes; + ring_buffer_size_t rbElementsRead = rbElements; + void *dummyData; + ring_buffer_size_t dummySize; + PaUtil_GetRingBufferReadRegions( rb, rbElements, + &ioData->mBuffers[0].mData, &rbElementsRead, + &dummyData, &dummySize ); + assert(rbElementsRead > 0); + VVDBUG(("RingBuffer read elements %u of %u\n", rbElementsRead, rbElements)); + PaUtil_AdvanceRingBufferReadIndex( rb, rbElementsRead ); - UInt32 bytesRead = rbElementsRead * rb->elementSizeBytes; - ioData->mBuffers[0].mDataByteSize = bytesRead; - *ioNumberDataPackets = bytesRead / packetSize; + UInt32 bytesRead = rbElementsRead * rb->elementSizeBytes; + ioData->mBuffers[0].mDataByteSize = bytesRead; + *ioNumberDataPackets = bytesRead / packetSize; - return noErr; + return noErr; } /* @@ -2179,446 +2172,446 @@ static OSStatus ringBufferIOProc( */ /* FEEDBACK: there is a lot of redundant code here because of how all the cases differ. This makes it hard to maintain, so if there are suggestinos for cleaning it up, I'm all ears. */ static OSStatus AudioIOProc( void *inRefCon, - AudioUnitRenderActionFlags *ioActionFlags, - const AudioTimeStamp *inTimeStamp, - UInt32 inBusNumber, - UInt32 inNumberFrames, - AudioBufferList *ioData ) + AudioUnitRenderActionFlags *ioActionFlags, + const AudioTimeStamp *inTimeStamp, + UInt32 inBusNumber, + UInt32 inNumberFrames, + AudioBufferList *ioData ) { - unsigned long framesProcessed = 0; - PaStreamCallbackTimeInfo timeInfo = {0,0,0}; - PaMacCoreStream *stream = (PaMacCoreStream*)inRefCon; - const bool isRender = inBusNumber == OUTPUT_ELEMENT; - int callbackResult = paContinue ; - double hostTimeStampInPaTime = HOST_TIME_TO_PA_TIME(inTimeStamp->mHostTime); - - VVDBUG(("AudioIOProc()\n")); + unsigned long framesProcessed = 0; + PaStreamCallbackTimeInfo timeInfo = {0,0,0}; + PaMacCoreStream *stream = (PaMacCoreStream*)inRefCon; + const bool isRender = inBusNumber == OUTPUT_ELEMENT; + int callbackResult = paContinue ; + double hostTimeStampInPaTime = HOST_TIME_TO_PA_TIME(inTimeStamp->mHostTime); - PaUtil_BeginCpuLoadMeasurement( &stream->cpuLoadMeasurer ); - - /* -----------------------------------------------------------------*\ - This output may be useful for debugging, - But printing during the callback is a bad enough idea that - this is not enabled by enabling the usual debugging calls. - \* -----------------------------------------------------------------*/ - /* - static int renderCount = 0; - static int inputCount = 0; - printf( "------------------- starting render/input\n" ); - if( isRender ) - printf("Render callback (%d):\t", ++renderCount); - else - printf("Input callback (%d):\t", ++inputCount); - printf( "Call totals: %d (input), %d (render)\n", inputCount, renderCount ); + VVDBUG(("AudioIOProc()\n")); - printf( "--- inBusNumber: %lu\n", inBusNumber ); - printf( "--- inNumberFrames: %lu\n", inNumberFrames ); - printf( "--- %x ioData\n", (unsigned) ioData ); - if( ioData ) - { - int i=0; - printf( "--- ioData.mNumBuffers %lu: \n", ioData->mNumberBuffers ); - for( i=0; imNumberBuffers; ++i ) - printf( "--- ioData buffer %d size: %lu.\n", i, ioData->mBuffers[i].mDataByteSize ); - } - ----------------------------------------------------------------- */ + PaUtil_BeginCpuLoadMeasurement( &stream->cpuLoadMeasurer ); - /* compute PaStreamCallbackTimeInfo */ - - if( pthread_mutex_trylock( &stream->timingInformationMutex ) == 0 ){ - /* snapshot the ioproc copy of timing information */ - stream->timestampOffsetCombined_ioProcCopy = stream->timestampOffsetCombined; - stream->timestampOffsetInputDevice_ioProcCopy = stream->timestampOffsetInputDevice; - stream->timestampOffsetOutputDevice_ioProcCopy = stream->timestampOffsetOutputDevice; - pthread_mutex_unlock( &stream->timingInformationMutex ); - } - - /* For timeInfo.currentTime we could calculate current time backwards from the HAL audio - output time to give a more accurate impression of the current timeslice but it doesn't - seem worth it at the moment since other PA host APIs don't do any better. - */ - timeInfo.currentTime = HOST_TIME_TO_PA_TIME( AudioGetCurrentHostTime() ); - - /* - For an input HAL AU, inTimeStamp is the time the samples are received from the hardware, - for an output HAL AU inTimeStamp is the time the samples are sent to the hardware. - PA expresses timestamps in terms of when the samples enter the ADC or leave the DAC - so we add or subtract kAudioDevicePropertyLatency below. - */ - - /* FIXME: not sure what to do below if the host timestamps aren't valid (kAudioTimeStampHostTimeValid isn't set) - Could ask on CA mailing list if it is possible for it not to be set. If so, could probably grab a now timestamp - at the top and compute from there (modulo scheduling jitter) or ask on mailing list for other options. */ - - if( isRender ) - { - if( stream->inputUnit ) /* full duplex */ - { - if( stream->inputUnit == stream->outputUnit ) /* full duplex AUHAL IOProc */ - { + /* -----------------------------------------------------------------*\ + This output may be useful for debugging, + But printing during the callback is a bad enough idea that + this is not enabled by enabling the usual debugging calls. + \* -----------------------------------------------------------------*/ + /* + static int renderCount = 0; + static int inputCount = 0; + printf( "------------------- starting render/input\n" ); + if( isRender ) + printf("Render callback (%d):\t", ++renderCount); + else + printf("Input callback (%d):\t", ++inputCount); + printf( "Call totals: %d (input), %d (render)\n", inputCount, renderCount ); + + printf( "--- inBusNumber: %lu\n", inBusNumber ); + printf( "--- inNumberFrames: %lu\n", inNumberFrames ); + printf( "--- %x ioData\n", (unsigned) ioData ); + if( ioData ) + { + int i=0; + printf( "--- ioData.mNumBuffers %lu: \n", ioData->mNumberBuffers ); + for( i=0; imNumberBuffers; ++i ) + printf( "--- ioData buffer %d size: %lu.\n", i, ioData->mBuffers[i].mDataByteSize ); + } + ----------------------------------------------------------------- */ + + /* compute PaStreamCallbackTimeInfo */ + + if( pthread_mutex_trylock( &stream->timingInformationMutex ) == 0 ) { + /* snapshot the ioproc copy of timing information */ + stream->timestampOffsetCombined_ioProcCopy = stream->timestampOffsetCombined; + stream->timestampOffsetInputDevice_ioProcCopy = stream->timestampOffsetInputDevice; + stream->timestampOffsetOutputDevice_ioProcCopy = stream->timestampOffsetOutputDevice; + pthread_mutex_unlock( &stream->timingInformationMutex ); + } + + /* For timeInfo.currentTime we could calculate current time backwards from the HAL audio + output time to give a more accurate impression of the current timeslice but it doesn't + seem worth it at the moment since other PA host APIs don't do any better. + */ + timeInfo.currentTime = HOST_TIME_TO_PA_TIME( AudioGetCurrentHostTime() ); + + /* + For an input HAL AU, inTimeStamp is the time the samples are received from the hardware, + for an output HAL AU inTimeStamp is the time the samples are sent to the hardware. + PA expresses timestamps in terms of when the samples enter the ADC or leave the DAC + so we add or subtract kAudioDevicePropertyLatency below. + */ + + /* FIXME: not sure what to do below if the host timestamps aren't valid (kAudioTimeStampHostTimeValid isn't set) + Could ask on CA mailing list if it is possible for it not to be set. If so, could probably grab a now timestamp + at the top and compute from there (modulo scheduling jitter) or ask on mailing list for other options. */ + + if( isRender ) + { + if( stream->inputUnit ) /* full duplex */ + { + if( stream->inputUnit == stream->outputUnit ) /* full duplex AUHAL IOProc */ + { // Ross and Phil agreed that the following calculation is correct based on an email from Jeff Moore: // http://osdir.com/ml/coreaudio-api/2009-07/msg00140.html // Basically the difference between the Apple output timestamp and the PA timestamp is kAudioDevicePropertyLatency. - timeInfo.inputBufferAdcTime = hostTimeStampInPaTime - - (stream->timestampOffsetCombined_ioProcCopy + stream->timestampOffsetInputDevice_ioProcCopy); - timeInfo.outputBufferDacTime = hostTimeStampInPaTime + stream->timestampOffsetOutputDevice_ioProcCopy; - } - else /* full duplex with ring-buffer from a separate input AUHAL ioproc */ - { - /* FIXME: take the ring buffer latency into account */ - timeInfo.inputBufferAdcTime = hostTimeStampInPaTime - - (stream->timestampOffsetCombined_ioProcCopy + stream->timestampOffsetInputDevice_ioProcCopy); - timeInfo.outputBufferDacTime = hostTimeStampInPaTime + stream->timestampOffsetOutputDevice_ioProcCopy; - } - } - else /* output only */ - { - timeInfo.inputBufferAdcTime = 0; - timeInfo.outputBufferDacTime = hostTimeStampInPaTime + stream->timestampOffsetOutputDevice_ioProcCopy; - } - } - else /* input only */ - { - timeInfo.inputBufferAdcTime = hostTimeStampInPaTime - stream->timestampOffsetInputDevice_ioProcCopy; - timeInfo.outputBufferDacTime = 0; - } - - //printf( "---%g, %g, %g\n", timeInfo.inputBufferAdcTime, timeInfo.currentTime, timeInfo.outputBufferDacTime ); - - if( isRender && stream->inputUnit == stream->outputUnit - && !stream->inputSRConverter ) - { - /* --------- Full Duplex, One Device, no SR Conversion ------- - * - * This is the lowest latency case, and also the simplest. - * Input data and output data are available at the same time. - * we do not use the input SR converter or the input ring buffer. - * - */ - OSStatus err = 0; - unsigned long frames; - long bytesPerFrame = sizeof( float ) * ioData->mBuffers[0].mNumberChannels; - - /* -- start processing -- */ - PaUtil_BeginBufferProcessing( &(stream->bufferProcessor), - &timeInfo, - stream->xrunFlags ); - stream->xrunFlags = 0; //FIXME: this flag also gets set outside by a callback, which calls the xrunCallback function. It should be in the same thread as the main audio callback, but the apple docs just use the word "usually" so it may be possible to loose an xrun notification, if that callback happens here. - - /* -- compute frames. do some checks -- */ - assert( ioData->mNumberBuffers == 1 ); - assert( ioData->mBuffers[0].mNumberChannels == stream->userOutChan ); - - frames = ioData->mBuffers[0].mDataByteSize / bytesPerFrame; - /* -- copy and process input data -- */ - err= AudioUnitRender(stream->inputUnit, - ioActionFlags, - inTimeStamp, - INPUT_ELEMENT, - inNumberFrames, - &stream->inputAudioBufferList ); - if(err != noErr) - { - goto stop_stream; - } - - PaUtil_SetInputFrameCount( &(stream->bufferProcessor), frames ); - PaUtil_SetInterleavedInputChannels( &(stream->bufferProcessor), - 0, - stream->inputAudioBufferList.mBuffers[0].mData, - stream->inputAudioBufferList.mBuffers[0].mNumberChannels); - /* -- Copy and process output data -- */ - PaUtil_SetOutputFrameCount( &(stream->bufferProcessor), frames ); - PaUtil_SetInterleavedOutputChannels( &(stream->bufferProcessor), - 0, - ioData->mBuffers[0].mData, - ioData->mBuffers[0].mNumberChannels); - /* -- complete processing -- */ - framesProcessed = - PaUtil_EndBufferProcessing( &(stream->bufferProcessor), - &callbackResult ); - } - else if( isRender ) - { - /* -------- Output Side of Full Duplex (Separate Devices or SR Conversion) - * -- OR Simplex Output - * - * This case handles output data as in the full duplex case, - * and, if there is input data, reads it off the ring buffer - * and into the PA buffer processor. If sample rate conversion - * is required on input, that is done here as well. - */ - unsigned long frames; - long bytesPerFrame = sizeof( float ) * ioData->mBuffers[0].mNumberChannels; - - /* Sometimes, when stopping a duplex stream we get erroneous - xrun flags, so if this is our last run, clear the flags. */ - int xrunFlags = stream->xrunFlags; -/* - if( xrunFlags & paInputUnderflow ) - printf( "input underflow.\n" ); - if( xrunFlags & paInputOverflow ) - printf( "input overflow.\n" ); -*/ - if( stream->state == STOPPING || stream->state == CALLBACK_STOPPED ) - xrunFlags = 0; - - /* -- start processing -- */ - PaUtil_BeginBufferProcessing( &(stream->bufferProcessor), - &timeInfo, - xrunFlags ); - stream->xrunFlags = 0; /* FEEDBACK: we only send flags to Buf Proc once */ - - /* -- Copy and process output data -- */ - assert( ioData->mNumberBuffers == 1 ); - frames = ioData->mBuffers[0].mDataByteSize / bytesPerFrame; - assert( ioData->mBuffers[0].mNumberChannels == stream->userOutChan ); - PaUtil_SetOutputFrameCount( &(stream->bufferProcessor), frames ); - PaUtil_SetInterleavedOutputChannels( &(stream->bufferProcessor), - 0, - ioData->mBuffers[0].mData, - ioData->mBuffers[0].mNumberChannels); - - /* -- copy and process input data, and complete processing -- */ - if( stream->inputUnit ) { - const int flsz = sizeof( float ); - /* Here, we read the data out of the ring buffer, through the - audio converter. */ - int inChan = stream->inputAudioBufferList.mBuffers[0].mNumberChannels; - long bytesPerFrame = flsz * inChan; - - if( stream->inputSRConverter ) - { - OSStatus err; - float data[ inChan * frames ]; - AudioBufferList bufferList; - bufferList.mNumberBuffers = 1; - bufferList.mBuffers[0].mNumberChannels = inChan; - bufferList.mBuffers[0].mDataByteSize = sizeof( data ); - bufferList.mBuffers[0].mData = data; - UInt32 packets = frames; - err = AudioConverterFillComplexBuffer( - stream->inputSRConverter, - ringBufferIOProc, - &stream->inputRingBuffer, - &packets, - &bufferList, - NULL); - if( err == RING_BUFFER_EMPTY ) - { /* the ring buffer callback underflowed */ - err = 0; - UInt32 size = packets * bytesPerFrame; - bzero( ((char *)data) + size, sizeof(data)-size ); - /* The ring buffer can underflow normally when the stream is stopping. - * So only report an error if the stream is active. */ - if( stream->state == ACTIVE ) - { - stream->xrunFlags |= paInputUnderflow; - } - } - ERR( err ); - if(err != noErr) - { - goto stop_stream; - } - - PaUtil_SetInputFrameCount( &(stream->bufferProcessor), frames ); - PaUtil_SetInterleavedInputChannels( &(stream->bufferProcessor), - 0, - data, - inChan ); - framesProcessed = - PaUtil_EndBufferProcessing( &(stream->bufferProcessor), - &callbackResult ); - } - else - { - /* Without the AudioConverter is actually a bit more complex - because we have to do a little buffer processing that the - AudioConverter would otherwise handle for us. */ - void *data1, *data2; - ring_buffer_size_t size1, size2; - ring_buffer_size_t framesReadable = PaUtil_GetRingBufferReadRegions( &stream->inputRingBuffer, - frames, - &data1, &size1, - &data2, &size2 ); - if( size1 == frames ) { - /* simplest case: all in first buffer */ - PaUtil_SetInputFrameCount( &(stream->bufferProcessor), frames ); - PaUtil_SetInterleavedInputChannels( &(stream->bufferProcessor), - 0, - data1, - inChan ); - framesProcessed = - PaUtil_EndBufferProcessing( &(stream->bufferProcessor), - &callbackResult ); - PaUtil_AdvanceRingBufferReadIndex(&stream->inputRingBuffer, size1 ); - } else if( framesReadable < frames ) { - - long sizeBytes1 = size1 * bytesPerFrame; - long sizeBytes2 = size2 * bytesPerFrame; - /*we underflowed. take what data we can, zero the rest.*/ - unsigned char data[ frames * bytesPerFrame ]; - if( size1 > 0 ) - { - memcpy( data, data1, sizeBytes1 ); - } - if( size2 > 0 ) - { - memcpy( data+sizeBytes1, data2, sizeBytes2 ); - } - bzero( data+sizeBytes1+sizeBytes2, (frames*bytesPerFrame) - sizeBytes1 - sizeBytes2 ); - - PaUtil_SetInputFrameCount( &(stream->bufferProcessor), frames ); - PaUtil_SetInterleavedInputChannels( &(stream->bufferProcessor), - 0, - data, - inChan ); - framesProcessed = - PaUtil_EndBufferProcessing( &(stream->bufferProcessor), - &callbackResult ); - PaUtil_AdvanceRingBufferReadIndex( &stream->inputRingBuffer, - framesReadable ); - /* flag underflow */ - stream->xrunFlags |= paInputUnderflow; - } else { - /*we got all the data, but split between buffers*/ - PaUtil_SetInputFrameCount( &(stream->bufferProcessor), size1 ); - PaUtil_SetInterleavedInputChannels( &(stream->bufferProcessor), - 0, - data1, - inChan ); - PaUtil_Set2ndInputFrameCount( &(stream->bufferProcessor), size2 ); - PaUtil_Set2ndInterleavedInputChannels( &(stream->bufferProcessor), - 0, - data2, - inChan ); - framesProcessed = - PaUtil_EndBufferProcessing( &(stream->bufferProcessor), - &callbackResult ); - PaUtil_AdvanceRingBufferReadIndex(&stream->inputRingBuffer, framesReadable ); + timeInfo.inputBufferAdcTime = hostTimeStampInPaTime - + (stream->timestampOffsetCombined_ioProcCopy + stream->timestampOffsetInputDevice_ioProcCopy); + timeInfo.outputBufferDacTime = hostTimeStampInPaTime + stream->timestampOffsetOutputDevice_ioProcCopy; } - } - } else { - framesProcessed = - PaUtil_EndBufferProcessing( &(stream->bufferProcessor), - &callbackResult ); - } + else /* full duplex with ring-buffer from a separate input AUHAL ioproc */ + { + /* FIXME: take the ring buffer latency into account */ + timeInfo.inputBufferAdcTime = hostTimeStampInPaTime - + (stream->timestampOffsetCombined_ioProcCopy + stream->timestampOffsetInputDevice_ioProcCopy); + timeInfo.outputBufferDacTime = hostTimeStampInPaTime + stream->timestampOffsetOutputDevice_ioProcCopy; + } + } + else /* output only */ + { + timeInfo.inputBufferAdcTime = 0; + timeInfo.outputBufferDacTime = hostTimeStampInPaTime + stream->timestampOffsetOutputDevice_ioProcCopy; + } + } + else /* input only */ + { + timeInfo.inputBufferAdcTime = hostTimeStampInPaTime - stream->timestampOffsetInputDevice_ioProcCopy; + timeInfo.outputBufferDacTime = 0; + } - } - else - { - /* ------------------ Input - * - * First, we read off the audio data and put it in the ring buffer. - * if this is an input-only stream, we need to process it more, - * otherwise, we let the output case deal with it. - */ - OSStatus err = 0; - int chan = stream->inputAudioBufferList.mBuffers[0].mNumberChannels ; - /* FIXME: looping here may not actually be necessary, but it was something I tried in testing. */ - do { - err= AudioUnitRender(stream->inputUnit, - ioActionFlags, - inTimeStamp, - INPUT_ELEMENT, - inNumberFrames, - &stream->inputAudioBufferList ); - if( err == -10874 ) - inNumberFrames /= 2; - } while( err == -10874 && inNumberFrames > 1 ); - ERR( err ); - if(err != noErr) - { - goto stop_stream; - } + //printf( "---%g, %g, %g\n", timeInfo.inputBufferAdcTime, timeInfo.currentTime, timeInfo.outputBufferDacTime ); - if( stream->inputSRConverter || stream->outputUnit ) - { - /* If this is duplex or we use a converter, put the data - into the ring buffer. */ - ring_buffer_size_t framesWritten = PaUtil_WriteRingBuffer( &stream->inputRingBuffer, + if( isRender && stream->inputUnit == stream->outputUnit + && !stream->inputSRConverter ) + { + /* --------- Full Duplex, One Device, no SR Conversion ------- + * + * This is the lowest latency case, and also the simplest. + * Input data and output data are available at the same time. + * we do not use the input SR converter or the input ring buffer. + * + */ + OSStatus err = 0; + unsigned long frames; + long bytesPerFrame = sizeof( float ) * ioData->mBuffers[0].mNumberChannels; + + /* -- start processing -- */ + PaUtil_BeginBufferProcessing( &(stream->bufferProcessor), + &timeInfo, + stream->xrunFlags ); + stream->xrunFlags = 0; //FIXME: this flag also gets set outside by a callback, which calls the xrunCallback function. It should be in the same thread as the main audio callback, but the apple docs just use the word "usually" so it may be possible to loose an xrun notification, if that callback happens here. + + /* -- compute frames. do some checks -- */ + assert( ioData->mNumberBuffers == 1 ); + assert( ioData->mBuffers[0].mNumberChannels == stream->userOutChan ); + + frames = ioData->mBuffers[0].mDataByteSize / bytesPerFrame; + /* -- copy and process input data -- */ + err= AudioUnitRender( stream->inputUnit, + ioActionFlags, + inTimeStamp, + INPUT_ELEMENT, + inNumberFrames, + &stream->inputAudioBufferList ); + if(err != noErr) + { + goto stop_stream; + } + + PaUtil_SetInputFrameCount( &(stream->bufferProcessor), frames ); + PaUtil_SetInterleavedInputChannels( &(stream->bufferProcessor), + 0, stream->inputAudioBufferList.mBuffers[0].mData, - inNumberFrames ); - if( framesWritten != inNumberFrames ) - { - stream->xrunFlags |= paInputOverflow ; - } - } - else - { - /* for simplex input w/o SR conversion, - just pop the data into the buffer processor.*/ - PaUtil_BeginBufferProcessing( &(stream->bufferProcessor), - &timeInfo, - stream->xrunFlags ); - stream->xrunFlags = 0; + stream->inputAudioBufferList.mBuffers[0].mNumberChannels ); + /* -- Copy and process output data -- */ + PaUtil_SetOutputFrameCount( &(stream->bufferProcessor), frames ); + PaUtil_SetInterleavedOutputChannels( &(stream->bufferProcessor), + 0, + ioData->mBuffers[0].mData, + ioData->mBuffers[0].mNumberChannels ); + /* -- complete processing -- */ + framesProcessed = + PaUtil_EndBufferProcessing( &(stream->bufferProcessor), + &callbackResult ); + } + else if( isRender ) + { + /* -------- Output Side of Full Duplex (Separate Devices or SR Conversion) + * -- OR Simplex Output + * + * This case handles output data as in the full duplex case, + * and, if there is input data, reads it off the ring buffer + * and into the PA buffer processor. If sample rate conversion + * is required on input, that is done here as well. + */ + unsigned long frames; + long bytesPerFrame = sizeof( float ) * ioData->mBuffers[0].mNumberChannels; - PaUtil_SetInputFrameCount( &(stream->bufferProcessor), inNumberFrames); - PaUtil_SetInterleavedInputChannels( &(stream->bufferProcessor), - 0, - stream->inputAudioBufferList.mBuffers[0].mData, - chan ); - framesProcessed = - PaUtil_EndBufferProcessing( &(stream->bufferProcessor), - &callbackResult ); - } - if( !stream->outputUnit && stream->inputSRConverter ) - { - /* ------------------ Simplex Input w/ SR Conversion - * - * if this is a simplex input stream, we need to read off the buffer, - * do our sample rate conversion and pass the results to the buffer - * processor. - * The logic here is complicated somewhat by the fact that we don't - * know how much data is available, so we loop on reasonably sized - * chunks, and let the BufferProcessor deal with the rest. - * - */ - /* This might be too big or small depending on SR conversion. */ - float data[ chan * inNumberFrames ]; - OSStatus err; - do - { /* Run the buffer processor until we are out of data. */ - AudioBufferList bufferList; - bufferList.mNumberBuffers = 1; - bufferList.mBuffers[0].mNumberChannels = chan; - bufferList.mBuffers[0].mDataByteSize = sizeof( data ); - bufferList.mBuffers[0].mData = data; - UInt32 packets = inNumberFrames; - err = AudioConverterFillComplexBuffer( - stream->inputSRConverter, - ringBufferIOProc, - &stream->inputRingBuffer, - &packets, - &bufferList, - NULL); - if( err != RING_BUFFER_EMPTY ) - ERR( err ); - if( err != noErr && err != RING_BUFFER_EMPTY ) + /* Sometimes, when stopping a duplex stream we get erroneous + xrun flags, so if this is our last run, clear the flags. */ + int xrunFlags = stream->xrunFlags; + /* + if( xrunFlags & paInputUnderflow ) + printf( "input underflow.\n" ); + if( xrunFlags & paInputOverflow ) + printf( "input overflow.\n" ); + */ + if( stream->state == STOPPING || stream->state == CALLBACK_STOPPED ) + xrunFlags = 0; + + /* -- start processing -- */ + PaUtil_BeginBufferProcessing( &(stream->bufferProcessor), + &timeInfo, + xrunFlags ); + stream->xrunFlags = 0; /* FEEDBACK: we only send flags to Buf Proc once */ + + /* -- Copy and process output data -- */ + assert( ioData->mNumberBuffers == 1 ); + frames = ioData->mBuffers[0].mDataByteSize / bytesPerFrame; + assert( ioData->mBuffers[0].mNumberChannels == stream->userOutChan ); + PaUtil_SetOutputFrameCount( &(stream->bufferProcessor), frames ); + PaUtil_SetInterleavedOutputChannels( &(stream->bufferProcessor), + 0, + ioData->mBuffers[0].mData, + ioData->mBuffers[0].mNumberChannels ); + + /* -- copy and process input data, and complete processing -- */ + if( stream->inputUnit ) { + const int flsz = sizeof( float ); + /* Here, we read the data out of the ring buffer, through the + audio converter. */ + int inChan = stream->inputAudioBufferList.mBuffers[0].mNumberChannels; + long bytesPerFrame = flsz * inChan; + + if( stream->inputSRConverter ) { - goto stop_stream; - } + OSStatus err; + float data[ inChan * frames ]; + AudioBufferList bufferList; + bufferList.mNumberBuffers = 1; + bufferList.mBuffers[0].mNumberChannels = inChan; + bufferList.mBuffers[0].mDataByteSize = sizeof( data ); + bufferList.mBuffers[0].mData = data; + UInt32 packets = frames; + err = AudioConverterFillComplexBuffer( + stream->inputSRConverter, + ringBufferIOProc, + &stream->inputRingBuffer, + &packets, + &bufferList, + NULL); + if( err == RING_BUFFER_EMPTY ) + { /* the ring buffer callback underflowed */ + err = 0; + UInt32 size = packets * bytesPerFrame; + bzero( ((char *)data) + size, sizeof(data)-size ); + /* The ring buffer can underflow normally when the stream is stopping. + * So only report an error if the stream is active. */ + if( stream->state == ACTIVE ) + { + stream->xrunFlags |= paInputUnderflow; + } + } + ERR( err ); + if(err != noErr) + { + goto stop_stream; + } - PaUtil_SetInputFrameCount( &(stream->bufferProcessor), packets ); - if( packets > 0 ) - { - PaUtil_BeginBufferProcessing( &(stream->bufferProcessor), - &timeInfo, - stream->xrunFlags ); - stream->xrunFlags = 0; - - PaUtil_SetInterleavedInputChannels( &(stream->bufferProcessor), - 0, - data, - chan ); - framesProcessed = + PaUtil_SetInputFrameCount( &(stream->bufferProcessor), frames ); + PaUtil_SetInterleavedInputChannels( &(stream->bufferProcessor), + 0, + data, + inChan ); + framesProcessed = PaUtil_EndBufferProcessing( &(stream->bufferProcessor), &callbackResult ); } - } while( callbackResult == paContinue && !err ); - } - } + else + { + /* Without the AudioConverter is actually a bit more complex + because we have to do a little buffer processing that the + AudioConverter would otherwise handle for us. */ + void *data1, *data2; + ring_buffer_size_t size1, size2; + ring_buffer_size_t framesReadable = PaUtil_GetRingBufferReadRegions( &stream->inputRingBuffer, + frames, + &data1, &size1, + &data2, &size2 ); + if( size1 == frames ) { + /* simplest case: all in first buffer */ + PaUtil_SetInputFrameCount( &(stream->bufferProcessor), frames ); + PaUtil_SetInterleavedInputChannels( &(stream->bufferProcessor), + 0, + data1, + inChan ); + framesProcessed = + PaUtil_EndBufferProcessing( &(stream->bufferProcessor), + &callbackResult ); + PaUtil_AdvanceRingBufferReadIndex(&stream->inputRingBuffer, size1 ); + } else if( framesReadable < frames ) { + + long sizeBytes1 = size1 * bytesPerFrame; + long sizeBytes2 = size2 * bytesPerFrame; + /*we underflowed. take what data we can, zero the rest.*/ + unsigned char data[ frames * bytesPerFrame ]; + if( size1 > 0 ) + { + memcpy( data, data1, sizeBytes1 ); + } + if( size2 > 0 ) + { + memcpy( data+sizeBytes1, data2, sizeBytes2 ); + } + bzero( data+sizeBytes1+sizeBytes2, (frames*bytesPerFrame) - sizeBytes1 - sizeBytes2 ); + + PaUtil_SetInputFrameCount( &(stream->bufferProcessor), frames ); + PaUtil_SetInterleavedInputChannels( &(stream->bufferProcessor), + 0, + data, + inChan ); + framesProcessed = + PaUtil_EndBufferProcessing( &(stream->bufferProcessor), + &callbackResult ); + PaUtil_AdvanceRingBufferReadIndex( &stream->inputRingBuffer, + framesReadable ); + /* flag underflow */ + stream->xrunFlags |= paInputUnderflow; + } else { + /*we got all the data, but split between buffers*/ + PaUtil_SetInputFrameCount( &(stream->bufferProcessor), size1 ); + PaUtil_SetInterleavedInputChannels( &(stream->bufferProcessor), + 0, + data1, + inChan ); + PaUtil_Set2ndInputFrameCount( &(stream->bufferProcessor), size2 ); + PaUtil_Set2ndInterleavedInputChannels( &(stream->bufferProcessor), + 0, + data2, + inChan ); + framesProcessed = + PaUtil_EndBufferProcessing( &(stream->bufferProcessor), + &callbackResult ); + PaUtil_AdvanceRingBufferReadIndex(&stream->inputRingBuffer, framesReadable ); + } + } + } else { + framesProcessed = + PaUtil_EndBufferProcessing( &(stream->bufferProcessor), + &callbackResult ); + } + + } + else + { + /* ------------------ Input + * + * First, we read off the audio data and put it in the ring buffer. + * if this is an input-only stream, we need to process it more, + * otherwise, we let the output case deal with it. + */ + OSStatus err = 0; + int chan = stream->inputAudioBufferList.mBuffers[0].mNumberChannels ; + /* FIXME: looping here may not actually be necessary, but it was something I tried in testing. */ + do { + err= AudioUnitRender( stream->inputUnit, + ioActionFlags, + inTimeStamp, + INPUT_ELEMENT, + inNumberFrames, + &stream->inputAudioBufferList ); + if( err == -10874 ) + inNumberFrames /= 2; + } while( err == -10874 && inNumberFrames > 1 ); + ERR( err ); + if(err != noErr) + { + goto stop_stream; + } + + if( stream->inputSRConverter || stream->outputUnit ) + { + /* If this is duplex or we use a converter, put the data + into the ring buffer. */ + ring_buffer_size_t framesWritten = PaUtil_WriteRingBuffer( &stream->inputRingBuffer, + stream->inputAudioBufferList.mBuffers[0].mData, + inNumberFrames ); + if( framesWritten != inNumberFrames ) + { + stream->xrunFlags |= paInputOverflow ; + } + } + else + { + /* for simplex input w/o SR conversion, + just pop the data into the buffer processor.*/ + PaUtil_BeginBufferProcessing( &(stream->bufferProcessor), + &timeInfo, + stream->xrunFlags ); + stream->xrunFlags = 0; + + PaUtil_SetInputFrameCount( &(stream->bufferProcessor), inNumberFrames); + PaUtil_SetInterleavedInputChannels( &(stream->bufferProcessor), + 0, + stream->inputAudioBufferList.mBuffers[0].mData, + chan ); + framesProcessed = + PaUtil_EndBufferProcessing( &(stream->bufferProcessor), + &callbackResult ); + } + if( !stream->outputUnit && stream->inputSRConverter ) + { + /* ------------------ Simplex Input w/ SR Conversion + * + * if this is a simplex input stream, we need to read off the buffer, + * do our sample rate conversion and pass the results to the buffer + * processor. + * The logic here is complicated somewhat by the fact that we don't + * know how much data is available, so we loop on reasonably sized + * chunks, and let the BufferProcessor deal with the rest. + * + */ + /* This might be too big or small depending on SR conversion. */ + float data[ chan * inNumberFrames ]; + OSStatus err; + do + { /* Run the buffer processor until we are out of data. */ + AudioBufferList bufferList; + bufferList.mNumberBuffers = 1; + bufferList.mBuffers[0].mNumberChannels = chan; + bufferList.mBuffers[0].mDataByteSize = sizeof( data ); + bufferList.mBuffers[0].mData = data; + UInt32 packets = inNumberFrames; + err = AudioConverterFillComplexBuffer( + stream->inputSRConverter, + ringBufferIOProc, + &stream->inputRingBuffer, + &packets, + &bufferList, + NULL); + if( err != RING_BUFFER_EMPTY ) + ERR( err ); + if( err != noErr && err != RING_BUFFER_EMPTY ) + { + goto stop_stream; + } + + PaUtil_SetInputFrameCount( &(stream->bufferProcessor), packets ); + if( packets > 0 ) + { + PaUtil_BeginBufferProcessing( &(stream->bufferProcessor), + &timeInfo, + stream->xrunFlags ); + stream->xrunFlags = 0; + + PaUtil_SetInterleavedInputChannels( &(stream->bufferProcessor), + 0, + data, + chan ); + framesProcessed = + PaUtil_EndBufferProcessing( &(stream->bufferProcessor), + &callbackResult ); + } + } while( callbackResult == paContinue && !err ); + } + } // Should we return successfully or fall through to stopping the stream? if( callbackResult == paContinue ) @@ -2653,79 +2646,79 @@ static PaError CloseStream( PaStream* s ) VDBUG( ( "Closing stream.\n" ) ); if( stream ) { - - if( stream->outputUnit ) + + if( stream->outputUnit ) { Boolean isInput = FALSE; CleanupDevicePropertyListeners( stream, stream->outputDevice, isInput ); - } - - if( stream->inputUnit ) + } + + if( stream->inputUnit ) { Boolean isInput = TRUE; CleanupDevicePropertyListeners( stream, stream->inputDevice, isInput ); - } - - if( stream->outputUnit ) { - int count = removeFromXRunListenerList( stream ); - if( count == 0 ) - PaMacCore_AudioDeviceRemovePropertyListener( stream->outputDevice, - 0, - false, - kAudioDeviceProcessorOverload, - xrunCallback, NULL ); //no need to pass actual node - } - if( stream->inputUnit && stream->outputUnit != stream->inputUnit ) { - int count = removeFromXRunListenerList( stream ); - if( count == 0 ) - PaMacCore_AudioDeviceRemovePropertyListener( stream->inputDevice, - 0, - true, - kAudioDeviceProcessorOverload, - xrunCallback, NULL ); //no need to pass actual node - } - if( stream->outputUnit && stream->outputUnit != stream->inputUnit ) { - AudioUnitUninitialize( stream->outputUnit ); -#if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_6 - AudioComponentInstanceDispose( stream->outputUnit ); -#else - CloseComponent( stream->outputUnit ); -#endif - } - stream->outputUnit = NULL; - if( stream->inputUnit ) - { - AudioUnitUninitialize( stream->inputUnit ); -#if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_6 - AudioComponentInstanceDispose( stream->inputUnit ); -#else - CloseComponent( stream->inputUnit ); -#endif - stream->inputUnit = NULL; - } - if( stream->inputRingBuffer.buffer ) - free( (void *) stream->inputRingBuffer.buffer ); - stream->inputRingBuffer.buffer = NULL; - /*TODO: is there more that needs to be done on error - from AudioConverterDispose?*/ - if( stream->inputSRConverter ) - ERR( AudioConverterDispose( stream->inputSRConverter ) ); - stream->inputSRConverter = NULL; - if( stream->inputAudioBufferList.mBuffers[0].mData ) - free( stream->inputAudioBufferList.mBuffers[0].mData ); - stream->inputAudioBufferList.mBuffers[0].mData = NULL; + } - result = destroyBlioRingBuffers( &stream->blio ); - if( result ) - return result; - if( stream->bufferProcessorIsInitialized ) - PaUtil_TerminateBufferProcessor( &stream->bufferProcessor ); - - if( stream->timingInformationMutexIsInitialized ) - pthread_mutex_destroy( &stream->timingInformationMutex ); + if( stream->outputUnit ) { + int count = removeFromXRunListenerList( stream ); + if( count == 0 ) + PaMacCore_AudioDeviceRemovePropertyListener( stream->outputDevice, + 0, + false, + kAudioDeviceProcessorOverload, + xrunCallback, NULL ); //no need to pass actual node + } + if( stream->inputUnit && stream->outputUnit != stream->inputUnit ) { + int count = removeFromXRunListenerList( stream ); + if( count == 0 ) + PaMacCore_AudioDeviceRemovePropertyListener( stream->inputDevice, + 0, + true, + kAudioDeviceProcessorOverload, + xrunCallback, NULL ); //no need to pass actual node + } + if( stream->outputUnit && stream->outputUnit != stream->inputUnit ) { + AudioUnitUninitialize( stream->outputUnit ); +#if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_6 + AudioComponentInstanceDispose( stream->outputUnit ); +#else + CloseComponent( stream->outputUnit ); +#endif + } + stream->outputUnit = NULL; + if( stream->inputUnit ) + { + AudioUnitUninitialize( stream->inputUnit ); +#if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_6 + AudioComponentInstanceDispose( stream->inputUnit ); +#else + CloseComponent( stream->inputUnit ); +#endif + stream->inputUnit = NULL; + } + if( stream->inputRingBuffer.buffer ) + free( (void *) stream->inputRingBuffer.buffer ); + stream->inputRingBuffer.buffer = NULL; + /*TODO: is there more that needs to be done on error + from AudioConverterDispose?*/ + if( stream->inputSRConverter ) + ERR( AudioConverterDispose( stream->inputSRConverter ) ); + stream->inputSRConverter = NULL; + if( stream->inputAudioBufferList.mBuffers[0].mData ) + free( stream->inputAudioBufferList.mBuffers[0].mData ); + stream->inputAudioBufferList.mBuffers[0].mData = NULL; - PaUtil_TerminateStreamRepresentation( &stream->streamRepresentation ); - PaUtil_FreeMemory( stream ); + result = destroyBlioRingBuffers( &stream->blio ); + if( result ) + return result; + if( stream->bufferProcessorIsInitialized ) + PaUtil_TerminateBufferProcessor( &stream->bufferProcessor ); + + if( stream->timingInformationMutexIsInitialized ) + pthread_mutex_destroy( &stream->timingInformationMutex ); + + PaUtil_TerminateStreamRepresentation( &stream->streamRepresentation ); + PaUtil_FreeMemory( stream ); } return result; @@ -2743,17 +2736,17 @@ static PaError StartStream( PaStream *s ) /*FIXME: maybe want to do this on close/abort for faster start? */ PaUtil_ResetBufferProcessor( &stream->bufferProcessor ); if( stream->inputSRConverter ) - ERR_WRAP( AudioConverterReset( stream->inputSRConverter ) ); + ERR_WRAP( AudioConverterReset( stream->inputSRConverter ) ); /* -- start -- */ stream->state = ACTIVE; if( stream->inputUnit ) { - ERR_WRAP( AudioOutputUnitStart(stream->inputUnit) ); + ERR_WRAP( AudioOutputUnitStart(stream->inputUnit) ); } if( stream->outputUnit && stream->outputUnit != stream->inputUnit ) { - ERR_WRAP( AudioOutputUnitStart(stream->outputUnit) ); + ERR_WRAP( AudioOutputUnitStart(stream->outputUnit) ); } - + return paNoError; #undef ERR_WRAP } @@ -2764,11 +2757,11 @@ static ComponentResult BlockWhileAudioUnitIsRunning( AudioUnit audioUnit, AudioU { Boolean isRunning = 1; while( isRunning ) { - UInt32 s = sizeof( isRunning ); - ComponentResult err = AudioUnitGetProperty( audioUnit, kAudioOutputUnitProperty_IsRunning, kAudioUnitScope_Global, element, &isRunning, &s ); - if( err ) - return err; - Pa_Sleep( 100 ); + UInt32 s = sizeof( isRunning ); + ComponentResult err = AudioUnitGetProperty( audioUnit, kAudioOutputUnitProperty_IsRunning, kAudioUnitScope_Global, element, &isRunning, &s ); + if( err ) + return err; + Pa_Sleep( 100 ); } return noErr; } @@ -2782,38 +2775,38 @@ static PaError FinishStoppingStream( PaMacCoreStream *stream ) /* -- stop and reset -- */ if( stream->inputUnit == stream->outputUnit && stream->inputUnit ) { - ERR_WRAP( AudioOutputUnitStop(stream->inputUnit) ); - ERR_WRAP( BlockWhileAudioUnitIsRunning(stream->inputUnit,0) ); - ERR_WRAP( BlockWhileAudioUnitIsRunning(stream->inputUnit,1) ); - ERR_WRAP( AudioUnitReset(stream->inputUnit, kAudioUnitScope_Global, 1) ); - ERR_WRAP( AudioUnitReset(stream->inputUnit, kAudioUnitScope_Global, 0) ); + ERR_WRAP( AudioOutputUnitStop(stream->inputUnit) ); + ERR_WRAP( BlockWhileAudioUnitIsRunning(stream->inputUnit,0) ); + ERR_WRAP( BlockWhileAudioUnitIsRunning(stream->inputUnit,1) ); + ERR_WRAP( AudioUnitReset(stream->inputUnit, kAudioUnitScope_Global, 1) ); + ERR_WRAP( AudioUnitReset(stream->inputUnit, kAudioUnitScope_Global, 0) ); } else { - if( stream->inputUnit ) - { - ERR_WRAP(AudioOutputUnitStop(stream->inputUnit) ); - ERR_WRAP( BlockWhileAudioUnitIsRunning(stream->inputUnit,1) ); - ERR_WRAP(AudioUnitReset(stream->inputUnit,kAudioUnitScope_Global,1)); - } - if( stream->outputUnit ) - { - ERR_WRAP(AudioOutputUnitStop(stream->outputUnit)); - ERR_WRAP( BlockWhileAudioUnitIsRunning(stream->outputUnit,0) ); - ERR_WRAP(AudioUnitReset(stream->outputUnit,kAudioUnitScope_Global,0)); - } + if( stream->inputUnit ) + { + ERR_WRAP(AudioOutputUnitStop(stream->inputUnit) ); + ERR_WRAP( BlockWhileAudioUnitIsRunning(stream->inputUnit,1) ); + ERR_WRAP(AudioUnitReset(stream->inputUnit,kAudioUnitScope_Global,1)); + } + if( stream->outputUnit ) + { + ERR_WRAP(AudioOutputUnitStop(stream->outputUnit)); + ERR_WRAP( BlockWhileAudioUnitIsRunning(stream->outputUnit,0) ); + ERR_WRAP(AudioUnitReset(stream->outputUnit,kAudioUnitScope_Global,0)); + } } if( stream->inputRingBuffer.buffer ) { - PaUtil_FlushRingBuffer( &stream->inputRingBuffer ); - bzero( (void *)stream->inputRingBuffer.buffer, - stream->inputRingBuffer.bufferSize ); - /* advance the write point a little, so we are reading from the - middle of the buffer. We'll need extra at the end because - testing has shown that this helps. */ - if( stream->outputUnit ) - PaUtil_AdvanceRingBufferWriteIndex( &stream->inputRingBuffer, - stream->inputRingBuffer.bufferSize - / RING_BUFFER_ADVANCE_DENOMINATOR ); + PaUtil_FlushRingBuffer( &stream->inputRingBuffer ); + bzero( (void *)stream->inputRingBuffer.buffer, + stream->inputRingBuffer.bufferSize ); + /* advance the write point a little, so we are reading from the + middle of the buffer. We'll need extra at the end because + testing has shown that this helps. */ + if( stream->outputUnit ) + PaUtil_AdvanceRingBufferWriteIndex( &stream->inputRingBuffer, + stream->inputRingBuffer.bufferSize + / RING_BUFFER_ADVANCE_DENOMINATOR ); } stream->xrunFlags = 0; @@ -2821,7 +2814,7 @@ static PaError FinishStoppingStream( PaMacCoreStream *stream ) paErr = resetBlioRingBuffers( &stream->blio ); if( paErr ) - return paErr; + return paErr; VDBUG( ( "Stream Stopped.\n" ) ); return paNoError; @@ -2843,7 +2836,7 @@ static PaError StopStream( PaStream *s ) size_t maxHostFrames = MAX( stream->inputFramesPerBuffer, stream->outputFramesPerBuffer ); VDBUG( ("Waiting for write buffer to be drained.\n") ); paErr = waitUntilBlioWriteBufferIsEmpty( &stream->blio, stream->sampleRate, - maxHostFrames ); + maxHostFrames ); VDBUG( ( "waitUntilBlioWriteBufferIsEmpty returned %d\n", paErr ) ); } return FinishStoppingStream( stream ); diff --git a/src/hostapi/coreaudio/pa_mac_core_blocking.c b/src/hostapi/coreaudio/pa_mac_core_blocking.c index e99d55e..70515f9 100644 --- a/src/hostapi/coreaudio/pa_mac_core_blocking.c +++ b/src/hostapi/coreaudio/pa_mac_core_blocking.c @@ -15,7 +15,7 @@ * Olivier Tristan for feedback and testing * Glenn Zelniker and Z-Systems engineering for sponsoring the Blocking I/O * interface. - * + * * * Based on the Open Source API proposed by Ross Bencina * Copyright (c) 1999-2002 Ross Bencina, Phil Burk @@ -41,13 +41,13 @@ */ /* - * The text above constitutes the entire PortAudio license; however, + * The text above constitutes the entire PortAudio license; however, * the PortAudio community also makes the following non-binding requests: * * 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. It is also - * requested that these non-binding requests be included along with the + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the * license above. */ @@ -76,33 +76,35 @@ */ static size_t computeSampleSizeFromFormat( PaSampleFormat format ) { - switch( format & (~paNonInterleaved) ) { - case paFloat32: return 4; - case paInt32: return 4; - case paInt24: return 3; - case paInt16: return 2; - case paInt8: case paUInt8: return 1; - default: return 0; - } + switch( format & (~paNonInterleaved) ) { + case paFloat32: return 4; + case paInt32: return 4; + case paInt24: return 3; + case paInt16: return 2; + case paInt8: + case paUInt8: return 1; + default: return 0; + } } + /* * Same as computeSampleSizeFromFormat, except that if * the size is not a power of two, it returns the next power of two up */ static size_t computeSampleSizeFromFormatPow2( PaSampleFormat format ) { - switch( format & (~paNonInterleaved) ) { - case paFloat32: return 4; - case paInt32: return 4; - case paInt24: return 4; - case paInt16: return 2; - case paInt8: case paUInt8: return 1; - default: return 0; - } + switch( format & (~paNonInterleaved) ) { + case paFloat32: return 4; + case paInt32: return 4; + case paInt24: return 4; + case paInt16: return 2; + case paInt8: + case paUInt8: return 1; + default: return 0; + } } - /* * Functions for initializing, resetting, and destroying BLIO structures. * @@ -114,149 +116,149 @@ static size_t computeSampleSizeFromFormatPow2( PaSampleFormat format ) * @param ringBufferSizeInFrames must be a power of 2 */ PaError initializeBlioRingBuffers( - PaMacBlio *blio, - PaSampleFormat inputSampleFormat, - PaSampleFormat outputSampleFormat, - long ringBufferSizeInFrames, - int inChan, - int outChan ) + PaMacBlio *blio, + PaSampleFormat inputSampleFormat, + PaSampleFormat outputSampleFormat, + long ringBufferSizeInFrames, + int inChan, + int outChan ) { - void *data; - int result; - OSStatus err; + void *data; + int result; + OSStatus err; - /* zeroify things */ - bzero( blio, sizeof( PaMacBlio ) ); - /* this is redundant, but the buffers are used to check - if the buffers have been initialized, so we do it explicitly. */ - blio->inputRingBuffer.buffer = NULL; - blio->outputRingBuffer.buffer = NULL; + /* zeroify things */ + bzero( blio, sizeof( PaMacBlio ) ); + /* this is redundant, but the buffers are used to check + if the buffers have been initialized, so we do it explicitly. */ + blio->inputRingBuffer.buffer = NULL; + blio->outputRingBuffer.buffer = NULL; - /* initialize simple data */ - blio->ringBufferFrames = ringBufferSizeInFrames; - blio->inputSampleFormat = inputSampleFormat; - blio->inputSampleSizeActual = computeSampleSizeFromFormat(inputSampleFormat); - blio->inputSampleSizePow2 = computeSampleSizeFromFormatPow2(inputSampleFormat); // FIXME: WHY? - blio->outputSampleFormat = outputSampleFormat; - blio->outputSampleSizeActual = computeSampleSizeFromFormat(outputSampleFormat); - blio->outputSampleSizePow2 = computeSampleSizeFromFormatPow2(outputSampleFormat); + /* initialize simple data */ + blio->ringBufferFrames = ringBufferSizeInFrames; + blio->inputSampleFormat = inputSampleFormat; + blio->inputSampleSizeActual = computeSampleSizeFromFormat(inputSampleFormat); + blio->inputSampleSizePow2 = computeSampleSizeFromFormatPow2(inputSampleFormat); // FIXME: WHY? + blio->outputSampleFormat = outputSampleFormat; + blio->outputSampleSizeActual = computeSampleSizeFromFormat(outputSampleFormat); + blio->outputSampleSizePow2 = computeSampleSizeFromFormatPow2(outputSampleFormat); - blio->inChan = inChan; - blio->outChan = outChan; - blio->statusFlags = 0; - blio->errors = paNoError; + blio->inChan = inChan; + blio->outChan = outChan; + blio->statusFlags = 0; + blio->errors = paNoError; #ifdef PA_MAC_BLIO_MUTEX - blio->isInputEmpty = false; - blio->isOutputFull = false; + blio->isInputEmpty = false; + blio->isOutputFull = false; #endif - /* setup ring buffers */ + /* setup ring buffers */ #ifdef PA_MAC_BLIO_MUTEX - result = PaMacCore_SetUnixError( pthread_mutex_init(&(blio->inputMutex),NULL), 0 ); - if( result ) - goto error; - result = UNIX_ERR( pthread_cond_init( &(blio->inputCond), NULL ) ); - if( result ) - goto error; - result = UNIX_ERR( pthread_mutex_init(&(blio->outputMutex),NULL) ); - if( result ) - goto error; - result = UNIX_ERR( pthread_cond_init( &(blio->outputCond), NULL ) ); + result = PaMacCore_SetUnixError( pthread_mutex_init(&(blio->inputMutex),NULL), 0 ); + if( result ) + goto error; + result = UNIX_ERR( pthread_cond_init( &(blio->inputCond), NULL ) ); + if( result ) + goto error; + result = UNIX_ERR( pthread_mutex_init(&(blio->outputMutex),NULL) ); + if( result ) + goto error; + result = UNIX_ERR( pthread_cond_init( &(blio->outputCond), NULL ) ); #endif - if( inChan ) { - data = calloc( ringBufferSizeInFrames, blio->inputSampleSizePow2 * inChan ); - if( !data ) - { - result = paInsufficientMemory; - goto error; - } + if( inChan ) { + data = calloc( ringBufferSizeInFrames, blio->inputSampleSizePow2 * inChan ); + if( !data ) + { + result = paInsufficientMemory; + goto error; + } - err = PaUtil_InitializeRingBuffer( - &blio->inputRingBuffer, - blio->inputSampleSizePow2 * inChan, - ringBufferSizeInFrames, - data ); - assert( !err ); - } - if( outChan ) { - data = calloc( ringBufferSizeInFrames, blio->outputSampleSizePow2 * outChan ); - if( !data ) - { - result = paInsufficientMemory; - goto error; - } + err = PaUtil_InitializeRingBuffer( + &blio->inputRingBuffer, + blio->inputSampleSizePow2 * inChan, + ringBufferSizeInFrames, + data ); + assert( !err ); + } + if( outChan ) { + data = calloc( ringBufferSizeInFrames, blio->outputSampleSizePow2 * outChan ); + if( !data ) + { + result = paInsufficientMemory; + goto error; + } - err = PaUtil_InitializeRingBuffer( - &blio->outputRingBuffer, - blio->outputSampleSizePow2 * outChan, - ringBufferSizeInFrames, - data ); - assert( !err ); - } + err = PaUtil_InitializeRingBuffer( + &blio->outputRingBuffer, + blio->outputSampleSizePow2 * outChan, + ringBufferSizeInFrames, + data ); + assert( !err ); + } - result = resetBlioRingBuffers( blio ); - if( result ) - goto error; + result = resetBlioRingBuffers( blio ); + if( result ) + goto error; - return 0; + return 0; - error: - destroyBlioRingBuffers( blio ); - return result; +error: + destroyBlioRingBuffers( blio ); + return result; } #ifdef PA_MAC_BLIO_MUTEX PaError blioSetIsInputEmpty( PaMacBlio *blio, bool isEmpty ) { - PaError result = paNoError; - if( isEmpty == blio->isInputEmpty ) - goto done; + PaError result = paNoError; + if( isEmpty == blio->isInputEmpty ) + goto done; - /* we need to update the value. Here's what we do: - * - Lock the mutex, so no one else can write. - * - update the value. - * - unlock. - * - broadcast to all listeners. - */ - result = UNIX_ERR( pthread_mutex_lock( &blio->inputMutex ) ); - if( result ) - goto done; - blio->isInputEmpty = isEmpty; - result = UNIX_ERR( pthread_mutex_unlock( &blio->inputMutex ) ); - if( result ) - goto done; - result = UNIX_ERR( pthread_cond_broadcast( &blio->inputCond ) ); - if( result ) - goto done; + /* we need to update the value. Here's what we do: + * - Lock the mutex, so no one else can write. + * - update the value. + * - unlock. + * - broadcast to all listeners. + */ + result = UNIX_ERR( pthread_mutex_lock( &blio->inputMutex ) ); + if( result ) + goto done; + blio->isInputEmpty = isEmpty; + result = UNIX_ERR( pthread_mutex_unlock( &blio->inputMutex ) ); + if( result ) + goto done; + result = UNIX_ERR( pthread_cond_broadcast( &blio->inputCond ) ); + if( result ) + goto done; - done: - return result; +done: + return result; } PaError blioSetIsOutputFull( PaMacBlio *blio, bool isFull ) { - PaError result = paNoError; - if( isFull == blio->isOutputFull ) - goto done; + PaError result = paNoError; + if( isFull == blio->isOutputFull ) + goto done; - /* we need to update the value. Here's what we do: - * - Lock the mutex, so no one else can write. - * - update the value. - * - unlock. - * - broadcast to all listeners. - */ - result = UNIX_ERR( pthread_mutex_lock( &blio->outputMutex ) ); - if( result ) - goto done; - blio->isOutputFull = isFull; - result = UNIX_ERR( pthread_mutex_unlock( &blio->outputMutex ) ); - if( result ) - goto done; - result = UNIX_ERR( pthread_cond_broadcast( &blio->outputCond ) ); - if( result ) - goto done; + /* we need to update the value. Here's what we do: + * - Lock the mutex, so no one else can write. + * - update the value. + * - unlock. + * - broadcast to all listeners. + */ + result = UNIX_ERR( pthread_mutex_lock( &blio->outputMutex ) ); + if( result ) + goto done; + blio->isOutputFull = isFull; + result = UNIX_ERR( pthread_mutex_unlock( &blio->outputMutex ) ); + if( result ) + goto done; + result = UNIX_ERR( pthread_cond_broadcast( &blio->outputCond ) ); + if( result ) + goto done; - done: - return result; +done: + return result; } #endif @@ -265,42 +267,42 @@ PaError blioSetIsOutputFull( PaMacBlio *blio, bool isFull ) PaError resetBlioRingBuffers( PaMacBlio *blio ) { #ifdef PA_MAC__BLIO_MUTEX - int result; + int result; #endif - blio->statusFlags = 0; - if( blio->outputRingBuffer.buffer ) { - PaUtil_FlushRingBuffer( &blio->outputRingBuffer ); - /* Fill the buffer with zeros. */ - bzero( blio->outputRingBuffer.buffer, - blio->outputRingBuffer.bufferSize * blio->outputRingBuffer.elementSizeBytes ); - PaUtil_AdvanceRingBufferWriteIndex( &blio->outputRingBuffer, blio->ringBufferFrames ); + blio->statusFlags = 0; + if( blio->outputRingBuffer.buffer ) { + PaUtil_FlushRingBuffer( &blio->outputRingBuffer ); + /* Fill the buffer with zeros. */ + bzero( blio->outputRingBuffer.buffer, + blio->outputRingBuffer.bufferSize * blio->outputRingBuffer.elementSizeBytes ); + PaUtil_AdvanceRingBufferWriteIndex( &blio->outputRingBuffer, blio->ringBufferFrames ); - /* Update isOutputFull. */ + /* Update isOutputFull. */ #ifdef PA_MAC__BLIO_MUTEX - result = blioSetIsOutputFull( blio, toAdvance == blio->outputRingBuffer.bufferSize ); - if( result ) - goto error; + result = blioSetIsOutputFull( blio, toAdvance == blio->outputRingBuffer.bufferSize ); + if( result ) + goto error; #endif -/* - printf( "------%d\n" , blio->outChan ); - printf( "------%d\n" , blio->outputSampleSize ); -*/ - } - if( blio->inputRingBuffer.buffer ) { - PaUtil_FlushRingBuffer( &blio->inputRingBuffer ); - bzero( blio->inputRingBuffer.buffer, - blio->inputRingBuffer.bufferSize * blio->inputRingBuffer.elementSizeBytes ); - /* Update isInputEmpty. */ + /* + printf( "------%d\n" , blio->outChan ); + printf( "------%d\n" , blio->outputSampleSize ); + */ + } + if( blio->inputRingBuffer.buffer ) { + PaUtil_FlushRingBuffer( &blio->inputRingBuffer ); + bzero( blio->inputRingBuffer.buffer, + blio->inputRingBuffer.bufferSize * blio->inputRingBuffer.elementSizeBytes ); + /* Update isInputEmpty. */ #ifdef PA_MAC__BLIO_MUTEX - result = blioSetIsInputEmpty( blio, true ); - if( result ) - goto error; + result = blioSetIsInputEmpty( blio, true ); + if( result ) + goto error; #endif - } - return paNoError; + } + return paNoError; #ifdef PA_MAC__BLIO_MUTEX - error: - return result; +error: + return result; #endif } @@ -308,29 +310,29 @@ PaError resetBlioRingBuffers( PaMacBlio *blio ) multiple times if there are no exceptions. */ PaError destroyBlioRingBuffers( PaMacBlio *blio ) { - PaError result = paNoError; - if( blio->inputRingBuffer.buffer ) { - free( blio->inputRingBuffer.buffer ); + PaError result = paNoError; + if( blio->inputRingBuffer.buffer ) { + free( blio->inputRingBuffer.buffer ); #ifdef PA_MAC__BLIO_MUTEX - result = UNIX_ERR( pthread_mutex_destroy( & blio->inputMutex ) ); - if( result ) return result; - result = UNIX_ERR( pthread_cond_destroy( & blio->inputCond ) ); - if( result ) return result; + result = UNIX_ERR( pthread_mutex_destroy( & blio->inputMutex ) ); + if( result ) return result; + result = UNIX_ERR( pthread_cond_destroy( & blio->inputCond ) ); + if( result ) return result; #endif - } - blio->inputRingBuffer.buffer = NULL; - if( blio->outputRingBuffer.buffer ) { - free( blio->outputRingBuffer.buffer ); + } + blio->inputRingBuffer.buffer = NULL; + if( blio->outputRingBuffer.buffer ) { + free( blio->outputRingBuffer.buffer ); #ifdef PA_MAC__BLIO_MUTEX - result = UNIX_ERR( pthread_mutex_destroy( & blio->outputMutex ) ); - if( result ) return result; - result = UNIX_ERR( pthread_cond_destroy( & blio->outputCond ) ); - if( result ) return result; + result = UNIX_ERR( pthread_mutex_destroy( & blio->outputMutex ) ); + if( result ) return result; + result = UNIX_ERR( pthread_cond_destroy( & blio->outputCond ) ); + if( result ) return result; #endif - } - blio->outputRingBuffer.buffer = NULL; + } + blio->outputRingBuffer.buffer = NULL; - return result; + return result; } /* @@ -339,86 +341,86 @@ PaError destroyBlioRingBuffers( PaMacBlio *blio ) * */ int BlioCallback( const void *input, void *output, unsigned long frameCount, - const PaStreamCallbackTimeInfo* timeInfo, - PaStreamCallbackFlags statusFlags, - void *userData ) + const PaStreamCallbackTimeInfo* timeInfo, + PaStreamCallbackFlags statusFlags, + void *userData ) { - PaMacBlio *blio = (PaMacBlio*)userData; - ring_buffer_size_t framesAvailable; - ring_buffer_size_t framesToTransfer; - ring_buffer_size_t framesTransferred; + PaMacBlio *blio = (PaMacBlio*)userData; + ring_buffer_size_t framesAvailable; + ring_buffer_size_t framesToTransfer; + ring_buffer_size_t framesTransferred; - /* set flags returned by OS: */ - OSAtomicOr32( statusFlags, &blio->statusFlags ) ; + /* set flags returned by OS: */ + OSAtomicOr32( statusFlags, &blio->statusFlags ) ; - /* --- Handle Input Buffer --- */ - if( blio->inChan ) { - framesAvailable = PaUtil_GetRingBufferWriteAvailable( &blio->inputRingBuffer ); + /* --- Handle Input Buffer --- */ + if( blio->inChan ) { + framesAvailable = PaUtil_GetRingBufferWriteAvailable( &blio->inputRingBuffer ); - /* check for underflow */ - if( framesAvailable < frameCount ) - { - OSAtomicOr32( paInputOverflow, &blio->statusFlags ); - framesToTransfer = framesAvailable; - } - else - { - framesToTransfer = (ring_buffer_size_t)frameCount; - } + /* check for underflow */ + if( framesAvailable < frameCount ) + { + OSAtomicOr32( paInputOverflow, &blio->statusFlags ); + framesToTransfer = framesAvailable; + } + else + { + framesToTransfer = (ring_buffer_size_t)frameCount; + } - /* Copy the data from the audio input to the application ring buffer. */ - /*printf( "reading %d\n", toRead );*/ - framesTransferred = PaUtil_WriteRingBuffer( &blio->inputRingBuffer, input, framesToTransfer ); - assert( framesToTransfer == framesTransferred ); + /* Copy the data from the audio input to the application ring buffer. */ + /*printf( "reading %d\n", toRead );*/ + framesTransferred = PaUtil_WriteRingBuffer( &blio->inputRingBuffer, input, framesToTransfer ); + assert( framesToTransfer == framesTransferred ); #ifdef PA_MAC__BLIO_MUTEX - /* Priority inversion. See notes below. */ - blioSetIsInputEmpty( blio, false ); + /* Priority inversion. See notes below. */ + blioSetIsInputEmpty( blio, false ); #endif - } + } - /* --- Handle Output Buffer --- */ - if( blio->outChan ) { - framesAvailable = PaUtil_GetRingBufferReadAvailable( &blio->outputRingBuffer ); + /* --- Handle Output Buffer --- */ + if( blio->outChan ) { + framesAvailable = PaUtil_GetRingBufferReadAvailable( &blio->outputRingBuffer ); - /* check for underflow */ - if( framesAvailable < frameCount ) - { - /* zero out the end of the output buffer that we do not have data for */ - framesToTransfer = framesAvailable; + /* check for underflow */ + if( framesAvailable < frameCount ) + { + /* zero out the end of the output buffer that we do not have data for */ + framesToTransfer = framesAvailable; - size_t bytesPerFrame = blio->outputSampleSizeActual * blio->outChan; - size_t offsetInBytes = framesToTransfer * bytesPerFrame; - size_t countInBytes = (frameCount - framesToTransfer) * bytesPerFrame; - bzero( ((char *)output) + offsetInBytes, countInBytes ); + size_t bytesPerFrame = blio->outputSampleSizeActual * blio->outChan; + size_t offsetInBytes = framesToTransfer * bytesPerFrame; + size_t countInBytes = (frameCount - framesToTransfer) * bytesPerFrame; + bzero( ((char *)output) + offsetInBytes, countInBytes ); - OSAtomicOr32( paOutputUnderflow, &blio->statusFlags ); - framesToTransfer = framesAvailable; - } - else - { - framesToTransfer = (ring_buffer_size_t)frameCount; - } + OSAtomicOr32( paOutputUnderflow, &blio->statusFlags ); + framesToTransfer = framesAvailable; + } + else + { + framesToTransfer = (ring_buffer_size_t)frameCount; + } - /* copy the data */ - /*printf( "writing %d\n", toWrite );*/ - framesTransferred = PaUtil_ReadRingBuffer( &blio->outputRingBuffer, output, framesToTransfer ); - assert( framesToTransfer == framesTransferred ); + /* copy the data */ + /*printf( "writing %d\n", toWrite );*/ + framesTransferred = PaUtil_ReadRingBuffer( &blio->outputRingBuffer, output, framesToTransfer ); + assert( framesToTransfer == framesTransferred ); #ifdef PA_MAC__BLIO_MUTEX - /* We have a priority inversion here. However, we will only have to - wait if this was true and is now false, which means we've got - some room in the buffer. - Hopefully problems will be minimized. */ - blioSetIsOutputFull( blio, false ); + /* We have a priority inversion here. However, we will only have to + wait if this was true and is now false, which means we've got + some room in the buffer. + Hopefully problems will be minimized. */ + blioSetIsOutputFull( blio, false ); #endif - } + } - return paContinue; + return paContinue; } PaError ReadStream( PaStream* stream, - void *buffer, - unsigned long framesRequested ) + void *buffer, + unsigned long framesRequested ) { PaMacBlio *blio = & ((PaMacCoreStream*)stream) -> blio; char *cbuf = (char *) buffer; @@ -426,58 +428,58 @@ PaError ReadStream( PaStream* stream, VVDBUG(("ReadStream()\n")); while( framesRequested > 0 ) { - ring_buffer_size_t framesAvailable; - ring_buffer_size_t framesToTransfer; - ring_buffer_size_t framesTransferred; - do { - framesAvailable = PaUtil_GetRingBufferReadAvailable( &blio->inputRingBuffer ); -/* - printf( "Read Buffer is %%%g full: %ld of %ld.\n", - 100 * (float)avail / (float) blio->inputRingBuffer.bufferSize, - framesAvailable, blio->inputRingBuffer.bufferSize ); -*/ - if( framesAvailable == 0 ) { + ring_buffer_size_t framesAvailable; + ring_buffer_size_t framesToTransfer; + ring_buffer_size_t framesTransferred; + do { + framesAvailable = PaUtil_GetRingBufferReadAvailable( &blio->inputRingBuffer ); + /* + printf( "Read Buffer is %%%g full: %ld of %ld.\n", + 100 * (float)avail / (float) blio->inputRingBuffer.bufferSize, + framesAvailable, blio->inputRingBuffer.bufferSize ); + */ + if( framesAvailable == 0 ) { #ifdef PA_MAC_BLIO_MUTEX - /**block when empty*/ - ret = UNIX_ERR( pthread_mutex_lock( &blio->inputMutex ) ); - if( ret ) - return ret; - while( blio->isInputEmpty ) { - ret = UNIX_ERR( pthread_cond_wait( &blio->inputCond, &blio->inputMutex ) ); + /**block when empty*/ + ret = UNIX_ERR( pthread_mutex_lock( &blio->inputMutex ) ); if( ret ) - return ret; - } - ret = UNIX_ERR( pthread_mutex_unlock( &blio->inputMutex ) ); - if( ret ) - return ret; + return ret; + while( blio->isInputEmpty ) { + ret = UNIX_ERR( pthread_cond_wait( &blio->inputCond, &blio->inputMutex ) ); + if( ret ) + return ret; + } + ret = UNIX_ERR( pthread_mutex_unlock( &blio->inputMutex ) ); + if( ret ) + return ret; #else - Pa_Sleep( PA_MAC_BLIO_BUSY_WAIT_SLEEP_INTERVAL ); + Pa_Sleep( PA_MAC_BLIO_BUSY_WAIT_SLEEP_INTERVAL ); #endif - } - } while( framesAvailable == 0 ); - framesToTransfer = (ring_buffer_size_t) MIN( framesAvailable, framesRequested ); - framesTransferred = PaUtil_ReadRingBuffer( &blio->inputRingBuffer, (void *)cbuf, framesToTransfer ); - cbuf += framesTransferred * blio->inputSampleSizeActual * blio->inChan; - framesRequested -= framesTransferred; + } + } while( framesAvailable == 0 ); + framesToTransfer = (ring_buffer_size_t) MIN( framesAvailable, framesRequested ); + framesTransferred = PaUtil_ReadRingBuffer( &blio->inputRingBuffer, (void *)cbuf, framesToTransfer ); + cbuf += framesTransferred * blio->inputSampleSizeActual * blio->inChan; + framesRequested -= framesTransferred; - if( framesToTransfer == framesAvailable ) { + if( framesToTransfer == framesAvailable ) { #ifdef PA_MAC_BLIO_MUTEX - /* we just emptied the buffer, so we need to mark it as empty. */ - ret = blioSetIsInputEmpty( blio, true ); - if( ret ) - return ret; - /* of course, in the meantime, the callback may have put some sats - in, so - so check for that, too, to avoid a race condition. */ - /* FIXME - this does not seem to fix any race condition. */ - if( PaUtil_GetRingBufferReadAvailable( &blio->inputRingBuffer ) ) { - blioSetIsInputEmpty( blio, false ); - /* FIXME - why check? ret has not been set? */ - if( ret ) + /* we just emptied the buffer, so we need to mark it as empty. */ + ret = blioSetIsInputEmpty( blio, true ); + if( ret ) return ret; - } + /* of course, in the meantime, the callback may have put some sats + in, so + so check for that, too, to avoid a race condition. */ + /* FIXME - this does not seem to fix any race condition. */ + if( PaUtil_GetRingBufferReadAvailable( &blio->inputRingBuffer ) ) { + blioSetIsInputEmpty( blio, false ); + /* FIXME - why check? ret has not been set? */ + if( ret ) + return ret; + } #endif - } + } } /* Report either paNoError or paInputOverflowed. */ @@ -487,8 +489,8 @@ PaError ReadStream( PaStream* stream, /* report underflow only once: */ if( ret ) { - OSAtomicAnd32( (uint32_t)(~paInputOverflow), &blio->statusFlags ); - ret = paInputOverflowed; + OSAtomicAnd32( (uint32_t)(~paInputOverflow), &blio->statusFlags ); + ret = paInputOverflowed; } return ret; @@ -496,8 +498,8 @@ PaError ReadStream( PaStream* stream, PaError WriteStream( PaStream* stream, - const void *buffer, - unsigned long framesRequested ) + const void *buffer, + unsigned long framesRequested ) { PaMacCoreStream *macStream = (PaMacCoreStream*)stream; PaMacBlio *blio = &macStream->blio; @@ -510,58 +512,58 @@ PaError WriteStream( PaStream* stream, ring_buffer_size_t framesToTransfer; ring_buffer_size_t framesTransferred; - do { - framesAvailable = PaUtil_GetRingBufferWriteAvailable( &blio->outputRingBuffer ); -/* - printf( "Write Buffer is %%%g full: %ld of %ld.\n", - 100 - 100 * (float)avail / (float) blio->outputRingBuffer.bufferSize, - framesAvailable, blio->outputRingBuffer.bufferSize ); -*/ - if( framesAvailable == 0 ) { + do { + framesAvailable = PaUtil_GetRingBufferWriteAvailable( &blio->outputRingBuffer ); + /* + printf( "Write Buffer is %%%g full: %ld of %ld.\n", + 100 - 100 * (float)avail / (float) blio->outputRingBuffer.bufferSize, + framesAvailable, blio->outputRingBuffer.bufferSize ); + */ + if( framesAvailable == 0 ) { #ifdef PA_MAC_BLIO_MUTEX - /*block while full*/ - ret = UNIX_ERR( pthread_mutex_lock( &blio->outputMutex ) ); - if( ret ) - return ret; - while( blio->isOutputFull ) { - ret = UNIX_ERR( pthread_cond_wait( &blio->outputCond, &blio->outputMutex ) ); + /*block while full*/ + ret = UNIX_ERR( pthread_mutex_lock( &blio->outputMutex ) ); if( ret ) - return ret; - } - ret = UNIX_ERR( pthread_mutex_unlock( &blio->outputMutex ) ); - if( ret ) - return ret; + return ret; + while( blio->isOutputFull ) { + ret = UNIX_ERR( pthread_cond_wait( &blio->outputCond, &blio->outputMutex ) ); + if( ret ) + return ret; + } + ret = UNIX_ERR( pthread_mutex_unlock( &blio->outputMutex ) ); + if( ret ) + return ret; #else - Pa_Sleep( PA_MAC_BLIO_BUSY_WAIT_SLEEP_INTERVAL ); + Pa_Sleep( PA_MAC_BLIO_BUSY_WAIT_SLEEP_INTERVAL ); #endif - } - } while( framesAvailable == 0 && macStream->state != STOPPING ); + } + } while( framesAvailable == 0 && macStream->state != STOPPING ); - if( macStream->state == STOPPING ) - { - break; - } + if( macStream->state == STOPPING ) + { + break; + } - framesToTransfer = MIN( framesAvailable, framesRequested ); - framesTransferred = PaUtil_WriteRingBuffer( &blio->outputRingBuffer, (void *)cbuf, framesToTransfer ); - cbuf += framesTransferred * blio->outputSampleSizeActual * blio->outChan; - framesRequested -= framesTransferred; + framesToTransfer = MIN( framesAvailable, framesRequested ); + framesTransferred = PaUtil_WriteRingBuffer( &blio->outputRingBuffer, (void *)cbuf, framesToTransfer ); + cbuf += framesTransferred * blio->outputSampleSizeActual * blio->outChan; + framesRequested -= framesTransferred; #ifdef PA_MAC_BLIO_MUTEX - if( framesToTransfer == framesAvailable ) { - /* we just filled up the buffer, so we need to mark it as filled. */ - ret = blioSetIsOutputFull( blio, true ); - if( ret ) - return ret; - /* of course, in the meantime, we may have emptied the buffer, so - so check for that, too, to avoid a race condition. */ - if( PaUtil_GetRingBufferWriteAvailable( &blio->outputRingBuffer ) ) { - blioSetIsOutputFull( blio, false ); - /* FIXME remove or review this code, does not fix race, ret not set! */ - if( ret ) + if( framesToTransfer == framesAvailable ) { + /* we just filled up the buffer, so we need to mark it as filled. */ + ret = blioSetIsOutputFull( blio, true ); + if( ret ) return ret; - } - } + /* of course, in the meantime, we may have emptied the buffer, so + so check for that, too, to avoid a race condition. */ + if( PaUtil_GetRingBufferWriteAvailable( &blio->outputRingBuffer ) ) { + blioSetIsOutputFull( blio, false ); + /* FIXME remove or review this code, does not fix race, ret not set! */ + if( ret ) + return ret; + } + } #endif } @@ -589,7 +591,7 @@ PaError WriteStream( PaStream* stream, * Wait until the data in the buffer has finished playing. */ PaError waitUntilBlioWriteBufferIsEmpty( PaMacBlio *blio, double sampleRate, - size_t framesPerBuffer ) + size_t framesPerBuffer ) { PaError result = paNoError; if( blio->outputRingBuffer.buffer ) { @@ -603,7 +605,7 @@ PaError waitUntilBlioWriteBufferIsEmpty( PaMacBlio *blio, double sampleRate, long msecPerBuffer = 1 + (long)( 1000.0 * framesPerBuffer / sampleRate); while( framesLeft > 0 && now < timeoutTime ) { VDBUG(( "waitUntilBlioWriteBufferIsFlushed: framesLeft = %d, framesPerBuffer = %ld\n", - framesLeft, framesPerBuffer )); + framesLeft, framesPerBuffer )); Pa_Sleep( msecPerBuffer ); framesLeft = PaUtil_GetRingBufferReadAvailable( &blio->outputRingBuffer ); now = PaUtil_GetTime(); @@ -634,4 +636,3 @@ signed long GetStreamWriteAvailable( PaStream* stream ) return PaUtil_GetRingBufferWriteAvailable( &blio->outputRingBuffer ); } - diff --git a/src/hostapi/coreaudio/pa_mac_core_blocking.h b/src/hostapi/coreaudio/pa_mac_core_blocking.h index c994f09..c0e564a 100644 --- a/src/hostapi/coreaudio/pa_mac_core_blocking.h +++ b/src/hostapi/coreaudio/pa_mac_core_blocking.h @@ -15,7 +15,7 @@ * Olivier Tristan for feedback and testing * Glenn Zelniker and Z-Systems engineering for sponsoring the Blocking I/O * interface. - * + * * * Based on the Open Source API proposed by Ross Bencina * Copyright (c) 1999-2002 Ross Bencina, Phil Burk @@ -41,13 +41,13 @@ */ /* - * The text above constitutes the entire PortAudio license; however, + * The text above constitutes the entire PortAudio license; however, * the PortAudio community also makes the following non-binding requests: * * 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. It is also - * requested that these non-binding requests be included along with the + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the * license above. */ @@ -112,12 +112,12 @@ PaMacBlio; */ PaError initializeBlioRingBuffers( - PaMacBlio *blio, - PaSampleFormat inputSampleFormat, - PaSampleFormat outputSampleFormat, - long ringBufferSizeInFrames, - int inChan, - int outChan ); + PaMacBlio *blio, + PaSampleFormat inputSampleFormat, + PaSampleFormat outputSampleFormat, + long ringBufferSizeInFrames, + int inChan, + int outChan ); PaError destroyBlioRingBuffers( PaMacBlio *blio ); PaError resetBlioRingBuffers( PaMacBlio *blio ); @@ -129,6 +129,6 @@ int BlioCallback( void *userData ); PaError waitUntilBlioWriteBufferIsEmpty( PaMacBlio *blio, double sampleRate, - size_t framesPerBuffer ); + size_t framesPerBuffer ); #endif /*PA_MAC_CORE_BLOCKING_H_*/ diff --git a/src/hostapi/coreaudio/pa_mac_core_internal.h b/src/hostapi/coreaudio/pa_mac_core_internal.h index 14e3d07..d4a97e0 100644 --- a/src/hostapi/coreaudio/pa_mac_core_internal.h +++ b/src/hostapi/coreaudio/pa_mac_core_internal.h @@ -15,7 +15,7 @@ * Olivier Tristan for feedback and testing * Glenn Zelniker and Z-Systems engineering for sponsoring the Blocking I/O * interface. - * + * * * Based on the Open Source API proposed by Ross Bencina * Copyright (c) 1999-2002 Ross Bencina, Phil Burk @@ -41,13 +41,13 @@ */ /* - * The text above constitutes the entire PortAudio license; however, + * The text above constitutes the entire PortAudio license; however, * the PortAudio community also makes the following non-binding requests: * * 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. It is also - * requested that these non-binding requests be included along with the + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the * license above. */ @@ -120,10 +120,10 @@ typedef struct PaMacCoreDeviceProperties UInt32 bufferFrameSize; // UInt32 streamLatency; // Seems to be the same as deviceLatency!? UInt32 deviceLatency; - /* Current device sample rate. May change! - These are initialized to the nominal device sample rate, - and updated with the actual sample rate, when/where available. - Note that these are the *device* sample rates, prior to any required + /* Current device sample rate. May change! + These are initialized to the nominal device sample rate, + and updated with the actual sample rate, when/where available. + Note that these are the *device* sample rates, prior to any required SR conversion. */ Float64 sampleRate; Float64 samplePeriod; // reciprocal @@ -158,36 +158,35 @@ typedef struct PaMacCoreStream /* FIXME: instead of volatile, these should be properly memory barriered */ volatile uint32_t xrunFlags; /*PaStreamCallbackFlags*/ volatile enum { - STOPPED = 0, /* playback is completely stopped, + STOPPED = 0, /* playback is completely stopped, and the user has called StopStream(). */ - CALLBACK_STOPPED = 1, /* callback has requested stop, + CALLBACK_STOPPED = 1, /* callback has requested stop, but user has not yet called StopStream(). */ - STOPPING = 2, /* The stream is in the process of closing + STOPPING = 2, /* The stream is in the process of closing because the user has called StopStream. This state is just used internally; externally it is indistinguishable from ACTIVE.*/ - ACTIVE = 3 /* The stream is active and running. */ + ACTIVE = 3 /* The stream is active and running. */ } state; double sampleRate; PaMacCoreDeviceProperties inputProperties; PaMacCoreDeviceProperties outputProperties; - - /* data updated by main thread and notifications, protected by timingInformationMutex */ - int timingInformationMutexIsInitialized; - pthread_mutex_t timingInformationMutex; + + /* data updated by main thread and notifications, protected by timingInformationMutex */ + int timingInformationMutexIsInitialized; + pthread_mutex_t timingInformationMutex; /* These are written by the PA thread or from CoreAudio callbacks. Protected by the mutex. */ Float64 timestampOffsetCombined; Float64 timestampOffsetInputDevice; Float64 timestampOffsetOutputDevice; - - /* Offsets in seconds to be applied to Apple timestamps to convert them to PA timestamps. + + /* Offsets in seconds to be applied to Apple timestamps to convert them to PA timestamps. * While the io proc is active, the following values are only accessed and manipulated by the ioproc */ Float64 timestampOffsetCombined_ioProcCopy; Float64 timestampOffsetInputDevice_ioProcCopy; Float64 timestampOffsetOutputDevice_ioProcCopy; - } PaMacCoreStream; diff --git a/src/hostapi/coreaudio/pa_mac_core_utilities.c b/src/hostapi/coreaudio/pa_mac_core_utilities.c index 5d93706..0d3b183 100644 --- a/src/hostapi/coreaudio/pa_mac_core_utilities.c +++ b/src/hostapi/coreaudio/pa_mac_core_utilities.c @@ -15,7 +15,7 @@ * Olivier Tristan for feedback and testing * Glenn Zelniker and Z-Systems engineering for sponsoring the Blocking I/O * interface. - * + * * * Based on the Open Source API proposed by Ross Bencina * Copyright (c) 1999-2002 Ross Bencina, Phil Burk @@ -41,13 +41,13 @@ */ /* - * The text above constitutes the entire PortAudio license; however, + * The text above constitutes the entire PortAudio license; however, * the PortAudio community also makes the following non-binding requests: * * 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. It is also - * requested that these non-binding requests be included along with the + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the * license above. */ @@ -64,43 +64,43 @@ #include OSStatus PaMacCore_AudioHardwareGetProperty( - AudioHardwarePropertyID inPropertyID, - UInt32* ioPropertyDataSize, - void* outPropertyData) + AudioHardwarePropertyID inPropertyID, + UInt32* ioPropertyDataSize, + void* outPropertyData ) { AudioObjectPropertyAddress address = { inPropertyID, kAudioObjectPropertyScopeGlobal, kAudioObjectPropertyElementMaster }; return AudioObjectGetPropertyData(kAudioObjectSystemObject, &address, 0, NULL, ioPropertyDataSize, outPropertyData); } OSStatus PaMacCore_AudioHardwareGetPropertySize( - AudioHardwarePropertyID inPropertyID, - UInt32* outSize) + AudioHardwarePropertyID inPropertyID, + UInt32* outSize ) { AudioObjectPropertyAddress address = { inPropertyID, kAudioObjectPropertyScopeGlobal, kAudioObjectPropertyElementMaster }; return AudioObjectGetPropertyDataSize(kAudioObjectSystemObject, &address, 0, NULL, outSize); } OSStatus PaMacCore_AudioDeviceGetProperty( - AudioDeviceID inDevice, - UInt32 inChannel, - Boolean isInput, - AudioDevicePropertyID inPropertyID, - UInt32* ioPropertyDataSize, - void* outPropertyData) + AudioDeviceID inDevice, + UInt32 inChannel, + Boolean isInput, + AudioDevicePropertyID inPropertyID, + UInt32* ioPropertyDataSize, + void* outPropertyData ) { - AudioObjectPropertyScope scope = isInput ? kAudioDevicePropertyScopeInput : kAudioDevicePropertyScopeOutput; - AudioObjectPropertyAddress address = { inPropertyID, scope, inChannel }; - return AudioObjectGetPropertyData(inDevice, &address, 0, NULL, ioPropertyDataSize, outPropertyData); + AudioObjectPropertyScope scope = isInput ? kAudioDevicePropertyScopeInput : kAudioDevicePropertyScopeOutput; + AudioObjectPropertyAddress address = { inPropertyID, scope, inChannel }; + return AudioObjectGetPropertyData(inDevice, &address, 0, NULL, ioPropertyDataSize, outPropertyData); } OSStatus PaMacCore_AudioDeviceSetProperty( - AudioDeviceID inDevice, - const AudioTimeStamp* inWhen, - UInt32 inChannel, - Boolean isInput, - AudioDevicePropertyID inPropertyID, - UInt32 inPropertyDataSize, - const void* inPropertyData) + AudioDeviceID inDevice, + const AudioTimeStamp* inWhen, + UInt32 inChannel, + Boolean isInput, + AudioDevicePropertyID inPropertyID, + UInt32 inPropertyDataSize, + const void* inPropertyData ) { AudioObjectPropertyScope scope = isInput ? kAudioDevicePropertyScopeInput : kAudioDevicePropertyScopeOutput; AudioObjectPropertyAddress address = { inPropertyID, scope, inChannel }; @@ -108,11 +108,11 @@ OSStatus PaMacCore_AudioDeviceSetProperty( } OSStatus PaMacCore_AudioDeviceGetPropertySize( - AudioDeviceID inDevice, - UInt32 inChannel, - Boolean isInput, - AudioDevicePropertyID inPropertyID, - UInt32* outSize) + AudioDeviceID inDevice, + UInt32 inChannel, + Boolean isInput, + AudioDevicePropertyID inPropertyID, + UInt32* outSize ) { AudioObjectPropertyScope scope = isInput ? kAudioDevicePropertyScopeInput : kAudioDevicePropertyScopeOutput; AudioObjectPropertyAddress address = { inPropertyID, scope, inChannel }; @@ -120,12 +120,12 @@ OSStatus PaMacCore_AudioDeviceGetPropertySize( } OSStatus PaMacCore_AudioDeviceAddPropertyListener( - AudioDeviceID inDevice, - UInt32 inChannel, - Boolean isInput, - AudioDevicePropertyID inPropertyID, - AudioObjectPropertyListenerProc inProc, - void* inClientData) + AudioDeviceID inDevice, + UInt32 inChannel, + Boolean isInput, + AudioDevicePropertyID inPropertyID, + AudioObjectPropertyListenerProc inProc, + void* inClientData ) { AudioObjectPropertyScope scope = isInput ? kAudioDevicePropertyScopeInput : kAudioDevicePropertyScopeOutput; AudioObjectPropertyAddress address = { inPropertyID, scope, inChannel }; @@ -133,12 +133,12 @@ OSStatus PaMacCore_AudioDeviceAddPropertyListener( } OSStatus PaMacCore_AudioDeviceRemovePropertyListener( - AudioDeviceID inDevice, - UInt32 inChannel, - Boolean isInput, - AudioDevicePropertyID inPropertyID, - AudioObjectPropertyListenerProc inProc, - void* inClientData) + AudioDeviceID inDevice, + UInt32 inChannel, + Boolean isInput, + AudioDevicePropertyID inPropertyID, + AudioObjectPropertyListenerProc inProc, + void* inClientData ) { AudioObjectPropertyScope scope = isInput ? kAudioDevicePropertyScopeInput : kAudioDevicePropertyScopeOutput; AudioObjectPropertyAddress address = { inPropertyID, scope, inChannel }; @@ -146,11 +146,11 @@ OSStatus PaMacCore_AudioDeviceRemovePropertyListener( } OSStatus PaMacCore_AudioStreamGetProperty( - AudioStreamID inStream, - UInt32 inChannel, - AudioDevicePropertyID inPropertyID, - UInt32* ioPropertyDataSize, - void* outPropertyData) + AudioStreamID inStream, + UInt32 inChannel, + AudioDevicePropertyID inPropertyID, + UInt32* ioPropertyDataSize, + void* outPropertyData ) { AudioObjectPropertyAddress address = { inPropertyID, kAudioObjectPropertyScopeGlobal, kAudioObjectPropertyElementMaster }; return AudioObjectGetPropertyData(inStream, &address, 0, NULL, ioPropertyDataSize, outPropertyData); @@ -158,28 +158,28 @@ OSStatus PaMacCore_AudioStreamGetProperty( PaError PaMacCore_SetUnixError( int err, int line ) { - PaError ret; - const char *errorText; + PaError ret; + const char *errorText; - if( err == 0 ) - { - return paNoError; - } + if( err == 0 ) + { + return paNoError; + } - ret = paNoError; - errorText = strerror( err ); + ret = paNoError; + errorText = strerror( err ); - /** Map Unix error to PaError. Pretty much the only one that maps - is ENOMEM. */ - if( err == ENOMEM ) - ret = paInsufficientMemory; - else - ret = paInternalError; + /** Map Unix error to PaError. Pretty much the only one that maps + is ENOMEM. */ + if( err == ENOMEM ) + ret = paInsufficientMemory; + else + ret = paInternalError; - DBUG(("%d on line %d: msg='%s'\n", err, line, errorText)); - PaUtil_SetLastHostErrorInfo( paCoreAudio, err, errorText ); + DBUG(("%d on line %d: msg='%s'\n", err, line, errorText)); + PaUtil_SetLastHostErrorInfo( paCoreAudio, err, errorText ); - return ret; + return ret; } /* @@ -190,97 +190,125 @@ PaError PaMacCore_SetError(OSStatus error, int line, int isError) /*FIXME: still need to handle possible ComponentResult values.*/ /* unfortunately, they don't seem to be documented anywhere.*/ PaError result; - const char *errorType; + const char *errorType; const char *errorText; - + switch (error) { case kAudioHardwareNoError: return paNoError; case kAudioHardwareNotRunningError: errorText = "Audio Hardware Not Running"; - result = paInternalError; break; - case kAudioHardwareUnspecifiedError: + result = paInternalError; + break; + case kAudioHardwareUnspecifiedError: errorText = "Unspecified Audio Hardware Error"; - result = paInternalError; break; + result = paInternalError; + break; case kAudioHardwareUnknownPropertyError: errorText = "Audio Hardware: Unknown Property"; - result = paInternalError; break; + result = paInternalError; + break; case kAudioHardwareBadPropertySizeError: errorText = "Audio Hardware: Bad Property Size"; - result = paInternalError; break; - case kAudioHardwareIllegalOperationError: + result = paInternalError; + break; + case kAudioHardwareIllegalOperationError: errorText = "Audio Hardware: Illegal Operation"; - result = paInternalError; break; + result = paInternalError; + break; case kAudioHardwareBadDeviceError: errorText = "Audio Hardware: Bad Device"; - result = paInvalidDevice; break; + result = paInvalidDevice; + break; case kAudioHardwareBadStreamError: errorText = "Audio Hardware: BadStream"; - result = paBadStreamPtr; break; + result = paBadStreamPtr; + break; case kAudioHardwareUnsupportedOperationError: errorText = "Audio Hardware: Unsupported Operation"; - result = paInternalError; break; + result = paInternalError; + break; case kAudioDeviceUnsupportedFormatError: errorText = "Audio Device: Unsupported Format"; - result = paSampleFormatNotSupported; break; + result = paSampleFormatNotSupported; + break; case kAudioDevicePermissionsError: errorText = "Audio Device: Permissions Error"; - result = paDeviceUnavailable; break; + result = paDeviceUnavailable; + break; /* Audio Unit Errors: http://developer.apple.com/documentation/MusicAudio/Reference/CoreAudio/audio_units/chapter_5_section_3.html */ case kAudioUnitErr_InvalidProperty: errorText = "Audio Unit: Invalid Property"; - result = paInternalError; break; + result = paInternalError; + break; case kAudioUnitErr_InvalidParameter: errorText = "Audio Unit: Invalid Parameter"; - result = paInternalError; break; + result = paInternalError; + break; case kAudioUnitErr_NoConnection: errorText = "Audio Unit: No Connection"; - result = paInternalError; break; + result = paInternalError; + break; case kAudioUnitErr_FailedInitialization: errorText = "Audio Unit: Initialization Failed"; - result = paInternalError; break; + result = paInternalError; + break; case kAudioUnitErr_TooManyFramesToProcess: errorText = "Audio Unit: Too Many Frames"; - result = paInternalError; break; + result = paInternalError; + break; case kAudioUnitErr_InvalidFile: errorText = "Audio Unit: Invalid File"; - result = paInternalError; break; + result = paInternalError; + break; case kAudioUnitErr_UnknownFileType: errorText = "Audio Unit: Unknown File Type"; - result = paInternalError; break; + result = paInternalError; + break; case kAudioUnitErr_FileNotSpecified: errorText = "Audio Unit: File Not Specified"; - result = paInternalError; break; + result = paInternalError; + break; case kAudioUnitErr_FormatNotSupported: errorText = "Audio Unit: Format Not Supported"; - result = paInternalError; break; + result = paInternalError; + break; case kAudioUnitErr_Uninitialized: errorText = "Audio Unit: Uninitialized"; - result = paInternalError; break; + result = paInternalError; + break; case kAudioUnitErr_InvalidScope: errorText = "Audio Unit: Invalid Scope"; - result = paInternalError; break; + result = paInternalError; + break; case kAudioUnitErr_PropertyNotWritable: errorText = "Audio Unit: PropertyNotWritable"; - result = paInternalError; break; + result = paInternalError; + break; case kAudioUnitErr_InvalidPropertyValue: errorText = "Audio Unit: Invalid Property Value"; - result = paInternalError; break; + result = paInternalError; + break; case kAudioUnitErr_PropertyNotInUse: errorText = "Audio Unit: Property Not In Use"; - result = paInternalError; break; + result = paInternalError; + break; case kAudioUnitErr_Initialized: errorText = "Audio Unit: Initialized"; - result = paInternalError; break; + result = paInternalError; + break; case kAudioUnitErr_InvalidOfflineRender: errorText = "Audio Unit: Invalid Offline Render"; - result = paInternalError; break; + result = paInternalError; + break; case kAudioUnitErr_Unauthorized: errorText = "Audio Unit: Unauthorized"; - result = paInternalError; break; + result = paInternalError; + break; case kAudioUnitErr_CannotDoInCurrentContext: errorText = "Audio Unit: cannot do in current context"; - result = paInternalError; break; + result = paInternalError; + break; default: errorText = "Unknown Error"; result = paInternalError; @@ -325,60 +353,60 @@ PaError PaMacCore_SetError(OSStatus error, int line, int isError) * FEEDBACK: too liberal/conservative/another way? */ long computeRingBufferSize( const PaStreamParameters *inputParameters, - const PaStreamParameters *outputParameters, - long inputFramesPerBuffer, - long outputFramesPerBuffer, - double sampleRate ) + const PaStreamParameters *outputParameters, + long inputFramesPerBuffer, + long outputFramesPerBuffer, + double sampleRate ) { - long ringSize; - int index; - int i; - double latency ; - long framesPerBuffer ; + long ringSize; + int index; + int i; + double latency ; + long framesPerBuffer ; - VVDBUG(( "computeRingBufferSize()\n" )); + VVDBUG(( "computeRingBufferSize()\n" )); - assert( inputParameters || outputParameters ); + assert( inputParameters || outputParameters ); - if( outputParameters && inputParameters ) - { - latency = MAX( inputParameters->suggestedLatency, outputParameters->suggestedLatency ); - framesPerBuffer = MAX( inputFramesPerBuffer, outputFramesPerBuffer ); - } - else if( outputParameters ) - { - latency = outputParameters->suggestedLatency; - framesPerBuffer = outputFramesPerBuffer ; - } - else /* we have inputParameters */ - { - latency = inputParameters->suggestedLatency; - framesPerBuffer = inputFramesPerBuffer ; - } + if( outputParameters && inputParameters ) + { + latency = MAX( inputParameters->suggestedLatency, outputParameters->suggestedLatency ); + framesPerBuffer = MAX( inputFramesPerBuffer, outputFramesPerBuffer ); + } + else if( outputParameters ) + { + latency = outputParameters->suggestedLatency; + framesPerBuffer = outputFramesPerBuffer ; + } + else /* we have inputParameters */ + { + latency = inputParameters->suggestedLatency; + framesPerBuffer = inputFramesPerBuffer ; + } - ringSize = (long) ( latency * sampleRate * 2 + .5); - VDBUG( ( "suggested latency : %d\n", (int) (latency*sampleRate) ) ); - if( ringSize < framesPerBuffer * 3 ) - ringSize = framesPerBuffer * 3 ; - VDBUG(("framesPerBuffer:%d\n",(int)framesPerBuffer)); - VDBUG(("Ringbuffer size (1): %d\n", (int)ringSize )); + ringSize = (long) ( latency * sampleRate * 2 + .5); + VDBUG( ( "suggested latency : %d\n", (int) (latency*sampleRate) ) ); + if( ringSize < framesPerBuffer * 3 ) + ringSize = framesPerBuffer * 3 ; + VDBUG(("framesPerBuffer:%d\n",(int)framesPerBuffer)); + VDBUG(("Ringbuffer size (1): %d\n", (int)ringSize )); - /* make sure it's at least 4 */ - ringSize = MAX( ringSize, 4 ); + /* make sure it's at least 4 */ + ringSize = MAX( ringSize, 4 ); - /* round up to the next power of 2 */ - index = -1; - for( i=0; i> i & 0x01 ) - index = i; - assert( index > 0 ); - if( ringSize <= ( 0x01 << index ) ) - ringSize = 0x01 << index ; - else - ringSize = 0x01 << ( index + 1 ); + /* round up to the next power of 2 */ + index = -1; + for( i=0; i> i & 0x01 ) + index = i; + assert( index > 0 ); + if( ringSize <= ( 0x01 << index ) ) + ringSize = 0x01 << index ; + else + ringSize = 0x01 << ( index + 1 ); - VDBUG(( "Final Ringbuffer size (2): %d\n", (int)ringSize )); - return ringSize; + VDBUG(( "Final Ringbuffer size (2): %d\n", (int)ringSize )); + return ringSize; } @@ -395,16 +423,16 @@ long computeRingBufferSize( const PaStreamParameters *inputParameters, */ OSStatus propertyProc( - AudioObjectID inObjectID, - UInt32 inNumberAddresses, - const AudioObjectPropertyAddress* inAddresses, - void* inClientData) + AudioObjectID inObjectID, + UInt32 inNumberAddresses, + const AudioObjectPropertyAddress* inAddresses, + void* inClientData ) { - // this is where we would set the condition variable - return noErr; + // this is where we would set the condition variable + return noErr; } -/* sets the value of the given property and waits for the change to +/* sets the value of the given property and waits for the change to be acknowledged, and returns the final value, which is not guaranteed by this function to be the same as the desired value. Obviously, this function can only be used for data whose input and output are the @@ -414,82 +442,82 @@ OSStatus propertyProc( outPropertyData is zeroed, which may or may not be useful in determining if the property was read. */ PaError AudioDeviceSetPropertyNowAndWaitForChange( - AudioDeviceID inDevice, - UInt32 inChannel, - Boolean isInput, - AudioDevicePropertyID inPropertyID, - UInt32 inPropertyDataSize, - const void *inPropertyData, - void *outPropertyData ) + AudioDeviceID inDevice, + UInt32 inChannel, + Boolean isInput, + AudioDevicePropertyID inPropertyID, + UInt32 inPropertyDataSize, + const void *inPropertyData, + void *outPropertyData ) { - OSStatus macErr; - UInt32 outPropertyDataSize = inPropertyDataSize; + OSStatus macErr; + UInt32 outPropertyDataSize = inPropertyDataSize; - /* First, see if it already has that value. If so, return. */ - macErr = PaMacCore_AudioDeviceGetProperty( inDevice, inChannel, - isInput, inPropertyID, - &outPropertyDataSize, outPropertyData ); - if( macErr ) { - memset( outPropertyData, 0, inPropertyDataSize ); - goto failMac; - } - if( inPropertyDataSize!=outPropertyDataSize ) - return paInternalError; - if( 0==memcmp( outPropertyData, inPropertyData, outPropertyDataSize ) ) - return paNoError; + /* First, see if it already has that value. If so, return. */ + macErr = PaMacCore_AudioDeviceGetProperty( inDevice, inChannel, + isInput, inPropertyID, + &outPropertyDataSize, outPropertyData ); + if( macErr ) { + memset( outPropertyData, 0, inPropertyDataSize ); + goto failMac; + } + if( inPropertyDataSize!=outPropertyDataSize ) + return paInternalError; + if( 0==memcmp( outPropertyData, inPropertyData, outPropertyDataSize ) ) + return paNoError; - /* Ideally, we'd use a condition variable to determine changes. - we could set that up here. */ + /* Ideally, we'd use a condition variable to determine changes. + we could set that up here. */ - /* If we were using a cond variable, we'd do something useful here, - but for now, this is just to make 10.6 happy. */ - macErr = PaMacCore_AudioDeviceAddPropertyListener( inDevice, inChannel, isInput, - inPropertyID, propertyProc, - NULL ); - if( macErr ) - /* we couldn't add a listener. */ - goto failMac; + /* If we were using a cond variable, we'd do something useful here, + but for now, this is just to make 10.6 happy. */ + macErr = PaMacCore_AudioDeviceAddPropertyListener( inDevice, inChannel, isInput, + inPropertyID, propertyProc, + NULL ); + if( macErr ) + /* we couldn't add a listener. */ + goto failMac; - /* set property */ - macErr = PaMacCore_AudioDeviceSetProperty( inDevice, NULL, inChannel, - isInput, inPropertyID, - inPropertyDataSize, inPropertyData ); - if( macErr ) - goto failMac; + /* set property */ + macErr = PaMacCore_AudioDeviceSetProperty( inDevice, NULL, inChannel, + isInput, inPropertyID, + inPropertyDataSize, inPropertyData ); + if( macErr ) + goto failMac; - /* busy-wait up to 30 seconds for the property to change */ - /* busy-wait is justified here only because the correct alternative (condition variable) - was hard to test, since most of the waiting ended up being for setting rather than - getting in OS X 10.5. This was not the case in earlier OS versions. */ - struct timeval tv1, tv2; - gettimeofday( &tv1, NULL ); - memcpy( &tv2, &tv1, sizeof( struct timeval ) ); - while( tv2.tv_sec - tv1.tv_sec < 30 ) { - /* now read the property back out */ - macErr = PaMacCore_AudioDeviceGetProperty( inDevice, inChannel, - isInput, inPropertyID, - &outPropertyDataSize, outPropertyData ); - if( macErr ) { - memset( outPropertyData, 0, inPropertyDataSize ); - goto failMac; - } - /* and compare... */ - if( 0==memcmp( outPropertyData, inPropertyData, outPropertyDataSize ) ) { - PaMacCore_AudioDeviceRemovePropertyListener( inDevice, inChannel, isInput, inPropertyID, propertyProc, NULL); - return paNoError; - } - /* No match yet, so let's sleep and try again. */ - Pa_Sleep( 100 ); - gettimeofday( &tv2, NULL ); - } - DBUG( ("Timeout waiting for device setting.\n" ) ); + /* busy-wait up to 30 seconds for the property to change */ + /* busy-wait is justified here only because the correct alternative (condition variable) + was hard to test, since most of the waiting ended up being for setting rather than + getting in OS X 10.5. This was not the case in earlier OS versions. */ + struct timeval tv1, tv2; + gettimeofday( &tv1, NULL ); + memcpy( &tv2, &tv1, sizeof( struct timeval ) ); + while( tv2.tv_sec - tv1.tv_sec < 30 ) { + /* now read the property back out */ + macErr = PaMacCore_AudioDeviceGetProperty( inDevice, inChannel, + isInput, inPropertyID, + &outPropertyDataSize, outPropertyData ); + if( macErr ) { + memset( outPropertyData, 0, inPropertyDataSize ); + goto failMac; + } + /* and compare... */ + if( 0==memcmp( outPropertyData, inPropertyData, outPropertyDataSize ) ) { + PaMacCore_AudioDeviceRemovePropertyListener( inDevice, inChannel, isInput, inPropertyID, propertyProc, NULL); + return paNoError; + } + /* No match yet, so let's sleep and try again. */ + Pa_Sleep( 100 ); + gettimeofday( &tv2, NULL ); + } + DBUG( ("Timeout waiting for device setting.\n" ) ); - PaMacCore_AudioDeviceRemovePropertyListener( inDevice, inChannel, isInput, inPropertyID, propertyProc, NULL ); - return paNoError; + PaMacCore_AudioDeviceRemovePropertyListener( inDevice, inChannel, isInput, inPropertyID, propertyProc, NULL ); + return paNoError; - failMac: - PaMacCore_AudioDeviceRemovePropertyListener( inDevice, inChannel, isInput, inPropertyID, propertyProc, NULL ); - return ERR( macErr ); +failMac: + PaMacCore_AudioDeviceRemovePropertyListener( inDevice, inChannel, isInput, inPropertyID, propertyProc, NULL ); + return ERR( macErr ); } /* @@ -506,93 +534,93 @@ PaError setBestSampleRateForDevice( const AudioDeviceID device, const bool requireExact, const Float64 desiredSrate ) { - const bool isInput = isOutput ? 0 : 1; - Float64 srate; - UInt32 propsize = sizeof( Float64 ); - OSErr err; - AudioValueRange *ranges; - int i=0; - Float64 max = -1; /*the maximum rate available*/ - Float64 best = -1; /*the lowest sample rate still greater than desired rate*/ - VDBUG(("Setting sample rate for device %ld to %g.\n",(long)device,(float)desiredSrate)); + const bool isInput = isOutput ? 0 : 1; + Float64 srate; + UInt32 propsize = sizeof( Float64 ); + OSErr err; + AudioValueRange *ranges; + int i=0; + Float64 max = -1; /*the maximum rate available*/ + Float64 best = -1; /*the lowest sample rate still greater than desired rate*/ + VDBUG(("Setting sample rate for device %ld to %g.\n",(long)device,(float)desiredSrate)); - /* -- try setting the sample rate -- */ - srate = 0; - err = AudioDeviceSetPropertyNowAndWaitForChange( - device, 0, isInput, - kAudioDevicePropertyNominalSampleRate, - propsize, &desiredSrate, &srate ); + /* -- try setting the sample rate -- */ + srate = 0; + err = AudioDeviceSetPropertyNowAndWaitForChange( + device, 0, isInput, + kAudioDevicePropertyNominalSampleRate, + propsize, &desiredSrate, &srate ); - /* -- if the rate agrees, and was changed, we are done -- */ - if( srate != 0 && srate == desiredSrate ) - return paNoError; - /* -- if the rate agrees, and we got no errors, we are done -- */ - if( !err && srate == desiredSrate ) - return paNoError; - /* -- we've failed if the rates disagree and we are setting input -- */ - if( requireExact ) - return paInvalidSampleRate; + /* -- if the rate agrees, and was changed, we are done -- */ + if( srate != 0 && srate == desiredSrate ) + return paNoError; + /* -- if the rate agrees, and we got no errors, we are done -- */ + if( !err && srate == desiredSrate ) + return paNoError; + /* -- we've failed if the rates disagree and we are setting input -- */ + if( requireExact ) + return paInvalidSampleRate; - /* -- generate a list of available sample rates -- */ - err = PaMacCore_AudioDeviceGetPropertySize( device, 0, isInput, - kAudioDevicePropertyAvailableNominalSampleRates, - &propsize ); - if( err ) - return ERR( err ); - ranges = (AudioValueRange *)calloc( 1, propsize ); - if( !ranges ) - return paInsufficientMemory; - err = PaMacCore_AudioDeviceGetProperty( device, 0, isInput, - kAudioDevicePropertyAvailableNominalSampleRates, - &propsize, ranges ); - if( err ) - { - free( ranges ); - return ERR( err ); - } - VDBUG(("Requested sample rate of %g was not available.\n", (float)desiredSrate)); - VDBUG(("%lu Available Sample Rates are:\n",propsize/sizeof(AudioValueRange))); + /* -- generate a list of available sample rates -- */ + err = PaMacCore_AudioDeviceGetPropertySize( device, 0, isInput, + kAudioDevicePropertyAvailableNominalSampleRates, + &propsize ); + if( err ) + return ERR( err ); + ranges = (AudioValueRange *)calloc( 1, propsize ); + if( !ranges ) + return paInsufficientMemory; + err = PaMacCore_AudioDeviceGetProperty( device, 0, isInput, + kAudioDevicePropertyAvailableNominalSampleRates, + &propsize, ranges ); + if( err ) + { + free( ranges ); + return ERR( err ); + } + VDBUG(("Requested sample rate of %g was not available.\n", (float)desiredSrate)); + VDBUG(("%lu Available Sample Rates are:\n",propsize/sizeof(AudioValueRange))); #ifdef MAC_CORE_VERBOSE_DEBUG - for( i=0; i max ) max = ranges[i].mMaximum; - if( ranges[i].mMinimum > desiredSrate ) { - if( best < 0 ) - best = ranges[i].mMinimum; - else if( ranges[i].mMinimum < best ) - best = ranges[i].mMinimum; - } - } - if( best < 0 ) - best = max; - VDBUG( ("Maximum Rate %g. best is %g.\n", max, best ) ); - free( ranges ); + VDBUG(("-----\n")); - /* -- set the sample rate -- */ - propsize = sizeof( best ); - srate = 0; - err = AudioDeviceSetPropertyNowAndWaitForChange( - device, 0, isInput, - kAudioDevicePropertyNominalSampleRate, - propsize, &best, &srate ); + /* -- now pick the best available sample rate -- */ + for( i=0; i max ) max = ranges[i].mMaximum; + if( ranges[i].mMinimum > desiredSrate ) { + if( best < 0 ) + best = ranges[i].mMinimum; + else if( ranges[i].mMinimum < best ) + best = ranges[i].mMinimum; + } + } + if( best < 0 ) + best = max; + VDBUG( ("Maximum Rate %g. best is %g.\n", max, best ) ); + free( ranges ); - /* -- if the set rate matches, we are done -- */ - if( srate != 0 && srate == best ) - return paNoError; + /* -- set the sample rate -- */ + propsize = sizeof( best ); + srate = 0; + err = AudioDeviceSetPropertyNowAndWaitForChange( + device, 0, isInput, + kAudioDevicePropertyNominalSampleRate, + propsize, &best, &srate ); - if( err ) - return ERR( err ); + /* -- if the set rate matches, we are done -- */ + if( srate != 0 && srate == best ) + return paNoError; - /* -- otherwise, something weird happened: we didn't set the rate, and we got no errors. Just bail. */ - return paInternalError; + if( err ) + return ERR( err ); + + /* -- otherwise, something weird happened: we didn't set the rate, and we got no errors. Just bail. */ + return paInternalError; } @@ -607,7 +635,7 @@ PaError setBestSampleRateForDevice( const AudioDeviceID device, */ PaError setBestFramesPerBuffer( const AudioDeviceID device, const bool isOutput, - UInt32 requestedFramesPerBuffer, + UInt32 requestedFramesPerBuffer, UInt32 *actualFramesPerBuffer ) { UInt32 afpb; @@ -623,11 +651,11 @@ PaError setBestFramesPerBuffer( const AudioDeviceID device, /* -- try and set exact FPB -- */ err = PaMacCore_AudioDeviceSetProperty( device, NULL, 0, isInput, - kAudioDevicePropertyBufferFrameSize, - propsize, &requestedFramesPerBuffer); + kAudioDevicePropertyBufferFrameSize, + propsize, &requestedFramesPerBuffer); err = PaMacCore_AudioDeviceGetProperty( device, 0, isInput, - kAudioDevicePropertyBufferFrameSize, - &propsize, actualFramesPerBuffer); + kAudioDevicePropertyBufferFrameSize, + &propsize, actualFramesPerBuffer); if( err ) { return ERR( err ); @@ -637,15 +665,15 @@ PaError setBestFramesPerBuffer( const AudioDeviceID device, { return paNoError; /* we are done */ } - + // Clip requested value against legal range for the device. propsize = sizeof(AudioValueRange); err = PaMacCore_AudioDeviceGetProperty( device, 0, isInput, - kAudioDevicePropertyBufferFrameSizeRange, - &propsize, &range ); + kAudioDevicePropertyBufferFrameSizeRange, + &propsize, &range ); if( err ) { - return ERR( err ); + return ERR( err ); } if( requestedFramesPerBuffer < range.mMinimum ) { @@ -655,21 +683,21 @@ PaError setBestFramesPerBuffer( const AudioDeviceID device, { requestedFramesPerBuffer = range.mMaximum; } - - /* --- set the buffer size (ignore errors) -- */ + + /* --- set the buffer size (ignore errors) -- */ propsize = sizeof( UInt32 ); - err = PaMacCore_AudioDeviceSetProperty( device, NULL, 0, isInput, - kAudioDevicePropertyBufferFrameSize, - propsize, &requestedFramesPerBuffer ); - /* --- read the property to check that it was set -- */ - err = PaMacCore_AudioDeviceGetProperty( device, 0, isInput, - kAudioDevicePropertyBufferFrameSize, - &propsize, actualFramesPerBuffer ); + err = PaMacCore_AudioDeviceSetProperty( device, NULL, 0, isInput, + kAudioDevicePropertyBufferFrameSize, + propsize, &requestedFramesPerBuffer ); + /* --- read the property to check that it was set -- */ + err = PaMacCore_AudioDeviceGetProperty( device, 0, isInput, + kAudioDevicePropertyBufferFrameSize, + &propsize, actualFramesPerBuffer ); - if( err ) - return ERR( err ); + if( err ) + return ERR( err ); - return paNoError; + return paNoError; } /********************** @@ -679,8 +707,8 @@ PaError setBestFramesPerBuffer( const AudioDeviceID device, **********************/ struct PaMacXRunListNode_s { - PaMacCoreStream *stream; - struct PaMacXRunListNode_s *next; + PaMacCoreStream *stream; + struct PaMacXRunListNode_s *next; } ; typedef struct PaMacXRunListNode_s PaMacXRunListNode; @@ -697,91 +725,90 @@ OSStatus xrunCallback( const AudioObjectPropertyAddress* inAddresses, void * inClientData) { - PaMacXRunListNode *node = (PaMacXRunListNode *) inClientData; - bool isInput = inAddresses->mScope == kAudioDevicePropertyScopeInput; + PaMacXRunListNode *node = (PaMacXRunListNode *) inClientData; + bool isInput = inAddresses->mScope == kAudioDevicePropertyScopeInput; - int ret = pthread_mutex_trylock( &xrunMutex ) ; + int ret = pthread_mutex_trylock( &xrunMutex ) ; - if( ret == 0 ) { + if( ret == 0 ) { - node = node->next ; //skip the first node + node = node->next ; //skip the first node - for( ; node; node=node->next ) { - PaMacCoreStream *stream = node->stream; + for( ; node; node=node->next ) { + PaMacCoreStream *stream = node->stream; - if( stream->state != ACTIVE ) - continue; //if the stream isn't active, we don't care if the device is dropping + if( stream->state != ACTIVE ) + continue; //if the stream isn't active, we don't care if the device is dropping - if( isInput ) { - if( stream->inputDevice == inDevice ) - OSAtomicOr32( paInputOverflow, &stream->xrunFlags ); - } else { - if( stream->outputDevice == inDevice ) - OSAtomicOr32( paOutputUnderflow, &stream->xrunFlags ); - } - } + if( isInput ) { + if( stream->inputDevice == inDevice ) + OSAtomicOr32( paInputOverflow, &stream->xrunFlags ); + } else { + if( stream->outputDevice == inDevice ) + OSAtomicOr32( paOutputUnderflow, &stream->xrunFlags ); + } + } - pthread_mutex_unlock( &xrunMutex ); - } + pthread_mutex_unlock( &xrunMutex ); + } - return 0; + return 0; } int initializeXRunListenerList( void ) { - xRunListSize = 0; - bzero( (void *) &firstXRunListNode, sizeof(firstXRunListNode) ); - return pthread_mutex_init( &xrunMutex, NULL ); + xRunListSize = 0; + bzero( (void *) &firstXRunListNode, sizeof(firstXRunListNode) ); + return pthread_mutex_init( &xrunMutex, NULL ); } int destroyXRunListenerList( void ) { - PaMacXRunListNode *node; - node = firstXRunListNode.next; - while( node ) { - PaMacXRunListNode *tmp = node; - node = node->next; - free( tmp ); - } - xRunListSize = 0; - return pthread_mutex_destroy( &xrunMutex ); + PaMacXRunListNode *node; + node = firstXRunListNode.next; + while( node ) { + PaMacXRunListNode *tmp = node; + node = node->next; + free( tmp ); + } + xRunListSize = 0; + return pthread_mutex_destroy( &xrunMutex ); } void *addToXRunListenerList( void *stream ) { - pthread_mutex_lock( &xrunMutex ); - PaMacXRunListNode *newNode; - // setup new node: - newNode = (PaMacXRunListNode *) malloc( sizeof( PaMacXRunListNode ) ); - newNode->stream = (PaMacCoreStream *) stream; - newNode->next = firstXRunListNode.next; - // insert: - firstXRunListNode.next = newNode; - pthread_mutex_unlock( &xrunMutex ); + pthread_mutex_lock( &xrunMutex ); + PaMacXRunListNode *newNode; + // setup new node: + newNode = (PaMacXRunListNode *) malloc( sizeof( PaMacXRunListNode ) ); + newNode->stream = (PaMacCoreStream *) stream; + newNode->next = firstXRunListNode.next; + // insert: + firstXRunListNode.next = newNode; + pthread_mutex_unlock( &xrunMutex ); - return &firstXRunListNode; + return &firstXRunListNode; } int removeFromXRunListenerList( void *stream ) { - pthread_mutex_lock( &xrunMutex ); - PaMacXRunListNode *node, *prev; - prev = &firstXRunListNode; - node = firstXRunListNode.next; - while( node ) { - if( node->stream == stream ) { - //found it: - --xRunListSize; - prev->next = node->next; - free( node ); - pthread_mutex_unlock( &xrunMutex ); - return xRunListSize; - } - prev = prev->next; - node = node->next; - } + pthread_mutex_lock( &xrunMutex ); + PaMacXRunListNode *node, *prev; + prev = &firstXRunListNode; + node = firstXRunListNode.next; + while( node ) { + if( node->stream == stream ) { + //found it: + --xRunListSize; + prev->next = node->next; + free( node ); + pthread_mutex_unlock( &xrunMutex ); + return xRunListSize; + } + prev = prev->next; + node = node->next; + } - pthread_mutex_unlock( &xrunMutex ); - // failure - return xRunListSize; + pthread_mutex_unlock( &xrunMutex ); + // failure + return xRunListSize; } - diff --git a/src/hostapi/coreaudio/pa_mac_core_utilities.h b/src/hostapi/coreaudio/pa_mac_core_utilities.h index 091ee65..c305f17 100644 --- a/src/hostapi/coreaudio/pa_mac_core_utilities.h +++ b/src/hostapi/coreaudio/pa_mac_core_utilities.h @@ -15,7 +15,7 @@ * Olivier Tristan for feedback and testing * Glenn Zelniker and Z-Systems engineering for sponsoring the Blocking I/O * interface. - * + * * * Based on the Open Source API proposed by Ross Bencina * Copyright (c) 1999-2002 Ross Bencina, Phil Burk @@ -41,13 +41,13 @@ */ /* - * The text above constitutes the entire PortAudio license; however, + * The text above constitutes the entire PortAudio license; however, * the PortAudio community also makes the following non-binding requests: * * 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. It is also - * requested that these non-binding requests be included along with the + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the * license above. */ @@ -73,7 +73,7 @@ #define MAX(a, b) (((a)<(b))?(b):(a)) #endif -#define ERR(mac_error) PaMacCore_SetError(mac_error, __LINE__, 1 ) +#define ERR(mac_error) PaMacCore_SetError(mac_error, __LINE__, 1 ) #define WARNING(mac_error) PaMacCore_SetError(mac_error, __LINE__, 0 ) @@ -114,11 +114,11 @@ OSStatus PaMacCore_AudioHardwareGetProperty( AudioHardwarePropertyID inPropertyID, UInt32* ioPropertyDataSize, - void* outPropertyData); + void* outPropertyData ); OSStatus PaMacCore_AudioHardwareGetPropertySize( AudioHardwarePropertyID inPropertyID, - UInt32* outSize); + UInt32* outSize ); OSStatus PaMacCore_AudioDeviceGetProperty( AudioDeviceID inDevice, @@ -126,7 +126,7 @@ OSStatus PaMacCore_AudioDeviceGetProperty( Boolean isInput, AudioDevicePropertyID inPropertyID, UInt32* ioPropertyDataSize, - void* outPropertyData); + void* outPropertyData ); OSStatus PaMacCore_AudioDeviceSetProperty( AudioDeviceID inDevice, @@ -135,14 +135,14 @@ OSStatus PaMacCore_AudioDeviceSetProperty( Boolean isInput, AudioDevicePropertyID inPropertyID, UInt32 inPropertyDataSize, - const void* inPropertyData); + const void* inPropertyData ); OSStatus PaMacCore_AudioDeviceGetPropertySize( AudioDeviceID inDevice, UInt32 inChannel, Boolean isInput, AudioDevicePropertyID inPropertyID, - UInt32* outSize); + UInt32* outSize ); OSStatus PaMacCore_AudioDeviceAddPropertyListener( AudioDeviceID inDevice, @@ -150,7 +150,7 @@ OSStatus PaMacCore_AudioDeviceAddPropertyListener( Boolean isInput, AudioDevicePropertyID inPropertyID, AudioObjectPropertyListenerProc inProc, - void* inClientData); + void* inClientData ); OSStatus PaMacCore_AudioDeviceRemovePropertyListener( AudioDeviceID inDevice, @@ -158,14 +158,14 @@ OSStatus PaMacCore_AudioDeviceRemovePropertyListener( Boolean isInput, AudioDevicePropertyID inPropertyID, AudioObjectPropertyListenerProc inProc, - void* inClientData); + void* inClientData ); OSStatus PaMacCore_AudioStreamGetProperty( AudioStreamID inStream, UInt32 inChannel, AudioDevicePropertyID inPropertyID, UInt32* ioPropertyDataSize, - void* outPropertyData); + void* outPropertyData ); #define UNIX_ERR(err) PaMacCore_SetUnixError( err, __LINE__ ) @@ -190,30 +190,30 @@ PaError PaMacCore_SetError(OSStatus error, int line, int isError); * */ long computeRingBufferSize( const PaStreamParameters *inputParameters, - const PaStreamParameters *outputParameters, - long inputFramesPerBuffer, - long outputFramesPerBuffer, - double sampleRate ); + const PaStreamParameters *outputParameters, + long inputFramesPerBuffer, + long outputFramesPerBuffer, + double sampleRate ); OSStatus propertyProc( - AudioObjectID inObjectID, - UInt32 inNumberAddresses, - const AudioObjectPropertyAddress* inAddresses, - void* inClientData); + AudioObjectID inObjectID, + UInt32 inNumberAddresses, + const AudioObjectPropertyAddress* inAddresses, + void* inClientData ); -/* sets the value of the given property and waits for the change to +/* sets the value of the given property and waits for the change to be acknowledged, and returns the final value, which is not guaranteed by this function to be the same as the desired value. Obviously, this function can only be used for data whose input and output are the same size and format, and their size and format are known in advance.*/ PaError AudioDeviceSetPropertyNowAndWaitForChange( - AudioDeviceID inDevice, - UInt32 inChannel, - Boolean isInput, - AudioDevicePropertyID inPropertyID, - UInt32 inPropertyDataSize, - const void *inPropertyData, - void *outPropertyData ); + AudioDeviceID inDevice, + UInt32 inChannel, + Boolean isInput, + AudioDevicePropertyID inPropertyID, + UInt32 inPropertyDataSize, + const void *inPropertyData, + void *outPropertyData ); /* * Sets the sample rate the HAL device. @@ -239,7 +239,7 @@ PaError setBestSampleRateForDevice( const AudioDeviceID device, */ PaError setBestFramesPerBuffer( const AudioDeviceID device, const bool isOutput, - UInt32 requestedFramesPerBuffer, + UInt32 requestedFramesPerBuffer, UInt32 *actualFramesPerBuffer ); @@ -250,10 +250,10 @@ PaError setBestFramesPerBuffer( const AudioDeviceID device, *********************/ OSStatus xrunCallback( - AudioObjectID inObjectID, - UInt32 inNumberAddresses, - const AudioObjectPropertyAddress* inAddresses, - void * inClientData ); + AudioObjectID inObjectID, + UInt32 inNumberAddresses, + const AudioObjectPropertyAddress* inAddresses, + void * inClientData ); /** returns zero on success or a unix style error code. */ int initializeXRunListenerList( void ); From 78415a838a8e4386539d5a1f69cb72d0591d2e2e Mon Sep 17 00:00:00 2001 From: MichalPetryka <35800402+MichalPetryka@users.noreply.github.com> Date: Thu, 18 Feb 2021 02:49:18 +0100 Subject: [PATCH 130/164] Add .editorconfig (#394) --- .editorconfig | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 .editorconfig diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..88a2e5b --- /dev/null +++ b/.editorconfig @@ -0,0 +1,13 @@ +# EditorConfig info: https://editorconfig.org/ +root = true + +[Makefile*] +indent_style = tab + +[*.{c,cpp,h,cxx,hxx}] +indent_style = space +indent_size = 4 +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true +max_line_length = 120 From 793c7ffc187c7c622c761d95fd7bf44824c19faa Mon Sep 17 00:00:00 2001 From: petris Date: Thu, 18 Feb 2021 12:40:26 +0100 Subject: [PATCH 131/164] WASAPI final whitespace fix --- src/hostapi/wasapi/pa_win_wasapi.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/hostapi/wasapi/pa_win_wasapi.c b/src/hostapi/wasapi/pa_win_wasapi.c index 0cd59bb..c76f302 100644 --- a/src/hostapi/wasapi/pa_win_wasapi.c +++ b/src/hostapi/wasapi/pa_win_wasapi.c @@ -3156,7 +3156,7 @@ static PaUint32 _GetFramesPerHostBuffer(PaUint32 userFramesPerBuffer, PaTime sug } // ------------------------------------------------------------------------------------------ -static void _RecalculateBuffersCount(PaWasapiSubStream *sub, UINT32 userFramesPerBuffer, UINT32 framesPerLatency, +static void _RecalculateBuffersCount(PaWasapiSubStream *sub, UINT32 userFramesPerBuffer, UINT32 framesPerLatency, BOOL fullDuplex, BOOL output) { // Count buffers (must be at least 1) @@ -3177,9 +3177,9 @@ static void _RecalculateBuffersCount(PaWasapiSubStream *sub, UINT32 userFramesPe if (eventMode) sub->userBufferAndHostMatch = 1; - // Full-duplex or Event mode: prefer paUtilBoundedHostBufferSize because exclusive mode will starve + // Full-duplex or Event mode: prefer paUtilBoundedHostBufferSize because exclusive mode will starve // and produce glitchy audio - // Output Polling mode: prefer paUtilFixedHostBufferSize (buffers != 1) for polling mode is it allows + // Output Polling mode: prefer paUtilFixedHostBufferSize (buffers != 1) for polling mode is it allows // to consume user data by fixed size data chunks and thus lowers memory movement (less CPU usage) if (fullDuplex || eventMode || !output) sub->buffers = 1; From b14e866b278252a2b9845036febc9819ad4b6c2b Mon Sep 17 00:00:00 2001 From: Phil Burk Date: Wed, 24 Feb 2021 18:09:57 -0800 Subject: [PATCH 132/164] configure: better test for Mac OS arch Use AC_COMPILE_IFELSE because AC_TRY_COMPILE is deprecated. Include cdefs.h because it has checks for architcture. --- configure | Bin 575026 -> 575139 bytes configure.in | 14 ++++++++++++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/configure b/configure index 42d22a02fc63476e5c34f013cc70cbad2667c288..2a59e10a8bf8ad7f6ba86ecf0481d0c5fde34f77 100755 GIT binary patch delta 216 zcmdngqrA9RxnT=quXcTaqpzcLe28msNPIw$zk86QudNc7f`Y!5LUKxKTCrY+LUKlG za(1yoT7Hp2acMz8eo;wkib7&hazGp|G;H!(9$LsOv|$OVC-RG`j01p{_#pg=8`QhT>HBM>tIF*6Xe05K~Nvu*Fz gW>-}dR>5@UbU|BYiOCK}CEK}u*|&51a;R4V08Mp56aWAK delta 72 zcmZ47tGua4xnT=quXekr4kHjV0WmWWvj8zG5VLI;)nQjwoUX8*k$-wWA3Hmv!Ssvi V>{^rUk4m-I__A-W@#Rpj1OW5!6vF@j diff --git a/configure.in b/configure.in index 1727df7..bb4ae96 100644 --- a/configure.in +++ b/configure.in @@ -11,6 +11,15 @@ dnl Init autoconf and make sure configure is being called dnl from the right directory AC_INIT([include/portaudio.h]) +dnl This is is for testing compilation on Mac OS +PAMAC_TEST_PROGRAM=" + /* cdefs.h checks for supported architectures. */ + #include + int main() { + return 0; + } +" + dnl Define build, build_cpu, build_vendor, build_os AC_CANONICAL_BUILD dnl Define host, host_cpu, host_vendor, host_os @@ -244,13 +253,14 @@ case "${host_os}" in esac dnl Pick which architectures to build for based on what - dnl the compiler supports. + dnl the compiler and SDK supports. mac_arches="" for arch in x86_64 arm64 do save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -arch $arch" - AC_TRY_COMPILE([], [return 0;], + AC_COMPILE_IFELSE( + [AC_LANG_SOURCE([$PAMAC_TEST_PROGRAM])], [ if [[ -z "$mac_arches" ]] ; then mac_arches="-arch $arch" From 3f7bee79a65327d2e0965e8a74299723ed6f072d Mon Sep 17 00:00:00 2001 From: Phil Burk Date: Sun, 24 Jan 2021 12:10:04 -0800 Subject: [PATCH 133/164] Bump version to 19.7.0 --- src/common/pa_front.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/common/pa_front.c b/src/common/pa_front.c index a6b5f61..65a656f 100644 --- a/src/common/pa_front.c +++ b/src/common/pa_front.c @@ -91,7 +91,7 @@ * This is incremented when we add functionality in a backwards-compatible manner. * Or it is set to zero when paVersionMajor is incremented. */ -#define paVersionMinor 6 +#define paVersionMinor 7 /** * This is incremented when we make backwards-compatible bug fixes. From eec7bb739771381ab698a6a611d933bdd72cbd8f Mon Sep 17 00:00:00 2001 From: Be Date: Fri, 19 Mar 2021 12:51:31 -0500 Subject: [PATCH 134/164] JACK PipeWire fixes (escape regex chars) (#504) This patch fixes a problem caused by special regex characters appearing in the device names when using the Jack interface to PipeWire. It is uncommon for JACK ports to have any characters that need to be escaped in a regex. jackd simply calls the audio interface "system". However PipeWire uses the device name from ALSA for the JACK port names. If this contains any special regex characters, BuildDeviceList would find the device but determine it has 0 input channels and 0 output channels. In my case, I have an RME Babyface Pro which puts its serial number in parentheses: $ aplay -l card 0: Pro70785713 [Babyface Pro (70785713)], device 0: USB Audio [USB Audio] Subdevices: 1/1 Subdevice #0: subdevice #0 --- src/hostapi/jack/pa_jack.c | 83 +++++++++++++++++++++++++++++++++----- 1 file changed, 73 insertions(+), 10 deletions(-) diff --git a/src/hostapi/jack/pa_jack.c b/src/hostapi/jack/pa_jack.c index 0dad24f..88926f4 100644 --- a/src/hostapi/jack/pa_jack.c +++ b/src/hostapi/jack/pa_jack.c @@ -76,6 +76,7 @@ static pthread_t mainThread_; static char *jackErr_ = NULL; static const char* clientName_ = "PortAudio"; +static const char* port_regex_suffix = ":.*"; #define STRINGIZE_HELPER(expr) #expr #define STRINGIZE(expr) STRINGIZE_HELPER(expr) @@ -451,6 +452,38 @@ BlockingWaitEmpty( PaStream *s ) /* ---- jack driver ---- */ +/* copy null terminated string source to destination, escaping regex characters with '\\' in the process */ +static void copy_string_and_escape_regex_chars( char *destination, const char *source, size_t destbuffersize ) +{ + assert( destination != source ); + assert( destbuffersize > 0 ); + + char *dest = destination; + /* dest_stop is the last location that we can null-terminate the string */ + char *dest_stop = destination + (destbuffersize - 1); + + const char *src = source; + + while ( *src != '\0' && dest != dest_stop ) + { + const char c = *src; + if ( strchr( "\\()[]{}*+?|$^.", c ) != NULL ) + { + if( (dest + 1) == dest_stop ) + break; /* only proceed if we can write both c and the escape */ + + *dest = '\\'; + dest++; + } + *dest = c; + dest++; + + src++; + } + + *dest = '\0'; +} + /* BuildDeviceList(): * * The process of determining a list of PortAudio "devices" from @@ -472,7 +505,12 @@ static PaError BuildDeviceList( PaJackHostApiRepresentation *jackApi ) const char **jack_ports = NULL; char **client_names = NULL; - char *regex_pattern = NULL; + char *port_regex_string = NULL; + char *device_name_regex_escaped = NULL; + // In the worst case scenario, every character would be escaped, doubling the string size. + // Add 1 for null terminator. + size_t device_name_regex_escaped_size = jack_client_name_size() * 2 + 1; + size_t port_regex_size = device_name_regex_escaped_size + strlen(port_regex_suffix); int port_index, client_index, i; double globalSampleRate; regex_t port_regex; @@ -490,7 +528,9 @@ static PaError BuildDeviceList( PaJackHostApiRepresentation *jackApi ) * associated with the previous list */ PaUtil_FreeAllAllocations( jackApi->deviceInfoMemory ); - regex_pattern = PaUtil_GroupAllocateMemory( jackApi->deviceInfoMemory, jack_client_name_size() + 3 ); + port_regex_string = PaUtil_GroupAllocateMemory( jackApi->deviceInfoMemory, port_regex_size ); + device_name_regex_escaped = PaUtil_GroupAllocateMemory( + jackApi->deviceInfoMemory, device_name_regex_escaped_size ); tmp_client_name = PaUtil_GroupAllocateMemory( jackApi->deviceInfoMemory, jack_client_name_size() ); /* We can only retrieve the list of clients indirectly, by first @@ -512,6 +552,7 @@ static PaError BuildDeviceList( PaJackHostApiRepresentation *jackApi ) int client_seen = FALSE; regmatch_t match_info; const char *port = jack_ports[port_index]; + PA_DEBUG(( "JACK port found: %s\n", port )); /* extract the client name from the port name, using a regex * that parses the clientname:portname syntax */ @@ -584,11 +625,14 @@ static PaError BuildDeviceList( PaJackHostApiRepresentation *jackApi ) /* To determine how many input and output channels are available, * we re-query jackd with more specific parameters. */ - - sprintf( regex_pattern, "%s:.*", client_names[client_index] ); + copy_string_and_escape_regex_chars( device_name_regex_escaped, + client_names[client_index], + device_name_regex_escaped_size ); + strncpy( port_regex_string, device_name_regex_escaped, port_regex_size ); + strncat( port_regex_string, port_regex_suffix, port_regex_size ); /* ... what are your output ports (that we could input from)? */ - clientPorts = jack_get_ports( jackApi->jack_client, regex_pattern, + clientPorts = jack_get_ports( jackApi->jack_client, port_regex_string, JACK_PORT_TYPE_FILTER, JackPortIsOutput); curDevInfo->maxInputChannels = 0; curDevInfo->defaultLowInputLatency = 0.; @@ -609,7 +653,7 @@ static PaError BuildDeviceList( PaJackHostApiRepresentation *jackApi ) } /* ... what are your input ports (that we could output to)? */ - clientPorts = jack_get_ports( jackApi->jack_client, regex_pattern, + clientPorts = jack_get_ports( jackApi->jack_client, port_regex_string, JACK_PORT_TYPE_FILTER, JackPortIsInput); curDevInfo->maxOutputChannels = 0; curDevInfo->defaultLowOutputLatency = 0.; @@ -629,6 +673,11 @@ static PaError BuildDeviceList( PaJackHostApiRepresentation *jackApi ) free(clientPorts); } + PA_DEBUG(( "Adding JACK device %s with %d input channels and %d output channels\n", + client_names[client_index], + curDevInfo->maxInputChannels, + curDevInfo->maxOutputChannels )); + /* Add this client to the list of devices */ commonApi->deviceInfos[client_index] = curDevInfo; ++commonApi->info.deviceCount; @@ -1080,8 +1129,13 @@ static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi, PaJackHostApiRepresentation *jackHostApi = (PaJackHostApiRepresentation*)hostApi; PaJackStream *stream = NULL; char *port_string = PaUtil_GroupAllocateMemory( jackHostApi->deviceInfoMemory, jack_port_name_size() ); - unsigned long regexSz = jack_client_name_size() + 3; - char *regex_pattern = PaUtil_GroupAllocateMemory( jackHostApi->deviceInfoMemory, regexSz ); + // In the worst case every character would be escaped which would double the string length. + // Add 1 for null terminator + size_t regex_escaped_client_name_length = jack_client_name_size() * 2 + 1; + char *regex_escaped_client_name = PaUtil_GroupAllocateMemory( + jackHostApi->deviceInfoMemory, regex_escaped_client_name_length ); + unsigned long regex_size = jack_client_name_size() * 2 + 1 + strlen(port_regex_suffix); + char *regex_pattern = PaUtil_GroupAllocateMemory( jackHostApi->deviceInfoMemory, regex_size ); const char **jack_ports = NULL; /* int jack_max_buffer_size = jack_get_buffer_size( jackHostApi->jack_client ); */ int i; @@ -1239,7 +1293,11 @@ static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi, int err = 0; /* Get output ports of our capture device */ - snprintf( regex_pattern, regexSz, "%s:.*", hostApi->deviceInfos[ inputParameters->device ]->name ); + copy_string_and_escape_regex_chars( regex_escaped_client_name, + hostApi->deviceInfos[ inputParameters->device ]->name, + regex_escaped_client_name_length ); + strncpy( regex_pattern, regex_escaped_client_name, regex_size ); + strncat( regex_pattern, port_regex_suffix, regex_size ); UNLESS( jack_ports = jack_get_ports( jackHostApi->jack_client, regex_pattern, JACK_PORT_TYPE_FILTER, JackPortIsOutput ), paUnanticipatedHostError ); for( i = 0; i < inputChannelCount && jack_ports[i]; i++ ) @@ -1263,7 +1321,11 @@ static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi, int err = 0; /* Get input ports of our playback device */ - snprintf( regex_pattern, regexSz, "%s:.*", hostApi->deviceInfos[ outputParameters->device ]->name ); + copy_string_and_escape_regex_chars( regex_escaped_client_name, + hostApi->deviceInfos[ outputParameters->device ]->name, + regex_escaped_client_name_length ); + strncpy( regex_pattern, regex_escaped_client_name, regex_size ); + strncat( regex_pattern, port_regex_suffix, regex_size ); UNLESS( jack_ports = jack_get_ports( jackHostApi->jack_client, regex_pattern, JACK_PORT_TYPE_FILTER, JackPortIsInput ), paUnanticipatedHostError ); for( i = 0; i < outputChannelCount && jack_ports[i]; i++ ) @@ -1769,3 +1831,4 @@ PaError PaJack_GetClientName(const char** clientName) error: return result; } + From 147dd722548358763a8b649b3e4b41dfffbcfbb6 Mon Sep 17 00:00:00 2001 From: Ross Bencina Date: Thu, 1 Apr 2021 11:17:30 +1100 Subject: [PATCH 135/164] Improve JACK regex pattern escape code (see ticket #534). Improves previously merged PR #405 master commit eec7bb7 by performing string conversion directly in to the target buffer, thus avoiding one allocation and one strncpy per client/device name. (#536) --- src/hostapi/jack/pa_jack.c | 22 +++++++--------------- 1 file changed, 7 insertions(+), 15 deletions(-) diff --git a/src/hostapi/jack/pa_jack.c b/src/hostapi/jack/pa_jack.c index 88926f4..124c0f8 100644 --- a/src/hostapi/jack/pa_jack.c +++ b/src/hostapi/jack/pa_jack.c @@ -506,7 +506,6 @@ static PaError BuildDeviceList( PaJackHostApiRepresentation *jackApi ) const char **jack_ports = NULL; char **client_names = NULL; char *port_regex_string = NULL; - char *device_name_regex_escaped = NULL; // In the worst case scenario, every character would be escaped, doubling the string size. // Add 1 for null terminator. size_t device_name_regex_escaped_size = jack_client_name_size() * 2 + 1; @@ -529,8 +528,6 @@ static PaError BuildDeviceList( PaJackHostApiRepresentation *jackApi ) PaUtil_FreeAllAllocations( jackApi->deviceInfoMemory ); port_regex_string = PaUtil_GroupAllocateMemory( jackApi->deviceInfoMemory, port_regex_size ); - device_name_regex_escaped = PaUtil_GroupAllocateMemory( - jackApi->deviceInfoMemory, device_name_regex_escaped_size ); tmp_client_name = PaUtil_GroupAllocateMemory( jackApi->deviceInfoMemory, jack_client_name_size() ); /* We can only retrieve the list of clients indirectly, by first @@ -625,10 +622,9 @@ static PaError BuildDeviceList( PaJackHostApiRepresentation *jackApi ) /* To determine how many input and output channels are available, * we re-query jackd with more specific parameters. */ - copy_string_and_escape_regex_chars( device_name_regex_escaped, + copy_string_and_escape_regex_chars( port_regex_string, client_names[client_index], device_name_regex_escaped_size ); - strncpy( port_regex_string, device_name_regex_escaped, port_regex_size ); strncat( port_regex_string, port_regex_suffix, port_regex_size ); /* ... what are your output ports (that we could input from)? */ @@ -1131,10 +1127,8 @@ static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi, char *port_string = PaUtil_GroupAllocateMemory( jackHostApi->deviceInfoMemory, jack_port_name_size() ); // In the worst case every character would be escaped which would double the string length. // Add 1 for null terminator - size_t regex_escaped_client_name_length = jack_client_name_size() * 2 + 1; - char *regex_escaped_client_name = PaUtil_GroupAllocateMemory( - jackHostApi->deviceInfoMemory, regex_escaped_client_name_length ); - unsigned long regex_size = jack_client_name_size() * 2 + 1 + strlen(port_regex_suffix); + size_t regex_escaped_client_name_size = jack_client_name_size() * 2 + 1; + unsigned long regex_size = regex_escaped_client_name_size + strlen(port_regex_suffix); char *regex_pattern = PaUtil_GroupAllocateMemory( jackHostApi->deviceInfoMemory, regex_size ); const char **jack_ports = NULL; /* int jack_max_buffer_size = jack_get_buffer_size( jackHostApi->jack_client ); */ @@ -1293,10 +1287,9 @@ static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi, int err = 0; /* Get output ports of our capture device */ - copy_string_and_escape_regex_chars( regex_escaped_client_name, + copy_string_and_escape_regex_chars( regex_pattern, hostApi->deviceInfos[ inputParameters->device ]->name, - regex_escaped_client_name_length ); - strncpy( regex_pattern, regex_escaped_client_name, regex_size ); + regex_escaped_client_name_size ); strncat( regex_pattern, port_regex_suffix, regex_size ); UNLESS( jack_ports = jack_get_ports( jackHostApi->jack_client, regex_pattern, JACK_PORT_TYPE_FILTER, JackPortIsOutput ), paUnanticipatedHostError ); @@ -1321,10 +1314,9 @@ static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi, int err = 0; /* Get input ports of our playback device */ - copy_string_and_escape_regex_chars( regex_escaped_client_name, + copy_string_and_escape_regex_chars( regex_pattern, hostApi->deviceInfos[ outputParameters->device ]->name, - regex_escaped_client_name_length ); - strncpy( regex_pattern, regex_escaped_client_name, regex_size ); + regex_escaped_client_name_size ); strncat( regex_pattern, port_regex_suffix, regex_size ); UNLESS( jack_ports = jack_get_ports( jackHostApi->jack_client, regex_pattern, JACK_PORT_TYPE_FILTER, JackPortIsInput ), paUnanticipatedHostError ); From 67caa13f19251f099c0894813964d6ad7315fa6b Mon Sep 17 00:00:00 2001 From: Phil Burk Date: Mon, 12 Apr 2021 06:29:03 -0700 Subject: [PATCH 136/164] fix patest_converters.c argc argv order (#544) They were reversed. Also added void casts to prevent unused parameter warnings. --- test/patest_converters.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/test/patest_converters.c b/test/patest_converters.c index f76738c..55fca22 100644 --- a/test/patest_converters.c +++ b/test/patest_converters.c @@ -215,7 +215,7 @@ float MaximumAbsDifference( float* sourceBuffer, float* referenceBuffer, int cou return result; } -int main( const char **argv, int argc ) +int main( int argc, const char **argv ) { PaUtilTriangularDitherGenerator ditherState; PaUtilConverter *converter; @@ -228,6 +228,9 @@ int main( const char **argv, int argc ) float noiseAmplitudeMatrix[SAMPLE_FORMAT_COUNT][SAMPLE_FORMAT_COUNT]; // [source][destination] float amp; + (void) argc; /* Unused. */ + (void) argv; /* Unused. */ + #define FLAG_COMBINATION_COUNT (4) PaStreamFlags flagCombinations[FLAG_COMBINATION_COUNT] = { paNoFlag, paClipOff, paDitherOff, paClipOff | paDitherOff }; const char *flagCombinationNames[FLAG_COMBINATION_COUNT] = { "paNoFlag", "paClipOff", "paDitherOff", "paClipOff | paDitherOff" }; From c6178e8592d936e246177a8991b75c9a043ccd00 Mon Sep 17 00:00:00 2001 From: dmitrykos Date: Thu, 15 Apr 2021 11:39:02 +0300 Subject: [PATCH 137/164] wasapi: Fixed compilation with MinGW (W64) when targeting 32-bit platform --- src/hostapi/wasapi/pa_win_wasapi.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/hostapi/wasapi/pa_win_wasapi.c b/src/hostapi/wasapi/pa_win_wasapi.c index 23f41a1..0b19084 100644 --- a/src/hostapi/wasapi/pa_win_wasapi.c +++ b/src/hostapi/wasapi/pa_win_wasapi.c @@ -168,12 +168,14 @@ #include #include #else - typedef struct _BYTE_BLOB - { - unsigned long clSize; - unsigned char abData[ 1 ]; - } BYTE_BLOB; - typedef /* [unique] */ __RPC_unique_pointer BYTE_BLOB *UP_BYTE_BLOB; + #ifndef _BLOB_DEFINED + typedef struct _BYTE_BLOB + { + unsigned long clSize; + unsigned char abData[ 1 ]; + } BYTE_BLOB; + typedef /* [unique] */ __RPC_unique_pointer BYTE_BLOB *UP_BYTE_BLOB; + #endif typedef LONGLONG REFERENCE_TIME; #define NONAMELESSUNION #endif From df2be4e048870ac6c570294952dfbb6a7b03736d Mon Sep 17 00:00:00 2001 From: Phil Burk Date: Sat, 17 Apr 2021 12:56:16 -0700 Subject: [PATCH 138/164] patest_unplug.c: change int32_t to int (#553) To prevent compiler errors and to avoid controversy over stdint.h vs inttypes.h. Fixes #550 --- test/patest_unplug.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/patest_unplug.c b/test/patest_unplug.c index 0e4486e..f854639 100644 --- a/test/patest_unplug.c +++ b/test/patest_unplug.c @@ -59,9 +59,9 @@ typedef struct { short sine[TABLE_SIZE]; - int32_t phases[MAX_CHANNELS]; - int32_t numChannels; - int32_t sampsToGo; + int phases[MAX_CHANNELS]; + int numChannels; + int sampsToGo; } paTestData; From 32f5cbda7e9eca1a99463de0dbc3d5024678498d Mon Sep 17 00:00:00 2001 From: Phil Burk Date: Sat, 17 Apr 2021 13:00:18 -0700 Subject: [PATCH 139/164] paqa_devs.c: define _USE_MATH_DEFINES (#554) before including math.h Fixes #551 --- qa/paqa_devs.c | 1 + 1 file changed, 1 insertion(+) diff --git a/qa/paqa_devs.c b/qa/paqa_devs.c index 858ed78..bab5711 100644 --- a/qa/paqa_devs.c +++ b/qa/paqa_devs.c @@ -55,6 +55,7 @@ #include #include #include +#define _USE_MATH_DEFINES #include #include "portaudio.h" #include "pa_trace.h" From c5d6563d1c2661cf37bc4e3c48950e18fbaa4bc1 Mon Sep 17 00:00:00 2001 From: Be Date: Wed, 13 Jan 2021 02:49:08 -0600 Subject: [PATCH 140/164] CMake: bump minimum version to 3.0.0 to fix deprecation warning --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 122fe93..f0562a1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -4,7 +4,7 @@ # http://www.portaudio.com/trac/wiki/TutorialDir/Compile/CMake # -CMAKE_MINIMUM_REQUIRED(VERSION 2.8) +CMAKE_MINIMUM_REQUIRED(VERSION 3.0.0) # Check if the user is building PortAudio stand-alone or as part of a larger # project. If this is part of a larger project (i.e. the CMakeLists.txt has From dfa969b3d947a7833058e4d04475c4ade5de9fcb Mon Sep 17 00:00:00 2001 From: Be Date: Mon, 11 Jan 2021 12:31:19 -0600 Subject: [PATCH 141/164] GH Actions: add separate workflow for CMake testing every OS --- .github/workflows/autotools.yml | 20 ++++++++++++ .github/workflows/c-cpp.yml | 54 ------------------------------- .github/workflows/cmake.yml | 56 +++++++++++++++++++++++++++++++++ 3 files changed, 76 insertions(+), 54 deletions(-) create mode 100644 .github/workflows/autotools.yml delete mode 100644 .github/workflows/c-cpp.yml create mode 100644 .github/workflows/cmake.yml diff --git a/.github/workflows/autotools.yml b/.github/workflows/autotools.yml new file mode 100644 index 0000000..4d6fb6c --- /dev/null +++ b/.github/workflows/autotools.yml @@ -0,0 +1,20 @@ +name: autotools build + +on: + push: + branches: [ master ] + pull_request: + branches: [ master ] + +jobs: + build-autotools: + + runs-on: ubuntu-latest + name: Ubuntu + + steps: + - uses: actions/checkout@v2 + - name: configure + run: ./configure + - name: make + run: make diff --git a/.github/workflows/c-cpp.yml b/.github/workflows/c-cpp.yml deleted file mode 100644 index 180b46b..0000000 --- a/.github/workflows/c-cpp.yml +++ /dev/null @@ -1,54 +0,0 @@ -name: C/C++ CI - -on: - push: - branches: [ master ] - pull_request: - branches: [ master ] - -jobs: - build: - - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v2 - - name: configure - run: ./configure - - name: make - run: make - - build-cmake: - - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v2 - - name: cmake - run: cmake . - - name: make - run: make - - build-cmake-msvc: - - runs-on: windows-latest - - steps: - - uses: actions/checkout@v1 - - name: cmake - run: cmake . - - name: build - run: cmake --build . - - build-cmake-mingw: - - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v2 - - name: apt - run: sudo apt-get install mingw-w64 - - name: cmake - run: cmake -DCMAKE_TOOLCHAIN_FILE=i686-w64-mingw32.cmake . - - name: make - run: make diff --git a/.github/workflows/cmake.yml b/.github/workflows/cmake.yml new file mode 100644 index 0000000..68e4b6c --- /dev/null +++ b/.github/workflows/cmake.yml @@ -0,0 +1,56 @@ +name: CMake build + +on: + push: + branches: [ master ] + pull_request: + branches: [ master ] + +jobs: + build: + strategy: + fail-fast: false + matrix: + include: + - name: Ubuntu + os: ubuntu-latest + install_dir: ~/portaudio + - name: Ubuntu mingw64 + os: ubuntu-latest + install_dir: ~/portaudio + dependencies_extras: mingw-w64 + cmake_extras: -DCMAKE_TOOLCHAIN_FILE=i686-w64-mingw32.cmake + - name: Windows + os: windows-latest + install_dir: C:\portaudio + - name: macOS + os: macOS-latest + install_dir: ~/portaudio + + runs-on: ${{ matrix.os }} + name: ${{ matrix.name }} + env: + cmake_build_type: RelWithDebInfo + steps: + - name: checkout Git repository + uses: actions/checkout@v2 + - name: "[Ubuntu] install dependencies" + run: sudo apt-get install libasound2-dev libjack-dev ${{ matrix.dependencies_extras }} + if: matrix.os == 'ubuntu-latest' + - name: configure + run: cmake ${{ matrix.cmake_extras }} + -DCMAKE_INSTALL_PREFIX=${{ matrix.install_dir }} + -DCMAKE_BUILD_TYPE=${{ env.cmake_build_type }} + -DPA_BUILD_TESTS=ON + -DPA_BUILD_EXAMPLES=ON + -S . + -B build + - name: build + run: cmake --build build --config ${{ env.cmake_build_type }} --parallel 2 + - name: install + run: cmake --install build --config ${{ env.cmake_build_type }} + - name: "Upload GitHub Actions artifacts" + uses: actions/upload-artifact@v2 + with: + name: ${{ matrix.name }} PortAudio build + path: ${{ matrix.install_dir }} From ee2c707495c48f81d47cf52c1cf723577e8b07f7 Mon Sep 17 00:00:00 2001 From: Be Date: Fri, 22 Jan 2021 17:14:20 -0600 Subject: [PATCH 142/164] CMake: build all tests --- CMakeLists.txt | 10 ++++++++ test/CMakeLists.txt | 60 ++++++++++++++++++++++++++++++++++++++------- 2 files changed, 61 insertions(+), 9 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index f0562a1..8f10c57 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -477,6 +477,16 @@ ENDIF() # Prepared for inclusion of test files OPTION(PA_BUILD_TESTS "Include test projects" OFF) IF(PA_BUILD_TESTS) + MACRO(ADD_TEST appl_name) + ADD_EXECUTABLE(${appl_name} "${appl_name}.c") + TARGET_LINK_LIBRARIES(${appl_name} portaudio_static) + TARGET_INCLUDE_DIRECTORIES(${appl_name} PRIVATE "${CMAKE_SOURCE_DIR}/src/common") + SET_TARGET_PROPERTIES(${appl_name} + PROPERTIES + FOLDER "Test" + ) + ENDMACRO(ADD_TEST) + SUBDIRS(test) ENDIF() diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 973568f..9c8054b 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -1,13 +1,55 @@ # Test projects # Use the macro to add test projects -MACRO(ADD_TEST appl_name) - ADD_EXECUTABLE(${appl_name} "${appl_name}.c") - TARGET_LINK_LIBRARIES(${appl_name} portaudio_static) - SET_TARGET_PROPERTIES(${appl_name} - PROPERTIES - FOLDER "Test" - ) -ENDMACRO(ADD_TEST) - +ADD_TEST(pa_minlat) +ADD_TEST(patest1) +ADD_TEST(patest_buffer) +ADD_TEST(patest_callbackstop) +ADD_TEST(patest_clip) +ADD_TEST(patest_converters) +ADD_TEST(patest_dither) +IF(PA_USE_DS) + ADD_TEST(patest_dsound_find_best_latency_params) + ADD_TEST(patest_dsound_low_level_latency_params) + ADD_TEST(patest_dsound_surround) +ENDIF() +ADD_TEST(patest_hang) +ADD_TEST(patest_in_overflow) +IF(PA_USE_WASAPI) + ADD_TEST(patest_jack_wasapi) +ENDIF() +ADD_TEST(patest_latency) +ADD_TEST(patest_leftright) ADD_TEST(patest_longsine) +ADD_TEST(patest_many) +ADD_TEST(patest_maxsines) +ADD_TEST(patest_mono) +ADD_TEST(patest_multi_sine) +ADD_TEST(patest_out_underflow) +ADD_TEST(patest_prime) +ADD_TEST(patest_read_record) +ADD_TEST(patest_ringmix) +ADD_TEST(patest_sine8) +ADD_TEST(patest_sine_channelmaps) +ADD_TEST(patest_sine_formats) +ADD_TEST(patest_sine_srate) +ADD_TEST(patest_sine_time) +ADD_TEST(patest_start_stop) +ADD_TEST(patest_stop) +ADD_TEST(patest_stop_playout) +ADD_TEST(patest_suggested_vs_streaminfo_latency) +ADD_TEST(patest_sync) +ADD_TEST(patest_timing) +ADD_TEST(patest_toomanysines) +ADD_TEST(patest_two_rates) +ADD_TEST(patest_underflow) +ADD_TEST(patest_unplug) +ADD_TEST(patest_wire) +IF(PA_USE_WMME) + ADD_TEST(patest_wmme_find_best_latency_params) + ADD_TEST(patest_wmme_low_level_latency_params) +ENDIF() +ADD_TEST(patest_write_stop) +IF(UNIX) + ADD_TEST(patest_write_stop_hang_illegal) +ENDIF() From 640d26cdea212efcfb357d9f2bde19140a496b24 Mon Sep 17 00:00:00 2001 From: Be Date: Fri, 22 Jan 2021 17:17:19 -0600 Subject: [PATCH 143/164] CMake: build qa executables --- CMakeLists.txt | 1 + qa/CMakeLists.txt | 5 +++++ qa/loopback/CMakeLists.txt | 10 ++++++++++ 3 files changed, 16 insertions(+) create mode 100644 qa/CMakeLists.txt create mode 100644 qa/loopback/CMakeLists.txt diff --git a/CMakeLists.txt b/CMakeLists.txt index 8f10c57..f342252 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -488,6 +488,7 @@ IF(PA_BUILD_TESTS) ENDMACRO(ADD_TEST) SUBDIRS(test) + SUBDIRS(qa) ENDIF() # Prepared for inclusion of test files diff --git a/qa/CMakeLists.txt b/qa/CMakeLists.txt new file mode 100644 index 0000000..26c0610 --- /dev/null +++ b/qa/CMakeLists.txt @@ -0,0 +1,5 @@ +ADD_TEST(paqa_devs) +ADD_TEST(paqa_errs) +ADD_TEST(paqa_latency) + +SUBDIRS(loopback) diff --git a/qa/loopback/CMakeLists.txt b/qa/loopback/CMakeLists.txt new file mode 100644 index 0000000..d58caa3 --- /dev/null +++ b/qa/loopback/CMakeLists.txt @@ -0,0 +1,10 @@ +ADD_EXECUTABLE(paloopback + src/audio_analyzer.c + src/biquad_filter.c + src/paqa.c + src/paqa_tools.c + src/test_audio_analyzer.c + src/write_wav.c +) +TARGET_INCLUDE_DIRECTORIES(paloopback PRIVATE ..) +TARGET_LINK_LIBRARIES(paloopback portaudio) From 3e782f2494a66f4cde918a1ba4c8cb1a9169766f Mon Sep 17 00:00:00 2001 From: Be Date: Fri, 22 Jan 2021 17:14:36 -0600 Subject: [PATCH 144/164] CMake: clean up including headers for examples --- examples/CMakeLists.txt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index f96b6ec..a4a9095 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -3,6 +3,7 @@ MACRO(ADD_EXAMPLE appl_name) ADD_EXECUTABLE(${appl_name} "${appl_name}.c") TARGET_LINK_LIBRARIES(${appl_name} portaudio_static) + TARGET_INCLUDE_DIRECTORIES(${appl_name} PRIVATE ../src/common) SET_TARGET_PROPERTIES(${appl_name} PROPERTIES FOLDER "Examples C") IF(WIN32) SET_PROPERTY(TARGET ${appl_name} APPEND_STRING PROPERTY COMPILE_DEFINITIONS _CRT_SECURE_NO_WARNINGS) @@ -24,12 +25,10 @@ IF(PA_USE_ASIO AND WIN32) ADD_EXAMPLE(paex_mono_asio_channel_select) ENDIF() ADD_EXAMPLE(paex_ocean_shore) -TARGET_INCLUDE_DIRECTORIES(paex_ocean_shore PRIVATE ../src/common) ADD_EXAMPLE(paex_pink) ADD_EXAMPLE(paex_read_write_wire) ADD_EXAMPLE(paex_record) ADD_EXAMPLE(paex_record_file) -TARGET_INCLUDE_DIRECTORIES(paex_record_file PRIVATE ../src/common) ADD_EXAMPLE(paex_saw) ADD_EXAMPLE(paex_sine) ADD_EXAMPLE_CPP(paex_sine_c++) From a563f2d39d548385814f7087d65aeb9622d4e162 Mon Sep 17 00:00:00 2001 From: MichalPetryka <35800402+MichalPetryka@users.noreply.github.com> Date: Thu, 29 Apr 2021 02:23:52 +0200 Subject: [PATCH 145/164] Whitespace cleanup in Java and C++ bindings#458) --- bindings/cpp/example/devs.cxx | 266 ++++---- bindings/cpp/example/sine.cxx | 164 +++-- .../portaudiocpp/AsioDeviceAdapter.hxx | 56 +- .../cpp/include/portaudiocpp/AutoSystem.hxx | 78 +-- .../include/portaudiocpp/BlockingStream.hxx | 37 +- .../portaudiocpp/CFunCallbackStream.hxx | 39 +- .../portaudiocpp/CallbackInterface.hxx | 46 +- .../include/portaudiocpp/CallbackStream.hxx | 30 +- .../portaudiocpp/CppFunCallbackStream.hxx | 90 +-- bindings/cpp/include/portaudiocpp/Device.hxx | 107 ++-- .../DirectionSpecificStreamParameters.hxx | 70 +-- .../cpp/include/portaudiocpp/Exception.hxx | 145 +++-- bindings/cpp/include/portaudiocpp/HostApi.hxx | 75 ++- .../portaudiocpp/InterfaceCallbackStream.hxx | 36 +- .../portaudiocpp/MemFunCallbackStream.hxx | 134 ++-- .../cpp/include/portaudiocpp/PortAudioCpp.hxx | 38 +- .../include/portaudiocpp/SampleDataFormat.hxx | 30 +- bindings/cpp/include/portaudiocpp/Stream.hxx | 93 ++- .../include/portaudiocpp/StreamParameters.hxx | 96 +-- bindings/cpp/include/portaudiocpp/System.hxx | 117 ++-- .../portaudiocpp/SystemDeviceIterator.hxx | 63 +- .../portaudiocpp/SystemHostApiIterator.hxx | 52 +- .../source/portaudiocpp/AsioDeviceAdapter.cxx | 106 ++-- .../source/portaudiocpp/BlockingStream.cxx | 135 ++--- .../portaudiocpp/CFunCallbackStream.cxx | 56 +- .../source/portaudiocpp/CallbackInterface.cxx | 28 +- .../source/portaudiocpp/CallbackStream.cxx | 24 +- .../portaudiocpp/CppFunCallbackStream.cxx | 122 ++-- bindings/cpp/source/portaudiocpp/Device.cxx | 236 ++++---- .../DirectionSpecificStreamParameters.cxx | 256 ++++---- .../cpp/source/portaudiocpp/Exception.cxx | 194 +++--- bindings/cpp/source/portaudiocpp/HostApi.cxx | 168 +++--- .../portaudiocpp/InterfaceCallbackStream.cxx | 58 +- .../portaudiocpp/MemFunCallbackStream.cxx | 1 - bindings/cpp/source/portaudiocpp/Stream.cxx | 296 ++++----- .../source/portaudiocpp/StreamParameters.cxx | 259 ++++---- bindings/cpp/source/portaudiocpp/System.cxx | 571 +++++++++--------- .../portaudiocpp/SystemDeviceIterator.cxx | 86 ++- .../portaudiocpp/SystemHostApiIterator.cxx | 85 ++- .../java/c/src/com_portaudio_BlockingStream.c | 315 +++++----- bindings/java/c/src/com_portaudio_PortAudio.c | 176 +++--- bindings/java/c/src/jpa_tools.c | 172 +++--- bindings/java/c/src/jpa_tools.h | 6 +- 43 files changed, 2590 insertions(+), 2622 deletions(-) diff --git a/bindings/cpp/example/devs.cxx b/bindings/cpp/example/devs.cxx index 5ef4cab..218042f 100644 --- a/bindings/cpp/example/devs.cxx +++ b/bindings/cpp/example/devs.cxx @@ -8,44 +8,44 @@ // --------------------------------------------------------------------------------------- void printSupportedStandardSampleRates( - const portaudio::DirectionSpecificStreamParameters &inputParameters, - const portaudio::DirectionSpecificStreamParameters &outputParameters) + const portaudio::DirectionSpecificStreamParameters &inputParameters, + const portaudio::DirectionSpecificStreamParameters &outputParameters) { - static double STANDARD_SAMPLE_RATES[] = { - 8000.0, 9600.0, 11025.0, 12000.0, 16000.0, 22050.0, 24000.0, 32000.0, - 44100.0, 48000.0, 88200.0, 96000.0, -1 }; // negative terminated list + static double STANDARD_SAMPLE_RATES[] = { + 8000.0, 9600.0, 11025.0, 12000.0, 16000.0, 22050.0, 24000.0, 32000.0, + 44100.0, 48000.0, 88200.0, 96000.0, -1 }; // negative terminated list - int printCount = 0; + int printCount = 0; - for (int i = 0; STANDARD_SAMPLE_RATES[i] > 0; ++i) - { - portaudio::StreamParameters tmp = portaudio::StreamParameters(inputParameters, outputParameters, STANDARD_SAMPLE_RATES[i], 0, paNoFlag); + for (int i = 0; STANDARD_SAMPLE_RATES[i] > 0; ++i) + { + portaudio::StreamParameters tmp = portaudio::StreamParameters(inputParameters, outputParameters, STANDARD_SAMPLE_RATES[i], 0, paNoFlag); - if (tmp.isSupported()) - { - if (printCount == 0) - { - std::cout << " " << STANDARD_SAMPLE_RATES[i]; // 8.2 - printCount = 1; - } - else if (printCount == 4) - { - std::cout << "," << std::endl; - std::cout << " " << STANDARD_SAMPLE_RATES[i]; // 8.2 - printCount = 1; - } - else - { - std::cout << ", " << STANDARD_SAMPLE_RATES[i]; // 8.2 - ++printCount; - } - } - } + if (tmp.isSupported()) + { + if (printCount == 0) + { + std::cout << " " << STANDARD_SAMPLE_RATES[i]; // 8.2 + printCount = 1; + } + else if (printCount == 4) + { + std::cout << "," << std::endl; + std::cout << " " << STANDARD_SAMPLE_RATES[i]; // 8.2 + printCount = 1; + } + else + { + std::cout << ", " << STANDARD_SAMPLE_RATES[i]; // 8.2 + ++printCount; + } + } + } - if (printCount == 0) - std::cout << "None" << std::endl; - else - std::cout << std::endl; + if (printCount == 0) + std::cout << "None" << std::endl; + else + std::cout << std::endl; } // --------------------------------------------------------------------------------------- @@ -53,125 +53,125 @@ void printSupportedStandardSampleRates( int main(int, char*[]); int main(int, char*[]) { - try - { - portaudio::AutoSystem autoSys; + try + { + portaudio::AutoSystem autoSys; - portaudio::System &sys = portaudio::System::instance(); + portaudio::System &sys = portaudio::System::instance(); - std::cout << "PortAudio version number = " << sys.version() << std::endl; - std::cout << "PortAudio version text = '" << sys.versionText() << "'" << std::endl; + std::cout << "PortAudio version number = " << sys.version() << std::endl; + std::cout << "PortAudio version text = '" << sys.versionText() << "'" << std::endl; - int numDevices = sys.deviceCount(); - std::cout << "Number of devices = " << numDevices << std::endl; + int numDevices = sys.deviceCount(); + std::cout << "Number of devices = " << numDevices << std::endl; - for (portaudio::System::DeviceIterator i = sys.devicesBegin(); i != sys.devicesEnd(); ++i) - { - std::cout << "--------------------------------------- device #" << (*i).index() << std::endl; + for (portaudio::System::DeviceIterator i = sys.devicesBegin(); i != sys.devicesEnd(); ++i) + { + std::cout << "--------------------------------------- device #" << (*i).index() << std::endl; - // Mark global and API specific default devices: - bool defaultDisplayed = false; + // Mark global and API specific default devices: + bool defaultDisplayed = false; - if ((*i).isSystemDefaultInputDevice()) - { - std::cout << "[ Default Input"; - defaultDisplayed = true; - } - else if ((*i).isHostApiDefaultInputDevice()) - { - std::cout << "[ Default " << (*i).hostApi().name() << " Input"; - defaultDisplayed = true; - } + if ((*i).isSystemDefaultInputDevice()) + { + std::cout << "[ Default Input"; + defaultDisplayed = true; + } + else if ((*i).isHostApiDefaultInputDevice()) + { + std::cout << "[ Default " << (*i).hostApi().name() << " Input"; + defaultDisplayed = true; + } - if ((*i).isSystemDefaultOutputDevice()) - { - std::cout << (defaultDisplayed ? "," : "["); - std::cout << " Default Output"; - defaultDisplayed = true; - } - else if ((*i).isHostApiDefaultOutputDevice()) - { - std::cout << (defaultDisplayed ? "," : "["); - std::cout << " Default " << (*i).hostApi().name() << " Output"; - defaultDisplayed = true; - } - - if (defaultDisplayed) - std::cout << " ]" << std::endl; + if ((*i).isSystemDefaultOutputDevice()) + { + std::cout << (defaultDisplayed ? "," : "["); + std::cout << " Default Output"; + defaultDisplayed = true; + } + else if ((*i).isHostApiDefaultOutputDevice()) + { + std::cout << (defaultDisplayed ? "," : "["); + std::cout << " Default " << (*i).hostApi().name() << " Output"; + defaultDisplayed = true; + } - // Print device info: - std::cout << "Name = " << (*i).name() << std::endl; - std::cout << "Host API = " << (*i).hostApi().name() << std::endl; - std::cout << "Max inputs = " << (*i).maxInputChannels() << ", Max outputs = " << (*i).maxOutputChannels() << std::endl; + if (defaultDisplayed) + std::cout << " ]" << std::endl; - std::cout << "Default low input latency = " << (*i).defaultLowInputLatency() << std::endl; // 8.3 - std::cout << "Default low output latency = " << (*i).defaultLowOutputLatency() << std::endl; // 8.3 - std::cout << "Default high input latency = " << (*i).defaultHighInputLatency() << std::endl; // 8.3 - std::cout << "Default high output latency = " << (*i).defaultHighOutputLatency() << std::endl; // 8.3 + // Print device info: + std::cout << "Name = " << (*i).name() << std::endl; + std::cout << "Host API = " << (*i).hostApi().name() << std::endl; + std::cout << "Max inputs = " << (*i).maxInputChannels() << ", Max outputs = " << (*i).maxOutputChannels() << std::endl; + + std::cout << "Default low input latency = " << (*i).defaultLowInputLatency() << std::endl; // 8.3 + std::cout << "Default low output latency = " << (*i).defaultLowOutputLatency() << std::endl; // 8.3 + std::cout << "Default high input latency = " << (*i).defaultHighInputLatency() << std::endl; // 8.3 + std::cout << "Default high output latency = " << (*i).defaultHighOutputLatency() << std::endl; // 8.3 #ifdef WIN32 - // ASIO specific latency information: - if ((*i).hostApi().typeId() == paASIO) - { - portaudio::AsioDeviceAdapter asioDevice((*i)); + // ASIO specific latency information: + if ((*i).hostApi().typeId() == paASIO) + { + portaudio::AsioDeviceAdapter asioDevice((*i)); - std::cout << "ASIO minimum buffer size = " << asioDevice.minBufferSize() << std::endl; - std::cout << "ASIO maximum buffer size = " << asioDevice.maxBufferSize() << std::endl; - std::cout << "ASIO preferred buffer size = " << asioDevice.preferredBufferSize() << std::endl; + std::cout << "ASIO minimum buffer size = " << asioDevice.minBufferSize() << std::endl; + std::cout << "ASIO maximum buffer size = " << asioDevice.maxBufferSize() << std::endl; + std::cout << "ASIO preferred buffer size = " << asioDevice.preferredBufferSize() << std::endl; - if (asioDevice.granularity() == -1) - std::cout << "ASIO buffer granularity = power of 2" << std::endl; - else - std::cout << "ASIO buffer granularity = " << asioDevice.granularity() << std::endl; - } + if (asioDevice.granularity() == -1) + std::cout << "ASIO buffer granularity = power of 2" << std::endl; + else + std::cout << "ASIO buffer granularity = " << asioDevice.granularity() << std::endl; + } #endif // WIN32 - std::cout << "Default sample rate = " << (*i).defaultSampleRate() << std::endl; // 8.2 + std::cout << "Default sample rate = " << (*i).defaultSampleRate() << std::endl; // 8.2 - // Poll for standard sample rates: - portaudio::DirectionSpecificStreamParameters inputParameters((*i), (*i).maxInputChannels(), portaudio::INT16, true, 0.0, NULL); - portaudio::DirectionSpecificStreamParameters outputParameters((*i), (*i).maxOutputChannels(), portaudio::INT16, true, 0.0, NULL); + // Poll for standard sample rates: + portaudio::DirectionSpecificStreamParameters inputParameters((*i), (*i).maxInputChannels(), portaudio::INT16, true, 0.0, NULL); + portaudio::DirectionSpecificStreamParameters outputParameters((*i), (*i).maxOutputChannels(), portaudio::INT16, true, 0.0, NULL); - if (inputParameters.numChannels() > 0) - { - std::cout << "Supported standard sample rates" << std::endl; - std::cout << " for half-duplex 16 bit " << inputParameters.numChannels() << " channel input = " << std::endl; - printSupportedStandardSampleRates(inputParameters, portaudio::DirectionSpecificStreamParameters::null()); - } + if (inputParameters.numChannels() > 0) + { + std::cout << "Supported standard sample rates" << std::endl; + std::cout << " for half-duplex 16 bit " << inputParameters.numChannels() << " channel input = " << std::endl; + printSupportedStandardSampleRates(inputParameters, portaudio::DirectionSpecificStreamParameters::null()); + } - if (outputParameters.numChannels() > 0) - { - std::cout << "Supported standard sample rates" << std::endl; - std::cout << " for half-duplex 16 bit " << outputParameters.numChannels() << " channel output = " << std::endl; - printSupportedStandardSampleRates(portaudio::DirectionSpecificStreamParameters::null(), outputParameters); - } + if (outputParameters.numChannels() > 0) + { + std::cout << "Supported standard sample rates" << std::endl; + std::cout << " for half-duplex 16 bit " << outputParameters.numChannels() << " channel output = " << std::endl; + printSupportedStandardSampleRates(portaudio::DirectionSpecificStreamParameters::null(), outputParameters); + } - if (inputParameters.numChannels() > 0 && outputParameters.numChannels() > 0) - { - std::cout << "Supported standard sample rates" << std::endl; - std::cout << " for full-duplex 16 bit " << inputParameters.numChannels() << " channel input, " << outputParameters.numChannels() << " channel output = " << std::endl; - printSupportedStandardSampleRates(inputParameters, outputParameters); - } - } + if (inputParameters.numChannels() > 0 && outputParameters.numChannels() > 0) + { + std::cout << "Supported standard sample rates" << std::endl; + std::cout << " for full-duplex 16 bit " << inputParameters.numChannels() << " channel input, " << outputParameters.numChannels() << " channel output = " << std::endl; + printSupportedStandardSampleRates(inputParameters, outputParameters); + } + } - std::cout << "----------------------------------------------" << std::endl; - } - catch (const portaudio::PaException &e) - { - std::cout << "A PortAudio error occurred: " << e.paErrorText() << std::endl; - } - catch (const portaudio::PaCppException &e) - { - std::cout << "A PortAudioCpp error occurred: " << e.what() << std::endl; - } - catch (const std::exception &e) - { - std::cout << "A generic exception occurred: " << e.what() << std::endl; - } - catch (...) - { - std::cout << "An unknown exception occurred." << std::endl; - } + std::cout << "----------------------------------------------" << std::endl; + } + catch (const portaudio::PaException &e) + { + std::cout << "A PortAudio error occurred: " << e.paErrorText() << std::endl; + } + catch (const portaudio::PaCppException &e) + { + std::cout << "A PortAudioCpp error occurred: " << e.what() << std::endl; + } + catch (const std::exception &e) + { + std::cout << "A generic exception occurred: " << e.what() << std::endl; + } + catch (...) + { + std::cout << "An unknown exception occurred." << std::endl; + } - return 0; + return 0; } diff --git a/bindings/cpp/example/sine.cxx b/bindings/cpp/example/sine.cxx index 0c772e6..acd01e6 100644 --- a/bindings/cpp/example/sine.cxx +++ b/bindings/cpp/example/sine.cxx @@ -20,50 +20,50 @@ const int TABLE_SIZE = 200; class SineGenerator { public: - SineGenerator(int tableSize) : tableSize_(tableSize), leftPhase_(0), rightPhase_(0) - { - const double PI = 3.14159265; - table_ = new float[tableSize]; - for (int i = 0; i < tableSize; ++i) - { - table_[i] = 0.125f * (float)sin(((double)i/(double)tableSize)*PI*2.); - } - } + SineGenerator(int tableSize) : tableSize_(tableSize), leftPhase_(0), rightPhase_(0) + { + const double PI = 3.14159265; + table_ = new float[tableSize]; + for (int i = 0; i < tableSize; ++i) + { + table_[i] = 0.125f * (float)sin(((double)i/(double)tableSize)*PI*2.); + } + } - ~SineGenerator() - { - delete[] table_; - } + ~SineGenerator() + { + delete[] table_; + } - int generate(const void *inputBuffer, void *outputBuffer, unsigned long framesPerBuffer, - const PaStreamCallbackTimeInfo *timeInfo, PaStreamCallbackFlags statusFlags) - { - assert(outputBuffer != NULL); + int generate(const void *inputBuffer, void *outputBuffer, unsigned long framesPerBuffer, + const PaStreamCallbackTimeInfo *timeInfo, PaStreamCallbackFlags statusFlags) + { + assert(outputBuffer != NULL); - float **out = static_cast(outputBuffer); + float **out = static_cast(outputBuffer); - for (unsigned int i = 0; i < framesPerBuffer; ++i) - { - out[0][i] = table_[leftPhase_]; - out[1][i] = table_[rightPhase_]; + for (unsigned int i = 0; i < framesPerBuffer; ++i) + { + out[0][i] = table_[leftPhase_]; + out[1][i] = table_[rightPhase_]; - leftPhase_ += 1; - if (leftPhase_ >= tableSize_) - leftPhase_ -= tableSize_; + leftPhase_ += 1; + if (leftPhase_ >= tableSize_) + leftPhase_ -= tableSize_; - rightPhase_ += 3; - if (rightPhase_ >= tableSize_) - rightPhase_ -= tableSize_; - } + rightPhase_ += 3; + if (rightPhase_ >= tableSize_) + rightPhase_ -= tableSize_; + } - return paContinue; - } + return paContinue; + } private: - float *table_; - int tableSize_; - int leftPhase_; - int rightPhase_; + float *table_; + int tableSize_; + int leftPhase_; + int rightPhase_; }; // --------------------------------------------------------------------------------------- @@ -72,66 +72,64 @@ private: int main(int, char *[]); int main(int, char *[]) { - try - { - // Create a SineGenerator object: - SineGenerator sineGenerator(TABLE_SIZE); + try + { + // Create a SineGenerator object: + SineGenerator sineGenerator(TABLE_SIZE); - std::cout << "Setting up PortAudio..." << std::endl; + std::cout << "Setting up PortAudio..." << std::endl; - // Set up the System: - portaudio::AutoSystem autoSys; - portaudio::System &sys = portaudio::System::instance(); + // Set up the System: + portaudio::AutoSystem autoSys; + portaudio::System &sys = portaudio::System::instance(); - // Set up the parameters required to open a (Callback)Stream: - portaudio::DirectionSpecificStreamParameters outParams(sys.defaultOutputDevice(), 2, portaudio::FLOAT32, false, sys.defaultOutputDevice().defaultLowOutputLatency(), NULL); - portaudio::StreamParameters params(portaudio::DirectionSpecificStreamParameters::null(), outParams, SAMPLE_RATE, FRAMES_PER_BUFFER, paClipOff); + // Set up the parameters required to open a (Callback)Stream: + portaudio::DirectionSpecificStreamParameters outParams(sys.defaultOutputDevice(), 2, portaudio::FLOAT32, false, sys.defaultOutputDevice().defaultLowOutputLatency(), NULL); + portaudio::StreamParameters params(portaudio::DirectionSpecificStreamParameters::null(), outParams, SAMPLE_RATE, FRAMES_PER_BUFFER, paClipOff); - std::cout << "Opening stereo output stream..." << std::endl; + std::cout << "Opening stereo output stream..." << std::endl; - // Create (and open) a new Stream, using the SineGenerator::generate function as a callback: - portaudio::MemFunCallbackStream stream(params, sineGenerator, &SineGenerator::generate); + // Create (and open) a new Stream, using the SineGenerator::generate function as a callback: + portaudio::MemFunCallbackStream stream(params, sineGenerator, &SineGenerator::generate); - std::cout << "Starting playback for " << NUM_SECONDS << " seconds." << std::endl; + std::cout << "Starting playback for " << NUM_SECONDS << " seconds." << std::endl; - // Start the Stream (audio playback starts): - stream.start(); + // Start the Stream (audio playback starts): + stream.start(); - // Wait for 5 seconds: - sys.sleep(NUM_SECONDS * 1000); + // Wait for 5 seconds: + sys.sleep(NUM_SECONDS * 1000); - std::cout << "Closing stream..." < stream = MemFunCallbackStream(parameters, *this, &MyClass::myCallbackFunction); @endverbatim - ////// - template - class MemFunCallbackStream : public CallbackStream - { - public: - typedef int (T::*CallbackFunPtr)(const void *, void *, unsigned long, const PaStreamCallbackTimeInfo *, - PaStreamCallbackFlags); + ////// + /// @brief Callback stream using a class's member function as a callback. Template argument T is the type of the + /// class of which a member function is going to be used. + /// + /// Example usage: + /// @verbatim MemFunCallback stream = MemFunCallbackStream(parameters, *this, &MyClass::myCallbackFunction); @endverbatim + ////// + template + class MemFunCallbackStream : public CallbackStream + { + public: + typedef int (T::*CallbackFunPtr)(const void *, void *, unsigned long, const PaStreamCallbackTimeInfo *, + PaStreamCallbackFlags); - // ------------------------------------------------------------------------------- + // ------------------------------------------------------------------------------- - MemFunCallbackStream() - { - } + MemFunCallbackStream() + { + } - MemFunCallbackStream(const StreamParameters ¶meters, T &instance, CallbackFunPtr memFun) : adapter_(instance, memFun) - { - open(parameters); - } + MemFunCallbackStream(const StreamParameters ¶meters, T &instance, CallbackFunPtr memFun) : adapter_(instance, memFun) + { + open(parameters); + } - ~MemFunCallbackStream() - { - close(); - } + ~MemFunCallbackStream() + { + close(); + } - void open(const StreamParameters ¶meters, T &instance, CallbackFunPtr memFun) - { - // XXX: need to check if already open? + void open(const StreamParameters ¶meters, T &instance, CallbackFunPtr memFun) + { + // XXX: need to check if already open? - adapter_.init(instance, memFun); - open(parameters); - } + adapter_.init(instance, memFun); + open(parameters); + } - private: - MemFunCallbackStream(const MemFunCallbackStream &); // non-copyable - MemFunCallbackStream &operator=(const MemFunCallbackStream &); // non-copyable + private: + MemFunCallbackStream(const MemFunCallbackStream &); // non-copyable + MemFunCallbackStream &operator=(const MemFunCallbackStream &); // non-copyable - ////// - /// @brief Inner class which adapts a member function callback to a CallbackInterface compliant - /// class (so it can be adapted using the paCallbackAdapter function). - ////// - class MemFunToCallbackInterfaceAdapter : public CallbackInterface - { - public: - MemFunToCallbackInterfaceAdapter() {} - MemFunToCallbackInterfaceAdapter(T &instance, CallbackFunPtr memFun) : instance_(&instance), memFun_(memFun) {} + ////// + /// @brief Inner class which adapts a member function callback to a CallbackInterface compliant + /// class (so it can be adapted using the paCallbackAdapter function). + ////// + class MemFunToCallbackInterfaceAdapter : public CallbackInterface + { + public: + MemFunToCallbackInterfaceAdapter() {} + MemFunToCallbackInterfaceAdapter(T &instance, CallbackFunPtr memFun) : instance_(&instance), memFun_(memFun) {} - void init(T &instance, CallbackFunPtr memFun) - { - instance_ = &instance; - memFun_ = memFun; - } + void init(T &instance, CallbackFunPtr memFun) + { + instance_ = &instance; + memFun_ = memFun; + } - int paCallbackFun(const void *inputBuffer, void *outputBuffer, unsigned long numFrames, - const PaStreamCallbackTimeInfo *timeInfo, PaStreamCallbackFlags statusFlags) - { - return (instance_->*memFun_)(inputBuffer, outputBuffer, numFrames, timeInfo, statusFlags); - } + int paCallbackFun(const void *inputBuffer, void *outputBuffer, unsigned long numFrames, + const PaStreamCallbackTimeInfo *timeInfo, PaStreamCallbackFlags statusFlags) + { + return (instance_->*memFun_)(inputBuffer, outputBuffer, numFrames, timeInfo, statusFlags); + } - private: - T *instance_; - CallbackFunPtr memFun_; - }; + private: + T *instance_; + CallbackFunPtr memFun_; + }; - MemFunToCallbackInterfaceAdapter adapter_; + MemFunToCallbackInterfaceAdapter adapter_; - void open(const StreamParameters ¶meters) - { - PaError err = Pa_OpenStream(&stream_, parameters.inputParameters().paStreamParameters(), parameters.outputParameters().paStreamParameters(), - parameters.sampleRate(), parameters.framesPerBuffer(), parameters.flags(), &impl::callbackInterfaceToPaCallbackAdapter, - static_cast(&adapter_)); + void open(const StreamParameters ¶meters) + { + PaError err = Pa_OpenStream(&stream_, parameters.inputParameters().paStreamParameters(), parameters.outputParameters().paStreamParameters(), + parameters.sampleRate(), parameters.framesPerBuffer(), parameters.flags(), &impl::callbackInterfaceToPaCallbackAdapter, + static_cast(&adapter_)); - if (err != paNoError) - throw PaException(err); - } - }; + if (err != paNoError) + throw PaException(err); + } + }; } // portaudio diff --git a/bindings/cpp/include/portaudiocpp/PortAudioCpp.hxx b/bindings/cpp/include/portaudiocpp/PortAudioCpp.hxx index 1165550..2c4df8f 100644 --- a/bindings/cpp/include/portaudiocpp/PortAudioCpp.hxx +++ b/bindings/cpp/include/portaudiocpp/PortAudioCpp.hxx @@ -6,23 +6,23 @@ ////// /// @mainpage PortAudioCpp /// -///

PortAudioCpp - A Native C++ Binding of PortAudio V19

+///

PortAudioCpp - A Native C++ Binding of PortAudio V19

///

PortAudio

///

-/// PortAudio is a portable and mature C API for accessing audio hardware. It offers both callback-based and blocking -/// style input and output, deals with sample data format conversions, dithering and much more. There are a large number -/// of implementations available for various platforms including Windows MME, Windows DirectX, Windows and MacOS (Classic) -/// ASIO, MacOS Classic SoundManager, MacOS X CoreAudio, OSS (Linux), Linux ALSA, JACK (MacOS X and Linux) and SGI Irix -/// AL. Note that, currently not all of these implementations are equally complete or up-to-date (as PortAudio V19 is -/// still in development). Because PortAudio has a C API, it can easily be called from a variety of other programming +/// PortAudio is a portable and mature C API for accessing audio hardware. It offers both callback-based and blocking +/// style input and output, deals with sample data format conversions, dithering and much more. There are a large number +/// of implementations available for various platforms including Windows MME, Windows DirectX, Windows and MacOS (Classic) +/// ASIO, MacOS Classic SoundManager, MacOS X CoreAudio, OSS (Linux), Linux ALSA, JACK (MacOS X and Linux) and SGI Irix +/// AL. Note that, currently not all of these implementations are equally complete or up-to-date (as PortAudio V19 is +/// still in development). Because PortAudio has a C API, it can easily be called from a variety of other programming /// languages. ///

///

PortAudioCpp

///

-/// Although, it is possible to use PortAudio's C API from within a C++ program, this is usually a little awkward -/// as procedural and object-oriented paradigms need to be mixed. PortAudioCpp aims to resolve this by encapsulating -/// PortAudio's C API to form an equivalent object-oriented C++ API. It provides a more natural integration of PortAudio -/// into C++ programs as well as a more structured interface. PortAudio's concepts were preserved as much as possible and +/// Although, it is possible to use PortAudio's C API from within a C++ program, this is usually a little awkward +/// as procedural and object-oriented paradigms need to be mixed. PortAudioCpp aims to resolve this by encapsulating +/// PortAudio's C API to form an equivalent object-oriented C++ API. It provides a more natural integration of PortAudio +/// into C++ programs as well as a more structured interface. PortAudio's concepts were preserved as much as possible and /// no additional features were added except for some `convenience methods'. ///

///

@@ -30,15 +30,15 @@ ///

    ///
  • Structured object model.
  • ///
  • C++ exception handling instead of C-style error return codes.
  • -///
  • Handling of callbacks using free functions (C and C++), static functions, member functions or instances of classes +///
  • Handling of callbacks using free functions (C and C++), static functions, member functions or instances of classes /// derived from a given interface.
  • ///
  • STL compliant iterators to host APIs and devices.
  • ///
  • Some additional convenience functions to more easily set up and use PortAudio.
  • ///
///

///

-/// PortAudioCpp requires a recent version of the PortAudio V19 source code. This can be obtained from CVS or as a snapshot -/// from the website. The examples also require the ASIO 2 SDK which can be obtained from the Steinberg website. Alternatively, the +/// PortAudioCpp requires a recent version of the PortAudio V19 source code. This can be obtained from CVS or as a snapshot +/// from the website. The examples also require the ASIO 2 SDK which can be obtained from the Steinberg website. Alternatively, the /// examples can easily be modified to compile without needing ASIO. ///

///

@@ -50,12 +50,12 @@ /// Other platforms should be easily supported as PortAudioCpp is platform-independent and (reasonably) C++ standard compliant. ///

///

-/// This documentation mainly provides information specific to PortAudioCpp. For a more complete explanation of all of the +/// This documentation mainly provides information specific to PortAudioCpp. For a more complete explanation of all of the /// concepts used, please consult the PortAudio documentation. ///

///

-/// PortAudioCpp was developed by Merlijn Blaauw with many great suggestions and help from Ross Bencina. Ludwig Schwardt provided -/// GNU/Linux build files and checked G++ compatibility. PortAudioCpp may be used under the same licensing, conditions and +/// PortAudioCpp was developed by Merlijn Blaauw with many great suggestions and help from Ross Bencina. Ludwig Schwardt provided +/// GNU/Linux build files and checked G++ compatibility. PortAudioCpp may be used under the same licensing, conditions and /// warranty as PortAudio. See the PortAudio license for more details. ///

///

Links

@@ -69,8 +69,8 @@ ////// /// @namespace portaudio /// -/// To avoid name collision, everything in PortAudioCpp is in the portaudio -/// namespace. If this name is too long it's usually pretty safe to use an +/// To avoid name collision, everything in PortAudioCpp is in the portaudio +/// namespace. If this name is too long it's usually pretty safe to use an /// alias like ``namespace pa = portaudio;''. ////// diff --git a/bindings/cpp/include/portaudiocpp/SampleDataFormat.hxx b/bindings/cpp/include/portaudiocpp/SampleDataFormat.hxx index 1d3a1d9..a15d367 100644 --- a/bindings/cpp/include/portaudiocpp/SampleDataFormat.hxx +++ b/bindings/cpp/include/portaudiocpp/SampleDataFormat.hxx @@ -11,21 +11,21 @@ namespace portaudio { - ////// - /// @brief PortAudio sample data formats. - /// - /// Small helper enum to wrap the PortAudio defines. - ////// - enum SampleDataFormat - { - INVALID_FORMAT = 0, - FLOAT32 = paFloat32, - INT32 = paInt32, - INT24 = paInt24, - INT16 = paInt16, - INT8 = paInt8, - UINT8 = paUInt8 - }; + ////// + /// @brief PortAudio sample data formats. + /// + /// Small helper enum to wrap the PortAudio defines. + ////// + enum SampleDataFormat + { + INVALID_FORMAT = 0, + FLOAT32 = paFloat32, + INT32 = paInt32, + INT24 = paInt24, + INT16 = paInt16, + INT8 = paInt8, + UINT8 = paUInt8 + }; } // namespace portaudio diff --git a/bindings/cpp/include/portaudiocpp/Stream.hxx b/bindings/cpp/include/portaudiocpp/Stream.hxx index a731930..2725ba7 100644 --- a/bindings/cpp/include/portaudiocpp/Stream.hxx +++ b/bindings/cpp/include/portaudiocpp/Stream.hxx @@ -8,7 +8,7 @@ // Forward declaration(s): namespace portaudio { - class StreamParameters; + class StreamParameters; } // --------------------------------------------------------------------------------------- @@ -18,65 +18,64 @@ namespace portaudio { - ////// - /// @brief A Stream represents an active or inactive input and/or output data - /// stream in the System. - /// - /// Concrete Stream classes should ensure themselves being in a closed state at - /// destruction (i.e. by calling their own close() method in their deconstructor). - /// Following good C++ programming practices, care must be taken to ensure no - /// exceptions are thrown by the deconstructor of these classes. As a consequence, - /// clients need to explicitly call close() to ensure the stream closed successfully. - /// - /// The Stream object can be used to manipulate the Stream's state. Also, time-constant - /// and time-varying information about the Stream can be retrieved. - ////// - class Stream - { - public: - // Opening/closing: - virtual ~Stream(); + ////// + /// @brief A Stream represents an active or inactive input and/or output data + /// stream in the System. + /// + /// Concrete Stream classes should ensure themselves being in a closed state at + /// destruction (i.e. by calling their own close() method in their deconstructor). + /// Following good C++ programming practices, care must be taken to ensure no + /// exceptions are thrown by the deconstructor of these classes. As a consequence, + /// clients need to explicitly call close() to ensure the stream closed successfully. + /// + /// The Stream object can be used to manipulate the Stream's state. Also, time-constant + /// and time-varying information about the Stream can be retrieved. + ////// + class Stream + { + public: + // Opening/closing: + virtual ~Stream(); - virtual void close(); - bool isOpen() const; + virtual void close(); + bool isOpen() const; - // Additional set up: - void setStreamFinishedCallback(PaStreamFinishedCallback *callback); + // Additional set up: + void setStreamFinishedCallback(PaStreamFinishedCallback *callback); - // State management: - void start(); - void stop(); - void abort(); + // State management: + void start(); + void stop(); + void abort(); - bool isStopped() const; - bool isActive() const; + bool isStopped() const; + bool isActive() const; - // Stream info (time-constant, but might become time-variant soon): - PaTime inputLatency() const; - PaTime outputLatency() const; - double sampleRate() const; + // Stream info (time-constant, but might become time-variant soon): + PaTime inputLatency() const; + PaTime outputLatency() const; + double sampleRate() const; - // Stream info (time-varying): - PaTime time() const; + // Stream info (time-varying): + PaTime time() const; - // Accessors for PortAudio PaStream, useful for interfacing - // with PortAudio add-ons (such as PortMixer) for instance: - const PaStream *paStream() const; - PaStream *paStream(); + // Accessors for PortAudio PaStream, useful for interfacing + // with PortAudio add-ons (such as PortMixer) for instance: + const PaStream *paStream() const; + PaStream *paStream(); - protected: - Stream(); // abstract class + protected: + Stream(); // abstract class - PaStream *stream_; + PaStream *stream_; - private: - Stream(const Stream &); // non-copyable - Stream &operator=(const Stream &); // non-copyable - }; + private: + Stream(const Stream &); // non-copyable + Stream &operator=(const Stream &); // non-copyable + }; } // namespace portaudio #endif // INCLUDED_PORTAUDIO_STREAM_HXX - diff --git a/bindings/cpp/include/portaudiocpp/StreamParameters.hxx b/bindings/cpp/include/portaudiocpp/StreamParameters.hxx index c0ec9a9..32f5f21 100644 --- a/bindings/cpp/include/portaudiocpp/StreamParameters.hxx +++ b/bindings/cpp/include/portaudiocpp/StreamParameters.hxx @@ -13,61 +13,61 @@ namespace portaudio { - ////// - /// @brief The entire set of parameters needed to configure and open - /// a Stream. - /// - /// It contains parameters of input, output and shared parameters. - /// Using the isSupported() method, the StreamParameters can be - /// checked if opening a Stream using this StreamParameters would - /// succeed or not. Accessors are provided to higher-level parameters - /// aswell as the lower-level parameters which are mainly intended for - /// internal use. - ////// - class StreamParameters - { - public: - StreamParameters(); - StreamParameters(const DirectionSpecificStreamParameters &inputParameters, - const DirectionSpecificStreamParameters &outputParameters, double sampleRate, - unsigned long framesPerBuffer, PaStreamFlags flags); + ////// + /// @brief The entire set of parameters needed to configure and open + /// a Stream. + /// + /// It contains parameters of input, output and shared parameters. + /// Using the isSupported() method, the StreamParameters can be + /// checked if opening a Stream using this StreamParameters would + /// succeed or not. Accessors are provided to higher-level parameters + /// aswell as the lower-level parameters which are mainly intended for + /// internal use. + ////// + class StreamParameters + { + public: + StreamParameters(); + StreamParameters(const DirectionSpecificStreamParameters &inputParameters, + const DirectionSpecificStreamParameters &outputParameters, double sampleRate, + unsigned long framesPerBuffer, PaStreamFlags flags); - // Set up for direction-specific: - void setInputParameters(const DirectionSpecificStreamParameters ¶meters); - void setOutputParameters(const DirectionSpecificStreamParameters ¶meters); + // Set up for direction-specific: + void setInputParameters(const DirectionSpecificStreamParameters ¶meters); + void setOutputParameters(const DirectionSpecificStreamParameters ¶meters); - // Set up for common parameters: - void setSampleRate(double sampleRate); - void setFramesPerBuffer(unsigned long framesPerBuffer); - void setFlag(PaStreamFlags flag); - void unsetFlag(PaStreamFlags flag); - void clearFlags(); + // Set up for common parameters: + void setSampleRate(double sampleRate); + void setFramesPerBuffer(unsigned long framesPerBuffer); + void setFlag(PaStreamFlags flag); + void unsetFlag(PaStreamFlags flag); + void clearFlags(); - // Validation: - bool isSupported() const; + // Validation: + bool isSupported() const; - // Accessors (direction-specific): - DirectionSpecificStreamParameters &inputParameters(); - const DirectionSpecificStreamParameters &inputParameters() const; - DirectionSpecificStreamParameters &outputParameters(); - const DirectionSpecificStreamParameters &outputParameters() const; + // Accessors (direction-specific): + DirectionSpecificStreamParameters &inputParameters(); + const DirectionSpecificStreamParameters &inputParameters() const; + DirectionSpecificStreamParameters &outputParameters(); + const DirectionSpecificStreamParameters &outputParameters() const; - // Accessors (common): - double sampleRate() const; - unsigned long framesPerBuffer() const; - PaStreamFlags flags() const; - bool isFlagSet(PaStreamFlags flag) const; + // Accessors (common): + double sampleRate() const; + unsigned long framesPerBuffer() const; + PaStreamFlags flags() const; + bool isFlagSet(PaStreamFlags flag) const; - private: - // Half-duplex specific parameters: - DirectionSpecificStreamParameters inputParameters_; - DirectionSpecificStreamParameters outputParameters_; + private: + // Half-duplex specific parameters: + DirectionSpecificStreamParameters inputParameters_; + DirectionSpecificStreamParameters outputParameters_; - // Common parameters: - double sampleRate_; - unsigned long framesPerBuffer_; - PaStreamFlags flags_; - }; + // Common parameters: + double sampleRate_; + unsigned long framesPerBuffer_; + PaStreamFlags flags_; + }; } // namespace portaudio diff --git a/bindings/cpp/include/portaudiocpp/System.hxx b/bindings/cpp/include/portaudiocpp/System.hxx index a159dc3..bdd966e 100644 --- a/bindings/cpp/include/portaudiocpp/System.hxx +++ b/bindings/cpp/include/portaudiocpp/System.hxx @@ -10,9 +10,9 @@ // Forward declaration(s): namespace portaudio { - class Device; - class Stream; - class HostApi; + class Device; + class Stream; + class HostApi; } // --------------------------------------------------------------------------------------- @@ -22,86 +22,85 @@ namespace portaudio { - ////// - /// @brief System singleton which represents the PortAudio system. - /// - /// The System is used to initialize/terminate PortAudio and provide - /// a single access point to the PortAudio System (instance()). - /// It can be used to iterate through all HostApi 's in the System as - /// well as all devices in the System. It also provides some utility - /// functionality of PortAudio. - /// - /// Terminating the System will also abort and close the open streams. - /// The Stream objects will need to be deallocated by the client though - /// (it's usually a good idea to have them cleaned up automatically). - ////// - class System - { - public: - class HostApiIterator; // forward declaration - class DeviceIterator; // forward declaration + ////// + /// @brief System singleton which represents the PortAudio system. + /// + /// The System is used to initialize/terminate PortAudio and provide + /// a single access point to the PortAudio System (instance()). + /// It can be used to iterate through all HostApi 's in the System as + /// well as all devices in the System. It also provides some utility + /// functionality of PortAudio. + /// + /// Terminating the System will also abort and close the open streams. + /// The Stream objects will need to be deallocated by the client though + /// (it's usually a good idea to have them cleaned up automatically). + ////// + class System + { + public: + class HostApiIterator; // forward declaration + class DeviceIterator; // forward declaration - // ------------------------------------------------------------------------------- + // ------------------------------------------------------------------------------- - static int version(); - static const char *versionText(); + static int version(); + static const char *versionText(); - static void initialize(); - static void terminate(); + static void initialize(); + static void terminate(); - static System &instance(); - static bool exists(); + static System &instance(); + static bool exists(); - // ------------------------------------------------------------------------------- + // ------------------------------------------------------------------------------- - // host apis: - HostApiIterator hostApisBegin(); - HostApiIterator hostApisEnd(); + // host apis: + HostApiIterator hostApisBegin(); + HostApiIterator hostApisEnd(); - HostApi &defaultHostApi(); + HostApi &defaultHostApi(); - HostApi &hostApiByTypeId(PaHostApiTypeId type); - HostApi &hostApiByIndex(PaHostApiIndex index); + HostApi &hostApiByTypeId(PaHostApiTypeId type); + HostApi &hostApiByIndex(PaHostApiIndex index); - int hostApiCount(); + int hostApiCount(); - // ------------------------------------------------------------------------------- + // ------------------------------------------------------------------------------- - // devices: - DeviceIterator devicesBegin(); - DeviceIterator devicesEnd(); + // devices: + DeviceIterator devicesBegin(); + DeviceIterator devicesEnd(); - Device &defaultInputDevice(); - Device &defaultOutputDevice(); + Device &defaultInputDevice(); + Device &defaultOutputDevice(); - Device &deviceByIndex(PaDeviceIndex index); + Device &deviceByIndex(PaDeviceIndex index); - int deviceCount(); + int deviceCount(); - static Device &nullDevice(); + static Device &nullDevice(); - // ------------------------------------------------------------------------------- + // ------------------------------------------------------------------------------- - // misc: - void sleep(long msec); - int sizeOfSample(PaSampleFormat format); + // misc: + void sleep(long msec); + int sizeOfSample(PaSampleFormat format); - private: - System(); - ~System(); + private: + System(); + ~System(); - static System *instance_; - static int initCount_; + static System *instance_; + static int initCount_; - static HostApi **hostApis_; - static Device **devices_; + static HostApi **hostApis_; + static Device **devices_; - static Device *nullDevice_; - }; + static Device *nullDevice_; + }; } // namespace portaudio #endif // INCLUDED_PORTAUDIO_SYSTEM_HXX - diff --git a/bindings/cpp/include/portaudiocpp/SystemDeviceIterator.hxx b/bindings/cpp/include/portaudiocpp/SystemDeviceIterator.hxx index ffa195d..d5ae31e 100644 --- a/bindings/cpp/include/portaudiocpp/SystemDeviceIterator.hxx +++ b/bindings/cpp/include/portaudiocpp/SystemDeviceIterator.hxx @@ -13,8 +13,8 @@ // Forward declaration(s): namespace portaudio { - class Device; - class HostApi; + class Device; + class HostApi; } // --------------------------------------------------------------------------------------- @@ -23,39 +23,39 @@ namespace portaudio namespace portaudio { - - ////// - /// @brief Iterator class for iterating through all Devices in a System. - /// - /// Devices will be iterated by iterating all Devices in each - /// HostApi in the System. Compliant with the STL bidirectional - /// iterator concept. - ////// - class System::DeviceIterator - { - public: - typedef std::bidirectional_iterator_tag iterator_category; - typedef Device value_type; - typedef ptrdiff_t difference_type; - typedef Device * pointer; - typedef Device & reference; - Device &operator*() const; - Device *operator->() const; + ////// + /// @brief Iterator class for iterating through all Devices in a System. + /// + /// Devices will be iterated by iterating all Devices in each + /// HostApi in the System. Compliant with the STL bidirectional + /// iterator concept. + ////// + class System::DeviceIterator + { + public: + typedef std::bidirectional_iterator_tag iterator_category; + typedef Device value_type; + typedef ptrdiff_t difference_type; + typedef Device * pointer; + typedef Device & reference; - DeviceIterator &operator++(); - DeviceIterator operator++(int); - DeviceIterator &operator--(); - DeviceIterator operator--(int); + Device &operator*() const; + Device *operator->() const; - bool operator==(const DeviceIterator &rhs) const; - bool operator!=(const DeviceIterator &rhs) const; + DeviceIterator &operator++(); + DeviceIterator operator++(int); + DeviceIterator &operator--(); + DeviceIterator operator--(int); - private: - friend class System; - friend class HostApi; - Device **ptr_; - }; + bool operator==(const DeviceIterator &rhs) const; + bool operator!=(const DeviceIterator &rhs) const; + + private: + friend class System; + friend class HostApi; + Device **ptr_; + }; } // namespace portaudio @@ -63,4 +63,3 @@ namespace portaudio // --------------------------------------------------------------------------------------- #endif // INCLUDED_PORTAUDIO_SYSTEMDEVICEITERATOR_HXX - diff --git a/bindings/cpp/include/portaudiocpp/SystemHostApiIterator.hxx b/bindings/cpp/include/portaudiocpp/SystemHostApiIterator.hxx index 3e6a978..a3e2f4b 100644 --- a/bindings/cpp/include/portaudiocpp/SystemHostApiIterator.hxx +++ b/bindings/cpp/include/portaudiocpp/SystemHostApiIterator.hxx @@ -13,7 +13,7 @@ // Forward declaration(s): namespace portaudio { - class HostApi; + class HostApi; } // --------------------------------------------------------------------------------------- @@ -23,35 +23,35 @@ namespace portaudio { - ////// - /// @brief Iterator class for iterating through all HostApis in a System. - /// - /// Compliant with the STL bidirectional iterator concept. - ////// - class System::HostApiIterator - { - public: - typedef std::bidirectional_iterator_tag iterator_category; - typedef Device value_type; - typedef ptrdiff_t difference_type; - typedef HostApi * pointer; - typedef HostApi & reference; + ////// + /// @brief Iterator class for iterating through all HostApis in a System. + /// + /// Compliant with the STL bidirectional iterator concept. + ////// + class System::HostApiIterator + { + public: + typedef std::bidirectional_iterator_tag iterator_category; + typedef Device value_type; + typedef ptrdiff_t difference_type; + typedef HostApi * pointer; + typedef HostApi & reference; - HostApi &operator*() const; - HostApi *operator->() const; + HostApi &operator*() const; + HostApi *operator->() const; - HostApiIterator &operator++(); - HostApiIterator operator++(int); - HostApiIterator &operator--(); - HostApiIterator operator--(int); + HostApiIterator &operator++(); + HostApiIterator operator++(int); + HostApiIterator &operator--(); + HostApiIterator operator--(int); - bool operator==(const HostApiIterator &rhs) const; - bool operator!=(const HostApiIterator &rhs) const; + bool operator==(const HostApiIterator &rhs) const; + bool operator!=(const HostApiIterator &rhs) const; - private: - friend class System; - HostApi **ptr_; - }; + private: + friend class System; + HostApi **ptr_; + }; } // namespace portaudio diff --git a/bindings/cpp/source/portaudiocpp/AsioDeviceAdapter.cxx b/bindings/cpp/source/portaudiocpp/AsioDeviceAdapter.cxx index 3efc100..e7fd1ee 100644 --- a/bindings/cpp/source/portaudiocpp/AsioDeviceAdapter.cxx +++ b/bindings/cpp/source/portaudiocpp/AsioDeviceAdapter.cxx @@ -9,75 +9,73 @@ namespace portaudio { - AsioDeviceAdapter::AsioDeviceAdapter(Device &device) - { - if (device.hostApi().typeId() != paASIO) - throw PaCppException(PaCppException::UNABLE_TO_ADAPT_DEVICE); + AsioDeviceAdapter::AsioDeviceAdapter(Device &device) + { + if (device.hostApi().typeId() != paASIO) + throw PaCppException(PaCppException::UNABLE_TO_ADAPT_DEVICE); - device_ = &device; + device_ = &device; - PaError err = PaAsio_GetAvailableLatencyValues(device_->index(), &minBufferSize_, &maxBufferSize_, - &preferredBufferSize_, &granularity_); + PaError err = PaAsio_GetAvailableLatencyValues(device_->index(), &minBufferSize_, &maxBufferSize_, + &preferredBufferSize_, &granularity_); - if (err != paNoError) - throw PaException(err); + if (err != paNoError) + throw PaException(err); - } + } - Device &AsioDeviceAdapter::device() - { - return *device_; - } + Device &AsioDeviceAdapter::device() + { + return *device_; + } - long AsioDeviceAdapter::minBufferSize() const - { - return minBufferSize_; - } + long AsioDeviceAdapter::minBufferSize() const + { + return minBufferSize_; + } - long AsioDeviceAdapter::maxBufferSize() const - { - return maxBufferSize_; - } + long AsioDeviceAdapter::maxBufferSize() const + { + return maxBufferSize_; + } - long AsioDeviceAdapter::preferredBufferSize() const - { - return preferredBufferSize_; - } + long AsioDeviceAdapter::preferredBufferSize() const + { + return preferredBufferSize_; + } - long AsioDeviceAdapter::granularity() const - { - return granularity_; - } + long AsioDeviceAdapter::granularity() const + { + return granularity_; + } - void AsioDeviceAdapter::showControlPanel(void *systemSpecific) - { - PaError err = PaAsio_ShowControlPanel(device_->index(), systemSpecific); + void AsioDeviceAdapter::showControlPanel(void *systemSpecific) + { + PaError err = PaAsio_ShowControlPanel(device_->index(), systemSpecific); - if (err != paNoError) - throw PaException(err); - } + if (err != paNoError) + throw PaException(err); + } - const char *AsioDeviceAdapter::inputChannelName(int channelIndex) const - { - const char *channelName; - PaError err = PaAsio_GetInputChannelName(device_->index(), channelIndex, &channelName); + const char *AsioDeviceAdapter::inputChannelName(int channelIndex) const + { + const char *channelName; + PaError err = PaAsio_GetInputChannelName(device_->index(), channelIndex, &channelName); - if (err != paNoError) - throw PaException(err); + if (err != paNoError) + throw PaException(err); - return channelName; - } + return channelName; + } - const char *AsioDeviceAdapter::outputChannelName(int channelIndex) const - { - const char *channelName; - PaError err = PaAsio_GetOutputChannelName(device_->index(), channelIndex, &channelName); + const char *AsioDeviceAdapter::outputChannelName(int channelIndex) const + { + const char *channelName; + PaError err = PaAsio_GetOutputChannelName(device_->index(), channelIndex, &channelName); - if (err != paNoError) - throw PaException(err); + if (err != paNoError) + throw PaException(err); - return channelName; - } + return channelName; + } } - - diff --git a/bindings/cpp/source/portaudiocpp/BlockingStream.cxx b/bindings/cpp/source/portaudiocpp/BlockingStream.cxx index b26b9e8..751e1f2 100644 --- a/bindings/cpp/source/portaudiocpp/BlockingStream.cxx +++ b/bindings/cpp/source/portaudiocpp/BlockingStream.cxx @@ -8,93 +8,90 @@ namespace portaudio { - // -------------------------------------------------------------------------------------- + // -------------------------------------------------------------------------------------- - BlockingStream::BlockingStream() - { - } + BlockingStream::BlockingStream() + { + } - BlockingStream::BlockingStream(const StreamParameters ¶meters) - { - open(parameters); - } + BlockingStream::BlockingStream(const StreamParameters ¶meters) + { + open(parameters); + } - BlockingStream::~BlockingStream() - { - try - { - close(); - } - catch (...) - { - // ignore all errors - } - } + BlockingStream::~BlockingStream() + { + try + { + close(); + } + catch (...) + { + // ignore all errors + } + } - // -------------------------------------------------------------------------------------- + // -------------------------------------------------------------------------------------- - void BlockingStream::open(const StreamParameters ¶meters) - { - PaError err = Pa_OpenStream(&stream_, parameters.inputParameters().paStreamParameters(), parameters.outputParameters().paStreamParameters(), - parameters.sampleRate(), parameters.framesPerBuffer(), parameters.flags(), NULL, NULL); + void BlockingStream::open(const StreamParameters ¶meters) + { + PaError err = Pa_OpenStream(&stream_, parameters.inputParameters().paStreamParameters(), parameters.outputParameters().paStreamParameters(), + parameters.sampleRate(), parameters.framesPerBuffer(), parameters.flags(), NULL, NULL); - if (err != paNoError) - { - throw PaException(err); - } - } + if (err != paNoError) + { + throw PaException(err); + } + } - // -------------------------------------------------------------------------------------- + // -------------------------------------------------------------------------------------- - void BlockingStream::read(void *buffer, unsigned long numFrames) - { - PaError err = Pa_ReadStream(stream_, buffer, numFrames); + void BlockingStream::read(void *buffer, unsigned long numFrames) + { + PaError err = Pa_ReadStream(stream_, buffer, numFrames); - if (err != paNoError) - { - throw PaException(err); - } - } + if (err != paNoError) + { + throw PaException(err); + } + } - void BlockingStream::write(const void *buffer, unsigned long numFrames) - { - PaError err = Pa_WriteStream(stream_, buffer, numFrames); + void BlockingStream::write(const void *buffer, unsigned long numFrames) + { + PaError err = Pa_WriteStream(stream_, buffer, numFrames); - if (err != paNoError) - { - throw PaException(err); - } - } + if (err != paNoError) + { + throw PaException(err); + } + } - // -------------------------------------------------------------------------------------- + // -------------------------------------------------------------------------------------- - signed long BlockingStream::availableReadSize() const - { - signed long avail = Pa_GetStreamReadAvailable(stream_); + signed long BlockingStream::availableReadSize() const + { + signed long avail = Pa_GetStreamReadAvailable(stream_); - if (avail < 0) - { - throw PaException(avail); - } + if (avail < 0) + { + throw PaException(avail); + } - return avail; - } + return avail; + } - signed long BlockingStream::availableWriteSize() const - { - signed long avail = Pa_GetStreamWriteAvailable(stream_); + signed long BlockingStream::availableWriteSize() const + { + signed long avail = Pa_GetStreamWriteAvailable(stream_); - if (avail < 0) - { - throw PaException(avail); - } + if (avail < 0) + { + throw PaException(avail); + } - return avail; - } + return avail; + } - // -------------------------------------------------------------------------------------- + // -------------------------------------------------------------------------------------- } // portaudio - - - diff --git a/bindings/cpp/source/portaudiocpp/CFunCallbackStream.cxx b/bindings/cpp/source/portaudiocpp/CFunCallbackStream.cxx index 9cceda9..7dcc751 100644 --- a/bindings/cpp/source/portaudiocpp/CFunCallbackStream.cxx +++ b/bindings/cpp/source/portaudiocpp/CFunCallbackStream.cxx @@ -5,37 +5,37 @@ namespace portaudio { - CFunCallbackStream::CFunCallbackStream() - { - } + CFunCallbackStream::CFunCallbackStream() + { + } - CFunCallbackStream::CFunCallbackStream(const StreamParameters ¶meters, PaStreamCallback *funPtr, void *userData) - { - open(parameters, funPtr, userData); - } + CFunCallbackStream::CFunCallbackStream(const StreamParameters ¶meters, PaStreamCallback *funPtr, void *userData) + { + open(parameters, funPtr, userData); + } - CFunCallbackStream::~CFunCallbackStream() - { - try - { - close(); - } - catch (...) - { - // ignore all errors - } - } + CFunCallbackStream::~CFunCallbackStream() + { + try + { + close(); + } + catch (...) + { + // ignore all errors + } + } - // ---------------------------------------------------------------------------------== + // ---------------------------------------------------------------------------------== - void CFunCallbackStream::open(const StreamParameters ¶meters, PaStreamCallback *funPtr, void *userData) - { - PaError err = Pa_OpenStream(&stream_, parameters.inputParameters().paStreamParameters(), parameters.outputParameters().paStreamParameters(), - parameters.sampleRate(), parameters.framesPerBuffer(), parameters.flags(), funPtr, userData); + void CFunCallbackStream::open(const StreamParameters ¶meters, PaStreamCallback *funPtr, void *userData) + { + PaError err = Pa_OpenStream(&stream_, parameters.inputParameters().paStreamParameters(), parameters.outputParameters().paStreamParameters(), + parameters.sampleRate(), parameters.framesPerBuffer(), parameters.flags(), funPtr, userData); - if (err != paNoError) - { - throw PaException(err); - } - } + if (err != paNoError) + { + throw PaException(err); + } + } } diff --git a/bindings/cpp/source/portaudiocpp/CallbackInterface.cxx b/bindings/cpp/source/portaudiocpp/CallbackInterface.cxx index 0137261..30ad933 100644 --- a/bindings/cpp/source/portaudiocpp/CallbackInterface.cxx +++ b/bindings/cpp/source/portaudiocpp/CallbackInterface.cxx @@ -3,23 +3,21 @@ namespace portaudio { - namespace impl - { + namespace impl + { - ////// - /// Adapts any CallbackInterface object to a C-callable function (ie this function). A - /// pointer to the object should be passed as ``userData'' when setting up the callback. - ////// - int callbackInterfaceToPaCallbackAdapter(const void *inputBuffer, void *outputBuffer, unsigned long numFrames, - const PaStreamCallbackTimeInfo *timeInfo, PaStreamCallbackFlags statusFlags, void *userData) - { - CallbackInterface *cb = static_cast(userData); - return cb->paCallbackFun(inputBuffer, outputBuffer, numFrames, timeInfo, statusFlags); - } + ////// + /// Adapts any CallbackInterface object to a C-callable function (ie this function). A + /// pointer to the object should be passed as ``userData'' when setting up the callback. + ////// + int callbackInterfaceToPaCallbackAdapter(const void *inputBuffer, void *outputBuffer, unsigned long numFrames, + const PaStreamCallbackTimeInfo *timeInfo, PaStreamCallbackFlags statusFlags, void *userData) + { + CallbackInterface *cb = static_cast(userData); + return cb->paCallbackFun(inputBuffer, outputBuffer, numFrames, timeInfo, statusFlags); + } - } // namespace impl + } // namespace impl } // namespace portaudio - - diff --git a/bindings/cpp/source/portaudiocpp/CallbackStream.cxx b/bindings/cpp/source/portaudiocpp/CallbackStream.cxx index b6c8e1d..d295a0a 100644 --- a/bindings/cpp/source/portaudiocpp/CallbackStream.cxx +++ b/bindings/cpp/source/portaudiocpp/CallbackStream.cxx @@ -2,19 +2,19 @@ namespace portaudio { - CallbackStream::CallbackStream() - { - } + CallbackStream::CallbackStream() + { + } - CallbackStream::~CallbackStream() - { - } + CallbackStream::~CallbackStream() + { + } - // ----------------------------------------------------------------------------------- - - double CallbackStream::cpuLoad() const - { - return Pa_GetStreamCpuLoad(stream_); - } + // ----------------------------------------------------------------------------------- + + double CallbackStream::cpuLoad() const + { + return Pa_GetStreamCpuLoad(stream_); + } } // namespace portaudio diff --git a/bindings/cpp/source/portaudiocpp/CppFunCallbackStream.cxx b/bindings/cpp/source/portaudiocpp/CppFunCallbackStream.cxx index fe0b4ab..19a76ee 100644 --- a/bindings/cpp/source/portaudiocpp/CppFunCallbackStream.cxx +++ b/bindings/cpp/source/portaudiocpp/CppFunCallbackStream.cxx @@ -5,77 +5,77 @@ namespace portaudio { - namespace impl - { - ////// - /// Adapts any a C++ callback to a C-callable function (ie this function). A - /// pointer to a struct with the C++ function pointer and the actual user data should be - /// passed as the ``userData'' parameter when setting up the callback. - ////// - int cppCallbackToPaCallbackAdapter(const void *inputBuffer, void *outputBuffer, unsigned long numFrames, - const PaStreamCallbackTimeInfo *timeInfo, PaStreamCallbackFlags statusFlags, void *userData) - { - FunCallbackStream::CppToCCallbackData *data = static_cast(userData); - return data->funPtr(inputBuffer, outputBuffer, numFrames, timeInfo, statusFlags, data->userData); - } - } + namespace impl + { + ////// + /// Adapts any a C++ callback to a C-callable function (ie this function). A + /// pointer to a struct with the C++ function pointer and the actual user data should be + /// passed as the ``userData'' parameter when setting up the callback. + ////// + int cppCallbackToPaCallbackAdapter(const void *inputBuffer, void *outputBuffer, unsigned long numFrames, + const PaStreamCallbackTimeInfo *timeInfo, PaStreamCallbackFlags statusFlags, void *userData) + { + FunCallbackStream::CppToCCallbackData *data = static_cast(userData); + return data->funPtr(inputBuffer, outputBuffer, numFrames, timeInfo, statusFlags, data->userData); + } + } - // ----------------------------------------------------------------------------------- + // ----------------------------------------------------------------------------------- - FunCallbackStream::CppToCCallbackData::CppToCCallbackData() - { - } + FunCallbackStream::CppToCCallbackData::CppToCCallbackData() + { + } - FunCallbackStream::CppToCCallbackData::CppToCCallbackData(CallbackFunPtr funPtr, void *userData) : funPtr(funPtr), userData(userData) - { - } + FunCallbackStream::CppToCCallbackData::CppToCCallbackData(CallbackFunPtr funPtr, void *userData) : funPtr(funPtr), userData(userData) + { + } - void FunCallbackStream::CppToCCallbackData::init(CallbackFunPtr funPtr, void *userData) - { - this->funPtr = funPtr; - this->userData = userData; - } + void FunCallbackStream::CppToCCallbackData::init(CallbackFunPtr funPtr, void *userData) + { + this->funPtr = funPtr; + this->userData = userData; + } - // ----------------------------------------------------------------------------------- + // ----------------------------------------------------------------------------------- - FunCallbackStream::FunCallbackStream() - { - } + FunCallbackStream::FunCallbackStream() + { + } - FunCallbackStream::FunCallbackStream(const StreamParameters ¶meters, CallbackFunPtr funPtr, void *userData) : adapterData_(funPtr, userData) - { - open(parameters); - } + FunCallbackStream::FunCallbackStream(const StreamParameters ¶meters, CallbackFunPtr funPtr, void *userData) : adapterData_(funPtr, userData) + { + open(parameters); + } - FunCallbackStream::~FunCallbackStream() - { - try - { - close(); - } - catch (...) - { - // ignore all errors - } - } + FunCallbackStream::~FunCallbackStream() + { + try + { + close(); + } + catch (...) + { + // ignore all errors + } + } - void FunCallbackStream::open(const StreamParameters ¶meters, CallbackFunPtr funPtr, void *userData) - { - adapterData_.init(funPtr, userData); - open(parameters); - } + void FunCallbackStream::open(const StreamParameters ¶meters, CallbackFunPtr funPtr, void *userData) + { + adapterData_.init(funPtr, userData); + open(parameters); + } - void FunCallbackStream::open(const StreamParameters ¶meters) - { - PaError err = Pa_OpenStream(&stream_, parameters.inputParameters().paStreamParameters(), parameters.outputParameters().paStreamParameters(), - parameters.sampleRate(), parameters.framesPerBuffer(), parameters.flags(), &impl::cppCallbackToPaCallbackAdapter, - static_cast(&adapterData_)); + void FunCallbackStream::open(const StreamParameters ¶meters) + { + PaError err = Pa_OpenStream(&stream_, parameters.inputParameters().paStreamParameters(), parameters.outputParameters().paStreamParameters(), + parameters.sampleRate(), parameters.framesPerBuffer(), parameters.flags(), &impl::cppCallbackToPaCallbackAdapter, + static_cast(&adapterData_)); - if (err != paNoError) - { - throw PaException(err); - } - } + if (err != paNoError) + { + throw PaException(err); + } + } - // ----------------------------------------------------------------------------------- + // ----------------------------------------------------------------------------------- } diff --git a/bindings/cpp/source/portaudiocpp/Device.cxx b/bindings/cpp/source/portaudiocpp/Device.cxx index 7b21b03..727b721 100644 --- a/bindings/cpp/source/portaudiocpp/Device.cxx +++ b/bindings/cpp/source/portaudiocpp/Device.cxx @@ -9,160 +9,158 @@ namespace portaudio { - // ------------------------------------------------------------------------------- + // ------------------------------------------------------------------------------- - Device::Device(PaDeviceIndex index) : index_(index) - { - if (index == paNoDevice) - info_ = NULL; - else - info_ = Pa_GetDeviceInfo(index); - } + Device::Device(PaDeviceIndex index) : index_(index) + { + if (index == paNoDevice) + info_ = NULL; + else + info_ = Pa_GetDeviceInfo(index); + } - Device::~Device() - { - } + Device::~Device() + { + } - PaDeviceIndex Device::index() const - { - return index_; - } + PaDeviceIndex Device::index() const + { + return index_; + } - const char *Device::name() const - { - if (info_ == NULL) - return ""; + const char *Device::name() const + { + if (info_ == NULL) + return ""; - return info_->name; - } + return info_->name; + } - int Device::maxInputChannels() const - { - if (info_ == NULL) - return 0; + int Device::maxInputChannels() const + { + if (info_ == NULL) + return 0; - return info_->maxInputChannels; - } + return info_->maxInputChannels; + } - int Device::maxOutputChannels() const - { - if (info_ == NULL) - return 0; + int Device::maxOutputChannels() const + { + if (info_ == NULL) + return 0; - return info_->maxOutputChannels; - } + return info_->maxOutputChannels; + } - PaTime Device::defaultLowInputLatency() const - { - if (info_ == NULL) - return static_cast(0.0); + PaTime Device::defaultLowInputLatency() const + { + if (info_ == NULL) + return static_cast(0.0); - return info_->defaultLowInputLatency; - } + return info_->defaultLowInputLatency; + } - PaTime Device::defaultHighInputLatency() const - { - if (info_ == NULL) - return static_cast(0.0); + PaTime Device::defaultHighInputLatency() const + { + if (info_ == NULL) + return static_cast(0.0); - return info_->defaultHighInputLatency; - } + return info_->defaultHighInputLatency; + } - PaTime Device::defaultLowOutputLatency() const - { - if (info_ == NULL) - return static_cast(0.0); + PaTime Device::defaultLowOutputLatency() const + { + if (info_ == NULL) + return static_cast(0.0); - return info_->defaultLowOutputLatency; - } + return info_->defaultLowOutputLatency; + } - PaTime Device::defaultHighOutputLatency() const - { - if (info_ == NULL) - return static_cast(0.0); + PaTime Device::defaultHighOutputLatency() const + { + if (info_ == NULL) + return static_cast(0.0); - return info_->defaultHighOutputLatency; - } + return info_->defaultHighOutputLatency; + } - double Device::defaultSampleRate() const - { - if (info_ == NULL) - return 0.0; + double Device::defaultSampleRate() const + { + if (info_ == NULL) + return 0.0; - return info_->defaultSampleRate; - } + return info_->defaultSampleRate; + } - // ------------------------------------------------------------------------------- + // ------------------------------------------------------------------------------- - bool Device::isInputOnlyDevice() const - { - return (maxOutputChannels() == 0); - } + bool Device::isInputOnlyDevice() const + { + return (maxOutputChannels() == 0); + } - bool Device::isOutputOnlyDevice() const - { - return (maxInputChannels() == 0); - } + bool Device::isOutputOnlyDevice() const + { + return (maxInputChannels() == 0); + } - bool Device::isFullDuplexDevice() const - { - return (maxInputChannels() > 0 && maxOutputChannels() > 0); - } + bool Device::isFullDuplexDevice() const + { + return (maxInputChannels() > 0 && maxOutputChannels() > 0); + } - bool Device::isSystemDefaultInputDevice() const - { - return (System::instance().defaultInputDevice() == *this); - } + bool Device::isSystemDefaultInputDevice() const + { + return (System::instance().defaultInputDevice() == *this); + } - bool Device::isSystemDefaultOutputDevice() const - { - return (System::instance().defaultOutputDevice() == *this); - } + bool Device::isSystemDefaultOutputDevice() const + { + return (System::instance().defaultOutputDevice() == *this); + } - bool Device::isHostApiDefaultInputDevice() const - { - return (hostApi().defaultInputDevice() == *this); - } + bool Device::isHostApiDefaultInputDevice() const + { + return (hostApi().defaultInputDevice() == *this); + } - bool Device::isHostApiDefaultOutputDevice() const - { - return (hostApi().defaultOutputDevice() == *this); - } + bool Device::isHostApiDefaultOutputDevice() const + { + return (hostApi().defaultOutputDevice() == *this); + } - // ------------------------------------------------------------------------------- + // ------------------------------------------------------------------------------- - bool Device::operator==(const Device &rhs) const - { - return (index_ == rhs.index_); - } + bool Device::operator==(const Device &rhs) const + { + return (index_ == rhs.index_); + } - bool Device::operator!=(const Device &rhs) const - { - return !(*this == rhs); - } + bool Device::operator!=(const Device &rhs) const + { + return !(*this == rhs); + } - // ------------------------------------------------------------------------------- + // ------------------------------------------------------------------------------- - HostApi &Device::hostApi() - { - // NOTE: will cause an exception when called for the null device - if (info_ == NULL) - throw PaException(paInternalError); + HostApi &Device::hostApi() + { + // NOTE: will cause an exception when called for the null device + if (info_ == NULL) + throw PaException(paInternalError); - return System::instance().hostApiByIndex(info_->hostApi); - } + return System::instance().hostApiByIndex(info_->hostApi); + } - const HostApi &Device::hostApi() const - { - // NOTE; will cause an exception when called for the null device - if (info_ == NULL) - throw PaException(paInternalError); + const HostApi &Device::hostApi() const + { + // NOTE; will cause an exception when called for the null device + if (info_ == NULL) + throw PaException(paInternalError); - return System::instance().hostApiByIndex(info_->hostApi); - } + return System::instance().hostApiByIndex(info_->hostApi); + } - // ------------------------------------------------------------------------------- + // ------------------------------------------------------------------------------- } // namespace portaudio - - diff --git a/bindings/cpp/source/portaudiocpp/DirectionSpecificStreamParameters.cxx b/bindings/cpp/source/portaudiocpp/DirectionSpecificStreamParameters.cxx index 68453d0..558f2e2 100644 --- a/bindings/cpp/source/portaudiocpp/DirectionSpecificStreamParameters.cxx +++ b/bindings/cpp/source/portaudiocpp/DirectionSpecificStreamParameters.cxx @@ -5,159 +5,159 @@ namespace portaudio { - // ----------------------------------------------------------------------------------- + // ----------------------------------------------------------------------------------- - ////// - /// Returns a `nil' DirectionSpecificStreamParameters object. This can be used to - /// specify that one direction of a Stream is not required (i.e. when creating - /// a half-duplex Stream). All fields of the null DirectionSpecificStreamParameters - /// object are invalid except for the device and the number of channel, which are set - /// to paNoDevice and 0 respectively. - ////// - DirectionSpecificStreamParameters DirectionSpecificStreamParameters::null() - { - DirectionSpecificStreamParameters tmp; - tmp.paStreamParameters_.device = paNoDevice; - tmp.paStreamParameters_.channelCount = 0; - return tmp; - } + ////// + /// Returns a `nil' DirectionSpecificStreamParameters object. This can be used to + /// specify that one direction of a Stream is not required (i.e. when creating + /// a half-duplex Stream). All fields of the null DirectionSpecificStreamParameters + /// object are invalid except for the device and the number of channel, which are set + /// to paNoDevice and 0 respectively. + ////// + DirectionSpecificStreamParameters DirectionSpecificStreamParameters::null() + { + DirectionSpecificStreamParameters tmp; + tmp.paStreamParameters_.device = paNoDevice; + tmp.paStreamParameters_.channelCount = 0; + return tmp; + } - // ----------------------------------------------------------------------------------- + // ----------------------------------------------------------------------------------- - ////// - /// Default constructor -- all parameters will be uninitialized. - ////// - DirectionSpecificStreamParameters::DirectionSpecificStreamParameters() - { - } + ////// + /// Default constructor -- all parameters will be uninitialized. + ////// + DirectionSpecificStreamParameters::DirectionSpecificStreamParameters() + { + } - ////// - /// Constructor which sets all required fields. - ////// - DirectionSpecificStreamParameters::DirectionSpecificStreamParameters(const Device &device, int numChannels, - SampleDataFormat format, bool interleaved, PaTime suggestedLatency, void *hostApiSpecificStreamInfo) - { - setDevice(device); - setNumChannels(numChannels); - setSampleFormat(format, interleaved); - setSuggestedLatency(suggestedLatency); - setHostApiSpecificStreamInfo(hostApiSpecificStreamInfo); - } + ////// + /// Constructor which sets all required fields. + ////// + DirectionSpecificStreamParameters::DirectionSpecificStreamParameters(const Device &device, int numChannels, + SampleDataFormat format, bool interleaved, PaTime suggestedLatency, void *hostApiSpecificStreamInfo) + { + setDevice(device); + setNumChannels(numChannels); + setSampleFormat(format, interleaved); + setSuggestedLatency(suggestedLatency); + setHostApiSpecificStreamInfo(hostApiSpecificStreamInfo); + } - // ----------------------------------------------------------------------------------- + // ----------------------------------------------------------------------------------- - void DirectionSpecificStreamParameters::setDevice(const Device &device) - { - paStreamParameters_.device = device.index(); - } + void DirectionSpecificStreamParameters::setDevice(const Device &device) + { + paStreamParameters_.device = device.index(); + } - void DirectionSpecificStreamParameters::setNumChannels(int numChannels) - { - paStreamParameters_.channelCount = numChannels; - } + void DirectionSpecificStreamParameters::setNumChannels(int numChannels) + { + paStreamParameters_.channelCount = numChannels; + } - void DirectionSpecificStreamParameters::setSampleFormat(SampleDataFormat format, bool interleaved) - { - paStreamParameters_.sampleFormat = static_cast(format); + void DirectionSpecificStreamParameters::setSampleFormat(SampleDataFormat format, bool interleaved) + { + paStreamParameters_.sampleFormat = static_cast(format); - if (!interleaved) - paStreamParameters_.sampleFormat |= paNonInterleaved; - } + if (!interleaved) + paStreamParameters_.sampleFormat |= paNonInterleaved; + } - void DirectionSpecificStreamParameters::setHostApiSpecificSampleFormat(PaSampleFormat format, bool interleaved) - { - paStreamParameters_.sampleFormat = format; + void DirectionSpecificStreamParameters::setHostApiSpecificSampleFormat(PaSampleFormat format, bool interleaved) + { + paStreamParameters_.sampleFormat = format; - paStreamParameters_.sampleFormat |= paCustomFormat; + paStreamParameters_.sampleFormat |= paCustomFormat; - if (!interleaved) - paStreamParameters_.sampleFormat |= paNonInterleaved; - } + if (!interleaved) + paStreamParameters_.sampleFormat |= paNonInterleaved; + } - void DirectionSpecificStreamParameters::setSuggestedLatency(PaTime latency) - { - paStreamParameters_.suggestedLatency = latency; - } + void DirectionSpecificStreamParameters::setSuggestedLatency(PaTime latency) + { + paStreamParameters_.suggestedLatency = latency; + } - void DirectionSpecificStreamParameters::setHostApiSpecificStreamInfo(void *streamInfo) - { - paStreamParameters_.hostApiSpecificStreamInfo = streamInfo; - } + void DirectionSpecificStreamParameters::setHostApiSpecificStreamInfo(void *streamInfo) + { + paStreamParameters_.hostApiSpecificStreamInfo = streamInfo; + } - // ----------------------------------------------------------------------------------- + // ----------------------------------------------------------------------------------- - PaStreamParameters *DirectionSpecificStreamParameters::paStreamParameters() - { - if (paStreamParameters_.channelCount > 0 && paStreamParameters_.device != paNoDevice) - return &paStreamParameters_; - else - return NULL; - } + PaStreamParameters *DirectionSpecificStreamParameters::paStreamParameters() + { + if (paStreamParameters_.channelCount > 0 && paStreamParameters_.device != paNoDevice) + return &paStreamParameters_; + else + return NULL; + } - const PaStreamParameters *DirectionSpecificStreamParameters::paStreamParameters() const - { - if (paStreamParameters_.channelCount > 0 && paStreamParameters_.device != paNoDevice) - return &paStreamParameters_; - else - return NULL; - } + const PaStreamParameters *DirectionSpecificStreamParameters::paStreamParameters() const + { + if (paStreamParameters_.channelCount > 0 && paStreamParameters_.device != paNoDevice) + return &paStreamParameters_; + else + return NULL; + } - Device &DirectionSpecificStreamParameters::device() const - { - return System::instance().deviceByIndex(paStreamParameters_.device); - } + Device &DirectionSpecificStreamParameters::device() const + { + return System::instance().deviceByIndex(paStreamParameters_.device); + } - int DirectionSpecificStreamParameters::numChannels() const - { - return paStreamParameters_.channelCount; - } + int DirectionSpecificStreamParameters::numChannels() const + { + return paStreamParameters_.channelCount; + } - ////// - /// Returns the (non host api-specific) sample format, without including - /// the paNonInterleaved flag. If the sample format is host api-spefific, - /// INVALID_FORMAT (0) will be returned. - ////// - SampleDataFormat DirectionSpecificStreamParameters::sampleFormat() const - { - if (isSampleFormatHostApiSpecific()) - return INVALID_FORMAT; - else - return static_cast(paStreamParameters_.sampleFormat & ~paNonInterleaved); - } + ////// + /// Returns the (non host api-specific) sample format, without including + /// the paNonInterleaved flag. If the sample format is host api-spefific, + /// INVALID_FORMAT (0) will be returned. + ////// + SampleDataFormat DirectionSpecificStreamParameters::sampleFormat() const + { + if (isSampleFormatHostApiSpecific()) + return INVALID_FORMAT; + else + return static_cast(paStreamParameters_.sampleFormat & ~paNonInterleaved); + } - bool DirectionSpecificStreamParameters::isSampleFormatInterleaved() const - { - return ((paStreamParameters_.sampleFormat & paNonInterleaved) == 0); - } + bool DirectionSpecificStreamParameters::isSampleFormatInterleaved() const + { + return ((paStreamParameters_.sampleFormat & paNonInterleaved) == 0); + } - bool DirectionSpecificStreamParameters::isSampleFormatHostApiSpecific() const - { - return ((paStreamParameters_.sampleFormat & paCustomFormat) == 0); - } + bool DirectionSpecificStreamParameters::isSampleFormatHostApiSpecific() const + { + return ((paStreamParameters_.sampleFormat & paCustomFormat) == 0); + } - ////// - /// Returns the host api-specific sample format, without including any - /// paCustomFormat or paNonInterleaved flags. Will return 0 if the sample format is - /// not host api-specific. - ////// - PaSampleFormat DirectionSpecificStreamParameters::hostApiSpecificSampleFormat() const - { - if (isSampleFormatHostApiSpecific()) - return paStreamParameters_.sampleFormat & ~paCustomFormat & ~paNonInterleaved; - else - return 0; - } + ////// + /// Returns the host api-specific sample format, without including any + /// paCustomFormat or paNonInterleaved flags. Will return 0 if the sample format is + /// not host api-specific. + ////// + PaSampleFormat DirectionSpecificStreamParameters::hostApiSpecificSampleFormat() const + { + if (isSampleFormatHostApiSpecific()) + return paStreamParameters_.sampleFormat & ~paCustomFormat & ~paNonInterleaved; + else + return 0; + } - PaTime DirectionSpecificStreamParameters::suggestedLatency() const - { - return paStreamParameters_.suggestedLatency; - } + PaTime DirectionSpecificStreamParameters::suggestedLatency() const + { + return paStreamParameters_.suggestedLatency; + } - void *DirectionSpecificStreamParameters::hostApiSpecificStreamInfo() const - { - return paStreamParameters_.hostApiSpecificStreamInfo; - } + void *DirectionSpecificStreamParameters::hostApiSpecificStreamInfo() const + { + return paStreamParameters_.hostApiSpecificStreamInfo; + } - // ----------------------------------------------------------------------------------- + // ----------------------------------------------------------------------------------- } // namespace portaudio diff --git a/bindings/cpp/source/portaudiocpp/Exception.cxx b/bindings/cpp/source/portaudiocpp/Exception.cxx index 98945c8..de8724d 100644 --- a/bindings/cpp/source/portaudiocpp/Exception.cxx +++ b/bindings/cpp/source/portaudiocpp/Exception.cxx @@ -2,122 +2,120 @@ namespace portaudio { - // ----------------------------------------------------------------------------------- - // PaException: - // ----------------------------------------------------------------------------------- + // ----------------------------------------------------------------------------------- + // PaException: + // ----------------------------------------------------------------------------------- - ////// - /// Wraps a PortAudio error into a PortAudioCpp PaException. - ////// - PaException::PaException(PaError error) : error_(error) - { - } + ////// + /// Wraps a PortAudio error into a PortAudioCpp PaException. + ////// + PaException::PaException(PaError error) : error_(error) + { + } - // ----------------------------------------------------------------------------------- + // ----------------------------------------------------------------------------------- - ////// - /// Alias for paErrorText(), to have std::exception compliance. - ////// - const char *PaException::what() const throw() - { - return paErrorText(); - } + ////// + /// Alias for paErrorText(), to have std::exception compliance. + ////// + const char *PaException::what() const throw() + { + return paErrorText(); + } - // ----------------------------------------------------------------------------------- + // ----------------------------------------------------------------------------------- - ////// - /// Returns the PortAudio error code (PaError). - ////// - PaError PaException::paError() const - { - return error_; - } + ////// + /// Returns the PortAudio error code (PaError). + ////// + PaError PaException::paError() const + { + return error_; + } - ////// - /// Returns the error as a (zero-terminated) text string. - ////// - const char *PaException::paErrorText() const - { - return Pa_GetErrorText(error_); - } + ////// + /// Returns the error as a (zero-terminated) text string. + ////// + const char *PaException::paErrorText() const + { + return Pa_GetErrorText(error_); + } - ////// - /// Returns true is the error is a HostApi error. - ////// - bool PaException::isHostApiError() const - { - return (error_ == paUnanticipatedHostError); - } + ////// + /// Returns true is the error is a HostApi error. + ////// + bool PaException::isHostApiError() const + { + return (error_ == paUnanticipatedHostError); + } - ////// - /// Returns the last HostApi error (which is the current one if - /// isHostApiError() returns true) as an error code. - ////// - long PaException::lastHostApiError() const - { - return Pa_GetLastHostErrorInfo()->errorCode; - } + ////// + /// Returns the last HostApi error (which is the current one if + /// isHostApiError() returns true) as an error code. + ////// + long PaException::lastHostApiError() const + { + return Pa_GetLastHostErrorInfo()->errorCode; + } - ////// - /// Returns the last HostApi error (which is the current one if - /// isHostApiError() returns true) as a (zero-terminated) text - /// string, if it's available. - ////// - const char *PaException::lastHostApiErrorText() const - { - return Pa_GetLastHostErrorInfo()->errorText; - } + ////// + /// Returns the last HostApi error (which is the current one if + /// isHostApiError() returns true) as a (zero-terminated) text + /// string, if it's available. + ////// + const char *PaException::lastHostApiErrorText() const + { + return Pa_GetLastHostErrorInfo()->errorText; + } - // ----------------------------------------------------------------------------------- + // ----------------------------------------------------------------------------------- - bool PaException::operator==(const PaException &rhs) const - { - return (error_ == rhs.error_); - } + bool PaException::operator==(const PaException &rhs) const + { + return (error_ == rhs.error_); + } - bool PaException::operator!=(const PaException &rhs) const - { - return !(*this == rhs); - } + bool PaException::operator!=(const PaException &rhs) const + { + return !(*this == rhs); + } - // ----------------------------------------------------------------------------------- - // PaCppException: - // ----------------------------------------------------------------------------------- - - PaCppException::PaCppException(ExceptionSpecifier specifier) : specifier_(specifier) - { - } + // ----------------------------------------------------------------------------------- + // PaCppException: + // ----------------------------------------------------------------------------------- - const char *PaCppException::what() const throw() - { - switch (specifier_) - { - case UNABLE_TO_ADAPT_DEVICE: - { - return "Unable to adapt the given device to the specified host api specific device extension"; - } - } + PaCppException::PaCppException(ExceptionSpecifier specifier) : specifier_(specifier) + { + } - return "Unknown exception"; - } + const char *PaCppException::what() const throw() + { + switch (specifier_) + { + case UNABLE_TO_ADAPT_DEVICE: + { + return "Unable to adapt the given device to the specified host api specific device extension"; + } + } - PaCppException::ExceptionSpecifier PaCppException::specifier() const - { - return specifier_; - } + return "Unknown exception"; + } - bool PaCppException::operator==(const PaCppException &rhs) const - { - return (specifier_ == rhs.specifier_); - } + PaCppException::ExceptionSpecifier PaCppException::specifier() const + { + return specifier_; + } - bool PaCppException::operator!=(const PaCppException &rhs) const - { - return !(*this == rhs); - } + bool PaCppException::operator==(const PaCppException &rhs) const + { + return (specifier_ == rhs.specifier_); + } - // ----------------------------------------------------------------------------------- + bool PaCppException::operator!=(const PaCppException &rhs) const + { + return !(*this == rhs); + } + + // ----------------------------------------------------------------------------------- } // namespace portaudio - - diff --git a/bindings/cpp/source/portaudiocpp/HostApi.cxx b/bindings/cpp/source/portaudiocpp/HostApi.cxx index 6a09670..ecc2353 100644 --- a/bindings/cpp/source/portaudiocpp/HostApi.cxx +++ b/bindings/cpp/source/portaudiocpp/HostApi.cxx @@ -8,114 +8,114 @@ namespace portaudio { - // ----------------------------------------------------------------------------------- + // ----------------------------------------------------------------------------------- - HostApi::HostApi(PaHostApiIndex index) : devices_(NULL) - { - try - { - info_ = Pa_GetHostApiInfo(index); + HostApi::HostApi(PaHostApiIndex index) : devices_(NULL) + { + try + { + info_ = Pa_GetHostApiInfo(index); - // Create and populate devices array: - int numDevices = deviceCount(); + // Create and populate devices array: + int numDevices = deviceCount(); - devices_ = new Device*[numDevices]; + devices_ = new Device*[numDevices]; - for (int i = 0; i < numDevices; ++i) - { - PaDeviceIndex deviceIndex = Pa_HostApiDeviceIndexToDeviceIndex(index, i); + for (int i = 0; i < numDevices; ++i) + { + PaDeviceIndex deviceIndex = Pa_HostApiDeviceIndexToDeviceIndex(index, i); - if (deviceIndex < 0) - { - throw PaException(deviceIndex); - } + if (deviceIndex < 0) + { + throw PaException(deviceIndex); + } - devices_[i] = &System::instance().deviceByIndex(deviceIndex); - } - } - catch (const std::exception &e) - { - // Delete any (partially) constructed objects (deconstructor isn't called): - delete[] devices_; // devices_ is either NULL or valid + devices_[i] = &System::instance().deviceByIndex(deviceIndex); + } + } + catch (const std::exception &e) + { + // Delete any (partially) constructed objects (deconstructor isn't called): + delete[] devices_; // devices_ is either NULL or valid - // Re-throw exception: - throw e; - } - } + // Re-throw exception: + throw e; + } + } - HostApi::~HostApi() - { - // Destroy devices array: - delete[] devices_; - } + HostApi::~HostApi() + { + // Destroy devices array: + delete[] devices_; + } - // ----------------------------------------------------------------------------------- + // ----------------------------------------------------------------------------------- - PaHostApiTypeId HostApi::typeId() const - { - return info_->type; - } + PaHostApiTypeId HostApi::typeId() const + { + return info_->type; + } - PaHostApiIndex HostApi::index() const - { - PaHostApiIndex index = Pa_HostApiTypeIdToHostApiIndex(typeId()); + PaHostApiIndex HostApi::index() const + { + PaHostApiIndex index = Pa_HostApiTypeIdToHostApiIndex(typeId()); - if (index < 0) - throw PaException(index); + if (index < 0) + throw PaException(index); - return index; - } + return index; + } - const char *HostApi::name() const - { - return info_->name; - } + const char *HostApi::name() const + { + return info_->name; + } - int HostApi::deviceCount() const - { - return info_->deviceCount; - } + int HostApi::deviceCount() const + { + return info_->deviceCount; + } - // ----------------------------------------------------------------------------------- + // ----------------------------------------------------------------------------------- - HostApi::DeviceIterator HostApi::devicesBegin() - { - DeviceIterator tmp; - tmp.ptr_ = &devices_[0]; // begin (first element) - return tmp; - } + HostApi::DeviceIterator HostApi::devicesBegin() + { + DeviceIterator tmp; + tmp.ptr_ = &devices_[0]; // begin (first element) + return tmp; + } - HostApi::DeviceIterator HostApi::devicesEnd() - { - DeviceIterator tmp; - tmp.ptr_ = &devices_[deviceCount()]; // end (one past last element) - return tmp; - } + HostApi::DeviceIterator HostApi::devicesEnd() + { + DeviceIterator tmp; + tmp.ptr_ = &devices_[deviceCount()]; // end (one past last element) + return tmp; + } - // ----------------------------------------------------------------------------------- + // ----------------------------------------------------------------------------------- - Device &HostApi::defaultInputDevice() const - { - return System::instance().deviceByIndex(info_->defaultInputDevice); - } + Device &HostApi::defaultInputDevice() const + { + return System::instance().deviceByIndex(info_->defaultInputDevice); + } - Device &HostApi::defaultOutputDevice() const - { - return System::instance().deviceByIndex(info_->defaultOutputDevice); - } + Device &HostApi::defaultOutputDevice() const + { + return System::instance().deviceByIndex(info_->defaultOutputDevice); + } - // ----------------------------------------------------------------------------------- + // ----------------------------------------------------------------------------------- - bool HostApi::operator==(const HostApi &rhs) const - { - return (typeId() == rhs.typeId()); - } + bool HostApi::operator==(const HostApi &rhs) const + { + return (typeId() == rhs.typeId()); + } - bool HostApi::operator!=(const HostApi &rhs) const - { - return !(*this == rhs); - } + bool HostApi::operator!=(const HostApi &rhs) const + { + return !(*this == rhs); + } - // ----------------------------------------------------------------------------------- + // ----------------------------------------------------------------------------------- } // namespace portaudio diff --git a/bindings/cpp/source/portaudiocpp/InterfaceCallbackStream.cxx b/bindings/cpp/source/portaudiocpp/InterfaceCallbackStream.cxx index 5433fa3..fa761aa 100644 --- a/bindings/cpp/source/portaudiocpp/InterfaceCallbackStream.cxx +++ b/bindings/cpp/source/portaudiocpp/InterfaceCallbackStream.cxx @@ -7,39 +7,39 @@ namespace portaudio { - // ---------------------------------------------------------------------------------== + // ---------------------------------------------------------------------------------== - InterfaceCallbackStream::InterfaceCallbackStream() - { - } + InterfaceCallbackStream::InterfaceCallbackStream() + { + } - InterfaceCallbackStream::InterfaceCallbackStream(const StreamParameters ¶meters, CallbackInterface &instance) - { - open(parameters, instance); - } + InterfaceCallbackStream::InterfaceCallbackStream(const StreamParameters ¶meters, CallbackInterface &instance) + { + open(parameters, instance); + } - InterfaceCallbackStream::~InterfaceCallbackStream() - { - try - { - close(); - } - catch (...) - { - // ignore all errors - } - } + InterfaceCallbackStream::~InterfaceCallbackStream() + { + try + { + close(); + } + catch (...) + { + // ignore all errors + } + } - // ---------------------------------------------------------------------------------== + // ---------------------------------------------------------------------------------== - void InterfaceCallbackStream::open(const StreamParameters ¶meters, CallbackInterface &instance) - { - PaError err = Pa_OpenStream(&stream_, parameters.inputParameters().paStreamParameters(), parameters.outputParameters().paStreamParameters(), - parameters.sampleRate(), parameters.framesPerBuffer(), parameters.flags(), &impl::callbackInterfaceToPaCallbackAdapter, static_cast(&instance)); + void InterfaceCallbackStream::open(const StreamParameters ¶meters, CallbackInterface &instance) + { + PaError err = Pa_OpenStream(&stream_, parameters.inputParameters().paStreamParameters(), parameters.outputParameters().paStreamParameters(), + parameters.sampleRate(), parameters.framesPerBuffer(), parameters.flags(), &impl::callbackInterfaceToPaCallbackAdapter, static_cast(&instance)); - if (err != paNoError) - { - throw PaException(err); - } - } + if (err != paNoError) + { + throw PaException(err); + } + } } diff --git a/bindings/cpp/source/portaudiocpp/MemFunCallbackStream.cxx b/bindings/cpp/source/portaudiocpp/MemFunCallbackStream.cxx index 5141de2..4f95564 100644 --- a/bindings/cpp/source/portaudiocpp/MemFunCallbackStream.cxx +++ b/bindings/cpp/source/portaudiocpp/MemFunCallbackStream.cxx @@ -1,4 +1,3 @@ #include "portaudiocpp/MemFunCallbackStream.hxx" // (... template class ...) - diff --git a/bindings/cpp/source/portaudiocpp/Stream.cxx b/bindings/cpp/source/portaudiocpp/Stream.cxx index ba16e03..c16a13c 100644 --- a/bindings/cpp/source/portaudiocpp/Stream.cxx +++ b/bindings/cpp/source/portaudiocpp/Stream.cxx @@ -8,188 +8,188 @@ namespace portaudio { - // ----------------------------------------------------------------------------------- + // ----------------------------------------------------------------------------------- - Stream::Stream() : stream_(NULL) - { - } + Stream::Stream() : stream_(NULL) + { + } - Stream::~Stream() - { - // (can't call close here, - // the derived class should atleast call - // close() in it's deconstructor) - } + Stream::~Stream() + { + // (can't call close here, + // the derived class should atleast call + // close() in it's deconstructor) + } - // ----------------------------------------------------------------------------------- + // ----------------------------------------------------------------------------------- - ////// - /// Closes the Stream if it's open, else does nothing. - ////// - void Stream::close() - { - if (isOpen() && System::exists()) - { - PaError err = Pa_CloseStream(stream_); - stream_ = NULL; + ////// + /// Closes the Stream if it's open, else does nothing. + ////// + void Stream::close() + { + if (isOpen() && System::exists()) + { + PaError err = Pa_CloseStream(stream_); + stream_ = NULL; - if (err != paNoError) - throw PaException(err); - } - } + if (err != paNoError) + throw PaException(err); + } + } - ////// - /// Returns true if the Stream is open. - ////// - bool Stream::isOpen() const - { - return (stream_ != NULL); - } + ////// + /// Returns true if the Stream is open. + ////// + bool Stream::isOpen() const + { + return (stream_ != NULL); + } - // ----------------------------------------------------------------------------------- + // ----------------------------------------------------------------------------------- - void Stream::setStreamFinishedCallback(PaStreamFinishedCallback *callback) - { - PaError err = Pa_SetStreamFinishedCallback(stream_, callback); + void Stream::setStreamFinishedCallback(PaStreamFinishedCallback *callback) + { + PaError err = Pa_SetStreamFinishedCallback(stream_, callback); - if (err != paNoError) - throw PaException(err); - } + if (err != paNoError) + throw PaException(err); + } - // ----------------------------------------------------------------------------------- + // ----------------------------------------------------------------------------------- - void Stream::start() - { - PaError err = Pa_StartStream(stream_); + void Stream::start() + { + PaError err = Pa_StartStream(stream_); - if (err != paNoError) - throw PaException(err); - } + if (err != paNoError) + throw PaException(err); + } - void Stream::stop() - { - PaError err = Pa_StopStream(stream_); + void Stream::stop() + { + PaError err = Pa_StopStream(stream_); - if (err != paNoError) - throw PaException(err); - } + if (err != paNoError) + throw PaException(err); + } - void Stream::abort() - { - PaError err = Pa_AbortStream(stream_); + void Stream::abort() + { + PaError err = Pa_AbortStream(stream_); - if (err != paNoError) - throw PaException(err); - } + if (err != paNoError) + throw PaException(err); + } - bool Stream::isStopped() const - { - PaError ret = Pa_IsStreamStopped(stream_); + bool Stream::isStopped() const + { + PaError ret = Pa_IsStreamStopped(stream_); - if (ret < 0) - throw PaException(ret); + if (ret < 0) + throw PaException(ret); - return (ret == 1); - } + return (ret == 1); + } - bool Stream::isActive() const - { - PaError ret = Pa_IsStreamActive(stream_); + bool Stream::isActive() const + { + PaError ret = Pa_IsStreamActive(stream_); - if (ret < 0) - throw PaException(ret); + if (ret < 0) + throw PaException(ret); - return (ret == 1); - } + return (ret == 1); + } - // ----------------------------------------------------------------------------------- + // ----------------------------------------------------------------------------------- - ////// - /// Returns the best known input latency for the Stream. This value may differ from the - /// suggested input latency set in the StreamParameters. Includes all sources of - /// latency known to PortAudio such as internal buffering, and Host API reported latency. - /// Doesn't include any estimates of unknown latency. - ////// - PaTime Stream::inputLatency() const - { - const PaStreamInfo *info = Pa_GetStreamInfo(stream_); - if (info == NULL) - { - throw PaException(paInternalError); - return PaTime(0.0); - } + ////// + /// Returns the best known input latency for the Stream. This value may differ from the + /// suggested input latency set in the StreamParameters. Includes all sources of + /// latency known to PortAudio such as internal buffering, and Host API reported latency. + /// Doesn't include any estimates of unknown latency. + ////// + PaTime Stream::inputLatency() const + { + const PaStreamInfo *info = Pa_GetStreamInfo(stream_); + if (info == NULL) + { + throw PaException(paInternalError); + return PaTime(0.0); + } - return info->inputLatency; - } + return info->inputLatency; + } - ////// - /// Returns the best known output latency for the Stream. This value may differ from the - /// suggested output latency set in the StreamParameters. Includes all sources of - /// latency known to PortAudio such as internal buffering, and Host API reported latency. - /// Doesn't include any estimates of unknown latency. - ////// - PaTime Stream::outputLatency() const - { - const PaStreamInfo *info = Pa_GetStreamInfo(stream_); - if (info == NULL) - { - throw PaException(paInternalError); - return PaTime(0.0); - } + ////// + /// Returns the best known output latency for the Stream. This value may differ from the + /// suggested output latency set in the StreamParameters. Includes all sources of + /// latency known to PortAudio such as internal buffering, and Host API reported latency. + /// Doesn't include any estimates of unknown latency. + ////// + PaTime Stream::outputLatency() const + { + const PaStreamInfo *info = Pa_GetStreamInfo(stream_); + if (info == NULL) + { + throw PaException(paInternalError); + return PaTime(0.0); + } - return info->outputLatency; - } + return info->outputLatency; + } - ////// - /// Returns the sample rate of the Stream. Usually this will be the - /// best known estimate of the used sample rate. For instance when opening a - /// Stream setting 44100.0 Hz in the StreamParameters, the actual sample - /// rate might be something like 44103.2 Hz (due to imperfections in the - /// sound card hardware). - ////// - double Stream::sampleRate() const - { - const PaStreamInfo *info = Pa_GetStreamInfo(stream_); - if (info == NULL) - { - throw PaException(paInternalError); - return 0.0; - } + ////// + /// Returns the sample rate of the Stream. Usually this will be the + /// best known estimate of the used sample rate. For instance when opening a + /// Stream setting 44100.0 Hz in the StreamParameters, the actual sample + /// rate might be something like 44103.2 Hz (due to imperfections in the + /// sound card hardware). + ////// + double Stream::sampleRate() const + { + const PaStreamInfo *info = Pa_GetStreamInfo(stream_); + if (info == NULL) + { + throw PaException(paInternalError); + return 0.0; + } - return info->sampleRate; - } + return info->sampleRate; + } - // ----------------------------------------------------------------------------------- + // ----------------------------------------------------------------------------------- - PaTime Stream::time() const - { - return Pa_GetStreamTime(stream_); - } + PaTime Stream::time() const + { + return Pa_GetStreamTime(stream_); + } - // ----------------------------------------------------------------------------------- + // ----------------------------------------------------------------------------------- - ////// - /// Accessor (const) for PortAudio PaStream pointer, useful for interfacing with - /// PortAudio add-ons such as PortMixer for instance. Normally accessing this - /// pointer should not be needed as PortAudioCpp aims to provide all of PortAudio's - /// functionality. - ////// - const PaStream *Stream::paStream() const - { - return stream_; - } + ////// + /// Accessor (const) for PortAudio PaStream pointer, useful for interfacing with + /// PortAudio add-ons such as PortMixer for instance. Normally accessing this + /// pointer should not be needed as PortAudioCpp aims to provide all of PortAudio's + /// functionality. + ////// + const PaStream *Stream::paStream() const + { + return stream_; + } - ////// - /// Accessor (non-const) for PortAudio PaStream pointer, useful for interfacing with - /// PortAudio add-ons such as PortMixer for instance. Normally accessing this - /// pointer should not be needed as PortAudioCpp aims to provide all of PortAudio's - /// functionality. - ////// - PaStream *Stream::paStream() - { - return stream_; - } + ////// + /// Accessor (non-const) for PortAudio PaStream pointer, useful for interfacing with + /// PortAudio add-ons such as PortMixer for instance. Normally accessing this + /// pointer should not be needed as PortAudioCpp aims to provide all of PortAudio's + /// functionality. + ////// + PaStream *Stream::paStream() + { + return stream_; + } - // ----------------------------------------------------------------------------------- + // ----------------------------------------------------------------------------------- } // namespace portaudio diff --git a/bindings/cpp/source/portaudiocpp/StreamParameters.cxx b/bindings/cpp/source/portaudiocpp/StreamParameters.cxx index 5857710..11de309 100644 --- a/bindings/cpp/source/portaudiocpp/StreamParameters.cxx +++ b/bindings/cpp/source/portaudiocpp/StreamParameters.cxx @@ -6,160 +6,155 @@ namespace portaudio { - // ----------------------------------------------------------------------------------- + // ----------------------------------------------------------------------------------- - ////// - /// Default constructor; does nothing. - ////// - StreamParameters::StreamParameters() - { - } + ////// + /// Default constructor; does nothing. + ////// + StreamParameters::StreamParameters() + { + } - ////// - /// Sets up the all parameters needed to open either a half-duplex or full-duplex Stream. - /// - /// @param inputParameters The parameters for the input direction of the to-be opened - /// Stream or DirectionSpecificStreamParameters::null() for an output-only Stream. - /// @param outputParameters The parameters for the output direction of the to-be opened - /// Stream or DirectionSpecificStreamParameters::null() for an input-only Stream. - /// @param sampleRate The to-be opened Stream's sample rate in Hz. - /// @param framesPerBuffer The number of frames per buffer for a CallbackStream, or - /// the preferred buffer granularity for a BlockingStream. - /// @param flags The flags for the to-be opened Stream; default paNoFlag. - ////// - StreamParameters::StreamParameters(const DirectionSpecificStreamParameters &inputParameters, - const DirectionSpecificStreamParameters &outputParameters, double sampleRate, unsigned long framesPerBuffer, - PaStreamFlags flags) : inputParameters_(inputParameters), outputParameters_(outputParameters), - sampleRate_(sampleRate), framesPerBuffer_(framesPerBuffer), flags_(flags) - { - } + ////// + /// Sets up the all parameters needed to open either a half-duplex or full-duplex Stream. + /// + /// @param inputParameters The parameters for the input direction of the to-be opened + /// Stream or DirectionSpecificStreamParameters::null() for an output-only Stream. + /// @param outputParameters The parameters for the output direction of the to-be opened + /// Stream or DirectionSpecificStreamParameters::null() for an input-only Stream. + /// @param sampleRate The to-be opened Stream's sample rate in Hz. + /// @param framesPerBuffer The number of frames per buffer for a CallbackStream, or + /// the preferred buffer granularity for a BlockingStream. + /// @param flags The flags for the to-be opened Stream; default paNoFlag. + ////// + StreamParameters::StreamParameters(const DirectionSpecificStreamParameters &inputParameters, + const DirectionSpecificStreamParameters &outputParameters, double sampleRate, unsigned long framesPerBuffer, + PaStreamFlags flags) : inputParameters_(inputParameters), outputParameters_(outputParameters), + sampleRate_(sampleRate), framesPerBuffer_(framesPerBuffer), flags_(flags) + { + } - // ----------------------------------------------------------------------------------- + // ----------------------------------------------------------------------------------- - ////// - /// Sets the requested sample rate. If this sample rate isn't supported by the hardware, the - /// Stream will fail to open. The real-life sample rate used might differ slightly due to - /// imperfections in the sound card hardware; use Stream::sampleRate() to retrieve the - /// best known estimate for this value. - ////// - void StreamParameters::setSampleRate(double sampleRate) - { - sampleRate_ = sampleRate; - } + ////// + /// Sets the requested sample rate. If this sample rate isn't supported by the hardware, the + /// Stream will fail to open. The real-life sample rate used might differ slightly due to + /// imperfections in the sound card hardware; use Stream::sampleRate() to retrieve the + /// best known estimate for this value. + ////// + void StreamParameters::setSampleRate(double sampleRate) + { + sampleRate_ = sampleRate; + } - ////// - /// Either the number of frames per buffer for a CallbackStream, or - /// the preferred buffer granularity for a BlockingStream. See PortAudio - /// documentation. - ////// - void StreamParameters::setFramesPerBuffer(unsigned long framesPerBuffer) - { - framesPerBuffer_ = framesPerBuffer; - } + ////// + /// Either the number of frames per buffer for a CallbackStream, or + /// the preferred buffer granularity for a BlockingStream. See PortAudio + /// documentation. + ////// + void StreamParameters::setFramesPerBuffer(unsigned long framesPerBuffer) + { + framesPerBuffer_ = framesPerBuffer; + } - ////// - /// Sets the specified flag or does nothing when the flag is already set. Doesn't - /// `unset' any previously existing flags (use clearFlags() for that). - ////// - void StreamParameters::setFlag(PaStreamFlags flag) - { - flags_ |= flag; - } + ////// + /// Sets the specified flag or does nothing when the flag is already set. Doesn't + /// `unset' any previously existing flags (use clearFlags() for that). + ////// + void StreamParameters::setFlag(PaStreamFlags flag) + { + flags_ |= flag; + } - ////// - /// Unsets the specified flag or does nothing if the flag isn't set. Doesn't affect - /// any other flags. - ////// - void StreamParameters::unsetFlag(PaStreamFlags flag) - { - flags_ &= ~flag; - } + ////// + /// Unsets the specified flag or does nothing if the flag isn't set. Doesn't affect + /// any other flags. + ////// + void StreamParameters::unsetFlag(PaStreamFlags flag) + { + flags_ &= ~flag; + } - ////// - /// Clears or `unsets' all set flags. - ////// - void StreamParameters::clearFlags() - { - flags_ = paNoFlag; - } + ////// + /// Clears or `unsets' all set flags. + ////// + void StreamParameters::clearFlags() + { + flags_ = paNoFlag; + } - // ----------------------------------------------------------------------------------- + // ----------------------------------------------------------------------------------- - void StreamParameters::setInputParameters(const DirectionSpecificStreamParameters ¶meters) - { - inputParameters_ = parameters; - } + void StreamParameters::setInputParameters(const DirectionSpecificStreamParameters ¶meters) + { + inputParameters_ = parameters; + } - void StreamParameters::setOutputParameters(const DirectionSpecificStreamParameters ¶meters) - { - outputParameters_ = parameters; - } + void StreamParameters::setOutputParameters(const DirectionSpecificStreamParameters ¶meters) + { + outputParameters_ = parameters; + } - // ----------------------------------------------------------------------------------- + // ----------------------------------------------------------------------------------- - bool StreamParameters::isSupported() const - { - return (Pa_IsFormatSupported(inputParameters_.paStreamParameters(), - outputParameters_.paStreamParameters(), sampleRate_) == paFormatIsSupported); - } + bool StreamParameters::isSupported() const + { + return (Pa_IsFormatSupported(inputParameters_.paStreamParameters(), + outputParameters_.paStreamParameters(), sampleRate_) == paFormatIsSupported); + } - // ----------------------------------------------------------------------------------- + // ----------------------------------------------------------------------------------- - double StreamParameters::sampleRate() const - { - return sampleRate_; - } + double StreamParameters::sampleRate() const + { + return sampleRate_; + } - unsigned long StreamParameters::framesPerBuffer() const - { - return framesPerBuffer_; - } + unsigned long StreamParameters::framesPerBuffer() const + { + return framesPerBuffer_; + } - ////// - /// Returns all currently set flags as a binary combined - /// integer value (PaStreamFlags). Use isFlagSet() to - /// avoid dealing with the bitmasks. - ////// - PaStreamFlags StreamParameters::flags() const - { - return flags_; - } + ////// + /// Returns all currently set flags as a binary combined + /// integer value (PaStreamFlags). Use isFlagSet() to + /// avoid dealing with the bitmasks. + ////// + PaStreamFlags StreamParameters::flags() const + { + return flags_; + } - ////// - /// Returns true if the specified flag is currently set - /// or false if it isn't. - ////// - bool StreamParameters::isFlagSet(PaStreamFlags flag) const - { - return ((flags_ & flag) != 0); - } + ////// + /// Returns true if the specified flag is currently set + /// or false if it isn't. + ////// + bool StreamParameters::isFlagSet(PaStreamFlags flag) const + { + return ((flags_ & flag) != 0); + } - // ----------------------------------------------------------------------------------- + // ----------------------------------------------------------------------------------- - DirectionSpecificStreamParameters &StreamParameters::inputParameters() - { - return inputParameters_; - } + DirectionSpecificStreamParameters &StreamParameters::inputParameters() + { + return inputParameters_; + } - const DirectionSpecificStreamParameters &StreamParameters::inputParameters() const - { - return inputParameters_; - } + const DirectionSpecificStreamParameters &StreamParameters::inputParameters() const + { + return inputParameters_; + } - DirectionSpecificStreamParameters &StreamParameters::outputParameters() - { - return outputParameters_; - } + DirectionSpecificStreamParameters &StreamParameters::outputParameters() + { + return outputParameters_; + } - const DirectionSpecificStreamParameters &StreamParameters::outputParameters() const - { - return outputParameters_; - } + const DirectionSpecificStreamParameters &StreamParameters::outputParameters() const + { + return outputParameters_; + } - // ----------------------------------------------------------------------------------- + // ----------------------------------------------------------------------------------- } // namespace portaudio - - - - - diff --git a/bindings/cpp/source/portaudiocpp/System.cxx b/bindings/cpp/source/portaudiocpp/System.cxx index acb419d..1e03dc8 100644 --- a/bindings/cpp/source/portaudiocpp/System.cxx +++ b/bindings/cpp/source/portaudiocpp/System.cxx @@ -12,297 +12,296 @@ namespace portaudio { - // ----------------------------------------------------------------------------------- - - // Static members: - System *System::instance_ = NULL; - int System::initCount_ = 0; - HostApi **System::hostApis_ = NULL; - Device **System::devices_ = NULL; - Device *System::nullDevice_ = NULL; - - // ----------------------------------------------------------------------------------- - - int System::version() - { - return Pa_GetVersion(); - } - - const char *System::versionText() - { - return Pa_GetVersionText(); - } - - void System::initialize() - { - ++initCount_; - - if (initCount_ == 1) - { - // Create singleton: - assert(instance_ == NULL); - instance_ = new System(); - - // Initialize the PortAudio system: - { - PaError err = Pa_Initialize(); - - if (err != paNoError) - throw PaException(err); - } - - // Create and populate device array: - { - int numDevices = instance().deviceCount(); - - devices_ = new Device*[numDevices]; - - for (int i = 0; i < numDevices; ++i) - devices_[i] = new Device(i); - } - - // Create and populate host api array: - { - int numHostApis = instance().hostApiCount(); - - hostApis_ = new HostApi*[numHostApis]; - - for (int i = 0; i < numHostApis; ++i) - hostApis_[i] = new HostApi(i); - } - - // Create null device: - nullDevice_ = new Device(paNoDevice); - } - } - - void System::terminate() - { - PaError err = paNoError; - - if (initCount_ == 1) - { - // Destroy null device: - delete nullDevice_; - - // Destroy host api array: - { - if (hostApis_ != NULL) - { - int numHostApis = instance().hostApiCount(); - - for (int i = 0; i < numHostApis; ++i) - delete hostApis_[i]; - - delete[] hostApis_; - hostApis_ = NULL; - } - } + // ----------------------------------------------------------------------------------- + + // Static members: + System *System::instance_ = NULL; + int System::initCount_ = 0; + HostApi **System::hostApis_ = NULL; + Device **System::devices_ = NULL; + Device *System::nullDevice_ = NULL; + + // ----------------------------------------------------------------------------------- + + int System::version() + { + return Pa_GetVersion(); + } + + const char *System::versionText() + { + return Pa_GetVersionText(); + } + + void System::initialize() + { + ++initCount_; - // Destroy device array: - { - if (devices_ != NULL) - { - int numDevices = instance().deviceCount(); + if (initCount_ == 1) + { + // Create singleton: + assert(instance_ == NULL); + instance_ = new System(); - for (int i = 0; i < numDevices; ++i) - delete devices_[i]; + // Initialize the PortAudio system: + { + PaError err = Pa_Initialize(); - delete[] devices_; - devices_ = NULL; - } - } + if (err != paNoError) + throw PaException(err); + } - // Terminate the PortAudio system: - assert(instance_ != NULL); - err = Pa_Terminate(); + // Create and populate device array: + { + int numDevices = instance().deviceCount(); - // Destroy singleton: - delete instance_; - instance_ = NULL; - } + devices_ = new Device*[numDevices]; + + for (int i = 0; i < numDevices; ++i) + devices_[i] = new Device(i); + } + + // Create and populate host api array: + { + int numHostApis = instance().hostApiCount(); + + hostApis_ = new HostApi*[numHostApis]; - if (initCount_ > 0) - --initCount_; - - if (err != paNoError) - throw PaException(err); - } - - - System &System::instance() - { - assert(exists()); - - return *instance_; - } - - bool System::exists() - { - return (instance_ != NULL); - } - - // ----------------------------------------------------------------------------------- - - System::HostApiIterator System::hostApisBegin() - { - System::HostApiIterator tmp; - tmp.ptr_ = &hostApis_[0]; // begin (first element) - return tmp; - } - - System::HostApiIterator System::hostApisEnd() - { - int count = hostApiCount(); - - System::HostApiIterator tmp; - tmp.ptr_ = &hostApis_[count]; // end (one past last element) - return tmp; - } - - HostApi &System::defaultHostApi() - { - PaHostApiIndex defaultHostApi = Pa_GetDefaultHostApi(); - - if (defaultHostApi < 0) - throw PaException(defaultHostApi); - - return *hostApis_[defaultHostApi]; - } - - HostApi &System::hostApiByTypeId(PaHostApiTypeId type) - { - PaHostApiIndex index = Pa_HostApiTypeIdToHostApiIndex(type); - - if (index < 0) - throw PaException(index); - - return *hostApis_[index]; - } - - HostApi &System::hostApiByIndex(PaHostApiIndex index) - { - if (index < 0 || index >= hostApiCount()) - throw PaException(paInternalError); - - return *hostApis_[index]; - } - - int System::hostApiCount() - { - PaHostApiIndex count = Pa_GetHostApiCount(); - - if (count < 0) - throw PaException(count); - - return count; - } - - // ----------------------------------------------------------------------------------- - - System::DeviceIterator System::devicesBegin() - { - DeviceIterator tmp; - tmp.ptr_ = &devices_[0]; - - return tmp; - } - - System::DeviceIterator System::devicesEnd() - { - int count = deviceCount(); - - DeviceIterator tmp; - tmp.ptr_ = &devices_[count]; - - return tmp; - } - - ////// - /// Returns the System's default input Device, or the null Device if none - /// was available. - ////// - Device &System::defaultInputDevice() - { - PaDeviceIndex index = Pa_GetDefaultInputDevice(); - return deviceByIndex(index); - } - - ////// - /// Returns the System's default output Device, or the null Device if none - /// was available. - ////// - Device &System::defaultOutputDevice() - { - PaDeviceIndex index = Pa_GetDefaultOutputDevice(); - return deviceByIndex(index); - } - - ////// - /// Returns the Device for the given index. - /// Will throw a paInternalError equivalent PaException if the given index - /// is out of range. - ////// - Device &System::deviceByIndex(PaDeviceIndex index) - { - if (index < -1 || index >= deviceCount()) - { - throw PaException(paInternalError); - } - - if (index == -1) - return System::instance().nullDevice(); - - return *devices_[index]; - } - - int System::deviceCount() - { - PaDeviceIndex count = Pa_GetDeviceCount(); - - if (count < 0) - throw PaException(count); - - return count; - } - - Device &System::nullDevice() - { - return *nullDevice_; - } - - // ----------------------------------------------------------------------------------- - - void System::sleep(long msec) - { - Pa_Sleep(msec); - } - - int System::sizeOfSample(PaSampleFormat format) - { - PaError err = Pa_GetSampleSize(format); - if (err < 0) - { - throw PaException(err); - return 0; - } - - return err; - } - - // ----------------------------------------------------------------------------------- - - System::System() - { - // (left blank intentionally) - } - - System::~System() - { - // (left blank intentionally) - } - - // ----------------------------------------------------------------------------------- + for (int i = 0; i < numHostApis; ++i) + hostApis_[i] = new HostApi(i); + } + + // Create null device: + nullDevice_ = new Device(paNoDevice); + } + } + + void System::terminate() + { + PaError err = paNoError; + + if (initCount_ == 1) + { + // Destroy null device: + delete nullDevice_; + + // Destroy host api array: + { + if (hostApis_ != NULL) + { + int numHostApis = instance().hostApiCount(); + + for (int i = 0; i < numHostApis; ++i) + delete hostApis_[i]; + + delete[] hostApis_; + hostApis_ = NULL; + } + } + + // Destroy device array: + { + if (devices_ != NULL) + { + int numDevices = instance().deviceCount(); + + for (int i = 0; i < numDevices; ++i) + delete devices_[i]; + + delete[] devices_; + devices_ = NULL; + } + } + + // Terminate the PortAudio system: + assert(instance_ != NULL); + err = Pa_Terminate(); + + // Destroy singleton: + delete instance_; + instance_ = NULL; + } + + if (initCount_ > 0) + --initCount_; + + if (err != paNoError) + throw PaException(err); + } + + + System &System::instance() + { + assert(exists()); + + return *instance_; + } + + bool System::exists() + { + return (instance_ != NULL); + } + + // ----------------------------------------------------------------------------------- + + System::HostApiIterator System::hostApisBegin() + { + System::HostApiIterator tmp; + tmp.ptr_ = &hostApis_[0]; // begin (first element) + return tmp; + } + + System::HostApiIterator System::hostApisEnd() + { + int count = hostApiCount(); + + System::HostApiIterator tmp; + tmp.ptr_ = &hostApis_[count]; // end (one past last element) + return tmp; + } + + HostApi &System::defaultHostApi() + { + PaHostApiIndex defaultHostApi = Pa_GetDefaultHostApi(); + + if (defaultHostApi < 0) + throw PaException(defaultHostApi); + + return *hostApis_[defaultHostApi]; + } + + HostApi &System::hostApiByTypeId(PaHostApiTypeId type) + { + PaHostApiIndex index = Pa_HostApiTypeIdToHostApiIndex(type); + + if (index < 0) + throw PaException(index); + + return *hostApis_[index]; + } + + HostApi &System::hostApiByIndex(PaHostApiIndex index) + { + if (index < 0 || index >= hostApiCount()) + throw PaException(paInternalError); + + return *hostApis_[index]; + } + + int System::hostApiCount() + { + PaHostApiIndex count = Pa_GetHostApiCount(); + + if (count < 0) + throw PaException(count); + + return count; + } + + // ----------------------------------------------------------------------------------- + + System::DeviceIterator System::devicesBegin() + { + DeviceIterator tmp; + tmp.ptr_ = &devices_[0]; + + return tmp; + } + + System::DeviceIterator System::devicesEnd() + { + int count = deviceCount(); + + DeviceIterator tmp; + tmp.ptr_ = &devices_[count]; + + return tmp; + } + + ////// + /// Returns the System's default input Device, or the null Device if none + /// was available. + ////// + Device &System::defaultInputDevice() + { + PaDeviceIndex index = Pa_GetDefaultInputDevice(); + return deviceByIndex(index); + } + + ////// + /// Returns the System's default output Device, or the null Device if none + /// was available. + ////// + Device &System::defaultOutputDevice() + { + PaDeviceIndex index = Pa_GetDefaultOutputDevice(); + return deviceByIndex(index); + } + + ////// + /// Returns the Device for the given index. + /// Will throw a paInternalError equivalent PaException if the given index + /// is out of range. + ////// + Device &System::deviceByIndex(PaDeviceIndex index) + { + if (index < -1 || index >= deviceCount()) + { + throw PaException(paInternalError); + } + + if (index == -1) + return System::instance().nullDevice(); + + return *devices_[index]; + } + + int System::deviceCount() + { + PaDeviceIndex count = Pa_GetDeviceCount(); + + if (count < 0) + throw PaException(count); + + return count; + } + + Device &System::nullDevice() + { + return *nullDevice_; + } + + // ----------------------------------------------------------------------------------- + + void System::sleep(long msec) + { + Pa_Sleep(msec); + } + + int System::sizeOfSample(PaSampleFormat format) + { + PaError err = Pa_GetSampleSize(format); + if (err < 0) + { + throw PaException(err); + return 0; + } + + return err; + } + + // ----------------------------------------------------------------------------------- + + System::System() + { + // (left blank intentionally) + } + + System::~System() + { + // (left blank intentionally) + } + + // ----------------------------------------------------------------------------------- } // namespace portaudio - diff --git a/bindings/cpp/source/portaudiocpp/SystemDeviceIterator.cxx b/bindings/cpp/source/portaudiocpp/SystemDeviceIterator.cxx index f94cf10..72dddbc 100644 --- a/bindings/cpp/source/portaudiocpp/SystemDeviceIterator.cxx +++ b/bindings/cpp/source/portaudiocpp/SystemDeviceIterator.cxx @@ -2,59 +2,57 @@ namespace portaudio { - // ----------------------------------------------------------------------------------- + // ----------------------------------------------------------------------------------- - Device &System::DeviceIterator::operator*() const - { - return **ptr_; - } + Device &System::DeviceIterator::operator*() const + { + return **ptr_; + } - Device *System::DeviceIterator::operator->() const - { - return &**this; - } + Device *System::DeviceIterator::operator->() const + { + return &**this; + } - // ----------------------------------------------------------------------------------- + // ----------------------------------------------------------------------------------- - System::DeviceIterator &System::DeviceIterator::operator++() - { - ++ptr_; - return *this; - } + System::DeviceIterator &System::DeviceIterator::operator++() + { + ++ptr_; + return *this; + } - System::DeviceIterator System::DeviceIterator::operator++(int) - { - System::DeviceIterator prev = *this; - ++*this; - return prev; - } + System::DeviceIterator System::DeviceIterator::operator++(int) + { + System::DeviceIterator prev = *this; + ++*this; + return prev; + } - System::DeviceIterator &System::DeviceIterator::operator--() - { - --ptr_; - return *this; - } + System::DeviceIterator &System::DeviceIterator::operator--() + { + --ptr_; + return *this; + } - System::DeviceIterator System::DeviceIterator::operator--(int) - { - System::DeviceIterator prev = *this; - --*this; - return prev; - } + System::DeviceIterator System::DeviceIterator::operator--(int) + { + System::DeviceIterator prev = *this; + --*this; + return prev; + } - // ----------------------------------------------------------------------------------- + // ----------------------------------------------------------------------------------- - bool System::DeviceIterator::operator==(const System::DeviceIterator &rhs) const - { - return (ptr_ == rhs.ptr_); - } + bool System::DeviceIterator::operator==(const System::DeviceIterator &rhs) const + { + return (ptr_ == rhs.ptr_); + } - bool System::DeviceIterator::operator!=(const System::DeviceIterator &rhs) const - { - return !(*this == rhs); - } + bool System::DeviceIterator::operator!=(const System::DeviceIterator &rhs) const + { + return !(*this == rhs); + } - // ----------------------------------------------------------------------------------- + // ----------------------------------------------------------------------------------- } // namespace portaudio - - diff --git a/bindings/cpp/source/portaudiocpp/SystemHostApiIterator.cxx b/bindings/cpp/source/portaudiocpp/SystemHostApiIterator.cxx index 03f2d6e..bca25fc 100644 --- a/bindings/cpp/source/portaudiocpp/SystemHostApiIterator.cxx +++ b/bindings/cpp/source/portaudiocpp/SystemHostApiIterator.cxx @@ -2,58 +2,57 @@ namespace portaudio { - // ----------------------------------------------------------------------------------- + // ----------------------------------------------------------------------------------- - HostApi &System::HostApiIterator::operator*() const - { - return **ptr_; - } + HostApi &System::HostApiIterator::operator*() const + { + return **ptr_; + } - HostApi *System::HostApiIterator::operator->() const - { - return &**this; - } + HostApi *System::HostApiIterator::operator->() const + { + return &**this; + } - // ----------------------------------------------------------------------------------- + // ----------------------------------------------------------------------------------- - System::HostApiIterator &System::HostApiIterator::operator++() - { - ++ptr_; - return *this; - } + System::HostApiIterator &System::HostApiIterator::operator++() + { + ++ptr_; + return *this; + } - System::HostApiIterator System::HostApiIterator::operator++(int) - { - System::HostApiIterator prev = *this; - ++*this; - return prev; - } + System::HostApiIterator System::HostApiIterator::operator++(int) + { + System::HostApiIterator prev = *this; + ++*this; + return prev; + } - System::HostApiIterator &System::HostApiIterator::operator--() - { - --ptr_; - return *this; - } + System::HostApiIterator &System::HostApiIterator::operator--() + { + --ptr_; + return *this; + } - System::HostApiIterator System::HostApiIterator::operator--(int) - { - System::HostApiIterator prev = *this; - --*this; - return prev; - } + System::HostApiIterator System::HostApiIterator::operator--(int) + { + System::HostApiIterator prev = *this; + --*this; + return prev; + } - // ----------------------------------------------------------------------------------- + // ----------------------------------------------------------------------------------- - bool System::HostApiIterator::operator==(const System::HostApiIterator &rhs) const - { - return (ptr_ == rhs.ptr_); - } + bool System::HostApiIterator::operator==(const System::HostApiIterator &rhs) const + { + return (ptr_ == rhs.ptr_); + } - bool System::HostApiIterator::operator!=(const System::HostApiIterator &rhs) const - { - return !(*this == rhs); - } + bool System::HostApiIterator::operator!=(const System::HostApiIterator &rhs) const + { + return !(*this == rhs); + } - // ----------------------------------------------------------------------------------- + // ----------------------------------------------------------------------------------- } // namespace portaudio - diff --git a/bindings/java/c/src/com_portaudio_BlockingStream.c b/bindings/java/c/src/com_portaudio_BlockingStream.c index 64d8213..f504fc3 100644 --- a/bindings/java/c/src/com_portaudio_BlockingStream.c +++ b/bindings/java/c/src/com_portaudio_BlockingStream.c @@ -26,13 +26,13 @@ */ /* - * The text above constitutes the entire PortAudio license; however, + * The text above constitutes the entire PortAudio license; however, * the PortAudio community also makes the following non-binding requests: * * 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. It is also - * requested that these non-binding requests be included along with the + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the * license above. */ @@ -55,9 +55,9 @@ JNIEXPORT jint JNICALL Java_com_portaudio_BlockingStream_getReadAvailable (JNIEnv *env, jobject blockingStream) { - PaStream *stream =jpa_GetStreamPointer( env, blockingStream ); - if( stream == NULL ) return 0; - return Pa_GetStreamReadAvailable( stream ); + PaStream *stream =jpa_GetStreamPointer( env, blockingStream ); + if( stream == NULL ) return 0; + return Pa_GetStreamReadAvailable( stream ); } /* @@ -68,9 +68,9 @@ JNIEXPORT jint JNICALL Java_com_portaudio_BlockingStream_getReadAvailable JNIEXPORT jint JNICALL Java_com_portaudio_BlockingStream_getWriteAvailable (JNIEnv *env, jobject blockingStream) { - PaStream *stream =jpa_GetStreamPointer( env, blockingStream ); - if( stream == NULL ) return 0; - return Pa_GetStreamWriteAvailable( stream ); + PaStream *stream =jpa_GetStreamPointer( env, blockingStream ); + if( stream == NULL ) return 0; + return Pa_GetStreamWriteAvailable( stream ); } @@ -82,33 +82,33 @@ JNIEXPORT jint JNICALL Java_com_portaudio_BlockingStream_getWriteAvailable JNIEXPORT jboolean JNICALL Java_com_portaudio_BlockingStream_writeFloats (JNIEnv *env, jobject blockingStream, jfloatArray buffer, jint numFrames) { - jfloat *carr; - jint err; - PaStream *stream =jpa_GetStreamPointer( env, blockingStream ); - if( buffer == NULL ) - { - (*env)->ThrowNew( env, (*env)->FindClass(env,"java/lang/RuntimeException"), + jfloat *carr; + jint err; + PaStream *stream =jpa_GetStreamPointer( env, blockingStream ); + if( buffer == NULL ) + { + (*env)->ThrowNew( env, (*env)->FindClass(env,"java/lang/RuntimeException"), "null stream buffer"); - return FALSE; - } - carr = (*env)->GetFloatArrayElements(env, buffer, NULL); - if (carr == NULL) - { - (*env)->ThrowNew( env, (*env)->FindClass(env,"java/lang/RuntimeException"), + return FALSE; + } + carr = (*env)->GetFloatArrayElements(env, buffer, NULL); + if (carr == NULL) + { + (*env)->ThrowNew( env, (*env)->FindClass(env,"java/lang/RuntimeException"), "invalid stream buffer"); - return FALSE; - } - err = Pa_WriteStream( stream, carr, numFrames ); - (*env)->ReleaseFloatArrayElements(env, buffer, carr, 0); - if( err == paOutputUnderflowed ) - { - return TRUE; - } - else - { - jpa_CheckError( env, err ); - return FALSE; - } + return FALSE; + } + err = Pa_WriteStream( stream, carr, numFrames ); + (*env)->ReleaseFloatArrayElements(env, buffer, carr, 0); + if( err == paOutputUnderflowed ) + { + return TRUE; + } + else + { + jpa_CheckError( env, err ); + return FALSE; + } } /* @@ -119,33 +119,33 @@ JNIEXPORT jboolean JNICALL Java_com_portaudio_BlockingStream_writeFloats JNIEXPORT jboolean JNICALL Java_com_portaudio_BlockingStream_readFloats (JNIEnv *env, jobject blockingStream, jfloatArray buffer, jint numFrames) { - jfloat *carr; - jint err; - PaStream *stream =jpa_GetStreamPointer( env, blockingStream ); - if( buffer == NULL ) - { - (*env)->ThrowNew( env, (*env)->FindClass(env,"java/lang/RuntimeException"), + jfloat *carr; + jint err; + PaStream *stream =jpa_GetStreamPointer( env, blockingStream ); + if( buffer == NULL ) + { + (*env)->ThrowNew( env, (*env)->FindClass(env,"java/lang/RuntimeException"), "null stream buffer"); - return FALSE; - } - carr = (*env)->GetFloatArrayElements(env, buffer, NULL); - if (carr == NULL) - { - (*env)->ThrowNew( env, (*env)->FindClass(env,"java/lang/RuntimeException"), + return FALSE; + } + carr = (*env)->GetFloatArrayElements(env, buffer, NULL); + if (carr == NULL) + { + (*env)->ThrowNew( env, (*env)->FindClass(env,"java/lang/RuntimeException"), "invalid stream buffer"); - return FALSE; - } - err = Pa_ReadStream( stream, carr, numFrames ); - (*env)->ReleaseFloatArrayElements(env, buffer, carr, 0); - if( err == paInputOverflowed ) - { - return TRUE; - } - else - { - jpa_CheckError( env, err ); - return FALSE; - } + return FALSE; + } + err = Pa_ReadStream( stream, carr, numFrames ); + (*env)->ReleaseFloatArrayElements(env, buffer, carr, 0); + if( err == paInputOverflowed ) + { + return TRUE; + } + else + { + jpa_CheckError( env, err ); + return FALSE; + } } /* @@ -156,33 +156,33 @@ JNIEXPORT jboolean JNICALL Java_com_portaudio_BlockingStream_readFloats JNIEXPORT jboolean JNICALL Java_com_portaudio_BlockingStream_writeShorts (JNIEnv *env, jobject blockingStream, jfloatArray buffer, jint numFrames) { - jshort *carr; - jint err; - PaStream *stream =jpa_GetStreamPointer( env, blockingStream ); - if( buffer == NULL ) - { - (*env)->ThrowNew( env, (*env)->FindClass(env,"java/lang/RuntimeException"), + jshort *carr; + jint err; + PaStream *stream =jpa_GetStreamPointer( env, blockingStream ); + if( buffer == NULL ) + { + (*env)->ThrowNew( env, (*env)->FindClass(env,"java/lang/RuntimeException"), "null stream buffer"); - return FALSE; - } - carr = (*env)->GetShortArrayElements(env, buffer, NULL); - if (carr == NULL) - { - (*env)->ThrowNew( env, (*env)->FindClass(env,"java/lang/RuntimeException"), + return FALSE; + } + carr = (*env)->GetShortArrayElements(env, buffer, NULL); + if (carr == NULL) + { + (*env)->ThrowNew( env, (*env)->FindClass(env,"java/lang/RuntimeException"), "invalid stream buffer"); - return FALSE; - } - err = Pa_WriteStream( stream, carr, numFrames ); - (*env)->ReleaseShortArrayElements(env, buffer, carr, 0); - if( err == paOutputUnderflowed ) - { - return TRUE; - } - else - { - jpa_CheckError( env, err ); - return FALSE; - } + return FALSE; + } + err = Pa_WriteStream( stream, carr, numFrames ); + (*env)->ReleaseShortArrayElements(env, buffer, carr, 0); + if( err == paOutputUnderflowed ) + { + return TRUE; + } + else + { + jpa_CheckError( env, err ); + return FALSE; + } } /* @@ -193,33 +193,33 @@ JNIEXPORT jboolean JNICALL Java_com_portaudio_BlockingStream_writeShorts JNIEXPORT jboolean JNICALL Java_com_portaudio_BlockingStream_readShorts (JNIEnv *env, jobject blockingStream, jfloatArray buffer, jint numFrames) { - jshort *carr; - jint err; - PaStream *stream =jpa_GetStreamPointer( env, blockingStream ); - if( buffer == NULL ) - { - (*env)->ThrowNew( env, (*env)->FindClass(env,"java/lang/RuntimeException"), + jshort *carr; + jint err; + PaStream *stream =jpa_GetStreamPointer( env, blockingStream ); + if( buffer == NULL ) + { + (*env)->ThrowNew( env, (*env)->FindClass(env,"java/lang/RuntimeException"), "null stream buffer"); - return FALSE; - } - carr = (*env)->GetShortArrayElements(env, buffer, NULL); - if (carr == NULL) - { - (*env)->ThrowNew( env, (*env)->FindClass(env,"java/lang/RuntimeException"), + return FALSE; + } + carr = (*env)->GetShortArrayElements(env, buffer, NULL); + if (carr == NULL) + { + (*env)->ThrowNew( env, (*env)->FindClass(env,"java/lang/RuntimeException"), "invalid stream buffer"); - return FALSE; - } - err = Pa_ReadStream( stream, carr, numFrames ); - (*env)->ReleaseShortArrayElements(env, buffer, carr, 0); - if( err == paInputOverflowed ) - { - return TRUE; - } - else - { - jpa_CheckError( env, err ); - return FALSE; - } + return FALSE; + } + err = Pa_ReadStream( stream, carr, numFrames ); + (*env)->ReleaseShortArrayElements(env, buffer, carr, 0); + if( err == paInputOverflowed ) + { + return TRUE; + } + else + { + jpa_CheckError( env, err ); + return FALSE; + } } /* @@ -230,9 +230,9 @@ JNIEXPORT jboolean JNICALL Java_com_portaudio_BlockingStream_readShorts JNIEXPORT void JNICALL Java_com_portaudio_BlockingStream_start (JNIEnv *env, jobject blockingStream ) { - PaStream *stream = jpa_GetStreamPointer( env, blockingStream ); - int err = Pa_StartStream( stream ); - jpa_CheckError( env, err ); + PaStream *stream = jpa_GetStreamPointer( env, blockingStream ); + int err = Pa_StartStream( stream ); + jpa_CheckError( env, err ); } /* @@ -243,9 +243,9 @@ JNIEXPORT void JNICALL Java_com_portaudio_BlockingStream_start JNIEXPORT void JNICALL Java_com_portaudio_BlockingStream_stop (JNIEnv *env, jobject blockingStream ) { - PaStream *stream =jpa_GetStreamPointer( env, blockingStream ); - int err = Pa_StopStream( stream ); - jpa_CheckError( env, err ); + PaStream *stream =jpa_GetStreamPointer( env, blockingStream ); + int err = Pa_StopStream( stream ); + jpa_CheckError( env, err ); } /* * Class: com_portaudio_BlockingStream @@ -255,9 +255,9 @@ JNIEXPORT void JNICALL Java_com_portaudio_BlockingStream_stop JNIEXPORT void JNICALL Java_com_portaudio_BlockingStream_abort (JNIEnv *env, jobject blockingStream ) { - PaStream *stream =jpa_GetStreamPointer( env, blockingStream ); - int err = Pa_AbortStream( stream ); - jpa_CheckError( env, err ); + PaStream *stream =jpa_GetStreamPointer( env, blockingStream ); + int err = Pa_AbortStream( stream ); + jpa_CheckError( env, err ); } /* @@ -268,15 +268,15 @@ JNIEXPORT void JNICALL Java_com_portaudio_BlockingStream_abort JNIEXPORT void JNICALL Java_com_portaudio_BlockingStream_close (JNIEnv *env, jobject blockingStream ) { - jclass cls; - PaStream *stream =jpa_GetStreamPointer( env, blockingStream ); - if( stream != NULL ) - { - int err = Pa_CloseStream( stream ); - jpa_CheckError( env, err ); - cls = (*env)->GetObjectClass(env, blockingStream); - jpa_SetLongField( env, cls, blockingStream, "nativeStream", (jlong) 0 ); - } + jclass cls; + PaStream *stream =jpa_GetStreamPointer( env, blockingStream ); + if( stream != NULL ) + { + int err = Pa_CloseStream( stream ); + jpa_CheckError( env, err ); + cls = (*env)->GetObjectClass(env, blockingStream); + jpa_SetLongField( env, cls, blockingStream, "nativeStream", (jlong) 0 ); + } } /* @@ -287,11 +287,11 @@ JNIEXPORT void JNICALL Java_com_portaudio_BlockingStream_close JNIEXPORT jboolean JNICALL Java_com_portaudio_BlockingStream_isStopped (JNIEnv *env, jobject blockingStream ) { - int err; - PaStream *stream =jpa_GetStreamPointer( env, blockingStream ); - if( stream == NULL ) return 1; - err = Pa_IsStreamStopped( stream ); - return (jpa_CheckError( env, err ) > 0); + int err; + PaStream *stream =jpa_GetStreamPointer( env, blockingStream ); + if( stream == NULL ) return 1; + err = Pa_IsStreamStopped( stream ); + return (jpa_CheckError( env, err ) > 0); } /* * Class: com_portaudio_BlockingStream @@ -301,11 +301,11 @@ JNIEXPORT jboolean JNICALL Java_com_portaudio_BlockingStream_isStopped JNIEXPORT jboolean JNICALL Java_com_portaudio_BlockingStream_isActive (JNIEnv *env, jobject blockingStream ) { - int err; - PaStream *stream =jpa_GetStreamPointer( env, blockingStream ); - if( stream == NULL ) return 0; - err = Pa_IsStreamActive( stream ); - return (jpa_CheckError( env, err ) > 0); + int err; + PaStream *stream =jpa_GetStreamPointer( env, blockingStream ); + if( stream == NULL ) return 0; + err = Pa_IsStreamActive( stream ); + return (jpa_CheckError( env, err ) > 0); } @@ -317,9 +317,9 @@ JNIEXPORT jboolean JNICALL Java_com_portaudio_BlockingStream_isActive JNIEXPORT jdouble JNICALL Java_com_portaudio_BlockingStream_getTime (JNIEnv *env, jobject blockingStream ) { - PaStream *stream =jpa_GetStreamPointer( env, blockingStream ); - if( stream == NULL ) return 0.0; - return Pa_GetStreamTime( stream ); + PaStream *stream =jpa_GetStreamPointer( env, blockingStream ); + if( stream == NULL ) return 0.0; + return Pa_GetStreamTime( stream ); } @@ -331,22 +331,21 @@ JNIEXPORT jdouble JNICALL Java_com_portaudio_BlockingStream_getTime JNIEXPORT void JNICALL Java_com_portaudio_BlockingStream_getInfo (JNIEnv *env, jobject blockingStream, jobject streamInfo) { - - PaStream *stream =jpa_GetStreamPointer( env, blockingStream ); - const PaStreamInfo *info = Pa_GetStreamInfo( stream ); - if( streamInfo == NULL ) - { - jpa_ThrowError( env, "Invalid stream." ); - } - else - { - /* Get a reference to obj's class */ - jclass cls = (*env)->GetObjectClass(env, streamInfo); - - jpa_SetIntField( env, cls, streamInfo, "structVersion", info->structVersion ); - jpa_SetDoubleField( env, cls, streamInfo, "inputLatency", info->inputLatency ); - jpa_SetDoubleField( env, cls, streamInfo, "outputLatency", info->outputLatency ); - jpa_SetDoubleField( env, cls, streamInfo, "sampleRate", info->sampleRate ); - } -} + PaStream *stream =jpa_GetStreamPointer( env, blockingStream ); + const PaStreamInfo *info = Pa_GetStreamInfo( stream ); + if( streamInfo == NULL ) + { + jpa_ThrowError( env, "Invalid stream." ); + } + else + { + /* Get a reference to obj's class */ + jclass cls = (*env)->GetObjectClass(env, streamInfo); + + jpa_SetIntField( env, cls, streamInfo, "structVersion", info->structVersion ); + jpa_SetDoubleField( env, cls, streamInfo, "inputLatency", info->inputLatency ); + jpa_SetDoubleField( env, cls, streamInfo, "outputLatency", info->outputLatency ); + jpa_SetDoubleField( env, cls, streamInfo, "sampleRate", info->sampleRate ); + } +} diff --git a/bindings/java/c/src/com_portaudio_PortAudio.c b/bindings/java/c/src/com_portaudio_PortAudio.c index 77c42eb..cf2f356 100644 --- a/bindings/java/c/src/com_portaudio_PortAudio.c +++ b/bindings/java/c/src/com_portaudio_PortAudio.c @@ -26,13 +26,13 @@ */ /* - * The text above constitutes the entire PortAudio license; however, + * The text above constitutes the entire PortAudio license; however, * the PortAudio community also makes the following non-binding requests: * * 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. It is also - * requested that these non-binding requests be included along with the + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the * license above. */ @@ -48,7 +48,7 @@ JNIEXPORT jint JNICALL Java_com_portaudio_PortAudio_getVersion (JNIEnv *env, jclass clazz) { - return Pa_GetVersion(); + return Pa_GetVersion(); } /* @@ -59,7 +59,7 @@ JNIEXPORT jint JNICALL Java_com_portaudio_PortAudio_getVersion JNIEXPORT jstring JNICALL Java_com_portaudio_PortAudio_getVersionText (JNIEnv *env, jclass clazz) { - return (*env)->NewStringUTF(env, Pa_GetVersionText() ); + return (*env)->NewStringUTF(env, Pa_GetVersionText() ); } /* @@ -70,8 +70,8 @@ JNIEXPORT jstring JNICALL Java_com_portaudio_PortAudio_getVersionText JNIEXPORT void JNICALL Java_com_portaudio_PortAudio_initialize (JNIEnv *env, jclass clazz) { - PaError err = Pa_Initialize(); - jpa_CheckError( env, err ); + PaError err = Pa_Initialize(); + jpa_CheckError( env, err ); } /* @@ -82,8 +82,8 @@ JNIEXPORT void JNICALL Java_com_portaudio_PortAudio_initialize JNIEXPORT void JNICALL Java_com_portaudio_PortAudio_terminate (JNIEnv *env, jclass clazz) { - PaError err = Pa_Terminate(); - jpa_CheckError( env, err ); + PaError err = Pa_Terminate(); + jpa_CheckError( env, err ); } /* @@ -94,8 +94,8 @@ JNIEXPORT void JNICALL Java_com_portaudio_PortAudio_terminate JNIEXPORT jint JNICALL Java_com_portaudio_PortAudio_getDeviceCount (JNIEnv *env, jclass clazz) { - jint count = Pa_GetDeviceCount(); - return jpa_CheckError( env, count ); + jint count = Pa_GetDeviceCount(); + return jpa_CheckError( env, count ); } /* @@ -106,27 +106,27 @@ JNIEXPORT jint JNICALL Java_com_portaudio_PortAudio_getDeviceCount JNIEXPORT void JNICALL Java_com_portaudio_PortAudio_getDeviceInfo (JNIEnv *env, jclass clazz, jint index, jobject deviceInfo) { - const PaDeviceInfo *info; - /* Get a reference to obj's class */ - jclass cls = (*env)->GetObjectClass(env, deviceInfo); - - info = Pa_GetDeviceInfo( index ); - if( info == NULL ) - { - jpa_ThrowError( env, "Pa_GetDeviceInfo returned NULL." ); - } - else - { - jpa_SetStringField( env, cls, deviceInfo, "name", info->name ); - jpa_SetIntField( env, cls, deviceInfo, "maxInputChannels", info->maxInputChannels ); - jpa_SetIntField( env, cls, deviceInfo, "maxOutputChannels", info->maxOutputChannels ); - jpa_SetIntField( env, cls, deviceInfo, "hostApi", info->hostApi ); - jpa_SetDoubleField( env, cls, deviceInfo, "defaultSampleRate", info->defaultSampleRate ); - jpa_SetDoubleField( env, cls, deviceInfo, "defaultLowInputLatency", info->defaultLowInputLatency ); - jpa_SetDoubleField( env, cls, deviceInfo, "defaultLowInputLatency", info->defaultHighInputLatency ); - jpa_SetDoubleField( env, cls, deviceInfo, "defaultLowOutputLatency", info->defaultLowOutputLatency ); - jpa_SetDoubleField( env, cls, deviceInfo, "defaultHighOutputLatency", info->defaultHighOutputLatency ); - } + const PaDeviceInfo *info; + /* Get a reference to obj's class */ + jclass cls = (*env)->GetObjectClass(env, deviceInfo); + + info = Pa_GetDeviceInfo( index ); + if( info == NULL ) + { + jpa_ThrowError( env, "Pa_GetDeviceInfo returned NULL." ); + } + else + { + jpa_SetStringField( env, cls, deviceInfo, "name", info->name ); + jpa_SetIntField( env, cls, deviceInfo, "maxInputChannels", info->maxInputChannels ); + jpa_SetIntField( env, cls, deviceInfo, "maxOutputChannels", info->maxOutputChannels ); + jpa_SetIntField( env, cls, deviceInfo, "hostApi", info->hostApi ); + jpa_SetDoubleField( env, cls, deviceInfo, "defaultSampleRate", info->defaultSampleRate ); + jpa_SetDoubleField( env, cls, deviceInfo, "defaultLowInputLatency", info->defaultLowInputLatency ); + jpa_SetDoubleField( env, cls, deviceInfo, "defaultLowInputLatency", info->defaultHighInputLatency ); + jpa_SetDoubleField( env, cls, deviceInfo, "defaultLowOutputLatency", info->defaultLowOutputLatency ); + jpa_SetDoubleField( env, cls, deviceInfo, "defaultHighOutputLatency", info->defaultHighOutputLatency ); + } } /* @@ -137,8 +137,8 @@ JNIEXPORT void JNICALL Java_com_portaudio_PortAudio_getDeviceInfo JNIEXPORT jint JNICALL Java_com_portaudio_PortAudio_getHostApiCount (JNIEnv *env, jclass clazz) { - jint count = Pa_GetHostApiCount(); - return jpa_CheckError( env, count ); + jint count = Pa_GetHostApiCount(); + return jpa_CheckError( env, count ); } @@ -150,7 +150,7 @@ JNIEXPORT jint JNICALL Java_com_portaudio_PortAudio_getHostApiCount JNIEXPORT jint JNICALL Java_com_portaudio_PortAudio_hostApiTypeIdToHostApiIndex (JNIEnv *env, jclass clazz, jint hostApiType) { - return Pa_HostApiTypeIdToHostApiIndex( (PaHostApiTypeId) hostApiType ); + return Pa_HostApiTypeIdToHostApiIndex( (PaHostApiTypeId) hostApiType ); } /* @@ -161,7 +161,7 @@ JNIEXPORT jint JNICALL Java_com_portaudio_PortAudio_hostApiTypeIdToHostApiIndex JNIEXPORT jint JNICALL Java_com_portaudio_PortAudio_hostApiDeviceIndexToDeviceIndex (JNIEnv *env, jclass clazz, jint hostApiIndex, jint apiDeviceIndex) { - return Pa_HostApiDeviceIndexToDeviceIndex( hostApiIndex, apiDeviceIndex ); + return Pa_HostApiDeviceIndexToDeviceIndex( hostApiIndex, apiDeviceIndex ); } @@ -173,24 +173,24 @@ JNIEXPORT jint JNICALL Java_com_portaudio_PortAudio_hostApiDeviceIndexToDeviceIn JNIEXPORT void JNICALL Java_com_portaudio_PortAudio_getHostApiInfo (JNIEnv *env, jclass clazz, jint index, jobject hostApiInfo) { - const PaHostApiInfo *info; - /* Get a reference to obj's class */ - jclass cls = (*env)->GetObjectClass(env, hostApiInfo); - - info = Pa_GetHostApiInfo( index ); - if( info == NULL ) - { - jpa_ThrowError( env, "Pa_GetHostApiInfo returned NULL." ); - } - else - { - jpa_SetIntField( env, cls, hostApiInfo, "version", info->structVersion ); - jpa_SetIntField( env, cls, hostApiInfo, "type", info->type ); - jpa_SetStringField( env, cls, hostApiInfo, "name", info->name ); - jpa_SetIntField( env, cls, hostApiInfo, "deviceCount", info->deviceCount ); - jpa_SetIntField( env, cls, hostApiInfo, "defaultInputDevice", info->defaultInputDevice ); - jpa_SetIntField( env, cls, hostApiInfo, "defaultOutputDevice", info->defaultOutputDevice ); - } + const PaHostApiInfo *info; + /* Get a reference to obj's class */ + jclass cls = (*env)->GetObjectClass(env, hostApiInfo); + + info = Pa_GetHostApiInfo( index ); + if( info == NULL ) + { + jpa_ThrowError( env, "Pa_GetHostApiInfo returned NULL." ); + } + else + { + jpa_SetIntField( env, cls, hostApiInfo, "version", info->structVersion ); + jpa_SetIntField( env, cls, hostApiInfo, "type", info->type ); + jpa_SetStringField( env, cls, hostApiInfo, "name", info->name ); + jpa_SetIntField( env, cls, hostApiInfo, "deviceCount", info->deviceCount ); + jpa_SetIntField( env, cls, hostApiInfo, "defaultInputDevice", info->defaultInputDevice ); + jpa_SetIntField( env, cls, hostApiInfo, "defaultOutputDevice", info->defaultOutputDevice ); + } } /* @@ -201,8 +201,8 @@ JNIEXPORT void JNICALL Java_com_portaudio_PortAudio_getHostApiInfo JNIEXPORT jint JNICALL Java_com_portaudio_PortAudio_getDefaultInputDevice (JNIEnv *env, jclass clazz) { - jint deviceId = Pa_GetDefaultInputDevice(); - return jpa_CheckError( env, deviceId ); + jint deviceId = Pa_GetDefaultInputDevice(); + return jpa_CheckError( env, deviceId ); } /* @@ -213,8 +213,8 @@ JNIEXPORT jint JNICALL Java_com_portaudio_PortAudio_getDefaultInputDevice JNIEXPORT jint JNICALL Java_com_portaudio_PortAudio_getDefaultOutputDevice (JNIEnv *env, jclass clazz) { - jint deviceId = Pa_GetDefaultOutputDevice(); - return jpa_CheckError( env, deviceId ); + jint deviceId = Pa_GetDefaultOutputDevice(); + return jpa_CheckError( env, deviceId ); } /* @@ -225,8 +225,8 @@ JNIEXPORT jint JNICALL Java_com_portaudio_PortAudio_getDefaultOutputDevice JNIEXPORT jint JNICALL Java_com_portaudio_PortAudio_getDefaultHostApi (JNIEnv *env, jclass clazz) { - jint deviceId = Pa_GetDefaultHostApi(); - return jpa_CheckError( env, deviceId ); + jint deviceId = Pa_GetDefaultHostApi(); + return jpa_CheckError( env, deviceId ); } /* @@ -237,13 +237,13 @@ JNIEXPORT jint JNICALL Java_com_portaudio_PortAudio_getDefaultHostApi JNIEXPORT jint JNICALL Java_com_portaudio_PortAudio_isFormatSupported (JNIEnv *env, jclass clazz, jobject inParams, jobject outParams, jint sampleRate ) { - PaStreamParameters myInParams, *paInParams; - PaStreamParameters myOutParams, *paOutParams; - - paInParams = jpa_FillStreamParameters( env, inParams, &myInParams ); - paOutParams = jpa_FillStreamParameters( env, outParams, &myOutParams ); - - return Pa_IsFormatSupported( paInParams, paOutParams, sampleRate ); + PaStreamParameters myInParams, *paInParams; + PaStreamParameters myOutParams, *paOutParams; + + paInParams = jpa_FillStreamParameters( env, inParams, &myInParams ); + paOutParams = jpa_FillStreamParameters( env, outParams, &myOutParams ); + + return Pa_IsFormatSupported( paInParams, paOutParams, sampleRate ); } @@ -255,25 +255,25 @@ JNIEXPORT jint JNICALL Java_com_portaudio_PortAudio_isFormatSupported JNIEXPORT void JNICALL Java_com_portaudio_PortAudio_openStream (JNIEnv *env, jclass clazz, jobject blockingStream, jobject inParams, jobject outParams, jint sampleRate, jint framesPerBuffer, jint flags ) { - int err; - PaStreamParameters myInParams, *paInParams; - PaStreamParameters myOutParams, *paOutParams; - PaStream *stream; - - paInParams = jpa_FillStreamParameters( env, inParams, &myInParams ); - paOutParams = jpa_FillStreamParameters( env, outParams, &myOutParams ); - err = Pa_OpenStream( &stream, paInParams, paOutParams, sampleRate, framesPerBuffer, flags, NULL, NULL ); - if( jpa_CheckError( env, err ) == 0 ) - { - jclass cls = (*env)->GetObjectClass(env, blockingStream); - jpa_SetLongField( env, cls, blockingStream, "nativeStream", (jlong) stream ); - if( paInParams != NULL ) - { - jpa_SetIntField( env, cls, blockingStream, "inputFormat", paInParams->sampleFormat ); - } - if( paOutParams != NULL ) - { - jpa_SetIntField( env, cls, blockingStream, "outputFormat", paOutParams->sampleFormat ); - } - } + int err; + PaStreamParameters myInParams, *paInParams; + PaStreamParameters myOutParams, *paOutParams; + PaStream *stream; + + paInParams = jpa_FillStreamParameters( env, inParams, &myInParams ); + paOutParams = jpa_FillStreamParameters( env, outParams, &myOutParams ); + err = Pa_OpenStream( &stream, paInParams, paOutParams, sampleRate, framesPerBuffer, flags, NULL, NULL ); + if( jpa_CheckError( env, err ) == 0 ) + { + jclass cls = (*env)->GetObjectClass(env, blockingStream); + jpa_SetLongField( env, cls, blockingStream, "nativeStream", (jlong) stream ); + if( paInParams != NULL ) + { + jpa_SetIntField( env, cls, blockingStream, "inputFormat", paInParams->sampleFormat ); + } + if( paOutParams != NULL ) + { + jpa_SetIntField( env, cls, blockingStream, "outputFormat", paOutParams->sampleFormat ); + } + } } diff --git a/bindings/java/c/src/jpa_tools.c b/bindings/java/c/src/jpa_tools.c index e3f903a..58b6332 100644 --- a/bindings/java/c/src/jpa_tools.c +++ b/bindings/java/c/src/jpa_tools.c @@ -26,13 +26,13 @@ */ /* - * The text above constitutes the entire PortAudio license; however, + * The text above constitutes the entire PortAudio license; however, * the PortAudio community also makes the following non-binding requests: * * 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. It is also - * requested that these non-binding requests be included along with the + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the * license above. */ @@ -45,14 +45,14 @@ jint jpa_GetIntField( JNIEnv *env, jclass cls, jobject obj, const char *fieldNam /* Look for the instance field maxInputChannels in cls */ jfieldID fid = (*env)->GetFieldID(env, cls, fieldName, "I"); if (fid == NULL) - { - jpa_ThrowError( env, "Cannot find integer JNI field." ); - return 0; + { + jpa_ThrowError( env, "Cannot find integer JNI field." ); + return 0; + } + else + { + return (*env)->GetIntField(env, obj, fid ); } - else - { - return (*env)->GetIntField(env, obj, fid ); - } } void jpa_SetIntField( JNIEnv *env, jclass cls, jobject obj, const char *fieldName, jint value ) @@ -60,13 +60,13 @@ void jpa_SetIntField( JNIEnv *env, jclass cls, jobject obj, const char *fieldNam /* Look for the instance field maxInputChannels in cls */ jfieldID fid = (*env)->GetFieldID(env, cls, fieldName, "I"); if (fid == NULL) - { - jpa_ThrowError( env, "Cannot find integer JNI field." ); + { + jpa_ThrowError( env, "Cannot find integer JNI field." ); + } + else + { + (*env)->SetIntField(env, obj, fid, value ); } - else - { - (*env)->SetIntField(env, obj, fid, value ); - } } jlong jpa_GetLongField( JNIEnv *env, jclass cls, jobject obj, const char *fieldName ) @@ -74,14 +74,14 @@ jlong jpa_GetLongField( JNIEnv *env, jclass cls, jobject obj, const char *fieldN /* Look for the instance field maxInputChannels in cls */ jfieldID fid = (*env)->GetFieldID(env, cls, fieldName, "J"); if (fid == NULL) - { - jpa_ThrowError( env, "Cannot find long JNI field." ); - return 0L; + { + jpa_ThrowError( env, "Cannot find long JNI field." ); + return 0L; + } + else + { + return (*env)->GetLongField(env, obj, fid ); } - else - { - return (*env)->GetLongField(env, obj, fid ); - } } void jpa_SetLongField( JNIEnv *env, jclass cls, jobject obj, const char *fieldName, jlong value ) @@ -89,13 +89,13 @@ void jpa_SetLongField( JNIEnv *env, jclass cls, jobject obj, const char *fieldNa /* Look for the instance field maxInputChannels in cls */ jfieldID fid = (*env)->GetFieldID(env, cls, fieldName, "J"); if (fid == NULL) - { - jpa_ThrowError( env, "Cannot find long JNI field." ); + { + jpa_ThrowError( env, "Cannot find long JNI field." ); + } + else + { + (*env)->SetLongField(env, obj, fid, value ); } - else - { - (*env)->SetLongField(env, obj, fid, value ); - } } @@ -104,13 +104,13 @@ void jpa_SetDoubleField( JNIEnv *env, jclass cls, jobject obj, const char *field /* Look for the instance field maxInputChannels in cls */ jfieldID fid = (*env)->GetFieldID(env, cls, fieldName, "D"); if (fid == NULL) - { - jpa_ThrowError( env, "Cannot find double JNI field." ); + { + jpa_ThrowError( env, "Cannot find double JNI field." ); + } + else + { + (*env)->SetDoubleField(env, obj, fid, value ); } - else - { - (*env)->SetDoubleField(env, obj, fid, value ); - } } @@ -119,14 +119,14 @@ jdouble jpa_GetDoubleField( JNIEnv *env, jclass cls, jobject obj, const char *fi /* Look for the instance field maxInputChannels in cls */ jfieldID fid = (*env)->GetFieldID(env, cls, fieldName, "D"); if (fid == NULL) - { - jpa_ThrowError( env, "Cannot find double JNI field." ); - return 0; + { + jpa_ThrowError( env, "Cannot find double JNI field." ); + return 0; + } + else + { + return (*env)->GetDoubleField(env, obj, fid ); } - else - { - return (*env)->GetDoubleField(env, obj, fid ); - } } void jpa_SetStringField( JNIEnv *env, jclass cls, jobject obj, const char *fieldName, const char *value ) @@ -134,75 +134,75 @@ void jpa_SetStringField( JNIEnv *env, jclass cls, jobject obj, const char *field /* Look for the instance field maxInputChannels in cls */ jfieldID fid = (*env)->GetFieldID(env, cls, fieldName, "Ljava/lang/String;"); if (fid == NULL) - { - jpa_ThrowError( env, "Cannot find String JNI field." ); + { + jpa_ThrowError( env, "Cannot find String JNI field." ); + } + else + { + jstring jstr = (*env)->NewStringUTF(env, value); + if (jstr == NULL) + { + jpa_ThrowError( env, "Cannot create new String." ); + } + else + { + (*env)->SetObjectField(env, obj, fid, jstr ); + } } - else - { - jstring jstr = (*env)->NewStringUTF(env, value); - if (jstr == NULL) - { - jpa_ThrowError( env, "Cannot create new String." ); - } - else - { - (*env)->SetObjectField(env, obj, fid, jstr ); - } - } } PaStreamParameters *jpa_FillStreamParameters( JNIEnv *env, jobject jstreamParam, PaStreamParameters *myParams ) { - jclass cls; - - if( jstreamParam == NULL ) return NULL; // OK, not an error + jclass cls; - cls = (*env)->GetObjectClass(env, jstreamParam); - - myParams->channelCount = jpa_GetIntField( env, cls, jstreamParam, "channelCount" ); - myParams->device = jpa_GetIntField( env, cls, jstreamParam, "device" ); - myParams->sampleFormat = jpa_GetIntField( env, cls, jstreamParam, "sampleFormat" ); - myParams->suggestedLatency = jpa_GetDoubleField( env, cls, jstreamParam, "suggestedLatency" ); - myParams->hostApiSpecificStreamInfo = NULL; + if( jstreamParam == NULL ) return NULL; // OK, not an error - return myParams; + cls = (*env)->GetObjectClass(env, jstreamParam); + + myParams->channelCount = jpa_GetIntField( env, cls, jstreamParam, "channelCount" ); + myParams->device = jpa_GetIntField( env, cls, jstreamParam, "device" ); + myParams->sampleFormat = jpa_GetIntField( env, cls, jstreamParam, "sampleFormat" ); + myParams->suggestedLatency = jpa_GetDoubleField( env, cls, jstreamParam, "suggestedLatency" ); + myParams->hostApiSpecificStreamInfo = NULL; + + return myParams; } // Create an exception that will be thrown when we return from the JNI call. jint jpa_ThrowError( JNIEnv *env, const char *message ) { - return (*env)->ThrowNew(env, (*env)->FindClass( env, "java/lang/RuntimeException"), + return (*env)->ThrowNew(env, (*env)->FindClass( env, "java/lang/RuntimeException"), message ); } // Throw an exception on error. jint jpa_CheckError( JNIEnv *env, PaError err ) { - if( err == -1 ) - { + if( err == -1 ) + { return jpa_ThrowError( env, "-1, possibly no available default device" ); } else if( err < 0 ) { - if( err == paUnanticipatedHostError ) - { - const PaHostErrorInfo *hostErrorInfo = Pa_GetLastHostErrorInfo(); - return jpa_ThrowError( env, hostErrorInfo->errorText ); - } - else - { - return jpa_ThrowError( env, Pa_GetErrorText( err ) ); - } - } - else - { - return err; - } + if( err == paUnanticipatedHostError ) + { + const PaHostErrorInfo *hostErrorInfo = Pa_GetLastHostErrorInfo(); + return jpa_ThrowError( env, hostErrorInfo->errorText ); + } + else + { + return jpa_ThrowError( env, Pa_GetErrorText( err ) ); + } + } + else + { + return err; + } } // Get the stream pointer from a BlockingStream long field. PaStream *jpa_GetStreamPointer( JNIEnv *env, jobject blockingStream ) { - jclass cls = (*env)->GetObjectClass(env, blockingStream); - return (PaStream *) jpa_GetLongField( env, cls, blockingStream, "nativeStream" ); + jclass cls = (*env)->GetObjectClass(env, blockingStream); + return (PaStream *) jpa_GetLongField( env, cls, blockingStream, "nativeStream" ); } diff --git a/bindings/java/c/src/jpa_tools.h b/bindings/java/c/src/jpa_tools.h index 11e724c..0a735ca 100644 --- a/bindings/java/c/src/jpa_tools.h +++ b/bindings/java/c/src/jpa_tools.h @@ -26,13 +26,13 @@ */ /* - * The text above constitutes the entire PortAudio license; however, + * The text above constitutes the entire PortAudio license; however, * the PortAudio community also makes the following non-binding requests: * * 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. It is also - * requested that these non-binding requests be included along with the + * they can be incorporated into the canonical version. It is also + * requested that these non-binding requests be included along with the * license above. */ From b184fe82ede7b12d7030681527e68e4ae7fabe4d Mon Sep 17 00:00:00 2001 From: Be Date: Wed, 28 Apr 2021 19:35:03 -0500 Subject: [PATCH 146/164] remove deprecated pablio (#437) This is deprecated code from 1999. --- pablio/README.txt | 49 ------- pablio/pablio.c | 314 ------------------------------------------ pablio/pablio.def | 35 ----- pablio/pablio.h | 116 ---------------- pablio/test_rw.c | 105 -------------- pablio/test_rw_echo.c | 129 ----------------- pablio/test_w_saw.c | 114 --------------- pablio/test_w_saw8.c | 112 --------------- 8 files changed, 974 deletions(-) delete mode 100644 pablio/README.txt delete mode 100644 pablio/pablio.c delete mode 100644 pablio/pablio.def delete mode 100644 pablio/pablio.h delete mode 100644 pablio/test_rw.c delete mode 100644 pablio/test_rw_echo.c delete mode 100644 pablio/test_w_saw.c delete mode 100644 pablio/test_w_saw8.c diff --git a/pablio/README.txt b/pablio/README.txt deleted file mode 100644 index 84438bf..0000000 --- a/pablio/README.txt +++ /dev/null @@ -1,49 +0,0 @@ -README for PABLIO -Portable Audio Blocking I/O Library -Author: Phil Burk - -PABLIO is a simplified interface to PortAudio that provides -read/write style blocking I/O. - -PABLIO is DEPRECATED. We recommend that people use the blocking I/O calls -that are now part of the PortAudio API. These are Pa_ReadStream() and -Pa_WriteStream(). - -http://portaudio.com/docs/v19-doxydocs/blocking_read_write.html - -/* - * More information on PortAudio at: http://www.portaudio.com - * Copyright (c) 1999-2000 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. - * - * 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. - */ - -/* - * The text above constitutes the entire PortAudio license; however, - * the PortAudio community also makes the following non-binding requests: - * - * 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. It is also - * requested that these non-binding requests be included along with the - * license above. - */ - - diff --git a/pablio/pablio.c b/pablio/pablio.c deleted file mode 100644 index 2275250..0000000 --- a/pablio/pablio.c +++ /dev/null @@ -1,314 +0,0 @@ -/* - * $Id$ - * pablio.c - * Portable Audio Blocking Input/Output utility. - * - * Author: Phil Burk, http://www.softsynth.com - * - * This program uses the PortAudio Portable Audio Library. - * For more information see: http://www.portaudio.com - * Copyright (c) 1999-2000 Ross Bencina and 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. - * - * 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. - */ - -/* - * The text above constitutes the entire PortAudio license; however, - * the PortAudio community also makes the following non-binding requests: - * - * 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. It is also - * requested that these non-binding requests be included along with the - * license above. - */ - -#include -#include -#include -#include "portaudio.h" -#include "pa_ringbuffer.h" -#include "pablio.h" -#include - -/************************************************************************/ -/******** Constants *****************************************************/ -/************************************************************************/ - -#define FRAMES_PER_BUFFER (256) - -/************************************************************************/ -/******** Prototypes ****************************************************/ -/************************************************************************/ - -static int blockingIOCallback( void *inputBuffer, void *outputBuffer, - unsigned long framesPerBuffer, - PaTimestamp outTime, void *userData ); -static PaError PABLIO_InitFIFO( RingBuffer *rbuf, long numFrames, long bytesPerFrame ); -static PaError PABLIO_TermFIFO( RingBuffer *rbuf ); - -/************************************************************************/ -/******** Functions *****************************************************/ -/************************************************************************/ - -/* Called from PortAudio. - * Read and write data only if there is room in FIFOs. - */ -static int blockingIOCallback( void *inputBuffer, void *outputBuffer, - unsigned long framesPerBuffer, - PaTimestamp outTime, void *userData ) -{ - PABLIO_Stream *data = (PABLIO_Stream*)userData; - long numBytes = data->bytesPerFrame * framesPerBuffer; - (void) outTime; - - /* This may get called with NULL inputBuffer during initial setup. */ - if( inputBuffer != NULL ) - { - PaUtil_WriteRingBuffer( &data->inFIFO, inputBuffer, numBytes ); - } - if( outputBuffer != NULL ) - { - int i; - int numRead = PaUtil_ReadRingBuffer( &data->outFIFO, outputBuffer, numBytes ); - /* Zero out remainder of buffer if we run out of data. */ - for( i=numRead; ibuffer ) free( rbuf->buffer ); - rbuf->buffer = NULL; - return paNoError; -} - -/************************************************************ - * Write data to ring buffer. - * Will not return until all the data has been written. - */ -long WriteAudioStream( PABLIO_Stream *aStream, void *data, long numFrames ) -{ - long bytesWritten; - char *p = (char *) data; - long numBytes = aStream->bytesPerFrame * numFrames; - while( numBytes > 0) - { - bytesWritten = PaUtil_WriteRingBuffer( &aStream->outFIFO, p, numBytes ); - numBytes -= bytesWritten; - p += bytesWritten; - if( numBytes > 0) Pa_Sleep(10); - } - return numFrames; -} - -/************************************************************ - * Read data from ring buffer. - * Will not return until all the data has been read. - */ -long ReadAudioStream( PABLIO_Stream *aStream, void *data, long numFrames ) -{ - long bytesRead; - char *p = (char *) data; - long numBytes = aStream->bytesPerFrame * numFrames; - while( numBytes > 0) - { - bytesRead = PaUtil_ReadRingBuffer( &aStream->inFIFO, p, numBytes ); - numBytes -= bytesRead; - p += bytesRead; - if( numBytes > 0) Pa_Sleep(10); - } - return numFrames; -} - -/************************************************************ - * Return the number of frames that could be written to the stream without - * having to wait. - */ -long GetAudioStreamWriteable( PABLIO_Stream *aStream ) -{ - int bytesEmpty = PaUtil_GetRingBufferWriteAvailable( &aStream->outFIFO ); - return bytesEmpty / aStream->bytesPerFrame; -} - -/************************************************************ - * Return the number of frames that are available to be read from the - * stream without having to wait. - */ -long GetAudioStreamReadable( PABLIO_Stream *aStream ) -{ - int bytesFull = PaUtil_GetRingBufferReadAvailable( &aStream->inFIFO ); - return bytesFull / aStream->bytesPerFrame; -} - -/************************************************************/ -static unsigned long RoundUpToNextPowerOf2( unsigned long n ) -{ - long numBits = 0; - if( ((n-1) & n) == 0) return n; /* Already Power of two. */ - while( n > 0 ) - { - n= n>>1; - numBits++; - } - return (1<samplesPerFrame = ((flags&PABLIO_MONO) != 0) ? 1 : 2; - aStream->bytesPerFrame = bytesPerSample * aStream->samplesPerFrame; - - /* Initialize PortAudio */ - err = Pa_Initialize(); - if( err != paNoError ) goto error; - - /* Warning: numFrames must be larger than amount of data processed per interrupt - * inside PA to prevent glitches. Just to be safe, adjust size upwards. - */ - minNumBuffers = 2 * Pa_GetMinNumBuffers( FRAMES_PER_BUFFER, sampleRate ); - numFrames = minNumBuffers * FRAMES_PER_BUFFER; - numFrames = RoundUpToNextPowerOf2( numFrames ); - - /* Initialize Ring Buffers */ - doRead = ((flags & PABLIO_READ) != 0); - doWrite = ((flags & PABLIO_WRITE) != 0); - if(doRead) - { - err = PABLIO_InitFIFO( &aStream->inFIFO, numFrames, aStream->bytesPerFrame ); - if( err != paNoError ) goto error; - } - if(doWrite) - { - long numBytes; - err = PABLIO_InitFIFO( &aStream->outFIFO, numFrames, aStream->bytesPerFrame ); - if( err != paNoError ) goto error; - /* Make Write FIFO appear full initially. */ - numBytes = PaUtil_GetRingBufferWriteAvailable( &aStream->outFIFO ); - PaUtil_AdvanceRingBufferWriteIndex( &aStream->outFIFO, numBytes ); - } - - /* Open a PortAudio stream that we will use to communicate with the underlying - * audio drivers. */ - err = Pa_OpenStream( - &aStream->stream, - (doRead ? Pa_GetDefaultInputDeviceID() : paNoDevice), - (doRead ? aStream->samplesPerFrame : 0 ), - format, - NULL, - (doWrite ? Pa_GetDefaultOutputDeviceID() : paNoDevice), - (doWrite ? aStream->samplesPerFrame : 0 ), - format, - NULL, - sampleRate, - FRAMES_PER_BUFFER, - minNumBuffers, - paClipOff, /* we won't output out of range samples so don't bother clipping them */ - blockingIOCallback, - aStream ); - if( err != paNoError ) goto error; - - err = Pa_StartStream( aStream->stream ); - if( err != paNoError ) goto error; - - *rwblPtr = aStream; - return paNoError; - -error: - CloseAudioStream( aStream ); - *rwblPtr = NULL; - return err; -} - -/************************************************************/ -PaError CloseAudioStream( PABLIO_Stream *aStream ) -{ - PaError err; - int bytesEmpty; - int byteSize = aStream->outFIFO.bufferSize; - - /* If we are writing data, make sure we play everything written. */ - if( byteSize > 0 ) - { - bytesEmpty = PaUtil_GetRingBufferWriteAvailable( &aStream->outFIFO ); - while( bytesEmpty < byteSize ) - { - Pa_Sleep( 10 ); - bytesEmpty = PaUtil_GetRingBufferWriteAvailable( &aStream->outFIFO ); - } - } - - err = Pa_StopStream( aStream->stream ); - if( err != paNoError ) goto error; - err = Pa_CloseStream( aStream->stream ); - if( err != paNoError ) goto error; - Pa_Terminate(); - -error: - PABLIO_TermFIFO( &aStream->inFIFO ); - PABLIO_TermFIFO( &aStream->outFIFO ); - free( aStream ); - return err; -} diff --git a/pablio/pablio.def b/pablio/pablio.def deleted file mode 100644 index a10f952..0000000 --- a/pablio/pablio.def +++ /dev/null @@ -1,35 +0,0 @@ -LIBRARY PABLIO -DESCRIPTION 'PABLIO Portable Audio Blocking I/O' - -EXPORTS - ; Explicit exports can go here - Pa_Initialize @1 - Pa_Terminate @2 - Pa_GetHostError @3 - Pa_GetErrorText @4 - Pa_CountDevices @5 - Pa_GetDefaultInputDeviceID @6 - Pa_GetDefaultOutputDeviceID @7 - Pa_GetDeviceInfo @8 - Pa_OpenStream @9 - Pa_OpenDefaultStream @10 - Pa_CloseStream @11 - Pa_StartStream @12 - Pa_StopStream @13 - Pa_StreamActive @14 - Pa_StreamTime @15 - Pa_GetCPULoad @16 - Pa_GetMinNumBuffers @17 - Pa_Sleep @18 - - OpenAudioStream @19 - CloseAudioStream @20 - WriteAudioStream @21 - ReadAudioStream @22 - - Pa_GetSampleSize @23 - - ;123456789012345678901234567890123456 - ;000000000111111111122222222223333333 - - diff --git a/pablio/pablio.h b/pablio/pablio.h deleted file mode 100644 index fbc3ef4..0000000 --- a/pablio/pablio.h +++ /dev/null @@ -1,116 +0,0 @@ -#ifndef _PABLIO_H -#define _PABLIO_H - -#ifdef __cplusplus -extern "C" -{ -#endif /* __cplusplus */ - -/* - * $Id$ - * PABLIO.h - * Portable Audio Blocking read/write utility. - * - * Author: Phil Burk, http://www.softsynth.com/portaudio/ - * - * Include file for PABLIO, the Portable Audio Blocking I/O Library. - * PABLIO is built on top of PortAudio, the Portable Audio Library. - * For more information see: http://www.portaudio.com - * Copyright (c) 1999-2000 Ross Bencina and 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. - * - * 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. - */ - -/* - * The text above constitutes the entire PortAudio license; however, - * the PortAudio community also makes the following non-binding requests: - * - * 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. It is also - * requested that these non-binding requests be included along with the - * license above. - */ - -#include -#include -#include -#include "portaudio.h" -#include "pa_ringbuffer.h" -#include - -typedef struct -{ - RingBuffer inFIFO; - RingBuffer outFIFO; - PortAudioStream *stream; - int bytesPerFrame; - int samplesPerFrame; -} -PABLIO_Stream; - -/* Values for flags for OpenAudioStream(). */ -#define PABLIO_READ (1<<0) -#define PABLIO_WRITE (1<<1) -#define PABLIO_READ_WRITE (PABLIO_READ|PABLIO_WRITE) -#define PABLIO_MONO (1<<2) -#define PABLIO_STEREO (1<<3) - -/************************************************************ - * Write data to ring buffer. - * Will not return until all the data has been written. - */ -long WriteAudioStream( PABLIO_Stream *aStream, void *data, long numFrames ); - -/************************************************************ - * Read data from ring buffer. - * Will not return until all the data has been read. - */ -long ReadAudioStream( PABLIO_Stream *aStream, void *data, long numFrames ); - -/************************************************************ - * Return the number of frames that could be written to the stream without - * having to wait. - */ -long GetAudioStreamWriteable( PABLIO_Stream *aStream ); - -/************************************************************ - * Return the number of frames that are available to be read from the - * stream without having to wait. - */ -long GetAudioStreamReadable( PABLIO_Stream *aStream ); - -/************************************************************ - * Opens a PortAudio stream with default characteristics. - * Allocates PABLIO_Stream structure. - * - * flags parameter can be an ORed combination of: - * PABLIO_READ, PABLIO_WRITE, or PABLIO_READ_WRITE, - * and either PABLIO_MONO or PABLIO_STEREO - */ -PaError OpenAudioStream( PABLIO_Stream **aStreamPtr, double sampleRate, - PaSampleFormat format, long flags ); - -PaError CloseAudioStream( PABLIO_Stream *aStream ); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ -#endif /* _PABLIO_H */ diff --git a/pablio/test_rw.c b/pablio/test_rw.c deleted file mode 100644 index 029240d..0000000 --- a/pablio/test_rw.c +++ /dev/null @@ -1,105 +0,0 @@ -/* - * $Id$ - * test_rw.c - * Read input from one stream and write it to another. - * - * Author: Phil Burk, http://www.softsynth.com/portaudio/ - * - * This program uses PABLIO, the Portable Audio Blocking I/O Library. - * PABLIO is built on top of PortAudio, the Portable Audio Library. - * For more information see: http://www.portaudio.com - * Copyright (c) 1999-2000 Ross Bencina and 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. - * - * 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. - */ - -/* - * The text above constitutes the entire PortAudio license; however, - * the PortAudio community also makes the following non-binding requests: - * - * 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. It is also - * requested that these non-binding requests be included along with the - * license above. - */ - -#include -#include -#include "pablio.h" - -/* -** Note that many of the older ISA sound cards on PCs do NOT support -** full duplex audio (simultaneous record and playback). -** And some only support full duplex at lower sample rates. -*/ -#define SAMPLE_RATE (44100) -#define NUM_SECONDS (5) -#define SAMPLES_PER_FRAME (2) -#define FRAMES_PER_BLOCK (64) - -/* Select whether we will use floats or shorts. */ -#if 1 -#define SAMPLE_TYPE paFloat32 -typedef float SAMPLE; -#else -#define SAMPLE_TYPE paInt16 -typedef short SAMPLE; -#endif - -/*******************************************************************/ -int main(void); -int main(void) -{ - int i; - SAMPLE samples[SAMPLES_PER_FRAME * FRAMES_PER_BLOCK]; - PaError err; - PABLIO_Stream *aStream; - - printf("Full duplex sound test using PortAudio and RingBuffers\n"); - fflush(stdout); - - /* Open simplified blocking I/O layer on top of PortAudio. */ - err = OpenAudioStream( &aStream, SAMPLE_RATE, SAMPLE_TYPE, - (PABLIO_READ_WRITE | PABLIO_STEREO) ); - if( err != paNoError ) goto error; - - /* Process samples in the foreground. */ - for( i=0; i<(NUM_SECONDS * SAMPLE_RATE); i += FRAMES_PER_BLOCK ) - { - /* Read one block of data into sample array from audio input. */ - ReadAudioStream( aStream, samples, FRAMES_PER_BLOCK ); - /* Write that same block of data to output. */ - WriteAudioStream( aStream, samples, FRAMES_PER_BLOCK ); - } - - CloseAudioStream( aStream ); - - printf("Full duplex sound test complete.\n" ); - fflush(stdout); - return 0; - -error: - Pa_Terminate(); - fprintf( stderr, "An error occurred while using the portaudio stream\n" ); - fprintf( stderr, "Error number: %d\n", err ); - fprintf( stderr, "Error message: %s\n", Pa_GetErrorText( err ) ); - return -1; -} diff --git a/pablio/test_rw_echo.c b/pablio/test_rw_echo.c deleted file mode 100644 index 431587c..0000000 --- a/pablio/test_rw_echo.c +++ /dev/null @@ -1,129 +0,0 @@ -/* - * $Id$ - * test_rw_echo.c - * Echo delayed input to output. - * - * Author: Phil Burk, http://www.softsynth.com/portaudio/ - * - * This program uses PABLIO, the Portable Audio Blocking I/O Library. - * PABLIO is built on top of PortAudio, the Portable Audio Library. - * - * Note that if you need low latency, you should not use PABLIO. - * Use the PA_OpenStream callback technique which is lower level - * than PABLIO. - * - * For more information see: http://www.portaudio.com - * Copyright (c) 1999-2000 Ross Bencina and 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. - * - * 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. - */ - -/* - * The text above constitutes the entire PortAudio license; however, - * the PortAudio community also makes the following non-binding requests: - * - * 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. It is also - * requested that these non-binding requests be included along with the - * license above. - */ - -#include -#include -#include -#include "pablio.h" -#include - -/* -** Note that many of the older ISA sound cards on PCs do NOT support -** full duplex audio (simultaneous record and playback). -** And some only support full duplex at lower sample rates. -*/ -#define SAMPLE_RATE (22050) -#define NUM_SECONDS (20) -#define SAMPLES_PER_FRAME (2) - -/* Select whether we will use floats or shorts. */ -#if 1 -#define SAMPLE_TYPE paFloat32 -typedef float SAMPLE; -#else -#define SAMPLE_TYPE paInt16 -typedef short SAMPLE; -#endif - -#define NUM_ECHO_FRAMES (2*SAMPLE_RATE) -SAMPLE samples[NUM_ECHO_FRAMES][SAMPLES_PER_FRAME] = {0.0}; - -/*******************************************************************/ -int main(void); -int main(void) -{ - int i; - PaError err; - PABLIO_Stream *aInStream; - PABLIO_Stream *aOutStream; - int index; - - printf("Full duplex sound test using PABLIO\n"); - fflush(stdout); - - /* Open simplified blocking I/O layer on top of PortAudio. */ - /* Open input first so it can start to fill buffers. */ - err = OpenAudioStream( &aInStream, SAMPLE_RATE, SAMPLE_TYPE, - (PABLIO_READ | PABLIO_STEREO) ); - if( err != paNoError ) goto error; - /* printf("opened input\n"); fflush(stdout); /**/ - - err = OpenAudioStream( &aOutStream, SAMPLE_RATE, SAMPLE_TYPE, - (PABLIO_WRITE | PABLIO_STEREO) ); - if( err != paNoError ) goto error; - /* printf("opened output\n"); fflush(stdout); /**/ - - /* Process samples in the foreground. */ - index = 0; - for( i=0; i<(NUM_SECONDS * SAMPLE_RATE); i++ ) - { - /* Write old frame of data to output. */ - /* samples[index][1] = (i&256) * (1.0f/256.0f); /* sawtooth */ - WriteAudioStream( aOutStream, &samples[index][0], 1 ); - - /* Read one frame of data into sample array for later output. */ - ReadAudioStream( aInStream, &samples[index][0], 1 ); - index += 1; - if( index >= NUM_ECHO_FRAMES ) index = 0; - - if( (i & 0xFFFF) == 0 ) printf("i = %d\n", i ); fflush(stdout); /**/ - } - - CloseAudioStream( aOutStream ); - CloseAudioStream( aInStream ); - - printf("R/W echo sound test complete.\n" ); - fflush(stdout); - return 0; - -error: - fprintf( stderr, "An error occurred while using PortAudio\n" ); - fprintf( stderr, "Error number: %d\n", err ); - fprintf( stderr, "Error message: %s\n", Pa_GetErrorText( err ) ); - return -1; -} diff --git a/pablio/test_w_saw.c b/pablio/test_w_saw.c deleted file mode 100644 index 2303d20..0000000 --- a/pablio/test_w_saw.c +++ /dev/null @@ -1,114 +0,0 @@ -/* - * $Id$ - * test_w_saw.c - * Generate stereo sawtooth waveforms. - * - * Author: Phil Burk, http://www.softsynth.com - * - * This program uses PABLIO, the Portable Audio Blocking I/O Library. - * PABLIO is built on top of PortAudio, the Portable Audio Library. - * - * For more information see: http://www.portaudio.com - * Copyright (c) 1999-2000 Ross Bencina and 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. - * - * 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. - */ - -/* - * The text above constitutes the entire PortAudio license; however, - * the PortAudio community also makes the following non-binding requests: - * - * 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. It is also - * requested that these non-binding requests be included along with the - * license above. - */ - -#include -#include -#include -#include "pablio.h" -#include - -#define SAMPLE_RATE (44100) -#define NUM_SECONDS (6) -#define SAMPLES_PER_FRAME (2) - -#define FREQUENCY (220.0f) -#define PHASE_INCREMENT (2.0f * FREQUENCY / SAMPLE_RATE) -#define FRAMES_PER_BLOCK (100) - -float samples[FRAMES_PER_BLOCK][SAMPLES_PER_FRAME]; -float phases[SAMPLES_PER_FRAME]; - -/*******************************************************************/ -int main(void); -int main(void) -{ - int i,j; - PaError err; - PABLIO_Stream *aOutStream; - - printf("Generate sawtooth waves using PABLIO.\n"); - fflush(stdout); - - /* Open simplified blocking I/O layer on top of PortAudio. */ - err = OpenAudioStream( &aOutStream, SAMPLE_RATE, paFloat32, - (PABLIO_WRITE | PABLIO_STEREO) ); - if( err != paNoError ) goto error; - - /* Initialize oscillator phases. */ - phases[0] = 0.0; - phases[1] = 0.0; - - for( i=0; i<(NUM_SECONDS * SAMPLE_RATE); i += FRAMES_PER_BLOCK ) - { - /* Generate sawtooth waveforms in a block for efficiency. */ - for( j=0; j 1.0f ) phases[0] -= 2.0f; - samples[j][0] = phases[0]; - - /* On the second channel, generate a sawtooth wave a fifth higher. */ - phases[1] += PHASE_INCREMENT * (3.0f / 2.0f); - if( phases[1] > 1.0f ) phases[1] -= 2.0f; - samples[j][1] = phases[1]; - } - - /* Write samples to output. */ - WriteAudioStream( aOutStream, samples, FRAMES_PER_BLOCK ); - } - - CloseAudioStream( aOutStream ); - - printf("Sawtooth sound test complete.\n" ); - fflush(stdout); - return 0; - -error: - fprintf( stderr, "An error occurred while using PABLIO\n" ); - fprintf( stderr, "Error number: %d\n", err ); - fprintf( stderr, "Error message: %s\n", Pa_GetErrorText( err ) ); - return -1; -} diff --git a/pablio/test_w_saw8.c b/pablio/test_w_saw8.c deleted file mode 100644 index 70686c1..0000000 --- a/pablio/test_w_saw8.c +++ /dev/null @@ -1,112 +0,0 @@ -/* - * $Id$ - * test_w_saw8.c - * Generate stereo 8 bit sawtooth waveforms. - * - * Author: Phil Burk, http://www.softsynth.com - * - * This program uses PABLIO, the Portable Audio Blocking I/O Library. - * PABLIO is built on top of PortAudio, the Portable Audio Library. - * - * For more information see: http://www.portaudio.com - * Copyright (c) 1999-2000 Ross Bencina and 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. - * - * 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. - */ - -/* - * The text above constitutes the entire PortAudio license; however, - * the PortAudio community also makes the following non-binding requests: - * - * 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. It is also - * requested that these non-binding requests be included along with the - * license above. - */ - -#include -#include -#include -#include "pablio.h" -#include - -#define SAMPLE_RATE (22050) -#define NUM_SECONDS (6) -#define SAMPLES_PER_FRAME (2) - - -#define FRAMES_PER_BLOCK (100) - -unsigned char samples[FRAMES_PER_BLOCK][SAMPLES_PER_FRAME]; -unsigned char phases[SAMPLES_PER_FRAME]; - -/*******************************************************************/ -int main(void); -int main(void) -{ - int i,j; - PaError err; - PABLIO_Stream *aOutStream; - - printf("Generate unsigned 8 bit sawtooth waves using PABLIO.\n"); - fflush(stdout); - - /* Open simplified blocking I/O layer on top of PortAudio. */ - err = OpenAudioStream( &aOutStream, SAMPLE_RATE, paUInt8, - (PABLIO_WRITE | PABLIO_STEREO) ); - if( err != paNoError ) goto error; - - /* Initialize oscillator phases to "ground" level for paUInt8. */ - phases[0] = 128; - phases[1] = 128; - - for( i=0; i<(NUM_SECONDS * SAMPLE_RATE); i += FRAMES_PER_BLOCK ) - { - /* Generate sawtooth waveforms in a block for efficiency. */ - for( j=0; j Date: Thu, 29 Apr 2021 03:38:18 +0300 Subject: [PATCH 147/164] [macOS] drop support for 10.5 (#511) * drop support for 10.5 * more documentation fixes Co-authored-by: John Melas --- bindings/cpp/INSTALL | 2 +- configure | Bin 575139 -> 574157 bytes configure.in | 36 +--------------- doc/src/tutorial/compile_mac_coreaudio.dox | 12 +++--- src/hostapi/coreaudio/pa_mac_core.c | 48 +++------------------ 5 files changed, 14 insertions(+), 84 deletions(-) diff --git a/bindings/cpp/INSTALL b/bindings/cpp/INSTALL index 2099840..cde9b49 100644 --- a/bindings/cpp/INSTALL +++ b/bindings/cpp/INSTALL @@ -124,7 +124,7 @@ architecture at a time in the source code directory. After you have installed the package for one architecture, use `make distclean' before reconfiguring for another architecture. - On MacOS X 10.5 and later systems, you can create libraries and + On MacOS X 10.6 and later systems, you can create libraries and executables that work on multiple system types--known as "fat" or "universal" binaries--by specifying multiple `-arch' options to the compiler but only a single `-arch' option to the preprocessor. Like diff --git a/configure b/configure index 2a59e10a8bf8ad7f6ba86ecf0481d0c5fde34f77..b88f7a6c9908d5dcbb229254f0663fe67a94c6a7 100755 GIT binary patch delta 62 zcmZ47t9-UqxuJ!zg{g(Pg{6hHg>4HvlgD%(e|GNaa-QsR%w|el)9-q+D@}jr&2BXP SrXRaxd!Y~e_Cg;HqbdMpjuS@! delta 498 zcmX@xs=T;YxuJ!zg{g(Pg{6hHg>4HvlSg23VsWZMLPc_ZN@`MRW=@KNZdqzkab|v= zLXARkDv+C}pkAyW0g_jU(a_V1(bSJI)Gts^P{_>V;!;2WV?Bc!V?9I7$rBezPhSws zt_3Fq)H2f)q7`&g6!cwE%Tjal3sQ^pgI&Cf^?ehQ{evS64fIU)ic_+uU+`p?p3daK zuE}hy#5MhaC%fo$1#fmvE#1uG%HpE@{1O5N05u7Cv8!M)LYD|5OiDqHPy+gC`o1Ns z(yR&!*4A9pAC|MrPF}Ex2jLq{pl>RYi%RnpbajCm6mk=j^NTA$o&X7C m|B=BeFnP`*fyoLp*r!{0vGYvl_h#p9pY6fEeYOXOQ5695K$tK9 diff --git a/configure.in b/configure.in index bb4ae96..2291629 100644 --- a/configure.in +++ b/configure.in @@ -217,40 +217,8 @@ case "${host_os}" in LIBS="-framework CoreAudio -framework AudioToolbox -framework AudioUnit -framework CoreFoundation -framework CoreServices" if test "x$enable_mac_universal" = "xyes" ; then - case `xcodebuild -version | sed -n 's/Xcode \(.*\)/\1/p'` in - - 3.0|3.1) - dnl In pre-3.2 versions of Xcode, xcodebuild doesn't - dnl support -sdk, so we can't use that to look for - dnl SDKs. However, in those versions of Xcode, the - dnl SDKs are under /Developer/SDKs, so we can just look - dnl there. Also, we assume they had no SDKs later - dnl than 10.5, as 3.2 was the version that came with - dnl 10.6, at least if the Wikipedia page for Xcode - dnl is to be believed. - if [[ -d /Developer/SDKs/MacOSX10.5.sdk ]] ; then - mac_version_min="-mmacosx-version-min=10.3" - mac_sysroot="-isysroot /Developer/SDKs/MacOSX10.5.sdk" - else - mac_version_min="-mmacosx-version-min=10.3" - mac_sysroot="-isysroot /Developer/SDKs/MacOSX10.4u.sdk" - fi - ;; - - *) - dnl In 3.2 and later, xcodebuild supports -sdk, and, in - dnl 4.3 and later, the SDKs aren't under /Developer/SDKs - dnl as there *is* no /Developer, so we use -sdk to check - dnl what SDKs are available and to get the full path of - dnl the SDKs. - if xcrun --sdk macosx10.5 --show-sdk-path >/dev/null 2>&1 ; then - mac_version_min="-mmacosx-version-min=10.5" - mac_sysroot="-isysroot $(xcrun --sdk macosx10.5 --show-sdk-path)" - else - mac_version_min="-mmacosx-version-min=10.6" - mac_sysroot="-isysroot $(xcrun --sdk macosx --show-sdk-path)" - fi - esac + mac_version_min="-mmacosx-version-min=10.6" + mac_sysroot="-isysroot $(xcrun --sdk macosx --show-sdk-path)" dnl Pick which architectures to build for based on what dnl the compiler and SDK supports. diff --git a/doc/src/tutorial/compile_mac_coreaudio.dox b/doc/src/tutorial/compile_mac_coreaudio.dox index 068391e..3f4de90 100644 --- a/doc/src/tutorial/compile_mac_coreaudio.dox +++ b/doc/src/tutorial/compile_mac_coreaudio.dox @@ -3,11 +3,11 @@ @section comp_mac_ca_1 Requirements -* OS X 10.4 or later. PortAudio v19 currently only compiles and runs on OS X version 10.4 or later. Because of its heavy reliance on memory barriers, it's not clear how easy it would be to back-port PortAudio to OS X version 10.3. Leopard support requires the 2007 snapshot or later. +* OS X 10.6 or later. PortAudio v19.7 currently only compiles and runs on OS X version 10.6 or later. * Apple's Xcode and its related tools installed in the default location. There is no Xcode project for PortAudio. -* Mac 10.4 SDK. Look for "/Developer/SDKs/MacOSX10.4u.sdk" folder on your system. It may be installed with XCode. If not then you can download it from Apple Developer Connection. http://connect.apple.com/ +* Mac 10.6 SDK. Look for "/Developer/SDKs/MacOSX10.6.sdk" folder on your system. It may be installed with XCode. If not then you can download it from Apple Developer Connection. http://connect.apple.com/ @section comp_mac_ca_2 Building @@ -29,7 +29,7 @@ There are a variety of other options for building PortAudio. The default describ @subsection comp_mac_ca_3.1 Building Non-Universal Libraries -By default, PortAudio is built as a universal binary. This includes 64-bit versions if you are compiling on 10.5, Leopard. If you want a "thin", or single architecture library, you have two options: +By default, PortAudio is built as a universal binary. This includes 64-bit versions if you are compiling on 10.6, Snow Leopard. If you want a "thin", or single architecture library, you have two options: * build a non-universal library using configure options. * use lipo(1) on whatever part of the library you plan to use. @@ -44,11 +44,11 @@ To build a non-universal library for the host architecture, simply use the -- ./configure --disable-mac-universal && make @endcode -The --disable-mac-universal option may also be used in conjunction with environment variables to give you more control over the universal binary build process. For example, to build a universal binary for the i386 and ppc architectures using the 10.4u sdk (which is the default on 10.4, but not 10.5), you might specify this configure command line: +The --disable-mac-universal option may also be used in conjunction with environment variables to give you more control over the universal binary build process. For example, to build a universal binary for the i386 and ppc architectures using the 10.6 sdk, you might specify this configure command line: @code - CFLAGS="-O2 -g -Wall -arch i386 -arch ppc -isysroot /Developer/SDKs/MacOSX10.4u.sdk -mmacosx-version-min=10.3" \ - LDFLAGS="-arch i386 -arch ppc -isysroot /Developer/SDKs/MacOSX10.4u.sdk -mmacosx-version-min=10.3" \ + CFLAGS="-O2 -g -Wall -arch i386 -arch ppc -isysroot /Developer/SDKs/MacOSX10.6.sdk -mmacosx-version-min=10.6" \ + LDFLAGS="-arch i386 -arch ppc -isysroot /Developer/SDKs/MacOSX10.6.sdk -mmacosx-version-min=10.6" \ ./configure --disable-mac-universal --disable-dependency-tracking @endcode diff --git a/src/hostapi/coreaudio/pa_mac_core.c b/src/hostapi/coreaudio/pa_mac_core.c index 26b814c..728835d 100644 --- a/src/hostapi/coreaudio/pa_mac_core.c +++ b/src/hostapi/coreaudio/pa_mac_core.c @@ -71,11 +71,6 @@ #include "pa_mac_core_utilities.h" #include "pa_mac_core_blocking.h" -#ifndef MAC_OS_X_VERSION_10_6 -#define MAC_OS_X_VERSION_10_6 1060 -#endif - - #ifdef __cplusplus extern "C" { @@ -726,19 +721,11 @@ PaError PaMacCore_Initialize( PaUtilHostApiRepresentation **hostApi, PaHostApiIn VVDBUG(("PaMacCore_Initialize(): hostApiIndex=%d\n", hostApiIndex)); - SInt32 major; - SInt32 minor; - Gestalt(gestaltSystemVersionMajor, &major); - Gestalt(gestaltSystemVersionMinor, &minor); - - // Starting with 10.6 systems, the HAL notification thread is created internally - if ( major > 10 || (major == 10 && minor >= 6) ) { - CFRunLoopRef theRunLoop = NULL; - AudioObjectPropertyAddress theAddress = { kAudioHardwarePropertyRunLoop, kAudioObjectPropertyScopeGlobal, kAudioObjectPropertyElementMaster }; - OSStatus osErr = AudioObjectSetPropertyData (kAudioObjectSystemObject, &theAddress, 0, NULL, sizeof(CFRunLoopRef), &theRunLoop); - if (osErr != noErr) { - goto error; - } + CFRunLoopRef theRunLoop = NULL; + AudioObjectPropertyAddress theAddress = { kAudioHardwarePropertyRunLoop, kAudioObjectPropertyScopeGlobal, kAudioObjectPropertyElementMaster }; + OSStatus osErr = AudioObjectSetPropertyData (kAudioObjectSystemObject, &theAddress, 0, NULL, sizeof(CFRunLoopRef), &theRunLoop); + if (osErr != noErr) { + goto error; } unixErr = initializeXRunListenerList(); @@ -1180,13 +1167,8 @@ static PaError OpenAndSetupOneAudioUnit( const double sampleRate, void *refCon ) { -#if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_6 AudioComponentDescription desc; AudioComponent comp; -#else - ComponentDescription desc; - Component comp; -#endif /*An Apple TN suggests using CAStreamBasicDescription, but that is C++*/ AudioStreamBasicDescription desiredFormat; OSStatus result = noErr; @@ -1253,11 +1235,7 @@ static PaError OpenAndSetupOneAudioUnit( desc.componentFlags = 0; desc.componentFlagsMask = 0; /* -- find the component -- */ -#if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_6 comp = AudioComponentFindNext( NULL, &desc ); -#else - comp = FindNextComponent( NULL, &desc ); -#endif if( !comp ) { DBUG( ( "AUHAL component not found." ) ); @@ -1266,11 +1244,7 @@ static PaError OpenAndSetupOneAudioUnit( return paUnanticipatedHostError; } /* -- open it -- */ -#if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_6 result = AudioComponentInstanceNew( comp, audioUnit ); -#else - result = OpenAComponent( comp, audioUnit ); -#endif if( result ) { DBUG( ( "Failed to open AUHAL component." ) ); @@ -1619,11 +1593,7 @@ static PaError OpenAndSetupOneAudioUnit( error: -#if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_6 AudioComponentInstanceDispose( *audioUnit ); -#else - CloseComponent( *audioUnit ); -#endif *audioUnit = NULL; if( result ) return PaMacCore_SetError( result, line, 1 ); @@ -2679,21 +2649,13 @@ static PaError CloseStream( PaStream* s ) } if( stream->outputUnit && stream->outputUnit != stream->inputUnit ) { AudioUnitUninitialize( stream->outputUnit ); -#if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_6 AudioComponentInstanceDispose( stream->outputUnit ); -#else - CloseComponent( stream->outputUnit ); -#endif } stream->outputUnit = NULL; if( stream->inputUnit ) { AudioUnitUninitialize( stream->inputUnit ); -#if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_6 AudioComponentInstanceDispose( stream->inputUnit ); -#else - CloseComponent( stream->inputUnit ); -#endif stream->inputUnit = NULL; } if( stream->inputRingBuffer.buffer ) From febd58ebba3200723fdc1ef6067dedcc01a90efb Mon Sep 17 00:00:00 2001 From: Be Date: Wed, 12 May 2021 19:17:10 -0500 Subject: [PATCH 148/164] MME: fix comparison of IO buffer sizes in CalculateBufferSettings() (#571) Pull in fix from Audacity: https://bugzilla.audacityteam.org/show_bug.cgi?id=1969 The problem was some kind of typo, comparing pointers instead of the values of pointers. --- src/hostapi/wmme/pa_win_wmme.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hostapi/wmme/pa_win_wmme.c b/src/hostapi/wmme/pa_win_wmme.c index f8b1d7e..1d928eb 100644 --- a/src/hostapi/wmme/pa_win_wmme.c +++ b/src/hostapi/wmme/pa_win_wmme.c @@ -1729,7 +1729,7 @@ static PaError CalculateBufferSettings( if( *hostFramesPerOutputBuffer != *hostFramesPerInputBuffer ) { - if( hostFramesPerInputBuffer < hostFramesPerOutputBuffer ) + if( *hostFramesPerInputBuffer < *hostFramesPerOutputBuffer ) { *hostFramesPerOutputBuffer = *hostFramesPerInputBuffer; From 840489460fe77d5bce1fa8b13865ccea27f54ba1 Mon Sep 17 00:00:00 2001 From: MonkeybreadSoftware Date: Thu, 13 May 2021 02:36:10 +0200 Subject: [PATCH 149/164] alsa: Increase snprintf buffer size to fix warning (#566) Avoid compiler warning suggesting the buffer is too small: ../PortAudioLib/portaudio/src/hostapi/alsa/pa_linux_alsa.c: In function 'BuildDeviceList.constprop': ../PortAudioLib/portaudio/src/hostapi/alsa/pa_linux_alsa.c:1304:45: warning: '%s' directive output may be truncated writing up to 49 bytes into a region of size between 46 and 50 [-Wformat-truncation=] snprintf( buf, sizeof (buf), "%s%s,%d", hwPrefix, alsaCardName, devIdx ); ^~ ~~~~~~~~~~~~ ../PortAudioLib/portaudio/src/hostapi/alsa/pa_linux_alsa.c:1304:42: note: directive argument in the range [0, 2147483647] snprintf( buf, sizeof (buf), "%s%s,%d", hwPrefix, alsaCardName, devIdx ); ^~~~~~~~~ ../PortAudioLib/portaudio/src/hostapi/alsa/pa_linux_alsa.c:1304:13: note: 'snprintf' output between 3 and 65 bytes into a destination of size 50 snprintf( buf, sizeof (buf), "%s%s,%d", hwPrefix, alsaCardName, devIdx ); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ --- src/hostapi/alsa/pa_linux_alsa.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hostapi/alsa/pa_linux_alsa.c b/src/hostapi/alsa/pa_linux_alsa.c index a66f90d..80b4697 100644 --- a/src/hostapi/alsa/pa_linux_alsa.c +++ b/src/hostapi/alsa/pa_linux_alsa.c @@ -1280,7 +1280,7 @@ static PaError BuildDeviceList( PaAlsaHostApiRepresentation *alsaApi ) char *cardName; int devIdx = -1; snd_ctl_t *ctl; - char buf[50]; + char buf[66]; snprintf( alsaCardName, sizeof (alsaCardName), "hw:%d", cardIdx ); From 15dfd46b33ae71bdbfa22dd71c37ee7a8e7c659c Mon Sep 17 00:00:00 2001 From: Mirko Rajkovaca Date: Thu, 27 May 2021 02:07:27 +0200 Subject: [PATCH 150/164] Added Pa_GetVersionInfo to portaudio.def (#574) * - added Pa_GetVersionInfo to portaudio.def * - added Pa_GetVersionInfo to `cmake_support/template_portaudio.def` Co-authored-by: Mirko Rajkovaca --- build/msvc/portaudio.def | 1 + cmake_support/template_portaudio.def | 1 + 2 files changed, 2 insertions(+) diff --git a/build/msvc/portaudio.def b/build/msvc/portaudio.def index 6ecb142..8de8065 100644 --- a/build/msvc/portaudio.def +++ b/build/msvc/portaudio.def @@ -35,6 +35,7 @@ Pa_GetStreamReadAvailable @31 Pa_GetStreamWriteAvailable @32 Pa_GetSampleSize @33 Pa_Sleep @34 +Pa_GetVersionInfo @35 PaAsio_GetAvailableBufferSizes @50 PaAsio_ShowControlPanel @51 PaUtil_InitializeX86PlainConverters @52 diff --git a/cmake_support/template_portaudio.def b/cmake_support/template_portaudio.def index 9cf0dc3..b5d56f1 100644 --- a/cmake_support/template_portaudio.def +++ b/cmake_support/template_portaudio.def @@ -38,6 +38,7 @@ Pa_GetStreamReadAvailable @31 Pa_GetStreamWriteAvailable @32 Pa_GetSampleSize @33 Pa_Sleep @34 +Pa_GetVersionInfo @35 @DEF_EXCLUDE_ASIO_SYMBOLS@PaAsio_GetAvailableBufferSizes @50 @DEF_EXCLUDE_ASIO_SYMBOLS@PaAsio_ShowControlPanel @51 @DEF_EXCLUDE_X86_PLAIN_CONVERTERS@PaUtil_InitializeX86PlainConverters @52 From 9faca9b95bd93dd626839e4f3261e68c620f36a5 Mon Sep 17 00:00:00 2001 From: Ross Bencina Date: Thu, 20 May 2021 12:06:14 +1000 Subject: [PATCH 151/164] Add documentation indicating that Pa_ReadStream, Pa_WriteStream, Pa_GetStreamReadAvailable and Pa_GetStreamWriteAvailable are only valid while the stream is running (between calls to Pa_StartStream and Pa_StopStream.) --- include/portaudio.h | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/include/portaudio.h b/include/portaudio.h index 5d84731..c3e1744 100644 --- a/include/portaudio.h +++ b/include/portaudio.h @@ -1129,6 +1129,10 @@ double Pa_GetStreamCpuLoad( PaStream* stream ); the entire buffer has been filled - this may involve waiting for the operating system to supply the data. + Reading from a stream that is stopped is not currently supported. In particular, + it is not possible to drain the read buffer by calling Pa_ReadStream after + calling Pa_StopStream. + @param stream A pointer to an open stream previously created with Pa_OpenStream. @param buffer A pointer to a buffer of sample frames. The buffer contains @@ -1155,6 +1159,10 @@ PaError Pa_ReadStream( PaStream* stream, entire buffer has been written - this may involve waiting for the operating system to consume the data. + Writing to a stream that is stopped is not currently supported. In particular, + it is not possible to prefill the write buffer by calling Pa_WriteStream + prior to calling Pa_StartStream. + @param stream A pointer to an open stream previously created with Pa_OpenStream. @param buffer A pointer to a buffer of sample frames. The buffer contains @@ -1181,6 +1189,9 @@ PaError Pa_WriteStream( PaStream* stream, /** Retrieve the number of frames that can be read from the stream without waiting. + When the stream is stopped the return value of Pa_GetStreamReadAvailable is not + defined. + @return Returns a non-negative value representing the maximum number of frames that can be read from the stream without blocking or busy waiting or, a PaErrorCode (which are always negative) if PortAudio is not initialized or an @@ -1192,6 +1203,9 @@ signed long Pa_GetStreamReadAvailable( PaStream* stream ); /** Retrieve the number of frames that can be written to the stream without waiting. + When the stream is stopped the return value of Pa_GetStreamWriteAvailable is not + defined. + @return Returns a non-negative value representing the maximum number of frames that can be written to the stream without blocking or busy waiting or, a PaErrorCode (which are always negative) if PortAudio is not initialized or an From 9413fa051f0f9b830c117cb3dc4f6d675e330a99 Mon Sep 17 00:00:00 2001 From: Trent Piepho <35062987+xyzzy42@users.noreply.github.com> Date: Wed, 2 Jun 2021 18:03:42 -0700 Subject: [PATCH 152/164] Alsa: Use hires timestamps (#560) ALSA added nanosecond timestamps in library version 0.9.1. Use these instead of microsecond timestamps for reporting audio timestamps as well as underrun/overrun times. alsa-lib version 0.9.1 was released on Mar 11 2003. I had fallback code to use non-hires timestamps, but after 18 years it didn't seem necessary, and I removed it from this commit. --- src/hostapi/alsa/pa_linux_alsa.c | 59 ++++++++++++++++++++------------ 1 file changed, 37 insertions(+), 22 deletions(-) diff --git a/src/hostapi/alsa/pa_linux_alsa.c b/src/hostapi/alsa/pa_linux_alsa.c index 80b4697..a6d2aec 100644 --- a/src/hostapi/alsa/pa_linux_alsa.c +++ b/src/hostapi/alsa/pa_linux_alsa.c @@ -220,8 +220,10 @@ _PA_DEFINE_FUNC(snd_config_update_free_global); _PA_DEFINE_FUNC(snd_pcm_status); _PA_DEFINE_FUNC(snd_pcm_status_sizeof); _PA_DEFINE_FUNC(snd_pcm_status_get_tstamp); +_PA_DEFINE_FUNC(snd_pcm_status_get_htstamp); _PA_DEFINE_FUNC(snd_pcm_status_get_state); _PA_DEFINE_FUNC(snd_pcm_status_get_trigger_tstamp); +_PA_DEFINE_FUNC(snd_pcm_status_get_trigger_htstamp); _PA_DEFINE_FUNC(snd_pcm_status_get_delay); #define alsa_snd_pcm_status_alloca(ptr) __alsa_snd_alloca(ptr, snd_pcm_status) @@ -499,8 +501,10 @@ static int PaAlsa_LoadLibrary() _PA_LOAD_FUNC(snd_pcm_status); _PA_LOAD_FUNC(snd_pcm_status_sizeof); _PA_LOAD_FUNC(snd_pcm_status_get_tstamp); + _PA_LOAD_FUNC(snd_pcm_status_get_htstamp); _PA_LOAD_FUNC(snd_pcm_status_get_state); _PA_LOAD_FUNC(snd_pcm_status_get_trigger_tstamp); + _PA_LOAD_FUNC(snd_pcm_status_get_trigger_htstamp); _PA_LOAD_FUNC(snd_pcm_status_get_delay); _PA_LOAD_FUNC(snd_card_next); @@ -3156,6 +3160,28 @@ static PaError IsStreamActive( PaStream *s ) return stream->isActive; } +/** Extract audio/trigger htstamp from status and convert into PaTime (seconds). + * + * trigger is boolean: trigger stampstamp vs audio timestamp. If delay is non-NULL, return delay in + * frames. */ +static PaTime StatusToTime( const snd_pcm_status_t *status, int trigger, snd_pcm_uframes_t* delay ) +{ + snd_htimestamp_t timestamp; + if ( trigger ) + { + alsa_snd_pcm_status_get_trigger_htstamp( status, ×tamp ); + } + else + { + alsa_snd_pcm_status_get_htstamp( status, ×tamp ); + } + if ( delay ) + { + *delay = alsa_snd_pcm_status_get_delay( status ); + } + return timestamp.tv_sec + ( (PaTime)timestamp.tv_nsec * 1e-9 ); +} + static PaTime GetStreamTime( PaStream *s ) { PaAlsaStream *stream = (PaAlsaStream*)s; @@ -3179,8 +3205,7 @@ static PaTime GetStreamTime( PaStream *s ) alsa_snd_pcm_status( stream->playback.pcm, status ); } - alsa_snd_pcm_status_get_tstamp( status, ×tamp ); - return timestamp.tv_sec + (PaTime)timestamp.tv_usec / 1e6; + return StatusToTime( status, 0, NULL ); } static double GetStreamCpuLoad( PaStream* s ) @@ -3276,7 +3301,7 @@ static PaError PaAlsaStream_HandleXrun( PaAlsaStream *self ) if( alsa_snd_pcm_status_get_state( st ) == SND_PCM_STATE_XRUN ) { alsa_snd_pcm_status_get_trigger_tstamp( st, &t ); - self->underrun = now * 1000 - ( (PaTime)t.tv_sec * 1000 + (PaTime)t.tv_usec / 1000 ); + self->underrun = ( now - StatusToTime( st, 1, NULL ) ) * 1000; if( !self->playback.canMmap ) { @@ -3295,8 +3320,7 @@ static PaError PaAlsaStream_HandleXrun( PaAlsaStream *self ) alsa_snd_pcm_status( self->capture.pcm, st ); if( alsa_snd_pcm_status_get_state( st ) == SND_PCM_STATE_XRUN ) { - alsa_snd_pcm_status_get_trigger_tstamp( st, &t ); - self->overrun = now * 1000 - ((PaTime) t.tv_sec * 1000 + (PaTime) t.tv_usec / 1000); + self->overrun = ( now - StatusToTime( st, 1, NULL ) ) * 1000; if (!self->capture.canMmap) { @@ -3408,37 +3432,29 @@ static void OnExit( void *data ) static void CalculateTimeInfo( PaAlsaStream *stream, PaStreamCallbackTimeInfo *timeInfo ) { - snd_pcm_status_t *capture_status, *playback_status; - snd_timestamp_t capture_timestamp, playback_timestamp; + snd_pcm_status_t *status; PaTime capture_time = 0., playback_time = 0.; - alsa_snd_pcm_status_alloca( &capture_status ); - alsa_snd_pcm_status_alloca( &playback_status ); + alsa_snd_pcm_status_alloca( &status ); if( stream->capture.pcm ) { snd_pcm_sframes_t capture_delay; - alsa_snd_pcm_status( stream->capture.pcm, capture_status ); - alsa_snd_pcm_status_get_tstamp( capture_status, &capture_timestamp ); + alsa_snd_pcm_status( stream->capture.pcm, status ); + capture_time = StatusToTime( status, 0, &capture_delay ); - capture_time = capture_timestamp.tv_sec + - ( (PaTime)capture_timestamp.tv_usec / 1000000.0 ); timeInfo->currentTime = capture_time; - - capture_delay = alsa_snd_pcm_status_get_delay( capture_status ); - timeInfo->inputBufferAdcTime = timeInfo->currentTime - + timeInfo->inputBufferAdcTime = capture_time - (PaTime)capture_delay / stream->streamRepresentation.streamInfo.sampleRate; } if( stream->playback.pcm ) { snd_pcm_sframes_t playback_delay; + PaTime playback_time; - alsa_snd_pcm_status( stream->playback.pcm, playback_status ); - alsa_snd_pcm_status_get_tstamp( playback_status, &playback_timestamp ); - - playback_time = playback_timestamp.tv_sec + - ((PaTime)playback_timestamp.tv_usec / 1000000.0); + alsa_snd_pcm_status( stream->playback.pcm, status ); + playback_time = StatusToTime( status, 0, &playback_delay ); if( stream->capture.pcm ) /* Full duplex */ { @@ -3450,7 +3466,6 @@ static void CalculateTimeInfo( PaAlsaStream *stream, PaStreamCallbackTimeInfo *t else timeInfo->currentTime = playback_time; - playback_delay = alsa_snd_pcm_status_get_delay( playback_status ); timeInfo->outputBufferDacTime = timeInfo->currentTime + (PaTime)playback_delay / stream->streamRepresentation.streamInfo.sampleRate; } From 2bd663ca75f424c658804f970d3045166a6d09d3 Mon Sep 17 00:00:00 2001 From: Phil Burk Date: Tue, 8 Jun 2021 17:06:48 -0700 Subject: [PATCH 153/164] pa_mac_core.c: init streamLatency and others (#591) Prevent compiler warnings. --- src/hostapi/coreaudio/pa_mac_core.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/hostapi/coreaudio/pa_mac_core.c b/src/hostapi/coreaudio/pa_mac_core.c index 728835d..aaa5bf4 100644 --- a/src/hostapi/coreaudio/pa_mac_core.c +++ b/src/hostapi/coreaudio/pa_mac_core.c @@ -453,22 +453,25 @@ static void DumpDeviceProperties( AudioDeviceID macCoreDeviceId, UInt32 bufferFrames; UInt32 safetyOffset; AudioStreamID streamIDs[128]; + AudioValueRange audioRange; printf("\n======= latency query : macCoreDeviceId = %d, isInput %d =======\n", (int)macCoreDeviceId, isInput ); propSize = sizeof(UInt32); + bufferFrames = 0; err = WARNING(AudioDeviceGetProperty(macCoreDeviceId, 0, isInput, kAudioDevicePropertyBufferFrameSize, &propSize, &bufferFrames)); printf("kAudioDevicePropertyBufferFrameSize: err = %d, propSize = %d, value = %d\n", err, propSize, bufferFrames ); propSize = sizeof(UInt32); + safetyOffset = 0; err = WARNING(AudioDeviceGetProperty(macCoreDeviceId, 0, isInput, kAudioDevicePropertySafetyOffset, &propSize, &safetyOffset)); printf("kAudioDevicePropertySafetyOffset: err = %d, propSize = %d, value = %d\n", err, propSize, safetyOffset ); propSize = sizeof(UInt32); + deviceLatency = 0; err = WARNING(AudioDeviceGetProperty(macCoreDeviceId, 0, isInput, kAudioDevicePropertyLatency, &propSize, &deviceLatency)); printf("kAudioDevicePropertyLatency: err = %d, propSize = %d, value = %d\n", err, propSize, deviceLatency ); - AudioValueRange audioRange; propSize = sizeof( audioRange ); err = WARNING(AudioDeviceGetProperty( macCoreDeviceId, 0, isInput, kAudioDevicePropertyBufferFrameSizeRange, &propSize, &audioRange ) ); printf("kAudioDevicePropertyBufferFrameSizeRange: err = %d, propSize = %u, minimum = %g\n", err, propSize, audioRange.mMinimum); @@ -483,6 +486,7 @@ static void DumpDeviceProperties( AudioDeviceID macCoreDeviceId, printf("Stream #%d = %d---------------------- \n", i, streamIDs[i] ); propSize = sizeof(UInt32); + streamLatency = 0; err = WARNING(PaMacCore_AudioStreamGetProperty(streamIDs[i], 0, kAudioStreamPropertyLatency, &propSize, &streamLatency)); printf(" kAudioStreamPropertyLatency: err = %d, propSize = %d, value = %d\n", err, propSize, streamLatency ); } @@ -515,6 +519,7 @@ static PaError CalculateFixedDeviceLatency( AudioDeviceID macCoreDeviceId, int i propSize = sizeof(streamIDs); err = WARNING(PaMacCore_AudioDeviceGetProperty(macCoreDeviceId, 0, isInput, kAudioDevicePropertyStreams, &propSize, &streamIDs[0])); if( err != paNoError ) goto error; + streamLatency = 0; if( propSize == sizeof(AudioStreamID) ) { propSize = sizeof(UInt32); @@ -522,10 +527,12 @@ static PaError CalculateFixedDeviceLatency( AudioDeviceID macCoreDeviceId, int i } propSize = sizeof(UInt32); + safetyOffset = 0; err = WARNING(PaMacCore_AudioDeviceGetProperty(macCoreDeviceId, 0, isInput, kAudioDevicePropertySafetyOffset, &propSize, &safetyOffset)); if( err != paNoError ) goto error; propSize = sizeof(UInt32); + deviceLatency = 0; err = WARNING(PaMacCore_AudioDeviceGetProperty(macCoreDeviceId, 0, isInput, kAudioDevicePropertyLatency, &propSize, &deviceLatency)); if( err != paNoError ) goto error; From 8ef5021a9d412cc017d0956db23fb4f3882c6539 Mon Sep 17 00:00:00 2001 From: Phil Burk Date: Tue, 8 Jun 2021 17:19:14 -0700 Subject: [PATCH 154/164] test: time out in patest_sine_time.c (#585) On ALSA the StreamTime was not advancing so the while() loop never exited. Now it will time out if it plays for much longer than expected without the stream time changing. Also measure timestamp latency from callback info. --- test/patest_sine_time.c | 87 ++++++++++++++++++++++------------------- 1 file changed, 46 insertions(+), 41 deletions(-) diff --git a/test/patest_sine_time.c b/test/patest_sine_time.c index c1d6097..ef28eb9 100644 --- a/test/patest_sine_time.c +++ b/test/patest_sine_time.c @@ -48,7 +48,9 @@ #include "portaudio.h" #include "pa_util.h" -#define NUM_SECONDS (8) +/* Total time. */ +#define NUM_SECONDS (8.0) +#define NUM_LOOPS (2) #define SAMPLE_RATE (44100) #define FRAMES_PER_BUFFER (64) @@ -63,7 +65,9 @@ typedef struct { double left_phase; double right_phase; + volatile PaTime latency; volatile PaTime outTime; + volatile long frameCount; } paTestData; @@ -91,6 +95,7 @@ static int patestCallback( const void *inputBuffer, void *outputBuffer, (void) inputBuffer; data->outTime = timeInfo->outputBufferDacTime; + data->latency = timeInfo->outputBufferDacTime - timeInfo->currentTime; for( i=0; ileft_phase = left_phase; data->right_phase = right_phase; + data->frameCount += framesPerBuffer; return paContinue; } @@ -113,7 +119,7 @@ static int patestCallback( const void *inputBuffer, void *outputBuffer, static void ReportStreamTime( PaStream *stream, paTestData *data ); static void ReportStreamTime( PaStream *stream, paTestData *data ) { - PaTime streamTime, latency, outTime; + PaTime streamTime, outTime; streamTime = Pa_GetStreamTime( stream ); outTime = data->outTime; @@ -123,9 +129,8 @@ static void ReportStreamTime( PaStream *stream, paTestData *data ) } else { - latency = outTime - streamTime; - printf("Stream time = %8.4f, outTime = %8.4f, latency = %8.4f\n", - streamTime, outTime, latency ); + printf("Stream time = %8.4f, outTime = %8.4f, latency = %8.4f, frames = %ld\n", + streamTime, outTime, data->latency, data->frameCount ); } fflush(stdout); } @@ -137,13 +142,13 @@ int main(void) PaStreamParameters outputParameters; PaStream *stream; PaError err; - paTestData data; + paTestData data = {0}; PaTime startTime; + long maxFrameCount; + double secondsPerLoop; printf("PortAudio Test: output sine wave. SR = %d, BufSize = %d\n", SAMPLE_RATE, FRAMES_PER_BUFFER); - data.left_phase = data.right_phase = 0; - err = Pa_Initialize(); if( err != paNoError ) goto error; @@ -168,52 +173,52 @@ int main(void) &data ); if( err != paNoError ) goto error; - /* Watch until sound is halfway finished. */ - printf("Play for %d seconds.\n", NUM_SECONDS/2 ); fflush(stdout); + for (int i = 0; i < 2; i++) { + secondsPerLoop = NUM_SECONDS / NUM_LOOPS; + /* Watch until sound loop is finished. */ + printf("Play for %3.1f seconds.\n", secondsPerLoop); fflush(stdout); - data.outTime = -1.0; /* mark time for callback as undefined */ - err = Pa_StartStream( stream ); - if( err != paNoError ) goto error; + data.outTime = -1.0; /* mark time for callback as undefined */ + data.frameCount = 0; + err = Pa_StartStream( stream ); + if( err != paNoError ) goto error; - startTime = Pa_GetStreamTime( stream ); + /* Record time at start so we can stop after a few seconds. */ + startTime = Pa_GetStreamTime( stream ); + maxFrameCount = SAMPLE_RATE * (secondsPerLoop + 2); /* Longer than expected. */ + do + { + ReportStreamTime( stream, &data ); + Pa_Sleep(100); + /* Check the frameCount in case the StreamTime is dead. */ + if ( data.frameCount > maxFrameCount ) { + fprintf( stderr, "Time not advancing fast enough!\n" ); + err = paTimedOut; + goto error; + } + } while( (Pa_GetStreamTime( stream ) - startTime) < secondsPerLoop ); - do - { - ReportStreamTime( stream, &data ); - Pa_Sleep(100); - } while( (Pa_GetStreamTime( stream ) - startTime) < (NUM_SECONDS/2) ); + /* Stop sound for 2 seconds. */ + err = Pa_StopStream( stream ); + if( err != paNoError ) goto error; - /* Stop sound for 2 seconds. */ - err = Pa_StopStream( stream ); - if( err != paNoError ) goto error; - - printf("Pause for 2 seconds.\n"); fflush(stdout); - Pa_Sleep( 2000 ); - - data.outTime = -1.0; /* mark time for callback as undefined */ - err = Pa_StartStream( stream ); - if( err != paNoError ) goto error; - - startTime = Pa_GetStreamTime( stream ); - - printf("Play until sound is finished.\n"); fflush(stdout); - do - { - ReportStreamTime( stream, &data ); - Pa_Sleep(100); - } while( (Pa_GetStreamTime( stream ) - startTime) < (NUM_SECONDS/2) ); + if (i < (NUM_LOOPS - 1)) + printf("Pause for 2 seconds.\n"); fflush(stdout); + Pa_Sleep( 2000 ); + } err = Pa_CloseStream( stream ); if( err != paNoError ) goto error; Pa_Terminate(); - printf("Test finished.\n"); - return err; + printf("Test PASSED.\n"); + return 0; error: Pa_Terminate(); fprintf( stderr, "An error occurred while using the portaudio stream\n" ); fprintf( stderr, "Error number: %d\n", err ); fprintf( stderr, "Error message: %s\n", Pa_GetErrorText( err ) ); - return err; + printf("Test FAILED.\n"); + return 1; } From 8124f82f5c59f82e504838c0f677f2a5d88e4cd0 Mon Sep 17 00:00:00 2001 From: Phil Burk Date: Tue, 8 Jun 2021 17:19:44 -0700 Subject: [PATCH 155/164] alsa: init stream variable in pa_linux_alsa.c (#584) Prevent compiler warnings. Alternative to #567 --- src/hostapi/alsa/pa_linux_alsa.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/hostapi/alsa/pa_linux_alsa.c b/src/hostapi/alsa/pa_linux_alsa.c index a6d2aec..cf01f47 100644 --- a/src/hostapi/alsa/pa_linux_alsa.c +++ b/src/hostapi/alsa/pa_linux_alsa.c @@ -4635,6 +4635,7 @@ PaError PaAlsa_GetStreamInputCard( PaStream* s, int* card ) PaError result = paNoError; snd_pcm_info_t* pcmInfo; + stream = NULL; PA_ENSURE( GetAlsaStreamPointer( s, &stream ) ); /* XXX: More descriptive error? */ @@ -4654,6 +4655,7 @@ PaError PaAlsa_GetStreamOutputCard( PaStream* s, int* card ) PaError result = paNoError; snd_pcm_info_t* pcmInfo; + stream = NULL; PA_ENSURE( GetAlsaStreamPointer( s, &stream ) ); /* XXX: More descriptive error? */ From 52a78c72f3be6d2d538dc2b662ccadff7d1027de Mon Sep 17 00:00:00 2001 From: John Melas Date: Wed, 9 Jun 2021 03:43:40 +0300 Subject: [PATCH 156/164] Unify windows error processing into a single PaWinUtil_SetLastSystemErrorInfo function (#495) --- CMakeLists.txt | 1 + src/hostapi/asio/pa_asio.cpp | 14 +------ src/hostapi/dsound/pa_win_ds.c | 8 +++- src/hostapi/wmme/pa_win_wmme.c | 14 +------ src/os/win/pa_win_coinitialize.c | 17 +-------- src/os/win/pa_win_util.c | 17 +++++++++ src/os/win/pa_win_util.h | 64 ++++++++++++++++++++++++++++++++ 7 files changed, 95 insertions(+), 40 deletions(-) create mode 100644 src/os/win/pa_win_util.h diff --git a/CMakeLists.txt b/CMakeLists.txt index f342252..3c90862 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -126,6 +126,7 @@ IF(WIN32) src/os/win/pa_win_wdmks_utils.c src/os/win/pa_win_coinitialize.c) SET(PA_PLATFORM_INCLUDES + src/os/win/pa_win_util.h src/os/win/pa_win_coinitialize.h src/os/win/pa_win_wdmks_utils.h) diff --git a/src/hostapi/asio/pa_asio.cpp b/src/hostapi/asio/pa_asio.cpp index bc5f0e4..16448d2 100644 --- a/src/hostapi/asio/pa_asio.cpp +++ b/src/hostapi/asio/pa_asio.cpp @@ -102,6 +102,7 @@ #include "pa_ringbuffer.h" #include "pa_win_coinitialize.h" +#include "pa_win_util.h" /* This version of pa_asio.cpp is currently only targeted at Win32, It would require a few tweaks to work with pre-OS X Macintosh. @@ -214,18 +215,7 @@ static ASIOCallbacks asioCallbacks_ = static void PaAsio_SetLastSystemError( DWORD errorCode ) { - LPVOID lpMsgBuf; - FormatMessage( - FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, - NULL, - errorCode, - MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), - (LPTSTR) &lpMsgBuf, - 0, - NULL - ); - PaUtil_SetLastHostErrorInfo( paASIO, errorCode, (const char*)lpMsgBuf ); - LocalFree( lpMsgBuf ); + PaWinUtil_SetLastSystemErrorInfo( paASIO, errorCode ); } #define PA_ASIO_SET_LAST_SYSTEM_ERROR( errorCode ) \ diff --git a/src/hostapi/dsound/pa_win_ds.c b/src/hostapi/dsound/pa_win_ds.c index 2ccb4f8..46587f9 100644 --- a/src/hostapi/dsound/pa_win_ds.c +++ b/src/hostapi/dsound/pa_win_ds.c @@ -83,6 +83,7 @@ #include "pa_process.h" #include "pa_debugprint.h" +#include "pa_win_util.h" #include "pa_win_ds.h" #include "pa_win_ds_dynlink.h" #include "pa_win_waveformat.h" @@ -203,9 +204,14 @@ static signed long GetStreamReadAvailable( PaStream* stream ); static signed long GetStreamWriteAvailable( PaStream* stream ); -/* FIXME: should convert hr to a string */ +#if _WIN32_WINNT >= 0x0602 // Windows 8 and above +#define PA_DS_SET_LAST_DIRECTSOUND_ERROR( hr ) \ + PaWinUtil_SetLastSystemErrorInfo( paDirectSound, hr ) +#else +/* FIXME: should use DXGetErrorString/DXGetErrorDescription for Windows 7 and below */ #define PA_DS_SET_LAST_DIRECTSOUND_ERROR( hr ) \ PaUtil_SetLastHostErrorInfo( paDirectSound, hr, "DirectSound error" ) +#endif /************************************************* DX Prototypes **********/ static BOOL CALLBACK CollectGUIDsProcW(LPGUID lpGUID, diff --git a/src/hostapi/wmme/pa_win_wmme.c b/src/hostapi/wmme/pa_win_wmme.c index 1d928eb..42a6601 100644 --- a/src/hostapi/wmme/pa_win_wmme.c +++ b/src/hostapi/wmme/pa_win_wmme.c @@ -112,6 +112,7 @@ #include "pa_win_wmme.h" #include "pa_win_waveformat.h" +#include "pa_win_util.h" #ifdef PAWIN_USE_WDMKS_DEVICE_INFO #include "pa_win_wdmks_utils.h" @@ -313,18 +314,7 @@ static signed long GetStreamWriteAvailable( PaStream* stream ); static void PaMme_SetLastSystemError( DWORD errorCode ) { - char *lpMsgBuf; - FormatMessage( - FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, - NULL, - errorCode, - MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), - (LPTSTR) &lpMsgBuf, - 0, - NULL - ); - PaUtil_SetLastHostErrorInfo( paMME, errorCode, lpMsgBuf ); - LocalFree( lpMsgBuf ); + PaWinUtil_SetLastSystemErrorInfo( paMME, errorCode ); } #define PA_MME_SET_LAST_SYSTEM_ERROR( errorCode ) \ diff --git a/src/os/win/pa_win_coinitialize.c b/src/os/win/pa_win_coinitialize.c index cdb1fb9..6012473 100644 --- a/src/os/win/pa_win_coinitialize.c +++ b/src/os/win/pa_win_coinitialize.c @@ -50,7 +50,7 @@ #include "pa_debugprint.h" #include "pa_win_coinitialize.h" - +#include "pa_win_util.h" #if (defined(WIN32) && (defined(_MSC_VER) && (_MSC_VER >= 1200))) && !defined(_WIN32_WCE) && !(defined(WINAPI_FAMILY) && (WINAPI_FAMILY == WINAPI_FAMILY_APP)) /* MSC version 6 and above */ #pragma comment( lib, "ole32.lib" ) @@ -88,20 +88,7 @@ PaError PaWinUtil_CoInitialize( PaHostApiTypeId hostApiType, PaWinUtilComInitial if( hr == E_OUTOFMEMORY ) return paInsufficientMemory; - { - char *lpMsgBuf; - FormatMessage( - FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, - NULL, - hr, - MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), - (LPTSTR) &lpMsgBuf, - 0, - NULL - ); - PaUtil_SetLastHostErrorInfo( hostApiType, hr, lpMsgBuf ); - LocalFree( lpMsgBuf ); - } + PaWinUtil_SetLastSystemErrorInfo( hostApiType, hr ); return paUnanticipatedHostError; } diff --git a/src/os/win/pa_win_util.c b/src/os/win/pa_win_util.c index b86f7af..32d13b4 100644 --- a/src/os/win/pa_win_util.c +++ b/src/os/win/pa_win_util.c @@ -158,3 +158,20 @@ double PaUtil_GetTime( void ) #endif } } + +void PaWinUtil_SetLastSystemErrorInfo( PaHostApiTypeId hostApiType, long winError ) +{ + wchar_t wide_msg[1024]; //PA_LAST_HOST_ERROR_TEXT_LENGTH_ + FormatMessageW( + FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, + winError, + MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), + wide_msg, + 1024, + NULL + ); + char msg[1024]; + WideCharToMultiByte( CP_UTF8, 0, wide_msg, -1, msg, 1024, NULL, NULL ); + PaUtil_SetLastHostErrorInfo( hostApiType, winError, msg ); +} diff --git a/src/os/win/pa_win_util.h b/src/os/win/pa_win_util.h new file mode 100644 index 0000000..4875dd1 --- /dev/null +++ b/src/os/win/pa_win_util.h @@ -0,0 +1,64 @@ +#ifndef PA_WIN_UTIL_H +#define PA_WIN_UTIL_H + +/* + * $Id$ + * Portable Audio I/O Library + * Win32 platform-specific support functions + * + * Based on the Open Source API proposed by Ross Bencina + * Copyright (c) 1999-2008 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. + * + * 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. + */ + +/* + * The text above constitutes the entire PortAudio license; however, + * the PortAudio community also makes the following non-binding requests: + * + * 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. It is also + * requested that these non-binding requests be included along with the + * license above. + */ + +#include "portaudio.h" + +#ifdef __cplusplus +extern "C" +{ +#endif /* __cplusplus */ + +/** + Convert a Windows error code into a PaError. Sets the host-api specific error + information if needed. + + @param hostApiType The calling host api type. Used when reporting paUnanticipatedHostError + + @param winError A Windows error code. +*/ +void PaWinUtil_SetLastSystemErrorInfo( PaHostApiTypeId hostApiType, long winError ); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* PA_WIN_UTIL_H */ From d859f7d5df98253e9eb16acf201e3551dd01134f Mon Sep 17 00:00:00 2001 From: Trent Piepho <35062987+xyzzy42@users.noreply.github.com> Date: Tue, 8 Jun 2021 17:52:32 -0700 Subject: [PATCH 157/164] Have PaUtil_GetTime() use monotonic time on Unix (#559) The currently used clock, CLOCK_REALTIME, will have discontinuous jumps, forward and backward, when the system clock is adjusted. This is bad for synchronizing audio. CLOCK_MONOTONIC does not have jumps, and never moves backward, but does have the continuous adjustments done by NTP to increase clock accuracy. Since kernel 2.6.25 ALSA has use CLOCK_MONOTONIC by default for timestamps (commit b751eef1 from Dec 13 2007). This change means the timestamps provided in the PA callbacks can be compared to PaUtil_GetTime(), which currently does not work. The function used on MacOS, mach_absolute_time(), behaves like CLOCK_MONOTONIC. If the system does not have CLOCK_MONOTONIC, fallback to CLOCK_REALTIME, which is what alsa-lib does for such systems. Which at this point would need to be very old. * Use clock monotonic for condition variable This is necessary to match PaUtil_GetTime() also using the monotonic clock. Otherwise the wait time, derived from that function, will be completely incorrect. This will also fix an obscure flaw if the system clock is adjust while waiting for the stream to open, it might not wait at all and fail or wait (effectively) forever instead of timing out, depend on the adjustment direction. --- src/os/unix/pa_unix_util.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/os/unix/pa_unix_util.c b/src/os/unix/pa_unix_util.c index 459b2be..f234c64 100644 --- a/src/os/unix/pa_unix_util.c +++ b/src/os/unix/pa_unix_util.c @@ -160,7 +160,11 @@ PaTime PaUtil_GetTime( void ) return mach_absolute_time() * machSecondsConversionScaler_; #elif defined(HAVE_CLOCK_GETTIME) struct timespec tp; +#if defined(CLOCK_MONOTONIC) + clock_gettime(CLOCK_MONOTONIC, &tp); +#else clock_gettime(CLOCK_REALTIME, &tp); +#endif return (PaTime)(tp.tv_sec + tp.tv_nsec * 1e-9); #else struct timeval tv; @@ -270,11 +274,16 @@ PaError PaUnixThread_New( PaUnixThread* self, void* (*threadFunc)( void* ), void { PaError result = paNoError; pthread_attr_t attr; + pthread_condattr_t cattr; int started = 0; memset( self, 0, sizeof (PaUnixThread) ); PaUnixMutex_Initialize( &self->mtx ); - PA_ASSERT_CALL( pthread_cond_init( &self->cond, NULL ), 0 ); + PA_ASSERT_CALL( pthread_condattr_init( &cattr ), 0 ); +#if defined(CLOCK_MONOTONIC) && !defined(__APPLE__) + PA_ASSERT_CALL( pthread_condattr_setclock( &cattr, CLOCK_MONOTONIC ), 0 ); +#endif + PA_ASSERT_CALL( pthread_cond_init( &self->cond, &cattr), 0 ); self->parentWaiting = 0 != waitForChild; From 038a696aecffa3218589cf808cef0138e3bcc372 Mon Sep 17 00:00:00 2001 From: John Melas Date: Wed, 23 Jun 2021 03:15:57 +0300 Subject: [PATCH 158/164] pa_win_wmme.c: replace LPCTSTR with LPCWSTR (#597) --- src/hostapi/wmme/pa_win_wmme.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/hostapi/wmme/pa_win_wmme.c b/src/hostapi/wmme/pa_win_wmme.c index 42a6601..22af147 100644 --- a/src/hostapi/wmme/pa_win_wmme.c +++ b/src/hostapi/wmme/pa_win_wmme.c @@ -329,13 +329,13 @@ static PaError CreateEventWithPaError( HANDLE *handle, LPSECURITY_ATTRIBUTES lpEventAttributes, BOOL bManualReset, BOOL bInitialState, - LPCTSTR lpName ) + LPCWSTR lpName ) { PaError result = paNoError; *handle = NULL; - *handle = CreateEvent( lpEventAttributes, bManualReset, bInitialState, lpName ); + *handle = CreateEventW( lpEventAttributes, bManualReset, bInitialState, lpName ); if( *handle == NULL ) { result = paUnanticipatedHostError; From 16884fc2019cd8b269eac000db9e2bd938f89a85 Mon Sep 17 00:00:00 2001 From: John Melas Date: Thu, 1 Jul 2021 03:19:21 +0300 Subject: [PATCH 159/164] Unify all stringizing macros to new PA_STRINGIZE macro in pa_util.h (#605) --- src/common/pa_front.c | 9 +++------ src/common/pa_util.h | 7 +++++++ src/hostapi/alsa/pa_linux_alsa.c | 2 +- src/hostapi/asihpi/pa_linux_asihpi.c | 6 +++--- src/hostapi/jack/pa_jack.c | 7 ++----- src/hostapi/oss/pa_unix_oss.c | 2 +- src/os/unix/pa_unix_util.h | 10 ++++------ 7 files changed, 21 insertions(+), 22 deletions(-) diff --git a/src/common/pa_front.c b/src/common/pa_front.c index 65a656f..8da873a 100644 --- a/src/common/pa_front.c +++ b/src/common/pa_front.c @@ -106,11 +106,8 @@ */ #define paVersion paMakeVersionNumber(paVersionMajor, paVersionMinor, paVersionSubMinor) -#define STRINGIFY(x) #x -#define TOSTRING(x) STRINGIFY(x) - -#define PA_VERSION_STRING_ TOSTRING(paVersionMajor) "." TOSTRING(paVersionMinor) "." TOSTRING(paVersionSubMinor) -#define PA_VERSION_TEXT_ "PortAudio V" PA_VERSION_STRING_ "-devel, revision " TOSTRING(PA_GIT_REVISION) +#define PA_VERSION_STRING_ PA_STRINGIZE(paVersionMajor) "." PA_STRINGIZE(paVersionMinor) "." PA_STRINGIZE(paVersionSubMinor) +#define PA_VERSION_TEXT_ "PortAudio V" PA_VERSION_STRING_ "-devel, revision " PA_STRINGIZE(PA_GIT_REVISION) int Pa_GetVersion( void ) { @@ -126,7 +123,7 @@ static PaVersionInfo versionInfo_ = { /*.versionMajor =*/ paVersionMajor, /*.versionMinor =*/ paVersionMinor, /*.versionSubMinor =*/ paVersionSubMinor, - /*.versionControlRevision =*/ TOSTRING(PA_GIT_REVISION), + /*.versionControlRevision =*/ PA_STRINGIZE(PA_GIT_REVISION), /*.versionText =*/ PA_VERSION_TEXT_ }; diff --git a/src/common/pa_util.h b/src/common/pa_util.h index 08dc0ec..e6c1786 100644 --- a/src/common/pa_util.h +++ b/src/common/pa_util.h @@ -51,6 +51,13 @@ #include "portaudio.h" +/** Preprocessor Utilities +*/ + +#define PA_STRINGIZE_HELPER(x) #x +#define PA_STRINGIZE(x) PA_STRINGIZE_HELPER(x) + + #ifdef __cplusplus extern "C" { diff --git a/src/hostapi/alsa/pa_linux_alsa.c b/src/hostapi/alsa/pa_linux_alsa.c index cf01f47..f9fc0ac 100644 --- a/src/hostapi/alsa/pa_linux_alsa.c +++ b/src/hostapi/alsa/pa_linux_alsa.c @@ -575,7 +575,7 @@ static void PaAlsa_CloseLibrary() { \ PaUtil_SetLastHostErrorInfo( paALSA, __pa_unsure_error_id, alsa_snd_strerror( __pa_unsure_error_id ) ); \ } \ - PaUtil_DebugPrint( "Expression '" #expr "' failed in '" __FILE__ "', line: " STRINGIZE( __LINE__ ) "\n" ); \ + PaUtil_DebugPrint( "Expression '" #expr "' failed in '" __FILE__ "', line: " PA_STRINGIZE( __LINE__ ) "\n" ); \ if( (code) == paUnanticipatedHostError ) \ PA_DEBUG(( "Host error description: %s\n", alsa_snd_strerror( __pa_unsure_error_id ) )); \ result = (code); \ diff --git a/src/hostapi/asihpi/pa_linux_asihpi.c b/src/hostapi/asihpi/pa_linux_asihpi.c index 79eb1d7..3be64ad 100644 --- a/src/hostapi/asihpi/pa_linux_asihpi.c +++ b/src/hostapi/asihpi/pa_linux_asihpi.c @@ -175,7 +175,7 @@ PaError paError = (expr); \ if( UNLIKELY( paError < paNoError ) ) \ { \ - PA_DEBUG(( "Expression '" #expr "' failed in '" __FILE__ "', line: " STRINGIZE( __LINE__ ) "\n" )); \ + PA_DEBUG(( "Expression '" #expr "' failed in '" __FILE__ "', line: " PA_STRINGIZE( __LINE__ ) "\n" )); \ result = paError; \ goto error; \ } \ @@ -186,7 +186,7 @@ do { \ if( UNLIKELY( (expr) == 0 ) ) \ { \ - PA_DEBUG(( "Expression '" #expr "' failed in '" __FILE__ "', line: " STRINGIZE( __LINE__ ) "\n" )); \ + PA_DEBUG(( "Expression '" #expr "' failed in '" __FILE__ "', line: " PA_STRINGIZE( __LINE__ ) "\n" )); \ result = (paError); \ goto error; \ } \ @@ -203,7 +203,7 @@ HPI_GetErrorText( hpiError, szError ); \ PA_DEBUG(( "HPI error %d occurred: %s\n", hpiError, szError )); \ /* This message will always be displayed, even if debug info is disabled */ \ - PA_DEBUG(( "Expression '" #expr "' failed in '" __FILE__ "', line: " STRINGIZE( __LINE__ ) "\n" )); \ + PA_DEBUG(( "Expression '" #expr "' failed in '" __FILE__ "', line: " PA_STRINGIZE( __LINE__ ) "\n" )); \ if( (paError) == paUnanticipatedHostError ) \ { \ PA_DEBUG(( "Host error description: %s\n", szError )); \ diff --git a/src/hostapi/jack/pa_jack.c b/src/hostapi/jack/pa_jack.c index 124c0f8..a166736 100644 --- a/src/hostapi/jack/pa_jack.c +++ b/src/hostapi/jack/pa_jack.c @@ -78,9 +78,6 @@ static char *jackErr_ = NULL; static const char* clientName_ = "PortAudio"; static const char* port_regex_suffix = ":.*"; -#define STRINGIZE_HELPER(expr) #expr -#define STRINGIZE(expr) STRINGIZE_HELPER(expr) - /* Check PaError */ #define ENSURE_PA(expr) \ do { \ @@ -93,7 +90,7 @@ static const char* port_regex_suffix = ":.*"; if (! err ) err = "unknown error"; \ PaUtil_SetLastHostErrorInfo( paJACK, -1, err ); \ } \ - PaUtil_DebugPrint(( "Expression '" #expr "' failed in '" __FILE__ "', line: " STRINGIZE( __LINE__ ) "\n" )); \ + PaUtil_DebugPrint(( "Expression '" #expr "' failed in '" __FILE__ "', line: " PA_STRINGIZE( __LINE__ ) "\n" )); \ result = paErr; \ goto error; \ } \ @@ -109,7 +106,7 @@ static const char* port_regex_suffix = ":.*"; if (!err) err = "unknown error"; \ PaUtil_SetLastHostErrorInfo( paJACK, -1, err ); \ } \ - PaUtil_DebugPrint(( "Expression '" #expr "' failed in '" __FILE__ "', line: " STRINGIZE( __LINE__ ) "\n" )); \ + PaUtil_DebugPrint(( "Expression '" #expr "' failed in '" __FILE__ "', line: " PA_STRINGIZE( __LINE__ ) "\n" )); \ result = (code); \ goto error; \ } \ diff --git a/src/hostapi/oss/pa_unix_oss.c b/src/hostapi/oss/pa_unix_oss.c index 20113e2..9d1f1de 100644 --- a/src/hostapi/oss/pa_unix_oss.c +++ b/src/hostapi/oss/pa_unix_oss.c @@ -104,7 +104,7 @@ static pthread_t mainThread_; PaUtil_SetLastHostErrorInfo( paOSS, sysErr_, strerror( errno ) ); \ } \ \ - PaUtil_DebugPrint(( "Expression '" #expr "' failed in '" __FILE__ "', line: " STRINGIZE( __LINE__ ) "\n" )); \ + PaUtil_DebugPrint(( "Expression '" #expr "' failed in '" __FILE__ "', line: " PA_STRINGIZE( __LINE__ ) "\n" )); \ result = (code); \ goto error; \ } \ diff --git a/src/os/unix/pa_unix_util.h b/src/os/unix/pa_unix_util.h index 2228cb3..cc2fc04 100644 --- a/src/os/unix/pa_unix_util.h +++ b/src/os/unix/pa_unix_util.h @@ -44,6 +44,7 @@ #ifndef PA_UNIX_UTIL_H #define PA_UNIX_UTIL_H +#include "pa_util.h" #include "pa_cpuload.h" #include #include @@ -64,14 +65,11 @@ extern "C" #define UNLIKELY(expr) (expr) #endif -#define STRINGIZE_HELPER(expr) #expr -#define STRINGIZE(expr) STRINGIZE_HELPER(expr) - #define PA_UNLESS(expr, code) \ do { \ if( UNLIKELY( (expr) == 0 ) ) \ { \ - PaUtil_DebugPrint(( "Expression '" #expr "' failed in '" __FILE__ "', line: " STRINGIZE( __LINE__ ) "\n" )); \ + PaUtil_DebugPrint(( "Expression '" #expr "' failed in '" __FILE__ "', line: " PA_STRINGIZE( __LINE__ ) "\n" )); \ result = (code); \ goto error; \ } \ @@ -84,7 +82,7 @@ static PaError paUtilErr_; /* Used with PA_ENSURE */ do { \ if( UNLIKELY( (paUtilErr_ = (expr)) < paNoError ) ) \ { \ - PaUtil_DebugPrint(( "Expression '" #expr "' failed in '" __FILE__ "', line: " STRINGIZE( __LINE__ ) "\n" )); \ + PaUtil_DebugPrint(( "Expression '" #expr "' failed in '" __FILE__ "', line: " PA_STRINGIZE( __LINE__ ) "\n" )); \ result = paUtilErr_; \ goto error; \ } \ @@ -103,7 +101,7 @@ static PaError paUtilErr_; /* Used with PA_ENSURE */ { \ PaUtil_SetLastHostErrorInfo( paALSA, paUtilErr_, strerror( paUtilErr_ ) ); \ } \ - PaUtil_DebugPrint( "Expression '" #expr "' failed in '" __FILE__ "', line: " STRINGIZE( __LINE__ ) "\n" ); \ + PaUtil_DebugPrint( "Expression '" #expr "' failed in '" __FILE__ "', line: " PA_STRINGIZE( __LINE__ ) "\n" ); \ result = paUnanticipatedHostError; \ goto error; \ } \ From 1f01a3ddc05df7ee3bb3cad5ef960d335aff018b Mon Sep 17 00:00:00 2001 From: Andrew Gundersen Date: Fri, 20 Aug 2021 11:09:19 -0500 Subject: [PATCH 160/164] Pa_RefreshDevice functionality --- examples/paex_record_file.c | 6 +- examples/paex_refresh_devs.c | 46 +++++++++ examples/paex_sine.c | 1 + include/portaudio.h | 11 +++ src/common/pa_front.c | 49 ++++++++++ src/common/pa_hostapi.h | 2 + src/hostapi/coreaudio/pa_mac_core.c | 81 ++++++++++++++++ src/hostapi/dsound/pa_win_ds.c | 143 ++++++++++++++++++++++++++++ 8 files changed, 337 insertions(+), 2 deletions(-) create mode 100644 examples/paex_refresh_devs.c diff --git a/examples/paex_record_file.c b/examples/paex_record_file.c index 562a8e9..c437d19 100644 --- a/examples/paex_record_file.c +++ b/examples/paex_record_file.c @@ -258,7 +258,6 @@ static int recordCallback( const void *inputBuffer, void *outputBuffer, data->frameIndex += PaUtil_WriteRingBuffer(&data->ringBuffer, rptr, elementsToWrite); - return paContinue; } /* This routine will be called by the PortAudio engine when audio is needed. @@ -272,8 +271,11 @@ static int playCallback( const void *inputBuffer, void *outputBuffer, void *userData ) { paTestData *data = (paTestData*)userData; + ring_buffer_size_t elementsToPlay = PaUtil_GetRingBufferReadAvailable(&data->ringBuffer); - ring_buffer_size_t elementsToRead = rbs_min(elementsToPlay, (ring_buffer_size_t)(framesPerBuffer * NUM_CHANNELS)); + + ring_buffer_size_t elementsToRead = rbs_min( elementsToPlay, + (ring_buffer_size_t)(framesPerBuffer * NUM_CHANNELS) ); SAMPLE* wptr = (SAMPLE*)outputBuffer; (void) inputBuffer; /* Prevent unused variable warnings. */ diff --git a/examples/paex_refresh_devs.c b/examples/paex_refresh_devs.c new file mode 100644 index 0000000..c31b233 --- /dev/null +++ b/examples/paex_refresh_devs.c @@ -0,0 +1,46 @@ +#include +#include +#include +#include "portaudio.h" + +int main() +{ + PaError err = paNoError; + + PaDeviceIndex defaultOutputDevice; + PaDeviceIndex defaultInputDevice; + + err = Pa_Initialize(); + if( err != paNoError ) + { + printf( "ERROR: Pa_Initialize returned 0x%x\n", err ); + goto error; + } + + printf( "PortAudio version: 0x%08X\n", Pa_GetVersion()); + // printf( "Version text: '%s'\n", Pa_GetVersionInfo()->versionText ); + + const int count = 20; + for (int i = 0; i < count; ++i) + { + defaultInputDevice = Pa_GetDefaultInputDevice(); + defaultOutputDevice = Pa_GetDefaultOutputDevice(); + printf("Input: %i, Output: %i\n", defaultInputDevice, defaultOutputDevice); + + err = Pa_RefreshDevices(); + if( err != paNoError ) + { + printf( "ERROR: Pa_RefreshDevices returned 0x%x\n", err ); + goto error; + } + + sleep(2); + } + + Pa_Terminate(); + + printf("----------------------------------------------\n"); + return 0; +error: + return 1; +} \ No newline at end of file diff --git a/examples/paex_sine.c b/examples/paex_sine.c index 50ef205..99ae625 100644 --- a/examples/paex_sine.c +++ b/examples/paex_sine.c @@ -154,6 +154,7 @@ int main(void) if( err != paNoError ) goto error; printf("Play for %d seconds.\n", NUM_SECONDS ); + Pa_Sleep( NUM_SECONDS * 1000 ); err = Pa_StopStream( stream ); diff --git a/include/portaudio.h b/include/portaudio.h index c3e1744..8ee9289 100644 --- a/include/portaudio.h +++ b/include/portaudio.h @@ -449,6 +449,17 @@ PaDeviceIndex Pa_GetDefaultInputDevice( void ); PaDeviceIndex Pa_GetDefaultOutputDevice( void ); +/** Normally the list of devices is frozen after initialization, until the + next time port audio is re-initialized. This provides API stability but + has the side effect that hot-pluggable devices such as USB audio headsets + might not be up-to-date while the program is running. This method is used + to refresh the list of devices within port audio without closing open + streams. + @return an error code which indicates whether the device refresh was successful. + */ + PaError Pa_RefreshDevices( void ); + + /** The type used to represent monotonic time in seconds. PaTime is used for the fields of the PaStreamCallbackTimeInfo argument to the PaStreamCallback and as the result of Pa_GetStreamTime(). diff --git a/src/common/pa_front.c b/src/common/pa_front.c index 8da873a..bd19cd9 100644 --- a/src/common/pa_front.c +++ b/src/common/pa_front.c @@ -743,6 +743,55 @@ PaDeviceIndex Pa_GetDefaultOutputDevice( void ) } +PaError Pa_RefreshDevices( void ) + { + int i, baseDeviceIndex; + PaError result = paNoError; + + PA_LOGAPI_ENTER( "Pa_RefreshDeviceList" ); + if( !PA_IS_INITIALISED_ ) + return paNotInitialized; + + baseDeviceIndex = 0; + deviceCount_ = 0; + + for( i=0; i < hostApisCount_; ++i ) + { + PaUtilHostApiRepresentation *hostApi = hostApis_[i]; + if( hostApi->RefreshDevices == NULL ) + { + /* RefreshDevices not yet implemented for this backend. Just + assume that the baseDeviceIndex and the deviceCount_ are + incremented according to the values in the info */ + baseDeviceIndex += hostApi->info.deviceCount; + deviceCount_ += hostApi->info.deviceCount; + continue; + } + + PA_DEBUG(( "refreshing device list for host api %d.\n",i)); + + if(( result = hostApi->RefreshDevices( hostApi, i )) != paNoError ) + return result; + + assert( hostApi->info.defaultInputDevice < hostApi->info.deviceCount ); + assert( hostApi->info.defaultOutputDevice < hostApi->info.deviceCount ); + + hostApi->privatePaFrontInfo.baseDeviceIndex = baseDeviceIndex; + + if( hostApi->info.defaultInputDevice != paNoDevice ) + hostApi->info.defaultInputDevice += baseDeviceIndex; + + if( hostApi->info.defaultOutputDevice != paNoDevice ) + hostApi->info.defaultOutputDevice += baseDeviceIndex; + + baseDeviceIndex += hostApi->info.deviceCount; + deviceCount_ += hostApi->info.deviceCount; + } + + return result; + } + + const PaDeviceInfo* Pa_GetDeviceInfo( PaDeviceIndex device ) { int hostSpecificDeviceIndex; diff --git a/src/common/pa_hostapi.h b/src/common/pa_hostapi.h index 4ac3ab6..0af8d53 100644 --- a/src/common/pa_hostapi.h +++ b/src/common/pa_hostapi.h @@ -322,6 +322,8 @@ typedef struct PaUtilHostApiRepresentation { const PaStreamParameters *inputParameters, const PaStreamParameters *outputParameters, double sampleRate ); + + PaError (*RefreshDevices)( struct PaUtilHostApiRepresentation *hostApi, PaHostApiIndex index ); } PaUtilHostApiRepresentation; diff --git a/src/hostapi/coreaudio/pa_mac_core.c b/src/hostapi/coreaudio/pa_mac_core.c index aaa5bf4..4a9172b 100644 --- a/src/hostapi/coreaudio/pa_mac_core.c +++ b/src/hostapi/coreaudio/pa_mac_core.c @@ -269,6 +269,7 @@ static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi, PaStreamFlags streamFlags, PaStreamCallback *streamCallback, void *userData ); +static PaError RefreshDevices( struct PaUtilHostApiRepresentation *hostApi, PaHostApiIndex index ); static PaError CloseStream( PaStream* stream ); static PaError StartStream( PaStream *stream ); static PaError StopStream( PaStream *stream ); @@ -820,6 +821,7 @@ PaError PaMacCore_Initialize( PaUtilHostApiRepresentation **hostApi, PaHostApiIn (*hostApi)->Terminate = Terminate; (*hostApi)->OpenStream = OpenStream; (*hostApi)->IsFormatSupported = IsFormatSupported; + (*hostApi)->RefreshDevices = RefreshDevices; PaUtil_InitializeStreamInterface( &auhalHostApi->callbackStreamInterface, CloseStream, StartStream, @@ -2096,6 +2098,85 @@ error: #define HOST_TIME_TO_PA_TIME( x ) ( AudioConvertHostTimeToNanos( (x) ) * 1.0E-09) /* convert to nanoseconds and then to seconds */ + +PaError RefreshDevices( struct PaUtilHostApiRepresentation *hostApi, PaHostApiIndex hostApiIndex ) +{ + PaMacAUHAL *auhalHostApi = (PaMacAUHAL*)hostApi; + PaError result = paNoError; + PaDeviceInfo *deviceInfoArray; + int i; + + VVDBUG(("RefreshDevices(): hostApiIndex=%d\n", hostApiIndex)); + + auhalHostApi->devIds = NULL; + auhalHostApi->devCount = 0; + + /* get the info we need about the devices */ + result = gatherDeviceInfo( auhalHostApi ); + if( result != paNoError ) + goto error; + + hostApi->info.defaultInputDevice = paNoDevice; + hostApi->info.defaultOutputDevice = paNoDevice; + hostApi->info.deviceCount = 0; + + /* If the device infos already exist, free the old memory */ + if( hostApi->deviceInfos != NULL ) + { + PaUtil_GroupFreeMemory( auhalHostApi->allocations, hostApi->deviceInfos ); + hostApi->deviceInfos = NULL; + } + + if( auhalHostApi->devCount > 0 ) + { + hostApi->deviceInfos = (PaDeviceInfo**)PaUtil_GroupAllocateMemory( + auhalHostApi->allocations, sizeof(PaDeviceInfo*) * auhalHostApi->devCount); + if( !hostApi->deviceInfos ) + { + result = paInsufficientMemory; + goto error; + } + + /* allocate all device info structs in a contiguous block */ + deviceInfoArray = (PaDeviceInfo*)PaUtil_GroupAllocateMemory( + auhalHostApi->allocations, sizeof(PaDeviceInfo) * auhalHostApi->devCount ); + if( !deviceInfoArray ) + { + result = paInsufficientMemory; + goto error; + } + + for( i=0; i < auhalHostApi->devCount; ++i ) + { + int err; + err = InitializeDeviceInfo( auhalHostApi, &deviceInfoArray[i], + auhalHostApi->devIds[i], + hostApiIndex ); + if (err == paNoError) + { /* copy some info and set the defaults */ + hostApi->deviceInfos[hostApi->info.deviceCount] = &deviceInfoArray[i]; + if (auhalHostApi->devIds[i] == auhalHostApi->defaultIn) + hostApi->info.defaultInputDevice = hostApi->info.deviceCount; + if (auhalHostApi->devIds[i] == auhalHostApi->defaultOut) + hostApi->info.defaultOutputDevice = hostApi->info.deviceCount; + hostApi->info.deviceCount++; + } + else + { /* there was an error. we need to shift the devices down, so we ignore this one */ + int j; + auhalHostApi->devCount--; + for( j=i; jdevCount; ++j ) + auhalHostApi->devIds[j] = auhalHostApi->devIds[j+1]; + i--; + } + } + } + +error: + return result; +} + + PaTime GetStreamTime( PaStream *s ) { return HOST_TIME_TO_PA_TIME( AudioGetCurrentHostTime() ); diff --git a/src/hostapi/dsound/pa_win_ds.c b/src/hostapi/dsound/pa_win_ds.c index 46587f9..a554bb1 100644 --- a/src/hostapi/dsound/pa_win_ds.c +++ b/src/hostapi/dsound/pa_win_ds.c @@ -190,6 +190,7 @@ static PaError IsFormatSupported( struct PaUtilHostApiRepresentation *hostApi, const PaStreamParameters *inputParameters, const PaStreamParameters *outputParameters, double sampleRate ); +static PaError RefreshDevices( struct PaUtilHostApiRepresentation *hostApi, PaHostApiIndex index ); static PaError CloseStream( PaStream* stream ); static PaError StartStream( PaStream *stream ); static PaError StopStream( PaStream *stream ); @@ -1325,6 +1326,7 @@ PaError PaWinDs_Initialize( PaUtilHostApiRepresentation **hostApi, PaHostApiInde (*hostApi)->Terminate = Terminate; (*hostApi)->OpenStream = OpenStream; (*hostApi)->IsFormatSupported = IsFormatSupported; + (*hostApi)->RefreshDevices = RefreshDevices; PaUtil_InitializeStreamInterface( &winDsHostApi->callbackStreamInterface, CloseStream, StartStream, StopStream, AbortStream, IsStreamStopped, IsStreamActive, @@ -1488,6 +1490,147 @@ static PaError IsFormatSupported( struct PaUtilHostApiRepresentation *hostApi, } +/***********************************************************************************/ +static PaError RefreshDevices( struct PaUtilHostApiRepresentation *hostApi, PaHostApiIndex hostApiIndex ) +{ + PaWinDsHostApiRepresentation *winDsHostApi = (PaWinDsHostApiRepresentation*)hostApi; + DSDeviceNamesAndGUIDs deviceNamesAndGUIDs; + PaWinDsDeviceInfo *deviceInfoArray; + int i = 0, deviceCount = 0; + char comWasInitialized = winDsHostApi->comWasInitialized; + PaError result = paNoError; + + if( !comWasInitialized ) + return paInternalError; + + /* initialise guid vectors so they can be safely deleted on error */ + deviceNamesAndGUIDs.winDsHostApi = NULL; + deviceNamesAndGUIDs.inputNamesAndGUIDs.items = NULL; + deviceNamesAndGUIDs.outputNamesAndGUIDs.items = NULL; + + hostApi->info.deviceCount = 0; + hostApi->info.defaultInputDevice = paNoDevice; + hostApi->info.defaultOutputDevice = paNoDevice; + + /* DSound - enumerate devices to count them and to gather their GUIDs */ + result = InitializeDSDeviceNameAndGUIDVector( &deviceNamesAndGUIDs.inputNamesAndGUIDs, winDsHostApi->allocations ); + if( result != paNoError ) + goto error; + + result = InitializeDSDeviceNameAndGUIDVector( &deviceNamesAndGUIDs.outputNamesAndGUIDs, winDsHostApi->allocations ); + if( result != paNoError ) + goto error; + + paWinDsDSoundEntryPoints.DirectSoundCaptureEnumerateA( (LPDSENUMCALLBACK)CollectGUIDsProc, (void *)&deviceNamesAndGUIDs.inputNamesAndGUIDs ); + paWinDsDSoundEntryPoints.DirectSoundEnumerateA( (LPDSENUMCALLBACK)CollectGUIDsProc, (void *)&deviceNamesAndGUIDs.outputNamesAndGUIDs ); + + if( deviceNamesAndGUIDs.inputNamesAndGUIDs.enumerationError != paNoError ) + { + result = deviceNamesAndGUIDs.inputNamesAndGUIDs.enumerationError; + goto error; + } + + if( deviceNamesAndGUIDs.outputNamesAndGUIDs.enumerationError != paNoError ) + { + result = deviceNamesAndGUIDs.outputNamesAndGUIDs.enumerationError; + goto error; + } + + /* Free any old memory which might be in the device info */ + if( hostApi->deviceInfos ) + { + PaUtil_GroupFreeMemory( winDsHostApi->allocations, hostApi->deviceInfos ); + hostApi->deviceInfos = NULL; + } + + deviceCount = deviceNamesAndGUIDs.inputNamesAndGUIDs.count + deviceNamesAndGUIDs.outputNamesAndGUIDs.count; + +#ifdef PAWIN_USE_WDMKS_DEVICE_INFO + if( deviceCount > 0 ) + { + deviceNamesAndGUIDs.winDsHostApi = winDsHostApi; + FindDevicePnpInterfaces( &deviceNamesAndGUIDs ); + } +#endif /* PAWIN_USE_WDMKS_DEVICE_INFO */ + + if( deviceCount > 0 ) + { + /* allocate array for pointers to PaDeviceInfo structs */ + hostApi->deviceInfos = (PaDeviceInfo**)PaUtil_GroupAllocateMemory( + winDsHostApi->allocations, sizeof(PaDeviceInfo*) * deviceCount ); + if( !hostApi->deviceInfos ) + { + result = paInsufficientMemory; + goto error; + } + + /* allocate all PaDeviceInfo structs in a contiguous block */ + deviceInfoArray = (PaWinDsDeviceInfo*)PaUtil_GroupAllocateMemory( + winDsHostApi->allocations, sizeof(PaWinDsDeviceInfo) * deviceCount ); + if( !deviceInfoArray ) + { + result = paInsufficientMemory; + goto error; + } + + for( i=0; i < deviceCount; ++i ) + { + PaDeviceInfo *deviceInfo = &deviceInfoArray[i].inheritedDeviceInfo; + deviceInfo->structVersion = 2; + deviceInfo->hostApi = hostApiIndex; + deviceInfo->name = 0; + hostApi->deviceInfos[i] = deviceInfo; + } + + for( i=0; i < deviceNamesAndGUIDs.inputNamesAndGUIDs.count; ++i ) + { + result = AddInputDeviceInfoFromDirectSoundCapture( winDsHostApi, + deviceNamesAndGUIDs.inputNamesAndGUIDs.items[i].name, + deviceNamesAndGUIDs.inputNamesAndGUIDs.items[i].lpGUID, + deviceNamesAndGUIDs.inputNamesAndGUIDs.items[i].pnpInterface ); + if( result != paNoError ) + goto error; + } + + for( i=0; i < deviceNamesAndGUIDs.outputNamesAndGUIDs.count; ++i ) + { + result = AddOutputDeviceInfoFromDirectSound( winDsHostApi, + deviceNamesAndGUIDs.outputNamesAndGUIDs.items[i].name, + deviceNamesAndGUIDs.outputNamesAndGUIDs.items[i].lpGUID, + deviceNamesAndGUIDs.outputNamesAndGUIDs.items[i].pnpInterface ); + if( result != paNoError ) + goto error; + } + } + + result = TerminateDSDeviceNameAndGUIDVector( &deviceNamesAndGUIDs.inputNamesAndGUIDs ); + if( result != paNoError ) + goto error; + + result = TerminateDSDeviceNameAndGUIDVector( &deviceNamesAndGUIDs.outputNamesAndGUIDs ); + if( result != paNoError ) + goto error; + + return result; + +error: + if( winDsHostApi ) + { + if( winDsHostApi->allocations ) + { + PaUtil_FreeAllAllocations( winDsHostApi->allocations ); + PaUtil_DestroyAllocationGroup( winDsHostApi->allocations ); + } + } + + TerminateDSDeviceNameAndGUIDVector( &deviceNamesAndGUIDs.inputNamesAndGUIDs ); + TerminateDSDeviceNameAndGUIDVector( &deviceNamesAndGUIDs.outputNamesAndGUIDs ); + + + return result; +} + + #ifdef PAWIN_USE_DIRECTSOUNDFULLDUPLEXCREATE static HRESULT InitFullDuplexInputOutputBuffers( PaWinDsStream *stream, PaWinDsDeviceInfo *inputDevice, From 3958fef3eb817ce3f19104d5fb0a7ffb884f16e7 Mon Sep 17 00:00:00 2001 From: Andrew Gundersen Date: Mon, 7 Mar 2022 16:22:50 -0600 Subject: [PATCH 161/164] Updating ReadMe --- README.md | 11 + aclocal.m4 | 2944 ++-- bindings/cpp/INSTALL | 318 +- bindings/cpp/Makefile.in | 108 +- bindings/cpp/aclocal.m4 | 2953 ++-- bindings/cpp/autom4te.cache/output.0 | 19379 ++++++++++++++++++++++++ bindings/cpp/autom4te.cache/output.1 | 19375 ++++++++++++++++++++++++ bindings/cpp/autom4te.cache/output.2 | 19376 ++++++++++++++++++++++++ bindings/cpp/autom4te.cache/requests | 382 + bindings/cpp/autom4te.cache/traces.0 | 2802 ++++ bindings/cpp/autom4te.cache/traces.1 | 618 + bindings/cpp/autom4te.cache/traces.2 | 618 + bindings/cpp/bin/Makefile.in | 66 +- bindings/cpp/compile | 348 + bindings/cpp/config.guess | Bin 0 -> 49348 bytes bindings/cpp/config.sub | Bin 0 -> 35276 bytes bindings/cpp/configure | Bin 553237 -> 598433 bytes bindings/cpp/configure~ | 19376 ++++++++++++++++++++++++ depcomp => bindings/cpp/depcomp | Bin 23566 -> 23568 bytes bindings/cpp/doc/Makefile.in | 36 +- bindings/cpp/include/Makefile.in | 40 +- bindings/cpp/install-sh | Bin 0 -> 15358 bytes bindings/cpp/lib/Makefile.in | 133 +- bindings/cpp/ltmain.sh | 11147 ++++++++++++++ missing => bindings/cpp/missing | Bin 6872 -> 6878 bytes config.guess | Bin 45297 -> 49348 bytes config.sub | Bin 35564 -> 35276 bytes configure | Bin 574157 -> 616794 bytes configure.in | 2 +- configure~ | 20207 +++++++++++++++++++++++++ install-sh | Bin 13997 -> 15358 bytes ltmain.sh | 5610 ++++--- 32 files changed, 121037 insertions(+), 4812 deletions(-) create mode 100644 bindings/cpp/autom4te.cache/output.0 create mode 100644 bindings/cpp/autom4te.cache/output.1 create mode 100644 bindings/cpp/autom4te.cache/output.2 create mode 100644 bindings/cpp/autom4te.cache/requests create mode 100644 bindings/cpp/autom4te.cache/traces.0 create mode 100644 bindings/cpp/autom4te.cache/traces.1 create mode 100644 bindings/cpp/autom4te.cache/traces.2 create mode 100755 bindings/cpp/compile create mode 100755 bindings/cpp/config.guess create mode 100755 bindings/cpp/config.sub create mode 100644 bindings/cpp/configure~ rename depcomp => bindings/cpp/depcomp (98%) create mode 100755 bindings/cpp/install-sh create mode 100644 bindings/cpp/ltmain.sh rename missing => bindings/cpp/missing (94%) create mode 100644 configure~ diff --git a/README.md b/README.md index bf48975..ff50bfb 100644 --- a/README.md +++ b/README.md @@ -60,3 +60,14 @@ Please feel free to join. See http://www.portaudio.com for details. test/patest_sine.c = output a sine wave in a simple PA app test/patest_sync.c = test synchronization of audio and video test/patest_wire.c = pass input to output, wire simulator + +## Crimata NodeAudio + +The default build of PortAudio sets an absolute install path (rpath?) which causes issues if you want to package the .dylib in a project. To fix this, use install_name_tool to rename the binary: + + install_name_tool -id "@loader_path/libportaudio.dylib" libportaudio.dylib + +Ideally, this would be set in the build config settings of PortAudio, but I haven't figured out how to do that yet. + + + diff --git a/aclocal.m4 b/aclocal.m4 index f6850af..a982194 100644 --- a/aclocal.m4 +++ b/aclocal.m4 @@ -1,6 +1,6 @@ -# generated automatically by aclocal 1.14.1 -*- Autoconf -*- +# generated automatically by aclocal 1.16.5 -*- Autoconf -*- -# Copyright (C) 1996-2013 Free Software Foundation, Inc. +# Copyright (C) 1996-2021 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -14,9 +14,7 @@ m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])]) # libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- # -# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, -# 2006, 2007, 2008, 2009, 2010, 2011 Free Software -# Foundation, Inc. +# Copyright (C) 1996-2001, 2003-2015 Free Software Foundation, Inc. # Written by Gordon Matzigkeit, 1996 # # This file is free software; the Free Software Foundation gives @@ -24,36 +22,30 @@ m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun # modifications, as long as this notice is preserved. m4_define([_LT_COPYING], [dnl -# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, -# 2006, 2007, 2008, 2009, 2010, 2011 Free Software -# Foundation, Inc. -# Written by Gordon Matzigkeit, 1996 +# Copyright (C) 2014 Free Software Foundation, Inc. +# This is free software; see the source for copying conditions. There is NO +# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +# GNU Libtool is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of of the License, or +# (at your option) any later version. # -# This file is part of GNU Libtool. +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program or library that is built +# using GNU Libtool, you may include this file under the same +# distribution terms that you use for the rest of that program. # -# GNU Libtool is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; either version 2 of -# the License, or (at your option) any later version. -# -# As a special exception to the GNU General Public License, -# if you distribute this file as part of a program or library that -# is built using GNU Libtool, you may include this file under the -# same distribution terms that you use for the rest of that program. -# -# GNU Libtool is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of +# GNU Libtool is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License -# along with GNU Libtool; see the file COPYING. If not, a copy -# can be downloaded from http://www.gnu.org/licenses/gpl.html, or -# obtained by writing to the Free Software Foundation, Inc., -# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# along with this program. If not, see . ]) -# serial 57 LT_INIT +# serial 58 LT_INIT # LT_PREREQ(VERSION) @@ -81,7 +73,7 @@ esac # LT_INIT([OPTIONS]) # ------------------ AC_DEFUN([LT_INIT], -[AC_PREREQ([2.58])dnl We use AC_INCLUDES_DEFAULT +[AC_PREREQ([2.62])dnl We use AC_PATH_PROGS_FEATURE_CHECK AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl AC_BEFORE([$0], [LT_LANG])dnl AC_BEFORE([$0], [LT_OUTPUT])dnl @@ -105,7 +97,7 @@ dnl Parse OPTIONS _LT_SET_OPTIONS([$0], [$1]) # This can be used to rebuild libtool when needed -LIBTOOL_DEPS="$ltmain" +LIBTOOL_DEPS=$ltmain # Always use our own libtool. LIBTOOL='$(SHELL) $(top_builddir)/libtool' @@ -125,26 +117,43 @@ dnl AC_DEFUN([AC_PROG_LIBTOOL], []) dnl AC_DEFUN([AM_PROG_LIBTOOL], []) +# _LT_PREPARE_CC_BASENAME +# ----------------------- +m4_defun([_LT_PREPARE_CC_BASENAME], [ +# Calculate cc_basename. Skip known compiler wrappers and cross-prefix. +func_cc_basename () +{ + for cc_temp in @S|@*""; do + case $cc_temp in + compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;; + distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;; + \-*) ;; + *) break;; + esac + done + func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` +} +])# _LT_PREPARE_CC_BASENAME + + # _LT_CC_BASENAME(CC) # ------------------- -# Calculate cc_basename. Skip known compiler wrappers and cross-prefix. +# It would be clearer to call AC_REQUIREs from _LT_PREPARE_CC_BASENAME, +# but that macro is also expanded into generated libtool script, which +# arranges for $SED and $ECHO to be set by different means. m4_defun([_LT_CC_BASENAME], -[for cc_temp in $1""; do - case $cc_temp in - compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;; - distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;; - \-*) ;; - *) break;; - esac -done -cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` +[m4_require([_LT_PREPARE_CC_BASENAME])dnl +AC_REQUIRE([_LT_DECL_SED])dnl +AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl +func_cc_basename $1 +cc_basename=$func_cc_basename_result ]) # _LT_FILEUTILS_DEFAULTS # ---------------------- # It is okay to use these file commands and assume they have been set -# sensibly after `m4_require([_LT_FILEUTILS_DEFAULTS])'. +# sensibly after 'm4_require([_LT_FILEUTILS_DEFAULTS])'. m4_defun([_LT_FILEUTILS_DEFAULTS], [: ${CP="cp -f"} : ${MV="mv -f"} @@ -191,15 +200,16 @@ m4_require([_LT_CHECK_SHAREDLIB_FROM_LINKLIB])dnl m4_require([_LT_CMD_OLD_ARCHIVE])dnl m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl m4_require([_LT_WITH_SYSROOT])dnl +m4_require([_LT_CMD_TRUNCATE])dnl _LT_CONFIG_LIBTOOL_INIT([ -# See if we are running on zsh, and set the options which allow our +# See if we are running on zsh, and set the options that allow our # commands through without removal of \ escapes INIT. -if test -n "\${ZSH_VERSION+set}" ; then +if test -n "\${ZSH_VERSION+set}"; then setopt NO_GLOB_SUBST fi ]) -if test -n "${ZSH_VERSION+set}" ; then +if test -n "${ZSH_VERSION+set}"; then setopt NO_GLOB_SUBST fi @@ -212,7 +222,7 @@ aix3*) # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. - if test "X${COLLECT_NAMES+set}" != Xset; then + if test set != "${COLLECT_NAMES+set}"; then COLLECT_NAMES= export COLLECT_NAMES fi @@ -223,14 +233,14 @@ esac ofile=libtool can_build_shared=yes -# All known linkers require a `.a' archive for static linking (except MSVC, +# All known linkers require a '.a' archive for static linking (except MSVC, # which needs '.lib'). libext=a -with_gnu_ld="$lt_cv_prog_gnu_ld" +with_gnu_ld=$lt_cv_prog_gnu_ld -old_CC="$CC" -old_CFLAGS="$CFLAGS" +old_CC=$CC +old_CFLAGS=$CFLAGS # Set sane defaults for various variables test -z "$CC" && CC=cc @@ -283,21 +293,21 @@ no_glob_subst='s/\*/\\\*/g' # _LT_PROG_LTMAIN # --------------- -# Note that this code is called both from `configure', and `config.status' +# Note that this code is called both from 'configure', and 'config.status' # now that we use AC_CONFIG_COMMANDS to generate libtool. Notably, -# `config.status' has no value for ac_aux_dir unless we are using Automake, +# 'config.status' has no value for ac_aux_dir unless we are using Automake, # so we pass a copy along to make sure it has a sensible value anyway. m4_defun([_LT_PROG_LTMAIN], [m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl _LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir']) -ltmain="$ac_aux_dir/ltmain.sh" +ltmain=$ac_aux_dir/ltmain.sh ])# _LT_PROG_LTMAIN # So that we can recreate a full libtool script including additional # tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS -# in macros and then make a single call at the end using the `libtool' +# in macros and then make a single call at the end using the 'libtool' # label. @@ -429,8 +439,8 @@ m4_define([_lt_decl_all_varnames], # _LT_CONFIG_STATUS_DECLARE([VARNAME]) # ------------------------------------ -# Quote a variable value, and forward it to `config.status' so that its -# declaration there will have the same value as in `configure'. VARNAME +# Quote a variable value, and forward it to 'config.status' so that its +# declaration there will have the same value as in 'configure'. VARNAME # must have a single quote delimited value for this to work. m4_define([_LT_CONFIG_STATUS_DECLARE], [$1='`$ECHO "$][$1" | $SED "$delay_single_quote_subst"`']) @@ -454,7 +464,7 @@ m4_defun([_LT_CONFIG_STATUS_DECLARATIONS], # Output comment and list of tags supported by the script m4_defun([_LT_LIBTOOL_TAGS], [_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl -available_tags="_LT_TAGS"dnl +available_tags='_LT_TAGS'dnl ]) @@ -482,7 +492,7 @@ m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl # _LT_LIBTOOL_CONFIG_VARS # ----------------------- # Produce commented declarations of non-tagged libtool config variables -# suitable for insertion in the LIBTOOL CONFIG section of the `libtool' +# suitable for insertion in the LIBTOOL CONFIG section of the 'libtool' # script. Tagged libtool config variables (even for the LIBTOOL CONFIG # section) are produced by _LT_LIBTOOL_TAG_VARS. m4_defun([_LT_LIBTOOL_CONFIG_VARS], @@ -508,8 +518,8 @@ m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])]) # Send accumulated output to $CONFIG_STATUS. Thanks to the lists of # variables for single and double quote escaping we saved from calls # to _LT_DECL, we can put quote escaped variables declarations -# into `config.status', and then the shell code to quote escape them in -# for loops in `config.status'. Finally, any additional code accumulated +# into 'config.status', and then the shell code to quote escape them in +# for loops in 'config.status'. Finally, any additional code accumulated # from calls to _LT_CONFIG_LIBTOOL_INIT is expanded. m4_defun([_LT_CONFIG_COMMANDS], [AC_PROVIDE_IFELSE([LT_OUTPUT], @@ -555,7 +565,7 @@ for var in lt_decl_all_varnames([[ \ ]], lt_decl_quote_varnames); do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[[\\\\\\\`\\"\\\$]]*) - eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" @@ -568,7 +578,7 @@ for var in lt_decl_all_varnames([[ \ ]], lt_decl_dquote_varnames); do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[[\\\\\\\`\\"\\\$]]*) - eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" @@ -584,7 +594,7 @@ _LT_OUTPUT_LIBTOOL_INIT # Generate a child script FILE with all initialization necessary to # reuse the environment learned by the parent script, and make the # file executable. If COMMENT is supplied, it is inserted after the -# `#!' sequence but before initialization text begins. After this +# '#!' sequence but before initialization text begins. After this # macro, additional text can be appended to FILE to form the body of # the child script. The macro ends with non-zero status if the # file could not be fully written (such as if the disk is full). @@ -606,7 +616,7 @@ AS_SHELL_SANITIZE _AS_PREPARE exec AS_MESSAGE_FD>&1 _ASEOF -test $lt_write_fail = 0 && chmod +x $1[]dnl +test 0 = "$lt_write_fail" && chmod +x $1[]dnl m4_popdef([AS_MESSAGE_LOG_FD])])])# _LT_GENERATED_FILE_INIT # LT_OUTPUT @@ -629,7 +639,7 @@ exec AS_MESSAGE_LOG_FD>>config.log } >&AS_MESSAGE_LOG_FD lt_cl_help="\ -\`$as_me' creates a local libtool stub from the current configuration, +'$as_me' creates a local libtool stub from the current configuration, for use in further configure time tests before the real libtool is generated. @@ -649,9 +659,9 @@ configured by $[0], generated by m4_PACKAGE_STRING. Copyright (C) 2011 Free Software Foundation, Inc. This config.lt script is free software; the Free Software Foundation -gives unlimited permission to copy, distribute and modify it." +gives unlimited permision to copy, distribute and modify it." -while test $[#] != 0 +while test 0 != $[#] do case $[1] in --version | --v* | -V ) @@ -664,10 +674,10 @@ do lt_cl_silent=: ;; -*) AC_MSG_ERROR([unrecognized option: $[1] -Try \`$[0] --help' for more information.]) ;; +Try '$[0] --help' for more information.]) ;; *) AC_MSG_ERROR([unrecognized argument: $[1] -Try \`$[0] --help' for more information.]) ;; +Try '$[0] --help' for more information.]) ;; esac shift done @@ -693,7 +703,7 @@ chmod +x "$CONFIG_LT" # open by configure. Here we exec the FD to /dev/null, effectively closing # config.log, so it can be properly (re)opened and appended to by config.lt. lt_cl_success=: -test "$silent" = yes && +test yes = "$silent" && lt_config_lt_args="$lt_config_lt_args --quiet" exec AS_MESSAGE_LOG_FD>/dev/null $SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false @@ -713,32 +723,47 @@ m4_defun([_LT_CONFIG], _LT_CONFIG_SAVE_COMMANDS([ m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl m4_if(_LT_TAG, [C], [ - # See if we are running on zsh, and set the options which allow our + # See if we are running on zsh, and set the options that allow our # commands through without removal of \ escapes. - if test -n "${ZSH_VERSION+set}" ; then + if test -n "${ZSH_VERSION+set}"; then setopt NO_GLOB_SUBST fi - cfgfile="${ofile}T" + cfgfile=${ofile}T trap "$RM \"$cfgfile\"; exit 1" 1 2 15 $RM "$cfgfile" cat <<_LT_EOF >> "$cfgfile" #! $SHELL - -# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. -# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION +# Generated automatically by $as_me ($PACKAGE) $VERSION # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # NOTE: Changes made to this file will be lost: look at ltmain.sh. -# + +# Provide generalized library-building support services. +# Written by Gordon Matzigkeit, 1996 + _LT_COPYING _LT_LIBTOOL_TAGS +# Configured defaults for sys_lib_dlsearch_path munging. +: \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"} + # ### BEGIN LIBTOOL CONFIG _LT_LIBTOOL_CONFIG_VARS _LT_LIBTOOL_TAG_VARS # ### END LIBTOOL CONFIG +_LT_EOF + + cat <<'_LT_EOF' >> "$cfgfile" + +# ### BEGIN FUNCTIONS SHARED WITH CONFIGURE + +_LT_PREPARE_MUNGE_PATH_LIST +_LT_PREPARE_CC_BASENAME + +# ### END FUNCTIONS SHARED WITH CONFIGURE + _LT_EOF case $host_os in @@ -747,7 +772,7 @@ _LT_EOF # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. -if test "X${COLLECT_NAMES+set}" != Xset; then +if test set != "${COLLECT_NAMES+set}"; then COLLECT_NAMES= export COLLECT_NAMES fi @@ -764,8 +789,6 @@ _LT_EOF sed '$q' "$ltmain" >> "$cfgfile" \ || (rm -f "$cfgfile"; exit 1) - _LT_PROG_REPLACE_SHELLFNS - mv -f "$cfgfile" "$ofile" || (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") chmod +x "$ofile" @@ -783,7 +806,6 @@ _LT_EOF [m4_if([$1], [], [ PACKAGE='$PACKAGE' VERSION='$VERSION' - TIMESTAMP='$TIMESTAMP' RM='$RM' ofile='$ofile'], []) ])dnl /_LT_CONFIG_SAVE_COMMANDS @@ -980,7 +1002,7 @@ m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[ AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod], [lt_cv_apple_cc_single_mod=no - if test -z "${LT_MULTI_MODULE}"; then + if test -z "$LT_MULTI_MODULE"; then # By default we will add the -single_module flag. You can override # by either setting the environment variable LT_MULTI_MODULE # non-empty at configure time, or by adding -multi_module to the @@ -998,7 +1020,7 @@ m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[ cat conftest.err >&AS_MESSAGE_LOG_FD # Otherwise, if the output was created with a 0 exit code from # the compiler, it worked. - elif test -f libconftest.dylib && test $_lt_result -eq 0; then + elif test -f libconftest.dylib && test 0 = "$_lt_result"; then lt_cv_apple_cc_single_mod=yes else cat conftest.err >&AS_MESSAGE_LOG_FD @@ -1016,7 +1038,7 @@ m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[ AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], [lt_cv_ld_exported_symbols_list=yes], [lt_cv_ld_exported_symbols_list=no]) - LDFLAGS="$save_LDFLAGS" + LDFLAGS=$save_LDFLAGS ]) AC_CACHE_CHECK([for -force_load linker flag],[lt_cv_ld_force_load], @@ -1038,7 +1060,7 @@ _LT_EOF _lt_result=$? if test -s conftest.err && $GREP force_load conftest.err; then cat conftest.err >&AS_MESSAGE_LOG_FD - elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then + elif test -f conftest && test 0 = "$_lt_result" && $GREP forced_load conftest >/dev/null 2>&1; then lt_cv_ld_force_load=yes else cat conftest.err >&AS_MESSAGE_LOG_FD @@ -1048,32 +1070,27 @@ _LT_EOF ]) case $host_os in rhapsody* | darwin1.[[012]]) - _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; + _lt_dar_allow_undefined='$wl-undefined ${wl}suppress' ;; darwin1.*) - _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; - darwin*) # darwin 5.x on - # if running on 10.5 or later, the deployment target defaults - # to the OS version, if on x86, and 10.4, the deployment - # target defaults to 10.4. Don't you love it? - case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in - 10.0,*86*-darwin8*|10.0,*-darwin[[91]]*) - _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; - 10.[[012]]*) - _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; - 10.*) - _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; + _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; + darwin*) + case ${MACOSX_DEPLOYMENT_TARGET},$host in + 10.[[012]],*|,*powerpc*) + _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; + *) + _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; esac ;; esac - if test "$lt_cv_apple_cc_single_mod" = "yes"; then + if test yes = "$lt_cv_apple_cc_single_mod"; then _lt_dar_single_mod='$single_module' fi - if test "$lt_cv_ld_exported_symbols_list" = "yes"; then - _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' + if test yes = "$lt_cv_ld_exported_symbols_list"; then + _lt_dar_export_syms=' $wl-exported_symbols_list,$output_objdir/$libname-symbols.expsym' else - _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' + _lt_dar_export_syms='~$NMEDIT -s $output_objdir/$libname-symbols.expsym $lib' fi - if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then + if test : != "$DSYMUTIL" && test no = "$lt_cv_ld_force_load"; then _lt_dsymutil='~$DSYMUTIL $lib || :' else _lt_dsymutil= @@ -1093,29 +1110,29 @@ m4_defun([_LT_DARWIN_LINKER_FEATURES], _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported - if test "$lt_cv_ld_force_load" = "yes"; then - _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' + if test yes = "$lt_cv_ld_force_load"; then + _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' m4_case([$1], [F77], [_LT_TAGVAR(compiler_needs_object, $1)=yes], [FC], [_LT_TAGVAR(compiler_needs_object, $1)=yes]) else _LT_TAGVAR(whole_archive_flag_spec, $1)='' fi _LT_TAGVAR(link_all_deplibs, $1)=yes - _LT_TAGVAR(allow_undefined_flag, $1)="$_lt_dar_allow_undefined" + _LT_TAGVAR(allow_undefined_flag, $1)=$_lt_dar_allow_undefined case $cc_basename in - ifort*) _lt_dar_can_shared=yes ;; + ifort*|nagfor*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac - if test "$_lt_dar_can_shared" = "yes"; then + if test yes = "$_lt_dar_can_shared"; then output_verbose_link_cmd=func_echo_all - _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" - _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" - _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" - _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" + _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil" + _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil" + _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil" + _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil" m4_if([$1], [CXX], -[ if test "$lt_cv_apple_cc_single_mod" != "yes"; then - _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}" - _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}" +[ if test yes != "$lt_cv_apple_cc_single_mod"; then + _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dsymutil" + _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dar_export_syms$_lt_dsymutil" fi ],[]) else @@ -1135,7 +1152,7 @@ m4_defun([_LT_DARWIN_LINKER_FEATURES], # Allow to override them for all tags through lt_cv_aix_libpath. m4_defun([_LT_SYS_MODULE_PATH_AIX], [m4_require([_LT_DECL_SED])dnl -if test "${lt_cv_aix_libpath+set}" = set; then +if test set = "${lt_cv_aix_libpath+set}"; then aix_libpath=$lt_cv_aix_libpath else AC_CACHE_VAL([_LT_TAGVAR([lt_cv_aix_libpath_], [$1])], @@ -1153,7 +1170,7 @@ else _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi],[]) if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then - _LT_TAGVAR([lt_cv_aix_libpath_], [$1])="/usr/lib:/lib" + _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=/usr/lib:/lib fi ]) aix_libpath=$_LT_TAGVAR([lt_cv_aix_libpath_], [$1]) @@ -1173,8 +1190,8 @@ m4_define([_LT_SHELL_INIT], # ----------------------- # Find how we can fake an echo command that does not interpret backslash. # In particular, with Autoconf 2.60 or later we add some code to the start -# of the generated configure script which will find a shell with a builtin -# printf (which we can use as an echo command). +# of the generated configure script that will find a shell with a builtin +# printf (that we can use as an echo command). m4_defun([_LT_PROG_ECHO_BACKSLASH], [ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO @@ -1202,10 +1219,10 @@ fi # Invoke $ECHO with all args, space-separated. func_echo_all () { - $ECHO "$*" + $ECHO "$*" } -case "$ECHO" in +case $ECHO in printf*) AC_MSG_RESULT([printf]) ;; print*) AC_MSG_RESULT([print -r]) ;; *) AC_MSG_RESULT([cat]) ;; @@ -1231,16 +1248,17 @@ _LT_DECL([], [ECHO], [1], [An echo program that protects backslashes]) AC_DEFUN([_LT_WITH_SYSROOT], [AC_MSG_CHECKING([for sysroot]) AC_ARG_WITH([sysroot], -[ --with-sysroot[=DIR] Search for dependent libraries within DIR - (or the compiler's sysroot if not specified).], +[AS_HELP_STRING([--with-sysroot@<:@=DIR@:>@], + [Search for dependent libraries within DIR (or the compiler's sysroot + if not specified).])], [], [with_sysroot=no]) dnl lt_sysroot will always be passed unquoted. We quote it here dnl in case the user passed a directory name. lt_sysroot= -case ${with_sysroot} in #( +case $with_sysroot in #( yes) - if test "$GCC" = yes; then + if test yes = "$GCC"; then lt_sysroot=`$CC --print-sysroot 2>/dev/null` fi ;; #( @@ -1250,14 +1268,14 @@ case ${with_sysroot} in #( no|'') ;; #( *) - AC_MSG_RESULT([${with_sysroot}]) + AC_MSG_RESULT([$with_sysroot]) AC_MSG_ERROR([The sysroot must be an absolute path.]) ;; esac AC_MSG_RESULT([${lt_sysroot:-no}]) _LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl -[dependent libraries, and in which our libraries should be installed.])]) +[dependent libraries, and where our libraries should be installed.])]) # _LT_ENABLE_LOCK # --------------- @@ -1265,31 +1283,33 @@ m4_defun([_LT_ENABLE_LOCK], [AC_ARG_ENABLE([libtool-lock], [AS_HELP_STRING([--disable-libtool-lock], [avoid locking (might break parallel builds)])]) -test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes +test no = "$enable_libtool_lock" || enable_libtool_lock=yes # Some flags need to be propagated to the compiler or linker for good # libtool support. case $host in ia64-*-hpux*) - # Find out which ABI we are using. + # Find out what ABI is being produced by ac_compile, and set mode + # options accordingly. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.$ac_objext` in *ELF-32*) - HPUX_IA64_MODE="32" + HPUX_IA64_MODE=32 ;; *ELF-64*) - HPUX_IA64_MODE="64" + HPUX_IA64_MODE=64 ;; esac fi rm -rf conftest* ;; *-*-irix6*) - # Find out which ABI we are using. + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then - if test "$lt_cv_prog_gnu_ld" = yes; then + if test yes = "$lt_cv_prog_gnu_ld"; then case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -melf32bsmip" @@ -1318,9 +1338,46 @@ ia64-*-hpux*) rm -rf conftest* ;; +mips64*-*linux*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. + echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + emul=elf + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + emul="${emul}32" + ;; + *64-bit*) + emul="${emul}64" + ;; + esac + case `/usr/bin/file conftest.$ac_objext` in + *MSB*) + emul="${emul}btsmip" + ;; + *LSB*) + emul="${emul}ltsmip" + ;; + esac + case `/usr/bin/file conftest.$ac_objext` in + *N32*) + emul="${emul}n32" + ;; + esac + LD="${LD-ld} -m $emul" + fi + rm -rf conftest* + ;; + x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) - # Find out which ABI we are using. + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. Note that the listed cases only cover the + # situations where additional linker options are needed (such as when + # doing 32-bit compilation for a host where ld defaults to 64-bit, or + # vice versa); the common cases where no linker options are needed do + # not appear in the list. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.o` in @@ -1339,10 +1396,10 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) ;; esac ;; - powerpc64le-*) + powerpc64le-*linux*) LD="${LD-ld} -m elf32lppclinux" ;; - powerpc64-*) + powerpc64-*linux*) LD="${LD-ld} -m elf32ppclinux" ;; s390x-*linux*) @@ -1361,10 +1418,10 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) x86_64-*linux*) LD="${LD-ld} -m elf_x86_64" ;; - powerpcle-*) + powerpcle-*linux*) LD="${LD-ld} -m elf64lppc" ;; - powerpc-*) + powerpc-*linux*) LD="${LD-ld} -m elf64ppc" ;; s390*-*linux*|s390*-*tpf*) @@ -1382,19 +1439,20 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) *-*-sco3.2v5*) # On SCO OpenServer 5, we need -belf to get full-featured binaries. - SAVE_CFLAGS="$CFLAGS" + SAVE_CFLAGS=$CFLAGS CFLAGS="$CFLAGS -belf" AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, [AC_LANG_PUSH(C) AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) AC_LANG_POP]) - if test x"$lt_cv_cc_needs_belf" != x"yes"; then + if test yes != "$lt_cv_cc_needs_belf"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf - CFLAGS="$SAVE_CFLAGS" + CFLAGS=$SAVE_CFLAGS fi ;; *-*solaris*) - # Find out which ABI we are using. + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.o` in @@ -1402,7 +1460,7 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) case $lt_cv_prog_gnu_ld in yes*) case $host in - i?86-*-solaris*) + i?86-*-solaris*|x86_64-*-solaris*) LD="${LD-ld} -m elf_x86_64" ;; sparc*-*-solaris*) @@ -1411,7 +1469,7 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) esac # GNU ld 2.21 introduced _sol2 emulations. Use them if available. if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then - LD="${LD-ld}_sol2" + LD=${LD-ld}_sol2 fi ;; *) @@ -1427,7 +1485,7 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) ;; esac -need_locks="$enable_libtool_lock" +need_locks=$enable_libtool_lock ])# _LT_ENABLE_LOCK @@ -1446,11 +1504,11 @@ AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file], [echo conftest.$ac_objext > conftest.lst lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&AS_MESSAGE_LOG_FD' AC_TRY_EVAL([lt_ar_try]) - if test "$ac_status" -eq 0; then + if test 0 -eq "$ac_status"; then # Ensure the archiver fails upon bogus file names. rm -f conftest.$ac_objext libconftest.a AC_TRY_EVAL([lt_ar_try]) - if test "$ac_status" -ne 0; then + if test 0 -ne "$ac_status"; then lt_cv_ar_at_file=@ fi fi @@ -1458,7 +1516,7 @@ AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file], ]) ]) -if test "x$lt_cv_ar_at_file" = xno; then +if test no = "$lt_cv_ar_at_file"; then archiver_list_spec= else archiver_list_spec=$lt_cv_ar_at_file @@ -1489,7 +1547,7 @@ old_postuninstall_cmds= if test -n "$RANLIB"; then case $host_os in - openbsd*) + bitrig* | openbsd*) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" ;; *) @@ -1525,7 +1583,7 @@ AC_CACHE_CHECK([$1], [$2], [$2=no m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) echo "$lt_simple_compile_test_code" > conftest.$ac_ext - lt_compiler_flag="$3" + lt_compiler_flag="$3" ## exclude from sc_useless_quotes_in_assignment # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins @@ -1552,7 +1610,7 @@ AC_CACHE_CHECK([$1], [$2], $RM conftest* ]) -if test x"[$]$2" = xyes; then +if test yes = "[$]$2"; then m4_if([$5], , :, [$5]) else m4_if([$6], , :, [$6]) @@ -1574,7 +1632,7 @@ AC_DEFUN([_LT_LINKER_OPTION], m4_require([_LT_DECL_SED])dnl AC_CACHE_CHECK([$1], [$2], [$2=no - save_LDFLAGS="$LDFLAGS" + save_LDFLAGS=$LDFLAGS LDFLAGS="$LDFLAGS $3" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then @@ -1593,10 +1651,10 @@ AC_CACHE_CHECK([$1], [$2], fi fi $RM -r conftest* - LDFLAGS="$save_LDFLAGS" + LDFLAGS=$save_LDFLAGS ]) -if test x"[$]$2" = xyes; then +if test yes = "[$]$2"; then m4_if([$4], , :, [$4]) else m4_if([$5], , :, [$5]) @@ -1617,7 +1675,7 @@ AC_DEFUN([LT_CMD_MAX_LEN], AC_MSG_CHECKING([the maximum length of command line arguments]) AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl i=0 - teststring="ABCD" + teststring=ABCD case $build_os in msdosdjgpp*) @@ -1657,7 +1715,7 @@ AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl lt_cv_sys_max_cmd_len=8192; ;; - netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) + bitrig* | darwin* | dragonfly* | freebsd* | netbsd* | openbsd*) # This has been around since 386BSD, at least. Likely further. if test -x /sbin/sysctl; then lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` @@ -1708,22 +1766,22 @@ AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl *) lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` if test -n "$lt_cv_sys_max_cmd_len" && \ - test undefined != "$lt_cv_sys_max_cmd_len"; then + test undefined != "$lt_cv_sys_max_cmd_len"; then lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` else # Make teststring a little bigger before we do anything with it. # a 1K string should be a reasonable start. - for i in 1 2 3 4 5 6 7 8 ; do + for i in 1 2 3 4 5 6 7 8; do teststring=$teststring$teststring done SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} # If test is not a shell built-in, we'll probably end up computing a # maximum length that is only half of the actual maximum length, but # we can't tell. - while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \ + while { test X`env echo "$teststring$teststring" 2>/dev/null` \ = "X$teststring$teststring"; } >/dev/null 2>&1 && - test $i != 17 # 1/2 MB should be enough + test 17 != "$i" # 1/2 MB should be enough do i=`expr $i + 1` teststring=$teststring$teststring @@ -1739,7 +1797,7 @@ AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl ;; esac ]) -if test -n $lt_cv_sys_max_cmd_len ; then +if test -n "$lt_cv_sys_max_cmd_len"; then AC_MSG_RESULT($lt_cv_sys_max_cmd_len) else AC_MSG_RESULT(none) @@ -1767,7 +1825,7 @@ m4_defun([_LT_HEADER_DLFCN], # ---------------------------------------------------------------- m4_defun([_LT_TRY_DLOPEN_SELF], [m4_require([_LT_HEADER_DLFCN])dnl -if test "$cross_compiling" = yes; then : +if test yes = "$cross_compiling"; then : [$4] else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 @@ -1814,9 +1872,9 @@ else # endif #endif -/* When -fvisbility=hidden is used, assume the code has been annotated +/* When -fvisibility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ -#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) +#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif @@ -1842,7 +1900,7 @@ int main () return status; }] _LT_EOF - if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then + if AC_TRY_EVAL(ac_link) && test -s "conftest$ac_exeext" 2>/dev/null; then (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null lt_status=$? case x$lt_status in @@ -1863,7 +1921,7 @@ rm -fr conftest* # ------------------ AC_DEFUN([LT_SYS_DLOPEN_SELF], [m4_require([_LT_HEADER_DLFCN])dnl -if test "x$enable_dlopen" != xyes; then +if test yes != "$enable_dlopen"; then enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown @@ -1873,44 +1931,52 @@ else case $host_os in beos*) - lt_cv_dlopen="load_add_on" + lt_cv_dlopen=load_add_on lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ;; mingw* | pw32* | cegcc*) - lt_cv_dlopen="LoadLibrary" + lt_cv_dlopen=LoadLibrary lt_cv_dlopen_libs= ;; cygwin*) - lt_cv_dlopen="dlopen" + lt_cv_dlopen=dlopen lt_cv_dlopen_libs= ;; darwin*) - # if libdl is installed we need to link against it + # if libdl is installed we need to link against it AC_CHECK_LIB([dl], [dlopen], - [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[ - lt_cv_dlopen="dyld" + [lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl],[ + lt_cv_dlopen=dyld lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ]) ;; + tpf*) + # Don't try to run any link tests for TPF. We know it's impossible + # because TPF is a cross-compiler, and we know how we open DSOs. + lt_cv_dlopen=dlopen + lt_cv_dlopen_libs= + lt_cv_dlopen_self=no + ;; + *) AC_CHECK_FUNC([shl_load], - [lt_cv_dlopen="shl_load"], + [lt_cv_dlopen=shl_load], [AC_CHECK_LIB([dld], [shl_load], - [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"], + [lt_cv_dlopen=shl_load lt_cv_dlopen_libs=-ldld], [AC_CHECK_FUNC([dlopen], - [lt_cv_dlopen="dlopen"], + [lt_cv_dlopen=dlopen], [AC_CHECK_LIB([dl], [dlopen], - [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"], + [lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl], [AC_CHECK_LIB([svld], [dlopen], - [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"], + [lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-lsvld], [AC_CHECK_LIB([dld], [dld_link], - [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"]) + [lt_cv_dlopen=dld_link lt_cv_dlopen_libs=-ldld]) ]) ]) ]) @@ -1919,21 +1985,21 @@ else ;; esac - if test "x$lt_cv_dlopen" != xno; then - enable_dlopen=yes - else + if test no = "$lt_cv_dlopen"; then enable_dlopen=no + else + enable_dlopen=yes fi case $lt_cv_dlopen in dlopen) - save_CPPFLAGS="$CPPFLAGS" - test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" + save_CPPFLAGS=$CPPFLAGS + test yes = "$ac_cv_header_dlfcn_h" && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" - save_LDFLAGS="$LDFLAGS" + save_LDFLAGS=$LDFLAGS wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" - save_LIBS="$LIBS" + save_LIBS=$LIBS LIBS="$lt_cv_dlopen_libs $LIBS" AC_CACHE_CHECK([whether a program can dlopen itself], @@ -1943,7 +2009,7 @@ else lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) ]) - if test "x$lt_cv_dlopen_self" = xyes; then + if test yes = "$lt_cv_dlopen_self"; then wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" AC_CACHE_CHECK([whether a statically linked program can dlopen itself], lt_cv_dlopen_self_static, [dnl @@ -1953,9 +2019,9 @@ else ]) fi - CPPFLAGS="$save_CPPFLAGS" - LDFLAGS="$save_LDFLAGS" - LIBS="$save_LIBS" + CPPFLAGS=$save_CPPFLAGS + LDFLAGS=$save_LDFLAGS + LIBS=$save_LIBS ;; esac @@ -2047,8 +2113,8 @@ m4_defun([_LT_COMPILER_FILE_LOCKS], m4_require([_LT_FILEUTILS_DEFAULTS])dnl _LT_COMPILER_C_O([$1]) -hard_links="nottested" -if test "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then +hard_links=nottested +if test no = "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" && test no != "$need_locks"; then # do not overwrite the value of need_locks provided by the user AC_MSG_CHECKING([if we can lock with hard links]) hard_links=yes @@ -2058,8 +2124,8 @@ if test "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no AC_MSG_RESULT([$hard_links]) - if test "$hard_links" = no; then - AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe]) + if test no = "$hard_links"; then + AC_MSG_WARN(['$CC' does not support '-c -o', so 'make -j' may be unsafe]) need_locks=warn fi else @@ -2086,8 +2152,8 @@ objdir=$lt_cv_objdir _LT_DECL([], [objdir], [0], [The name of the directory that contains temporary libtool files])dnl m4_pattern_allow([LT_OBJDIR])dnl -AC_DEFINE_UNQUOTED(LT_OBJDIR, "$lt_cv_objdir/", - [Define to the sub-directory in which libtool stores uninstalled libraries.]) +AC_DEFINE_UNQUOTED([LT_OBJDIR], "$lt_cv_objdir/", + [Define to the sub-directory where libtool stores uninstalled libraries.]) ])# _LT_CHECK_OBJDIR @@ -2099,15 +2165,15 @@ m4_defun([_LT_LINKER_HARDCODE_LIBPATH], _LT_TAGVAR(hardcode_action, $1)= if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" || test -n "$_LT_TAGVAR(runpath_var, $1)" || - test "X$_LT_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then + test yes = "$_LT_TAGVAR(hardcode_automatic, $1)"; then # We can hardcode non-existent directories. - if test "$_LT_TAGVAR(hardcode_direct, $1)" != no && + if test no != "$_LT_TAGVAR(hardcode_direct, $1)" && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one - ## test "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" != no && - test "$_LT_TAGVAR(hardcode_minus_L, $1)" != no; then + ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" && + test no != "$_LT_TAGVAR(hardcode_minus_L, $1)"; then # Linking always hardcodes the temporary library directory. _LT_TAGVAR(hardcode_action, $1)=relink else @@ -2121,12 +2187,12 @@ else fi AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)]) -if test "$_LT_TAGVAR(hardcode_action, $1)" = relink || - test "$_LT_TAGVAR(inherit_rpath, $1)" = yes; then +if test relink = "$_LT_TAGVAR(hardcode_action, $1)" || + test yes = "$_LT_TAGVAR(inherit_rpath, $1)"; then # Fast installation is not supported enable_fast_install=no -elif test "$shlibpath_overrides_runpath" = yes || - test "$enable_shared" = no; then +elif test yes = "$shlibpath_overrides_runpath" || + test no = "$enable_shared"; then # Fast installation is not necessary enable_fast_install=needless fi @@ -2150,7 +2216,7 @@ else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in darwin*) - if test -n "$STRIP" ; then + if test -n "$STRIP"; then striplib="$STRIP -x" old_striplib="$STRIP -S" AC_MSG_RESULT([yes]) @@ -2168,6 +2234,47 @@ _LT_DECL([], [striplib], [1]) ])# _LT_CMD_STRIPLIB +# _LT_PREPARE_MUNGE_PATH_LIST +# --------------------------- +# Make sure func_munge_path_list() is defined correctly. +m4_defun([_LT_PREPARE_MUNGE_PATH_LIST], +[[# func_munge_path_list VARIABLE PATH +# ----------------------------------- +# VARIABLE is name of variable containing _space_ separated list of +# directories to be munged by the contents of PATH, which is string +# having a format: +# "DIR[:DIR]:" +# string "DIR[ DIR]" will be prepended to VARIABLE +# ":DIR[:DIR]" +# string "DIR[ DIR]" will be appended to VARIABLE +# "DIRP[:DIRP]::[DIRA:]DIRA" +# string "DIRP[ DIRP]" will be prepended to VARIABLE and string +# "DIRA[ DIRA]" will be appended to VARIABLE +# "DIR[:DIR]" +# VARIABLE will be replaced by "DIR[ DIR]" +func_munge_path_list () +{ + case x@S|@2 in + x) + ;; + *:) + eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'` \@S|@@S|@1\" + ;; + x:*) + eval @S|@1=\"\@S|@@S|@1 `$ECHO @S|@2 | $SED 's/:/ /g'`\" + ;; + *::*) + eval @S|@1=\"\@S|@@S|@1\ `$ECHO @S|@2 | $SED -e 's/.*:://' -e 's/:/ /g'`\" + eval @S|@1=\"`$ECHO @S|@2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \@S|@@S|@1\" + ;; + *) + eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'`\" + ;; + esac +} +]])# _LT_PREPARE_PATH_LIST + + # _LT_SYS_DYNAMIC_LINKER([TAG]) # ----------------------------- # PORTME Fill in your ld.so characteristics @@ -2178,17 +2285,18 @@ m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_OBJDUMP])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_CHECK_SHELL_FEATURES])dnl +m4_require([_LT_PREPARE_MUNGE_PATH_LIST])dnl AC_MSG_CHECKING([dynamic linker characteristics]) m4_if([$1], [], [ -if test "$GCC" = yes; then +if test yes = "$GCC"; then case $host_os in - darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; - *) lt_awk_arg="/^libraries:/" ;; + darwin*) lt_awk_arg='/^libraries:/,/LR/' ;; + *) lt_awk_arg='/^libraries:/' ;; esac case $host_os in - mingw* | cegcc*) lt_sed_strip_eq="s,=\([[A-Za-z]]:\),\1,g" ;; - *) lt_sed_strip_eq="s,=/,/,g" ;; + mingw* | cegcc*) lt_sed_strip_eq='s|=\([[A-Za-z]]:\)|\1|g' ;; + *) lt_sed_strip_eq='s|=/|/|g' ;; esac lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` case $lt_search_path_spec in @@ -2204,28 +2312,35 @@ if test "$GCC" = yes; then ;; esac # Ok, now we have the path, separated by spaces, we can step through it - # and add multilib dir if necessary. + # and add multilib dir if necessary... lt_tmp_lt_search_path_spec= - lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` + lt_multi_os_dir=/`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` + # ...but if some path component already ends with the multilib dir we assume + # that all is fine and trust -print-search-dirs as is (GCC 4.2? or newer). + case "$lt_multi_os_dir; $lt_search_path_spec " in + "/; "* | "/.; "* | "/./; "* | *"$lt_multi_os_dir "* | *"$lt_multi_os_dir/ "*) + lt_multi_os_dir= + ;; + esac for lt_sys_path in $lt_search_path_spec; do - if test -d "$lt_sys_path/$lt_multi_os_dir"; then - lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" - else + if test -d "$lt_sys_path$lt_multi_os_dir"; then + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path$lt_multi_os_dir" + elif test -n "$lt_multi_os_dir"; then test -d "$lt_sys_path" && \ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" fi done lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' -BEGIN {RS=" "; FS="/|\n";} { - lt_foo=""; - lt_count=0; +BEGIN {RS = " "; FS = "/|\n";} { + lt_foo = ""; + lt_count = 0; for (lt_i = NF; lt_i > 0; lt_i--) { if ($lt_i != "" && $lt_i != ".") { if ($lt_i == "..") { lt_count++; } else { if (lt_count == 0) { - lt_foo="/" $lt_i lt_foo; + lt_foo = "/" $lt_i lt_foo; } else { lt_count--; } @@ -2239,7 +2354,7 @@ BEGIN {RS=" "; FS="/|\n";} { # for these hosts. case $host_os in mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ - $SED 's,/\([[A-Za-z]]:\),\1,g'` ;; + $SED 's|/\([[A-Za-z]]:\)|\1|g'` ;; esac sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` else @@ -2248,7 +2363,7 @@ fi]) library_names_spec= libname_spec='lib$name' soname_spec= -shrext_cmds=".so" +shrext_cmds=.so postinstall_cmds= postuninstall_cmds= finish_cmds= @@ -2265,14 +2380,17 @@ hardcode_into_libs=no # flags to be left without arguments need_version=unknown +AC_ARG_VAR([LT_SYS_LIBRARY_PATH], +[User-defined run-time library search path.]) + case $host_os in aix3*) version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' + library_names_spec='$libname$release$shared_ext$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. - soname_spec='${libname}${release}${shared_ext}$major' + soname_spec='$libname$release$shared_ext$major' ;; aix[[4-9]]*) @@ -2280,41 +2398,91 @@ aix[[4-9]]*) need_lib_prefix=no need_version=no hardcode_into_libs=yes - if test "$host_cpu" = ia64; then + if test ia64 = "$host_cpu"; then # AIX 5 supports IA64 - library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' + library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with - # the line `#! .'. This would cause the generated library to - # depend on `.', always an invalid library. This was fixed in + # the line '#! .'. This would cause the generated library to + # depend on '.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[[01]] | aix4.[[01]].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' - echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then + echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac - # AIX (on Power*) has no versioning support, so currently we can not hardcode correct + # Using Import Files as archive members, it is possible to support + # filename-based versioning of shared library archives on AIX. While + # this would work for both with and without runtime linking, it will + # prevent static linking of such archives. So we do filename-based + # shared library versioning with .so extension only, which is used + # when both runtime linking and shared linking is enabled. + # Unfortunately, runtime linking may impact performance, so we do + # not want this to be the default eventually. Also, we use the + # versioned .so libs for executables only if there is the -brtl + # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only. + # To allow for filename-based versioning support, we need to create + # libNAME.so.V as an archive file, containing: + # *) an Import File, referring to the versioned filename of the + # archive as well as the shared archive member, telling the + # bitwidth (32 or 64) of that shared object, and providing the + # list of exported symbols of that shared object, eventually + # decorated with the 'weak' keyword + # *) the shared object with the F_LOADONLY flag set, to really avoid + # it being seen by the linker. + # At run time we better use the real file rather than another symlink, + # but for link time we create the symlink libNAME.so -> libNAME.so.V + + case $with_aix_soname,$aix_use_runtimelinking in + # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. - if test "$aix_use_runtimelinking" = yes; then + aix,yes) # traditional libtool + dynamic_linker='AIX unversionable lib.so' # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - else + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + ;; + aix,no) # traditional AIX only + dynamic_linker='AIX lib.a[(]lib.so.V[)]' # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. - library_names_spec='${libname}${release}.a $libname.a' - soname_spec='${libname}${release}${shared_ext}$major' - fi + library_names_spec='$libname$release.a $libname.a' + soname_spec='$libname$release$shared_ext$major' + ;; + svr4,*) # full svr4 only + dynamic_linker="AIX lib.so.V[(]$shared_archive_member_spec.o[)]" + library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' + # We do not specify a path in Import Files, so LIBPATH fires. + shlibpath_overrides_runpath=yes + ;; + *,yes) # both, prefer svr4 + dynamic_linker="AIX lib.so.V[(]$shared_archive_member_spec.o[)], lib.a[(]lib.so.V[)]" + library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' + # unpreferred sharedlib libNAME.a needs extra handling + postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"' + postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"' + # We do not specify a path in Import Files, so LIBPATH fires. + shlibpath_overrides_runpath=yes + ;; + *,no) # both, prefer aix + dynamic_linker="AIX lib.a[(]lib.so.V[)], lib.so.V[(]$shared_archive_member_spec.o[)]" + library_names_spec='$libname$release.a $libname.a' + soname_spec='$libname$release$shared_ext$major' + # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling + postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)' + postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"' + ;; + esac shlibpath_var=LIBPATH fi ;; @@ -2324,18 +2492,18 @@ amigaos*) powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. - finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; esac ;; beos*) - library_names_spec='${libname}${shared_ext}' + library_names_spec='$libname$shared_ext' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; @@ -2343,8 +2511,8 @@ beos*) bsdi[[45]]*) version_type=linux # correct to gnu/linux during the next big refactor need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" @@ -2356,7 +2524,7 @@ bsdi[[45]]*) cygwin* | mingw* | pw32* | cegcc*) version_type=windows - shrext_cmds=".dll" + shrext_cmds=.dll need_version=no need_lib_prefix=no @@ -2365,8 +2533,8 @@ cygwin* | mingw* | pw32* | cegcc*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds - postinstall_cmds='base_file=`basename \${file}`~ - dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ @@ -2382,17 +2550,17 @@ cygwin* | mingw* | pw32* | cegcc*) case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' - soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + soname_spec='`echo $libname | sed -e 's/^lib/cyg/'``echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' m4_if([$1], [],[ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"]) ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix - soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + soname_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' - library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + library_names_spec='`echo $libname | sed -e 's/^lib/pw/'``echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' ;; esac dynamic_linker='Win32 ld.exe' @@ -2401,8 +2569,8 @@ m4_if([$1], [],[ *,cl*) # Native MSVC libname_spec='$name' - soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' - library_names_spec='${libname}.dll.lib' + soname_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' + library_names_spec='$libname.dll.lib' case $build_os in mingw*) @@ -2429,7 +2597,7 @@ m4_if([$1], [],[ sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) - sys_lib_search_path_spec="$LIB" + sys_lib_search_path_spec=$LIB if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then # It is most probably a Windows format PATH. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` @@ -2442,8 +2610,8 @@ m4_if([$1], [],[ esac # DLL is installed to $(libdir)/../bin by postinstall_cmds - postinstall_cmds='base_file=`basename \${file}`~ - dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' @@ -2456,7 +2624,7 @@ m4_if([$1], [],[ *) # Assume MSVC wrapper - library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib' + library_names_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac @@ -2469,8 +2637,8 @@ darwin* | rhapsody*) version_type=darwin need_lib_prefix=no need_version=no - library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' - soname_spec='${libname}${release}${major}$shared_ext' + library_names_spec='$libname$release$major$shared_ext $libname$shared_ext' + soname_spec='$libname$release$major$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' @@ -2483,8 +2651,8 @@ dgux*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' - soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH ;; @@ -2502,12 +2670,13 @@ freebsd* | dragonfly*) version_type=freebsd-$objformat case $version_type in freebsd-elf*) - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' need_version=no need_lib_prefix=no ;; freebsd-*) - library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' need_version=yes ;; esac @@ -2537,10 +2706,10 @@ haiku*) need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' shlibpath_var=LIBRARY_PATH - shlibpath_overrides_runpath=yes + shlibpath_overrides_runpath=no sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' hardcode_into_libs=yes ;; @@ -2558,14 +2727,15 @@ hpux9* | hpux10* | hpux11*) dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - if test "X$HPUX_IA64_MODE" = X32; then + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + if test 32 = "$HPUX_IA64_MODE"; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + sys_lib_dlsearch_path_spec=/usr/lib/hpux32 else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + sys_lib_dlsearch_path_spec=/usr/lib/hpux64 fi - sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' @@ -2573,8 +2743,8 @@ hpux9* | hpux10* | hpux11*) dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; @@ -2583,8 +2753,8 @@ hpux9* | hpux10* | hpux11*) dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555, ... @@ -2597,8 +2767,8 @@ interix[[3-9]]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no @@ -2609,7 +2779,7 @@ irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) - if test "$lt_cv_prog_gnu_ld" = yes; then + if test yes = "$lt_cv_prog_gnu_ld"; then version_type=linux # correct to gnu/linux during the next big refactor else version_type=irix @@ -2617,8 +2787,8 @@ irix5* | irix6* | nonstopux*) esac need_lib_prefix=no need_version=no - soname_spec='${libname}${release}${shared_ext}$major' - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' + soname_spec='$libname$release$shared_ext$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= @@ -2637,8 +2807,8 @@ irix5* | irix6* | nonstopux*) esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no - sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" - sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff" + sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff" hardcode_into_libs=yes ;; @@ -2647,13 +2817,33 @@ linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; +linux*android*) + version_type=none # Android doesn't support versioned libraries. + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext' + soname_spec='$libname$release$shared_ext' + finish_cmds= + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + dynamic_linker='Android linker' + # Don't embed -rpath directories since the linker doesn't support them. + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + ;; + # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no @@ -2678,7 +2868,12 @@ linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) # before this can be enabled. hardcode_into_libs=yes - # Append ld.so.conf contents to the search path + # Ideally, we could use ldconfig to report *all* directores which are + # searched for libraries, however this is still not possible. Aside from not + # being certain /sbin/ldconfig is available, command + # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64, + # even though it is searched at run-time. Try to do the best guess by + # appending ld.so.conf contents (and includes) to the search path. if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" @@ -2693,29 +2888,17 @@ linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) dynamic_linker='GNU/Linux ld.so' ;; -netbsdelf*-gnu) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - dynamic_linker='NetBSD ld.elf_so' - ;; - netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH @@ -2725,7 +2908,7 @@ netbsd*) newsos6) version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; @@ -2734,58 +2917,68 @@ newsos6) version_type=qnx need_lib_prefix=no need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; -openbsd*) +openbsd* | bitrig*) version_type=sunos - sys_lib_dlsearch_path_spec="/usr/lib" + sys_lib_dlsearch_path_spec=/usr/lib need_lib_prefix=no - # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. - case $host_os in - openbsd3.3 | openbsd3.3.*) need_version=yes ;; - *) need_version=no ;; - esac - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then + need_version=no + else + need_version=yes + fi + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH - if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then - case $host_os in - openbsd2.[[89]] | openbsd2.[[89]].*) - shlibpath_overrides_runpath=no - ;; - *) - shlibpath_overrides_runpath=yes - ;; - esac - else - shlibpath_overrides_runpath=yes - fi + shlibpath_overrides_runpath=yes ;; os2*) libname_spec='$name' - shrext_cmds=".dll" + version_type=windows + shrext_cmds=.dll + need_version=no need_lib_prefix=no - library_names_spec='$libname${shared_ext} $libname.a' + # OS/2 can only load a DLL with a base name of 8 characters or less. + soname_spec='`test -n "$os2dllname" && libname="$os2dllname"; + v=$($ECHO $release$versuffix | tr -d .-); + n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _); + $ECHO $n$v`$shared_ext' + library_names_spec='${libname}_dll.$libext' dynamic_linker='OS/2 ld.exe' - shlibpath_var=LIBPATH + shlibpath_var=BEGINLIBPATH + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no - soname_spec='${libname}${release}${shared_ext}$major' - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='$libname$release$shared_ext$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" - sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; rdos*) @@ -2796,8 +2989,8 @@ solaris*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes @@ -2807,11 +3000,11 @@ solaris*) sunos4*) version_type=sunos - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes - if test "$with_gnu_ld" = yes; then + if test yes = "$with_gnu_ld"; then need_lib_prefix=no fi need_version=yes @@ -2819,8 +3012,8 @@ sunos4*) sysv4 | sysv4.3*) version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) @@ -2841,24 +3034,24 @@ sysv4 | sysv4.3*) ;; sysv4*MP*) - if test -d /usr/nec ;then + if test -d /usr/nec; then version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' - soname_spec='$libname${shared_ext}.$major' + library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext' + soname_spec='$libname$shared_ext.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) - version_type=freebsd-elf + version_type=sco need_lib_prefix=no need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes - if test "$with_gnu_ld" = yes; then + if test yes = "$with_gnu_ld"; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' @@ -2876,7 +3069,7 @@ tpf*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes @@ -2884,8 +3077,8 @@ tpf*) uts4*) version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH ;; @@ -2894,20 +3087,30 @@ uts4*) ;; esac AC_MSG_RESULT([$dynamic_linker]) -test "$dynamic_linker" = no && can_build_shared=no +test no = "$dynamic_linker" && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" -if test "$GCC" = yes; then +if test yes = "$GCC"; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi -if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then - sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" +if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then + sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec fi -if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then - sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" + +if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then + sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec fi +# remember unaugmented sys_lib_dlsearch_path content for libtool script decls... +configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec + +# ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code +func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH" + +# to be used as default LT_SYS_LIBRARY_PATH value in generated libtool +configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH + _LT_DECL([], [variables_saved_for_relink], [1], [Variables whose values should be saved in libtool wrapper scripts and restored at link time]) @@ -2940,39 +3143,41 @@ _LT_DECL([], [hardcode_into_libs], [0], [Whether we should hardcode library paths into libraries]) _LT_DECL([], [sys_lib_search_path_spec], [2], [Compile-time system search path for libraries]) -_LT_DECL([], [sys_lib_dlsearch_path_spec], [2], - [Run-time system search path for libraries]) +_LT_DECL([sys_lib_dlsearch_path_spec], [configure_time_dlsearch_path], [2], + [Detected run-time system search path for libraries]) +_LT_DECL([], [configure_time_lt_sys_library_path], [2], + [Explicit LT_SYS_LIBRARY_PATH set during ./configure time]) ])# _LT_SYS_DYNAMIC_LINKER # _LT_PATH_TOOL_PREFIX(TOOL) # -------------------------- -# find a file program which can recognize shared library +# find a file program that can recognize shared library AC_DEFUN([_LT_PATH_TOOL_PREFIX], [m4_require([_LT_DECL_EGREP])dnl AC_MSG_CHECKING([for $1]) AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, [case $MAGIC_CMD in [[\\/*] | ?:[\\/]*]) - lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. + lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path. ;; *) - lt_save_MAGIC_CMD="$MAGIC_CMD" - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + lt_save_MAGIC_CMD=$MAGIC_CMD + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR dnl $ac_dummy forces splitting on constant user-supplied paths. dnl POSIX.2 word splitting is done only on the output of word expansions, dnl not every word. This closes a longstanding sh security hole. ac_dummy="m4_if([$2], , $PATH, [$2])" for ac_dir in $ac_dummy; do - IFS="$lt_save_ifs" + IFS=$lt_save_ifs test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$1; then - lt_cv_path_MAGIC_CMD="$ac_dir/$1" + if test -f "$ac_dir/$1"; then + lt_cv_path_MAGIC_CMD=$ac_dir/"$1" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` - MAGIC_CMD="$lt_cv_path_MAGIC_CMD" + MAGIC_CMD=$lt_cv_path_MAGIC_CMD if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : @@ -2995,11 +3200,11 @@ _LT_EOF break fi done - IFS="$lt_save_ifs" - MAGIC_CMD="$lt_save_MAGIC_CMD" + IFS=$lt_save_ifs + MAGIC_CMD=$lt_save_MAGIC_CMD ;; esac]) -MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +MAGIC_CMD=$lt_cv_path_MAGIC_CMD if test -n "$MAGIC_CMD"; then AC_MSG_RESULT($MAGIC_CMD) else @@ -3017,7 +3222,7 @@ dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], []) # _LT_PATH_MAGIC # -------------- -# find a file program which can recognize a shared library +# find a file program that can recognize a shared library m4_defun([_LT_PATH_MAGIC], [_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH) if test -z "$lt_cv_path_MAGIC_CMD"; then @@ -3044,16 +3249,16 @@ m4_require([_LT_PROG_ECHO_BACKSLASH])dnl AC_ARG_WITH([gnu-ld], [AS_HELP_STRING([--with-gnu-ld], [assume the C compiler uses GNU ld @<:@default=no@:>@])], - [test "$withval" = no || with_gnu_ld=yes], + [test no = "$withval" || with_gnu_ld=yes], [with_gnu_ld=no])dnl ac_prog=ld -if test "$GCC" = yes; then +if test yes = "$GCC"; then # Check if gcc -print-prog-name=ld gives a path. AC_MSG_CHECKING([for ld used by $CC]) case $host in *-*-mingw*) - # gcc leaves a trailing carriage return which upsets mingw + # gcc leaves a trailing carriage return, which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; @@ -3067,7 +3272,7 @@ if test "$GCC" = yes; then while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` done - test -z "$LD" && LD="$ac_prog" + test -z "$LD" && LD=$ac_prog ;; "") # If it fails, then pretend we aren't using GCC. @@ -3078,37 +3283,37 @@ if test "$GCC" = yes; then with_gnu_ld=unknown ;; esac -elif test "$with_gnu_ld" = yes; then +elif test yes = "$with_gnu_ld"; then AC_MSG_CHECKING([for GNU ld]) else AC_MSG_CHECKING([for non-GNU ld]) fi AC_CACHE_VAL(lt_cv_path_LD, [if test -z "$LD"; then - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do - IFS="$lt_save_ifs" + IFS=$lt_save_ifs test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then - lt_cv_path_LD="$ac_dir/$ac_prog" + lt_cv_path_LD=$ac_dir/$ac_prog # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 conftest.i +cat conftest.i conftest.i >conftest2.i +: ${lt_DD:=$DD} +AC_PATH_PROGS_FEATURE_CHECK([lt_DD], [dd], +[if "$ac_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then + cmp -s conftest.i conftest.out \ + && ac_cv_path_lt_DD="$ac_path_lt_DD" ac_path_lt_DD_found=: +fi]) +rm -f conftest.i conftest2.i conftest.out]) +])# _LT_PATH_DD + + +# _LT_CMD_TRUNCATE +# ---------------- +# find command to truncate a binary pipe +m4_defun([_LT_CMD_TRUNCATE], +[m4_require([_LT_PATH_DD]) +AC_CACHE_CHECK([how to truncate binary pipes], [lt_cv_truncate_bin], +[printf 0123456789abcdef0123456789abcdef >conftest.i +cat conftest.i conftest.i >conftest2.i +lt_cv_truncate_bin= +if "$ac_cv_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then + cmp -s conftest.i conftest.out \ + && lt_cv_truncate_bin="$ac_cv_path_lt_DD bs=4096 count=1" +fi +rm -f conftest.i conftest2.i conftest.out +test -z "$lt_cv_truncate_bin" && lt_cv_truncate_bin="$SED -e 4q"]) +_LT_DECL([lt_truncate_bin], [lt_cv_truncate_bin], [1], + [Command to truncate a binary pipe]) +])# _LT_CMD_TRUNCATE + + # _LT_CHECK_MAGIC_METHOD # ---------------------- # how to check for library dependencies @@ -3194,13 +3436,13 @@ lt_cv_deplibs_check_method='unknown' # Need to set the preceding variable on all platforms that support # interlibrary dependencies. # 'none' -- dependencies not supported. -# `unknown' -- same as none, but documents that we really don't know. +# 'unknown' -- same as none, but documents that we really don't know. # 'pass_all' -- all dependencies passed with no checks. # 'test_compile' -- check by making test program. # 'file_magic [[regex]]' -- check by looking for files in library path -# which responds to the $file_magic_cmd with a given extended regex. -# If you have `file' or equivalent on your system and you're not sure -# whether `pass_all' will *always* work, you probably want this one. +# that responds to the $file_magic_cmd with a given extended regex. +# If you have 'file' or equivalent on your system and you're not sure +# whether 'pass_all' will *always* work, you probably want this one. case $host_os in aix[[4-9]]*) @@ -3227,8 +3469,7 @@ mingw* | pw32*) # Base MSYS/MinGW do not provide the 'file' command needed by # func_win32_libid shell function, so use a weaker test based on 'objdump', # unless we find 'file', for example because we are cross-compiling. - # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin. - if ( test "$lt_cv_nm_interface" = "BSD nm" && file / ) >/dev/null 2>&1; then + if ( file / ) >/dev/null 2>&1; then lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' else @@ -3306,7 +3547,7 @@ linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) lt_cv_deplibs_check_method=pass_all ;; -netbsd* | netbsdelf*-gnu) +netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' else @@ -3324,8 +3565,8 @@ newos6*) lt_cv_deplibs_check_method=pass_all ;; -openbsd*) - if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then +openbsd* | bitrig*) + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' @@ -3378,6 +3619,9 @@ sysv4 | sysv4.3*) tpf*) lt_cv_deplibs_check_method=pass_all ;; +os2*) + lt_cv_deplibs_check_method=pass_all + ;; esac ]) @@ -3418,33 +3662,38 @@ AC_DEFUN([LT_PATH_NM], AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM, [if test -n "$NM"; then # Let the user override the test. - lt_cv_path_NM="$NM" + lt_cv_path_NM=$NM else - lt_nm_to_check="${ac_tool_prefix}nm" + lt_nm_to_check=${ac_tool_prefix}nm if test -n "$ac_tool_prefix" && test "$build" = "$host"; then lt_nm_to_check="$lt_nm_to_check nm" fi for lt_tmp_nm in $lt_nm_to_check; do - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do - IFS="$lt_save_ifs" + IFS=$lt_save_ifs test -z "$ac_dir" && ac_dir=. - tmp_nm="$ac_dir/$lt_tmp_nm" - if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then + tmp_nm=$ac_dir/$lt_tmp_nm + if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext"; then # Check to see if the nm accepts a BSD-compat flag. - # Adding the `sed 1q' prevents false positives on HP-UX, which says: + # Adding the 'sed 1q' prevents false positives on HP-UX, which says: # nm: unknown option "B" ignored # Tru64's nm complains that /dev/null is an invalid object file - case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in - */dev/null* | *'Invalid file or object type'*) + # MSYS converts /dev/null to NUL, MinGW nm treats NUL as empty + case $build_os in + mingw*) lt_bad_file=conftest.nm/nofile ;; + *) lt_bad_file=/dev/null ;; + esac + case `"$tmp_nm" -B $lt_bad_file 2>&1 | sed '1q'` in + *$lt_bad_file* | *'Invalid file or object type'*) lt_cv_path_NM="$tmp_nm -B" - break + break 2 ;; *) case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in */dev/null*) lt_cv_path_NM="$tmp_nm -p" - break + break 2 ;; *) lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but @@ -3455,21 +3704,21 @@ else esac fi done - IFS="$lt_save_ifs" + IFS=$lt_save_ifs done : ${lt_cv_path_NM=no} fi]) -if test "$lt_cv_path_NM" != "no"; then - NM="$lt_cv_path_NM" +if test no != "$lt_cv_path_NM"; then + NM=$lt_cv_path_NM else # Didn't find any BSD compatible name lister, look for dumpbin. if test -n "$DUMPBIN"; then : # Let the user override the test. else AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :) - case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in + case `$DUMPBIN -symbols -headers /dev/null 2>&1 | sed '1q'` in *COFF*) - DUMPBIN="$DUMPBIN -symbols" + DUMPBIN="$DUMPBIN -symbols -headers" ;; *) DUMPBIN=: @@ -3477,8 +3726,8 @@ else esac fi AC_SUBST([DUMPBIN]) - if test "$DUMPBIN" != ":"; then - NM="$DUMPBIN" + if test : != "$DUMPBIN"; then + NM=$DUMPBIN fi fi test -z "$NM" && NM=nm @@ -3524,8 +3773,8 @@ lt_cv_sharedlib_from_linklib_cmd, case $host_os in cygwin* | mingw* | pw32* | cegcc*) - # two different shell functions defined in ltmain.sh - # decide which to use based on capabilities of $DLLTOOL + # two different shell functions defined in ltmain.sh; + # decide which one to use based on capabilities of $DLLTOOL case `$DLLTOOL --help 2>&1` in *--identify-strict*) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib @@ -3537,7 +3786,7 @@ cygwin* | mingw* | pw32* | cegcc*) ;; *) # fallback: assume linklib IS sharedlib - lt_cv_sharedlib_from_linklib_cmd="$ECHO" + lt_cv_sharedlib_from_linklib_cmd=$ECHO ;; esac ]) @@ -3564,13 +3813,28 @@ AC_CACHE_CHECK([if $MANIFEST_TOOL is a manifest tool], [lt_cv_path_mainfest_tool lt_cv_path_mainfest_tool=yes fi rm -f conftest*]) -if test "x$lt_cv_path_mainfest_tool" != xyes; then +if test yes != "$lt_cv_path_mainfest_tool"; then MANIFEST_TOOL=: fi _LT_DECL([], [MANIFEST_TOOL], [1], [Manifest tool])dnl ])# _LT_PATH_MANIFEST_TOOL +# _LT_DLL_DEF_P([FILE]) +# --------------------- +# True iff FILE is a Windows DLL '.def' file. +# Keep in sync with func_dll_def_p in the libtool script +AC_DEFUN([_LT_DLL_DEF_P], +[dnl + test DEF = "`$SED -n dnl + -e '\''s/^[[ ]]*//'\'' dnl Strip leading whitespace + -e '\''/^\(;.*\)*$/d'\'' dnl Delete empty lines and comments + -e '\''s/^\(EXPORTS\|LIBRARY\)\([[ ]].*\)*$/DEF/p'\'' dnl + -e q dnl Only consider the first "real" line + $1`" dnl +])# _LT_DLL_DEF_P + + # LT_LIB_M # -------- # check for math library @@ -3582,11 +3846,11 @@ case $host in # These system don't have libm, or don't need it ;; *-ncr-sysv4.3*) - AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw") + AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM=-lmw) AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") ;; *) - AC_CHECK_LIB(m, cos, LIBM="-lm") + AC_CHECK_LIB(m, cos, LIBM=-lm) ;; esac AC_SUBST([LIBM]) @@ -3605,7 +3869,7 @@ m4_defun([_LT_COMPILER_NO_RTTI], _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= -if test "$GCC" = yes; then +if test yes = "$GCC"; then case $cc_basename in nvcc*) _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -Xcompiler -fno-builtin' ;; @@ -3657,7 +3921,7 @@ cygwin* | mingw* | pw32* | cegcc*) symcode='[[ABCDGISTW]]' ;; hpux*) - if test "$host_cpu" = ia64; then + if test ia64 = "$host_cpu"; then symcode='[[ABCDEGRST]]' fi ;; @@ -3690,14 +3954,44 @@ case `$NM -V 2>&1` in symcode='[[ABCDGIRSTW]]' ;; esac +if test "$lt_cv_nm_interface" = "MS dumpbin"; then + # Gets list of data symbols to import. + lt_cv_sys_global_symbol_to_import="sed -n -e 's/^I .* \(.*\)$/\1/p'" + # Adjust the below global symbol transforms to fixup imported variables. + lt_cdecl_hook=" -e 's/^I .* \(.*\)$/extern __declspec(dllimport) char \1;/p'" + lt_c_name_hook=" -e 's/^I .* \(.*\)$/ {\"\1\", (void *) 0},/p'" + lt_c_name_lib_hook="\ + -e 's/^I .* \(lib.*\)$/ {\"\1\", (void *) 0},/p'\ + -e 's/^I .* \(.*\)$/ {\"lib\1\", (void *) 0},/p'" +else + # Disable hooks by default. + lt_cv_sys_global_symbol_to_import= + lt_cdecl_hook= + lt_c_name_hook= + lt_c_name_lib_hook= +fi + # Transform an extracted symbol line into a proper C declaration. # Some systems (esp. on ia64) link data and code symbols differently, # so use this general approach. -lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" +lt_cv_sys_global_symbol_to_cdecl="sed -n"\ +$lt_cdecl_hook\ +" -e 's/^T .* \(.*\)$/extern int \1();/p'"\ +" -e 's/^$symcode$symcode* .* \(.*\)$/extern char \1;/p'" # Transform an extracted symbol line into symbol name and symbol address -lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p'" -lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \(lib[[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"lib\2\", (void *) \&\2},/p'" +lt_cv_sys_global_symbol_to_c_name_address="sed -n"\ +$lt_c_name_hook\ +" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ +" -e 's/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/p'" + +# Transform an extracted symbol line into symbol name with lib prefix and +# symbol address. +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n"\ +$lt_c_name_lib_hook\ +" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ +" -e 's/^$symcode$symcode* .* \(lib.*\)$/ {\"\1\", (void *) \&\1},/p'"\ +" -e 's/^$symcode$symcode* .* \(.*\)$/ {\"lib\1\", (void *) \&\1},/p'" # Handle CRLF in mingw tool chain opt_cr= @@ -3715,21 +4009,24 @@ for ac_symprfx in "" "_"; do # Write the raw and C identifiers. if test "$lt_cv_nm_interface" = "MS dumpbin"; then - # Fake it for dumpbin and say T for any non-static function - # and D for any global variable. + # Fake it for dumpbin and say T for any non-static function, + # D for any global variable and I for any imported variable. # Also find C++ and __fastcall symbols from MSVC++, # which start with @ or ?. lt_cv_sys_global_symbol_pipe="$AWK ['"\ " {last_section=section; section=\$ 3};"\ " /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ " /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ +" /^ *Symbol name *: /{split(\$ 0,sn,\":\"); si=substr(sn[2],2)};"\ +" /^ *Type *: code/{print \"T\",si,substr(si,length(prfx))};"\ +" /^ *Type *: data/{print \"I\",si,substr(si,length(prfx))};"\ " \$ 0!~/External *\|/{next};"\ " / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ " {if(hide[section]) next};"\ -" {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ -" {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ -" s[1]~/^[@?]/{print s[1], s[1]; next};"\ -" s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ +" {f=\"D\"}; \$ 0~/\(\).*\|/{f=\"T\"};"\ +" {split(\$ 0,a,/\||\r/); split(a[2],s)};"\ +" s[1]~/^[@?]/{print f,s[1],s[1]; next};"\ +" s[1]~prfx {split(s[1],t,\"@\"); print f,t[1],substr(t[1],length(prfx))}"\ " ' prfx=^$ac_symprfx]" else lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" @@ -3769,11 +4066,11 @@ _LT_EOF if $GREP ' nm_test_func$' "$nlist" >/dev/null; then cat <<_LT_EOF > conftest.$ac_ext /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ -#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) -/* DATA imports from DLLs on WIN32 con't be const, because runtime +#if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE +/* DATA imports from DLLs on WIN32 can't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT@&t@_DLSYM_CONST -#elif defined(__osf__) +#elif defined __osf__ /* This system does not cope well with relocations in const data. */ # define LT@&t@_DLSYM_CONST #else @@ -3799,7 +4096,7 @@ lt__PROGRAM__LTX_preloaded_symbols[[]] = { { "@PROGRAM@", (void *) 0 }, _LT_EOF - $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext + $SED "s/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext cat <<\_LT_EOF >> conftest.$ac_ext {0, (void *) 0} }; @@ -3819,9 +4116,9 @@ _LT_EOF mv conftest.$ac_objext conftstm.$ac_objext lt_globsym_save_LIBS=$LIBS lt_globsym_save_CFLAGS=$CFLAGS - LIBS="conftstm.$ac_objext" + LIBS=conftstm.$ac_objext CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)" - if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then + if AC_TRY_EVAL(ac_link) && test -s conftest$ac_exeext; then pipe_works=yes fi LIBS=$lt_globsym_save_LIBS @@ -3842,7 +4139,7 @@ _LT_EOF rm -rf conftest* conftst* # Do not use the global_symbol_pipe unless it works. - if test "$pipe_works" = yes; then + if test yes = "$pipe_works"; then break else lt_cv_sys_global_symbol_pipe= @@ -3869,12 +4166,16 @@ _LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1], [Take the output of nm and produce a listing of raw symbols and C names]) _LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1], [Transform the output of nm in a proper C declaration]) +_LT_DECL([global_symbol_to_import], [lt_cv_sys_global_symbol_to_import], [1], + [Transform the output of nm into a list of symbols to manually relocate]) _LT_DECL([global_symbol_to_c_name_address], [lt_cv_sys_global_symbol_to_c_name_address], [1], [Transform the output of nm in a C name address pair]) _LT_DECL([global_symbol_to_c_name_address_lib_prefix], [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1], [Transform the output of nm in a C name address pair when lib prefix is needed]) +_LT_DECL([nm_interface], [lt_cv_nm_interface], [1], + [The name lister interface]) _LT_DECL([], [nm_file_list_spec], [1], [Specify filename containing input files for $NM]) ]) # _LT_CMD_GLOBAL_SYMBOLS @@ -3890,17 +4191,18 @@ _LT_TAGVAR(lt_prog_compiler_static, $1)= m4_if([$1], [CXX], [ # C++ specific cases for pic, static, wl, etc. - if test "$GXX" = yes; then + if test yes = "$GXX"; then _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' case $host_os in aix*) # All AIX code is PIC. - if test "$host_cpu" = ia64; then + if test ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; amigaos*) @@ -3911,8 +4213,8 @@ m4_if([$1], [CXX], [ ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but - # adding the `-m68020' flag to GCC prevents building anything better, - # like `-m68040'. + # adding the '-m68020' flag to GCC prevents building anything better, + # like '-m68040'. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' ;; esac @@ -3928,6 +4230,11 @@ m4_if([$1], [CXX], [ # (--disable-auto-import) libraries m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + case $host_os in + os2*) + _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static' + ;; + esac ;; darwin* | rhapsody*) # PIC is the default on this platform @@ -3977,7 +4284,7 @@ m4_if([$1], [CXX], [ case $host_os in aix[[4-9]]*) # All AIX code is PIC. - if test "$host_cpu" = ia64; then + if test ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' else @@ -4018,14 +4325,14 @@ m4_if([$1], [CXX], [ case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' - if test "$host_cpu" != ia64; then + _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive' + if test ia64 != "$host_cpu"; then _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' fi ;; aCC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' + _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive' case $host_cpu in hppa*64*|ia64*) # +Z the default @@ -4062,7 +4369,7 @@ m4_if([$1], [CXX], [ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; ecpc* ) - # old Intel C++ for x86_64 which still supported -KPIC. + # old Intel C++ for x86_64, which still supported -KPIC. _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' @@ -4118,7 +4425,7 @@ m4_if([$1], [CXX], [ ;; esac ;; - netbsd* | netbsdelf*-gnu) + netbsd*) ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise @@ -4207,17 +4514,18 @@ m4_if([$1], [CXX], [ fi ], [ - if test "$GCC" = yes; then + if test yes = "$GCC"; then _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' case $host_os in aix*) # All AIX code is PIC. - if test "$host_cpu" = ia64; then + if test ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; amigaos*) @@ -4228,8 +4536,8 @@ m4_if([$1], [CXX], [ ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but - # adding the `-m68020' flag to GCC prevents building anything better, - # like `-m68040'. + # adding the '-m68020' flag to GCC prevents building anything better, + # like '-m68040'. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' ;; esac @@ -4246,6 +4554,11 @@ m4_if([$1], [CXX], [ # (--disable-auto-import) libraries m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + case $host_os in + os2*) + _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static' + ;; + esac ;; darwin* | rhapsody*) @@ -4316,7 +4629,7 @@ m4_if([$1], [CXX], [ case $host_os in aix*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - if test "$host_cpu" = ia64; then + if test ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' else @@ -4324,11 +4637,30 @@ m4_if([$1], [CXX], [ fi ;; + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + case $cc_basename in + nagfor*) + # NAG Fortran compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + esac + ;; + mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + case $host_os in + os2*) + _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static' + ;; + esac ;; hpux9* | hpux10* | hpux11*) @@ -4344,7 +4676,7 @@ m4_if([$1], [CXX], [ ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? - _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' + _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) @@ -4355,7 +4687,7 @@ m4_if([$1], [CXX], [ linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in - # old Intel for x86_64 which still supported -KPIC. + # old Intel for x86_64, which still supported -KPIC. ecc*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' @@ -4380,6 +4712,12 @@ m4_if([$1], [CXX], [ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; + tcc*) + # Fabrice Bellard et al's Tiny C Compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) @@ -4477,7 +4815,7 @@ m4_if([$1], [CXX], [ ;; sysv4*MP*) - if test -d /usr/nec ;then + if test -d /usr/nec; then _LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi @@ -4506,7 +4844,7 @@ m4_if([$1], [CXX], [ fi ]) case $host_os in - # For platforms which do not support PIC, -DPIC is meaningless: + # For platforms that do not support PIC, -DPIC is meaningless: *djgpp*) _LT_TAGVAR(lt_prog_compiler_pic, $1)= ;; @@ -4572,17 +4910,21 @@ m4_if([$1], [CXX], [ case $host_os in aix[[4-9]]*) # If we're using GNU nm, then we don't want the "-C" option. - # -C means demangle to AIX nm, but means don't demangle with GNU nm - # Also, AIX nm treats weak defined symbols like other global defined - # symbols, whereas GNU nm marks them as "W". + # -C means demangle to GNU nm, but means don't demangle to AIX nm. + # Without the "-l" option, or with the "-B" option, AIX nm treats + # weak defined symbols like other global defined symbols, whereas + # GNU nm marks them as "W". + # While the 'weak' keyword is ignored in the Export File, we need + # it in the Import File for the 'aix-soname' feature, so we have + # to replace the "-B" option with "-P" for AIX nm. if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then - _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' else - _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + _LT_TAGVAR(export_symbols_cmds, $1)='`func_echo_all $NM | $SED -e '\''s/B\([[^B]]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && ([substr](\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' fi ;; pw32*) - _LT_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds" + _LT_TAGVAR(export_symbols_cmds, $1)=$ltdll_cmds ;; cygwin* | mingw* | cegcc*) case $cc_basename in @@ -4595,9 +4937,6 @@ m4_if([$1], [CXX], [ ;; esac ;; - linux* | k*bsd*-gnu | gnu*) - _LT_TAGVAR(link_all_deplibs, $1)=no - ;; *) _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' ;; @@ -4631,9 +4970,9 @@ m4_if([$1], [CXX], [ # included in the symbol list _LT_TAGVAR(include_expsyms, $1)= # exclude_expsyms can be an extended regexp of symbols to exclude - # it will be wrapped by ` (' and `)$', so one must not match beginning or - # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', - # as well as any symbol that contains `d'. + # it will be wrapped by ' (' and ')$', so one must not match beginning or + # end of line. Example: 'a|bc|.*d.*' will exclude the symbols 'a' and 'bc', + # as well as any symbol that contains 'd'. _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if @@ -4649,7 +4988,7 @@ dnl Note also adjust exclude_expsyms for C++ above. # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. - if test "$GCC" != yes; then + if test yes != "$GCC"; then with_gnu_ld=no fi ;; @@ -4657,12 +4996,9 @@ dnl Note also adjust exclude_expsyms for C++ above. # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; - openbsd*) + openbsd* | bitrig*) with_gnu_ld=no ;; - linux* | k*bsd*-gnu | gnu*) - _LT_TAGVAR(link_all_deplibs, $1)=no - ;; esac _LT_TAGVAR(ld_shlibs, $1)=yes @@ -4670,7 +5006,7 @@ dnl Note also adjust exclude_expsyms for C++ above. # On some targets, GNU ld is compatible enough with the native linker # that we're better off using the native interface for both. lt_use_gnu_ld_interface=no - if test "$with_gnu_ld" = yes; then + if test yes = "$with_gnu_ld"; then case $host_os in aix*) # The AIX port of GNU ld has always aspired to compatibility @@ -4692,24 +5028,24 @@ dnl Note also adjust exclude_expsyms for C++ above. esac fi - if test "$lt_use_gnu_ld_interface" = yes; then + if test yes = "$lt_use_gnu_ld_interface"; then # If archive_cmds runs LD, not CC, wlarc should be empty - wlarc='${wl}' + wlarc='$wl' # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. runpath_var=LD_RUN_PATH - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then - _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' else _LT_TAGVAR(whole_archive_flag_spec, $1)= fi supports_anon_versioning=no - case `$LD -v 2>&1` in + case `$LD -v | $SED -e 's/([^)]\+)\s\+//' 2>&1` in *GNU\ gold*) supports_anon_versioning=yes ;; *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... @@ -4722,7 +5058,7 @@ dnl Note also adjust exclude_expsyms for C++ above. case $host_os in aix[[3-9]]*) # On AIX/PPC, the GNU linker is very broken - if test "$host_cpu" != ia64; then + if test ia64 != "$host_cpu"; then _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 @@ -4741,7 +5077,7 @@ _LT_EOF case $host_cpu in powerpc) # see comment about AmigaOS4 .so support - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='' ;; m68k) @@ -4757,7 +5093,7 @@ _LT_EOF _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME - _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi @@ -4767,7 +5103,7 @@ _LT_EOF # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, # as there is no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-all-symbols' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes @@ -4775,61 +5111,89 @@ _LT_EOF _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' - # If the export-symbols file already is a .def file (1st line - # is EXPORTS), use it as is; otherwise, prepend... - _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then - cp $export_symbols $output_objdir/$soname.def; - else - echo EXPORTS > $output_objdir/$soname.def; - cat $export_symbols >> $output_objdir/$soname.def; - fi~ - $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file, use it as + # is; otherwise, prepend EXPORTS... + _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; haiku*) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(link_all_deplibs, $1)=yes ;; + os2*) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + shrext_cmds=.dll + _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + prefix_cmds="$SED"~ + if test EXPORTS = "`$SED 1q $export_symbols`"; then + prefix_cmds="$prefix_cmds -e 1d"; + fi~ + prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ + cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + ;; + interix[[3-9]]*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) tmp_diet=no - if test "$host_os" = linux-dietlibc; then + if test linux-dietlibc = "$host_os"; then case $cc_basename in diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) esac fi if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ - && test "$tmp_diet" = no + && test no = "$tmp_diet" then tmp_addflag=' $pic_flag' tmp_sharedflag='-shared' case $cc_basename,$host_cpu in pgcc*) # Portland Group C compiler - _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' tmp_addflag=' $pic_flag' ;; pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group f77 and f90 compilers - _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; @@ -4840,42 +5204,47 @@ _LT_EOF lf95*) # Lahey Fortran 8.1 _LT_TAGVAR(whole_archive_flag_spec, $1)= tmp_sharedflag='--shared' ;; + nagfor*) # NAGFOR 5.3 + tmp_sharedflag='-Wl,-shared' ;; xl[[cC]]* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below) tmp_sharedflag='-qmkshrobj' tmp_addflag= ;; nvcc*) # Cuda Compiler Driver 2.2 - _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes ;; esac case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 - _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes tmp_sharedflag='-G' ;; *Sun\ F*) # Sun Fortran 8.3 tmp_sharedflag='-G' ;; esac - _LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' - if test "x$supports_anon_versioning" = xyes; then + if test yes = "$supports_anon_versioning"; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ - cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ - echo "local: *; };" >> $output_objdir/$libname.ver~ - $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' fi case $cc_basename in + tcc*) + _LT_TAGVAR(export_dynamic_flag_spec, $1)='-rdynamic' + ;; xlf* | bgf* | bgxlf* | mpixlf*) # IBM XL Fortran 10.1 on PPC cannot create shared libs itself _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' - if test "x$supports_anon_versioning" = xyes; then + if test yes = "$supports_anon_versioning"; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ - cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ - echo "local: *; };" >> $output_objdir/$libname.ver~ - $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' fi ;; esac @@ -4884,13 +5253,13 @@ _LT_EOF fi ;; - netbsd* | netbsdelf*-gnu) + netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' fi ;; @@ -4908,8 +5277,8 @@ _LT_EOF _LT_EOF elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi @@ -4921,7 +5290,7 @@ _LT_EOF _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 -*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not +*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 cannot *** reliably create shared libraries on SCO systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.16.91.0.3 or newer. Another option is to modify @@ -4936,9 +5305,9 @@ _LT_EOF # DT_RUNPATH tag from executables and libraries. But doing so # requires that you compile everything twice, which is a pain. if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi @@ -4955,15 +5324,15 @@ _LT_EOF *) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac - if test "$_LT_TAGVAR(ld_shlibs, $1)" = no; then + if test no = "$_LT_TAGVAR(ld_shlibs, $1)"; then runpath_var= _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= @@ -4979,7 +5348,7 @@ _LT_EOF # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. _LT_TAGVAR(hardcode_minus_L, $1)=yes - if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then + if test yes = "$GCC" && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. _LT_TAGVAR(hardcode_direct, $1)=unsupported @@ -4987,34 +5356,57 @@ _LT_EOF ;; aix[[4-9]]*) - if test "$host_cpu" = ia64; then + if test ia64 = "$host_cpu"; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' - no_entry_flag="" + no_entry_flag= else # If we're using GNU nm, then we don't want the "-C" option. - # -C means demangle to AIX nm, but means don't demangle with GNU nm - # Also, AIX nm treats weak defined symbols like other global - # defined symbols, whereas GNU nm marks them as "W". + # -C means demangle to GNU nm, but means don't demangle to AIX nm. + # Without the "-l" option, or with the "-B" option, AIX nm treats + # weak defined symbols like other global defined symbols, whereas + # GNU nm marks them as "W". + # While the 'weak' keyword is ignored in the Export File, we need + # it in the Import File for the 'aix-soname' feature, so we have + # to replace the "-B" option with "-P" for AIX nm. if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then - _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' else - _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + _LT_TAGVAR(export_symbols_cmds, $1)='`func_echo_all $NM | $SED -e '\''s/B\([[^B]]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && ([substr](\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we - # need to do runtime linking. + # have runtime linking enabled, and use it for executables. + # For shared libraries, we enable/disable runtime linking + # depending on the kind of the shared library created - + # when "with_aix_soname,aix_use_runtimelinking" is: + # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables + # "aix,yes" lib.so shared, rtl:yes, for executables + # lib.a static archive + # "both,no" lib.so.V(shr.o) shared, rtl:yes + # lib.a(lib.so.V) shared, rtl:no, for executables + # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a(lib.so.V) shared, rtl:no + # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a static archive case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) for ld_flag in $LDFLAGS; do - if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then + if (test x-brtl = "x$ld_flag" || test x-Wl,-brtl = "x$ld_flag"); then aix_use_runtimelinking=yes break fi done + if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then + # With aix-soname=svr4, we create the lib.so.V shared archives only, + # so we don't have lib.a shared libs to link our executables. + # We have to force runtime linking in this case. + aix_use_runtimelinking=yes + LDFLAGS="$LDFLAGS -Wl,-brtl" + fi ;; esac @@ -5033,13 +5425,21 @@ _LT_EOF _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes - _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' + _LT_TAGVAR(file_list_spec, $1)='$wl-f,' + case $with_aix_soname,$aix_use_runtimelinking in + aix,*) ;; # traditional, no import file + svr4,* | *,yes) # use import file + # The Import File defines what to hardcode. + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=no + ;; + esac - if test "$GCC" = yes; then + if test yes = "$GCC"; then case $host_os in aix4.[[012]]|aix4.[[012]].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ - collect2name=`${CC} -print-prog-name=collect2` + collect2name=`$CC -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then @@ -5058,62 +5458,80 @@ _LT_EOF ;; esac shared_flag='-shared' - if test "$aix_use_runtimelinking" = yes; then - shared_flag="$shared_flag "'${wl}-G' + if test yes = "$aix_use_runtimelinking"; then + shared_flag="$shared_flag "'$wl-G' fi - _LT_TAGVAR(link_all_deplibs, $1)=no + # Need to ensure runtime linking is disabled for the traditional + # shared library, or the linker may eventually find shared libraries + # /with/ Import File - we do not want to mix them. + shared_flag_aix='-shared' + shared_flag_svr4='-shared $wl-G' else # not using gcc - if test "$host_cpu" = ia64; then + if test ia64 = "$host_cpu"; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else - if test "$aix_use_runtimelinking" = yes; then - shared_flag='${wl}-G' + if test yes = "$aix_use_runtimelinking"; then + shared_flag='$wl-G' else - shared_flag='${wl}-bM:SRE' + shared_flag='$wl-bM:SRE' fi + shared_flag_aix='$wl-bM:SRE' + shared_flag_svr4='$wl-G' fi fi - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. _LT_TAGVAR(always_export_symbols, $1)=yes - if test "$aix_use_runtimelinking" = yes; then + if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. _LT_TAGVAR(allow_undefined_flag, $1)='-berok' # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath" + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag else - if test "$host_cpu" = ia64; then - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' + if test ia64 = "$host_cpu"; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $libdir:/usr/lib:/lib' _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" - _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" + _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. - _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' - _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' - if test "$with_gnu_ld" = yes; then + _LT_TAGVAR(no_undefined_flag, $1)=' $wl-bernotok' + _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-berok' + if test yes = "$with_gnu_ld"; then # We only use this code for GNU lds that support --whole-archive. - _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' fi _LT_TAGVAR(archive_cmds_need_lc, $1)=yes - # This is similar to how AIX traditionally builds its shared libraries. - _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + _LT_TAGVAR(archive_expsym_cmds, $1)='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' + # -brtl affects multiple linker settings, -berok does not and is overridden later + compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([[, ]]\\)%-berok\\1%g"`' + if test svr4 != "$with_aix_soname"; then + # This is similar to how AIX traditionally builds its shared libraries. + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' + fi + if test aix != "$with_aix_soname"; then + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' + else + # used by -dlpreopen to get the symbols + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$MV $output_objdir/$realname.d/$soname $output_objdir' + fi + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$RM -r $output_objdir/$realname.d' fi fi ;; @@ -5122,7 +5540,7 @@ _LT_EOF case $host_cpu in powerpc) # see comment about AmigaOS4 .so support - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='' ;; m68k) @@ -5152,16 +5570,17 @@ _LT_EOF # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. - shrext_cmds=".dll" + shrext_cmds=.dll # FIXME: Setting linknames here is a bad hack. - _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' - _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then - sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; - else - sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; - fi~ - $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ - linknames=' + _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' + _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then + cp "$export_symbols" "$output_objdir/$soname.def"; + echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; + else + $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; + fi~ + $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ + linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes @@ -5170,18 +5589,18 @@ _LT_EOF # Don't use ranlib _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ - lt_tool_outputfile="@TOOL_OUTPUT@"~ - case $lt_outputfile in - *.exe|*.EXE) ;; - *) - lt_outputfile="$lt_outputfile.exe" - lt_tool_outputfile="$lt_tool_outputfile.exe" - ;; - esac~ - if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then - $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; - $RM "$lt_outputfile.manifest"; - fi' + lt_tool_outputfile="@TOOL_OUTPUT@"~ + case $lt_outputfile in + *.exe|*.EXE) ;; + *) + lt_outputfile=$lt_outputfile.exe + lt_tool_outputfile=$lt_tool_outputfile.exe + ;; + esac~ + if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then + $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; + $RM "$lt_outputfile.manifest"; + fi' ;; *) # Assume MSVC wrapper @@ -5190,7 +5609,7 @@ _LT_EOF # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. - shrext_cmds=".dll" + shrext_cmds=.dll # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. @@ -5240,33 +5659,33 @@ _LT_EOF ;; hpux9*) - if test "$GCC" = yes; then - _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + if test yes = "$GCC"; then + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' else - _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' fi - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_direct, $1)=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' ;; hpux10*) - if test "$GCC" = yes && test "$with_gnu_ld" = no; then - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + if test yes,no = "$GCC,$with_gnu_ld"; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi - if test "$with_gnu_ld" = no; then - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + if test no = "$with_gnu_ld"; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes @@ -5274,25 +5693,25 @@ _LT_EOF ;; hpux11*) - if test "$GCC" = yes && test "$with_gnu_ld" = no; then + if test yes,no = "$GCC,$with_gnu_ld"; then case $host_cpu in hppa*64*) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case $host_cpu in hppa*64*) - _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) - _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) m4_if($1, [], [ @@ -5300,14 +5719,14 @@ _LT_EOF # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) _LT_LINKER_OPTION([if $CC understands -b], _LT_TAGVAR(lt_cv_prog_compiler__b, $1), [-b], - [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'], + [_LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'], [_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'])], - [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags']) + [_LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags']) ;; esac fi - if test "$with_gnu_ld" = no; then - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + if test no = "$with_gnu_ld"; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: case $host_cpu in @@ -5318,7 +5737,7 @@ _LT_EOF *) _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. @@ -5329,16 +5748,16 @@ _LT_EOF ;; irix5* | irix6* | nonstopux*) - if test "$GCC" = yes; then - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + if test yes = "$GCC"; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' # Try to use the -exported_symbol ld option, if it does not # work, assume that -exports_file does not work either and # implicitly export all symbols. # This should be the same for all languages, so no per-tag cache variable. AC_CACHE_CHECK([whether the $host_os linker accepts -exported_symbol], [lt_cv_irix_exported_symbol], - [save_LDFLAGS="$LDFLAGS" - LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" + [save_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS -shared $wl-exported_symbol ${wl}foo $wl-update_registry $wl/dev/null" AC_LINK_IFELSE( [AC_LANG_SOURCE( [AC_LANG_CASE([C], [[int foo (void) { return 0; }]], @@ -5351,22 +5770,32 @@ _LT_EOF end]])])], [lt_cv_irix_exported_symbol=yes], [lt_cv_irix_exported_symbol=no]) - LDFLAGS="$save_LDFLAGS"]) - if test "$lt_cv_irix_exported_symbol" = yes; then - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' + LDFLAGS=$save_LDFLAGS]) + if test yes = "$lt_cv_irix_exported_symbol"; then + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations $wl-exports_file $wl$export_symbols -o $lib' fi else - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -exports_file $export_symbols -o $lib' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(inherit_rpath, $1)=yes _LT_TAGVAR(link_all_deplibs, $1)=yes ;; - netbsd* | netbsdelf*-gnu) + linux*) + case $cc_basename in + tcc*) + # Fabrice Bellard et al's Tiny C Compiler + _LT_TAGVAR(ld_shlibs, $1)=yes + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else @@ -5380,7 +5809,7 @@ _LT_EOF newsos6) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; @@ -5388,27 +5817,19 @@ _LT_EOF *nto* | *qnx*) ;; - openbsd*) + openbsd* | bitrig*) if test -f /usr/libexec/ld.so; then _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=yes - if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags $wl-retain-symbols-file,$export_symbols' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' else - case $host_os in - openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*) - _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' - ;; - *) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' - ;; - esac + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' fi else _LT_TAGVAR(ld_shlibs, $1)=no @@ -5419,33 +5840,53 @@ _LT_EOF _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)=unsupported - _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' - _LT_TAGVAR(old_archive_from_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' + shrext_cmds=.dll + _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + prefix_cmds="$SED"~ + if test EXPORTS = "`$SED 1q $export_symbols`"; then + prefix_cmds="$prefix_cmds -e 1d"; + fi~ + prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ + cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes ;; osf3*) - if test "$GCC" = yes; then - _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' - _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + if test yes = "$GCC"; then + _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' else _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' - _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag - if test "$GCC" = yes; then - _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' - _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + if test yes = "$GCC"; then + _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $pic_flag $libobjs $deplibs $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' else _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' - _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ - $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' + $CC -shared$allow_undefined_flag $wl-input $wl$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~$RM $lib.exp' # Both c and cxx compiler support -rpath directly _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' @@ -5456,24 +5897,24 @@ _LT_EOF solaris*) _LT_TAGVAR(no_undefined_flag, $1)=' -z defs' - if test "$GCC" = yes; then - wlarc='${wl}' - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + if test yes = "$GCC"; then + wlarc='$wl' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl-z ${wl}text $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + $CC -shared $pic_flag $wl-z ${wl}text $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' else case `$CC -V 2>&1` in *"Compilers 5.0"*) wlarc='' - _LT_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(archive_cmds, $1)='$LD -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' + $LD -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' ;; *) - wlarc='${wl}' - _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' + wlarc='$wl' + _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + $CC -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' ;; esac fi @@ -5483,11 +5924,11 @@ _LT_EOF solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) # The compiler driver will combine and reorder linker options, - # but understands `-z linker_flag'. GCC discards it without `$wl', + # but understands '-z linker_flag'. GCC discards it without '$wl', # but is careful enough not to reorder. # Supported since Solaris 2.6 (maybe 2.5.1?) - if test "$GCC" = yes; then - _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' + if test yes = "$GCC"; then + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' else _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' fi @@ -5497,10 +5938,10 @@ _LT_EOF ;; sunos4*) - if test "x$host_vendor" = xsequent; then + if test sequent = "$host_vendor"; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. - _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h $soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi @@ -5549,43 +5990,43 @@ _LT_EOF ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) - _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' + _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var='LD_RUN_PATH' - if test "$GCC" = yes; then - _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + if test yes = "$GCC"; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else - _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; sysv5* | sco3.2v5* | sco5v6*) - # Note: We can NOT use -z defs as we might desire, because we do not + # Note: We CANNOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. - _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' - _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' + _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' + _LT_TAGVAR(allow_undefined_flag, $1)='$wl-z,nodefs' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Bexport' runpath_var='LD_RUN_PATH' - if test "$GCC" = yes; then - _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + if test yes = "$GCC"; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else - _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; @@ -5600,17 +6041,17 @@ _LT_EOF ;; esac - if test x$host_vendor = xsni; then + if test sni = "$host_vendor"; then case $host in sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Blargedynsym' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Blargedynsym' ;; esac fi fi ]) AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) -test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no +test no = "$_LT_TAGVAR(ld_shlibs, $1)" && can_build_shared=no _LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld @@ -5627,7 +6068,7 @@ x|xyes) # Assume -lc should be added _LT_TAGVAR(archive_cmds_need_lc, $1)=yes - if test "$enable_shared" = yes && test "$GCC" = yes; then + if test yes,yes = "$GCC,$enable_shared"; then case $_LT_TAGVAR(archive_cmds, $1) in *'~'*) # FIXME: we may have to deal with multi-command sequences. @@ -5707,12 +6148,12 @@ _LT_TAGDECL([], [hardcode_libdir_flag_spec], [1], _LT_TAGDECL([], [hardcode_libdir_separator], [1], [Whether we need a single "-rpath" flag with a separated argument]) _LT_TAGDECL([], [hardcode_direct], [0], - [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes + [Set to "yes" if using DIR/libNAME$shared_ext during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_direct_absolute], [0], - [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes + [Set to "yes" if using DIR/libNAME$shared_ext during linking hardcodes DIR into the resulting binary and the resulting library dependency is - "absolute", i.e impossible to change by setting ${shlibpath_var} if the + "absolute", i.e impossible to change by setting $shlibpath_var if the library is relocated]) _LT_TAGDECL([], [hardcode_minus_L], [0], [Set to "yes" if using the -LDIR flag during linking hardcodes DIR @@ -5753,10 +6194,10 @@ dnl [Compiler flag to generate thread safe objects]) # ------------------------ # Ensure that the configuration variables for a C compiler are suitably # defined. These variables are subsequently used by _LT_CONFIG to write -# the compiler configuration to `libtool'. +# the compiler configuration to 'libtool'. m4_defun([_LT_LANG_C_CONFIG], [m4_require([_LT_DECL_EGREP])dnl -lt_save_CC="$CC" +lt_save_CC=$CC AC_LANG_PUSH(C) # Source file extension for C test sources. @@ -5792,18 +6233,18 @@ if test -n "$compiler"; then LT_SYS_DLOPEN_SELF _LT_CMD_STRIPLIB - # Report which library types will actually be built + # Report what library types will actually be built AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) - test "$can_build_shared" = "no" && enable_shared=no + test no = "$can_build_shared" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) - test "$enable_shared" = yes && enable_static=no + test yes = "$enable_shared" && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' @@ -5811,8 +6252,12 @@ if test -n "$compiler"; then ;; aix[[4-9]]*) - if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then - test "$enable_shared" = yes && enable_static=no + if test ia64 != "$host_cpu"; then + case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in + yes,aix,yes) ;; # shared object as lib.so file only + yes,svr4,*) ;; # shared object as lib.so archive member only + yes,*) enable_static=no ;; # shared object in lib.a archive as well + esac fi ;; esac @@ -5820,13 +6265,13 @@ if test -n "$compiler"; then AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. - test "$enable_shared" = yes || enable_static=yes + test yes = "$enable_shared" || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_CONFIG($1) fi AC_LANG_POP -CC="$lt_save_CC" +CC=$lt_save_CC ])# _LT_LANG_C_CONFIG @@ -5834,14 +6279,14 @@ CC="$lt_save_CC" # -------------------------- # Ensure that the configuration variables for a C++ compiler are suitably # defined. These variables are subsequently used by _LT_CONFIG to write -# the compiler configuration to `libtool'. +# the compiler configuration to 'libtool'. m4_defun([_LT_LANG_CXX_CONFIG], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_PATH_MANIFEST_TOOL])dnl -if test -n "$CXX" && ( test "X$CXX" != "Xno" && - ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || - (test "X$CXX" != "Xg++"))) ; then +if test -n "$CXX" && ( test no != "$CXX" && + ( (test g++ = "$CXX" && `g++ -v >/dev/null 2>&1` ) || + (test g++ != "$CXX"))); then AC_PROG_CXXCPP else _lt_caught_CXX_error=yes @@ -5883,7 +6328,7 @@ _LT_TAGVAR(objext, $1)=$objext # the CXX compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. -if test "$_lt_caught_CXX_error" != yes; then +if test yes != "$_lt_caught_CXX_error"; then # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" @@ -5925,35 +6370,35 @@ if test "$_lt_caught_CXX_error" != yes; then if test -n "$compiler"; then # We don't want -fno-exception when compiling C++ code, so set the # no_builtin_flag separately - if test "$GXX" = yes; then + if test yes = "$GXX"; then _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' else _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= fi - if test "$GXX" = yes; then + if test yes = "$GXX"; then # Set up default GNU C++ configuration LT_PATH_LD # Check if GNU C++ uses GNU ld as the underlying linker, since the # archiving commands below assume that GNU ld is being used. - if test "$with_gnu_ld" = yes; then - _LT_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + if test yes = "$with_gnu_ld"; then + _LT_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' # If archive_cmds runs LD, not CC, wlarc should be empty # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to # investigate it a little bit more. (MM) - wlarc='${wl}' + wlarc='$wl' # ancient GNU ld didn't support --whole-archive et. al. if eval "`$CC -print-prog-name=ld` --help 2>&1" | $GREP 'no-whole-archive' > /dev/null; then - _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' else _LT_TAGVAR(whole_archive_flag_spec, $1)= fi @@ -5989,18 +6434,30 @@ if test "$_lt_caught_CXX_error" != yes; then _LT_TAGVAR(ld_shlibs, $1)=no ;; aix[[4-9]]*) - if test "$host_cpu" = ia64; then + if test ia64 = "$host_cpu"; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' - no_entry_flag="" + no_entry_flag= else aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we - # need to do runtime linking. + # have runtime linking enabled, and use it for executables. + # For shared libraries, we enable/disable runtime linking + # depending on the kind of the shared library created - + # when "with_aix_soname,aix_use_runtimelinking" is: + # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables + # "aix,yes" lib.so shared, rtl:yes, for executables + # lib.a static archive + # "both,no" lib.so.V(shr.o) shared, rtl:yes + # lib.a(lib.so.V) shared, rtl:no, for executables + # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a(lib.so.V) shared, rtl:no + # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a static archive case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) for ld_flag in $LDFLAGS; do case $ld_flag in @@ -6010,6 +6467,13 @@ if test "$_lt_caught_CXX_error" != yes; then ;; esac done + if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then + # With aix-soname=svr4, we create the lib.so.V shared archives only, + # so we don't have lib.a shared libs to link our executables. + # We have to force runtime linking in this case. + aix_use_runtimelinking=yes + LDFLAGS="$LDFLAGS -Wl,-brtl" + fi ;; esac @@ -6028,13 +6492,21 @@ if test "$_lt_caught_CXX_error" != yes; then _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes - _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' + _LT_TAGVAR(file_list_spec, $1)='$wl-f,' + case $with_aix_soname,$aix_use_runtimelinking in + aix,*) ;; # no import file + svr4,* | *,yes) # use import file + # The Import File defines what to hardcode. + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=no + ;; + esac - if test "$GXX" = yes; then + if test yes = "$GXX"; then case $host_os in aix4.[[012]]|aix4.[[012]].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ - collect2name=`${CC} -print-prog-name=collect2` + collect2name=`$CC -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then @@ -6052,64 +6524,84 @@ if test "$_lt_caught_CXX_error" != yes; then fi esac shared_flag='-shared' - if test "$aix_use_runtimelinking" = yes; then - shared_flag="$shared_flag "'${wl}-G' + if test yes = "$aix_use_runtimelinking"; then + shared_flag=$shared_flag' $wl-G' fi + # Need to ensure runtime linking is disabled for the traditional + # shared library, or the linker may eventually find shared libraries + # /with/ Import File - we do not want to mix them. + shared_flag_aix='-shared' + shared_flag_svr4='-shared $wl-G' else # not using gcc - if test "$host_cpu" = ia64; then + if test ia64 = "$host_cpu"; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else - if test "$aix_use_runtimelinking" = yes; then - shared_flag='${wl}-G' + if test yes = "$aix_use_runtimelinking"; then + shared_flag='$wl-G' else - shared_flag='${wl}-bM:SRE' + shared_flag='$wl-bM:SRE' fi + shared_flag_aix='$wl-bM:SRE' + shared_flag_svr4='$wl-G' fi fi - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to # export. _LT_TAGVAR(always_export_symbols, $1)=yes - if test "$aix_use_runtimelinking" = yes; then + if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. - _LT_TAGVAR(allow_undefined_flag, $1)='-berok' + # The "-G" linker flag allows undefined symbols. + _LT_TAGVAR(no_undefined_flag, $1)='-bernotok' # Determine the default libpath from the value encoded in an empty # executable. _LT_SYS_MODULE_PATH_AIX([$1]) - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath" - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag else - if test "$host_cpu" = ia64; then - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' + if test ia64 = "$host_cpu"; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $libdir:/usr/lib:/lib' _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" - _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" + _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. - _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' - _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' - if test "$with_gnu_ld" = yes; then + _LT_TAGVAR(no_undefined_flag, $1)=' $wl-bernotok' + _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-berok' + if test yes = "$with_gnu_ld"; then # We only use this code for GNU lds that support --whole-archive. - _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' fi _LT_TAGVAR(archive_cmds_need_lc, $1)=yes - # This is similar to how AIX traditionally builds its shared - # libraries. - _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + _LT_TAGVAR(archive_expsym_cmds, $1)='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' + # -brtl affects multiple linker settings, -berok does not and is overridden later + compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([[, ]]\\)%-berok\\1%g"`' + if test svr4 != "$with_aix_soname"; then + # This is similar to how AIX traditionally builds its shared + # libraries. Need -bnortl late, we may have -brtl in LDFLAGS. + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' + fi + if test aix != "$with_aix_soname"; then + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' + else + # used by -dlpreopen to get the symbols + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$MV $output_objdir/$realname.d/$soname $output_objdir' + fi + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$RM -r $output_objdir/$realname.d' fi fi ;; @@ -6119,7 +6611,7 @@ if test "$_lt_caught_CXX_error" != yes; then _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME - _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi @@ -6147,57 +6639,58 @@ if test "$_lt_caught_CXX_error" != yes; then # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. - shrext_cmds=".dll" + shrext_cmds=.dll # FIXME: Setting linknames here is a bad hack. - _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' - _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then - $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; - else - $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; - fi~ - $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ - linknames=' + _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' + _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then + cp "$export_symbols" "$output_objdir/$soname.def"; + echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; + else + $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; + fi~ + $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ + linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes # Don't use ranlib _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ - lt_tool_outputfile="@TOOL_OUTPUT@"~ - case $lt_outputfile in - *.exe|*.EXE) ;; - *) - lt_outputfile="$lt_outputfile.exe" - lt_tool_outputfile="$lt_tool_outputfile.exe" - ;; - esac~ - func_to_tool_file "$lt_outputfile"~ - if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then - $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; - $RM "$lt_outputfile.manifest"; - fi' + lt_tool_outputfile="@TOOL_OUTPUT@"~ + case $lt_outputfile in + *.exe|*.EXE) ;; + *) + lt_outputfile=$lt_outputfile.exe + lt_tool_outputfile=$lt_tool_outputfile.exe + ;; + esac~ + func_to_tool_file "$lt_outputfile"~ + if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then + $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; + $RM "$lt_outputfile.manifest"; + fi' ;; *) # g++ # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, # as there is no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-all-symbols' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then - _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' - # If the export-symbols file already is a .def file (1st line - # is EXPORTS), use it as is; otherwise, prepend... - _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then - cp $export_symbols $output_objdir/$soname.def; - else - echo EXPORTS > $output_objdir/$soname.def; - cat $export_symbols >> $output_objdir/$soname.def; - fi~ - $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file, use it as + # is; otherwise, prepend EXPORTS... + _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi @@ -6208,6 +6701,34 @@ if test "$_lt_caught_CXX_error" != yes; then _LT_DARWIN_LINKER_FEATURES($1) ;; + os2*) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + shrext_cmds=.dll + _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + prefix_cmds="$SED"~ + if test EXPORTS = "`$SED 1q $export_symbols`"; then + prefix_cmds="$prefix_cmds -e 1d"; + fi~ + prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ + cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + ;; + dgux*) case $cc_basename in ec++*) @@ -6243,14 +6764,14 @@ if test "$_lt_caught_CXX_error" != yes; then ;; haiku*) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(link_all_deplibs, $1)=yes ;; hpux9*) - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, # but as the default @@ -6262,7 +6783,7 @@ if test "$_lt_caught_CXX_error" != yes; then _LT_TAGVAR(ld_shlibs, $1)=no ;; aCC*) - _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. @@ -6271,11 +6792,11 @@ if test "$_lt_caught_CXX_error" != yes; then # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. - output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) - if test "$GXX" = yes; then - _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + if test yes = "$GXX"; then + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no @@ -6285,15 +6806,15 @@ if test "$_lt_caught_CXX_error" != yes; then ;; hpux10*|hpux11*) - if test $with_gnu_ld = no; then - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + if test no = "$with_gnu_ld"; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: case $host_cpu in hppa*64*|ia64*) ;; *) - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' ;; esac fi @@ -6319,13 +6840,13 @@ if test "$_lt_caught_CXX_error" != yes; then aCC*) case $host_cpu in hppa*64*) - _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) - _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) - _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac # Commands to make compiler produce verbose output that lists @@ -6336,20 +6857,20 @@ if test "$_lt_caught_CXX_error" != yes; then # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. - output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) - if test "$GXX" = yes; then - if test $with_gnu_ld = no; then + if test yes = "$GXX"; then + if test no = "$with_gnu_ld"; then case $host_cpu in hppa*64*) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac fi @@ -6364,22 +6885,22 @@ if test "$_lt_caught_CXX_error" != yes; then interix[[3-9]]*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; irix5* | irix6*) case $cc_basename in CC*) # SGI C++ - _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' # Archives containing C++ object files must be created using # "CC -ar", where "CC" is the IRIX C++ compiler. This is @@ -6388,17 +6909,17 @@ if test "$_lt_caught_CXX_error" != yes; then _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs' ;; *) - if test "$GXX" = yes; then - if test "$with_gnu_ld" = no; then - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + if test yes = "$GXX"; then + if test no = "$with_gnu_ld"; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' else - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` -o $lib' fi fi _LT_TAGVAR(link_all_deplibs, $1)=yes ;; esac - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(inherit_rpath, $1)=yes ;; @@ -6411,8 +6932,8 @@ if test "$_lt_caught_CXX_error" != yes; then # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. - _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' + _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib $wl-retain-symbols-file,$export_symbols; mv \$templib $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. @@ -6421,10 +6942,10 @@ if test "$_lt_caught_CXX_error" != yes; then # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. - output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' # Archives containing C++ object files must be created using # "CC -Bstatic", where "CC" is the KAI C++ compiler. @@ -6438,59 +6959,59 @@ if test "$_lt_caught_CXX_error" != yes; then # earlier do not add the objects themselves. case `$CC -V 2>&1` in *"Version 7."*) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' ;; *) # Version 8.0 or newer tmp_idyn= case $host_cpu in ia64*) tmp_idyn=' -i_dynamic';; esac - _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' ;; esac _LT_TAGVAR(archive_cmds_need_lc, $1)=no - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' - _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive' ;; pgCC* | pgcpp*) # Portland Group C++ compiler case `$CC -V` in *pgCC\ [[1-5]].* | *pgcpp\ [[1-5]].*) _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~ - rm -rf $tpldir~ - $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ - compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ + compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~ - rm -rf $tpldir~ - $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ - $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ - $RANLIB $oldlib' + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ + $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ + $RANLIB $oldlib' _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~ - rm -rf $tpldir~ - $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ - $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ + $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~ - rm -rf $tpldir~ - $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ - $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ + $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' ;; *) # Version 6 and above use weak symbols - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' ;; esac - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' - _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl--rpath $wl$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' ;; cxx*) # Compaq C++ - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib $wl-retain-symbols-file $wl$export_symbols' runpath_var=LD_RUN_PATH _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' @@ -6504,18 +7025,18 @@ if test "$_lt_caught_CXX_error" != yes; then # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. - output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' ;; xl* | mpixl* | bgxl*) # IBM XL 8.0 on PPC, with GNU ld - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' - _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - if test "x$supports_anon_versioning" = xyes; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' + _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + if test yes = "$supports_anon_versioning"; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ - cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ - echo "local: *; };" >> $output_objdir/$libname.ver~ - $CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' fi ;; *) @@ -6523,10 +7044,10 @@ if test "$_lt_caught_CXX_error" != yes; then *Sun\ C*) # Sun C++ 5.9 _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' - _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols' + _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file $wl$export_symbols' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' - _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes # Not sure whether something based on @@ -6584,22 +7105,17 @@ if test "$_lt_caught_CXX_error" != yes; then _LT_TAGVAR(ld_shlibs, $1)=yes ;; - openbsd2*) - # C++ shared libraries are fairly broken - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - - openbsd*) + openbsd* | bitrig*) if test -f /usr/libexec/ld.so; then _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' - if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' - _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`"; then + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file,$export_symbols -o $lib' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' fi output_verbose_link_cmd=func_echo_all else @@ -6615,9 +7131,9 @@ if test "$_lt_caught_CXX_error" != yes; then # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. - _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Archives containing C++ object files must be created using @@ -6635,17 +7151,17 @@ if test "$_lt_caught_CXX_error" != yes; then cxx*) case $host in osf3*) - _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' - _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $soname `test -n "$verstring" && func_echo_all "$wl-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' ;; *) _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' - _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ - echo "-hidden">> $lib.exp~ - $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~ - $RM $lib.exp' + echo "-hidden">> $lib.exp~ + $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname $wl-input $wl$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~ + $RM $lib.exp' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' ;; esac @@ -6660,21 +7176,21 @@ if test "$_lt_caught_CXX_error" != yes; then # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. - output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) - if test "$GXX" = yes && test "$with_gnu_ld" = no; then - _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + if test yes,no = "$GXX,$with_gnu_ld"; then + _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' case $host in osf3*) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' ;; *) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' ;; esac - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists @@ -6720,9 +7236,9 @@ if test "$_lt_caught_CXX_error" != yes; then # Sun C++ 4.2, 5.x and Centerline C++ _LT_TAGVAR(archive_cmds_need_lc,$1)=yes _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' - _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + $CC -G$allow_undefined_flag $wl-M $wl$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no @@ -6730,7 +7246,7 @@ if test "$_lt_caught_CXX_error" != yes; then solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) # The compiler driver will combine and reorder linker options, - # but understands `-z linker_flag'. + # but understands '-z linker_flag'. # Supported since Solaris 2.6 (maybe 2.5.1?) _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' ;; @@ -6747,30 +7263,30 @@ if test "$_lt_caught_CXX_error" != yes; then ;; gcx*) # Green Hills C++ Compiler - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' # The C++ compiler must be used to create the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs' ;; *) # GNU C++ compiler with Solaris linker - if test "$GXX" = yes && test "$with_gnu_ld" = no; then - _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs' + if test yes,no = "$GXX,$with_gnu_ld"; then + _LT_TAGVAR(no_undefined_flag, $1)=' $wl-z ${wl}defs' if $CC --version | $GREP -v '^2\.7' > /dev/null; then - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + $CC -shared $pic_flag -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else - # g++ 2.7 appears to require `-G' NOT `-shared' on this + # g++ 2.7 appears to require '-G' NOT '-shared' on this # platform. - _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + $CC -G -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when @@ -6778,11 +7294,11 @@ if test "$_lt_caught_CXX_error" != yes; then output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' fi - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $wl$libdir' case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) - _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' ;; esac fi @@ -6791,52 +7307,52 @@ if test "$_lt_caught_CXX_error" != yes; then ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) - _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' + _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var='LD_RUN_PATH' case $cc_basename in CC*) - _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; *) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; sysv5* | sco3.2v5* | sco5v6*) - # Note: We can NOT use -z defs as we might desire, because we do not + # Note: We CANNOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. - _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' - _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' + _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' + _LT_TAGVAR(allow_undefined_flag, $1)='$wl-z,nodefs' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Bexport' runpath_var='LD_RUN_PATH' case $cc_basename in CC*) - _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(old_archive_cmds, $1)='$CC -Tprelink_objects $oldobjs~ - '"$_LT_TAGVAR(old_archive_cmds, $1)" + '"$_LT_TAGVAR(old_archive_cmds, $1)" _LT_TAGVAR(reload_cmds, $1)='$CC -Tprelink_objects $reload_objs~ - '"$_LT_TAGVAR(reload_cmds, $1)" + '"$_LT_TAGVAR(reload_cmds, $1)" ;; *) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; @@ -6867,10 +7383,10 @@ if test "$_lt_caught_CXX_error" != yes; then esac AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) - test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no + test no = "$_LT_TAGVAR(ld_shlibs, $1)" && can_build_shared=no - _LT_TAGVAR(GCC, $1)="$GXX" - _LT_TAGVAR(LD, $1)="$LD" + _LT_TAGVAR(GCC, $1)=$GXX + _LT_TAGVAR(LD, $1)=$LD ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change @@ -6897,7 +7413,7 @@ if test "$_lt_caught_CXX_error" != yes; then lt_cv_path_LD=$lt_save_path_LD lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld -fi # test "$_lt_caught_CXX_error" != yes +fi # test yes != "$_lt_caught_CXX_error" AC_LANG_POP ])# _LT_LANG_CXX_CONFIG @@ -6919,13 +7435,14 @@ AC_REQUIRE([_LT_DECL_SED]) AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH]) func_stripname_cnf () { - case ${2} in - .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; - *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; + case @S|@2 in + .*) func_stripname_result=`$ECHO "@S|@3" | $SED "s%^@S|@1%%; s%\\\\@S|@2\$%%"`;; + *) func_stripname_result=`$ECHO "@S|@3" | $SED "s%^@S|@1%%; s%@S|@2\$%%"`;; esac } # func_stripname_cnf ])# _LT_FUNC_STRIPNAME_CNF + # _LT_SYS_HIDDEN_LIBDEPS([TAGNAME]) # --------------------------------- # Figure out "hidden" library dependencies from verbose @@ -7009,13 +7526,13 @@ if AC_TRY_EVAL(ac_compile); then pre_test_object_deps_done=no for p in `eval "$output_verbose_link_cmd"`; do - case ${prev}${p} in + case $prev$p in -L* | -R* | -l*) # Some compilers place space between "-{L,R}" and the path. # Remove the space. - if test $p = "-L" || - test $p = "-R"; then + if test x-L = "$p" || + test x-R = "$p"; then prev=$p continue fi @@ -7031,16 +7548,16 @@ if AC_TRY_EVAL(ac_compile); then case $p in =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; esac - if test "$pre_test_object_deps_done" = no; then - case ${prev} in + if test no = "$pre_test_object_deps_done"; then + case $prev in -L | -R) # Internal compiler library paths should come after those # provided the user. The postdeps already come after the # user supplied libs so there is no need to process them. if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then - _LT_TAGVAR(compiler_lib_search_path, $1)="${prev}${p}" + _LT_TAGVAR(compiler_lib_search_path, $1)=$prev$p else - _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} ${prev}${p}" + _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} $prev$p" fi ;; # The "-l" case would never come before the object being @@ -7048,9 +7565,9 @@ if AC_TRY_EVAL(ac_compile); then esac else if test -z "$_LT_TAGVAR(postdeps, $1)"; then - _LT_TAGVAR(postdeps, $1)="${prev}${p}" + _LT_TAGVAR(postdeps, $1)=$prev$p else - _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} ${prev}${p}" + _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} $prev$p" fi fi prev= @@ -7065,15 +7582,15 @@ if AC_TRY_EVAL(ac_compile); then continue fi - if test "$pre_test_object_deps_done" = no; then + if test no = "$pre_test_object_deps_done"; then if test -z "$_LT_TAGVAR(predep_objects, $1)"; then - _LT_TAGVAR(predep_objects, $1)="$p" + _LT_TAGVAR(predep_objects, $1)=$p else _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p" fi else if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then - _LT_TAGVAR(postdep_objects, $1)="$p" + _LT_TAGVAR(postdep_objects, $1)=$p else _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p" fi @@ -7104,51 +7621,6 @@ interix[[3-9]]*) _LT_TAGVAR(postdep_objects,$1)= _LT_TAGVAR(postdeps,$1)= ;; - -linux*) - case `$CC -V 2>&1 | sed 5q` in - *Sun\ C*) - # Sun C++ 5.9 - - # The more standards-conforming stlport4 library is - # incompatible with the Cstd library. Avoid specifying - # it if it's in CXXFLAGS. Ignore libCrun as - # -library=stlport4 depends on it. - case " $CXX $CXXFLAGS " in - *" -library=stlport4 "*) - solaris_use_stlport4=yes - ;; - esac - - if test "$solaris_use_stlport4" != yes; then - _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' - fi - ;; - esac - ;; - -solaris*) - case $cc_basename in - CC* | sunCC*) - # The more standards-conforming stlport4 library is - # incompatible with the Cstd library. Avoid specifying - # it if it's in CXXFLAGS. Ignore libCrun as - # -library=stlport4 depends on it. - case " $CXX $CXXFLAGS " in - *" -library=stlport4 "*) - solaris_use_stlport4=yes - ;; - esac - - # Adding this requires a known-good setup of shared libraries for - # Sun compiler versions before 5.6, else PIC objects from an old - # archive will be linked into the output, leading to subtle bugs. - if test "$solaris_use_stlport4" != yes; then - _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' - fi - ;; - esac - ;; esac ]) @@ -7157,7 +7629,7 @@ case " $_LT_TAGVAR(postdeps, $1) " in esac _LT_TAGVAR(compiler_lib_search_dirs, $1)= if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then - _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | ${SED} -e 's! -L! !g' -e 's!^ !!'` + _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | $SED -e 's! -L! !g' -e 's!^ !!'` fi _LT_TAGDECL([], [compiler_lib_search_dirs], [1], [The directories searched by this compiler when creating a shared library]) @@ -7177,10 +7649,10 @@ _LT_TAGDECL([], [compiler_lib_search_path], [1], # -------------------------- # Ensure that the configuration variables for a Fortran 77 compiler are # suitably defined. These variables are subsequently used by _LT_CONFIG -# to write the compiler configuration to `libtool'. +# to write the compiler configuration to 'libtool'. m4_defun([_LT_LANG_F77_CONFIG], [AC_LANG_PUSH(Fortran 77) -if test -z "$F77" || test "X$F77" = "Xno"; then +if test -z "$F77" || test no = "$F77"; then _lt_disable_F77=yes fi @@ -7217,7 +7689,7 @@ _LT_TAGVAR(objext, $1)=$objext # the F77 compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. -if test "$_lt_disable_F77" != yes; then +if test yes != "$_lt_disable_F77"; then # Code to be used in simple compile tests lt_simple_compile_test_code="\ subroutine t @@ -7239,7 +7711,7 @@ if test "$_lt_disable_F77" != yes; then _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. - lt_save_CC="$CC" + lt_save_CC=$CC lt_save_GCC=$GCC lt_save_CFLAGS=$CFLAGS CC=${F77-"f77"} @@ -7253,21 +7725,25 @@ if test "$_lt_disable_F77" != yes; then AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) - test "$can_build_shared" = "no" && enable_shared=no + test no = "$can_build_shared" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) - test "$enable_shared" = yes && enable_static=no + test yes = "$enable_shared" && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) - if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then - test "$enable_shared" = yes && enable_static=no + if test ia64 != "$host_cpu"; then + case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in + yes,aix,yes) ;; # shared object as lib.so file only + yes,svr4,*) ;; # shared object as lib.so archive member only + yes,*) enable_static=no ;; # shared object in lib.a archive as well + esac fi ;; esac @@ -7275,11 +7751,11 @@ if test "$_lt_disable_F77" != yes; then AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. - test "$enable_shared" = yes || enable_static=yes + test yes = "$enable_shared" || enable_static=yes AC_MSG_RESULT([$enable_static]) - _LT_TAGVAR(GCC, $1)="$G77" - _LT_TAGVAR(LD, $1)="$LD" + _LT_TAGVAR(GCC, $1)=$G77 + _LT_TAGVAR(LD, $1)=$LD ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change @@ -7296,9 +7772,9 @@ if test "$_lt_disable_F77" != yes; then fi # test -n "$compiler" GCC=$lt_save_GCC - CC="$lt_save_CC" - CFLAGS="$lt_save_CFLAGS" -fi # test "$_lt_disable_F77" != yes + CC=$lt_save_CC + CFLAGS=$lt_save_CFLAGS +fi # test yes != "$_lt_disable_F77" AC_LANG_POP ])# _LT_LANG_F77_CONFIG @@ -7308,11 +7784,11 @@ AC_LANG_POP # ------------------------- # Ensure that the configuration variables for a Fortran compiler are # suitably defined. These variables are subsequently used by _LT_CONFIG -# to write the compiler configuration to `libtool'. +# to write the compiler configuration to 'libtool'. m4_defun([_LT_LANG_FC_CONFIG], [AC_LANG_PUSH(Fortran) -if test -z "$FC" || test "X$FC" = "Xno"; then +if test -z "$FC" || test no = "$FC"; then _lt_disable_FC=yes fi @@ -7349,7 +7825,7 @@ _LT_TAGVAR(objext, $1)=$objext # the FC compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. -if test "$_lt_disable_FC" != yes; then +if test yes != "$_lt_disable_FC"; then # Code to be used in simple compile tests lt_simple_compile_test_code="\ subroutine t @@ -7371,7 +7847,7 @@ if test "$_lt_disable_FC" != yes; then _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. - lt_save_CC="$CC" + lt_save_CC=$CC lt_save_GCC=$GCC lt_save_CFLAGS=$CFLAGS CC=${FC-"f95"} @@ -7387,21 +7863,25 @@ if test "$_lt_disable_FC" != yes; then AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) - test "$can_build_shared" = "no" && enable_shared=no + test no = "$can_build_shared" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) - test "$enable_shared" = yes && enable_static=no + test yes = "$enable_shared" && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) - if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then - test "$enable_shared" = yes && enable_static=no + if test ia64 != "$host_cpu"; then + case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in + yes,aix,yes) ;; # shared object as lib.so file only + yes,svr4,*) ;; # shared object as lib.so archive member only + yes,*) enable_static=no ;; # shared object in lib.a archive as well + esac fi ;; esac @@ -7409,11 +7889,11 @@ if test "$_lt_disable_FC" != yes; then AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. - test "$enable_shared" = yes || enable_static=yes + test yes = "$enable_shared" || enable_static=yes AC_MSG_RESULT([$enable_static]) - _LT_TAGVAR(GCC, $1)="$ac_cv_fc_compiler_gnu" - _LT_TAGVAR(LD, $1)="$LD" + _LT_TAGVAR(GCC, $1)=$ac_cv_fc_compiler_gnu + _LT_TAGVAR(LD, $1)=$LD ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change @@ -7433,7 +7913,7 @@ if test "$_lt_disable_FC" != yes; then GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS -fi # test "$_lt_disable_FC" != yes +fi # test yes != "$_lt_disable_FC" AC_LANG_POP ])# _LT_LANG_FC_CONFIG @@ -7443,7 +7923,7 @@ AC_LANG_POP # -------------------------- # Ensure that the configuration variables for the GNU Java Compiler compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG -# to write the compiler configuration to `libtool'. +# to write the compiler configuration to 'libtool'. m4_defun([_LT_LANG_GCJ_CONFIG], [AC_REQUIRE([LT_PROG_GCJ])dnl AC_LANG_SAVE @@ -7477,7 +7957,7 @@ CC=${GCJ-"gcj"} CFLAGS=$GCJFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC -_LT_TAGVAR(LD, $1)="$LD" +_LT_TAGVAR(LD, $1)=$LD _LT_CC_BASENAME([$compiler]) # GCJ did not exist at the time GCC didn't implicitly link libc in. @@ -7510,7 +7990,7 @@ CFLAGS=$lt_save_CFLAGS # -------------------------- # Ensure that the configuration variables for the GNU Go compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG -# to write the compiler configuration to `libtool'. +# to write the compiler configuration to 'libtool'. m4_defun([_LT_LANG_GO_CONFIG], [AC_REQUIRE([LT_PROG_GO])dnl AC_LANG_SAVE @@ -7544,7 +8024,7 @@ CC=${GOC-"gccgo"} CFLAGS=$GOFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC -_LT_TAGVAR(LD, $1)="$LD" +_LT_TAGVAR(LD, $1)=$LD _LT_CC_BASENAME([$compiler]) # Go did not exist at the time GCC didn't implicitly link libc in. @@ -7577,7 +8057,7 @@ CFLAGS=$lt_save_CFLAGS # ------------------------- # Ensure that the configuration variables for the Windows resource compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG -# to write the compiler configuration to `libtool'. +# to write the compiler configuration to 'libtool'. m4_defun([_LT_LANG_RC_CONFIG], [AC_REQUIRE([LT_PROG_RC])dnl AC_LANG_SAVE @@ -7593,7 +8073,7 @@ _LT_TAGVAR(objext, $1)=$objext lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }' # Code to be used in simple link tests -lt_simple_link_test_code="$lt_simple_compile_test_code" +lt_simple_link_test_code=$lt_simple_compile_test_code # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER @@ -7603,7 +8083,7 @@ _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. -lt_save_CC="$CC" +lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC= @@ -7632,7 +8112,7 @@ AC_DEFUN([LT_PROG_GCJ], [m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ], [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ], [AC_CHECK_TOOL(GCJ, gcj,) - test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2" + test set = "${GCJFLAGS+set}" || GCJFLAGS="-g -O2" AC_SUBST(GCJFLAGS)])])[]dnl ]) @@ -7741,7 +8221,7 @@ lt_ac_count=0 # Add /usr/xpg4/bin/sed as it is typically found on Solaris # along with /bin/sed that truncates output. for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do - test ! -f $lt_ac_sed && continue + test ! -f "$lt_ac_sed" && continue cat /dev/null > conftest.in lt_ac_count=0 echo $ECHO_N "0123456789$ECHO_C" >conftest.in @@ -7758,9 +8238,9 @@ for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break cmp -s conftest.out conftest.nl || break # 10000 chars as input seems more than enough - test $lt_ac_count -gt 10 && break + test 10 -lt "$lt_ac_count" && break lt_ac_count=`expr $lt_ac_count + 1` - if test $lt_ac_count -gt $lt_ac_max; then + if test "$lt_ac_count" -gt "$lt_ac_max"; then lt_ac_max=$lt_ac_count lt_cv_path_SED=$lt_ac_sed fi @@ -7784,27 +8264,7 @@ dnl AC_DEFUN([LT_AC_PROG_SED], []) # Find out whether the shell is Bourne or XSI compatible, # or has some other useful features. m4_defun([_LT_CHECK_SHELL_FEATURES], -[AC_MSG_CHECKING([whether the shell understands some XSI constructs]) -# Try some XSI features -xsi_shell=no -( _lt_dummy="a/b/c" - test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \ - = c,a/b,b/c, \ - && eval 'test $(( 1 + 1 )) -eq 2 \ - && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ - && xsi_shell=yes -AC_MSG_RESULT([$xsi_shell]) -_LT_CONFIG_LIBTOOL_INIT([xsi_shell='$xsi_shell']) - -AC_MSG_CHECKING([whether the shell understands "+="]) -lt_shell_append=no -( foo=bar; set foo baz; eval "$[1]+=\$[2]" && test "$foo" = barbaz ) \ - >/dev/null 2>&1 \ - && lt_shell_append=yes -AC_MSG_RESULT([$lt_shell_append]) -_LT_CONFIG_LIBTOOL_INIT([lt_shell_append='$lt_shell_append']) - -if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then +[if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then lt_unset=unset else lt_unset=false @@ -7828,102 +8288,9 @@ _LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl ])# _LT_CHECK_SHELL_FEATURES -# _LT_PROG_FUNCTION_REPLACE (FUNCNAME, REPLACEMENT-BODY) -# ------------------------------------------------------ -# In `$cfgfile', look for function FUNCNAME delimited by `^FUNCNAME ()$' and -# '^} FUNCNAME ', and replace its body with REPLACEMENT-BODY. -m4_defun([_LT_PROG_FUNCTION_REPLACE], -[dnl { -sed -e '/^$1 ()$/,/^} # $1 /c\ -$1 ()\ -{\ -m4_bpatsubsts([$2], [$], [\\], [^\([ ]\)], [\\\1]) -} # Extended-shell $1 implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: -]) - - -# _LT_PROG_REPLACE_SHELLFNS -# ------------------------- -# Replace existing portable implementations of several shell functions with -# equivalent extended shell implementations where those features are available.. -m4_defun([_LT_PROG_REPLACE_SHELLFNS], -[if test x"$xsi_shell" = xyes; then - _LT_PROG_FUNCTION_REPLACE([func_dirname], [dnl - case ${1} in - */*) func_dirname_result="${1%/*}${2}" ;; - * ) func_dirname_result="${3}" ;; - esac]) - - _LT_PROG_FUNCTION_REPLACE([func_basename], [dnl - func_basename_result="${1##*/}"]) - - _LT_PROG_FUNCTION_REPLACE([func_dirname_and_basename], [dnl - case ${1} in - */*) func_dirname_result="${1%/*}${2}" ;; - * ) func_dirname_result="${3}" ;; - esac - func_basename_result="${1##*/}"]) - - _LT_PROG_FUNCTION_REPLACE([func_stripname], [dnl - # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are - # positional parameters, so assign one to ordinary parameter first. - func_stripname_result=${3} - func_stripname_result=${func_stripname_result#"${1}"} - func_stripname_result=${func_stripname_result%"${2}"}]) - - _LT_PROG_FUNCTION_REPLACE([func_split_long_opt], [dnl - func_split_long_opt_name=${1%%=*} - func_split_long_opt_arg=${1#*=}]) - - _LT_PROG_FUNCTION_REPLACE([func_split_short_opt], [dnl - func_split_short_opt_arg=${1#??} - func_split_short_opt_name=${1%"$func_split_short_opt_arg"}]) - - _LT_PROG_FUNCTION_REPLACE([func_lo2o], [dnl - case ${1} in - *.lo) func_lo2o_result=${1%.lo}.${objext} ;; - *) func_lo2o_result=${1} ;; - esac]) - - _LT_PROG_FUNCTION_REPLACE([func_xform], [ func_xform_result=${1%.*}.lo]) - - _LT_PROG_FUNCTION_REPLACE([func_arith], [ func_arith_result=$(( $[*] ))]) - - _LT_PROG_FUNCTION_REPLACE([func_len], [ func_len_result=${#1}]) -fi - -if test x"$lt_shell_append" = xyes; then - _LT_PROG_FUNCTION_REPLACE([func_append], [ eval "${1}+=\\${2}"]) - - _LT_PROG_FUNCTION_REPLACE([func_append_quoted], [dnl - func_quote_for_eval "${2}" -dnl m4 expansion turns \\\\ into \\, and then the shell eval turns that into \ - eval "${1}+=\\\\ \\$func_quote_for_eval_result"]) - - # Save a `func_append' function call where possible by direct use of '+=' - sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") - test 0 -eq $? || _lt_function_replace_fail=: -else - # Save a `func_append' function call even when '+=' is not available - sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") - test 0 -eq $? || _lt_function_replace_fail=: -fi - -if test x"$_lt_function_replace_fail" = x":"; then - AC_MSG_WARN([Unable to substitute extended shell functions in $ofile]) -fi -]) - # _LT_PATH_CONVERSION_FUNCTIONS # ----------------------------- -# Determine which file name conversion functions should be used by +# Determine what file name conversion functions should be used by # func_to_host_file (and, implicitly, by func_to_host_path). These are needed # for certain cross-compile configurations and native mingw. m4_defun([_LT_PATH_CONVERSION_FUNCTIONS], @@ -7990,15 +8357,15 @@ _LT_DECL([to_tool_file_cmd], [lt_cv_to_tool_file_cmd], # Helper functions for option handling. -*- Autoconf -*- # -# Copyright (C) 2004, 2005, 2007, 2008, 2009 Free Software Foundation, -# Inc. +# Copyright (C) 2004-2005, 2007-2009, 2011-2015 Free Software +# Foundation, Inc. # Written by Gary V. Vaughan, 2004 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. -# serial 7 ltoptions.m4 +# serial 8 ltoptions.m4 # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])]) @@ -8019,7 +8386,7 @@ m4_define([_LT_SET_OPTION], [m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]), _LT_MANGLE_DEFUN([$1], [$2]), - [m4_warning([Unknown $1 option `$2'])])[]dnl + [m4_warning([Unknown $1 option '$2'])])[]dnl ]) @@ -8065,13 +8432,15 @@ m4_if([$1],[LT_INIT],[ dnl dnl If no reference was made to various pairs of opposing options, then dnl we run the default mode handler for the pair. For example, if neither - dnl `shared' nor `disable-shared' was passed, we enable building of shared + dnl 'shared' nor 'disable-shared' was passed, we enable building of shared dnl archives by default: _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED]) _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC]) _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC]) _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install], - [_LT_ENABLE_FAST_INSTALL]) + [_LT_ENABLE_FAST_INSTALL]) + _LT_UNLESS_OPTIONS([LT_INIT], [aix-soname=aix aix-soname=both aix-soname=svr4], + [_LT_WITH_AIX_SONAME([aix])]) ]) ])# _LT_SET_OPTIONS @@ -8099,7 +8468,7 @@ AU_DEFUN([AC_LIBTOOL_DLOPEN], [_LT_SET_OPTION([LT_INIT], [dlopen]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you -put the `dlopen' option into LT_INIT's first parameter.]) +put the 'dlopen' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: @@ -8135,7 +8504,7 @@ AU_DEFUN([AC_LIBTOOL_WIN32_DLL], _LT_SET_OPTION([LT_INIT], [win32-dll]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you -put the `win32-dll' option into LT_INIT's first parameter.]) +put the 'win32-dll' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: @@ -8144,9 +8513,9 @@ dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], []) # _LT_ENABLE_SHARED([DEFAULT]) # ---------------------------- -# implement the --enable-shared flag, and supports the `shared' and -# `disable-shared' LT_INIT options. -# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +# implement the --enable-shared flag, and supports the 'shared' and +# 'disable-shared' LT_INIT options. +# DEFAULT is either 'yes' or 'no'. If omitted, it defaults to 'yes'. m4_define([_LT_ENABLE_SHARED], [m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([shared], @@ -8159,14 +8528,14 @@ AC_ARG_ENABLE([shared], *) enable_shared=no # Look at the argument we got. We use all the common list separators. - lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, for pkg in $enableval; do - IFS="$lt_save_ifs" + IFS=$lt_save_ifs if test "X$pkg" = "X$p"; then enable_shared=yes fi done - IFS="$lt_save_ifs" + IFS=$lt_save_ifs ;; esac], [enable_shared=]_LT_ENABLE_SHARED_DEFAULT) @@ -8198,9 +8567,9 @@ dnl AC_DEFUN([AM_DISABLE_SHARED], []) # _LT_ENABLE_STATIC([DEFAULT]) # ---------------------------- -# implement the --enable-static flag, and support the `static' and -# `disable-static' LT_INIT options. -# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +# implement the --enable-static flag, and support the 'static' and +# 'disable-static' LT_INIT options. +# DEFAULT is either 'yes' or 'no'. If omitted, it defaults to 'yes'. m4_define([_LT_ENABLE_STATIC], [m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([static], @@ -8213,14 +8582,14 @@ AC_ARG_ENABLE([static], *) enable_static=no # Look at the argument we got. We use all the common list separators. - lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, for pkg in $enableval; do - IFS="$lt_save_ifs" + IFS=$lt_save_ifs if test "X$pkg" = "X$p"; then enable_static=yes fi done - IFS="$lt_save_ifs" + IFS=$lt_save_ifs ;; esac], [enable_static=]_LT_ENABLE_STATIC_DEFAULT) @@ -8252,9 +8621,9 @@ dnl AC_DEFUN([AM_DISABLE_STATIC], []) # _LT_ENABLE_FAST_INSTALL([DEFAULT]) # ---------------------------------- -# implement the --enable-fast-install flag, and support the `fast-install' -# and `disable-fast-install' LT_INIT options. -# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +# implement the --enable-fast-install flag, and support the 'fast-install' +# and 'disable-fast-install' LT_INIT options. +# DEFAULT is either 'yes' or 'no'. If omitted, it defaults to 'yes'. m4_define([_LT_ENABLE_FAST_INSTALL], [m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([fast-install], @@ -8267,14 +8636,14 @@ AC_ARG_ENABLE([fast-install], *) enable_fast_install=no # Look at the argument we got. We use all the common list separators. - lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, for pkg in $enableval; do - IFS="$lt_save_ifs" + IFS=$lt_save_ifs if test "X$pkg" = "X$p"; then enable_fast_install=yes fi done - IFS="$lt_save_ifs" + IFS=$lt_save_ifs ;; esac], [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT) @@ -8291,14 +8660,14 @@ AU_DEFUN([AC_ENABLE_FAST_INSTALL], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put -the `fast-install' option into LT_INIT's first parameter.]) +the 'fast-install' option into LT_INIT's first parameter.]) ]) AU_DEFUN([AC_DISABLE_FAST_INSTALL], [_LT_SET_OPTION([LT_INIT], [disable-fast-install]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put -the `disable-fast-install' option into LT_INIT's first parameter.]) +the 'disable-fast-install' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: @@ -8306,11 +8675,64 @@ dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], []) dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], []) +# _LT_WITH_AIX_SONAME([DEFAULT]) +# ---------------------------------- +# implement the --with-aix-soname flag, and support the `aix-soname=aix' +# and `aix-soname=both' and `aix-soname=svr4' LT_INIT options. DEFAULT +# is either `aix', `both' or `svr4'. If omitted, it defaults to `aix'. +m4_define([_LT_WITH_AIX_SONAME], +[m4_define([_LT_WITH_AIX_SONAME_DEFAULT], [m4_if($1, svr4, svr4, m4_if($1, both, both, aix))])dnl +shared_archive_member_spec= +case $host,$enable_shared in +power*-*-aix[[5-9]]*,yes) + AC_MSG_CHECKING([which variant of shared library versioning to provide]) + AC_ARG_WITH([aix-soname], + [AS_HELP_STRING([--with-aix-soname=aix|svr4|both], + [shared library versioning (aka "SONAME") variant to provide on AIX, @<:@default=]_LT_WITH_AIX_SONAME_DEFAULT[@:>@.])], + [case $withval in + aix|svr4|both) + ;; + *) + AC_MSG_ERROR([Unknown argument to --with-aix-soname]) + ;; + esac + lt_cv_with_aix_soname=$with_aix_soname], + [AC_CACHE_VAL([lt_cv_with_aix_soname], + [lt_cv_with_aix_soname=]_LT_WITH_AIX_SONAME_DEFAULT) + with_aix_soname=$lt_cv_with_aix_soname]) + AC_MSG_RESULT([$with_aix_soname]) + if test aix != "$with_aix_soname"; then + # For the AIX way of multilib, we name the shared archive member + # based on the bitwidth used, traditionally 'shr.o' or 'shr_64.o', + # and 'shr.imp' or 'shr_64.imp', respectively, for the Import File. + # Even when GNU compilers ignore OBJECT_MODE but need '-maix64' flag, + # the AIX toolchain works better with OBJECT_MODE set (default 32). + if test 64 = "${OBJECT_MODE-32}"; then + shared_archive_member_spec=shr_64 + else + shared_archive_member_spec=shr + fi + fi + ;; +*) + with_aix_soname=aix + ;; +esac + +_LT_DECL([], [shared_archive_member_spec], [0], + [Shared archive member basename, for filename based shared library versioning on AIX])dnl +])# _LT_WITH_AIX_SONAME + +LT_OPTION_DEFINE([LT_INIT], [aix-soname=aix], [_LT_WITH_AIX_SONAME([aix])]) +LT_OPTION_DEFINE([LT_INIT], [aix-soname=both], [_LT_WITH_AIX_SONAME([both])]) +LT_OPTION_DEFINE([LT_INIT], [aix-soname=svr4], [_LT_WITH_AIX_SONAME([svr4])]) + + # _LT_WITH_PIC([MODE]) # -------------------- -# implement the --with-pic flag, and support the `pic-only' and `no-pic' +# implement the --with-pic flag, and support the 'pic-only' and 'no-pic' # LT_INIT options. -# MODE is either `yes' or `no'. If omitted, it defaults to `both'. +# MODE is either 'yes' or 'no'. If omitted, it defaults to 'both'. m4_define([_LT_WITH_PIC], [AC_ARG_WITH([pic], [AS_HELP_STRING([--with-pic@<:@=PKGS@:>@], @@ -8321,19 +8743,17 @@ m4_define([_LT_WITH_PIC], *) pic_mode=default # Look at the argument we got. We use all the common list separators. - lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, for lt_pkg in $withval; do - IFS="$lt_save_ifs" + IFS=$lt_save_ifs if test "X$lt_pkg" = "X$lt_p"; then pic_mode=yes fi done - IFS="$lt_save_ifs" + IFS=$lt_save_ifs ;; esac], - [pic_mode=default]) - -test -z "$pic_mode" && pic_mode=m4_default([$1], [default]) + [pic_mode=m4_default([$1], [default])]) _LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl ])# _LT_WITH_PIC @@ -8346,7 +8766,7 @@ AU_DEFUN([AC_LIBTOOL_PICMODE], [_LT_SET_OPTION([LT_INIT], [pic-only]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you -put the `pic-only' option into LT_INIT's first parameter.]) +put the 'pic-only' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: @@ -8369,7 +8789,8 @@ LT_OPTION_DEFINE([LTDL_INIT], [convenience], # ltsugar.m4 -- libtool m4 base layer. -*-Autoconf-*- # -# Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc. +# Copyright (C) 2004-2005, 2007-2008, 2011-2015 Free Software +# Foundation, Inc. # Written by Gary V. Vaughan, 2004 # # This file is free software; the Free Software Foundation gives @@ -8402,7 +8823,7 @@ m4_define([_lt_join], # ------------ # Manipulate m4 lists. # These macros are necessary as long as will still need to support -# Autoconf-2.59 which quotes differently. +# Autoconf-2.59, which quotes differently. m4_define([lt_car], [[$1]]) m4_define([lt_cdr], [m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])], @@ -8413,7 +8834,7 @@ m4_define([lt_unquote], $1) # lt_append(MACRO-NAME, STRING, [SEPARATOR]) # ------------------------------------------ -# Redefine MACRO-NAME to hold its former content plus `SEPARATOR'`STRING'. +# Redefine MACRO-NAME to hold its former content plus 'SEPARATOR''STRING'. # Note that neither SEPARATOR nor STRING are expanded; they are appended # to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked). # No SEPARATOR is output if MACRO-NAME was previously undefined (different @@ -8493,7 +8914,7 @@ m4_define([lt_dict_filter], # ltversion.m4 -- version numbers -*- Autoconf -*- # -# Copyright (C) 2004 Free Software Foundation, Inc. +# Copyright (C) 2004, 2011-2015 Free Software Foundation, Inc. # Written by Scott James Remnant, 2004 # # This file is free software; the Free Software Foundation gives @@ -8502,22 +8923,23 @@ m4_define([lt_dict_filter], # @configure_input@ -# serial 3337 ltversion.m4 +# serial 4179 ltversion.m4 # This file is part of GNU Libtool -m4_define([LT_PACKAGE_VERSION], [2.4.2]) -m4_define([LT_PACKAGE_REVISION], [1.3337]) +m4_define([LT_PACKAGE_VERSION], [2.4.6]) +m4_define([LT_PACKAGE_REVISION], [2.4.6]) AC_DEFUN([LTVERSION_VERSION], -[macro_version='2.4.2' -macro_revision='1.3337' +[macro_version='2.4.6' +macro_revision='2.4.6' _LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?]) _LT_DECL(, macro_revision, 0) ]) # lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*- # -# Copyright (C) 2004, 2005, 2007, 2009 Free Software Foundation, Inc. +# Copyright (C) 2004-2005, 2007, 2009, 2011-2015 Free Software +# Foundation, Inc. # Written by Scott James Remnant, 2004. # # This file is free software; the Free Software Foundation gives @@ -8528,7 +8950,7 @@ _LT_DECL(, macro_revision, 0) # These exist entirely to fool aclocal when bootstrapping libtool. # -# In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN) +# In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN), # which have later been changed to m4_define as they aren't part of the # exported API, or moved to Autoconf or Automake where they belong. # @@ -8542,7 +8964,7 @@ _LT_DECL(, macro_revision, 0) # included after everything else. This provides aclocal with the # AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything # because those macros already exist, or will be overwritten later. -# We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. +# We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. # # Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here. # Yes, that means every name once taken will need to remain here until @@ -8614,32 +9036,63 @@ m4_ifndef([_LT_PROG_F77], [AC_DEFUN([_LT_PROG_F77])]) m4_ifndef([_LT_PROG_FC], [AC_DEFUN([_LT_PROG_FC])]) m4_ifndef([_LT_PROG_CXX], [AC_DEFUN([_LT_PROG_CXX])]) -# pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- -# serial 1 (pkg-config-0.24) -# -# Copyright © 2004 Scott James Remnant . -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# -# As a special exception to the GNU General Public License, if you -# distribute this file as part of a program that contains a -# configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that program. +# pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- +# serial 12 (pkg-config-0.29.2) -# PKG_PROG_PKG_CONFIG([MIN-VERSION]) -# ---------------------------------- +dnl Copyright © 2004 Scott James Remnant . +dnl Copyright © 2012-2015 Dan Nicholson +dnl +dnl This program is free software; you can redistribute it and/or modify +dnl it under the terms of the GNU General Public License as published by +dnl the Free Software Foundation; either version 2 of the License, or +dnl (at your option) any later version. +dnl +dnl This program is distributed in the hope that it will be useful, but +dnl WITHOUT ANY WARRANTY; without even the implied warranty of +dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +dnl General Public License for more details. +dnl +dnl You should have received a copy of the GNU General Public License +dnl along with this program; if not, write to the Free Software +dnl Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +dnl 02111-1307, USA. +dnl +dnl As a special exception to the GNU General Public License, if you +dnl distribute this file as part of a program that contains a +dnl configuration script generated by Autoconf, you may include it under +dnl the same distribution terms that you use for the rest of that +dnl program. + +dnl PKG_PREREQ(MIN-VERSION) +dnl ----------------------- +dnl Since: 0.29 +dnl +dnl Verify that the version of the pkg-config macros are at least +dnl MIN-VERSION. Unlike PKG_PROG_PKG_CONFIG, which checks the user's +dnl installed version of pkg-config, this checks the developer's version +dnl of pkg.m4 when generating configure. +dnl +dnl To ensure that this macro is defined, also add: +dnl m4_ifndef([PKG_PREREQ], +dnl [m4_fatal([must install pkg-config 0.29 or later before running autoconf/autogen])]) +dnl +dnl See the "Since" comment for each macro you use to see what version +dnl of the macros you require. +m4_defun([PKG_PREREQ], +[m4_define([PKG_MACROS_VERSION], [0.29.2]) +m4_if(m4_version_compare(PKG_MACROS_VERSION, [$1]), -1, + [m4_fatal([pkg.m4 version $1 or higher is required but ]PKG_MACROS_VERSION[ found])]) +])dnl PKG_PREREQ + +dnl PKG_PROG_PKG_CONFIG([MIN-VERSION]) +dnl ---------------------------------- +dnl Since: 0.16 +dnl +dnl Search for the pkg-config tool and set the PKG_CONFIG variable to +dnl first found in the path. Checks that the version of pkg-config found +dnl is at least MIN-VERSION. If MIN-VERSION is not specified, 0.9.0 is +dnl used since that's the first version where most current features of +dnl pkg-config existed. AC_DEFUN([PKG_PROG_PKG_CONFIG], [m4_pattern_forbid([^_?PKG_[A-Z_]+$]) m4_pattern_allow([^PKG_CONFIG(_(PATH|LIBDIR|SYSROOT_DIR|ALLOW_SYSTEM_(CFLAGS|LIBS)))?$]) @@ -8661,18 +9114,19 @@ if test -n "$PKG_CONFIG"; then PKG_CONFIG="" fi fi[]dnl -])# PKG_PROG_PKG_CONFIG +])dnl PKG_PROG_PKG_CONFIG -# PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) -# -# Check to see whether a particular set of modules exists. Similar -# to PKG_CHECK_MODULES(), but does not set variables or print errors. -# -# Please remember that m4 expands AC_REQUIRE([PKG_PROG_PKG_CONFIG]) -# only at the first occurrence in configure.ac, so if the first place -# it's called might be skipped (such as if it is within an "if", you -# have to call PKG_CHECK_EXISTS manually -# -------------------------------------------------------------- +dnl PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) +dnl ------------------------------------------------------------------- +dnl Since: 0.18 +dnl +dnl Check to see whether a particular set of modules exists. Similar to +dnl PKG_CHECK_MODULES(), but does not set variables or print errors. +dnl +dnl Please remember that m4 expands AC_REQUIRE([PKG_PROG_PKG_CONFIG]) +dnl only at the first occurence in configure.ac, so if the first place +dnl it's called might be skipped (such as if it is within an "if", you +dnl have to call PKG_CHECK_EXISTS manually AC_DEFUN([PKG_CHECK_EXISTS], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl if test -n "$PKG_CONFIG" && \ @@ -8682,8 +9136,10 @@ m4_ifvaln([$3], [else $3])dnl fi]) -# _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES]) -# --------------------------------------------- +dnl _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES]) +dnl --------------------------------------------- +dnl Internal wrapper calling pkg-config via PKG_CONFIG and setting +dnl pkg_failed based on the result. m4_define([_PKG_CONFIG], [if test -n "$$1"; then pkg_cv_[]$1="$$1" @@ -8695,10 +9151,11 @@ m4_define([_PKG_CONFIG], else pkg_failed=untried fi[]dnl -])# _PKG_CONFIG +])dnl _PKG_CONFIG -# _PKG_SHORT_ERRORS_SUPPORTED -# ----------------------------- +dnl _PKG_SHORT_ERRORS_SUPPORTED +dnl --------------------------- +dnl Internal check to see if pkg-config supports short errors. AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED], [AC_REQUIRE([PKG_PROG_PKG_CONFIG]) if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then @@ -8706,26 +9163,24 @@ if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then else _pkg_short_errors_supported=no fi[]dnl -])# _PKG_SHORT_ERRORS_SUPPORTED +])dnl _PKG_SHORT_ERRORS_SUPPORTED -# PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], -# [ACTION-IF-NOT-FOUND]) -# -# -# Note that if there is a possibility the first call to -# PKG_CHECK_MODULES might not happen, you should be sure to include an -# explicit call to PKG_PROG_PKG_CONFIG in your configure.ac -# -# -# -------------------------------------------------------------- +dnl PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], +dnl [ACTION-IF-NOT-FOUND]) +dnl -------------------------------------------------------------- +dnl Since: 0.4.0 +dnl +dnl Note that if there is a possibility the first call to +dnl PKG_CHECK_MODULES might not happen, you should be sure to include an +dnl explicit call to PKG_PROG_PKG_CONFIG in your configure.ac AC_DEFUN([PKG_CHECK_MODULES], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl pkg_failed=no -AC_MSG_CHECKING([for $1]) +AC_MSG_CHECKING([for $2]) _PKG_CONFIG([$1][_CFLAGS], [cflags], [$2]) _PKG_CONFIG([$1][_LIBS], [libs], [$2]) @@ -8735,11 +9190,11 @@ and $1[]_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details.]) if test $pkg_failed = yes; then - AC_MSG_RESULT([no]) + AC_MSG_RESULT([no]) _PKG_SHORT_ERRORS_SUPPORTED if test $_pkg_short_errors_supported = yes; then $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$2" 2>&1` - else + else $1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$2" 2>&1` fi # Put the nasty error message in config.log where it belongs @@ -8756,7 +9211,7 @@ installed software in a non-standard prefix. _PKG_TEXT])[]dnl ]) elif test $pkg_failed = untried; then - AC_MSG_RESULT([no]) + AC_MSG_RESULT([no]) m4_default([$4], [AC_MSG_FAILURE( [The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full @@ -8772,5 +9227,88 @@ else AC_MSG_RESULT([yes]) $3 fi[]dnl -])# PKG_CHECK_MODULES +])dnl PKG_CHECK_MODULES + + +dnl PKG_CHECK_MODULES_STATIC(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], +dnl [ACTION-IF-NOT-FOUND]) +dnl --------------------------------------------------------------------- +dnl Since: 0.29 +dnl +dnl Checks for existence of MODULES and gathers its build flags with +dnl static libraries enabled. Sets VARIABLE-PREFIX_CFLAGS from --cflags +dnl and VARIABLE-PREFIX_LIBS from --libs. +dnl +dnl Note that if there is a possibility the first call to +dnl PKG_CHECK_MODULES_STATIC might not happen, you should be sure to +dnl include an explicit call to PKG_PROG_PKG_CONFIG in your +dnl configure.ac. +AC_DEFUN([PKG_CHECK_MODULES_STATIC], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl +_save_PKG_CONFIG=$PKG_CONFIG +PKG_CONFIG="$PKG_CONFIG --static" +PKG_CHECK_MODULES($@) +PKG_CONFIG=$_save_PKG_CONFIG[]dnl +])dnl PKG_CHECK_MODULES_STATIC + + +dnl PKG_INSTALLDIR([DIRECTORY]) +dnl ------------------------- +dnl Since: 0.27 +dnl +dnl Substitutes the variable pkgconfigdir as the location where a module +dnl should install pkg-config .pc files. By default the directory is +dnl $libdir/pkgconfig, but the default can be changed by passing +dnl DIRECTORY. The user can override through the --with-pkgconfigdir +dnl parameter. +AC_DEFUN([PKG_INSTALLDIR], +[m4_pushdef([pkg_default], [m4_default([$1], ['${libdir}/pkgconfig'])]) +m4_pushdef([pkg_description], + [pkg-config installation directory @<:@]pkg_default[@:>@]) +AC_ARG_WITH([pkgconfigdir], + [AS_HELP_STRING([--with-pkgconfigdir], pkg_description)],, + [with_pkgconfigdir=]pkg_default) +AC_SUBST([pkgconfigdir], [$with_pkgconfigdir]) +m4_popdef([pkg_default]) +m4_popdef([pkg_description]) +])dnl PKG_INSTALLDIR + + +dnl PKG_NOARCH_INSTALLDIR([DIRECTORY]) +dnl -------------------------------- +dnl Since: 0.27 +dnl +dnl Substitutes the variable noarch_pkgconfigdir as the location where a +dnl module should install arch-independent pkg-config .pc files. By +dnl default the directory is $datadir/pkgconfig, but the default can be +dnl changed by passing DIRECTORY. The user can override through the +dnl --with-noarch-pkgconfigdir parameter. +AC_DEFUN([PKG_NOARCH_INSTALLDIR], +[m4_pushdef([pkg_default], [m4_default([$1], ['${datadir}/pkgconfig'])]) +m4_pushdef([pkg_description], + [pkg-config arch-independent installation directory @<:@]pkg_default[@:>@]) +AC_ARG_WITH([noarch-pkgconfigdir], + [AS_HELP_STRING([--with-noarch-pkgconfigdir], pkg_description)],, + [with_noarch_pkgconfigdir=]pkg_default) +AC_SUBST([noarch_pkgconfigdir], [$with_noarch_pkgconfigdir]) +m4_popdef([pkg_default]) +m4_popdef([pkg_description]) +])dnl PKG_NOARCH_INSTALLDIR + + +dnl PKG_CHECK_VAR(VARIABLE, MODULE, CONFIG-VARIABLE, +dnl [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) +dnl ------------------------------------------- +dnl Since: 0.28 +dnl +dnl Retrieves the value of the pkg-config variable for the given module. +AC_DEFUN([PKG_CHECK_VAR], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl +AC_ARG_VAR([$1], [value of $3 for $2, overriding pkg-config])dnl + +_PKG_CONFIG([$1], [variable="][$3]["], [$2]) +AS_VAR_COPY([$1], [pkg_cv_][$1]) + +AS_VAR_IF([$1], [""], [$5], [$4])dnl +])dnl PKG_CHECK_VAR diff --git a/bindings/cpp/INSTALL b/bindings/cpp/INSTALL index cde9b49..e82fd21 100644 --- a/bindings/cpp/INSTALL +++ b/bindings/cpp/INSTALL @@ -1,8 +1,8 @@ Installation Instructions ************************* -Copyright (C) 1994-1996, 1999-2002, 2004-2013 Free Software Foundation, -Inc. + Copyright (C) 1994-1996, 1999-2002, 2004-2017, 2020-2021 Free +Software Foundation, Inc. Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright @@ -12,97 +12,96 @@ without warranty of any kind. Basic Installation ================== - Briefly, the shell command `./configure && make && make install' + Briefly, the shell command './configure && make && make install' should configure, build, and install this package. The following -more-detailed instructions are generic; see the `README' file for +more-detailed instructions are generic; see the 'README' file for instructions specific to this package. Some packages provide this -`INSTALL' file but do not implement all of the features documented +'INSTALL' file but do not implement all of the features documented below. The lack of an optional feature in a given package is not necessarily a bug. More recommendations for GNU packages can be found in *note Makefile Conventions: (standards)Makefile Conventions. - The `configure' shell script attempts to guess correct values for + The 'configure' shell script attempts to guess correct values for various system-dependent variables used during compilation. It uses -those values to create a `Makefile' in each directory of the package. -It may also create one or more `.h' files containing system-dependent -definitions. Finally, it creates a shell script `config.status' that +those values to create a 'Makefile' in each directory of the package. +It may also create one or more '.h' files containing system-dependent +definitions. Finally, it creates a shell script 'config.status' that you can run in the future to recreate the current configuration, and a -file `config.log' containing compiler output (useful mainly for -debugging `configure'). +file 'config.log' containing compiler output (useful mainly for +debugging 'configure'). - It can also use an optional file (typically called `config.cache' -and enabled with `--cache-file=config.cache' or simply `-C') that saves -the results of its tests to speed up reconfiguring. Caching is -disabled by default to prevent problems with accidental use of stale -cache files. + It can also use an optional file (typically called 'config.cache' and +enabled with '--cache-file=config.cache' or simply '-C') that saves the +results of its tests to speed up reconfiguring. Caching is disabled by +default to prevent problems with accidental use of stale cache files. If you need to do unusual things to compile the package, please try -to figure out how `configure' could check whether to do them, and mail -diffs or instructions to the address given in the `README' so they can +to figure out how 'configure' could check whether to do them, and mail +diffs or instructions to the address given in the 'README' so they can be considered for the next release. If you are using the cache, and at -some point `config.cache' contains results you don't want to keep, you +some point 'config.cache' contains results you don't want to keep, you may remove or edit it. - The file `configure.ac' (or `configure.in') is used to create -`configure' by a program called `autoconf'. You need `configure.ac' if -you want to change it or regenerate `configure' using a newer version -of `autoconf'. + The file 'configure.ac' (or 'configure.in') is used to create +'configure' by a program called 'autoconf'. You need 'configure.ac' if +you want to change it or regenerate 'configure' using a newer version of +'autoconf'. The simplest way to compile this package is: - 1. `cd' to the directory containing the package's source code and type - `./configure' to configure the package for your system. + 1. 'cd' to the directory containing the package's source code and type + './configure' to configure the package for your system. - Running `configure' might take a while. While running, it prints + Running 'configure' might take a while. While running, it prints some messages telling which features it is checking for. - 2. Type `make' to compile the package. + 2. Type 'make' to compile the package. - 3. Optionally, type `make check' to run any self-tests that come with + 3. Optionally, type 'make check' to run any self-tests that come with the package, generally using the just-built uninstalled binaries. - 4. Type `make install' to install the programs and any data files and + 4. Type 'make install' to install the programs and any data files and documentation. When installing into a prefix owned by root, it is recommended that the package be configured and built as a regular - user, and only the `make install' phase executed with root + user, and only the 'make install' phase executed with root privileges. - 5. Optionally, type `make installcheck' to repeat any self-tests, but + 5. Optionally, type 'make installcheck' to repeat any self-tests, but this time using the binaries in their final installed location. This target does not install anything. Running this target as a - regular user, particularly if the prior `make install' required + regular user, particularly if the prior 'make install' required root privileges, verifies that the installation completed correctly. 6. You can remove the program binaries and object files from the - source code directory by typing `make clean'. To also remove the - files that `configure' created (so you can compile the package for - a different kind of computer), type `make distclean'. There is - also a `make maintainer-clean' target, but that is intended mainly + source code directory by typing 'make clean'. To also remove the + files that 'configure' created (so you can compile the package for + a different kind of computer), type 'make distclean'. There is + also a 'make maintainer-clean' target, but that is intended mainly for the package's developers. If you use it, you may have to get all sorts of other programs in order to regenerate files that came with the distribution. - 7. Often, you can also type `make uninstall' to remove the installed + 7. Often, you can also type 'make uninstall' to remove the installed files again. In practice, not all packages have tested that uninstallation works correctly, even though it is required by the GNU Coding Standards. - 8. Some packages, particularly those that use Automake, provide `make + 8. Some packages, particularly those that use Automake, provide 'make distcheck', which can by used by developers to test that all other - targets like `make install' and `make uninstall' work correctly. + targets like 'make install' and 'make uninstall' work correctly. This target is generally not run by end users. Compilers and Options ===================== Some systems require unusual options for compilation or linking that -the `configure' script does not know about. Run `./configure --help' +the 'configure' script does not know about. Run './configure --help' for details on some of the pertinent environment variables. - You can give `configure' initial values for configuration parameters -by setting variables in the command line or in the environment. Here -is an example: + You can give 'configure' initial values for configuration parameters +by setting variables in the command line or in the environment. Here is +an example: ./configure CC=c99 CFLAGS=-g LIBS=-lposix @@ -113,21 +112,21 @@ Compiling For Multiple Architectures You can compile the package for more than one kind of computer at the same time, by placing the object files for each architecture in their -own directory. To do this, you can use GNU `make'. `cd' to the +own directory. To do this, you can use GNU 'make'. 'cd' to the directory where you want the object files and executables to go and run -the `configure' script. `configure' automatically checks for the -source code in the directory that `configure' is in and in `..'. This -is known as a "VPATH" build. +the 'configure' script. 'configure' automatically checks for the source +code in the directory that 'configure' is in and in '..'. This is known +as a "VPATH" build. - With a non-GNU `make', it is safer to compile the package for one + With a non-GNU 'make', it is safer to compile the package for one architecture at a time in the source code directory. After you have -installed the package for one architecture, use `make distclean' before +installed the package for one architecture, use 'make distclean' before reconfiguring for another architecture. - On MacOS X 10.6 and later systems, you can create libraries and + On MacOS X 10.5 and later systems, you can create libraries and executables that work on multiple system types--known as "fat" or -"universal" binaries--by specifying multiple `-arch' options to the -compiler but only a single `-arch' option to the preprocessor. Like +"universal" binaries--by specifying multiple '-arch' options to the +compiler but only a single '-arch' option to the preprocessor. Like this: ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ @@ -136,105 +135,104 @@ this: This is not guaranteed to produce working output in all cases, you may have to build one architecture at a time and combine the results -using the `lipo' tool if you have problems. +using the 'lipo' tool if you have problems. Installation Names ================== - By default, `make install' installs the package's commands under -`/usr/local/bin', include files under `/usr/local/include', etc. You -can specify an installation prefix other than `/usr/local' by giving -`configure' the option `--prefix=PREFIX', where PREFIX must be an + By default, 'make install' installs the package's commands under +'/usr/local/bin', include files under '/usr/local/include', etc. You +can specify an installation prefix other than '/usr/local' by giving +'configure' the option '--prefix=PREFIX', where PREFIX must be an absolute file name. You can specify separate installation prefixes for architecture-specific files and architecture-independent files. If you -pass the option `--exec-prefix=PREFIX' to `configure', the package uses +pass the option '--exec-prefix=PREFIX' to 'configure', the package uses PREFIX as the prefix for installing programs and libraries. Documentation and other data files still use the regular prefix. In addition, if you use an unusual directory layout you can give -options like `--bindir=DIR' to specify different values for particular -kinds of files. Run `configure --help' for a list of the directories -you can set and what kinds of files go in them. In general, the -default for these options is expressed in terms of `${prefix}', so that -specifying just `--prefix' will affect all of the other directory +options like '--bindir=DIR' to specify different values for particular +kinds of files. Run 'configure --help' for a list of the directories +you can set and what kinds of files go in them. In general, the default +for these options is expressed in terms of '${prefix}', so that +specifying just '--prefix' will affect all of the other directory specifications that were not explicitly provided. The most portable way to affect installation locations is to pass the -correct locations to `configure'; however, many packages provide one or +correct locations to 'configure'; however, many packages provide one or both of the following shortcuts of passing variable assignments to the -`make install' command line to change installation locations without +'make install' command line to change installation locations without having to reconfigure or recompile. The first method involves providing an override variable for each -affected directory. For example, `make install +affected directory. For example, 'make install prefix=/alternate/directory' will choose an alternate location for all directory configuration variables that were expressed in terms of -`${prefix}'. Any directories that were specified during `configure', -but not in terms of `${prefix}', must each be overridden at install -time for the entire installation to be relocated. The approach of -makefile variable overrides for each directory variable is required by -the GNU Coding Standards, and ideally causes no recompilation. -However, some platforms have known limitations with the semantics of -shared libraries that end up requiring recompilation when using this -method, particularly noticeable in packages that use GNU Libtool. +'${prefix}'. Any directories that were specified during 'configure', +but not in terms of '${prefix}', must each be overridden at install time +for the entire installation to be relocated. The approach of makefile +variable overrides for each directory variable is required by the GNU +Coding Standards, and ideally causes no recompilation. However, some +platforms have known limitations with the semantics of shared libraries +that end up requiring recompilation when using this method, particularly +noticeable in packages that use GNU Libtool. - The second method involves providing the `DESTDIR' variable. For -example, `make install DESTDIR=/alternate/directory' will prepend -`/alternate/directory' before all installation names. The approach of -`DESTDIR' overrides is not required by the GNU Coding Standards, and + The second method involves providing the 'DESTDIR' variable. For +example, 'make install DESTDIR=/alternate/directory' will prepend +'/alternate/directory' before all installation names. The approach of +'DESTDIR' overrides is not required by the GNU Coding Standards, and does not work on platforms that have drive letters. On the other hand, it does better at avoiding recompilation issues, and works well even -when some directory options were not specified in terms of `${prefix}' -at `configure' time. +when some directory options were not specified in terms of '${prefix}' +at 'configure' time. Optional Features ================= If the package supports it, you can cause programs to be installed -with an extra prefix or suffix on their names by giving `configure' the -option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. +with an extra prefix or suffix on their names by giving 'configure' the +option '--program-prefix=PREFIX' or '--program-suffix=SUFFIX'. - Some packages pay attention to `--enable-FEATURE' options to -`configure', where FEATURE indicates an optional part of the package. -They may also pay attention to `--with-PACKAGE' options, where PACKAGE -is something like `gnu-as' or `x' (for the X Window System). The -`README' should mention any `--enable-' and `--with-' options that the + Some packages pay attention to '--enable-FEATURE' options to +'configure', where FEATURE indicates an optional part of the package. +They may also pay attention to '--with-PACKAGE' options, where PACKAGE +is something like 'gnu-as' or 'x' (for the X Window System). The +'README' should mention any '--enable-' and '--with-' options that the package recognizes. - For packages that use the X Window System, `configure' can usually + For packages that use the X Window System, 'configure' can usually find the X include and library files automatically, but if it doesn't, -you can use the `configure' options `--x-includes=DIR' and -`--x-libraries=DIR' to specify their locations. +you can use the 'configure' options '--x-includes=DIR' and +'--x-libraries=DIR' to specify their locations. Some packages offer the ability to configure how verbose the -execution of `make' will be. For these packages, running `./configure +execution of 'make' will be. For these packages, running './configure --enable-silent-rules' sets the default to minimal output, which can be -overridden with `make V=1'; while running `./configure +overridden with 'make V=1'; while running './configure --disable-silent-rules' sets the default to verbose, which can be -overridden with `make V=0'. +overridden with 'make V=0'. Particular systems ================== - On HP-UX, the default C compiler is not ANSI C compatible. If GNU -CC is not installed, it is recommended to use the following options in + On HP-UX, the default C compiler is not ANSI C compatible. If GNU CC +is not installed, it is recommended to use the following options in order to use an ANSI C compiler: ./configure CC="cc -Ae -D_XOPEN_SOURCE=500" and if that doesn't work, install pre-built binaries of GCC for HP-UX. - HP-UX `make' updates targets which have the same time stamps as -their prerequisites, which makes it generally unusable when shipped -generated files such as `configure' are involved. Use GNU `make' -instead. + HP-UX 'make' updates targets which have the same timestamps as their +prerequisites, which makes it generally unusable when shipped generated +files such as 'configure' are involved. Use GNU 'make' instead. On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot -parse its `' header file. The option `-nodtk' can be used as -a workaround. If GNU CC is not installed, it is therefore recommended -to try +parse its '' header file. The option '-nodtk' can be used as a +workaround. If GNU CC is not installed, it is therefore recommended to +try ./configure CC="cc" @@ -242,26 +240,26 @@ and if that doesn't work, try ./configure CC="cc -nodtk" - On Solaris, don't put `/usr/ucb' early in your `PATH'. This + On Solaris, don't put '/usr/ucb' early in your 'PATH'. This directory contains several dysfunctional programs; working variants of -these programs are available in `/usr/bin'. So, if you need `/usr/ucb' -in your `PATH', put it _after_ `/usr/bin'. +these programs are available in '/usr/bin'. So, if you need '/usr/ucb' +in your 'PATH', put it _after_ '/usr/bin'. - On Haiku, software installed for all users goes in `/boot/common', -not `/usr/local'. It is recommended to use the following options: + On Haiku, software installed for all users goes in '/boot/common', +not '/usr/local'. It is recommended to use the following options: ./configure --prefix=/boot/common Specifying the System Type ========================== - There may be some features `configure' cannot figure out + There may be some features 'configure' cannot figure out automatically, but needs to determine by the type of machine the package will run on. Usually, assuming the package is built to be run on the -_same_ architectures, `configure' can figure that out, but if it prints +_same_ architectures, 'configure' can figure that out, but if it prints a message saying it cannot guess the machine type, give it the -`--build=TYPE' option. TYPE can either be a short name for the system -type, such as `sun4', or a canonical name which has the form: +'--build=TYPE' option. TYPE can either be a short name for the system +type, such as 'sun4', or a canonical name which has the form: CPU-COMPANY-SYSTEM @@ -270,101 +268,101 @@ where SYSTEM can have one of these forms: OS KERNEL-OS - See the file `config.sub' for the possible values of each field. If -`config.sub' isn't included in this package, then this package doesn't + See the file 'config.sub' for the possible values of each field. If +'config.sub' isn't included in this package, then this package doesn't need to know the machine type. If you are _building_ compiler tools for cross-compiling, you should -use the option `--target=TYPE' to select the type of system they will +use the option '--target=TYPE' to select the type of system they will produce code for. If you want to _use_ a cross compiler, that generates code for a platform different from the build platform, you should specify the "host" platform (i.e., that on which the generated programs will -eventually be run) with `--host=TYPE'. +eventually be run) with '--host=TYPE'. Sharing Defaults ================ - If you want to set default values for `configure' scripts to share, -you can create a site shell script called `config.site' that gives -default values for variables like `CC', `cache_file', and `prefix'. -`configure' looks for `PREFIX/share/config.site' if it exists, then -`PREFIX/etc/config.site' if it exists. Or, you can set the -`CONFIG_SITE' environment variable to the location of the site script. -A warning: not all `configure' scripts look for a site script. + If you want to set default values for 'configure' scripts to share, +you can create a site shell script called 'config.site' that gives +default values for variables like 'CC', 'cache_file', and 'prefix'. +'configure' looks for 'PREFIX/share/config.site' if it exists, then +'PREFIX/etc/config.site' if it exists. Or, you can set the +'CONFIG_SITE' environment variable to the location of the site script. +A warning: not all 'configure' scripts look for a site script. Defining Variables ================== Variables not defined in a site shell script can be set in the -environment passed to `configure'. However, some packages may run +environment passed to 'configure'. However, some packages may run configure again during the build, and the customized values of these variables may be lost. In order to avoid this problem, you should set -them in the `configure' command line, using `VAR=value'. For example: +them in the 'configure' command line, using 'VAR=value'. For example: ./configure CC=/usr/local2/bin/gcc -causes the specified `gcc' to be used as the C compiler (unless it is +causes the specified 'gcc' to be used as the C compiler (unless it is overridden in the site shell script). -Unfortunately, this technique does not work for `CONFIG_SHELL' due to -an Autoconf limitation. Until the limitation is lifted, you can use -this workaround: +Unfortunately, this technique does not work for 'CONFIG_SHELL' due to an +Autoconf limitation. Until the limitation is lifted, you can use this +workaround: CONFIG_SHELL=/bin/bash ./configure CONFIG_SHELL=/bin/bash -`configure' Invocation +'configure' Invocation ====================== - `configure' recognizes the following options to control how it + 'configure' recognizes the following options to control how it operates. -`--help' -`-h' - Print a summary of all of the options to `configure', and exit. +'--help' +'-h' + Print a summary of all of the options to 'configure', and exit. -`--help=short' -`--help=recursive' +'--help=short' +'--help=recursive' Print a summary of the options unique to this package's - `configure', and exit. The `short' variant lists options used - only in the top level, while the `recursive' variant lists options - also present in any nested packages. + 'configure', and exit. The 'short' variant lists options used only + in the top level, while the 'recursive' variant lists options also + present in any nested packages. -`--version' -`-V' - Print the version of Autoconf used to generate the `configure' +'--version' +'-V' + Print the version of Autoconf used to generate the 'configure' script, and exit. -`--cache-file=FILE' +'--cache-file=FILE' Enable the cache: use and save the results of the tests in FILE, - traditionally `config.cache'. FILE defaults to `/dev/null' to + traditionally 'config.cache'. FILE defaults to '/dev/null' to disable caching. -`--config-cache' -`-C' - Alias for `--cache-file=config.cache'. +'--config-cache' +'-C' + Alias for '--cache-file=config.cache'. -`--quiet' -`--silent' -`-q' +'--quiet' +'--silent' +'-q' Do not print messages saying which checks are being made. To - suppress all normal output, redirect it to `/dev/null' (any error + suppress all normal output, redirect it to '/dev/null' (any error messages will still be shown). -`--srcdir=DIR' +'--srcdir=DIR' Look for the package's source code in directory DIR. Usually - `configure' can determine that directory automatically. + 'configure' can determine that directory automatically. -`--prefix=DIR' - Use DIR as the installation prefix. *note Installation Names:: - for more details, including other options available for fine-tuning - the installation locations. +'--prefix=DIR' + Use DIR as the installation prefix. *note Installation Names:: for + more details, including other options available for fine-tuning the + installation locations. -`--no-create' -`-n' +'--no-create' +'-n' Run the configure checks, but stop before creating any output files. -`configure' also accepts some other, not widely useful, options. Run -`configure --help' for more details. +'configure' also accepts some other, not widely useful, options. Run +'configure --help' for more details. diff --git a/bindings/cpp/Makefile.in b/bindings/cpp/Makefile.in index a397933..49d5460 100644 --- a/bindings/cpp/Makefile.in +++ b/bindings/cpp/Makefile.in @@ -1,7 +1,7 @@ -# Makefile.in generated by automake 1.14.1 from Makefile.am. +# Makefile.in generated by automake 1.16.5 from Makefile.am. # @configure_input@ -# Copyright (C) 1994-2013 Free Software Foundation, Inc. +# Copyright (C) 1994-2021 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -15,7 +15,17 @@ @SET_MAKE@ VPATH = @srcdir@ -am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ @@ -79,17 +89,12 @@ POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = . -DIST_COMMON = INSTALL NEWS README AUTHORS ChangeLog \ - $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ - $(top_srcdir)/configure $(am__configure_deps) \ - $(srcdir)/portaudiocpp.pc.in COPYING \ - $(top_srcdir)/../../compile $(top_srcdir)/../../config.guess \ - $(top_srcdir)/../../config.sub $(top_srcdir)/../../install-sh \ - $(top_srcdir)/../../ltmain.sh $(top_srcdir)/../../missing ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \ + $(am__configure_deps) $(am__DIST_COMMON) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno config.status.lineno mkinstalldirs = $(install_sh) -d @@ -158,7 +163,7 @@ am__recursive_targets = \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ - cscope distdir dist dist-all distcheck + cscope distdir distdir-am dist dist-all distcheck am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is @@ -176,10 +181,10 @@ am__define_uniq_tagged_files = \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` -ETAGS = etags -CTAGS = ctags -CSCOPE = cscope DIST_SUBDIRS = $(SUBDIRS) +am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/portaudiocpp.pc.in \ + AUTHORS COPYING ChangeLog INSTALL NEWS README compile \ + config.guess config.sub install-sh ltmain.sh missing DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) @@ -218,6 +223,8 @@ am__relativize = \ DIST_ARCHIVES = $(distdir).tar.gz GZIP_ENV = --best DIST_TARGETS = dist-gzip +# Exists only to be overridden by the user if desired. +AM_DISTCHECK_DVI_TARGET = dvi distuninstallcheck_listfiles = find . -type f -print am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' @@ -234,8 +241,9 @@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ -CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ +CSCOPE = @CSCOPE@ +CTAGS = @CTAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ @@ -251,6 +259,7 @@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ +ETAGS = @ETAGS@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ @@ -267,6 +276,7 @@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ LT_VERSION_INFO = @LT_VERSION_INFO@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ @@ -338,6 +348,7 @@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ +runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ @@ -369,15 +380,14 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__confi echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu Makefile -.PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ echo ' $(SHELL) ./config.status'; \ $(SHELL) ./config.status;; \ *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__maybe_remake_depfiles);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) @@ -526,8 +536,10 @@ cscopelist-am: $(am__tagged_files) distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags -rm -f cscope.out cscope.in.out cscope.po.out cscope.files +distdir: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am -distdir: $(DISTFILES) +distdir-am: $(DISTFILES) $(am__remove_distdir) test -d "$(distdir)" || mkdir "$(distdir)" @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ @@ -592,7 +604,7 @@ distdir: $(DISTFILES) ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ || chmod -R a+r "$(distdir)" dist-gzip: distdir - tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz + tardir=$(distdir) && $(am__tar) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).tar.gz $(am__post_remove_distdir) dist-bzip2: distdir @@ -607,18 +619,22 @@ dist-xz: distdir tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz $(am__post_remove_distdir) +dist-zstd: distdir + tardir=$(distdir) && $(am__tar) | zstd -c $${ZSTD_CLEVEL-$${ZSTD_OPT--19}} >$(distdir).tar.zst + $(am__post_remove_distdir) + dist-tarZ: distdir - @echo WARNING: "Support for shar distribution archives is" \ - "deprecated." >&2 + @echo WARNING: "Support for distribution archives compressed with" \ + "legacy program 'compress' is deprecated." >&2 @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z $(am__post_remove_distdir) dist-shar: distdir - @echo WARNING: "Support for distribution archives compressed with" \ - "legacy program 'compress' is deprecated." >&2 + @echo WARNING: "Support for shar distribution archives is" \ + "deprecated." >&2 @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 - shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz + shar $(distdir) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).shar.gz $(am__post_remove_distdir) dist-zip: distdir @@ -636,7 +652,7 @@ dist dist-all: distcheck: dist case '$(DIST_ARCHIVES)' in \ *.tar.gz*) \ - GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\ + eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).tar.gz | $(am__untar) ;;\ *.tar.bz2*) \ bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ *.tar.lz*) \ @@ -646,25 +662,27 @@ distcheck: dist *.tar.Z*) \ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ *.shar.gz*) \ - GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\ + eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).shar.gz | unshar ;;\ *.zip*) \ unzip $(distdir).zip ;;\ + *.tar.zst*) \ + zstd -dc $(distdir).tar.zst | $(am__untar) ;;\ esac chmod -R a-w $(distdir) chmod u+w $(distdir) - mkdir $(distdir)/_build $(distdir)/_inst + mkdir $(distdir)/_build $(distdir)/_build/sub $(distdir)/_inst chmod a-w $(distdir) test -d $(distdir)/_build || exit 0; \ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ && am__cwd=`pwd` \ - && $(am__cd) $(distdir)/_build \ - && ../configure \ + && $(am__cd) $(distdir)/_build/sub \ + && ../../configure \ $(AM_DISTCHECK_CONFIGURE_FLAGS) \ $(DISTCHECK_CONFIGURE_FLAGS) \ - --srcdir=.. --prefix="$$dc_install_base" \ + --srcdir=../.. --prefix="$$dc_install_base" \ && $(MAKE) $(AM_MAKEFLAGS) \ - && $(MAKE) $(AM_MAKEFLAGS) dvi \ + && $(MAKE) $(AM_MAKEFLAGS) $(AM_DISTCHECK_DVI_TARGET) \ && $(MAKE) $(AM_MAKEFLAGS) check \ && $(MAKE) $(AM_MAKEFLAGS) install \ && $(MAKE) $(AM_MAKEFLAGS) installcheck \ @@ -829,18 +847,20 @@ uninstall-am: uninstall-pkgconfigDATA am--refresh check check-am clean clean-cscope clean-generic \ clean-libtool cscope cscopelist-am ctags ctags-am dist \ dist-all dist-bzip2 dist-gzip dist-lzip dist-shar dist-tarZ \ - dist-xz dist-zip distcheck distclean distclean-generic \ - distclean-libtool distclean-tags distcleancheck distdir \ - distuninstallcheck dvi dvi-am html html-am info info-am \ - install install-am install-data install-data-am install-dvi \ - install-dvi-am install-exec install-exec-am install-html \ - install-html-am install-info install-info-am install-man \ - install-pdf install-pdf-am install-pkgconfigDATA install-ps \ - install-ps-am install-strip installcheck installcheck-am \ - installdirs installdirs-am maintainer-clean \ - maintainer-clean-generic mostlyclean mostlyclean-generic \ - mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \ - uninstall-am uninstall-pkgconfigDATA + dist-xz dist-zip dist-zstd distcheck distclean \ + distclean-generic distclean-libtool distclean-tags \ + distcleancheck distdir distuninstallcheck dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-pkgconfigDATA install-ps install-ps-am install-strip \ + installcheck installcheck-am installdirs installdirs-am \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags tags-am uninstall uninstall-am uninstall-pkgconfigDATA + +.PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. diff --git a/bindings/cpp/aclocal.m4 b/bindings/cpp/aclocal.m4 index f5dec8f..dd8f70b 100644 --- a/bindings/cpp/aclocal.m4 +++ b/bindings/cpp/aclocal.m4 @@ -1,6 +1,6 @@ -# generated automatically by aclocal 1.14.1 -*- Autoconf -*- +# generated automatically by aclocal 1.16.5 -*- Autoconf -*- -# Copyright (C) 1996-2013 Free Software Foundation, Inc. +# Copyright (C) 1996-2021 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -14,17 +14,15 @@ m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])]) m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl -m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],, -[m4_warning([this file was generated for autoconf 2.69. +m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.71],, +[m4_warning([this file was generated for autoconf 2.71. You have another version of autoconf. It may work, but is not guaranteed to. If you have problems, you may need to regenerate the build system entirely. To do so, use the procedure documented by the package, typically 'autoreconf'.])]) # libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- # -# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, -# 2006, 2007, 2008, 2009, 2010, 2011 Free Software -# Foundation, Inc. +# Copyright (C) 1996-2001, 2003-2015 Free Software Foundation, Inc. # Written by Gordon Matzigkeit, 1996 # # This file is free software; the Free Software Foundation gives @@ -32,36 +30,30 @@ To do so, use the procedure documented by the package, typically 'autoreconf'.]) # modifications, as long as this notice is preserved. m4_define([_LT_COPYING], [dnl -# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, -# 2006, 2007, 2008, 2009, 2010, 2011 Free Software -# Foundation, Inc. -# Written by Gordon Matzigkeit, 1996 +# Copyright (C) 2014 Free Software Foundation, Inc. +# This is free software; see the source for copying conditions. There is NO +# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +# GNU Libtool is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of of the License, or +# (at your option) any later version. # -# This file is part of GNU Libtool. +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program or library that is built +# using GNU Libtool, you may include this file under the same +# distribution terms that you use for the rest of that program. # -# GNU Libtool is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License as -# published by the Free Software Foundation; either version 2 of -# the License, or (at your option) any later version. -# -# As a special exception to the GNU General Public License, -# if you distribute this file as part of a program or library that -# is built using GNU Libtool, you may include this file under the -# same distribution terms that you use for the rest of that program. -# -# GNU Libtool is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of +# GNU Libtool is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License -# along with GNU Libtool; see the file COPYING. If not, a copy -# can be downloaded from http://www.gnu.org/licenses/gpl.html, or -# obtained by writing to the Free Software Foundation, Inc., -# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# along with this program. If not, see . ]) -# serial 57 LT_INIT +# serial 58 LT_INIT # LT_PREREQ(VERSION) @@ -89,7 +81,7 @@ esac # LT_INIT([OPTIONS]) # ------------------ AC_DEFUN([LT_INIT], -[AC_PREREQ([2.58])dnl We use AC_INCLUDES_DEFAULT +[AC_PREREQ([2.62])dnl We use AC_PATH_PROGS_FEATURE_CHECK AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl AC_BEFORE([$0], [LT_LANG])dnl AC_BEFORE([$0], [LT_OUTPUT])dnl @@ -113,7 +105,7 @@ dnl Parse OPTIONS _LT_SET_OPTIONS([$0], [$1]) # This can be used to rebuild libtool when needed -LIBTOOL_DEPS="$ltmain" +LIBTOOL_DEPS=$ltmain # Always use our own libtool. LIBTOOL='$(SHELL) $(top_builddir)/libtool' @@ -133,26 +125,43 @@ dnl AC_DEFUN([AC_PROG_LIBTOOL], []) dnl AC_DEFUN([AM_PROG_LIBTOOL], []) +# _LT_PREPARE_CC_BASENAME +# ----------------------- +m4_defun([_LT_PREPARE_CC_BASENAME], [ +# Calculate cc_basename. Skip known compiler wrappers and cross-prefix. +func_cc_basename () +{ + for cc_temp in @S|@*""; do + case $cc_temp in + compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;; + distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;; + \-*) ;; + *) break;; + esac + done + func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` +} +])# _LT_PREPARE_CC_BASENAME + + # _LT_CC_BASENAME(CC) # ------------------- -# Calculate cc_basename. Skip known compiler wrappers and cross-prefix. +# It would be clearer to call AC_REQUIREs from _LT_PREPARE_CC_BASENAME, +# but that macro is also expanded into generated libtool script, which +# arranges for $SED and $ECHO to be set by different means. m4_defun([_LT_CC_BASENAME], -[for cc_temp in $1""; do - case $cc_temp in - compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;; - distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;; - \-*) ;; - *) break;; - esac -done -cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` +[m4_require([_LT_PREPARE_CC_BASENAME])dnl +AC_REQUIRE([_LT_DECL_SED])dnl +AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl +func_cc_basename $1 +cc_basename=$func_cc_basename_result ]) # _LT_FILEUTILS_DEFAULTS # ---------------------- # It is okay to use these file commands and assume they have been set -# sensibly after `m4_require([_LT_FILEUTILS_DEFAULTS])'. +# sensibly after 'm4_require([_LT_FILEUTILS_DEFAULTS])'. m4_defun([_LT_FILEUTILS_DEFAULTS], [: ${CP="cp -f"} : ${MV="mv -f"} @@ -199,15 +208,16 @@ m4_require([_LT_CHECK_SHAREDLIB_FROM_LINKLIB])dnl m4_require([_LT_CMD_OLD_ARCHIVE])dnl m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl m4_require([_LT_WITH_SYSROOT])dnl +m4_require([_LT_CMD_TRUNCATE])dnl _LT_CONFIG_LIBTOOL_INIT([ -# See if we are running on zsh, and set the options which allow our +# See if we are running on zsh, and set the options that allow our # commands through without removal of \ escapes INIT. -if test -n "\${ZSH_VERSION+set}" ; then +if test -n "\${ZSH_VERSION+set}"; then setopt NO_GLOB_SUBST fi ]) -if test -n "${ZSH_VERSION+set}" ; then +if test -n "${ZSH_VERSION+set}"; then setopt NO_GLOB_SUBST fi @@ -220,7 +230,7 @@ aix3*) # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. - if test "X${COLLECT_NAMES+set}" != Xset; then + if test set != "${COLLECT_NAMES+set}"; then COLLECT_NAMES= export COLLECT_NAMES fi @@ -231,14 +241,14 @@ esac ofile=libtool can_build_shared=yes -# All known linkers require a `.a' archive for static linking (except MSVC, +# All known linkers require a '.a' archive for static linking (except MSVC, # which needs '.lib'). libext=a -with_gnu_ld="$lt_cv_prog_gnu_ld" +with_gnu_ld=$lt_cv_prog_gnu_ld -old_CC="$CC" -old_CFLAGS="$CFLAGS" +old_CC=$CC +old_CFLAGS=$CFLAGS # Set sane defaults for various variables test -z "$CC" && CC=cc @@ -291,21 +301,21 @@ no_glob_subst='s/\*/\\\*/g' # _LT_PROG_LTMAIN # --------------- -# Note that this code is called both from `configure', and `config.status' +# Note that this code is called both from 'configure', and 'config.status' # now that we use AC_CONFIG_COMMANDS to generate libtool. Notably, -# `config.status' has no value for ac_aux_dir unless we are using Automake, +# 'config.status' has no value for ac_aux_dir unless we are using Automake, # so we pass a copy along to make sure it has a sensible value anyway. m4_defun([_LT_PROG_LTMAIN], [m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl _LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir']) -ltmain="$ac_aux_dir/ltmain.sh" +ltmain=$ac_aux_dir/ltmain.sh ])# _LT_PROG_LTMAIN # So that we can recreate a full libtool script including additional # tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS -# in macros and then make a single call at the end using the `libtool' +# in macros and then make a single call at the end using the 'libtool' # label. @@ -437,8 +447,8 @@ m4_define([_lt_decl_all_varnames], # _LT_CONFIG_STATUS_DECLARE([VARNAME]) # ------------------------------------ -# Quote a variable value, and forward it to `config.status' so that its -# declaration there will have the same value as in `configure'. VARNAME +# Quote a variable value, and forward it to 'config.status' so that its +# declaration there will have the same value as in 'configure'. VARNAME # must have a single quote delimited value for this to work. m4_define([_LT_CONFIG_STATUS_DECLARE], [$1='`$ECHO "$][$1" | $SED "$delay_single_quote_subst"`']) @@ -462,7 +472,7 @@ m4_defun([_LT_CONFIG_STATUS_DECLARATIONS], # Output comment and list of tags supported by the script m4_defun([_LT_LIBTOOL_TAGS], [_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl -available_tags="_LT_TAGS"dnl +available_tags='_LT_TAGS'dnl ]) @@ -490,7 +500,7 @@ m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl # _LT_LIBTOOL_CONFIG_VARS # ----------------------- # Produce commented declarations of non-tagged libtool config variables -# suitable for insertion in the LIBTOOL CONFIG section of the `libtool' +# suitable for insertion in the LIBTOOL CONFIG section of the 'libtool' # script. Tagged libtool config variables (even for the LIBTOOL CONFIG # section) are produced by _LT_LIBTOOL_TAG_VARS. m4_defun([_LT_LIBTOOL_CONFIG_VARS], @@ -516,8 +526,8 @@ m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])]) # Send accumulated output to $CONFIG_STATUS. Thanks to the lists of # variables for single and double quote escaping we saved from calls # to _LT_DECL, we can put quote escaped variables declarations -# into `config.status', and then the shell code to quote escape them in -# for loops in `config.status'. Finally, any additional code accumulated +# into 'config.status', and then the shell code to quote escape them in +# for loops in 'config.status'. Finally, any additional code accumulated # from calls to _LT_CONFIG_LIBTOOL_INIT is expanded. m4_defun([_LT_CONFIG_COMMANDS], [AC_PROVIDE_IFELSE([LT_OUTPUT], @@ -563,7 +573,7 @@ for var in lt_decl_all_varnames([[ \ ]], lt_decl_quote_varnames); do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[[\\\\\\\`\\"\\\$]]*) - eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" @@ -576,7 +586,7 @@ for var in lt_decl_all_varnames([[ \ ]], lt_decl_dquote_varnames); do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[[\\\\\\\`\\"\\\$]]*) - eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" @@ -592,7 +602,7 @@ _LT_OUTPUT_LIBTOOL_INIT # Generate a child script FILE with all initialization necessary to # reuse the environment learned by the parent script, and make the # file executable. If COMMENT is supplied, it is inserted after the -# `#!' sequence but before initialization text begins. After this +# '#!' sequence but before initialization text begins. After this # macro, additional text can be appended to FILE to form the body of # the child script. The macro ends with non-zero status if the # file could not be fully written (such as if the disk is full). @@ -614,7 +624,7 @@ AS_SHELL_SANITIZE _AS_PREPARE exec AS_MESSAGE_FD>&1 _ASEOF -test $lt_write_fail = 0 && chmod +x $1[]dnl +test 0 = "$lt_write_fail" && chmod +x $1[]dnl m4_popdef([AS_MESSAGE_LOG_FD])])])# _LT_GENERATED_FILE_INIT # LT_OUTPUT @@ -637,7 +647,7 @@ exec AS_MESSAGE_LOG_FD>>config.log } >&AS_MESSAGE_LOG_FD lt_cl_help="\ -\`$as_me' creates a local libtool stub from the current configuration, +'$as_me' creates a local libtool stub from the current configuration, for use in further configure time tests before the real libtool is generated. @@ -657,9 +667,9 @@ configured by $[0], generated by m4_PACKAGE_STRING. Copyright (C) 2011 Free Software Foundation, Inc. This config.lt script is free software; the Free Software Foundation -gives unlimited permission to copy, distribute and modify it." +gives unlimited permision to copy, distribute and modify it." -while test $[#] != 0 +while test 0 != $[#] do case $[1] in --version | --v* | -V ) @@ -672,10 +682,10 @@ do lt_cl_silent=: ;; -*) AC_MSG_ERROR([unrecognized option: $[1] -Try \`$[0] --help' for more information.]) ;; +Try '$[0] --help' for more information.]) ;; *) AC_MSG_ERROR([unrecognized argument: $[1] -Try \`$[0] --help' for more information.]) ;; +Try '$[0] --help' for more information.]) ;; esac shift done @@ -701,7 +711,7 @@ chmod +x "$CONFIG_LT" # open by configure. Here we exec the FD to /dev/null, effectively closing # config.log, so it can be properly (re)opened and appended to by config.lt. lt_cl_success=: -test "$silent" = yes && +test yes = "$silent" && lt_config_lt_args="$lt_config_lt_args --quiet" exec AS_MESSAGE_LOG_FD>/dev/null $SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false @@ -721,32 +731,47 @@ m4_defun([_LT_CONFIG], _LT_CONFIG_SAVE_COMMANDS([ m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl m4_if(_LT_TAG, [C], [ - # See if we are running on zsh, and set the options which allow our + # See if we are running on zsh, and set the options that allow our # commands through without removal of \ escapes. - if test -n "${ZSH_VERSION+set}" ; then + if test -n "${ZSH_VERSION+set}"; then setopt NO_GLOB_SUBST fi - cfgfile="${ofile}T" + cfgfile=${ofile}T trap "$RM \"$cfgfile\"; exit 1" 1 2 15 $RM "$cfgfile" cat <<_LT_EOF >> "$cfgfile" #! $SHELL - -# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. -# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION +# Generated automatically by $as_me ($PACKAGE) $VERSION # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # NOTE: Changes made to this file will be lost: look at ltmain.sh. -# + +# Provide generalized library-building support services. +# Written by Gordon Matzigkeit, 1996 + _LT_COPYING _LT_LIBTOOL_TAGS +# Configured defaults for sys_lib_dlsearch_path munging. +: \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"} + # ### BEGIN LIBTOOL CONFIG _LT_LIBTOOL_CONFIG_VARS _LT_LIBTOOL_TAG_VARS # ### END LIBTOOL CONFIG +_LT_EOF + + cat <<'_LT_EOF' >> "$cfgfile" + +# ### BEGIN FUNCTIONS SHARED WITH CONFIGURE + +_LT_PREPARE_MUNGE_PATH_LIST +_LT_PREPARE_CC_BASENAME + +# ### END FUNCTIONS SHARED WITH CONFIGURE + _LT_EOF case $host_os in @@ -755,7 +780,7 @@ _LT_EOF # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. -if test "X${COLLECT_NAMES+set}" != Xset; then +if test set != "${COLLECT_NAMES+set}"; then COLLECT_NAMES= export COLLECT_NAMES fi @@ -772,8 +797,6 @@ _LT_EOF sed '$q' "$ltmain" >> "$cfgfile" \ || (rm -f "$cfgfile"; exit 1) - _LT_PROG_REPLACE_SHELLFNS - mv -f "$cfgfile" "$ofile" || (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") chmod +x "$ofile" @@ -791,7 +814,6 @@ _LT_EOF [m4_if([$1], [], [ PACKAGE='$PACKAGE' VERSION='$VERSION' - TIMESTAMP='$TIMESTAMP' RM='$RM' ofile='$ofile'], []) ])dnl /_LT_CONFIG_SAVE_COMMANDS @@ -988,7 +1010,7 @@ m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[ AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod], [lt_cv_apple_cc_single_mod=no - if test -z "${LT_MULTI_MODULE}"; then + if test -z "$LT_MULTI_MODULE"; then # By default we will add the -single_module flag. You can override # by either setting the environment variable LT_MULTI_MODULE # non-empty at configure time, or by adding -multi_module to the @@ -1006,7 +1028,7 @@ m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[ cat conftest.err >&AS_MESSAGE_LOG_FD # Otherwise, if the output was created with a 0 exit code from # the compiler, it worked. - elif test -f libconftest.dylib && test $_lt_result -eq 0; then + elif test -f libconftest.dylib && test 0 = "$_lt_result"; then lt_cv_apple_cc_single_mod=yes else cat conftest.err >&AS_MESSAGE_LOG_FD @@ -1024,7 +1046,7 @@ m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[ AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], [lt_cv_ld_exported_symbols_list=yes], [lt_cv_ld_exported_symbols_list=no]) - LDFLAGS="$save_LDFLAGS" + LDFLAGS=$save_LDFLAGS ]) AC_CACHE_CHECK([for -force_load linker flag],[lt_cv_ld_force_load], @@ -1046,7 +1068,7 @@ _LT_EOF _lt_result=$? if test -s conftest.err && $GREP force_load conftest.err; then cat conftest.err >&AS_MESSAGE_LOG_FD - elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then + elif test -f conftest && test 0 = "$_lt_result" && $GREP forced_load conftest >/dev/null 2>&1; then lt_cv_ld_force_load=yes else cat conftest.err >&AS_MESSAGE_LOG_FD @@ -1056,32 +1078,27 @@ _LT_EOF ]) case $host_os in rhapsody* | darwin1.[[012]]) - _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; + _lt_dar_allow_undefined='$wl-undefined ${wl}suppress' ;; darwin1.*) - _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; - darwin*) # darwin 5.x on - # if running on 10.5 or later, the deployment target defaults - # to the OS version, if on x86, and 10.4, the deployment - # target defaults to 10.4. Don't you love it? - case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in - 10.0,*86*-darwin8*|10.0,*-darwin[[91]]*) - _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; - 10.[[012]]*) - _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; - 10.*) - _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; + _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; + darwin*) + case ${MACOSX_DEPLOYMENT_TARGET},$host in + 10.[[012]],*|,*powerpc*) + _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; + *) + _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; esac ;; esac - if test "$lt_cv_apple_cc_single_mod" = "yes"; then + if test yes = "$lt_cv_apple_cc_single_mod"; then _lt_dar_single_mod='$single_module' fi - if test "$lt_cv_ld_exported_symbols_list" = "yes"; then - _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' + if test yes = "$lt_cv_ld_exported_symbols_list"; then + _lt_dar_export_syms=' $wl-exported_symbols_list,$output_objdir/$libname-symbols.expsym' else - _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' + _lt_dar_export_syms='~$NMEDIT -s $output_objdir/$libname-symbols.expsym $lib' fi - if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then + if test : != "$DSYMUTIL" && test no = "$lt_cv_ld_force_load"; then _lt_dsymutil='~$DSYMUTIL $lib || :' else _lt_dsymutil= @@ -1101,29 +1118,29 @@ m4_defun([_LT_DARWIN_LINKER_FEATURES], _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported - if test "$lt_cv_ld_force_load" = "yes"; then - _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' + if test yes = "$lt_cv_ld_force_load"; then + _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' m4_case([$1], [F77], [_LT_TAGVAR(compiler_needs_object, $1)=yes], [FC], [_LT_TAGVAR(compiler_needs_object, $1)=yes]) else _LT_TAGVAR(whole_archive_flag_spec, $1)='' fi _LT_TAGVAR(link_all_deplibs, $1)=yes - _LT_TAGVAR(allow_undefined_flag, $1)="$_lt_dar_allow_undefined" + _LT_TAGVAR(allow_undefined_flag, $1)=$_lt_dar_allow_undefined case $cc_basename in - ifort*) _lt_dar_can_shared=yes ;; + ifort*|nagfor*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac - if test "$_lt_dar_can_shared" = "yes"; then + if test yes = "$_lt_dar_can_shared"; then output_verbose_link_cmd=func_echo_all - _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" - _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" - _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" - _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" + _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil" + _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil" + _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil" + _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil" m4_if([$1], [CXX], -[ if test "$lt_cv_apple_cc_single_mod" != "yes"; then - _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}" - _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}" +[ if test yes != "$lt_cv_apple_cc_single_mod"; then + _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dsymutil" + _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dar_export_syms$_lt_dsymutil" fi ],[]) else @@ -1143,7 +1160,7 @@ m4_defun([_LT_DARWIN_LINKER_FEATURES], # Allow to override them for all tags through lt_cv_aix_libpath. m4_defun([_LT_SYS_MODULE_PATH_AIX], [m4_require([_LT_DECL_SED])dnl -if test "${lt_cv_aix_libpath+set}" = set; then +if test set = "${lt_cv_aix_libpath+set}"; then aix_libpath=$lt_cv_aix_libpath else AC_CACHE_VAL([_LT_TAGVAR([lt_cv_aix_libpath_], [$1])], @@ -1161,7 +1178,7 @@ else _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi],[]) if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then - _LT_TAGVAR([lt_cv_aix_libpath_], [$1])="/usr/lib:/lib" + _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=/usr/lib:/lib fi ]) aix_libpath=$_LT_TAGVAR([lt_cv_aix_libpath_], [$1]) @@ -1181,8 +1198,8 @@ m4_define([_LT_SHELL_INIT], # ----------------------- # Find how we can fake an echo command that does not interpret backslash. # In particular, with Autoconf 2.60 or later we add some code to the start -# of the generated configure script which will find a shell with a builtin -# printf (which we can use as an echo command). +# of the generated configure script that will find a shell with a builtin +# printf (that we can use as an echo command). m4_defun([_LT_PROG_ECHO_BACKSLASH], [ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO @@ -1210,10 +1227,10 @@ fi # Invoke $ECHO with all args, space-separated. func_echo_all () { - $ECHO "$*" + $ECHO "$*" } -case "$ECHO" in +case $ECHO in printf*) AC_MSG_RESULT([printf]) ;; print*) AC_MSG_RESULT([print -r]) ;; *) AC_MSG_RESULT([cat]) ;; @@ -1239,16 +1256,17 @@ _LT_DECL([], [ECHO], [1], [An echo program that protects backslashes]) AC_DEFUN([_LT_WITH_SYSROOT], [AC_MSG_CHECKING([for sysroot]) AC_ARG_WITH([sysroot], -[ --with-sysroot[=DIR] Search for dependent libraries within DIR - (or the compiler's sysroot if not specified).], +[AS_HELP_STRING([--with-sysroot@<:@=DIR@:>@], + [Search for dependent libraries within DIR (or the compiler's sysroot + if not specified).])], [], [with_sysroot=no]) dnl lt_sysroot will always be passed unquoted. We quote it here dnl in case the user passed a directory name. lt_sysroot= -case ${with_sysroot} in #( +case $with_sysroot in #( yes) - if test "$GCC" = yes; then + if test yes = "$GCC"; then lt_sysroot=`$CC --print-sysroot 2>/dev/null` fi ;; #( @@ -1258,14 +1276,14 @@ case ${with_sysroot} in #( no|'') ;; #( *) - AC_MSG_RESULT([${with_sysroot}]) + AC_MSG_RESULT([$with_sysroot]) AC_MSG_ERROR([The sysroot must be an absolute path.]) ;; esac AC_MSG_RESULT([${lt_sysroot:-no}]) _LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl -[dependent libraries, and in which our libraries should be installed.])]) +[dependent libraries, and where our libraries should be installed.])]) # _LT_ENABLE_LOCK # --------------- @@ -1273,31 +1291,33 @@ m4_defun([_LT_ENABLE_LOCK], [AC_ARG_ENABLE([libtool-lock], [AS_HELP_STRING([--disable-libtool-lock], [avoid locking (might break parallel builds)])]) -test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes +test no = "$enable_libtool_lock" || enable_libtool_lock=yes # Some flags need to be propagated to the compiler or linker for good # libtool support. case $host in ia64-*-hpux*) - # Find out which ABI we are using. + # Find out what ABI is being produced by ac_compile, and set mode + # options accordingly. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.$ac_objext` in *ELF-32*) - HPUX_IA64_MODE="32" + HPUX_IA64_MODE=32 ;; *ELF-64*) - HPUX_IA64_MODE="64" + HPUX_IA64_MODE=64 ;; esac fi rm -rf conftest* ;; *-*-irix6*) - # Find out which ABI we are using. + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then - if test "$lt_cv_prog_gnu_ld" = yes; then + if test yes = "$lt_cv_prog_gnu_ld"; then case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -melf32bsmip" @@ -1326,9 +1346,46 @@ ia64-*-hpux*) rm -rf conftest* ;; +mips64*-*linux*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. + echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + emul=elf + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + emul="${emul}32" + ;; + *64-bit*) + emul="${emul}64" + ;; + esac + case `/usr/bin/file conftest.$ac_objext` in + *MSB*) + emul="${emul}btsmip" + ;; + *LSB*) + emul="${emul}ltsmip" + ;; + esac + case `/usr/bin/file conftest.$ac_objext` in + *N32*) + emul="${emul}n32" + ;; + esac + LD="${LD-ld} -m $emul" + fi + rm -rf conftest* + ;; + x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) - # Find out which ABI we are using. + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. Note that the listed cases only cover the + # situations where additional linker options are needed (such as when + # doing 32-bit compilation for a host where ld defaults to 64-bit, or + # vice versa); the common cases where no linker options are needed do + # not appear in the list. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.o` in @@ -1347,10 +1404,10 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) ;; esac ;; - powerpc64le-*) + powerpc64le-*linux*) LD="${LD-ld} -m elf32lppclinux" ;; - powerpc64-*) + powerpc64-*linux*) LD="${LD-ld} -m elf32ppclinux" ;; s390x-*linux*) @@ -1369,10 +1426,10 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) x86_64-*linux*) LD="${LD-ld} -m elf_x86_64" ;; - powerpcle-*) + powerpcle-*linux*) LD="${LD-ld} -m elf64lppc" ;; - powerpc-*) + powerpc-*linux*) LD="${LD-ld} -m elf64ppc" ;; s390*-*linux*|s390*-*tpf*) @@ -1390,19 +1447,20 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) *-*-sco3.2v5*) # On SCO OpenServer 5, we need -belf to get full-featured binaries. - SAVE_CFLAGS="$CFLAGS" + SAVE_CFLAGS=$CFLAGS CFLAGS="$CFLAGS -belf" AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, [AC_LANG_PUSH(C) AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) AC_LANG_POP]) - if test x"$lt_cv_cc_needs_belf" != x"yes"; then + if test yes != "$lt_cv_cc_needs_belf"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf - CFLAGS="$SAVE_CFLAGS" + CFLAGS=$SAVE_CFLAGS fi ;; *-*solaris*) - # Find out which ABI we are using. + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.o` in @@ -1410,7 +1468,7 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) case $lt_cv_prog_gnu_ld in yes*) case $host in - i?86-*-solaris*) + i?86-*-solaris*|x86_64-*-solaris*) LD="${LD-ld} -m elf_x86_64" ;; sparc*-*-solaris*) @@ -1419,7 +1477,7 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) esac # GNU ld 2.21 introduced _sol2 emulations. Use them if available. if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then - LD="${LD-ld}_sol2" + LD=${LD-ld}_sol2 fi ;; *) @@ -1435,7 +1493,7 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) ;; esac -need_locks="$enable_libtool_lock" +need_locks=$enable_libtool_lock ])# _LT_ENABLE_LOCK @@ -1454,11 +1512,11 @@ AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file], [echo conftest.$ac_objext > conftest.lst lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&AS_MESSAGE_LOG_FD' AC_TRY_EVAL([lt_ar_try]) - if test "$ac_status" -eq 0; then + if test 0 -eq "$ac_status"; then # Ensure the archiver fails upon bogus file names. rm -f conftest.$ac_objext libconftest.a AC_TRY_EVAL([lt_ar_try]) - if test "$ac_status" -ne 0; then + if test 0 -ne "$ac_status"; then lt_cv_ar_at_file=@ fi fi @@ -1466,7 +1524,7 @@ AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file], ]) ]) -if test "x$lt_cv_ar_at_file" = xno; then +if test no = "$lt_cv_ar_at_file"; then archiver_list_spec= else archiver_list_spec=$lt_cv_ar_at_file @@ -1497,7 +1555,7 @@ old_postuninstall_cmds= if test -n "$RANLIB"; then case $host_os in - openbsd*) + bitrig* | openbsd*) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" ;; *) @@ -1533,7 +1591,7 @@ AC_CACHE_CHECK([$1], [$2], [$2=no m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) echo "$lt_simple_compile_test_code" > conftest.$ac_ext - lt_compiler_flag="$3" + lt_compiler_flag="$3" ## exclude from sc_useless_quotes_in_assignment # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins @@ -1560,7 +1618,7 @@ AC_CACHE_CHECK([$1], [$2], $RM conftest* ]) -if test x"[$]$2" = xyes; then +if test yes = "[$]$2"; then m4_if([$5], , :, [$5]) else m4_if([$6], , :, [$6]) @@ -1582,7 +1640,7 @@ AC_DEFUN([_LT_LINKER_OPTION], m4_require([_LT_DECL_SED])dnl AC_CACHE_CHECK([$1], [$2], [$2=no - save_LDFLAGS="$LDFLAGS" + save_LDFLAGS=$LDFLAGS LDFLAGS="$LDFLAGS $3" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then @@ -1601,10 +1659,10 @@ AC_CACHE_CHECK([$1], [$2], fi fi $RM -r conftest* - LDFLAGS="$save_LDFLAGS" + LDFLAGS=$save_LDFLAGS ]) -if test x"[$]$2" = xyes; then +if test yes = "[$]$2"; then m4_if([$4], , :, [$4]) else m4_if([$5], , :, [$5]) @@ -1625,7 +1683,7 @@ AC_DEFUN([LT_CMD_MAX_LEN], AC_MSG_CHECKING([the maximum length of command line arguments]) AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl i=0 - teststring="ABCD" + teststring=ABCD case $build_os in msdosdjgpp*) @@ -1665,7 +1723,7 @@ AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl lt_cv_sys_max_cmd_len=8192; ;; - netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) + bitrig* | darwin* | dragonfly* | freebsd* | netbsd* | openbsd*) # This has been around since 386BSD, at least. Likely further. if test -x /sbin/sysctl; then lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` @@ -1716,22 +1774,22 @@ AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl *) lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` if test -n "$lt_cv_sys_max_cmd_len" && \ - test undefined != "$lt_cv_sys_max_cmd_len"; then + test undefined != "$lt_cv_sys_max_cmd_len"; then lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` else # Make teststring a little bigger before we do anything with it. # a 1K string should be a reasonable start. - for i in 1 2 3 4 5 6 7 8 ; do + for i in 1 2 3 4 5 6 7 8; do teststring=$teststring$teststring done SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} # If test is not a shell built-in, we'll probably end up computing a # maximum length that is only half of the actual maximum length, but # we can't tell. - while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \ + while { test X`env echo "$teststring$teststring" 2>/dev/null` \ = "X$teststring$teststring"; } >/dev/null 2>&1 && - test $i != 17 # 1/2 MB should be enough + test 17 != "$i" # 1/2 MB should be enough do i=`expr $i + 1` teststring=$teststring$teststring @@ -1747,7 +1805,7 @@ AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl ;; esac ]) -if test -n $lt_cv_sys_max_cmd_len ; then +if test -n "$lt_cv_sys_max_cmd_len"; then AC_MSG_RESULT($lt_cv_sys_max_cmd_len) else AC_MSG_RESULT(none) @@ -1775,7 +1833,7 @@ m4_defun([_LT_HEADER_DLFCN], # ---------------------------------------------------------------- m4_defun([_LT_TRY_DLOPEN_SELF], [m4_require([_LT_HEADER_DLFCN])dnl -if test "$cross_compiling" = yes; then : +if test yes = "$cross_compiling"; then : [$4] else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 @@ -1822,9 +1880,9 @@ else # endif #endif -/* When -fvisbility=hidden is used, assume the code has been annotated +/* When -fvisibility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ -#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) +#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif @@ -1850,7 +1908,7 @@ int main () return status; }] _LT_EOF - if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then + if AC_TRY_EVAL(ac_link) && test -s "conftest$ac_exeext" 2>/dev/null; then (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null lt_status=$? case x$lt_status in @@ -1871,7 +1929,7 @@ rm -fr conftest* # ------------------ AC_DEFUN([LT_SYS_DLOPEN_SELF], [m4_require([_LT_HEADER_DLFCN])dnl -if test "x$enable_dlopen" != xyes; then +if test yes != "$enable_dlopen"; then enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown @@ -1881,44 +1939,52 @@ else case $host_os in beos*) - lt_cv_dlopen="load_add_on" + lt_cv_dlopen=load_add_on lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ;; mingw* | pw32* | cegcc*) - lt_cv_dlopen="LoadLibrary" + lt_cv_dlopen=LoadLibrary lt_cv_dlopen_libs= ;; cygwin*) - lt_cv_dlopen="dlopen" + lt_cv_dlopen=dlopen lt_cv_dlopen_libs= ;; darwin*) - # if libdl is installed we need to link against it + # if libdl is installed we need to link against it AC_CHECK_LIB([dl], [dlopen], - [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[ - lt_cv_dlopen="dyld" + [lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl],[ + lt_cv_dlopen=dyld lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ]) ;; + tpf*) + # Don't try to run any link tests for TPF. We know it's impossible + # because TPF is a cross-compiler, and we know how we open DSOs. + lt_cv_dlopen=dlopen + lt_cv_dlopen_libs= + lt_cv_dlopen_self=no + ;; + *) AC_CHECK_FUNC([shl_load], - [lt_cv_dlopen="shl_load"], + [lt_cv_dlopen=shl_load], [AC_CHECK_LIB([dld], [shl_load], - [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"], + [lt_cv_dlopen=shl_load lt_cv_dlopen_libs=-ldld], [AC_CHECK_FUNC([dlopen], - [lt_cv_dlopen="dlopen"], + [lt_cv_dlopen=dlopen], [AC_CHECK_LIB([dl], [dlopen], - [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"], + [lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl], [AC_CHECK_LIB([svld], [dlopen], - [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"], + [lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-lsvld], [AC_CHECK_LIB([dld], [dld_link], - [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"]) + [lt_cv_dlopen=dld_link lt_cv_dlopen_libs=-ldld]) ]) ]) ]) @@ -1927,21 +1993,21 @@ else ;; esac - if test "x$lt_cv_dlopen" != xno; then - enable_dlopen=yes - else + if test no = "$lt_cv_dlopen"; then enable_dlopen=no + else + enable_dlopen=yes fi case $lt_cv_dlopen in dlopen) - save_CPPFLAGS="$CPPFLAGS" - test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" + save_CPPFLAGS=$CPPFLAGS + test yes = "$ac_cv_header_dlfcn_h" && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" - save_LDFLAGS="$LDFLAGS" + save_LDFLAGS=$LDFLAGS wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" - save_LIBS="$LIBS" + save_LIBS=$LIBS LIBS="$lt_cv_dlopen_libs $LIBS" AC_CACHE_CHECK([whether a program can dlopen itself], @@ -1951,7 +2017,7 @@ else lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) ]) - if test "x$lt_cv_dlopen_self" = xyes; then + if test yes = "$lt_cv_dlopen_self"; then wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" AC_CACHE_CHECK([whether a statically linked program can dlopen itself], lt_cv_dlopen_self_static, [dnl @@ -1961,9 +2027,9 @@ else ]) fi - CPPFLAGS="$save_CPPFLAGS" - LDFLAGS="$save_LDFLAGS" - LIBS="$save_LIBS" + CPPFLAGS=$save_CPPFLAGS + LDFLAGS=$save_LDFLAGS + LIBS=$save_LIBS ;; esac @@ -2055,8 +2121,8 @@ m4_defun([_LT_COMPILER_FILE_LOCKS], m4_require([_LT_FILEUTILS_DEFAULTS])dnl _LT_COMPILER_C_O([$1]) -hard_links="nottested" -if test "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then +hard_links=nottested +if test no = "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" && test no != "$need_locks"; then # do not overwrite the value of need_locks provided by the user AC_MSG_CHECKING([if we can lock with hard links]) hard_links=yes @@ -2066,8 +2132,8 @@ if test "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no AC_MSG_RESULT([$hard_links]) - if test "$hard_links" = no; then - AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe]) + if test no = "$hard_links"; then + AC_MSG_WARN(['$CC' does not support '-c -o', so 'make -j' may be unsafe]) need_locks=warn fi else @@ -2094,8 +2160,8 @@ objdir=$lt_cv_objdir _LT_DECL([], [objdir], [0], [The name of the directory that contains temporary libtool files])dnl m4_pattern_allow([LT_OBJDIR])dnl -AC_DEFINE_UNQUOTED(LT_OBJDIR, "$lt_cv_objdir/", - [Define to the sub-directory in which libtool stores uninstalled libraries.]) +AC_DEFINE_UNQUOTED([LT_OBJDIR], "$lt_cv_objdir/", + [Define to the sub-directory where libtool stores uninstalled libraries.]) ])# _LT_CHECK_OBJDIR @@ -2107,15 +2173,15 @@ m4_defun([_LT_LINKER_HARDCODE_LIBPATH], _LT_TAGVAR(hardcode_action, $1)= if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" || test -n "$_LT_TAGVAR(runpath_var, $1)" || - test "X$_LT_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then + test yes = "$_LT_TAGVAR(hardcode_automatic, $1)"; then # We can hardcode non-existent directories. - if test "$_LT_TAGVAR(hardcode_direct, $1)" != no && + if test no != "$_LT_TAGVAR(hardcode_direct, $1)" && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one - ## test "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" != no && - test "$_LT_TAGVAR(hardcode_minus_L, $1)" != no; then + ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" && + test no != "$_LT_TAGVAR(hardcode_minus_L, $1)"; then # Linking always hardcodes the temporary library directory. _LT_TAGVAR(hardcode_action, $1)=relink else @@ -2129,12 +2195,12 @@ else fi AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)]) -if test "$_LT_TAGVAR(hardcode_action, $1)" = relink || - test "$_LT_TAGVAR(inherit_rpath, $1)" = yes; then +if test relink = "$_LT_TAGVAR(hardcode_action, $1)" || + test yes = "$_LT_TAGVAR(inherit_rpath, $1)"; then # Fast installation is not supported enable_fast_install=no -elif test "$shlibpath_overrides_runpath" = yes || - test "$enable_shared" = no; then +elif test yes = "$shlibpath_overrides_runpath" || + test no = "$enable_shared"; then # Fast installation is not necessary enable_fast_install=needless fi @@ -2158,7 +2224,7 @@ else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in darwin*) - if test -n "$STRIP" ; then + if test -n "$STRIP"; then striplib="$STRIP -x" old_striplib="$STRIP -S" AC_MSG_RESULT([yes]) @@ -2176,6 +2242,47 @@ _LT_DECL([], [striplib], [1]) ])# _LT_CMD_STRIPLIB +# _LT_PREPARE_MUNGE_PATH_LIST +# --------------------------- +# Make sure func_munge_path_list() is defined correctly. +m4_defun([_LT_PREPARE_MUNGE_PATH_LIST], +[[# func_munge_path_list VARIABLE PATH +# ----------------------------------- +# VARIABLE is name of variable containing _space_ separated list of +# directories to be munged by the contents of PATH, which is string +# having a format: +# "DIR[:DIR]:" +# string "DIR[ DIR]" will be prepended to VARIABLE +# ":DIR[:DIR]" +# string "DIR[ DIR]" will be appended to VARIABLE +# "DIRP[:DIRP]::[DIRA:]DIRA" +# string "DIRP[ DIRP]" will be prepended to VARIABLE and string +# "DIRA[ DIRA]" will be appended to VARIABLE +# "DIR[:DIR]" +# VARIABLE will be replaced by "DIR[ DIR]" +func_munge_path_list () +{ + case x@S|@2 in + x) + ;; + *:) + eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'` \@S|@@S|@1\" + ;; + x:*) + eval @S|@1=\"\@S|@@S|@1 `$ECHO @S|@2 | $SED 's/:/ /g'`\" + ;; + *::*) + eval @S|@1=\"\@S|@@S|@1\ `$ECHO @S|@2 | $SED -e 's/.*:://' -e 's/:/ /g'`\" + eval @S|@1=\"`$ECHO @S|@2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \@S|@@S|@1\" + ;; + *) + eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'`\" + ;; + esac +} +]])# _LT_PREPARE_PATH_LIST + + # _LT_SYS_DYNAMIC_LINKER([TAG]) # ----------------------------- # PORTME Fill in your ld.so characteristics @@ -2186,17 +2293,18 @@ m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_OBJDUMP])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_CHECK_SHELL_FEATURES])dnl +m4_require([_LT_PREPARE_MUNGE_PATH_LIST])dnl AC_MSG_CHECKING([dynamic linker characteristics]) m4_if([$1], [], [ -if test "$GCC" = yes; then +if test yes = "$GCC"; then case $host_os in - darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; - *) lt_awk_arg="/^libraries:/" ;; + darwin*) lt_awk_arg='/^libraries:/,/LR/' ;; + *) lt_awk_arg='/^libraries:/' ;; esac case $host_os in - mingw* | cegcc*) lt_sed_strip_eq="s,=\([[A-Za-z]]:\),\1,g" ;; - *) lt_sed_strip_eq="s,=/,/,g" ;; + mingw* | cegcc*) lt_sed_strip_eq='s|=\([[A-Za-z]]:\)|\1|g' ;; + *) lt_sed_strip_eq='s|=/|/|g' ;; esac lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` case $lt_search_path_spec in @@ -2212,28 +2320,35 @@ if test "$GCC" = yes; then ;; esac # Ok, now we have the path, separated by spaces, we can step through it - # and add multilib dir if necessary. + # and add multilib dir if necessary... lt_tmp_lt_search_path_spec= - lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` + lt_multi_os_dir=/`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` + # ...but if some path component already ends with the multilib dir we assume + # that all is fine and trust -print-search-dirs as is (GCC 4.2? or newer). + case "$lt_multi_os_dir; $lt_search_path_spec " in + "/; "* | "/.; "* | "/./; "* | *"$lt_multi_os_dir "* | *"$lt_multi_os_dir/ "*) + lt_multi_os_dir= + ;; + esac for lt_sys_path in $lt_search_path_spec; do - if test -d "$lt_sys_path/$lt_multi_os_dir"; then - lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" - else + if test -d "$lt_sys_path$lt_multi_os_dir"; then + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path$lt_multi_os_dir" + elif test -n "$lt_multi_os_dir"; then test -d "$lt_sys_path" && \ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" fi done lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' -BEGIN {RS=" "; FS="/|\n";} { - lt_foo=""; - lt_count=0; +BEGIN {RS = " "; FS = "/|\n";} { + lt_foo = ""; + lt_count = 0; for (lt_i = NF; lt_i > 0; lt_i--) { if ($lt_i != "" && $lt_i != ".") { if ($lt_i == "..") { lt_count++; } else { if (lt_count == 0) { - lt_foo="/" $lt_i lt_foo; + lt_foo = "/" $lt_i lt_foo; } else { lt_count--; } @@ -2247,7 +2362,7 @@ BEGIN {RS=" "; FS="/|\n";} { # for these hosts. case $host_os in mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ - $SED 's,/\([[A-Za-z]]:\),\1,g'` ;; + $SED 's|/\([[A-Za-z]]:\)|\1|g'` ;; esac sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` else @@ -2256,7 +2371,7 @@ fi]) library_names_spec= libname_spec='lib$name' soname_spec= -shrext_cmds=".so" +shrext_cmds=.so postinstall_cmds= postuninstall_cmds= finish_cmds= @@ -2273,14 +2388,17 @@ hardcode_into_libs=no # flags to be left without arguments need_version=unknown +AC_ARG_VAR([LT_SYS_LIBRARY_PATH], +[User-defined run-time library search path.]) + case $host_os in aix3*) version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' + library_names_spec='$libname$release$shared_ext$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. - soname_spec='${libname}${release}${shared_ext}$major' + soname_spec='$libname$release$shared_ext$major' ;; aix[[4-9]]*) @@ -2288,41 +2406,91 @@ aix[[4-9]]*) need_lib_prefix=no need_version=no hardcode_into_libs=yes - if test "$host_cpu" = ia64; then + if test ia64 = "$host_cpu"; then # AIX 5 supports IA64 - library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' + library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with - # the line `#! .'. This would cause the generated library to - # depend on `.', always an invalid library. This was fixed in + # the line '#! .'. This would cause the generated library to + # depend on '.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[[01]] | aix4.[[01]].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' - echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then + echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac - # AIX (on Power*) has no versioning support, so currently we can not hardcode correct + # Using Import Files as archive members, it is possible to support + # filename-based versioning of shared library archives on AIX. While + # this would work for both with and without runtime linking, it will + # prevent static linking of such archives. So we do filename-based + # shared library versioning with .so extension only, which is used + # when both runtime linking and shared linking is enabled. + # Unfortunately, runtime linking may impact performance, so we do + # not want this to be the default eventually. Also, we use the + # versioned .so libs for executables only if there is the -brtl + # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only. + # To allow for filename-based versioning support, we need to create + # libNAME.so.V as an archive file, containing: + # *) an Import File, referring to the versioned filename of the + # archive as well as the shared archive member, telling the + # bitwidth (32 or 64) of that shared object, and providing the + # list of exported symbols of that shared object, eventually + # decorated with the 'weak' keyword + # *) the shared object with the F_LOADONLY flag set, to really avoid + # it being seen by the linker. + # At run time we better use the real file rather than another symlink, + # but for link time we create the symlink libNAME.so -> libNAME.so.V + + case $with_aix_soname,$aix_use_runtimelinking in + # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. - if test "$aix_use_runtimelinking" = yes; then + aix,yes) # traditional libtool + dynamic_linker='AIX unversionable lib.so' # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - else + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + ;; + aix,no) # traditional AIX only + dynamic_linker='AIX lib.a[(]lib.so.V[)]' # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. - library_names_spec='${libname}${release}.a $libname.a' - soname_spec='${libname}${release}${shared_ext}$major' - fi + library_names_spec='$libname$release.a $libname.a' + soname_spec='$libname$release$shared_ext$major' + ;; + svr4,*) # full svr4 only + dynamic_linker="AIX lib.so.V[(]$shared_archive_member_spec.o[)]" + library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' + # We do not specify a path in Import Files, so LIBPATH fires. + shlibpath_overrides_runpath=yes + ;; + *,yes) # both, prefer svr4 + dynamic_linker="AIX lib.so.V[(]$shared_archive_member_spec.o[)], lib.a[(]lib.so.V[)]" + library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' + # unpreferred sharedlib libNAME.a needs extra handling + postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"' + postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"' + # We do not specify a path in Import Files, so LIBPATH fires. + shlibpath_overrides_runpath=yes + ;; + *,no) # both, prefer aix + dynamic_linker="AIX lib.a[(]lib.so.V[)], lib.so.V[(]$shared_archive_member_spec.o[)]" + library_names_spec='$libname$release.a $libname.a' + soname_spec='$libname$release$shared_ext$major' + # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling + postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)' + postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"' + ;; + esac shlibpath_var=LIBPATH fi ;; @@ -2332,18 +2500,18 @@ amigaos*) powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. - finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; esac ;; beos*) - library_names_spec='${libname}${shared_ext}' + library_names_spec='$libname$shared_ext' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; @@ -2351,8 +2519,8 @@ beos*) bsdi[[45]]*) version_type=linux # correct to gnu/linux during the next big refactor need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" @@ -2364,7 +2532,7 @@ bsdi[[45]]*) cygwin* | mingw* | pw32* | cegcc*) version_type=windows - shrext_cmds=".dll" + shrext_cmds=.dll need_version=no need_lib_prefix=no @@ -2373,8 +2541,8 @@ cygwin* | mingw* | pw32* | cegcc*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds - postinstall_cmds='base_file=`basename \${file}`~ - dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ @@ -2390,17 +2558,17 @@ cygwin* | mingw* | pw32* | cegcc*) case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' - soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + soname_spec='`echo $libname | sed -e 's/^lib/cyg/'``echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' m4_if([$1], [],[ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"]) ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix - soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + soname_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' - library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + library_names_spec='`echo $libname | sed -e 's/^lib/pw/'``echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' ;; esac dynamic_linker='Win32 ld.exe' @@ -2409,8 +2577,8 @@ m4_if([$1], [],[ *,cl*) # Native MSVC libname_spec='$name' - soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' - library_names_spec='${libname}.dll.lib' + soname_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' + library_names_spec='$libname.dll.lib' case $build_os in mingw*) @@ -2437,7 +2605,7 @@ m4_if([$1], [],[ sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) - sys_lib_search_path_spec="$LIB" + sys_lib_search_path_spec=$LIB if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then # It is most probably a Windows format PATH. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` @@ -2450,8 +2618,8 @@ m4_if([$1], [],[ esac # DLL is installed to $(libdir)/../bin by postinstall_cmds - postinstall_cmds='base_file=`basename \${file}`~ - dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' @@ -2464,7 +2632,7 @@ m4_if([$1], [],[ *) # Assume MSVC wrapper - library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib' + library_names_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac @@ -2477,8 +2645,8 @@ darwin* | rhapsody*) version_type=darwin need_lib_prefix=no need_version=no - library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' - soname_spec='${libname}${release}${major}$shared_ext' + library_names_spec='$libname$release$major$shared_ext $libname$shared_ext' + soname_spec='$libname$release$major$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' @@ -2491,8 +2659,8 @@ dgux*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' - soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH ;; @@ -2510,12 +2678,13 @@ freebsd* | dragonfly*) version_type=freebsd-$objformat case $version_type in freebsd-elf*) - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' need_version=no need_lib_prefix=no ;; freebsd-*) - library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' need_version=yes ;; esac @@ -2545,10 +2714,10 @@ haiku*) need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' shlibpath_var=LIBRARY_PATH - shlibpath_overrides_runpath=yes + shlibpath_overrides_runpath=no sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' hardcode_into_libs=yes ;; @@ -2566,14 +2735,15 @@ hpux9* | hpux10* | hpux11*) dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - if test "X$HPUX_IA64_MODE" = X32; then + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + if test 32 = "$HPUX_IA64_MODE"; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + sys_lib_dlsearch_path_spec=/usr/lib/hpux32 else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + sys_lib_dlsearch_path_spec=/usr/lib/hpux64 fi - sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' @@ -2581,8 +2751,8 @@ hpux9* | hpux10* | hpux11*) dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; @@ -2591,8 +2761,8 @@ hpux9* | hpux10* | hpux11*) dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555, ... @@ -2605,8 +2775,8 @@ interix[[3-9]]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no @@ -2617,7 +2787,7 @@ irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) - if test "$lt_cv_prog_gnu_ld" = yes; then + if test yes = "$lt_cv_prog_gnu_ld"; then version_type=linux # correct to gnu/linux during the next big refactor else version_type=irix @@ -2625,8 +2795,8 @@ irix5* | irix6* | nonstopux*) esac need_lib_prefix=no need_version=no - soname_spec='${libname}${release}${shared_ext}$major' - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' + soname_spec='$libname$release$shared_ext$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= @@ -2645,8 +2815,8 @@ irix5* | irix6* | nonstopux*) esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no - sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" - sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff" + sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff" hardcode_into_libs=yes ;; @@ -2655,13 +2825,33 @@ linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; +linux*android*) + version_type=none # Android doesn't support versioned libraries. + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext' + soname_spec='$libname$release$shared_ext' + finish_cmds= + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + dynamic_linker='Android linker' + # Don't embed -rpath directories since the linker doesn't support them. + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + ;; + # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no @@ -2686,7 +2876,12 @@ linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) # before this can be enabled. hardcode_into_libs=yes - # Append ld.so.conf contents to the search path + # Ideally, we could use ldconfig to report *all* directores which are + # searched for libraries, however this is still not possible. Aside from not + # being certain /sbin/ldconfig is available, command + # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64, + # even though it is searched at run-time. Try to do the best guess by + # appending ld.so.conf contents (and includes) to the search path. if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" @@ -2701,29 +2896,17 @@ linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) dynamic_linker='GNU/Linux ld.so' ;; -netbsdelf*-gnu) - version_type=linux - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - dynamic_linker='NetBSD ld.elf_so' - ;; - netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH @@ -2733,7 +2916,7 @@ netbsd*) newsos6) version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; @@ -2742,58 +2925,68 @@ newsos6) version_type=qnx need_lib_prefix=no need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; -openbsd*) +openbsd* | bitrig*) version_type=sunos - sys_lib_dlsearch_path_spec="/usr/lib" + sys_lib_dlsearch_path_spec=/usr/lib need_lib_prefix=no - # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. - case $host_os in - openbsd3.3 | openbsd3.3.*) need_version=yes ;; - *) need_version=no ;; - esac - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then + need_version=no + else + need_version=yes + fi + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH - if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then - case $host_os in - openbsd2.[[89]] | openbsd2.[[89]].*) - shlibpath_overrides_runpath=no - ;; - *) - shlibpath_overrides_runpath=yes - ;; - esac - else - shlibpath_overrides_runpath=yes - fi + shlibpath_overrides_runpath=yes ;; os2*) libname_spec='$name' - shrext_cmds=".dll" + version_type=windows + shrext_cmds=.dll + need_version=no need_lib_prefix=no - library_names_spec='$libname${shared_ext} $libname.a' + # OS/2 can only load a DLL with a base name of 8 characters or less. + soname_spec='`test -n "$os2dllname" && libname="$os2dllname"; + v=$($ECHO $release$versuffix | tr -d .-); + n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _); + $ECHO $n$v`$shared_ext' + library_names_spec='${libname}_dll.$libext' dynamic_linker='OS/2 ld.exe' - shlibpath_var=LIBPATH + shlibpath_var=BEGINLIBPATH + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no - soname_spec='${libname}${release}${shared_ext}$major' - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='$libname$release$shared_ext$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" - sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; rdos*) @@ -2804,8 +2997,8 @@ solaris*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes @@ -2815,11 +3008,11 @@ solaris*) sunos4*) version_type=sunos - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes - if test "$with_gnu_ld" = yes; then + if test yes = "$with_gnu_ld"; then need_lib_prefix=no fi need_version=yes @@ -2827,8 +3020,8 @@ sunos4*) sysv4 | sysv4.3*) version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) @@ -2849,24 +3042,24 @@ sysv4 | sysv4.3*) ;; sysv4*MP*) - if test -d /usr/nec ;then + if test -d /usr/nec; then version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' - soname_spec='$libname${shared_ext}.$major' + library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext' + soname_spec='$libname$shared_ext.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) - version_type=freebsd-elf + version_type=sco need_lib_prefix=no need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes - if test "$with_gnu_ld" = yes; then + if test yes = "$with_gnu_ld"; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' @@ -2884,7 +3077,7 @@ tpf*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes @@ -2892,8 +3085,8 @@ tpf*) uts4*) version_type=linux # correct to gnu/linux during the next big refactor - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH ;; @@ -2902,20 +3095,30 @@ uts4*) ;; esac AC_MSG_RESULT([$dynamic_linker]) -test "$dynamic_linker" = no && can_build_shared=no +test no = "$dynamic_linker" && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" -if test "$GCC" = yes; then +if test yes = "$GCC"; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi -if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then - sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" +if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then + sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec fi -if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then - sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" + +if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then + sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec fi +# remember unaugmented sys_lib_dlsearch_path content for libtool script decls... +configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec + +# ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code +func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH" + +# to be used as default LT_SYS_LIBRARY_PATH value in generated libtool +configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH + _LT_DECL([], [variables_saved_for_relink], [1], [Variables whose values should be saved in libtool wrapper scripts and restored at link time]) @@ -2948,39 +3151,41 @@ _LT_DECL([], [hardcode_into_libs], [0], [Whether we should hardcode library paths into libraries]) _LT_DECL([], [sys_lib_search_path_spec], [2], [Compile-time system search path for libraries]) -_LT_DECL([], [sys_lib_dlsearch_path_spec], [2], - [Run-time system search path for libraries]) +_LT_DECL([sys_lib_dlsearch_path_spec], [configure_time_dlsearch_path], [2], + [Detected run-time system search path for libraries]) +_LT_DECL([], [configure_time_lt_sys_library_path], [2], + [Explicit LT_SYS_LIBRARY_PATH set during ./configure time]) ])# _LT_SYS_DYNAMIC_LINKER # _LT_PATH_TOOL_PREFIX(TOOL) # -------------------------- -# find a file program which can recognize shared library +# find a file program that can recognize shared library AC_DEFUN([_LT_PATH_TOOL_PREFIX], [m4_require([_LT_DECL_EGREP])dnl AC_MSG_CHECKING([for $1]) AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, [case $MAGIC_CMD in [[\\/*] | ?:[\\/]*]) - lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. + lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path. ;; *) - lt_save_MAGIC_CMD="$MAGIC_CMD" - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + lt_save_MAGIC_CMD=$MAGIC_CMD + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR dnl $ac_dummy forces splitting on constant user-supplied paths. dnl POSIX.2 word splitting is done only on the output of word expansions, dnl not every word. This closes a longstanding sh security hole. ac_dummy="m4_if([$2], , $PATH, [$2])" for ac_dir in $ac_dummy; do - IFS="$lt_save_ifs" + IFS=$lt_save_ifs test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$1; then - lt_cv_path_MAGIC_CMD="$ac_dir/$1" + if test -f "$ac_dir/$1"; then + lt_cv_path_MAGIC_CMD=$ac_dir/"$1" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` - MAGIC_CMD="$lt_cv_path_MAGIC_CMD" + MAGIC_CMD=$lt_cv_path_MAGIC_CMD if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : @@ -3003,11 +3208,11 @@ _LT_EOF break fi done - IFS="$lt_save_ifs" - MAGIC_CMD="$lt_save_MAGIC_CMD" + IFS=$lt_save_ifs + MAGIC_CMD=$lt_save_MAGIC_CMD ;; esac]) -MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +MAGIC_CMD=$lt_cv_path_MAGIC_CMD if test -n "$MAGIC_CMD"; then AC_MSG_RESULT($MAGIC_CMD) else @@ -3025,7 +3230,7 @@ dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], []) # _LT_PATH_MAGIC # -------------- -# find a file program which can recognize a shared library +# find a file program that can recognize a shared library m4_defun([_LT_PATH_MAGIC], [_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH) if test -z "$lt_cv_path_MAGIC_CMD"; then @@ -3052,16 +3257,16 @@ m4_require([_LT_PROG_ECHO_BACKSLASH])dnl AC_ARG_WITH([gnu-ld], [AS_HELP_STRING([--with-gnu-ld], [assume the C compiler uses GNU ld @<:@default=no@:>@])], - [test "$withval" = no || with_gnu_ld=yes], + [test no = "$withval" || with_gnu_ld=yes], [with_gnu_ld=no])dnl ac_prog=ld -if test "$GCC" = yes; then +if test yes = "$GCC"; then # Check if gcc -print-prog-name=ld gives a path. AC_MSG_CHECKING([for ld used by $CC]) case $host in *-*-mingw*) - # gcc leaves a trailing carriage return which upsets mingw + # gcc leaves a trailing carriage return, which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; @@ -3075,7 +3280,7 @@ if test "$GCC" = yes; then while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` done - test -z "$LD" && LD="$ac_prog" + test -z "$LD" && LD=$ac_prog ;; "") # If it fails, then pretend we aren't using GCC. @@ -3086,37 +3291,37 @@ if test "$GCC" = yes; then with_gnu_ld=unknown ;; esac -elif test "$with_gnu_ld" = yes; then +elif test yes = "$with_gnu_ld"; then AC_MSG_CHECKING([for GNU ld]) else AC_MSG_CHECKING([for non-GNU ld]) fi AC_CACHE_VAL(lt_cv_path_LD, [if test -z "$LD"; then - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do - IFS="$lt_save_ifs" + IFS=$lt_save_ifs test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then - lt_cv_path_LD="$ac_dir/$ac_prog" + lt_cv_path_LD=$ac_dir/$ac_prog # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 conftest.i +cat conftest.i conftest.i >conftest2.i +: ${lt_DD:=$DD} +AC_PATH_PROGS_FEATURE_CHECK([lt_DD], [dd], +[if "$ac_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then + cmp -s conftest.i conftest.out \ + && ac_cv_path_lt_DD="$ac_path_lt_DD" ac_path_lt_DD_found=: +fi]) +rm -f conftest.i conftest2.i conftest.out]) +])# _LT_PATH_DD + + +# _LT_CMD_TRUNCATE +# ---------------- +# find command to truncate a binary pipe +m4_defun([_LT_CMD_TRUNCATE], +[m4_require([_LT_PATH_DD]) +AC_CACHE_CHECK([how to truncate binary pipes], [lt_cv_truncate_bin], +[printf 0123456789abcdef0123456789abcdef >conftest.i +cat conftest.i conftest.i >conftest2.i +lt_cv_truncate_bin= +if "$ac_cv_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then + cmp -s conftest.i conftest.out \ + && lt_cv_truncate_bin="$ac_cv_path_lt_DD bs=4096 count=1" +fi +rm -f conftest.i conftest2.i conftest.out +test -z "$lt_cv_truncate_bin" && lt_cv_truncate_bin="$SED -e 4q"]) +_LT_DECL([lt_truncate_bin], [lt_cv_truncate_bin], [1], + [Command to truncate a binary pipe]) +])# _LT_CMD_TRUNCATE + + # _LT_CHECK_MAGIC_METHOD # ---------------------- # how to check for library dependencies @@ -3202,13 +3444,13 @@ lt_cv_deplibs_check_method='unknown' # Need to set the preceding variable on all platforms that support # interlibrary dependencies. # 'none' -- dependencies not supported. -# `unknown' -- same as none, but documents that we really don't know. +# 'unknown' -- same as none, but documents that we really don't know. # 'pass_all' -- all dependencies passed with no checks. # 'test_compile' -- check by making test program. # 'file_magic [[regex]]' -- check by looking for files in library path -# which responds to the $file_magic_cmd with a given extended regex. -# If you have `file' or equivalent on your system and you're not sure -# whether `pass_all' will *always* work, you probably want this one. +# that responds to the $file_magic_cmd with a given extended regex. +# If you have 'file' or equivalent on your system and you're not sure +# whether 'pass_all' will *always* work, you probably want this one. case $host_os in aix[[4-9]]*) @@ -3235,8 +3477,7 @@ mingw* | pw32*) # Base MSYS/MinGW do not provide the 'file' command needed by # func_win32_libid shell function, so use a weaker test based on 'objdump', # unless we find 'file', for example because we are cross-compiling. - # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin. - if ( test "$lt_cv_nm_interface" = "BSD nm" && file / ) >/dev/null 2>&1; then + if ( file / ) >/dev/null 2>&1; then lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' else @@ -3314,7 +3555,7 @@ linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) lt_cv_deplibs_check_method=pass_all ;; -netbsd* | netbsdelf*-gnu) +netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' else @@ -3332,8 +3573,8 @@ newos6*) lt_cv_deplibs_check_method=pass_all ;; -openbsd*) - if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then +openbsd* | bitrig*) + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' @@ -3386,6 +3627,9 @@ sysv4 | sysv4.3*) tpf*) lt_cv_deplibs_check_method=pass_all ;; +os2*) + lt_cv_deplibs_check_method=pass_all + ;; esac ]) @@ -3426,33 +3670,38 @@ AC_DEFUN([LT_PATH_NM], AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM, [if test -n "$NM"; then # Let the user override the test. - lt_cv_path_NM="$NM" + lt_cv_path_NM=$NM else - lt_nm_to_check="${ac_tool_prefix}nm" + lt_nm_to_check=${ac_tool_prefix}nm if test -n "$ac_tool_prefix" && test "$build" = "$host"; then lt_nm_to_check="$lt_nm_to_check nm" fi for lt_tmp_nm in $lt_nm_to_check; do - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do - IFS="$lt_save_ifs" + IFS=$lt_save_ifs test -z "$ac_dir" && ac_dir=. - tmp_nm="$ac_dir/$lt_tmp_nm" - if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then + tmp_nm=$ac_dir/$lt_tmp_nm + if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext"; then # Check to see if the nm accepts a BSD-compat flag. - # Adding the `sed 1q' prevents false positives on HP-UX, which says: + # Adding the 'sed 1q' prevents false positives on HP-UX, which says: # nm: unknown option "B" ignored # Tru64's nm complains that /dev/null is an invalid object file - case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in - */dev/null* | *'Invalid file or object type'*) + # MSYS converts /dev/null to NUL, MinGW nm treats NUL as empty + case $build_os in + mingw*) lt_bad_file=conftest.nm/nofile ;; + *) lt_bad_file=/dev/null ;; + esac + case `"$tmp_nm" -B $lt_bad_file 2>&1 | sed '1q'` in + *$lt_bad_file* | *'Invalid file or object type'*) lt_cv_path_NM="$tmp_nm -B" - break + break 2 ;; *) case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in */dev/null*) lt_cv_path_NM="$tmp_nm -p" - break + break 2 ;; *) lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but @@ -3463,21 +3712,21 @@ else esac fi done - IFS="$lt_save_ifs" + IFS=$lt_save_ifs done : ${lt_cv_path_NM=no} fi]) -if test "$lt_cv_path_NM" != "no"; then - NM="$lt_cv_path_NM" +if test no != "$lt_cv_path_NM"; then + NM=$lt_cv_path_NM else # Didn't find any BSD compatible name lister, look for dumpbin. if test -n "$DUMPBIN"; then : # Let the user override the test. else AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :) - case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in + case `$DUMPBIN -symbols -headers /dev/null 2>&1 | sed '1q'` in *COFF*) - DUMPBIN="$DUMPBIN -symbols" + DUMPBIN="$DUMPBIN -symbols -headers" ;; *) DUMPBIN=: @@ -3485,8 +3734,8 @@ else esac fi AC_SUBST([DUMPBIN]) - if test "$DUMPBIN" != ":"; then - NM="$DUMPBIN" + if test : != "$DUMPBIN"; then + NM=$DUMPBIN fi fi test -z "$NM" && NM=nm @@ -3532,8 +3781,8 @@ lt_cv_sharedlib_from_linklib_cmd, case $host_os in cygwin* | mingw* | pw32* | cegcc*) - # two different shell functions defined in ltmain.sh - # decide which to use based on capabilities of $DLLTOOL + # two different shell functions defined in ltmain.sh; + # decide which one to use based on capabilities of $DLLTOOL case `$DLLTOOL --help 2>&1` in *--identify-strict*) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib @@ -3545,7 +3794,7 @@ cygwin* | mingw* | pw32* | cegcc*) ;; *) # fallback: assume linklib IS sharedlib - lt_cv_sharedlib_from_linklib_cmd="$ECHO" + lt_cv_sharedlib_from_linklib_cmd=$ECHO ;; esac ]) @@ -3572,13 +3821,28 @@ AC_CACHE_CHECK([if $MANIFEST_TOOL is a manifest tool], [lt_cv_path_mainfest_tool lt_cv_path_mainfest_tool=yes fi rm -f conftest*]) -if test "x$lt_cv_path_mainfest_tool" != xyes; then +if test yes != "$lt_cv_path_mainfest_tool"; then MANIFEST_TOOL=: fi _LT_DECL([], [MANIFEST_TOOL], [1], [Manifest tool])dnl ])# _LT_PATH_MANIFEST_TOOL +# _LT_DLL_DEF_P([FILE]) +# --------------------- +# True iff FILE is a Windows DLL '.def' file. +# Keep in sync with func_dll_def_p in the libtool script +AC_DEFUN([_LT_DLL_DEF_P], +[dnl + test DEF = "`$SED -n dnl + -e '\''s/^[[ ]]*//'\'' dnl Strip leading whitespace + -e '\''/^\(;.*\)*$/d'\'' dnl Delete empty lines and comments + -e '\''s/^\(EXPORTS\|LIBRARY\)\([[ ]].*\)*$/DEF/p'\'' dnl + -e q dnl Only consider the first "real" line + $1`" dnl +])# _LT_DLL_DEF_P + + # LT_LIB_M # -------- # check for math library @@ -3590,11 +3854,11 @@ case $host in # These system don't have libm, or don't need it ;; *-ncr-sysv4.3*) - AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw") + AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM=-lmw) AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") ;; *) - AC_CHECK_LIB(m, cos, LIBM="-lm") + AC_CHECK_LIB(m, cos, LIBM=-lm) ;; esac AC_SUBST([LIBM]) @@ -3613,7 +3877,7 @@ m4_defun([_LT_COMPILER_NO_RTTI], _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= -if test "$GCC" = yes; then +if test yes = "$GCC"; then case $cc_basename in nvcc*) _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -Xcompiler -fno-builtin' ;; @@ -3665,7 +3929,7 @@ cygwin* | mingw* | pw32* | cegcc*) symcode='[[ABCDGISTW]]' ;; hpux*) - if test "$host_cpu" = ia64; then + if test ia64 = "$host_cpu"; then symcode='[[ABCDEGRST]]' fi ;; @@ -3698,14 +3962,44 @@ case `$NM -V 2>&1` in symcode='[[ABCDGIRSTW]]' ;; esac +if test "$lt_cv_nm_interface" = "MS dumpbin"; then + # Gets list of data symbols to import. + lt_cv_sys_global_symbol_to_import="sed -n -e 's/^I .* \(.*\)$/\1/p'" + # Adjust the below global symbol transforms to fixup imported variables. + lt_cdecl_hook=" -e 's/^I .* \(.*\)$/extern __declspec(dllimport) char \1;/p'" + lt_c_name_hook=" -e 's/^I .* \(.*\)$/ {\"\1\", (void *) 0},/p'" + lt_c_name_lib_hook="\ + -e 's/^I .* \(lib.*\)$/ {\"\1\", (void *) 0},/p'\ + -e 's/^I .* \(.*\)$/ {\"lib\1\", (void *) 0},/p'" +else + # Disable hooks by default. + lt_cv_sys_global_symbol_to_import= + lt_cdecl_hook= + lt_c_name_hook= + lt_c_name_lib_hook= +fi + # Transform an extracted symbol line into a proper C declaration. # Some systems (esp. on ia64) link data and code symbols differently, # so use this general approach. -lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" +lt_cv_sys_global_symbol_to_cdecl="sed -n"\ +$lt_cdecl_hook\ +" -e 's/^T .* \(.*\)$/extern int \1();/p'"\ +" -e 's/^$symcode$symcode* .* \(.*\)$/extern char \1;/p'" # Transform an extracted symbol line into symbol name and symbol address -lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p'" -lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \(lib[[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"lib\2\", (void *) \&\2},/p'" +lt_cv_sys_global_symbol_to_c_name_address="sed -n"\ +$lt_c_name_hook\ +" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ +" -e 's/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/p'" + +# Transform an extracted symbol line into symbol name with lib prefix and +# symbol address. +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n"\ +$lt_c_name_lib_hook\ +" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ +" -e 's/^$symcode$symcode* .* \(lib.*\)$/ {\"\1\", (void *) \&\1},/p'"\ +" -e 's/^$symcode$symcode* .* \(.*\)$/ {\"lib\1\", (void *) \&\1},/p'" # Handle CRLF in mingw tool chain opt_cr= @@ -3723,21 +4017,24 @@ for ac_symprfx in "" "_"; do # Write the raw and C identifiers. if test "$lt_cv_nm_interface" = "MS dumpbin"; then - # Fake it for dumpbin and say T for any non-static function - # and D for any global variable. + # Fake it for dumpbin and say T for any non-static function, + # D for any global variable and I for any imported variable. # Also find C++ and __fastcall symbols from MSVC++, # which start with @ or ?. lt_cv_sys_global_symbol_pipe="$AWK ['"\ " {last_section=section; section=\$ 3};"\ " /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ " /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ +" /^ *Symbol name *: /{split(\$ 0,sn,\":\"); si=substr(sn[2],2)};"\ +" /^ *Type *: code/{print \"T\",si,substr(si,length(prfx))};"\ +" /^ *Type *: data/{print \"I\",si,substr(si,length(prfx))};"\ " \$ 0!~/External *\|/{next};"\ " / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ " {if(hide[section]) next};"\ -" {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ -" {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ -" s[1]~/^[@?]/{print s[1], s[1]; next};"\ -" s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ +" {f=\"D\"}; \$ 0~/\(\).*\|/{f=\"T\"};"\ +" {split(\$ 0,a,/\||\r/); split(a[2],s)};"\ +" s[1]~/^[@?]/{print f,s[1],s[1]; next};"\ +" s[1]~prfx {split(s[1],t,\"@\"); print f,t[1],substr(t[1],length(prfx))}"\ " ' prfx=^$ac_symprfx]" else lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" @@ -3777,11 +4074,11 @@ _LT_EOF if $GREP ' nm_test_func$' "$nlist" >/dev/null; then cat <<_LT_EOF > conftest.$ac_ext /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ -#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) -/* DATA imports from DLLs on WIN32 con't be const, because runtime +#if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE +/* DATA imports from DLLs on WIN32 can't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT@&t@_DLSYM_CONST -#elif defined(__osf__) +#elif defined __osf__ /* This system does not cope well with relocations in const data. */ # define LT@&t@_DLSYM_CONST #else @@ -3807,7 +4104,7 @@ lt__PROGRAM__LTX_preloaded_symbols[[]] = { { "@PROGRAM@", (void *) 0 }, _LT_EOF - $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext + $SED "s/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext cat <<\_LT_EOF >> conftest.$ac_ext {0, (void *) 0} }; @@ -3827,9 +4124,9 @@ _LT_EOF mv conftest.$ac_objext conftstm.$ac_objext lt_globsym_save_LIBS=$LIBS lt_globsym_save_CFLAGS=$CFLAGS - LIBS="conftstm.$ac_objext" + LIBS=conftstm.$ac_objext CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)" - if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then + if AC_TRY_EVAL(ac_link) && test -s conftest$ac_exeext; then pipe_works=yes fi LIBS=$lt_globsym_save_LIBS @@ -3850,7 +4147,7 @@ _LT_EOF rm -rf conftest* conftst* # Do not use the global_symbol_pipe unless it works. - if test "$pipe_works" = yes; then + if test yes = "$pipe_works"; then break else lt_cv_sys_global_symbol_pipe= @@ -3877,12 +4174,16 @@ _LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1], [Take the output of nm and produce a listing of raw symbols and C names]) _LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1], [Transform the output of nm in a proper C declaration]) +_LT_DECL([global_symbol_to_import], [lt_cv_sys_global_symbol_to_import], [1], + [Transform the output of nm into a list of symbols to manually relocate]) _LT_DECL([global_symbol_to_c_name_address], [lt_cv_sys_global_symbol_to_c_name_address], [1], [Transform the output of nm in a C name address pair]) _LT_DECL([global_symbol_to_c_name_address_lib_prefix], [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1], [Transform the output of nm in a C name address pair when lib prefix is needed]) +_LT_DECL([nm_interface], [lt_cv_nm_interface], [1], + [The name lister interface]) _LT_DECL([], [nm_file_list_spec], [1], [Specify filename containing input files for $NM]) ]) # _LT_CMD_GLOBAL_SYMBOLS @@ -3898,17 +4199,18 @@ _LT_TAGVAR(lt_prog_compiler_static, $1)= m4_if([$1], [CXX], [ # C++ specific cases for pic, static, wl, etc. - if test "$GXX" = yes; then + if test yes = "$GXX"; then _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' case $host_os in aix*) # All AIX code is PIC. - if test "$host_cpu" = ia64; then + if test ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; amigaos*) @@ -3919,8 +4221,8 @@ m4_if([$1], [CXX], [ ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but - # adding the `-m68020' flag to GCC prevents building anything better, - # like `-m68040'. + # adding the '-m68020' flag to GCC prevents building anything better, + # like '-m68040'. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' ;; esac @@ -3936,6 +4238,11 @@ m4_if([$1], [CXX], [ # (--disable-auto-import) libraries m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + case $host_os in + os2*) + _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static' + ;; + esac ;; darwin* | rhapsody*) # PIC is the default on this platform @@ -3985,7 +4292,7 @@ m4_if([$1], [CXX], [ case $host_os in aix[[4-9]]*) # All AIX code is PIC. - if test "$host_cpu" = ia64; then + if test ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' else @@ -4026,14 +4333,14 @@ m4_if([$1], [CXX], [ case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' - if test "$host_cpu" != ia64; then + _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive' + if test ia64 != "$host_cpu"; then _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' fi ;; aCC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' + _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive' case $host_cpu in hppa*64*|ia64*) # +Z the default @@ -4070,7 +4377,7 @@ m4_if([$1], [CXX], [ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; ecpc* ) - # old Intel C++ for x86_64 which still supported -KPIC. + # old Intel C++ for x86_64, which still supported -KPIC. _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' @@ -4126,7 +4433,7 @@ m4_if([$1], [CXX], [ ;; esac ;; - netbsd* | netbsdelf*-gnu) + netbsd*) ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise @@ -4215,17 +4522,18 @@ m4_if([$1], [CXX], [ fi ], [ - if test "$GCC" = yes; then + if test yes = "$GCC"; then _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' case $host_os in aix*) # All AIX code is PIC. - if test "$host_cpu" = ia64; then + if test ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; amigaos*) @@ -4236,8 +4544,8 @@ m4_if([$1], [CXX], [ ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but - # adding the `-m68020' flag to GCC prevents building anything better, - # like `-m68040'. + # adding the '-m68020' flag to GCC prevents building anything better, + # like '-m68040'. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' ;; esac @@ -4254,6 +4562,11 @@ m4_if([$1], [CXX], [ # (--disable-auto-import) libraries m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + case $host_os in + os2*) + _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static' + ;; + esac ;; darwin* | rhapsody*) @@ -4324,7 +4637,7 @@ m4_if([$1], [CXX], [ case $host_os in aix*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - if test "$host_cpu" = ia64; then + if test ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' else @@ -4332,11 +4645,30 @@ m4_if([$1], [CXX], [ fi ;; + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + case $cc_basename in + nagfor*) + # NAG Fortran compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + esac + ;; + mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + case $host_os in + os2*) + _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static' + ;; + esac ;; hpux9* | hpux10* | hpux11*) @@ -4352,7 +4684,7 @@ m4_if([$1], [CXX], [ ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? - _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' + _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) @@ -4363,7 +4695,7 @@ m4_if([$1], [CXX], [ linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in - # old Intel for x86_64 which still supported -KPIC. + # old Intel for x86_64, which still supported -KPIC. ecc*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' @@ -4388,6 +4720,12 @@ m4_if([$1], [CXX], [ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; + tcc*) + # Fabrice Bellard et al's Tiny C Compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) @@ -4485,7 +4823,7 @@ m4_if([$1], [CXX], [ ;; sysv4*MP*) - if test -d /usr/nec ;then + if test -d /usr/nec; then _LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi @@ -4514,7 +4852,7 @@ m4_if([$1], [CXX], [ fi ]) case $host_os in - # For platforms which do not support PIC, -DPIC is meaningless: + # For platforms that do not support PIC, -DPIC is meaningless: *djgpp*) _LT_TAGVAR(lt_prog_compiler_pic, $1)= ;; @@ -4580,17 +4918,21 @@ m4_if([$1], [CXX], [ case $host_os in aix[[4-9]]*) # If we're using GNU nm, then we don't want the "-C" option. - # -C means demangle to AIX nm, but means don't demangle with GNU nm - # Also, AIX nm treats weak defined symbols like other global defined - # symbols, whereas GNU nm marks them as "W". + # -C means demangle to GNU nm, but means don't demangle to AIX nm. + # Without the "-l" option, or with the "-B" option, AIX nm treats + # weak defined symbols like other global defined symbols, whereas + # GNU nm marks them as "W". + # While the 'weak' keyword is ignored in the Export File, we need + # it in the Import File for the 'aix-soname' feature, so we have + # to replace the "-B" option with "-P" for AIX nm. if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then - _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' else - _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + _LT_TAGVAR(export_symbols_cmds, $1)='`func_echo_all $NM | $SED -e '\''s/B\([[^B]]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && ([substr](\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' fi ;; pw32*) - _LT_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds" + _LT_TAGVAR(export_symbols_cmds, $1)=$ltdll_cmds ;; cygwin* | mingw* | cegcc*) case $cc_basename in @@ -4603,9 +4945,6 @@ m4_if([$1], [CXX], [ ;; esac ;; - linux* | k*bsd*-gnu | gnu*) - _LT_TAGVAR(link_all_deplibs, $1)=no - ;; *) _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' ;; @@ -4639,9 +4978,9 @@ m4_if([$1], [CXX], [ # included in the symbol list _LT_TAGVAR(include_expsyms, $1)= # exclude_expsyms can be an extended regexp of symbols to exclude - # it will be wrapped by ` (' and `)$', so one must not match beginning or - # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', - # as well as any symbol that contains `d'. + # it will be wrapped by ' (' and ')$', so one must not match beginning or + # end of line. Example: 'a|bc|.*d.*' will exclude the symbols 'a' and 'bc', + # as well as any symbol that contains 'd'. _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if @@ -4657,7 +4996,7 @@ dnl Note also adjust exclude_expsyms for C++ above. # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. - if test "$GCC" != yes; then + if test yes != "$GCC"; then with_gnu_ld=no fi ;; @@ -4665,12 +5004,9 @@ dnl Note also adjust exclude_expsyms for C++ above. # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; - openbsd*) + openbsd* | bitrig*) with_gnu_ld=no ;; - linux* | k*bsd*-gnu | gnu*) - _LT_TAGVAR(link_all_deplibs, $1)=no - ;; esac _LT_TAGVAR(ld_shlibs, $1)=yes @@ -4678,7 +5014,7 @@ dnl Note also adjust exclude_expsyms for C++ above. # On some targets, GNU ld is compatible enough with the native linker # that we're better off using the native interface for both. lt_use_gnu_ld_interface=no - if test "$with_gnu_ld" = yes; then + if test yes = "$with_gnu_ld"; then case $host_os in aix*) # The AIX port of GNU ld has always aspired to compatibility @@ -4700,24 +5036,24 @@ dnl Note also adjust exclude_expsyms for C++ above. esac fi - if test "$lt_use_gnu_ld_interface" = yes; then + if test yes = "$lt_use_gnu_ld_interface"; then # If archive_cmds runs LD, not CC, wlarc should be empty - wlarc='${wl}' + wlarc='$wl' # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. runpath_var=LD_RUN_PATH - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then - _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' else _LT_TAGVAR(whole_archive_flag_spec, $1)= fi supports_anon_versioning=no - case `$LD -v 2>&1` in + case `$LD -v | $SED -e 's/([^)]\+)\s\+//' 2>&1` in *GNU\ gold*) supports_anon_versioning=yes ;; *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... @@ -4730,7 +5066,7 @@ dnl Note also adjust exclude_expsyms for C++ above. case $host_os in aix[[3-9]]*) # On AIX/PPC, the GNU linker is very broken - if test "$host_cpu" != ia64; then + if test ia64 != "$host_cpu"; then _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 @@ -4749,7 +5085,7 @@ _LT_EOF case $host_cpu in powerpc) # see comment about AmigaOS4 .so support - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='' ;; m68k) @@ -4765,7 +5101,7 @@ _LT_EOF _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME - _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi @@ -4775,7 +5111,7 @@ _LT_EOF # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, # as there is no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-all-symbols' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes @@ -4783,61 +5119,89 @@ _LT_EOF _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' - # If the export-symbols file already is a .def file (1st line - # is EXPORTS), use it as is; otherwise, prepend... - _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then - cp $export_symbols $output_objdir/$soname.def; - else - echo EXPORTS > $output_objdir/$soname.def; - cat $export_symbols >> $output_objdir/$soname.def; - fi~ - $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file, use it as + # is; otherwise, prepend EXPORTS... + _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; haiku*) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(link_all_deplibs, $1)=yes ;; + os2*) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + shrext_cmds=.dll + _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + prefix_cmds="$SED"~ + if test EXPORTS = "`$SED 1q $export_symbols`"; then + prefix_cmds="$prefix_cmds -e 1d"; + fi~ + prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ + cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + ;; + interix[[3-9]]*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) tmp_diet=no - if test "$host_os" = linux-dietlibc; then + if test linux-dietlibc = "$host_os"; then case $cc_basename in diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) esac fi if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ - && test "$tmp_diet" = no + && test no = "$tmp_diet" then tmp_addflag=' $pic_flag' tmp_sharedflag='-shared' case $cc_basename,$host_cpu in pgcc*) # Portland Group C compiler - _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' tmp_addflag=' $pic_flag' ;; pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group f77 and f90 compilers - _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; @@ -4848,42 +5212,47 @@ _LT_EOF lf95*) # Lahey Fortran 8.1 _LT_TAGVAR(whole_archive_flag_spec, $1)= tmp_sharedflag='--shared' ;; + nagfor*) # NAGFOR 5.3 + tmp_sharedflag='-Wl,-shared' ;; xl[[cC]]* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below) tmp_sharedflag='-qmkshrobj' tmp_addflag= ;; nvcc*) # Cuda Compiler Driver 2.2 - _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes ;; esac case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 - _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes tmp_sharedflag='-G' ;; *Sun\ F*) # Sun Fortran 8.3 tmp_sharedflag='-G' ;; esac - _LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' - if test "x$supports_anon_versioning" = xyes; then + if test yes = "$supports_anon_versioning"; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ - cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ - echo "local: *; };" >> $output_objdir/$libname.ver~ - $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' fi case $cc_basename in + tcc*) + _LT_TAGVAR(export_dynamic_flag_spec, $1)='-rdynamic' + ;; xlf* | bgf* | bgxlf* | mpixlf*) # IBM XL Fortran 10.1 on PPC cannot create shared libs itself _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' - if test "x$supports_anon_versioning" = xyes; then + if test yes = "$supports_anon_versioning"; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ - cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ - echo "local: *; };" >> $output_objdir/$libname.ver~ - $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' fi ;; esac @@ -4892,13 +5261,13 @@ _LT_EOF fi ;; - netbsd* | netbsdelf*-gnu) + netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' fi ;; @@ -4916,8 +5285,8 @@ _LT_EOF _LT_EOF elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi @@ -4929,7 +5298,7 @@ _LT_EOF _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 -*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not +*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 cannot *** reliably create shared libraries on SCO systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.16.91.0.3 or newer. Another option is to modify @@ -4944,9 +5313,9 @@ _LT_EOF # DT_RUNPATH tag from executables and libraries. But doing so # requires that you compile everything twice, which is a pain. if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi @@ -4963,15 +5332,15 @@ _LT_EOF *) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac - if test "$_LT_TAGVAR(ld_shlibs, $1)" = no; then + if test no = "$_LT_TAGVAR(ld_shlibs, $1)"; then runpath_var= _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= @@ -4987,7 +5356,7 @@ _LT_EOF # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. _LT_TAGVAR(hardcode_minus_L, $1)=yes - if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then + if test yes = "$GCC" && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. _LT_TAGVAR(hardcode_direct, $1)=unsupported @@ -4995,34 +5364,57 @@ _LT_EOF ;; aix[[4-9]]*) - if test "$host_cpu" = ia64; then + if test ia64 = "$host_cpu"; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' - no_entry_flag="" + no_entry_flag= else # If we're using GNU nm, then we don't want the "-C" option. - # -C means demangle to AIX nm, but means don't demangle with GNU nm - # Also, AIX nm treats weak defined symbols like other global - # defined symbols, whereas GNU nm marks them as "W". + # -C means demangle to GNU nm, but means don't demangle to AIX nm. + # Without the "-l" option, or with the "-B" option, AIX nm treats + # weak defined symbols like other global defined symbols, whereas + # GNU nm marks them as "W". + # While the 'weak' keyword is ignored in the Export File, we need + # it in the Import File for the 'aix-soname' feature, so we have + # to replace the "-B" option with "-P" for AIX nm. if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then - _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' else - _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + _LT_TAGVAR(export_symbols_cmds, $1)='`func_echo_all $NM | $SED -e '\''s/B\([[^B]]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && ([substr](\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we - # need to do runtime linking. + # have runtime linking enabled, and use it for executables. + # For shared libraries, we enable/disable runtime linking + # depending on the kind of the shared library created - + # when "with_aix_soname,aix_use_runtimelinking" is: + # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables + # "aix,yes" lib.so shared, rtl:yes, for executables + # lib.a static archive + # "both,no" lib.so.V(shr.o) shared, rtl:yes + # lib.a(lib.so.V) shared, rtl:no, for executables + # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a(lib.so.V) shared, rtl:no + # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a static archive case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) for ld_flag in $LDFLAGS; do - if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then + if (test x-brtl = "x$ld_flag" || test x-Wl,-brtl = "x$ld_flag"); then aix_use_runtimelinking=yes break fi done + if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then + # With aix-soname=svr4, we create the lib.so.V shared archives only, + # so we don't have lib.a shared libs to link our executables. + # We have to force runtime linking in this case. + aix_use_runtimelinking=yes + LDFLAGS="$LDFLAGS -Wl,-brtl" + fi ;; esac @@ -5041,13 +5433,21 @@ _LT_EOF _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes - _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' + _LT_TAGVAR(file_list_spec, $1)='$wl-f,' + case $with_aix_soname,$aix_use_runtimelinking in + aix,*) ;; # traditional, no import file + svr4,* | *,yes) # use import file + # The Import File defines what to hardcode. + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=no + ;; + esac - if test "$GCC" = yes; then + if test yes = "$GCC"; then case $host_os in aix4.[[012]]|aix4.[[012]].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ - collect2name=`${CC} -print-prog-name=collect2` + collect2name=`$CC -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then @@ -5066,62 +5466,80 @@ _LT_EOF ;; esac shared_flag='-shared' - if test "$aix_use_runtimelinking" = yes; then - shared_flag="$shared_flag "'${wl}-G' + if test yes = "$aix_use_runtimelinking"; then + shared_flag="$shared_flag "'$wl-G' fi - _LT_TAGVAR(link_all_deplibs, $1)=no + # Need to ensure runtime linking is disabled for the traditional + # shared library, or the linker may eventually find shared libraries + # /with/ Import File - we do not want to mix them. + shared_flag_aix='-shared' + shared_flag_svr4='-shared $wl-G' else # not using gcc - if test "$host_cpu" = ia64; then + if test ia64 = "$host_cpu"; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else - if test "$aix_use_runtimelinking" = yes; then - shared_flag='${wl}-G' + if test yes = "$aix_use_runtimelinking"; then + shared_flag='$wl-G' else - shared_flag='${wl}-bM:SRE' + shared_flag='$wl-bM:SRE' fi + shared_flag_aix='$wl-bM:SRE' + shared_flag_svr4='$wl-G' fi fi - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. _LT_TAGVAR(always_export_symbols, $1)=yes - if test "$aix_use_runtimelinking" = yes; then + if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. _LT_TAGVAR(allow_undefined_flag, $1)='-berok' # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath" + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag else - if test "$host_cpu" = ia64; then - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' + if test ia64 = "$host_cpu"; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $libdir:/usr/lib:/lib' _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" - _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" + _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. - _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' - _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' - if test "$with_gnu_ld" = yes; then + _LT_TAGVAR(no_undefined_flag, $1)=' $wl-bernotok' + _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-berok' + if test yes = "$with_gnu_ld"; then # We only use this code for GNU lds that support --whole-archive. - _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' fi _LT_TAGVAR(archive_cmds_need_lc, $1)=yes - # This is similar to how AIX traditionally builds its shared libraries. - _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + _LT_TAGVAR(archive_expsym_cmds, $1)='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' + # -brtl affects multiple linker settings, -berok does not and is overridden later + compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([[, ]]\\)%-berok\\1%g"`' + if test svr4 != "$with_aix_soname"; then + # This is similar to how AIX traditionally builds its shared libraries. + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' + fi + if test aix != "$with_aix_soname"; then + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' + else + # used by -dlpreopen to get the symbols + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$MV $output_objdir/$realname.d/$soname $output_objdir' + fi + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$RM -r $output_objdir/$realname.d' fi fi ;; @@ -5130,7 +5548,7 @@ _LT_EOF case $host_cpu in powerpc) # see comment about AmigaOS4 .so support - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='' ;; m68k) @@ -5160,16 +5578,17 @@ _LT_EOF # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. - shrext_cmds=".dll" + shrext_cmds=.dll # FIXME: Setting linknames here is a bad hack. - _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' - _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then - sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; - else - sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; - fi~ - $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ - linknames=' + _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' + _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then + cp "$export_symbols" "$output_objdir/$soname.def"; + echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; + else + $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; + fi~ + $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ + linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes @@ -5178,18 +5597,18 @@ _LT_EOF # Don't use ranlib _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ - lt_tool_outputfile="@TOOL_OUTPUT@"~ - case $lt_outputfile in - *.exe|*.EXE) ;; - *) - lt_outputfile="$lt_outputfile.exe" - lt_tool_outputfile="$lt_tool_outputfile.exe" - ;; - esac~ - if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then - $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; - $RM "$lt_outputfile.manifest"; - fi' + lt_tool_outputfile="@TOOL_OUTPUT@"~ + case $lt_outputfile in + *.exe|*.EXE) ;; + *) + lt_outputfile=$lt_outputfile.exe + lt_tool_outputfile=$lt_tool_outputfile.exe + ;; + esac~ + if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then + $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; + $RM "$lt_outputfile.manifest"; + fi' ;; *) # Assume MSVC wrapper @@ -5198,7 +5617,7 @@ _LT_EOF # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. - shrext_cmds=".dll" + shrext_cmds=.dll # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. @@ -5248,33 +5667,33 @@ _LT_EOF ;; hpux9*) - if test "$GCC" = yes; then - _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + if test yes = "$GCC"; then + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' else - _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' fi - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_direct, $1)=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' ;; hpux10*) - if test "$GCC" = yes && test "$with_gnu_ld" = no; then - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + if test yes,no = "$GCC,$with_gnu_ld"; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi - if test "$with_gnu_ld" = no; then - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + if test no = "$with_gnu_ld"; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes @@ -5282,25 +5701,25 @@ _LT_EOF ;; hpux11*) - if test "$GCC" = yes && test "$with_gnu_ld" = no; then + if test yes,no = "$GCC,$with_gnu_ld"; then case $host_cpu in hppa*64*) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case $host_cpu in hppa*64*) - _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) - _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) m4_if($1, [], [ @@ -5308,14 +5727,14 @@ _LT_EOF # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) _LT_LINKER_OPTION([if $CC understands -b], _LT_TAGVAR(lt_cv_prog_compiler__b, $1), [-b], - [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'], + [_LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'], [_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'])], - [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags']) + [_LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags']) ;; esac fi - if test "$with_gnu_ld" = no; then - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + if test no = "$with_gnu_ld"; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: case $host_cpu in @@ -5326,7 +5745,7 @@ _LT_EOF *) _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. @@ -5337,16 +5756,16 @@ _LT_EOF ;; irix5* | irix6* | nonstopux*) - if test "$GCC" = yes; then - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + if test yes = "$GCC"; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' # Try to use the -exported_symbol ld option, if it does not # work, assume that -exports_file does not work either and # implicitly export all symbols. # This should be the same for all languages, so no per-tag cache variable. AC_CACHE_CHECK([whether the $host_os linker accepts -exported_symbol], [lt_cv_irix_exported_symbol], - [save_LDFLAGS="$LDFLAGS" - LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" + [save_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS -shared $wl-exported_symbol ${wl}foo $wl-update_registry $wl/dev/null" AC_LINK_IFELSE( [AC_LANG_SOURCE( [AC_LANG_CASE([C], [[int foo (void) { return 0; }]], @@ -5359,22 +5778,32 @@ _LT_EOF end]])])], [lt_cv_irix_exported_symbol=yes], [lt_cv_irix_exported_symbol=no]) - LDFLAGS="$save_LDFLAGS"]) - if test "$lt_cv_irix_exported_symbol" = yes; then - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' + LDFLAGS=$save_LDFLAGS]) + if test yes = "$lt_cv_irix_exported_symbol"; then + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations $wl-exports_file $wl$export_symbols -o $lib' fi else - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -exports_file $export_symbols -o $lib' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(inherit_rpath, $1)=yes _LT_TAGVAR(link_all_deplibs, $1)=yes ;; - netbsd* | netbsdelf*-gnu) + linux*) + case $cc_basename in + tcc*) + # Fabrice Bellard et al's Tiny C Compiler + _LT_TAGVAR(ld_shlibs, $1)=yes + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else @@ -5388,7 +5817,7 @@ _LT_EOF newsos6) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; @@ -5396,27 +5825,19 @@ _LT_EOF *nto* | *qnx*) ;; - openbsd*) + openbsd* | bitrig*) if test -f /usr/libexec/ld.so; then _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=yes - if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags $wl-retain-symbols-file,$export_symbols' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' else - case $host_os in - openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*) - _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' - ;; - *) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' - ;; - esac + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' fi else _LT_TAGVAR(ld_shlibs, $1)=no @@ -5427,33 +5848,53 @@ _LT_EOF _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)=unsupported - _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' - _LT_TAGVAR(old_archive_from_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' + shrext_cmds=.dll + _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + prefix_cmds="$SED"~ + if test EXPORTS = "`$SED 1q $export_symbols`"; then + prefix_cmds="$prefix_cmds -e 1d"; + fi~ + prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ + cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes ;; osf3*) - if test "$GCC" = yes; then - _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' - _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + if test yes = "$GCC"; then + _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' else _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' - _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag - if test "$GCC" = yes; then - _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' - _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + if test yes = "$GCC"; then + _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $pic_flag $libobjs $deplibs $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' else _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' - _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ - $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' + $CC -shared$allow_undefined_flag $wl-input $wl$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~$RM $lib.exp' # Both c and cxx compiler support -rpath directly _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' @@ -5464,24 +5905,24 @@ _LT_EOF solaris*) _LT_TAGVAR(no_undefined_flag, $1)=' -z defs' - if test "$GCC" = yes; then - wlarc='${wl}' - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + if test yes = "$GCC"; then + wlarc='$wl' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl-z ${wl}text $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + $CC -shared $pic_flag $wl-z ${wl}text $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' else case `$CC -V 2>&1` in *"Compilers 5.0"*) wlarc='' - _LT_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(archive_cmds, $1)='$LD -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' + $LD -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' ;; *) - wlarc='${wl}' - _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' + wlarc='$wl' + _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + $CC -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' ;; esac fi @@ -5491,11 +5932,11 @@ _LT_EOF solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) # The compiler driver will combine and reorder linker options, - # but understands `-z linker_flag'. GCC discards it without `$wl', + # but understands '-z linker_flag'. GCC discards it without '$wl', # but is careful enough not to reorder. # Supported since Solaris 2.6 (maybe 2.5.1?) - if test "$GCC" = yes; then - _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' + if test yes = "$GCC"; then + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' else _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' fi @@ -5505,10 +5946,10 @@ _LT_EOF ;; sunos4*) - if test "x$host_vendor" = xsequent; then + if test sequent = "$host_vendor"; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. - _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h $soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi @@ -5557,43 +5998,43 @@ _LT_EOF ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) - _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' + _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var='LD_RUN_PATH' - if test "$GCC" = yes; then - _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + if test yes = "$GCC"; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else - _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; sysv5* | sco3.2v5* | sco5v6*) - # Note: We can NOT use -z defs as we might desire, because we do not + # Note: We CANNOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. - _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' - _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' + _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' + _LT_TAGVAR(allow_undefined_flag, $1)='$wl-z,nodefs' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Bexport' runpath_var='LD_RUN_PATH' - if test "$GCC" = yes; then - _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + if test yes = "$GCC"; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else - _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; @@ -5608,17 +6049,17 @@ _LT_EOF ;; esac - if test x$host_vendor = xsni; then + if test sni = "$host_vendor"; then case $host in sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Blargedynsym' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Blargedynsym' ;; esac fi fi ]) AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) -test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no +test no = "$_LT_TAGVAR(ld_shlibs, $1)" && can_build_shared=no _LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld @@ -5635,7 +6076,7 @@ x|xyes) # Assume -lc should be added _LT_TAGVAR(archive_cmds_need_lc, $1)=yes - if test "$enable_shared" = yes && test "$GCC" = yes; then + if test yes,yes = "$GCC,$enable_shared"; then case $_LT_TAGVAR(archive_cmds, $1) in *'~'*) # FIXME: we may have to deal with multi-command sequences. @@ -5715,12 +6156,12 @@ _LT_TAGDECL([], [hardcode_libdir_flag_spec], [1], _LT_TAGDECL([], [hardcode_libdir_separator], [1], [Whether we need a single "-rpath" flag with a separated argument]) _LT_TAGDECL([], [hardcode_direct], [0], - [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes + [Set to "yes" if using DIR/libNAME$shared_ext during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_direct_absolute], [0], - [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes + [Set to "yes" if using DIR/libNAME$shared_ext during linking hardcodes DIR into the resulting binary and the resulting library dependency is - "absolute", i.e impossible to change by setting ${shlibpath_var} if the + "absolute", i.e impossible to change by setting $shlibpath_var if the library is relocated]) _LT_TAGDECL([], [hardcode_minus_L], [0], [Set to "yes" if using the -LDIR flag during linking hardcodes DIR @@ -5761,10 +6202,10 @@ dnl [Compiler flag to generate thread safe objects]) # ------------------------ # Ensure that the configuration variables for a C compiler are suitably # defined. These variables are subsequently used by _LT_CONFIG to write -# the compiler configuration to `libtool'. +# the compiler configuration to 'libtool'. m4_defun([_LT_LANG_C_CONFIG], [m4_require([_LT_DECL_EGREP])dnl -lt_save_CC="$CC" +lt_save_CC=$CC AC_LANG_PUSH(C) # Source file extension for C test sources. @@ -5800,18 +6241,18 @@ if test -n "$compiler"; then LT_SYS_DLOPEN_SELF _LT_CMD_STRIPLIB - # Report which library types will actually be built + # Report what library types will actually be built AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) - test "$can_build_shared" = "no" && enable_shared=no + test no = "$can_build_shared" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) - test "$enable_shared" = yes && enable_static=no + test yes = "$enable_shared" && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' @@ -5819,8 +6260,12 @@ if test -n "$compiler"; then ;; aix[[4-9]]*) - if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then - test "$enable_shared" = yes && enable_static=no + if test ia64 != "$host_cpu"; then + case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in + yes,aix,yes) ;; # shared object as lib.so file only + yes,svr4,*) ;; # shared object as lib.so archive member only + yes,*) enable_static=no ;; # shared object in lib.a archive as well + esac fi ;; esac @@ -5828,13 +6273,13 @@ if test -n "$compiler"; then AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. - test "$enable_shared" = yes || enable_static=yes + test yes = "$enable_shared" || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_CONFIG($1) fi AC_LANG_POP -CC="$lt_save_CC" +CC=$lt_save_CC ])# _LT_LANG_C_CONFIG @@ -5842,14 +6287,14 @@ CC="$lt_save_CC" # -------------------------- # Ensure that the configuration variables for a C++ compiler are suitably # defined. These variables are subsequently used by _LT_CONFIG to write -# the compiler configuration to `libtool'. +# the compiler configuration to 'libtool'. m4_defun([_LT_LANG_CXX_CONFIG], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_PATH_MANIFEST_TOOL])dnl -if test -n "$CXX" && ( test "X$CXX" != "Xno" && - ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || - (test "X$CXX" != "Xg++"))) ; then +if test -n "$CXX" && ( test no != "$CXX" && + ( (test g++ = "$CXX" && `g++ -v >/dev/null 2>&1` ) || + (test g++ != "$CXX"))); then AC_PROG_CXXCPP else _lt_caught_CXX_error=yes @@ -5891,7 +6336,7 @@ _LT_TAGVAR(objext, $1)=$objext # the CXX compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. -if test "$_lt_caught_CXX_error" != yes; then +if test yes != "$_lt_caught_CXX_error"; then # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" @@ -5933,35 +6378,35 @@ if test "$_lt_caught_CXX_error" != yes; then if test -n "$compiler"; then # We don't want -fno-exception when compiling C++ code, so set the # no_builtin_flag separately - if test "$GXX" = yes; then + if test yes = "$GXX"; then _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' else _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= fi - if test "$GXX" = yes; then + if test yes = "$GXX"; then # Set up default GNU C++ configuration LT_PATH_LD # Check if GNU C++ uses GNU ld as the underlying linker, since the # archiving commands below assume that GNU ld is being used. - if test "$with_gnu_ld" = yes; then - _LT_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + if test yes = "$with_gnu_ld"; then + _LT_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' # If archive_cmds runs LD, not CC, wlarc should be empty # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to # investigate it a little bit more. (MM) - wlarc='${wl}' + wlarc='$wl' # ancient GNU ld didn't support --whole-archive et. al. if eval "`$CC -print-prog-name=ld` --help 2>&1" | $GREP 'no-whole-archive' > /dev/null; then - _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' else _LT_TAGVAR(whole_archive_flag_spec, $1)= fi @@ -5997,18 +6442,30 @@ if test "$_lt_caught_CXX_error" != yes; then _LT_TAGVAR(ld_shlibs, $1)=no ;; aix[[4-9]]*) - if test "$host_cpu" = ia64; then + if test ia64 = "$host_cpu"; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' - no_entry_flag="" + no_entry_flag= else aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we - # need to do runtime linking. + # have runtime linking enabled, and use it for executables. + # For shared libraries, we enable/disable runtime linking + # depending on the kind of the shared library created - + # when "with_aix_soname,aix_use_runtimelinking" is: + # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables + # "aix,yes" lib.so shared, rtl:yes, for executables + # lib.a static archive + # "both,no" lib.so.V(shr.o) shared, rtl:yes + # lib.a(lib.so.V) shared, rtl:no, for executables + # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a(lib.so.V) shared, rtl:no + # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a static archive case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) for ld_flag in $LDFLAGS; do case $ld_flag in @@ -6018,6 +6475,13 @@ if test "$_lt_caught_CXX_error" != yes; then ;; esac done + if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then + # With aix-soname=svr4, we create the lib.so.V shared archives only, + # so we don't have lib.a shared libs to link our executables. + # We have to force runtime linking in this case. + aix_use_runtimelinking=yes + LDFLAGS="$LDFLAGS -Wl,-brtl" + fi ;; esac @@ -6036,13 +6500,21 @@ if test "$_lt_caught_CXX_error" != yes; then _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes - _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' + _LT_TAGVAR(file_list_spec, $1)='$wl-f,' + case $with_aix_soname,$aix_use_runtimelinking in + aix,*) ;; # no import file + svr4,* | *,yes) # use import file + # The Import File defines what to hardcode. + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=no + ;; + esac - if test "$GXX" = yes; then + if test yes = "$GXX"; then case $host_os in aix4.[[012]]|aix4.[[012]].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ - collect2name=`${CC} -print-prog-name=collect2` + collect2name=`$CC -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then @@ -6060,64 +6532,84 @@ if test "$_lt_caught_CXX_error" != yes; then fi esac shared_flag='-shared' - if test "$aix_use_runtimelinking" = yes; then - shared_flag="$shared_flag "'${wl}-G' + if test yes = "$aix_use_runtimelinking"; then + shared_flag=$shared_flag' $wl-G' fi + # Need to ensure runtime linking is disabled for the traditional + # shared library, or the linker may eventually find shared libraries + # /with/ Import File - we do not want to mix them. + shared_flag_aix='-shared' + shared_flag_svr4='-shared $wl-G' else # not using gcc - if test "$host_cpu" = ia64; then + if test ia64 = "$host_cpu"; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else - if test "$aix_use_runtimelinking" = yes; then - shared_flag='${wl}-G' + if test yes = "$aix_use_runtimelinking"; then + shared_flag='$wl-G' else - shared_flag='${wl}-bM:SRE' + shared_flag='$wl-bM:SRE' fi + shared_flag_aix='$wl-bM:SRE' + shared_flag_svr4='$wl-G' fi fi - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to # export. _LT_TAGVAR(always_export_symbols, $1)=yes - if test "$aix_use_runtimelinking" = yes; then + if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. - _LT_TAGVAR(allow_undefined_flag, $1)='-berok' + # The "-G" linker flag allows undefined symbols. + _LT_TAGVAR(no_undefined_flag, $1)='-bernotok' # Determine the default libpath from the value encoded in an empty # executable. _LT_SYS_MODULE_PATH_AIX([$1]) - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath" - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag else - if test "$host_cpu" = ia64; then - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' + if test ia64 = "$host_cpu"; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $libdir:/usr/lib:/lib' _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" - _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" + _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. - _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' - _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' - if test "$with_gnu_ld" = yes; then + _LT_TAGVAR(no_undefined_flag, $1)=' $wl-bernotok' + _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-berok' + if test yes = "$with_gnu_ld"; then # We only use this code for GNU lds that support --whole-archive. - _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' fi _LT_TAGVAR(archive_cmds_need_lc, $1)=yes - # This is similar to how AIX traditionally builds its shared - # libraries. - _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + _LT_TAGVAR(archive_expsym_cmds, $1)='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' + # -brtl affects multiple linker settings, -berok does not and is overridden later + compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([[, ]]\\)%-berok\\1%g"`' + if test svr4 != "$with_aix_soname"; then + # This is similar to how AIX traditionally builds its shared + # libraries. Need -bnortl late, we may have -brtl in LDFLAGS. + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' + fi + if test aix != "$with_aix_soname"; then + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' + else + # used by -dlpreopen to get the symbols + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$MV $output_objdir/$realname.d/$soname $output_objdir' + fi + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$RM -r $output_objdir/$realname.d' fi fi ;; @@ -6127,7 +6619,7 @@ if test "$_lt_caught_CXX_error" != yes; then _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME - _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi @@ -6155,57 +6647,58 @@ if test "$_lt_caught_CXX_error" != yes; then # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. - shrext_cmds=".dll" + shrext_cmds=.dll # FIXME: Setting linknames here is a bad hack. - _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' - _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then - $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; - else - $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; - fi~ - $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ - linknames=' + _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' + _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then + cp "$export_symbols" "$output_objdir/$soname.def"; + echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; + else + $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; + fi~ + $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ + linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes # Don't use ranlib _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ - lt_tool_outputfile="@TOOL_OUTPUT@"~ - case $lt_outputfile in - *.exe|*.EXE) ;; - *) - lt_outputfile="$lt_outputfile.exe" - lt_tool_outputfile="$lt_tool_outputfile.exe" - ;; - esac~ - func_to_tool_file "$lt_outputfile"~ - if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then - $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; - $RM "$lt_outputfile.manifest"; - fi' + lt_tool_outputfile="@TOOL_OUTPUT@"~ + case $lt_outputfile in + *.exe|*.EXE) ;; + *) + lt_outputfile=$lt_outputfile.exe + lt_tool_outputfile=$lt_tool_outputfile.exe + ;; + esac~ + func_to_tool_file "$lt_outputfile"~ + if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then + $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; + $RM "$lt_outputfile.manifest"; + fi' ;; *) # g++ # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, # as there is no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-all-symbols' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then - _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' - # If the export-symbols file already is a .def file (1st line - # is EXPORTS), use it as is; otherwise, prepend... - _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then - cp $export_symbols $output_objdir/$soname.def; - else - echo EXPORTS > $output_objdir/$soname.def; - cat $export_symbols >> $output_objdir/$soname.def; - fi~ - $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file, use it as + # is; otherwise, prepend EXPORTS... + _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi @@ -6216,6 +6709,34 @@ if test "$_lt_caught_CXX_error" != yes; then _LT_DARWIN_LINKER_FEATURES($1) ;; + os2*) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + shrext_cmds=.dll + _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + prefix_cmds="$SED"~ + if test EXPORTS = "`$SED 1q $export_symbols`"; then + prefix_cmds="$prefix_cmds -e 1d"; + fi~ + prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ + cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + ;; + dgux*) case $cc_basename in ec++*) @@ -6251,14 +6772,14 @@ if test "$_lt_caught_CXX_error" != yes; then ;; haiku*) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(link_all_deplibs, $1)=yes ;; hpux9*) - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, # but as the default @@ -6270,7 +6791,7 @@ if test "$_lt_caught_CXX_error" != yes; then _LT_TAGVAR(ld_shlibs, $1)=no ;; aCC*) - _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. @@ -6279,11 +6800,11 @@ if test "$_lt_caught_CXX_error" != yes; then # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. - output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) - if test "$GXX" = yes; then - _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + if test yes = "$GXX"; then + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no @@ -6293,15 +6814,15 @@ if test "$_lt_caught_CXX_error" != yes; then ;; hpux10*|hpux11*) - if test $with_gnu_ld = no; then - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + if test no = "$with_gnu_ld"; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: case $host_cpu in hppa*64*|ia64*) ;; *) - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' ;; esac fi @@ -6327,13 +6848,13 @@ if test "$_lt_caught_CXX_error" != yes; then aCC*) case $host_cpu in hppa*64*) - _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) - _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) - _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac # Commands to make compiler produce verbose output that lists @@ -6344,20 +6865,20 @@ if test "$_lt_caught_CXX_error" != yes; then # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. - output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) - if test "$GXX" = yes; then - if test $with_gnu_ld = no; then + if test yes = "$GXX"; then + if test no = "$with_gnu_ld"; then case $host_cpu in hppa*64*) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac fi @@ -6372,22 +6893,22 @@ if test "$_lt_caught_CXX_error" != yes; then interix[[3-9]]*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; irix5* | irix6*) case $cc_basename in CC*) # SGI C++ - _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' # Archives containing C++ object files must be created using # "CC -ar", where "CC" is the IRIX C++ compiler. This is @@ -6396,17 +6917,17 @@ if test "$_lt_caught_CXX_error" != yes; then _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs' ;; *) - if test "$GXX" = yes; then - if test "$with_gnu_ld" = no; then - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + if test yes = "$GXX"; then + if test no = "$with_gnu_ld"; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' else - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` -o $lib' fi fi _LT_TAGVAR(link_all_deplibs, $1)=yes ;; esac - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(inherit_rpath, $1)=yes ;; @@ -6419,8 +6940,8 @@ if test "$_lt_caught_CXX_error" != yes; then # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. - _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' + _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib $wl-retain-symbols-file,$export_symbols; mv \$templib $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. @@ -6429,10 +6950,10 @@ if test "$_lt_caught_CXX_error" != yes; then # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. - output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' # Archives containing C++ object files must be created using # "CC -Bstatic", where "CC" is the KAI C++ compiler. @@ -6446,59 +6967,59 @@ if test "$_lt_caught_CXX_error" != yes; then # earlier do not add the objects themselves. case `$CC -V 2>&1` in *"Version 7."*) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' ;; *) # Version 8.0 or newer tmp_idyn= case $host_cpu in ia64*) tmp_idyn=' -i_dynamic';; esac - _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' ;; esac _LT_TAGVAR(archive_cmds_need_lc, $1)=no - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' - _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive' ;; pgCC* | pgcpp*) # Portland Group C++ compiler case `$CC -V` in *pgCC\ [[1-5]].* | *pgcpp\ [[1-5]].*) _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~ - rm -rf $tpldir~ - $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ - compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ + compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~ - rm -rf $tpldir~ - $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ - $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ - $RANLIB $oldlib' + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ + $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ + $RANLIB $oldlib' _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~ - rm -rf $tpldir~ - $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ - $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ + $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~ - rm -rf $tpldir~ - $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ - $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ + $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' ;; *) # Version 6 and above use weak symbols - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' ;; esac - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' - _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl--rpath $wl$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' ;; cxx*) # Compaq C++ - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib $wl-retain-symbols-file $wl$export_symbols' runpath_var=LD_RUN_PATH _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' @@ -6512,18 +7033,18 @@ if test "$_lt_caught_CXX_error" != yes; then # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. - output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' ;; xl* | mpixl* | bgxl*) # IBM XL 8.0 on PPC, with GNU ld - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' - _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - if test "x$supports_anon_versioning" = xyes; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' + _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + if test yes = "$supports_anon_versioning"; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ - cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ - echo "local: *; };" >> $output_objdir/$libname.ver~ - $CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' fi ;; *) @@ -6531,10 +7052,10 @@ if test "$_lt_caught_CXX_error" != yes; then *Sun\ C*) # Sun C++ 5.9 _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' - _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols' + _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file $wl$export_symbols' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' - _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes # Not sure whether something based on @@ -6592,22 +7113,17 @@ if test "$_lt_caught_CXX_error" != yes; then _LT_TAGVAR(ld_shlibs, $1)=yes ;; - openbsd2*) - # C++ shared libraries are fairly broken - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - - openbsd*) + openbsd* | bitrig*) if test -f /usr/libexec/ld.so; then _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' - if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' - _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`"; then + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file,$export_symbols -o $lib' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' fi output_verbose_link_cmd=func_echo_all else @@ -6623,9 +7139,9 @@ if test "$_lt_caught_CXX_error" != yes; then # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. - _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Archives containing C++ object files must be created using @@ -6643,17 +7159,17 @@ if test "$_lt_caught_CXX_error" != yes; then cxx*) case $host in osf3*) - _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' - _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $soname `test -n "$verstring" && func_echo_all "$wl-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' ;; *) _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' - _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ - echo "-hidden">> $lib.exp~ - $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~ - $RM $lib.exp' + echo "-hidden">> $lib.exp~ + $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname $wl-input $wl$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~ + $RM $lib.exp' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' ;; esac @@ -6668,21 +7184,21 @@ if test "$_lt_caught_CXX_error" != yes; then # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. - output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) - if test "$GXX" = yes && test "$with_gnu_ld" = no; then - _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + if test yes,no = "$GXX,$with_gnu_ld"; then + _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' case $host in osf3*) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' ;; *) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' ;; esac - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists @@ -6728,9 +7244,9 @@ if test "$_lt_caught_CXX_error" != yes; then # Sun C++ 4.2, 5.x and Centerline C++ _LT_TAGVAR(archive_cmds_need_lc,$1)=yes _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' - _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + $CC -G$allow_undefined_flag $wl-M $wl$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no @@ -6738,7 +7254,7 @@ if test "$_lt_caught_CXX_error" != yes; then solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) # The compiler driver will combine and reorder linker options, - # but understands `-z linker_flag'. + # but understands '-z linker_flag'. # Supported since Solaris 2.6 (maybe 2.5.1?) _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' ;; @@ -6755,30 +7271,30 @@ if test "$_lt_caught_CXX_error" != yes; then ;; gcx*) # Green Hills C++ Compiler - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' # The C++ compiler must be used to create the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs' ;; *) # GNU C++ compiler with Solaris linker - if test "$GXX" = yes && test "$with_gnu_ld" = no; then - _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs' + if test yes,no = "$GXX,$with_gnu_ld"; then + _LT_TAGVAR(no_undefined_flag, $1)=' $wl-z ${wl}defs' if $CC --version | $GREP -v '^2\.7' > /dev/null; then - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + $CC -shared $pic_flag -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else - # g++ 2.7 appears to require `-G' NOT `-shared' on this + # g++ 2.7 appears to require '-G' NOT '-shared' on this # platform. - _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + $CC -G -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when @@ -6786,11 +7302,11 @@ if test "$_lt_caught_CXX_error" != yes; then output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' fi - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $wl$libdir' case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) - _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' ;; esac fi @@ -6799,52 +7315,52 @@ if test "$_lt_caught_CXX_error" != yes; then ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) - _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' + _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var='LD_RUN_PATH' case $cc_basename in CC*) - _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; *) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; sysv5* | sco3.2v5* | sco5v6*) - # Note: We can NOT use -z defs as we might desire, because we do not + # Note: We CANNOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. - _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' - _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' + _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' + _LT_TAGVAR(allow_undefined_flag, $1)='$wl-z,nodefs' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Bexport' runpath_var='LD_RUN_PATH' case $cc_basename in CC*) - _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(old_archive_cmds, $1)='$CC -Tprelink_objects $oldobjs~ - '"$_LT_TAGVAR(old_archive_cmds, $1)" + '"$_LT_TAGVAR(old_archive_cmds, $1)" _LT_TAGVAR(reload_cmds, $1)='$CC -Tprelink_objects $reload_objs~ - '"$_LT_TAGVAR(reload_cmds, $1)" + '"$_LT_TAGVAR(reload_cmds, $1)" ;; *) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; @@ -6875,10 +7391,10 @@ if test "$_lt_caught_CXX_error" != yes; then esac AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) - test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no + test no = "$_LT_TAGVAR(ld_shlibs, $1)" && can_build_shared=no - _LT_TAGVAR(GCC, $1)="$GXX" - _LT_TAGVAR(LD, $1)="$LD" + _LT_TAGVAR(GCC, $1)=$GXX + _LT_TAGVAR(LD, $1)=$LD ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change @@ -6905,7 +7421,7 @@ if test "$_lt_caught_CXX_error" != yes; then lt_cv_path_LD=$lt_save_path_LD lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld -fi # test "$_lt_caught_CXX_error" != yes +fi # test yes != "$_lt_caught_CXX_error" AC_LANG_POP ])# _LT_LANG_CXX_CONFIG @@ -6927,13 +7443,14 @@ AC_REQUIRE([_LT_DECL_SED]) AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH]) func_stripname_cnf () { - case ${2} in - .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; - *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; + case @S|@2 in + .*) func_stripname_result=`$ECHO "@S|@3" | $SED "s%^@S|@1%%; s%\\\\@S|@2\$%%"`;; + *) func_stripname_result=`$ECHO "@S|@3" | $SED "s%^@S|@1%%; s%@S|@2\$%%"`;; esac } # func_stripname_cnf ])# _LT_FUNC_STRIPNAME_CNF + # _LT_SYS_HIDDEN_LIBDEPS([TAGNAME]) # --------------------------------- # Figure out "hidden" library dependencies from verbose @@ -7017,13 +7534,13 @@ if AC_TRY_EVAL(ac_compile); then pre_test_object_deps_done=no for p in `eval "$output_verbose_link_cmd"`; do - case ${prev}${p} in + case $prev$p in -L* | -R* | -l*) # Some compilers place space between "-{L,R}" and the path. # Remove the space. - if test $p = "-L" || - test $p = "-R"; then + if test x-L = "$p" || + test x-R = "$p"; then prev=$p continue fi @@ -7039,16 +7556,16 @@ if AC_TRY_EVAL(ac_compile); then case $p in =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; esac - if test "$pre_test_object_deps_done" = no; then - case ${prev} in + if test no = "$pre_test_object_deps_done"; then + case $prev in -L | -R) # Internal compiler library paths should come after those # provided the user. The postdeps already come after the # user supplied libs so there is no need to process them. if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then - _LT_TAGVAR(compiler_lib_search_path, $1)="${prev}${p}" + _LT_TAGVAR(compiler_lib_search_path, $1)=$prev$p else - _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} ${prev}${p}" + _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} $prev$p" fi ;; # The "-l" case would never come before the object being @@ -7056,9 +7573,9 @@ if AC_TRY_EVAL(ac_compile); then esac else if test -z "$_LT_TAGVAR(postdeps, $1)"; then - _LT_TAGVAR(postdeps, $1)="${prev}${p}" + _LT_TAGVAR(postdeps, $1)=$prev$p else - _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} ${prev}${p}" + _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} $prev$p" fi fi prev= @@ -7073,15 +7590,15 @@ if AC_TRY_EVAL(ac_compile); then continue fi - if test "$pre_test_object_deps_done" = no; then + if test no = "$pre_test_object_deps_done"; then if test -z "$_LT_TAGVAR(predep_objects, $1)"; then - _LT_TAGVAR(predep_objects, $1)="$p" + _LT_TAGVAR(predep_objects, $1)=$p else _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p" fi else if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then - _LT_TAGVAR(postdep_objects, $1)="$p" + _LT_TAGVAR(postdep_objects, $1)=$p else _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p" fi @@ -7112,51 +7629,6 @@ interix[[3-9]]*) _LT_TAGVAR(postdep_objects,$1)= _LT_TAGVAR(postdeps,$1)= ;; - -linux*) - case `$CC -V 2>&1 | sed 5q` in - *Sun\ C*) - # Sun C++ 5.9 - - # The more standards-conforming stlport4 library is - # incompatible with the Cstd library. Avoid specifying - # it if it's in CXXFLAGS. Ignore libCrun as - # -library=stlport4 depends on it. - case " $CXX $CXXFLAGS " in - *" -library=stlport4 "*) - solaris_use_stlport4=yes - ;; - esac - - if test "$solaris_use_stlport4" != yes; then - _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' - fi - ;; - esac - ;; - -solaris*) - case $cc_basename in - CC* | sunCC*) - # The more standards-conforming stlport4 library is - # incompatible with the Cstd library. Avoid specifying - # it if it's in CXXFLAGS. Ignore libCrun as - # -library=stlport4 depends on it. - case " $CXX $CXXFLAGS " in - *" -library=stlport4 "*) - solaris_use_stlport4=yes - ;; - esac - - # Adding this requires a known-good setup of shared libraries for - # Sun compiler versions before 5.6, else PIC objects from an old - # archive will be linked into the output, leading to subtle bugs. - if test "$solaris_use_stlport4" != yes; then - _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' - fi - ;; - esac - ;; esac ]) @@ -7165,7 +7637,7 @@ case " $_LT_TAGVAR(postdeps, $1) " in esac _LT_TAGVAR(compiler_lib_search_dirs, $1)= if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then - _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | ${SED} -e 's! -L! !g' -e 's!^ !!'` + _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | $SED -e 's! -L! !g' -e 's!^ !!'` fi _LT_TAGDECL([], [compiler_lib_search_dirs], [1], [The directories searched by this compiler when creating a shared library]) @@ -7185,10 +7657,10 @@ _LT_TAGDECL([], [compiler_lib_search_path], [1], # -------------------------- # Ensure that the configuration variables for a Fortran 77 compiler are # suitably defined. These variables are subsequently used by _LT_CONFIG -# to write the compiler configuration to `libtool'. +# to write the compiler configuration to 'libtool'. m4_defun([_LT_LANG_F77_CONFIG], [AC_LANG_PUSH(Fortran 77) -if test -z "$F77" || test "X$F77" = "Xno"; then +if test -z "$F77" || test no = "$F77"; then _lt_disable_F77=yes fi @@ -7225,7 +7697,7 @@ _LT_TAGVAR(objext, $1)=$objext # the F77 compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. -if test "$_lt_disable_F77" != yes; then +if test yes != "$_lt_disable_F77"; then # Code to be used in simple compile tests lt_simple_compile_test_code="\ subroutine t @@ -7247,7 +7719,7 @@ if test "$_lt_disable_F77" != yes; then _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. - lt_save_CC="$CC" + lt_save_CC=$CC lt_save_GCC=$GCC lt_save_CFLAGS=$CFLAGS CC=${F77-"f77"} @@ -7261,21 +7733,25 @@ if test "$_lt_disable_F77" != yes; then AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) - test "$can_build_shared" = "no" && enable_shared=no + test no = "$can_build_shared" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) - test "$enable_shared" = yes && enable_static=no + test yes = "$enable_shared" && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) - if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then - test "$enable_shared" = yes && enable_static=no + if test ia64 != "$host_cpu"; then + case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in + yes,aix,yes) ;; # shared object as lib.so file only + yes,svr4,*) ;; # shared object as lib.so archive member only + yes,*) enable_static=no ;; # shared object in lib.a archive as well + esac fi ;; esac @@ -7283,11 +7759,11 @@ if test "$_lt_disable_F77" != yes; then AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. - test "$enable_shared" = yes || enable_static=yes + test yes = "$enable_shared" || enable_static=yes AC_MSG_RESULT([$enable_static]) - _LT_TAGVAR(GCC, $1)="$G77" - _LT_TAGVAR(LD, $1)="$LD" + _LT_TAGVAR(GCC, $1)=$G77 + _LT_TAGVAR(LD, $1)=$LD ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change @@ -7304,9 +7780,9 @@ if test "$_lt_disable_F77" != yes; then fi # test -n "$compiler" GCC=$lt_save_GCC - CC="$lt_save_CC" - CFLAGS="$lt_save_CFLAGS" -fi # test "$_lt_disable_F77" != yes + CC=$lt_save_CC + CFLAGS=$lt_save_CFLAGS +fi # test yes != "$_lt_disable_F77" AC_LANG_POP ])# _LT_LANG_F77_CONFIG @@ -7316,11 +7792,11 @@ AC_LANG_POP # ------------------------- # Ensure that the configuration variables for a Fortran compiler are # suitably defined. These variables are subsequently used by _LT_CONFIG -# to write the compiler configuration to `libtool'. +# to write the compiler configuration to 'libtool'. m4_defun([_LT_LANG_FC_CONFIG], [AC_LANG_PUSH(Fortran) -if test -z "$FC" || test "X$FC" = "Xno"; then +if test -z "$FC" || test no = "$FC"; then _lt_disable_FC=yes fi @@ -7357,7 +7833,7 @@ _LT_TAGVAR(objext, $1)=$objext # the FC compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. -if test "$_lt_disable_FC" != yes; then +if test yes != "$_lt_disable_FC"; then # Code to be used in simple compile tests lt_simple_compile_test_code="\ subroutine t @@ -7379,7 +7855,7 @@ if test "$_lt_disable_FC" != yes; then _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. - lt_save_CC="$CC" + lt_save_CC=$CC lt_save_GCC=$GCC lt_save_CFLAGS=$CFLAGS CC=${FC-"f95"} @@ -7395,21 +7871,25 @@ if test "$_lt_disable_FC" != yes; then AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) - test "$can_build_shared" = "no" && enable_shared=no + test no = "$can_build_shared" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) - test "$enable_shared" = yes && enable_static=no + test yes = "$enable_shared" && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) - if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then - test "$enable_shared" = yes && enable_static=no + if test ia64 != "$host_cpu"; then + case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in + yes,aix,yes) ;; # shared object as lib.so file only + yes,svr4,*) ;; # shared object as lib.so archive member only + yes,*) enable_static=no ;; # shared object in lib.a archive as well + esac fi ;; esac @@ -7417,11 +7897,11 @@ if test "$_lt_disable_FC" != yes; then AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. - test "$enable_shared" = yes || enable_static=yes + test yes = "$enable_shared" || enable_static=yes AC_MSG_RESULT([$enable_static]) - _LT_TAGVAR(GCC, $1)="$ac_cv_fc_compiler_gnu" - _LT_TAGVAR(LD, $1)="$LD" + _LT_TAGVAR(GCC, $1)=$ac_cv_fc_compiler_gnu + _LT_TAGVAR(LD, $1)=$LD ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change @@ -7441,7 +7921,7 @@ if test "$_lt_disable_FC" != yes; then GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS -fi # test "$_lt_disable_FC" != yes +fi # test yes != "$_lt_disable_FC" AC_LANG_POP ])# _LT_LANG_FC_CONFIG @@ -7451,7 +7931,7 @@ AC_LANG_POP # -------------------------- # Ensure that the configuration variables for the GNU Java Compiler compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG -# to write the compiler configuration to `libtool'. +# to write the compiler configuration to 'libtool'. m4_defun([_LT_LANG_GCJ_CONFIG], [AC_REQUIRE([LT_PROG_GCJ])dnl AC_LANG_SAVE @@ -7485,7 +7965,7 @@ CC=${GCJ-"gcj"} CFLAGS=$GCJFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC -_LT_TAGVAR(LD, $1)="$LD" +_LT_TAGVAR(LD, $1)=$LD _LT_CC_BASENAME([$compiler]) # GCJ did not exist at the time GCC didn't implicitly link libc in. @@ -7518,7 +7998,7 @@ CFLAGS=$lt_save_CFLAGS # -------------------------- # Ensure that the configuration variables for the GNU Go compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG -# to write the compiler configuration to `libtool'. +# to write the compiler configuration to 'libtool'. m4_defun([_LT_LANG_GO_CONFIG], [AC_REQUIRE([LT_PROG_GO])dnl AC_LANG_SAVE @@ -7552,7 +8032,7 @@ CC=${GOC-"gccgo"} CFLAGS=$GOFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC -_LT_TAGVAR(LD, $1)="$LD" +_LT_TAGVAR(LD, $1)=$LD _LT_CC_BASENAME([$compiler]) # Go did not exist at the time GCC didn't implicitly link libc in. @@ -7585,7 +8065,7 @@ CFLAGS=$lt_save_CFLAGS # ------------------------- # Ensure that the configuration variables for the Windows resource compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG -# to write the compiler configuration to `libtool'. +# to write the compiler configuration to 'libtool'. m4_defun([_LT_LANG_RC_CONFIG], [AC_REQUIRE([LT_PROG_RC])dnl AC_LANG_SAVE @@ -7601,7 +8081,7 @@ _LT_TAGVAR(objext, $1)=$objext lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }' # Code to be used in simple link tests -lt_simple_link_test_code="$lt_simple_compile_test_code" +lt_simple_link_test_code=$lt_simple_compile_test_code # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER @@ -7611,7 +8091,7 @@ _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. -lt_save_CC="$CC" +lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC= @@ -7640,7 +8120,7 @@ AC_DEFUN([LT_PROG_GCJ], [m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ], [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ], [AC_CHECK_TOOL(GCJ, gcj,) - test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2" + test set = "${GCJFLAGS+set}" || GCJFLAGS="-g -O2" AC_SUBST(GCJFLAGS)])])[]dnl ]) @@ -7749,7 +8229,7 @@ lt_ac_count=0 # Add /usr/xpg4/bin/sed as it is typically found on Solaris # along with /bin/sed that truncates output. for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do - test ! -f $lt_ac_sed && continue + test ! -f "$lt_ac_sed" && continue cat /dev/null > conftest.in lt_ac_count=0 echo $ECHO_N "0123456789$ECHO_C" >conftest.in @@ -7766,9 +8246,9 @@ for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break cmp -s conftest.out conftest.nl || break # 10000 chars as input seems more than enough - test $lt_ac_count -gt 10 && break + test 10 -lt "$lt_ac_count" && break lt_ac_count=`expr $lt_ac_count + 1` - if test $lt_ac_count -gt $lt_ac_max; then + if test "$lt_ac_count" -gt "$lt_ac_max"; then lt_ac_max=$lt_ac_count lt_cv_path_SED=$lt_ac_sed fi @@ -7792,27 +8272,7 @@ dnl AC_DEFUN([LT_AC_PROG_SED], []) # Find out whether the shell is Bourne or XSI compatible, # or has some other useful features. m4_defun([_LT_CHECK_SHELL_FEATURES], -[AC_MSG_CHECKING([whether the shell understands some XSI constructs]) -# Try some XSI features -xsi_shell=no -( _lt_dummy="a/b/c" - test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \ - = c,a/b,b/c, \ - && eval 'test $(( 1 + 1 )) -eq 2 \ - && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ - && xsi_shell=yes -AC_MSG_RESULT([$xsi_shell]) -_LT_CONFIG_LIBTOOL_INIT([xsi_shell='$xsi_shell']) - -AC_MSG_CHECKING([whether the shell understands "+="]) -lt_shell_append=no -( foo=bar; set foo baz; eval "$[1]+=\$[2]" && test "$foo" = barbaz ) \ - >/dev/null 2>&1 \ - && lt_shell_append=yes -AC_MSG_RESULT([$lt_shell_append]) -_LT_CONFIG_LIBTOOL_INIT([lt_shell_append='$lt_shell_append']) - -if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then +[if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then lt_unset=unset else lt_unset=false @@ -7836,102 +8296,9 @@ _LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl ])# _LT_CHECK_SHELL_FEATURES -# _LT_PROG_FUNCTION_REPLACE (FUNCNAME, REPLACEMENT-BODY) -# ------------------------------------------------------ -# In `$cfgfile', look for function FUNCNAME delimited by `^FUNCNAME ()$' and -# '^} FUNCNAME ', and replace its body with REPLACEMENT-BODY. -m4_defun([_LT_PROG_FUNCTION_REPLACE], -[dnl { -sed -e '/^$1 ()$/,/^} # $1 /c\ -$1 ()\ -{\ -m4_bpatsubsts([$2], [$], [\\], [^\([ ]\)], [\\\1]) -} # Extended-shell $1 implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: -]) - - -# _LT_PROG_REPLACE_SHELLFNS -# ------------------------- -# Replace existing portable implementations of several shell functions with -# equivalent extended shell implementations where those features are available.. -m4_defun([_LT_PROG_REPLACE_SHELLFNS], -[if test x"$xsi_shell" = xyes; then - _LT_PROG_FUNCTION_REPLACE([func_dirname], [dnl - case ${1} in - */*) func_dirname_result="${1%/*}${2}" ;; - * ) func_dirname_result="${3}" ;; - esac]) - - _LT_PROG_FUNCTION_REPLACE([func_basename], [dnl - func_basename_result="${1##*/}"]) - - _LT_PROG_FUNCTION_REPLACE([func_dirname_and_basename], [dnl - case ${1} in - */*) func_dirname_result="${1%/*}${2}" ;; - * ) func_dirname_result="${3}" ;; - esac - func_basename_result="${1##*/}"]) - - _LT_PROG_FUNCTION_REPLACE([func_stripname], [dnl - # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are - # positional parameters, so assign one to ordinary parameter first. - func_stripname_result=${3} - func_stripname_result=${func_stripname_result#"${1}"} - func_stripname_result=${func_stripname_result%"${2}"}]) - - _LT_PROG_FUNCTION_REPLACE([func_split_long_opt], [dnl - func_split_long_opt_name=${1%%=*} - func_split_long_opt_arg=${1#*=}]) - - _LT_PROG_FUNCTION_REPLACE([func_split_short_opt], [dnl - func_split_short_opt_arg=${1#??} - func_split_short_opt_name=${1%"$func_split_short_opt_arg"}]) - - _LT_PROG_FUNCTION_REPLACE([func_lo2o], [dnl - case ${1} in - *.lo) func_lo2o_result=${1%.lo}.${objext} ;; - *) func_lo2o_result=${1} ;; - esac]) - - _LT_PROG_FUNCTION_REPLACE([func_xform], [ func_xform_result=${1%.*}.lo]) - - _LT_PROG_FUNCTION_REPLACE([func_arith], [ func_arith_result=$(( $[*] ))]) - - _LT_PROG_FUNCTION_REPLACE([func_len], [ func_len_result=${#1}]) -fi - -if test x"$lt_shell_append" = xyes; then - _LT_PROG_FUNCTION_REPLACE([func_append], [ eval "${1}+=\\${2}"]) - - _LT_PROG_FUNCTION_REPLACE([func_append_quoted], [dnl - func_quote_for_eval "${2}" -dnl m4 expansion turns \\\\ into \\, and then the shell eval turns that into \ - eval "${1}+=\\\\ \\$func_quote_for_eval_result"]) - - # Save a `func_append' function call where possible by direct use of '+=' - sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") - test 0 -eq $? || _lt_function_replace_fail=: -else - # Save a `func_append' function call even when '+=' is not available - sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") - test 0 -eq $? || _lt_function_replace_fail=: -fi - -if test x"$_lt_function_replace_fail" = x":"; then - AC_MSG_WARN([Unable to substitute extended shell functions in $ofile]) -fi -]) - # _LT_PATH_CONVERSION_FUNCTIONS # ----------------------------- -# Determine which file name conversion functions should be used by +# Determine what file name conversion functions should be used by # func_to_host_file (and, implicitly, by func_to_host_path). These are needed # for certain cross-compile configurations and native mingw. m4_defun([_LT_PATH_CONVERSION_FUNCTIONS], @@ -7998,15 +8365,15 @@ _LT_DECL([to_tool_file_cmd], [lt_cv_to_tool_file_cmd], # Helper functions for option handling. -*- Autoconf -*- # -# Copyright (C) 2004, 2005, 2007, 2008, 2009 Free Software Foundation, -# Inc. +# Copyright (C) 2004-2005, 2007-2009, 2011-2015 Free Software +# Foundation, Inc. # Written by Gary V. Vaughan, 2004 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. -# serial 7 ltoptions.m4 +# serial 8 ltoptions.m4 # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])]) @@ -8027,7 +8394,7 @@ m4_define([_LT_SET_OPTION], [m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]), _LT_MANGLE_DEFUN([$1], [$2]), - [m4_warning([Unknown $1 option `$2'])])[]dnl + [m4_warning([Unknown $1 option '$2'])])[]dnl ]) @@ -8073,13 +8440,15 @@ m4_if([$1],[LT_INIT],[ dnl dnl If no reference was made to various pairs of opposing options, then dnl we run the default mode handler for the pair. For example, if neither - dnl `shared' nor `disable-shared' was passed, we enable building of shared + dnl 'shared' nor 'disable-shared' was passed, we enable building of shared dnl archives by default: _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED]) _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC]) _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC]) _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install], - [_LT_ENABLE_FAST_INSTALL]) + [_LT_ENABLE_FAST_INSTALL]) + _LT_UNLESS_OPTIONS([LT_INIT], [aix-soname=aix aix-soname=both aix-soname=svr4], + [_LT_WITH_AIX_SONAME([aix])]) ]) ])# _LT_SET_OPTIONS @@ -8107,7 +8476,7 @@ AU_DEFUN([AC_LIBTOOL_DLOPEN], [_LT_SET_OPTION([LT_INIT], [dlopen]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you -put the `dlopen' option into LT_INIT's first parameter.]) +put the 'dlopen' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: @@ -8143,7 +8512,7 @@ AU_DEFUN([AC_LIBTOOL_WIN32_DLL], _LT_SET_OPTION([LT_INIT], [win32-dll]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you -put the `win32-dll' option into LT_INIT's first parameter.]) +put the 'win32-dll' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: @@ -8152,9 +8521,9 @@ dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], []) # _LT_ENABLE_SHARED([DEFAULT]) # ---------------------------- -# implement the --enable-shared flag, and supports the `shared' and -# `disable-shared' LT_INIT options. -# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +# implement the --enable-shared flag, and supports the 'shared' and +# 'disable-shared' LT_INIT options. +# DEFAULT is either 'yes' or 'no'. If omitted, it defaults to 'yes'. m4_define([_LT_ENABLE_SHARED], [m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([shared], @@ -8167,14 +8536,14 @@ AC_ARG_ENABLE([shared], *) enable_shared=no # Look at the argument we got. We use all the common list separators. - lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, for pkg in $enableval; do - IFS="$lt_save_ifs" + IFS=$lt_save_ifs if test "X$pkg" = "X$p"; then enable_shared=yes fi done - IFS="$lt_save_ifs" + IFS=$lt_save_ifs ;; esac], [enable_shared=]_LT_ENABLE_SHARED_DEFAULT) @@ -8206,9 +8575,9 @@ dnl AC_DEFUN([AM_DISABLE_SHARED], []) # _LT_ENABLE_STATIC([DEFAULT]) # ---------------------------- -# implement the --enable-static flag, and support the `static' and -# `disable-static' LT_INIT options. -# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +# implement the --enable-static flag, and support the 'static' and +# 'disable-static' LT_INIT options. +# DEFAULT is either 'yes' or 'no'. If omitted, it defaults to 'yes'. m4_define([_LT_ENABLE_STATIC], [m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([static], @@ -8221,14 +8590,14 @@ AC_ARG_ENABLE([static], *) enable_static=no # Look at the argument we got. We use all the common list separators. - lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, for pkg in $enableval; do - IFS="$lt_save_ifs" + IFS=$lt_save_ifs if test "X$pkg" = "X$p"; then enable_static=yes fi done - IFS="$lt_save_ifs" + IFS=$lt_save_ifs ;; esac], [enable_static=]_LT_ENABLE_STATIC_DEFAULT) @@ -8260,9 +8629,9 @@ dnl AC_DEFUN([AM_DISABLE_STATIC], []) # _LT_ENABLE_FAST_INSTALL([DEFAULT]) # ---------------------------------- -# implement the --enable-fast-install flag, and support the `fast-install' -# and `disable-fast-install' LT_INIT options. -# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +# implement the --enable-fast-install flag, and support the 'fast-install' +# and 'disable-fast-install' LT_INIT options. +# DEFAULT is either 'yes' or 'no'. If omitted, it defaults to 'yes'. m4_define([_LT_ENABLE_FAST_INSTALL], [m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([fast-install], @@ -8275,14 +8644,14 @@ AC_ARG_ENABLE([fast-install], *) enable_fast_install=no # Look at the argument we got. We use all the common list separators. - lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, for pkg in $enableval; do - IFS="$lt_save_ifs" + IFS=$lt_save_ifs if test "X$pkg" = "X$p"; then enable_fast_install=yes fi done - IFS="$lt_save_ifs" + IFS=$lt_save_ifs ;; esac], [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT) @@ -8299,14 +8668,14 @@ AU_DEFUN([AC_ENABLE_FAST_INSTALL], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put -the `fast-install' option into LT_INIT's first parameter.]) +the 'fast-install' option into LT_INIT's first parameter.]) ]) AU_DEFUN([AC_DISABLE_FAST_INSTALL], [_LT_SET_OPTION([LT_INIT], [disable-fast-install]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put -the `disable-fast-install' option into LT_INIT's first parameter.]) +the 'disable-fast-install' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: @@ -8314,11 +8683,64 @@ dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], []) dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], []) +# _LT_WITH_AIX_SONAME([DEFAULT]) +# ---------------------------------- +# implement the --with-aix-soname flag, and support the `aix-soname=aix' +# and `aix-soname=both' and `aix-soname=svr4' LT_INIT options. DEFAULT +# is either `aix', `both' or `svr4'. If omitted, it defaults to `aix'. +m4_define([_LT_WITH_AIX_SONAME], +[m4_define([_LT_WITH_AIX_SONAME_DEFAULT], [m4_if($1, svr4, svr4, m4_if($1, both, both, aix))])dnl +shared_archive_member_spec= +case $host,$enable_shared in +power*-*-aix[[5-9]]*,yes) + AC_MSG_CHECKING([which variant of shared library versioning to provide]) + AC_ARG_WITH([aix-soname], + [AS_HELP_STRING([--with-aix-soname=aix|svr4|both], + [shared library versioning (aka "SONAME") variant to provide on AIX, @<:@default=]_LT_WITH_AIX_SONAME_DEFAULT[@:>@.])], + [case $withval in + aix|svr4|both) + ;; + *) + AC_MSG_ERROR([Unknown argument to --with-aix-soname]) + ;; + esac + lt_cv_with_aix_soname=$with_aix_soname], + [AC_CACHE_VAL([lt_cv_with_aix_soname], + [lt_cv_with_aix_soname=]_LT_WITH_AIX_SONAME_DEFAULT) + with_aix_soname=$lt_cv_with_aix_soname]) + AC_MSG_RESULT([$with_aix_soname]) + if test aix != "$with_aix_soname"; then + # For the AIX way of multilib, we name the shared archive member + # based on the bitwidth used, traditionally 'shr.o' or 'shr_64.o', + # and 'shr.imp' or 'shr_64.imp', respectively, for the Import File. + # Even when GNU compilers ignore OBJECT_MODE but need '-maix64' flag, + # the AIX toolchain works better with OBJECT_MODE set (default 32). + if test 64 = "${OBJECT_MODE-32}"; then + shared_archive_member_spec=shr_64 + else + shared_archive_member_spec=shr + fi + fi + ;; +*) + with_aix_soname=aix + ;; +esac + +_LT_DECL([], [shared_archive_member_spec], [0], + [Shared archive member basename, for filename based shared library versioning on AIX])dnl +])# _LT_WITH_AIX_SONAME + +LT_OPTION_DEFINE([LT_INIT], [aix-soname=aix], [_LT_WITH_AIX_SONAME([aix])]) +LT_OPTION_DEFINE([LT_INIT], [aix-soname=both], [_LT_WITH_AIX_SONAME([both])]) +LT_OPTION_DEFINE([LT_INIT], [aix-soname=svr4], [_LT_WITH_AIX_SONAME([svr4])]) + + # _LT_WITH_PIC([MODE]) # -------------------- -# implement the --with-pic flag, and support the `pic-only' and `no-pic' +# implement the --with-pic flag, and support the 'pic-only' and 'no-pic' # LT_INIT options. -# MODE is either `yes' or `no'. If omitted, it defaults to `both'. +# MODE is either 'yes' or 'no'. If omitted, it defaults to 'both'. m4_define([_LT_WITH_PIC], [AC_ARG_WITH([pic], [AS_HELP_STRING([--with-pic@<:@=PKGS@:>@], @@ -8329,19 +8751,17 @@ m4_define([_LT_WITH_PIC], *) pic_mode=default # Look at the argument we got. We use all the common list separators. - lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, for lt_pkg in $withval; do - IFS="$lt_save_ifs" + IFS=$lt_save_ifs if test "X$lt_pkg" = "X$lt_p"; then pic_mode=yes fi done - IFS="$lt_save_ifs" + IFS=$lt_save_ifs ;; esac], - [pic_mode=default]) - -test -z "$pic_mode" && pic_mode=m4_default([$1], [default]) + [pic_mode=m4_default([$1], [default])]) _LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl ])# _LT_WITH_PIC @@ -8354,7 +8774,7 @@ AU_DEFUN([AC_LIBTOOL_PICMODE], [_LT_SET_OPTION([LT_INIT], [pic-only]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you -put the `pic-only' option into LT_INIT's first parameter.]) +put the 'pic-only' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: @@ -8377,7 +8797,8 @@ LT_OPTION_DEFINE([LTDL_INIT], [convenience], # ltsugar.m4 -- libtool m4 base layer. -*-Autoconf-*- # -# Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc. +# Copyright (C) 2004-2005, 2007-2008, 2011-2015 Free Software +# Foundation, Inc. # Written by Gary V. Vaughan, 2004 # # This file is free software; the Free Software Foundation gives @@ -8410,7 +8831,7 @@ m4_define([_lt_join], # ------------ # Manipulate m4 lists. # These macros are necessary as long as will still need to support -# Autoconf-2.59 which quotes differently. +# Autoconf-2.59, which quotes differently. m4_define([lt_car], [[$1]]) m4_define([lt_cdr], [m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])], @@ -8421,7 +8842,7 @@ m4_define([lt_unquote], $1) # lt_append(MACRO-NAME, STRING, [SEPARATOR]) # ------------------------------------------ -# Redefine MACRO-NAME to hold its former content plus `SEPARATOR'`STRING'. +# Redefine MACRO-NAME to hold its former content plus 'SEPARATOR''STRING'. # Note that neither SEPARATOR nor STRING are expanded; they are appended # to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked). # No SEPARATOR is output if MACRO-NAME was previously undefined (different @@ -8501,7 +8922,7 @@ m4_define([lt_dict_filter], # ltversion.m4 -- version numbers -*- Autoconf -*- # -# Copyright (C) 2004 Free Software Foundation, Inc. +# Copyright (C) 2004, 2011-2015 Free Software Foundation, Inc. # Written by Scott James Remnant, 2004 # # This file is free software; the Free Software Foundation gives @@ -8510,22 +8931,23 @@ m4_define([lt_dict_filter], # @configure_input@ -# serial 3337 ltversion.m4 +# serial 4179 ltversion.m4 # This file is part of GNU Libtool -m4_define([LT_PACKAGE_VERSION], [2.4.2]) -m4_define([LT_PACKAGE_REVISION], [1.3337]) +m4_define([LT_PACKAGE_VERSION], [2.4.6]) +m4_define([LT_PACKAGE_REVISION], [2.4.6]) AC_DEFUN([LTVERSION_VERSION], -[macro_version='2.4.2' -macro_revision='1.3337' +[macro_version='2.4.6' +macro_revision='2.4.6' _LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?]) _LT_DECL(, macro_revision, 0) ]) # lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*- # -# Copyright (C) 2004, 2005, 2007, 2009 Free Software Foundation, Inc. +# Copyright (C) 2004-2005, 2007, 2009, 2011-2015 Free Software +# Foundation, Inc. # Written by Scott James Remnant, 2004. # # This file is free software; the Free Software Foundation gives @@ -8536,7 +8958,7 @@ _LT_DECL(, macro_revision, 0) # These exist entirely to fool aclocal when bootstrapping libtool. # -# In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN) +# In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN), # which have later been changed to m4_define as they aren't part of the # exported API, or moved to Autoconf or Automake where they belong. # @@ -8550,7 +8972,7 @@ _LT_DECL(, macro_revision, 0) # included after everything else. This provides aclocal with the # AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything # because those macros already exist, or will be overwritten later. -# We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. +# We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. # # Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here. # Yes, that means every name once taken will need to remain here until @@ -8622,7 +9044,7 @@ m4_ifndef([_LT_PROG_F77], [AC_DEFUN([_LT_PROG_F77])]) m4_ifndef([_LT_PROG_FC], [AC_DEFUN([_LT_PROG_FC])]) m4_ifndef([_LT_PROG_CXX], [AC_DEFUN([_LT_PROG_CXX])]) -# Copyright (C) 2002-2013 Free Software Foundation, Inc. +# Copyright (C) 2002-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -8634,10 +9056,10 @@ m4_ifndef([_LT_PROG_CXX], [AC_DEFUN([_LT_PROG_CXX])]) # generated from the m4 files accompanying Automake X.Y. # (This private macro should not be called outside this file.) AC_DEFUN([AM_AUTOMAKE_VERSION], -[am__api_version='1.14' +[am__api_version='1.16' dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to dnl require some minimum version. Point them to the right macro. -m4_if([$1], [1.14.1], [], +m4_if([$1], [1.16.5], [], [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl ]) @@ -8653,14 +9075,14 @@ m4_define([_AM_AUTOCONF_VERSION], []) # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. # This function is AC_REQUIREd by AM_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], -[AM_AUTOMAKE_VERSION([1.14.1])dnl +[AM_AUTOMAKE_VERSION([1.16.5])dnl m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # AM_AUX_DIR_EXPAND -*- Autoconf -*- -# Copyright (C) 2001-2013 Free Software Foundation, Inc. +# Copyright (C) 2001-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -8705,15 +9127,14 @@ _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # configured tree to be moved without reconfiguration. AC_DEFUN([AM_AUX_DIR_EXPAND], -[dnl Rely on autoconf to set up CDPATH properly. -AC_PREREQ([2.50])dnl -# expand $ac_aux_dir to an absolute path -am_aux_dir=`cd $ac_aux_dir && pwd` +[AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl +# Expand $ac_aux_dir to an absolute path. +am_aux_dir=`cd "$ac_aux_dir" && pwd` ]) # AM_CONDITIONAL -*- Autoconf -*- -# Copyright (C) 1997-2013 Free Software Foundation, Inc. +# Copyright (C) 1997-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -8744,7 +9165,7 @@ AC_CONFIG_COMMANDS_PRE( Usually this means the macro was only invoked conditionally.]]) fi])]) -# Copyright (C) 1999-2013 Free Software Foundation, Inc. +# Copyright (C) 1999-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -8935,13 +9356,12 @@ _AM_SUBST_NOTMAKE([am__nodep])dnl # Generate code to set up dependency tracking. -*- Autoconf -*- -# Copyright (C) 1999-2013 Free Software Foundation, Inc. +# Copyright (C) 1999-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. - # _AM_OUTPUT_DEPENDENCY_COMMANDS # ------------------------------ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], @@ -8949,49 +9369,43 @@ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. - case $CONFIG_FILES in - *\'*) eval set x "$CONFIG_FILES" ;; - *) set x $CONFIG_FILES ;; - esac + # TODO: see whether this extra hack can be removed once we start + # requiring Autoconf 2.70 or later. + AS_CASE([$CONFIG_FILES], + [*\'*], [eval set x "$CONFIG_FILES"], + [*], [set x $CONFIG_FILES]) shift - for mf + # Used to flag and report bootstrapping failures. + am_rc=0 + for am_mf do # Strip MF so we end up with the name of the file. - mf=`echo "$mf" | sed -e 's/:.*$//'` - # Check whether this is an Automake generated Makefile or not. - # We used to match only the files named 'Makefile.in', but - # some people rename them; so instead we look at the file content. - # Grep'ing the first line is not enough: some people post-process - # each Makefile.in and add a new line on top of each file to say so. - # Grep'ing the whole file is not good either: AIX grep has a line + am_mf=`AS_ECHO(["$am_mf"]) | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile which includes + # dependency-tracking related rules and includes. + # Grep'ing the whole file directly is not great: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. - if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then - dirpart=`AS_DIRNAME("$mf")` - else - continue - fi - # Extract the definition of DEPDIR, am__include, and am__quote - # from the Makefile without running 'make'. - DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` - test -z "$DEPDIR" && continue - am__include=`sed -n 's/^am__include = //p' < "$mf"` - test -z "$am__include" && continue - am__quote=`sed -n 's/^am__quote = //p' < "$mf"` - # Find all dependency output files, they are included files with - # $(DEPDIR) in their names. We invoke sed twice because it is the - # simplest approach to changing $(DEPDIR) to its actual value in the - # expansion. - for file in `sed -n " - s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ - sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do - # Make sure the directory exists. - test -f "$dirpart/$file" && continue - fdir=`AS_DIRNAME(["$file"])` - AS_MKDIR_P([$dirpart/$fdir]) - # echo "creating $dirpart/$file" - echo '# dummy' > "$dirpart/$file" - done + sed -n 's,^am--depfiles:.*,X,p' "$am_mf" | grep X >/dev/null 2>&1 \ + || continue + am_dirpart=`AS_DIRNAME(["$am_mf"])` + am_filepart=`AS_BASENAME(["$am_mf"])` + AM_RUN_LOG([cd "$am_dirpart" \ + && sed -e '/# am--include-marker/d' "$am_filepart" \ + | $MAKE -f - am--depfiles]) || am_rc=$? done + if test $am_rc -ne 0; then + AC_MSG_FAILURE([Something went wrong bootstrapping makefile fragments + for automatic dependency tracking. If GNU make was not used, consider + re-running the configure script with MAKE="gmake" (or whatever is + necessary). You can also try re-running configure with the + '--disable-dependency-tracking' option to at least be able to build + the package (albeit without support for automatic dependency tracking).]) + fi + AS_UNSET([am_dirpart]) + AS_UNSET([am_filepart]) + AS_UNSET([am_mf]) + AS_UNSET([am_rc]) + rm -f conftest-deps.mk } ])# _AM_OUTPUT_DEPENDENCY_COMMANDS @@ -9000,18 +9414,17 @@ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], # ----------------------------- # This macro should only be invoked once -- use via AC_REQUIRE. # -# This code is only required when automatic dependency tracking -# is enabled. FIXME. This creates each '.P' file that we will -# need in order to bootstrap the dependency handling code. +# This code is only required when automatic dependency tracking is enabled. +# This creates each '.Po' and '.Plo' makefile fragment that we'll need in +# order to bootstrap the dependency handling code. AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], [AC_CONFIG_COMMANDS([depfiles], [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], - [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) -]) + [AMDEP_TRUE="$AMDEP_TRUE" MAKE="${MAKE-make}"])]) # Do all the work for Automake. -*- Autoconf -*- -# Copyright (C) 1996-2013 Free Software Foundation, Inc. +# Copyright (C) 1996-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -9039,6 +9452,10 @@ m4_defn([AC_PROG_CC]) # release and drop the old call support. AC_DEFUN([AM_INIT_AUTOMAKE], [AC_PREREQ([2.65])dnl +m4_ifdef([_$0_ALREADY_INIT], + [m4_fatal([$0 expanded multiple times +]m4_defn([_$0_ALREADY_INIT]))], + [m4_define([_$0_ALREADY_INIT], m4_expansion_stack)])dnl dnl Autoconf wants to disallow AM_ names. We explicitly allow dnl the ones we care about. m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl @@ -9075,7 +9492,7 @@ m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl [_AM_SET_OPTIONS([$1])dnl dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. m4_if( - m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]), + m4_ifset([AC_PACKAGE_NAME], [ok]):m4_ifset([AC_PACKAGE_VERSION], [ok]), [ok:ok],, [m4_fatal([AC_INIT should be called with package and version arguments])])dnl AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl @@ -9098,11 +9515,11 @@ AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl AC_REQUIRE([AC_PROG_MKDIR_P])dnl # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: -# -# +# +# AC_SUBST([mkdir_p], ['$(MKDIR_P)']) -# We need awk for the "check" target. The system "awk" is bad on -# some platforms. +# We need awk for the "check" target (and possibly the TAP driver). The +# system "awk" is bad on some platforms. AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AM_SET_LEADING_DOT])dnl @@ -9127,6 +9544,20 @@ AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], [m4_define([AC_PROG_OBJCXX], m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl ]) +# Variables for tags utilities; see am/tags.am +if test -z "$CTAGS"; then + CTAGS=ctags +fi +AC_SUBST([CTAGS]) +if test -z "$ETAGS"; then + ETAGS=etags +fi +AC_SUBST([ETAGS]) +if test -z "$CSCOPE"; then + CSCOPE=cscope +fi +AC_SUBST([CSCOPE]) + AC_REQUIRE([AM_SILENT_RULES])dnl dnl The testsuite driver may need to know about EXEEXT, so add the dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This @@ -9166,7 +9597,7 @@ END Aborting the configuration process, to ensure you take notice of the issue. You can download and install GNU coreutils to get an 'rm' implementation -that behaves properly: . +that behaves properly: . If you want to complete the configuration process using your problematic 'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM @@ -9175,7 +9606,11 @@ to "yes", and re-run configure. END AC_MSG_ERROR([Your 'rm' program is bad, sorry.]) fi -fi]) +fi +dnl The trailing newline in this macro's definition is deliberate, for +dnl backward compatibility and to allow trailing 'dnl'-style comments +dnl after the AM_INIT_AUTOMAKE invocation. See automake bug#16841. +]) dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further @@ -9204,7 +9639,7 @@ for _am_header in $config_headers :; do done echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) -# Copyright (C) 2001-2013 Free Software Foundation, Inc. +# Copyright (C) 2001-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -9215,7 +9650,7 @@ echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_co # Define $install_sh. AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl -if test x"${install_sh}" != xset; then +if test x"${install_sh+set}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; @@ -9225,7 +9660,7 @@ if test x"${install_sh}" != xset; then fi AC_SUBST([install_sh])]) -# Copyright (C) 2003-2013 Free Software Foundation, Inc. +# Copyright (C) 2003-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -9247,7 +9682,7 @@ AC_SUBST([am__leading_dot])]) # Add --enable-maintainer-mode option to configure. -*- Autoconf -*- # From Jim Meyering -# Copyright (C) 1996-2013 Free Software Foundation, Inc. +# Copyright (C) 1996-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -9282,7 +9717,7 @@ AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles]) # Check to see how 'make' treats includes. -*- Autoconf -*- -# Copyright (C) 2001-2013 Free Software Foundation, Inc. +# Copyright (C) 2001-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -9290,49 +9725,42 @@ AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles]) # AM_MAKE_INCLUDE() # ----------------- -# Check to see how make treats includes. +# Check whether make has an 'include' directive that can support all +# the idioms we need for our automatic dependency tracking code. AC_DEFUN([AM_MAKE_INCLUDE], -[am_make=${MAKE-make} -cat > confinc << 'END' +[AC_MSG_CHECKING([whether ${MAKE-make} supports the include directive]) +cat > confinc.mk << 'END' am__doit: - @echo this is the am__doit target + @echo this is the am__doit target >confinc.out .PHONY: am__doit END -# If we don't find an include directive, just comment out the code. -AC_MSG_CHECKING([for style of include used by $am_make]) am__include="#" am__quote= -_am_result=none -# First try GNU make style include. -echo "include confinc" > confmf -# Ignore all kinds of additional output from 'make'. -case `$am_make -s -f confmf 2> /dev/null` in #( -*the\ am__doit\ target*) - am__include=include - am__quote= - _am_result=GNU - ;; -esac -# Now try BSD make style include. -if test "$am__include" = "#"; then - echo '.include "confinc"' > confmf - case `$am_make -s -f confmf 2> /dev/null` in #( - *the\ am__doit\ target*) - am__include=.include - am__quote="\"" - _am_result=BSD - ;; - esac -fi -AC_SUBST([am__include]) -AC_SUBST([am__quote]) -AC_MSG_RESULT([$_am_result]) -rm -f confinc confmf -]) +# BSD make does it like this. +echo '.include "confinc.mk" # ignored' > confmf.BSD +# Other make implementations (GNU, Solaris 10, AIX) do it like this. +echo 'include confinc.mk # ignored' > confmf.GNU +_am_result=no +for s in GNU BSD; do + AM_RUN_LOG([${MAKE-make} -f confmf.$s && cat confinc.out]) + AS_CASE([$?:`cat confinc.out 2>/dev/null`], + ['0:this is the am__doit target'], + [AS_CASE([$s], + [BSD], [am__include='.include' am__quote='"'], + [am__include='include' am__quote=''])]) + if test "$am__include" != "#"; then + _am_result="yes ($s style)" + break + fi +done +rm -f confinc.* confmf.* +AC_MSG_RESULT([${_am_result}]) +AC_SUBST([am__include])]) +AC_SUBST([am__quote])]) # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- -# Copyright (C) 1997-2013 Free Software Foundation, Inc. +# Copyright (C) 1997-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -9353,12 +9781,7 @@ AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([missing])dnl if test x"${MISSING+set}" != xset; then - case $am_aux_dir in - *\ * | *\ *) - MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; - *) - MISSING="\${SHELL} $am_aux_dir/missing" ;; - esac + MISSING="\${SHELL} '$am_aux_dir/missing'" fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then @@ -9371,7 +9794,7 @@ fi # Helper functions for option handling. -*- Autoconf -*- -# Copyright (C) 2001-2013 Free Software Foundation, Inc. +# Copyright (C) 2001-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -9400,7 +9823,7 @@ AC_DEFUN([_AM_SET_OPTIONS], AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) -# Copyright (C) 1999-2013 Free Software Foundation, Inc. +# Copyright (C) 1999-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -9447,7 +9870,7 @@ AC_LANG_POP([C])]) # For backward compatibility. AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])]) -# Copyright (C) 2001-2013 Free Software Foundation, Inc. +# Copyright (C) 2001-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -9466,7 +9889,7 @@ AC_DEFUN([AM_RUN_LOG], # Check to make sure that the build environment is sane. -*- Autoconf -*- -# Copyright (C) 1996-2013 Free Software Foundation, Inc. +# Copyright (C) 1996-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -9547,7 +9970,7 @@ AC_CONFIG_COMMANDS_PRE( rm -f conftest.file ]) -# Copyright (C) 2009-2013 Free Software Foundation, Inc. +# Copyright (C) 2009-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -9607,7 +10030,7 @@ AC_SUBST([AM_BACKSLASH])dnl _AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl ]) -# Copyright (C) 2001-2013 Free Software Foundation, Inc. +# Copyright (C) 2001-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -9635,7 +10058,7 @@ fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) -# Copyright (C) 2006-2013 Free Software Foundation, Inc. +# Copyright (C) 2006-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -9654,7 +10077,7 @@ AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) # Check how to create a tarball. -*- Autoconf -*- -# Copyright (C) 2004-2013 Free Software Foundation, Inc. +# Copyright (C) 2004-2021 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, diff --git a/bindings/cpp/autom4te.cache/output.0 b/bindings/cpp/autom4te.cache/output.0 new file mode 100644 index 0000000..85b398f --- /dev/null +++ b/bindings/cpp/autom4te.cache/output.0 @@ -0,0 +1,19379 @@ +@%:@! /bin/sh +@%:@ Guess values for system-dependent variables and create Makefiles. +@%:@ Generated by GNU Autoconf 2.71 for PortAudioCpp 12. +@%:@ +@%:@ +@%:@ Copyright (C) 1992-1996, 1998-2017, 2020-2021 Free Software Foundation, +@%:@ Inc. +@%:@ +@%:@ +@%:@ This configure script is free software; the Free Software Foundation +@%:@ gives unlimited permission to copy, distribute and modify it. +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +as_nop=: +if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 +then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else $as_nop + case `(set -o) 2>/dev/null` in @%:@( + *posix*) : + set -o posix ;; @%:@( + *) : + ;; +esac +fi + + + +# Reset variables that may have inherited troublesome values from +# the environment. + +# IFS needs to be set, to space, tab, and newline, in precisely that order. +# (If _AS_PATH_WALK were called with IFS unset, it would have the +# side effect of setting IFS to empty, thus disabling word splitting.) +# Quoting is to prevent editors from complaining about space-tab. +as_nl=' +' +export as_nl +IFS=" "" $as_nl" + +PS1='$ ' +PS2='> ' +PS4='+ ' + +# Ensure predictable behavior from utilities with locale-dependent output. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# We cannot yet rely on "unset" to work, but we need these variables +# to be unset--not just set to an empty or harmless value--now, to +# avoid bugs in old shells (e.g. pre-3.0 UWIN ksh). This construct +# also avoids known problems related to "unset" and subshell syntax +# in other old shells (e.g. bash 2.01 and pdksh 5.2.14). +for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH +do eval test \${$as_var+y} \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done + +# Ensure that fds 0, 1, and 2 are open. +if (exec 3>&0) 2>/dev/null; then :; else exec 0&1) 2>/dev/null; then :; else exec 1>/dev/null; fi +if (exec 3>&2) ; then :; else exec 2>/dev/null; fi + +# The user is always right. +if ${PATH_SEPARATOR+false} :; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# Find who we are. Look in the path if we contain no directory separator. +as_myself= +case $0 in @%:@(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + test -r "$as_dir$0" && as_myself=$as_dir$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + + +# Use a proper internal environment variable to ensure we don't fall + # into an infinite loop, continuously re-executing ourselves. + if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then + _as_can_reexec=no; export _as_can_reexec; + # We cannot yet assume a decent shell, so we have to provide a +# neutralization value for shells without unset; and this also +# works around shells that cannot unset nonexistent variables. +# Preserve -v and -x to the replacement shell. +BASH_ENV=/dev/null +ENV=/dev/null +(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV +case $- in @%:@ (((( + *v*x* | *x*v* ) as_opts=-vx ;; + *v* ) as_opts=-v ;; + *x* ) as_opts=-x ;; + * ) as_opts= ;; +esac +exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} +# Admittedly, this is quite paranoid, since all the known shells bail +# out after a failed `exec'. +printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2 +exit 255 + fi + # We don't want this to propagate to other subprocesses. + { _as_can_reexec=; unset _as_can_reexec;} +if test "x$CONFIG_SHELL" = x; then + as_bourne_compatible="as_nop=: +if test \${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 +then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which + # is contrary to our usage. Disable this feature. + alias -g '\${1+\"\$@\"}'='\"\$@\"' + setopt NO_GLOB_SUBST +else \$as_nop + case \`(set -o) 2>/dev/null\` in @%:@( + *posix*) : + set -o posix ;; @%:@( + *) : + ;; +esac +fi +" + as_required="as_fn_return () { (exit \$1); } +as_fn_success () { as_fn_return 0; } +as_fn_failure () { as_fn_return 1; } +as_fn_ret_success () { return 0; } +as_fn_ret_failure () { return 1; } + +exitcode=0 +as_fn_success || { exitcode=1; echo as_fn_success failed.; } +as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } +as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } +as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } +if ( set x; as_fn_ret_success y && test x = \"\$1\" ) +then : + +else \$as_nop + exitcode=1; echo positional parameters were not saved. +fi +test x\$exitcode = x0 || exit 1 +blah=\$(echo \$(echo blah)) +test x\"\$blah\" = xblah || exit 1 +test -x / || exit 1" + as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO + as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO + eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && + test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 + + test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || ( + ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' + ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO + ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO + PATH=/empty FPATH=/empty; export PATH FPATH + test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\ + || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1 +test \$(( 1 + 1 )) = 2 || exit 1" + if (eval "$as_required") 2>/dev/null +then : + as_have_required=yes +else $as_nop + as_have_required=no +fi + if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null +then : + +else $as_nop + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +as_found=false +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + as_found=: + case $as_dir in @%:@( + /*) + for as_base in sh bash ksh sh5; do + # Try only shells that exist, to save several forks. + as_shell=$as_dir$as_base + if { test -f "$as_shell" || test -f "$as_shell.exe"; } && + as_run=a "$as_shell" -c "$as_bourne_compatible""$as_required" 2>/dev/null +then : + CONFIG_SHELL=$as_shell as_have_required=yes + if as_run=a "$as_shell" -c "$as_bourne_compatible""$as_suggested" 2>/dev/null +then : + break 2 +fi +fi + done;; + esac + as_found=false +done +IFS=$as_save_IFS +if $as_found +then : + +else $as_nop + if { test -f "$SHELL" || test -f "$SHELL.exe"; } && + as_run=a "$SHELL" -c "$as_bourne_compatible""$as_required" 2>/dev/null +then : + CONFIG_SHELL=$SHELL as_have_required=yes +fi +fi + + + if test "x$CONFIG_SHELL" != x +then : + export CONFIG_SHELL + # We cannot yet assume a decent shell, so we have to provide a +# neutralization value for shells without unset; and this also +# works around shells that cannot unset nonexistent variables. +# Preserve -v and -x to the replacement shell. +BASH_ENV=/dev/null +ENV=/dev/null +(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV +case $- in @%:@ (((( + *v*x* | *x*v* ) as_opts=-vx ;; + *v* ) as_opts=-v ;; + *x* ) as_opts=-x ;; + * ) as_opts= ;; +esac +exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} +# Admittedly, this is quite paranoid, since all the known shells bail +# out after a failed `exec'. +printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2 +exit 255 +fi + + if test x$as_have_required = xno +then : + printf "%s\n" "$0: This script requires a shell more modern than all" + printf "%s\n" "$0: the shells that I found on your system." + if test ${ZSH_VERSION+y} ; then + printf "%s\n" "$0: In particular, zsh $ZSH_VERSION has bugs and should" + printf "%s\n" "$0: be upgraded to zsh 4.3.4 or later." + else + printf "%s\n" "$0: Please tell bug-autoconf@gnu.org about your system, +$0: including any error possibly output before this +$0: message. Then install a modern shell, or manually run +$0: the script under such a shell if you do have one." + fi + exit 1 +fi +fi +fi +SHELL=${CONFIG_SHELL-/bin/sh} +export SHELL +# Unset more variables known to interfere with behavior of common tools. +CLICOLOR_FORCE= GREP_OPTIONS= +unset CLICOLOR_FORCE GREP_OPTIONS + +## --------------------- ## +## M4sh Shell Functions. ## +## --------------------- ## +@%:@ as_fn_unset VAR +@%:@ --------------- +@%:@ Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset + + +@%:@ as_fn_set_status STATUS +@%:@ ----------------------- +@%:@ Set @S|@? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} @%:@ as_fn_set_status + +@%:@ as_fn_exit STATUS +@%:@ ----------------- +@%:@ Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} @%:@ as_fn_exit +@%:@ as_fn_nop +@%:@ --------- +@%:@ Do nothing but, unlike ":", preserve the value of @S|@?. +as_fn_nop () +{ + return $? +} +as_nop=as_fn_nop + +@%:@ as_fn_mkdir_p +@%:@ ------------- +@%:@ Create "@S|@as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`printf "%s\n" "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +printf "%s\n" X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} @%:@ as_fn_mkdir_p + +@%:@ as_fn_executable_p FILE +@%:@ ----------------------- +@%:@ Test if FILE is an executable regular file. +as_fn_executable_p () +{ + test -f "$1" && test -x "$1" +} @%:@ as_fn_executable_p +@%:@ as_fn_append VAR VALUE +@%:@ ---------------------- +@%:@ Append the text in VALUE to the end of the definition contained in VAR. Take +@%:@ advantage of any shell optimizations that allow amortized linear growth over +@%:@ repeated appends, instead of the typical quadratic growth present in naive +@%:@ implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null +then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else $as_nop + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +@%:@ as_fn_arith ARG... +@%:@ ------------------ +@%:@ Perform arithmetic evaluation on the ARGs, and store the result in the +@%:@ global @S|@as_val. Take advantage of shells that can avoid forks. The arguments +@%:@ must be portable across @S|@(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null +then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else $as_nop + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + +@%:@ as_fn_nop +@%:@ --------- +@%:@ Do nothing but, unlike ":", preserve the value of @S|@?. +as_fn_nop () +{ + return $? +} +as_nop=as_fn_nop + +@%:@ as_fn_error STATUS ERROR [LINENO LOG_FD] +@%:@ ---------------------------------------- +@%:@ Output "`basename @S|@0`: error: ERROR" to stderr. If LINENO and LOG_FD are +@%:@ provided, also output the error to LOG_FD, referencing LINENO. Then exit the +@%:@ script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + printf "%s\n" "$as_me: error: $2" >&2 + as_fn_exit $as_status +} @%:@ as_fn_error + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +printf "%s\n" X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + + + as_lineno_1=$LINENO as_lineno_1a=$LINENO + as_lineno_2=$LINENO as_lineno_2a=$LINENO + eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && + test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { + # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) + sed -n ' + p + /[$]LINENO/= + ' <$as_myself | + sed ' + s/[$]LINENO.*/&-/ + t lineno + b + :lineno + N + :loop + s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ + t loop + s/-\n.*// + ' >$as_me.lineno && + chmod +x "$as_me.lineno" || + { printf "%s\n" "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } + + # If we had to re-execute with $CONFIG_SHELL, we're ensured to have + # already done that, so ensure we don't try to do so again and fall + # in an infinite loop. This has already happened in practice. + _as_can_reexec=no; export _as_can_reexec + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensitive to this). + . "./$as_me.lineno" + # Exit status is that of the last command. + exit +} + + +# Determine whether it's possible to make 'echo' print without a newline. +# These variables are no longer used directly by Autoconf, but are AC_SUBSTed +# for compatibility with existing Makefiles. +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in @%:@((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +# For backward compatibility with old third-party macros, we provide +# the shell variables $as_echo and $as_echo_n. New code should use +# AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively. +as_@&t@echo='printf %s\n' +as_@&t@echo_n='printf %s' + + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -pR'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -pR' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -pR' + fi +else + as_ln_s='cp -pR' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +as_test_x='test -x' +as_executable_p=as_fn_executable_p + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + +SHELL=${CONFIG_SHELL-/bin/sh} + + +test -n "$DJDIR" || exec 7<&0 &1 + +# Name of the host. +# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, +# so uname gets run too. +ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` + +# +# Initializations. +# +ac_default_prefix=/usr/local +ac_clean_files= +ac_config_libobj_dir=. +LIB@&t@OBJS= +cross_compiling=no +subdirs= +MFLAGS= +MAKEFLAGS= + +# Identity of this package. +PACKAGE_NAME='PortAudioCpp' +PACKAGE_TARNAME='portaudiocpp' +PACKAGE_VERSION='12' +PACKAGE_STRING='PortAudioCpp 12' +PACKAGE_BUGREPORT='' +PACKAGE_URL='' + +ac_unique_file="include/portaudiocpp/PortAudioCpp.hxx" +# Factoring default headers for most tests. +ac_includes_default="\ +#include +#ifdef HAVE_STDIO_H +# include +#endif +#ifdef HAVE_STDLIB_H +# include +#endif +#ifdef HAVE_STRING_H +# include +#endif +#ifdef HAVE_INTTYPES_H +# include +#endif +#ifdef HAVE_STDINT_H +# include +#endif +#ifdef HAVE_STRINGS_H +# include +#endif +#ifdef HAVE_SYS_TYPES_H +# include +#endif +#ifdef HAVE_SYS_STAT_H +# include +#endif +#ifdef HAVE_UNISTD_H +# include +#endif" + +ac_header_c_list= +ac_subst_vars='am__EXEEXT_FALSE +am__EXEEXT_TRUE +LTLIBOBJS +LIB@&t@OBJS +LT_VERSION_INFO +PORTAUDIO_ROOT +DEFAULT_INCLUDES +CXXCPP +LT_SYS_LIBRARY_PATH +OTOOL64 +OTOOL +LIPO +NMEDIT +DSYMUTIL +MANIFEST_TOOL +RANLIB +ac_ct_AR +AR +LN_S +NM +ac_ct_DUMPBIN +DUMPBIN +LD +FGREP +EGREP +GREP +SED +LIBTOOL +OBJDUMP +DLLTOOL +AS +host_os +host_vendor +host_cpu +host +build_os +build_vendor +build_cpu +build +am__fastdepCXX_FALSE +am__fastdepCXX_TRUE +CXXDEPMODE +ac_ct_CXX +CXXFLAGS +CXX +am__fastdepCC_FALSE +am__fastdepCC_TRUE +CCDEPMODE +am__nodep +AMDEPBACKSLASH +AMDEP_FALSE +AMDEP_TRUE +am__include +DEPDIR +OBJEXT +EXEEXT +ac_ct_CC +CPPFLAGS +LDFLAGS +CFLAGS +CC +MAINT +MAINTAINER_MODE_FALSE +MAINTAINER_MODE_TRUE +AM_BACKSLASH +AM_DEFAULT_VERBOSITY +AM_DEFAULT_V +AM_V +CSCOPE +ETAGS +CTAGS +am__untar +am__tar +AMTAR +am__leading_dot +SET_MAKE +AWK +mkdir_p +MKDIR_P +INSTALL_STRIP_PROGRAM +STRIP +install_sh +MAKEINFO +AUTOHEADER +AUTOMAKE +AUTOCONF +ACLOCAL +VERSION +PACKAGE +CYGPATH_W +am__isrc +INSTALL_DATA +INSTALL_SCRIPT +INSTALL_PROGRAM +target_alias +host_alias +build_alias +LIBS +ECHO_T +ECHO_N +ECHO_C +DEFS +mandir +localedir +libdir +psdir +pdfdir +dvidir +htmldir +infodir +docdir +oldincludedir +includedir +runstatedir +localstatedir +sharedstatedir +sysconfdir +datadir +datarootdir +libexecdir +sbindir +bindir +program_transform_name +prefix +exec_prefix +PACKAGE_URL +PACKAGE_BUGREPORT +PACKAGE_STRING +PACKAGE_VERSION +PACKAGE_TARNAME +PACKAGE_NAME +PATH_SEPARATOR +SHELL +am__quote' +ac_subst_files='' +ac_user_opts=' +enable_option_checking +enable_silent_rules +enable_maintainer_mode +enable_dependency_tracking +enable_shared +enable_static +with_pic +enable_fast_install +with_aix_soname +with_gnu_ld +with_sysroot +enable_libtool_lock +' + ac_precious_vars='build_alias +host_alias +target_alias +CC +CFLAGS +LDFLAGS +LIBS +CPPFLAGS +CXX +CXXFLAGS +CCC +LT_SYS_LIBRARY_PATH +CXXCPP' + + +# Initialize some variables set by options. +ac_init_help= +ac_init_version=false +ac_unrecognized_opts= +ac_unrecognized_sep= +# The variables have the same names as the options, with +# dashes changed to underlines. +cache_file=/dev/null +exec_prefix=NONE +no_create= +no_recursion= +prefix=NONE +program_prefix=NONE +program_suffix=NONE +program_transform_name=s,x,x, +silent= +site= +srcdir= +verbose= +x_includes=NONE +x_libraries=NONE + +# Installation directory options. +# These are left unexpanded so users can "make install exec_prefix=/foo" +# and all the variables that are supposed to be based on exec_prefix +# by default will actually change. +# Use braces instead of parens because sh, perl, etc. also accept them. +# (The list follows the same order as the GNU Coding Standards.) +bindir='${exec_prefix}/bin' +sbindir='${exec_prefix}/sbin' +libexecdir='${exec_prefix}/libexec' +datarootdir='${prefix}/share' +datadir='${datarootdir}' +sysconfdir='${prefix}/etc' +sharedstatedir='${prefix}/com' +localstatedir='${prefix}/var' +runstatedir='${localstatedir}/run' +includedir='${prefix}/include' +oldincludedir='/usr/include' +docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' +infodir='${datarootdir}/info' +htmldir='${docdir}' +dvidir='${docdir}' +pdfdir='${docdir}' +psdir='${docdir}' +libdir='${exec_prefix}/lib' +localedir='${datarootdir}/locale' +mandir='${datarootdir}/man' + +ac_prev= +ac_dashdash= +for ac_option +do + # If the previous option needs an argument, assign it. + if test -n "$ac_prev"; then + eval $ac_prev=\$ac_option + ac_prev= + continue + fi + + case $ac_option in + *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; + *=) ac_optarg= ;; + *) ac_optarg=yes ;; + esac + + case $ac_dashdash$ac_option in + --) + ac_dashdash=yes ;; + + -bindir | --bindir | --bindi | --bind | --bin | --bi) + ac_prev=bindir ;; + -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) + bindir=$ac_optarg ;; + + -build | --build | --buil | --bui | --bu) + ac_prev=build_alias ;; + -build=* | --build=* | --buil=* | --bui=* | --bu=*) + build_alias=$ac_optarg ;; + + -cache-file | --cache-file | --cache-fil | --cache-fi \ + | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) + ac_prev=cache_file ;; + -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ + | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) + cache_file=$ac_optarg ;; + + --config-cache | -C) + cache_file=config.cache ;; + + -datadir | --datadir | --datadi | --datad) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=*) + datadir=$ac_optarg ;; + + -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ + | --dataroo | --dataro | --datar) + ac_prev=datarootdir ;; + -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ + | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) + datarootdir=$ac_optarg ;; + + -disable-* | --disable-*) + ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid feature name: \`$ac_useropt'" + ac_useropt_orig=$ac_useropt + ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=no ;; + + -docdir | --docdir | --docdi | --doc | --do) + ac_prev=docdir ;; + -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) + docdir=$ac_optarg ;; + + -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) + ac_prev=dvidir ;; + -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) + dvidir=$ac_optarg ;; + + -enable-* | --enable-*) + ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid feature name: \`$ac_useropt'" + ac_useropt_orig=$ac_useropt + ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=\$ac_optarg ;; + + -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ + | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ + | --exec | --exe | --ex) + ac_prev=exec_prefix ;; + -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ + | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ + | --exec=* | --exe=* | --ex=*) + exec_prefix=$ac_optarg ;; + + -gas | --gas | --ga | --g) + # Obsolete; use --with-gas. + with_gas=yes ;; + + -help | --help | --hel | --he | -h) + ac_init_help=long ;; + -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) + ac_init_help=recursive ;; + -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) + ac_init_help=short ;; + + -host | --host | --hos | --ho) + ac_prev=host_alias ;; + -host=* | --host=* | --hos=* | --ho=*) + host_alias=$ac_optarg ;; + + -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) + ac_prev=htmldir ;; + -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ + | --ht=*) + htmldir=$ac_optarg ;; + + -includedir | --includedir | --includedi | --included | --include \ + | --includ | --inclu | --incl | --inc) + ac_prev=includedir ;; + -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ + | --includ=* | --inclu=* | --incl=* | --inc=*) + includedir=$ac_optarg ;; + + -infodir | --infodir | --infodi | --infod | --info | --inf) + ac_prev=infodir ;; + -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) + infodir=$ac_optarg ;; + + -libdir | --libdir | --libdi | --libd) + ac_prev=libdir ;; + -libdir=* | --libdir=* | --libdi=* | --libd=*) + libdir=$ac_optarg ;; + + -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ + | --libexe | --libex | --libe) + ac_prev=libexecdir ;; + -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ + | --libexe=* | --libex=* | --libe=*) + libexecdir=$ac_optarg ;; + + -localedir | --localedir | --localedi | --localed | --locale) + ac_prev=localedir ;; + -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) + localedir=$ac_optarg ;; + + -localstatedir | --localstatedir | --localstatedi | --localstated \ + | --localstate | --localstat | --localsta | --localst | --locals) + ac_prev=localstatedir ;; + -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ + | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) + localstatedir=$ac_optarg ;; + + -mandir | --mandir | --mandi | --mand | --man | --ma | --m) + ac_prev=mandir ;; + -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) + mandir=$ac_optarg ;; + + -nfp | --nfp | --nf) + # Obsolete; use --without-fp. + with_fp=no ;; + + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c | -n) + no_create=yes ;; + + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) + no_recursion=yes ;; + + -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ + | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ + | --oldin | --oldi | --old | --ol | --o) + ac_prev=oldincludedir ;; + -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ + | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ + | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) + oldincludedir=$ac_optarg ;; + + -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) + ac_prev=prefix ;; + -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) + prefix=$ac_optarg ;; + + -program-prefix | --program-prefix | --program-prefi | --program-pref \ + | --program-pre | --program-pr | --program-p) + ac_prev=program_prefix ;; + -program-prefix=* | --program-prefix=* | --program-prefi=* \ + | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) + program_prefix=$ac_optarg ;; + + -program-suffix | --program-suffix | --program-suffi | --program-suff \ + | --program-suf | --program-su | --program-s) + ac_prev=program_suffix ;; + -program-suffix=* | --program-suffix=* | --program-suffi=* \ + | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) + program_suffix=$ac_optarg ;; + + -program-transform-name | --program-transform-name \ + | --program-transform-nam | --program-transform-na \ + | --program-transform-n | --program-transform- \ + | --program-transform | --program-transfor \ + | --program-transfo | --program-transf \ + | --program-trans | --program-tran \ + | --progr-tra | --program-tr | --program-t) + ac_prev=program_transform_name ;; + -program-transform-name=* | --program-transform-name=* \ + | --program-transform-nam=* | --program-transform-na=* \ + | --program-transform-n=* | --program-transform-=* \ + | --program-transform=* | --program-transfor=* \ + | --program-transfo=* | --program-transf=* \ + | --program-trans=* | --program-tran=* \ + | --progr-tra=* | --program-tr=* | --program-t=*) + program_transform_name=$ac_optarg ;; + + -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) + ac_prev=pdfdir ;; + -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) + pdfdir=$ac_optarg ;; + + -psdir | --psdir | --psdi | --psd | --ps) + ac_prev=psdir ;; + -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) + psdir=$ac_optarg ;; + + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + silent=yes ;; + + -runstatedir | --runstatedir | --runstatedi | --runstated \ + | --runstate | --runstat | --runsta | --runst | --runs \ + | --run | --ru | --r) + ac_prev=runstatedir ;; + -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \ + | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \ + | --run=* | --ru=* | --r=*) + runstatedir=$ac_optarg ;; + + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) + ac_prev=sbindir ;; + -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ + | --sbi=* | --sb=*) + sbindir=$ac_optarg ;; + + -sharedstatedir | --sharedstatedir | --sharedstatedi \ + | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ + | --sharedst | --shareds | --shared | --share | --shar \ + | --sha | --sh) + ac_prev=sharedstatedir ;; + -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ + | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ + | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ + | --sha=* | --sh=*) + sharedstatedir=$ac_optarg ;; + + -site | --site | --sit) + ac_prev=site ;; + -site=* | --site=* | --sit=*) + site=$ac_optarg ;; + + -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) + ac_prev=srcdir ;; + -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) + srcdir=$ac_optarg ;; + + -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ + | --syscon | --sysco | --sysc | --sys | --sy) + ac_prev=sysconfdir ;; + -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ + | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) + sysconfdir=$ac_optarg ;; + + -target | --target | --targe | --targ | --tar | --ta | --t) + ac_prev=target_alias ;; + -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) + target_alias=$ac_optarg ;; + + -v | -verbose | --verbose | --verbos | --verbo | --verb) + verbose=yes ;; + + -version | --version | --versio | --versi | --vers | -V) + ac_init_version=: ;; + + -with-* | --with-*) + ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid package name: \`$ac_useropt'" + ac_useropt_orig=$ac_useropt + ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=\$ac_optarg ;; + + -without-* | --without-*) + ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid package name: \`$ac_useropt'" + ac_useropt_orig=$ac_useropt + ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=no ;; + + --x) + # Obsolete; use --with-x. + with_x=yes ;; + + -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ + | --x-incl | --x-inc | --x-in | --x-i) + ac_prev=x_includes ;; + -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ + | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) + x_includes=$ac_optarg ;; + + -x-libraries | --x-libraries | --x-librarie | --x-librari \ + | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) + ac_prev=x_libraries ;; + -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ + | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) + x_libraries=$ac_optarg ;; + + -*) as_fn_error $? "unrecognized option: \`$ac_option' +Try \`$0 --help' for more information" + ;; + + *=*) + ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` + # Reject names that are not valid shell variable names. + case $ac_envvar in #( + '' | [0-9]* | *[!_$as_cr_alnum]* ) + as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; + esac + eval $ac_envvar=\$ac_optarg + export $ac_envvar ;; + + *) + # FIXME: should be removed in autoconf 3.0. + printf "%s\n" "$as_me: WARNING: you should use --build, --host, --target" >&2 + expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && + printf "%s\n" "$as_me: WARNING: invalid host type: $ac_option" >&2 + : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" + ;; + + esac +done + +if test -n "$ac_prev"; then + ac_option=--`echo $ac_prev | sed 's/_/-/g'` + as_fn_error $? "missing argument to $ac_option" +fi + +if test -n "$ac_unrecognized_opts"; then + case $enable_option_checking in + no) ;; + fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; + *) printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; + esac +fi + +# Check all directory arguments for consistency. +for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ + datadir sysconfdir sharedstatedir localstatedir includedir \ + oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ + libdir localedir mandir runstatedir +do + eval ac_val=\$$ac_var + # Remove trailing slashes. + case $ac_val in + */ ) + ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` + eval $ac_var=\$ac_val;; + esac + # Be sure to have absolute directory names. + case $ac_val in + [\\/$]* | ?:[\\/]* ) continue;; + NONE | '' ) case $ac_var in *prefix ) continue;; esac;; + esac + as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" +done + +# There might be people who depend on the old broken behavior: `$host' +# used to hold the argument of --host etc. +# FIXME: To remove some day. +build=$build_alias +host=$host_alias +target=$target_alias + +# FIXME: To remove some day. +if test "x$host_alias" != x; then + if test "x$build_alias" = x; then + cross_compiling=maybe + elif test "x$build_alias" != "x$host_alias"; then + cross_compiling=yes + fi +fi + +ac_tool_prefix= +test -n "$host_alias" && ac_tool_prefix=$host_alias- + +test "$silent" = yes && exec 6>/dev/null + + +ac_pwd=`pwd` && test -n "$ac_pwd" && +ac_ls_di=`ls -di .` && +ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || + as_fn_error $? "working directory cannot be determined" +test "X$ac_ls_di" = "X$ac_pwd_ls_di" || + as_fn_error $? "pwd does not report name of working directory" + + +# Find the source files, if location was not specified. +if test -z "$srcdir"; then + ac_srcdir_defaulted=yes + # Try the directory containing this script, then the parent directory. + ac_confdir=`$as_dirname -- "$as_myself" || +$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_myself" : 'X\(//\)[^/]' \| \ + X"$as_myself" : 'X\(//\)$' \| \ + X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || +printf "%s\n" X"$as_myself" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + srcdir=$ac_confdir + if test ! -r "$srcdir/$ac_unique_file"; then + srcdir=.. + fi +else + ac_srcdir_defaulted=no +fi +if test ! -r "$srcdir/$ac_unique_file"; then + test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." + as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" +fi +ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" +ac_abs_confdir=`( + cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" + pwd)` +# When building in place, set srcdir=. +if test "$ac_abs_confdir" = "$ac_pwd"; then + srcdir=. +fi +# Remove unnecessary trailing slashes from srcdir. +# Double slashes in file names in object file debugging info +# mess up M-x gdb in Emacs. +case $srcdir in +*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; +esac +for ac_var in $ac_precious_vars; do + eval ac_env_${ac_var}_set=\${${ac_var}+set} + eval ac_env_${ac_var}_value=\$${ac_var} + eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} + eval ac_cv_env_${ac_var}_value=\$${ac_var} +done + +# +# Report the --help message. +# +if test "$ac_init_help" = "long"; then + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat <<_ACEOF +\`configure' configures PortAudioCpp 12 to adapt to many kinds of systems. + +Usage: $0 [OPTION]... [VAR=VALUE]... + +To assign environment variables (e.g., CC, CFLAGS...), specify them as +VAR=VALUE. See below for descriptions of some of the useful variables. + +Defaults for the options are specified in brackets. + +Configuration: + -h, --help display this help and exit + --help=short display options specific to this package + --help=recursive display the short help of all the included packages + -V, --version display version information and exit + -q, --quiet, --silent do not print \`checking ...' messages + --cache-file=FILE cache test results in FILE [disabled] + -C, --config-cache alias for \`--cache-file=config.cache' + -n, --no-create do not create output files + --srcdir=DIR find the sources in DIR [configure dir or \`..'] + +Installation directories: + --prefix=PREFIX install architecture-independent files in PREFIX + @<:@@S|@ac_default_prefix@:>@ + --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX + @<:@PREFIX@:>@ + +By default, \`make install' will install all the files in +\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify +an installation prefix other than \`$ac_default_prefix' using \`--prefix', +for instance \`--prefix=\$HOME'. + +For better control, use the options below. + +Fine tuning of the installation directories: + --bindir=DIR user executables [EPREFIX/bin] + --sbindir=DIR system admin executables [EPREFIX/sbin] + --libexecdir=DIR program executables [EPREFIX/libexec] + --sysconfdir=DIR read-only single-machine data [PREFIX/etc] + --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] + --localstatedir=DIR modifiable single-machine data [PREFIX/var] + --runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run] + --libdir=DIR object code libraries [EPREFIX/lib] + --includedir=DIR C header files [PREFIX/include] + --oldincludedir=DIR C header files for non-gcc [/usr/include] + --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] + --datadir=DIR read-only architecture-independent data [DATAROOTDIR] + --infodir=DIR info documentation [DATAROOTDIR/info] + --localedir=DIR locale-dependent data [DATAROOTDIR/locale] + --mandir=DIR man documentation [DATAROOTDIR/man] + --docdir=DIR documentation root @<:@DATAROOTDIR/doc/portaudiocpp@:>@ + --htmldir=DIR html documentation [DOCDIR] + --dvidir=DIR dvi documentation [DOCDIR] + --pdfdir=DIR pdf documentation [DOCDIR] + --psdir=DIR ps documentation [DOCDIR] +_ACEOF + + cat <<\_ACEOF + +Program names: + --program-prefix=PREFIX prepend PREFIX to installed program names + --program-suffix=SUFFIX append SUFFIX to installed program names + --program-transform-name=PROGRAM run sed PROGRAM on installed program names + +System types: + --build=BUILD configure for building on BUILD [guessed] + --host=HOST cross-compile to build programs to run on HOST [BUILD] +_ACEOF +fi + +if test -n "$ac_init_help"; then + case $ac_init_help in + short | recursive ) echo "Configuration of PortAudioCpp 12:";; + esac + cat <<\_ACEOF + +Optional Features: + --disable-option-checking ignore unrecognized --enable/--with options + --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --enable-silent-rules less verbose build output (undo: "make V=1") + --disable-silent-rules verbose build output (undo: "make V=0") + --enable-maintainer-mode + enable make rules and dependencies not useful (and + sometimes confusing) to the casual installer + --enable-dependency-tracking + do not reject slow dependency extractors + --disable-dependency-tracking + speeds up one-time build + --enable-shared@<:@=PKGS@:>@ build shared libraries @<:@default=yes@:>@ + --enable-static@<:@=PKGS@:>@ build static libraries @<:@default=yes@:>@ + --enable-fast-install@<:@=PKGS@:>@ + optimize for fast installation @<:@default=yes@:>@ + --disable-libtool-lock avoid locking (might break parallel builds) + +Optional Packages: + --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] + --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) + --with-pic@<:@=PKGS@:>@ try to use only PIC/non-PIC objects @<:@default=use + both@:>@ + --with-aix-soname=aix|svr4|both + shared library versioning (aka "SONAME") variant to + provide on AIX, @<:@default=aix@:>@. + --with-gnu-ld assume the C compiler uses GNU ld @<:@default=no@:>@ + --with-sysroot@<:@=DIR@:>@ Search for dependent libraries within DIR (or the + compiler's sysroot if not specified). + +Some influential environment variables: + CC C compiler command + CFLAGS C compiler flags + LDFLAGS linker flags, e.g. -L if you have libraries in a + nonstandard directory + LIBS libraries to pass to the linker, e.g. -l + CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if + you have headers in a nonstandard directory + CXX C++ compiler command + CXXFLAGS C++ compiler flags + LT_SYS_LIBRARY_PATH + User-defined run-time library search path. + CXXCPP C++ preprocessor + +Use these variables to override the choices made by `configure' or to help +it to find libraries and programs with nonstandard names/locations. + +Report bugs to the package provider. +_ACEOF +ac_status=$? +fi + +if test "$ac_init_help" = "recursive"; then + # If there are subdirs, report their specific --help. + for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue + test -d "$ac_dir" || + { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || + continue + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + cd "$ac_dir" || { ac_status=$?; continue; } + # Check for configure.gnu first; this name is used for a wrapper for + # Metaconfig's "Configure" on case-insensitive file systems. + if test -f "$ac_srcdir/configure.gnu"; then + echo && + $SHELL "$ac_srcdir/configure.gnu" --help=recursive + elif test -f "$ac_srcdir/configure"; then + echo && + $SHELL "$ac_srcdir/configure" --help=recursive + else + printf "%s\n" "$as_me: WARNING: no configuration information is in $ac_dir" >&2 + fi || ac_status=$? + cd "$ac_pwd" || { ac_status=$?; break; } + done +fi + +test -n "$ac_init_help" && exit $ac_status +if $ac_init_version; then + cat <<\_ACEOF +PortAudioCpp configure 12 +generated by GNU Autoconf 2.71 + +Copyright (C) 2021 Free Software Foundation, Inc. +This configure script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it. +_ACEOF + exit +fi + +## ------------------------ ## +## Autoconf initialization. ## +## ------------------------ ## + +@%:@ ac_fn_c_try_compile LINENO +@%:@ -------------------------- +@%:@ Try to compile conftest.@S|@ac_ext, and return whether this succeeded. +ac_fn_c_try_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext conftest.beam + if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext +then : + ac_retval=0 +else $as_nop + printf "%s\n" "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} @%:@ ac_fn_c_try_compile + +@%:@ ac_fn_cxx_try_compile LINENO +@%:@ ---------------------------- +@%:@ Try to compile conftest.@S|@ac_ext, and return whether this succeeded. +ac_fn_cxx_try_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext conftest.beam + if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext +then : + ac_retval=0 +else $as_nop + printf "%s\n" "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} @%:@ ac_fn_cxx_try_compile + +@%:@ ac_fn_c_try_link LINENO +@%:@ ----------------------- +@%:@ Try to link conftest.@S|@ac_ext, and return whether this succeeded. +ac_fn_c_try_link () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext conftest.beam conftest$ac_exeext + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + test -x conftest$ac_exeext + } +then : + ac_retval=0 +else $as_nop + printf "%s\n" "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information + # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would + # interfere with the next link command; also delete a directory that is + # left behind by Apple's compiler. We do this before executing the actions. + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} @%:@ ac_fn_c_try_link + +@%:@ ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES +@%:@ ------------------------------------------------------- +@%:@ Tests whether HEADER exists and can be compiled using the include files in +@%:@ INCLUDES, setting the cache variable VAR accordingly. +ac_fn_c_check_header_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +printf %s "checking for $2... " >&6; } +if eval test \${$3+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +@%:@include <$2> +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + eval "$3=yes" +else $as_nop + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +eval ac_res=\$$3 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} @%:@ ac_fn_c_check_header_compile + +@%:@ ac_fn_c_check_func LINENO FUNC VAR +@%:@ ---------------------------------- +@%:@ Tests whether FUNC exists, setting the cache variable VAR accordingly +ac_fn_c_check_func () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +printf %s "checking for $2... " >&6; } +if eval test \${$3+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +/* Define $2 to an innocuous variant, in case declares $2. + For example, HP-UX 11i declares gettimeofday. */ +#define $2 innocuous_$2 + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $2 (); below. */ + +#include +#undef $2 + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $2 (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$2 || defined __stub___$2 +choke me +#endif + +int +main (void) +{ +return $2 (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + eval "$3=yes" +else $as_nop + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +fi +eval ac_res=\$$3 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} @%:@ ac_fn_c_check_func + +@%:@ ac_fn_cxx_try_cpp LINENO +@%:@ ------------------------ +@%:@ Try to preprocess conftest.@S|@ac_ext, and return whether this succeeded. +ac_fn_cxx_try_cpp () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } > conftest.i && { + test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || + test ! -s conftest.err + } +then : + ac_retval=0 +else $as_nop + printf "%s\n" "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} @%:@ ac_fn_cxx_try_cpp + +@%:@ ac_fn_cxx_try_link LINENO +@%:@ ------------------------- +@%:@ Try to link conftest.@S|@ac_ext, and return whether this succeeded. +ac_fn_cxx_try_link () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext conftest.beam conftest$ac_exeext + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + test -x conftest$ac_exeext + } +then : + ac_retval=0 +else $as_nop + printf "%s\n" "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information + # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would + # interfere with the next link command; also delete a directory that is + # left behind by Apple's compiler. We do this before executing the actions. + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} @%:@ ac_fn_cxx_try_link +ac_configure_args_raw= +for ac_arg +do + case $ac_arg in + *\'*) + ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + as_fn_append ac_configure_args_raw " '$ac_arg'" +done + +case $ac_configure_args_raw in + *$as_nl*) + ac_safe_unquote= ;; + *) + ac_unsafe_z='|&;<>()$`\\"*?@<:@ '' ' # This string ends in space, tab. + ac_unsafe_a="$ac_unsafe_z#~" + ac_safe_unquote="s/ '\\([^$ac_unsafe_a][^$ac_unsafe_z]*\\)'/ \\1/g" + ac_configure_args_raw=` printf "%s\n" "$ac_configure_args_raw" | sed "$ac_safe_unquote"`;; +esac + +cat >config.log <<_ACEOF +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. + +It was created by PortAudioCpp $as_me 12, which was +generated by GNU Autoconf 2.71. Invocation command line was + + $ $0$ac_configure_args_raw + +_ACEOF +exec 5>>config.log +{ +cat <<_ASUNAME +## --------- ## +## Platform. ## +## --------- ## + +hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` + +/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` +/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` +/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` +/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` + +_ASUNAME + +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + printf "%s\n" "PATH: $as_dir" + done +IFS=$as_save_IFS + +} >&5 + +cat >&5 <<_ACEOF + + +## ----------- ## +## Core tests. ## +## ----------- ## + +_ACEOF + + +# Keep a trace of the command line. +# Strip out --no-create and --no-recursion so they do not pile up. +# Strip out --silent because we don't want to record it for future runs. +# Also quote any args containing shell meta-characters. +# Make two passes to allow for proper duplicate-argument suppression. +ac_configure_args= +ac_configure_args0= +ac_configure_args1= +ac_must_keep_next=false +for ac_pass in 1 2 +do + for ac_arg + do + case $ac_arg in + -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + continue ;; + *\'*) + ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + case $ac_pass in + 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; + 2) + as_fn_append ac_configure_args1 " '$ac_arg'" + if test $ac_must_keep_next = true; then + ac_must_keep_next=false # Got value, back to normal. + else + case $ac_arg in + *=* | --config-cache | -C | -disable-* | --disable-* \ + | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ + | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ + | -with-* | --with-* | -without-* | --without-* | --x) + case "$ac_configure_args0 " in + "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; + esac + ;; + -* ) ac_must_keep_next=true ;; + esac + fi + as_fn_append ac_configure_args " '$ac_arg'" + ;; + esac + done +done +{ ac_configure_args0=; unset ac_configure_args0;} +{ ac_configure_args1=; unset ac_configure_args1;} + +# When interrupted or exit'd, cleanup temporary files, and complete +# config.log. We remove comments because anyway the quotes in there +# would cause problems or look ugly. +# WARNING: Use '\'' to represent an apostrophe within the trap. +# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. +trap 'exit_status=$? + # Sanitize IFS. + IFS=" "" $as_nl" + # Save into config.log some information that might help in debugging. + { + echo + + printf "%s\n" "## ---------------- ## +## Cache variables. ## +## ---------------- ##" + echo + # The following way of writing the cache mishandles newlines in values, +( + for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + (set) 2>&1 | + case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + sed -n \ + "s/'\''/'\''\\\\'\'''\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" + ;; #( + *) + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) + echo + + printf "%s\n" "## ----------------- ## +## Output variables. ## +## ----------------- ##" + echo + for ac_var in $ac_subst_vars + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + printf "%s\n" "$ac_var='\''$ac_val'\''" + done | sort + echo + + if test -n "$ac_subst_files"; then + printf "%s\n" "## ------------------- ## +## File substitutions. ## +## ------------------- ##" + echo + for ac_var in $ac_subst_files + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + printf "%s\n" "$ac_var='\''$ac_val'\''" + done | sort + echo + fi + + if test -s confdefs.h; then + printf "%s\n" "## ----------- ## +## confdefs.h. ## +## ----------- ##" + echo + cat confdefs.h + echo + fi + test "$ac_signal" != 0 && + printf "%s\n" "$as_me: caught signal $ac_signal" + printf "%s\n" "$as_me: exit $exit_status" + } >&5 + rm -f core *.core core.conftest.* && + rm -f -r conftest* confdefs* conf$$* $ac_clean_files && + exit $exit_status +' 0 +for ac_signal in 1 2 13 15; do + trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal +done +ac_signal=0 + +# confdefs.h avoids OS command line length limits that DEFS can exceed. +rm -f -r conftest* confdefs.h + +printf "%s\n" "/* confdefs.h */" > confdefs.h + +# Predefined preprocessor variables. + +printf "%s\n" "@%:@define PACKAGE_NAME \"$PACKAGE_NAME\"" >>confdefs.h + +printf "%s\n" "@%:@define PACKAGE_TARNAME \"$PACKAGE_TARNAME\"" >>confdefs.h + +printf "%s\n" "@%:@define PACKAGE_VERSION \"$PACKAGE_VERSION\"" >>confdefs.h + +printf "%s\n" "@%:@define PACKAGE_STRING \"$PACKAGE_STRING\"" >>confdefs.h + +printf "%s\n" "@%:@define PACKAGE_BUGREPORT \"$PACKAGE_BUGREPORT\"" >>confdefs.h + +printf "%s\n" "@%:@define PACKAGE_URL \"$PACKAGE_URL\"" >>confdefs.h + + +# Let the site file select an alternate cache file if it wants to. +# Prefer an explicitly selected file to automatically selected ones. +if test -n "$CONFIG_SITE"; then + ac_site_files="$CONFIG_SITE" +elif test "x$prefix" != xNONE; then + ac_site_files="$prefix/share/config.site $prefix/etc/config.site" +else + ac_site_files="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" +fi + +for ac_site_file in $ac_site_files +do + case $ac_site_file in @%:@( + */*) : + ;; @%:@( + *) : + ac_site_file=./$ac_site_file ;; +esac + if test -f "$ac_site_file" && test -r "$ac_site_file"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 +printf "%s\n" "$as_me: loading site script $ac_site_file" >&6;} + sed 's/^/| /' "$ac_site_file" >&5 + . "$ac_site_file" \ + || { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "failed to load site script $ac_site_file +See \`config.log' for more details" "$LINENO" 5; } + fi +done + +if test -r "$cache_file"; then + # Some versions of bash will fail to source /dev/null (special files + # actually), so we avoid doing that. DJGPP emulates it as a regular file. + if test /dev/null != "$cache_file" && test -f "$cache_file"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 +printf "%s\n" "$as_me: loading cache $cache_file" >&6;} + case $cache_file in + [\\/]* | ?:[\\/]* ) . "$cache_file";; + *) . "./$cache_file";; + esac + fi +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 +printf "%s\n" "$as_me: creating cache $cache_file" >&6;} + >$cache_file +fi + +# Test code for whether the C compiler supports C89 (global declarations) +ac_c_conftest_c89_globals=' +/* Does the compiler advertise C89 conformance? + Do not test the value of __STDC__, because some compilers set it to 0 + while being otherwise adequately conformant. */ +#if !defined __STDC__ +# error "Compiler does not advertise C89 conformance" +#endif + +#include +#include +struct stat; +/* Most of the following tests are stolen from RCS 5.7 src/conf.sh. */ +struct buf { int x; }; +struct buf * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} + +/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has + function prototypes and stuff, but not \xHH hex character constants. + These do not provoke an error unfortunately, instead are silently treated + as an "x". The following induces an error, until -std is added to get + proper ANSI mode. Curiously \x00 != x always comes out true, for an + array size at least. It is necessary to write \x00 == 0 to get something + that is true only with -std. */ +int osf4_cc_array ['\''\x00'\'' == 0 ? 1 : -1]; + +/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters + inside strings and character constants. */ +#define FOO(x) '\''x'\'' +int xlc6_cc_array[FOO(a) == '\''x'\'' ? 1 : -1]; + +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, int *(*)(struct buf *, struct stat *, int), + int, int);' + +# Test code for whether the C compiler supports C89 (body of main). +ac_c_conftest_c89_main=' +ok |= (argc == 0 || f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]); +' + +# Test code for whether the C compiler supports C99 (global declarations) +ac_c_conftest_c99_globals=' +// Does the compiler advertise C99 conformance? +#if !defined __STDC_VERSION__ || __STDC_VERSION__ < 199901L +# error "Compiler does not advertise C99 conformance" +#endif + +#include +extern int puts (const char *); +extern int printf (const char *, ...); +extern int dprintf (int, const char *, ...); +extern void *malloc (size_t); + +// Check varargs macros. These examples are taken from C99 6.10.3.5. +// dprintf is used instead of fprintf to avoid needing to declare +// FILE and stderr. +#define debug(...) dprintf (2, __VA_ARGS__) +#define showlist(...) puts (#__VA_ARGS__) +#define report(test,...) ((test) ? puts (#test) : printf (__VA_ARGS__)) +static void +test_varargs_macros (void) +{ + int x = 1234; + int y = 5678; + debug ("Flag"); + debug ("X = %d\n", x); + showlist (The first, second, and third items.); + report (x>y, "x is %d but y is %d", x, y); +} + +// Check long long types. +#define BIG64 18446744073709551615ull +#define BIG32 4294967295ul +#define BIG_OK (BIG64 / BIG32 == 4294967297ull && BIG64 % BIG32 == 0) +#if !BIG_OK + #error "your preprocessor is broken" +#endif +#if BIG_OK +#else + #error "your preprocessor is broken" +#endif +static long long int bignum = -9223372036854775807LL; +static unsigned long long int ubignum = BIG64; + +struct incomplete_array +{ + int datasize; + double data[]; +}; + +struct named_init { + int number; + const wchar_t *name; + double average; +}; + +typedef const char *ccp; + +static inline int +test_restrict (ccp restrict text) +{ + // See if C++-style comments work. + // Iterate through items via the restricted pointer. + // Also check for declarations in for loops. + for (unsigned int i = 0; *(text+i) != '\''\0'\''; ++i) + continue; + return 0; +} + +// Check varargs and va_copy. +static bool +test_varargs (const char *format, ...) +{ + va_list args; + va_start (args, format); + va_list args_copy; + va_copy (args_copy, args); + + const char *str = ""; + int number = 0; + float fnumber = 0; + + while (*format) + { + switch (*format++) + { + case '\''s'\'': // string + str = va_arg (args_copy, const char *); + break; + case '\''d'\'': // int + number = va_arg (args_copy, int); + break; + case '\''f'\'': // float + fnumber = va_arg (args_copy, double); + break; + default: + break; + } + } + va_end (args_copy); + va_end (args); + + return *str && number && fnumber; +} +' + +# Test code for whether the C compiler supports C99 (body of main). +ac_c_conftest_c99_main=' + // Check bool. + _Bool success = false; + success |= (argc != 0); + + // Check restrict. + if (test_restrict ("String literal") == 0) + success = true; + char *restrict newvar = "Another string"; + + // Check varargs. + success &= test_varargs ("s, d'\'' f .", "string", 65, 34.234); + test_varargs_macros (); + + // Check flexible array members. + struct incomplete_array *ia = + malloc (sizeof (struct incomplete_array) + (sizeof (double) * 10)); + ia->datasize = 10; + for (int i = 0; i < ia->datasize; ++i) + ia->data[i] = i * 1.234; + + // Check named initializers. + struct named_init ni = { + .number = 34, + .name = L"Test wide string", + .average = 543.34343, + }; + + ni.number = 58; + + int dynamic_array[ni.number]; + dynamic_array[0] = argv[0][0]; + dynamic_array[ni.number - 1] = 543; + + // work around unused variable warnings + ok |= (!success || bignum == 0LL || ubignum == 0uLL || newvar[0] == '\''x'\'' + || dynamic_array[ni.number - 1] != 543); +' + +# Test code for whether the C compiler supports C11 (global declarations) +ac_c_conftest_c11_globals=' +// Does the compiler advertise C11 conformance? +#if !defined __STDC_VERSION__ || __STDC_VERSION__ < 201112L +# error "Compiler does not advertise C11 conformance" +#endif + +// Check _Alignas. +char _Alignas (double) aligned_as_double; +char _Alignas (0) no_special_alignment; +extern char aligned_as_int; +char _Alignas (0) _Alignas (int) aligned_as_int; + +// Check _Alignof. +enum +{ + int_alignment = _Alignof (int), + int_array_alignment = _Alignof (int[100]), + char_alignment = _Alignof (char) +}; +_Static_assert (0 < -_Alignof (int), "_Alignof is signed"); + +// Check _Noreturn. +int _Noreturn does_not_return (void) { for (;;) continue; } + +// Check _Static_assert. +struct test_static_assert +{ + int x; + _Static_assert (sizeof (int) <= sizeof (long int), + "_Static_assert does not work in struct"); + long int y; +}; + +// Check UTF-8 literals. +#define u8 syntax error! +char const utf8_literal[] = u8"happens to be ASCII" "another string"; + +// Check duplicate typedefs. +typedef long *long_ptr; +typedef long int *long_ptr; +typedef long_ptr long_ptr; + +// Anonymous structures and unions -- taken from C11 6.7.2.1 Example 1. +struct anonymous +{ + union { + struct { int i; int j; }; + struct { int k; long int l; } w; + }; + int m; +} v1; +' + +# Test code for whether the C compiler supports C11 (body of main). +ac_c_conftest_c11_main=' + _Static_assert ((offsetof (struct anonymous, i) + == offsetof (struct anonymous, w.k)), + "Anonymous union alignment botch"); + v1.i = 2; + v1.w.k = 5; + ok |= v1.i != 5; +' + +# Test code for whether the C compiler supports C11 (complete). +ac_c_conftest_c11_program="${ac_c_conftest_c89_globals} +${ac_c_conftest_c99_globals} +${ac_c_conftest_c11_globals} + +int +main (int argc, char **argv) +{ + int ok = 0; + ${ac_c_conftest_c89_main} + ${ac_c_conftest_c99_main} + ${ac_c_conftest_c11_main} + return ok; +} +" + +# Test code for whether the C compiler supports C99 (complete). +ac_c_conftest_c99_program="${ac_c_conftest_c89_globals} +${ac_c_conftest_c99_globals} + +int +main (int argc, char **argv) +{ + int ok = 0; + ${ac_c_conftest_c89_main} + ${ac_c_conftest_c99_main} + return ok; +} +" + +# Test code for whether the C compiler supports C89 (complete). +ac_c_conftest_c89_program="${ac_c_conftest_c89_globals} + +int +main (int argc, char **argv) +{ + int ok = 0; + ${ac_c_conftest_c89_main} + return ok; +} +" + +# Test code for whether the C++ compiler supports C++98 (global declarations) +ac_cxx_conftest_cxx98_globals=' +// Does the compiler advertise C++98 conformance? +#if !defined __cplusplus || __cplusplus < 199711L +# error "Compiler does not advertise C++98 conformance" +#endif + +// These inclusions are to reject old compilers that +// lack the unsuffixed header files. +#include +#include + +// and are *not* freestanding headers in C++98. +extern void assert (int); +namespace std { + extern int strcmp (const char *, const char *); +} + +// Namespaces, exceptions, and templates were all added after "C++ 2.0". +using std::exception; +using std::strcmp; + +namespace { + +void test_exception_syntax() +{ + try { + throw "test"; + } catch (const char *s) { + // Extra parentheses suppress a warning when building autoconf itself, + // due to lint rules shared with more typical C programs. + assert (!(strcmp) (s, "test")); + } +} + +template struct test_template +{ + T const val; + explicit test_template(T t) : val(t) {} + template T add(U u) { return static_cast(u) + val; } +}; + +} // anonymous namespace +' + +# Test code for whether the C++ compiler supports C++98 (body of main) +ac_cxx_conftest_cxx98_main=' + assert (argc); + assert (! argv[0]); +{ + test_exception_syntax (); + test_template tt (2.0); + assert (tt.add (4) == 6.0); + assert (true && !false); +} +' + +# Test code for whether the C++ compiler supports C++11 (global declarations) +ac_cxx_conftest_cxx11_globals=' +// Does the compiler advertise C++ 2011 conformance? +#if !defined __cplusplus || __cplusplus < 201103L +# error "Compiler does not advertise C++11 conformance" +#endif + +namespace cxx11test +{ + constexpr int get_val() { return 20; } + + struct testinit + { + int i; + double d; + }; + + class delegate + { + public: + delegate(int n) : n(n) {} + delegate(): delegate(2354) {} + + virtual int getval() { return this->n; }; + protected: + int n; + }; + + class overridden : public delegate + { + public: + overridden(int n): delegate(n) {} + virtual int getval() override final { return this->n * 2; } + }; + + class nocopy + { + public: + nocopy(int i): i(i) {} + nocopy() = default; + nocopy(const nocopy&) = delete; + nocopy & operator=(const nocopy&) = delete; + private: + int i; + }; + + // for testing lambda expressions + template Ret eval(Fn f, Ret v) + { + return f(v); + } + + // for testing variadic templates and trailing return types + template auto sum(V first) -> V + { + return first; + } + template auto sum(V first, Args... rest) -> V + { + return first + sum(rest...); + } +} +' + +# Test code for whether the C++ compiler supports C++11 (body of main) +ac_cxx_conftest_cxx11_main=' +{ + // Test auto and decltype + auto a1 = 6538; + auto a2 = 48573953.4; + auto a3 = "String literal"; + + int total = 0; + for (auto i = a3; *i; ++i) { total += *i; } + + decltype(a2) a4 = 34895.034; +} +{ + // Test constexpr + short sa[cxx11test::get_val()] = { 0 }; +} +{ + // Test initializer lists + cxx11test::testinit il = { 4323, 435234.23544 }; +} +{ + // Test range-based for + int array[] = {9, 7, 13, 15, 4, 18, 12, 10, 5, 3, + 14, 19, 17, 8, 6, 20, 16, 2, 11, 1}; + for (auto &x : array) { x += 23; } +} +{ + // Test lambda expressions + using cxx11test::eval; + assert (eval ([](int x) { return x*2; }, 21) == 42); + double d = 2.0; + assert (eval ([&](double x) { return d += x; }, 3.0) == 5.0); + assert (d == 5.0); + assert (eval ([=](double x) mutable { return d += x; }, 4.0) == 9.0); + assert (d == 5.0); +} +{ + // Test use of variadic templates + using cxx11test::sum; + auto a = sum(1); + auto b = sum(1, 2); + auto c = sum(1.0, 2.0, 3.0); +} +{ + // Test constructor delegation + cxx11test::delegate d1; + cxx11test::delegate d2(); + cxx11test::delegate d3(45); +} +{ + // Test override and final + cxx11test::overridden o1(55464); +} +{ + // Test nullptr + char *c = nullptr; +} +{ + // Test template brackets + test_template<::test_template> v(test_template(12)); +} +{ + // Unicode literals + char const *utf8 = u8"UTF-8 string \u2500"; + char16_t const *utf16 = u"UTF-8 string \u2500"; + char32_t const *utf32 = U"UTF-32 string \u2500"; +} +' + +# Test code for whether the C compiler supports C++11 (complete). +ac_cxx_conftest_cxx11_program="${ac_cxx_conftest_cxx98_globals} +${ac_cxx_conftest_cxx11_globals} + +int +main (int argc, char **argv) +{ + int ok = 0; + ${ac_cxx_conftest_cxx98_main} + ${ac_cxx_conftest_cxx11_main} + return ok; +} +" + +# Test code for whether the C compiler supports C++98 (complete). +ac_cxx_conftest_cxx98_program="${ac_cxx_conftest_cxx98_globals} +int +main (int argc, char **argv) +{ + int ok = 0; + ${ac_cxx_conftest_cxx98_main} + return ok; +} +" + +as_fn_append ac_header_c_list " stdio.h stdio_h HAVE_STDIO_H" +as_fn_append ac_header_c_list " stdlib.h stdlib_h HAVE_STDLIB_H" +as_fn_append ac_header_c_list " string.h string_h HAVE_STRING_H" +as_fn_append ac_header_c_list " inttypes.h inttypes_h HAVE_INTTYPES_H" +as_fn_append ac_header_c_list " stdint.h stdint_h HAVE_STDINT_H" +as_fn_append ac_header_c_list " strings.h strings_h HAVE_STRINGS_H" +as_fn_append ac_header_c_list " sys/stat.h sys_stat_h HAVE_SYS_STAT_H" +as_fn_append ac_header_c_list " sys/types.h sys_types_h HAVE_SYS_TYPES_H" +as_fn_append ac_header_c_list " unistd.h unistd_h HAVE_UNISTD_H" + +# Auxiliary files required by this configure script. +ac_aux_files="ltmain.sh config.guess config.sub compile missing install-sh" + +# Locations in which to look for auxiliary files. +ac_aux_dir_candidates="${srcdir}${PATH_SEPARATOR}${srcdir}/..${PATH_SEPARATOR}${srcdir}/../.." + +# Search for a directory containing all of the required auxiliary files, +# $ac_aux_files, from the $PATH-style list $ac_aux_dir_candidates. +# If we don't find one directory that contains all the files we need, +# we report the set of missing files from the *first* directory in +# $ac_aux_dir_candidates and give up. +ac_missing_aux_files="" +ac_first_candidate=: +printf "%s\n" "$as_me:${as_lineno-$LINENO}: looking for aux files: $ac_aux_files" >&5 +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +as_found=false +for as_dir in $ac_aux_dir_candidates +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + as_found=: + + printf "%s\n" "$as_me:${as_lineno-$LINENO}: trying $as_dir" >&5 + ac_aux_dir_found=yes + ac_install_sh= + for ac_aux in $ac_aux_files + do + # As a special case, if "install-sh" is required, that requirement + # can be satisfied by any of "install-sh", "install.sh", or "shtool", + # and $ac_install_sh is set appropriately for whichever one is found. + if test x"$ac_aux" = x"install-sh" + then + if test -f "${as_dir}install-sh"; then + printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}install-sh found" >&5 + ac_install_sh="${as_dir}install-sh -c" + elif test -f "${as_dir}install.sh"; then + printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}install.sh found" >&5 + ac_install_sh="${as_dir}install.sh -c" + elif test -f "${as_dir}shtool"; then + printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}shtool found" >&5 + ac_install_sh="${as_dir}shtool install -c" + else + ac_aux_dir_found=no + if $ac_first_candidate; then + ac_missing_aux_files="${ac_missing_aux_files} install-sh" + else + break + fi + fi + else + if test -f "${as_dir}${ac_aux}"; then + printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}${ac_aux} found" >&5 + else + ac_aux_dir_found=no + if $ac_first_candidate; then + ac_missing_aux_files="${ac_missing_aux_files} ${ac_aux}" + else + break + fi + fi + fi + done + if test "$ac_aux_dir_found" = yes; then + ac_aux_dir="$as_dir" + break + fi + ac_first_candidate=false + + as_found=false +done +IFS=$as_save_IFS +if $as_found +then : + +else $as_nop + as_fn_error $? "cannot find required auxiliary files:$ac_missing_aux_files" "$LINENO" 5 +fi + + +# These three variables are undocumented and unsupported, +# and are intended to be withdrawn in a future Autoconf release. +# They can cause serious problems if a builder's source tree is in a directory +# whose full name contains unusual characters. +if test -f "${ac_aux_dir}config.guess"; then + ac_@&t@config_guess="$SHELL ${ac_aux_dir}config.guess" +fi +if test -f "${ac_aux_dir}config.sub"; then + ac_@&t@config_sub="$SHELL ${ac_aux_dir}config.sub" +fi +if test -f "$ac_aux_dir/configure"; then + ac_@&t@configure="$SHELL ${ac_aux_dir}configure" +fi + +# Check that the precious variables saved in the cache have kept the same +# value. +ac_cache_corrupted=false +for ac_var in $ac_precious_vars; do + eval ac_old_set=\$ac_cv_env_${ac_var}_set + eval ac_new_set=\$ac_env_${ac_var}_set + eval ac_old_val=\$ac_cv_env_${ac_var}_value + eval ac_new_val=\$ac_env_${ac_var}_value + case $ac_old_set,$ac_new_set in + set,) + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 +printf "%s\n" "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,set) + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 +printf "%s\n" "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,);; + *) + if test "x$ac_old_val" != "x$ac_new_val"; then + # differences in whitespace do not lead to failure. + ac_old_val_w=`echo x $ac_old_val` + ac_new_val_w=`echo x $ac_new_val` + if test "$ac_old_val_w" != "$ac_new_val_w"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 +printf "%s\n" "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} + ac_cache_corrupted=: + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 +printf "%s\n" "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} + eval $ac_var=\$ac_old_val + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 +printf "%s\n" "$as_me: former value: \`$ac_old_val'" >&2;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 +printf "%s\n" "$as_me: current value: \`$ac_new_val'" >&2;} + fi;; + esac + # Pass precious variables to config.status. + if test "$ac_new_set" = set; then + case $ac_new_val in + *\'*) ac_arg=$ac_var=`printf "%s\n" "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; + *) ac_arg=$ac_var=$ac_new_val ;; + esac + case " $ac_configure_args " in + *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. + *) as_fn_append ac_configure_args " '$ac_arg'" ;; + esac + fi +done +if $ac_cache_corrupted; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 +printf "%s\n" "$as_me: error: changes in the environment can compromise the build" >&2;} + as_fn_error $? "run \`${MAKE-make} distclean' and/or \`rm $cache_file' + and start over" "$LINENO" 5 +fi +## -------------------- ## +## Main body of script. ## +## -------------------- ## + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + +am__api_version='1.16' + + + + # Find a good install program. We prefer a C program (faster), +# so one script is as good as another. But avoid the broken or +# incompatible versions: +# SysV /etc/install, /usr/sbin/install +# SunOS /usr/etc/install +# IRIX /sbin/install +# AIX /bin/install +# AmigaOS /C/install, which installs bootblocks on floppy discs +# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag +# AFS /usr/afsws/bin/install, which mishandles nonexistent args +# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" +# OS/2's system install, which has a completely different semantic +# ./install, which can be erroneously created by make from ./install.sh. +# Reject install programs that cannot install multiple files. +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 +printf %s "checking for a BSD-compatible install... " >&6; } +if test -z "$INSTALL"; then +if test ${ac_cv_path_install+y} +then : + printf %s "(cached) " >&6 +else $as_nop + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + # Account for fact that we put trailing slashes in our PATH walk. +case $as_dir in @%:@(( + ./ | /[cC]/* | \ + /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ + ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ + /usr/ucb/* ) ;; + *) + # OSF1 and SCO ODT 3.0 have their own names for install. + # Don't use installbsd from OSF since it installs stuff as root + # by default. + for ac_prog in ginstall scoinst install; do + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_prog$ac_exec_ext"; then + if test $ac_prog = install && + grep dspmsg "$as_dir$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # AIX install. It has an incompatible calling convention. + : + elif test $ac_prog = install && + grep pwplus "$as_dir$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # program-specific install script used by HP pwplus--don't use. + : + else + rm -rf conftest.one conftest.two conftest.dir + echo one > conftest.one + echo two > conftest.two + mkdir conftest.dir + if "$as_dir$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir/" && + test -s conftest.one && test -s conftest.two && + test -s conftest.dir/conftest.one && + test -s conftest.dir/conftest.two + then + ac_cv_path_install="$as_dir$ac_prog$ac_exec_ext -c" + break 3 + fi + fi + fi + done + done + ;; +esac + + done +IFS=$as_save_IFS + +rm -rf conftest.one conftest.two conftest.dir + +fi + if test ${ac_cv_path_install+y}; then + INSTALL=$ac_cv_path_install + else + # As a last resort, use the slow shell script. Don't cache a + # value for INSTALL within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + INSTALL=$ac_install_sh + fi +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 +printf "%s\n" "$INSTALL" >&6; } + +# Use test -z because SunOS4 sh mishandles braces in ${var-val}. +# It thinks the first close brace ends the variable substitution. +test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' + +test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' + +test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 +printf %s "checking whether build environment is sane... " >&6; } +# Reject unsafe characters in $srcdir or the absolute working directory +# name. Accept space and tab only in the latter. +am_lf=' +' +case `pwd` in + *[\\\"\#\$\&\'\`$am_lf]*) + as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; +esac +case $srcdir in + *[\\\"\#\$\&\'\`$am_lf\ \ ]*) + as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; +esac + +# Do 'set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + am_has_slept=no + for am_try in 1 2; do + echo "timestamp, slept: $am_has_slept" > conftest.file + set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` + if test "$*" = "X"; then + # -L didn't work. + set X `ls -t "$srcdir/configure" conftest.file` + fi + if test "$*" != "X $srcdir/configure conftest.file" \ + && test "$*" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + as_fn_error $? "ls -t appears to fail. Make sure there is not a broken + alias in your environment" "$LINENO" 5 + fi + if test "$2" = conftest.file || test $am_try -eq 2; then + break + fi + # Just in case. + sleep 1 + am_has_slept=yes + done + test "$2" = conftest.file + ) +then + # Ok. + : +else + as_fn_error $? "newly created file is older than distributed files! +Check your system clock" "$LINENO" 5 +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } +# If we didn't sleep, we still need to ensure time stamps of config.status and +# generated files are strictly newer. +am_sleep_pid= +if grep 'slept: no' conftest.file >/dev/null 2>&1; then + ( sleep 1 ) & + am_sleep_pid=$! +fi + +rm -f conftest.file + +test "$program_prefix" != NONE && + program_transform_name="s&^&$program_prefix&;$program_transform_name" +# Use a double $ so make ignores it. +test "$program_suffix" != NONE && + program_transform_name="s&\$&$program_suffix&;$program_transform_name" +# Double any \ or $. +# By default was `s,x,x', remove it if useless. +ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' +program_transform_name=`printf "%s\n" "$program_transform_name" | sed "$ac_script"` + + +# Expand $ac_aux_dir to an absolute path. +am_aux_dir=`cd "$ac_aux_dir" && pwd` + + + if test x"${MISSING+set}" != xset; then + MISSING="\${SHELL} '$am_aux_dir/missing'" +fi +# Use eval to expand $SHELL +if eval "$MISSING --is-lightweight"; then + am_missing_run="$MISSING " +else + am_missing_run= + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 +printf "%s\n" "$as_me: WARNING: 'missing' script is too old or missing" >&2;} +fi + +if test x"${install_sh+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; + *) + install_sh="\${SHELL} $am_aux_dir/install-sh" + esac +fi + +# Installed binaries are usually stripped using 'strip' when the user +# run "make install-strip". However 'strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the 'STRIP' environment variable to overrule this program. +if test "$cross_compiling" != no; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. +set dummy ${ac_tool_prefix}strip; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_STRIP+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$STRIP"; then + ac_cv_prog_STRIP="$STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_STRIP="${ac_tool_prefix}strip" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +STRIP=$ac_cv_prog_STRIP +if test -n "$STRIP"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 +printf "%s\n" "$STRIP" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_STRIP"; then + ac_ct_STRIP=$STRIP + # Extract the first word of "strip", so it can be a program name with args. +set dummy strip; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_STRIP+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_STRIP"; then + ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_STRIP="strip" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP +if test -n "$ac_ct_STRIP"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 +printf "%s\n" "$ac_ct_STRIP" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + if test "x$ac_ct_STRIP" = x; then + STRIP=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + STRIP=$ac_ct_STRIP + fi +else + STRIP="$ac_cv_prog_STRIP" +fi + +fi +INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a race-free mkdir -p" >&5 +printf %s "checking for a race-free mkdir -p... " >&6; } +if test -z "$MKDIR_P"; then + if test ${ac_cv_path_mkdir+y} +then : + printf %s "(cached) " >&6 +else $as_nop + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_prog in mkdir gmkdir; do + for ac_exec_ext in '' $ac_executable_extensions; do + as_fn_executable_p "$as_dir$ac_prog$ac_exec_ext" || continue + case `"$as_dir$ac_prog$ac_exec_ext" --version 2>&1` in #( + 'mkdir ('*'coreutils) '* | \ + 'BusyBox '* | \ + 'mkdir (fileutils) '4.1*) + ac_cv_path_mkdir=$as_dir$ac_prog$ac_exec_ext + break 3;; + esac + done + done + done +IFS=$as_save_IFS + +fi + + test -d ./--version && rmdir ./--version + if test ${ac_cv_path_mkdir+y}; then + MKDIR_P="$ac_cv_path_mkdir -p" + else + # As a last resort, use the slow shell script. Don't cache a + # value for MKDIR_P within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + MKDIR_P="$ac_install_sh -d" + fi +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 +printf "%s\n" "$MKDIR_P" >&6; } + +for ac_prog in gawk mawk nawk awk +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_AWK+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$AWK"; then + ac_cv_prog_AWK="$AWK" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_AWK="$ac_prog" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +AWK=$ac_cv_prog_AWK +if test -n "$AWK"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 +printf "%s\n" "$AWK" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + + test -n "$AWK" && break +done + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 +printf %s "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } +set x ${MAKE-make} +ac_make=`printf "%s\n" "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` +if eval test \${ac_cv_prog_make_${ac_make}_set+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat >conftest.make <<\_ACEOF +SHELL = /bin/sh +all: + @echo '@@@%%%=$(MAKE)=@@@%%%' +_ACEOF +# GNU make sometimes prints "make[1]: Entering ...", which would confuse us. +case `${MAKE-make} -f conftest.make 2>/dev/null` in + *@@@%%%=?*=@@@%%%*) + eval ac_cv_prog_make_${ac_make}_set=yes;; + *) + eval ac_cv_prog_make_${ac_make}_set=no;; +esac +rm -f conftest.make +fi +if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + SET_MAKE= +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + SET_MAKE="MAKE=${MAKE-make}" +fi + +rm -rf .tst 2>/dev/null +mkdir .tst 2>/dev/null +if test -d .tst; then + am__leading_dot=. +else + am__leading_dot=_ +fi +rmdir .tst 2>/dev/null + +@%:@ Check whether --enable-silent-rules was given. +if test ${enable_silent_rules+y} +then : + enableval=$enable_silent_rules; +fi + +case $enable_silent_rules in @%:@ ((( + yes) AM_DEFAULT_VERBOSITY=0;; + no) AM_DEFAULT_VERBOSITY=1;; + *) AM_DEFAULT_VERBOSITY=1;; +esac +am_make=${MAKE-make} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 +printf %s "checking whether $am_make supports nested variables... " >&6; } +if test ${am_cv_make_support_nested_variables+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if printf "%s\n" 'TRUE=$(BAR$(V)) +BAR0=false +BAR1=true +V=1 +am__doit: + @$(TRUE) +.PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then + am_cv_make_support_nested_variables=yes +else + am_cv_make_support_nested_variables=no +fi +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 +printf "%s\n" "$am_cv_make_support_nested_variables" >&6; } +if test $am_cv_make_support_nested_variables = yes; then + AM_V='$(V)' + AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' +else + AM_V=$AM_DEFAULT_VERBOSITY + AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY +fi +AM_BACKSLASH='\' + +if test "`cd $srcdir && pwd`" != "`pwd`"; then + # Use -I$(srcdir) only when $(srcdir) != ., so that make's output + # is not polluted with repeated "-I." + am__isrc=' -I$(srcdir)' + # test to see if srcdir already configured + if test -f $srcdir/config.status; then + as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 + fi +fi + +# test whether we have cygpath +if test -z "$CYGPATH_W"; then + if (cygpath --version) >/dev/null 2>/dev/null; then + CYGPATH_W='cygpath -w' + else + CYGPATH_W=echo + fi +fi + + +# Define the identity of the package. + PACKAGE='portaudiocpp' + VERSION='12' + + +printf "%s\n" "@%:@define PACKAGE \"$PACKAGE\"" >>confdefs.h + + +printf "%s\n" "@%:@define VERSION \"$VERSION\"" >>confdefs.h + +# Some tools Automake needs. + +ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} + + +AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} + + +AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} + + +AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} + + +MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} + +# For better backward compatibility. To be removed once Automake 1.9.x +# dies out for good. For more background, see: +# +# +mkdir_p='$(MKDIR_P)' + +# We need awk for the "check" target (and possibly the TAP driver). The +# system "awk" is bad on some platforms. +# Always define AMTAR for backward compatibility. Yes, it's still used +# in the wild :-( We should find a proper way to deprecate it ... +AMTAR='$${TAR-tar}' + + +# We'll loop over all known methods to create a tar archive until one works. +_am_tools='gnutar pax cpio none' + +am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' + + + + + +# Variables for tags utilities; see am/tags.am +if test -z "$CTAGS"; then + CTAGS=ctags +fi + +if test -z "$ETAGS"; then + ETAGS=etags +fi + +if test -z "$CSCOPE"; then + CSCOPE=cscope +fi + + + +# POSIX will say in a future version that running "rm -f" with no argument +# is OK; and we want to be able to make that assumption in our Makefile +# recipes. So use an aggressive probe to check that the usage we want is +# actually supported "in the wild" to an acceptable degree. +# See automake bug#10828. +# To make any issue more visible, cause the running configure to be aborted +# by default if the 'rm' program in use doesn't match our expectations; the +# user can still override this though. +if rm -f && rm -fr && rm -rf; then : OK; else + cat >&2 <<'END' +Oops! + +Your 'rm' program seems unable to run without file operands specified +on the command line, even when the '-f' option is present. This is contrary +to the behaviour of most rm programs out there, and not conforming with +the upcoming POSIX standard: + +Please tell bug-automake@gnu.org about your system, including the value +of your $PATH and any error possibly output before this message. This +can help us improve future automake versions. + +END + if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then + echo 'Configuration will proceed anyway, since you have set the' >&2 + echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 + echo >&2 + else + cat >&2 <<'END' +Aborting the configuration process, to ensure you take notice of the issue. + +You can download and install GNU coreutils to get an 'rm' implementation +that behaves properly: . + +If you want to complete the configuration process using your problematic +'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM +to "yes", and re-run configure. + +END + as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5 + fi +fi + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to enable maintainer-specific portions of Makefiles" >&5 +printf %s "checking whether to enable maintainer-specific portions of Makefiles... " >&6; } + @%:@ Check whether --enable-maintainer-mode was given. +if test ${enable_maintainer_mode+y} +then : + enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval +else $as_nop + USE_MAINTAINER_MODE=no +fi + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $USE_MAINTAINER_MODE" >&5 +printf "%s\n" "$USE_MAINTAINER_MODE" >&6; } + if test $USE_MAINTAINER_MODE = yes; then + MAINTAINER_MODE_TRUE= + MAINTAINER_MODE_FALSE='#' +else + MAINTAINER_MODE_TRUE='#' + MAINTAINER_MODE_FALSE= +fi + + MAINT=$MAINTAINER_MODE_TRUE + + + +###### Top-level directory of pacpp +###### This makes it easy to shuffle the build directories +###### Also edit AC_CONFIG_SRCDIR above (wouldn't accept this variable)! +PACPP_ROOT="\$(top_srcdir)" +PORTAUDIO_ROOT="../.." + +# Various other variables and flags +DEFAULT_INCLUDES="-I$PACPP_ROOT/include -I$PACPP_ROOT/$PORTAUDIO_ROOT/include" +CFLAGS=${CFLAGS-"-g -O2 -Wall -ansi -pedantic"} +CXXFLAGS=${CXXFLAGS-"${CFLAGS}"} + +LT_VERSION_INFO="0:12:0" + +# Checks for programs + + + + + + + + + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. +set dummy ${ac_tool_prefix}gcc; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +printf "%s\n" "$CC" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="gcc" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +printf "%s\n" "$ac_ct_CC" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +else + CC="$ac_cv_prog_CC" +fi + +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. +set dummy ${ac_tool_prefix}cc; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +printf "%s\n" "$CC" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + + fi +fi +if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + ac_prog_rejected=no +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + if test "$as_dir$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC + shift + if test $@%:@ != 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + ac_cv_prog_CC="$as_dir$ac_word${1+' '}$@" + fi +fi +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +printf "%s\n" "$CC" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + for ac_prog in cl.exe + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +printf "%s\n" "$CC" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + + test -n "$CC" && break + done +fi +if test -z "$CC"; then + ac_ct_CC=$CC + for ac_prog in cl.exe +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="$ac_prog" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +printf "%s\n" "$ac_ct_CC" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + + test -n "$ac_ct_CC" && break +done + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +fi + +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}clang", so it can be a program name with args. +set dummy ${ac_tool_prefix}clang; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}clang" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +printf "%s\n" "$CC" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "clang", so it can be a program name with args. +set dummy clang; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="clang" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +printf "%s\n" "$ac_ct_CC" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +else + CC="$ac_cv_prog_CC" +fi + +fi + + +test -z "$CC" && { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "no acceptable C compiler found in \$PATH +See \`config.log' for more details" "$LINENO" 5; } + +# Provide some information about the compiler. +printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion -version; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done + +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" +# Try to create an executable without -o first, disregard a.out. +# It will help us diagnose broken compilers, and finding out an intuition +# of exeext. +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 +printf %s "checking whether the C compiler works... " >&6; } +ac_link_default=`printf "%s\n" "$ac_link" | sed 's/ -o *conftest[^ ]*//'` + +# The possible output files: +ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" + +ac_rmfiles= +for ac_file in $ac_files +do + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + * ) ac_rmfiles="$ac_rmfiles $ac_file";; + esac +done +rm -f $ac_rmfiles + +if { { ac_try="$ac_link_default" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_link_default") 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +then : + # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. +# So ignore a value of `no', otherwise this would lead to `EXEEXT = no' +# in a Makefile. We should not override ac_cv_exeext if it was cached, +# so that the user can short-circuit this test for compilers unknown to +# Autoconf. +for ac_file in $ac_files '' +do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) + ;; + [ab].out ) + # We found the default executable, but exeext='' is most + # certainly right. + break;; + *.* ) + if test ${ac_cv_exeext+y} && test "$ac_cv_exeext" != no; + then :; else + ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + fi + # We set ac_cv_exeext here because the later test for it is not + # safe: cross compilers may not add the suffix if given an `-o' + # argument, so we may need to know it at that point already. + # Even if this section looks crufty: it has the advantage of + # actually working. + break;; + * ) + break;; + esac +done +test "$ac_cv_exeext" = no && ac_cv_exeext= + +else $as_nop + ac_file='' +fi +if test -z "$ac_file" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +printf "%s\n" "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "C compiler cannot create executables +See \`config.log' for more details" "$LINENO" 5; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 +printf %s "checking for C compiler default output file name... " >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 +printf "%s\n" "$ac_file" >&6; } +ac_exeext=$ac_cv_exeext + +rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out +ac_clean_files=$ac_clean_files_save +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 +printf %s "checking for suffix of executables... " >&6; } +if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +then : + # If both `conftest.exe' and `conftest' are `present' (well, observable) +# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will +# work properly (i.e., refer to `conftest.exe'), while it won't with +# `rm'. +for ac_file in conftest.exe conftest conftest.*; do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + break;; + * ) break;; + esac +done +else $as_nop + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details" "$LINENO" 5; } +fi +rm -f conftest conftest$ac_cv_exeext +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 +printf "%s\n" "$ac_cv_exeext" >&6; } + +rm -f conftest.$ac_ext +EXEEXT=$ac_cv_exeext +ac_exeext=$EXEEXT +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +@%:@include +int +main (void) +{ +FILE *f = fopen ("conftest.out", "w"); + return ferror (f) || fclose (f) != 0; + + ; + return 0; +} +_ACEOF +ac_clean_files="$ac_clean_files conftest.out" +# Check that the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 +printf %s "checking whether we are cross compiling... " >&6; } +if test "$cross_compiling" != yes; then + { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if { ac_try='./conftest$ac_cv_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then + cross_compiling=no + else + if test "$cross_compiling" = maybe; then + cross_compiling=yes + else + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details" "$LINENO" 5; } + fi + fi +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 +printf "%s\n" "$cross_compiling" >&6; } + +rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out +ac_clean_files=$ac_clean_files_save +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 +printf %s "checking for suffix of object files... " >&6; } +if test ${ac_cv_objext+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.o conftest.obj +if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +then : + for ac_file in conftest.o conftest.obj conftest.*; do + test -f "$ac_file" || continue; + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; + *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` + break;; + esac +done +else $as_nop + printf "%s\n" "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot compute suffix of object files: cannot compile +See \`config.log' for more details" "$LINENO" 5; } +fi +rm -f conftest.$ac_cv_objext conftest.$ac_ext +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 +printf "%s\n" "$ac_cv_objext" >&6; } +OBJEXT=$ac_cv_objext +ac_objext=$OBJEXT +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports GNU C" >&5 +printf %s "checking whether the compiler supports GNU C... " >&6; } +if test ${ac_cv_c_compiler_gnu+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_compiler_gnu=yes +else $as_nop + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +ac_cv_c_compiler_gnu=$ac_compiler_gnu + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 +printf "%s\n" "$ac_cv_c_compiler_gnu" >&6; } +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +if test $ac_compiler_gnu = yes; then + GCC=yes +else + GCC= +fi +ac_test_CFLAGS=${CFLAGS+y} +ac_save_CFLAGS=$CFLAGS +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 +printf %s "checking whether $CC accepts -g... " >&6; } +if test ${ac_cv_prog_cc_g+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_save_c_werror_flag=$ac_c_werror_flag + ac_c_werror_flag=yes + ac_cv_prog_cc_g=no + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_prog_cc_g=yes +else $as_nop + CFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + +else $as_nop + ac_c_werror_flag=$ac_save_c_werror_flag + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_prog_cc_g=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + ac_c_werror_flag=$ac_save_c_werror_flag +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 +printf "%s\n" "$ac_cv_prog_cc_g" >&6; } +if test $ac_test_CFLAGS; then + CFLAGS=$ac_save_CFLAGS +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi +ac_prog_cc_stdc=no +if test x$ac_prog_cc_stdc = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C11 features" >&5 +printf %s "checking for $CC option to enable C11 features... " >&6; } +if test ${ac_cv_prog_cc_c11+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_cv_prog_cc_c11=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_c_conftest_c11_program +_ACEOF +for ac_arg in '' -std=gnu11 +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_prog_cc_c11=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam + test "x$ac_cv_prog_cc_c11" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC +fi + +if test "x$ac_cv_prog_cc_c11" = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +printf "%s\n" "unsupported" >&6; } +else $as_nop + if test "x$ac_cv_prog_cc_c11" = x +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +printf "%s\n" "none needed" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c11" >&5 +printf "%s\n" "$ac_cv_prog_cc_c11" >&6; } + CC="$CC $ac_cv_prog_cc_c11" +fi + ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c11 + ac_prog_cc_stdc=c11 +fi +fi +if test x$ac_prog_cc_stdc = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C99 features" >&5 +printf %s "checking for $CC option to enable C99 features... " >&6; } +if test ${ac_cv_prog_cc_c99+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_cv_prog_cc_c99=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_c_conftest_c99_program +_ACEOF +for ac_arg in '' -std=gnu99 -std=c99 -c99 -qlanglvl=extc1x -qlanglvl=extc99 -AC99 -D_STDC_C99= +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_prog_cc_c99=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam + test "x$ac_cv_prog_cc_c99" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC +fi + +if test "x$ac_cv_prog_cc_c99" = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +printf "%s\n" "unsupported" >&6; } +else $as_nop + if test "x$ac_cv_prog_cc_c99" = x +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +printf "%s\n" "none needed" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5 +printf "%s\n" "$ac_cv_prog_cc_c99" >&6; } + CC="$CC $ac_cv_prog_cc_c99" +fi + ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99 + ac_prog_cc_stdc=c99 +fi +fi +if test x$ac_prog_cc_stdc = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C89 features" >&5 +printf %s "checking for $CC option to enable C89 features... " >&6; } +if test ${ac_cv_prog_cc_c89+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_cv_prog_cc_c89=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_c_conftest_c89_program +_ACEOF +for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_prog_cc_c89=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam + test "x$ac_cv_prog_cc_c89" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC +fi + +if test "x$ac_cv_prog_cc_c89" = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +printf "%s\n" "unsupported" >&6; } +else $as_nop + if test "x$ac_cv_prog_cc_c89" = x +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +printf "%s\n" "none needed" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 +printf "%s\n" "$ac_cv_prog_cc_c89" >&6; } + CC="$CC $ac_cv_prog_cc_c89" +fi + ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89 + ac_prog_cc_stdc=c89 +fi +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 +printf %s "checking whether $CC understands -c and -o together... " >&6; } +if test ${am_cv_prog_cc_c_o+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF + # Make sure it works both with $CC and with simple cc. + # Following AC_PROG_CC_C_O, we do the test twice because some + # compilers refuse to overwrite an existing .o file with -o, + # though they will create one. + am_cv_prog_cc_c_o=yes + for am_i in 1 2; do + if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 + ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } \ + && test -f conftest2.$ac_objext; then + : OK + else + am_cv_prog_cc_c_o=no + break + fi + done + rm -f core conftest* + unset am_i +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 +printf "%s\n" "$am_cv_prog_cc_c_o" >&6; } +if test "$am_cv_prog_cc_c_o" != yes; then + # Losing compiler, so override with the script. + # FIXME: It is wrong to rewrite CC. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__CC in this case, + # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" + CC="$am_aux_dir/compile $CC" +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +DEPDIR="${am__leading_dot}deps" + +ac_config_commands="$ac_config_commands depfiles" + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} supports the include directive" >&5 +printf %s "checking whether ${MAKE-make} supports the include directive... " >&6; } +cat > confinc.mk << 'END' +am__doit: + @echo this is the am__doit target >confinc.out +.PHONY: am__doit +END +am__include="#" +am__quote= +# BSD make does it like this. +echo '.include "confinc.mk" # ignored' > confmf.BSD +# Other make implementations (GNU, Solaris 10, AIX) do it like this. +echo 'include confinc.mk # ignored' > confmf.GNU +_am_result=no +for s in GNU BSD; do + { echo "$as_me:$LINENO: ${MAKE-make} -f confmf.$s && cat confinc.out" >&5 + (${MAKE-make} -f confmf.$s && cat confinc.out) >&5 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + case $?:`cat confinc.out 2>/dev/null` in @%:@( + '0:this is the am__doit target') : + case $s in @%:@( + BSD) : + am__include='.include' am__quote='"' ;; @%:@( + *) : + am__include='include' am__quote='' ;; +esac ;; @%:@( + *) : + ;; +esac + if test "$am__include" != "#"; then + _am_result="yes ($s style)" + break + fi +done +rm -f confinc.* confmf.* +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: ${_am_result}" >&5 +printf "%s\n" "${_am_result}" >&6; } + +@%:@ Check whether --enable-dependency-tracking was given. +if test ${enable_dependency_tracking+y} +then : + enableval=$enable_dependency_tracking; +fi + +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' + am__nodep='_no' +fi + if test "x$enable_dependency_tracking" != xno; then + AMDEP_TRUE= + AMDEP_FALSE='#' +else + AMDEP_TRUE='#' + AMDEP_FALSE= +fi + + + +depcc="$CC" am_compiler_list= + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +printf %s "checking dependency style of $depcc... " >&6; } +if test ${am_cv_CC_dependencies_compiler_type+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named 'D' -- because '-MD' means "put the output + # in D". + rm -rf conftest.dir + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CC_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + am__universal=false + case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with + # Solaris 10 /bin/sh. + echo '/* dummy */' > sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with '-c' and '-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle '-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs. + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # After this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested. + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok '-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CC_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CC_dependencies_compiler_type=none +fi + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 +printf "%s\n" "$am_cv_CC_dependencies_compiler_type" >&6; } +CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type + + if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then + am__fastdepCC_TRUE= + am__fastdepCC_FALSE='#' +else + am__fastdepCC_TRUE='#' + am__fastdepCC_FALSE= +fi + + + + + + + + +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +if test -z "$CXX"; then + if test -n "$CCC"; then + CXX=$CCC + else + if test -n "$ac_tool_prefix"; then + for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC clang++ + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_CXX+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$CXX"; then + ac_cv_prog_CXX="$CXX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CXX=$ac_cv_prog_CXX +if test -n "$CXX"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 +printf "%s\n" "$CXX" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + + test -n "$CXX" && break + done +fi +if test -z "$CXX"; then + ac_ct_CXX=$CXX + for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC clang++ +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_CXX+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_CXX"; then + ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CXX="$ac_prog" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CXX=$ac_cv_prog_ac_ct_CXX +if test -n "$ac_ct_CXX"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 +printf "%s\n" "$ac_ct_CXX" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + + test -n "$ac_ct_CXX" && break +done + + if test "x$ac_ct_CXX" = x; then + CXX="g++" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CXX=$ac_ct_CXX + fi +fi + + fi +fi +# Provide some information about the compiler. +printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports GNU C++" >&5 +printf %s "checking whether the compiler supports GNU C++... " >&6; } +if test ${ac_cv_cxx_compiler_gnu+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO" +then : + ac_compiler_gnu=yes +else $as_nop + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +ac_cv_cxx_compiler_gnu=$ac_compiler_gnu + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 +printf "%s\n" "$ac_cv_cxx_compiler_gnu" >&6; } +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + +if test $ac_compiler_gnu = yes; then + GXX=yes +else + GXX= +fi +ac_test_CXXFLAGS=${CXXFLAGS+y} +ac_save_CXXFLAGS=$CXXFLAGS +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 +printf %s "checking whether $CXX accepts -g... " >&6; } +if test ${ac_cv_prog_cxx_g+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_save_cxx_werror_flag=$ac_cxx_werror_flag + ac_cxx_werror_flag=yes + ac_cv_prog_cxx_g=no + CXXFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO" +then : + ac_cv_prog_cxx_g=yes +else $as_nop + CXXFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO" +then : + +else $as_nop + ac_cxx_werror_flag=$ac_save_cxx_werror_flag + CXXFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO" +then : + ac_cv_prog_cxx_g=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + ac_cxx_werror_flag=$ac_save_cxx_werror_flag +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 +printf "%s\n" "$ac_cv_prog_cxx_g" >&6; } +if test $ac_test_CXXFLAGS; then + CXXFLAGS=$ac_save_CXXFLAGS +elif test $ac_cv_prog_cxx_g = yes; then + if test "$GXX" = yes; then + CXXFLAGS="-g -O2" + else + CXXFLAGS="-g" + fi +else + if test "$GXX" = yes; then + CXXFLAGS="-O2" + else + CXXFLAGS= + fi +fi +ac_prog_cxx_stdcxx=no +if test x$ac_prog_cxx_stdcxx = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CXX option to enable C++11 features" >&5 +printf %s "checking for $CXX option to enable C++11 features... " >&6; } +if test ${ac_cv_prog_cxx_11+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_cv_prog_cxx_11=no +ac_save_CXX=$CXX +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_cxx_conftest_cxx11_program +_ACEOF +for ac_arg in '' -std=gnu++11 -std=gnu++0x -std=c++11 -std=c++0x -qlanglvl=extended0x -AA +do + CXX="$ac_save_CXX $ac_arg" + if ac_fn_cxx_try_compile "$LINENO" +then : + ac_cv_prog_cxx_cxx11=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam + test "x$ac_cv_prog_cxx_cxx11" != "xno" && break +done +rm -f conftest.$ac_ext +CXX=$ac_save_CXX +fi + +if test "x$ac_cv_prog_cxx_cxx11" = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +printf "%s\n" "unsupported" >&6; } +else $as_nop + if test "x$ac_cv_prog_cxx_cxx11" = x +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +printf "%s\n" "none needed" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_cxx11" >&5 +printf "%s\n" "$ac_cv_prog_cxx_cxx11" >&6; } + CXX="$CXX $ac_cv_prog_cxx_cxx11" +fi + ac_cv_prog_cxx_stdcxx=$ac_cv_prog_cxx_cxx11 + ac_prog_cxx_stdcxx=cxx11 +fi +fi +if test x$ac_prog_cxx_stdcxx = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CXX option to enable C++98 features" >&5 +printf %s "checking for $CXX option to enable C++98 features... " >&6; } +if test ${ac_cv_prog_cxx_98+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_cv_prog_cxx_98=no +ac_save_CXX=$CXX +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_cxx_conftest_cxx98_program +_ACEOF +for ac_arg in '' -std=gnu++98 -std=c++98 -qlanglvl=extended -AA +do + CXX="$ac_save_CXX $ac_arg" + if ac_fn_cxx_try_compile "$LINENO" +then : + ac_cv_prog_cxx_cxx98=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam + test "x$ac_cv_prog_cxx_cxx98" != "xno" && break +done +rm -f conftest.$ac_ext +CXX=$ac_save_CXX +fi + +if test "x$ac_cv_prog_cxx_cxx98" = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +printf "%s\n" "unsupported" >&6; } +else $as_nop + if test "x$ac_cv_prog_cxx_cxx98" = x +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +printf "%s\n" "none needed" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_cxx98" >&5 +printf "%s\n" "$ac_cv_prog_cxx_cxx98" >&6; } + CXX="$CXX $ac_cv_prog_cxx_cxx98" +fi + ac_cv_prog_cxx_stdcxx=$ac_cv_prog_cxx_cxx98 + ac_prog_cxx_stdcxx=cxx98 +fi +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +depcc="$CXX" am_compiler_list= + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +printf %s "checking dependency style of $depcc... " >&6; } +if test ${am_cv_CXX_dependencies_compiler_type+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named 'D' -- because '-MD' means "put the output + # in D". + rm -rf conftest.dir + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CXX_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + am__universal=false + case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with + # Solaris 10 /bin/sh. + echo '/* dummy */' > sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with '-c' and '-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle '-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs. + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # After this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested. + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok '-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CXX_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CXX_dependencies_compiler_type=none +fi + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 +printf "%s\n" "$am_cv_CXX_dependencies_compiler_type" >&6; } +CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type + + if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then + am__fastdepCXX_TRUE= + am__fastdepCXX_FALSE='#' +else + am__fastdepCXX_TRUE='#' + am__fastdepCXX_FALSE= +fi + + + + + # Make sure we can run config.sub. +$SHELL "${ac_aux_dir}config.sub" sun4 >/dev/null 2>&1 || + as_fn_error $? "cannot run $SHELL ${ac_aux_dir}config.sub" "$LINENO" 5 + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 +printf %s "checking build system type... " >&6; } +if test ${ac_cv_build+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_build_alias=$build_alias +test "x$ac_build_alias" = x && + ac_build_alias=`$SHELL "${ac_aux_dir}config.guess"` +test "x$ac_build_alias" = x && + as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 +ac_cv_build=`$SHELL "${ac_aux_dir}config.sub" $ac_build_alias` || + as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $ac_build_alias failed" "$LINENO" 5 + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 +printf "%s\n" "$ac_cv_build" >&6; } +case $ac_cv_build in +*-*-*) ;; +*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; +esac +build=$ac_cv_build +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_build +shift +build_cpu=$1 +build_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +build_os=$* +IFS=$ac_save_IFS +case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 +printf %s "checking host system type... " >&6; } +if test ${ac_cv_host+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test "x$host_alias" = x; then + ac_cv_host=$ac_cv_build +else + ac_cv_host=`$SHELL "${ac_aux_dir}config.sub" $host_alias` || + as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $host_alias failed" "$LINENO" 5 +fi + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 +printf "%s\n" "$ac_cv_host" >&6; } +case $ac_cv_host in +*-*-*) ;; +*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; +esac +host=$ac_cv_host +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_host +shift +host_cpu=$1 +host_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +host_os=$* +IFS=$ac_save_IFS +case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac + + +enable_win32_dll=yes + +case $host in +*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*) + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}as", so it can be a program name with args. +set dummy ${ac_tool_prefix}as; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_AS+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$AS"; then + ac_cv_prog_AS="$AS" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_AS="${ac_tool_prefix}as" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +AS=$ac_cv_prog_AS +if test -n "$AS"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $AS" >&5 +printf "%s\n" "$AS" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_AS"; then + ac_ct_AS=$AS + # Extract the first word of "as", so it can be a program name with args. +set dummy as; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_AS+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_AS"; then + ac_cv_prog_ac_ct_AS="$ac_ct_AS" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_AS="as" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_AS=$ac_cv_prog_ac_ct_AS +if test -n "$ac_ct_AS"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AS" >&5 +printf "%s\n" "$ac_ct_AS" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + if test "x$ac_ct_AS" = x; then + AS="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + AS=$ac_ct_AS + fi +else + AS="$ac_cv_prog_AS" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. +set dummy ${ac_tool_prefix}dlltool; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_DLLTOOL+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$DLLTOOL"; then + ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +DLLTOOL=$ac_cv_prog_DLLTOOL +if test -n "$DLLTOOL"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 +printf "%s\n" "$DLLTOOL" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_DLLTOOL"; then + ac_ct_DLLTOOL=$DLLTOOL + # Extract the first word of "dlltool", so it can be a program name with args. +set dummy dlltool; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_DLLTOOL+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_DLLTOOL"; then + ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_DLLTOOL="dlltool" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL +if test -n "$ac_ct_DLLTOOL"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 +printf "%s\n" "$ac_ct_DLLTOOL" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + if test "x$ac_ct_DLLTOOL" = x; then + DLLTOOL="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DLLTOOL=$ac_ct_DLLTOOL + fi +else + DLLTOOL="$ac_cv_prog_DLLTOOL" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. +set dummy ${ac_tool_prefix}objdump; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_OBJDUMP+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$OBJDUMP"; then + ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +OBJDUMP=$ac_cv_prog_OBJDUMP +if test -n "$OBJDUMP"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 +printf "%s\n" "$OBJDUMP" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OBJDUMP"; then + ac_ct_OBJDUMP=$OBJDUMP + # Extract the first word of "objdump", so it can be a program name with args. +set dummy objdump; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_OBJDUMP+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_OBJDUMP"; then + ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_OBJDUMP="objdump" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP +if test -n "$ac_ct_OBJDUMP"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 +printf "%s\n" "$ac_ct_OBJDUMP" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + if test "x$ac_ct_OBJDUMP" = x; then + OBJDUMP="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OBJDUMP=$ac_ct_OBJDUMP + fi +else + OBJDUMP="$ac_cv_prog_OBJDUMP" +fi + + ;; +esac + +test -z "$AS" && AS=as + + + + + +test -z "$DLLTOOL" && DLLTOOL=dlltool + + + + + +test -z "$OBJDUMP" && OBJDUMP=objdump + + + + + + + +case `pwd` in + *\ * | *\ *) + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 +printf "%s\n" "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;; +esac + + + +macro_version='2.4.6' +macro_revision='2.4.6' + + + + + + + + + + + + + + +ltmain=$ac_aux_dir/ltmain.sh + +# Backslashify metacharacters that are still active within +# double-quoted strings. +sed_quote_subst='s/\(["`$\\]\)/\\\1/g' + +# Same as above, but do not quote variable references. +double_quote_subst='s/\(["`\\]\)/\\\1/g' + +# Sed substitution to delay expansion of an escaped shell variable in a +# double_quote_subst'ed string. +delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' + +# Sed substitution to delay expansion of an escaped single quote. +delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' + +# Sed substitution to avoid accidental globbing in evaled expressions +no_glob_subst='s/\*/\\\*/g' + +ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5 +printf %s "checking how to print strings... " >&6; } +# Test print first, because it will be a builtin if present. +if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ + test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then + ECHO='print -r --' +elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then + ECHO='printf %s\n' +else + # Use this function as a fallback that always works. + func_fallback_echo () + { + eval 'cat <<_LTECHO_EOF +$1 +_LTECHO_EOF' + } + ECHO='func_fallback_echo' +fi + +# func_echo_all arg... +# Invoke $ECHO with all args, space-separated. +func_echo_all () +{ + $ECHO "" +} + +case $ECHO in + printf*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: printf" >&5 +printf "%s\n" "printf" >&6; } ;; + print*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: print -r" >&5 +printf "%s\n" "print -r" >&6; } ;; + *) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: cat" >&5 +printf "%s\n" "cat" >&6; } ;; +esac + + + + + + + + + + + + + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 +printf %s "checking for a sed that does not truncate output... " >&6; } +if test ${ac_cv_path_SED+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ + for ac_i in 1 2 3 4 5 6 7; do + ac_script="$ac_script$as_nl$ac_script" + done + echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed + { ac_script=; unset ac_script;} + if test -z "$SED"; then + ac_path_SED_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_prog in sed gsed + do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_SED="$as_dir$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_SED" || continue +# Check for GNU ac_path_SED and select it if it is found. + # Check for GNU $ac_path_SED +case `"$ac_path_SED" --version 2>&1` in +*GNU*) + ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; +*) + ac_count=0 + printf %s 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + printf "%s\n" '' >> "conftest.nl" + "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_SED_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_SED="$ac_path_SED" + ac_path_SED_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_SED_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_SED"; then + as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 + fi +else + ac_cv_path_SED=$SED +fi + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 +printf "%s\n" "$ac_cv_path_SED" >&6; } + SED="$ac_cv_path_SED" + rm -f conftest.sed + +test -z "$SED" && SED=sed +Xsed="$SED -e 1s/^X//" + + + + + + + + + + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 +printf %s "checking for grep that handles long lines and -e... " >&6; } +if test ${ac_cv_path_GREP+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -z "$GREP"; then + ac_path_GREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_prog in grep ggrep + do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_GREP="$as_dir$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_GREP" || continue +# Check for GNU ac_path_GREP and select it if it is found. + # Check for GNU $ac_path_GREP +case `"$ac_path_GREP" --version 2>&1` in +*GNU*) + ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; +*) + ac_count=0 + printf %s 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + printf "%s\n" 'GREP' >> "conftest.nl" + "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_GREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_GREP="$ac_path_GREP" + ac_path_GREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_GREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_GREP"; then + as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_GREP=$GREP +fi + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 +printf "%s\n" "$ac_cv_path_GREP" >&6; } + GREP="$ac_cv_path_GREP" + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 +printf %s "checking for egrep... " >&6; } +if test ${ac_cv_path_EGREP+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 + then ac_cv_path_EGREP="$GREP -E" + else + if test -z "$EGREP"; then + ac_path_EGREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_prog in egrep + do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_EGREP="$as_dir$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_EGREP" || continue +# Check for GNU ac_path_EGREP and select it if it is found. + # Check for GNU $ac_path_EGREP +case `"$ac_path_EGREP" --version 2>&1` in +*GNU*) + ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; +*) + ac_count=0 + printf %s 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + printf "%s\n" 'EGREP' >> "conftest.nl" + "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_EGREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_EGREP="$ac_path_EGREP" + ac_path_EGREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_EGREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_EGREP"; then + as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_EGREP=$EGREP +fi + + fi +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 +printf "%s\n" "$ac_cv_path_EGREP" >&6; } + EGREP="$ac_cv_path_EGREP" + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5 +printf %s "checking for fgrep... " >&6; } +if test ${ac_cv_path_FGREP+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 + then ac_cv_path_FGREP="$GREP -F" + else + if test -z "$FGREP"; then + ac_path_FGREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_prog in fgrep + do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_FGREP="$as_dir$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_FGREP" || continue +# Check for GNU ac_path_FGREP and select it if it is found. + # Check for GNU $ac_path_FGREP +case `"$ac_path_FGREP" --version 2>&1` in +*GNU*) + ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;; +*) + ac_count=0 + printf %s 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + printf "%s\n" 'FGREP' >> "conftest.nl" + "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_FGREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_FGREP="$ac_path_FGREP" + ac_path_FGREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_FGREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_FGREP"; then + as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_FGREP=$FGREP +fi + + fi +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5 +printf "%s\n" "$ac_cv_path_FGREP" >&6; } + FGREP="$ac_cv_path_FGREP" + + +test -z "$GREP" && GREP=grep + + + + + + + + + + + + + + + + + + + +@%:@ Check whether --with-gnu-ld was given. +if test ${with_gnu_ld+y} +then : + withval=$with_gnu_ld; test no = "$withval" || with_gnu_ld=yes +else $as_nop + with_gnu_ld=no +fi + +ac_prog=ld +if test yes = "$GCC"; then + # Check if gcc -print-prog-name=ld gives a path. + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 +printf %s "checking for ld used by $CC... " >&6; } + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return, which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [\\/]* | ?:[\\/]*) + re_direlt='/[^/][^/]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` + while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do + ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` + done + test -z "$LD" && LD=$ac_prog + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test yes = "$with_gnu_ld"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 +printf %s "checking for GNU ld... " >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 +printf %s "checking for non-GNU ld... " >&6; } +fi +if test ${lt_cv_path_LD+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -z "$LD"; then + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS=$lt_save_ifs + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD=$ac_dir/$ac_prog + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some variants of GNU ld only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 &5 +printf "%s\n" "$LD" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi +test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 +printf %s "checking if the linker ($LD) is GNU ld... " >&6; } +if test ${lt_cv_prog_gnu_ld+y} +then : + printf %s "(cached) " >&6 +else $as_nop + # I'd rather use --version here, but apparently some GNU lds only accept -v. +case `$LD -v 2>&1 &5 +printf "%s\n" "$lt_cv_prog_gnu_ld" >&6; } +with_gnu_ld=$lt_cv_prog_gnu_ld + + + + + + + + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5 +printf %s "checking for BSD- or MS-compatible name lister (nm)... " >&6; } +if test ${lt_cv_path_NM+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$NM"; then + # Let the user override the test. + lt_cv_path_NM=$NM +else + lt_nm_to_check=${ac_tool_prefix}nm + if test -n "$ac_tool_prefix" && test "$build" = "$host"; then + lt_nm_to_check="$lt_nm_to_check nm" + fi + for lt_tmp_nm in $lt_nm_to_check; do + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR + for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do + IFS=$lt_save_ifs + test -z "$ac_dir" && ac_dir=. + tmp_nm=$ac_dir/$lt_tmp_nm + if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext"; then + # Check to see if the nm accepts a BSD-compat flag. + # Adding the 'sed 1q' prevents false positives on HP-UX, which says: + # nm: unknown option "B" ignored + # Tru64's nm complains that /dev/null is an invalid object file + # MSYS converts /dev/null to NUL, MinGW nm treats NUL as empty + case $build_os in + mingw*) lt_bad_file=conftest.nm/nofile ;; + *) lt_bad_file=/dev/null ;; + esac + case `"$tmp_nm" -B $lt_bad_file 2>&1 | sed '1q'` in + *$lt_bad_file* | *'Invalid file or object type'*) + lt_cv_path_NM="$tmp_nm -B" + break 2 + ;; + *) + case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in + */dev/null*) + lt_cv_path_NM="$tmp_nm -p" + break 2 + ;; + *) + lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but + continue # so that we can try to find one that supports BSD flags + ;; + esac + ;; + esac + fi + done + IFS=$lt_save_ifs + done + : ${lt_cv_path_NM=no} +fi +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5 +printf "%s\n" "$lt_cv_path_NM" >&6; } +if test no != "$lt_cv_path_NM"; then + NM=$lt_cv_path_NM +else + # Didn't find any BSD compatible name lister, look for dumpbin. + if test -n "$DUMPBIN"; then : + # Let the user override the test. + else + if test -n "$ac_tool_prefix"; then + for ac_prog in dumpbin "link -dump" + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_DUMPBIN+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$DUMPBIN"; then + ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +DUMPBIN=$ac_cv_prog_DUMPBIN +if test -n "$DUMPBIN"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5 +printf "%s\n" "$DUMPBIN" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + + test -n "$DUMPBIN" && break + done +fi +if test -z "$DUMPBIN"; then + ac_ct_DUMPBIN=$DUMPBIN + for ac_prog in dumpbin "link -dump" +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_DUMPBIN+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_DUMPBIN"; then + ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_DUMPBIN="$ac_prog" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN +if test -n "$ac_ct_DUMPBIN"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5 +printf "%s\n" "$ac_ct_DUMPBIN" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + + test -n "$ac_ct_DUMPBIN" && break +done + + if test "x$ac_ct_DUMPBIN" = x; then + DUMPBIN=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DUMPBIN=$ac_ct_DUMPBIN + fi +fi + + case `$DUMPBIN -symbols -headers /dev/null 2>&1 | sed '1q'` in + *COFF*) + DUMPBIN="$DUMPBIN -symbols -headers" + ;; + *) + DUMPBIN=: + ;; + esac + fi + + if test : != "$DUMPBIN"; then + NM=$DUMPBIN + fi +fi +test -z "$NM" && NM=nm + + + + + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5 +printf %s "checking the name lister ($NM) interface... " >&6; } +if test ${lt_cv_nm_interface+y} +then : + printf %s "(cached) " >&6 +else $as_nop + lt_cv_nm_interface="BSD nm" + echo "int some_variable = 0;" > conftest.$ac_ext + (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5) + (eval "$ac_compile" 2>conftest.err) + cat conftest.err >&5 + (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5) + (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) + cat conftest.err >&5 + (eval echo "\"\$as_me:$LINENO: output\"" >&5) + cat conftest.out >&5 + if $GREP 'External.*some_variable' conftest.out > /dev/null; then + lt_cv_nm_interface="MS dumpbin" + fi + rm -f conftest* +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5 +printf "%s\n" "$lt_cv_nm_interface" >&6; } + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 +printf %s "checking whether ln -s works... " >&6; } +LN_S=$as_ln_s +if test "$LN_S" = "ln -s"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 +printf "%s\n" "no, using $LN_S" >&6; } +fi + +# find the maximum length of command line arguments +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5 +printf %s "checking the maximum length of command line arguments... " >&6; } +if test ${lt_cv_sys_max_cmd_len+y} +then : + printf %s "(cached) " >&6 +else $as_nop + i=0 + teststring=ABCD + + case $build_os in + msdosdjgpp*) + # On DJGPP, this test can blow up pretty badly due to problems in libc + # (any single argument exceeding 2000 bytes causes a buffer overrun + # during glob expansion). Even if it were fixed, the result of this + # check would be larger than it should be. + lt_cv_sys_max_cmd_len=12288; # 12K is about right + ;; + + gnu*) + # Under GNU Hurd, this test is not required because there is + # no limit to the length of command line arguments. + # Libtool will interpret -1 as no limit whatsoever + lt_cv_sys_max_cmd_len=-1; + ;; + + cygwin* | mingw* | cegcc*) + # On Win9x/ME, this test blows up -- it succeeds, but takes + # about 5 minutes as the teststring grows exponentially. + # Worse, since 9x/ME are not pre-emptively multitasking, + # you end up with a "frozen" computer, even though with patience + # the test eventually succeeds (with a max line length of 256k). + # Instead, let's just punt: use the minimum linelength reported by + # all of the supported platforms: 8192 (on NT/2K/XP). + lt_cv_sys_max_cmd_len=8192; + ;; + + mint*) + # On MiNT this can take a long time and run out of memory. + lt_cv_sys_max_cmd_len=8192; + ;; + + amigaos*) + # On AmigaOS with pdksh, this test takes hours, literally. + # So we just punt and use a minimum line length of 8192. + lt_cv_sys_max_cmd_len=8192; + ;; + + bitrig* | darwin* | dragonfly* | freebsd* | netbsd* | openbsd*) + # This has been around since 386BSD, at least. Likely further. + if test -x /sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` + elif test -x /usr/sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` + else + lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs + fi + # And add a safety zone + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + ;; + + interix*) + # We know the value 262144 and hardcode it with a safety zone (like BSD) + lt_cv_sys_max_cmd_len=196608 + ;; + + os2*) + # The test takes a long time on OS/2. + lt_cv_sys_max_cmd_len=8192 + ;; + + osf*) + # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure + # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not + # nice to cause kernel panics so lets avoid the loop below. + # First set a reasonable default. + lt_cv_sys_max_cmd_len=16384 + # + if test -x /sbin/sysconfig; then + case `/sbin/sysconfig -q proc exec_disable_arg_limit` in + *1*) lt_cv_sys_max_cmd_len=-1 ;; + esac + fi + ;; + sco3.2v5*) + lt_cv_sys_max_cmd_len=102400 + ;; + sysv5* | sco5v6* | sysv4.2uw2*) + kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` + if test -n "$kargmax"; then + lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[ ]//'` + else + lt_cv_sys_max_cmd_len=32768 + fi + ;; + *) + lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` + if test -n "$lt_cv_sys_max_cmd_len" && \ + test undefined != "$lt_cv_sys_max_cmd_len"; then + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + else + # Make teststring a little bigger before we do anything with it. + # a 1K string should be a reasonable start. + for i in 1 2 3 4 5 6 7 8; do + teststring=$teststring$teststring + done + SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} + # If test is not a shell built-in, we'll probably end up computing a + # maximum length that is only half of the actual maximum length, but + # we can't tell. + while { test X`env echo "$teststring$teststring" 2>/dev/null` \ + = "X$teststring$teststring"; } >/dev/null 2>&1 && + test 17 != "$i" # 1/2 MB should be enough + do + i=`expr $i + 1` + teststring=$teststring$teststring + done + # Only check the string length outside the loop. + lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` + teststring= + # Add a significant safety factor because C++ compilers can tack on + # massive amounts of additional arguments before passing them to the + # linker. It appears as though 1/2 is a usable value. + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` + fi + ;; + esac + +fi + +if test -n "$lt_cv_sys_max_cmd_len"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5 +printf "%s\n" "$lt_cv_sys_max_cmd_len" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none" >&5 +printf "%s\n" "none" >&6; } +fi +max_cmd_len=$lt_cv_sys_max_cmd_len + + + + + + +: ${CP="cp -f"} +: ${MV="mv -f"} +: ${RM="rm -f"} + +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + lt_unset=unset +else + lt_unset=false +fi + + + + + +# test EBCDIC or ASCII +case `echo X|tr X '\101'` in + A) # ASCII based system + # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr + lt_SP2NL='tr \040 \012' + lt_NL2SP='tr \015\012 \040\040' + ;; + *) # EBCDIC based system + lt_SP2NL='tr \100 \n' + lt_NL2SP='tr \r\n \100\100' + ;; +esac + + + + + + + + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5 +printf %s "checking how to convert $build file names to $host format... " >&6; } +if test ${lt_cv_to_host_file_cmd+y} +then : + printf %s "(cached) " >&6 +else $as_nop + case $host in + *-*-mingw* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 + ;; + *-*-cygwin* ) + lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 + ;; + * ) # otherwise, assume *nix + lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 + ;; + esac + ;; + *-*-cygwin* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin + ;; + *-*-cygwin* ) + lt_cv_to_host_file_cmd=func_convert_file_noop + ;; + * ) # otherwise, assume *nix + lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin + ;; + esac + ;; + * ) # unhandled hosts (and "normal" native builds) + lt_cv_to_host_file_cmd=func_convert_file_noop + ;; +esac + +fi + +to_host_file_cmd=$lt_cv_to_host_file_cmd +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5 +printf "%s\n" "$lt_cv_to_host_file_cmd" >&6; } + + + + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5 +printf %s "checking how to convert $build file names to toolchain format... " >&6; } +if test ${lt_cv_to_tool_file_cmd+y} +then : + printf %s "(cached) " >&6 +else $as_nop + #assume ordinary cross tools, or native build. +lt_cv_to_tool_file_cmd=func_convert_file_noop +case $host in + *-*-mingw* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 + ;; + esac + ;; +esac + +fi + +to_tool_file_cmd=$lt_cv_to_tool_file_cmd +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5 +printf "%s\n" "$lt_cv_to_tool_file_cmd" >&6; } + + + + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5 +printf %s "checking for $LD option to reload object files... " >&6; } +if test ${lt_cv_ld_reload_flag+y} +then : + printf %s "(cached) " >&6 +else $as_nop + lt_cv_ld_reload_flag='-r' +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5 +printf "%s\n" "$lt_cv_ld_reload_flag" >&6; } +reload_flag=$lt_cv_ld_reload_flag +case $reload_flag in +"" | " "*) ;; +*) reload_flag=" $reload_flag" ;; +esac +reload_cmds='$LD$reload_flag -o $output$reload_objs' +case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + if test yes != "$GCC"; then + reload_cmds=false + fi + ;; + darwin*) + if test yes = "$GCC"; then + reload_cmds='$LTCC $LTCFLAGS -nostdlib $wl-r -o $output$reload_objs' + else + reload_cmds='$LD$reload_flag -o $output$reload_objs' + fi + ;; +esac + + + + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. +set dummy ${ac_tool_prefix}objdump; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_OBJDUMP+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$OBJDUMP"; then + ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +OBJDUMP=$ac_cv_prog_OBJDUMP +if test -n "$OBJDUMP"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 +printf "%s\n" "$OBJDUMP" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OBJDUMP"; then + ac_ct_OBJDUMP=$OBJDUMP + # Extract the first word of "objdump", so it can be a program name with args. +set dummy objdump; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_OBJDUMP+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_OBJDUMP"; then + ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_OBJDUMP="objdump" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP +if test -n "$ac_ct_OBJDUMP"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 +printf "%s\n" "$ac_ct_OBJDUMP" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + if test "x$ac_ct_OBJDUMP" = x; then + OBJDUMP="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OBJDUMP=$ac_ct_OBJDUMP + fi +else + OBJDUMP="$ac_cv_prog_OBJDUMP" +fi + +test -z "$OBJDUMP" && OBJDUMP=objdump + + + + + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5 +printf %s "checking how to recognize dependent libraries... " >&6; } +if test ${lt_cv_deplibs_check_method+y} +then : + printf %s "(cached) " >&6 +else $as_nop + lt_cv_file_magic_cmd='$MAGIC_CMD' +lt_cv_file_magic_test_file= +lt_cv_deplibs_check_method='unknown' +# Need to set the preceding variable on all platforms that support +# interlibrary dependencies. +# 'none' -- dependencies not supported. +# 'unknown' -- same as none, but documents that we really don't know. +# 'pass_all' -- all dependencies passed with no checks. +# 'test_compile' -- check by making test program. +# 'file_magic [[regex]]' -- check by looking for files in library path +# that responds to the $file_magic_cmd with a given extended regex. +# If you have 'file' or equivalent on your system and you're not sure +# whether 'pass_all' will *always* work, you probably want this one. + +case $host_os in +aix[4-9]*) + lt_cv_deplibs_check_method=pass_all + ;; + +beos*) + lt_cv_deplibs_check_method=pass_all + ;; + +bsdi[45]*) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' + lt_cv_file_magic_cmd='/usr/bin/file -L' + lt_cv_file_magic_test_file=/shlib/libc.so + ;; + +cygwin*) + # func_win32_libid is a shell function defined in ltmain.sh + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + ;; + +mingw* | pw32*) + # Base MSYS/MinGW do not provide the 'file' command needed by + # func_win32_libid shell function, so use a weaker test based on 'objdump', + # unless we find 'file', for example because we are cross-compiling. + if ( file / ) >/dev/null 2>&1; then + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + else + # Keep this pattern in sync with the one in func_win32_libid. + lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' + lt_cv_file_magic_cmd='$OBJDUMP -f' + fi + ;; + +cegcc*) + # use the weaker test based on 'objdump'. See mingw*. + lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' + lt_cv_file_magic_cmd='$OBJDUMP -f' + ;; + +darwin* | rhapsody*) + lt_cv_deplibs_check_method=pass_all + ;; + +freebsd* | dragonfly*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + case $host_cpu in + i*86 ) + # Not sure whether the presence of OpenBSD here was a mistake. + # Let's accept both of them until this is cleared up. + lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` + ;; + esac + else + lt_cv_deplibs_check_method=pass_all + fi + ;; + +haiku*) + lt_cv_deplibs_check_method=pass_all + ;; + +hpux10.20* | hpux11*) + lt_cv_file_magic_cmd=/usr/bin/file + case $host_cpu in + ia64*) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64' + lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so + ;; + hppa*64*) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]' + lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl + ;; + *) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library' + lt_cv_file_magic_test_file=/usr/lib/libc.sl + ;; + esac + ;; + +interix[3-9]*) + # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$' + ;; + +irix5* | irix6* | nonstopux*) + case $LD in + *-32|*"-32 ") libmagic=32-bit;; + *-n32|*"-n32 ") libmagic=N32;; + *-64|*"-64 ") libmagic=64-bit;; + *) libmagic=never-match;; + esac + lt_cv_deplibs_check_method=pass_all + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + lt_cv_deplibs_check_method=pass_all + ;; + +netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$' + fi + ;; + +newos6*) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=/usr/lib/libnls.so + ;; + +*nto* | *qnx*) + lt_cv_deplibs_check_method=pass_all + ;; + +openbsd* | bitrig*) + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' + fi + ;; + +osf3* | osf4* | osf5*) + lt_cv_deplibs_check_method=pass_all + ;; + +rdos*) + lt_cv_deplibs_check_method=pass_all + ;; + +solaris*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv4 | sysv4.3*) + case $host_vendor in + motorola) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]' + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` + ;; + ncr) + lt_cv_deplibs_check_method=pass_all + ;; + sequent) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' + ;; + sni) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib" + lt_cv_file_magic_test_file=/lib/libc.so + ;; + siemens) + lt_cv_deplibs_check_method=pass_all + ;; + pc) + lt_cv_deplibs_check_method=pass_all + ;; + esac + ;; + +tpf*) + lt_cv_deplibs_check_method=pass_all + ;; +os2*) + lt_cv_deplibs_check_method=pass_all + ;; +esac + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5 +printf "%s\n" "$lt_cv_deplibs_check_method" >&6; } + +file_magic_glob= +want_nocaseglob=no +if test "$build" = "$host"; then + case $host_os in + mingw* | pw32*) + if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then + want_nocaseglob=yes + else + file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[\1]\/[\1]\/g;/g"` + fi + ;; + esac +fi + +file_magic_cmd=$lt_cv_file_magic_cmd +deplibs_check_method=$lt_cv_deplibs_check_method +test -z "$deplibs_check_method" && deplibs_check_method=unknown + + + + + + + + + + + + + + + + + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. +set dummy ${ac_tool_prefix}dlltool; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_DLLTOOL+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$DLLTOOL"; then + ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +DLLTOOL=$ac_cv_prog_DLLTOOL +if test -n "$DLLTOOL"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 +printf "%s\n" "$DLLTOOL" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_DLLTOOL"; then + ac_ct_DLLTOOL=$DLLTOOL + # Extract the first word of "dlltool", so it can be a program name with args. +set dummy dlltool; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_DLLTOOL+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_DLLTOOL"; then + ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_DLLTOOL="dlltool" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL +if test -n "$ac_ct_DLLTOOL"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 +printf "%s\n" "$ac_ct_DLLTOOL" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + if test "x$ac_ct_DLLTOOL" = x; then + DLLTOOL="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DLLTOOL=$ac_ct_DLLTOOL + fi +else + DLLTOOL="$ac_cv_prog_DLLTOOL" +fi + +test -z "$DLLTOOL" && DLLTOOL=dlltool + + + + + + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5 +printf %s "checking how to associate runtime and link libraries... " >&6; } +if test ${lt_cv_sharedlib_from_linklib_cmd+y} +then : + printf %s "(cached) " >&6 +else $as_nop + lt_cv_sharedlib_from_linklib_cmd='unknown' + +case $host_os in +cygwin* | mingw* | pw32* | cegcc*) + # two different shell functions defined in ltmain.sh; + # decide which one to use based on capabilities of $DLLTOOL + case `$DLLTOOL --help 2>&1` in + *--identify-strict*) + lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib + ;; + *) + lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback + ;; + esac + ;; +*) + # fallback: assume linklib IS sharedlib + lt_cv_sharedlib_from_linklib_cmd=$ECHO + ;; +esac + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5 +printf "%s\n" "$lt_cv_sharedlib_from_linklib_cmd" >&6; } +sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd +test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO + + + + + + + + +if test -n "$ac_tool_prefix"; then + for ac_prog in ar + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_AR+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$AR"; then + ac_cv_prog_AR="$AR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_AR="$ac_tool_prefix$ac_prog" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +AR=$ac_cv_prog_AR +if test -n "$AR"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 +printf "%s\n" "$AR" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + + test -n "$AR" && break + done +fi +if test -z "$AR"; then + ac_ct_AR=$AR + for ac_prog in ar +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_AR+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_AR"; then + ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_AR="$ac_prog" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_AR=$ac_cv_prog_ac_ct_AR +if test -n "$ac_ct_AR"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 +printf "%s\n" "$ac_ct_AR" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + + test -n "$ac_ct_AR" && break +done + + if test "x$ac_ct_AR" = x; then + AR="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + AR=$ac_ct_AR + fi +fi + +: ${AR=ar} +: ${AR_FLAGS=cru} + + + + + + + + + + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5 +printf %s "checking for archiver @FILE support... " >&6; } +if test ${lt_cv_ar_at_file+y} +then : + printf %s "(cached) " >&6 +else $as_nop + lt_cv_ar_at_file=no + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + echo conftest.$ac_objext > conftest.lst + lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5' + { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 + (eval $lt_ar_try) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if test 0 -eq "$ac_status"; then + # Ensure the archiver fails upon bogus file names. + rm -f conftest.$ac_objext libconftest.a + { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 + (eval $lt_ar_try) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if test 0 -ne "$ac_status"; then + lt_cv_ar_at_file=@ + fi + fi + rm -f conftest.* libconftest.a + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5 +printf "%s\n" "$lt_cv_ar_at_file" >&6; } + +if test no = "$lt_cv_ar_at_file"; then + archiver_list_spec= +else + archiver_list_spec=$lt_cv_ar_at_file +fi + + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. +set dummy ${ac_tool_prefix}strip; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_STRIP+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$STRIP"; then + ac_cv_prog_STRIP="$STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_STRIP="${ac_tool_prefix}strip" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +STRIP=$ac_cv_prog_STRIP +if test -n "$STRIP"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 +printf "%s\n" "$STRIP" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_STRIP"; then + ac_ct_STRIP=$STRIP + # Extract the first word of "strip", so it can be a program name with args. +set dummy strip; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_STRIP+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_STRIP"; then + ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_STRIP="strip" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP +if test -n "$ac_ct_STRIP"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 +printf "%s\n" "$ac_ct_STRIP" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + if test "x$ac_ct_STRIP" = x; then + STRIP=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + STRIP=$ac_ct_STRIP + fi +else + STRIP="$ac_cv_prog_STRIP" +fi + +test -z "$STRIP" && STRIP=: + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. +set dummy ${ac_tool_prefix}ranlib; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_RANLIB+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$RANLIB"; then + ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +RANLIB=$ac_cv_prog_RANLIB +if test -n "$RANLIB"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 +printf "%s\n" "$RANLIB" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_RANLIB"; then + ac_ct_RANLIB=$RANLIB + # Extract the first word of "ranlib", so it can be a program name with args. +set dummy ranlib; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_RANLIB+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_RANLIB"; then + ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_RANLIB="ranlib" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB +if test -n "$ac_ct_RANLIB"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 +printf "%s\n" "$ac_ct_RANLIB" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + if test "x$ac_ct_RANLIB" = x; then + RANLIB=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + RANLIB=$ac_ct_RANLIB + fi +else + RANLIB="$ac_cv_prog_RANLIB" +fi + +test -z "$RANLIB" && RANLIB=: + + + + + + +# Determine commands to create old-style static archives. +old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' +old_postinstall_cmds='chmod 644 $oldlib' +old_postuninstall_cmds= + +if test -n "$RANLIB"; then + case $host_os in + bitrig* | openbsd*) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" + ;; + *) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" + ;; + esac + old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" +fi + +case $host_os in + darwin*) + lock_old_archive_extraction=yes ;; + *) + lock_old_archive_extraction=no ;; +esac + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC + + +# Check for command to grab the raw symbol name followed by C symbol from nm. +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5 +printf %s "checking command to parse $NM output from $compiler object... " >&6; } +if test ${lt_cv_sys_global_symbol_pipe+y} +then : + printf %s "(cached) " >&6 +else $as_nop + +# These are sane defaults that work on at least a few old systems. +# [They come from Ultrix. What could be older than Ultrix?!! ;)] + +# Character class describing NM global symbol codes. +symcode='[BCDEGRST]' + +# Regexp to match symbols that can be accessed directly from C. +sympat='\([_A-Za-z][_A-Za-z0-9]*\)' + +# Define system-specific variables. +case $host_os in +aix*) + symcode='[BCDT]' + ;; +cygwin* | mingw* | pw32* | cegcc*) + symcode='[ABCDGISTW]' + ;; +hpux*) + if test ia64 = "$host_cpu"; then + symcode='[ABCDEGRST]' + fi + ;; +irix* | nonstopux*) + symcode='[BCDEGRST]' + ;; +osf*) + symcode='[BCDEGQRST]' + ;; +solaris*) + symcode='[BDRT]' + ;; +sco3.2v5*) + symcode='[DT]' + ;; +sysv4.2uw2*) + symcode='[DT]' + ;; +sysv5* | sco5v6* | unixware* | OpenUNIX*) + symcode='[ABDT]' + ;; +sysv4) + symcode='[DFNSTU]' + ;; +esac + +# If we're using GNU nm, then use its standard symbol codes. +case `$NM -V 2>&1` in +*GNU* | *'with BFD'*) + symcode='[ABCDGIRSTW]' ;; +esac + +if test "$lt_cv_nm_interface" = "MS dumpbin"; then + # Gets list of data symbols to import. + lt_cv_sys_global_symbol_to_import="sed -n -e 's/^I .* \(.*\)$/\1/p'" + # Adjust the below global symbol transforms to fixup imported variables. + lt_cdecl_hook=" -e 's/^I .* \(.*\)$/extern __declspec(dllimport) char \1;/p'" + lt_c_name_hook=" -e 's/^I .* \(.*\)$/ {\"\1\", (void *) 0},/p'" + lt_c_name_lib_hook="\ + -e 's/^I .* \(lib.*\)$/ {\"\1\", (void *) 0},/p'\ + -e 's/^I .* \(.*\)$/ {\"lib\1\", (void *) 0},/p'" +else + # Disable hooks by default. + lt_cv_sys_global_symbol_to_import= + lt_cdecl_hook= + lt_c_name_hook= + lt_c_name_lib_hook= +fi + +# Transform an extracted symbol line into a proper C declaration. +# Some systems (esp. on ia64) link data and code symbols differently, +# so use this general approach. +lt_cv_sys_global_symbol_to_cdecl="sed -n"\ +$lt_cdecl_hook\ +" -e 's/^T .* \(.*\)$/extern int \1();/p'"\ +" -e 's/^$symcode$symcode* .* \(.*\)$/extern char \1;/p'" + +# Transform an extracted symbol line into symbol name and symbol address +lt_cv_sys_global_symbol_to_c_name_address="sed -n"\ +$lt_c_name_hook\ +" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ +" -e 's/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/p'" + +# Transform an extracted symbol line into symbol name with lib prefix and +# symbol address. +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n"\ +$lt_c_name_lib_hook\ +" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ +" -e 's/^$symcode$symcode* .* \(lib.*\)$/ {\"\1\", (void *) \&\1},/p'"\ +" -e 's/^$symcode$symcode* .* \(.*\)$/ {\"lib\1\", (void *) \&\1},/p'" + +# Handle CRLF in mingw tool chain +opt_cr= +case $build_os in +mingw*) + opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp + ;; +esac + +# Try without a prefix underscore, then with it. +for ac_symprfx in "" "_"; do + + # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. + symxfrm="\\1 $ac_symprfx\\2 \\2" + + # Write the raw and C identifiers. + if test "$lt_cv_nm_interface" = "MS dumpbin"; then + # Fake it for dumpbin and say T for any non-static function, + # D for any global variable and I for any imported variable. + # Also find C++ and __fastcall symbols from MSVC++, + # which start with @ or ?. + lt_cv_sys_global_symbol_pipe="$AWK '"\ +" {last_section=section; section=\$ 3};"\ +" /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ +" /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ +" /^ *Symbol name *: /{split(\$ 0,sn,\":\"); si=substr(sn[2],2)};"\ +" /^ *Type *: code/{print \"T\",si,substr(si,length(prfx))};"\ +" /^ *Type *: data/{print \"I\",si,substr(si,length(prfx))};"\ +" \$ 0!~/External *\|/{next};"\ +" / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ +" {if(hide[section]) next};"\ +" {f=\"D\"}; \$ 0~/\(\).*\|/{f=\"T\"};"\ +" {split(\$ 0,a,/\||\r/); split(a[2],s)};"\ +" s[1]~/^[@?]/{print f,s[1],s[1]; next};"\ +" s[1]~prfx {split(s[1],t,\"@\"); print f,t[1],substr(t[1],length(prfx))}"\ +" ' prfx=^$ac_symprfx" + else + lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" + fi + lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" + + # Check to see that the pipe works correctly. + pipe_works=no + + rm -f conftest* + cat > conftest.$ac_ext <<_LT_EOF +#ifdef __cplusplus +extern "C" { +#endif +char nm_test_var; +void nm_test_func(void); +void nm_test_func(void){} +#ifdef __cplusplus +} +#endif +int main(){nm_test_var='a';nm_test_func();return(0);} +_LT_EOF + + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + # Now try to grab the symbols. + nlist=conftest.nm + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist\""; } >&5 + (eval $NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s "$nlist"; then + # Try sorting and uniquifying the output. + if sort "$nlist" | uniq > "$nlist"T; then + mv -f "$nlist"T "$nlist" + else + rm -f "$nlist"T + fi + + # Make sure that we snagged all the symbols we need. + if $GREP ' nm_test_var$' "$nlist" >/dev/null; then + if $GREP ' nm_test_func$' "$nlist" >/dev/null; then + cat <<_LT_EOF > conftest.$ac_ext +/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ +#if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE +/* DATA imports from DLLs on WIN32 can't be const, because runtime + relocations are performed -- see ld's documentation on pseudo-relocs. */ +# define LT@&t@_DLSYM_CONST +#elif defined __osf__ +/* This system does not cope well with relocations in const data. */ +# define LT@&t@_DLSYM_CONST +#else +# define LT@&t@_DLSYM_CONST const +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +_LT_EOF + # Now generate the symbol file. + eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' + + cat <<_LT_EOF >> conftest.$ac_ext + +/* The mapping between symbol names and symbols. */ +LT@&t@_DLSYM_CONST struct { + const char *name; + void *address; +} +lt__PROGRAM__LTX_preloaded_symbols[] = +{ + { "@PROGRAM@", (void *) 0 }, +_LT_EOF + $SED "s/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext + cat <<\_LT_EOF >> conftest.$ac_ext + {0, (void *) 0} +}; + +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt__PROGRAM__LTX_preloaded_symbols; +} +#endif + +#ifdef __cplusplus +} +#endif +_LT_EOF + # Now try linking the two files. + mv conftest.$ac_objext conftstm.$ac_objext + lt_globsym_save_LIBS=$LIBS + lt_globsym_save_CFLAGS=$CFLAGS + LIBS=conftstm.$ac_objext + CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 + (eval $ac_link) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s conftest$ac_exeext; then + pipe_works=yes + fi + LIBS=$lt_globsym_save_LIBS + CFLAGS=$lt_globsym_save_CFLAGS + else + echo "cannot find nm_test_func in $nlist" >&5 + fi + else + echo "cannot find nm_test_var in $nlist" >&5 + fi + else + echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5 + fi + else + echo "$progname: failed program was:" >&5 + cat conftest.$ac_ext >&5 + fi + rm -rf conftest* conftst* + + # Do not use the global_symbol_pipe unless it works. + if test yes = "$pipe_works"; then + break + else + lt_cv_sys_global_symbol_pipe= + fi +done + +fi + +if test -z "$lt_cv_sys_global_symbol_pipe"; then + lt_cv_sys_global_symbol_to_cdecl= +fi +if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: failed" >&5 +printf "%s\n" "failed" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: ok" >&5 +printf "%s\n" "ok" >&6; } +fi + +# Response file support. +if test "$lt_cv_nm_interface" = "MS dumpbin"; then + nm_file_list_spec='@' +elif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then + nm_file_list_spec='@' +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5 +printf %s "checking for sysroot... " >&6; } + +@%:@ Check whether --with-sysroot was given. +if test ${with_sysroot+y} +then : + withval=$with_sysroot; +else $as_nop + with_sysroot=no +fi + + +lt_sysroot= +case $with_sysroot in #( + yes) + if test yes = "$GCC"; then + lt_sysroot=`$CC --print-sysroot 2>/dev/null` + fi + ;; #( + /*) + lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` + ;; #( + no|'') + ;; #( + *) + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $with_sysroot" >&5 +printf "%s\n" "$with_sysroot" >&6; } + as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5 + ;; +esac + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5 +printf "%s\n" "${lt_sysroot:-no}" >&6; } + + + + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a working dd" >&5 +printf %s "checking for a working dd... " >&6; } +if test ${ac_cv_path_lt_DD+y} +then : + printf %s "(cached) " >&6 +else $as_nop + printf 0123456789abcdef0123456789abcdef >conftest.i +cat conftest.i conftest.i >conftest2.i +: ${lt_DD:=$DD} +if test -z "$lt_DD"; then + ac_path_lt_DD_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_prog in dd + do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_lt_DD="$as_dir$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_lt_DD" || continue +if "$ac_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then + cmp -s conftest.i conftest.out \ + && ac_cv_path_lt_DD="$ac_path_lt_DD" ac_path_lt_DD_found=: +fi + $ac_path_lt_DD_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_lt_DD"; then + : + fi +else + ac_cv_path_lt_DD=$lt_DD +fi + +rm -f conftest.i conftest2.i conftest.out +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_lt_DD" >&5 +printf "%s\n" "$ac_cv_path_lt_DD" >&6; } + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to truncate binary pipes" >&5 +printf %s "checking how to truncate binary pipes... " >&6; } +if test ${lt_cv_truncate_bin+y} +then : + printf %s "(cached) " >&6 +else $as_nop + printf 0123456789abcdef0123456789abcdef >conftest.i +cat conftest.i conftest.i >conftest2.i +lt_cv_truncate_bin= +if "$ac_cv_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then + cmp -s conftest.i conftest.out \ + && lt_cv_truncate_bin="$ac_cv_path_lt_DD bs=4096 count=1" +fi +rm -f conftest.i conftest2.i conftest.out +test -z "$lt_cv_truncate_bin" && lt_cv_truncate_bin="$SED -e 4q" +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_truncate_bin" >&5 +printf "%s\n" "$lt_cv_truncate_bin" >&6; } + + + + + + + +# Calculate cc_basename. Skip known compiler wrappers and cross-prefix. +func_cc_basename () +{ + for cc_temp in @S|@*""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac + done + func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` +} + +@%:@ Check whether --enable-libtool-lock was given. +if test ${enable_libtool_lock+y} +then : + enableval=$enable_libtool_lock; +fi + +test no = "$enable_libtool_lock" || enable_libtool_lock=yes + +# Some flags need to be propagated to the compiler or linker for good +# libtool support. +case $host in +ia64-*-hpux*) + # Find out what ABI is being produced by ac_compile, and set mode + # options accordingly. + echo 'int i;' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + case `/usr/bin/file conftest.$ac_objext` in + *ELF-32*) + HPUX_IA64_MODE=32 + ;; + *ELF-64*) + HPUX_IA64_MODE=64 + ;; + esac + fi + rm -rf conftest* + ;; +*-*-irix6*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. + echo '#line '$LINENO' "configure"' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + if test yes = "$lt_cv_prog_gnu_ld"; then + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -melf32bsmip" + ;; + *N32*) + LD="${LD-ld} -melf32bmipn32" + ;; + *64-bit*) + LD="${LD-ld} -melf64bmip" + ;; + esac + else + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -32" + ;; + *N32*) + LD="${LD-ld} -n32" + ;; + *64-bit*) + LD="${LD-ld} -64" + ;; + esac + fi + fi + rm -rf conftest* + ;; + +mips64*-*linux*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. + echo '#line '$LINENO' "configure"' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + emul=elf + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + emul="${emul}32" + ;; + *64-bit*) + emul="${emul}64" + ;; + esac + case `/usr/bin/file conftest.$ac_objext` in + *MSB*) + emul="${emul}btsmip" + ;; + *LSB*) + emul="${emul}ltsmip" + ;; + esac + case `/usr/bin/file conftest.$ac_objext` in + *N32*) + emul="${emul}n32" + ;; + esac + LD="${LD-ld} -m $emul" + fi + rm -rf conftest* + ;; + +x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \ +s390*-*linux*|s390*-*tpf*|sparc*-*linux*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. Note that the listed cases only cover the + # situations where additional linker options are needed (such as when + # doing 32-bit compilation for a host where ld defaults to 64-bit, or + # vice versa); the common cases where no linker options are needed do + # not appear in the list. + echo 'int i;' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + case `/usr/bin/file conftest.o` in + *32-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_i386_fbsd" + ;; + x86_64-*linux*) + case `/usr/bin/file conftest.o` in + *x86-64*) + LD="${LD-ld} -m elf32_x86_64" + ;; + *) + LD="${LD-ld} -m elf_i386" + ;; + esac + ;; + powerpc64le-*linux*) + LD="${LD-ld} -m elf32lppclinux" + ;; + powerpc64-*linux*) + LD="${LD-ld} -m elf32ppclinux" + ;; + s390x-*linux*) + LD="${LD-ld} -m elf_s390" + ;; + sparc64-*linux*) + LD="${LD-ld} -m elf32_sparc" + ;; + esac + ;; + *64-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_x86_64_fbsd" + ;; + x86_64-*linux*) + LD="${LD-ld} -m elf_x86_64" + ;; + powerpcle-*linux*) + LD="${LD-ld} -m elf64lppc" + ;; + powerpc-*linux*) + LD="${LD-ld} -m elf64ppc" + ;; + s390*-*linux*|s390*-*tpf*) + LD="${LD-ld} -m elf64_s390" + ;; + sparc*-*linux*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; + +*-*-sco3.2v5*) + # On SCO OpenServer 5, we need -belf to get full-featured binaries. + SAVE_CFLAGS=$CFLAGS + CFLAGS="$CFLAGS -belf" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5 +printf %s "checking whether the C compiler needs -belf... " >&6; } +if test ${lt_cv_cc_needs_belf+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + lt_cv_cc_needs_belf=yes +else $as_nop + lt_cv_cc_needs_belf=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5 +printf "%s\n" "$lt_cv_cc_needs_belf" >&6; } + if test yes != "$lt_cv_cc_needs_belf"; then + # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf + CFLAGS=$SAVE_CFLAGS + fi + ;; +*-*solaris*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. + echo 'int i;' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + case `/usr/bin/file conftest.o` in + *64-bit*) + case $lt_cv_prog_gnu_ld in + yes*) + case $host in + i?86-*-solaris*|x86_64-*-solaris*) + LD="${LD-ld} -m elf_x86_64" + ;; + sparc*-*-solaris*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + # GNU ld 2.21 introduced _sol2 emulations. Use them if available. + if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then + LD=${LD-ld}_sol2 + fi + ;; + *) + if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then + LD="${LD-ld} -64" + fi + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; +esac + +need_locks=$enable_libtool_lock + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args. +set dummy ${ac_tool_prefix}mt; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_MANIFEST_TOOL+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$MANIFEST_TOOL"; then + ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL +if test -n "$MANIFEST_TOOL"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5 +printf "%s\n" "$MANIFEST_TOOL" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_MANIFEST_TOOL"; then + ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL + # Extract the first word of "mt", so it can be a program name with args. +set dummy mt; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_MANIFEST_TOOL+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_MANIFEST_TOOL"; then + ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_MANIFEST_TOOL="mt" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL +if test -n "$ac_ct_MANIFEST_TOOL"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5 +printf "%s\n" "$ac_ct_MANIFEST_TOOL" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + if test "x$ac_ct_MANIFEST_TOOL" = x; then + MANIFEST_TOOL=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL + fi +else + MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL" +fi + +test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5 +printf %s "checking if $MANIFEST_TOOL is a manifest tool... " >&6; } +if test ${lt_cv_path_mainfest_tool+y} +then : + printf %s "(cached) " >&6 +else $as_nop + lt_cv_path_mainfest_tool=no + echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5 + $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out + cat conftest.err >&5 + if $GREP 'Manifest Tool' conftest.out > /dev/null; then + lt_cv_path_mainfest_tool=yes + fi + rm -f conftest* +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5 +printf "%s\n" "$lt_cv_path_mainfest_tool" >&6; } +if test yes != "$lt_cv_path_mainfest_tool"; then + MANIFEST_TOOL=: +fi + + + + + + + case $host_os in + rhapsody* | darwin*) + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args. +set dummy ${ac_tool_prefix}dsymutil; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_DSYMUTIL+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$DSYMUTIL"; then + ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +DSYMUTIL=$ac_cv_prog_DSYMUTIL +if test -n "$DSYMUTIL"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5 +printf "%s\n" "$DSYMUTIL" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_DSYMUTIL"; then + ac_ct_DSYMUTIL=$DSYMUTIL + # Extract the first word of "dsymutil", so it can be a program name with args. +set dummy dsymutil; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_DSYMUTIL+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_DSYMUTIL"; then + ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_DSYMUTIL="dsymutil" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL +if test -n "$ac_ct_DSYMUTIL"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5 +printf "%s\n" "$ac_ct_DSYMUTIL" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + if test "x$ac_ct_DSYMUTIL" = x; then + DSYMUTIL=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DSYMUTIL=$ac_ct_DSYMUTIL + fi +else + DSYMUTIL="$ac_cv_prog_DSYMUTIL" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args. +set dummy ${ac_tool_prefix}nmedit; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_NMEDIT+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$NMEDIT"; then + ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +NMEDIT=$ac_cv_prog_NMEDIT +if test -n "$NMEDIT"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5 +printf "%s\n" "$NMEDIT" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_NMEDIT"; then + ac_ct_NMEDIT=$NMEDIT + # Extract the first word of "nmedit", so it can be a program name with args. +set dummy nmedit; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_NMEDIT+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_NMEDIT"; then + ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_NMEDIT="nmedit" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT +if test -n "$ac_ct_NMEDIT"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5 +printf "%s\n" "$ac_ct_NMEDIT" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + if test "x$ac_ct_NMEDIT" = x; then + NMEDIT=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + NMEDIT=$ac_ct_NMEDIT + fi +else + NMEDIT="$ac_cv_prog_NMEDIT" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args. +set dummy ${ac_tool_prefix}lipo; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_LIPO+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$LIPO"; then + ac_cv_prog_LIPO="$LIPO" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_LIPO="${ac_tool_prefix}lipo" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +LIPO=$ac_cv_prog_LIPO +if test -n "$LIPO"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5 +printf "%s\n" "$LIPO" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_LIPO"; then + ac_ct_LIPO=$LIPO + # Extract the first word of "lipo", so it can be a program name with args. +set dummy lipo; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_LIPO+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_LIPO"; then + ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_LIPO="lipo" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO +if test -n "$ac_ct_LIPO"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5 +printf "%s\n" "$ac_ct_LIPO" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + if test "x$ac_ct_LIPO" = x; then + LIPO=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + LIPO=$ac_ct_LIPO + fi +else + LIPO="$ac_cv_prog_LIPO" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args. +set dummy ${ac_tool_prefix}otool; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_OTOOL+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$OTOOL"; then + ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_OTOOL="${ac_tool_prefix}otool" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +OTOOL=$ac_cv_prog_OTOOL +if test -n "$OTOOL"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5 +printf "%s\n" "$OTOOL" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OTOOL"; then + ac_ct_OTOOL=$OTOOL + # Extract the first word of "otool", so it can be a program name with args. +set dummy otool; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_OTOOL+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_OTOOL"; then + ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_OTOOL="otool" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL +if test -n "$ac_ct_OTOOL"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5 +printf "%s\n" "$ac_ct_OTOOL" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + if test "x$ac_ct_OTOOL" = x; then + OTOOL=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OTOOL=$ac_ct_OTOOL + fi +else + OTOOL="$ac_cv_prog_OTOOL" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args. +set dummy ${ac_tool_prefix}otool64; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_OTOOL64+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$OTOOL64"; then + ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +OTOOL64=$ac_cv_prog_OTOOL64 +if test -n "$OTOOL64"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5 +printf "%s\n" "$OTOOL64" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OTOOL64"; then + ac_ct_OTOOL64=$OTOOL64 + # Extract the first word of "otool64", so it can be a program name with args. +set dummy otool64; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_OTOOL64+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_OTOOL64"; then + ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_OTOOL64="otool64" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64 +if test -n "$ac_ct_OTOOL64"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5 +printf "%s\n" "$ac_ct_OTOOL64" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + if test "x$ac_ct_OTOOL64" = x; then + OTOOL64=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OTOOL64=$ac_ct_OTOOL64 + fi +else + OTOOL64="$ac_cv_prog_OTOOL64" +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5 +printf %s "checking for -single_module linker flag... " >&6; } +if test ${lt_cv_apple_cc_single_mod+y} +then : + printf %s "(cached) " >&6 +else $as_nop + lt_cv_apple_cc_single_mod=no + if test -z "$LT_MULTI_MODULE"; then + # By default we will add the -single_module flag. You can override + # by either setting the environment variable LT_MULTI_MODULE + # non-empty at configure time, or by adding -multi_module to the + # link flags. + rm -rf libconftest.dylib* + echo "int foo(void){return 1;}" > conftest.c + echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ +-dynamiclib -Wl,-single_module conftest.c" >&5 + $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ + -dynamiclib -Wl,-single_module conftest.c 2>conftest.err + _lt_result=$? + # If there is a non-empty error log, and "single_module" + # appears in it, assume the flag caused a linker warning + if test -s conftest.err && $GREP single_module conftest.err; then + cat conftest.err >&5 + # Otherwise, if the output was created with a 0 exit code from + # the compiler, it worked. + elif test -f libconftest.dylib && test 0 = "$_lt_result"; then + lt_cv_apple_cc_single_mod=yes + else + cat conftest.err >&5 + fi + rm -rf libconftest.dylib* + rm -f conftest.* + fi +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5 +printf "%s\n" "$lt_cv_apple_cc_single_mod" >&6; } + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5 +printf %s "checking for -exported_symbols_list linker flag... " >&6; } +if test ${lt_cv_ld_exported_symbols_list+y} +then : + printf %s "(cached) " >&6 +else $as_nop + lt_cv_ld_exported_symbols_list=no + save_LDFLAGS=$LDFLAGS + echo "_main" > conftest.sym + LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + lt_cv_ld_exported_symbols_list=yes +else $as_nop + lt_cv_ld_exported_symbols_list=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$save_LDFLAGS + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5 +printf "%s\n" "$lt_cv_ld_exported_symbols_list" >&6; } + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5 +printf %s "checking for -force_load linker flag... " >&6; } +if test ${lt_cv_ld_force_load+y} +then : + printf %s "(cached) " >&6 +else $as_nop + lt_cv_ld_force_load=no + cat > conftest.c << _LT_EOF +int forced_loaded() { return 2;} +_LT_EOF + echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5 + $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5 + echo "$AR cru libconftest.a conftest.o" >&5 + $AR cru libconftest.a conftest.o 2>&5 + echo "$RANLIB libconftest.a" >&5 + $RANLIB libconftest.a 2>&5 + cat > conftest.c << _LT_EOF +int main() { return 0;} +_LT_EOF + echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5 + $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err + _lt_result=$? + if test -s conftest.err && $GREP force_load conftest.err; then + cat conftest.err >&5 + elif test -f conftest && test 0 = "$_lt_result" && $GREP forced_load conftest >/dev/null 2>&1; then + lt_cv_ld_force_load=yes + else + cat conftest.err >&5 + fi + rm -f conftest.err libconftest.a conftest conftest.c + rm -rf conftest.dSYM + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5 +printf "%s\n" "$lt_cv_ld_force_load" >&6; } + case $host_os in + rhapsody* | darwin1.[012]) + _lt_dar_allow_undefined='$wl-undefined ${wl}suppress' ;; + darwin1.*) + _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; + darwin*) + case ${MACOSX_DEPLOYMENT_TARGET},$host in + 10.[012],*|,*powerpc*) + _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; + *) + _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; + esac + ;; + esac + if test yes = "$lt_cv_apple_cc_single_mod"; then + _lt_dar_single_mod='$single_module' + fi + if test yes = "$lt_cv_ld_exported_symbols_list"; then + _lt_dar_export_syms=' $wl-exported_symbols_list,$output_objdir/$libname-symbols.expsym' + else + _lt_dar_export_syms='~$NMEDIT -s $output_objdir/$libname-symbols.expsym $lib' + fi + if test : != "$DSYMUTIL" && test no = "$lt_cv_ld_force_load"; then + _lt_dsymutil='~$DSYMUTIL $lib || :' + else + _lt_dsymutil= + fi + ;; + esac + +# func_munge_path_list VARIABLE PATH +# ----------------------------------- +# VARIABLE is name of variable containing _space_ separated list of +# directories to be munged by the contents of PATH, which is string +# having a format: +# "DIR[:DIR]:" +# string "DIR[ DIR]" will be prepended to VARIABLE +# ":DIR[:DIR]" +# string "DIR[ DIR]" will be appended to VARIABLE +# "DIRP[:DIRP]::[DIRA:]DIRA" +# string "DIRP[ DIRP]" will be prepended to VARIABLE and string +# "DIRA[ DIRA]" will be appended to VARIABLE +# "DIR[:DIR]" +# VARIABLE will be replaced by "DIR[ DIR]" +func_munge_path_list () +{ + case x@S|@2 in + x) + ;; + *:) + eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'` \@S|@@S|@1\" + ;; + x:*) + eval @S|@1=\"\@S|@@S|@1 `$ECHO @S|@2 | $SED 's/:/ /g'`\" + ;; + *::*) + eval @S|@1=\"\@S|@@S|@1\ `$ECHO @S|@2 | $SED -e 's/.*:://' -e 's/:/ /g'`\" + eval @S|@1=\"`$ECHO @S|@2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \@S|@@S|@1\" + ;; + *) + eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'`\" + ;; + esac +} + +ac_header= ac_cache= +for ac_item in $ac_header_c_list +do + if test $ac_cache; then + ac_fn_c_check_header_compile "$LINENO" $ac_header ac_cv_header_$ac_cache "$ac_includes_default" + if eval test \"x\$ac_cv_header_$ac_cache\" = xyes; then + printf "%s\n" "#define $ac_item 1" >> confdefs.h + fi + ac_header= ac_cache= + elif test $ac_header; then + ac_cache=$ac_item + else + ac_header=$ac_item + fi +done + + + + + + + + +if test $ac_cv_header_stdlib_h = yes && test $ac_cv_header_string_h = yes +then : + +printf "%s\n" "@%:@define STDC_HEADERS 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default +" +if test "x$ac_cv_header_dlfcn_h" = xyes +then : + printf "%s\n" "@%:@define HAVE_DLFCN_H 1" >>confdefs.h + +fi + + + + +func_stripname_cnf () +{ + case @S|@2 in + .*) func_stripname_result=`$ECHO "@S|@3" | $SED "s%^@S|@1%%; s%\\\\@S|@2\$%%"`;; + *) func_stripname_result=`$ECHO "@S|@3" | $SED "s%^@S|@1%%; s%@S|@2\$%%"`;; + esac +} # func_stripname_cnf + + + + + +# Set options + + + + enable_dlopen=no + + + + @%:@ Check whether --enable-shared was given. +if test ${enable_shared+y} +then : + enableval=$enable_shared; p=${PACKAGE-default} + case $enableval in + yes) enable_shared=yes ;; + no) enable_shared=no ;; + *) + enable_shared=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for pkg in $enableval; do + IFS=$lt_save_ifs + if test "X$pkg" = "X$p"; then + enable_shared=yes + fi + done + IFS=$lt_save_ifs + ;; + esac +else $as_nop + enable_shared=yes +fi + + + + + + + + + + @%:@ Check whether --enable-static was given. +if test ${enable_static+y} +then : + enableval=$enable_static; p=${PACKAGE-default} + case $enableval in + yes) enable_static=yes ;; + no) enable_static=no ;; + *) + enable_static=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for pkg in $enableval; do + IFS=$lt_save_ifs + if test "X$pkg" = "X$p"; then + enable_static=yes + fi + done + IFS=$lt_save_ifs + ;; + esac +else $as_nop + enable_static=yes +fi + + + + + + + + + + +@%:@ Check whether --with-pic was given. +if test ${with_pic+y} +then : + withval=$with_pic; lt_p=${PACKAGE-default} + case $withval in + yes|no) pic_mode=$withval ;; + *) + pic_mode=default + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for lt_pkg in $withval; do + IFS=$lt_save_ifs + if test "X$lt_pkg" = "X$lt_p"; then + pic_mode=yes + fi + done + IFS=$lt_save_ifs + ;; + esac +else $as_nop + pic_mode=default +fi + + + + + + + + + @%:@ Check whether --enable-fast-install was given. +if test ${enable_fast_install+y} +then : + enableval=$enable_fast_install; p=${PACKAGE-default} + case $enableval in + yes) enable_fast_install=yes ;; + no) enable_fast_install=no ;; + *) + enable_fast_install=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for pkg in $enableval; do + IFS=$lt_save_ifs + if test "X$pkg" = "X$p"; then + enable_fast_install=yes + fi + done + IFS=$lt_save_ifs + ;; + esac +else $as_nop + enable_fast_install=yes +fi + + + + + + + + + shared_archive_member_spec= +case $host,$enable_shared in +power*-*-aix[5-9]*,yes) + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking which variant of shared library versioning to provide" >&5 +printf %s "checking which variant of shared library versioning to provide... " >&6; } + +@%:@ Check whether --with-aix-soname was given. +if test ${with_aix_soname+y} +then : + withval=$with_aix_soname; case $withval in + aix|svr4|both) + ;; + *) + as_fn_error $? "Unknown argument to --with-aix-soname" "$LINENO" 5 + ;; + esac + lt_cv_with_aix_soname=$with_aix_soname +else $as_nop + if test ${lt_cv_with_aix_soname+y} +then : + printf %s "(cached) " >&6 +else $as_nop + lt_cv_with_aix_soname=aix +fi + + with_aix_soname=$lt_cv_with_aix_soname +fi + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $with_aix_soname" >&5 +printf "%s\n" "$with_aix_soname" >&6; } + if test aix != "$with_aix_soname"; then + # For the AIX way of multilib, we name the shared archive member + # based on the bitwidth used, traditionally 'shr.o' or 'shr_64.o', + # and 'shr.imp' or 'shr_64.imp', respectively, for the Import File. + # Even when GNU compilers ignore OBJECT_MODE but need '-maix64' flag, + # the AIX toolchain works better with OBJECT_MODE set (default 32). + if test 64 = "${OBJECT_MODE-32}"; then + shared_archive_member_spec=shr_64 + else + shared_archive_member_spec=shr + fi + fi + ;; +*) + with_aix_soname=aix + ;; +esac + + + + + + + + + + +# This can be used to rebuild libtool when needed +LIBTOOL_DEPS=$ltmain + +# Always use our own libtool. +LIBTOOL='$(SHELL) $(top_builddir)/libtool' + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +test -z "$LN_S" && LN_S="ln -s" + + + + + + + + + + + + + + +if test -n "${ZSH_VERSION+set}"; then + setopt NO_GLOB_SUBST +fi + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5 +printf %s "checking for objdir... " >&6; } +if test ${lt_cv_objdir+y} +then : + printf %s "(cached) " >&6 +else $as_nop + rm -f .libs 2>/dev/null +mkdir .libs 2>/dev/null +if test -d .libs; then + lt_cv_objdir=.libs +else + # MS-DOS does not allow filenames that begin with a dot. + lt_cv_objdir=_libs +fi +rmdir .libs 2>/dev/null +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5 +printf "%s\n" "$lt_cv_objdir" >&6; } +objdir=$lt_cv_objdir + + + + + +printf "%s\n" "@%:@define LT_OBJDIR \"$lt_cv_objdir/\"" >>confdefs.h + + + + +case $host_os in +aix3*) + # AIX sometimes has problems with the GCC collect2 program. For some + # reason, if we set the COLLECT_NAMES environment variable, the problems + # vanish in a puff of smoke. + if test set != "${COLLECT_NAMES+set}"; then + COLLECT_NAMES= + export COLLECT_NAMES + fi + ;; +esac + +# Global variables: +ofile=libtool +can_build_shared=yes + +# All known linkers require a '.a' archive for static linking (except MSVC, +# which needs '.lib'). +libext=a + +with_gnu_ld=$lt_cv_prog_gnu_ld + +old_CC=$CC +old_CFLAGS=$CFLAGS + +# Set sane defaults for various variables +test -z "$CC" && CC=cc +test -z "$LTCC" && LTCC=$CC +test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS +test -z "$LD" && LD=ld +test -z "$ac_objext" && ac_objext=o + +func_cc_basename $compiler +cc_basename=$func_cc_basename_result + + +# Only perform the check for file, if the check method requires it +test -z "$MAGIC_CMD" && MAGIC_CMD=file +case $deplibs_check_method in +file_magic*) + if test "$file_magic_cmd" = '$MAGIC_CMD'; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5 +printf %s "checking for ${ac_tool_prefix}file... " >&6; } +if test ${lt_cv_path_MAGIC_CMD+y} +then : + printf %s "(cached) " >&6 +else $as_nop + case $MAGIC_CMD in +[\\/*] | ?:[\\/]*) + lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD=$MAGIC_CMD + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR + ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" + for ac_dir in $ac_dummy; do + IFS=$lt_save_ifs + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/${ac_tool_prefix}file"; then + lt_cv_path_MAGIC_CMD=$ac_dir/"${ac_tool_prefix}file" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` + MAGIC_CMD=$lt_cv_path_MAGIC_CMD + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <<_LT_EOF 1>&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +_LT_EOF + fi ;; + esac + fi + break + fi + done + IFS=$lt_save_ifs + MAGIC_CMD=$lt_save_MAGIC_CMD + ;; +esac +fi + +MAGIC_CMD=$lt_cv_path_MAGIC_CMD +if test -n "$MAGIC_CMD"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 +printf "%s\n" "$MAGIC_CMD" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + + + + +if test -z "$lt_cv_path_MAGIC_CMD"; then + if test -n "$ac_tool_prefix"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for file" >&5 +printf %s "checking for file... " >&6; } +if test ${lt_cv_path_MAGIC_CMD+y} +then : + printf %s "(cached) " >&6 +else $as_nop + case $MAGIC_CMD in +[\\/*] | ?:[\\/]*) + lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD=$MAGIC_CMD + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR + ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" + for ac_dir in $ac_dummy; do + IFS=$lt_save_ifs + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/file"; then + lt_cv_path_MAGIC_CMD=$ac_dir/"file" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` + MAGIC_CMD=$lt_cv_path_MAGIC_CMD + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <<_LT_EOF 1>&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +_LT_EOF + fi ;; + esac + fi + break + fi + done + IFS=$lt_save_ifs + MAGIC_CMD=$lt_save_MAGIC_CMD + ;; +esac +fi + +MAGIC_CMD=$lt_cv_path_MAGIC_CMD +if test -n "$MAGIC_CMD"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 +printf "%s\n" "$MAGIC_CMD" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + + else + MAGIC_CMD=: + fi +fi + + fi + ;; +esac + +# Use C for the default configuration in the libtool script + +lt_save_CC=$CC +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +# Source file extension for C test sources. +ac_ext=c + +# Object file extension for compiled C test sources. +objext=o +objext=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="int some_variable = 0;" + +# Code to be used in simple link tests +lt_simple_link_test_code='int main(){return(0);}' + + + + + + + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC + +# Save the default compiler, since it gets overwritten when the other +# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. +compiler_DEFAULT=$CC + +# save warnings/boilerplate of simple test code +ac_outfile=conftest.$ac_objext +echo "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$RM conftest* + +ac_outfile=conftest.$ac_objext +echo "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$RM -r conftest* + + +## CAVEAT EMPTOR: +## There is no encapsulation within the following macros, do not change +## the running order or otherwise move them around unless you know exactly +## what you are doing... +if test -n "$compiler"; then + +lt_prog_compiler_no_builtin_flag= + +if test yes = "$GCC"; then + case $cc_basename in + nvcc*) + lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;; + *) + lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;; + esac + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 +printf %s "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } +if test ${lt_cv_prog_compiler_rtti_exceptions+y} +then : + printf %s "(cached) " >&6 +else $as_nop + lt_cv_prog_compiler_rtti_exceptions=no + ac_outfile=conftest.$ac_objext + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="-fno-rtti -fno-exceptions" ## exclude from sc_useless_quotes_in_assignment + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_rtti_exceptions=yes + fi + fi + $RM conftest* + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 +printf "%s\n" "$lt_cv_prog_compiler_rtti_exceptions" >&6; } + +if test yes = "$lt_cv_prog_compiler_rtti_exceptions"; then + lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" +else + : +fi + +fi + + + + + + + lt_prog_compiler_wl= +lt_prog_compiler_pic= +lt_prog_compiler_static= + + + if test yes = "$GCC"; then + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_static='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static='-Bstatic' + fi + lt_prog_compiler_pic='-fPIC' + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + lt_prog_compiler_pic='-fPIC' + ;; + m68k) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the '-m68020' flag to GCC prevents building anything better, + # like '-m68040'. + lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + lt_prog_compiler_pic='-DDLL_EXPORT' + case $host_os in + os2*) + lt_prog_compiler_static='$wl-static' + ;; + esac + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic='-fno-common' + ;; + + haiku*) + # PIC is the default for Haiku. + # The "-static" flag exists, but is broken. + lt_prog_compiler_static= + ;; + + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic='-fPIC' + ;; + esac + ;; + + interix[3-9]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + + msdosdjgpp*) + # Just because we use GCC doesn't mean we suddenly get shared libraries + # on systems that don't support them. + lt_prog_compiler_can_build_shared=no + enable_shared=no + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic='-fPIC -shared' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic=-Kconform_pic + fi + ;; + + *) + lt_prog_compiler_pic='-fPIC' + ;; + esac + + case $cc_basename in + nvcc*) # Cuda Compiler Driver 2.2 + lt_prog_compiler_wl='-Xlinker ' + if test -n "$lt_prog_compiler_pic"; then + lt_prog_compiler_pic="-Xcompiler $lt_prog_compiler_pic" + fi + ;; + esac + else + # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in + aix*) + lt_prog_compiler_wl='-Wl,' + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static='-Bstatic' + else + lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' + fi + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic='-fno-common' + case $cc_basename in + nagfor*) + # NAG Fortran compiler + lt_prog_compiler_wl='-Wl,-Wl,,' + lt_prog_compiler_pic='-PIC' + lt_prog_compiler_static='-Bstatic' + ;; + esac + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_prog_compiler_pic='-DDLL_EXPORT' + case $host_os in + os2*) + lt_prog_compiler_static='$wl-static' + ;; + esac + ;; + + hpux9* | hpux10* | hpux11*) + lt_prog_compiler_wl='-Wl,' + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic='+Z' + ;; + esac + # Is there a better lt_prog_compiler_static that works with the bundled CC? + lt_prog_compiler_static='$wl-a ${wl}archive' + ;; + + irix5* | irix6* | nonstopux*) + lt_prog_compiler_wl='-Wl,' + # PIC (with -KPIC) is the default. + lt_prog_compiler_static='-non_shared' + ;; + + linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + case $cc_basename in + # old Intel for x86_64, which still supported -KPIC. + ecc*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-static' + ;; + # icc used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + icc* | ifort*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fPIC' + lt_prog_compiler_static='-static' + ;; + # Lahey Fortran 8.1. + lf95*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='--shared' + lt_prog_compiler_static='--static' + ;; + nagfor*) + # NAG Fortran compiler + lt_prog_compiler_wl='-Wl,-Wl,,' + lt_prog_compiler_pic='-PIC' + lt_prog_compiler_static='-Bstatic' + ;; + tcc*) + # Fabrice Bellard et al's Tiny C Compiler + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fPIC' + lt_prog_compiler_static='-static' + ;; + pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group compilers (*not* the Pentium gcc compiler, + # which looks to be a dead project) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fpic' + lt_prog_compiler_static='-Bstatic' + ;; + ccc*) + lt_prog_compiler_wl='-Wl,' + # All Alpha code is PIC. + lt_prog_compiler_static='-non_shared' + ;; + xl* | bgxl* | bgf* | mpixl*) + # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-qpic' + lt_prog_compiler_static='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*) + # Sun Fortran 8.3 passes all unrecognized flags to the linker + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + lt_prog_compiler_wl='' + ;; + *Sun\ F* | *Sun*Fortran*) + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + lt_prog_compiler_wl='-Qoption ld ' + ;; + *Sun\ C*) + # Sun C 5.9 + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + lt_prog_compiler_wl='-Wl,' + ;; + *Intel*\ [CF]*Compiler*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fPIC' + lt_prog_compiler_static='-static' + ;; + *Portland\ Group*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fpic' + lt_prog_compiler_static='-Bstatic' + ;; + esac + ;; + esac + ;; + + newsos6) + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic='-fPIC -shared' + ;; + + osf3* | osf4* | osf5*) + lt_prog_compiler_wl='-Wl,' + # All OSF/1 code is PIC. + lt_prog_compiler_static='-non_shared' + ;; + + rdos*) + lt_prog_compiler_static='-non_shared' + ;; + + solaris*) + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + case $cc_basename in + f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) + lt_prog_compiler_wl='-Qoption ld ';; + *) + lt_prog_compiler_wl='-Wl,';; + esac + ;; + + sunos4*) + lt_prog_compiler_wl='-Qoption ld ' + lt_prog_compiler_pic='-PIC' + lt_prog_compiler_static='-Bstatic' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic='-Kconform_pic' + lt_prog_compiler_static='-Bstatic' + fi + ;; + + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + unicos*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_can_build_shared=no + ;; + + uts4*) + lt_prog_compiler_pic='-pic' + lt_prog_compiler_static='-Bstatic' + ;; + + *) + lt_prog_compiler_can_build_shared=no + ;; + esac + fi + +case $host_os in + # For platforms that do not support PIC, -DPIC is meaningless: + *djgpp*) + lt_prog_compiler_pic= + ;; + *) + lt_prog_compiler_pic="$lt_prog_compiler_pic@&t@ -DPIC" + ;; +esac + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 +printf %s "checking for $compiler option to produce PIC... " >&6; } +if test ${lt_cv_prog_compiler_pic+y} +then : + printf %s "(cached) " >&6 +else $as_nop + lt_cv_prog_compiler_pic=$lt_prog_compiler_pic +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5 +printf "%s\n" "$lt_cv_prog_compiler_pic" >&6; } +lt_prog_compiler_pic=$lt_cv_prog_compiler_pic + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$lt_prog_compiler_pic"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 +printf %s "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } +if test ${lt_cv_prog_compiler_pic_works+y} +then : + printf %s "(cached) " >&6 +else $as_nop + lt_cv_prog_compiler_pic_works=no + ac_outfile=conftest.$ac_objext + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$lt_prog_compiler_pic@&t@ -DPIC" ## exclude from sc_useless_quotes_in_assignment + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_pic_works=yes + fi + fi + $RM conftest* + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5 +printf "%s\n" "$lt_cv_prog_compiler_pic_works" >&6; } + +if test yes = "$lt_cv_prog_compiler_pic_works"; then + case $lt_prog_compiler_pic in + "" | " "*) ;; + *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;; + esac +else + lt_prog_compiler_pic= + lt_prog_compiler_can_build_shared=no +fi + +fi + + + + + + + + + + + +# +# Check to make sure the static flag actually works. +# +wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 +printf %s "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } +if test ${lt_cv_prog_compiler_static_works+y} +then : + printf %s "(cached) " >&6 +else $as_nop + lt_cv_prog_compiler_static_works=no + save_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS $lt_tmp_static_flag" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&5 + $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_static_works=yes + fi + else + lt_cv_prog_compiler_static_works=yes + fi + fi + $RM -r conftest* + LDFLAGS=$save_LDFLAGS + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5 +printf "%s\n" "$lt_cv_prog_compiler_static_works" >&6; } + +if test yes = "$lt_cv_prog_compiler_static_works"; then + : +else + lt_prog_compiler_static= +fi + + + + + + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +printf %s "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if test ${lt_cv_prog_compiler_c_o+y} +then : + printf %s "(cached) " >&6 +else $as_nop + lt_cv_prog_compiler_c_o=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 +printf "%s\n" "$lt_cv_prog_compiler_c_o" >&6; } + + + + + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +printf %s "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if test ${lt_cv_prog_compiler_c_o+y} +then : + printf %s "(cached) " >&6 +else $as_nop + lt_cv_prog_compiler_c_o=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 +printf "%s\n" "$lt_cv_prog_compiler_c_o" >&6; } + + + + +hard_links=nottested +if test no = "$lt_cv_prog_compiler_c_o" && test no != "$need_locks"; then + # do not overwrite the value of need_locks provided by the user + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 +printf %s "checking if we can lock with hard links... " >&6; } + hard_links=yes + $RM conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 +printf "%s\n" "$hard_links" >&6; } + if test no = "$hard_links"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&5 +printf "%s\n" "$as_me: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&2;} + need_locks=warn + fi +else + need_locks=no +fi + + + + + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +printf %s "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } + + runpath_var= + allow_undefined_flag= + always_export_symbols=no + archive_cmds= + archive_expsym_cmds= + compiler_needs_object=no + enable_shared_with_static_runtimes=no + export_dynamic_flag_spec= + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + hardcode_automatic=no + hardcode_direct=no + hardcode_direct_absolute=no + hardcode_libdir_flag_spec= + hardcode_libdir_separator= + hardcode_minus_L=no + hardcode_shlibpath_var=unsupported + inherit_rpath=no + link_all_deplibs=unknown + module_cmds= + module_expsym_cmds= + old_archive_from_new_cmds= + old_archive_from_expsyms_cmds= + thread_safe_flag_spec= + whole_archive_flag_spec= + # include_expsyms should be a list of space-separated symbols to be *always* + # included in the symbol list + include_expsyms= + # exclude_expsyms can be an extended regexp of symbols to exclude + # it will be wrapped by ' (' and ')$', so one must not match beginning or + # end of line. Example: 'a|bc|.*d.*' will exclude the symbols 'a' and 'bc', + # as well as any symbol that contains 'd'. + exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' + # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out + # platforms (ab)use it in PIC code, but their linkers get confused if + # the symbol is explicitly referenced. Since portable code cannot + # rely on this symbol name, it's probably fine to never include it in + # preloaded symbol tables. + # Exclude shared library initialization/finalization symbols. + extract_expsyms_cmds= + + case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test yes != "$GCC"; then + with_gnu_ld=no + fi + ;; + interix*) + # we just hope/assume this is gcc and not c89 (= MSVC++) + with_gnu_ld=yes + ;; + openbsd* | bitrig*) + with_gnu_ld=no + ;; + esac + + ld_shlibs=yes + + # On some targets, GNU ld is compatible enough with the native linker + # that we're better off using the native interface for both. + lt_use_gnu_ld_interface=no + if test yes = "$with_gnu_ld"; then + case $host_os in + aix*) + # The AIX port of GNU ld has always aspired to compatibility + # with the native linker. However, as the warning in the GNU ld + # block says, versions before 2.19.5* couldn't really create working + # shared libraries, regardless of the interface used. + case `$LD -v 2>&1` in + *\ \(GNU\ Binutils\)\ 2.19.5*) ;; + *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;; + *\ \(GNU\ Binutils\)\ [3-9]*) ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + fi + + if test yes = "$lt_use_gnu_ld_interface"; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='$wl' + + # Set some defaults for GNU ld with shared library support. These + # are reset later if shared libraries are not supported. Putting them + # here allows them to be overridden if necessary. + runpath_var=LD_RUN_PATH + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + export_dynamic_flag_spec='$wl--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then + whole_archive_flag_spec=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' + else + whole_archive_flag_spec= + fi + supports_anon_versioning=no + case `$LD -v | $SED -e 's/(^)\+)\s\+//' 2>&1` in + *GNU\ gold*) supports_anon_versioning=yes ;; + *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + + # See if GNU ld supports shared libraries. + case $host_os in + aix[3-9]*) + # On AIX/PPC, the GNU linker is very broken + if test ia64 != "$host_cpu"; then + ld_shlibs=no + cat <<_LT_EOF 1>&2 + +*** Warning: the GNU linker, at least up to release 2.19, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to install binutils +*** 2.20 or above, or modify your PATH so that a non-GNU linker is found. +*** You will then need to restart the configuration process. + +_LT_EOF + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds='' + ;; + m68k) + archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + ;; + esac + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + allow_undefined_flag=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + else + ld_shlibs=no + fi + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, + # as there is no search path for DLLs. + hardcode_libdir_flag_spec='-L$libdir' + export_dynamic_flag_spec='$wl--export-all-symbols' + allow_undefined_flag=unsupported + always_export_symbols=no + enable_shared_with_static_runtimes=yes + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' + exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file, use it as + # is; otherwise, prepend EXPORTS... + archive_expsym_cmds='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + ld_shlibs=no + fi + ;; + + haiku*) + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + link_all_deplibs=yes + ;; + + os2*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + allow_undefined_flag=unsupported + shrext_cmds=.dll + archive_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + archive_expsym_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + prefix_cmds="$SED"~ + if test EXPORTS = "`$SED 1q $export_symbols`"; then + prefix_cmds="$prefix_cmds -e 1d"; + fi~ + prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ + cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + old_archive_From_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + enable_shared_with_static_runtimes=yes + ;; + + interix[3-9]*) + hardcode_direct=no + hardcode_shlibpath_var=no + hardcode_libdir_flag_spec='$wl-rpath,$libdir' + export_dynamic_flag_spec='$wl-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + archive_expsym_cmds='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + + gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) + tmp_diet=no + if test linux-dietlibc = "$host_os"; then + case $cc_basename in + diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) + esac + fi + if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ + && test no = "$tmp_diet" + then + tmp_addflag=' $pic_flag' + tmp_sharedflag='-shared' + case $cc_basename,$host_cpu in + pgcc*) # Portland Group C compiler + whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + tmp_addflag=' $pic_flag' + ;; + pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group f77 and f90 compilers + whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + tmp_addflag=' $pic_flag -Mnomain' ;; + ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 + tmp_addflag=' -i_dynamic' ;; + efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 + tmp_addflag=' -i_dynamic -nofor_main' ;; + ifc* | ifort*) # Intel Fortran compiler + tmp_addflag=' -nofor_main' ;; + lf95*) # Lahey Fortran 8.1 + whole_archive_flag_spec= + tmp_sharedflag='--shared' ;; + nagfor*) # NAGFOR 5.3 + tmp_sharedflag='-Wl,-shared' ;; + xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below) + tmp_sharedflag='-qmkshrobj' + tmp_addflag= ;; + nvcc*) # Cuda Compiler Driver 2.2 + whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + compiler_needs_object=yes + ;; + esac + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) # Sun C 5.9 + whole_archive_flag_spec='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + compiler_needs_object=yes + tmp_sharedflag='-G' ;; + *Sun\ F*) # Sun Fortran 8.3 + tmp_sharedflag='-G' ;; + esac + archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + + if test yes = "$supports_anon_versioning"; then + archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' + fi + + case $cc_basename in + tcc*) + export_dynamic_flag_spec='-rdynamic' + ;; + xlf* | bgf* | bgxlf* | mpixlf*) + # IBM XL Fortran 10.1 on PPC cannot create shared libs itself + whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive' + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' + if test yes = "$supports_anon_versioning"; then + archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' + fi + ;; + esac + else + ld_shlibs=no + fi + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris*) + if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then + ld_shlibs=no + cat <<_LT_EOF 1>&2 + +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) + case `$LD -v 2>&1` in + *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) + ld_shlibs=no + cat <<_LT_EOF 1>&2 + +*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 cannot +*** reliably create shared libraries on SCO systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.16.91.0.3 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + ;; + *) + # For security reasons, it is highly recommended that you always + # use absolute paths for naming shared libraries, and exclude the + # DT_RUNPATH tag from executables and libraries. But doing so + # requires that you compile everything twice, which is a pain. + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + esac + ;; + + sunos4*) + archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + *) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + esac + + if test no = "$ld_shlibs"; then + runpath_var= + hardcode_libdir_flag_spec= + export_dynamic_flag_spec= + whole_archive_flag_spec= + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + allow_undefined_flag=unsupported + always_export_symbols=yes + archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + hardcode_minus_L=yes + if test yes = "$GCC" && test -z "$lt_prog_compiler_static"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + hardcode_direct=unsupported + fi + ;; + + aix[4-9]*) + if test ia64 = "$host_cpu"; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag= + else + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to GNU nm, but means don't demangle to AIX nm. + # Without the "-l" option, or with the "-B" option, AIX nm treats + # weak defined symbols like other global defined symbols, whereas + # GNU nm marks them as "W". + # While the 'weak' keyword is ignored in the Export File, we need + # it in the Import File for the 'aix-soname' feature, so we have + # to replace the "-B" option with "-P" for AIX nm. + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' + else + export_symbols_cmds='`func_echo_all $NM | $SED -e '\''s/B\([^B]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && (substr(\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' + fi + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # have runtime linking enabled, and use it for executables. + # For shared libraries, we enable/disable runtime linking + # depending on the kind of the shared library created - + # when "with_aix_soname,aix_use_runtimelinking" is: + # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables + # "aix,yes" lib.so shared, rtl:yes, for executables + # lib.a static archive + # "both,no" lib.so.V(shr.o) shared, rtl:yes + # lib.a(lib.so.V) shared, rtl:no, for executables + # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a(lib.so.V) shared, rtl:no + # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a static archive + case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) + for ld_flag in $LDFLAGS; do + if (test x-brtl = "x$ld_flag" || test x-Wl,-brtl = "x$ld_flag"); then + aix_use_runtimelinking=yes + break + fi + done + if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then + # With aix-soname=svr4, we create the lib.so.V shared archives only, + # so we don't have lib.a shared libs to link our executables. + # We have to force runtime linking in this case. + aix_use_runtimelinking=yes + LDFLAGS="$LDFLAGS -Wl,-brtl" + fi + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + archive_cmds='' + hardcode_direct=yes + hardcode_direct_absolute=yes + hardcode_libdir_separator=':' + link_all_deplibs=yes + file_list_spec='$wl-f,' + case $with_aix_soname,$aix_use_runtimelinking in + aix,*) ;; # traditional, no import file + svr4,* | *,yes) # use import file + # The Import File defines what to hardcode. + hardcode_direct=no + hardcode_direct_absolute=no + ;; + esac + + if test yes = "$GCC"; then + case $host_os in aix4.[012]|aix4.[012].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`$CC -print-prog-name=collect2` + if test -f "$collect2name" && + strings "$collect2name" | $GREP resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + hardcode_direct=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + hardcode_minus_L=yes + hardcode_libdir_flag_spec='-L$libdir' + hardcode_libdir_separator= + fi + ;; + esac + shared_flag='-shared' + if test yes = "$aix_use_runtimelinking"; then + shared_flag="$shared_flag "'$wl-G' + fi + # Need to ensure runtime linking is disabled for the traditional + # shared library, or the linker may eventually find shared libraries + # /with/ Import File - we do not want to mix them. + shared_flag_aix='-shared' + shared_flag_svr4='-shared $wl-G' + else + # not using gcc + if test ia64 = "$host_cpu"; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test yes = "$aix_use_runtimelinking"; then + shared_flag='$wl-G' + else + shared_flag='$wl-bM:SRE' + fi + shared_flag_aix='$wl-bM:SRE' + shared_flag_svr4='$wl-G' + fi + fi + + export_dynamic_flag_spec='$wl-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + always_export_symbols=yes + if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + allow_undefined_flag='-berok' + # Determine the default libpath from the value encoded in an + # empty executable. + if test set = "${lt_cv_aix_libpath+set}"; then + aix_libpath=$lt_cv_aix_libpath +else + if test ${lt_cv_aix_libpath_+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + + lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }' + lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_=/usr/lib:/lib + fi + +fi + + aix_libpath=$lt_cv_aix_libpath_ +fi + + hardcode_libdir_flag_spec='$wl-blibpath:$libdir:'"$aix_libpath" + archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag + else + if test ia64 = "$host_cpu"; then + hardcode_libdir_flag_spec='$wl-R $libdir:/usr/lib:/lib' + allow_undefined_flag="-z nodefs" + archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + if test set = "${lt_cv_aix_libpath+set}"; then + aix_libpath=$lt_cv_aix_libpath +else + if test ${lt_cv_aix_libpath_+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + + lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }' + lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_=/usr/lib:/lib + fi + +fi + + aix_libpath=$lt_cv_aix_libpath_ +fi + + hardcode_libdir_flag_spec='$wl-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + no_undefined_flag=' $wl-bernotok' + allow_undefined_flag=' $wl-berok' + if test yes = "$with_gnu_ld"; then + # We only use this code for GNU lds that support --whole-archive. + whole_archive_flag_spec='$wl--whole-archive$convenience $wl--no-whole-archive' + else + # Exported symbols can be pulled into shared objects from archives + whole_archive_flag_spec='$convenience' + fi + archive_cmds_need_lc=yes + archive_expsym_cmds='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' + # -brtl affects multiple linker settings, -berok does not and is overridden later + compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([, ]\\)%-berok\\1%g"`' + if test svr4 != "$with_aix_soname"; then + # This is similar to how AIX traditionally builds its shared libraries. + archive_expsym_cmds="$archive_expsym_cmds"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' + fi + if test aix != "$with_aix_soname"; then + archive_expsym_cmds="$archive_expsym_cmds"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' + else + # used by -dlpreopen to get the symbols + archive_expsym_cmds="$archive_expsym_cmds"'~$MV $output_objdir/$realname.d/$soname $output_objdir' + fi + archive_expsym_cmds="$archive_expsym_cmds"'~$RM -r $output_objdir/$realname.d' + fi + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds='' + ;; + m68k) + archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + ;; + esac + ;; + + bsdi[45]*) + export_dynamic_flag_spec=-rdynamic + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + case $cc_basename in + cl*) + # Native MSVC + hardcode_libdir_flag_spec=' ' + allow_undefined_flag=unsupported + always_export_symbols=yes + file_list_spec='@' + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=.dll + # FIXME: Setting linknames here is a bad hack. + archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' + archive_expsym_cmds='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then + cp "$export_symbols" "$output_objdir/$soname.def"; + echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; + else + $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; + fi~ + $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ + linknames=' + # The linker will not automatically build a static lib if we build a DLL. + # _LT_TAGVAR(old_archive_from_new_cmds, )='true' + enable_shared_with_static_runtimes=yes + exclude_expsyms='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' + # Don't use ranlib + old_postinstall_cmds='chmod 644 $oldlib' + postlink_cmds='lt_outputfile="@OUTPUT@"~ + lt_tool_outputfile="@TOOL_OUTPUT@"~ + case $lt_outputfile in + *.exe|*.EXE) ;; + *) + lt_outputfile=$lt_outputfile.exe + lt_tool_outputfile=$lt_tool_outputfile.exe + ;; + esac~ + if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then + $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; + $RM "$lt_outputfile.manifest"; + fi' + ;; + *) + # Assume MSVC wrapper + hardcode_libdir_flag_spec=' ' + allow_undefined_flag=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=.dll + # FIXME: Setting linknames here is a bad hack. + archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + old_archive_from_new_cmds='true' + # FIXME: Should let the user specify the lib program. + old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs' + enable_shared_with_static_runtimes=yes + ;; + esac + ;; + + darwin* | rhapsody*) + + + archive_cmds_need_lc=no + hardcode_direct=no + hardcode_automatic=yes + hardcode_shlibpath_var=unsupported + if test yes = "$lt_cv_ld_force_load"; then + whole_archive_flag_spec='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' + + else + whole_archive_flag_spec='' + fi + link_all_deplibs=yes + allow_undefined_flag=$_lt_dar_allow_undefined + case $cc_basename in + ifort*|nagfor*) _lt_dar_can_shared=yes ;; + *) _lt_dar_can_shared=$GCC ;; + esac + if test yes = "$_lt_dar_can_shared"; then + output_verbose_link_cmd=func_echo_all + archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil" + module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil" + archive_expsym_cmds="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil" + module_expsym_cmds="sed -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil" + + else + ld_shlibs=no + fi + + ;; + + dgux*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_shlibpath_var=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2.*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes + hardcode_minus_L=yes + hardcode_shlibpath_var=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | dragonfly*) + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + hpux9*) + if test yes = "$GCC"; then + archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' + else + archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' + fi + hardcode_libdir_flag_spec='$wl+b $wl$libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + export_dynamic_flag_spec='$wl-E' + ;; + + hpux10*) + if test yes,no = "$GCC,$with_gnu_ld"; then + archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + fi + if test no = "$with_gnu_ld"; then + hardcode_libdir_flag_spec='$wl+b $wl$libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + hardcode_direct_absolute=yes + export_dynamic_flag_spec='$wl-E' + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + fi + ;; + + hpux11*) + if test yes,no = "$GCC,$with_gnu_ld"; then + case $host_cpu in + hppa*64*) + archive_cmds='$CC -shared $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else + case $host_cpu in + hppa*64*) + archive_cmds='$CC -b $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + archive_cmds='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + + # Older versions of the 11.00 compiler do not understand -b yet + # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5 +printf %s "checking if $CC understands -b... " >&6; } +if test ${lt_cv_prog_compiler__b+y} +then : + printf %s "(cached) " >&6 +else $as_nop + lt_cv_prog_compiler__b=no + save_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS -b" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&5 + $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler__b=yes + fi + else + lt_cv_prog_compiler__b=yes + fi + fi + $RM -r conftest* + LDFLAGS=$save_LDFLAGS + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5 +printf "%s\n" "$lt_cv_prog_compiler__b" >&6; } + +if test yes = "$lt_cv_prog_compiler__b"; then + archive_cmds='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' +else + archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' +fi + + ;; + esac + fi + if test no = "$with_gnu_ld"; then + hardcode_libdir_flag_spec='$wl+b $wl$libdir' + hardcode_libdir_separator=: + + case $host_cpu in + hppa*64*|ia64*) + hardcode_direct=no + hardcode_shlibpath_var=no + ;; + *) + hardcode_direct=yes + hardcode_direct_absolute=yes + export_dynamic_flag_spec='$wl-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + ;; + esac + fi + ;; + + irix5* | irix6* | nonstopux*) + if test yes = "$GCC"; then + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + # Try to use the -exported_symbol ld option, if it does not + # work, assume that -exports_file does not work either and + # implicitly export all symbols. + # This should be the same for all languages, so no per-tag cache variable. + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5 +printf %s "checking whether the $host_os linker accepts -exported_symbol... " >&6; } +if test ${lt_cv_irix_exported_symbol+y} +then : + printf %s "(cached) " >&6 +else $as_nop + save_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS -shared $wl-exported_symbol ${wl}foo $wl-update_registry $wl/dev/null" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +int foo (void) { return 0; } +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + lt_cv_irix_exported_symbol=yes +else $as_nop + lt_cv_irix_exported_symbol=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$save_LDFLAGS +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5 +printf "%s\n" "$lt_cv_irix_exported_symbol" >&6; } + if test yes = "$lt_cv_irix_exported_symbol"; then + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations $wl-exports_file $wl$export_symbols -o $lib' + fi + else + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -exports_file $export_symbols -o $lib' + fi + archive_cmds_need_lc='no' + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + hardcode_libdir_separator=: + inherit_rpath=yes + link_all_deplibs=yes + ;; + + linux*) + case $cc_basename in + tcc*) + # Fabrice Bellard et al's Tiny C Compiler + ld_shlibs=yes + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + newsos6) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + hardcode_libdir_separator=: + hardcode_shlibpath_var=no + ;; + + *nto* | *qnx*) + ;; + + openbsd* | bitrig*) + if test -f /usr/libexec/ld.so; then + hardcode_direct=yes + hardcode_shlibpath_var=no + hardcode_direct_absolute=yes + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags $wl-retain-symbols-file,$export_symbols' + hardcode_libdir_flag_spec='$wl-rpath,$libdir' + export_dynamic_flag_spec='$wl-E' + else + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec='$wl-rpath,$libdir' + fi + else + ld_shlibs=no + fi + ;; + + os2*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + allow_undefined_flag=unsupported + shrext_cmds=.dll + archive_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + archive_expsym_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + prefix_cmds="$SED"~ + if test EXPORTS = "`$SED 1q $export_symbols`"; then + prefix_cmds="$prefix_cmds -e 1d"; + fi~ + prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ + cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + old_archive_From_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + enable_shared_with_static_runtimes=yes + ;; + + osf3*) + if test yes = "$GCC"; then + allow_undefined_flag=' $wl-expect_unresolved $wl\*' + archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + else + allow_undefined_flag=' -expect_unresolved \*' + archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + fi + archive_cmds_need_lc='no' + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + hardcode_libdir_separator=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test yes = "$GCC"; then + allow_undefined_flag=' $wl-expect_unresolved $wl\*' + archive_cmds='$CC -shared$allow_undefined_flag $pic_flag $libobjs $deplibs $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + else + allow_undefined_flag=' -expect_unresolved \*' + archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ + $CC -shared$allow_undefined_flag $wl-input $wl$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~$RM $lib.exp' + + # Both c and cxx compiler support -rpath directly + hardcode_libdir_flag_spec='-rpath $libdir' + fi + archive_cmds_need_lc='no' + hardcode_libdir_separator=: + ;; + + solaris*) + no_undefined_flag=' -z defs' + if test yes = "$GCC"; then + wlarc='$wl' + archive_cmds='$CC -shared $pic_flag $wl-z ${wl}text $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared $pic_flag $wl-z ${wl}text $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + else + case `$CC -V 2>&1` in + *"Compilers 5.0"*) + wlarc='' + archive_cmds='$LD -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $linker_flags' + archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $LD -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' + ;; + *) + wlarc='$wl' + archive_cmds='$CC -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + ;; + esac + fi + hardcode_libdir_flag_spec='-R$libdir' + hardcode_shlibpath_var=no + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands '-z linker_flag'. GCC discards it without '$wl', + # but is careful enough not to reorder. + # Supported since Solaris 2.6 (maybe 2.5.1?) + if test yes = "$GCC"; then + whole_archive_flag_spec='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' + else + whole_archive_flag_spec='-z allextract$convenience -z defaultextract' + fi + ;; + esac + link_all_deplibs=yes + ;; + + sunos4*) + if test sequent = "$host_vendor"; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + archive_cmds='$CC -G $wl-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + hardcode_libdir_flag_spec='-L$libdir' + hardcode_direct=yes + hardcode_minus_L=yes + hardcode_shlibpath_var=no + ;; + + sysv4) + case $host_vendor in + sni) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes # is this really true??? + ;; + siemens) + ## LD is ld it makes a PLAMLIB + ## CC just makes a GrossModule. + archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' + reload_cmds='$CC -r -o $output$reload_objs' + hardcode_direct=no + ;; + motorola) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=no #Motorola manual says yes, but my tests say they lie + ;; + esac + runpath_var='LD_RUN_PATH' + hardcode_shlibpath_var=no + ;; + + sysv4.3*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var=no + export_dynamic_flag_spec='-Bexport' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + ld_shlibs=yes + fi + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) + no_undefined_flag='$wl-z,text' + archive_cmds_need_lc=no + hardcode_shlibpath_var=no + runpath_var='LD_RUN_PATH' + + if test yes = "$GCC"; then + archive_cmds='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We CANNOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + no_undefined_flag='$wl-z,text' + allow_undefined_flag='$wl-z,nodefs' + archive_cmds_need_lc=no + hardcode_shlibpath_var=no + hardcode_libdir_flag_spec='$wl-R,$libdir' + hardcode_libdir_separator=':' + link_all_deplibs=yes + export_dynamic_flag_spec='$wl-Bexport' + runpath_var='LD_RUN_PATH' + + if test yes = "$GCC"; then + archive_cmds='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + uts4*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_shlibpath_var=no + ;; + + *) + ld_shlibs=no + ;; + esac + + if test sni = "$host_vendor"; then + case $host in + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + export_dynamic_flag_spec='$wl-Blargedynsym' + ;; + esac + fi + fi + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5 +printf "%s\n" "$ld_shlibs" >&6; } +test no = "$ld_shlibs" && can_build_shared=no + +with_gnu_ld=$with_gnu_ld + + + + + + + + + + + + + + + +# +# Do we need to explicitly link libc? +# +case "x$archive_cmds_need_lc" in +x|xyes) + # Assume -lc should be added + archive_cmds_need_lc=yes + + if test yes,yes = "$GCC,$enable_shared"; then + case $archive_cmds in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 +printf %s "checking whether -lc should be explicitly linked in... " >&6; } +if test ${lt_cv_archive_cmds_need_lc+y} +then : + printf %s "(cached) " >&6 +else $as_nop + $RM conftest* + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$lt_prog_compiler_wl + pic_flag=$lt_prog_compiler_pic + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$allow_undefined_flag + allow_undefined_flag= + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 + (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + then + lt_cv_archive_cmds_need_lc=no + else + lt_cv_archive_cmds_need_lc=yes + fi + allow_undefined_flag=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $RM conftest* + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5 +printf "%s\n" "$lt_cv_archive_cmds_need_lc" >&6; } + archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc + ;; + esac + fi + ;; +esac + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 +printf %s "checking dynamic linker characteristics... " >&6; } + +if test yes = "$GCC"; then + case $host_os in + darwin*) lt_awk_arg='/^libraries:/,/LR/' ;; + *) lt_awk_arg='/^libraries:/' ;; + esac + case $host_os in + mingw* | cegcc*) lt_sed_strip_eq='s|=\([A-Za-z]:\)|\1|g' ;; + *) lt_sed_strip_eq='s|=/|/|g' ;; + esac + lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` + case $lt_search_path_spec in + *\;*) + # if the path contains ";" then we assume it to be the separator + # otherwise default to the standard path separator (i.e. ":") - it is + # assumed that no part of a normal pathname contains ";" but that should + # okay in the real world where ";" in dirpaths is itself problematic. + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` + ;; + *) + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` + ;; + esac + # Ok, now we have the path, separated by spaces, we can step through it + # and add multilib dir if necessary... + lt_tmp_lt_search_path_spec= + lt_multi_os_dir=/`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` + # ...but if some path component already ends with the multilib dir we assume + # that all is fine and trust -print-search-dirs as is (GCC 4.2? or newer). + case "$lt_multi_os_dir; $lt_search_path_spec " in + "/; "* | "/.; "* | "/./; "* | *"$lt_multi_os_dir "* | *"$lt_multi_os_dir/ "*) + lt_multi_os_dir= + ;; + esac + for lt_sys_path in $lt_search_path_spec; do + if test -d "$lt_sys_path$lt_multi_os_dir"; then + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path$lt_multi_os_dir" + elif test -n "$lt_multi_os_dir"; then + test -d "$lt_sys_path" && \ + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" + fi + done + lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' +BEGIN {RS = " "; FS = "/|\n";} { + lt_foo = ""; + lt_count = 0; + for (lt_i = NF; lt_i > 0; lt_i--) { + if ($lt_i != "" && $lt_i != ".") { + if ($lt_i == "..") { + lt_count++; + } else { + if (lt_count == 0) { + lt_foo = "/" $lt_i lt_foo; + } else { + lt_count--; + } + } + } + } + if (lt_foo != "") { lt_freq[lt_foo]++; } + if (lt_freq[lt_foo] == 1) { print lt_foo; } +}'` + # AWK program above erroneously prepends '/' to C:/dos/paths + # for these hosts. + case $host_os in + mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ + $SED 's|/\([A-Za-z]:\)|\1|g'` ;; + esac + sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` +else + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +fi +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=.so +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + + + +case $host_os in +aix3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='$libname$release$shared_ext$major' + ;; + +aix[4-9]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test ia64 = "$host_cpu"; then + # AIX 5 supports IA64 + library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line '#! .'. This would cause the generated library to + # depend on '.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[01] | aix4.[01].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # Using Import Files as archive members, it is possible to support + # filename-based versioning of shared library archives on AIX. While + # this would work for both with and without runtime linking, it will + # prevent static linking of such archives. So we do filename-based + # shared library versioning with .so extension only, which is used + # when both runtime linking and shared linking is enabled. + # Unfortunately, runtime linking may impact performance, so we do + # not want this to be the default eventually. Also, we use the + # versioned .so libs for executables only if there is the -brtl + # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only. + # To allow for filename-based versioning support, we need to create + # libNAME.so.V as an archive file, containing: + # *) an Import File, referring to the versioned filename of the + # archive as well as the shared archive member, telling the + # bitwidth (32 or 64) of that shared object, and providing the + # list of exported symbols of that shared object, eventually + # decorated with the 'weak' keyword + # *) the shared object with the F_LOADONLY flag set, to really avoid + # it being seen by the linker. + # At run time we better use the real file rather than another symlink, + # but for link time we create the symlink libNAME.so -> libNAME.so.V + + case $with_aix_soname,$aix_use_runtimelinking in + # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + aix,yes) # traditional libtool + dynamic_linker='AIX unversionable lib.so' + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + ;; + aix,no) # traditional AIX only + dynamic_linker='AIX lib.a(lib.so.V)' + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='$libname$release.a $libname.a' + soname_spec='$libname$release$shared_ext$major' + ;; + svr4,*) # full svr4 only + dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o)" + library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' + # We do not specify a path in Import Files, so LIBPATH fires. + shlibpath_overrides_runpath=yes + ;; + *,yes) # both, prefer svr4 + dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o), lib.a(lib.so.V)" + library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' + # unpreferred sharedlib libNAME.a needs extra handling + postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"' + postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"' + # We do not specify a path in Import Files, so LIBPATH fires. + shlibpath_overrides_runpath=yes + ;; + *,no) # both, prefer aix + dynamic_linker="AIX lib.a(lib.so.V), lib.so.V($shared_archive_member_spec.o)" + library_names_spec='$libname$release.a $libname.a' + soname_spec='$libname$release$shared_ext$major' + # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling + postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)' + postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"' + ;; + esac + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + case $host_cpu in + powerpc) + # Since July 2007 AmigaOS4 officially supports .so libraries. + # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + ;; + m68k) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + esac + ;; + +beos*) + library_names_spec='$libname$shared_ext' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[45]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32* | cegcc*) + version_type=windows + shrext_cmds=.dll + need_version=no + need_lib_prefix=no + + case $GCC,$cc_basename in + yes,*) + # gcc + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo $libname | sed -e 's/^lib/cyg/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api" + ;; + mingw* | cegcc*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo $libname | sed -e 's/^lib/pw/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + ;; + esac + dynamic_linker='Win32 ld.exe' + ;; + + *,cl*) + # Native MSVC + libname_spec='$name' + soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + library_names_spec='$libname.dll.lib' + + case $build_os in + mingw*) + sys_lib_search_path_spec= + lt_save_ifs=$IFS + IFS=';' + for lt_path in $LIB + do + IFS=$lt_save_ifs + # Let DOS variable expansion print the short 8.3 style file name. + lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` + sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" + done + IFS=$lt_save_ifs + # Convert to MSYS style. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` + ;; + cygwin*) + # Convert to unix form, then to dos form, then back to unix form + # but this time dos style (no spaces!) so that the unix form looks + # like /cygdrive/c/PROGRA~1:/cygdr... + sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` + sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` + sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + ;; + *) + sys_lib_search_path_spec=$LIB + if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then + # It is most probably a Windows format PATH. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + # FIXME: find the short name or the path components, as spaces are + # common. (e.g. "Program Files" -> "PROGRA~1") + ;; + esac + + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + dynamic_linker='Win32 link.exe' + ;; + + *) + # Assume MSVC wrapper + library_names_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext $libname.lib' + dynamic_linker='Win32 ld.exe' + ;; + esac + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$major$shared_ext $libname$shared_ext' + soname_spec='$libname$release$major$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' + + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib" + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[23].*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2.*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[01]* | freebsdelf3.[01]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ + freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + *) # from 4.6 on, and DragonFly + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +haiku*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + dynamic_linker="$host_os runtime_loader" + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LIBRARY_PATH + shlibpath_overrides_runpath=no + sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + if test 32 = "$HPUX_IA64_MODE"; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + sys_lib_dlsearch_path_spec=/usr/lib/hpux32 + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + sys_lib_dlsearch_path_spec=/usr/lib/hpux64 + fi + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555, ... + postinstall_cmds='chmod 555 $lib' + # or fails outright, so override atomically: + install_override_mode=555 + ;; + +interix[3-9]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test yes = "$lt_cv_prog_gnu_ld"; then + version_type=linux # correct to gnu/linux during the next big refactor + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='$libname$release$shared_ext$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff" + sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +linux*android*) + version_type=none # Android doesn't support versioned libraries. + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext' + soname_spec='$libname$release$shared_ext' + finish_cmds= + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + dynamic_linker='Android linker' + # Don't embed -rpath directories since the linker doesn't support them. + hardcode_libdir_flag_spec='-L$libdir' + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + + # Some binutils ld are patched to set DT_RUNPATH + if test ${lt_cv_shlibpath_overrides_runpath+y} +then : + printf %s "(cached) " >&6 +else $as_nop + lt_cv_shlibpath_overrides_runpath=no + save_LDFLAGS=$LDFLAGS + save_libdir=$libdir + eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \ + LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\"" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null +then : + lt_cv_shlibpath_overrides_runpath=yes +fi +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$save_LDFLAGS + libdir=$save_libdir + +fi + + shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # Ideally, we could use ldconfig to report *all* directores which are + # searched for libraries, however this is still not possible. Aside from not + # being certain /sbin/ldconfig is available, command + # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64, + # even though it is searched at run-time. Try to do the best guess by + # appending ld.so.conf contents (and includes) to the search path. + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +*nto* | *qnx*) + version_type=qnx + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='ldqnx.so' + ;; + +openbsd* | bitrig*) + version_type=sunos + sys_lib_dlsearch_path_spec=/usr/lib + need_lib_prefix=no + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then + need_version=no + else + need_version=yes + fi + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +os2*) + libname_spec='$name' + version_type=windows + shrext_cmds=.dll + need_version=no + need_lib_prefix=no + # OS/2 can only load a DLL with a base name of 8 characters or less. + soname_spec='`test -n "$os2dllname" && libname="$os2dllname"; + v=$($ECHO $release$versuffix | tr -d .-); + n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _); + $ECHO $n$v`$shared_ext' + library_names_spec='${libname}_dll.$libext' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=BEGINLIBPATH + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='$libname$release$shared_ext$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + +rdos*) + dynamic_linker=no + ;; + +solaris*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test yes = "$with_gnu_ld"; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec; then + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext' + soname_spec='$libname$shared_ext.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=sco + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + if test yes = "$with_gnu_ld"; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + +tpf*) + # TPF is a cross-target only. Preferred cross-host = GNU/Linux. + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +uts4*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 +printf "%s\n" "$dynamic_linker" >&6; } +test no = "$dynamic_linker" && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test yes = "$GCC"; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then + sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec +fi + +if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then + sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec +fi + +# remember unaugmented sys_lib_dlsearch_path content for libtool script decls... +configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec + +# ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code +func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH" + +# to be used as default LT_SYS_LIBRARY_PATH value in generated libtool +configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 +printf %s "checking how to hardcode library paths into programs... " >&6; } +hardcode_action= +if test -n "$hardcode_libdir_flag_spec" || + test -n "$runpath_var" || + test yes = "$hardcode_automatic"; then + + # We can hardcode non-existent directories. + if test no != "$hardcode_direct" && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, )" && + test no != "$hardcode_minus_L"; then + # Linking always hardcodes the temporary library directory. + hardcode_action=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + hardcode_action=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + hardcode_action=unsupported +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5 +printf "%s\n" "$hardcode_action" >&6; } + +if test relink = "$hardcode_action" || + test yes = "$inherit_rpath"; then + # Fast installation is not supported + enable_fast_install=no +elif test yes = "$shlibpath_overrides_runpath" || + test no = "$enable_shared"; then + # Fast installation is not necessary + enable_fast_install=needless +fi + + + + + + + if test yes != "$enable_dlopen"; then + enable_dlopen=unknown + enable_dlopen_self=unknown + enable_dlopen_self_static=unknown +else + lt_cv_dlopen=no + lt_cv_dlopen_libs= + + case $host_os in + beos*) + lt_cv_dlopen=load_add_on + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ;; + + mingw* | pw32* | cegcc*) + lt_cv_dlopen=LoadLibrary + lt_cv_dlopen_libs= + ;; + + cygwin*) + lt_cv_dlopen=dlopen + lt_cv_dlopen_libs= + ;; + + darwin*) + # if libdl is installed we need to link against it + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 +printf %s "checking for dlopen in -ldl... " >&6; } +if test ${ac_cv_lib_dl_dlopen+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +char dlopen (); +int +main (void) +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_lib_dl_dlopen=yes +else $as_nop + ac_cv_lib_dl_dlopen=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 +printf "%s\n" "$ac_cv_lib_dl_dlopen" >&6; } +if test "x$ac_cv_lib_dl_dlopen" = xyes +then : + lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl +else $as_nop + + lt_cv_dlopen=dyld + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + +fi + + ;; + + tpf*) + # Don't try to run any link tests for TPF. We know it's impossible + # because TPF is a cross-compiler, and we know how we open DSOs. + lt_cv_dlopen=dlopen + lt_cv_dlopen_libs= + lt_cv_dlopen_self=no + ;; + + *) + ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load" +if test "x$ac_cv_func_shl_load" = xyes +then : + lt_cv_dlopen=shl_load +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 +printf %s "checking for shl_load in -ldld... " >&6; } +if test ${ac_cv_lib_dld_shl_load+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldld $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +char shl_load (); +int +main (void) +{ +return shl_load (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_lib_dld_shl_load=yes +else $as_nop + ac_cv_lib_dld_shl_load=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 +printf "%s\n" "$ac_cv_lib_dld_shl_load" >&6; } +if test "x$ac_cv_lib_dld_shl_load" = xyes +then : + lt_cv_dlopen=shl_load lt_cv_dlopen_libs=-ldld +else $as_nop + ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" +if test "x$ac_cv_func_dlopen" = xyes +then : + lt_cv_dlopen=dlopen +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 +printf %s "checking for dlopen in -ldl... " >&6; } +if test ${ac_cv_lib_dl_dlopen+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +char dlopen (); +int +main (void) +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_lib_dl_dlopen=yes +else $as_nop + ac_cv_lib_dl_dlopen=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 +printf "%s\n" "$ac_cv_lib_dl_dlopen" >&6; } +if test "x$ac_cv_lib_dl_dlopen" = xyes +then : + lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 +printf %s "checking for dlopen in -lsvld... " >&6; } +if test ${ac_cv_lib_svld_dlopen+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_check_lib_save_LIBS=$LIBS +LIBS="-lsvld $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +char dlopen (); +int +main (void) +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_lib_svld_dlopen=yes +else $as_nop + ac_cv_lib_svld_dlopen=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 +printf "%s\n" "$ac_cv_lib_svld_dlopen" >&6; } +if test "x$ac_cv_lib_svld_dlopen" = xyes +then : + lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-lsvld +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 +printf %s "checking for dld_link in -ldld... " >&6; } +if test ${ac_cv_lib_dld_dld_link+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldld $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +char dld_link (); +int +main (void) +{ +return dld_link (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_lib_dld_dld_link=yes +else $as_nop + ac_cv_lib_dld_dld_link=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 +printf "%s\n" "$ac_cv_lib_dld_dld_link" >&6; } +if test "x$ac_cv_lib_dld_dld_link" = xyes +then : + lt_cv_dlopen=dld_link lt_cv_dlopen_libs=-ldld +fi + + +fi + + +fi + + +fi + + +fi + + +fi + + ;; + esac + + if test no = "$lt_cv_dlopen"; then + enable_dlopen=no + else + enable_dlopen=yes + fi + + case $lt_cv_dlopen in + dlopen) + save_CPPFLAGS=$CPPFLAGS + test yes = "$ac_cv_header_dlfcn_h" && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" + + save_LDFLAGS=$LDFLAGS + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" + + save_LIBS=$LIBS + LIBS="$lt_cv_dlopen_libs $LIBS" + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 +printf %s "checking whether a program can dlopen itself... " >&6; } +if test ${lt_cv_dlopen_self+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test yes = "$cross_compiling"; then : + lt_cv_dlopen_self=cross +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext <<_LT_EOF +#line $LINENO "configure" +#include "confdefs.h" + +#if HAVE_DLFCN_H +#include +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +/* When -fvisibility=hidden is used, assume the code has been annotated + correspondingly for the symbols needed. */ +#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) +int fnord () __attribute__((visibility("default"))); +#endif + +int fnord () { return 42; } +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else + { + if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + else puts (dlerror ()); + } + /* dlclose (self); */ + } + else + puts (dlerror ()); + + return status; +} +_LT_EOF + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 + (eval $ac_link) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s "conftest$ac_exeext" 2>/dev/null; then + (./conftest; exit; ) >&5 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; + x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; + x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;; + esac + else : + # compilation failed + lt_cv_dlopen_self=no + fi +fi +rm -fr conftest* + + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 +printf "%s\n" "$lt_cv_dlopen_self" >&6; } + + if test yes = "$lt_cv_dlopen_self"; then + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 +printf %s "checking whether a statically linked program can dlopen itself... " >&6; } +if test ${lt_cv_dlopen_self_static+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test yes = "$cross_compiling"; then : + lt_cv_dlopen_self_static=cross +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext <<_LT_EOF +#line $LINENO "configure" +#include "confdefs.h" + +#if HAVE_DLFCN_H +#include +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +/* When -fvisibility=hidden is used, assume the code has been annotated + correspondingly for the symbols needed. */ +#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) +int fnord () __attribute__((visibility("default"))); +#endif + +int fnord () { return 42; } +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else + { + if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + else puts (dlerror ()); + } + /* dlclose (self); */ + } + else + puts (dlerror ()); + + return status; +} +_LT_EOF + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 + (eval $ac_link) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s "conftest$ac_exeext" 2>/dev/null; then + (./conftest; exit; ) >&5 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; + x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; + x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;; + esac + else : + # compilation failed + lt_cv_dlopen_self_static=no + fi +fi +rm -fr conftest* + + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 +printf "%s\n" "$lt_cv_dlopen_self_static" >&6; } + fi + + CPPFLAGS=$save_CPPFLAGS + LDFLAGS=$save_LDFLAGS + LIBS=$save_LIBS + ;; + esac + + case $lt_cv_dlopen_self in + yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; + *) enable_dlopen_self=unknown ;; + esac + + case $lt_cv_dlopen_self_static in + yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; + *) enable_dlopen_self_static=unknown ;; + esac +fi + + + + + + + + + + + + + + + + + +striplib= +old_striplib= +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 +printf %s "checking whether stripping libraries is possible... " >&6; } +if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then + test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" + test -z "$striplib" && striplib="$STRIP --strip-unneeded" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } +else +# FIXME - insert some real tests, host_os isn't really good enough + case $host_os in + darwin*) + if test -n "$STRIP"; then + striplib="$STRIP -x" + old_striplib="$STRIP -S" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + fi + ;; + *) + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + ;; + esac +fi + + + + + + + + + + + + + # Report what library types will actually be built + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 +printf %s "checking if libtool supports shared libraries... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 +printf "%s\n" "$can_build_shared" >&6; } + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 +printf %s "checking whether to build shared libraries... " >&6; } + test no = "$can_build_shared" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test yes = "$enable_shared" && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + + aix[4-9]*) + if test ia64 != "$host_cpu"; then + case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in + yes,aix,yes) ;; # shared object as lib.so file only + yes,svr4,*) ;; # shared object as lib.so archive member only + yes,*) enable_static=no ;; # shared object in lib.a archive as well + esac + fi + ;; + esac + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 +printf "%s\n" "$enable_shared" >&6; } + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 +printf %s "checking whether to build static libraries... " >&6; } + # Make sure either enable_shared or enable_static is yes. + test yes = "$enable_shared" || enable_static=yes + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 +printf "%s\n" "$enable_static" >&6; } + + + + +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +CC=$lt_save_CC + + if test -n "$CXX" && ( test no != "$CXX" && + ( (test g++ = "$CXX" && `g++ -v >/dev/null 2>&1` ) || + (test g++ != "$CXX"))); then + ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5 +printf %s "checking how to run the C++ preprocessor... " >&6; } +if test -z "$CXXCPP"; then + if test ${ac_cv_prog_CXXCPP+y} +then : + printf %s "(cached) " >&6 +else $as_nop + # Double quotes because $CXX needs to be expanded + for CXXCPP in "$CXX -E" cpp /lib/cpp + do + ac_preproc_ok=false +for ac_cxx_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +@%:@include + Syntax error +_ACEOF +if ac_fn_cxx_try_cpp "$LINENO" +then : + +else $as_nop + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +@%:@include +_ACEOF +if ac_fn_cxx_try_cpp "$LINENO" +then : + # Broken: success on invalid input. +continue +else $as_nop + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok +then : + break +fi + + done + ac_cv_prog_CXXCPP=$CXXCPP + +fi + CXXCPP=$ac_cv_prog_CXXCPP +else + ac_cv_prog_CXXCPP=$CXXCPP +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5 +printf "%s\n" "$CXXCPP" >&6; } +ac_preproc_ok=false +for ac_cxx_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +@%:@include + Syntax error +_ACEOF +if ac_fn_cxx_try_cpp "$LINENO" +then : + +else $as_nop + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +@%:@include +_ACEOF +if ac_fn_cxx_try_cpp "$LINENO" +then : + # Broken: success on invalid input. +continue +else $as_nop + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok +then : + +else $as_nop + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check +See \`config.log' for more details" "$LINENO" 5; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +else + _lt_caught_CXX_error=yes +fi + +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + +archive_cmds_need_lc_CXX=no +allow_undefined_flag_CXX= +always_export_symbols_CXX=no +archive_expsym_cmds_CXX= +compiler_needs_object_CXX=no +export_dynamic_flag_spec_CXX= +hardcode_direct_CXX=no +hardcode_direct_absolute_CXX=no +hardcode_libdir_flag_spec_CXX= +hardcode_libdir_separator_CXX= +hardcode_minus_L_CXX=no +hardcode_shlibpath_var_CXX=unsupported +hardcode_automatic_CXX=no +inherit_rpath_CXX=no +module_cmds_CXX= +module_expsym_cmds_CXX= +link_all_deplibs_CXX=unknown +old_archive_cmds_CXX=$old_archive_cmds +reload_flag_CXX=$reload_flag +reload_cmds_CXX=$reload_cmds +no_undefined_flag_CXX= +whole_archive_flag_spec_CXX= +enable_shared_with_static_runtimes_CXX=no + +# Source file extension for C++ test sources. +ac_ext=cpp + +# Object file extension for compiled C++ test sources. +objext=o +objext_CXX=$objext + +# No sense in running all these tests if we already determined that +# the CXX compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test yes != "$_lt_caught_CXX_error"; then + # Code to be used in simple compile tests + lt_simple_compile_test_code="int some_variable = 0;" + + # Code to be used in simple link tests + lt_simple_link_test_code='int main(int, char *[]) { return(0); }' + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + + + + + + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC + + + # save warnings/boilerplate of simple test code + ac_outfile=conftest.$ac_objext +echo "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$RM conftest* + + ac_outfile=conftest.$ac_objext +echo "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$RM -r conftest* + + + # Allow CC to be a program name with arguments. + lt_save_CC=$CC + lt_save_CFLAGS=$CFLAGS + lt_save_LD=$LD + lt_save_GCC=$GCC + GCC=$GXX + lt_save_with_gnu_ld=$with_gnu_ld + lt_save_path_LD=$lt_cv_path_LD + if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then + lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx + else + $as_unset lt_cv_prog_gnu_ld + fi + if test -n "${lt_cv_path_LDCXX+set}"; then + lt_cv_path_LD=$lt_cv_path_LDCXX + else + $as_unset lt_cv_path_LD + fi + test -z "${LDCXX+set}" || LD=$LDCXX + CC=${CXX-"c++"} + CFLAGS=$CXXFLAGS + compiler=$CC + compiler_CXX=$CC + func_cc_basename $compiler +cc_basename=$func_cc_basename_result + + + if test -n "$compiler"; then + # We don't want -fno-exception when compiling C++ code, so set the + # no_builtin_flag separately + if test yes = "$GXX"; then + lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin' + else + lt_prog_compiler_no_builtin_flag_CXX= + fi + + if test yes = "$GXX"; then + # Set up default GNU C++ configuration + + + +@%:@ Check whether --with-gnu-ld was given. +if test ${with_gnu_ld+y} +then : + withval=$with_gnu_ld; test no = "$withval" || with_gnu_ld=yes +else $as_nop + with_gnu_ld=no +fi + +ac_prog=ld +if test yes = "$GCC"; then + # Check if gcc -print-prog-name=ld gives a path. + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 +printf %s "checking for ld used by $CC... " >&6; } + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return, which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [\\/]* | ?:[\\/]*) + re_direlt='/[^/][^/]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` + while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do + ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` + done + test -z "$LD" && LD=$ac_prog + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test yes = "$with_gnu_ld"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 +printf %s "checking for GNU ld... " >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 +printf %s "checking for non-GNU ld... " >&6; } +fi +if test ${lt_cv_path_LD+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -z "$LD"; then + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS=$lt_save_ifs + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD=$ac_dir/$ac_prog + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some variants of GNU ld only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 &5 +printf "%s\n" "$LD" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi +test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 +printf %s "checking if the linker ($LD) is GNU ld... " >&6; } +if test ${lt_cv_prog_gnu_ld+y} +then : + printf %s "(cached) " >&6 +else $as_nop + # I'd rather use --version here, but apparently some GNU lds only accept -v. +case `$LD -v 2>&1 &5 +printf "%s\n" "$lt_cv_prog_gnu_ld" >&6; } +with_gnu_ld=$lt_cv_prog_gnu_ld + + + + + + + + # Check if GNU C++ uses GNU ld as the underlying linker, since the + # archiving commands below assume that GNU ld is being used. + if test yes = "$with_gnu_ld"; then + archive_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + + hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir' + export_dynamic_flag_spec_CXX='$wl--export-dynamic' + + # If archive_cmds runs LD, not CC, wlarc should be empty + # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to + # investigate it a little bit more. (MM) + wlarc='$wl' + + # ancient GNU ld didn't support --whole-archive et. al. + if eval "`$CC -print-prog-name=ld` --help 2>&1" | + $GREP 'no-whole-archive' > /dev/null; then + whole_archive_flag_spec_CXX=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' + else + whole_archive_flag_spec_CXX= + fi + else + with_gnu_ld=no + wlarc= + + # A generic and very simple default shared library creation + # command for GNU C++ for the case where it uses the native + # linker, instead of GNU ld. If possible, this setting should + # overridden to take advantage of the native linker features on + # the platform it is being used on. + archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + fi + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + + else + GXX=no + with_gnu_ld=no + wlarc= + fi + + # PORTME: fill in a description of your system's C++ link characteristics + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +printf %s "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } + ld_shlibs_CXX=yes + case $host_os in + aix3*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + aix[4-9]*) + if test ia64 = "$host_cpu"; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag= + else + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # have runtime linking enabled, and use it for executables. + # For shared libraries, we enable/disable runtime linking + # depending on the kind of the shared library created - + # when "with_aix_soname,aix_use_runtimelinking" is: + # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables + # "aix,yes" lib.so shared, rtl:yes, for executables + # lib.a static archive + # "both,no" lib.so.V(shr.o) shared, rtl:yes + # lib.a(lib.so.V) shared, rtl:no, for executables + # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a(lib.so.V) shared, rtl:no + # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a static archive + case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) + for ld_flag in $LDFLAGS; do + case $ld_flag in + *-brtl*) + aix_use_runtimelinking=yes + break + ;; + esac + done + if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then + # With aix-soname=svr4, we create the lib.so.V shared archives only, + # so we don't have lib.a shared libs to link our executables. + # We have to force runtime linking in this case. + aix_use_runtimelinking=yes + LDFLAGS="$LDFLAGS -Wl,-brtl" + fi + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + archive_cmds_CXX='' + hardcode_direct_CXX=yes + hardcode_direct_absolute_CXX=yes + hardcode_libdir_separator_CXX=':' + link_all_deplibs_CXX=yes + file_list_spec_CXX='$wl-f,' + case $with_aix_soname,$aix_use_runtimelinking in + aix,*) ;; # no import file + svr4,* | *,yes) # use import file + # The Import File defines what to hardcode. + hardcode_direct_CXX=no + hardcode_direct_absolute_CXX=no + ;; + esac + + if test yes = "$GXX"; then + case $host_os in aix4.[012]|aix4.[012].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`$CC -print-prog-name=collect2` + if test -f "$collect2name" && + strings "$collect2name" | $GREP resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + hardcode_direct_CXX=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + hardcode_minus_L_CXX=yes + hardcode_libdir_flag_spec_CXX='-L$libdir' + hardcode_libdir_separator_CXX= + fi + esac + shared_flag='-shared' + if test yes = "$aix_use_runtimelinking"; then + shared_flag=$shared_flag' $wl-G' + fi + # Need to ensure runtime linking is disabled for the traditional + # shared library, or the linker may eventually find shared libraries + # /with/ Import File - we do not want to mix them. + shared_flag_aix='-shared' + shared_flag_svr4='-shared $wl-G' + else + # not using gcc + if test ia64 = "$host_cpu"; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test yes = "$aix_use_runtimelinking"; then + shared_flag='$wl-G' + else + shared_flag='$wl-bM:SRE' + fi + shared_flag_aix='$wl-bM:SRE' + shared_flag_svr4='$wl-G' + fi + fi + + export_dynamic_flag_spec_CXX='$wl-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to + # export. + always_export_symbols_CXX=yes + if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + # The "-G" linker flag allows undefined symbols. + no_undefined_flag_CXX='-bernotok' + # Determine the default libpath from the value encoded in an empty + # executable. + if test set = "${lt_cv_aix_libpath+set}"; then + aix_libpath=$lt_cv_aix_libpath +else + if test ${lt_cv_aix_libpath__CXX+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_link "$LINENO" +then : + + lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }' + lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$lt_cv_aix_libpath__CXX"; then + lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + if test -z "$lt_cv_aix_libpath__CXX"; then + lt_cv_aix_libpath__CXX=/usr/lib:/lib + fi + +fi + + aix_libpath=$lt_cv_aix_libpath__CXX +fi + + hardcode_libdir_flag_spec_CXX='$wl-blibpath:$libdir:'"$aix_libpath" + + archive_expsym_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag + else + if test ia64 = "$host_cpu"; then + hardcode_libdir_flag_spec_CXX='$wl-R $libdir:/usr/lib:/lib' + allow_undefined_flag_CXX="-z nodefs" + archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + if test set = "${lt_cv_aix_libpath+set}"; then + aix_libpath=$lt_cv_aix_libpath +else + if test ${lt_cv_aix_libpath__CXX+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_link "$LINENO" +then : + + lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }' + lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$lt_cv_aix_libpath__CXX"; then + lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + if test -z "$lt_cv_aix_libpath__CXX"; then + lt_cv_aix_libpath__CXX=/usr/lib:/lib + fi + +fi + + aix_libpath=$lt_cv_aix_libpath__CXX +fi + + hardcode_libdir_flag_spec_CXX='$wl-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + no_undefined_flag_CXX=' $wl-bernotok' + allow_undefined_flag_CXX=' $wl-berok' + if test yes = "$with_gnu_ld"; then + # We only use this code for GNU lds that support --whole-archive. + whole_archive_flag_spec_CXX='$wl--whole-archive$convenience $wl--no-whole-archive' + else + # Exported symbols can be pulled into shared objects from archives + whole_archive_flag_spec_CXX='$convenience' + fi + archive_cmds_need_lc_CXX=yes + archive_expsym_cmds_CXX='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' + # -brtl affects multiple linker settings, -berok does not and is overridden later + compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([, ]\\)%-berok\\1%g"`' + if test svr4 != "$with_aix_soname"; then + # This is similar to how AIX traditionally builds its shared + # libraries. Need -bnortl late, we may have -brtl in LDFLAGS. + archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' + fi + if test aix != "$with_aix_soname"; then + archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' + else + # used by -dlpreopen to get the symbols + archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$MV $output_objdir/$realname.d/$soname $output_objdir' + fi + archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$RM -r $output_objdir/$realname.d' + fi + fi + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + allow_undefined_flag_CXX=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + else + ld_shlibs_CXX=no + fi + ;; + + chorus*) + case $cc_basename in + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + cygwin* | mingw* | pw32* | cegcc*) + case $GXX,$cc_basename in + ,cl* | no,cl*) + # Native MSVC + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + hardcode_libdir_flag_spec_CXX=' ' + allow_undefined_flag_CXX=unsupported + always_export_symbols_CXX=yes + file_list_spec_CXX='@' + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=.dll + # FIXME: Setting linknames here is a bad hack. + archive_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' + archive_expsym_cmds_CXX='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then + cp "$export_symbols" "$output_objdir/$soname.def"; + echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; + else + $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; + fi~ + $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ + linknames=' + # The linker will not automatically build a static lib if we build a DLL. + # _LT_TAGVAR(old_archive_from_new_cmds, CXX)='true' + enable_shared_with_static_runtimes_CXX=yes + # Don't use ranlib + old_postinstall_cmds_CXX='chmod 644 $oldlib' + postlink_cmds_CXX='lt_outputfile="@OUTPUT@"~ + lt_tool_outputfile="@TOOL_OUTPUT@"~ + case $lt_outputfile in + *.exe|*.EXE) ;; + *) + lt_outputfile=$lt_outputfile.exe + lt_tool_outputfile=$lt_tool_outputfile.exe + ;; + esac~ + func_to_tool_file "$lt_outputfile"~ + if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then + $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; + $RM "$lt_outputfile.manifest"; + fi' + ;; + *) + # g++ + # _LT_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless, + # as there is no search path for DLLs. + hardcode_libdir_flag_spec_CXX='-L$libdir' + export_dynamic_flag_spec_CXX='$wl--export-all-symbols' + allow_undefined_flag_CXX=unsupported + always_export_symbols_CXX=no + enable_shared_with_static_runtimes_CXX=yes + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file, use it as + # is; otherwise, prepend EXPORTS... + archive_expsym_cmds_CXX='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + ld_shlibs_CXX=no + fi + ;; + esac + ;; + darwin* | rhapsody*) + + + archive_cmds_need_lc_CXX=no + hardcode_direct_CXX=no + hardcode_automatic_CXX=yes + hardcode_shlibpath_var_CXX=unsupported + if test yes = "$lt_cv_ld_force_load"; then + whole_archive_flag_spec_CXX='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' + + else + whole_archive_flag_spec_CXX='' + fi + link_all_deplibs_CXX=yes + allow_undefined_flag_CXX=$_lt_dar_allow_undefined + case $cc_basename in + ifort*|nagfor*) _lt_dar_can_shared=yes ;; + *) _lt_dar_can_shared=$GCC ;; + esac + if test yes = "$_lt_dar_can_shared"; then + output_verbose_link_cmd=func_echo_all + archive_cmds_CXX="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil" + module_cmds_CXX="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil" + archive_expsym_cmds_CXX="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil" + module_expsym_cmds_CXX="sed -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil" + if test yes != "$lt_cv_apple_cc_single_mod"; then + archive_cmds_CXX="\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dsymutil" + archive_expsym_cmds_CXX="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dar_export_syms$_lt_dsymutil" + fi + + else + ld_shlibs_CXX=no + fi + + ;; + + os2*) + hardcode_libdir_flag_spec_CXX='-L$libdir' + hardcode_minus_L_CXX=yes + allow_undefined_flag_CXX=unsupported + shrext_cmds=.dll + archive_cmds_CXX='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + archive_expsym_cmds_CXX='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + prefix_cmds="$SED"~ + if test EXPORTS = "`$SED 1q $export_symbols`"; then + prefix_cmds="$prefix_cmds -e 1d"; + fi~ + prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ + cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + old_archive_From_new_cmds_CXX='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + enable_shared_with_static_runtimes_CXX=yes + ;; + + dgux*) + case $cc_basename in + ec++*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + ghcx*) + # Green Hills C++ Compiler + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + freebsd2.*) + # C++ shared libraries reported to be fairly broken before + # switch to ELF + ld_shlibs_CXX=no + ;; + + freebsd-elf*) + archive_cmds_need_lc_CXX=no + ;; + + freebsd* | dragonfly*) + # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF + # conventions + ld_shlibs_CXX=yes + ;; + + haiku*) + archive_cmds_CXX='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + link_all_deplibs_CXX=yes + ;; + + hpux9*) + hardcode_libdir_flag_spec_CXX='$wl+b $wl$libdir' + hardcode_libdir_separator_CXX=: + export_dynamic_flag_spec_CXX='$wl-E' + hardcode_direct_CXX=yes + hardcode_minus_L_CXX=yes # Not in the search PATH, + # but as the default + # location of the library. + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + aCC*) + archive_cmds_CXX='$RM $output_objdir/$soname~$CC -b $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test yes = "$GXX"; then + archive_cmds_CXX='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' + else + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + fi + ;; + esac + ;; + + hpux10*|hpux11*) + if test no = "$with_gnu_ld"; then + hardcode_libdir_flag_spec_CXX='$wl+b $wl$libdir' + hardcode_libdir_separator_CXX=: + + case $host_cpu in + hppa*64*|ia64*) + ;; + *) + export_dynamic_flag_spec_CXX='$wl-E' + ;; + esac + fi + case $host_cpu in + hppa*64*|ia64*) + hardcode_direct_CXX=no + hardcode_shlibpath_var_CXX=no + ;; + *) + hardcode_direct_CXX=yes + hardcode_direct_absolute_CXX=yes + hardcode_minus_L_CXX=yes # Not in the search PATH, + # but as the default + # location of the library. + ;; + esac + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + aCC*) + case $host_cpu in + hppa*64*) + archive_cmds_CXX='$CC -b $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + archive_cmds_CXX='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + archive_cmds_CXX='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test yes = "$GXX"; then + if test no = "$with_gnu_ld"; then + case $host_cpu in + hppa*64*) + archive_cmds_CXX='$CC -shared -nostdlib -fPIC $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + archive_cmds_CXX='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + archive_cmds_CXX='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + fi + else + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + fi + ;; + esac + ;; + + interix[3-9]*) + hardcode_direct_CXX=no + hardcode_shlibpath_var_CXX=no + hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir' + export_dynamic_flag_spec_CXX='$wl-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + archive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + archive_expsym_cmds_CXX='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + irix5* | irix6*) + case $cc_basename in + CC*) + # SGI C++ + archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + + # Archives containing C++ object files must be created using + # "CC -ar", where "CC" is the IRIX C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs' + ;; + *) + if test yes = "$GXX"; then + if test no = "$with_gnu_ld"; then + archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + else + archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` -o $lib' + fi + fi + link_all_deplibs_CXX=yes + ;; + esac + hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir' + hardcode_libdir_separator_CXX=: + inherit_rpath_CXX=yes + ;; + + linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib $wl-retain-symbols-file,$export_symbols; mv \$templib $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + + hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir' + export_dynamic_flag_spec_CXX='$wl--export-dynamic' + + # Archives containing C++ object files must be created using + # "CC -Bstatic", where "CC" is the KAI C++ compiler. + old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' + ;; + icpc* | ecpc* ) + # Intel C++ + with_gnu_ld=yes + # version 8.0 and above of icpc choke on multiply defined symbols + # if we add $predep_objects and $postdep_objects, however 7.1 and + # earlier do not add the objects themselves. + case `$CC -V 2>&1` in + *"Version 7."*) + archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + ;; + *) # Version 8.0 or newer + tmp_idyn= + case $host_cpu in + ia64*) tmp_idyn=' -i_dynamic';; + esac + archive_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + ;; + esac + archive_cmds_need_lc_CXX=no + hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir' + export_dynamic_flag_spec_CXX='$wl--export-dynamic' + whole_archive_flag_spec_CXX='$wl--whole-archive$convenience $wl--no-whole-archive' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler + case `$CC -V` in + *pgCC\ [1-5].* | *pgcpp\ [1-5].*) + prelink_cmds_CXX='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ + compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' + old_archive_cmds_CXX='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ + $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ + $RANLIB $oldlib' + archive_cmds_CXX='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ + $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ + $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + ;; + *) # Version 6 and above use weak symbols + archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + ;; + esac + + hardcode_libdir_flag_spec_CXX='$wl--rpath $wl$libdir' + export_dynamic_flag_spec_CXX='$wl--export-dynamic' + whole_archive_flag_spec_CXX='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + ;; + cxx*) + # Compaq C++ + archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib $wl-retain-symbols-file $wl$export_symbols' + + runpath_var=LD_RUN_PATH + hardcode_libdir_flag_spec_CXX='-rpath $libdir' + hardcode_libdir_separator_CXX=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' + ;; + xl* | mpixl* | bgxl*) + # IBM XL 8.0 on PPC, with GNU ld + hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir' + export_dynamic_flag_spec_CXX='$wl--export-dynamic' + archive_cmds_CXX='$CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + if test yes = "$supports_anon_versioning"; then + archive_expsym_cmds_CXX='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' + fi + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + no_undefined_flag_CXX=' -zdefs' + archive_cmds_CXX='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + archive_expsym_cmds_CXX='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file $wl$export_symbols' + hardcode_libdir_flag_spec_CXX='-R$libdir' + whole_archive_flag_spec_CXX='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + compiler_needs_object_CXX=yes + + # Not sure whether something based on + # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 + # would be better. + output_verbose_link_cmd='func_echo_all' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' + ;; + esac + ;; + esac + ;; + + lynxos*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + + m88k*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + + mvs*) + case $cc_basename in + cxx*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + archive_cmds_CXX='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' + wlarc= + hardcode_libdir_flag_spec_CXX='-R$libdir' + hardcode_direct_CXX=yes + hardcode_shlibpath_var_CXX=no + fi + # Workaround some broken pre-1.5 toolchains + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' + ;; + + *nto* | *qnx*) + ld_shlibs_CXX=yes + ;; + + openbsd* | bitrig*) + if test -f /usr/libexec/ld.so; then + hardcode_direct_CXX=yes + hardcode_shlibpath_var_CXX=no + hardcode_direct_absolute_CXX=yes + archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir' + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`"; then + archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file,$export_symbols -o $lib' + export_dynamic_flag_spec_CXX='$wl-E' + whole_archive_flag_spec_CXX=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' + fi + output_verbose_link_cmd=func_echo_all + else + ld_shlibs_CXX=no + fi + ;; + + osf3* | osf4* | osf5*) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + + hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir' + hardcode_libdir_separator_CXX=: + + # Archives containing C++ object files must be created using + # the KAI C++ compiler. + case $host in + osf3*) old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;; + *) old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' ;; + esac + ;; + RCC*) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + cxx*) + case $host in + osf3*) + allow_undefined_flag_CXX=' $wl-expect_unresolved $wl\*' + archive_cmds_CXX='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $soname `test -n "$verstring" && func_echo_all "$wl-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir' + ;; + *) + allow_undefined_flag_CXX=' -expect_unresolved \*' + archive_cmds_CXX='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ + echo "-hidden">> $lib.exp~ + $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname $wl-input $wl$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~ + $RM $lib.exp' + hardcode_libdir_flag_spec_CXX='-rpath $libdir' + ;; + esac + + hardcode_libdir_separator_CXX=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test yes,no = "$GXX,$with_gnu_ld"; then + allow_undefined_flag_CXX=' $wl-expect_unresolved $wl\*' + case $host in + osf3*) + archive_cmds_CXX='$CC -shared -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + ;; + *) + archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + ;; + esac + + hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir' + hardcode_libdir_separator_CXX=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + + else + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + fi + ;; + esac + ;; + + psos*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + lcc*) + # Lucid + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + solaris*) + case $cc_basename in + CC* | sunCC*) + # Sun C++ 4.2, 5.x and Centerline C++ + archive_cmds_need_lc_CXX=yes + no_undefined_flag_CXX=' -zdefs' + archive_cmds_CXX='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G$allow_undefined_flag $wl-M $wl$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + hardcode_libdir_flag_spec_CXX='-R$libdir' + hardcode_shlibpath_var_CXX=no + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands '-z linker_flag'. + # Supported since Solaris 2.6 (maybe 2.5.1?) + whole_archive_flag_spec_CXX='-z allextract$convenience -z defaultextract' + ;; + esac + link_all_deplibs_CXX=yes + + output_verbose_link_cmd='func_echo_all' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' + ;; + gcx*) + # Green Hills C++ Compiler + archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' + + # The C++ compiler must be used to create the archive. + old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs' + ;; + *) + # GNU C++ compiler with Solaris linker + if test yes,no = "$GXX,$with_gnu_ld"; then + no_undefined_flag_CXX=' $wl-z ${wl}defs' + if $CC --version | $GREP -v '^2\.7' > /dev/null; then + archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' + archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared $pic_flag -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + else + # g++ 2.7 appears to require '-G' NOT '-shared' on this + # platform. + archive_cmds_CXX='$CC -G -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' + archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + fi + + hardcode_libdir_flag_spec_CXX='$wl-R $wl$libdir' + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) + whole_archive_flag_spec_CXX='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' + ;; + esac + fi + ;; + esac + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) + no_undefined_flag_CXX='$wl-z,text' + archive_cmds_need_lc_CXX=no + hardcode_shlibpath_var_CXX=no + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + archive_cmds_CXX='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_CXX='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds_CXX='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_CXX='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We CANNOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + no_undefined_flag_CXX='$wl-z,text' + allow_undefined_flag_CXX='$wl-z,nodefs' + archive_cmds_need_lc_CXX=no + hardcode_shlibpath_var_CXX=no + hardcode_libdir_flag_spec_CXX='$wl-R,$libdir' + hardcode_libdir_separator_CXX=':' + link_all_deplibs_CXX=yes + export_dynamic_flag_spec_CXX='$wl-Bexport' + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + archive_cmds_CXX='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_CXX='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + old_archive_cmds_CXX='$CC -Tprelink_objects $oldobjs~ + '"$old_archive_cmds_CXX" + reload_cmds_CXX='$CC -Tprelink_objects $reload_objs~ + '"$reload_cmds_CXX" + ;; + *) + archive_cmds_CXX='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_CXX='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + vxworks*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 +printf "%s\n" "$ld_shlibs_CXX" >&6; } + test no = "$ld_shlibs_CXX" && can_build_shared=no + + GCC_CXX=$GXX + LD_CXX=$LD + + ## CAVEAT EMPTOR: + ## There is no encapsulation within the following macros, do not change + ## the running order or otherwise move them around unless you know exactly + ## what you are doing... + # Dependencies to place before and after the object being linked: +predep_objects_CXX= +postdep_objects_CXX= +predeps_CXX= +postdeps_CXX= +compiler_lib_search_path_CXX= + +cat > conftest.$ac_ext <<_LT_EOF +class Foo +{ +public: + Foo (void) { a = 0; } +private: + int a; +}; +_LT_EOF + + +_lt_libdeps_save_CFLAGS=$CFLAGS +case "$CC $CFLAGS " in #( +*\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; +*\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; +*\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; +esac + +if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + # Parse the compiler output and extract the necessary + # objects, libraries and library flags. + + # Sentinel used to keep track of whether or not we are before + # the conftest object file. + pre_test_object_deps_done=no + + for p in `eval "$output_verbose_link_cmd"`; do + case $prev$p in + + -L* | -R* | -l*) + # Some compilers place space between "-{L,R}" and the path. + # Remove the space. + if test x-L = "$p" || + test x-R = "$p"; then + prev=$p + continue + fi + + # Expand the sysroot to ease extracting the directories later. + if test -z "$prev"; then + case $p in + -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; + -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; + -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; + esac + fi + case $p in + =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; + esac + if test no = "$pre_test_object_deps_done"; then + case $prev in + -L | -R) + # Internal compiler library paths should come after those + # provided the user. The postdeps already come after the + # user supplied libs so there is no need to process them. + if test -z "$compiler_lib_search_path_CXX"; then + compiler_lib_search_path_CXX=$prev$p + else + compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} $prev$p" + fi + ;; + # The "-l" case would never come before the object being + # linked, so don't bother handling this case. + esac + else + if test -z "$postdeps_CXX"; then + postdeps_CXX=$prev$p + else + postdeps_CXX="${postdeps_CXX} $prev$p" + fi + fi + prev= + ;; + + *.lto.$objext) ;; # Ignore GCC LTO objects + *.$objext) + # This assumes that the test object file only shows up + # once in the compiler output. + if test "$p" = "conftest.$objext"; then + pre_test_object_deps_done=yes + continue + fi + + if test no = "$pre_test_object_deps_done"; then + if test -z "$predep_objects_CXX"; then + predep_objects_CXX=$p + else + predep_objects_CXX="$predep_objects_CXX $p" + fi + else + if test -z "$postdep_objects_CXX"; then + postdep_objects_CXX=$p + else + postdep_objects_CXX="$postdep_objects_CXX $p" + fi + fi + ;; + + *) ;; # Ignore the rest. + + esac + done + + # Clean up. + rm -f a.out a.exe +else + echo "libtool.m4: error: problem compiling CXX test program" +fi + +$RM -f confest.$objext +CFLAGS=$_lt_libdeps_save_CFLAGS + +# PORTME: override above test on systems where it is broken +case $host_os in +interix[3-9]*) + # Interix 3.5 installs completely hosed .la files for C++, so rather than + # hack all around it, let's just trust "g++" to DTRT. + predep_objects_CXX= + postdep_objects_CXX= + postdeps_CXX= + ;; +esac + + +case " $postdeps_CXX " in +*" -lc "*) archive_cmds_need_lc_CXX=no ;; +esac + compiler_lib_search_dirs_CXX= +if test -n "${compiler_lib_search_path_CXX}"; then + compiler_lib_search_dirs_CXX=`echo " ${compiler_lib_search_path_CXX}" | $SED -e 's! -L! !g' -e 's!^ !!'` +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + lt_prog_compiler_wl_CXX= +lt_prog_compiler_pic_CXX= +lt_prog_compiler_static_CXX= + + + # C++ specific cases for pic, static, wl, etc. + if test yes = "$GXX"; then + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static_CXX='-Bstatic' + fi + lt_prog_compiler_pic_CXX='-fPIC' + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + lt_prog_compiler_pic_CXX='-fPIC' + ;; + m68k) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the '-m68020' flag to GCC prevents building anything better, + # like '-m68040'. + lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + mingw* | cygwin* | os2* | pw32* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + lt_prog_compiler_pic_CXX='-DDLL_EXPORT' + case $host_os in + os2*) + lt_prog_compiler_static_CXX='$wl-static' + ;; + esac + ;; + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic_CXX='-fno-common' + ;; + *djgpp*) + # DJGPP does not support shared libraries at all + lt_prog_compiler_pic_CXX= + ;; + haiku*) + # PIC is the default for Haiku. + # The "-static" flag exists, but is broken. + lt_prog_compiler_static_CXX= + ;; + interix[3-9]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic_CXX=-Kconform_pic + fi + ;; + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + ;; + *) + lt_prog_compiler_pic_CXX='-fPIC' + ;; + esac + ;; + *qnx* | *nto*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic_CXX='-fPIC -shared' + ;; + *) + lt_prog_compiler_pic_CXX='-fPIC' + ;; + esac + else + case $host_os in + aix[4-9]*) + # All AIX code is PIC. + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static_CXX='-Bstatic' + else + lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp' + fi + ;; + chorus*) + case $cc_basename in + cxch68*) + # Green Hills C++ Compiler + # _LT_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" + ;; + esac + ;; + mingw* | cygwin* | os2* | pw32* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_prog_compiler_pic_CXX='-DDLL_EXPORT' + ;; + dgux*) + case $cc_basename in + ec++*) + lt_prog_compiler_pic_CXX='-KPIC' + ;; + ghcx*) + # Green Hills C++ Compiler + lt_prog_compiler_pic_CXX='-pic' + ;; + *) + ;; + esac + ;; + freebsd* | dragonfly*) + # FreeBSD uses GNU C++ + ;; + hpux9* | hpux10* | hpux11*) + case $cc_basename in + CC*) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='$wl-a ${wl}archive' + if test ia64 != "$host_cpu"; then + lt_prog_compiler_pic_CXX='+Z' + fi + ;; + aCC*) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='$wl-a ${wl}archive' + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic_CXX='+Z' + ;; + esac + ;; + *) + ;; + esac + ;; + interix*) + # This is c89, which is MS Visual C++ (no shared libs) + # Anyone wants to do a port? + ;; + irix5* | irix6* | nonstopux*) + case $cc_basename in + CC*) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='-non_shared' + # CC pic flag -KPIC is the default. + ;; + *) + ;; + esac + ;; + linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + case $cc_basename in + KCC*) + # KAI C++ Compiler + lt_prog_compiler_wl_CXX='--backend -Wl,' + lt_prog_compiler_pic_CXX='-fPIC' + ;; + ecpc* ) + # old Intel C++ for x86_64, which still supported -KPIC. + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-static' + ;; + icpc* ) + # Intel C++, used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-fPIC' + lt_prog_compiler_static_CXX='-static' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-fpic' + lt_prog_compiler_static_CXX='-Bstatic' + ;; + cxx*) + # Compaq C++ + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + lt_prog_compiler_pic_CXX= + lt_prog_compiler_static_CXX='-non_shared' + ;; + xlc* | xlC* | bgxl[cC]* | mpixl[cC]*) + # IBM XL 8.0, 9.0 on PPC and BlueGene + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-qpic' + lt_prog_compiler_static_CXX='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-Bstatic' + lt_prog_compiler_wl_CXX='-Qoption ld ' + ;; + esac + ;; + esac + ;; + lynxos*) + ;; + m88k*) + ;; + mvs*) + case $cc_basename in + cxx*) + lt_prog_compiler_pic_CXX='-W c,exportall' + ;; + *) + ;; + esac + ;; + netbsd*) + ;; + *qnx* | *nto*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic_CXX='-fPIC -shared' + ;; + osf3* | osf4* | osf5*) + case $cc_basename in + KCC*) + lt_prog_compiler_wl_CXX='--backend -Wl,' + ;; + RCC*) + # Rational C++ 2.4.1 + lt_prog_compiler_pic_CXX='-pic' + ;; + cxx*) + # Digital/Compaq C++ + lt_prog_compiler_wl_CXX='-Wl,' + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + lt_prog_compiler_pic_CXX= + lt_prog_compiler_static_CXX='-non_shared' + ;; + *) + ;; + esac + ;; + psos*) + ;; + solaris*) + case $cc_basename in + CC* | sunCC*) + # Sun C++ 4.2, 5.x and Centerline C++ + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-Bstatic' + lt_prog_compiler_wl_CXX='-Qoption ld ' + ;; + gcx*) + # Green Hills C++ Compiler + lt_prog_compiler_pic_CXX='-PIC' + ;; + *) + ;; + esac + ;; + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + lt_prog_compiler_pic_CXX='-pic' + lt_prog_compiler_static_CXX='-Bstatic' + ;; + lcc*) + # Lucid + lt_prog_compiler_pic_CXX='-pic' + ;; + *) + ;; + esac + ;; + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + case $cc_basename in + CC*) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-Bstatic' + ;; + esac + ;; + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + lt_prog_compiler_pic_CXX='-KPIC' + ;; + *) + ;; + esac + ;; + vxworks*) + ;; + *) + lt_prog_compiler_can_build_shared_CXX=no + ;; + esac + fi + +case $host_os in + # For platforms that do not support PIC, -DPIC is meaningless: + *djgpp*) + lt_prog_compiler_pic_CXX= + ;; + *) + lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX@&t@ -DPIC" + ;; +esac + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 +printf %s "checking for $compiler option to produce PIC... " >&6; } +if test ${lt_cv_prog_compiler_pic_CXX+y} +then : + printf %s "(cached) " >&6 +else $as_nop + lt_cv_prog_compiler_pic_CXX=$lt_prog_compiler_pic_CXX +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_CXX" >&5 +printf "%s\n" "$lt_cv_prog_compiler_pic_CXX" >&6; } +lt_prog_compiler_pic_CXX=$lt_cv_prog_compiler_pic_CXX + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$lt_prog_compiler_pic_CXX"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5 +printf %s "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... " >&6; } +if test ${lt_cv_prog_compiler_pic_works_CXX+y} +then : + printf %s "(cached) " >&6 +else $as_nop + lt_cv_prog_compiler_pic_works_CXX=no + ac_outfile=conftest.$ac_objext + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$lt_prog_compiler_pic_CXX@&t@ -DPIC" ## exclude from sc_useless_quotes_in_assignment + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_pic_works_CXX=yes + fi + fi + $RM conftest* + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_CXX" >&5 +printf "%s\n" "$lt_cv_prog_compiler_pic_works_CXX" >&6; } + +if test yes = "$lt_cv_prog_compiler_pic_works_CXX"; then + case $lt_prog_compiler_pic_CXX in + "" | " "*) ;; + *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;; + esac +else + lt_prog_compiler_pic_CXX= + lt_prog_compiler_can_build_shared_CXX=no +fi + +fi + + + + + +# +# Check to make sure the static flag actually works. +# +wl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\"$lt_prog_compiler_static_CXX\" +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 +printf %s "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } +if test ${lt_cv_prog_compiler_static_works_CXX+y} +then : + printf %s "(cached) " >&6 +else $as_nop + lt_cv_prog_compiler_static_works_CXX=no + save_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS $lt_tmp_static_flag" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&5 + $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_static_works_CXX=yes + fi + else + lt_cv_prog_compiler_static_works_CXX=yes + fi + fi + $RM -r conftest* + LDFLAGS=$save_LDFLAGS + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_CXX" >&5 +printf "%s\n" "$lt_cv_prog_compiler_static_works_CXX" >&6; } + +if test yes = "$lt_cv_prog_compiler_static_works_CXX"; then + : +else + lt_prog_compiler_static_CXX= +fi + + + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +printf %s "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if test ${lt_cv_prog_compiler_c_o_CXX+y} +then : + printf %s "(cached) " >&6 +else $as_nop + lt_cv_prog_compiler_c_o_CXX=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o_CXX=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 +printf "%s\n" "$lt_cv_prog_compiler_c_o_CXX" >&6; } + + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +printf %s "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if test ${lt_cv_prog_compiler_c_o_CXX+y} +then : + printf %s "(cached) " >&6 +else $as_nop + lt_cv_prog_compiler_c_o_CXX=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o_CXX=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 +printf "%s\n" "$lt_cv_prog_compiler_c_o_CXX" >&6; } + + + + +hard_links=nottested +if test no = "$lt_cv_prog_compiler_c_o_CXX" && test no != "$need_locks"; then + # do not overwrite the value of need_locks provided by the user + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 +printf %s "checking if we can lock with hard links... " >&6; } + hard_links=yes + $RM conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 +printf "%s\n" "$hard_links" >&6; } + if test no = "$hard_links"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&5 +printf "%s\n" "$as_me: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&2;} + need_locks=warn + fi +else + need_locks=no +fi + + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +printf %s "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } + + export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + exclude_expsyms_CXX='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' + case $host_os in + aix[4-9]*) + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to GNU nm, but means don't demangle to AIX nm. + # Without the "-l" option, or with the "-B" option, AIX nm treats + # weak defined symbols like other global defined symbols, whereas + # GNU nm marks them as "W". + # While the 'weak' keyword is ignored in the Export File, we need + # it in the Import File for the 'aix-soname' feature, so we have + # to replace the "-B" option with "-P" for AIX nm. + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' + else + export_symbols_cmds_CXX='`func_echo_all $NM | $SED -e '\''s/B\([^B]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && (substr(\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' + fi + ;; + pw32*) + export_symbols_cmds_CXX=$ltdll_cmds + ;; + cygwin* | mingw* | cegcc*) + case $cc_basename in + cl*) + exclude_expsyms_CXX='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' + ;; + *) + export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' + exclude_expsyms_CXX='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' + ;; + esac + ;; + *) + export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + ;; + esac + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 +printf "%s\n" "$ld_shlibs_CXX" >&6; } +test no = "$ld_shlibs_CXX" && can_build_shared=no + +with_gnu_ld_CXX=$with_gnu_ld + + + + + + +# +# Do we need to explicitly link libc? +# +case "x$archive_cmds_need_lc_CXX" in +x|xyes) + # Assume -lc should be added + archive_cmds_need_lc_CXX=yes + + if test yes,yes = "$GCC,$enable_shared"; then + case $archive_cmds_CXX in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 +printf %s "checking whether -lc should be explicitly linked in... " >&6; } +if test ${lt_cv_archive_cmds_need_lc_CXX+y} +then : + printf %s "(cached) " >&6 +else $as_nop + $RM conftest* + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$lt_prog_compiler_wl_CXX + pic_flag=$lt_prog_compiler_pic_CXX + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$allow_undefined_flag_CXX + allow_undefined_flag_CXX= + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 + (eval $archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + then + lt_cv_archive_cmds_need_lc_CXX=no + else + lt_cv_archive_cmds_need_lc_CXX=yes + fi + allow_undefined_flag_CXX=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $RM conftest* + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc_CXX" >&5 +printf "%s\n" "$lt_cv_archive_cmds_need_lc_CXX" >&6; } + archive_cmds_need_lc_CXX=$lt_cv_archive_cmds_need_lc_CXX + ;; + esac + fi + ;; +esac + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 +printf %s "checking dynamic linker characteristics... " >&6; } + +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=.so +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + + + +case $host_os in +aix3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='$libname$release$shared_ext$major' + ;; + +aix[4-9]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test ia64 = "$host_cpu"; then + # AIX 5 supports IA64 + library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line '#! .'. This would cause the generated library to + # depend on '.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[01] | aix4.[01].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # Using Import Files as archive members, it is possible to support + # filename-based versioning of shared library archives on AIX. While + # this would work for both with and without runtime linking, it will + # prevent static linking of such archives. So we do filename-based + # shared library versioning with .so extension only, which is used + # when both runtime linking and shared linking is enabled. + # Unfortunately, runtime linking may impact performance, so we do + # not want this to be the default eventually. Also, we use the + # versioned .so libs for executables only if there is the -brtl + # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only. + # To allow for filename-based versioning support, we need to create + # libNAME.so.V as an archive file, containing: + # *) an Import File, referring to the versioned filename of the + # archive as well as the shared archive member, telling the + # bitwidth (32 or 64) of that shared object, and providing the + # list of exported symbols of that shared object, eventually + # decorated with the 'weak' keyword + # *) the shared object with the F_LOADONLY flag set, to really avoid + # it being seen by the linker. + # At run time we better use the real file rather than another symlink, + # but for link time we create the symlink libNAME.so -> libNAME.so.V + + case $with_aix_soname,$aix_use_runtimelinking in + # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + aix,yes) # traditional libtool + dynamic_linker='AIX unversionable lib.so' + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + ;; + aix,no) # traditional AIX only + dynamic_linker='AIX lib.a(lib.so.V)' + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='$libname$release.a $libname.a' + soname_spec='$libname$release$shared_ext$major' + ;; + svr4,*) # full svr4 only + dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o)" + library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' + # We do not specify a path in Import Files, so LIBPATH fires. + shlibpath_overrides_runpath=yes + ;; + *,yes) # both, prefer svr4 + dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o), lib.a(lib.so.V)" + library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' + # unpreferred sharedlib libNAME.a needs extra handling + postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"' + postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"' + # We do not specify a path in Import Files, so LIBPATH fires. + shlibpath_overrides_runpath=yes + ;; + *,no) # both, prefer aix + dynamic_linker="AIX lib.a(lib.so.V), lib.so.V($shared_archive_member_spec.o)" + library_names_spec='$libname$release.a $libname.a' + soname_spec='$libname$release$shared_ext$major' + # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling + postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)' + postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"' + ;; + esac + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + case $host_cpu in + powerpc) + # Since July 2007 AmigaOS4 officially supports .so libraries. + # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + ;; + m68k) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + esac + ;; + +beos*) + library_names_spec='$libname$shared_ext' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[45]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32* | cegcc*) + version_type=windows + shrext_cmds=.dll + need_version=no + need_lib_prefix=no + + case $GCC,$cc_basename in + yes,*) + # gcc + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo $libname | sed -e 's/^lib/cyg/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + + ;; + mingw* | cegcc*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo $libname | sed -e 's/^lib/pw/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + ;; + esac + dynamic_linker='Win32 ld.exe' + ;; + + *,cl*) + # Native MSVC + libname_spec='$name' + soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + library_names_spec='$libname.dll.lib' + + case $build_os in + mingw*) + sys_lib_search_path_spec= + lt_save_ifs=$IFS + IFS=';' + for lt_path in $LIB + do + IFS=$lt_save_ifs + # Let DOS variable expansion print the short 8.3 style file name. + lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` + sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" + done + IFS=$lt_save_ifs + # Convert to MSYS style. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` + ;; + cygwin*) + # Convert to unix form, then to dos form, then back to unix form + # but this time dos style (no spaces!) so that the unix form looks + # like /cygdrive/c/PROGRA~1:/cygdr... + sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` + sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` + sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + ;; + *) + sys_lib_search_path_spec=$LIB + if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then + # It is most probably a Windows format PATH. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + # FIXME: find the short name or the path components, as spaces are + # common. (e.g. "Program Files" -> "PROGRA~1") + ;; + esac + + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + dynamic_linker='Win32 link.exe' + ;; + + *) + # Assume MSVC wrapper + library_names_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext $libname.lib' + dynamic_linker='Win32 ld.exe' + ;; + esac + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$major$shared_ext $libname$shared_ext' + soname_spec='$libname$release$major$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' + + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[23].*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2.*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[01]* | freebsdelf3.[01]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ + freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + *) # from 4.6 on, and DragonFly + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +haiku*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + dynamic_linker="$host_os runtime_loader" + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LIBRARY_PATH + shlibpath_overrides_runpath=no + sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + if test 32 = "$HPUX_IA64_MODE"; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + sys_lib_dlsearch_path_spec=/usr/lib/hpux32 + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + sys_lib_dlsearch_path_spec=/usr/lib/hpux64 + fi + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555, ... + postinstall_cmds='chmod 555 $lib' + # or fails outright, so override atomically: + install_override_mode=555 + ;; + +interix[3-9]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test yes = "$lt_cv_prog_gnu_ld"; then + version_type=linux # correct to gnu/linux during the next big refactor + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='$libname$release$shared_ext$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff" + sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +linux*android*) + version_type=none # Android doesn't support versioned libraries. + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext' + soname_spec='$libname$release$shared_ext' + finish_cmds= + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + dynamic_linker='Android linker' + # Don't embed -rpath directories since the linker doesn't support them. + hardcode_libdir_flag_spec_CXX='-L$libdir' + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + + # Some binutils ld are patched to set DT_RUNPATH + if test ${lt_cv_shlibpath_overrides_runpath+y} +then : + printf %s "(cached) " >&6 +else $as_nop + lt_cv_shlibpath_overrides_runpath=no + save_LDFLAGS=$LDFLAGS + save_libdir=$libdir + eval "libdir=/foo; wl=\"$lt_prog_compiler_wl_CXX\"; \ + LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec_CXX\"" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_link "$LINENO" +then : + if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null +then : + lt_cv_shlibpath_overrides_runpath=yes +fi +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$save_LDFLAGS + libdir=$save_libdir + +fi + + shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # Ideally, we could use ldconfig to report *all* directores which are + # searched for libraries, however this is still not possible. Aside from not + # being certain /sbin/ldconfig is available, command + # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64, + # even though it is searched at run-time. Try to do the best guess by + # appending ld.so.conf contents (and includes) to the search path. + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +*nto* | *qnx*) + version_type=qnx + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='ldqnx.so' + ;; + +openbsd* | bitrig*) + version_type=sunos + sys_lib_dlsearch_path_spec=/usr/lib + need_lib_prefix=no + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then + need_version=no + else + need_version=yes + fi + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +os2*) + libname_spec='$name' + version_type=windows + shrext_cmds=.dll + need_version=no + need_lib_prefix=no + # OS/2 can only load a DLL with a base name of 8 characters or less. + soname_spec='`test -n "$os2dllname" && libname="$os2dllname"; + v=$($ECHO $release$versuffix | tr -d .-); + n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _); + $ECHO $n$v`$shared_ext' + library_names_spec='${libname}_dll.$libext' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=BEGINLIBPATH + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='$libname$release$shared_ext$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + +rdos*) + dynamic_linker=no + ;; + +solaris*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test yes = "$with_gnu_ld"; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec; then + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext' + soname_spec='$libname$shared_ext.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=sco + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + if test yes = "$with_gnu_ld"; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + +tpf*) + # TPF is a cross-target only. Preferred cross-host = GNU/Linux. + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +uts4*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 +printf "%s\n" "$dynamic_linker" >&6; } +test no = "$dynamic_linker" && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test yes = "$GCC"; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then + sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec +fi + +if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then + sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec +fi + +# remember unaugmented sys_lib_dlsearch_path content for libtool script decls... +configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec + +# ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code +func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH" + +# to be used as default LT_SYS_LIBRARY_PATH value in generated libtool +configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 +printf %s "checking how to hardcode library paths into programs... " >&6; } +hardcode_action_CXX= +if test -n "$hardcode_libdir_flag_spec_CXX" || + test -n "$runpath_var_CXX" || + test yes = "$hardcode_automatic_CXX"; then + + # We can hardcode non-existent directories. + if test no != "$hardcode_direct_CXX" && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, CXX)" && + test no != "$hardcode_minus_L_CXX"; then + # Linking always hardcodes the temporary library directory. + hardcode_action_CXX=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + hardcode_action_CXX=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + hardcode_action_CXX=unsupported +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_CXX" >&5 +printf "%s\n" "$hardcode_action_CXX" >&6; } + +if test relink = "$hardcode_action_CXX" || + test yes = "$inherit_rpath_CXX"; then + # Fast installation is not supported + enable_fast_install=no +elif test yes = "$shlibpath_overrides_runpath" || + test no = "$enable_shared"; then + # Fast installation is not necessary + enable_fast_install=needless +fi + + + + + + + + fi # test -n "$compiler" + + CC=$lt_save_CC + CFLAGS=$lt_save_CFLAGS + LDCXX=$LD + LD=$lt_save_LD + GCC=$lt_save_GCC + with_gnu_ld=$lt_save_with_gnu_ld + lt_cv_path_LDCXX=$lt_cv_path_LD + lt_cv_path_LD=$lt_save_path_LD + lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld + lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld +fi # test yes != "$_lt_caught_CXX_error" + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + + + + + + + + + + + + + + ac_config_commands="$ac_config_commands libtool" + + + + +# Only expand once: + + + +# Transfer these variables to the Makefile + + + + + +ac_config_files="$ac_config_files Makefile lib/Makefile include/Makefile bin/Makefile doc/Makefile portaudiocpp.pc" + +cat >confcache <<\_ACEOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs, see configure's option --config-cache. +# It is not useful on other systems. If it contains results you don't +# want to keep, you may remove or edit it. +# +# config.status only pays attention to the cache file if you give it +# the --recheck option to rerun configure. +# +# `ac_cv_env_foo' variables (set or unset) will be overridden when +# loading this file, other *unset* `ac_cv_foo' will be assigned the +# following values. + +_ACEOF + +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, we kill variables containing newlines. +# Ultrix sh set writes to stderr and can't be redirected directly, +# and sets the high bit in the cache file unless we assign to the vars. +( + for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + + (set) 2>&1 | + case $as_nl`(ac_space=' '; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + # `set' does not quote correctly, so add quotes: double-quote + # substitution turns \\\\ into \\, and sed turns \\ into \. + sed -n \ + "s/'/'\\\\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" + ;; #( + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) | + sed ' + /^ac_cv_env_/b end + t clear + :clear + s/^\([^=]*\)=\(.*[{}].*\)$/test ${\1+y} || &/ + t end + s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ + :end' >>confcache +if diff "$cache_file" confcache >/dev/null 2>&1; then :; else + if test -w "$cache_file"; then + if test "x$cache_file" != "x/dev/null"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 +printf "%s\n" "$as_me: updating cache $cache_file" >&6;} + if test ! -f "$cache_file" || test -h "$cache_file"; then + cat confcache >"$cache_file" + else + case $cache_file in #( + */* | ?:*) + mv -f confcache "$cache_file"$$ && + mv -f "$cache_file"$$ "$cache_file" ;; #( + *) + mv -f confcache "$cache_file" ;; + esac + fi + fi + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 +printf "%s\n" "$as_me: not updating unwritable cache $cache_file" >&6;} + fi +fi +rm -f confcache + +test "x$prefix" = xNONE && prefix=$ac_default_prefix +# Let make expand exec_prefix. +test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' + +# Transform confdefs.h into DEFS. +# Protect against shell expansion while executing Makefile rules. +# Protect against Makefile macro expansion. +# +# If the first sed substitution is executed (which looks for macros that +# take arguments), then branch to the quote section. Otherwise, +# look for a macro that doesn't take arguments. +ac_script=' +:mline +/\\$/{ + N + s,\\\n,, + b mline +} +t clear +:clear +s/^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\)/-D\1=\2/g +t quote +s/^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)/-D\1=\2/g +t quote +b any +:quote +s/[ `~#$^&*(){}\\|;'\''"<>?]/\\&/g +s/\[/\\&/g +s/\]/\\&/g +s/\$/$$/g +H +:any +${ + g + s/^\n// + s/\n/ /g + p +} +' +DEFS=`sed -n "$ac_script" confdefs.h` + + +ac_libobjs= +ac_ltlibobjs= +U= +for ac_i in : $LIB@&t@OBJS; do test "x$ac_i" = x: && continue + # 1. Remove the extension, and $U if already installed. + ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' + ac_i=`printf "%s\n" "$ac_i" | sed "$ac_script"` + # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR + # will be set to the directory where LIBOBJS objects are built. + as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" + as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' +done +LIB@&t@OBJS=$ac_libobjs + +LTLIBOBJS=$ac_ltlibobjs + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 +printf %s "checking that generated files are newer than configure... " >&6; } + if test -n "$am_sleep_pid"; then + # Hide warnings about reused PIDs. + wait $am_sleep_pid 2>/dev/null + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: done" >&5 +printf "%s\n" "done" >&6; } + if test -n "$EXEEXT"; then + am__EXEEXT_TRUE= + am__EXEEXT_FALSE='#' +else + am__EXEEXT_TRUE='#' + am__EXEEXT_FALSE= +fi + +if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then + as_fn_error $? "conditional \"MAINTAINER_MODE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then + as_fn_error $? "conditional \"AMDEP\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then + as_fn_error $? "conditional \"am__fastdepCC\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then + as_fn_error $? "conditional \"am__fastdepCXX\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi + +: "${CONFIG_STATUS=./config.status}" +ac_write_fail=0 +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files $CONFIG_STATUS" +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 +printf "%s\n" "$as_me: creating $CONFIG_STATUS" >&6;} +as_write_fail=0 +cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 +#! $SHELL +# Generated by $as_me. +# Run this file to recreate the current configuration. +# Compiler output produced by configure, useful for debugging +# configure, is in config.log if it exists. + +debug=false +ac_cs_recheck=false +ac_cs_silent=false + +SHELL=\${CONFIG_SHELL-$SHELL} +export SHELL +_ASEOF +cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +as_nop=: +if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 +then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else $as_nop + case `(set -o) 2>/dev/null` in @%:@( + *posix*) : + set -o posix ;; @%:@( + *) : + ;; +esac +fi + + + +# Reset variables that may have inherited troublesome values from +# the environment. + +# IFS needs to be set, to space, tab, and newline, in precisely that order. +# (If _AS_PATH_WALK were called with IFS unset, it would have the +# side effect of setting IFS to empty, thus disabling word splitting.) +# Quoting is to prevent editors from complaining about space-tab. +as_nl=' +' +export as_nl +IFS=" "" $as_nl" + +PS1='$ ' +PS2='> ' +PS4='+ ' + +# Ensure predictable behavior from utilities with locale-dependent output. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# We cannot yet rely on "unset" to work, but we need these variables +# to be unset--not just set to an empty or harmless value--now, to +# avoid bugs in old shells (e.g. pre-3.0 UWIN ksh). This construct +# also avoids known problems related to "unset" and subshell syntax +# in other old shells (e.g. bash 2.01 and pdksh 5.2.14). +for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH +do eval test \${$as_var+y} \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done + +# Ensure that fds 0, 1, and 2 are open. +if (exec 3>&0) 2>/dev/null; then :; else exec 0&1) 2>/dev/null; then :; else exec 1>/dev/null; fi +if (exec 3>&2) ; then :; else exec 2>/dev/null; fi + +# The user is always right. +if ${PATH_SEPARATOR+false} :; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# Find who we are. Look in the path if we contain no directory separator. +as_myself= +case $0 in @%:@(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + test -r "$as_dir$0" && as_myself=$as_dir$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + + + +@%:@ as_fn_error STATUS ERROR [LINENO LOG_FD] +@%:@ ---------------------------------------- +@%:@ Output "`basename @S|@0`: error: ERROR" to stderr. If LINENO and LOG_FD are +@%:@ provided, also output the error to LOG_FD, referencing LINENO. Then exit the +@%:@ script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + printf "%s\n" "$as_me: error: $2" >&2 + as_fn_exit $as_status +} @%:@ as_fn_error + + + +@%:@ as_fn_set_status STATUS +@%:@ ----------------------- +@%:@ Set @S|@? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} @%:@ as_fn_set_status + +@%:@ as_fn_exit STATUS +@%:@ ----------------- +@%:@ Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} @%:@ as_fn_exit + +@%:@ as_fn_unset VAR +@%:@ --------------- +@%:@ Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset + +@%:@ as_fn_append VAR VALUE +@%:@ ---------------------- +@%:@ Append the text in VALUE to the end of the definition contained in VAR. Take +@%:@ advantage of any shell optimizations that allow amortized linear growth over +@%:@ repeated appends, instead of the typical quadratic growth present in naive +@%:@ implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null +then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else $as_nop + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +@%:@ as_fn_arith ARG... +@%:@ ------------------ +@%:@ Perform arithmetic evaluation on the ARGs, and store the result in the +@%:@ global @S|@as_val. Take advantage of shells that can avoid forks. The arguments +@%:@ must be portable across @S|@(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null +then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else $as_nop + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +printf "%s\n" X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + + +# Determine whether it's possible to make 'echo' print without a newline. +# These variables are no longer used directly by Autoconf, but are AC_SUBSTed +# for compatibility with existing Makefiles. +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in @%:@((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +# For backward compatibility with old third-party macros, we provide +# the shell variables $as_echo and $as_echo_n. New code should use +# AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively. +as_@&t@echo='printf %s\n' +as_@&t@echo_n='printf %s' + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -pR'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -pR' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -pR' + fi +else + as_ln_s='cp -pR' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + + +@%:@ as_fn_mkdir_p +@%:@ ------------- +@%:@ Create "@S|@as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`printf "%s\n" "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +printf "%s\n" X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} @%:@ as_fn_mkdir_p +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + + +@%:@ as_fn_executable_p FILE +@%:@ ----------------------- +@%:@ Test if FILE is an executable regular file. +as_fn_executable_p () +{ + test -f "$1" && test -x "$1" +} @%:@ as_fn_executable_p +as_test_x='test -x' +as_executable_p=as_fn_executable_p + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +exec 6>&1 +## ----------------------------------- ## +## Main body of $CONFIG_STATUS script. ## +## ----------------------------------- ## +_ASEOF +test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# Save the log message, to keep $0 and so on meaningful, and to +# report actual input values of CONFIG_FILES etc. instead of their +# values after options handling. +ac_log=" +This file was extended by PortAudioCpp $as_me 12, which was +generated by GNU Autoconf 2.71. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES + CONFIG_HEADERS = $CONFIG_HEADERS + CONFIG_LINKS = $CONFIG_LINKS + CONFIG_COMMANDS = $CONFIG_COMMANDS + $ $0 $@ + +on `(hostname || uname -n) 2>/dev/null | sed 1q` +" + +_ACEOF + +case $ac_config_files in *" +"*) set x $ac_config_files; shift; ac_config_files=$*;; +esac + + + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# Files that config.status was made for. +config_files="$ac_config_files" +config_commands="$ac_config_commands" + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +ac_cs_usage="\ +\`$as_me' instantiates files and other configuration actions +from templates according to the current configuration. Unless the files +and actions are specified as TAGs, all are instantiated by default. + +Usage: $0 [OPTION]... [TAG]... + + -h, --help print this help, then exit + -V, --version print version number and configuration settings, then exit + --config print configuration, then exit + -q, --quiet, --silent + do not print progress messages + -d, --debug don't remove temporary files + --recheck update $as_me by reconfiguring in the same conditions + --file=FILE[:TEMPLATE] + instantiate the configuration file FILE + +Configuration files: +$config_files + +Configuration commands: +$config_commands + +Report bugs to the package provider." + +_ACEOF +ac_cs_config=`printf "%s\n" "$ac_configure_args" | sed "$ac_safe_unquote"` +ac_cs_config_escaped=`printf "%s\n" "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\''/g"` +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_cs_config='$ac_cs_config_escaped' +ac_cs_version="\\ +PortAudioCpp config.status 12 +configured by $0, generated by GNU Autoconf 2.71, + with options \\"\$ac_cs_config\\" + +Copyright (C) 2021 Free Software Foundation, Inc. +This config.status script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it." + +ac_pwd='$ac_pwd' +srcdir='$srcdir' +INSTALL='$INSTALL' +MKDIR_P='$MKDIR_P' +AWK='$AWK' +test -n "\$AWK" || AWK=awk +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# The default lists apply if the user does not specify any file. +ac_need_defaults=: +while test $# != 0 +do + case $1 in + --*=?*) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` + ac_shift=: + ;; + --*=) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg= + ac_shift=: + ;; + *) + ac_option=$1 + ac_optarg=$2 + ac_shift=shift + ;; + esac + + case $ac_option in + # Handling of the options. + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + ac_cs_recheck=: ;; + --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) + printf "%s\n" "$ac_cs_version"; exit ;; + --config | --confi | --conf | --con | --co | --c ) + printf "%s\n" "$ac_cs_config"; exit ;; + --debug | --debu | --deb | --de | --d | -d ) + debug=: ;; + --file | --fil | --fi | --f ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`printf "%s\n" "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + '') as_fn_error $? "missing file argument" ;; + esac + as_fn_append CONFIG_FILES " '$ac_optarg'" + ac_need_defaults=false;; + --he | --h | --help | --hel | -h ) + printf "%s\n" "$ac_cs_usage"; exit ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil | --si | --s) + ac_cs_silent=: ;; + + # This is an error. + -*) as_fn_error $? "unrecognized option: \`$1' +Try \`$0 --help' for more information." ;; + + *) as_fn_append ac_config_targets " $1" + ac_need_defaults=false ;; + + esac + shift +done + +ac_configure_extra_args= + +if $ac_cs_silent; then + exec 6>/dev/null + ac_configure_extra_args="$ac_configure_extra_args --silent" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +if \$ac_cs_recheck; then + set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion + shift + \printf "%s\n" "running CONFIG_SHELL=$SHELL \$*" >&6 + CONFIG_SHELL='$SHELL' + export CONFIG_SHELL + exec "\$@" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +exec 5>>config.log +{ + echo + sed 'h;s/./-/g;s/^.../@%:@@%:@ /;s/...$/ @%:@@%:@/;p;x;p;x' <<_ASBOX +@%:@@%:@ Running $as_me. @%:@@%:@ +_ASBOX + printf "%s\n" "$ac_log" +} >&5 + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# +# INIT-COMMANDS +# +AMDEP_TRUE="$AMDEP_TRUE" MAKE="${MAKE-make}" + + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +sed_quote_subst='$sed_quote_subst' +double_quote_subst='$double_quote_subst' +delay_variable_subst='$delay_variable_subst' +AS='`$ECHO "$AS" | $SED "$delay_single_quote_subst"`' +DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`' +OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`' +macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`' +macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`' +enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`' +enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`' +pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`' +enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`' +shared_archive_member_spec='`$ECHO "$shared_archive_member_spec" | $SED "$delay_single_quote_subst"`' +SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`' +ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`' +PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`' +host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`' +host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`' +host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`' +build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`' +build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`' +build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`' +SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`' +Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`' +GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`' +EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`' +FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`' +LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`' +NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`' +LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`' +max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`' +ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`' +exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`' +lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`' +lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`' +lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`' +lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`' +lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`' +reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`' +reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`' +deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`' +file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`' +file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`' +want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`' +sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`' +AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`' +AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`' +archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`' +STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`' +RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`' +old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`' +old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`' +old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`' +lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`' +CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`' +CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`' +compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`' +GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_import='`$ECHO "$lt_cv_sys_global_symbol_to_import" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`' +lt_cv_nm_interface='`$ECHO "$lt_cv_nm_interface" | $SED "$delay_single_quote_subst"`' +nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`' +lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`' +lt_cv_truncate_bin='`$ECHO "$lt_cv_truncate_bin" | $SED "$delay_single_quote_subst"`' +objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`' +MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`' +lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`' +need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`' +MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`' +DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`' +NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`' +LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`' +OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`' +OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`' +libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`' +shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`' +extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`' +archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`' +enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`' +export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`' +whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`' +compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`' +old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`' +old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`' +archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`' +archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`' +module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`' +module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`' +with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`' +allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`' +no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`' +hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`' +hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`' +hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`' +hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`' +hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`' +hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`' +hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`' +inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`' +link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`' +always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`' +export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`' +exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`' +include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`' +prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`' +postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`' +file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`' +variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`' +need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`' +need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`' +version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`' +runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`' +shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`' +shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`' +libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`' +library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`' +soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`' +install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`' +postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`' +postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`' +finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`' +finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`' +hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`' +sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`' +configure_time_dlsearch_path='`$ECHO "$configure_time_dlsearch_path" | $SED "$delay_single_quote_subst"`' +configure_time_lt_sys_library_path='`$ECHO "$configure_time_lt_sys_library_path" | $SED "$delay_single_quote_subst"`' +hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`' +enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`' +enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`' +enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`' +old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`' +striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`' +compiler_lib_search_dirs='`$ECHO "$compiler_lib_search_dirs" | $SED "$delay_single_quote_subst"`' +predep_objects='`$ECHO "$predep_objects" | $SED "$delay_single_quote_subst"`' +postdep_objects='`$ECHO "$postdep_objects" | $SED "$delay_single_quote_subst"`' +predeps='`$ECHO "$predeps" | $SED "$delay_single_quote_subst"`' +postdeps='`$ECHO "$postdeps" | $SED "$delay_single_quote_subst"`' +compiler_lib_search_path='`$ECHO "$compiler_lib_search_path" | $SED "$delay_single_quote_subst"`' +LD_CXX='`$ECHO "$LD_CXX" | $SED "$delay_single_quote_subst"`' +reload_flag_CXX='`$ECHO "$reload_flag_CXX" | $SED "$delay_single_quote_subst"`' +reload_cmds_CXX='`$ECHO "$reload_cmds_CXX" | $SED "$delay_single_quote_subst"`' +old_archive_cmds_CXX='`$ECHO "$old_archive_cmds_CXX" | $SED "$delay_single_quote_subst"`' +compiler_CXX='`$ECHO "$compiler_CXX" | $SED "$delay_single_quote_subst"`' +GCC_CXX='`$ECHO "$GCC_CXX" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_no_builtin_flag_CXX='`$ECHO "$lt_prog_compiler_no_builtin_flag_CXX" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_pic_CXX='`$ECHO "$lt_prog_compiler_pic_CXX" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_wl_CXX='`$ECHO "$lt_prog_compiler_wl_CXX" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_static_CXX='`$ECHO "$lt_prog_compiler_static_CXX" | $SED "$delay_single_quote_subst"`' +lt_cv_prog_compiler_c_o_CXX='`$ECHO "$lt_cv_prog_compiler_c_o_CXX" | $SED "$delay_single_quote_subst"`' +archive_cmds_need_lc_CXX='`$ECHO "$archive_cmds_need_lc_CXX" | $SED "$delay_single_quote_subst"`' +enable_shared_with_static_runtimes_CXX='`$ECHO "$enable_shared_with_static_runtimes_CXX" | $SED "$delay_single_quote_subst"`' +export_dynamic_flag_spec_CXX='`$ECHO "$export_dynamic_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' +whole_archive_flag_spec_CXX='`$ECHO "$whole_archive_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' +compiler_needs_object_CXX='`$ECHO "$compiler_needs_object_CXX" | $SED "$delay_single_quote_subst"`' +old_archive_from_new_cmds_CXX='`$ECHO "$old_archive_from_new_cmds_CXX" | $SED "$delay_single_quote_subst"`' +old_archive_from_expsyms_cmds_CXX='`$ECHO "$old_archive_from_expsyms_cmds_CXX" | $SED "$delay_single_quote_subst"`' +archive_cmds_CXX='`$ECHO "$archive_cmds_CXX" | $SED "$delay_single_quote_subst"`' +archive_expsym_cmds_CXX='`$ECHO "$archive_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`' +module_cmds_CXX='`$ECHO "$module_cmds_CXX" | $SED "$delay_single_quote_subst"`' +module_expsym_cmds_CXX='`$ECHO "$module_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`' +with_gnu_ld_CXX='`$ECHO "$with_gnu_ld_CXX" | $SED "$delay_single_quote_subst"`' +allow_undefined_flag_CXX='`$ECHO "$allow_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`' +no_undefined_flag_CXX='`$ECHO "$no_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_libdir_flag_spec_CXX='`$ECHO "$hardcode_libdir_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_libdir_separator_CXX='`$ECHO "$hardcode_libdir_separator_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_direct_CXX='`$ECHO "$hardcode_direct_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_direct_absolute_CXX='`$ECHO "$hardcode_direct_absolute_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_minus_L_CXX='`$ECHO "$hardcode_minus_L_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_shlibpath_var_CXX='`$ECHO "$hardcode_shlibpath_var_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_automatic_CXX='`$ECHO "$hardcode_automatic_CXX" | $SED "$delay_single_quote_subst"`' +inherit_rpath_CXX='`$ECHO "$inherit_rpath_CXX" | $SED "$delay_single_quote_subst"`' +link_all_deplibs_CXX='`$ECHO "$link_all_deplibs_CXX" | $SED "$delay_single_quote_subst"`' +always_export_symbols_CXX='`$ECHO "$always_export_symbols_CXX" | $SED "$delay_single_quote_subst"`' +export_symbols_cmds_CXX='`$ECHO "$export_symbols_cmds_CXX" | $SED "$delay_single_quote_subst"`' +exclude_expsyms_CXX='`$ECHO "$exclude_expsyms_CXX" | $SED "$delay_single_quote_subst"`' +include_expsyms_CXX='`$ECHO "$include_expsyms_CXX" | $SED "$delay_single_quote_subst"`' +prelink_cmds_CXX='`$ECHO "$prelink_cmds_CXX" | $SED "$delay_single_quote_subst"`' +postlink_cmds_CXX='`$ECHO "$postlink_cmds_CXX" | $SED "$delay_single_quote_subst"`' +file_list_spec_CXX='`$ECHO "$file_list_spec_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_action_CXX='`$ECHO "$hardcode_action_CXX" | $SED "$delay_single_quote_subst"`' +compiler_lib_search_dirs_CXX='`$ECHO "$compiler_lib_search_dirs_CXX" | $SED "$delay_single_quote_subst"`' +predep_objects_CXX='`$ECHO "$predep_objects_CXX" | $SED "$delay_single_quote_subst"`' +postdep_objects_CXX='`$ECHO "$postdep_objects_CXX" | $SED "$delay_single_quote_subst"`' +predeps_CXX='`$ECHO "$predeps_CXX" | $SED "$delay_single_quote_subst"`' +postdeps_CXX='`$ECHO "$postdeps_CXX" | $SED "$delay_single_quote_subst"`' +compiler_lib_search_path_CXX='`$ECHO "$compiler_lib_search_path_CXX" | $SED "$delay_single_quote_subst"`' + +LTCC='$LTCC' +LTCFLAGS='$LTCFLAGS' +compiler='$compiler_DEFAULT' + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +\$1 +_LTECHO_EOF' +} + +# Quote evaled strings. +for var in AS \ +DLLTOOL \ +OBJDUMP \ +SHELL \ +ECHO \ +PATH_SEPARATOR \ +SED \ +GREP \ +EGREP \ +FGREP \ +LD \ +NM \ +LN_S \ +lt_SP2NL \ +lt_NL2SP \ +reload_flag \ +deplibs_check_method \ +file_magic_cmd \ +file_magic_glob \ +want_nocaseglob \ +sharedlib_from_linklib_cmd \ +AR \ +AR_FLAGS \ +archiver_list_spec \ +STRIP \ +RANLIB \ +CC \ +CFLAGS \ +compiler \ +lt_cv_sys_global_symbol_pipe \ +lt_cv_sys_global_symbol_to_cdecl \ +lt_cv_sys_global_symbol_to_import \ +lt_cv_sys_global_symbol_to_c_name_address \ +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \ +lt_cv_nm_interface \ +nm_file_list_spec \ +lt_cv_truncate_bin \ +lt_prog_compiler_no_builtin_flag \ +lt_prog_compiler_pic \ +lt_prog_compiler_wl \ +lt_prog_compiler_static \ +lt_cv_prog_compiler_c_o \ +need_locks \ +MANIFEST_TOOL \ +DSYMUTIL \ +NMEDIT \ +LIPO \ +OTOOL \ +OTOOL64 \ +shrext_cmds \ +export_dynamic_flag_spec \ +whole_archive_flag_spec \ +compiler_needs_object \ +with_gnu_ld \ +allow_undefined_flag \ +no_undefined_flag \ +hardcode_libdir_flag_spec \ +hardcode_libdir_separator \ +exclude_expsyms \ +include_expsyms \ +file_list_spec \ +variables_saved_for_relink \ +libname_spec \ +library_names_spec \ +soname_spec \ +install_override_mode \ +finish_eval \ +old_striplib \ +striplib \ +compiler_lib_search_dirs \ +predep_objects \ +postdep_objects \ +predeps \ +postdeps \ +compiler_lib_search_path \ +LD_CXX \ +reload_flag_CXX \ +compiler_CXX \ +lt_prog_compiler_no_builtin_flag_CXX \ +lt_prog_compiler_pic_CXX \ +lt_prog_compiler_wl_CXX \ +lt_prog_compiler_static_CXX \ +lt_cv_prog_compiler_c_o_CXX \ +export_dynamic_flag_spec_CXX \ +whole_archive_flag_spec_CXX \ +compiler_needs_object_CXX \ +with_gnu_ld_CXX \ +allow_undefined_flag_CXX \ +no_undefined_flag_CXX \ +hardcode_libdir_flag_spec_CXX \ +hardcode_libdir_separator_CXX \ +exclude_expsyms_CXX \ +include_expsyms_CXX \ +file_list_spec_CXX \ +compiler_lib_search_dirs_CXX \ +predep_objects_CXX \ +postdep_objects_CXX \ +predeps_CXX \ +postdeps_CXX \ +compiler_lib_search_path_CXX; do + case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in + *[\\\\\\\`\\"\\\$]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +# Double-quote double-evaled strings. +for var in reload_cmds \ +old_postinstall_cmds \ +old_postuninstall_cmds \ +old_archive_cmds \ +extract_expsyms_cmds \ +old_archive_from_new_cmds \ +old_archive_from_expsyms_cmds \ +archive_cmds \ +archive_expsym_cmds \ +module_cmds \ +module_expsym_cmds \ +export_symbols_cmds \ +prelink_cmds \ +postlink_cmds \ +postinstall_cmds \ +postuninstall_cmds \ +finish_cmds \ +sys_lib_search_path_spec \ +configure_time_dlsearch_path \ +configure_time_lt_sys_library_path \ +reload_cmds_CXX \ +old_archive_cmds_CXX \ +old_archive_from_new_cmds_CXX \ +old_archive_from_expsyms_cmds_CXX \ +archive_cmds_CXX \ +archive_expsym_cmds_CXX \ +module_cmds_CXX \ +module_expsym_cmds_CXX \ +export_symbols_cmds_CXX \ +prelink_cmds_CXX \ +postlink_cmds_CXX; do + case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in + *[\\\\\\\`\\"\\\$]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +ac_aux_dir='$ac_aux_dir' + +# See if we are running on zsh, and set the options that allow our +# commands through without removal of \ escapes INIT. +if test -n "\${ZSH_VERSION+set}"; then + setopt NO_GLOB_SUBST +fi + + + PACKAGE='$PACKAGE' + VERSION='$VERSION' + RM='$RM' + ofile='$ofile' + + + + + + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + +# Handling of arguments. +for ac_config_target in $ac_config_targets +do + case $ac_config_target in + "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; + "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;; + "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; + "lib/Makefile") CONFIG_FILES="$CONFIG_FILES lib/Makefile" ;; + "include/Makefile") CONFIG_FILES="$CONFIG_FILES include/Makefile" ;; + "bin/Makefile") CONFIG_FILES="$CONFIG_FILES bin/Makefile" ;; + "doc/Makefile") CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;; + "portaudiocpp.pc") CONFIG_FILES="$CONFIG_FILES portaudiocpp.pc" ;; + + *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; + esac +done + + +# If the user did not use the arguments to specify the items to instantiate, +# then the envvar interface is used. Set only those that are not. +# We use the long form for the default assignment because of an extremely +# bizarre bug on SunOS 4.1.3. +if $ac_need_defaults; then + test ${CONFIG_FILES+y} || CONFIG_FILES=$config_files + test ${CONFIG_COMMANDS+y} || CONFIG_COMMANDS=$config_commands +fi + +# Have a temporary directory for convenience. Make it in the build tree +# simply because there is no reason against having it here, and in addition, +# creating and moving files from /tmp can sometimes cause problems. +# Hook for its removal unless debugging. +# Note that there is a small window in which the directory will not be cleaned: +# after its creation but before its name has been assigned to `$tmp'. +$debug || +{ + tmp= ac_tmp= + trap 'exit_status=$? + : "${ac_tmp:=$tmp}" + { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status +' 0 + trap 'as_fn_exit 1' 1 2 13 15 +} +# Create a (secure) tmp directory for tmp files. + +{ + tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && + test -d "$tmp" +} || +{ + tmp=./conf$$-$RANDOM + (umask 077 && mkdir "$tmp") +} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 +ac_tmp=$tmp + +# Set up the scripts for CONFIG_FILES section. +# No need to generate them if there are no CONFIG_FILES. +# This happens for instance with `./config.status config.h'. +if test -n "$CONFIG_FILES"; then + + +ac_cr=`echo X | tr X '\015'` +# On cygwin, bash can eat \r inside `` if the user requested igncr. +# But we know of no other shell where ac_cr would be empty at this +# point, so we can use a bashism as a fallback. +if test "x$ac_cr" = x; then + eval ac_cr=\$\'\\r\' +fi +ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` +if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then + ac_cs_awk_cr='\\r' +else + ac_cs_awk_cr=$ac_cr +fi + +echo 'BEGIN {' >"$ac_tmp/subs1.awk" && +_ACEOF + + +{ + echo "cat >conf$$subs.awk <<_ACEOF" && + echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && + echo "_ACEOF" +} >conf$$subs.sh || + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 +ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` +ac_delim='%!_!# ' +for ac_last_try in false false false false false :; do + . ./conf$$subs.sh || + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + + ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` + if test $ac_delim_n = $ac_delim_num; then + break + elif $ac_last_try; then + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done +rm -f conf$$subs.sh + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && +_ACEOF +sed -n ' +h +s/^/S["/; s/!.*/"]=/ +p +g +s/^[^!]*!// +:repl +t repl +s/'"$ac_delim"'$// +t delim +:nl +h +s/\(.\{148\}\)..*/\1/ +t more1 +s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ +p +n +b repl +:more1 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t nl +:delim +h +s/\(.\{148\}\)..*/\1/ +t more2 +s/["\\]/\\&/g; s/^/"/; s/$/"/ +p +b +:more2 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t delim +' >$CONFIG_STATUS || ac_write_fail=1 +rm -f conf$$subs.awk +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +_ACAWK +cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && + for (key in S) S_is_set[key] = 1 + FS = "" + +} +{ + line = $ 0 + nfields = split(line, field, "@") + substed = 0 + len = length(field[1]) + for (i = 2; i < nfields; i++) { + key = field[i] + keylen = length(key) + if (S_is_set[key]) { + value = S[key] + line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) + len += length(value) + length(field[++i]) + substed = 1 + } else + len += 1 + keylen + } + + print line +} + +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then + sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" +else + cat +fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ + || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 +_ACEOF + +# VPATH may cause trouble with some makes, so we remove sole $(srcdir), +# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and +# trailing colons and then remove the whole line if VPATH becomes empty +# (actually we leave an empty line to preserve line numbers). +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ +h +s/// +s/^/:/ +s/[ ]*$/:/ +s/:\$(srcdir):/:/g +s/:\${srcdir}:/:/g +s/:@srcdir@:/:/g +s/^:*// +s/:*$// +x +s/\(=[ ]*\).*/\1/ +G +s/\n// +s/^[^=]*=[ ]*$// +}' +fi + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +fi # test -n "$CONFIG_FILES" + + +eval set X " :F $CONFIG_FILES :C $CONFIG_COMMANDS" +shift +for ac_tag +do + case $ac_tag in + :[FHLC]) ac_mode=$ac_tag; continue;; + esac + case $ac_mode$ac_tag in + :[FHL]*:*);; + :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; + :[FH]-) ac_tag=-:-;; + :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; + esac + ac_save_IFS=$IFS + IFS=: + set x $ac_tag + IFS=$ac_save_IFS + shift + ac_file=$1 + shift + + case $ac_mode in + :L) ac_source=$1;; + :[FH]) + ac_file_inputs= + for ac_f + do + case $ac_f in + -) ac_f="$ac_tmp/stdin";; + *) # Look for the file first in the build tree, then in the source tree + # (if the path is not absolute). The absolute path cannot be DOS-style, + # because $ac_f cannot contain `:'. + test -f "$ac_f" || + case $ac_f in + [\\/$]*) false;; + *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; + esac || + as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; + esac + case $ac_f in *\'*) ac_f=`printf "%s\n" "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac + as_fn_append ac_file_inputs " '$ac_f'" + done + + # Let's still pretend it is `configure' which instantiates (i.e., don't + # use $as_me), people would be surprised to read: + # /* config.h. Generated by config.status. */ + configure_input='Generated from '` + printf "%s\n" "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' + `' by configure.' + if test x"$ac_file" != x-; then + configure_input="$ac_file. $configure_input" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 +printf "%s\n" "$as_me: creating $ac_file" >&6;} + fi + # Neutralize special characters interpreted by sed in replacement strings. + case $configure_input in #( + *\&* | *\|* | *\\* ) + ac_sed_conf_input=`printf "%s\n" "$configure_input" | + sed 's/[\\\\&|]/\\\\&/g'`;; #( + *) ac_sed_conf_input=$configure_input;; + esac + + case $ac_tag in + *:-:* | *:-) cat >"$ac_tmp/stdin" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; + esac + ;; + esac + + ac_dir=`$as_dirname -- "$ac_file" || +$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || +printf "%s\n" X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + as_dir="$ac_dir"; as_fn_mkdir_p + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + + case $ac_mode in + :F) + # + # CONFIG_FILE + # + + case $INSTALL in + [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; + *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; + esac + ac_MKDIR_P=$MKDIR_P + case $MKDIR_P in + [\\/$]* | ?:[\\/]* ) ;; + */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; + esac +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# If the template does not know about datarootdir, expand it. +# FIXME: This hack should be removed a few years after 2.60. +ac_datarootdir_hack=; ac_datarootdir_seen= +ac_sed_dataroot=' +/datarootdir/ { + p + q +} +/@datadir@/p +/@docdir@/p +/@infodir@/p +/@localedir@/p +/@mandir@/p' +case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in +*datarootdir*) ac_datarootdir_seen=yes;; +*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 +printf "%s\n" "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + ac_datarootdir_hack=' + s&@datadir@&$datadir&g + s&@docdir@&$docdir&g + s&@infodir@&$infodir&g + s&@localedir@&$localedir&g + s&@mandir@&$mandir&g + s&\\\${datarootdir}&$datarootdir&g' ;; +esac +_ACEOF + +# Neutralize VPATH when `$srcdir' = `.'. +# Shell code in configure.ac might set extrasub. +# FIXME: do we really want to maintain this feature? +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_sed_extra="$ac_vpsub +$extrasub +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +:t +/@[a-zA-Z_][a-zA-Z_0-9]*@/!b +s|@configure_input@|$ac_sed_conf_input|;t t +s&@top_builddir@&$ac_top_builddir_sub&;t t +s&@top_build_prefix@&$ac_top_build_prefix&;t t +s&@srcdir@&$ac_srcdir&;t t +s&@abs_srcdir@&$ac_abs_srcdir&;t t +s&@top_srcdir@&$ac_top_srcdir&;t t +s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t +s&@builddir@&$ac_builddir&;t t +s&@abs_builddir@&$ac_abs_builddir&;t t +s&@abs_top_builddir@&$ac_abs_top_builddir&;t t +s&@INSTALL@&$ac_INSTALL&;t t +s&@MKDIR_P@&$ac_MKDIR_P&;t t +$ac_datarootdir_hack +" +eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ + >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + +test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && + { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && + { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ + "$ac_tmp/out"`; test -z "$ac_out"; } && + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&5 +printf "%s\n" "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&2;} + + rm -f "$ac_tmp/stdin" + case $ac_file in + -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; + *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; + esac \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + ;; + + + :C) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 +printf "%s\n" "$as_me: executing $ac_file commands" >&6;} + ;; + esac + + + case $ac_file$ac_mode in + "depfiles":C) test x"$AMDEP_TRUE" != x"" || { + # Older Autoconf quotes --file arguments for eval, but not when files + # are listed without --file. Let's play safe and only enable the eval + # if we detect the quoting. + # TODO: see whether this extra hack can be removed once we start + # requiring Autoconf 2.70 or later. + case $CONFIG_FILES in @%:@( + *\'*) : + eval set x "$CONFIG_FILES" ;; @%:@( + *) : + set x $CONFIG_FILES ;; @%:@( + *) : + ;; +esac + shift + # Used to flag and report bootstrapping failures. + am_rc=0 + for am_mf + do + # Strip MF so we end up with the name of the file. + am_mf=`printf "%s\n" "$am_mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile which includes + # dependency-tracking related rules and includes. + # Grep'ing the whole file directly is not great: AIX grep has a line + # limit of 2048, but all sed's we know have understand at least 4000. + sed -n 's,^am--depfiles:.*,X,p' "$am_mf" | grep X >/dev/null 2>&1 \ + || continue + am_dirpart=`$as_dirname -- "$am_mf" || +$as_expr X"$am_mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$am_mf" : 'X\(//\)[^/]' \| \ + X"$am_mf" : 'X\(//\)$' \| \ + X"$am_mf" : 'X\(/\)' \| . 2>/dev/null || +printf "%s\n" X"$am_mf" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + am_filepart=`$as_basename -- "$am_mf" || +$as_expr X/"$am_mf" : '.*/\([^/][^/]*\)/*$' \| \ + X"$am_mf" : 'X\(//\)$' \| \ + X"$am_mf" : 'X\(/\)' \| . 2>/dev/null || +printf "%s\n" X/"$am_mf" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + { echo "$as_me:$LINENO: cd "$am_dirpart" \ + && sed -e '/# am--include-marker/d' "$am_filepart" \ + | $MAKE -f - am--depfiles" >&5 + (cd "$am_dirpart" \ + && sed -e '/# am--include-marker/d' "$am_filepart" \ + | $MAKE -f - am--depfiles) >&5 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } || am_rc=$? + done + if test $am_rc -ne 0; then + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "Something went wrong bootstrapping makefile fragments + for automatic dependency tracking. If GNU make was not used, consider + re-running the configure script with MAKE=\"gmake\" (or whatever is + necessary). You can also try re-running configure with the + '--disable-dependency-tracking' option to at least be able to build + the package (albeit without support for automatic dependency tracking). +See \`config.log' for more details" "$LINENO" 5; } + fi + { am_dirpart=; unset am_dirpart;} + { am_filepart=; unset am_filepart;} + { am_mf=; unset am_mf;} + { am_rc=; unset am_rc;} + rm -f conftest-deps.mk +} + ;; + "libtool":C) + + # See if we are running on zsh, and set the options that allow our + # commands through without removal of \ escapes. + if test -n "${ZSH_VERSION+set}"; then + setopt NO_GLOB_SUBST + fi + + cfgfile=${ofile}T + trap "$RM \"$cfgfile\"; exit 1" 1 2 15 + $RM "$cfgfile" + + cat <<_LT_EOF >> "$cfgfile" +#! $SHELL +# Generated automatically by $as_me ($PACKAGE) $VERSION +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: +# NOTE: Changes made to this file will be lost: look at ltmain.sh. + +# Provide generalized library-building support services. +# Written by Gordon Matzigkeit, 1996 + +# Copyright (C) 2014 Free Software Foundation, Inc. +# This is free software; see the source for copying conditions. There is NO +# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +# GNU Libtool is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of of the License, or +# (at your option) any later version. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program or library that is built +# using GNU Libtool, you may include this file under the same +# distribution terms that you use for the rest of that program. +# +# GNU Libtool is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + + +# The names of the tagged configurations supported by this script. +available_tags='CXX ' + +# Configured defaults for sys_lib_dlsearch_path munging. +: \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"} + +# ### BEGIN LIBTOOL CONFIG + +# Assembler program. +AS=$lt_AS + +# DLL creation program. +DLLTOOL=$lt_DLLTOOL + +# Object dumper program. +OBJDUMP=$lt_OBJDUMP + +# Which release of libtool.m4 was used? +macro_version=$macro_version +macro_revision=$macro_revision + +# Whether or not to build shared libraries. +build_libtool_libs=$enable_shared + +# Whether or not to build static libraries. +build_old_libs=$enable_static + +# What type of objects to build. +pic_mode=$pic_mode + +# Whether or not to optimize for fast installation. +fast_install=$enable_fast_install + +# Shared archive member basename,for filename based shared library versioning on AIX. +shared_archive_member_spec=$shared_archive_member_spec + +# Shell to use when invoking shell scripts. +SHELL=$lt_SHELL + +# An echo program that protects backslashes. +ECHO=$lt_ECHO + +# The PATH separator for the build system. +PATH_SEPARATOR=$lt_PATH_SEPARATOR + +# The host system. +host_alias=$host_alias +host=$host +host_os=$host_os + +# The build system. +build_alias=$build_alias +build=$build +build_os=$build_os + +# A sed program that does not truncate output. +SED=$lt_SED + +# Sed that helps us avoid accidentally triggering echo(1) options like -n. +Xsed="\$SED -e 1s/^X//" + +# A grep program that handles long lines. +GREP=$lt_GREP + +# An ERE matcher. +EGREP=$lt_EGREP + +# A literal string matcher. +FGREP=$lt_FGREP + +# A BSD- or MS-compatible name lister. +NM=$lt_NM + +# Whether we need soft or hard links. +LN_S=$lt_LN_S + +# What is the maximum length of a command? +max_cmd_len=$max_cmd_len + +# Object file suffix (normally "o"). +objext=$ac_objext + +# Executable file suffix (normally ""). +exeext=$exeext + +# whether the shell understands "unset". +lt_unset=$lt_unset + +# turn spaces into newlines. +SP2NL=$lt_lt_SP2NL + +# turn newlines into spaces. +NL2SP=$lt_lt_NL2SP + +# convert \$build file names to \$host format. +to_host_file_cmd=$lt_cv_to_host_file_cmd + +# convert \$build files to toolchain format. +to_tool_file_cmd=$lt_cv_to_tool_file_cmd + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method=$lt_deplibs_check_method + +# Command to use when deplibs_check_method = "file_magic". +file_magic_cmd=$lt_file_magic_cmd + +# How to find potential files when deplibs_check_method = "file_magic". +file_magic_glob=$lt_file_magic_glob + +# Find potential files using nocaseglob when deplibs_check_method = "file_magic". +want_nocaseglob=$lt_want_nocaseglob + +# Command to associate shared and link libraries. +sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd + +# The archiver. +AR=$lt_AR + +# Flags to create an archive. +AR_FLAGS=$lt_AR_FLAGS + +# How to feed a file listing to the archiver. +archiver_list_spec=$lt_archiver_list_spec + +# A symbol stripping program. +STRIP=$lt_STRIP + +# Commands used to install an old-style archive. +RANLIB=$lt_RANLIB +old_postinstall_cmds=$lt_old_postinstall_cmds +old_postuninstall_cmds=$lt_old_postuninstall_cmds + +# Whether to use a lock for old archive extraction. +lock_old_archive_extraction=$lock_old_archive_extraction + +# A C compiler. +LTCC=$lt_CC + +# LTCC compiler flags. +LTCFLAGS=$lt_CFLAGS + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe + +# Transform the output of nm in a proper C declaration. +global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl + +# Transform the output of nm into a list of symbols to manually relocate. +global_symbol_to_import=$lt_lt_cv_sys_global_symbol_to_import + +# Transform the output of nm in a C name address pair. +global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address + +# Transform the output of nm in a C name address pair when lib prefix is needed. +global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix + +# The name lister interface. +nm_interface=$lt_lt_cv_nm_interface + +# Specify filename containing input files for \$NM. +nm_file_list_spec=$lt_nm_file_list_spec + +# The root where to search for dependent libraries,and where our libraries should be installed. +lt_sysroot=$lt_sysroot + +# Command to truncate a binary pipe. +lt_truncate_bin=$lt_lt_cv_truncate_bin + +# The name of the directory that contains temporary libtool files. +objdir=$objdir + +# Used to examine libraries when file_magic_cmd begins with "file". +MAGIC_CMD=$MAGIC_CMD + +# Must we lock files when doing compilation? +need_locks=$lt_need_locks + +# Manifest tool. +MANIFEST_TOOL=$lt_MANIFEST_TOOL + +# Tool to manipulate archived DWARF debug symbol files on Mac OS X. +DSYMUTIL=$lt_DSYMUTIL + +# Tool to change global to local symbols on Mac OS X. +NMEDIT=$lt_NMEDIT + +# Tool to manipulate fat objects and archives on Mac OS X. +LIPO=$lt_LIPO + +# ldd/readelf like tool for Mach-O binaries on Mac OS X. +OTOOL=$lt_OTOOL + +# ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4. +OTOOL64=$lt_OTOOL64 + +# Old archive suffix (normally "a"). +libext=$libext + +# Shared library suffix (normally ".so"). +shrext_cmds=$lt_shrext_cmds + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds=$lt_extract_expsyms_cmds + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at link time. +variables_saved_for_relink=$lt_variables_saved_for_relink + +# Do we need the "lib" prefix for modules? +need_lib_prefix=$need_lib_prefix + +# Do we need a version for libraries? +need_version=$need_version + +# Library versioning type. +version_type=$version_type + +# Shared library runtime path variable. +runpath_var=$runpath_var + +# Shared library path variable. +shlibpath_var=$shlibpath_var + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=$shlibpath_overrides_runpath + +# Format of library name prefix. +libname_spec=$lt_libname_spec + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME +library_names_spec=$lt_library_names_spec + +# The coded name of the library, if different from the real name. +soname_spec=$lt_soname_spec + +# Permission mode override for installation of shared libraries. +install_override_mode=$lt_install_override_mode + +# Command to use after installation of a shared archive. +postinstall_cmds=$lt_postinstall_cmds + +# Command to use after uninstallation of a shared archive. +postuninstall_cmds=$lt_postuninstall_cmds + +# Commands used to finish a libtool library installation in a directory. +finish_cmds=$lt_finish_cmds + +# As "finish_cmds", except a single script fragment to be evaled but +# not shown. +finish_eval=$lt_finish_eval + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=$hardcode_into_libs + +# Compile-time system search path for libraries. +sys_lib_search_path_spec=$lt_sys_lib_search_path_spec + +# Detected run-time system search path for libraries. +sys_lib_dlsearch_path_spec=$lt_configure_time_dlsearch_path + +# Explicit LT_SYS_LIBRARY_PATH set during ./configure time. +configure_time_lt_sys_library_path=$lt_configure_time_lt_sys_library_path + +# Whether dlopen is supported. +dlopen_support=$enable_dlopen + +# Whether dlopen of programs is supported. +dlopen_self=$enable_dlopen_self + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=$enable_dlopen_self_static + +# Commands to strip libraries. +old_striplib=$lt_old_striplib +striplib=$lt_striplib + + +# The linker used to build libraries. +LD=$lt_LD + +# How to create reloadable object files. +reload_flag=$lt_reload_flag +reload_cmds=$lt_reload_cmds + +# Commands used to build an old-style archive. +old_archive_cmds=$lt_old_archive_cmds + +# A language specific compiler. +CC=$lt_compiler + +# Is the compiler the GNU compiler? +with_gcc=$GCC + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_lt_prog_compiler_static + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_lt_cv_prog_compiler_c_o + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$archive_cmds_need_lc + +# Whether or not to disallow shared libs when runtime libs are static. +allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec + +# Whether the compiler copes with passing no objects directly. +compiler_needs_object=$lt_compiler_needs_object + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds + +# Commands used to build a shared archive. +archive_cmds=$lt_archive_cmds +archive_expsym_cmds=$lt_archive_expsym_cmds + +# Commands used to build a loadable module if different from building +# a shared archive. +module_cmds=$lt_module_cmds +module_expsym_cmds=$lt_module_expsym_cmds + +# Whether we are building with GNU ld or not. +with_gnu_ld=$lt_with_gnu_ld + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag + +# Flag that enforces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist +hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec + +# Whether we need a single "-rpath" flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator + +# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes +# DIR into the resulting binary. +hardcode_direct=$hardcode_direct + +# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes +# DIR into the resulting binary and the resulting library dependency is +# "absolute",i.e impossible to change by setting \$shlibpath_var if the +# library is relocated. +hardcode_direct_absolute=$hardcode_direct_absolute + +# Set to "yes" if using the -LDIR flag during linking hardcodes DIR +# into the resulting binary. +hardcode_minus_L=$hardcode_minus_L + +# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR +# into the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var + +# Set to "yes" if building a shared library automatically hardcodes DIR +# into the library and all subsequent libraries and executables linked +# against it. +hardcode_automatic=$hardcode_automatic + +# Set to yes if linker adds runtime paths of dependent libraries +# to runtime path list. +inherit_rpath=$inherit_rpath + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs + +# Set to "yes" if exported symbols are required. +always_export_symbols=$always_export_symbols + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_exclude_expsyms + +# Symbols that must always be exported. +include_expsyms=$lt_include_expsyms + +# Commands necessary for linking programs (against libraries) with templates. +prelink_cmds=$lt_prelink_cmds + +# Commands necessary for finishing linking programs. +postlink_cmds=$lt_postlink_cmds + +# Specify filename containing input files. +file_list_spec=$lt_file_list_spec + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action + +# The directories searched by this compiler when creating a shared library. +compiler_lib_search_dirs=$lt_compiler_lib_search_dirs + +# Dependencies to place before and after the objects being linked to +# create a shared library. +predep_objects=$lt_predep_objects +postdep_objects=$lt_postdep_objects +predeps=$lt_predeps +postdeps=$lt_postdeps + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_compiler_lib_search_path + +# ### END LIBTOOL CONFIG + +_LT_EOF + + cat <<'_LT_EOF' >> "$cfgfile" + +# ### BEGIN FUNCTIONS SHARED WITH CONFIGURE + +# func_munge_path_list VARIABLE PATH +# ----------------------------------- +# VARIABLE is name of variable containing _space_ separated list of +# directories to be munged by the contents of PATH, which is string +# having a format: +# "DIR[:DIR]:" +# string "DIR[ DIR]" will be prepended to VARIABLE +# ":DIR[:DIR]" +# string "DIR[ DIR]" will be appended to VARIABLE +# "DIRP[:DIRP]::[DIRA:]DIRA" +# string "DIRP[ DIRP]" will be prepended to VARIABLE and string +# "DIRA[ DIRA]" will be appended to VARIABLE +# "DIR[:DIR]" +# VARIABLE will be replaced by "DIR[ DIR]" +func_munge_path_list () +{ + case x@S|@2 in + x) + ;; + *:) + eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'` \@S|@@S|@1\" + ;; + x:*) + eval @S|@1=\"\@S|@@S|@1 `$ECHO @S|@2 | $SED 's/:/ /g'`\" + ;; + *::*) + eval @S|@1=\"\@S|@@S|@1\ `$ECHO @S|@2 | $SED -e 's/.*:://' -e 's/:/ /g'`\" + eval @S|@1=\"`$ECHO @S|@2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \@S|@@S|@1\" + ;; + *) + eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'`\" + ;; + esac +} + + +# Calculate cc_basename. Skip known compiler wrappers and cross-prefix. +func_cc_basename () +{ + for cc_temp in @S|@*""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac + done + func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` +} + + +# ### END FUNCTIONS SHARED WITH CONFIGURE + +_LT_EOF + + case $host_os in + aix3*) + cat <<\_LT_EOF >> "$cfgfile" +# AIX sometimes has problems with the GCC collect2 program. For some +# reason, if we set the COLLECT_NAMES environment variable, the problems +# vanish in a puff of smoke. +if test set != "${COLLECT_NAMES+set}"; then + COLLECT_NAMES= + export COLLECT_NAMES +fi +_LT_EOF + ;; + esac + + + +ltmain=$ac_aux_dir/ltmain.sh + + + # We use sed instead of cat because bash on DJGPP gets confused if + # if finds mixed CR/LF and LF-only lines. Since sed operates in + # text mode, it properly converts lines to CR/LF. This bash problem + # is reportedly fixed, but why not run on old versions too? + sed '$q' "$ltmain" >> "$cfgfile" \ + || (rm -f "$cfgfile"; exit 1) + + mv -f "$cfgfile" "$ofile" || + (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") + chmod +x "$ofile" + + + cat <<_LT_EOF >> "$ofile" + +# ### BEGIN LIBTOOL TAG CONFIG: CXX + +# The linker used to build libraries. +LD=$lt_LD_CXX + +# How to create reloadable object files. +reload_flag=$lt_reload_flag_CXX +reload_cmds=$lt_reload_cmds_CXX + +# Commands used to build an old-style archive. +old_archive_cmds=$lt_old_archive_cmds_CXX + +# A language specific compiler. +CC=$lt_compiler_CXX + +# Is the compiler the GNU compiler? +with_gcc=$GCC_CXX + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic_CXX + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl_CXX + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_lt_prog_compiler_static_CXX + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$archive_cmds_need_lc_CXX + +# Whether or not to disallow shared libs when runtime libs are static. +allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX + +# Whether the compiler copes with passing no objects directly. +compiler_needs_object=$lt_compiler_needs_object_CXX + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX + +# Commands used to build a shared archive. +archive_cmds=$lt_archive_cmds_CXX +archive_expsym_cmds=$lt_archive_expsym_cmds_CXX + +# Commands used to build a loadable module if different from building +# a shared archive. +module_cmds=$lt_module_cmds_CXX +module_expsym_cmds=$lt_module_expsym_cmds_CXX + +# Whether we are building with GNU ld or not. +with_gnu_ld=$lt_with_gnu_ld_CXX + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag_CXX + +# Flag that enforces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag_CXX + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist +hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX + +# Whether we need a single "-rpath" flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX + +# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes +# DIR into the resulting binary. +hardcode_direct=$hardcode_direct_CXX + +# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes +# DIR into the resulting binary and the resulting library dependency is +# "absolute",i.e impossible to change by setting \$shlibpath_var if the +# library is relocated. +hardcode_direct_absolute=$hardcode_direct_absolute_CXX + +# Set to "yes" if using the -LDIR flag during linking hardcodes DIR +# into the resulting binary. +hardcode_minus_L=$hardcode_minus_L_CXX + +# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR +# into the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX + +# Set to "yes" if building a shared library automatically hardcodes DIR +# into the library and all subsequent libraries and executables linked +# against it. +hardcode_automatic=$hardcode_automatic_CXX + +# Set to yes if linker adds runtime paths of dependent libraries +# to runtime path list. +inherit_rpath=$inherit_rpath_CXX + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs_CXX + +# Set to "yes" if exported symbols are required. +always_export_symbols=$always_export_symbols_CXX + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds_CXX + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_exclude_expsyms_CXX + +# Symbols that must always be exported. +include_expsyms=$lt_include_expsyms_CXX + +# Commands necessary for linking programs (against libraries) with templates. +prelink_cmds=$lt_prelink_cmds_CXX + +# Commands necessary for finishing linking programs. +postlink_cmds=$lt_postlink_cmds_CXX + +# Specify filename containing input files. +file_list_spec=$lt_file_list_spec_CXX + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action_CXX + +# The directories searched by this compiler when creating a shared library. +compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_CXX + +# Dependencies to place before and after the objects being linked to +# create a shared library. +predep_objects=$lt_predep_objects_CXX +postdep_objects=$lt_postdep_objects_CXX +predeps=$lt_predeps_CXX +postdeps=$lt_postdeps_CXX + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_compiler_lib_search_path_CXX + +# ### END LIBTOOL TAG CONFIG: CXX +_LT_EOF + + ;; + + esac +done # for ac_tag + + +as_fn_exit 0 +_ACEOF +ac_clean_files=$ac_clean_files_save + +test $ac_write_fail = 0 || + as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 + + +# configure is writing to config.log, and then calls config.status. +# config.status does its own redirection, appending to config.log. +# Unfortunately, on DOS this fails, as config.log is still kept open +# by configure, so config.status won't be able to write to it; its +# output is simply discarded. So we exec the FD to /dev/null, +# effectively closing config.log, so it can be properly (re)opened and +# appended to by config.status. When coming back to configure, we +# need to make the FD available again. +if test "$no_create" != yes; then + ac_cs_success=: + ac_config_status_args= + test "$silent" = yes && + ac_config_status_args="$ac_config_status_args --quiet" + exec 5>/dev/null + $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false + exec 5>>config.log + # Use ||, not &&, to avoid exiting from the if with $? = 1, which + # would make configure fail if this is the last instruction. + $ac_cs_success || as_fn_exit 1 +fi +if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 +printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} +fi + diff --git a/bindings/cpp/autom4te.cache/output.1 b/bindings/cpp/autom4te.cache/output.1 new file mode 100644 index 0000000..dbee9e8 --- /dev/null +++ b/bindings/cpp/autom4te.cache/output.1 @@ -0,0 +1,19375 @@ +@%:@! /bin/sh +@%:@ Guess values for system-dependent variables and create Makefiles. +@%:@ Generated by GNU Autoconf 2.71 for PortAudioCpp 12. +@%:@ +@%:@ +@%:@ Copyright (C) 1992-1996, 1998-2017, 2020-2021 Free Software Foundation, +@%:@ Inc. +@%:@ +@%:@ +@%:@ This configure script is free software; the Free Software Foundation +@%:@ gives unlimited permission to copy, distribute and modify it. +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +as_nop=: +if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 +then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else $as_nop + case `(set -o) 2>/dev/null` in @%:@( + *posix*) : + set -o posix ;; @%:@( + *) : + ;; +esac +fi + + + +# Reset variables that may have inherited troublesome values from +# the environment. + +# IFS needs to be set, to space, tab, and newline, in precisely that order. +# (If _AS_PATH_WALK were called with IFS unset, it would have the +# side effect of setting IFS to empty, thus disabling word splitting.) +# Quoting is to prevent editors from complaining about space-tab. +as_nl=' +' +export as_nl +IFS=" "" $as_nl" + +PS1='$ ' +PS2='> ' +PS4='+ ' + +# Ensure predictable behavior from utilities with locale-dependent output. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# We cannot yet rely on "unset" to work, but we need these variables +# to be unset--not just set to an empty or harmless value--now, to +# avoid bugs in old shells (e.g. pre-3.0 UWIN ksh). This construct +# also avoids known problems related to "unset" and subshell syntax +# in other old shells (e.g. bash 2.01 and pdksh 5.2.14). +for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH +do eval test \${$as_var+y} \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done + +# Ensure that fds 0, 1, and 2 are open. +if (exec 3>&0) 2>/dev/null; then :; else exec 0&1) 2>/dev/null; then :; else exec 1>/dev/null; fi +if (exec 3>&2) ; then :; else exec 2>/dev/null; fi + +# The user is always right. +if ${PATH_SEPARATOR+false} :; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# Find who we are. Look in the path if we contain no directory separator. +as_myself= +case $0 in @%:@(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + test -r "$as_dir$0" && as_myself=$as_dir$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + + +# Use a proper internal environment variable to ensure we don't fall + # into an infinite loop, continuously re-executing ourselves. + if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then + _as_can_reexec=no; export _as_can_reexec; + # We cannot yet assume a decent shell, so we have to provide a +# neutralization value for shells without unset; and this also +# works around shells that cannot unset nonexistent variables. +# Preserve -v and -x to the replacement shell. +BASH_ENV=/dev/null +ENV=/dev/null +(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV +case $- in @%:@ (((( + *v*x* | *x*v* ) as_opts=-vx ;; + *v* ) as_opts=-v ;; + *x* ) as_opts=-x ;; + * ) as_opts= ;; +esac +exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} +# Admittedly, this is quite paranoid, since all the known shells bail +# out after a failed `exec'. +printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2 +exit 255 + fi + # We don't want this to propagate to other subprocesses. + { _as_can_reexec=; unset _as_can_reexec;} +if test "x$CONFIG_SHELL" = x; then + as_bourne_compatible="as_nop=: +if test \${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 +then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which + # is contrary to our usage. Disable this feature. + alias -g '\${1+\"\$@\"}'='\"\$@\"' + setopt NO_GLOB_SUBST +else \$as_nop + case \`(set -o) 2>/dev/null\` in @%:@( + *posix*) : + set -o posix ;; @%:@( + *) : + ;; +esac +fi +" + as_required="as_fn_return () { (exit \$1); } +as_fn_success () { as_fn_return 0; } +as_fn_failure () { as_fn_return 1; } +as_fn_ret_success () { return 0; } +as_fn_ret_failure () { return 1; } + +exitcode=0 +as_fn_success || { exitcode=1; echo as_fn_success failed.; } +as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } +as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } +as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } +if ( set x; as_fn_ret_success y && test x = \"\$1\" ) +then : + +else \$as_nop + exitcode=1; echo positional parameters were not saved. +fi +test x\$exitcode = x0 || exit 1 +blah=\$(echo \$(echo blah)) +test x\"\$blah\" = xblah || exit 1 +test -x / || exit 1" + as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO + as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO + eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && + test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 + + test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || ( + ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' + ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO + ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO + PATH=/empty FPATH=/empty; export PATH FPATH + test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\ + || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1 +test \$(( 1 + 1 )) = 2 || exit 1" + if (eval "$as_required") 2>/dev/null +then : + as_have_required=yes +else $as_nop + as_have_required=no +fi + if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null +then : + +else $as_nop + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +as_found=false +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + as_found=: + case $as_dir in @%:@( + /*) + for as_base in sh bash ksh sh5; do + # Try only shells that exist, to save several forks. + as_shell=$as_dir$as_base + if { test -f "$as_shell" || test -f "$as_shell.exe"; } && + as_run=a "$as_shell" -c "$as_bourne_compatible""$as_required" 2>/dev/null +then : + CONFIG_SHELL=$as_shell as_have_required=yes + if as_run=a "$as_shell" -c "$as_bourne_compatible""$as_suggested" 2>/dev/null +then : + break 2 +fi +fi + done;; + esac + as_found=false +done +IFS=$as_save_IFS +if $as_found +then : + +else $as_nop + if { test -f "$SHELL" || test -f "$SHELL.exe"; } && + as_run=a "$SHELL" -c "$as_bourne_compatible""$as_required" 2>/dev/null +then : + CONFIG_SHELL=$SHELL as_have_required=yes +fi +fi + + + if test "x$CONFIG_SHELL" != x +then : + export CONFIG_SHELL + # We cannot yet assume a decent shell, so we have to provide a +# neutralization value for shells without unset; and this also +# works around shells that cannot unset nonexistent variables. +# Preserve -v and -x to the replacement shell. +BASH_ENV=/dev/null +ENV=/dev/null +(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV +case $- in @%:@ (((( + *v*x* | *x*v* ) as_opts=-vx ;; + *v* ) as_opts=-v ;; + *x* ) as_opts=-x ;; + * ) as_opts= ;; +esac +exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} +# Admittedly, this is quite paranoid, since all the known shells bail +# out after a failed `exec'. +printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2 +exit 255 +fi + + if test x$as_have_required = xno +then : + printf "%s\n" "$0: This script requires a shell more modern than all" + printf "%s\n" "$0: the shells that I found on your system." + if test ${ZSH_VERSION+y} ; then + printf "%s\n" "$0: In particular, zsh $ZSH_VERSION has bugs and should" + printf "%s\n" "$0: be upgraded to zsh 4.3.4 or later." + else + printf "%s\n" "$0: Please tell bug-autoconf@gnu.org about your system, +$0: including any error possibly output before this +$0: message. Then install a modern shell, or manually run +$0: the script under such a shell if you do have one." + fi + exit 1 +fi +fi +fi +SHELL=${CONFIG_SHELL-/bin/sh} +export SHELL +# Unset more variables known to interfere with behavior of common tools. +CLICOLOR_FORCE= GREP_OPTIONS= +unset CLICOLOR_FORCE GREP_OPTIONS + +## --------------------- ## +## M4sh Shell Functions. ## +## --------------------- ## +@%:@ as_fn_unset VAR +@%:@ --------------- +@%:@ Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset + + +@%:@ as_fn_set_status STATUS +@%:@ ----------------------- +@%:@ Set @S|@? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} @%:@ as_fn_set_status + +@%:@ as_fn_exit STATUS +@%:@ ----------------- +@%:@ Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} @%:@ as_fn_exit +@%:@ as_fn_nop +@%:@ --------- +@%:@ Do nothing but, unlike ":", preserve the value of @S|@?. +as_fn_nop () +{ + return $? +} +as_nop=as_fn_nop + +@%:@ as_fn_mkdir_p +@%:@ ------------- +@%:@ Create "@S|@as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`printf "%s\n" "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +printf "%s\n" X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} @%:@ as_fn_mkdir_p + +@%:@ as_fn_executable_p FILE +@%:@ ----------------------- +@%:@ Test if FILE is an executable regular file. +as_fn_executable_p () +{ + test -f "$1" && test -x "$1" +} @%:@ as_fn_executable_p +@%:@ as_fn_append VAR VALUE +@%:@ ---------------------- +@%:@ Append the text in VALUE to the end of the definition contained in VAR. Take +@%:@ advantage of any shell optimizations that allow amortized linear growth over +@%:@ repeated appends, instead of the typical quadratic growth present in naive +@%:@ implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null +then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else $as_nop + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +@%:@ as_fn_arith ARG... +@%:@ ------------------ +@%:@ Perform arithmetic evaluation on the ARGs, and store the result in the +@%:@ global @S|@as_val. Take advantage of shells that can avoid forks. The arguments +@%:@ must be portable across @S|@(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null +then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else $as_nop + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + +@%:@ as_fn_nop +@%:@ --------- +@%:@ Do nothing but, unlike ":", preserve the value of @S|@?. +as_fn_nop () +{ + return $? +} +as_nop=as_fn_nop + +@%:@ as_fn_error STATUS ERROR [LINENO LOG_FD] +@%:@ ---------------------------------------- +@%:@ Output "`basename @S|@0`: error: ERROR" to stderr. If LINENO and LOG_FD are +@%:@ provided, also output the error to LOG_FD, referencing LINENO. Then exit the +@%:@ script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + printf "%s\n" "$as_me: error: $2" >&2 + as_fn_exit $as_status +} @%:@ as_fn_error + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +printf "%s\n" X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + + + as_lineno_1=$LINENO as_lineno_1a=$LINENO + as_lineno_2=$LINENO as_lineno_2a=$LINENO + eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && + test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { + # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) + sed -n ' + p + /[$]LINENO/= + ' <$as_myself | + sed ' + s/[$]LINENO.*/&-/ + t lineno + b + :lineno + N + :loop + s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ + t loop + s/-\n.*// + ' >$as_me.lineno && + chmod +x "$as_me.lineno" || + { printf "%s\n" "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } + + # If we had to re-execute with $CONFIG_SHELL, we're ensured to have + # already done that, so ensure we don't try to do so again and fall + # in an infinite loop. This has already happened in practice. + _as_can_reexec=no; export _as_can_reexec + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensitive to this). + . "./$as_me.lineno" + # Exit status is that of the last command. + exit +} + + +# Determine whether it's possible to make 'echo' print without a newline. +# These variables are no longer used directly by Autoconf, but are AC_SUBSTed +# for compatibility with existing Makefiles. +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in @%:@((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +# For backward compatibility with old third-party macros, we provide +# the shell variables $as_echo and $as_echo_n. New code should use +# AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively. +as_@&t@echo='printf %s\n' +as_@&t@echo_n='printf %s' + + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -pR'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -pR' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -pR' + fi +else + as_ln_s='cp -pR' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +as_test_x='test -x' +as_executable_p=as_fn_executable_p + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + +SHELL=${CONFIG_SHELL-/bin/sh} + + +test -n "$DJDIR" || exec 7<&0 &1 + +# Name of the host. +# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, +# so uname gets run too. +ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` + +# +# Initializations. +# +ac_default_prefix=/usr/local +ac_clean_files= +ac_config_libobj_dir=. +LIB@&t@OBJS= +cross_compiling=no +subdirs= +MFLAGS= +MAKEFLAGS= + +# Identity of this package. +PACKAGE_NAME='PortAudioCpp' +PACKAGE_TARNAME='portaudiocpp' +PACKAGE_VERSION='12' +PACKAGE_STRING='PortAudioCpp 12' +PACKAGE_BUGREPORT='' +PACKAGE_URL='' + +ac_unique_file="include/portaudiocpp/PortAudioCpp.hxx" +# Factoring default headers for most tests. +ac_includes_default="\ +#include +#ifdef HAVE_STDIO_H +# include +#endif +#ifdef HAVE_STDLIB_H +# include +#endif +#ifdef HAVE_STRING_H +# include +#endif +#ifdef HAVE_INTTYPES_H +# include +#endif +#ifdef HAVE_STDINT_H +# include +#endif +#ifdef HAVE_STRINGS_H +# include +#endif +#ifdef HAVE_SYS_TYPES_H +# include +#endif +#ifdef HAVE_SYS_STAT_H +# include +#endif +#ifdef HAVE_UNISTD_H +# include +#endif" + +ac_header_c_list= +ac_subst_vars='am__EXEEXT_FALSE +am__EXEEXT_TRUE +LTLIBOBJS +LIB@&t@OBJS +LT_VERSION_INFO +PORTAUDIO_ROOT +DEFAULT_INCLUDES +CXXCPP +LT_SYS_LIBRARY_PATH +OTOOL64 +OTOOL +LIPO +NMEDIT +DSYMUTIL +MANIFEST_TOOL +RANLIB +ac_ct_AR +AR +LN_S +NM +ac_ct_DUMPBIN +DUMPBIN +LD +FGREP +EGREP +GREP +SED +LIBTOOL +OBJDUMP +DLLTOOL +AS +host_os +host_vendor +host_cpu +host +build_os +build_vendor +build_cpu +build +am__fastdepCXX_FALSE +am__fastdepCXX_TRUE +CXXDEPMODE +ac_ct_CXX +CXXFLAGS +CXX +am__fastdepCC_FALSE +am__fastdepCC_TRUE +CCDEPMODE +am__nodep +AMDEPBACKSLASH +AMDEP_FALSE +AMDEP_TRUE +am__include +DEPDIR +OBJEXT +EXEEXT +ac_ct_CC +CPPFLAGS +LDFLAGS +CFLAGS +CC +MAINT +MAINTAINER_MODE_FALSE +MAINTAINER_MODE_TRUE +AM_BACKSLASH +AM_DEFAULT_VERBOSITY +AM_DEFAULT_V +AM_V +CSCOPE +ETAGS +CTAGS +am__untar +am__tar +AMTAR +am__leading_dot +SET_MAKE +AWK +mkdir_p +MKDIR_P +INSTALL_STRIP_PROGRAM +STRIP +install_sh +MAKEINFO +AUTOHEADER +AUTOMAKE +AUTOCONF +ACLOCAL +VERSION +PACKAGE +CYGPATH_W +am__isrc +INSTALL_DATA +INSTALL_SCRIPT +INSTALL_PROGRAM +target_alias +host_alias +build_alias +LIBS +ECHO_T +ECHO_N +ECHO_C +DEFS +mandir +localedir +libdir +psdir +pdfdir +dvidir +htmldir +infodir +docdir +oldincludedir +includedir +runstatedir +localstatedir +sharedstatedir +sysconfdir +datadir +datarootdir +libexecdir +sbindir +bindir +program_transform_name +prefix +exec_prefix +PACKAGE_URL +PACKAGE_BUGREPORT +PACKAGE_STRING +PACKAGE_VERSION +PACKAGE_TARNAME +PACKAGE_NAME +PATH_SEPARATOR +SHELL +am__quote' +ac_subst_files='' +ac_user_opts=' +enable_option_checking +enable_silent_rules +enable_maintainer_mode +enable_dependency_tracking +enable_shared +enable_static +with_pic +enable_fast_install +with_aix_soname +with_gnu_ld +with_sysroot +enable_libtool_lock +' + ac_precious_vars='build_alias +host_alias +target_alias +CC +CFLAGS +LDFLAGS +LIBS +CPPFLAGS +CXX +CXXFLAGS +CCC +LT_SYS_LIBRARY_PATH +CXXCPP' + + +# Initialize some variables set by options. +ac_init_help= +ac_init_version=false +ac_unrecognized_opts= +ac_unrecognized_sep= +# The variables have the same names as the options, with +# dashes changed to underlines. +cache_file=/dev/null +exec_prefix=NONE +no_create= +no_recursion= +prefix=NONE +program_prefix=NONE +program_suffix=NONE +program_transform_name=s,x,x, +silent= +site= +srcdir= +verbose= +x_includes=NONE +x_libraries=NONE + +# Installation directory options. +# These are left unexpanded so users can "make install exec_prefix=/foo" +# and all the variables that are supposed to be based on exec_prefix +# by default will actually change. +# Use braces instead of parens because sh, perl, etc. also accept them. +# (The list follows the same order as the GNU Coding Standards.) +bindir='${exec_prefix}/bin' +sbindir='${exec_prefix}/sbin' +libexecdir='${exec_prefix}/libexec' +datarootdir='${prefix}/share' +datadir='${datarootdir}' +sysconfdir='${prefix}/etc' +sharedstatedir='${prefix}/com' +localstatedir='${prefix}/var' +runstatedir='${localstatedir}/run' +includedir='${prefix}/include' +oldincludedir='/usr/include' +docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' +infodir='${datarootdir}/info' +htmldir='${docdir}' +dvidir='${docdir}' +pdfdir='${docdir}' +psdir='${docdir}' +libdir='${exec_prefix}/lib' +localedir='${datarootdir}/locale' +mandir='${datarootdir}/man' + +ac_prev= +ac_dashdash= +for ac_option +do + # If the previous option needs an argument, assign it. + if test -n "$ac_prev"; then + eval $ac_prev=\$ac_option + ac_prev= + continue + fi + + case $ac_option in + *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; + *=) ac_optarg= ;; + *) ac_optarg=yes ;; + esac + + case $ac_dashdash$ac_option in + --) + ac_dashdash=yes ;; + + -bindir | --bindir | --bindi | --bind | --bin | --bi) + ac_prev=bindir ;; + -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) + bindir=$ac_optarg ;; + + -build | --build | --buil | --bui | --bu) + ac_prev=build_alias ;; + -build=* | --build=* | --buil=* | --bui=* | --bu=*) + build_alias=$ac_optarg ;; + + -cache-file | --cache-file | --cache-fil | --cache-fi \ + | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) + ac_prev=cache_file ;; + -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ + | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) + cache_file=$ac_optarg ;; + + --config-cache | -C) + cache_file=config.cache ;; + + -datadir | --datadir | --datadi | --datad) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=*) + datadir=$ac_optarg ;; + + -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ + | --dataroo | --dataro | --datar) + ac_prev=datarootdir ;; + -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ + | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) + datarootdir=$ac_optarg ;; + + -disable-* | --disable-*) + ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid feature name: \`$ac_useropt'" + ac_useropt_orig=$ac_useropt + ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=no ;; + + -docdir | --docdir | --docdi | --doc | --do) + ac_prev=docdir ;; + -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) + docdir=$ac_optarg ;; + + -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) + ac_prev=dvidir ;; + -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) + dvidir=$ac_optarg ;; + + -enable-* | --enable-*) + ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid feature name: \`$ac_useropt'" + ac_useropt_orig=$ac_useropt + ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=\$ac_optarg ;; + + -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ + | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ + | --exec | --exe | --ex) + ac_prev=exec_prefix ;; + -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ + | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ + | --exec=* | --exe=* | --ex=*) + exec_prefix=$ac_optarg ;; + + -gas | --gas | --ga | --g) + # Obsolete; use --with-gas. + with_gas=yes ;; + + -help | --help | --hel | --he | -h) + ac_init_help=long ;; + -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) + ac_init_help=recursive ;; + -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) + ac_init_help=short ;; + + -host | --host | --hos | --ho) + ac_prev=host_alias ;; + -host=* | --host=* | --hos=* | --ho=*) + host_alias=$ac_optarg ;; + + -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) + ac_prev=htmldir ;; + -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ + | --ht=*) + htmldir=$ac_optarg ;; + + -includedir | --includedir | --includedi | --included | --include \ + | --includ | --inclu | --incl | --inc) + ac_prev=includedir ;; + -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ + | --includ=* | --inclu=* | --incl=* | --inc=*) + includedir=$ac_optarg ;; + + -infodir | --infodir | --infodi | --infod | --info | --inf) + ac_prev=infodir ;; + -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) + infodir=$ac_optarg ;; + + -libdir | --libdir | --libdi | --libd) + ac_prev=libdir ;; + -libdir=* | --libdir=* | --libdi=* | --libd=*) + libdir=$ac_optarg ;; + + -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ + | --libexe | --libex | --libe) + ac_prev=libexecdir ;; + -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ + | --libexe=* | --libex=* | --libe=*) + libexecdir=$ac_optarg ;; + + -localedir | --localedir | --localedi | --localed | --locale) + ac_prev=localedir ;; + -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) + localedir=$ac_optarg ;; + + -localstatedir | --localstatedir | --localstatedi | --localstated \ + | --localstate | --localstat | --localsta | --localst | --locals) + ac_prev=localstatedir ;; + -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ + | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) + localstatedir=$ac_optarg ;; + + -mandir | --mandir | --mandi | --mand | --man | --ma | --m) + ac_prev=mandir ;; + -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) + mandir=$ac_optarg ;; + + -nfp | --nfp | --nf) + # Obsolete; use --without-fp. + with_fp=no ;; + + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c | -n) + no_create=yes ;; + + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) + no_recursion=yes ;; + + -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ + | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ + | --oldin | --oldi | --old | --ol | --o) + ac_prev=oldincludedir ;; + -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ + | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ + | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) + oldincludedir=$ac_optarg ;; + + -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) + ac_prev=prefix ;; + -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) + prefix=$ac_optarg ;; + + -program-prefix | --program-prefix | --program-prefi | --program-pref \ + | --program-pre | --program-pr | --program-p) + ac_prev=program_prefix ;; + -program-prefix=* | --program-prefix=* | --program-prefi=* \ + | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) + program_prefix=$ac_optarg ;; + + -program-suffix | --program-suffix | --program-suffi | --program-suff \ + | --program-suf | --program-su | --program-s) + ac_prev=program_suffix ;; + -program-suffix=* | --program-suffix=* | --program-suffi=* \ + | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) + program_suffix=$ac_optarg ;; + + -program-transform-name | --program-transform-name \ + | --program-transform-nam | --program-transform-na \ + | --program-transform-n | --program-transform- \ + | --program-transform | --program-transfor \ + | --program-transfo | --program-transf \ + | --program-trans | --program-tran \ + | --progr-tra | --program-tr | --program-t) + ac_prev=program_transform_name ;; + -program-transform-name=* | --program-transform-name=* \ + | --program-transform-nam=* | --program-transform-na=* \ + | --program-transform-n=* | --program-transform-=* \ + | --program-transform=* | --program-transfor=* \ + | --program-transfo=* | --program-transf=* \ + | --program-trans=* | --program-tran=* \ + | --progr-tra=* | --program-tr=* | --program-t=*) + program_transform_name=$ac_optarg ;; + + -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) + ac_prev=pdfdir ;; + -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) + pdfdir=$ac_optarg ;; + + -psdir | --psdir | --psdi | --psd | --ps) + ac_prev=psdir ;; + -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) + psdir=$ac_optarg ;; + + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + silent=yes ;; + + -runstatedir | --runstatedir | --runstatedi | --runstated \ + | --runstate | --runstat | --runsta | --runst | --runs \ + | --run | --ru | --r) + ac_prev=runstatedir ;; + -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \ + | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \ + | --run=* | --ru=* | --r=*) + runstatedir=$ac_optarg ;; + + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) + ac_prev=sbindir ;; + -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ + | --sbi=* | --sb=*) + sbindir=$ac_optarg ;; + + -sharedstatedir | --sharedstatedir | --sharedstatedi \ + | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ + | --sharedst | --shareds | --shared | --share | --shar \ + | --sha | --sh) + ac_prev=sharedstatedir ;; + -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ + | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ + | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ + | --sha=* | --sh=*) + sharedstatedir=$ac_optarg ;; + + -site | --site | --sit) + ac_prev=site ;; + -site=* | --site=* | --sit=*) + site=$ac_optarg ;; + + -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) + ac_prev=srcdir ;; + -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) + srcdir=$ac_optarg ;; + + -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ + | --syscon | --sysco | --sysc | --sys | --sy) + ac_prev=sysconfdir ;; + -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ + | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) + sysconfdir=$ac_optarg ;; + + -target | --target | --targe | --targ | --tar | --ta | --t) + ac_prev=target_alias ;; + -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) + target_alias=$ac_optarg ;; + + -v | -verbose | --verbose | --verbos | --verbo | --verb) + verbose=yes ;; + + -version | --version | --versio | --versi | --vers | -V) + ac_init_version=: ;; + + -with-* | --with-*) + ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid package name: \`$ac_useropt'" + ac_useropt_orig=$ac_useropt + ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=\$ac_optarg ;; + + -without-* | --without-*) + ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid package name: \`$ac_useropt'" + ac_useropt_orig=$ac_useropt + ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=no ;; + + --x) + # Obsolete; use --with-x. + with_x=yes ;; + + -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ + | --x-incl | --x-inc | --x-in | --x-i) + ac_prev=x_includes ;; + -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ + | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) + x_includes=$ac_optarg ;; + + -x-libraries | --x-libraries | --x-librarie | --x-librari \ + | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) + ac_prev=x_libraries ;; + -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ + | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) + x_libraries=$ac_optarg ;; + + -*) as_fn_error $? "unrecognized option: \`$ac_option' +Try \`$0 --help' for more information" + ;; + + *=*) + ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` + # Reject names that are not valid shell variable names. + case $ac_envvar in #( + '' | [0-9]* | *[!_$as_cr_alnum]* ) + as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; + esac + eval $ac_envvar=\$ac_optarg + export $ac_envvar ;; + + *) + # FIXME: should be removed in autoconf 3.0. + printf "%s\n" "$as_me: WARNING: you should use --build, --host, --target" >&2 + expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && + printf "%s\n" "$as_me: WARNING: invalid host type: $ac_option" >&2 + : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" + ;; + + esac +done + +if test -n "$ac_prev"; then + ac_option=--`echo $ac_prev | sed 's/_/-/g'` + as_fn_error $? "missing argument to $ac_option" +fi + +if test -n "$ac_unrecognized_opts"; then + case $enable_option_checking in + no) ;; + fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; + *) printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; + esac +fi + +# Check all directory arguments for consistency. +for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ + datadir sysconfdir sharedstatedir localstatedir includedir \ + oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ + libdir localedir mandir runstatedir +do + eval ac_val=\$$ac_var + # Remove trailing slashes. + case $ac_val in + */ ) + ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` + eval $ac_var=\$ac_val;; + esac + # Be sure to have absolute directory names. + case $ac_val in + [\\/$]* | ?:[\\/]* ) continue;; + NONE | '' ) case $ac_var in *prefix ) continue;; esac;; + esac + as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" +done + +# There might be people who depend on the old broken behavior: `$host' +# used to hold the argument of --host etc. +# FIXME: To remove some day. +build=$build_alias +host=$host_alias +target=$target_alias + +# FIXME: To remove some day. +if test "x$host_alias" != x; then + if test "x$build_alias" = x; then + cross_compiling=maybe + elif test "x$build_alias" != "x$host_alias"; then + cross_compiling=yes + fi +fi + +ac_tool_prefix= +test -n "$host_alias" && ac_tool_prefix=$host_alias- + +test "$silent" = yes && exec 6>/dev/null + + +ac_pwd=`pwd` && test -n "$ac_pwd" && +ac_ls_di=`ls -di .` && +ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || + as_fn_error $? "working directory cannot be determined" +test "X$ac_ls_di" = "X$ac_pwd_ls_di" || + as_fn_error $? "pwd does not report name of working directory" + + +# Find the source files, if location was not specified. +if test -z "$srcdir"; then + ac_srcdir_defaulted=yes + # Try the directory containing this script, then the parent directory. + ac_confdir=`$as_dirname -- "$as_myself" || +$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_myself" : 'X\(//\)[^/]' \| \ + X"$as_myself" : 'X\(//\)$' \| \ + X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || +printf "%s\n" X"$as_myself" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + srcdir=$ac_confdir + if test ! -r "$srcdir/$ac_unique_file"; then + srcdir=.. + fi +else + ac_srcdir_defaulted=no +fi +if test ! -r "$srcdir/$ac_unique_file"; then + test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." + as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" +fi +ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" +ac_abs_confdir=`( + cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" + pwd)` +# When building in place, set srcdir=. +if test "$ac_abs_confdir" = "$ac_pwd"; then + srcdir=. +fi +# Remove unnecessary trailing slashes from srcdir. +# Double slashes in file names in object file debugging info +# mess up M-x gdb in Emacs. +case $srcdir in +*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; +esac +for ac_var in $ac_precious_vars; do + eval ac_env_${ac_var}_set=\${${ac_var}+set} + eval ac_env_${ac_var}_value=\$${ac_var} + eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} + eval ac_cv_env_${ac_var}_value=\$${ac_var} +done + +# +# Report the --help message. +# +if test "$ac_init_help" = "long"; then + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat <<_ACEOF +\`configure' configures PortAudioCpp 12 to adapt to many kinds of systems. + +Usage: $0 [OPTION]... [VAR=VALUE]... + +To assign environment variables (e.g., CC, CFLAGS...), specify them as +VAR=VALUE. See below for descriptions of some of the useful variables. + +Defaults for the options are specified in brackets. + +Configuration: + -h, --help display this help and exit + --help=short display options specific to this package + --help=recursive display the short help of all the included packages + -V, --version display version information and exit + -q, --quiet, --silent do not print \`checking ...' messages + --cache-file=FILE cache test results in FILE [disabled] + -C, --config-cache alias for \`--cache-file=config.cache' + -n, --no-create do not create output files + --srcdir=DIR find the sources in DIR [configure dir or \`..'] + +Installation directories: + --prefix=PREFIX install architecture-independent files in PREFIX + @<:@@S|@ac_default_prefix@:>@ + --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX + @<:@PREFIX@:>@ + +By default, \`make install' will install all the files in +\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify +an installation prefix other than \`$ac_default_prefix' using \`--prefix', +for instance \`--prefix=\$HOME'. + +For better control, use the options below. + +Fine tuning of the installation directories: + --bindir=DIR user executables [EPREFIX/bin] + --sbindir=DIR system admin executables [EPREFIX/sbin] + --libexecdir=DIR program executables [EPREFIX/libexec] + --sysconfdir=DIR read-only single-machine data [PREFIX/etc] + --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] + --localstatedir=DIR modifiable single-machine data [PREFIX/var] + --runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run] + --libdir=DIR object code libraries [EPREFIX/lib] + --includedir=DIR C header files [PREFIX/include] + --oldincludedir=DIR C header files for non-gcc [/usr/include] + --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] + --datadir=DIR read-only architecture-independent data [DATAROOTDIR] + --infodir=DIR info documentation [DATAROOTDIR/info] + --localedir=DIR locale-dependent data [DATAROOTDIR/locale] + --mandir=DIR man documentation [DATAROOTDIR/man] + --docdir=DIR documentation root @<:@DATAROOTDIR/doc/portaudiocpp@:>@ + --htmldir=DIR html documentation [DOCDIR] + --dvidir=DIR dvi documentation [DOCDIR] + --pdfdir=DIR pdf documentation [DOCDIR] + --psdir=DIR ps documentation [DOCDIR] +_ACEOF + + cat <<\_ACEOF + +Program names: + --program-prefix=PREFIX prepend PREFIX to installed program names + --program-suffix=SUFFIX append SUFFIX to installed program names + --program-transform-name=PROGRAM run sed PROGRAM on installed program names + +System types: + --build=BUILD configure for building on BUILD [guessed] + --host=HOST cross-compile to build programs to run on HOST [BUILD] +_ACEOF +fi + +if test -n "$ac_init_help"; then + case $ac_init_help in + short | recursive ) echo "Configuration of PortAudioCpp 12:";; + esac + cat <<\_ACEOF + +Optional Features: + --disable-option-checking ignore unrecognized --enable/--with options + --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --enable-silent-rules less verbose build output (undo: "make V=1") + --disable-silent-rules verbose build output (undo: "make V=0") + --enable-maintainer-mode + enable make rules and dependencies not useful (and + sometimes confusing) to the casual installer + --enable-dependency-tracking + do not reject slow dependency extractors + --disable-dependency-tracking + speeds up one-time build + --enable-shared@<:@=PKGS@:>@ build shared libraries @<:@default=yes@:>@ + --enable-static@<:@=PKGS@:>@ build static libraries @<:@default=yes@:>@ + --enable-fast-install@<:@=PKGS@:>@ + optimize for fast installation @<:@default=yes@:>@ + --disable-libtool-lock avoid locking (might break parallel builds) + +Optional Packages: + --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] + --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) + --with-pic@<:@=PKGS@:>@ try to use only PIC/non-PIC objects @<:@default=use + both@:>@ + --with-aix-soname=aix|svr4|both + shared library versioning (aka "SONAME") variant to + provide on AIX, @<:@default=aix@:>@. + --with-gnu-ld assume the C compiler uses GNU ld @<:@default=no@:>@ + --with-sysroot@<:@=DIR@:>@ Search for dependent libraries within DIR (or the + compiler's sysroot if not specified). + +Some influential environment variables: + CC C compiler command + CFLAGS C compiler flags + LDFLAGS linker flags, e.g. -L if you have libraries in a + nonstandard directory + LIBS libraries to pass to the linker, e.g. -l + CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if + you have headers in a nonstandard directory + CXX C++ compiler command + CXXFLAGS C++ compiler flags + LT_SYS_LIBRARY_PATH + User-defined run-time library search path. + CXXCPP C++ preprocessor + +Use these variables to override the choices made by `configure' or to help +it to find libraries and programs with nonstandard names/locations. + +Report bugs to the package provider. +_ACEOF +ac_status=$? +fi + +if test "$ac_init_help" = "recursive"; then + # If there are subdirs, report their specific --help. + for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue + test -d "$ac_dir" || + { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || + continue + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + cd "$ac_dir" || { ac_status=$?; continue; } + # Check for configure.gnu first; this name is used for a wrapper for + # Metaconfig's "Configure" on case-insensitive file systems. + if test -f "$ac_srcdir/configure.gnu"; then + echo && + $SHELL "$ac_srcdir/configure.gnu" --help=recursive + elif test -f "$ac_srcdir/configure"; then + echo && + $SHELL "$ac_srcdir/configure" --help=recursive + else + printf "%s\n" "$as_me: WARNING: no configuration information is in $ac_dir" >&2 + fi || ac_status=$? + cd "$ac_pwd" || { ac_status=$?; break; } + done +fi + +test -n "$ac_init_help" && exit $ac_status +if $ac_init_version; then + cat <<\_ACEOF +PortAudioCpp configure 12 +generated by GNU Autoconf 2.71 + +Copyright (C) 2021 Free Software Foundation, Inc. +This configure script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it. +_ACEOF + exit +fi + +## ------------------------ ## +## Autoconf initialization. ## +## ------------------------ ## + +@%:@ ac_fn_c_try_compile LINENO +@%:@ -------------------------- +@%:@ Try to compile conftest.@S|@ac_ext, and return whether this succeeded. +ac_fn_c_try_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext conftest.beam + if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext +then : + ac_retval=0 +else $as_nop + printf "%s\n" "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} @%:@ ac_fn_c_try_compile + +@%:@ ac_fn_cxx_try_compile LINENO +@%:@ ---------------------------- +@%:@ Try to compile conftest.@S|@ac_ext, and return whether this succeeded. +ac_fn_cxx_try_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext conftest.beam + if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext +then : + ac_retval=0 +else $as_nop + printf "%s\n" "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} @%:@ ac_fn_cxx_try_compile + +@%:@ ac_fn_c_try_link LINENO +@%:@ ----------------------- +@%:@ Try to link conftest.@S|@ac_ext, and return whether this succeeded. +ac_fn_c_try_link () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext conftest.beam conftest$ac_exeext + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + test -x conftest$ac_exeext + } +then : + ac_retval=0 +else $as_nop + printf "%s\n" "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information + # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would + # interfere with the next link command; also delete a directory that is + # left behind by Apple's compiler. We do this before executing the actions. + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} @%:@ ac_fn_c_try_link + +@%:@ ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES +@%:@ ------------------------------------------------------- +@%:@ Tests whether HEADER exists and can be compiled using the include files in +@%:@ INCLUDES, setting the cache variable VAR accordingly. +ac_fn_c_check_header_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +printf %s "checking for $2... " >&6; } +if eval test \${$3+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +@%:@include <$2> +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + eval "$3=yes" +else $as_nop + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +eval ac_res=\$$3 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} @%:@ ac_fn_c_check_header_compile + +@%:@ ac_fn_c_check_func LINENO FUNC VAR +@%:@ ---------------------------------- +@%:@ Tests whether FUNC exists, setting the cache variable VAR accordingly +ac_fn_c_check_func () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +printf %s "checking for $2... " >&6; } +if eval test \${$3+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +/* Define $2 to an innocuous variant, in case declares $2. + For example, HP-UX 11i declares gettimeofday. */ +#define $2 innocuous_$2 + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $2 (); below. */ + +#include +#undef $2 + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $2 (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$2 || defined __stub___$2 +choke me +#endif + +int +main (void) +{ +return $2 (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + eval "$3=yes" +else $as_nop + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +fi +eval ac_res=\$$3 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} @%:@ ac_fn_c_check_func + +@%:@ ac_fn_cxx_try_cpp LINENO +@%:@ ------------------------ +@%:@ Try to preprocess conftest.@S|@ac_ext, and return whether this succeeded. +ac_fn_cxx_try_cpp () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } > conftest.i && { + test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || + test ! -s conftest.err + } +then : + ac_retval=0 +else $as_nop + printf "%s\n" "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} @%:@ ac_fn_cxx_try_cpp + +@%:@ ac_fn_cxx_try_link LINENO +@%:@ ------------------------- +@%:@ Try to link conftest.@S|@ac_ext, and return whether this succeeded. +ac_fn_cxx_try_link () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext conftest.beam conftest$ac_exeext + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + test -x conftest$ac_exeext + } +then : + ac_retval=0 +else $as_nop + printf "%s\n" "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information + # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would + # interfere with the next link command; also delete a directory that is + # left behind by Apple's compiler. We do this before executing the actions. + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} @%:@ ac_fn_cxx_try_link +ac_configure_args_raw= +for ac_arg +do + case $ac_arg in + *\'*) + ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + as_fn_append ac_configure_args_raw " '$ac_arg'" +done + +case $ac_configure_args_raw in + *$as_nl*) + ac_safe_unquote= ;; + *) + ac_unsafe_z='|&;<>()$`\\"*?@<:@ '' ' # This string ends in space, tab. + ac_unsafe_a="$ac_unsafe_z#~" + ac_safe_unquote="s/ '\\([^$ac_unsafe_a][^$ac_unsafe_z]*\\)'/ \\1/g" + ac_configure_args_raw=` printf "%s\n" "$ac_configure_args_raw" | sed "$ac_safe_unquote"`;; +esac + +cat >config.log <<_ACEOF +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. + +It was created by PortAudioCpp $as_me 12, which was +generated by GNU Autoconf 2.71. Invocation command line was + + $ $0$ac_configure_args_raw + +_ACEOF +exec 5>>config.log +{ +cat <<_ASUNAME +## --------- ## +## Platform. ## +## --------- ## + +hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` + +/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` +/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` +/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` +/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` + +_ASUNAME + +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + printf "%s\n" "PATH: $as_dir" + done +IFS=$as_save_IFS + +} >&5 + +cat >&5 <<_ACEOF + + +## ----------- ## +## Core tests. ## +## ----------- ## + +_ACEOF + + +# Keep a trace of the command line. +# Strip out --no-create and --no-recursion so they do not pile up. +# Strip out --silent because we don't want to record it for future runs. +# Also quote any args containing shell meta-characters. +# Make two passes to allow for proper duplicate-argument suppression. +ac_configure_args= +ac_configure_args0= +ac_configure_args1= +ac_must_keep_next=false +for ac_pass in 1 2 +do + for ac_arg + do + case $ac_arg in + -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + continue ;; + *\'*) + ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + case $ac_pass in + 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; + 2) + as_fn_append ac_configure_args1 " '$ac_arg'" + if test $ac_must_keep_next = true; then + ac_must_keep_next=false # Got value, back to normal. + else + case $ac_arg in + *=* | --config-cache | -C | -disable-* | --disable-* \ + | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ + | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ + | -with-* | --with-* | -without-* | --without-* | --x) + case "$ac_configure_args0 " in + "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; + esac + ;; + -* ) ac_must_keep_next=true ;; + esac + fi + as_fn_append ac_configure_args " '$ac_arg'" + ;; + esac + done +done +{ ac_configure_args0=; unset ac_configure_args0;} +{ ac_configure_args1=; unset ac_configure_args1;} + +# When interrupted or exit'd, cleanup temporary files, and complete +# config.log. We remove comments because anyway the quotes in there +# would cause problems or look ugly. +# WARNING: Use '\'' to represent an apostrophe within the trap. +# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. +trap 'exit_status=$? + # Sanitize IFS. + IFS=" "" $as_nl" + # Save into config.log some information that might help in debugging. + { + echo + + printf "%s\n" "## ---------------- ## +## Cache variables. ## +## ---------------- ##" + echo + # The following way of writing the cache mishandles newlines in values, +( + for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + (set) 2>&1 | + case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + sed -n \ + "s/'\''/'\''\\\\'\'''\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" + ;; #( + *) + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) + echo + + printf "%s\n" "## ----------------- ## +## Output variables. ## +## ----------------- ##" + echo + for ac_var in $ac_subst_vars + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + printf "%s\n" "$ac_var='\''$ac_val'\''" + done | sort + echo + + if test -n "$ac_subst_files"; then + printf "%s\n" "## ------------------- ## +## File substitutions. ## +## ------------------- ##" + echo + for ac_var in $ac_subst_files + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + printf "%s\n" "$ac_var='\''$ac_val'\''" + done | sort + echo + fi + + if test -s confdefs.h; then + printf "%s\n" "## ----------- ## +## confdefs.h. ## +## ----------- ##" + echo + cat confdefs.h + echo + fi + test "$ac_signal" != 0 && + printf "%s\n" "$as_me: caught signal $ac_signal" + printf "%s\n" "$as_me: exit $exit_status" + } >&5 + rm -f core *.core core.conftest.* && + rm -f -r conftest* confdefs* conf$$* $ac_clean_files && + exit $exit_status +' 0 +for ac_signal in 1 2 13 15; do + trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal +done +ac_signal=0 + +# confdefs.h avoids OS command line length limits that DEFS can exceed. +rm -f -r conftest* confdefs.h + +printf "%s\n" "/* confdefs.h */" > confdefs.h + +# Predefined preprocessor variables. + +printf "%s\n" "@%:@define PACKAGE_NAME \"$PACKAGE_NAME\"" >>confdefs.h + +printf "%s\n" "@%:@define PACKAGE_TARNAME \"$PACKAGE_TARNAME\"" >>confdefs.h + +printf "%s\n" "@%:@define PACKAGE_VERSION \"$PACKAGE_VERSION\"" >>confdefs.h + +printf "%s\n" "@%:@define PACKAGE_STRING \"$PACKAGE_STRING\"" >>confdefs.h + +printf "%s\n" "@%:@define PACKAGE_BUGREPORT \"$PACKAGE_BUGREPORT\"" >>confdefs.h + +printf "%s\n" "@%:@define PACKAGE_URL \"$PACKAGE_URL\"" >>confdefs.h + + +# Let the site file select an alternate cache file if it wants to. +# Prefer an explicitly selected file to automatically selected ones. +if test -n "$CONFIG_SITE"; then + ac_site_files="$CONFIG_SITE" +elif test "x$prefix" != xNONE; then + ac_site_files="$prefix/share/config.site $prefix/etc/config.site" +else + ac_site_files="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" +fi + +for ac_site_file in $ac_site_files +do + case $ac_site_file in @%:@( + */*) : + ;; @%:@( + *) : + ac_site_file=./$ac_site_file ;; +esac + if test -f "$ac_site_file" && test -r "$ac_site_file"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 +printf "%s\n" "$as_me: loading site script $ac_site_file" >&6;} + sed 's/^/| /' "$ac_site_file" >&5 + . "$ac_site_file" \ + || { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "failed to load site script $ac_site_file +See \`config.log' for more details" "$LINENO" 5; } + fi +done + +if test -r "$cache_file"; then + # Some versions of bash will fail to source /dev/null (special files + # actually), so we avoid doing that. DJGPP emulates it as a regular file. + if test /dev/null != "$cache_file" && test -f "$cache_file"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 +printf "%s\n" "$as_me: loading cache $cache_file" >&6;} + case $cache_file in + [\\/]* | ?:[\\/]* ) . "$cache_file";; + *) . "./$cache_file";; + esac + fi +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 +printf "%s\n" "$as_me: creating cache $cache_file" >&6;} + >$cache_file +fi + +# Test code for whether the C compiler supports C89 (global declarations) +ac_c_conftest_c89_globals=' +/* Does the compiler advertise C89 conformance? + Do not test the value of __STDC__, because some compilers set it to 0 + while being otherwise adequately conformant. */ +#if !defined __STDC__ +# error "Compiler does not advertise C89 conformance" +#endif + +#include +#include +struct stat; +/* Most of the following tests are stolen from RCS 5.7 src/conf.sh. */ +struct buf { int x; }; +struct buf * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} + +/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has + function prototypes and stuff, but not \xHH hex character constants. + These do not provoke an error unfortunately, instead are silently treated + as an "x". The following induces an error, until -std is added to get + proper ANSI mode. Curiously \x00 != x always comes out true, for an + array size at least. It is necessary to write \x00 == 0 to get something + that is true only with -std. */ +int osf4_cc_array ['\''\x00'\'' == 0 ? 1 : -1]; + +/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters + inside strings and character constants. */ +#define FOO(x) '\''x'\'' +int xlc6_cc_array[FOO(a) == '\''x'\'' ? 1 : -1]; + +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, int *(*)(struct buf *, struct stat *, int), + int, int);' + +# Test code for whether the C compiler supports C89 (body of main). +ac_c_conftest_c89_main=' +ok |= (argc == 0 || f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]); +' + +# Test code for whether the C compiler supports C99 (global declarations) +ac_c_conftest_c99_globals=' +// Does the compiler advertise C99 conformance? +#if !defined __STDC_VERSION__ || __STDC_VERSION__ < 199901L +# error "Compiler does not advertise C99 conformance" +#endif + +#include +extern int puts (const char *); +extern int printf (const char *, ...); +extern int dprintf (int, const char *, ...); +extern void *malloc (size_t); + +// Check varargs macros. These examples are taken from C99 6.10.3.5. +// dprintf is used instead of fprintf to avoid needing to declare +// FILE and stderr. +#define debug(...) dprintf (2, __VA_ARGS__) +#define showlist(...) puts (#__VA_ARGS__) +#define report(test,...) ((test) ? puts (#test) : printf (__VA_ARGS__)) +static void +test_varargs_macros (void) +{ + int x = 1234; + int y = 5678; + debug ("Flag"); + debug ("X = %d\n", x); + showlist (The first, second, and third items.); + report (x>y, "x is %d but y is %d", x, y); +} + +// Check long long types. +#define BIG64 18446744073709551615ull +#define BIG32 4294967295ul +#define BIG_OK (BIG64 / BIG32 == 4294967297ull && BIG64 % BIG32 == 0) +#if !BIG_OK + #error "your preprocessor is broken" +#endif +#if BIG_OK +#else + #error "your preprocessor is broken" +#endif +static long long int bignum = -9223372036854775807LL; +static unsigned long long int ubignum = BIG64; + +struct incomplete_array +{ + int datasize; + double data[]; +}; + +struct named_init { + int number; + const wchar_t *name; + double average; +}; + +typedef const char *ccp; + +static inline int +test_restrict (ccp restrict text) +{ + // See if C++-style comments work. + // Iterate through items via the restricted pointer. + // Also check for declarations in for loops. + for (unsigned int i = 0; *(text+i) != '\''\0'\''; ++i) + continue; + return 0; +} + +// Check varargs and va_copy. +static bool +test_varargs (const char *format, ...) +{ + va_list args; + va_start (args, format); + va_list args_copy; + va_copy (args_copy, args); + + const char *str = ""; + int number = 0; + float fnumber = 0; + + while (*format) + { + switch (*format++) + { + case '\''s'\'': // string + str = va_arg (args_copy, const char *); + break; + case '\''d'\'': // int + number = va_arg (args_copy, int); + break; + case '\''f'\'': // float + fnumber = va_arg (args_copy, double); + break; + default: + break; + } + } + va_end (args_copy); + va_end (args); + + return *str && number && fnumber; +} +' + +# Test code for whether the C compiler supports C99 (body of main). +ac_c_conftest_c99_main=' + // Check bool. + _Bool success = false; + success |= (argc != 0); + + // Check restrict. + if (test_restrict ("String literal") == 0) + success = true; + char *restrict newvar = "Another string"; + + // Check varargs. + success &= test_varargs ("s, d'\'' f .", "string", 65, 34.234); + test_varargs_macros (); + + // Check flexible array members. + struct incomplete_array *ia = + malloc (sizeof (struct incomplete_array) + (sizeof (double) * 10)); + ia->datasize = 10; + for (int i = 0; i < ia->datasize; ++i) + ia->data[i] = i * 1.234; + + // Check named initializers. + struct named_init ni = { + .number = 34, + .name = L"Test wide string", + .average = 543.34343, + }; + + ni.number = 58; + + int dynamic_array[ni.number]; + dynamic_array[0] = argv[0][0]; + dynamic_array[ni.number - 1] = 543; + + // work around unused variable warnings + ok |= (!success || bignum == 0LL || ubignum == 0uLL || newvar[0] == '\''x'\'' + || dynamic_array[ni.number - 1] != 543); +' + +# Test code for whether the C compiler supports C11 (global declarations) +ac_c_conftest_c11_globals=' +// Does the compiler advertise C11 conformance? +#if !defined __STDC_VERSION__ || __STDC_VERSION__ < 201112L +# error "Compiler does not advertise C11 conformance" +#endif + +// Check _Alignas. +char _Alignas (double) aligned_as_double; +char _Alignas (0) no_special_alignment; +extern char aligned_as_int; +char _Alignas (0) _Alignas (int) aligned_as_int; + +// Check _Alignof. +enum +{ + int_alignment = _Alignof (int), + int_array_alignment = _Alignof (int[100]), + char_alignment = _Alignof (char) +}; +_Static_assert (0 < -_Alignof (int), "_Alignof is signed"); + +// Check _Noreturn. +int _Noreturn does_not_return (void) { for (;;) continue; } + +// Check _Static_assert. +struct test_static_assert +{ + int x; + _Static_assert (sizeof (int) <= sizeof (long int), + "_Static_assert does not work in struct"); + long int y; +}; + +// Check UTF-8 literals. +#define u8 syntax error! +char const utf8_literal[] = u8"happens to be ASCII" "another string"; + +// Check duplicate typedefs. +typedef long *long_ptr; +typedef long int *long_ptr; +typedef long_ptr long_ptr; + +// Anonymous structures and unions -- taken from C11 6.7.2.1 Example 1. +struct anonymous +{ + union { + struct { int i; int j; }; + struct { int k; long int l; } w; + }; + int m; +} v1; +' + +# Test code for whether the C compiler supports C11 (body of main). +ac_c_conftest_c11_main=' + _Static_assert ((offsetof (struct anonymous, i) + == offsetof (struct anonymous, w.k)), + "Anonymous union alignment botch"); + v1.i = 2; + v1.w.k = 5; + ok |= v1.i != 5; +' + +# Test code for whether the C compiler supports C11 (complete). +ac_c_conftest_c11_program="${ac_c_conftest_c89_globals} +${ac_c_conftest_c99_globals} +${ac_c_conftest_c11_globals} + +int +main (int argc, char **argv) +{ + int ok = 0; + ${ac_c_conftest_c89_main} + ${ac_c_conftest_c99_main} + ${ac_c_conftest_c11_main} + return ok; +} +" + +# Test code for whether the C compiler supports C99 (complete). +ac_c_conftest_c99_program="${ac_c_conftest_c89_globals} +${ac_c_conftest_c99_globals} + +int +main (int argc, char **argv) +{ + int ok = 0; + ${ac_c_conftest_c89_main} + ${ac_c_conftest_c99_main} + return ok; +} +" + +# Test code for whether the C compiler supports C89 (complete). +ac_c_conftest_c89_program="${ac_c_conftest_c89_globals} + +int +main (int argc, char **argv) +{ + int ok = 0; + ${ac_c_conftest_c89_main} + return ok; +} +" + +# Test code for whether the C++ compiler supports C++98 (global declarations) +ac_cxx_conftest_cxx98_globals=' +// Does the compiler advertise C++98 conformance? +#if !defined __cplusplus || __cplusplus < 199711L +# error "Compiler does not advertise C++98 conformance" +#endif + +// These inclusions are to reject old compilers that +// lack the unsuffixed header files. +#include +#include + +// and are *not* freestanding headers in C++98. +extern void assert (int); +namespace std { + extern int strcmp (const char *, const char *); +} + +// Namespaces, exceptions, and templates were all added after "C++ 2.0". +using std::exception; +using std::strcmp; + +namespace { + +void test_exception_syntax() +{ + try { + throw "test"; + } catch (const char *s) { + // Extra parentheses suppress a warning when building autoconf itself, + // due to lint rules shared with more typical C programs. + assert (!(strcmp) (s, "test")); + } +} + +template struct test_template +{ + T const val; + explicit test_template(T t) : val(t) {} + template T add(U u) { return static_cast(u) + val; } +}; + +} // anonymous namespace +' + +# Test code for whether the C++ compiler supports C++98 (body of main) +ac_cxx_conftest_cxx98_main=' + assert (argc); + assert (! argv[0]); +{ + test_exception_syntax (); + test_template tt (2.0); + assert (tt.add (4) == 6.0); + assert (true && !false); +} +' + +# Test code for whether the C++ compiler supports C++11 (global declarations) +ac_cxx_conftest_cxx11_globals=' +// Does the compiler advertise C++ 2011 conformance? +#if !defined __cplusplus || __cplusplus < 201103L +# error "Compiler does not advertise C++11 conformance" +#endif + +namespace cxx11test +{ + constexpr int get_val() { return 20; } + + struct testinit + { + int i; + double d; + }; + + class delegate + { + public: + delegate(int n) : n(n) {} + delegate(): delegate(2354) {} + + virtual int getval() { return this->n; }; + protected: + int n; + }; + + class overridden : public delegate + { + public: + overridden(int n): delegate(n) {} + virtual int getval() override final { return this->n * 2; } + }; + + class nocopy + { + public: + nocopy(int i): i(i) {} + nocopy() = default; + nocopy(const nocopy&) = delete; + nocopy & operator=(const nocopy&) = delete; + private: + int i; + }; + + // for testing lambda expressions + template Ret eval(Fn f, Ret v) + { + return f(v); + } + + // for testing variadic templates and trailing return types + template auto sum(V first) -> V + { + return first; + } + template auto sum(V first, Args... rest) -> V + { + return first + sum(rest...); + } +} +' + +# Test code for whether the C++ compiler supports C++11 (body of main) +ac_cxx_conftest_cxx11_main=' +{ + // Test auto and decltype + auto a1 = 6538; + auto a2 = 48573953.4; + auto a3 = "String literal"; + + int total = 0; + for (auto i = a3; *i; ++i) { total += *i; } + + decltype(a2) a4 = 34895.034; +} +{ + // Test constexpr + short sa[cxx11test::get_val()] = { 0 }; +} +{ + // Test initializer lists + cxx11test::testinit il = { 4323, 435234.23544 }; +} +{ + // Test range-based for + int array[] = {9, 7, 13, 15, 4, 18, 12, 10, 5, 3, + 14, 19, 17, 8, 6, 20, 16, 2, 11, 1}; + for (auto &x : array) { x += 23; } +} +{ + // Test lambda expressions + using cxx11test::eval; + assert (eval ([](int x) { return x*2; }, 21) == 42); + double d = 2.0; + assert (eval ([&](double x) { return d += x; }, 3.0) == 5.0); + assert (d == 5.0); + assert (eval ([=](double x) mutable { return d += x; }, 4.0) == 9.0); + assert (d == 5.0); +} +{ + // Test use of variadic templates + using cxx11test::sum; + auto a = sum(1); + auto b = sum(1, 2); + auto c = sum(1.0, 2.0, 3.0); +} +{ + // Test constructor delegation + cxx11test::delegate d1; + cxx11test::delegate d2(); + cxx11test::delegate d3(45); +} +{ + // Test override and final + cxx11test::overridden o1(55464); +} +{ + // Test nullptr + char *c = nullptr; +} +{ + // Test template brackets + test_template<::test_template> v(test_template(12)); +} +{ + // Unicode literals + char const *utf8 = u8"UTF-8 string \u2500"; + char16_t const *utf16 = u"UTF-8 string \u2500"; + char32_t const *utf32 = U"UTF-32 string \u2500"; +} +' + +# Test code for whether the C compiler supports C++11 (complete). +ac_cxx_conftest_cxx11_program="${ac_cxx_conftest_cxx98_globals} +${ac_cxx_conftest_cxx11_globals} + +int +main (int argc, char **argv) +{ + int ok = 0; + ${ac_cxx_conftest_cxx98_main} + ${ac_cxx_conftest_cxx11_main} + return ok; +} +" + +# Test code for whether the C compiler supports C++98 (complete). +ac_cxx_conftest_cxx98_program="${ac_cxx_conftest_cxx98_globals} +int +main (int argc, char **argv) +{ + int ok = 0; + ${ac_cxx_conftest_cxx98_main} + return ok; +} +" + +as_fn_append ac_header_c_list " stdio.h stdio_h HAVE_STDIO_H" +as_fn_append ac_header_c_list " stdlib.h stdlib_h HAVE_STDLIB_H" +as_fn_append ac_header_c_list " string.h string_h HAVE_STRING_H" +as_fn_append ac_header_c_list " inttypes.h inttypes_h HAVE_INTTYPES_H" +as_fn_append ac_header_c_list " stdint.h stdint_h HAVE_STDINT_H" +as_fn_append ac_header_c_list " strings.h strings_h HAVE_STRINGS_H" +as_fn_append ac_header_c_list " sys/stat.h sys_stat_h HAVE_SYS_STAT_H" +as_fn_append ac_header_c_list " sys/types.h sys_types_h HAVE_SYS_TYPES_H" +as_fn_append ac_header_c_list " unistd.h unistd_h HAVE_UNISTD_H" + +# Auxiliary files required by this configure script. +ac_aux_files="ltmain.sh config.guess config.sub compile missing install-sh" + +# Locations in which to look for auxiliary files. +ac_aux_dir_candidates="${srcdir}${PATH_SEPARATOR}${srcdir}/..${PATH_SEPARATOR}${srcdir}/../.." + +# Search for a directory containing all of the required auxiliary files, +# $ac_aux_files, from the $PATH-style list $ac_aux_dir_candidates. +# If we don't find one directory that contains all the files we need, +# we report the set of missing files from the *first* directory in +# $ac_aux_dir_candidates and give up. +ac_missing_aux_files="" +ac_first_candidate=: +printf "%s\n" "$as_me:${as_lineno-$LINENO}: looking for aux files: $ac_aux_files" >&5 +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +as_found=false +for as_dir in $ac_aux_dir_candidates +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + as_found=: + + printf "%s\n" "$as_me:${as_lineno-$LINENO}: trying $as_dir" >&5 + ac_aux_dir_found=yes + ac_install_sh= + for ac_aux in $ac_aux_files + do + # As a special case, if "install-sh" is required, that requirement + # can be satisfied by any of "install-sh", "install.sh", or "shtool", + # and $ac_install_sh is set appropriately for whichever one is found. + if test x"$ac_aux" = x"install-sh" + then + if test -f "${as_dir}install-sh"; then + printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}install-sh found" >&5 + ac_install_sh="${as_dir}install-sh -c" + elif test -f "${as_dir}install.sh"; then + printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}install.sh found" >&5 + ac_install_sh="${as_dir}install.sh -c" + elif test -f "${as_dir}shtool"; then + printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}shtool found" >&5 + ac_install_sh="${as_dir}shtool install -c" + else + ac_aux_dir_found=no + if $ac_first_candidate; then + ac_missing_aux_files="${ac_missing_aux_files} install-sh" + else + break + fi + fi + else + if test -f "${as_dir}${ac_aux}"; then + printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}${ac_aux} found" >&5 + else + ac_aux_dir_found=no + if $ac_first_candidate; then + ac_missing_aux_files="${ac_missing_aux_files} ${ac_aux}" + else + break + fi + fi + fi + done + if test "$ac_aux_dir_found" = yes; then + ac_aux_dir="$as_dir" + break + fi + ac_first_candidate=false + + as_found=false +done +IFS=$as_save_IFS +if $as_found +then : + +else $as_nop + as_fn_error $? "cannot find required auxiliary files:$ac_missing_aux_files" "$LINENO" 5 +fi + + +# These three variables are undocumented and unsupported, +# and are intended to be withdrawn in a future Autoconf release. +# They can cause serious problems if a builder's source tree is in a directory +# whose full name contains unusual characters. +if test -f "${ac_aux_dir}config.guess"; then + ac_@&t@config_guess="$SHELL ${ac_aux_dir}config.guess" +fi +if test -f "${ac_aux_dir}config.sub"; then + ac_@&t@config_sub="$SHELL ${ac_aux_dir}config.sub" +fi +if test -f "$ac_aux_dir/configure"; then + ac_@&t@configure="$SHELL ${ac_aux_dir}configure" +fi + +# Check that the precious variables saved in the cache have kept the same +# value. +ac_cache_corrupted=false +for ac_var in $ac_precious_vars; do + eval ac_old_set=\$ac_cv_env_${ac_var}_set + eval ac_new_set=\$ac_env_${ac_var}_set + eval ac_old_val=\$ac_cv_env_${ac_var}_value + eval ac_new_val=\$ac_env_${ac_var}_value + case $ac_old_set,$ac_new_set in + set,) + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 +printf "%s\n" "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,set) + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 +printf "%s\n" "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,);; + *) + if test "x$ac_old_val" != "x$ac_new_val"; then + # differences in whitespace do not lead to failure. + ac_old_val_w=`echo x $ac_old_val` + ac_new_val_w=`echo x $ac_new_val` + if test "$ac_old_val_w" != "$ac_new_val_w"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 +printf "%s\n" "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} + ac_cache_corrupted=: + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 +printf "%s\n" "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} + eval $ac_var=\$ac_old_val + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 +printf "%s\n" "$as_me: former value: \`$ac_old_val'" >&2;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 +printf "%s\n" "$as_me: current value: \`$ac_new_val'" >&2;} + fi;; + esac + # Pass precious variables to config.status. + if test "$ac_new_set" = set; then + case $ac_new_val in + *\'*) ac_arg=$ac_var=`printf "%s\n" "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; + *) ac_arg=$ac_var=$ac_new_val ;; + esac + case " $ac_configure_args " in + *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. + *) as_fn_append ac_configure_args " '$ac_arg'" ;; + esac + fi +done +if $ac_cache_corrupted; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 +printf "%s\n" "$as_me: error: changes in the environment can compromise the build" >&2;} + as_fn_error $? "run \`${MAKE-make} distclean' and/or \`rm $cache_file' + and start over" "$LINENO" 5 +fi +## -------------------- ## +## Main body of script. ## +## -------------------- ## + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + +am__api_version='1.16' + + + + # Find a good install program. We prefer a C program (faster), +# so one script is as good as another. But avoid the broken or +# incompatible versions: +# SysV /etc/install, /usr/sbin/install +# SunOS /usr/etc/install +# IRIX /sbin/install +# AIX /bin/install +# AmigaOS /C/install, which installs bootblocks on floppy discs +# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag +# AFS /usr/afsws/bin/install, which mishandles nonexistent args +# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" +# OS/2's system install, which has a completely different semantic +# ./install, which can be erroneously created by make from ./install.sh. +# Reject install programs that cannot install multiple files. +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 +printf %s "checking for a BSD-compatible install... " >&6; } +if test -z "$INSTALL"; then +if test ${ac_cv_path_install+y} +then : + printf %s "(cached) " >&6 +else $as_nop + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + # Account for fact that we put trailing slashes in our PATH walk. +case $as_dir in @%:@(( + ./ | /[cC]/* | \ + /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ + ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ + /usr/ucb/* ) ;; + *) + # OSF1 and SCO ODT 3.0 have their own names for install. + # Don't use installbsd from OSF since it installs stuff as root + # by default. + for ac_prog in ginstall scoinst install; do + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_prog$ac_exec_ext"; then + if test $ac_prog = install && + grep dspmsg "$as_dir$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # AIX install. It has an incompatible calling convention. + : + elif test $ac_prog = install && + grep pwplus "$as_dir$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # program-specific install script used by HP pwplus--don't use. + : + else + rm -rf conftest.one conftest.two conftest.dir + echo one > conftest.one + echo two > conftest.two + mkdir conftest.dir + if "$as_dir$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir/" && + test -s conftest.one && test -s conftest.two && + test -s conftest.dir/conftest.one && + test -s conftest.dir/conftest.two + then + ac_cv_path_install="$as_dir$ac_prog$ac_exec_ext -c" + break 3 + fi + fi + fi + done + done + ;; +esac + + done +IFS=$as_save_IFS + +rm -rf conftest.one conftest.two conftest.dir + +fi + if test ${ac_cv_path_install+y}; then + INSTALL=$ac_cv_path_install + else + # As a last resort, use the slow shell script. Don't cache a + # value for INSTALL within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + INSTALL=$ac_install_sh + fi +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 +printf "%s\n" "$INSTALL" >&6; } + +# Use test -z because SunOS4 sh mishandles braces in ${var-val}. +# It thinks the first close brace ends the variable substitution. +test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' + +test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' + +test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 +printf %s "checking whether build environment is sane... " >&6; } +# Reject unsafe characters in $srcdir or the absolute working directory +# name. Accept space and tab only in the latter. +am_lf=' +' +case `pwd` in + *[\\\"\#\$\&\'\`$am_lf]*) + as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; +esac +case $srcdir in + *[\\\"\#\$\&\'\`$am_lf\ \ ]*) + as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; +esac + +# Do 'set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + am_has_slept=no + for am_try in 1 2; do + echo "timestamp, slept: $am_has_slept" > conftest.file + set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` + if test "$*" = "X"; then + # -L didn't work. + set X `ls -t "$srcdir/configure" conftest.file` + fi + if test "$*" != "X $srcdir/configure conftest.file" \ + && test "$*" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + as_fn_error $? "ls -t appears to fail. Make sure there is not a broken + alias in your environment" "$LINENO" 5 + fi + if test "$2" = conftest.file || test $am_try -eq 2; then + break + fi + # Just in case. + sleep 1 + am_has_slept=yes + done + test "$2" = conftest.file + ) +then + # Ok. + : +else + as_fn_error $? "newly created file is older than distributed files! +Check your system clock" "$LINENO" 5 +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } +# If we didn't sleep, we still need to ensure time stamps of config.status and +# generated files are strictly newer. +am_sleep_pid= +if grep 'slept: no' conftest.file >/dev/null 2>&1; then + ( sleep 1 ) & + am_sleep_pid=$! +fi + +rm -f conftest.file + +test "$program_prefix" != NONE && + program_transform_name="s&^&$program_prefix&;$program_transform_name" +# Use a double $ so make ignores it. +test "$program_suffix" != NONE && + program_transform_name="s&\$&$program_suffix&;$program_transform_name" +# Double any \ or $. +# By default was `s,x,x', remove it if useless. +ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' +program_transform_name=`printf "%s\n" "$program_transform_name" | sed "$ac_script"` + + +# Expand $ac_aux_dir to an absolute path. +am_aux_dir=`cd "$ac_aux_dir" && pwd` + + + if test x"${MISSING+set}" != xset; then + MISSING="\${SHELL} '$am_aux_dir/missing'" +fi +# Use eval to expand $SHELL +if eval "$MISSING --is-lightweight"; then + am_missing_run="$MISSING " +else + am_missing_run= + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 +printf "%s\n" "$as_me: WARNING: 'missing' script is too old or missing" >&2;} +fi + +if test x"${install_sh+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; + *) + install_sh="\${SHELL} $am_aux_dir/install-sh" + esac +fi + +# Installed binaries are usually stripped using 'strip' when the user +# run "make install-strip". However 'strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the 'STRIP' environment variable to overrule this program. +if test "$cross_compiling" != no; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. +set dummy ${ac_tool_prefix}strip; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_STRIP+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$STRIP"; then + ac_cv_prog_STRIP="$STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_STRIP="${ac_tool_prefix}strip" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +STRIP=$ac_cv_prog_STRIP +if test -n "$STRIP"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 +printf "%s\n" "$STRIP" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_STRIP"; then + ac_ct_STRIP=$STRIP + # Extract the first word of "strip", so it can be a program name with args. +set dummy strip; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_STRIP+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_STRIP"; then + ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_STRIP="strip" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP +if test -n "$ac_ct_STRIP"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 +printf "%s\n" "$ac_ct_STRIP" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + if test "x$ac_ct_STRIP" = x; then + STRIP=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + STRIP=$ac_ct_STRIP + fi +else + STRIP="$ac_cv_prog_STRIP" +fi + +fi +INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a race-free mkdir -p" >&5 +printf %s "checking for a race-free mkdir -p... " >&6; } +if test -z "$MKDIR_P"; then + if test ${ac_cv_path_mkdir+y} +then : + printf %s "(cached) " >&6 +else $as_nop + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_prog in mkdir gmkdir; do + for ac_exec_ext in '' $ac_executable_extensions; do + as_fn_executable_p "$as_dir$ac_prog$ac_exec_ext" || continue + case `"$as_dir$ac_prog$ac_exec_ext" --version 2>&1` in #( + 'mkdir ('*'coreutils) '* | \ + 'BusyBox '* | \ + 'mkdir (fileutils) '4.1*) + ac_cv_path_mkdir=$as_dir$ac_prog$ac_exec_ext + break 3;; + esac + done + done + done +IFS=$as_save_IFS + +fi + + test -d ./--version && rmdir ./--version + if test ${ac_cv_path_mkdir+y}; then + MKDIR_P="$ac_cv_path_mkdir -p" + else + # As a last resort, use the slow shell script. Don't cache a + # value for MKDIR_P within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + MKDIR_P="$ac_install_sh -d" + fi +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 +printf "%s\n" "$MKDIR_P" >&6; } + +for ac_prog in gawk mawk nawk awk +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_AWK+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$AWK"; then + ac_cv_prog_AWK="$AWK" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_AWK="$ac_prog" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +AWK=$ac_cv_prog_AWK +if test -n "$AWK"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 +printf "%s\n" "$AWK" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + + test -n "$AWK" && break +done + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 +printf %s "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } +set x ${MAKE-make} +ac_make=`printf "%s\n" "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` +if eval test \${ac_cv_prog_make_${ac_make}_set+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat >conftest.make <<\_ACEOF +SHELL = /bin/sh +all: + @echo '@@@%%%=$(MAKE)=@@@%%%' +_ACEOF +# GNU make sometimes prints "make[1]: Entering ...", which would confuse us. +case `${MAKE-make} -f conftest.make 2>/dev/null` in + *@@@%%%=?*=@@@%%%*) + eval ac_cv_prog_make_${ac_make}_set=yes;; + *) + eval ac_cv_prog_make_${ac_make}_set=no;; +esac +rm -f conftest.make +fi +if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + SET_MAKE= +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + SET_MAKE="MAKE=${MAKE-make}" +fi + +rm -rf .tst 2>/dev/null +mkdir .tst 2>/dev/null +if test -d .tst; then + am__leading_dot=. +else + am__leading_dot=_ +fi +rmdir .tst 2>/dev/null + +@%:@ Check whether --enable-silent-rules was given. +if test ${enable_silent_rules+y} +then : + enableval=$enable_silent_rules; +fi + +case $enable_silent_rules in @%:@ ((( + yes) AM_DEFAULT_VERBOSITY=0;; + no) AM_DEFAULT_VERBOSITY=1;; + *) AM_DEFAULT_VERBOSITY=1;; +esac +am_make=${MAKE-make} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 +printf %s "checking whether $am_make supports nested variables... " >&6; } +if test ${am_cv_make_support_nested_variables+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if printf "%s\n" 'TRUE=$(BAR$(V)) +BAR0=false +BAR1=true +V=1 +am__doit: + @$(TRUE) +.PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then + am_cv_make_support_nested_variables=yes +else + am_cv_make_support_nested_variables=no +fi +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 +printf "%s\n" "$am_cv_make_support_nested_variables" >&6; } +if test $am_cv_make_support_nested_variables = yes; then + AM_V='$(V)' + AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' +else + AM_V=$AM_DEFAULT_VERBOSITY + AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY +fi +AM_BACKSLASH='\' + +if test "`cd $srcdir && pwd`" != "`pwd`"; then + # Use -I$(srcdir) only when $(srcdir) != ., so that make's output + # is not polluted with repeated "-I." + am__isrc=' -I$(srcdir)' + # test to see if srcdir already configured + if test -f $srcdir/config.status; then + as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 + fi +fi + +# test whether we have cygpath +if test -z "$CYGPATH_W"; then + if (cygpath --version) >/dev/null 2>/dev/null; then + CYGPATH_W='cygpath -w' + else + CYGPATH_W=echo + fi +fi + + +# Define the identity of the package. + PACKAGE='portaudiocpp' + VERSION='12' + + +printf "%s\n" "@%:@define PACKAGE \"$PACKAGE\"" >>confdefs.h + + +printf "%s\n" "@%:@define VERSION \"$VERSION\"" >>confdefs.h + +# Some tools Automake needs. + +ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} + + +AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} + + +AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} + + +AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} + + +MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} + +# For better backward compatibility. To be removed once Automake 1.9.x +# dies out for good. For more background, see: +# +# +mkdir_p='$(MKDIR_P)' + +# We need awk for the "check" target (and possibly the TAP driver). The +# system "awk" is bad on some platforms. +# Always define AMTAR for backward compatibility. Yes, it's still used +# in the wild :-( We should find a proper way to deprecate it ... +AMTAR='$${TAR-tar}' + + +# We'll loop over all known methods to create a tar archive until one works. +_am_tools='gnutar pax cpio none' + +am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' + + + + + +# Variables for tags utilities; see am/tags.am +if test -z "$CTAGS"; then + CTAGS=ctags +fi + +if test -z "$ETAGS"; then + ETAGS=etags +fi + +if test -z "$CSCOPE"; then + CSCOPE=cscope +fi + + + +# POSIX will say in a future version that running "rm -f" with no argument +# is OK; and we want to be able to make that assumption in our Makefile +# recipes. So use an aggressive probe to check that the usage we want is +# actually supported "in the wild" to an acceptable degree. +# See automake bug#10828. +# To make any issue more visible, cause the running configure to be aborted +# by default if the 'rm' program in use doesn't match our expectations; the +# user can still override this though. +if rm -f && rm -fr && rm -rf; then : OK; else + cat >&2 <<'END' +Oops! + +Your 'rm' program seems unable to run without file operands specified +on the command line, even when the '-f' option is present. This is contrary +to the behaviour of most rm programs out there, and not conforming with +the upcoming POSIX standard: + +Please tell bug-automake@gnu.org about your system, including the value +of your $PATH and any error possibly output before this message. This +can help us improve future automake versions. + +END + if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then + echo 'Configuration will proceed anyway, since you have set the' >&2 + echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 + echo >&2 + else + cat >&2 <<'END' +Aborting the configuration process, to ensure you take notice of the issue. + +You can download and install GNU coreutils to get an 'rm' implementation +that behaves properly: . + +If you want to complete the configuration process using your problematic +'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM +to "yes", and re-run configure. + +END + as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5 + fi +fi + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to enable maintainer-specific portions of Makefiles" >&5 +printf %s "checking whether to enable maintainer-specific portions of Makefiles... " >&6; } + @%:@ Check whether --enable-maintainer-mode was given. +if test ${enable_maintainer_mode+y} +then : + enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval +else $as_nop + USE_MAINTAINER_MODE=no +fi + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $USE_MAINTAINER_MODE" >&5 +printf "%s\n" "$USE_MAINTAINER_MODE" >&6; } + if test $USE_MAINTAINER_MODE = yes; then + MAINTAINER_MODE_TRUE= + MAINTAINER_MODE_FALSE='#' +else + MAINTAINER_MODE_TRUE='#' + MAINTAINER_MODE_FALSE= +fi + + MAINT=$MAINTAINER_MODE_TRUE + + + +###### Top-level directory of pacpp +###### This makes it easy to shuffle the build directories +###### Also edit AC_CONFIG_SRCDIR above (wouldn't accept this variable)! +PACPP_ROOT="\$(top_srcdir)" +PORTAUDIO_ROOT="../.." + +# Various other variables and flags +DEFAULT_INCLUDES="-I$PACPP_ROOT/include -I$PACPP_ROOT/$PORTAUDIO_ROOT/include" +CFLAGS=${CFLAGS-"-g -O2 -Wall -ansi -pedantic"} +CXXFLAGS=${CXXFLAGS-"${CFLAGS}"} + +LT_VERSION_INFO="0:12:0" + +# Checks for programs + + + + + + + + + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. +set dummy ${ac_tool_prefix}gcc; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +printf "%s\n" "$CC" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="gcc" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +printf "%s\n" "$ac_ct_CC" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +else + CC="$ac_cv_prog_CC" +fi + +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. +set dummy ${ac_tool_prefix}cc; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +printf "%s\n" "$CC" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + + fi +fi +if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + ac_prog_rejected=no +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + if test "$as_dir$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC + shift + if test $@%:@ != 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + ac_cv_prog_CC="$as_dir$ac_word${1+' '}$@" + fi +fi +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +printf "%s\n" "$CC" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + for ac_prog in cl.exe + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +printf "%s\n" "$CC" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + + test -n "$CC" && break + done +fi +if test -z "$CC"; then + ac_ct_CC=$CC + for ac_prog in cl.exe +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="$ac_prog" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +printf "%s\n" "$ac_ct_CC" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + + test -n "$ac_ct_CC" && break +done + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +fi + +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}clang", so it can be a program name with args. +set dummy ${ac_tool_prefix}clang; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}clang" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +printf "%s\n" "$CC" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "clang", so it can be a program name with args. +set dummy clang; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="clang" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +printf "%s\n" "$ac_ct_CC" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +else + CC="$ac_cv_prog_CC" +fi + +fi + + +test -z "$CC" && { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "no acceptable C compiler found in \$PATH +See \`config.log' for more details" "$LINENO" 5; } + +# Provide some information about the compiler. +printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion -version; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done + +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" +# Try to create an executable without -o first, disregard a.out. +# It will help us diagnose broken compilers, and finding out an intuition +# of exeext. +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 +printf %s "checking whether the C compiler works... " >&6; } +ac_link_default=`printf "%s\n" "$ac_link" | sed 's/ -o *conftest[^ ]*//'` + +# The possible output files: +ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" + +ac_rmfiles= +for ac_file in $ac_files +do + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + * ) ac_rmfiles="$ac_rmfiles $ac_file";; + esac +done +rm -f $ac_rmfiles + +if { { ac_try="$ac_link_default" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_link_default") 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +then : + # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. +# So ignore a value of `no', otherwise this would lead to `EXEEXT = no' +# in a Makefile. We should not override ac_cv_exeext if it was cached, +# so that the user can short-circuit this test for compilers unknown to +# Autoconf. +for ac_file in $ac_files '' +do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) + ;; + [ab].out ) + # We found the default executable, but exeext='' is most + # certainly right. + break;; + *.* ) + if test ${ac_cv_exeext+y} && test "$ac_cv_exeext" != no; + then :; else + ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + fi + # We set ac_cv_exeext here because the later test for it is not + # safe: cross compilers may not add the suffix if given an `-o' + # argument, so we may need to know it at that point already. + # Even if this section looks crufty: it has the advantage of + # actually working. + break;; + * ) + break;; + esac +done +test "$ac_cv_exeext" = no && ac_cv_exeext= + +else $as_nop + ac_file='' +fi +if test -z "$ac_file" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +printf "%s\n" "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "C compiler cannot create executables +See \`config.log' for more details" "$LINENO" 5; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 +printf %s "checking for C compiler default output file name... " >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 +printf "%s\n" "$ac_file" >&6; } +ac_exeext=$ac_cv_exeext + +rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out +ac_clean_files=$ac_clean_files_save +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 +printf %s "checking for suffix of executables... " >&6; } +if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +then : + # If both `conftest.exe' and `conftest' are `present' (well, observable) +# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will +# work properly (i.e., refer to `conftest.exe'), while it won't with +# `rm'. +for ac_file in conftest.exe conftest conftest.*; do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + break;; + * ) break;; + esac +done +else $as_nop + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details" "$LINENO" 5; } +fi +rm -f conftest conftest$ac_cv_exeext +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 +printf "%s\n" "$ac_cv_exeext" >&6; } + +rm -f conftest.$ac_ext +EXEEXT=$ac_cv_exeext +ac_exeext=$EXEEXT +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +@%:@include +int +main (void) +{ +FILE *f = fopen ("conftest.out", "w"); + return ferror (f) || fclose (f) != 0; + + ; + return 0; +} +_ACEOF +ac_clean_files="$ac_clean_files conftest.out" +# Check that the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 +printf %s "checking whether we are cross compiling... " >&6; } +if test "$cross_compiling" != yes; then + { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if { ac_try='./conftest$ac_cv_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then + cross_compiling=no + else + if test "$cross_compiling" = maybe; then + cross_compiling=yes + else + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details" "$LINENO" 5; } + fi + fi +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 +printf "%s\n" "$cross_compiling" >&6; } + +rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out +ac_clean_files=$ac_clean_files_save +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 +printf %s "checking for suffix of object files... " >&6; } +if test ${ac_cv_objext+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.o conftest.obj +if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +then : + for ac_file in conftest.o conftest.obj conftest.*; do + test -f "$ac_file" || continue; + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; + *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` + break;; + esac +done +else $as_nop + printf "%s\n" "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot compute suffix of object files: cannot compile +See \`config.log' for more details" "$LINENO" 5; } +fi +rm -f conftest.$ac_cv_objext conftest.$ac_ext +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 +printf "%s\n" "$ac_cv_objext" >&6; } +OBJEXT=$ac_cv_objext +ac_objext=$OBJEXT +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports GNU C" >&5 +printf %s "checking whether the compiler supports GNU C... " >&6; } +if test ${ac_cv_c_compiler_gnu+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_compiler_gnu=yes +else $as_nop + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +ac_cv_c_compiler_gnu=$ac_compiler_gnu + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 +printf "%s\n" "$ac_cv_c_compiler_gnu" >&6; } +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +if test $ac_compiler_gnu = yes; then + GCC=yes +else + GCC= +fi +ac_test_CFLAGS=${CFLAGS+y} +ac_save_CFLAGS=$CFLAGS +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 +printf %s "checking whether $CC accepts -g... " >&6; } +if test ${ac_cv_prog_cc_g+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_save_c_werror_flag=$ac_c_werror_flag + ac_c_werror_flag=yes + ac_cv_prog_cc_g=no + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_prog_cc_g=yes +else $as_nop + CFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + +else $as_nop + ac_c_werror_flag=$ac_save_c_werror_flag + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_prog_cc_g=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + ac_c_werror_flag=$ac_save_c_werror_flag +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 +printf "%s\n" "$ac_cv_prog_cc_g" >&6; } +if test $ac_test_CFLAGS; then + CFLAGS=$ac_save_CFLAGS +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi +ac_prog_cc_stdc=no +if test x$ac_prog_cc_stdc = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C11 features" >&5 +printf %s "checking for $CC option to enable C11 features... " >&6; } +if test ${ac_cv_prog_cc_c11+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_cv_prog_cc_c11=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_c_conftest_c11_program +_ACEOF +for ac_arg in '' -std=gnu11 +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_prog_cc_c11=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam + test "x$ac_cv_prog_cc_c11" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC +fi + +if test "x$ac_cv_prog_cc_c11" = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +printf "%s\n" "unsupported" >&6; } +else $as_nop + if test "x$ac_cv_prog_cc_c11" = x +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +printf "%s\n" "none needed" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c11" >&5 +printf "%s\n" "$ac_cv_prog_cc_c11" >&6; } + CC="$CC $ac_cv_prog_cc_c11" +fi + ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c11 + ac_prog_cc_stdc=c11 +fi +fi +if test x$ac_prog_cc_stdc = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C99 features" >&5 +printf %s "checking for $CC option to enable C99 features... " >&6; } +if test ${ac_cv_prog_cc_c99+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_cv_prog_cc_c99=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_c_conftest_c99_program +_ACEOF +for ac_arg in '' -std=gnu99 -std=c99 -c99 -qlanglvl=extc1x -qlanglvl=extc99 -AC99 -D_STDC_C99= +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_prog_cc_c99=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam + test "x$ac_cv_prog_cc_c99" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC +fi + +if test "x$ac_cv_prog_cc_c99" = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +printf "%s\n" "unsupported" >&6; } +else $as_nop + if test "x$ac_cv_prog_cc_c99" = x +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +printf "%s\n" "none needed" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5 +printf "%s\n" "$ac_cv_prog_cc_c99" >&6; } + CC="$CC $ac_cv_prog_cc_c99" +fi + ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99 + ac_prog_cc_stdc=c99 +fi +fi +if test x$ac_prog_cc_stdc = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C89 features" >&5 +printf %s "checking for $CC option to enable C89 features... " >&6; } +if test ${ac_cv_prog_cc_c89+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_cv_prog_cc_c89=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_c_conftest_c89_program +_ACEOF +for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_prog_cc_c89=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam + test "x$ac_cv_prog_cc_c89" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC +fi + +if test "x$ac_cv_prog_cc_c89" = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +printf "%s\n" "unsupported" >&6; } +else $as_nop + if test "x$ac_cv_prog_cc_c89" = x +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +printf "%s\n" "none needed" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 +printf "%s\n" "$ac_cv_prog_cc_c89" >&6; } + CC="$CC $ac_cv_prog_cc_c89" +fi + ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89 + ac_prog_cc_stdc=c89 +fi +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 +printf %s "checking whether $CC understands -c and -o together... " >&6; } +if test ${am_cv_prog_cc_c_o+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF + # Make sure it works both with $CC and with simple cc. + # Following AC_PROG_CC_C_O, we do the test twice because some + # compilers refuse to overwrite an existing .o file with -o, + # though they will create one. + am_cv_prog_cc_c_o=yes + for am_i in 1 2; do + if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 + ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } \ + && test -f conftest2.$ac_objext; then + : OK + else + am_cv_prog_cc_c_o=no + break + fi + done + rm -f core conftest* + unset am_i +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 +printf "%s\n" "$am_cv_prog_cc_c_o" >&6; } +if test "$am_cv_prog_cc_c_o" != yes; then + # Losing compiler, so override with the script. + # FIXME: It is wrong to rewrite CC. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__CC in this case, + # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" + CC="$am_aux_dir/compile $CC" +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +DEPDIR="${am__leading_dot}deps" + +ac_config_commands="$ac_config_commands depfiles" + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} supports the include directive" >&5 +printf %s "checking whether ${MAKE-make} supports the include directive... " >&6; } +cat > confinc.mk << 'END' +am__doit: + @echo this is the am__doit target >confinc.out +.PHONY: am__doit +END +am__include="#" +am__quote= +# BSD make does it like this. +echo '.include "confinc.mk" # ignored' > confmf.BSD +# Other make implementations (GNU, Solaris 10, AIX) do it like this. +echo 'include confinc.mk # ignored' > confmf.GNU +_am_result=no +for s in GNU BSD; do + { echo "$as_me:$LINENO: ${MAKE-make} -f confmf.$s && cat confinc.out" >&5 + (${MAKE-make} -f confmf.$s && cat confinc.out) >&5 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + case $?:`cat confinc.out 2>/dev/null` in @%:@( + '0:this is the am__doit target') : + case $s in @%:@( + BSD) : + am__include='.include' am__quote='"' ;; @%:@( + *) : + am__include='include' am__quote='' ;; +esac ;; @%:@( + *) : + ;; +esac + if test "$am__include" != "#"; then + _am_result="yes ($s style)" + break + fi +done +rm -f confinc.* confmf.* +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: ${_am_result}" >&5 +printf "%s\n" "${_am_result}" >&6; } + +@%:@ Check whether --enable-dependency-tracking was given. +if test ${enable_dependency_tracking+y} +then : + enableval=$enable_dependency_tracking; +fi + +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' + am__nodep='_no' +fi + if test "x$enable_dependency_tracking" != xno; then + AMDEP_TRUE= + AMDEP_FALSE='#' +else + AMDEP_TRUE='#' + AMDEP_FALSE= +fi + + + +depcc="$CC" am_compiler_list= + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +printf %s "checking dependency style of $depcc... " >&6; } +if test ${am_cv_CC_dependencies_compiler_type+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named 'D' -- because '-MD' means "put the output + # in D". + rm -rf conftest.dir + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CC_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + am__universal=false + case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with + # Solaris 10 /bin/sh. + echo '/* dummy */' > sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with '-c' and '-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle '-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs. + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # After this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested. + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok '-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CC_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CC_dependencies_compiler_type=none +fi + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 +printf "%s\n" "$am_cv_CC_dependencies_compiler_type" >&6; } +CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type + + if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then + am__fastdepCC_TRUE= + am__fastdepCC_FALSE='#' +else + am__fastdepCC_TRUE='#' + am__fastdepCC_FALSE= +fi + + + + + + + + +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +if test -z "$CXX"; then + if test -n "$CCC"; then + CXX=$CCC + else + if test -n "$ac_tool_prefix"; then + for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC clang++ + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_CXX+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$CXX"; then + ac_cv_prog_CXX="$CXX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CXX=$ac_cv_prog_CXX +if test -n "$CXX"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 +printf "%s\n" "$CXX" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + + test -n "$CXX" && break + done +fi +if test -z "$CXX"; then + ac_ct_CXX=$CXX + for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC clang++ +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_CXX+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_CXX"; then + ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CXX="$ac_prog" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CXX=$ac_cv_prog_ac_ct_CXX +if test -n "$ac_ct_CXX"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 +printf "%s\n" "$ac_ct_CXX" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + + test -n "$ac_ct_CXX" && break +done + + if test "x$ac_ct_CXX" = x; then + CXX="g++" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CXX=$ac_ct_CXX + fi +fi + + fi +fi +# Provide some information about the compiler. +printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports GNU C++" >&5 +printf %s "checking whether the compiler supports GNU C++... " >&6; } +if test ${ac_cv_cxx_compiler_gnu+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO" +then : + ac_compiler_gnu=yes +else $as_nop + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +ac_cv_cxx_compiler_gnu=$ac_compiler_gnu + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 +printf "%s\n" "$ac_cv_cxx_compiler_gnu" >&6; } +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + +if test $ac_compiler_gnu = yes; then + GXX=yes +else + GXX= +fi +ac_test_CXXFLAGS=${CXXFLAGS+y} +ac_save_CXXFLAGS=$CXXFLAGS +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 +printf %s "checking whether $CXX accepts -g... " >&6; } +if test ${ac_cv_prog_cxx_g+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_save_cxx_werror_flag=$ac_cxx_werror_flag + ac_cxx_werror_flag=yes + ac_cv_prog_cxx_g=no + CXXFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO" +then : + ac_cv_prog_cxx_g=yes +else $as_nop + CXXFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO" +then : + +else $as_nop + ac_cxx_werror_flag=$ac_save_cxx_werror_flag + CXXFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO" +then : + ac_cv_prog_cxx_g=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + ac_cxx_werror_flag=$ac_save_cxx_werror_flag +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 +printf "%s\n" "$ac_cv_prog_cxx_g" >&6; } +if test $ac_test_CXXFLAGS; then + CXXFLAGS=$ac_save_CXXFLAGS +elif test $ac_cv_prog_cxx_g = yes; then + if test "$GXX" = yes; then + CXXFLAGS="-g -O2" + else + CXXFLAGS="-g" + fi +else + if test "$GXX" = yes; then + CXXFLAGS="-O2" + else + CXXFLAGS= + fi +fi +ac_prog_cxx_stdcxx=no +if test x$ac_prog_cxx_stdcxx = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CXX option to enable C++11 features" >&5 +printf %s "checking for $CXX option to enable C++11 features... " >&6; } +if test ${ac_cv_prog_cxx_11+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_cv_prog_cxx_11=no +ac_save_CXX=$CXX +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_cxx_conftest_cxx11_program +_ACEOF +for ac_arg in '' -std=gnu++11 -std=gnu++0x -std=c++11 -std=c++0x -qlanglvl=extended0x -AA +do + CXX="$ac_save_CXX $ac_arg" + if ac_fn_cxx_try_compile "$LINENO" +then : + ac_cv_prog_cxx_cxx11=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam + test "x$ac_cv_prog_cxx_cxx11" != "xno" && break +done +rm -f conftest.$ac_ext +CXX=$ac_save_CXX +fi + +if test "x$ac_cv_prog_cxx_cxx11" = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +printf "%s\n" "unsupported" >&6; } +else $as_nop + if test "x$ac_cv_prog_cxx_cxx11" = x +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +printf "%s\n" "none needed" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_cxx11" >&5 +printf "%s\n" "$ac_cv_prog_cxx_cxx11" >&6; } + CXX="$CXX $ac_cv_prog_cxx_cxx11" +fi + ac_cv_prog_cxx_stdcxx=$ac_cv_prog_cxx_cxx11 + ac_prog_cxx_stdcxx=cxx11 +fi +fi +if test x$ac_prog_cxx_stdcxx = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CXX option to enable C++98 features" >&5 +printf %s "checking for $CXX option to enable C++98 features... " >&6; } +if test ${ac_cv_prog_cxx_98+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_cv_prog_cxx_98=no +ac_save_CXX=$CXX +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_cxx_conftest_cxx98_program +_ACEOF +for ac_arg in '' -std=gnu++98 -std=c++98 -qlanglvl=extended -AA +do + CXX="$ac_save_CXX $ac_arg" + if ac_fn_cxx_try_compile "$LINENO" +then : + ac_cv_prog_cxx_cxx98=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam + test "x$ac_cv_prog_cxx_cxx98" != "xno" && break +done +rm -f conftest.$ac_ext +CXX=$ac_save_CXX +fi + +if test "x$ac_cv_prog_cxx_cxx98" = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +printf "%s\n" "unsupported" >&6; } +else $as_nop + if test "x$ac_cv_prog_cxx_cxx98" = x +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +printf "%s\n" "none needed" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_cxx98" >&5 +printf "%s\n" "$ac_cv_prog_cxx_cxx98" >&6; } + CXX="$CXX $ac_cv_prog_cxx_cxx98" +fi + ac_cv_prog_cxx_stdcxx=$ac_cv_prog_cxx_cxx98 + ac_prog_cxx_stdcxx=cxx98 +fi +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +depcc="$CXX" am_compiler_list= + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +printf %s "checking dependency style of $depcc... " >&6; } +if test ${am_cv_CXX_dependencies_compiler_type+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named 'D' -- because '-MD' means "put the output + # in D". + rm -rf conftest.dir + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CXX_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + am__universal=false + case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with + # Solaris 10 /bin/sh. + echo '/* dummy */' > sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with '-c' and '-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle '-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs. + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # After this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested. + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok '-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CXX_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CXX_dependencies_compiler_type=none +fi + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 +printf "%s\n" "$am_cv_CXX_dependencies_compiler_type" >&6; } +CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type + + if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then + am__fastdepCXX_TRUE= + am__fastdepCXX_FALSE='#' +else + am__fastdepCXX_TRUE='#' + am__fastdepCXX_FALSE= +fi + + + + + # Make sure we can run config.sub. +$SHELL "${ac_aux_dir}config.sub" sun4 >/dev/null 2>&1 || + as_fn_error $? "cannot run $SHELL ${ac_aux_dir}config.sub" "$LINENO" 5 + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 +printf %s "checking build system type... " >&6; } +if test ${ac_cv_build+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_build_alias=$build_alias +test "x$ac_build_alias" = x && + ac_build_alias=`$SHELL "${ac_aux_dir}config.guess"` +test "x$ac_build_alias" = x && + as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 +ac_cv_build=`$SHELL "${ac_aux_dir}config.sub" $ac_build_alias` || + as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $ac_build_alias failed" "$LINENO" 5 + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 +printf "%s\n" "$ac_cv_build" >&6; } +case $ac_cv_build in +*-*-*) ;; +*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; +esac +build=$ac_cv_build +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_build +shift +build_cpu=$1 +build_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +build_os=$* +IFS=$ac_save_IFS +case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 +printf %s "checking host system type... " >&6; } +if test ${ac_cv_host+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test "x$host_alias" = x; then + ac_cv_host=$ac_cv_build +else + ac_cv_host=`$SHELL "${ac_aux_dir}config.sub" $host_alias` || + as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $host_alias failed" "$LINENO" 5 +fi + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 +printf "%s\n" "$ac_cv_host" >&6; } +case $ac_cv_host in +*-*-*) ;; +*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; +esac +host=$ac_cv_host +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_host +shift +host_cpu=$1 +host_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +host_os=$* +IFS=$ac_save_IFS +case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac + + +enable_win32_dll=yes + +case $host in +*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*) + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}as", so it can be a program name with args. +set dummy ${ac_tool_prefix}as; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_AS+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$AS"; then + ac_cv_prog_AS="$AS" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_AS="${ac_tool_prefix}as" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +AS=$ac_cv_prog_AS +if test -n "$AS"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $AS" >&5 +printf "%s\n" "$AS" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_AS"; then + ac_ct_AS=$AS + # Extract the first word of "as", so it can be a program name with args. +set dummy as; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_AS+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_AS"; then + ac_cv_prog_ac_ct_AS="$ac_ct_AS" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_AS="as" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_AS=$ac_cv_prog_ac_ct_AS +if test -n "$ac_ct_AS"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AS" >&5 +printf "%s\n" "$ac_ct_AS" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + if test "x$ac_ct_AS" = x; then + AS="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + AS=$ac_ct_AS + fi +else + AS="$ac_cv_prog_AS" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. +set dummy ${ac_tool_prefix}dlltool; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_DLLTOOL+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$DLLTOOL"; then + ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +DLLTOOL=$ac_cv_prog_DLLTOOL +if test -n "$DLLTOOL"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 +printf "%s\n" "$DLLTOOL" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_DLLTOOL"; then + ac_ct_DLLTOOL=$DLLTOOL + # Extract the first word of "dlltool", so it can be a program name with args. +set dummy dlltool; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_DLLTOOL+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_DLLTOOL"; then + ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_DLLTOOL="dlltool" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL +if test -n "$ac_ct_DLLTOOL"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 +printf "%s\n" "$ac_ct_DLLTOOL" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + if test "x$ac_ct_DLLTOOL" = x; then + DLLTOOL="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DLLTOOL=$ac_ct_DLLTOOL + fi +else + DLLTOOL="$ac_cv_prog_DLLTOOL" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. +set dummy ${ac_tool_prefix}objdump; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_OBJDUMP+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$OBJDUMP"; then + ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +OBJDUMP=$ac_cv_prog_OBJDUMP +if test -n "$OBJDUMP"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 +printf "%s\n" "$OBJDUMP" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OBJDUMP"; then + ac_ct_OBJDUMP=$OBJDUMP + # Extract the first word of "objdump", so it can be a program name with args. +set dummy objdump; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_OBJDUMP+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_OBJDUMP"; then + ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_OBJDUMP="objdump" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP +if test -n "$ac_ct_OBJDUMP"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 +printf "%s\n" "$ac_ct_OBJDUMP" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + if test "x$ac_ct_OBJDUMP" = x; then + OBJDUMP="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OBJDUMP=$ac_ct_OBJDUMP + fi +else + OBJDUMP="$ac_cv_prog_OBJDUMP" +fi + + ;; +esac + +test -z "$AS" && AS=as + + + + + +test -z "$DLLTOOL" && DLLTOOL=dlltool + + + + + +test -z "$OBJDUMP" && OBJDUMP=objdump + + + + + + + +case `pwd` in + *\ * | *\ *) + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 +printf "%s\n" "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;; +esac + + + +macro_version='2.4.6' +macro_revision='2.4.6' + + + + + + + + + + + + + + +ltmain=$ac_aux_dir/ltmain.sh + +# Backslashify metacharacters that are still active within +# double-quoted strings. +sed_quote_subst='s/\(["`$\\]\)/\\\1/g' + +# Same as above, but do not quote variable references. +double_quote_subst='s/\(["`\\]\)/\\\1/g' + +# Sed substitution to delay expansion of an escaped shell variable in a +# double_quote_subst'ed string. +delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' + +# Sed substitution to delay expansion of an escaped single quote. +delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' + +# Sed substitution to avoid accidental globbing in evaled expressions +no_glob_subst='s/\*/\\\*/g' + +ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5 +printf %s "checking how to print strings... " >&6; } +# Test print first, because it will be a builtin if present. +if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ + test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then + ECHO='print -r --' +elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then + ECHO='printf %s\n' +else + # Use this function as a fallback that always works. + func_fallback_echo () + { + eval 'cat <<_LTECHO_EOF +$1 +_LTECHO_EOF' + } + ECHO='func_fallback_echo' +fi + +# func_echo_all arg... +# Invoke $ECHO with all args, space-separated. +func_echo_all () +{ + $ECHO "" +} + +case $ECHO in + printf*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: printf" >&5 +printf "%s\n" "printf" >&6; } ;; + print*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: print -r" >&5 +printf "%s\n" "print -r" >&6; } ;; + *) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: cat" >&5 +printf "%s\n" "cat" >&6; } ;; +esac + + + + + + + + + + + + + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 +printf %s "checking for a sed that does not truncate output... " >&6; } +if test ${ac_cv_path_SED+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ + for ac_i in 1 2 3 4 5 6 7; do + ac_script="$ac_script$as_nl$ac_script" + done + echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed + { ac_script=; unset ac_script;} + if test -z "$SED"; then + ac_path_SED_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_prog in sed gsed + do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_SED="$as_dir$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_SED" || continue +# Check for GNU ac_path_SED and select it if it is found. + # Check for GNU $ac_path_SED +case `"$ac_path_SED" --version 2>&1` in +*GNU*) + ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; +*) + ac_count=0 + printf %s 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + printf "%s\n" '' >> "conftest.nl" + "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_SED_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_SED="$ac_path_SED" + ac_path_SED_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_SED_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_SED"; then + as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 + fi +else + ac_cv_path_SED=$SED +fi + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 +printf "%s\n" "$ac_cv_path_SED" >&6; } + SED="$ac_cv_path_SED" + rm -f conftest.sed + +test -z "$SED" && SED=sed +Xsed="$SED -e 1s/^X//" + + + + + + + + + + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 +printf %s "checking for grep that handles long lines and -e... " >&6; } +if test ${ac_cv_path_GREP+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -z "$GREP"; then + ac_path_GREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_prog in grep ggrep + do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_GREP="$as_dir$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_GREP" || continue +# Check for GNU ac_path_GREP and select it if it is found. + # Check for GNU $ac_path_GREP +case `"$ac_path_GREP" --version 2>&1` in +*GNU*) + ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; +*) + ac_count=0 + printf %s 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + printf "%s\n" 'GREP' >> "conftest.nl" + "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_GREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_GREP="$ac_path_GREP" + ac_path_GREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_GREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_GREP"; then + as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_GREP=$GREP +fi + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 +printf "%s\n" "$ac_cv_path_GREP" >&6; } + GREP="$ac_cv_path_GREP" + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 +printf %s "checking for egrep... " >&6; } +if test ${ac_cv_path_EGREP+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 + then ac_cv_path_EGREP="$GREP -E" + else + if test -z "$EGREP"; then + ac_path_EGREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_prog in egrep + do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_EGREP="$as_dir$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_EGREP" || continue +# Check for GNU ac_path_EGREP and select it if it is found. + # Check for GNU $ac_path_EGREP +case `"$ac_path_EGREP" --version 2>&1` in +*GNU*) + ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; +*) + ac_count=0 + printf %s 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + printf "%s\n" 'EGREP' >> "conftest.nl" + "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_EGREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_EGREP="$ac_path_EGREP" + ac_path_EGREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_EGREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_EGREP"; then + as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_EGREP=$EGREP +fi + + fi +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 +printf "%s\n" "$ac_cv_path_EGREP" >&6; } + EGREP="$ac_cv_path_EGREP" + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5 +printf %s "checking for fgrep... " >&6; } +if test ${ac_cv_path_FGREP+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 + then ac_cv_path_FGREP="$GREP -F" + else + if test -z "$FGREP"; then + ac_path_FGREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_prog in fgrep + do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_FGREP="$as_dir$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_FGREP" || continue +# Check for GNU ac_path_FGREP and select it if it is found. + # Check for GNU $ac_path_FGREP +case `"$ac_path_FGREP" --version 2>&1` in +*GNU*) + ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;; +*) + ac_count=0 + printf %s 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + printf "%s\n" 'FGREP' >> "conftest.nl" + "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_FGREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_FGREP="$ac_path_FGREP" + ac_path_FGREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_FGREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_FGREP"; then + as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_FGREP=$FGREP +fi + + fi +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5 +printf "%s\n" "$ac_cv_path_FGREP" >&6; } + FGREP="$ac_cv_path_FGREP" + + +test -z "$GREP" && GREP=grep + + + + + + + + + + + + + + + + + + + +@%:@ Check whether --with-gnu-ld was given. +if test ${with_gnu_ld+y} +then : + withval=$with_gnu_ld; test no = "$withval" || with_gnu_ld=yes +else $as_nop + with_gnu_ld=no +fi + +ac_prog=ld +if test yes = "$GCC"; then + # Check if gcc -print-prog-name=ld gives a path. + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 +printf %s "checking for ld used by $CC... " >&6; } + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return, which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [\\/]* | ?:[\\/]*) + re_direlt='/[^/][^/]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` + while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do + ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` + done + test -z "$LD" && LD=$ac_prog + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test yes = "$with_gnu_ld"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 +printf %s "checking for GNU ld... " >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 +printf %s "checking for non-GNU ld... " >&6; } +fi +if test ${lt_cv_path_LD+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -z "$LD"; then + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS=$lt_save_ifs + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD=$ac_dir/$ac_prog + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some variants of GNU ld only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 &5 +printf "%s\n" "$LD" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi +test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 +printf %s "checking if the linker ($LD) is GNU ld... " >&6; } +if test ${lt_cv_prog_gnu_ld+y} +then : + printf %s "(cached) " >&6 +else $as_nop + # I'd rather use --version here, but apparently some GNU lds only accept -v. +case `$LD -v 2>&1 &5 +printf "%s\n" "$lt_cv_prog_gnu_ld" >&6; } +with_gnu_ld=$lt_cv_prog_gnu_ld + + + + + + + + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5 +printf %s "checking for BSD- or MS-compatible name lister (nm)... " >&6; } +if test ${lt_cv_path_NM+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$NM"; then + # Let the user override the test. + lt_cv_path_NM=$NM +else + lt_nm_to_check=${ac_tool_prefix}nm + if test -n "$ac_tool_prefix" && test "$build" = "$host"; then + lt_nm_to_check="$lt_nm_to_check nm" + fi + for lt_tmp_nm in $lt_nm_to_check; do + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR + for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do + IFS=$lt_save_ifs + test -z "$ac_dir" && ac_dir=. + tmp_nm=$ac_dir/$lt_tmp_nm + if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext"; then + # Check to see if the nm accepts a BSD-compat flag. + # Adding the 'sed 1q' prevents false positives on HP-UX, which says: + # nm: unknown option "B" ignored + # Tru64's nm complains that /dev/null is an invalid object file + # MSYS converts /dev/null to NUL, MinGW nm treats NUL as empty + case $build_os in + mingw*) lt_bad_file=conftest.nm/nofile ;; + *) lt_bad_file=/dev/null ;; + esac + case `"$tmp_nm" -B $lt_bad_file 2>&1 | sed '1q'` in + *$lt_bad_file* | *'Invalid file or object type'*) + lt_cv_path_NM="$tmp_nm -B" + break 2 + ;; + *) + case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in + */dev/null*) + lt_cv_path_NM="$tmp_nm -p" + break 2 + ;; + *) + lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but + continue # so that we can try to find one that supports BSD flags + ;; + esac + ;; + esac + fi + done + IFS=$lt_save_ifs + done + : ${lt_cv_path_NM=no} +fi +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5 +printf "%s\n" "$lt_cv_path_NM" >&6; } +if test no != "$lt_cv_path_NM"; then + NM=$lt_cv_path_NM +else + # Didn't find any BSD compatible name lister, look for dumpbin. + if test -n "$DUMPBIN"; then : + # Let the user override the test. + else + if test -n "$ac_tool_prefix"; then + for ac_prog in dumpbin "link -dump" + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_DUMPBIN+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$DUMPBIN"; then + ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +DUMPBIN=$ac_cv_prog_DUMPBIN +if test -n "$DUMPBIN"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5 +printf "%s\n" "$DUMPBIN" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + + test -n "$DUMPBIN" && break + done +fi +if test -z "$DUMPBIN"; then + ac_ct_DUMPBIN=$DUMPBIN + for ac_prog in dumpbin "link -dump" +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_DUMPBIN+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_DUMPBIN"; then + ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_DUMPBIN="$ac_prog" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN +if test -n "$ac_ct_DUMPBIN"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5 +printf "%s\n" "$ac_ct_DUMPBIN" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + + test -n "$ac_ct_DUMPBIN" && break +done + + if test "x$ac_ct_DUMPBIN" = x; then + DUMPBIN=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DUMPBIN=$ac_ct_DUMPBIN + fi +fi + + case `$DUMPBIN -symbols -headers /dev/null 2>&1 | sed '1q'` in + *COFF*) + DUMPBIN="$DUMPBIN -symbols -headers" + ;; + *) + DUMPBIN=: + ;; + esac + fi + + if test : != "$DUMPBIN"; then + NM=$DUMPBIN + fi +fi +test -z "$NM" && NM=nm + + + + + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5 +printf %s "checking the name lister ($NM) interface... " >&6; } +if test ${lt_cv_nm_interface+y} +then : + printf %s "(cached) " >&6 +else $as_nop + lt_cv_nm_interface="BSD nm" + echo "int some_variable = 0;" > conftest.$ac_ext + (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5) + (eval "$ac_compile" 2>conftest.err) + cat conftest.err >&5 + (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5) + (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) + cat conftest.err >&5 + (eval echo "\"\$as_me:$LINENO: output\"" >&5) + cat conftest.out >&5 + if $GREP 'External.*some_variable' conftest.out > /dev/null; then + lt_cv_nm_interface="MS dumpbin" + fi + rm -f conftest* +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5 +printf "%s\n" "$lt_cv_nm_interface" >&6; } + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 +printf %s "checking whether ln -s works... " >&6; } +LN_S=$as_ln_s +if test "$LN_S" = "ln -s"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 +printf "%s\n" "no, using $LN_S" >&6; } +fi + +# find the maximum length of command line arguments +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5 +printf %s "checking the maximum length of command line arguments... " >&6; } +if test ${lt_cv_sys_max_cmd_len+y} +then : + printf %s "(cached) " >&6 +else $as_nop + i=0 + teststring=ABCD + + case $build_os in + msdosdjgpp*) + # On DJGPP, this test can blow up pretty badly due to problems in libc + # (any single argument exceeding 2000 bytes causes a buffer overrun + # during glob expansion). Even if it were fixed, the result of this + # check would be larger than it should be. + lt_cv_sys_max_cmd_len=12288; # 12K is about right + ;; + + gnu*) + # Under GNU Hurd, this test is not required because there is + # no limit to the length of command line arguments. + # Libtool will interpret -1 as no limit whatsoever + lt_cv_sys_max_cmd_len=-1; + ;; + + cygwin* | mingw* | cegcc*) + # On Win9x/ME, this test blows up -- it succeeds, but takes + # about 5 minutes as the teststring grows exponentially. + # Worse, since 9x/ME are not pre-emptively multitasking, + # you end up with a "frozen" computer, even though with patience + # the test eventually succeeds (with a max line length of 256k). + # Instead, let's just punt: use the minimum linelength reported by + # all of the supported platforms: 8192 (on NT/2K/XP). + lt_cv_sys_max_cmd_len=8192; + ;; + + mint*) + # On MiNT this can take a long time and run out of memory. + lt_cv_sys_max_cmd_len=8192; + ;; + + amigaos*) + # On AmigaOS with pdksh, this test takes hours, literally. + # So we just punt and use a minimum line length of 8192. + lt_cv_sys_max_cmd_len=8192; + ;; + + bitrig* | darwin* | dragonfly* | freebsd* | netbsd* | openbsd*) + # This has been around since 386BSD, at least. Likely further. + if test -x /sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` + elif test -x /usr/sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` + else + lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs + fi + # And add a safety zone + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + ;; + + interix*) + # We know the value 262144 and hardcode it with a safety zone (like BSD) + lt_cv_sys_max_cmd_len=196608 + ;; + + os2*) + # The test takes a long time on OS/2. + lt_cv_sys_max_cmd_len=8192 + ;; + + osf*) + # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure + # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not + # nice to cause kernel panics so lets avoid the loop below. + # First set a reasonable default. + lt_cv_sys_max_cmd_len=16384 + # + if test -x /sbin/sysconfig; then + case `/sbin/sysconfig -q proc exec_disable_arg_limit` in + *1*) lt_cv_sys_max_cmd_len=-1 ;; + esac + fi + ;; + sco3.2v5*) + lt_cv_sys_max_cmd_len=102400 + ;; + sysv5* | sco5v6* | sysv4.2uw2*) + kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` + if test -n "$kargmax"; then + lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[ ]//'` + else + lt_cv_sys_max_cmd_len=32768 + fi + ;; + *) + lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` + if test -n "$lt_cv_sys_max_cmd_len" && \ + test undefined != "$lt_cv_sys_max_cmd_len"; then + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + else + # Make teststring a little bigger before we do anything with it. + # a 1K string should be a reasonable start. + for i in 1 2 3 4 5 6 7 8; do + teststring=$teststring$teststring + done + SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} + # If test is not a shell built-in, we'll probably end up computing a + # maximum length that is only half of the actual maximum length, but + # we can't tell. + while { test X`env echo "$teststring$teststring" 2>/dev/null` \ + = "X$teststring$teststring"; } >/dev/null 2>&1 && + test 17 != "$i" # 1/2 MB should be enough + do + i=`expr $i + 1` + teststring=$teststring$teststring + done + # Only check the string length outside the loop. + lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` + teststring= + # Add a significant safety factor because C++ compilers can tack on + # massive amounts of additional arguments before passing them to the + # linker. It appears as though 1/2 is a usable value. + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` + fi + ;; + esac + +fi + +if test -n "$lt_cv_sys_max_cmd_len"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5 +printf "%s\n" "$lt_cv_sys_max_cmd_len" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none" >&5 +printf "%s\n" "none" >&6; } +fi +max_cmd_len=$lt_cv_sys_max_cmd_len + + + + + + +: ${CP="cp -f"} +: ${MV="mv -f"} +: ${RM="rm -f"} + +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + lt_unset=unset +else + lt_unset=false +fi + + + + + +# test EBCDIC or ASCII +case `echo X|tr X '\101'` in + A) # ASCII based system + # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr + lt_SP2NL='tr \040 \012' + lt_NL2SP='tr \015\012 \040\040' + ;; + *) # EBCDIC based system + lt_SP2NL='tr \100 \n' + lt_NL2SP='tr \r\n \100\100' + ;; +esac + + + + + + + + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5 +printf %s "checking how to convert $build file names to $host format... " >&6; } +if test ${lt_cv_to_host_file_cmd+y} +then : + printf %s "(cached) " >&6 +else $as_nop + case $host in + *-*-mingw* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 + ;; + *-*-cygwin* ) + lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 + ;; + * ) # otherwise, assume *nix + lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 + ;; + esac + ;; + *-*-cygwin* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin + ;; + *-*-cygwin* ) + lt_cv_to_host_file_cmd=func_convert_file_noop + ;; + * ) # otherwise, assume *nix + lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin + ;; + esac + ;; + * ) # unhandled hosts (and "normal" native builds) + lt_cv_to_host_file_cmd=func_convert_file_noop + ;; +esac + +fi + +to_host_file_cmd=$lt_cv_to_host_file_cmd +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5 +printf "%s\n" "$lt_cv_to_host_file_cmd" >&6; } + + + + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5 +printf %s "checking how to convert $build file names to toolchain format... " >&6; } +if test ${lt_cv_to_tool_file_cmd+y} +then : + printf %s "(cached) " >&6 +else $as_nop + #assume ordinary cross tools, or native build. +lt_cv_to_tool_file_cmd=func_convert_file_noop +case $host in + *-*-mingw* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 + ;; + esac + ;; +esac + +fi + +to_tool_file_cmd=$lt_cv_to_tool_file_cmd +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5 +printf "%s\n" "$lt_cv_to_tool_file_cmd" >&6; } + + + + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5 +printf %s "checking for $LD option to reload object files... " >&6; } +if test ${lt_cv_ld_reload_flag+y} +then : + printf %s "(cached) " >&6 +else $as_nop + lt_cv_ld_reload_flag='-r' +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5 +printf "%s\n" "$lt_cv_ld_reload_flag" >&6; } +reload_flag=$lt_cv_ld_reload_flag +case $reload_flag in +"" | " "*) ;; +*) reload_flag=" $reload_flag" ;; +esac +reload_cmds='$LD$reload_flag -o $output$reload_objs' +case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + if test yes != "$GCC"; then + reload_cmds=false + fi + ;; + darwin*) + if test yes = "$GCC"; then + reload_cmds='$LTCC $LTCFLAGS -nostdlib $wl-r -o $output$reload_objs' + else + reload_cmds='$LD$reload_flag -o $output$reload_objs' + fi + ;; +esac + + + + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. +set dummy ${ac_tool_prefix}objdump; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_OBJDUMP+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$OBJDUMP"; then + ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +OBJDUMP=$ac_cv_prog_OBJDUMP +if test -n "$OBJDUMP"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 +printf "%s\n" "$OBJDUMP" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OBJDUMP"; then + ac_ct_OBJDUMP=$OBJDUMP + # Extract the first word of "objdump", so it can be a program name with args. +set dummy objdump; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_OBJDUMP+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_OBJDUMP"; then + ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_OBJDUMP="objdump" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP +if test -n "$ac_ct_OBJDUMP"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 +printf "%s\n" "$ac_ct_OBJDUMP" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + if test "x$ac_ct_OBJDUMP" = x; then + OBJDUMP="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OBJDUMP=$ac_ct_OBJDUMP + fi +else + OBJDUMP="$ac_cv_prog_OBJDUMP" +fi + +test -z "$OBJDUMP" && OBJDUMP=objdump + + + + + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5 +printf %s "checking how to recognize dependent libraries... " >&6; } +if test ${lt_cv_deplibs_check_method+y} +then : + printf %s "(cached) " >&6 +else $as_nop + lt_cv_file_magic_cmd='$MAGIC_CMD' +lt_cv_file_magic_test_file= +lt_cv_deplibs_check_method='unknown' +# Need to set the preceding variable on all platforms that support +# interlibrary dependencies. +# 'none' -- dependencies not supported. +# 'unknown' -- same as none, but documents that we really don't know. +# 'pass_all' -- all dependencies passed with no checks. +# 'test_compile' -- check by making test program. +# 'file_magic [[regex]]' -- check by looking for files in library path +# that responds to the $file_magic_cmd with a given extended regex. +# If you have 'file' or equivalent on your system and you're not sure +# whether 'pass_all' will *always* work, you probably want this one. + +case $host_os in +aix[4-9]*) + lt_cv_deplibs_check_method=pass_all + ;; + +beos*) + lt_cv_deplibs_check_method=pass_all + ;; + +bsdi[45]*) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' + lt_cv_file_magic_cmd='/usr/bin/file -L' + lt_cv_file_magic_test_file=/shlib/libc.so + ;; + +cygwin*) + # func_win32_libid is a shell function defined in ltmain.sh + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + ;; + +mingw* | pw32*) + # Base MSYS/MinGW do not provide the 'file' command needed by + # func_win32_libid shell function, so use a weaker test based on 'objdump', + # unless we find 'file', for example because we are cross-compiling. + if ( file / ) >/dev/null 2>&1; then + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + else + # Keep this pattern in sync with the one in func_win32_libid. + lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' + lt_cv_file_magic_cmd='$OBJDUMP -f' + fi + ;; + +cegcc*) + # use the weaker test based on 'objdump'. See mingw*. + lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' + lt_cv_file_magic_cmd='$OBJDUMP -f' + ;; + +darwin* | rhapsody*) + lt_cv_deplibs_check_method=pass_all + ;; + +freebsd* | dragonfly*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + case $host_cpu in + i*86 ) + # Not sure whether the presence of OpenBSD here was a mistake. + # Let's accept both of them until this is cleared up. + lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` + ;; + esac + else + lt_cv_deplibs_check_method=pass_all + fi + ;; + +haiku*) + lt_cv_deplibs_check_method=pass_all + ;; + +hpux10.20* | hpux11*) + lt_cv_file_magic_cmd=/usr/bin/file + case $host_cpu in + ia64*) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64' + lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so + ;; + hppa*64*) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]' + lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl + ;; + *) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library' + lt_cv_file_magic_test_file=/usr/lib/libc.sl + ;; + esac + ;; + +interix[3-9]*) + # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$' + ;; + +irix5* | irix6* | nonstopux*) + case $LD in + *-32|*"-32 ") libmagic=32-bit;; + *-n32|*"-n32 ") libmagic=N32;; + *-64|*"-64 ") libmagic=64-bit;; + *) libmagic=never-match;; + esac + lt_cv_deplibs_check_method=pass_all + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + lt_cv_deplibs_check_method=pass_all + ;; + +netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$' + fi + ;; + +newos6*) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=/usr/lib/libnls.so + ;; + +*nto* | *qnx*) + lt_cv_deplibs_check_method=pass_all + ;; + +openbsd* | bitrig*) + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' + fi + ;; + +osf3* | osf4* | osf5*) + lt_cv_deplibs_check_method=pass_all + ;; + +rdos*) + lt_cv_deplibs_check_method=pass_all + ;; + +solaris*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv4 | sysv4.3*) + case $host_vendor in + motorola) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]' + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` + ;; + ncr) + lt_cv_deplibs_check_method=pass_all + ;; + sequent) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' + ;; + sni) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib" + lt_cv_file_magic_test_file=/lib/libc.so + ;; + siemens) + lt_cv_deplibs_check_method=pass_all + ;; + pc) + lt_cv_deplibs_check_method=pass_all + ;; + esac + ;; + +tpf*) + lt_cv_deplibs_check_method=pass_all + ;; +os2*) + lt_cv_deplibs_check_method=pass_all + ;; +esac + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5 +printf "%s\n" "$lt_cv_deplibs_check_method" >&6; } + +file_magic_glob= +want_nocaseglob=no +if test "$build" = "$host"; then + case $host_os in + mingw* | pw32*) + if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then + want_nocaseglob=yes + else + file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[\1]\/[\1]\/g;/g"` + fi + ;; + esac +fi + +file_magic_cmd=$lt_cv_file_magic_cmd +deplibs_check_method=$lt_cv_deplibs_check_method +test -z "$deplibs_check_method" && deplibs_check_method=unknown + + + + + + + + + + + + + + + + + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. +set dummy ${ac_tool_prefix}dlltool; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_DLLTOOL+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$DLLTOOL"; then + ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +DLLTOOL=$ac_cv_prog_DLLTOOL +if test -n "$DLLTOOL"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 +printf "%s\n" "$DLLTOOL" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_DLLTOOL"; then + ac_ct_DLLTOOL=$DLLTOOL + # Extract the first word of "dlltool", so it can be a program name with args. +set dummy dlltool; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_DLLTOOL+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_DLLTOOL"; then + ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_DLLTOOL="dlltool" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL +if test -n "$ac_ct_DLLTOOL"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 +printf "%s\n" "$ac_ct_DLLTOOL" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + if test "x$ac_ct_DLLTOOL" = x; then + DLLTOOL="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DLLTOOL=$ac_ct_DLLTOOL + fi +else + DLLTOOL="$ac_cv_prog_DLLTOOL" +fi + +test -z "$DLLTOOL" && DLLTOOL=dlltool + + + + + + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5 +printf %s "checking how to associate runtime and link libraries... " >&6; } +if test ${lt_cv_sharedlib_from_linklib_cmd+y} +then : + printf %s "(cached) " >&6 +else $as_nop + lt_cv_sharedlib_from_linklib_cmd='unknown' + +case $host_os in +cygwin* | mingw* | pw32* | cegcc*) + # two different shell functions defined in ltmain.sh; + # decide which one to use based on capabilities of $DLLTOOL + case `$DLLTOOL --help 2>&1` in + *--identify-strict*) + lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib + ;; + *) + lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback + ;; + esac + ;; +*) + # fallback: assume linklib IS sharedlib + lt_cv_sharedlib_from_linklib_cmd=$ECHO + ;; +esac + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5 +printf "%s\n" "$lt_cv_sharedlib_from_linklib_cmd" >&6; } +sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd +test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO + + + + + + + + +if test -n "$ac_tool_prefix"; then + for ac_prog in ar + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_AR+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$AR"; then + ac_cv_prog_AR="$AR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_AR="$ac_tool_prefix$ac_prog" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +AR=$ac_cv_prog_AR +if test -n "$AR"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 +printf "%s\n" "$AR" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + + test -n "$AR" && break + done +fi +if test -z "$AR"; then + ac_ct_AR=$AR + for ac_prog in ar +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_AR+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_AR"; then + ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_AR="$ac_prog" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_AR=$ac_cv_prog_ac_ct_AR +if test -n "$ac_ct_AR"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 +printf "%s\n" "$ac_ct_AR" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + + test -n "$ac_ct_AR" && break +done + + if test "x$ac_ct_AR" = x; then + AR="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + AR=$ac_ct_AR + fi +fi + +: ${AR=ar} +: ${AR_FLAGS=cru} + + + + + + + + + + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5 +printf %s "checking for archiver @FILE support... " >&6; } +if test ${lt_cv_ar_at_file+y} +then : + printf %s "(cached) " >&6 +else $as_nop + lt_cv_ar_at_file=no + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + echo conftest.$ac_objext > conftest.lst + lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5' + { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 + (eval $lt_ar_try) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if test 0 -eq "$ac_status"; then + # Ensure the archiver fails upon bogus file names. + rm -f conftest.$ac_objext libconftest.a + { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 + (eval $lt_ar_try) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if test 0 -ne "$ac_status"; then + lt_cv_ar_at_file=@ + fi + fi + rm -f conftest.* libconftest.a + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5 +printf "%s\n" "$lt_cv_ar_at_file" >&6; } + +if test no = "$lt_cv_ar_at_file"; then + archiver_list_spec= +else + archiver_list_spec=$lt_cv_ar_at_file +fi + + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. +set dummy ${ac_tool_prefix}strip; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_STRIP+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$STRIP"; then + ac_cv_prog_STRIP="$STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_STRIP="${ac_tool_prefix}strip" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +STRIP=$ac_cv_prog_STRIP +if test -n "$STRIP"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 +printf "%s\n" "$STRIP" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_STRIP"; then + ac_ct_STRIP=$STRIP + # Extract the first word of "strip", so it can be a program name with args. +set dummy strip; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_STRIP+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_STRIP"; then + ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_STRIP="strip" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP +if test -n "$ac_ct_STRIP"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 +printf "%s\n" "$ac_ct_STRIP" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + if test "x$ac_ct_STRIP" = x; then + STRIP=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + STRIP=$ac_ct_STRIP + fi +else + STRIP="$ac_cv_prog_STRIP" +fi + +test -z "$STRIP" && STRIP=: + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. +set dummy ${ac_tool_prefix}ranlib; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_RANLIB+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$RANLIB"; then + ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +RANLIB=$ac_cv_prog_RANLIB +if test -n "$RANLIB"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 +printf "%s\n" "$RANLIB" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_RANLIB"; then + ac_ct_RANLIB=$RANLIB + # Extract the first word of "ranlib", so it can be a program name with args. +set dummy ranlib; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_RANLIB+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_RANLIB"; then + ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_RANLIB="ranlib" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB +if test -n "$ac_ct_RANLIB"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 +printf "%s\n" "$ac_ct_RANLIB" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + if test "x$ac_ct_RANLIB" = x; then + RANLIB=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + RANLIB=$ac_ct_RANLIB + fi +else + RANLIB="$ac_cv_prog_RANLIB" +fi + +test -z "$RANLIB" && RANLIB=: + + + + + + +# Determine commands to create old-style static archives. +old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' +old_postinstall_cmds='chmod 644 $oldlib' +old_postuninstall_cmds= + +if test -n "$RANLIB"; then + case $host_os in + bitrig* | openbsd*) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" + ;; + *) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" + ;; + esac + old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" +fi + +case $host_os in + darwin*) + lock_old_archive_extraction=yes ;; + *) + lock_old_archive_extraction=no ;; +esac + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC + + +# Check for command to grab the raw symbol name followed by C symbol from nm. +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5 +printf %s "checking command to parse $NM output from $compiler object... " >&6; } +if test ${lt_cv_sys_global_symbol_pipe+y} +then : + printf %s "(cached) " >&6 +else $as_nop + +# These are sane defaults that work on at least a few old systems. +# [They come from Ultrix. What could be older than Ultrix?!! ;)] + +# Character class describing NM global symbol codes. +symcode='[BCDEGRST]' + +# Regexp to match symbols that can be accessed directly from C. +sympat='\([_A-Za-z][_A-Za-z0-9]*\)' + +# Define system-specific variables. +case $host_os in +aix*) + symcode='[BCDT]' + ;; +cygwin* | mingw* | pw32* | cegcc*) + symcode='[ABCDGISTW]' + ;; +hpux*) + if test ia64 = "$host_cpu"; then + symcode='[ABCDEGRST]' + fi + ;; +irix* | nonstopux*) + symcode='[BCDEGRST]' + ;; +osf*) + symcode='[BCDEGQRST]' + ;; +solaris*) + symcode='[BDRT]' + ;; +sco3.2v5*) + symcode='[DT]' + ;; +sysv4.2uw2*) + symcode='[DT]' + ;; +sysv5* | sco5v6* | unixware* | OpenUNIX*) + symcode='[ABDT]' + ;; +sysv4) + symcode='[DFNSTU]' + ;; +esac + +# If we're using GNU nm, then use its standard symbol codes. +case `$NM -V 2>&1` in +*GNU* | *'with BFD'*) + symcode='[ABCDGIRSTW]' ;; +esac + +if test "$lt_cv_nm_interface" = "MS dumpbin"; then + # Gets list of data symbols to import. + lt_cv_sys_global_symbol_to_import="sed -n -e 's/^I .* \(.*\)$/\1/p'" + # Adjust the below global symbol transforms to fixup imported variables. + lt_cdecl_hook=" -e 's/^I .* \(.*\)$/extern __declspec(dllimport) char \1;/p'" + lt_c_name_hook=" -e 's/^I .* \(.*\)$/ {\"\1\", (void *) 0},/p'" + lt_c_name_lib_hook="\ + -e 's/^I .* \(lib.*\)$/ {\"\1\", (void *) 0},/p'\ + -e 's/^I .* \(.*\)$/ {\"lib\1\", (void *) 0},/p'" +else + # Disable hooks by default. + lt_cv_sys_global_symbol_to_import= + lt_cdecl_hook= + lt_c_name_hook= + lt_c_name_lib_hook= +fi + +# Transform an extracted symbol line into a proper C declaration. +# Some systems (esp. on ia64) link data and code symbols differently, +# so use this general approach. +lt_cv_sys_global_symbol_to_cdecl="sed -n"\ +$lt_cdecl_hook\ +" -e 's/^T .* \(.*\)$/extern int \1();/p'"\ +" -e 's/^$symcode$symcode* .* \(.*\)$/extern char \1;/p'" + +# Transform an extracted symbol line into symbol name and symbol address +lt_cv_sys_global_symbol_to_c_name_address="sed -n"\ +$lt_c_name_hook\ +" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ +" -e 's/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/p'" + +# Transform an extracted symbol line into symbol name with lib prefix and +# symbol address. +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n"\ +$lt_c_name_lib_hook\ +" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ +" -e 's/^$symcode$symcode* .* \(lib.*\)$/ {\"\1\", (void *) \&\1},/p'"\ +" -e 's/^$symcode$symcode* .* \(.*\)$/ {\"lib\1\", (void *) \&\1},/p'" + +# Handle CRLF in mingw tool chain +opt_cr= +case $build_os in +mingw*) + opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp + ;; +esac + +# Try without a prefix underscore, then with it. +for ac_symprfx in "" "_"; do + + # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. + symxfrm="\\1 $ac_symprfx\\2 \\2" + + # Write the raw and C identifiers. + if test "$lt_cv_nm_interface" = "MS dumpbin"; then + # Fake it for dumpbin and say T for any non-static function, + # D for any global variable and I for any imported variable. + # Also find C++ and __fastcall symbols from MSVC++, + # which start with @ or ?. + lt_cv_sys_global_symbol_pipe="$AWK '"\ +" {last_section=section; section=\$ 3};"\ +" /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ +" /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ +" /^ *Symbol name *: /{split(\$ 0,sn,\":\"); si=substr(sn[2],2)};"\ +" /^ *Type *: code/{print \"T\",si,substr(si,length(prfx))};"\ +" /^ *Type *: data/{print \"I\",si,substr(si,length(prfx))};"\ +" \$ 0!~/External *\|/{next};"\ +" / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ +" {if(hide[section]) next};"\ +" {f=\"D\"}; \$ 0~/\(\).*\|/{f=\"T\"};"\ +" {split(\$ 0,a,/\||\r/); split(a[2],s)};"\ +" s[1]~/^[@?]/{print f,s[1],s[1]; next};"\ +" s[1]~prfx {split(s[1],t,\"@\"); print f,t[1],substr(t[1],length(prfx))}"\ +" ' prfx=^$ac_symprfx" + else + lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" + fi + lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" + + # Check to see that the pipe works correctly. + pipe_works=no + + rm -f conftest* + cat > conftest.$ac_ext <<_LT_EOF +#ifdef __cplusplus +extern "C" { +#endif +char nm_test_var; +void nm_test_func(void); +void nm_test_func(void){} +#ifdef __cplusplus +} +#endif +int main(){nm_test_var='a';nm_test_func();return(0);} +_LT_EOF + + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + # Now try to grab the symbols. + nlist=conftest.nm + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist\""; } >&5 + (eval $NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s "$nlist"; then + # Try sorting and uniquifying the output. + if sort "$nlist" | uniq > "$nlist"T; then + mv -f "$nlist"T "$nlist" + else + rm -f "$nlist"T + fi + + # Make sure that we snagged all the symbols we need. + if $GREP ' nm_test_var$' "$nlist" >/dev/null; then + if $GREP ' nm_test_func$' "$nlist" >/dev/null; then + cat <<_LT_EOF > conftest.$ac_ext +/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ +#if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE +/* DATA imports from DLLs on WIN32 can't be const, because runtime + relocations are performed -- see ld's documentation on pseudo-relocs. */ +# define LT@&t@_DLSYM_CONST +#elif defined __osf__ +/* This system does not cope well with relocations in const data. */ +# define LT@&t@_DLSYM_CONST +#else +# define LT@&t@_DLSYM_CONST const +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +_LT_EOF + # Now generate the symbol file. + eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' + + cat <<_LT_EOF >> conftest.$ac_ext + +/* The mapping between symbol names and symbols. */ +LT@&t@_DLSYM_CONST struct { + const char *name; + void *address; +} +lt__PROGRAM__LTX_preloaded_symbols[] = +{ + { "@PROGRAM@", (void *) 0 }, +_LT_EOF + $SED "s/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext + cat <<\_LT_EOF >> conftest.$ac_ext + {0, (void *) 0} +}; + +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt__PROGRAM__LTX_preloaded_symbols; +} +#endif + +#ifdef __cplusplus +} +#endif +_LT_EOF + # Now try linking the two files. + mv conftest.$ac_objext conftstm.$ac_objext + lt_globsym_save_LIBS=$LIBS + lt_globsym_save_CFLAGS=$CFLAGS + LIBS=conftstm.$ac_objext + CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 + (eval $ac_link) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s conftest$ac_exeext; then + pipe_works=yes + fi + LIBS=$lt_globsym_save_LIBS + CFLAGS=$lt_globsym_save_CFLAGS + else + echo "cannot find nm_test_func in $nlist" >&5 + fi + else + echo "cannot find nm_test_var in $nlist" >&5 + fi + else + echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5 + fi + else + echo "$progname: failed program was:" >&5 + cat conftest.$ac_ext >&5 + fi + rm -rf conftest* conftst* + + # Do not use the global_symbol_pipe unless it works. + if test yes = "$pipe_works"; then + break + else + lt_cv_sys_global_symbol_pipe= + fi +done + +fi + +if test -z "$lt_cv_sys_global_symbol_pipe"; then + lt_cv_sys_global_symbol_to_cdecl= +fi +if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: failed" >&5 +printf "%s\n" "failed" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: ok" >&5 +printf "%s\n" "ok" >&6; } +fi + +# Response file support. +if test "$lt_cv_nm_interface" = "MS dumpbin"; then + nm_file_list_spec='@' +elif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then + nm_file_list_spec='@' +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5 +printf %s "checking for sysroot... " >&6; } + +@%:@ Check whether --with-sysroot was given. +if test ${with_sysroot+y} +then : + withval=$with_sysroot; +else $as_nop + with_sysroot=no +fi + + +lt_sysroot= +case $with_sysroot in #( + yes) + if test yes = "$GCC"; then + lt_sysroot=`$CC --print-sysroot 2>/dev/null` + fi + ;; #( + /*) + lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` + ;; #( + no|'') + ;; #( + *) + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $with_sysroot" >&5 +printf "%s\n" "$with_sysroot" >&6; } + as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5 + ;; +esac + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5 +printf "%s\n" "${lt_sysroot:-no}" >&6; } + + + + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a working dd" >&5 +printf %s "checking for a working dd... " >&6; } +if test ${ac_cv_path_lt_DD+y} +then : + printf %s "(cached) " >&6 +else $as_nop + printf 0123456789abcdef0123456789abcdef >conftest.i +cat conftest.i conftest.i >conftest2.i +: ${lt_DD:=$DD} +if test -z "$lt_DD"; then + ac_path_lt_DD_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_prog in dd + do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_lt_DD="$as_dir$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_lt_DD" || continue +if "$ac_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then + cmp -s conftest.i conftest.out \ + && ac_cv_path_lt_DD="$ac_path_lt_DD" ac_path_lt_DD_found=: +fi + $ac_path_lt_DD_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_lt_DD"; then + : + fi +else + ac_cv_path_lt_DD=$lt_DD +fi + +rm -f conftest.i conftest2.i conftest.out +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_lt_DD" >&5 +printf "%s\n" "$ac_cv_path_lt_DD" >&6; } + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to truncate binary pipes" >&5 +printf %s "checking how to truncate binary pipes... " >&6; } +if test ${lt_cv_truncate_bin+y} +then : + printf %s "(cached) " >&6 +else $as_nop + printf 0123456789abcdef0123456789abcdef >conftest.i +cat conftest.i conftest.i >conftest2.i +lt_cv_truncate_bin= +if "$ac_cv_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then + cmp -s conftest.i conftest.out \ + && lt_cv_truncate_bin="$ac_cv_path_lt_DD bs=4096 count=1" +fi +rm -f conftest.i conftest2.i conftest.out +test -z "$lt_cv_truncate_bin" && lt_cv_truncate_bin="$SED -e 4q" +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_truncate_bin" >&5 +printf "%s\n" "$lt_cv_truncate_bin" >&6; } + + + + + + + +# Calculate cc_basename. Skip known compiler wrappers and cross-prefix. +func_cc_basename () +{ + for cc_temp in @S|@*""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac + done + func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` +} + +@%:@ Check whether --enable-libtool-lock was given. +if test ${enable_libtool_lock+y} +then : + enableval=$enable_libtool_lock; +fi + +test no = "$enable_libtool_lock" || enable_libtool_lock=yes + +# Some flags need to be propagated to the compiler or linker for good +# libtool support. +case $host in +ia64-*-hpux*) + # Find out what ABI is being produced by ac_compile, and set mode + # options accordingly. + echo 'int i;' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + case `/usr/bin/file conftest.$ac_objext` in + *ELF-32*) + HPUX_IA64_MODE=32 + ;; + *ELF-64*) + HPUX_IA64_MODE=64 + ;; + esac + fi + rm -rf conftest* + ;; +*-*-irix6*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. + echo '#line '$LINENO' "configure"' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + if test yes = "$lt_cv_prog_gnu_ld"; then + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -melf32bsmip" + ;; + *N32*) + LD="${LD-ld} -melf32bmipn32" + ;; + *64-bit*) + LD="${LD-ld} -melf64bmip" + ;; + esac + else + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -32" + ;; + *N32*) + LD="${LD-ld} -n32" + ;; + *64-bit*) + LD="${LD-ld} -64" + ;; + esac + fi + fi + rm -rf conftest* + ;; + +mips64*-*linux*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. + echo '#line '$LINENO' "configure"' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + emul=elf + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + emul="${emul}32" + ;; + *64-bit*) + emul="${emul}64" + ;; + esac + case `/usr/bin/file conftest.$ac_objext` in + *MSB*) + emul="${emul}btsmip" + ;; + *LSB*) + emul="${emul}ltsmip" + ;; + esac + case `/usr/bin/file conftest.$ac_objext` in + *N32*) + emul="${emul}n32" + ;; + esac + LD="${LD-ld} -m $emul" + fi + rm -rf conftest* + ;; + +x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \ +s390*-*linux*|s390*-*tpf*|sparc*-*linux*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. Note that the listed cases only cover the + # situations where additional linker options are needed (such as when + # doing 32-bit compilation for a host where ld defaults to 64-bit, or + # vice versa); the common cases where no linker options are needed do + # not appear in the list. + echo 'int i;' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + case `/usr/bin/file conftest.o` in + *32-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_i386_fbsd" + ;; + x86_64-*linux*) + case `/usr/bin/file conftest.o` in + *x86-64*) + LD="${LD-ld} -m elf32_x86_64" + ;; + *) + LD="${LD-ld} -m elf_i386" + ;; + esac + ;; + powerpc64le-*linux*) + LD="${LD-ld} -m elf32lppclinux" + ;; + powerpc64-*linux*) + LD="${LD-ld} -m elf32ppclinux" + ;; + s390x-*linux*) + LD="${LD-ld} -m elf_s390" + ;; + sparc64-*linux*) + LD="${LD-ld} -m elf32_sparc" + ;; + esac + ;; + *64-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_x86_64_fbsd" + ;; + x86_64-*linux*) + LD="${LD-ld} -m elf_x86_64" + ;; + powerpcle-*linux*) + LD="${LD-ld} -m elf64lppc" + ;; + powerpc-*linux*) + LD="${LD-ld} -m elf64ppc" + ;; + s390*-*linux*|s390*-*tpf*) + LD="${LD-ld} -m elf64_s390" + ;; + sparc*-*linux*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; + +*-*-sco3.2v5*) + # On SCO OpenServer 5, we need -belf to get full-featured binaries. + SAVE_CFLAGS=$CFLAGS + CFLAGS="$CFLAGS -belf" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5 +printf %s "checking whether the C compiler needs -belf... " >&6; } +if test ${lt_cv_cc_needs_belf+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + lt_cv_cc_needs_belf=yes +else $as_nop + lt_cv_cc_needs_belf=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5 +printf "%s\n" "$lt_cv_cc_needs_belf" >&6; } + if test yes != "$lt_cv_cc_needs_belf"; then + # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf + CFLAGS=$SAVE_CFLAGS + fi + ;; +*-*solaris*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. + echo 'int i;' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + case `/usr/bin/file conftest.o` in + *64-bit*) + case $lt_cv_prog_gnu_ld in + yes*) + case $host in + i?86-*-solaris*|x86_64-*-solaris*) + LD="${LD-ld} -m elf_x86_64" + ;; + sparc*-*-solaris*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + # GNU ld 2.21 introduced _sol2 emulations. Use them if available. + if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then + LD=${LD-ld}_sol2 + fi + ;; + *) + if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then + LD="${LD-ld} -64" + fi + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; +esac + +need_locks=$enable_libtool_lock + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args. +set dummy ${ac_tool_prefix}mt; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_MANIFEST_TOOL+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$MANIFEST_TOOL"; then + ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL +if test -n "$MANIFEST_TOOL"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5 +printf "%s\n" "$MANIFEST_TOOL" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_MANIFEST_TOOL"; then + ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL + # Extract the first word of "mt", so it can be a program name with args. +set dummy mt; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_MANIFEST_TOOL+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_MANIFEST_TOOL"; then + ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_MANIFEST_TOOL="mt" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL +if test -n "$ac_ct_MANIFEST_TOOL"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5 +printf "%s\n" "$ac_ct_MANIFEST_TOOL" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + if test "x$ac_ct_MANIFEST_TOOL" = x; then + MANIFEST_TOOL=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL + fi +else + MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL" +fi + +test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5 +printf %s "checking if $MANIFEST_TOOL is a manifest tool... " >&6; } +if test ${lt_cv_path_mainfest_tool+y} +then : + printf %s "(cached) " >&6 +else $as_nop + lt_cv_path_mainfest_tool=no + echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5 + $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out + cat conftest.err >&5 + if $GREP 'Manifest Tool' conftest.out > /dev/null; then + lt_cv_path_mainfest_tool=yes + fi + rm -f conftest* +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5 +printf "%s\n" "$lt_cv_path_mainfest_tool" >&6; } +if test yes != "$lt_cv_path_mainfest_tool"; then + MANIFEST_TOOL=: +fi + + + + + + + case $host_os in + rhapsody* | darwin*) + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args. +set dummy ${ac_tool_prefix}dsymutil; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_DSYMUTIL+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$DSYMUTIL"; then + ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +DSYMUTIL=$ac_cv_prog_DSYMUTIL +if test -n "$DSYMUTIL"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5 +printf "%s\n" "$DSYMUTIL" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_DSYMUTIL"; then + ac_ct_DSYMUTIL=$DSYMUTIL + # Extract the first word of "dsymutil", so it can be a program name with args. +set dummy dsymutil; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_DSYMUTIL+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_DSYMUTIL"; then + ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_DSYMUTIL="dsymutil" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL +if test -n "$ac_ct_DSYMUTIL"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5 +printf "%s\n" "$ac_ct_DSYMUTIL" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + if test "x$ac_ct_DSYMUTIL" = x; then + DSYMUTIL=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DSYMUTIL=$ac_ct_DSYMUTIL + fi +else + DSYMUTIL="$ac_cv_prog_DSYMUTIL" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args. +set dummy ${ac_tool_prefix}nmedit; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_NMEDIT+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$NMEDIT"; then + ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +NMEDIT=$ac_cv_prog_NMEDIT +if test -n "$NMEDIT"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5 +printf "%s\n" "$NMEDIT" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_NMEDIT"; then + ac_ct_NMEDIT=$NMEDIT + # Extract the first word of "nmedit", so it can be a program name with args. +set dummy nmedit; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_NMEDIT+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_NMEDIT"; then + ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_NMEDIT="nmedit" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT +if test -n "$ac_ct_NMEDIT"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5 +printf "%s\n" "$ac_ct_NMEDIT" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + if test "x$ac_ct_NMEDIT" = x; then + NMEDIT=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + NMEDIT=$ac_ct_NMEDIT + fi +else + NMEDIT="$ac_cv_prog_NMEDIT" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args. +set dummy ${ac_tool_prefix}lipo; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_LIPO+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$LIPO"; then + ac_cv_prog_LIPO="$LIPO" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_LIPO="${ac_tool_prefix}lipo" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +LIPO=$ac_cv_prog_LIPO +if test -n "$LIPO"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5 +printf "%s\n" "$LIPO" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_LIPO"; then + ac_ct_LIPO=$LIPO + # Extract the first word of "lipo", so it can be a program name with args. +set dummy lipo; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_LIPO+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_LIPO"; then + ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_LIPO="lipo" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO +if test -n "$ac_ct_LIPO"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5 +printf "%s\n" "$ac_ct_LIPO" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + if test "x$ac_ct_LIPO" = x; then + LIPO=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + LIPO=$ac_ct_LIPO + fi +else + LIPO="$ac_cv_prog_LIPO" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args. +set dummy ${ac_tool_prefix}otool; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_OTOOL+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$OTOOL"; then + ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_OTOOL="${ac_tool_prefix}otool" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +OTOOL=$ac_cv_prog_OTOOL +if test -n "$OTOOL"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5 +printf "%s\n" "$OTOOL" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OTOOL"; then + ac_ct_OTOOL=$OTOOL + # Extract the first word of "otool", so it can be a program name with args. +set dummy otool; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_OTOOL+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_OTOOL"; then + ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_OTOOL="otool" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL +if test -n "$ac_ct_OTOOL"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5 +printf "%s\n" "$ac_ct_OTOOL" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + if test "x$ac_ct_OTOOL" = x; then + OTOOL=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OTOOL=$ac_ct_OTOOL + fi +else + OTOOL="$ac_cv_prog_OTOOL" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args. +set dummy ${ac_tool_prefix}otool64; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_OTOOL64+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$OTOOL64"; then + ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +OTOOL64=$ac_cv_prog_OTOOL64 +if test -n "$OTOOL64"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5 +printf "%s\n" "$OTOOL64" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OTOOL64"; then + ac_ct_OTOOL64=$OTOOL64 + # Extract the first word of "otool64", so it can be a program name with args. +set dummy otool64; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_OTOOL64+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_OTOOL64"; then + ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_OTOOL64="otool64" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64 +if test -n "$ac_ct_OTOOL64"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5 +printf "%s\n" "$ac_ct_OTOOL64" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + if test "x$ac_ct_OTOOL64" = x; then + OTOOL64=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OTOOL64=$ac_ct_OTOOL64 + fi +else + OTOOL64="$ac_cv_prog_OTOOL64" +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5 +printf %s "checking for -single_module linker flag... " >&6; } +if test ${lt_cv_apple_cc_single_mod+y} +then : + printf %s "(cached) " >&6 +else $as_nop + lt_cv_apple_cc_single_mod=no + if test -z "$LT_MULTI_MODULE"; then + # By default we will add the -single_module flag. You can override + # by either setting the environment variable LT_MULTI_MODULE + # non-empty at configure time, or by adding -multi_module to the + # link flags. + rm -rf libconftest.dylib* + echo "int foo(void){return 1;}" > conftest.c + echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ +-dynamiclib -Wl,-single_module conftest.c" >&5 + $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ + -dynamiclib -Wl,-single_module conftest.c 2>conftest.err + _lt_result=$? + # If there is a non-empty error log, and "single_module" + # appears in it, assume the flag caused a linker warning + if test -s conftest.err && $GREP single_module conftest.err; then + cat conftest.err >&5 + # Otherwise, if the output was created with a 0 exit code from + # the compiler, it worked. + elif test -f libconftest.dylib && test 0 = "$_lt_result"; then + lt_cv_apple_cc_single_mod=yes + else + cat conftest.err >&5 + fi + rm -rf libconftest.dylib* + rm -f conftest.* + fi +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5 +printf "%s\n" "$lt_cv_apple_cc_single_mod" >&6; } + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5 +printf %s "checking for -exported_symbols_list linker flag... " >&6; } +if test ${lt_cv_ld_exported_symbols_list+y} +then : + printf %s "(cached) " >&6 +else $as_nop + lt_cv_ld_exported_symbols_list=no + save_LDFLAGS=$LDFLAGS + echo "_main" > conftest.sym + LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + lt_cv_ld_exported_symbols_list=yes +else $as_nop + lt_cv_ld_exported_symbols_list=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$save_LDFLAGS + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5 +printf "%s\n" "$lt_cv_ld_exported_symbols_list" >&6; } + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5 +printf %s "checking for -force_load linker flag... " >&6; } +if test ${lt_cv_ld_force_load+y} +then : + printf %s "(cached) " >&6 +else $as_nop + lt_cv_ld_force_load=no + cat > conftest.c << _LT_EOF +int forced_loaded() { return 2;} +_LT_EOF + echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5 + $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5 + echo "$AR cru libconftest.a conftest.o" >&5 + $AR cru libconftest.a conftest.o 2>&5 + echo "$RANLIB libconftest.a" >&5 + $RANLIB libconftest.a 2>&5 + cat > conftest.c << _LT_EOF +int main() { return 0;} +_LT_EOF + echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5 + $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err + _lt_result=$? + if test -s conftest.err && $GREP force_load conftest.err; then + cat conftest.err >&5 + elif test -f conftest && test 0 = "$_lt_result" && $GREP forced_load conftest >/dev/null 2>&1; then + lt_cv_ld_force_load=yes + else + cat conftest.err >&5 + fi + rm -f conftest.err libconftest.a conftest conftest.c + rm -rf conftest.dSYM + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5 +printf "%s\n" "$lt_cv_ld_force_load" >&6; } + case $host_os in + rhapsody* | darwin1.[012]) + _lt_dar_allow_undefined='$wl-undefined ${wl}suppress' ;; + darwin1.*) + _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; + darwin*) + case ${MACOSX_DEPLOYMENT_TARGET},$host in + 10.[012],*|,*powerpc*) + _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; + *) + _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; + esac + ;; + esac + if test yes = "$lt_cv_apple_cc_single_mod"; then + _lt_dar_single_mod='$single_module' + fi + if test yes = "$lt_cv_ld_exported_symbols_list"; then + _lt_dar_export_syms=' $wl-exported_symbols_list,$output_objdir/$libname-symbols.expsym' + else + _lt_dar_export_syms='~$NMEDIT -s $output_objdir/$libname-symbols.expsym $lib' + fi + if test : != "$DSYMUTIL" && test no = "$lt_cv_ld_force_load"; then + _lt_dsymutil='~$DSYMUTIL $lib || :' + else + _lt_dsymutil= + fi + ;; + esac + +# func_munge_path_list VARIABLE PATH +# ----------------------------------- +# VARIABLE is name of variable containing _space_ separated list of +# directories to be munged by the contents of PATH, which is string +# having a format: +# "DIR[:DIR]:" +# string "DIR[ DIR]" will be prepended to VARIABLE +# ":DIR[:DIR]" +# string "DIR[ DIR]" will be appended to VARIABLE +# "DIRP[:DIRP]::[DIRA:]DIRA" +# string "DIRP[ DIRP]" will be prepended to VARIABLE and string +# "DIRA[ DIRA]" will be appended to VARIABLE +# "DIR[:DIR]" +# VARIABLE will be replaced by "DIR[ DIR]" +func_munge_path_list () +{ + case x@S|@2 in + x) + ;; + *:) + eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'` \@S|@@S|@1\" + ;; + x:*) + eval @S|@1=\"\@S|@@S|@1 `$ECHO @S|@2 | $SED 's/:/ /g'`\" + ;; + *::*) + eval @S|@1=\"\@S|@@S|@1\ `$ECHO @S|@2 | $SED -e 's/.*:://' -e 's/:/ /g'`\" + eval @S|@1=\"`$ECHO @S|@2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \@S|@@S|@1\" + ;; + *) + eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'`\" + ;; + esac +} + +ac_header= ac_cache= +for ac_item in $ac_header_c_list +do + if test $ac_cache; then + ac_fn_c_check_header_compile "$LINENO" $ac_header ac_cv_header_$ac_cache "$ac_includes_default" + if eval test \"x\$ac_cv_header_$ac_cache\" = xyes; then + printf "%s\n" "#define $ac_item 1" >> confdefs.h + fi + ac_header= ac_cache= + elif test $ac_header; then + ac_cache=$ac_item + else + ac_header=$ac_item + fi +done + + + + + + + + +if test $ac_cv_header_stdlib_h = yes && test $ac_cv_header_string_h = yes +then : + +printf "%s\n" "@%:@define STDC_HEADERS 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default +" +if test "x$ac_cv_header_dlfcn_h" = xyes +then : + printf "%s\n" "@%:@define HAVE_DLFCN_H 1" >>confdefs.h + +fi + + + + +func_stripname_cnf () +{ + case @S|@2 in + .*) func_stripname_result=`$ECHO "@S|@3" | $SED "s%^@S|@1%%; s%\\\\@S|@2\$%%"`;; + *) func_stripname_result=`$ECHO "@S|@3" | $SED "s%^@S|@1%%; s%@S|@2\$%%"`;; + esac +} # func_stripname_cnf + + + + + +# Set options + + + + enable_dlopen=no + + + + @%:@ Check whether --enable-shared was given. +if test ${enable_shared+y} +then : + enableval=$enable_shared; p=${PACKAGE-default} + case $enableval in + yes) enable_shared=yes ;; + no) enable_shared=no ;; + *) + enable_shared=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for pkg in $enableval; do + IFS=$lt_save_ifs + if test "X$pkg" = "X$p"; then + enable_shared=yes + fi + done + IFS=$lt_save_ifs + ;; + esac +else $as_nop + enable_shared=yes +fi + + + + + + + + + + @%:@ Check whether --enable-static was given. +if test ${enable_static+y} +then : + enableval=$enable_static; p=${PACKAGE-default} + case $enableval in + yes) enable_static=yes ;; + no) enable_static=no ;; + *) + enable_static=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for pkg in $enableval; do + IFS=$lt_save_ifs + if test "X$pkg" = "X$p"; then + enable_static=yes + fi + done + IFS=$lt_save_ifs + ;; + esac +else $as_nop + enable_static=yes +fi + + + + + + + + + + +@%:@ Check whether --with-pic was given. +if test ${with_pic+y} +then : + withval=$with_pic; lt_p=${PACKAGE-default} + case $withval in + yes|no) pic_mode=$withval ;; + *) + pic_mode=default + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for lt_pkg in $withval; do + IFS=$lt_save_ifs + if test "X$lt_pkg" = "X$lt_p"; then + pic_mode=yes + fi + done + IFS=$lt_save_ifs + ;; + esac +else $as_nop + pic_mode=default +fi + + + + + + + + + @%:@ Check whether --enable-fast-install was given. +if test ${enable_fast_install+y} +then : + enableval=$enable_fast_install; p=${PACKAGE-default} + case $enableval in + yes) enable_fast_install=yes ;; + no) enable_fast_install=no ;; + *) + enable_fast_install=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for pkg in $enableval; do + IFS=$lt_save_ifs + if test "X$pkg" = "X$p"; then + enable_fast_install=yes + fi + done + IFS=$lt_save_ifs + ;; + esac +else $as_nop + enable_fast_install=yes +fi + + + + + + + + + shared_archive_member_spec= +case $host,$enable_shared in +power*-*-aix[5-9]*,yes) + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking which variant of shared library versioning to provide" >&5 +printf %s "checking which variant of shared library versioning to provide... " >&6; } + +@%:@ Check whether --with-aix-soname was given. +if test ${with_aix_soname+y} +then : + withval=$with_aix_soname; case $withval in + aix|svr4|both) + ;; + *) + as_fn_error $? "Unknown argument to --with-aix-soname" "$LINENO" 5 + ;; + esac + lt_cv_with_aix_soname=$with_aix_soname +else $as_nop + if test ${lt_cv_with_aix_soname+y} +then : + printf %s "(cached) " >&6 +else $as_nop + lt_cv_with_aix_soname=aix +fi + + with_aix_soname=$lt_cv_with_aix_soname +fi + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $with_aix_soname" >&5 +printf "%s\n" "$with_aix_soname" >&6; } + if test aix != "$with_aix_soname"; then + # For the AIX way of multilib, we name the shared archive member + # based on the bitwidth used, traditionally 'shr.o' or 'shr_64.o', + # and 'shr.imp' or 'shr_64.imp', respectively, for the Import File. + # Even when GNU compilers ignore OBJECT_MODE but need '-maix64' flag, + # the AIX toolchain works better with OBJECT_MODE set (default 32). + if test 64 = "${OBJECT_MODE-32}"; then + shared_archive_member_spec=shr_64 + else + shared_archive_member_spec=shr + fi + fi + ;; +*) + with_aix_soname=aix + ;; +esac + + + + + + + + + + +# This can be used to rebuild libtool when needed +LIBTOOL_DEPS=$ltmain + +# Always use our own libtool. +LIBTOOL='$(SHELL) $(top_builddir)/libtool' + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +test -z "$LN_S" && LN_S="ln -s" + + + + + + + + + + + + + + +if test -n "${ZSH_VERSION+set}"; then + setopt NO_GLOB_SUBST +fi + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5 +printf %s "checking for objdir... " >&6; } +if test ${lt_cv_objdir+y} +then : + printf %s "(cached) " >&6 +else $as_nop + rm -f .libs 2>/dev/null +mkdir .libs 2>/dev/null +if test -d .libs; then + lt_cv_objdir=.libs +else + # MS-DOS does not allow filenames that begin with a dot. + lt_cv_objdir=_libs +fi +rmdir .libs 2>/dev/null +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5 +printf "%s\n" "$lt_cv_objdir" >&6; } +objdir=$lt_cv_objdir + + + + + +printf "%s\n" "@%:@define LT_OBJDIR \"$lt_cv_objdir/\"" >>confdefs.h + + + + +case $host_os in +aix3*) + # AIX sometimes has problems with the GCC collect2 program. For some + # reason, if we set the COLLECT_NAMES environment variable, the problems + # vanish in a puff of smoke. + if test set != "${COLLECT_NAMES+set}"; then + COLLECT_NAMES= + export COLLECT_NAMES + fi + ;; +esac + +# Global variables: +ofile=libtool +can_build_shared=yes + +# All known linkers require a '.a' archive for static linking (except MSVC, +# which needs '.lib'). +libext=a + +with_gnu_ld=$lt_cv_prog_gnu_ld + +old_CC=$CC +old_CFLAGS=$CFLAGS + +# Set sane defaults for various variables +test -z "$CC" && CC=cc +test -z "$LTCC" && LTCC=$CC +test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS +test -z "$LD" && LD=ld +test -z "$ac_objext" && ac_objext=o + +func_cc_basename $compiler +cc_basename=$func_cc_basename_result + + +# Only perform the check for file, if the check method requires it +test -z "$MAGIC_CMD" && MAGIC_CMD=file +case $deplibs_check_method in +file_magic*) + if test "$file_magic_cmd" = '$MAGIC_CMD'; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5 +printf %s "checking for ${ac_tool_prefix}file... " >&6; } +if test ${lt_cv_path_MAGIC_CMD+y} +then : + printf %s "(cached) " >&6 +else $as_nop + case $MAGIC_CMD in +[\\/*] | ?:[\\/]*) + lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD=$MAGIC_CMD + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR + ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" + for ac_dir in $ac_dummy; do + IFS=$lt_save_ifs + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/${ac_tool_prefix}file"; then + lt_cv_path_MAGIC_CMD=$ac_dir/"${ac_tool_prefix}file" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` + MAGIC_CMD=$lt_cv_path_MAGIC_CMD + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <<_LT_EOF 1>&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +_LT_EOF + fi ;; + esac + fi + break + fi + done + IFS=$lt_save_ifs + MAGIC_CMD=$lt_save_MAGIC_CMD + ;; +esac +fi + +MAGIC_CMD=$lt_cv_path_MAGIC_CMD +if test -n "$MAGIC_CMD"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 +printf "%s\n" "$MAGIC_CMD" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + + + + +if test -z "$lt_cv_path_MAGIC_CMD"; then + if test -n "$ac_tool_prefix"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for file" >&5 +printf %s "checking for file... " >&6; } +if test ${lt_cv_path_MAGIC_CMD+y} +then : + printf %s "(cached) " >&6 +else $as_nop + case $MAGIC_CMD in +[\\/*] | ?:[\\/]*) + lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD=$MAGIC_CMD + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR + ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" + for ac_dir in $ac_dummy; do + IFS=$lt_save_ifs + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/file"; then + lt_cv_path_MAGIC_CMD=$ac_dir/"file" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` + MAGIC_CMD=$lt_cv_path_MAGIC_CMD + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <<_LT_EOF 1>&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +_LT_EOF + fi ;; + esac + fi + break + fi + done + IFS=$lt_save_ifs + MAGIC_CMD=$lt_save_MAGIC_CMD + ;; +esac +fi + +MAGIC_CMD=$lt_cv_path_MAGIC_CMD +if test -n "$MAGIC_CMD"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 +printf "%s\n" "$MAGIC_CMD" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + + else + MAGIC_CMD=: + fi +fi + + fi + ;; +esac + +# Use C for the default configuration in the libtool script + +lt_save_CC=$CC +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +# Source file extension for C test sources. +ac_ext=c + +# Object file extension for compiled C test sources. +objext=o +objext=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="int some_variable = 0;" + +# Code to be used in simple link tests +lt_simple_link_test_code='int main(){return(0);}' + + + + + + + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC + +# Save the default compiler, since it gets overwritten when the other +# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. +compiler_DEFAULT=$CC + +# save warnings/boilerplate of simple test code +ac_outfile=conftest.$ac_objext +echo "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$RM conftest* + +ac_outfile=conftest.$ac_objext +echo "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$RM -r conftest* + + +if test -n "$compiler"; then + +lt_prog_compiler_no_builtin_flag= + +if test yes = "$GCC"; then + case $cc_basename in + nvcc*) + lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;; + *) + lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;; + esac + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 +printf %s "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } +if test ${lt_cv_prog_compiler_rtti_exceptions+y} +then : + printf %s "(cached) " >&6 +else $as_nop + lt_cv_prog_compiler_rtti_exceptions=no + ac_outfile=conftest.$ac_objext + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="-fno-rtti -fno-exceptions" ## exclude from sc_useless_quotes_in_assignment + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_rtti_exceptions=yes + fi + fi + $RM conftest* + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 +printf "%s\n" "$lt_cv_prog_compiler_rtti_exceptions" >&6; } + +if test yes = "$lt_cv_prog_compiler_rtti_exceptions"; then + lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" +else + : +fi + +fi + + + + + + + lt_prog_compiler_wl= +lt_prog_compiler_pic= +lt_prog_compiler_static= + + + if test yes = "$GCC"; then + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_static='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static='-Bstatic' + fi + lt_prog_compiler_pic='-fPIC' + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + lt_prog_compiler_pic='-fPIC' + ;; + m68k) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the '-m68020' flag to GCC prevents building anything better, + # like '-m68040'. + lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + lt_prog_compiler_pic='-DDLL_EXPORT' + case $host_os in + os2*) + lt_prog_compiler_static='$wl-static' + ;; + esac + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic='-fno-common' + ;; + + haiku*) + # PIC is the default for Haiku. + # The "-static" flag exists, but is broken. + lt_prog_compiler_static= + ;; + + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic='-fPIC' + ;; + esac + ;; + + interix[3-9]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + + msdosdjgpp*) + # Just because we use GCC doesn't mean we suddenly get shared libraries + # on systems that don't support them. + lt_prog_compiler_can_build_shared=no + enable_shared=no + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic='-fPIC -shared' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic=-Kconform_pic + fi + ;; + + *) + lt_prog_compiler_pic='-fPIC' + ;; + esac + + case $cc_basename in + nvcc*) # Cuda Compiler Driver 2.2 + lt_prog_compiler_wl='-Xlinker ' + if test -n "$lt_prog_compiler_pic"; then + lt_prog_compiler_pic="-Xcompiler $lt_prog_compiler_pic" + fi + ;; + esac + else + # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in + aix*) + lt_prog_compiler_wl='-Wl,' + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static='-Bstatic' + else + lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' + fi + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic='-fno-common' + case $cc_basename in + nagfor*) + # NAG Fortran compiler + lt_prog_compiler_wl='-Wl,-Wl,,' + lt_prog_compiler_pic='-PIC' + lt_prog_compiler_static='-Bstatic' + ;; + esac + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_prog_compiler_pic='-DDLL_EXPORT' + case $host_os in + os2*) + lt_prog_compiler_static='$wl-static' + ;; + esac + ;; + + hpux9* | hpux10* | hpux11*) + lt_prog_compiler_wl='-Wl,' + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic='+Z' + ;; + esac + # Is there a better lt_prog_compiler_static that works with the bundled CC? + lt_prog_compiler_static='$wl-a ${wl}archive' + ;; + + irix5* | irix6* | nonstopux*) + lt_prog_compiler_wl='-Wl,' + # PIC (with -KPIC) is the default. + lt_prog_compiler_static='-non_shared' + ;; + + linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + case $cc_basename in + # old Intel for x86_64, which still supported -KPIC. + ecc*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-static' + ;; + # icc used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + icc* | ifort*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fPIC' + lt_prog_compiler_static='-static' + ;; + # Lahey Fortran 8.1. + lf95*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='--shared' + lt_prog_compiler_static='--static' + ;; + nagfor*) + # NAG Fortran compiler + lt_prog_compiler_wl='-Wl,-Wl,,' + lt_prog_compiler_pic='-PIC' + lt_prog_compiler_static='-Bstatic' + ;; + tcc*) + # Fabrice Bellard et al's Tiny C Compiler + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fPIC' + lt_prog_compiler_static='-static' + ;; + pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group compilers (*not* the Pentium gcc compiler, + # which looks to be a dead project) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fpic' + lt_prog_compiler_static='-Bstatic' + ;; + ccc*) + lt_prog_compiler_wl='-Wl,' + # All Alpha code is PIC. + lt_prog_compiler_static='-non_shared' + ;; + xl* | bgxl* | bgf* | mpixl*) + # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-qpic' + lt_prog_compiler_static='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*) + # Sun Fortran 8.3 passes all unrecognized flags to the linker + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + lt_prog_compiler_wl='' + ;; + *Sun\ F* | *Sun*Fortran*) + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + lt_prog_compiler_wl='-Qoption ld ' + ;; + *Sun\ C*) + # Sun C 5.9 + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + lt_prog_compiler_wl='-Wl,' + ;; + *Intel*\ [CF]*Compiler*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fPIC' + lt_prog_compiler_static='-static' + ;; + *Portland\ Group*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fpic' + lt_prog_compiler_static='-Bstatic' + ;; + esac + ;; + esac + ;; + + newsos6) + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic='-fPIC -shared' + ;; + + osf3* | osf4* | osf5*) + lt_prog_compiler_wl='-Wl,' + # All OSF/1 code is PIC. + lt_prog_compiler_static='-non_shared' + ;; + + rdos*) + lt_prog_compiler_static='-non_shared' + ;; + + solaris*) + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + case $cc_basename in + f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) + lt_prog_compiler_wl='-Qoption ld ';; + *) + lt_prog_compiler_wl='-Wl,';; + esac + ;; + + sunos4*) + lt_prog_compiler_wl='-Qoption ld ' + lt_prog_compiler_pic='-PIC' + lt_prog_compiler_static='-Bstatic' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic='-Kconform_pic' + lt_prog_compiler_static='-Bstatic' + fi + ;; + + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + unicos*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_can_build_shared=no + ;; + + uts4*) + lt_prog_compiler_pic='-pic' + lt_prog_compiler_static='-Bstatic' + ;; + + *) + lt_prog_compiler_can_build_shared=no + ;; + esac + fi + +case $host_os in + # For platforms that do not support PIC, -DPIC is meaningless: + *djgpp*) + lt_prog_compiler_pic= + ;; + *) + lt_prog_compiler_pic="$lt_prog_compiler_pic@&t@ -DPIC" + ;; +esac + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 +printf %s "checking for $compiler option to produce PIC... " >&6; } +if test ${lt_cv_prog_compiler_pic+y} +then : + printf %s "(cached) " >&6 +else $as_nop + lt_cv_prog_compiler_pic=$lt_prog_compiler_pic +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5 +printf "%s\n" "$lt_cv_prog_compiler_pic" >&6; } +lt_prog_compiler_pic=$lt_cv_prog_compiler_pic + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$lt_prog_compiler_pic"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 +printf %s "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } +if test ${lt_cv_prog_compiler_pic_works+y} +then : + printf %s "(cached) " >&6 +else $as_nop + lt_cv_prog_compiler_pic_works=no + ac_outfile=conftest.$ac_objext + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$lt_prog_compiler_pic@&t@ -DPIC" ## exclude from sc_useless_quotes_in_assignment + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_pic_works=yes + fi + fi + $RM conftest* + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5 +printf "%s\n" "$lt_cv_prog_compiler_pic_works" >&6; } + +if test yes = "$lt_cv_prog_compiler_pic_works"; then + case $lt_prog_compiler_pic in + "" | " "*) ;; + *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;; + esac +else + lt_prog_compiler_pic= + lt_prog_compiler_can_build_shared=no +fi + +fi + + + + + + + + + + + +# +# Check to make sure the static flag actually works. +# +wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 +printf %s "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } +if test ${lt_cv_prog_compiler_static_works+y} +then : + printf %s "(cached) " >&6 +else $as_nop + lt_cv_prog_compiler_static_works=no + save_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS $lt_tmp_static_flag" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&5 + $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_static_works=yes + fi + else + lt_cv_prog_compiler_static_works=yes + fi + fi + $RM -r conftest* + LDFLAGS=$save_LDFLAGS + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5 +printf "%s\n" "$lt_cv_prog_compiler_static_works" >&6; } + +if test yes = "$lt_cv_prog_compiler_static_works"; then + : +else + lt_prog_compiler_static= +fi + + + + + + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +printf %s "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if test ${lt_cv_prog_compiler_c_o+y} +then : + printf %s "(cached) " >&6 +else $as_nop + lt_cv_prog_compiler_c_o=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 +printf "%s\n" "$lt_cv_prog_compiler_c_o" >&6; } + + + + + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +printf %s "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if test ${lt_cv_prog_compiler_c_o+y} +then : + printf %s "(cached) " >&6 +else $as_nop + lt_cv_prog_compiler_c_o=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 +printf "%s\n" "$lt_cv_prog_compiler_c_o" >&6; } + + + + +hard_links=nottested +if test no = "$lt_cv_prog_compiler_c_o" && test no != "$need_locks"; then + # do not overwrite the value of need_locks provided by the user + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 +printf %s "checking if we can lock with hard links... " >&6; } + hard_links=yes + $RM conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 +printf "%s\n" "$hard_links" >&6; } + if test no = "$hard_links"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&5 +printf "%s\n" "$as_me: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&2;} + need_locks=warn + fi +else + need_locks=no +fi + + + + + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +printf %s "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } + + runpath_var= + allow_undefined_flag= + always_export_symbols=no + archive_cmds= + archive_expsym_cmds= + compiler_needs_object=no + enable_shared_with_static_runtimes=no + export_dynamic_flag_spec= + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + hardcode_automatic=no + hardcode_direct=no + hardcode_direct_absolute=no + hardcode_libdir_flag_spec= + hardcode_libdir_separator= + hardcode_minus_L=no + hardcode_shlibpath_var=unsupported + inherit_rpath=no + link_all_deplibs=unknown + module_cmds= + module_expsym_cmds= + old_archive_from_new_cmds= + old_archive_from_expsyms_cmds= + thread_safe_flag_spec= + whole_archive_flag_spec= + # include_expsyms should be a list of space-separated symbols to be *always* + # included in the symbol list + include_expsyms= + # exclude_expsyms can be an extended regexp of symbols to exclude + # it will be wrapped by ' (' and ')$', so one must not match beginning or + # end of line. Example: 'a|bc|.*d.*' will exclude the symbols 'a' and 'bc', + # as well as any symbol that contains 'd'. + exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' + # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out + # platforms (ab)use it in PIC code, but their linkers get confused if + # the symbol is explicitly referenced. Since portable code cannot + # rely on this symbol name, it's probably fine to never include it in + # preloaded symbol tables. + # Exclude shared library initialization/finalization symbols. + extract_expsyms_cmds= + + case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test yes != "$GCC"; then + with_gnu_ld=no + fi + ;; + interix*) + # we just hope/assume this is gcc and not c89 (= MSVC++) + with_gnu_ld=yes + ;; + openbsd* | bitrig*) + with_gnu_ld=no + ;; + esac + + ld_shlibs=yes + + # On some targets, GNU ld is compatible enough with the native linker + # that we're better off using the native interface for both. + lt_use_gnu_ld_interface=no + if test yes = "$with_gnu_ld"; then + case $host_os in + aix*) + # The AIX port of GNU ld has always aspired to compatibility + # with the native linker. However, as the warning in the GNU ld + # block says, versions before 2.19.5* couldn't really create working + # shared libraries, regardless of the interface used. + case `$LD -v 2>&1` in + *\ \(GNU\ Binutils\)\ 2.19.5*) ;; + *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;; + *\ \(GNU\ Binutils\)\ [3-9]*) ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + fi + + if test yes = "$lt_use_gnu_ld_interface"; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='$wl' + + # Set some defaults for GNU ld with shared library support. These + # are reset later if shared libraries are not supported. Putting them + # here allows them to be overridden if necessary. + runpath_var=LD_RUN_PATH + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + export_dynamic_flag_spec='$wl--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then + whole_archive_flag_spec=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' + else + whole_archive_flag_spec= + fi + supports_anon_versioning=no + case `$LD -v | $SED -e 's/(^)\+)\s\+//' 2>&1` in + *GNU\ gold*) supports_anon_versioning=yes ;; + *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + + # See if GNU ld supports shared libraries. + case $host_os in + aix[3-9]*) + # On AIX/PPC, the GNU linker is very broken + if test ia64 != "$host_cpu"; then + ld_shlibs=no + cat <<_LT_EOF 1>&2 + +*** Warning: the GNU linker, at least up to release 2.19, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to install binutils +*** 2.20 or above, or modify your PATH so that a non-GNU linker is found. +*** You will then need to restart the configuration process. + +_LT_EOF + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds='' + ;; + m68k) + archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + ;; + esac + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + allow_undefined_flag=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + else + ld_shlibs=no + fi + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, + # as there is no search path for DLLs. + hardcode_libdir_flag_spec='-L$libdir' + export_dynamic_flag_spec='$wl--export-all-symbols' + allow_undefined_flag=unsupported + always_export_symbols=no + enable_shared_with_static_runtimes=yes + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' + exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file, use it as + # is; otherwise, prepend EXPORTS... + archive_expsym_cmds='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + ld_shlibs=no + fi + ;; + + haiku*) + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + link_all_deplibs=yes + ;; + + os2*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + allow_undefined_flag=unsupported + shrext_cmds=.dll + archive_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + archive_expsym_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + prefix_cmds="$SED"~ + if test EXPORTS = "`$SED 1q $export_symbols`"; then + prefix_cmds="$prefix_cmds -e 1d"; + fi~ + prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ + cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + old_archive_From_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + enable_shared_with_static_runtimes=yes + ;; + + interix[3-9]*) + hardcode_direct=no + hardcode_shlibpath_var=no + hardcode_libdir_flag_spec='$wl-rpath,$libdir' + export_dynamic_flag_spec='$wl-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + archive_expsym_cmds='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + + gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) + tmp_diet=no + if test linux-dietlibc = "$host_os"; then + case $cc_basename in + diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) + esac + fi + if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ + && test no = "$tmp_diet" + then + tmp_addflag=' $pic_flag' + tmp_sharedflag='-shared' + case $cc_basename,$host_cpu in + pgcc*) # Portland Group C compiler + whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + tmp_addflag=' $pic_flag' + ;; + pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group f77 and f90 compilers + whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + tmp_addflag=' $pic_flag -Mnomain' ;; + ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 + tmp_addflag=' -i_dynamic' ;; + efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 + tmp_addflag=' -i_dynamic -nofor_main' ;; + ifc* | ifort*) # Intel Fortran compiler + tmp_addflag=' -nofor_main' ;; + lf95*) # Lahey Fortran 8.1 + whole_archive_flag_spec= + tmp_sharedflag='--shared' ;; + nagfor*) # NAGFOR 5.3 + tmp_sharedflag='-Wl,-shared' ;; + xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below) + tmp_sharedflag='-qmkshrobj' + tmp_addflag= ;; + nvcc*) # Cuda Compiler Driver 2.2 + whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + compiler_needs_object=yes + ;; + esac + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) # Sun C 5.9 + whole_archive_flag_spec='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + compiler_needs_object=yes + tmp_sharedflag='-G' ;; + *Sun\ F*) # Sun Fortran 8.3 + tmp_sharedflag='-G' ;; + esac + archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + + if test yes = "$supports_anon_versioning"; then + archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' + fi + + case $cc_basename in + tcc*) + export_dynamic_flag_spec='-rdynamic' + ;; + xlf* | bgf* | bgxlf* | mpixlf*) + # IBM XL Fortran 10.1 on PPC cannot create shared libs itself + whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive' + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' + if test yes = "$supports_anon_versioning"; then + archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' + fi + ;; + esac + else + ld_shlibs=no + fi + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris*) + if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then + ld_shlibs=no + cat <<_LT_EOF 1>&2 + +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) + case `$LD -v 2>&1` in + *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) + ld_shlibs=no + cat <<_LT_EOF 1>&2 + +*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 cannot +*** reliably create shared libraries on SCO systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.16.91.0.3 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + ;; + *) + # For security reasons, it is highly recommended that you always + # use absolute paths for naming shared libraries, and exclude the + # DT_RUNPATH tag from executables and libraries. But doing so + # requires that you compile everything twice, which is a pain. + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + esac + ;; + + sunos4*) + archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + *) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + esac + + if test no = "$ld_shlibs"; then + runpath_var= + hardcode_libdir_flag_spec= + export_dynamic_flag_spec= + whole_archive_flag_spec= + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + allow_undefined_flag=unsupported + always_export_symbols=yes + archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + hardcode_minus_L=yes + if test yes = "$GCC" && test -z "$lt_prog_compiler_static"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + hardcode_direct=unsupported + fi + ;; + + aix[4-9]*) + if test ia64 = "$host_cpu"; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag= + else + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to GNU nm, but means don't demangle to AIX nm. + # Without the "-l" option, or with the "-B" option, AIX nm treats + # weak defined symbols like other global defined symbols, whereas + # GNU nm marks them as "W". + # While the 'weak' keyword is ignored in the Export File, we need + # it in the Import File for the 'aix-soname' feature, so we have + # to replace the "-B" option with "-P" for AIX nm. + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' + else + export_symbols_cmds='`func_echo_all $NM | $SED -e '\''s/B\([^B]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && (substr(\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' + fi + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # have runtime linking enabled, and use it for executables. + # For shared libraries, we enable/disable runtime linking + # depending on the kind of the shared library created - + # when "with_aix_soname,aix_use_runtimelinking" is: + # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables + # "aix,yes" lib.so shared, rtl:yes, for executables + # lib.a static archive + # "both,no" lib.so.V(shr.o) shared, rtl:yes + # lib.a(lib.so.V) shared, rtl:no, for executables + # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a(lib.so.V) shared, rtl:no + # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a static archive + case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) + for ld_flag in $LDFLAGS; do + if (test x-brtl = "x$ld_flag" || test x-Wl,-brtl = "x$ld_flag"); then + aix_use_runtimelinking=yes + break + fi + done + if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then + # With aix-soname=svr4, we create the lib.so.V shared archives only, + # so we don't have lib.a shared libs to link our executables. + # We have to force runtime linking in this case. + aix_use_runtimelinking=yes + LDFLAGS="$LDFLAGS -Wl,-brtl" + fi + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + archive_cmds='' + hardcode_direct=yes + hardcode_direct_absolute=yes + hardcode_libdir_separator=':' + link_all_deplibs=yes + file_list_spec='$wl-f,' + case $with_aix_soname,$aix_use_runtimelinking in + aix,*) ;; # traditional, no import file + svr4,* | *,yes) # use import file + # The Import File defines what to hardcode. + hardcode_direct=no + hardcode_direct_absolute=no + ;; + esac + + if test yes = "$GCC"; then + case $host_os in aix4.[012]|aix4.[012].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`$CC -print-prog-name=collect2` + if test -f "$collect2name" && + strings "$collect2name" | $GREP resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + hardcode_direct=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + hardcode_minus_L=yes + hardcode_libdir_flag_spec='-L$libdir' + hardcode_libdir_separator= + fi + ;; + esac + shared_flag='-shared' + if test yes = "$aix_use_runtimelinking"; then + shared_flag="$shared_flag "'$wl-G' + fi + # Need to ensure runtime linking is disabled for the traditional + # shared library, or the linker may eventually find shared libraries + # /with/ Import File - we do not want to mix them. + shared_flag_aix='-shared' + shared_flag_svr4='-shared $wl-G' + else + # not using gcc + if test ia64 = "$host_cpu"; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test yes = "$aix_use_runtimelinking"; then + shared_flag='$wl-G' + else + shared_flag='$wl-bM:SRE' + fi + shared_flag_aix='$wl-bM:SRE' + shared_flag_svr4='$wl-G' + fi + fi + + export_dynamic_flag_spec='$wl-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + always_export_symbols=yes + if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + allow_undefined_flag='-berok' + # Determine the default libpath from the value encoded in an + # empty executable. + if test set = "${lt_cv_aix_libpath+set}"; then + aix_libpath=$lt_cv_aix_libpath +else + if test ${lt_cv_aix_libpath_+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + + lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }' + lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_=/usr/lib:/lib + fi + +fi + + aix_libpath=$lt_cv_aix_libpath_ +fi + + hardcode_libdir_flag_spec='$wl-blibpath:$libdir:'"$aix_libpath" + archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag + else + if test ia64 = "$host_cpu"; then + hardcode_libdir_flag_spec='$wl-R $libdir:/usr/lib:/lib' + allow_undefined_flag="-z nodefs" + archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + if test set = "${lt_cv_aix_libpath+set}"; then + aix_libpath=$lt_cv_aix_libpath +else + if test ${lt_cv_aix_libpath_+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + + lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }' + lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_=/usr/lib:/lib + fi + +fi + + aix_libpath=$lt_cv_aix_libpath_ +fi + + hardcode_libdir_flag_spec='$wl-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + no_undefined_flag=' $wl-bernotok' + allow_undefined_flag=' $wl-berok' + if test yes = "$with_gnu_ld"; then + # We only use this code for GNU lds that support --whole-archive. + whole_archive_flag_spec='$wl--whole-archive$convenience $wl--no-whole-archive' + else + # Exported symbols can be pulled into shared objects from archives + whole_archive_flag_spec='$convenience' + fi + archive_cmds_need_lc=yes + archive_expsym_cmds='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' + # -brtl affects multiple linker settings, -berok does not and is overridden later + compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([, ]\\)%-berok\\1%g"`' + if test svr4 != "$with_aix_soname"; then + # This is similar to how AIX traditionally builds its shared libraries. + archive_expsym_cmds="$archive_expsym_cmds"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' + fi + if test aix != "$with_aix_soname"; then + archive_expsym_cmds="$archive_expsym_cmds"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' + else + # used by -dlpreopen to get the symbols + archive_expsym_cmds="$archive_expsym_cmds"'~$MV $output_objdir/$realname.d/$soname $output_objdir' + fi + archive_expsym_cmds="$archive_expsym_cmds"'~$RM -r $output_objdir/$realname.d' + fi + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds='' + ;; + m68k) + archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + ;; + esac + ;; + + bsdi[45]*) + export_dynamic_flag_spec=-rdynamic + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + case $cc_basename in + cl*) + # Native MSVC + hardcode_libdir_flag_spec=' ' + allow_undefined_flag=unsupported + always_export_symbols=yes + file_list_spec='@' + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=.dll + # FIXME: Setting linknames here is a bad hack. + archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' + archive_expsym_cmds='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then + cp "$export_symbols" "$output_objdir/$soname.def"; + echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; + else + $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; + fi~ + $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ + linknames=' + # The linker will not automatically build a static lib if we build a DLL. + # _LT_TAGVAR(old_archive_from_new_cmds, )='true' + enable_shared_with_static_runtimes=yes + exclude_expsyms='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' + # Don't use ranlib + old_postinstall_cmds='chmod 644 $oldlib' + postlink_cmds='lt_outputfile="@OUTPUT@"~ + lt_tool_outputfile="@TOOL_OUTPUT@"~ + case $lt_outputfile in + *.exe|*.EXE) ;; + *) + lt_outputfile=$lt_outputfile.exe + lt_tool_outputfile=$lt_tool_outputfile.exe + ;; + esac~ + if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then + $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; + $RM "$lt_outputfile.manifest"; + fi' + ;; + *) + # Assume MSVC wrapper + hardcode_libdir_flag_spec=' ' + allow_undefined_flag=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=.dll + # FIXME: Setting linknames here is a bad hack. + archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + old_archive_from_new_cmds='true' + # FIXME: Should let the user specify the lib program. + old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs' + enable_shared_with_static_runtimes=yes + ;; + esac + ;; + + darwin* | rhapsody*) + + + archive_cmds_need_lc=no + hardcode_direct=no + hardcode_automatic=yes + hardcode_shlibpath_var=unsupported + if test yes = "$lt_cv_ld_force_load"; then + whole_archive_flag_spec='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' + + else + whole_archive_flag_spec='' + fi + link_all_deplibs=yes + allow_undefined_flag=$_lt_dar_allow_undefined + case $cc_basename in + ifort*|nagfor*) _lt_dar_can_shared=yes ;; + *) _lt_dar_can_shared=$GCC ;; + esac + if test yes = "$_lt_dar_can_shared"; then + output_verbose_link_cmd=func_echo_all + archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil" + module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil" + archive_expsym_cmds="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil" + module_expsym_cmds="sed -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil" + + else + ld_shlibs=no + fi + + ;; + + dgux*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_shlibpath_var=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2.*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes + hardcode_minus_L=yes + hardcode_shlibpath_var=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | dragonfly*) + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + hpux9*) + if test yes = "$GCC"; then + archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' + else + archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' + fi + hardcode_libdir_flag_spec='$wl+b $wl$libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + export_dynamic_flag_spec='$wl-E' + ;; + + hpux10*) + if test yes,no = "$GCC,$with_gnu_ld"; then + archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + fi + if test no = "$with_gnu_ld"; then + hardcode_libdir_flag_spec='$wl+b $wl$libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + hardcode_direct_absolute=yes + export_dynamic_flag_spec='$wl-E' + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + fi + ;; + + hpux11*) + if test yes,no = "$GCC,$with_gnu_ld"; then + case $host_cpu in + hppa*64*) + archive_cmds='$CC -shared $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else + case $host_cpu in + hppa*64*) + archive_cmds='$CC -b $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + archive_cmds='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + + # Older versions of the 11.00 compiler do not understand -b yet + # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5 +printf %s "checking if $CC understands -b... " >&6; } +if test ${lt_cv_prog_compiler__b+y} +then : + printf %s "(cached) " >&6 +else $as_nop + lt_cv_prog_compiler__b=no + save_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS -b" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&5 + $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler__b=yes + fi + else + lt_cv_prog_compiler__b=yes + fi + fi + $RM -r conftest* + LDFLAGS=$save_LDFLAGS + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5 +printf "%s\n" "$lt_cv_prog_compiler__b" >&6; } + +if test yes = "$lt_cv_prog_compiler__b"; then + archive_cmds='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' +else + archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' +fi + + ;; + esac + fi + if test no = "$with_gnu_ld"; then + hardcode_libdir_flag_spec='$wl+b $wl$libdir' + hardcode_libdir_separator=: + + case $host_cpu in + hppa*64*|ia64*) + hardcode_direct=no + hardcode_shlibpath_var=no + ;; + *) + hardcode_direct=yes + hardcode_direct_absolute=yes + export_dynamic_flag_spec='$wl-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + ;; + esac + fi + ;; + + irix5* | irix6* | nonstopux*) + if test yes = "$GCC"; then + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + # Try to use the -exported_symbol ld option, if it does not + # work, assume that -exports_file does not work either and + # implicitly export all symbols. + # This should be the same for all languages, so no per-tag cache variable. + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5 +printf %s "checking whether the $host_os linker accepts -exported_symbol... " >&6; } +if test ${lt_cv_irix_exported_symbol+y} +then : + printf %s "(cached) " >&6 +else $as_nop + save_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS -shared $wl-exported_symbol ${wl}foo $wl-update_registry $wl/dev/null" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +int foo (void) { return 0; } +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + lt_cv_irix_exported_symbol=yes +else $as_nop + lt_cv_irix_exported_symbol=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$save_LDFLAGS +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5 +printf "%s\n" "$lt_cv_irix_exported_symbol" >&6; } + if test yes = "$lt_cv_irix_exported_symbol"; then + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations $wl-exports_file $wl$export_symbols -o $lib' + fi + else + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -exports_file $export_symbols -o $lib' + fi + archive_cmds_need_lc='no' + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + hardcode_libdir_separator=: + inherit_rpath=yes + link_all_deplibs=yes + ;; + + linux*) + case $cc_basename in + tcc*) + # Fabrice Bellard et al's Tiny C Compiler + ld_shlibs=yes + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + newsos6) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + hardcode_libdir_separator=: + hardcode_shlibpath_var=no + ;; + + *nto* | *qnx*) + ;; + + openbsd* | bitrig*) + if test -f /usr/libexec/ld.so; then + hardcode_direct=yes + hardcode_shlibpath_var=no + hardcode_direct_absolute=yes + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags $wl-retain-symbols-file,$export_symbols' + hardcode_libdir_flag_spec='$wl-rpath,$libdir' + export_dynamic_flag_spec='$wl-E' + else + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec='$wl-rpath,$libdir' + fi + else + ld_shlibs=no + fi + ;; + + os2*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + allow_undefined_flag=unsupported + shrext_cmds=.dll + archive_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + archive_expsym_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + prefix_cmds="$SED"~ + if test EXPORTS = "`$SED 1q $export_symbols`"; then + prefix_cmds="$prefix_cmds -e 1d"; + fi~ + prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ + cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + old_archive_From_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + enable_shared_with_static_runtimes=yes + ;; + + osf3*) + if test yes = "$GCC"; then + allow_undefined_flag=' $wl-expect_unresolved $wl\*' + archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + else + allow_undefined_flag=' -expect_unresolved \*' + archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + fi + archive_cmds_need_lc='no' + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + hardcode_libdir_separator=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test yes = "$GCC"; then + allow_undefined_flag=' $wl-expect_unresolved $wl\*' + archive_cmds='$CC -shared$allow_undefined_flag $pic_flag $libobjs $deplibs $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + else + allow_undefined_flag=' -expect_unresolved \*' + archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ + $CC -shared$allow_undefined_flag $wl-input $wl$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~$RM $lib.exp' + + # Both c and cxx compiler support -rpath directly + hardcode_libdir_flag_spec='-rpath $libdir' + fi + archive_cmds_need_lc='no' + hardcode_libdir_separator=: + ;; + + solaris*) + no_undefined_flag=' -z defs' + if test yes = "$GCC"; then + wlarc='$wl' + archive_cmds='$CC -shared $pic_flag $wl-z ${wl}text $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared $pic_flag $wl-z ${wl}text $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + else + case `$CC -V 2>&1` in + *"Compilers 5.0"*) + wlarc='' + archive_cmds='$LD -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $linker_flags' + archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $LD -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' + ;; + *) + wlarc='$wl' + archive_cmds='$CC -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + ;; + esac + fi + hardcode_libdir_flag_spec='-R$libdir' + hardcode_shlibpath_var=no + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands '-z linker_flag'. GCC discards it without '$wl', + # but is careful enough not to reorder. + # Supported since Solaris 2.6 (maybe 2.5.1?) + if test yes = "$GCC"; then + whole_archive_flag_spec='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' + else + whole_archive_flag_spec='-z allextract$convenience -z defaultextract' + fi + ;; + esac + link_all_deplibs=yes + ;; + + sunos4*) + if test sequent = "$host_vendor"; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + archive_cmds='$CC -G $wl-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + hardcode_libdir_flag_spec='-L$libdir' + hardcode_direct=yes + hardcode_minus_L=yes + hardcode_shlibpath_var=no + ;; + + sysv4) + case $host_vendor in + sni) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes # is this really true??? + ;; + siemens) + ## LD is ld it makes a PLAMLIB + ## CC just makes a GrossModule. + archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' + reload_cmds='$CC -r -o $output$reload_objs' + hardcode_direct=no + ;; + motorola) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=no #Motorola manual says yes, but my tests say they lie + ;; + esac + runpath_var='LD_RUN_PATH' + hardcode_shlibpath_var=no + ;; + + sysv4.3*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var=no + export_dynamic_flag_spec='-Bexport' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + ld_shlibs=yes + fi + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) + no_undefined_flag='$wl-z,text' + archive_cmds_need_lc=no + hardcode_shlibpath_var=no + runpath_var='LD_RUN_PATH' + + if test yes = "$GCC"; then + archive_cmds='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We CANNOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + no_undefined_flag='$wl-z,text' + allow_undefined_flag='$wl-z,nodefs' + archive_cmds_need_lc=no + hardcode_shlibpath_var=no + hardcode_libdir_flag_spec='$wl-R,$libdir' + hardcode_libdir_separator=':' + link_all_deplibs=yes + export_dynamic_flag_spec='$wl-Bexport' + runpath_var='LD_RUN_PATH' + + if test yes = "$GCC"; then + archive_cmds='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + uts4*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_shlibpath_var=no + ;; + + *) + ld_shlibs=no + ;; + esac + + if test sni = "$host_vendor"; then + case $host in + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + export_dynamic_flag_spec='$wl-Blargedynsym' + ;; + esac + fi + fi + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5 +printf "%s\n" "$ld_shlibs" >&6; } +test no = "$ld_shlibs" && can_build_shared=no + +with_gnu_ld=$with_gnu_ld + + + + + + + + + + + + + + + +# +# Do we need to explicitly link libc? +# +case "x$archive_cmds_need_lc" in +x|xyes) + # Assume -lc should be added + archive_cmds_need_lc=yes + + if test yes,yes = "$GCC,$enable_shared"; then + case $archive_cmds in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 +printf %s "checking whether -lc should be explicitly linked in... " >&6; } +if test ${lt_cv_archive_cmds_need_lc+y} +then : + printf %s "(cached) " >&6 +else $as_nop + $RM conftest* + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$lt_prog_compiler_wl + pic_flag=$lt_prog_compiler_pic + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$allow_undefined_flag + allow_undefined_flag= + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 + (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + then + lt_cv_archive_cmds_need_lc=no + else + lt_cv_archive_cmds_need_lc=yes + fi + allow_undefined_flag=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $RM conftest* + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5 +printf "%s\n" "$lt_cv_archive_cmds_need_lc" >&6; } + archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc + ;; + esac + fi + ;; +esac + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 +printf %s "checking dynamic linker characteristics... " >&6; } + +if test yes = "$GCC"; then + case $host_os in + darwin*) lt_awk_arg='/^libraries:/,/LR/' ;; + *) lt_awk_arg='/^libraries:/' ;; + esac + case $host_os in + mingw* | cegcc*) lt_sed_strip_eq='s|=\([A-Za-z]:\)|\1|g' ;; + *) lt_sed_strip_eq='s|=/|/|g' ;; + esac + lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` + case $lt_search_path_spec in + *\;*) + # if the path contains ";" then we assume it to be the separator + # otherwise default to the standard path separator (i.e. ":") - it is + # assumed that no part of a normal pathname contains ";" but that should + # okay in the real world where ";" in dirpaths is itself problematic. + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` + ;; + *) + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` + ;; + esac + # Ok, now we have the path, separated by spaces, we can step through it + # and add multilib dir if necessary... + lt_tmp_lt_search_path_spec= + lt_multi_os_dir=/`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` + # ...but if some path component already ends with the multilib dir we assume + # that all is fine and trust -print-search-dirs as is (GCC 4.2? or newer). + case "$lt_multi_os_dir; $lt_search_path_spec " in + "/; "* | "/.; "* | "/./; "* | *"$lt_multi_os_dir "* | *"$lt_multi_os_dir/ "*) + lt_multi_os_dir= + ;; + esac + for lt_sys_path in $lt_search_path_spec; do + if test -d "$lt_sys_path$lt_multi_os_dir"; then + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path$lt_multi_os_dir" + elif test -n "$lt_multi_os_dir"; then + test -d "$lt_sys_path" && \ + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" + fi + done + lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' +BEGIN {RS = " "; FS = "/|\n";} { + lt_foo = ""; + lt_count = 0; + for (lt_i = NF; lt_i > 0; lt_i--) { + if ($lt_i != "" && $lt_i != ".") { + if ($lt_i == "..") { + lt_count++; + } else { + if (lt_count == 0) { + lt_foo = "/" $lt_i lt_foo; + } else { + lt_count--; + } + } + } + } + if (lt_foo != "") { lt_freq[lt_foo]++; } + if (lt_freq[lt_foo] == 1) { print lt_foo; } +}'` + # AWK program above erroneously prepends '/' to C:/dos/paths + # for these hosts. + case $host_os in + mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ + $SED 's|/\([A-Za-z]:\)|\1|g'` ;; + esac + sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` +else + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +fi +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=.so +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + + + +case $host_os in +aix3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='$libname$release$shared_ext$major' + ;; + +aix[4-9]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test ia64 = "$host_cpu"; then + # AIX 5 supports IA64 + library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line '#! .'. This would cause the generated library to + # depend on '.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[01] | aix4.[01].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # Using Import Files as archive members, it is possible to support + # filename-based versioning of shared library archives on AIX. While + # this would work for both with and without runtime linking, it will + # prevent static linking of such archives. So we do filename-based + # shared library versioning with .so extension only, which is used + # when both runtime linking and shared linking is enabled. + # Unfortunately, runtime linking may impact performance, so we do + # not want this to be the default eventually. Also, we use the + # versioned .so libs for executables only if there is the -brtl + # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only. + # To allow for filename-based versioning support, we need to create + # libNAME.so.V as an archive file, containing: + # *) an Import File, referring to the versioned filename of the + # archive as well as the shared archive member, telling the + # bitwidth (32 or 64) of that shared object, and providing the + # list of exported symbols of that shared object, eventually + # decorated with the 'weak' keyword + # *) the shared object with the F_LOADONLY flag set, to really avoid + # it being seen by the linker. + # At run time we better use the real file rather than another symlink, + # but for link time we create the symlink libNAME.so -> libNAME.so.V + + case $with_aix_soname,$aix_use_runtimelinking in + # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + aix,yes) # traditional libtool + dynamic_linker='AIX unversionable lib.so' + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + ;; + aix,no) # traditional AIX only + dynamic_linker='AIX lib.a(lib.so.V)' + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='$libname$release.a $libname.a' + soname_spec='$libname$release$shared_ext$major' + ;; + svr4,*) # full svr4 only + dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o)" + library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' + # We do not specify a path in Import Files, so LIBPATH fires. + shlibpath_overrides_runpath=yes + ;; + *,yes) # both, prefer svr4 + dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o), lib.a(lib.so.V)" + library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' + # unpreferred sharedlib libNAME.a needs extra handling + postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"' + postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"' + # We do not specify a path in Import Files, so LIBPATH fires. + shlibpath_overrides_runpath=yes + ;; + *,no) # both, prefer aix + dynamic_linker="AIX lib.a(lib.so.V), lib.so.V($shared_archive_member_spec.o)" + library_names_spec='$libname$release.a $libname.a' + soname_spec='$libname$release$shared_ext$major' + # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling + postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)' + postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"' + ;; + esac + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + case $host_cpu in + powerpc) + # Since July 2007 AmigaOS4 officially supports .so libraries. + # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + ;; + m68k) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + esac + ;; + +beos*) + library_names_spec='$libname$shared_ext' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[45]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32* | cegcc*) + version_type=windows + shrext_cmds=.dll + need_version=no + need_lib_prefix=no + + case $GCC,$cc_basename in + yes,*) + # gcc + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo $libname | sed -e 's/^lib/cyg/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api" + ;; + mingw* | cegcc*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo $libname | sed -e 's/^lib/pw/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + ;; + esac + dynamic_linker='Win32 ld.exe' + ;; + + *,cl*) + # Native MSVC + libname_spec='$name' + soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + library_names_spec='$libname.dll.lib' + + case $build_os in + mingw*) + sys_lib_search_path_spec= + lt_save_ifs=$IFS + IFS=';' + for lt_path in $LIB + do + IFS=$lt_save_ifs + # Let DOS variable expansion print the short 8.3 style file name. + lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` + sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" + done + IFS=$lt_save_ifs + # Convert to MSYS style. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` + ;; + cygwin*) + # Convert to unix form, then to dos form, then back to unix form + # but this time dos style (no spaces!) so that the unix form looks + # like /cygdrive/c/PROGRA~1:/cygdr... + sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` + sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` + sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + ;; + *) + sys_lib_search_path_spec=$LIB + if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then + # It is most probably a Windows format PATH. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + # FIXME: find the short name or the path components, as spaces are + # common. (e.g. "Program Files" -> "PROGRA~1") + ;; + esac + + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + dynamic_linker='Win32 link.exe' + ;; + + *) + # Assume MSVC wrapper + library_names_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext $libname.lib' + dynamic_linker='Win32 ld.exe' + ;; + esac + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$major$shared_ext $libname$shared_ext' + soname_spec='$libname$release$major$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' + + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib" + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[23].*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2.*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[01]* | freebsdelf3.[01]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ + freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + *) # from 4.6 on, and DragonFly + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +haiku*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + dynamic_linker="$host_os runtime_loader" + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LIBRARY_PATH + shlibpath_overrides_runpath=no + sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + if test 32 = "$HPUX_IA64_MODE"; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + sys_lib_dlsearch_path_spec=/usr/lib/hpux32 + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + sys_lib_dlsearch_path_spec=/usr/lib/hpux64 + fi + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555, ... + postinstall_cmds='chmod 555 $lib' + # or fails outright, so override atomically: + install_override_mode=555 + ;; + +interix[3-9]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test yes = "$lt_cv_prog_gnu_ld"; then + version_type=linux # correct to gnu/linux during the next big refactor + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='$libname$release$shared_ext$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff" + sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +linux*android*) + version_type=none # Android doesn't support versioned libraries. + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext' + soname_spec='$libname$release$shared_ext' + finish_cmds= + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + dynamic_linker='Android linker' + # Don't embed -rpath directories since the linker doesn't support them. + hardcode_libdir_flag_spec='-L$libdir' + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + + # Some binutils ld are patched to set DT_RUNPATH + if test ${lt_cv_shlibpath_overrides_runpath+y} +then : + printf %s "(cached) " >&6 +else $as_nop + lt_cv_shlibpath_overrides_runpath=no + save_LDFLAGS=$LDFLAGS + save_libdir=$libdir + eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \ + LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\"" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null +then : + lt_cv_shlibpath_overrides_runpath=yes +fi +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$save_LDFLAGS + libdir=$save_libdir + +fi + + shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # Ideally, we could use ldconfig to report *all* directores which are + # searched for libraries, however this is still not possible. Aside from not + # being certain /sbin/ldconfig is available, command + # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64, + # even though it is searched at run-time. Try to do the best guess by + # appending ld.so.conf contents (and includes) to the search path. + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +*nto* | *qnx*) + version_type=qnx + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='ldqnx.so' + ;; + +openbsd* | bitrig*) + version_type=sunos + sys_lib_dlsearch_path_spec=/usr/lib + need_lib_prefix=no + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then + need_version=no + else + need_version=yes + fi + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +os2*) + libname_spec='$name' + version_type=windows + shrext_cmds=.dll + need_version=no + need_lib_prefix=no + # OS/2 can only load a DLL with a base name of 8 characters or less. + soname_spec='`test -n "$os2dllname" && libname="$os2dllname"; + v=$($ECHO $release$versuffix | tr -d .-); + n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _); + $ECHO $n$v`$shared_ext' + library_names_spec='${libname}_dll.$libext' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=BEGINLIBPATH + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='$libname$release$shared_ext$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + +rdos*) + dynamic_linker=no + ;; + +solaris*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test yes = "$with_gnu_ld"; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec; then + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext' + soname_spec='$libname$shared_ext.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=sco + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + if test yes = "$with_gnu_ld"; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + +tpf*) + # TPF is a cross-target only. Preferred cross-host = GNU/Linux. + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +uts4*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 +printf "%s\n" "$dynamic_linker" >&6; } +test no = "$dynamic_linker" && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test yes = "$GCC"; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then + sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec +fi + +if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then + sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec +fi + +# remember unaugmented sys_lib_dlsearch_path content for libtool script decls... +configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec + +# ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code +func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH" + +# to be used as default LT_SYS_LIBRARY_PATH value in generated libtool +configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 +printf %s "checking how to hardcode library paths into programs... " >&6; } +hardcode_action= +if test -n "$hardcode_libdir_flag_spec" || + test -n "$runpath_var" || + test yes = "$hardcode_automatic"; then + + # We can hardcode non-existent directories. + if test no != "$hardcode_direct" && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, )" && + test no != "$hardcode_minus_L"; then + # Linking always hardcodes the temporary library directory. + hardcode_action=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + hardcode_action=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + hardcode_action=unsupported +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5 +printf "%s\n" "$hardcode_action" >&6; } + +if test relink = "$hardcode_action" || + test yes = "$inherit_rpath"; then + # Fast installation is not supported + enable_fast_install=no +elif test yes = "$shlibpath_overrides_runpath" || + test no = "$enable_shared"; then + # Fast installation is not necessary + enable_fast_install=needless +fi + + + + + + + if test yes != "$enable_dlopen"; then + enable_dlopen=unknown + enable_dlopen_self=unknown + enable_dlopen_self_static=unknown +else + lt_cv_dlopen=no + lt_cv_dlopen_libs= + + case $host_os in + beos*) + lt_cv_dlopen=load_add_on + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ;; + + mingw* | pw32* | cegcc*) + lt_cv_dlopen=LoadLibrary + lt_cv_dlopen_libs= + ;; + + cygwin*) + lt_cv_dlopen=dlopen + lt_cv_dlopen_libs= + ;; + + darwin*) + # if libdl is installed we need to link against it + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 +printf %s "checking for dlopen in -ldl... " >&6; } +if test ${ac_cv_lib_dl_dlopen+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +char dlopen (); +int +main (void) +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_lib_dl_dlopen=yes +else $as_nop + ac_cv_lib_dl_dlopen=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 +printf "%s\n" "$ac_cv_lib_dl_dlopen" >&6; } +if test "x$ac_cv_lib_dl_dlopen" = xyes +then : + lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl +else $as_nop + + lt_cv_dlopen=dyld + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + +fi + + ;; + + tpf*) + # Don't try to run any link tests for TPF. We know it's impossible + # because TPF is a cross-compiler, and we know how we open DSOs. + lt_cv_dlopen=dlopen + lt_cv_dlopen_libs= + lt_cv_dlopen_self=no + ;; + + *) + ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load" +if test "x$ac_cv_func_shl_load" = xyes +then : + lt_cv_dlopen=shl_load +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 +printf %s "checking for shl_load in -ldld... " >&6; } +if test ${ac_cv_lib_dld_shl_load+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldld $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +char shl_load (); +int +main (void) +{ +return shl_load (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_lib_dld_shl_load=yes +else $as_nop + ac_cv_lib_dld_shl_load=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 +printf "%s\n" "$ac_cv_lib_dld_shl_load" >&6; } +if test "x$ac_cv_lib_dld_shl_load" = xyes +then : + lt_cv_dlopen=shl_load lt_cv_dlopen_libs=-ldld +else $as_nop + ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" +if test "x$ac_cv_func_dlopen" = xyes +then : + lt_cv_dlopen=dlopen +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 +printf %s "checking for dlopen in -ldl... " >&6; } +if test ${ac_cv_lib_dl_dlopen+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +char dlopen (); +int +main (void) +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_lib_dl_dlopen=yes +else $as_nop + ac_cv_lib_dl_dlopen=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 +printf "%s\n" "$ac_cv_lib_dl_dlopen" >&6; } +if test "x$ac_cv_lib_dl_dlopen" = xyes +then : + lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 +printf %s "checking for dlopen in -lsvld... " >&6; } +if test ${ac_cv_lib_svld_dlopen+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_check_lib_save_LIBS=$LIBS +LIBS="-lsvld $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +char dlopen (); +int +main (void) +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_lib_svld_dlopen=yes +else $as_nop + ac_cv_lib_svld_dlopen=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 +printf "%s\n" "$ac_cv_lib_svld_dlopen" >&6; } +if test "x$ac_cv_lib_svld_dlopen" = xyes +then : + lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-lsvld +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 +printf %s "checking for dld_link in -ldld... " >&6; } +if test ${ac_cv_lib_dld_dld_link+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldld $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +char dld_link (); +int +main (void) +{ +return dld_link (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_lib_dld_dld_link=yes +else $as_nop + ac_cv_lib_dld_dld_link=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 +printf "%s\n" "$ac_cv_lib_dld_dld_link" >&6; } +if test "x$ac_cv_lib_dld_dld_link" = xyes +then : + lt_cv_dlopen=dld_link lt_cv_dlopen_libs=-ldld +fi + + +fi + + +fi + + +fi + + +fi + + +fi + + ;; + esac + + if test no = "$lt_cv_dlopen"; then + enable_dlopen=no + else + enable_dlopen=yes + fi + + case $lt_cv_dlopen in + dlopen) + save_CPPFLAGS=$CPPFLAGS + test yes = "$ac_cv_header_dlfcn_h" && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" + + save_LDFLAGS=$LDFLAGS + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" + + save_LIBS=$LIBS + LIBS="$lt_cv_dlopen_libs $LIBS" + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 +printf %s "checking whether a program can dlopen itself... " >&6; } +if test ${lt_cv_dlopen_self+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test yes = "$cross_compiling"; then : + lt_cv_dlopen_self=cross +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext <<_LT_EOF +#line $LINENO "configure" +#include "confdefs.h" + +#if HAVE_DLFCN_H +#include +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +/* When -fvisibility=hidden is used, assume the code has been annotated + correspondingly for the symbols needed. */ +#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) +int fnord () __attribute__((visibility("default"))); +#endif + +int fnord () { return 42; } +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else + { + if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + else puts (dlerror ()); + } + /* dlclose (self); */ + } + else + puts (dlerror ()); + + return status; +} +_LT_EOF + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 + (eval $ac_link) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s "conftest$ac_exeext" 2>/dev/null; then + (./conftest; exit; ) >&5 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; + x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; + x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;; + esac + else : + # compilation failed + lt_cv_dlopen_self=no + fi +fi +rm -fr conftest* + + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 +printf "%s\n" "$lt_cv_dlopen_self" >&6; } + + if test yes = "$lt_cv_dlopen_self"; then + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 +printf %s "checking whether a statically linked program can dlopen itself... " >&6; } +if test ${lt_cv_dlopen_self_static+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test yes = "$cross_compiling"; then : + lt_cv_dlopen_self_static=cross +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext <<_LT_EOF +#line $LINENO "configure" +#include "confdefs.h" + +#if HAVE_DLFCN_H +#include +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +/* When -fvisibility=hidden is used, assume the code has been annotated + correspondingly for the symbols needed. */ +#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) +int fnord () __attribute__((visibility("default"))); +#endif + +int fnord () { return 42; } +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else + { + if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + else puts (dlerror ()); + } + /* dlclose (self); */ + } + else + puts (dlerror ()); + + return status; +} +_LT_EOF + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 + (eval $ac_link) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s "conftest$ac_exeext" 2>/dev/null; then + (./conftest; exit; ) >&5 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; + x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; + x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;; + esac + else : + # compilation failed + lt_cv_dlopen_self_static=no + fi +fi +rm -fr conftest* + + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 +printf "%s\n" "$lt_cv_dlopen_self_static" >&6; } + fi + + CPPFLAGS=$save_CPPFLAGS + LDFLAGS=$save_LDFLAGS + LIBS=$save_LIBS + ;; + esac + + case $lt_cv_dlopen_self in + yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; + *) enable_dlopen_self=unknown ;; + esac + + case $lt_cv_dlopen_self_static in + yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; + *) enable_dlopen_self_static=unknown ;; + esac +fi + + + + + + + + + + + + + + + + + +striplib= +old_striplib= +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 +printf %s "checking whether stripping libraries is possible... " >&6; } +if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then + test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" + test -z "$striplib" && striplib="$STRIP --strip-unneeded" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } +else +# FIXME - insert some real tests, host_os isn't really good enough + case $host_os in + darwin*) + if test -n "$STRIP"; then + striplib="$STRIP -x" + old_striplib="$STRIP -S" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + fi + ;; + *) + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + ;; + esac +fi + + + + + + + + + + + + + # Report what library types will actually be built + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 +printf %s "checking if libtool supports shared libraries... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 +printf "%s\n" "$can_build_shared" >&6; } + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 +printf %s "checking whether to build shared libraries... " >&6; } + test no = "$can_build_shared" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test yes = "$enable_shared" && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + + aix[4-9]*) + if test ia64 != "$host_cpu"; then + case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in + yes,aix,yes) ;; # shared object as lib.so file only + yes,svr4,*) ;; # shared object as lib.so archive member only + yes,*) enable_static=no ;; # shared object in lib.a archive as well + esac + fi + ;; + esac + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 +printf "%s\n" "$enable_shared" >&6; } + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 +printf %s "checking whether to build static libraries... " >&6; } + # Make sure either enable_shared or enable_static is yes. + test yes = "$enable_shared" || enable_static=yes + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 +printf "%s\n" "$enable_static" >&6; } + + + + +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +CC=$lt_save_CC + + if test -n "$CXX" && ( test no != "$CXX" && + ( (test g++ = "$CXX" && `g++ -v >/dev/null 2>&1` ) || + (test g++ != "$CXX"))); then + ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5 +printf %s "checking how to run the C++ preprocessor... " >&6; } +if test -z "$CXXCPP"; then + if test ${ac_cv_prog_CXXCPP+y} +then : + printf %s "(cached) " >&6 +else $as_nop + # Double quotes because $CXX needs to be expanded + for CXXCPP in "$CXX -E" cpp /lib/cpp + do + ac_preproc_ok=false +for ac_cxx_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +@%:@include + Syntax error +_ACEOF +if ac_fn_cxx_try_cpp "$LINENO" +then : + +else $as_nop + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +@%:@include +_ACEOF +if ac_fn_cxx_try_cpp "$LINENO" +then : + # Broken: success on invalid input. +continue +else $as_nop + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok +then : + break +fi + + done + ac_cv_prog_CXXCPP=$CXXCPP + +fi + CXXCPP=$ac_cv_prog_CXXCPP +else + ac_cv_prog_CXXCPP=$CXXCPP +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5 +printf "%s\n" "$CXXCPP" >&6; } +ac_preproc_ok=false +for ac_cxx_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +@%:@include + Syntax error +_ACEOF +if ac_fn_cxx_try_cpp "$LINENO" +then : + +else $as_nop + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +@%:@include +_ACEOF +if ac_fn_cxx_try_cpp "$LINENO" +then : + # Broken: success on invalid input. +continue +else $as_nop + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok +then : + +else $as_nop + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check +See \`config.log' for more details" "$LINENO" 5; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +else + _lt_caught_CXX_error=yes +fi + +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + +archive_cmds_need_lc_CXX=no +allow_undefined_flag_CXX= +always_export_symbols_CXX=no +archive_expsym_cmds_CXX= +compiler_needs_object_CXX=no +export_dynamic_flag_spec_CXX= +hardcode_direct_CXX=no +hardcode_direct_absolute_CXX=no +hardcode_libdir_flag_spec_CXX= +hardcode_libdir_separator_CXX= +hardcode_minus_L_CXX=no +hardcode_shlibpath_var_CXX=unsupported +hardcode_automatic_CXX=no +inherit_rpath_CXX=no +module_cmds_CXX= +module_expsym_cmds_CXX= +link_all_deplibs_CXX=unknown +old_archive_cmds_CXX=$old_archive_cmds +reload_flag_CXX=$reload_flag +reload_cmds_CXX=$reload_cmds +no_undefined_flag_CXX= +whole_archive_flag_spec_CXX= +enable_shared_with_static_runtimes_CXX=no + +# Source file extension for C++ test sources. +ac_ext=cpp + +# Object file extension for compiled C++ test sources. +objext=o +objext_CXX=$objext + +# No sense in running all these tests if we already determined that +# the CXX compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test yes != "$_lt_caught_CXX_error"; then + # Code to be used in simple compile tests + lt_simple_compile_test_code="int some_variable = 0;" + + # Code to be used in simple link tests + lt_simple_link_test_code='int main(int, char *[]) { return(0); }' + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + + + + + + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC + + + # save warnings/boilerplate of simple test code + ac_outfile=conftest.$ac_objext +echo "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$RM conftest* + + ac_outfile=conftest.$ac_objext +echo "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$RM -r conftest* + + + # Allow CC to be a program name with arguments. + lt_save_CC=$CC + lt_save_CFLAGS=$CFLAGS + lt_save_LD=$LD + lt_save_GCC=$GCC + GCC=$GXX + lt_save_with_gnu_ld=$with_gnu_ld + lt_save_path_LD=$lt_cv_path_LD + if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then + lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx + else + $as_unset lt_cv_prog_gnu_ld + fi + if test -n "${lt_cv_path_LDCXX+set}"; then + lt_cv_path_LD=$lt_cv_path_LDCXX + else + $as_unset lt_cv_path_LD + fi + test -z "${LDCXX+set}" || LD=$LDCXX + CC=${CXX-"c++"} + CFLAGS=$CXXFLAGS + compiler=$CC + compiler_CXX=$CC + func_cc_basename $compiler +cc_basename=$func_cc_basename_result + + + if test -n "$compiler"; then + # We don't want -fno-exception when compiling C++ code, so set the + # no_builtin_flag separately + if test yes = "$GXX"; then + lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin' + else + lt_prog_compiler_no_builtin_flag_CXX= + fi + + if test yes = "$GXX"; then + # Set up default GNU C++ configuration + + + +@%:@ Check whether --with-gnu-ld was given. +if test ${with_gnu_ld+y} +then : + withval=$with_gnu_ld; test no = "$withval" || with_gnu_ld=yes +else $as_nop + with_gnu_ld=no +fi + +ac_prog=ld +if test yes = "$GCC"; then + # Check if gcc -print-prog-name=ld gives a path. + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 +printf %s "checking for ld used by $CC... " >&6; } + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return, which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [\\/]* | ?:[\\/]*) + re_direlt='/[^/][^/]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` + while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do + ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` + done + test -z "$LD" && LD=$ac_prog + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test yes = "$with_gnu_ld"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 +printf %s "checking for GNU ld... " >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 +printf %s "checking for non-GNU ld... " >&6; } +fi +if test ${lt_cv_path_LD+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -z "$LD"; then + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS=$lt_save_ifs + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD=$ac_dir/$ac_prog + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some variants of GNU ld only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 &5 +printf "%s\n" "$LD" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi +test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 +printf %s "checking if the linker ($LD) is GNU ld... " >&6; } +if test ${lt_cv_prog_gnu_ld+y} +then : + printf %s "(cached) " >&6 +else $as_nop + # I'd rather use --version here, but apparently some GNU lds only accept -v. +case `$LD -v 2>&1 &5 +printf "%s\n" "$lt_cv_prog_gnu_ld" >&6; } +with_gnu_ld=$lt_cv_prog_gnu_ld + + + + + + + + # Check if GNU C++ uses GNU ld as the underlying linker, since the + # archiving commands below assume that GNU ld is being used. + if test yes = "$with_gnu_ld"; then + archive_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + + hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir' + export_dynamic_flag_spec_CXX='$wl--export-dynamic' + + # If archive_cmds runs LD, not CC, wlarc should be empty + # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to + # investigate it a little bit more. (MM) + wlarc='$wl' + + # ancient GNU ld didn't support --whole-archive et. al. + if eval "`$CC -print-prog-name=ld` --help 2>&1" | + $GREP 'no-whole-archive' > /dev/null; then + whole_archive_flag_spec_CXX=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' + else + whole_archive_flag_spec_CXX= + fi + else + with_gnu_ld=no + wlarc= + + # A generic and very simple default shared library creation + # command for GNU C++ for the case where it uses the native + # linker, instead of GNU ld. If possible, this setting should + # overridden to take advantage of the native linker features on + # the platform it is being used on. + archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + fi + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + + else + GXX=no + with_gnu_ld=no + wlarc= + fi + + # PORTME: fill in a description of your system's C++ link characteristics + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +printf %s "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } + ld_shlibs_CXX=yes + case $host_os in + aix3*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + aix[4-9]*) + if test ia64 = "$host_cpu"; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag= + else + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # have runtime linking enabled, and use it for executables. + # For shared libraries, we enable/disable runtime linking + # depending on the kind of the shared library created - + # when "with_aix_soname,aix_use_runtimelinking" is: + # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables + # "aix,yes" lib.so shared, rtl:yes, for executables + # lib.a static archive + # "both,no" lib.so.V(shr.o) shared, rtl:yes + # lib.a(lib.so.V) shared, rtl:no, for executables + # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a(lib.so.V) shared, rtl:no + # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a static archive + case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) + for ld_flag in $LDFLAGS; do + case $ld_flag in + *-brtl*) + aix_use_runtimelinking=yes + break + ;; + esac + done + if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then + # With aix-soname=svr4, we create the lib.so.V shared archives only, + # so we don't have lib.a shared libs to link our executables. + # We have to force runtime linking in this case. + aix_use_runtimelinking=yes + LDFLAGS="$LDFLAGS -Wl,-brtl" + fi + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + archive_cmds_CXX='' + hardcode_direct_CXX=yes + hardcode_direct_absolute_CXX=yes + hardcode_libdir_separator_CXX=':' + link_all_deplibs_CXX=yes + file_list_spec_CXX='$wl-f,' + case $with_aix_soname,$aix_use_runtimelinking in + aix,*) ;; # no import file + svr4,* | *,yes) # use import file + # The Import File defines what to hardcode. + hardcode_direct_CXX=no + hardcode_direct_absolute_CXX=no + ;; + esac + + if test yes = "$GXX"; then + case $host_os in aix4.[012]|aix4.[012].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`$CC -print-prog-name=collect2` + if test -f "$collect2name" && + strings "$collect2name" | $GREP resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + hardcode_direct_CXX=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + hardcode_minus_L_CXX=yes + hardcode_libdir_flag_spec_CXX='-L$libdir' + hardcode_libdir_separator_CXX= + fi + esac + shared_flag='-shared' + if test yes = "$aix_use_runtimelinking"; then + shared_flag=$shared_flag' $wl-G' + fi + # Need to ensure runtime linking is disabled for the traditional + # shared library, or the linker may eventually find shared libraries + # /with/ Import File - we do not want to mix them. + shared_flag_aix='-shared' + shared_flag_svr4='-shared $wl-G' + else + # not using gcc + if test ia64 = "$host_cpu"; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test yes = "$aix_use_runtimelinking"; then + shared_flag='$wl-G' + else + shared_flag='$wl-bM:SRE' + fi + shared_flag_aix='$wl-bM:SRE' + shared_flag_svr4='$wl-G' + fi + fi + + export_dynamic_flag_spec_CXX='$wl-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to + # export. + always_export_symbols_CXX=yes + if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + # The "-G" linker flag allows undefined symbols. + no_undefined_flag_CXX='-bernotok' + # Determine the default libpath from the value encoded in an empty + # executable. + if test set = "${lt_cv_aix_libpath+set}"; then + aix_libpath=$lt_cv_aix_libpath +else + if test ${lt_cv_aix_libpath__CXX+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_link "$LINENO" +then : + + lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }' + lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$lt_cv_aix_libpath__CXX"; then + lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + if test -z "$lt_cv_aix_libpath__CXX"; then + lt_cv_aix_libpath__CXX=/usr/lib:/lib + fi + +fi + + aix_libpath=$lt_cv_aix_libpath__CXX +fi + + hardcode_libdir_flag_spec_CXX='$wl-blibpath:$libdir:'"$aix_libpath" + + archive_expsym_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag + else + if test ia64 = "$host_cpu"; then + hardcode_libdir_flag_spec_CXX='$wl-R $libdir:/usr/lib:/lib' + allow_undefined_flag_CXX="-z nodefs" + archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + if test set = "${lt_cv_aix_libpath+set}"; then + aix_libpath=$lt_cv_aix_libpath +else + if test ${lt_cv_aix_libpath__CXX+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_link "$LINENO" +then : + + lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }' + lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$lt_cv_aix_libpath__CXX"; then + lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + if test -z "$lt_cv_aix_libpath__CXX"; then + lt_cv_aix_libpath__CXX=/usr/lib:/lib + fi + +fi + + aix_libpath=$lt_cv_aix_libpath__CXX +fi + + hardcode_libdir_flag_spec_CXX='$wl-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + no_undefined_flag_CXX=' $wl-bernotok' + allow_undefined_flag_CXX=' $wl-berok' + if test yes = "$with_gnu_ld"; then + # We only use this code for GNU lds that support --whole-archive. + whole_archive_flag_spec_CXX='$wl--whole-archive$convenience $wl--no-whole-archive' + else + # Exported symbols can be pulled into shared objects from archives + whole_archive_flag_spec_CXX='$convenience' + fi + archive_cmds_need_lc_CXX=yes + archive_expsym_cmds_CXX='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' + # -brtl affects multiple linker settings, -berok does not and is overridden later + compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([, ]\\)%-berok\\1%g"`' + if test svr4 != "$with_aix_soname"; then + # This is similar to how AIX traditionally builds its shared + # libraries. Need -bnortl late, we may have -brtl in LDFLAGS. + archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' + fi + if test aix != "$with_aix_soname"; then + archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' + else + # used by -dlpreopen to get the symbols + archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$MV $output_objdir/$realname.d/$soname $output_objdir' + fi + archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$RM -r $output_objdir/$realname.d' + fi + fi + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + allow_undefined_flag_CXX=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + else + ld_shlibs_CXX=no + fi + ;; + + chorus*) + case $cc_basename in + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + cygwin* | mingw* | pw32* | cegcc*) + case $GXX,$cc_basename in + ,cl* | no,cl*) + # Native MSVC + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + hardcode_libdir_flag_spec_CXX=' ' + allow_undefined_flag_CXX=unsupported + always_export_symbols_CXX=yes + file_list_spec_CXX='@' + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=.dll + # FIXME: Setting linknames here is a bad hack. + archive_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' + archive_expsym_cmds_CXX='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then + cp "$export_symbols" "$output_objdir/$soname.def"; + echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; + else + $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; + fi~ + $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ + linknames=' + # The linker will not automatically build a static lib if we build a DLL. + # _LT_TAGVAR(old_archive_from_new_cmds, CXX)='true' + enable_shared_with_static_runtimes_CXX=yes + # Don't use ranlib + old_postinstall_cmds_CXX='chmod 644 $oldlib' + postlink_cmds_CXX='lt_outputfile="@OUTPUT@"~ + lt_tool_outputfile="@TOOL_OUTPUT@"~ + case $lt_outputfile in + *.exe|*.EXE) ;; + *) + lt_outputfile=$lt_outputfile.exe + lt_tool_outputfile=$lt_tool_outputfile.exe + ;; + esac~ + func_to_tool_file "$lt_outputfile"~ + if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then + $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; + $RM "$lt_outputfile.manifest"; + fi' + ;; + *) + # g++ + # _LT_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless, + # as there is no search path for DLLs. + hardcode_libdir_flag_spec_CXX='-L$libdir' + export_dynamic_flag_spec_CXX='$wl--export-all-symbols' + allow_undefined_flag_CXX=unsupported + always_export_symbols_CXX=no + enable_shared_with_static_runtimes_CXX=yes + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file, use it as + # is; otherwise, prepend EXPORTS... + archive_expsym_cmds_CXX='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + ld_shlibs_CXX=no + fi + ;; + esac + ;; + darwin* | rhapsody*) + + + archive_cmds_need_lc_CXX=no + hardcode_direct_CXX=no + hardcode_automatic_CXX=yes + hardcode_shlibpath_var_CXX=unsupported + if test yes = "$lt_cv_ld_force_load"; then + whole_archive_flag_spec_CXX='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' + + else + whole_archive_flag_spec_CXX='' + fi + link_all_deplibs_CXX=yes + allow_undefined_flag_CXX=$_lt_dar_allow_undefined + case $cc_basename in + ifort*|nagfor*) _lt_dar_can_shared=yes ;; + *) _lt_dar_can_shared=$GCC ;; + esac + if test yes = "$_lt_dar_can_shared"; then + output_verbose_link_cmd=func_echo_all + archive_cmds_CXX="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil" + module_cmds_CXX="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil" + archive_expsym_cmds_CXX="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil" + module_expsym_cmds_CXX="sed -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil" + if test yes != "$lt_cv_apple_cc_single_mod"; then + archive_cmds_CXX="\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dsymutil" + archive_expsym_cmds_CXX="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dar_export_syms$_lt_dsymutil" + fi + + else + ld_shlibs_CXX=no + fi + + ;; + + os2*) + hardcode_libdir_flag_spec_CXX='-L$libdir' + hardcode_minus_L_CXX=yes + allow_undefined_flag_CXX=unsupported + shrext_cmds=.dll + archive_cmds_CXX='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + archive_expsym_cmds_CXX='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + prefix_cmds="$SED"~ + if test EXPORTS = "`$SED 1q $export_symbols`"; then + prefix_cmds="$prefix_cmds -e 1d"; + fi~ + prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ + cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + old_archive_From_new_cmds_CXX='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + enable_shared_with_static_runtimes_CXX=yes + ;; + + dgux*) + case $cc_basename in + ec++*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + ghcx*) + # Green Hills C++ Compiler + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + freebsd2.*) + # C++ shared libraries reported to be fairly broken before + # switch to ELF + ld_shlibs_CXX=no + ;; + + freebsd-elf*) + archive_cmds_need_lc_CXX=no + ;; + + freebsd* | dragonfly*) + # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF + # conventions + ld_shlibs_CXX=yes + ;; + + haiku*) + archive_cmds_CXX='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + link_all_deplibs_CXX=yes + ;; + + hpux9*) + hardcode_libdir_flag_spec_CXX='$wl+b $wl$libdir' + hardcode_libdir_separator_CXX=: + export_dynamic_flag_spec_CXX='$wl-E' + hardcode_direct_CXX=yes + hardcode_minus_L_CXX=yes # Not in the search PATH, + # but as the default + # location of the library. + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + aCC*) + archive_cmds_CXX='$RM $output_objdir/$soname~$CC -b $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test yes = "$GXX"; then + archive_cmds_CXX='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' + else + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + fi + ;; + esac + ;; + + hpux10*|hpux11*) + if test no = "$with_gnu_ld"; then + hardcode_libdir_flag_spec_CXX='$wl+b $wl$libdir' + hardcode_libdir_separator_CXX=: + + case $host_cpu in + hppa*64*|ia64*) + ;; + *) + export_dynamic_flag_spec_CXX='$wl-E' + ;; + esac + fi + case $host_cpu in + hppa*64*|ia64*) + hardcode_direct_CXX=no + hardcode_shlibpath_var_CXX=no + ;; + *) + hardcode_direct_CXX=yes + hardcode_direct_absolute_CXX=yes + hardcode_minus_L_CXX=yes # Not in the search PATH, + # but as the default + # location of the library. + ;; + esac + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + aCC*) + case $host_cpu in + hppa*64*) + archive_cmds_CXX='$CC -b $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + archive_cmds_CXX='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + archive_cmds_CXX='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test yes = "$GXX"; then + if test no = "$with_gnu_ld"; then + case $host_cpu in + hppa*64*) + archive_cmds_CXX='$CC -shared -nostdlib -fPIC $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + archive_cmds_CXX='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + archive_cmds_CXX='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + fi + else + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + fi + ;; + esac + ;; + + interix[3-9]*) + hardcode_direct_CXX=no + hardcode_shlibpath_var_CXX=no + hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir' + export_dynamic_flag_spec_CXX='$wl-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + archive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + archive_expsym_cmds_CXX='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + irix5* | irix6*) + case $cc_basename in + CC*) + # SGI C++ + archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + + # Archives containing C++ object files must be created using + # "CC -ar", where "CC" is the IRIX C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs' + ;; + *) + if test yes = "$GXX"; then + if test no = "$with_gnu_ld"; then + archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + else + archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` -o $lib' + fi + fi + link_all_deplibs_CXX=yes + ;; + esac + hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir' + hardcode_libdir_separator_CXX=: + inherit_rpath_CXX=yes + ;; + + linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib $wl-retain-symbols-file,$export_symbols; mv \$templib $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + + hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir' + export_dynamic_flag_spec_CXX='$wl--export-dynamic' + + # Archives containing C++ object files must be created using + # "CC -Bstatic", where "CC" is the KAI C++ compiler. + old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' + ;; + icpc* | ecpc* ) + # Intel C++ + with_gnu_ld=yes + # version 8.0 and above of icpc choke on multiply defined symbols + # if we add $predep_objects and $postdep_objects, however 7.1 and + # earlier do not add the objects themselves. + case `$CC -V 2>&1` in + *"Version 7."*) + archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + ;; + *) # Version 8.0 or newer + tmp_idyn= + case $host_cpu in + ia64*) tmp_idyn=' -i_dynamic';; + esac + archive_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + ;; + esac + archive_cmds_need_lc_CXX=no + hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir' + export_dynamic_flag_spec_CXX='$wl--export-dynamic' + whole_archive_flag_spec_CXX='$wl--whole-archive$convenience $wl--no-whole-archive' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler + case `$CC -V` in + *pgCC\ [1-5].* | *pgcpp\ [1-5].*) + prelink_cmds_CXX='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ + compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' + old_archive_cmds_CXX='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ + $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ + $RANLIB $oldlib' + archive_cmds_CXX='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ + $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ + $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + ;; + *) # Version 6 and above use weak symbols + archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + ;; + esac + + hardcode_libdir_flag_spec_CXX='$wl--rpath $wl$libdir' + export_dynamic_flag_spec_CXX='$wl--export-dynamic' + whole_archive_flag_spec_CXX='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + ;; + cxx*) + # Compaq C++ + archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib $wl-retain-symbols-file $wl$export_symbols' + + runpath_var=LD_RUN_PATH + hardcode_libdir_flag_spec_CXX='-rpath $libdir' + hardcode_libdir_separator_CXX=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' + ;; + xl* | mpixl* | bgxl*) + # IBM XL 8.0 on PPC, with GNU ld + hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir' + export_dynamic_flag_spec_CXX='$wl--export-dynamic' + archive_cmds_CXX='$CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + if test yes = "$supports_anon_versioning"; then + archive_expsym_cmds_CXX='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' + fi + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + no_undefined_flag_CXX=' -zdefs' + archive_cmds_CXX='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + archive_expsym_cmds_CXX='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file $wl$export_symbols' + hardcode_libdir_flag_spec_CXX='-R$libdir' + whole_archive_flag_spec_CXX='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + compiler_needs_object_CXX=yes + + # Not sure whether something based on + # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 + # would be better. + output_verbose_link_cmd='func_echo_all' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' + ;; + esac + ;; + esac + ;; + + lynxos*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + + m88k*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + + mvs*) + case $cc_basename in + cxx*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + archive_cmds_CXX='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' + wlarc= + hardcode_libdir_flag_spec_CXX='-R$libdir' + hardcode_direct_CXX=yes + hardcode_shlibpath_var_CXX=no + fi + # Workaround some broken pre-1.5 toolchains + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' + ;; + + *nto* | *qnx*) + ld_shlibs_CXX=yes + ;; + + openbsd* | bitrig*) + if test -f /usr/libexec/ld.so; then + hardcode_direct_CXX=yes + hardcode_shlibpath_var_CXX=no + hardcode_direct_absolute_CXX=yes + archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir' + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`"; then + archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file,$export_symbols -o $lib' + export_dynamic_flag_spec_CXX='$wl-E' + whole_archive_flag_spec_CXX=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' + fi + output_verbose_link_cmd=func_echo_all + else + ld_shlibs_CXX=no + fi + ;; + + osf3* | osf4* | osf5*) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + + hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir' + hardcode_libdir_separator_CXX=: + + # Archives containing C++ object files must be created using + # the KAI C++ compiler. + case $host in + osf3*) old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;; + *) old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' ;; + esac + ;; + RCC*) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + cxx*) + case $host in + osf3*) + allow_undefined_flag_CXX=' $wl-expect_unresolved $wl\*' + archive_cmds_CXX='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $soname `test -n "$verstring" && func_echo_all "$wl-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir' + ;; + *) + allow_undefined_flag_CXX=' -expect_unresolved \*' + archive_cmds_CXX='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ + echo "-hidden">> $lib.exp~ + $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname $wl-input $wl$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~ + $RM $lib.exp' + hardcode_libdir_flag_spec_CXX='-rpath $libdir' + ;; + esac + + hardcode_libdir_separator_CXX=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test yes,no = "$GXX,$with_gnu_ld"; then + allow_undefined_flag_CXX=' $wl-expect_unresolved $wl\*' + case $host in + osf3*) + archive_cmds_CXX='$CC -shared -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + ;; + *) + archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + ;; + esac + + hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir' + hardcode_libdir_separator_CXX=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + + else + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + fi + ;; + esac + ;; + + psos*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + lcc*) + # Lucid + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + solaris*) + case $cc_basename in + CC* | sunCC*) + # Sun C++ 4.2, 5.x and Centerline C++ + archive_cmds_need_lc_CXX=yes + no_undefined_flag_CXX=' -zdefs' + archive_cmds_CXX='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G$allow_undefined_flag $wl-M $wl$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + hardcode_libdir_flag_spec_CXX='-R$libdir' + hardcode_shlibpath_var_CXX=no + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands '-z linker_flag'. + # Supported since Solaris 2.6 (maybe 2.5.1?) + whole_archive_flag_spec_CXX='-z allextract$convenience -z defaultextract' + ;; + esac + link_all_deplibs_CXX=yes + + output_verbose_link_cmd='func_echo_all' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' + ;; + gcx*) + # Green Hills C++ Compiler + archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' + + # The C++ compiler must be used to create the archive. + old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs' + ;; + *) + # GNU C++ compiler with Solaris linker + if test yes,no = "$GXX,$with_gnu_ld"; then + no_undefined_flag_CXX=' $wl-z ${wl}defs' + if $CC --version | $GREP -v '^2\.7' > /dev/null; then + archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' + archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared $pic_flag -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + else + # g++ 2.7 appears to require '-G' NOT '-shared' on this + # platform. + archive_cmds_CXX='$CC -G -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' + archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + fi + + hardcode_libdir_flag_spec_CXX='$wl-R $wl$libdir' + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) + whole_archive_flag_spec_CXX='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' + ;; + esac + fi + ;; + esac + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) + no_undefined_flag_CXX='$wl-z,text' + archive_cmds_need_lc_CXX=no + hardcode_shlibpath_var_CXX=no + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + archive_cmds_CXX='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_CXX='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds_CXX='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_CXX='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We CANNOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + no_undefined_flag_CXX='$wl-z,text' + allow_undefined_flag_CXX='$wl-z,nodefs' + archive_cmds_need_lc_CXX=no + hardcode_shlibpath_var_CXX=no + hardcode_libdir_flag_spec_CXX='$wl-R,$libdir' + hardcode_libdir_separator_CXX=':' + link_all_deplibs_CXX=yes + export_dynamic_flag_spec_CXX='$wl-Bexport' + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + archive_cmds_CXX='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_CXX='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + old_archive_cmds_CXX='$CC -Tprelink_objects $oldobjs~ + '"$old_archive_cmds_CXX" + reload_cmds_CXX='$CC -Tprelink_objects $reload_objs~ + '"$reload_cmds_CXX" + ;; + *) + archive_cmds_CXX='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_CXX='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + vxworks*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 +printf "%s\n" "$ld_shlibs_CXX" >&6; } + test no = "$ld_shlibs_CXX" && can_build_shared=no + + GCC_CXX=$GXX + LD_CXX=$LD + + ## CAVEAT EMPTOR: + ## There is no encapsulation within the following macros, do not change + ## the running order or otherwise move them around unless you know exactly + ## what you are doing... + # Dependencies to place before and after the object being linked: +predep_objects_CXX= +postdep_objects_CXX= +predeps_CXX= +postdeps_CXX= +compiler_lib_search_path_CXX= + +cat > conftest.$ac_ext <<_LT_EOF +class Foo +{ +public: + Foo (void) { a = 0; } +private: + int a; +}; +_LT_EOF + + +_lt_libdeps_save_CFLAGS=$CFLAGS +case "$CC $CFLAGS " in #( +*\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; +*\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; +*\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; +esac + +if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + # Parse the compiler output and extract the necessary + # objects, libraries and library flags. + + # Sentinel used to keep track of whether or not we are before + # the conftest object file. + pre_test_object_deps_done=no + + for p in `eval "$output_verbose_link_cmd"`; do + case $prev$p in + + -L* | -R* | -l*) + # Some compilers place space between "-{L,R}" and the path. + # Remove the space. + if test x-L = "$p" || + test x-R = "$p"; then + prev=$p + continue + fi + + # Expand the sysroot to ease extracting the directories later. + if test -z "$prev"; then + case $p in + -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; + -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; + -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; + esac + fi + case $p in + =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; + esac + if test no = "$pre_test_object_deps_done"; then + case $prev in + -L | -R) + # Internal compiler library paths should come after those + # provided the user. The postdeps already come after the + # user supplied libs so there is no need to process them. + if test -z "$compiler_lib_search_path_CXX"; then + compiler_lib_search_path_CXX=$prev$p + else + compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} $prev$p" + fi + ;; + # The "-l" case would never come before the object being + # linked, so don't bother handling this case. + esac + else + if test -z "$postdeps_CXX"; then + postdeps_CXX=$prev$p + else + postdeps_CXX="${postdeps_CXX} $prev$p" + fi + fi + prev= + ;; + + *.lto.$objext) ;; # Ignore GCC LTO objects + *.$objext) + # This assumes that the test object file only shows up + # once in the compiler output. + if test "$p" = "conftest.$objext"; then + pre_test_object_deps_done=yes + continue + fi + + if test no = "$pre_test_object_deps_done"; then + if test -z "$predep_objects_CXX"; then + predep_objects_CXX=$p + else + predep_objects_CXX="$predep_objects_CXX $p" + fi + else + if test -z "$postdep_objects_CXX"; then + postdep_objects_CXX=$p + else + postdep_objects_CXX="$postdep_objects_CXX $p" + fi + fi + ;; + + *) ;; # Ignore the rest. + + esac + done + + # Clean up. + rm -f a.out a.exe +else + echo "libtool.m4: error: problem compiling CXX test program" +fi + +$RM -f confest.$objext +CFLAGS=$_lt_libdeps_save_CFLAGS + +# PORTME: override above test on systems where it is broken +case $host_os in +interix[3-9]*) + # Interix 3.5 installs completely hosed .la files for C++, so rather than + # hack all around it, let's just trust "g++" to DTRT. + predep_objects_CXX= + postdep_objects_CXX= + postdeps_CXX= + ;; +esac + + +case " $postdeps_CXX " in +*" -lc "*) archive_cmds_need_lc_CXX=no ;; +esac + compiler_lib_search_dirs_CXX= +if test -n "${compiler_lib_search_path_CXX}"; then + compiler_lib_search_dirs_CXX=`echo " ${compiler_lib_search_path_CXX}" | $SED -e 's! -L! !g' -e 's!^ !!'` +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + lt_prog_compiler_wl_CXX= +lt_prog_compiler_pic_CXX= +lt_prog_compiler_static_CXX= + + + # C++ specific cases for pic, static, wl, etc. + if test yes = "$GXX"; then + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static_CXX='-Bstatic' + fi + lt_prog_compiler_pic_CXX='-fPIC' + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + lt_prog_compiler_pic_CXX='-fPIC' + ;; + m68k) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the '-m68020' flag to GCC prevents building anything better, + # like '-m68040'. + lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + mingw* | cygwin* | os2* | pw32* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + lt_prog_compiler_pic_CXX='-DDLL_EXPORT' + case $host_os in + os2*) + lt_prog_compiler_static_CXX='$wl-static' + ;; + esac + ;; + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic_CXX='-fno-common' + ;; + *djgpp*) + # DJGPP does not support shared libraries at all + lt_prog_compiler_pic_CXX= + ;; + haiku*) + # PIC is the default for Haiku. + # The "-static" flag exists, but is broken. + lt_prog_compiler_static_CXX= + ;; + interix[3-9]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic_CXX=-Kconform_pic + fi + ;; + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + ;; + *) + lt_prog_compiler_pic_CXX='-fPIC' + ;; + esac + ;; + *qnx* | *nto*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic_CXX='-fPIC -shared' + ;; + *) + lt_prog_compiler_pic_CXX='-fPIC' + ;; + esac + else + case $host_os in + aix[4-9]*) + # All AIX code is PIC. + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static_CXX='-Bstatic' + else + lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp' + fi + ;; + chorus*) + case $cc_basename in + cxch68*) + # Green Hills C++ Compiler + # _LT_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" + ;; + esac + ;; + mingw* | cygwin* | os2* | pw32* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_prog_compiler_pic_CXX='-DDLL_EXPORT' + ;; + dgux*) + case $cc_basename in + ec++*) + lt_prog_compiler_pic_CXX='-KPIC' + ;; + ghcx*) + # Green Hills C++ Compiler + lt_prog_compiler_pic_CXX='-pic' + ;; + *) + ;; + esac + ;; + freebsd* | dragonfly*) + # FreeBSD uses GNU C++ + ;; + hpux9* | hpux10* | hpux11*) + case $cc_basename in + CC*) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='$wl-a ${wl}archive' + if test ia64 != "$host_cpu"; then + lt_prog_compiler_pic_CXX='+Z' + fi + ;; + aCC*) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='$wl-a ${wl}archive' + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic_CXX='+Z' + ;; + esac + ;; + *) + ;; + esac + ;; + interix*) + # This is c89, which is MS Visual C++ (no shared libs) + # Anyone wants to do a port? + ;; + irix5* | irix6* | nonstopux*) + case $cc_basename in + CC*) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='-non_shared' + # CC pic flag -KPIC is the default. + ;; + *) + ;; + esac + ;; + linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + case $cc_basename in + KCC*) + # KAI C++ Compiler + lt_prog_compiler_wl_CXX='--backend -Wl,' + lt_prog_compiler_pic_CXX='-fPIC' + ;; + ecpc* ) + # old Intel C++ for x86_64, which still supported -KPIC. + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-static' + ;; + icpc* ) + # Intel C++, used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-fPIC' + lt_prog_compiler_static_CXX='-static' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-fpic' + lt_prog_compiler_static_CXX='-Bstatic' + ;; + cxx*) + # Compaq C++ + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + lt_prog_compiler_pic_CXX= + lt_prog_compiler_static_CXX='-non_shared' + ;; + xlc* | xlC* | bgxl[cC]* | mpixl[cC]*) + # IBM XL 8.0, 9.0 on PPC and BlueGene + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-qpic' + lt_prog_compiler_static_CXX='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-Bstatic' + lt_prog_compiler_wl_CXX='-Qoption ld ' + ;; + esac + ;; + esac + ;; + lynxos*) + ;; + m88k*) + ;; + mvs*) + case $cc_basename in + cxx*) + lt_prog_compiler_pic_CXX='-W c,exportall' + ;; + *) + ;; + esac + ;; + netbsd*) + ;; + *qnx* | *nto*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic_CXX='-fPIC -shared' + ;; + osf3* | osf4* | osf5*) + case $cc_basename in + KCC*) + lt_prog_compiler_wl_CXX='--backend -Wl,' + ;; + RCC*) + # Rational C++ 2.4.1 + lt_prog_compiler_pic_CXX='-pic' + ;; + cxx*) + # Digital/Compaq C++ + lt_prog_compiler_wl_CXX='-Wl,' + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + lt_prog_compiler_pic_CXX= + lt_prog_compiler_static_CXX='-non_shared' + ;; + *) + ;; + esac + ;; + psos*) + ;; + solaris*) + case $cc_basename in + CC* | sunCC*) + # Sun C++ 4.2, 5.x and Centerline C++ + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-Bstatic' + lt_prog_compiler_wl_CXX='-Qoption ld ' + ;; + gcx*) + # Green Hills C++ Compiler + lt_prog_compiler_pic_CXX='-PIC' + ;; + *) + ;; + esac + ;; + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + lt_prog_compiler_pic_CXX='-pic' + lt_prog_compiler_static_CXX='-Bstatic' + ;; + lcc*) + # Lucid + lt_prog_compiler_pic_CXX='-pic' + ;; + *) + ;; + esac + ;; + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + case $cc_basename in + CC*) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-Bstatic' + ;; + esac + ;; + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + lt_prog_compiler_pic_CXX='-KPIC' + ;; + *) + ;; + esac + ;; + vxworks*) + ;; + *) + lt_prog_compiler_can_build_shared_CXX=no + ;; + esac + fi + +case $host_os in + # For platforms that do not support PIC, -DPIC is meaningless: + *djgpp*) + lt_prog_compiler_pic_CXX= + ;; + *) + lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX@&t@ -DPIC" + ;; +esac + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 +printf %s "checking for $compiler option to produce PIC... " >&6; } +if test ${lt_cv_prog_compiler_pic_CXX+y} +then : + printf %s "(cached) " >&6 +else $as_nop + lt_cv_prog_compiler_pic_CXX=$lt_prog_compiler_pic_CXX +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_CXX" >&5 +printf "%s\n" "$lt_cv_prog_compiler_pic_CXX" >&6; } +lt_prog_compiler_pic_CXX=$lt_cv_prog_compiler_pic_CXX + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$lt_prog_compiler_pic_CXX"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5 +printf %s "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... " >&6; } +if test ${lt_cv_prog_compiler_pic_works_CXX+y} +then : + printf %s "(cached) " >&6 +else $as_nop + lt_cv_prog_compiler_pic_works_CXX=no + ac_outfile=conftest.$ac_objext + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$lt_prog_compiler_pic_CXX@&t@ -DPIC" ## exclude from sc_useless_quotes_in_assignment + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_pic_works_CXX=yes + fi + fi + $RM conftest* + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_CXX" >&5 +printf "%s\n" "$lt_cv_prog_compiler_pic_works_CXX" >&6; } + +if test yes = "$lt_cv_prog_compiler_pic_works_CXX"; then + case $lt_prog_compiler_pic_CXX in + "" | " "*) ;; + *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;; + esac +else + lt_prog_compiler_pic_CXX= + lt_prog_compiler_can_build_shared_CXX=no +fi + +fi + + + + + +# +# Check to make sure the static flag actually works. +# +wl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\"$lt_prog_compiler_static_CXX\" +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 +printf %s "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } +if test ${lt_cv_prog_compiler_static_works_CXX+y} +then : + printf %s "(cached) " >&6 +else $as_nop + lt_cv_prog_compiler_static_works_CXX=no + save_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS $lt_tmp_static_flag" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&5 + $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_static_works_CXX=yes + fi + else + lt_cv_prog_compiler_static_works_CXX=yes + fi + fi + $RM -r conftest* + LDFLAGS=$save_LDFLAGS + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_CXX" >&5 +printf "%s\n" "$lt_cv_prog_compiler_static_works_CXX" >&6; } + +if test yes = "$lt_cv_prog_compiler_static_works_CXX"; then + : +else + lt_prog_compiler_static_CXX= +fi + + + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +printf %s "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if test ${lt_cv_prog_compiler_c_o_CXX+y} +then : + printf %s "(cached) " >&6 +else $as_nop + lt_cv_prog_compiler_c_o_CXX=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o_CXX=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 +printf "%s\n" "$lt_cv_prog_compiler_c_o_CXX" >&6; } + + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +printf %s "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if test ${lt_cv_prog_compiler_c_o_CXX+y} +then : + printf %s "(cached) " >&6 +else $as_nop + lt_cv_prog_compiler_c_o_CXX=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o_CXX=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 +printf "%s\n" "$lt_cv_prog_compiler_c_o_CXX" >&6; } + + + + +hard_links=nottested +if test no = "$lt_cv_prog_compiler_c_o_CXX" && test no != "$need_locks"; then + # do not overwrite the value of need_locks provided by the user + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 +printf %s "checking if we can lock with hard links... " >&6; } + hard_links=yes + $RM conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 +printf "%s\n" "$hard_links" >&6; } + if test no = "$hard_links"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&5 +printf "%s\n" "$as_me: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&2;} + need_locks=warn + fi +else + need_locks=no +fi + + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +printf %s "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } + + export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + exclude_expsyms_CXX='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' + case $host_os in + aix[4-9]*) + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to GNU nm, but means don't demangle to AIX nm. + # Without the "-l" option, or with the "-B" option, AIX nm treats + # weak defined symbols like other global defined symbols, whereas + # GNU nm marks them as "W". + # While the 'weak' keyword is ignored in the Export File, we need + # it in the Import File for the 'aix-soname' feature, so we have + # to replace the "-B" option with "-P" for AIX nm. + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' + else + export_symbols_cmds_CXX='`func_echo_all $NM | $SED -e '\''s/B\([^B]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && (substr(\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' + fi + ;; + pw32*) + export_symbols_cmds_CXX=$ltdll_cmds + ;; + cygwin* | mingw* | cegcc*) + case $cc_basename in + cl*) + exclude_expsyms_CXX='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' + ;; + *) + export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' + exclude_expsyms_CXX='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' + ;; + esac + ;; + *) + export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + ;; + esac + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 +printf "%s\n" "$ld_shlibs_CXX" >&6; } +test no = "$ld_shlibs_CXX" && can_build_shared=no + +with_gnu_ld_CXX=$with_gnu_ld + + + + + + +# +# Do we need to explicitly link libc? +# +case "x$archive_cmds_need_lc_CXX" in +x|xyes) + # Assume -lc should be added + archive_cmds_need_lc_CXX=yes + + if test yes,yes = "$GCC,$enable_shared"; then + case $archive_cmds_CXX in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 +printf %s "checking whether -lc should be explicitly linked in... " >&6; } +if test ${lt_cv_archive_cmds_need_lc_CXX+y} +then : + printf %s "(cached) " >&6 +else $as_nop + $RM conftest* + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$lt_prog_compiler_wl_CXX + pic_flag=$lt_prog_compiler_pic_CXX + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$allow_undefined_flag_CXX + allow_undefined_flag_CXX= + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 + (eval $archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + then + lt_cv_archive_cmds_need_lc_CXX=no + else + lt_cv_archive_cmds_need_lc_CXX=yes + fi + allow_undefined_flag_CXX=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $RM conftest* + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc_CXX" >&5 +printf "%s\n" "$lt_cv_archive_cmds_need_lc_CXX" >&6; } + archive_cmds_need_lc_CXX=$lt_cv_archive_cmds_need_lc_CXX + ;; + esac + fi + ;; +esac + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 +printf %s "checking dynamic linker characteristics... " >&6; } + +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=.so +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + + + +case $host_os in +aix3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='$libname$release$shared_ext$major' + ;; + +aix[4-9]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test ia64 = "$host_cpu"; then + # AIX 5 supports IA64 + library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line '#! .'. This would cause the generated library to + # depend on '.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[01] | aix4.[01].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # Using Import Files as archive members, it is possible to support + # filename-based versioning of shared library archives on AIX. While + # this would work for both with and without runtime linking, it will + # prevent static linking of such archives. So we do filename-based + # shared library versioning with .so extension only, which is used + # when both runtime linking and shared linking is enabled. + # Unfortunately, runtime linking may impact performance, so we do + # not want this to be the default eventually. Also, we use the + # versioned .so libs for executables only if there is the -brtl + # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only. + # To allow for filename-based versioning support, we need to create + # libNAME.so.V as an archive file, containing: + # *) an Import File, referring to the versioned filename of the + # archive as well as the shared archive member, telling the + # bitwidth (32 or 64) of that shared object, and providing the + # list of exported symbols of that shared object, eventually + # decorated with the 'weak' keyword + # *) the shared object with the F_LOADONLY flag set, to really avoid + # it being seen by the linker. + # At run time we better use the real file rather than another symlink, + # but for link time we create the symlink libNAME.so -> libNAME.so.V + + case $with_aix_soname,$aix_use_runtimelinking in + # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + aix,yes) # traditional libtool + dynamic_linker='AIX unversionable lib.so' + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + ;; + aix,no) # traditional AIX only + dynamic_linker='AIX lib.a(lib.so.V)' + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='$libname$release.a $libname.a' + soname_spec='$libname$release$shared_ext$major' + ;; + svr4,*) # full svr4 only + dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o)" + library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' + # We do not specify a path in Import Files, so LIBPATH fires. + shlibpath_overrides_runpath=yes + ;; + *,yes) # both, prefer svr4 + dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o), lib.a(lib.so.V)" + library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' + # unpreferred sharedlib libNAME.a needs extra handling + postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"' + postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"' + # We do not specify a path in Import Files, so LIBPATH fires. + shlibpath_overrides_runpath=yes + ;; + *,no) # both, prefer aix + dynamic_linker="AIX lib.a(lib.so.V), lib.so.V($shared_archive_member_spec.o)" + library_names_spec='$libname$release.a $libname.a' + soname_spec='$libname$release$shared_ext$major' + # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling + postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)' + postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"' + ;; + esac + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + case $host_cpu in + powerpc) + # Since July 2007 AmigaOS4 officially supports .so libraries. + # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + ;; + m68k) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + esac + ;; + +beos*) + library_names_spec='$libname$shared_ext' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[45]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32* | cegcc*) + version_type=windows + shrext_cmds=.dll + need_version=no + need_lib_prefix=no + + case $GCC,$cc_basename in + yes,*) + # gcc + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo $libname | sed -e 's/^lib/cyg/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + + ;; + mingw* | cegcc*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo $libname | sed -e 's/^lib/pw/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + ;; + esac + dynamic_linker='Win32 ld.exe' + ;; + + *,cl*) + # Native MSVC + libname_spec='$name' + soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + library_names_spec='$libname.dll.lib' + + case $build_os in + mingw*) + sys_lib_search_path_spec= + lt_save_ifs=$IFS + IFS=';' + for lt_path in $LIB + do + IFS=$lt_save_ifs + # Let DOS variable expansion print the short 8.3 style file name. + lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` + sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" + done + IFS=$lt_save_ifs + # Convert to MSYS style. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` + ;; + cygwin*) + # Convert to unix form, then to dos form, then back to unix form + # but this time dos style (no spaces!) so that the unix form looks + # like /cygdrive/c/PROGRA~1:/cygdr... + sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` + sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` + sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + ;; + *) + sys_lib_search_path_spec=$LIB + if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then + # It is most probably a Windows format PATH. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + # FIXME: find the short name or the path components, as spaces are + # common. (e.g. "Program Files" -> "PROGRA~1") + ;; + esac + + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + dynamic_linker='Win32 link.exe' + ;; + + *) + # Assume MSVC wrapper + library_names_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext $libname.lib' + dynamic_linker='Win32 ld.exe' + ;; + esac + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$major$shared_ext $libname$shared_ext' + soname_spec='$libname$release$major$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' + + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[23].*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2.*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[01]* | freebsdelf3.[01]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ + freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + *) # from 4.6 on, and DragonFly + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +haiku*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + dynamic_linker="$host_os runtime_loader" + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LIBRARY_PATH + shlibpath_overrides_runpath=no + sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + if test 32 = "$HPUX_IA64_MODE"; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + sys_lib_dlsearch_path_spec=/usr/lib/hpux32 + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + sys_lib_dlsearch_path_spec=/usr/lib/hpux64 + fi + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555, ... + postinstall_cmds='chmod 555 $lib' + # or fails outright, so override atomically: + install_override_mode=555 + ;; + +interix[3-9]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test yes = "$lt_cv_prog_gnu_ld"; then + version_type=linux # correct to gnu/linux during the next big refactor + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='$libname$release$shared_ext$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff" + sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +linux*android*) + version_type=none # Android doesn't support versioned libraries. + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext' + soname_spec='$libname$release$shared_ext' + finish_cmds= + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + dynamic_linker='Android linker' + # Don't embed -rpath directories since the linker doesn't support them. + hardcode_libdir_flag_spec_CXX='-L$libdir' + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + + # Some binutils ld are patched to set DT_RUNPATH + if test ${lt_cv_shlibpath_overrides_runpath+y} +then : + printf %s "(cached) " >&6 +else $as_nop + lt_cv_shlibpath_overrides_runpath=no + save_LDFLAGS=$LDFLAGS + save_libdir=$libdir + eval "libdir=/foo; wl=\"$lt_prog_compiler_wl_CXX\"; \ + LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec_CXX\"" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_link "$LINENO" +then : + if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null +then : + lt_cv_shlibpath_overrides_runpath=yes +fi +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$save_LDFLAGS + libdir=$save_libdir + +fi + + shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # Ideally, we could use ldconfig to report *all* directores which are + # searched for libraries, however this is still not possible. Aside from not + # being certain /sbin/ldconfig is available, command + # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64, + # even though it is searched at run-time. Try to do the best guess by + # appending ld.so.conf contents (and includes) to the search path. + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +*nto* | *qnx*) + version_type=qnx + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='ldqnx.so' + ;; + +openbsd* | bitrig*) + version_type=sunos + sys_lib_dlsearch_path_spec=/usr/lib + need_lib_prefix=no + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then + need_version=no + else + need_version=yes + fi + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +os2*) + libname_spec='$name' + version_type=windows + shrext_cmds=.dll + need_version=no + need_lib_prefix=no + # OS/2 can only load a DLL with a base name of 8 characters or less. + soname_spec='`test -n "$os2dllname" && libname="$os2dllname"; + v=$($ECHO $release$versuffix | tr -d .-); + n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _); + $ECHO $n$v`$shared_ext' + library_names_spec='${libname}_dll.$libext' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=BEGINLIBPATH + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='$libname$release$shared_ext$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + +rdos*) + dynamic_linker=no + ;; + +solaris*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test yes = "$with_gnu_ld"; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec; then + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext' + soname_spec='$libname$shared_ext.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=sco + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + if test yes = "$with_gnu_ld"; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + +tpf*) + # TPF is a cross-target only. Preferred cross-host = GNU/Linux. + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +uts4*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 +printf "%s\n" "$dynamic_linker" >&6; } +test no = "$dynamic_linker" && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test yes = "$GCC"; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then + sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec +fi + +if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then + sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec +fi + +# remember unaugmented sys_lib_dlsearch_path content for libtool script decls... +configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec + +# ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code +func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH" + +# to be used as default LT_SYS_LIBRARY_PATH value in generated libtool +configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 +printf %s "checking how to hardcode library paths into programs... " >&6; } +hardcode_action_CXX= +if test -n "$hardcode_libdir_flag_spec_CXX" || + test -n "$runpath_var_CXX" || + test yes = "$hardcode_automatic_CXX"; then + + # We can hardcode non-existent directories. + if test no != "$hardcode_direct_CXX" && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, CXX)" && + test no != "$hardcode_minus_L_CXX"; then + # Linking always hardcodes the temporary library directory. + hardcode_action_CXX=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + hardcode_action_CXX=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + hardcode_action_CXX=unsupported +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_CXX" >&5 +printf "%s\n" "$hardcode_action_CXX" >&6; } + +if test relink = "$hardcode_action_CXX" || + test yes = "$inherit_rpath_CXX"; then + # Fast installation is not supported + enable_fast_install=no +elif test yes = "$shlibpath_overrides_runpath" || + test no = "$enable_shared"; then + # Fast installation is not necessary + enable_fast_install=needless +fi + + + + + + + + fi # test -n "$compiler" + + CC=$lt_save_CC + CFLAGS=$lt_save_CFLAGS + LDCXX=$LD + LD=$lt_save_LD + GCC=$lt_save_GCC + with_gnu_ld=$lt_save_with_gnu_ld + lt_cv_path_LDCXX=$lt_cv_path_LD + lt_cv_path_LD=$lt_save_path_LD + lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld + lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld +fi # test yes != "$_lt_caught_CXX_error" + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + + + + + + + + + + + + + + ac_config_commands="$ac_config_commands libtool" + + + + +# Only expand once: + + + +# Transfer these variables to the Makefile + + + + + +ac_config_files="$ac_config_files Makefile lib/Makefile include/Makefile bin/Makefile doc/Makefile portaudiocpp.pc" + +cat >confcache <<\_ACEOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs, see configure's option --config-cache. +# It is not useful on other systems. If it contains results you don't +# want to keep, you may remove or edit it. +# +# config.status only pays attention to the cache file if you give it +# the --recheck option to rerun configure. +# +# `ac_cv_env_foo' variables (set or unset) will be overridden when +# loading this file, other *unset* `ac_cv_foo' will be assigned the +# following values. + +_ACEOF + +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, we kill variables containing newlines. +# Ultrix sh set writes to stderr and can't be redirected directly, +# and sets the high bit in the cache file unless we assign to the vars. +( + for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + + (set) 2>&1 | + case $as_nl`(ac_space=' '; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + # `set' does not quote correctly, so add quotes: double-quote + # substitution turns \\\\ into \\, and sed turns \\ into \. + sed -n \ + "s/'/'\\\\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" + ;; #( + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) | + sed ' + /^ac_cv_env_/b end + t clear + :clear + s/^\([^=]*\)=\(.*[{}].*\)$/test ${\1+y} || &/ + t end + s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ + :end' >>confcache +if diff "$cache_file" confcache >/dev/null 2>&1; then :; else + if test -w "$cache_file"; then + if test "x$cache_file" != "x/dev/null"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 +printf "%s\n" "$as_me: updating cache $cache_file" >&6;} + if test ! -f "$cache_file" || test -h "$cache_file"; then + cat confcache >"$cache_file" + else + case $cache_file in #( + */* | ?:*) + mv -f confcache "$cache_file"$$ && + mv -f "$cache_file"$$ "$cache_file" ;; #( + *) + mv -f confcache "$cache_file" ;; + esac + fi + fi + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 +printf "%s\n" "$as_me: not updating unwritable cache $cache_file" >&6;} + fi +fi +rm -f confcache + +test "x$prefix" = xNONE && prefix=$ac_default_prefix +# Let make expand exec_prefix. +test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' + +# Transform confdefs.h into DEFS. +# Protect against shell expansion while executing Makefile rules. +# Protect against Makefile macro expansion. +# +# If the first sed substitution is executed (which looks for macros that +# take arguments), then branch to the quote section. Otherwise, +# look for a macro that doesn't take arguments. +ac_script=' +:mline +/\\$/{ + N + s,\\\n,, + b mline +} +t clear +:clear +s/^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\)/-D\1=\2/g +t quote +s/^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)/-D\1=\2/g +t quote +b any +:quote +s/[ `~#$^&*(){}\\|;'\''"<>?]/\\&/g +s/\[/\\&/g +s/\]/\\&/g +s/\$/$$/g +H +:any +${ + g + s/^\n// + s/\n/ /g + p +} +' +DEFS=`sed -n "$ac_script" confdefs.h` + + +ac_libobjs= +ac_ltlibobjs= +U= +for ac_i in : $LIB@&t@OBJS; do test "x$ac_i" = x: && continue + # 1. Remove the extension, and $U if already installed. + ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' + ac_i=`printf "%s\n" "$ac_i" | sed "$ac_script"` + # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR + # will be set to the directory where LIBOBJS objects are built. + as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" + as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' +done +LIB@&t@OBJS=$ac_libobjs + +LTLIBOBJS=$ac_ltlibobjs + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 +printf %s "checking that generated files are newer than configure... " >&6; } + if test -n "$am_sleep_pid"; then + # Hide warnings about reused PIDs. + wait $am_sleep_pid 2>/dev/null + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: done" >&5 +printf "%s\n" "done" >&6; } + if test -n "$EXEEXT"; then + am__EXEEXT_TRUE= + am__EXEEXT_FALSE='#' +else + am__EXEEXT_TRUE='#' + am__EXEEXT_FALSE= +fi + +if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then + as_fn_error $? "conditional \"MAINTAINER_MODE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then + as_fn_error $? "conditional \"AMDEP\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then + as_fn_error $? "conditional \"am__fastdepCC\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then + as_fn_error $? "conditional \"am__fastdepCXX\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi + +: "${CONFIG_STATUS=./config.status}" +ac_write_fail=0 +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files $CONFIG_STATUS" +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 +printf "%s\n" "$as_me: creating $CONFIG_STATUS" >&6;} +as_write_fail=0 +cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 +#! $SHELL +# Generated by $as_me. +# Run this file to recreate the current configuration. +# Compiler output produced by configure, useful for debugging +# configure, is in config.log if it exists. + +debug=false +ac_cs_recheck=false +ac_cs_silent=false + +SHELL=\${CONFIG_SHELL-$SHELL} +export SHELL +_ASEOF +cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +as_nop=: +if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 +then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else $as_nop + case `(set -o) 2>/dev/null` in @%:@( + *posix*) : + set -o posix ;; @%:@( + *) : + ;; +esac +fi + + + +# Reset variables that may have inherited troublesome values from +# the environment. + +# IFS needs to be set, to space, tab, and newline, in precisely that order. +# (If _AS_PATH_WALK were called with IFS unset, it would have the +# side effect of setting IFS to empty, thus disabling word splitting.) +# Quoting is to prevent editors from complaining about space-tab. +as_nl=' +' +export as_nl +IFS=" "" $as_nl" + +PS1='$ ' +PS2='> ' +PS4='+ ' + +# Ensure predictable behavior from utilities with locale-dependent output. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# We cannot yet rely on "unset" to work, but we need these variables +# to be unset--not just set to an empty or harmless value--now, to +# avoid bugs in old shells (e.g. pre-3.0 UWIN ksh). This construct +# also avoids known problems related to "unset" and subshell syntax +# in other old shells (e.g. bash 2.01 and pdksh 5.2.14). +for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH +do eval test \${$as_var+y} \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done + +# Ensure that fds 0, 1, and 2 are open. +if (exec 3>&0) 2>/dev/null; then :; else exec 0&1) 2>/dev/null; then :; else exec 1>/dev/null; fi +if (exec 3>&2) ; then :; else exec 2>/dev/null; fi + +# The user is always right. +if ${PATH_SEPARATOR+false} :; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# Find who we are. Look in the path if we contain no directory separator. +as_myself= +case $0 in @%:@(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + test -r "$as_dir$0" && as_myself=$as_dir$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + + + +@%:@ as_fn_error STATUS ERROR [LINENO LOG_FD] +@%:@ ---------------------------------------- +@%:@ Output "`basename @S|@0`: error: ERROR" to stderr. If LINENO and LOG_FD are +@%:@ provided, also output the error to LOG_FD, referencing LINENO. Then exit the +@%:@ script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + printf "%s\n" "$as_me: error: $2" >&2 + as_fn_exit $as_status +} @%:@ as_fn_error + + + +@%:@ as_fn_set_status STATUS +@%:@ ----------------------- +@%:@ Set @S|@? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} @%:@ as_fn_set_status + +@%:@ as_fn_exit STATUS +@%:@ ----------------- +@%:@ Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} @%:@ as_fn_exit + +@%:@ as_fn_unset VAR +@%:@ --------------- +@%:@ Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset + +@%:@ as_fn_append VAR VALUE +@%:@ ---------------------- +@%:@ Append the text in VALUE to the end of the definition contained in VAR. Take +@%:@ advantage of any shell optimizations that allow amortized linear growth over +@%:@ repeated appends, instead of the typical quadratic growth present in naive +@%:@ implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null +then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else $as_nop + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +@%:@ as_fn_arith ARG... +@%:@ ------------------ +@%:@ Perform arithmetic evaluation on the ARGs, and store the result in the +@%:@ global @S|@as_val. Take advantage of shells that can avoid forks. The arguments +@%:@ must be portable across @S|@(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null +then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else $as_nop + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +printf "%s\n" X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + + +# Determine whether it's possible to make 'echo' print without a newline. +# These variables are no longer used directly by Autoconf, but are AC_SUBSTed +# for compatibility with existing Makefiles. +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in @%:@((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +# For backward compatibility with old third-party macros, we provide +# the shell variables $as_echo and $as_echo_n. New code should use +# AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively. +as_@&t@echo='printf %s\n' +as_@&t@echo_n='printf %s' + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -pR'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -pR' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -pR' + fi +else + as_ln_s='cp -pR' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + + +@%:@ as_fn_mkdir_p +@%:@ ------------- +@%:@ Create "@S|@as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`printf "%s\n" "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +printf "%s\n" X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} @%:@ as_fn_mkdir_p +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + + +@%:@ as_fn_executable_p FILE +@%:@ ----------------------- +@%:@ Test if FILE is an executable regular file. +as_fn_executable_p () +{ + test -f "$1" && test -x "$1" +} @%:@ as_fn_executable_p +as_test_x='test -x' +as_executable_p=as_fn_executable_p + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +exec 6>&1 +## ----------------------------------- ## +## Main body of $CONFIG_STATUS script. ## +## ----------------------------------- ## +_ASEOF +test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# Save the log message, to keep $0 and so on meaningful, and to +# report actual input values of CONFIG_FILES etc. instead of their +# values after options handling. +ac_log=" +This file was extended by PortAudioCpp $as_me 12, which was +generated by GNU Autoconf 2.71. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES + CONFIG_HEADERS = $CONFIG_HEADERS + CONFIG_LINKS = $CONFIG_LINKS + CONFIG_COMMANDS = $CONFIG_COMMANDS + $ $0 $@ + +on `(hostname || uname -n) 2>/dev/null | sed 1q` +" + +_ACEOF + +case $ac_config_files in *" +"*) set x $ac_config_files; shift; ac_config_files=$*;; +esac + + + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# Files that config.status was made for. +config_files="$ac_config_files" +config_commands="$ac_config_commands" + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +ac_cs_usage="\ +\`$as_me' instantiates files and other configuration actions +from templates according to the current configuration. Unless the files +and actions are specified as TAGs, all are instantiated by default. + +Usage: $0 [OPTION]... [TAG]... + + -h, --help print this help, then exit + -V, --version print version number and configuration settings, then exit + --config print configuration, then exit + -q, --quiet, --silent + do not print progress messages + -d, --debug don't remove temporary files + --recheck update $as_me by reconfiguring in the same conditions + --file=FILE[:TEMPLATE] + instantiate the configuration file FILE + +Configuration files: +$config_files + +Configuration commands: +$config_commands + +Report bugs to the package provider." + +_ACEOF +ac_cs_config=`printf "%s\n" "$ac_configure_args" | sed "$ac_safe_unquote"` +ac_cs_config_escaped=`printf "%s\n" "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\''/g"` +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_cs_config='$ac_cs_config_escaped' +ac_cs_version="\\ +PortAudioCpp config.status 12 +configured by $0, generated by GNU Autoconf 2.71, + with options \\"\$ac_cs_config\\" + +Copyright (C) 2021 Free Software Foundation, Inc. +This config.status script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it." + +ac_pwd='$ac_pwd' +srcdir='$srcdir' +INSTALL='$INSTALL' +MKDIR_P='$MKDIR_P' +AWK='$AWK' +test -n "\$AWK" || AWK=awk +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# The default lists apply if the user does not specify any file. +ac_need_defaults=: +while test $# != 0 +do + case $1 in + --*=?*) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` + ac_shift=: + ;; + --*=) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg= + ac_shift=: + ;; + *) + ac_option=$1 + ac_optarg=$2 + ac_shift=shift + ;; + esac + + case $ac_option in + # Handling of the options. + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + ac_cs_recheck=: ;; + --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) + printf "%s\n" "$ac_cs_version"; exit ;; + --config | --confi | --conf | --con | --co | --c ) + printf "%s\n" "$ac_cs_config"; exit ;; + --debug | --debu | --deb | --de | --d | -d ) + debug=: ;; + --file | --fil | --fi | --f ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`printf "%s\n" "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + '') as_fn_error $? "missing file argument" ;; + esac + as_fn_append CONFIG_FILES " '$ac_optarg'" + ac_need_defaults=false;; + --he | --h | --help | --hel | -h ) + printf "%s\n" "$ac_cs_usage"; exit ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil | --si | --s) + ac_cs_silent=: ;; + + # This is an error. + -*) as_fn_error $? "unrecognized option: \`$1' +Try \`$0 --help' for more information." ;; + + *) as_fn_append ac_config_targets " $1" + ac_need_defaults=false ;; + + esac + shift +done + +ac_configure_extra_args= + +if $ac_cs_silent; then + exec 6>/dev/null + ac_configure_extra_args="$ac_configure_extra_args --silent" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +if \$ac_cs_recheck; then + set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion + shift + \printf "%s\n" "running CONFIG_SHELL=$SHELL \$*" >&6 + CONFIG_SHELL='$SHELL' + export CONFIG_SHELL + exec "\$@" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +exec 5>>config.log +{ + echo + sed 'h;s/./-/g;s/^.../@%:@@%:@ /;s/...$/ @%:@@%:@/;p;x;p;x' <<_ASBOX +@%:@@%:@ Running $as_me. @%:@@%:@ +_ASBOX + printf "%s\n" "$ac_log" +} >&5 + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# +# INIT-COMMANDS +# +AMDEP_TRUE="$AMDEP_TRUE" MAKE="${MAKE-make}" + + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +sed_quote_subst='$sed_quote_subst' +double_quote_subst='$double_quote_subst' +delay_variable_subst='$delay_variable_subst' +AS='`$ECHO "$AS" | $SED "$delay_single_quote_subst"`' +DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`' +OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`' +macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`' +macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`' +enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`' +enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`' +pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`' +enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`' +shared_archive_member_spec='`$ECHO "$shared_archive_member_spec" | $SED "$delay_single_quote_subst"`' +SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`' +ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`' +PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`' +host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`' +host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`' +host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`' +build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`' +build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`' +build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`' +SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`' +Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`' +GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`' +EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`' +FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`' +LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`' +NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`' +LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`' +max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`' +ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`' +exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`' +lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`' +lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`' +lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`' +lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`' +lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`' +reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`' +reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`' +deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`' +file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`' +file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`' +want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`' +sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`' +AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`' +AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`' +archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`' +STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`' +RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`' +old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`' +old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`' +old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`' +lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`' +CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`' +CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`' +compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`' +GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_import='`$ECHO "$lt_cv_sys_global_symbol_to_import" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`' +lt_cv_nm_interface='`$ECHO "$lt_cv_nm_interface" | $SED "$delay_single_quote_subst"`' +nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`' +lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`' +lt_cv_truncate_bin='`$ECHO "$lt_cv_truncate_bin" | $SED "$delay_single_quote_subst"`' +objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`' +MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`' +lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`' +need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`' +MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`' +DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`' +NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`' +LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`' +OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`' +OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`' +libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`' +shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`' +extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`' +archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`' +enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`' +export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`' +whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`' +compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`' +old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`' +old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`' +archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`' +archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`' +module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`' +module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`' +with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`' +allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`' +no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`' +hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`' +hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`' +hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`' +hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`' +hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`' +hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`' +hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`' +inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`' +link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`' +always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`' +export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`' +exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`' +include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`' +prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`' +postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`' +file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`' +variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`' +need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`' +need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`' +version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`' +runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`' +shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`' +shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`' +libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`' +library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`' +soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`' +install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`' +postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`' +postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`' +finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`' +finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`' +hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`' +sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`' +configure_time_dlsearch_path='`$ECHO "$configure_time_dlsearch_path" | $SED "$delay_single_quote_subst"`' +configure_time_lt_sys_library_path='`$ECHO "$configure_time_lt_sys_library_path" | $SED "$delay_single_quote_subst"`' +hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`' +enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`' +enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`' +enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`' +old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`' +striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`' +compiler_lib_search_dirs='`$ECHO "$compiler_lib_search_dirs" | $SED "$delay_single_quote_subst"`' +predep_objects='`$ECHO "$predep_objects" | $SED "$delay_single_quote_subst"`' +postdep_objects='`$ECHO "$postdep_objects" | $SED "$delay_single_quote_subst"`' +predeps='`$ECHO "$predeps" | $SED "$delay_single_quote_subst"`' +postdeps='`$ECHO "$postdeps" | $SED "$delay_single_quote_subst"`' +compiler_lib_search_path='`$ECHO "$compiler_lib_search_path" | $SED "$delay_single_quote_subst"`' +LD_CXX='`$ECHO "$LD_CXX" | $SED "$delay_single_quote_subst"`' +reload_flag_CXX='`$ECHO "$reload_flag_CXX" | $SED "$delay_single_quote_subst"`' +reload_cmds_CXX='`$ECHO "$reload_cmds_CXX" | $SED "$delay_single_quote_subst"`' +old_archive_cmds_CXX='`$ECHO "$old_archive_cmds_CXX" | $SED "$delay_single_quote_subst"`' +compiler_CXX='`$ECHO "$compiler_CXX" | $SED "$delay_single_quote_subst"`' +GCC_CXX='`$ECHO "$GCC_CXX" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_no_builtin_flag_CXX='`$ECHO "$lt_prog_compiler_no_builtin_flag_CXX" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_pic_CXX='`$ECHO "$lt_prog_compiler_pic_CXX" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_wl_CXX='`$ECHO "$lt_prog_compiler_wl_CXX" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_static_CXX='`$ECHO "$lt_prog_compiler_static_CXX" | $SED "$delay_single_quote_subst"`' +lt_cv_prog_compiler_c_o_CXX='`$ECHO "$lt_cv_prog_compiler_c_o_CXX" | $SED "$delay_single_quote_subst"`' +archive_cmds_need_lc_CXX='`$ECHO "$archive_cmds_need_lc_CXX" | $SED "$delay_single_quote_subst"`' +enable_shared_with_static_runtimes_CXX='`$ECHO "$enable_shared_with_static_runtimes_CXX" | $SED "$delay_single_quote_subst"`' +export_dynamic_flag_spec_CXX='`$ECHO "$export_dynamic_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' +whole_archive_flag_spec_CXX='`$ECHO "$whole_archive_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' +compiler_needs_object_CXX='`$ECHO "$compiler_needs_object_CXX" | $SED "$delay_single_quote_subst"`' +old_archive_from_new_cmds_CXX='`$ECHO "$old_archive_from_new_cmds_CXX" | $SED "$delay_single_quote_subst"`' +old_archive_from_expsyms_cmds_CXX='`$ECHO "$old_archive_from_expsyms_cmds_CXX" | $SED "$delay_single_quote_subst"`' +archive_cmds_CXX='`$ECHO "$archive_cmds_CXX" | $SED "$delay_single_quote_subst"`' +archive_expsym_cmds_CXX='`$ECHO "$archive_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`' +module_cmds_CXX='`$ECHO "$module_cmds_CXX" | $SED "$delay_single_quote_subst"`' +module_expsym_cmds_CXX='`$ECHO "$module_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`' +with_gnu_ld_CXX='`$ECHO "$with_gnu_ld_CXX" | $SED "$delay_single_quote_subst"`' +allow_undefined_flag_CXX='`$ECHO "$allow_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`' +no_undefined_flag_CXX='`$ECHO "$no_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_libdir_flag_spec_CXX='`$ECHO "$hardcode_libdir_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_libdir_separator_CXX='`$ECHO "$hardcode_libdir_separator_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_direct_CXX='`$ECHO "$hardcode_direct_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_direct_absolute_CXX='`$ECHO "$hardcode_direct_absolute_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_minus_L_CXX='`$ECHO "$hardcode_minus_L_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_shlibpath_var_CXX='`$ECHO "$hardcode_shlibpath_var_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_automatic_CXX='`$ECHO "$hardcode_automatic_CXX" | $SED "$delay_single_quote_subst"`' +inherit_rpath_CXX='`$ECHO "$inherit_rpath_CXX" | $SED "$delay_single_quote_subst"`' +link_all_deplibs_CXX='`$ECHO "$link_all_deplibs_CXX" | $SED "$delay_single_quote_subst"`' +always_export_symbols_CXX='`$ECHO "$always_export_symbols_CXX" | $SED "$delay_single_quote_subst"`' +export_symbols_cmds_CXX='`$ECHO "$export_symbols_cmds_CXX" | $SED "$delay_single_quote_subst"`' +exclude_expsyms_CXX='`$ECHO "$exclude_expsyms_CXX" | $SED "$delay_single_quote_subst"`' +include_expsyms_CXX='`$ECHO "$include_expsyms_CXX" | $SED "$delay_single_quote_subst"`' +prelink_cmds_CXX='`$ECHO "$prelink_cmds_CXX" | $SED "$delay_single_quote_subst"`' +postlink_cmds_CXX='`$ECHO "$postlink_cmds_CXX" | $SED "$delay_single_quote_subst"`' +file_list_spec_CXX='`$ECHO "$file_list_spec_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_action_CXX='`$ECHO "$hardcode_action_CXX" | $SED "$delay_single_quote_subst"`' +compiler_lib_search_dirs_CXX='`$ECHO "$compiler_lib_search_dirs_CXX" | $SED "$delay_single_quote_subst"`' +predep_objects_CXX='`$ECHO "$predep_objects_CXX" | $SED "$delay_single_quote_subst"`' +postdep_objects_CXX='`$ECHO "$postdep_objects_CXX" | $SED "$delay_single_quote_subst"`' +predeps_CXX='`$ECHO "$predeps_CXX" | $SED "$delay_single_quote_subst"`' +postdeps_CXX='`$ECHO "$postdeps_CXX" | $SED "$delay_single_quote_subst"`' +compiler_lib_search_path_CXX='`$ECHO "$compiler_lib_search_path_CXX" | $SED "$delay_single_quote_subst"`' + +LTCC='$LTCC' +LTCFLAGS='$LTCFLAGS' +compiler='$compiler_DEFAULT' + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +\$1 +_LTECHO_EOF' +} + +# Quote evaled strings. +for var in AS \ +DLLTOOL \ +OBJDUMP \ +SHELL \ +ECHO \ +PATH_SEPARATOR \ +SED \ +GREP \ +EGREP \ +FGREP \ +LD \ +NM \ +LN_S \ +lt_SP2NL \ +lt_NL2SP \ +reload_flag \ +deplibs_check_method \ +file_magic_cmd \ +file_magic_glob \ +want_nocaseglob \ +sharedlib_from_linklib_cmd \ +AR \ +AR_FLAGS \ +archiver_list_spec \ +STRIP \ +RANLIB \ +CC \ +CFLAGS \ +compiler \ +lt_cv_sys_global_symbol_pipe \ +lt_cv_sys_global_symbol_to_cdecl \ +lt_cv_sys_global_symbol_to_import \ +lt_cv_sys_global_symbol_to_c_name_address \ +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \ +lt_cv_nm_interface \ +nm_file_list_spec \ +lt_cv_truncate_bin \ +lt_prog_compiler_no_builtin_flag \ +lt_prog_compiler_pic \ +lt_prog_compiler_wl \ +lt_prog_compiler_static \ +lt_cv_prog_compiler_c_o \ +need_locks \ +MANIFEST_TOOL \ +DSYMUTIL \ +NMEDIT \ +LIPO \ +OTOOL \ +OTOOL64 \ +shrext_cmds \ +export_dynamic_flag_spec \ +whole_archive_flag_spec \ +compiler_needs_object \ +with_gnu_ld \ +allow_undefined_flag \ +no_undefined_flag \ +hardcode_libdir_flag_spec \ +hardcode_libdir_separator \ +exclude_expsyms \ +include_expsyms \ +file_list_spec \ +variables_saved_for_relink \ +libname_spec \ +library_names_spec \ +soname_spec \ +install_override_mode \ +finish_eval \ +old_striplib \ +striplib \ +compiler_lib_search_dirs \ +predep_objects \ +postdep_objects \ +predeps \ +postdeps \ +compiler_lib_search_path \ +LD_CXX \ +reload_flag_CXX \ +compiler_CXX \ +lt_prog_compiler_no_builtin_flag_CXX \ +lt_prog_compiler_pic_CXX \ +lt_prog_compiler_wl_CXX \ +lt_prog_compiler_static_CXX \ +lt_cv_prog_compiler_c_o_CXX \ +export_dynamic_flag_spec_CXX \ +whole_archive_flag_spec_CXX \ +compiler_needs_object_CXX \ +with_gnu_ld_CXX \ +allow_undefined_flag_CXX \ +no_undefined_flag_CXX \ +hardcode_libdir_flag_spec_CXX \ +hardcode_libdir_separator_CXX \ +exclude_expsyms_CXX \ +include_expsyms_CXX \ +file_list_spec_CXX \ +compiler_lib_search_dirs_CXX \ +predep_objects_CXX \ +postdep_objects_CXX \ +predeps_CXX \ +postdeps_CXX \ +compiler_lib_search_path_CXX; do + case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in + *[\\\\\\\`\\"\\\$]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +# Double-quote double-evaled strings. +for var in reload_cmds \ +old_postinstall_cmds \ +old_postuninstall_cmds \ +old_archive_cmds \ +extract_expsyms_cmds \ +old_archive_from_new_cmds \ +old_archive_from_expsyms_cmds \ +archive_cmds \ +archive_expsym_cmds \ +module_cmds \ +module_expsym_cmds \ +export_symbols_cmds \ +prelink_cmds \ +postlink_cmds \ +postinstall_cmds \ +postuninstall_cmds \ +finish_cmds \ +sys_lib_search_path_spec \ +configure_time_dlsearch_path \ +configure_time_lt_sys_library_path \ +reload_cmds_CXX \ +old_archive_cmds_CXX \ +old_archive_from_new_cmds_CXX \ +old_archive_from_expsyms_cmds_CXX \ +archive_cmds_CXX \ +archive_expsym_cmds_CXX \ +module_cmds_CXX \ +module_expsym_cmds_CXX \ +export_symbols_cmds_CXX \ +prelink_cmds_CXX \ +postlink_cmds_CXX; do + case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in + *[\\\\\\\`\\"\\\$]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +ac_aux_dir='$ac_aux_dir' + +# See if we are running on zsh, and set the options that allow our +# commands through without removal of \ escapes INIT. +if test -n "\${ZSH_VERSION+set}"; then + setopt NO_GLOB_SUBST +fi + + + PACKAGE='$PACKAGE' + VERSION='$VERSION' + RM='$RM' + ofile='$ofile' + + + + + + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + +# Handling of arguments. +for ac_config_target in $ac_config_targets +do + case $ac_config_target in + "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; + "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;; + "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; + "lib/Makefile") CONFIG_FILES="$CONFIG_FILES lib/Makefile" ;; + "include/Makefile") CONFIG_FILES="$CONFIG_FILES include/Makefile" ;; + "bin/Makefile") CONFIG_FILES="$CONFIG_FILES bin/Makefile" ;; + "doc/Makefile") CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;; + "portaudiocpp.pc") CONFIG_FILES="$CONFIG_FILES portaudiocpp.pc" ;; + + *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; + esac +done + + +# If the user did not use the arguments to specify the items to instantiate, +# then the envvar interface is used. Set only those that are not. +# We use the long form for the default assignment because of an extremely +# bizarre bug on SunOS 4.1.3. +if $ac_need_defaults; then + test ${CONFIG_FILES+y} || CONFIG_FILES=$config_files + test ${CONFIG_COMMANDS+y} || CONFIG_COMMANDS=$config_commands +fi + +# Have a temporary directory for convenience. Make it in the build tree +# simply because there is no reason against having it here, and in addition, +# creating and moving files from /tmp can sometimes cause problems. +# Hook for its removal unless debugging. +# Note that there is a small window in which the directory will not be cleaned: +# after its creation but before its name has been assigned to `$tmp'. +$debug || +{ + tmp= ac_tmp= + trap 'exit_status=$? + : "${ac_tmp:=$tmp}" + { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status +' 0 + trap 'as_fn_exit 1' 1 2 13 15 +} +# Create a (secure) tmp directory for tmp files. + +{ + tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && + test -d "$tmp" +} || +{ + tmp=./conf$$-$RANDOM + (umask 077 && mkdir "$tmp") +} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 +ac_tmp=$tmp + +# Set up the scripts for CONFIG_FILES section. +# No need to generate them if there are no CONFIG_FILES. +# This happens for instance with `./config.status config.h'. +if test -n "$CONFIG_FILES"; then + + +ac_cr=`echo X | tr X '\015'` +# On cygwin, bash can eat \r inside `` if the user requested igncr. +# But we know of no other shell where ac_cr would be empty at this +# point, so we can use a bashism as a fallback. +if test "x$ac_cr" = x; then + eval ac_cr=\$\'\\r\' +fi +ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` +if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then + ac_cs_awk_cr='\\r' +else + ac_cs_awk_cr=$ac_cr +fi + +echo 'BEGIN {' >"$ac_tmp/subs1.awk" && +_ACEOF + + +{ + echo "cat >conf$$subs.awk <<_ACEOF" && + echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && + echo "_ACEOF" +} >conf$$subs.sh || + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 +ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` +ac_delim='%!_!# ' +for ac_last_try in false false false false false :; do + . ./conf$$subs.sh || + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + + ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` + if test $ac_delim_n = $ac_delim_num; then + break + elif $ac_last_try; then + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done +rm -f conf$$subs.sh + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && +_ACEOF +sed -n ' +h +s/^/S["/; s/!.*/"]=/ +p +g +s/^[^!]*!// +:repl +t repl +s/'"$ac_delim"'$// +t delim +:nl +h +s/\(.\{148\}\)..*/\1/ +t more1 +s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ +p +n +b repl +:more1 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t nl +:delim +h +s/\(.\{148\}\)..*/\1/ +t more2 +s/["\\]/\\&/g; s/^/"/; s/$/"/ +p +b +:more2 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t delim +' >$CONFIG_STATUS || ac_write_fail=1 +rm -f conf$$subs.awk +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +_ACAWK +cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && + for (key in S) S_is_set[key] = 1 + FS = "" + +} +{ + line = $ 0 + nfields = split(line, field, "@") + substed = 0 + len = length(field[1]) + for (i = 2; i < nfields; i++) { + key = field[i] + keylen = length(key) + if (S_is_set[key]) { + value = S[key] + line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) + len += length(value) + length(field[++i]) + substed = 1 + } else + len += 1 + keylen + } + + print line +} + +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then + sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" +else + cat +fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ + || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 +_ACEOF + +# VPATH may cause trouble with some makes, so we remove sole $(srcdir), +# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and +# trailing colons and then remove the whole line if VPATH becomes empty +# (actually we leave an empty line to preserve line numbers). +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ +h +s/// +s/^/:/ +s/[ ]*$/:/ +s/:\$(srcdir):/:/g +s/:\${srcdir}:/:/g +s/:@srcdir@:/:/g +s/^:*// +s/:*$// +x +s/\(=[ ]*\).*/\1/ +G +s/\n// +s/^[^=]*=[ ]*$// +}' +fi + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +fi # test -n "$CONFIG_FILES" + + +eval set X " :F $CONFIG_FILES :C $CONFIG_COMMANDS" +shift +for ac_tag +do + case $ac_tag in + :[FHLC]) ac_mode=$ac_tag; continue;; + esac + case $ac_mode$ac_tag in + :[FHL]*:*);; + :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; + :[FH]-) ac_tag=-:-;; + :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; + esac + ac_save_IFS=$IFS + IFS=: + set x $ac_tag + IFS=$ac_save_IFS + shift + ac_file=$1 + shift + + case $ac_mode in + :L) ac_source=$1;; + :[FH]) + ac_file_inputs= + for ac_f + do + case $ac_f in + -) ac_f="$ac_tmp/stdin";; + *) # Look for the file first in the build tree, then in the source tree + # (if the path is not absolute). The absolute path cannot be DOS-style, + # because $ac_f cannot contain `:'. + test -f "$ac_f" || + case $ac_f in + [\\/$]*) false;; + *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; + esac || + as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; + esac + case $ac_f in *\'*) ac_f=`printf "%s\n" "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac + as_fn_append ac_file_inputs " '$ac_f'" + done + + # Let's still pretend it is `configure' which instantiates (i.e., don't + # use $as_me), people would be surprised to read: + # /* config.h. Generated by config.status. */ + configure_input='Generated from '` + printf "%s\n" "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' + `' by configure.' + if test x"$ac_file" != x-; then + configure_input="$ac_file. $configure_input" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 +printf "%s\n" "$as_me: creating $ac_file" >&6;} + fi + # Neutralize special characters interpreted by sed in replacement strings. + case $configure_input in #( + *\&* | *\|* | *\\* ) + ac_sed_conf_input=`printf "%s\n" "$configure_input" | + sed 's/[\\\\&|]/\\\\&/g'`;; #( + *) ac_sed_conf_input=$configure_input;; + esac + + case $ac_tag in + *:-:* | *:-) cat >"$ac_tmp/stdin" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; + esac + ;; + esac + + ac_dir=`$as_dirname -- "$ac_file" || +$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || +printf "%s\n" X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + as_dir="$ac_dir"; as_fn_mkdir_p + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + + case $ac_mode in + :F) + # + # CONFIG_FILE + # + + case $INSTALL in + [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; + *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; + esac + ac_MKDIR_P=$MKDIR_P + case $MKDIR_P in + [\\/$]* | ?:[\\/]* ) ;; + */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; + esac +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# If the template does not know about datarootdir, expand it. +# FIXME: This hack should be removed a few years after 2.60. +ac_datarootdir_hack=; ac_datarootdir_seen= +ac_sed_dataroot=' +/datarootdir/ { + p + q +} +/@datadir@/p +/@docdir@/p +/@infodir@/p +/@localedir@/p +/@mandir@/p' +case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in +*datarootdir*) ac_datarootdir_seen=yes;; +*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 +printf "%s\n" "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + ac_datarootdir_hack=' + s&@datadir@&$datadir&g + s&@docdir@&$docdir&g + s&@infodir@&$infodir&g + s&@localedir@&$localedir&g + s&@mandir@&$mandir&g + s&\\\${datarootdir}&$datarootdir&g' ;; +esac +_ACEOF + +# Neutralize VPATH when `$srcdir' = `.'. +# Shell code in configure.ac might set extrasub. +# FIXME: do we really want to maintain this feature? +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_sed_extra="$ac_vpsub +$extrasub +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +:t +/@[a-zA-Z_][a-zA-Z_0-9]*@/!b +s|@configure_input@|$ac_sed_conf_input|;t t +s&@top_builddir@&$ac_top_builddir_sub&;t t +s&@top_build_prefix@&$ac_top_build_prefix&;t t +s&@srcdir@&$ac_srcdir&;t t +s&@abs_srcdir@&$ac_abs_srcdir&;t t +s&@top_srcdir@&$ac_top_srcdir&;t t +s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t +s&@builddir@&$ac_builddir&;t t +s&@abs_builddir@&$ac_abs_builddir&;t t +s&@abs_top_builddir@&$ac_abs_top_builddir&;t t +s&@INSTALL@&$ac_INSTALL&;t t +s&@MKDIR_P@&$ac_MKDIR_P&;t t +$ac_datarootdir_hack +" +eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ + >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + +test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && + { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && + { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ + "$ac_tmp/out"`; test -z "$ac_out"; } && + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&5 +printf "%s\n" "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&2;} + + rm -f "$ac_tmp/stdin" + case $ac_file in + -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; + *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; + esac \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + ;; + + + :C) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 +printf "%s\n" "$as_me: executing $ac_file commands" >&6;} + ;; + esac + + + case $ac_file$ac_mode in + "depfiles":C) test x"$AMDEP_TRUE" != x"" || { + # Older Autoconf quotes --file arguments for eval, but not when files + # are listed without --file. Let's play safe and only enable the eval + # if we detect the quoting. + # TODO: see whether this extra hack can be removed once we start + # requiring Autoconf 2.70 or later. + case $CONFIG_FILES in @%:@( + *\'*) : + eval set x "$CONFIG_FILES" ;; @%:@( + *) : + set x $CONFIG_FILES ;; @%:@( + *) : + ;; +esac + shift + # Used to flag and report bootstrapping failures. + am_rc=0 + for am_mf + do + # Strip MF so we end up with the name of the file. + am_mf=`printf "%s\n" "$am_mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile which includes + # dependency-tracking related rules and includes. + # Grep'ing the whole file directly is not great: AIX grep has a line + # limit of 2048, but all sed's we know have understand at least 4000. + sed -n 's,^am--depfiles:.*,X,p' "$am_mf" | grep X >/dev/null 2>&1 \ + || continue + am_dirpart=`$as_dirname -- "$am_mf" || +$as_expr X"$am_mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$am_mf" : 'X\(//\)[^/]' \| \ + X"$am_mf" : 'X\(//\)$' \| \ + X"$am_mf" : 'X\(/\)' \| . 2>/dev/null || +printf "%s\n" X"$am_mf" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + am_filepart=`$as_basename -- "$am_mf" || +$as_expr X/"$am_mf" : '.*/\([^/][^/]*\)/*$' \| \ + X"$am_mf" : 'X\(//\)$' \| \ + X"$am_mf" : 'X\(/\)' \| . 2>/dev/null || +printf "%s\n" X/"$am_mf" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + { echo "$as_me:$LINENO: cd "$am_dirpart" \ + && sed -e '/# am--include-marker/d' "$am_filepart" \ + | $MAKE -f - am--depfiles" >&5 + (cd "$am_dirpart" \ + && sed -e '/# am--include-marker/d' "$am_filepart" \ + | $MAKE -f - am--depfiles) >&5 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } || am_rc=$? + done + if test $am_rc -ne 0; then + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "Something went wrong bootstrapping makefile fragments + for automatic dependency tracking. If GNU make was not used, consider + re-running the configure script with MAKE=\"gmake\" (or whatever is + necessary). You can also try re-running configure with the + '--disable-dependency-tracking' option to at least be able to build + the package (albeit without support for automatic dependency tracking). +See \`config.log' for more details" "$LINENO" 5; } + fi + { am_dirpart=; unset am_dirpart;} + { am_filepart=; unset am_filepart;} + { am_mf=; unset am_mf;} + { am_rc=; unset am_rc;} + rm -f conftest-deps.mk +} + ;; + "libtool":C) + + # See if we are running on zsh, and set the options that allow our + # commands through without removal of \ escapes. + if test -n "${ZSH_VERSION+set}"; then + setopt NO_GLOB_SUBST + fi + + cfgfile=${ofile}T + trap "$RM \"$cfgfile\"; exit 1" 1 2 15 + $RM "$cfgfile" + + cat <<_LT_EOF >> "$cfgfile" +#! $SHELL +# Generated automatically by $as_me ($PACKAGE) $VERSION +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: +# NOTE: Changes made to this file will be lost: look at ltmain.sh. + +# Provide generalized library-building support services. +# Written by Gordon Matzigkeit, 1996 + +# Copyright (C) 2014 Free Software Foundation, Inc. +# This is free software; see the source for copying conditions. There is NO +# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +# GNU Libtool is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of of the License, or +# (at your option) any later version. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program or library that is built +# using GNU Libtool, you may include this file under the same +# distribution terms that you use for the rest of that program. +# +# GNU Libtool is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + + +# The names of the tagged configurations supported by this script. +available_tags='CXX ' + +# Configured defaults for sys_lib_dlsearch_path munging. +: \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"} + +# ### BEGIN LIBTOOL CONFIG + +# Assembler program. +AS=$lt_AS + +# DLL creation program. +DLLTOOL=$lt_DLLTOOL + +# Object dumper program. +OBJDUMP=$lt_OBJDUMP + +# Which release of libtool.m4 was used? +macro_version=$macro_version +macro_revision=$macro_revision + +# Whether or not to build shared libraries. +build_libtool_libs=$enable_shared + +# Whether or not to build static libraries. +build_old_libs=$enable_static + +# What type of objects to build. +pic_mode=$pic_mode + +# Whether or not to optimize for fast installation. +fast_install=$enable_fast_install + +# Shared archive member basename,for filename based shared library versioning on AIX. +shared_archive_member_spec=$shared_archive_member_spec + +# Shell to use when invoking shell scripts. +SHELL=$lt_SHELL + +# An echo program that protects backslashes. +ECHO=$lt_ECHO + +# The PATH separator for the build system. +PATH_SEPARATOR=$lt_PATH_SEPARATOR + +# The host system. +host_alias=$host_alias +host=$host +host_os=$host_os + +# The build system. +build_alias=$build_alias +build=$build +build_os=$build_os + +# A sed program that does not truncate output. +SED=$lt_SED + +# Sed that helps us avoid accidentally triggering echo(1) options like -n. +Xsed="\$SED -e 1s/^X//" + +# A grep program that handles long lines. +GREP=$lt_GREP + +# An ERE matcher. +EGREP=$lt_EGREP + +# A literal string matcher. +FGREP=$lt_FGREP + +# A BSD- or MS-compatible name lister. +NM=$lt_NM + +# Whether we need soft or hard links. +LN_S=$lt_LN_S + +# What is the maximum length of a command? +max_cmd_len=$max_cmd_len + +# Object file suffix (normally "o"). +objext=$ac_objext + +# Executable file suffix (normally ""). +exeext=$exeext + +# whether the shell understands "unset". +lt_unset=$lt_unset + +# turn spaces into newlines. +SP2NL=$lt_lt_SP2NL + +# turn newlines into spaces. +NL2SP=$lt_lt_NL2SP + +# convert \$build file names to \$host format. +to_host_file_cmd=$lt_cv_to_host_file_cmd + +# convert \$build files to toolchain format. +to_tool_file_cmd=$lt_cv_to_tool_file_cmd + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method=$lt_deplibs_check_method + +# Command to use when deplibs_check_method = "file_magic". +file_magic_cmd=$lt_file_magic_cmd + +# How to find potential files when deplibs_check_method = "file_magic". +file_magic_glob=$lt_file_magic_glob + +# Find potential files using nocaseglob when deplibs_check_method = "file_magic". +want_nocaseglob=$lt_want_nocaseglob + +# Command to associate shared and link libraries. +sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd + +# The archiver. +AR=$lt_AR + +# Flags to create an archive. +AR_FLAGS=$lt_AR_FLAGS + +# How to feed a file listing to the archiver. +archiver_list_spec=$lt_archiver_list_spec + +# A symbol stripping program. +STRIP=$lt_STRIP + +# Commands used to install an old-style archive. +RANLIB=$lt_RANLIB +old_postinstall_cmds=$lt_old_postinstall_cmds +old_postuninstall_cmds=$lt_old_postuninstall_cmds + +# Whether to use a lock for old archive extraction. +lock_old_archive_extraction=$lock_old_archive_extraction + +# A C compiler. +LTCC=$lt_CC + +# LTCC compiler flags. +LTCFLAGS=$lt_CFLAGS + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe + +# Transform the output of nm in a proper C declaration. +global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl + +# Transform the output of nm into a list of symbols to manually relocate. +global_symbol_to_import=$lt_lt_cv_sys_global_symbol_to_import + +# Transform the output of nm in a C name address pair. +global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address + +# Transform the output of nm in a C name address pair when lib prefix is needed. +global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix + +# The name lister interface. +nm_interface=$lt_lt_cv_nm_interface + +# Specify filename containing input files for \$NM. +nm_file_list_spec=$lt_nm_file_list_spec + +# The root where to search for dependent libraries,and where our libraries should be installed. +lt_sysroot=$lt_sysroot + +# Command to truncate a binary pipe. +lt_truncate_bin=$lt_lt_cv_truncate_bin + +# The name of the directory that contains temporary libtool files. +objdir=$objdir + +# Used to examine libraries when file_magic_cmd begins with "file". +MAGIC_CMD=$MAGIC_CMD + +# Must we lock files when doing compilation? +need_locks=$lt_need_locks + +# Manifest tool. +MANIFEST_TOOL=$lt_MANIFEST_TOOL + +# Tool to manipulate archived DWARF debug symbol files on Mac OS X. +DSYMUTIL=$lt_DSYMUTIL + +# Tool to change global to local symbols on Mac OS X. +NMEDIT=$lt_NMEDIT + +# Tool to manipulate fat objects and archives on Mac OS X. +LIPO=$lt_LIPO + +# ldd/readelf like tool for Mach-O binaries on Mac OS X. +OTOOL=$lt_OTOOL + +# ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4. +OTOOL64=$lt_OTOOL64 + +# Old archive suffix (normally "a"). +libext=$libext + +# Shared library suffix (normally ".so"). +shrext_cmds=$lt_shrext_cmds + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds=$lt_extract_expsyms_cmds + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at link time. +variables_saved_for_relink=$lt_variables_saved_for_relink + +# Do we need the "lib" prefix for modules? +need_lib_prefix=$need_lib_prefix + +# Do we need a version for libraries? +need_version=$need_version + +# Library versioning type. +version_type=$version_type + +# Shared library runtime path variable. +runpath_var=$runpath_var + +# Shared library path variable. +shlibpath_var=$shlibpath_var + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=$shlibpath_overrides_runpath + +# Format of library name prefix. +libname_spec=$lt_libname_spec + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME +library_names_spec=$lt_library_names_spec + +# The coded name of the library, if different from the real name. +soname_spec=$lt_soname_spec + +# Permission mode override for installation of shared libraries. +install_override_mode=$lt_install_override_mode + +# Command to use after installation of a shared archive. +postinstall_cmds=$lt_postinstall_cmds + +# Command to use after uninstallation of a shared archive. +postuninstall_cmds=$lt_postuninstall_cmds + +# Commands used to finish a libtool library installation in a directory. +finish_cmds=$lt_finish_cmds + +# As "finish_cmds", except a single script fragment to be evaled but +# not shown. +finish_eval=$lt_finish_eval + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=$hardcode_into_libs + +# Compile-time system search path for libraries. +sys_lib_search_path_spec=$lt_sys_lib_search_path_spec + +# Detected run-time system search path for libraries. +sys_lib_dlsearch_path_spec=$lt_configure_time_dlsearch_path + +# Explicit LT_SYS_LIBRARY_PATH set during ./configure time. +configure_time_lt_sys_library_path=$lt_configure_time_lt_sys_library_path + +# Whether dlopen is supported. +dlopen_support=$enable_dlopen + +# Whether dlopen of programs is supported. +dlopen_self=$enable_dlopen_self + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=$enable_dlopen_self_static + +# Commands to strip libraries. +old_striplib=$lt_old_striplib +striplib=$lt_striplib + + +# The linker used to build libraries. +LD=$lt_LD + +# How to create reloadable object files. +reload_flag=$lt_reload_flag +reload_cmds=$lt_reload_cmds + +# Commands used to build an old-style archive. +old_archive_cmds=$lt_old_archive_cmds + +# A language specific compiler. +CC=$lt_compiler + +# Is the compiler the GNU compiler? +with_gcc=$GCC + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_lt_prog_compiler_static + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_lt_cv_prog_compiler_c_o + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$archive_cmds_need_lc + +# Whether or not to disallow shared libs when runtime libs are static. +allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec + +# Whether the compiler copes with passing no objects directly. +compiler_needs_object=$lt_compiler_needs_object + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds + +# Commands used to build a shared archive. +archive_cmds=$lt_archive_cmds +archive_expsym_cmds=$lt_archive_expsym_cmds + +# Commands used to build a loadable module if different from building +# a shared archive. +module_cmds=$lt_module_cmds +module_expsym_cmds=$lt_module_expsym_cmds + +# Whether we are building with GNU ld or not. +with_gnu_ld=$lt_with_gnu_ld + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag + +# Flag that enforces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist +hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec + +# Whether we need a single "-rpath" flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator + +# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes +# DIR into the resulting binary. +hardcode_direct=$hardcode_direct + +# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes +# DIR into the resulting binary and the resulting library dependency is +# "absolute",i.e impossible to change by setting \$shlibpath_var if the +# library is relocated. +hardcode_direct_absolute=$hardcode_direct_absolute + +# Set to "yes" if using the -LDIR flag during linking hardcodes DIR +# into the resulting binary. +hardcode_minus_L=$hardcode_minus_L + +# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR +# into the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var + +# Set to "yes" if building a shared library automatically hardcodes DIR +# into the library and all subsequent libraries and executables linked +# against it. +hardcode_automatic=$hardcode_automatic + +# Set to yes if linker adds runtime paths of dependent libraries +# to runtime path list. +inherit_rpath=$inherit_rpath + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs + +# Set to "yes" if exported symbols are required. +always_export_symbols=$always_export_symbols + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_exclude_expsyms + +# Symbols that must always be exported. +include_expsyms=$lt_include_expsyms + +# Commands necessary for linking programs (against libraries) with templates. +prelink_cmds=$lt_prelink_cmds + +# Commands necessary for finishing linking programs. +postlink_cmds=$lt_postlink_cmds + +# Specify filename containing input files. +file_list_spec=$lt_file_list_spec + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action + +# The directories searched by this compiler when creating a shared library. +compiler_lib_search_dirs=$lt_compiler_lib_search_dirs + +# Dependencies to place before and after the objects being linked to +# create a shared library. +predep_objects=$lt_predep_objects +postdep_objects=$lt_postdep_objects +predeps=$lt_predeps +postdeps=$lt_postdeps + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_compiler_lib_search_path + +# ### END LIBTOOL CONFIG + +_LT_EOF + + cat <<'_LT_EOF' >> "$cfgfile" + +# ### BEGIN FUNCTIONS SHARED WITH CONFIGURE + +# func_munge_path_list VARIABLE PATH +# ----------------------------------- +# VARIABLE is name of variable containing _space_ separated list of +# directories to be munged by the contents of PATH, which is string +# having a format: +# "DIR[:DIR]:" +# string "DIR[ DIR]" will be prepended to VARIABLE +# ":DIR[:DIR]" +# string "DIR[ DIR]" will be appended to VARIABLE +# "DIRP[:DIRP]::[DIRA:]DIRA" +# string "DIRP[ DIRP]" will be prepended to VARIABLE and string +# "DIRA[ DIRA]" will be appended to VARIABLE +# "DIR[:DIR]" +# VARIABLE will be replaced by "DIR[ DIR]" +func_munge_path_list () +{ + case x@S|@2 in + x) + ;; + *:) + eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'` \@S|@@S|@1\" + ;; + x:*) + eval @S|@1=\"\@S|@@S|@1 `$ECHO @S|@2 | $SED 's/:/ /g'`\" + ;; + *::*) + eval @S|@1=\"\@S|@@S|@1\ `$ECHO @S|@2 | $SED -e 's/.*:://' -e 's/:/ /g'`\" + eval @S|@1=\"`$ECHO @S|@2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \@S|@@S|@1\" + ;; + *) + eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'`\" + ;; + esac +} + + +# Calculate cc_basename. Skip known compiler wrappers and cross-prefix. +func_cc_basename () +{ + for cc_temp in @S|@*""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac + done + func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` +} + + +# ### END FUNCTIONS SHARED WITH CONFIGURE + +_LT_EOF + + case $host_os in + aix3*) + cat <<\_LT_EOF >> "$cfgfile" +# AIX sometimes has problems with the GCC collect2 program. For some +# reason, if we set the COLLECT_NAMES environment variable, the problems +# vanish in a puff of smoke. +if test set != "${COLLECT_NAMES+set}"; then + COLLECT_NAMES= + export COLLECT_NAMES +fi +_LT_EOF + ;; + esac + + + +ltmain=$ac_aux_dir/ltmain.sh + + + # We use sed instead of cat because bash on DJGPP gets confused if + # if finds mixed CR/LF and LF-only lines. Since sed operates in + # text mode, it properly converts lines to CR/LF. This bash problem + # is reportedly fixed, but why not run on old versions too? + sed '$q' "$ltmain" >> "$cfgfile" \ + || (rm -f "$cfgfile"; exit 1) + + mv -f "$cfgfile" "$ofile" || + (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") + chmod +x "$ofile" + + + cat <<_LT_EOF >> "$ofile" + +# ### BEGIN LIBTOOL TAG CONFIG: CXX + +# The linker used to build libraries. +LD=$lt_LD_CXX + +# How to create reloadable object files. +reload_flag=$lt_reload_flag_CXX +reload_cmds=$lt_reload_cmds_CXX + +# Commands used to build an old-style archive. +old_archive_cmds=$lt_old_archive_cmds_CXX + +# A language specific compiler. +CC=$lt_compiler_CXX + +# Is the compiler the GNU compiler? +with_gcc=$GCC_CXX + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic_CXX + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl_CXX + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_lt_prog_compiler_static_CXX + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$archive_cmds_need_lc_CXX + +# Whether or not to disallow shared libs when runtime libs are static. +allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX + +# Whether the compiler copes with passing no objects directly. +compiler_needs_object=$lt_compiler_needs_object_CXX + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX + +# Commands used to build a shared archive. +archive_cmds=$lt_archive_cmds_CXX +archive_expsym_cmds=$lt_archive_expsym_cmds_CXX + +# Commands used to build a loadable module if different from building +# a shared archive. +module_cmds=$lt_module_cmds_CXX +module_expsym_cmds=$lt_module_expsym_cmds_CXX + +# Whether we are building with GNU ld or not. +with_gnu_ld=$lt_with_gnu_ld_CXX + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag_CXX + +# Flag that enforces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag_CXX + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist +hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX + +# Whether we need a single "-rpath" flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX + +# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes +# DIR into the resulting binary. +hardcode_direct=$hardcode_direct_CXX + +# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes +# DIR into the resulting binary and the resulting library dependency is +# "absolute",i.e impossible to change by setting \$shlibpath_var if the +# library is relocated. +hardcode_direct_absolute=$hardcode_direct_absolute_CXX + +# Set to "yes" if using the -LDIR flag during linking hardcodes DIR +# into the resulting binary. +hardcode_minus_L=$hardcode_minus_L_CXX + +# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR +# into the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX + +# Set to "yes" if building a shared library automatically hardcodes DIR +# into the library and all subsequent libraries and executables linked +# against it. +hardcode_automatic=$hardcode_automatic_CXX + +# Set to yes if linker adds runtime paths of dependent libraries +# to runtime path list. +inherit_rpath=$inherit_rpath_CXX + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs_CXX + +# Set to "yes" if exported symbols are required. +always_export_symbols=$always_export_symbols_CXX + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds_CXX + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_exclude_expsyms_CXX + +# Symbols that must always be exported. +include_expsyms=$lt_include_expsyms_CXX + +# Commands necessary for linking programs (against libraries) with templates. +prelink_cmds=$lt_prelink_cmds_CXX + +# Commands necessary for finishing linking programs. +postlink_cmds=$lt_postlink_cmds_CXX + +# Specify filename containing input files. +file_list_spec=$lt_file_list_spec_CXX + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action_CXX + +# The directories searched by this compiler when creating a shared library. +compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_CXX + +# Dependencies to place before and after the objects being linked to +# create a shared library. +predep_objects=$lt_predep_objects_CXX +postdep_objects=$lt_postdep_objects_CXX +predeps=$lt_predeps_CXX +postdeps=$lt_postdeps_CXX + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_compiler_lib_search_path_CXX + +# ### END LIBTOOL TAG CONFIG: CXX +_LT_EOF + + ;; + + esac +done # for ac_tag + + +as_fn_exit 0 +_ACEOF +ac_clean_files=$ac_clean_files_save + +test $ac_write_fail = 0 || + as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 + + +# configure is writing to config.log, and then calls config.status. +# config.status does its own redirection, appending to config.log. +# Unfortunately, on DOS this fails, as config.log is still kept open +# by configure, so config.status won't be able to write to it; its +# output is simply discarded. So we exec the FD to /dev/null, +# effectively closing config.log, so it can be properly (re)opened and +# appended to by config.status. When coming back to configure, we +# need to make the FD available again. +if test "$no_create" != yes; then + ac_cs_success=: + ac_config_status_args= + test "$silent" = yes && + ac_config_status_args="$ac_config_status_args --quiet" + exec 5>/dev/null + $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false + exec 5>>config.log + # Use ||, not &&, to avoid exiting from the if with $? = 1, which + # would make configure fail if this is the last instruction. + $ac_cs_success || as_fn_exit 1 +fi +if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 +printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} +fi + diff --git a/bindings/cpp/autom4te.cache/output.2 b/bindings/cpp/autom4te.cache/output.2 new file mode 100644 index 0000000..4aae6ff --- /dev/null +++ b/bindings/cpp/autom4te.cache/output.2 @@ -0,0 +1,19376 @@ +@%:@! /bin/sh +@%:@ Guess values for system-dependent variables and create Makefiles. +@%:@ Generated by GNU Autoconf 2.71 for PortAudioCpp 12. +@%:@ +@%:@ +@%:@ Copyright (C) 1992-1996, 1998-2017, 2020-2021 Free Software Foundation, +@%:@ Inc. +@%:@ +@%:@ +@%:@ This configure script is free software; the Free Software Foundation +@%:@ gives unlimited permission to copy, distribute and modify it. +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +as_nop=: +if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 +then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else $as_nop + case `(set -o) 2>/dev/null` in @%:@( + *posix*) : + set -o posix ;; @%:@( + *) : + ;; +esac +fi + + + +# Reset variables that may have inherited troublesome values from +# the environment. + +# IFS needs to be set, to space, tab, and newline, in precisely that order. +# (If _AS_PATH_WALK were called with IFS unset, it would have the +# side effect of setting IFS to empty, thus disabling word splitting.) +# Quoting is to prevent editors from complaining about space-tab. +as_nl=' +' +export as_nl +IFS=" "" $as_nl" + +PS1='$ ' +PS2='> ' +PS4='+ ' + +# Ensure predictable behavior from utilities with locale-dependent output. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# We cannot yet rely on "unset" to work, but we need these variables +# to be unset--not just set to an empty or harmless value--now, to +# avoid bugs in old shells (e.g. pre-3.0 UWIN ksh). This construct +# also avoids known problems related to "unset" and subshell syntax +# in other old shells (e.g. bash 2.01 and pdksh 5.2.14). +for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH +do eval test \${$as_var+y} \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done + +# Ensure that fds 0, 1, and 2 are open. +if (exec 3>&0) 2>/dev/null; then :; else exec 0&1) 2>/dev/null; then :; else exec 1>/dev/null; fi +if (exec 3>&2) ; then :; else exec 2>/dev/null; fi + +# The user is always right. +if ${PATH_SEPARATOR+false} :; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# Find who we are. Look in the path if we contain no directory separator. +as_myself= +case $0 in @%:@(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + test -r "$as_dir$0" && as_myself=$as_dir$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + + +# Use a proper internal environment variable to ensure we don't fall + # into an infinite loop, continuously re-executing ourselves. + if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then + _as_can_reexec=no; export _as_can_reexec; + # We cannot yet assume a decent shell, so we have to provide a +# neutralization value for shells without unset; and this also +# works around shells that cannot unset nonexistent variables. +# Preserve -v and -x to the replacement shell. +BASH_ENV=/dev/null +ENV=/dev/null +(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV +case $- in @%:@ (((( + *v*x* | *x*v* ) as_opts=-vx ;; + *v* ) as_opts=-v ;; + *x* ) as_opts=-x ;; + * ) as_opts= ;; +esac +exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} +# Admittedly, this is quite paranoid, since all the known shells bail +# out after a failed `exec'. +printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2 +exit 255 + fi + # We don't want this to propagate to other subprocesses. + { _as_can_reexec=; unset _as_can_reexec;} +if test "x$CONFIG_SHELL" = x; then + as_bourne_compatible="as_nop=: +if test \${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 +then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which + # is contrary to our usage. Disable this feature. + alias -g '\${1+\"\$@\"}'='\"\$@\"' + setopt NO_GLOB_SUBST +else \$as_nop + case \`(set -o) 2>/dev/null\` in @%:@( + *posix*) : + set -o posix ;; @%:@( + *) : + ;; +esac +fi +" + as_required="as_fn_return () { (exit \$1); } +as_fn_success () { as_fn_return 0; } +as_fn_failure () { as_fn_return 1; } +as_fn_ret_success () { return 0; } +as_fn_ret_failure () { return 1; } + +exitcode=0 +as_fn_success || { exitcode=1; echo as_fn_success failed.; } +as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } +as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } +as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } +if ( set x; as_fn_ret_success y && test x = \"\$1\" ) +then : + +else \$as_nop + exitcode=1; echo positional parameters were not saved. +fi +test x\$exitcode = x0 || exit 1 +blah=\$(echo \$(echo blah)) +test x\"\$blah\" = xblah || exit 1 +test -x / || exit 1" + as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO + as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO + eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && + test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 + + test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || ( + ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' + ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO + ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO + PATH=/empty FPATH=/empty; export PATH FPATH + test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\ + || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1 +test \$(( 1 + 1 )) = 2 || exit 1" + if (eval "$as_required") 2>/dev/null +then : + as_have_required=yes +else $as_nop + as_have_required=no +fi + if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null +then : + +else $as_nop + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +as_found=false +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + as_found=: + case $as_dir in @%:@( + /*) + for as_base in sh bash ksh sh5; do + # Try only shells that exist, to save several forks. + as_shell=$as_dir$as_base + if { test -f "$as_shell" || test -f "$as_shell.exe"; } && + as_run=a "$as_shell" -c "$as_bourne_compatible""$as_required" 2>/dev/null +then : + CONFIG_SHELL=$as_shell as_have_required=yes + if as_run=a "$as_shell" -c "$as_bourne_compatible""$as_suggested" 2>/dev/null +then : + break 2 +fi +fi + done;; + esac + as_found=false +done +IFS=$as_save_IFS +if $as_found +then : + +else $as_nop + if { test -f "$SHELL" || test -f "$SHELL.exe"; } && + as_run=a "$SHELL" -c "$as_bourne_compatible""$as_required" 2>/dev/null +then : + CONFIG_SHELL=$SHELL as_have_required=yes +fi +fi + + + if test "x$CONFIG_SHELL" != x +then : + export CONFIG_SHELL + # We cannot yet assume a decent shell, so we have to provide a +# neutralization value for shells without unset; and this also +# works around shells that cannot unset nonexistent variables. +# Preserve -v and -x to the replacement shell. +BASH_ENV=/dev/null +ENV=/dev/null +(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV +case $- in @%:@ (((( + *v*x* | *x*v* ) as_opts=-vx ;; + *v* ) as_opts=-v ;; + *x* ) as_opts=-x ;; + * ) as_opts= ;; +esac +exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} +# Admittedly, this is quite paranoid, since all the known shells bail +# out after a failed `exec'. +printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2 +exit 255 +fi + + if test x$as_have_required = xno +then : + printf "%s\n" "$0: This script requires a shell more modern than all" + printf "%s\n" "$0: the shells that I found on your system." + if test ${ZSH_VERSION+y} ; then + printf "%s\n" "$0: In particular, zsh $ZSH_VERSION has bugs and should" + printf "%s\n" "$0: be upgraded to zsh 4.3.4 or later." + else + printf "%s\n" "$0: Please tell bug-autoconf@gnu.org about your system, +$0: including any error possibly output before this +$0: message. Then install a modern shell, or manually run +$0: the script under such a shell if you do have one." + fi + exit 1 +fi +fi +fi +SHELL=${CONFIG_SHELL-/bin/sh} +export SHELL +# Unset more variables known to interfere with behavior of common tools. +CLICOLOR_FORCE= GREP_OPTIONS= +unset CLICOLOR_FORCE GREP_OPTIONS + +## --------------------- ## +## M4sh Shell Functions. ## +## --------------------- ## +@%:@ as_fn_unset VAR +@%:@ --------------- +@%:@ Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset + + +@%:@ as_fn_set_status STATUS +@%:@ ----------------------- +@%:@ Set @S|@? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} @%:@ as_fn_set_status + +@%:@ as_fn_exit STATUS +@%:@ ----------------- +@%:@ Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} @%:@ as_fn_exit +@%:@ as_fn_nop +@%:@ --------- +@%:@ Do nothing but, unlike ":", preserve the value of @S|@?. +as_fn_nop () +{ + return $? +} +as_nop=as_fn_nop + +@%:@ as_fn_mkdir_p +@%:@ ------------- +@%:@ Create "@S|@as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`printf "%s\n" "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +printf "%s\n" X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} @%:@ as_fn_mkdir_p + +@%:@ as_fn_executable_p FILE +@%:@ ----------------------- +@%:@ Test if FILE is an executable regular file. +as_fn_executable_p () +{ + test -f "$1" && test -x "$1" +} @%:@ as_fn_executable_p +@%:@ as_fn_append VAR VALUE +@%:@ ---------------------- +@%:@ Append the text in VALUE to the end of the definition contained in VAR. Take +@%:@ advantage of any shell optimizations that allow amortized linear growth over +@%:@ repeated appends, instead of the typical quadratic growth present in naive +@%:@ implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null +then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else $as_nop + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +@%:@ as_fn_arith ARG... +@%:@ ------------------ +@%:@ Perform arithmetic evaluation on the ARGs, and store the result in the +@%:@ global @S|@as_val. Take advantage of shells that can avoid forks. The arguments +@%:@ must be portable across @S|@(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null +then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else $as_nop + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + +@%:@ as_fn_nop +@%:@ --------- +@%:@ Do nothing but, unlike ":", preserve the value of @S|@?. +as_fn_nop () +{ + return $? +} +as_nop=as_fn_nop + +@%:@ as_fn_error STATUS ERROR [LINENO LOG_FD] +@%:@ ---------------------------------------- +@%:@ Output "`basename @S|@0`: error: ERROR" to stderr. If LINENO and LOG_FD are +@%:@ provided, also output the error to LOG_FD, referencing LINENO. Then exit the +@%:@ script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + printf "%s\n" "$as_me: error: $2" >&2 + as_fn_exit $as_status +} @%:@ as_fn_error + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +printf "%s\n" X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + + + as_lineno_1=$LINENO as_lineno_1a=$LINENO + as_lineno_2=$LINENO as_lineno_2a=$LINENO + eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && + test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { + # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) + sed -n ' + p + /[$]LINENO/= + ' <$as_myself | + sed ' + s/[$]LINENO.*/&-/ + t lineno + b + :lineno + N + :loop + s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ + t loop + s/-\n.*// + ' >$as_me.lineno && + chmod +x "$as_me.lineno" || + { printf "%s\n" "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } + + # If we had to re-execute with $CONFIG_SHELL, we're ensured to have + # already done that, so ensure we don't try to do so again and fall + # in an infinite loop. This has already happened in practice. + _as_can_reexec=no; export _as_can_reexec + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensitive to this). + . "./$as_me.lineno" + # Exit status is that of the last command. + exit +} + + +# Determine whether it's possible to make 'echo' print without a newline. +# These variables are no longer used directly by Autoconf, but are AC_SUBSTed +# for compatibility with existing Makefiles. +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in @%:@((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +# For backward compatibility with old third-party macros, we provide +# the shell variables $as_echo and $as_echo_n. New code should use +# AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively. +as_@&t@echo='printf %s\n' +as_@&t@echo_n='printf %s' + + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -pR'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -pR' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -pR' + fi +else + as_ln_s='cp -pR' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +as_test_x='test -x' +as_executable_p=as_fn_executable_p + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + +SHELL=${CONFIG_SHELL-/bin/sh} + + +test -n "$DJDIR" || exec 7<&0 &1 + +# Name of the host. +# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, +# so uname gets run too. +ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` + +# +# Initializations. +# +ac_default_prefix=/usr/local +ac_clean_files= +ac_config_libobj_dir=. +LIB@&t@OBJS= +cross_compiling=no +subdirs= +MFLAGS= +MAKEFLAGS= + +# Identity of this package. +PACKAGE_NAME='PortAudioCpp' +PACKAGE_TARNAME='portaudiocpp' +PACKAGE_VERSION='12' +PACKAGE_STRING='PortAudioCpp 12' +PACKAGE_BUGREPORT='' +PACKAGE_URL='' + +ac_unique_file="include/portaudiocpp/PortAudioCpp.hxx" +# Factoring default headers for most tests. +ac_includes_default="\ +#include +#ifdef HAVE_STDIO_H +# include +#endif +#ifdef HAVE_STDLIB_H +# include +#endif +#ifdef HAVE_STRING_H +# include +#endif +#ifdef HAVE_INTTYPES_H +# include +#endif +#ifdef HAVE_STDINT_H +# include +#endif +#ifdef HAVE_STRINGS_H +# include +#endif +#ifdef HAVE_SYS_TYPES_H +# include +#endif +#ifdef HAVE_SYS_STAT_H +# include +#endif +#ifdef HAVE_UNISTD_H +# include +#endif" + +ac_header_c_list= +ac_subst_vars='am__EXEEXT_FALSE +am__EXEEXT_TRUE +LTLIBOBJS +LIB@&t@OBJS +LT_VERSION_INFO +PORTAUDIO_ROOT +DEFAULT_INCLUDES +CXXCPP +LT_SYS_LIBRARY_PATH +OTOOL64 +OTOOL +LIPO +NMEDIT +DSYMUTIL +MANIFEST_TOOL +RANLIB +ac_ct_AR +AR +LN_S +NM +ac_ct_DUMPBIN +DUMPBIN +LD +FGREP +EGREP +GREP +SED +LIBTOOL +OBJDUMP +DLLTOOL +AS +host_os +host_vendor +host_cpu +host +build_os +build_vendor +build_cpu +build +am__fastdepCXX_FALSE +am__fastdepCXX_TRUE +CXXDEPMODE +ac_ct_CXX +CXXFLAGS +CXX +am__fastdepCC_FALSE +am__fastdepCC_TRUE +CCDEPMODE +am__nodep +AMDEPBACKSLASH +AMDEP_FALSE +AMDEP_TRUE +am__include +DEPDIR +OBJEXT +EXEEXT +ac_ct_CC +CPPFLAGS +LDFLAGS +CFLAGS +CC +MAINT +MAINTAINER_MODE_FALSE +MAINTAINER_MODE_TRUE +AM_BACKSLASH +AM_DEFAULT_VERBOSITY +AM_DEFAULT_V +AM_V +CSCOPE +ETAGS +CTAGS +am__untar +am__tar +AMTAR +am__leading_dot +SET_MAKE +AWK +mkdir_p +MKDIR_P +INSTALL_STRIP_PROGRAM +STRIP +install_sh +MAKEINFO +AUTOHEADER +AUTOMAKE +AUTOCONF +ACLOCAL +VERSION +PACKAGE +CYGPATH_W +am__isrc +INSTALL_DATA +INSTALL_SCRIPT +INSTALL_PROGRAM +target_alias +host_alias +build_alias +LIBS +ECHO_T +ECHO_N +ECHO_C +DEFS +mandir +localedir +libdir +psdir +pdfdir +dvidir +htmldir +infodir +docdir +oldincludedir +includedir +runstatedir +localstatedir +sharedstatedir +sysconfdir +datadir +datarootdir +libexecdir +sbindir +bindir +program_transform_name +prefix +exec_prefix +PACKAGE_URL +PACKAGE_BUGREPORT +PACKAGE_STRING +PACKAGE_VERSION +PACKAGE_TARNAME +PACKAGE_NAME +PATH_SEPARATOR +SHELL +am__quote' +ac_subst_files='' +ac_user_opts=' +enable_option_checking +enable_silent_rules +enable_maintainer_mode +enable_dependency_tracking +enable_shared +enable_static +with_pic +enable_fast_install +with_aix_soname +with_gnu_ld +with_sysroot +enable_libtool_lock +' + ac_precious_vars='build_alias +host_alias +target_alias +CC +CFLAGS +LDFLAGS +LIBS +CPPFLAGS +CXX +CXXFLAGS +CCC +LT_SYS_LIBRARY_PATH +CXXCPP' + + +# Initialize some variables set by options. +ac_init_help= +ac_init_version=false +ac_unrecognized_opts= +ac_unrecognized_sep= +# The variables have the same names as the options, with +# dashes changed to underlines. +cache_file=/dev/null +exec_prefix=NONE +no_create= +no_recursion= +prefix=NONE +program_prefix=NONE +program_suffix=NONE +program_transform_name=s,x,x, +silent= +site= +srcdir= +verbose= +x_includes=NONE +x_libraries=NONE + +# Installation directory options. +# These are left unexpanded so users can "make install exec_prefix=/foo" +# and all the variables that are supposed to be based on exec_prefix +# by default will actually change. +# Use braces instead of parens because sh, perl, etc. also accept them. +# (The list follows the same order as the GNU Coding Standards.) +bindir='${exec_prefix}/bin' +sbindir='${exec_prefix}/sbin' +libexecdir='${exec_prefix}/libexec' +datarootdir='${prefix}/share' +datadir='${datarootdir}' +sysconfdir='${prefix}/etc' +sharedstatedir='${prefix}/com' +localstatedir='${prefix}/var' +runstatedir='${localstatedir}/run' +includedir='${prefix}/include' +oldincludedir='/usr/include' +docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' +infodir='${datarootdir}/info' +htmldir='${docdir}' +dvidir='${docdir}' +pdfdir='${docdir}' +psdir='${docdir}' +libdir='${exec_prefix}/lib' +localedir='${datarootdir}/locale' +mandir='${datarootdir}/man' + +ac_prev= +ac_dashdash= +for ac_option +do + # If the previous option needs an argument, assign it. + if test -n "$ac_prev"; then + eval $ac_prev=\$ac_option + ac_prev= + continue + fi + + case $ac_option in + *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; + *=) ac_optarg= ;; + *) ac_optarg=yes ;; + esac + + case $ac_dashdash$ac_option in + --) + ac_dashdash=yes ;; + + -bindir | --bindir | --bindi | --bind | --bin | --bi) + ac_prev=bindir ;; + -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) + bindir=$ac_optarg ;; + + -build | --build | --buil | --bui | --bu) + ac_prev=build_alias ;; + -build=* | --build=* | --buil=* | --bui=* | --bu=*) + build_alias=$ac_optarg ;; + + -cache-file | --cache-file | --cache-fil | --cache-fi \ + | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) + ac_prev=cache_file ;; + -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ + | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) + cache_file=$ac_optarg ;; + + --config-cache | -C) + cache_file=config.cache ;; + + -datadir | --datadir | --datadi | --datad) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=*) + datadir=$ac_optarg ;; + + -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ + | --dataroo | --dataro | --datar) + ac_prev=datarootdir ;; + -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ + | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) + datarootdir=$ac_optarg ;; + + -disable-* | --disable-*) + ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid feature name: \`$ac_useropt'" + ac_useropt_orig=$ac_useropt + ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=no ;; + + -docdir | --docdir | --docdi | --doc | --do) + ac_prev=docdir ;; + -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) + docdir=$ac_optarg ;; + + -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) + ac_prev=dvidir ;; + -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) + dvidir=$ac_optarg ;; + + -enable-* | --enable-*) + ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid feature name: \`$ac_useropt'" + ac_useropt_orig=$ac_useropt + ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=\$ac_optarg ;; + + -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ + | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ + | --exec | --exe | --ex) + ac_prev=exec_prefix ;; + -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ + | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ + | --exec=* | --exe=* | --ex=*) + exec_prefix=$ac_optarg ;; + + -gas | --gas | --ga | --g) + # Obsolete; use --with-gas. + with_gas=yes ;; + + -help | --help | --hel | --he | -h) + ac_init_help=long ;; + -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) + ac_init_help=recursive ;; + -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) + ac_init_help=short ;; + + -host | --host | --hos | --ho) + ac_prev=host_alias ;; + -host=* | --host=* | --hos=* | --ho=*) + host_alias=$ac_optarg ;; + + -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) + ac_prev=htmldir ;; + -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ + | --ht=*) + htmldir=$ac_optarg ;; + + -includedir | --includedir | --includedi | --included | --include \ + | --includ | --inclu | --incl | --inc) + ac_prev=includedir ;; + -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ + | --includ=* | --inclu=* | --incl=* | --inc=*) + includedir=$ac_optarg ;; + + -infodir | --infodir | --infodi | --infod | --info | --inf) + ac_prev=infodir ;; + -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) + infodir=$ac_optarg ;; + + -libdir | --libdir | --libdi | --libd) + ac_prev=libdir ;; + -libdir=* | --libdir=* | --libdi=* | --libd=*) + libdir=$ac_optarg ;; + + -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ + | --libexe | --libex | --libe) + ac_prev=libexecdir ;; + -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ + | --libexe=* | --libex=* | --libe=*) + libexecdir=$ac_optarg ;; + + -localedir | --localedir | --localedi | --localed | --locale) + ac_prev=localedir ;; + -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) + localedir=$ac_optarg ;; + + -localstatedir | --localstatedir | --localstatedi | --localstated \ + | --localstate | --localstat | --localsta | --localst | --locals) + ac_prev=localstatedir ;; + -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ + | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) + localstatedir=$ac_optarg ;; + + -mandir | --mandir | --mandi | --mand | --man | --ma | --m) + ac_prev=mandir ;; + -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) + mandir=$ac_optarg ;; + + -nfp | --nfp | --nf) + # Obsolete; use --without-fp. + with_fp=no ;; + + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c | -n) + no_create=yes ;; + + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) + no_recursion=yes ;; + + -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ + | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ + | --oldin | --oldi | --old | --ol | --o) + ac_prev=oldincludedir ;; + -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ + | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ + | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) + oldincludedir=$ac_optarg ;; + + -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) + ac_prev=prefix ;; + -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) + prefix=$ac_optarg ;; + + -program-prefix | --program-prefix | --program-prefi | --program-pref \ + | --program-pre | --program-pr | --program-p) + ac_prev=program_prefix ;; + -program-prefix=* | --program-prefix=* | --program-prefi=* \ + | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) + program_prefix=$ac_optarg ;; + + -program-suffix | --program-suffix | --program-suffi | --program-suff \ + | --program-suf | --program-su | --program-s) + ac_prev=program_suffix ;; + -program-suffix=* | --program-suffix=* | --program-suffi=* \ + | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) + program_suffix=$ac_optarg ;; + + -program-transform-name | --program-transform-name \ + | --program-transform-nam | --program-transform-na \ + | --program-transform-n | --program-transform- \ + | --program-transform | --program-transfor \ + | --program-transfo | --program-transf \ + | --program-trans | --program-tran \ + | --progr-tra | --program-tr | --program-t) + ac_prev=program_transform_name ;; + -program-transform-name=* | --program-transform-name=* \ + | --program-transform-nam=* | --program-transform-na=* \ + | --program-transform-n=* | --program-transform-=* \ + | --program-transform=* | --program-transfor=* \ + | --program-transfo=* | --program-transf=* \ + | --program-trans=* | --program-tran=* \ + | --progr-tra=* | --program-tr=* | --program-t=*) + program_transform_name=$ac_optarg ;; + + -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) + ac_prev=pdfdir ;; + -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) + pdfdir=$ac_optarg ;; + + -psdir | --psdir | --psdi | --psd | --ps) + ac_prev=psdir ;; + -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) + psdir=$ac_optarg ;; + + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + silent=yes ;; + + -runstatedir | --runstatedir | --runstatedi | --runstated \ + | --runstate | --runstat | --runsta | --runst | --runs \ + | --run | --ru | --r) + ac_prev=runstatedir ;; + -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \ + | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \ + | --run=* | --ru=* | --r=*) + runstatedir=$ac_optarg ;; + + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) + ac_prev=sbindir ;; + -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ + | --sbi=* | --sb=*) + sbindir=$ac_optarg ;; + + -sharedstatedir | --sharedstatedir | --sharedstatedi \ + | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ + | --sharedst | --shareds | --shared | --share | --shar \ + | --sha | --sh) + ac_prev=sharedstatedir ;; + -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ + | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ + | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ + | --sha=* | --sh=*) + sharedstatedir=$ac_optarg ;; + + -site | --site | --sit) + ac_prev=site ;; + -site=* | --site=* | --sit=*) + site=$ac_optarg ;; + + -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) + ac_prev=srcdir ;; + -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) + srcdir=$ac_optarg ;; + + -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ + | --syscon | --sysco | --sysc | --sys | --sy) + ac_prev=sysconfdir ;; + -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ + | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) + sysconfdir=$ac_optarg ;; + + -target | --target | --targe | --targ | --tar | --ta | --t) + ac_prev=target_alias ;; + -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) + target_alias=$ac_optarg ;; + + -v | -verbose | --verbose | --verbos | --verbo | --verb) + verbose=yes ;; + + -version | --version | --versio | --versi | --vers | -V) + ac_init_version=: ;; + + -with-* | --with-*) + ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid package name: \`$ac_useropt'" + ac_useropt_orig=$ac_useropt + ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=\$ac_optarg ;; + + -without-* | --without-*) + ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid package name: \`$ac_useropt'" + ac_useropt_orig=$ac_useropt + ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=no ;; + + --x) + # Obsolete; use --with-x. + with_x=yes ;; + + -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ + | --x-incl | --x-inc | --x-in | --x-i) + ac_prev=x_includes ;; + -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ + | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) + x_includes=$ac_optarg ;; + + -x-libraries | --x-libraries | --x-librarie | --x-librari \ + | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) + ac_prev=x_libraries ;; + -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ + | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) + x_libraries=$ac_optarg ;; + + -*) as_fn_error $? "unrecognized option: \`$ac_option' +Try \`$0 --help' for more information" + ;; + + *=*) + ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` + # Reject names that are not valid shell variable names. + case $ac_envvar in #( + '' | [0-9]* | *[!_$as_cr_alnum]* ) + as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; + esac + eval $ac_envvar=\$ac_optarg + export $ac_envvar ;; + + *) + # FIXME: should be removed in autoconf 3.0. + printf "%s\n" "$as_me: WARNING: you should use --build, --host, --target" >&2 + expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && + printf "%s\n" "$as_me: WARNING: invalid host type: $ac_option" >&2 + : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" + ;; + + esac +done + +if test -n "$ac_prev"; then + ac_option=--`echo $ac_prev | sed 's/_/-/g'` + as_fn_error $? "missing argument to $ac_option" +fi + +if test -n "$ac_unrecognized_opts"; then + case $enable_option_checking in + no) ;; + fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; + *) printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; + esac +fi + +# Check all directory arguments for consistency. +for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ + datadir sysconfdir sharedstatedir localstatedir includedir \ + oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ + libdir localedir mandir runstatedir +do + eval ac_val=\$$ac_var + # Remove trailing slashes. + case $ac_val in + */ ) + ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` + eval $ac_var=\$ac_val;; + esac + # Be sure to have absolute directory names. + case $ac_val in + [\\/$]* | ?:[\\/]* ) continue;; + NONE | '' ) case $ac_var in *prefix ) continue;; esac;; + esac + as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" +done + +# There might be people who depend on the old broken behavior: `$host' +# used to hold the argument of --host etc. +# FIXME: To remove some day. +build=$build_alias +host=$host_alias +target=$target_alias + +# FIXME: To remove some day. +if test "x$host_alias" != x; then + if test "x$build_alias" = x; then + cross_compiling=maybe + elif test "x$build_alias" != "x$host_alias"; then + cross_compiling=yes + fi +fi + +ac_tool_prefix= +test -n "$host_alias" && ac_tool_prefix=$host_alias- + +test "$silent" = yes && exec 6>/dev/null + + +ac_pwd=`pwd` && test -n "$ac_pwd" && +ac_ls_di=`ls -di .` && +ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || + as_fn_error $? "working directory cannot be determined" +test "X$ac_ls_di" = "X$ac_pwd_ls_di" || + as_fn_error $? "pwd does not report name of working directory" + + +# Find the source files, if location was not specified. +if test -z "$srcdir"; then + ac_srcdir_defaulted=yes + # Try the directory containing this script, then the parent directory. + ac_confdir=`$as_dirname -- "$as_myself" || +$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_myself" : 'X\(//\)[^/]' \| \ + X"$as_myself" : 'X\(//\)$' \| \ + X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || +printf "%s\n" X"$as_myself" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + srcdir=$ac_confdir + if test ! -r "$srcdir/$ac_unique_file"; then + srcdir=.. + fi +else + ac_srcdir_defaulted=no +fi +if test ! -r "$srcdir/$ac_unique_file"; then + test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." + as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" +fi +ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" +ac_abs_confdir=`( + cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" + pwd)` +# When building in place, set srcdir=. +if test "$ac_abs_confdir" = "$ac_pwd"; then + srcdir=. +fi +# Remove unnecessary trailing slashes from srcdir. +# Double slashes in file names in object file debugging info +# mess up M-x gdb in Emacs. +case $srcdir in +*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; +esac +for ac_var in $ac_precious_vars; do + eval ac_env_${ac_var}_set=\${${ac_var}+set} + eval ac_env_${ac_var}_value=\$${ac_var} + eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} + eval ac_cv_env_${ac_var}_value=\$${ac_var} +done + +# +# Report the --help message. +# +if test "$ac_init_help" = "long"; then + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat <<_ACEOF +\`configure' configures PortAudioCpp 12 to adapt to many kinds of systems. + +Usage: $0 [OPTION]... [VAR=VALUE]... + +To assign environment variables (e.g., CC, CFLAGS...), specify them as +VAR=VALUE. See below for descriptions of some of the useful variables. + +Defaults for the options are specified in brackets. + +Configuration: + -h, --help display this help and exit + --help=short display options specific to this package + --help=recursive display the short help of all the included packages + -V, --version display version information and exit + -q, --quiet, --silent do not print \`checking ...' messages + --cache-file=FILE cache test results in FILE [disabled] + -C, --config-cache alias for \`--cache-file=config.cache' + -n, --no-create do not create output files + --srcdir=DIR find the sources in DIR [configure dir or \`..'] + +Installation directories: + --prefix=PREFIX install architecture-independent files in PREFIX + @<:@@S|@ac_default_prefix@:>@ + --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX + @<:@PREFIX@:>@ + +By default, \`make install' will install all the files in +\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify +an installation prefix other than \`$ac_default_prefix' using \`--prefix', +for instance \`--prefix=\$HOME'. + +For better control, use the options below. + +Fine tuning of the installation directories: + --bindir=DIR user executables [EPREFIX/bin] + --sbindir=DIR system admin executables [EPREFIX/sbin] + --libexecdir=DIR program executables [EPREFIX/libexec] + --sysconfdir=DIR read-only single-machine data [PREFIX/etc] + --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] + --localstatedir=DIR modifiable single-machine data [PREFIX/var] + --runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run] + --libdir=DIR object code libraries [EPREFIX/lib] + --includedir=DIR C header files [PREFIX/include] + --oldincludedir=DIR C header files for non-gcc [/usr/include] + --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] + --datadir=DIR read-only architecture-independent data [DATAROOTDIR] + --infodir=DIR info documentation [DATAROOTDIR/info] + --localedir=DIR locale-dependent data [DATAROOTDIR/locale] + --mandir=DIR man documentation [DATAROOTDIR/man] + --docdir=DIR documentation root @<:@DATAROOTDIR/doc/portaudiocpp@:>@ + --htmldir=DIR html documentation [DOCDIR] + --dvidir=DIR dvi documentation [DOCDIR] + --pdfdir=DIR pdf documentation [DOCDIR] + --psdir=DIR ps documentation [DOCDIR] +_ACEOF + + cat <<\_ACEOF + +Program names: + --program-prefix=PREFIX prepend PREFIX to installed program names + --program-suffix=SUFFIX append SUFFIX to installed program names + --program-transform-name=PROGRAM run sed PROGRAM on installed program names + +System types: + --build=BUILD configure for building on BUILD [guessed] + --host=HOST cross-compile to build programs to run on HOST [BUILD] +_ACEOF +fi + +if test -n "$ac_init_help"; then + case $ac_init_help in + short | recursive ) echo "Configuration of PortAudioCpp 12:";; + esac + cat <<\_ACEOF + +Optional Features: + --disable-option-checking ignore unrecognized --enable/--with options + --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --enable-silent-rules less verbose build output (undo: "make V=1") + --disable-silent-rules verbose build output (undo: "make V=0") + --enable-maintainer-mode + enable make rules and dependencies not useful (and + sometimes confusing) to the casual installer + --enable-dependency-tracking + do not reject slow dependency extractors + --disable-dependency-tracking + speeds up one-time build + --enable-shared@<:@=PKGS@:>@ build shared libraries @<:@default=yes@:>@ + --enable-static@<:@=PKGS@:>@ build static libraries @<:@default=yes@:>@ + --enable-fast-install@<:@=PKGS@:>@ + optimize for fast installation @<:@default=yes@:>@ + --disable-libtool-lock avoid locking (might break parallel builds) + +Optional Packages: + --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] + --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) + --with-pic@<:@=PKGS@:>@ try to use only PIC/non-PIC objects @<:@default=use + both@:>@ + --with-aix-soname=aix|svr4|both + shared library versioning (aka "SONAME") variant to + provide on AIX, @<:@default=aix@:>@. + --with-gnu-ld assume the C compiler uses GNU ld @<:@default=no@:>@ + --with-sysroot@<:@=DIR@:>@ Search for dependent libraries within DIR (or the + compiler's sysroot if not specified). + +Some influential environment variables: + CC C compiler command + CFLAGS C compiler flags + LDFLAGS linker flags, e.g. -L if you have libraries in a + nonstandard directory + LIBS libraries to pass to the linker, e.g. -l + CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if + you have headers in a nonstandard directory + CXX C++ compiler command + CXXFLAGS C++ compiler flags + LT_SYS_LIBRARY_PATH + User-defined run-time library search path. + CXXCPP C++ preprocessor + +Use these variables to override the choices made by `configure' or to help +it to find libraries and programs with nonstandard names/locations. + +Report bugs to the package provider. +_ACEOF +ac_status=$? +fi + +if test "$ac_init_help" = "recursive"; then + # If there are subdirs, report their specific --help. + for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue + test -d "$ac_dir" || + { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || + continue + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + cd "$ac_dir" || { ac_status=$?; continue; } + # Check for configure.gnu first; this name is used for a wrapper for + # Metaconfig's "Configure" on case-insensitive file systems. + if test -f "$ac_srcdir/configure.gnu"; then + echo && + $SHELL "$ac_srcdir/configure.gnu" --help=recursive + elif test -f "$ac_srcdir/configure"; then + echo && + $SHELL "$ac_srcdir/configure" --help=recursive + else + printf "%s\n" "$as_me: WARNING: no configuration information is in $ac_dir" >&2 + fi || ac_status=$? + cd "$ac_pwd" || { ac_status=$?; break; } + done +fi + +test -n "$ac_init_help" && exit $ac_status +if $ac_init_version; then + cat <<\_ACEOF +PortAudioCpp configure 12 +generated by GNU Autoconf 2.71 + +Copyright (C) 2021 Free Software Foundation, Inc. +This configure script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it. +_ACEOF + exit +fi + +## ------------------------ ## +## Autoconf initialization. ## +## ------------------------ ## + +@%:@ ac_fn_c_try_compile LINENO +@%:@ -------------------------- +@%:@ Try to compile conftest.@S|@ac_ext, and return whether this succeeded. +ac_fn_c_try_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext conftest.beam + if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext +then : + ac_retval=0 +else $as_nop + printf "%s\n" "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} @%:@ ac_fn_c_try_compile + +@%:@ ac_fn_cxx_try_compile LINENO +@%:@ ---------------------------- +@%:@ Try to compile conftest.@S|@ac_ext, and return whether this succeeded. +ac_fn_cxx_try_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext conftest.beam + if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext +then : + ac_retval=0 +else $as_nop + printf "%s\n" "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} @%:@ ac_fn_cxx_try_compile + +@%:@ ac_fn_c_try_link LINENO +@%:@ ----------------------- +@%:@ Try to link conftest.@S|@ac_ext, and return whether this succeeded. +ac_fn_c_try_link () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext conftest.beam conftest$ac_exeext + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + test -x conftest$ac_exeext + } +then : + ac_retval=0 +else $as_nop + printf "%s\n" "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information + # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would + # interfere with the next link command; also delete a directory that is + # left behind by Apple's compiler. We do this before executing the actions. + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} @%:@ ac_fn_c_try_link + +@%:@ ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES +@%:@ ------------------------------------------------------- +@%:@ Tests whether HEADER exists and can be compiled using the include files in +@%:@ INCLUDES, setting the cache variable VAR accordingly. +ac_fn_c_check_header_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +printf %s "checking for $2... " >&6; } +if eval test \${$3+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +@%:@include <$2> +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + eval "$3=yes" +else $as_nop + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +eval ac_res=\$$3 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} @%:@ ac_fn_c_check_header_compile + +@%:@ ac_fn_c_check_func LINENO FUNC VAR +@%:@ ---------------------------------- +@%:@ Tests whether FUNC exists, setting the cache variable VAR accordingly +ac_fn_c_check_func () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +printf %s "checking for $2... " >&6; } +if eval test \${$3+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +/* Define $2 to an innocuous variant, in case declares $2. + For example, HP-UX 11i declares gettimeofday. */ +#define $2 innocuous_$2 + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $2 (); below. */ + +#include +#undef $2 + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $2 (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$2 || defined __stub___$2 +choke me +#endif + +int +main (void) +{ +return $2 (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + eval "$3=yes" +else $as_nop + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +fi +eval ac_res=\$$3 + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +printf "%s\n" "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} @%:@ ac_fn_c_check_func + +@%:@ ac_fn_cxx_try_cpp LINENO +@%:@ ------------------------ +@%:@ Try to preprocess conftest.@S|@ac_ext, and return whether this succeeded. +ac_fn_cxx_try_cpp () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } > conftest.i && { + test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || + test ! -s conftest.err + } +then : + ac_retval=0 +else $as_nop + printf "%s\n" "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} @%:@ ac_fn_cxx_try_cpp + +@%:@ ac_fn_cxx_try_link LINENO +@%:@ ------------------------- +@%:@ Try to link conftest.@S|@ac_ext, and return whether this succeeded. +ac_fn_cxx_try_link () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext conftest.beam conftest$ac_exeext + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + test -x conftest$ac_exeext + } +then : + ac_retval=0 +else $as_nop + printf "%s\n" "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information + # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would + # interfere with the next link command; also delete a directory that is + # left behind by Apple's compiler. We do this before executing the actions. + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} @%:@ ac_fn_cxx_try_link +ac_configure_args_raw= +for ac_arg +do + case $ac_arg in + *\'*) + ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + as_fn_append ac_configure_args_raw " '$ac_arg'" +done + +case $ac_configure_args_raw in + *$as_nl*) + ac_safe_unquote= ;; + *) + ac_unsafe_z='|&;<>()$`\\"*?@<:@ '' ' # This string ends in space, tab. + ac_unsafe_a="$ac_unsafe_z#~" + ac_safe_unquote="s/ '\\([^$ac_unsafe_a][^$ac_unsafe_z]*\\)'/ \\1/g" + ac_configure_args_raw=` printf "%s\n" "$ac_configure_args_raw" | sed "$ac_safe_unquote"`;; +esac + +cat >config.log <<_ACEOF +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. + +It was created by PortAudioCpp $as_me 12, which was +generated by GNU Autoconf 2.71. Invocation command line was + + $ $0$ac_configure_args_raw + +_ACEOF +exec 5>>config.log +{ +cat <<_ASUNAME +## --------- ## +## Platform. ## +## --------- ## + +hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` + +/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` +/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` +/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` +/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` + +_ASUNAME + +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + printf "%s\n" "PATH: $as_dir" + done +IFS=$as_save_IFS + +} >&5 + +cat >&5 <<_ACEOF + + +## ----------- ## +## Core tests. ## +## ----------- ## + +_ACEOF + + +# Keep a trace of the command line. +# Strip out --no-create and --no-recursion so they do not pile up. +# Strip out --silent because we don't want to record it for future runs. +# Also quote any args containing shell meta-characters. +# Make two passes to allow for proper duplicate-argument suppression. +ac_configure_args= +ac_configure_args0= +ac_configure_args1= +ac_must_keep_next=false +for ac_pass in 1 2 +do + for ac_arg + do + case $ac_arg in + -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + continue ;; + *\'*) + ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + case $ac_pass in + 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; + 2) + as_fn_append ac_configure_args1 " '$ac_arg'" + if test $ac_must_keep_next = true; then + ac_must_keep_next=false # Got value, back to normal. + else + case $ac_arg in + *=* | --config-cache | -C | -disable-* | --disable-* \ + | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ + | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ + | -with-* | --with-* | -without-* | --without-* | --x) + case "$ac_configure_args0 " in + "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; + esac + ;; + -* ) ac_must_keep_next=true ;; + esac + fi + as_fn_append ac_configure_args " '$ac_arg'" + ;; + esac + done +done +{ ac_configure_args0=; unset ac_configure_args0;} +{ ac_configure_args1=; unset ac_configure_args1;} + +# When interrupted or exit'd, cleanup temporary files, and complete +# config.log. We remove comments because anyway the quotes in there +# would cause problems or look ugly. +# WARNING: Use '\'' to represent an apostrophe within the trap. +# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. +trap 'exit_status=$? + # Sanitize IFS. + IFS=" "" $as_nl" + # Save into config.log some information that might help in debugging. + { + echo + + printf "%s\n" "## ---------------- ## +## Cache variables. ## +## ---------------- ##" + echo + # The following way of writing the cache mishandles newlines in values, +( + for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + (set) 2>&1 | + case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + sed -n \ + "s/'\''/'\''\\\\'\'''\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" + ;; #( + *) + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) + echo + + printf "%s\n" "## ----------------- ## +## Output variables. ## +## ----------------- ##" + echo + for ac_var in $ac_subst_vars + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + printf "%s\n" "$ac_var='\''$ac_val'\''" + done | sort + echo + + if test -n "$ac_subst_files"; then + printf "%s\n" "## ------------------- ## +## File substitutions. ## +## ------------------- ##" + echo + for ac_var in $ac_subst_files + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + printf "%s\n" "$ac_var='\''$ac_val'\''" + done | sort + echo + fi + + if test -s confdefs.h; then + printf "%s\n" "## ----------- ## +## confdefs.h. ## +## ----------- ##" + echo + cat confdefs.h + echo + fi + test "$ac_signal" != 0 && + printf "%s\n" "$as_me: caught signal $ac_signal" + printf "%s\n" "$as_me: exit $exit_status" + } >&5 + rm -f core *.core core.conftest.* && + rm -f -r conftest* confdefs* conf$$* $ac_clean_files && + exit $exit_status +' 0 +for ac_signal in 1 2 13 15; do + trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal +done +ac_signal=0 + +# confdefs.h avoids OS command line length limits that DEFS can exceed. +rm -f -r conftest* confdefs.h + +printf "%s\n" "/* confdefs.h */" > confdefs.h + +# Predefined preprocessor variables. + +printf "%s\n" "@%:@define PACKAGE_NAME \"$PACKAGE_NAME\"" >>confdefs.h + +printf "%s\n" "@%:@define PACKAGE_TARNAME \"$PACKAGE_TARNAME\"" >>confdefs.h + +printf "%s\n" "@%:@define PACKAGE_VERSION \"$PACKAGE_VERSION\"" >>confdefs.h + +printf "%s\n" "@%:@define PACKAGE_STRING \"$PACKAGE_STRING\"" >>confdefs.h + +printf "%s\n" "@%:@define PACKAGE_BUGREPORT \"$PACKAGE_BUGREPORT\"" >>confdefs.h + +printf "%s\n" "@%:@define PACKAGE_URL \"$PACKAGE_URL\"" >>confdefs.h + + +# Let the site file select an alternate cache file if it wants to. +# Prefer an explicitly selected file to automatically selected ones. +if test -n "$CONFIG_SITE"; then + ac_site_files="$CONFIG_SITE" +elif test "x$prefix" != xNONE; then + ac_site_files="$prefix/share/config.site $prefix/etc/config.site" +else + ac_site_files="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" +fi + +for ac_site_file in $ac_site_files +do + case $ac_site_file in @%:@( + */*) : + ;; @%:@( + *) : + ac_site_file=./$ac_site_file ;; +esac + if test -f "$ac_site_file" && test -r "$ac_site_file"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 +printf "%s\n" "$as_me: loading site script $ac_site_file" >&6;} + sed 's/^/| /' "$ac_site_file" >&5 + . "$ac_site_file" \ + || { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "failed to load site script $ac_site_file +See \`config.log' for more details" "$LINENO" 5; } + fi +done + +if test -r "$cache_file"; then + # Some versions of bash will fail to source /dev/null (special files + # actually), so we avoid doing that. DJGPP emulates it as a regular file. + if test /dev/null != "$cache_file" && test -f "$cache_file"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 +printf "%s\n" "$as_me: loading cache $cache_file" >&6;} + case $cache_file in + [\\/]* | ?:[\\/]* ) . "$cache_file";; + *) . "./$cache_file";; + esac + fi +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 +printf "%s\n" "$as_me: creating cache $cache_file" >&6;} + >$cache_file +fi + +# Test code for whether the C compiler supports C89 (global declarations) +ac_c_conftest_c89_globals=' +/* Does the compiler advertise C89 conformance? + Do not test the value of __STDC__, because some compilers set it to 0 + while being otherwise adequately conformant. */ +#if !defined __STDC__ +# error "Compiler does not advertise C89 conformance" +#endif + +#include +#include +struct stat; +/* Most of the following tests are stolen from RCS 5.7 src/conf.sh. */ +struct buf { int x; }; +struct buf * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} + +/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has + function prototypes and stuff, but not \xHH hex character constants. + These do not provoke an error unfortunately, instead are silently treated + as an "x". The following induces an error, until -std is added to get + proper ANSI mode. Curiously \x00 != x always comes out true, for an + array size at least. It is necessary to write \x00 == 0 to get something + that is true only with -std. */ +int osf4_cc_array ['\''\x00'\'' == 0 ? 1 : -1]; + +/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters + inside strings and character constants. */ +#define FOO(x) '\''x'\'' +int xlc6_cc_array[FOO(a) == '\''x'\'' ? 1 : -1]; + +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, int *(*)(struct buf *, struct stat *, int), + int, int);' + +# Test code for whether the C compiler supports C89 (body of main). +ac_c_conftest_c89_main=' +ok |= (argc == 0 || f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]); +' + +# Test code for whether the C compiler supports C99 (global declarations) +ac_c_conftest_c99_globals=' +// Does the compiler advertise C99 conformance? +#if !defined __STDC_VERSION__ || __STDC_VERSION__ < 199901L +# error "Compiler does not advertise C99 conformance" +#endif + +#include +extern int puts (const char *); +extern int printf (const char *, ...); +extern int dprintf (int, const char *, ...); +extern void *malloc (size_t); + +// Check varargs macros. These examples are taken from C99 6.10.3.5. +// dprintf is used instead of fprintf to avoid needing to declare +// FILE and stderr. +#define debug(...) dprintf (2, __VA_ARGS__) +#define showlist(...) puts (#__VA_ARGS__) +#define report(test,...) ((test) ? puts (#test) : printf (__VA_ARGS__)) +static void +test_varargs_macros (void) +{ + int x = 1234; + int y = 5678; + debug ("Flag"); + debug ("X = %d\n", x); + showlist (The first, second, and third items.); + report (x>y, "x is %d but y is %d", x, y); +} + +// Check long long types. +#define BIG64 18446744073709551615ull +#define BIG32 4294967295ul +#define BIG_OK (BIG64 / BIG32 == 4294967297ull && BIG64 % BIG32 == 0) +#if !BIG_OK + #error "your preprocessor is broken" +#endif +#if BIG_OK +#else + #error "your preprocessor is broken" +#endif +static long long int bignum = -9223372036854775807LL; +static unsigned long long int ubignum = BIG64; + +struct incomplete_array +{ + int datasize; + double data[]; +}; + +struct named_init { + int number; + const wchar_t *name; + double average; +}; + +typedef const char *ccp; + +static inline int +test_restrict (ccp restrict text) +{ + // See if C++-style comments work. + // Iterate through items via the restricted pointer. + // Also check for declarations in for loops. + for (unsigned int i = 0; *(text+i) != '\''\0'\''; ++i) + continue; + return 0; +} + +// Check varargs and va_copy. +static bool +test_varargs (const char *format, ...) +{ + va_list args; + va_start (args, format); + va_list args_copy; + va_copy (args_copy, args); + + const char *str = ""; + int number = 0; + float fnumber = 0; + + while (*format) + { + switch (*format++) + { + case '\''s'\'': // string + str = va_arg (args_copy, const char *); + break; + case '\''d'\'': // int + number = va_arg (args_copy, int); + break; + case '\''f'\'': // float + fnumber = va_arg (args_copy, double); + break; + default: + break; + } + } + va_end (args_copy); + va_end (args); + + return *str && number && fnumber; +} +' + +# Test code for whether the C compiler supports C99 (body of main). +ac_c_conftest_c99_main=' + // Check bool. + _Bool success = false; + success |= (argc != 0); + + // Check restrict. + if (test_restrict ("String literal") == 0) + success = true; + char *restrict newvar = "Another string"; + + // Check varargs. + success &= test_varargs ("s, d'\'' f .", "string", 65, 34.234); + test_varargs_macros (); + + // Check flexible array members. + struct incomplete_array *ia = + malloc (sizeof (struct incomplete_array) + (sizeof (double) * 10)); + ia->datasize = 10; + for (int i = 0; i < ia->datasize; ++i) + ia->data[i] = i * 1.234; + + // Check named initializers. + struct named_init ni = { + .number = 34, + .name = L"Test wide string", + .average = 543.34343, + }; + + ni.number = 58; + + int dynamic_array[ni.number]; + dynamic_array[0] = argv[0][0]; + dynamic_array[ni.number - 1] = 543; + + // work around unused variable warnings + ok |= (!success || bignum == 0LL || ubignum == 0uLL || newvar[0] == '\''x'\'' + || dynamic_array[ni.number - 1] != 543); +' + +# Test code for whether the C compiler supports C11 (global declarations) +ac_c_conftest_c11_globals=' +// Does the compiler advertise C11 conformance? +#if !defined __STDC_VERSION__ || __STDC_VERSION__ < 201112L +# error "Compiler does not advertise C11 conformance" +#endif + +// Check _Alignas. +char _Alignas (double) aligned_as_double; +char _Alignas (0) no_special_alignment; +extern char aligned_as_int; +char _Alignas (0) _Alignas (int) aligned_as_int; + +// Check _Alignof. +enum +{ + int_alignment = _Alignof (int), + int_array_alignment = _Alignof (int[100]), + char_alignment = _Alignof (char) +}; +_Static_assert (0 < -_Alignof (int), "_Alignof is signed"); + +// Check _Noreturn. +int _Noreturn does_not_return (void) { for (;;) continue; } + +// Check _Static_assert. +struct test_static_assert +{ + int x; + _Static_assert (sizeof (int) <= sizeof (long int), + "_Static_assert does not work in struct"); + long int y; +}; + +// Check UTF-8 literals. +#define u8 syntax error! +char const utf8_literal[] = u8"happens to be ASCII" "another string"; + +// Check duplicate typedefs. +typedef long *long_ptr; +typedef long int *long_ptr; +typedef long_ptr long_ptr; + +// Anonymous structures and unions -- taken from C11 6.7.2.1 Example 1. +struct anonymous +{ + union { + struct { int i; int j; }; + struct { int k; long int l; } w; + }; + int m; +} v1; +' + +# Test code for whether the C compiler supports C11 (body of main). +ac_c_conftest_c11_main=' + _Static_assert ((offsetof (struct anonymous, i) + == offsetof (struct anonymous, w.k)), + "Anonymous union alignment botch"); + v1.i = 2; + v1.w.k = 5; + ok |= v1.i != 5; +' + +# Test code for whether the C compiler supports C11 (complete). +ac_c_conftest_c11_program="${ac_c_conftest_c89_globals} +${ac_c_conftest_c99_globals} +${ac_c_conftest_c11_globals} + +int +main (int argc, char **argv) +{ + int ok = 0; + ${ac_c_conftest_c89_main} + ${ac_c_conftest_c99_main} + ${ac_c_conftest_c11_main} + return ok; +} +" + +# Test code for whether the C compiler supports C99 (complete). +ac_c_conftest_c99_program="${ac_c_conftest_c89_globals} +${ac_c_conftest_c99_globals} + +int +main (int argc, char **argv) +{ + int ok = 0; + ${ac_c_conftest_c89_main} + ${ac_c_conftest_c99_main} + return ok; +} +" + +# Test code for whether the C compiler supports C89 (complete). +ac_c_conftest_c89_program="${ac_c_conftest_c89_globals} + +int +main (int argc, char **argv) +{ + int ok = 0; + ${ac_c_conftest_c89_main} + return ok; +} +" + +# Test code for whether the C++ compiler supports C++98 (global declarations) +ac_cxx_conftest_cxx98_globals=' +// Does the compiler advertise C++98 conformance? +#if !defined __cplusplus || __cplusplus < 199711L +# error "Compiler does not advertise C++98 conformance" +#endif + +// These inclusions are to reject old compilers that +// lack the unsuffixed header files. +#include +#include + +// and are *not* freestanding headers in C++98. +extern void assert (int); +namespace std { + extern int strcmp (const char *, const char *); +} + +// Namespaces, exceptions, and templates were all added after "C++ 2.0". +using std::exception; +using std::strcmp; + +namespace { + +void test_exception_syntax() +{ + try { + throw "test"; + } catch (const char *s) { + // Extra parentheses suppress a warning when building autoconf itself, + // due to lint rules shared with more typical C programs. + assert (!(strcmp) (s, "test")); + } +} + +template struct test_template +{ + T const val; + explicit test_template(T t) : val(t) {} + template T add(U u) { return static_cast(u) + val; } +}; + +} // anonymous namespace +' + +# Test code for whether the C++ compiler supports C++98 (body of main) +ac_cxx_conftest_cxx98_main=' + assert (argc); + assert (! argv[0]); +{ + test_exception_syntax (); + test_template tt (2.0); + assert (tt.add (4) == 6.0); + assert (true && !false); +} +' + +# Test code for whether the C++ compiler supports C++11 (global declarations) +ac_cxx_conftest_cxx11_globals=' +// Does the compiler advertise C++ 2011 conformance? +#if !defined __cplusplus || __cplusplus < 201103L +# error "Compiler does not advertise C++11 conformance" +#endif + +namespace cxx11test +{ + constexpr int get_val() { return 20; } + + struct testinit + { + int i; + double d; + }; + + class delegate + { + public: + delegate(int n) : n(n) {} + delegate(): delegate(2354) {} + + virtual int getval() { return this->n; }; + protected: + int n; + }; + + class overridden : public delegate + { + public: + overridden(int n): delegate(n) {} + virtual int getval() override final { return this->n * 2; } + }; + + class nocopy + { + public: + nocopy(int i): i(i) {} + nocopy() = default; + nocopy(const nocopy&) = delete; + nocopy & operator=(const nocopy&) = delete; + private: + int i; + }; + + // for testing lambda expressions + template Ret eval(Fn f, Ret v) + { + return f(v); + } + + // for testing variadic templates and trailing return types + template auto sum(V first) -> V + { + return first; + } + template auto sum(V first, Args... rest) -> V + { + return first + sum(rest...); + } +} +' + +# Test code for whether the C++ compiler supports C++11 (body of main) +ac_cxx_conftest_cxx11_main=' +{ + // Test auto and decltype + auto a1 = 6538; + auto a2 = 48573953.4; + auto a3 = "String literal"; + + int total = 0; + for (auto i = a3; *i; ++i) { total += *i; } + + decltype(a2) a4 = 34895.034; +} +{ + // Test constexpr + short sa[cxx11test::get_val()] = { 0 }; +} +{ + // Test initializer lists + cxx11test::testinit il = { 4323, 435234.23544 }; +} +{ + // Test range-based for + int array[] = {9, 7, 13, 15, 4, 18, 12, 10, 5, 3, + 14, 19, 17, 8, 6, 20, 16, 2, 11, 1}; + for (auto &x : array) { x += 23; } +} +{ + // Test lambda expressions + using cxx11test::eval; + assert (eval ([](int x) { return x*2; }, 21) == 42); + double d = 2.0; + assert (eval ([&](double x) { return d += x; }, 3.0) == 5.0); + assert (d == 5.0); + assert (eval ([=](double x) mutable { return d += x; }, 4.0) == 9.0); + assert (d == 5.0); +} +{ + // Test use of variadic templates + using cxx11test::sum; + auto a = sum(1); + auto b = sum(1, 2); + auto c = sum(1.0, 2.0, 3.0); +} +{ + // Test constructor delegation + cxx11test::delegate d1; + cxx11test::delegate d2(); + cxx11test::delegate d3(45); +} +{ + // Test override and final + cxx11test::overridden o1(55464); +} +{ + // Test nullptr + char *c = nullptr; +} +{ + // Test template brackets + test_template<::test_template> v(test_template(12)); +} +{ + // Unicode literals + char const *utf8 = u8"UTF-8 string \u2500"; + char16_t const *utf16 = u"UTF-8 string \u2500"; + char32_t const *utf32 = U"UTF-32 string \u2500"; +} +' + +# Test code for whether the C compiler supports C++11 (complete). +ac_cxx_conftest_cxx11_program="${ac_cxx_conftest_cxx98_globals} +${ac_cxx_conftest_cxx11_globals} + +int +main (int argc, char **argv) +{ + int ok = 0; + ${ac_cxx_conftest_cxx98_main} + ${ac_cxx_conftest_cxx11_main} + return ok; +} +" + +# Test code for whether the C compiler supports C++98 (complete). +ac_cxx_conftest_cxx98_program="${ac_cxx_conftest_cxx98_globals} +int +main (int argc, char **argv) +{ + int ok = 0; + ${ac_cxx_conftest_cxx98_main} + return ok; +} +" + +as_fn_append ac_header_c_list " stdio.h stdio_h HAVE_STDIO_H" +as_fn_append ac_header_c_list " stdlib.h stdlib_h HAVE_STDLIB_H" +as_fn_append ac_header_c_list " string.h string_h HAVE_STRING_H" +as_fn_append ac_header_c_list " inttypes.h inttypes_h HAVE_INTTYPES_H" +as_fn_append ac_header_c_list " stdint.h stdint_h HAVE_STDINT_H" +as_fn_append ac_header_c_list " strings.h strings_h HAVE_STRINGS_H" +as_fn_append ac_header_c_list " sys/stat.h sys_stat_h HAVE_SYS_STAT_H" +as_fn_append ac_header_c_list " sys/types.h sys_types_h HAVE_SYS_TYPES_H" +as_fn_append ac_header_c_list " unistd.h unistd_h HAVE_UNISTD_H" + +# Auxiliary files required by this configure script. +ac_aux_files="ltmain.sh config.guess config.sub compile missing install-sh" + +# Locations in which to look for auxiliary files. +ac_aux_dir_candidates="${srcdir}${PATH_SEPARATOR}${srcdir}/..${PATH_SEPARATOR}${srcdir}/../.." + +# Search for a directory containing all of the required auxiliary files, +# $ac_aux_files, from the $PATH-style list $ac_aux_dir_candidates. +# If we don't find one directory that contains all the files we need, +# we report the set of missing files from the *first* directory in +# $ac_aux_dir_candidates and give up. +ac_missing_aux_files="" +ac_first_candidate=: +printf "%s\n" "$as_me:${as_lineno-$LINENO}: looking for aux files: $ac_aux_files" >&5 +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +as_found=false +for as_dir in $ac_aux_dir_candidates +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + as_found=: + + printf "%s\n" "$as_me:${as_lineno-$LINENO}: trying $as_dir" >&5 + ac_aux_dir_found=yes + ac_install_sh= + for ac_aux in $ac_aux_files + do + # As a special case, if "install-sh" is required, that requirement + # can be satisfied by any of "install-sh", "install.sh", or "shtool", + # and $ac_install_sh is set appropriately for whichever one is found. + if test x"$ac_aux" = x"install-sh" + then + if test -f "${as_dir}install-sh"; then + printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}install-sh found" >&5 + ac_install_sh="${as_dir}install-sh -c" + elif test -f "${as_dir}install.sh"; then + printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}install.sh found" >&5 + ac_install_sh="${as_dir}install.sh -c" + elif test -f "${as_dir}shtool"; then + printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}shtool found" >&5 + ac_install_sh="${as_dir}shtool install -c" + else + ac_aux_dir_found=no + if $ac_first_candidate; then + ac_missing_aux_files="${ac_missing_aux_files} install-sh" + else + break + fi + fi + else + if test -f "${as_dir}${ac_aux}"; then + printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}${ac_aux} found" >&5 + else + ac_aux_dir_found=no + if $ac_first_candidate; then + ac_missing_aux_files="${ac_missing_aux_files} ${ac_aux}" + else + break + fi + fi + fi + done + if test "$ac_aux_dir_found" = yes; then + ac_aux_dir="$as_dir" + break + fi + ac_first_candidate=false + + as_found=false +done +IFS=$as_save_IFS +if $as_found +then : + +else $as_nop + as_fn_error $? "cannot find required auxiliary files:$ac_missing_aux_files" "$LINENO" 5 +fi + + +# These three variables are undocumented and unsupported, +# and are intended to be withdrawn in a future Autoconf release. +# They can cause serious problems if a builder's source tree is in a directory +# whose full name contains unusual characters. +if test -f "${ac_aux_dir}config.guess"; then + ac_@&t@config_guess="$SHELL ${ac_aux_dir}config.guess" +fi +if test -f "${ac_aux_dir}config.sub"; then + ac_@&t@config_sub="$SHELL ${ac_aux_dir}config.sub" +fi +if test -f "$ac_aux_dir/configure"; then + ac_@&t@configure="$SHELL ${ac_aux_dir}configure" +fi + +# Check that the precious variables saved in the cache have kept the same +# value. +ac_cache_corrupted=false +for ac_var in $ac_precious_vars; do + eval ac_old_set=\$ac_cv_env_${ac_var}_set + eval ac_new_set=\$ac_env_${ac_var}_set + eval ac_old_val=\$ac_cv_env_${ac_var}_value + eval ac_new_val=\$ac_env_${ac_var}_value + case $ac_old_set,$ac_new_set in + set,) + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 +printf "%s\n" "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,set) + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 +printf "%s\n" "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,);; + *) + if test "x$ac_old_val" != "x$ac_new_val"; then + # differences in whitespace do not lead to failure. + ac_old_val_w=`echo x $ac_old_val` + ac_new_val_w=`echo x $ac_new_val` + if test "$ac_old_val_w" != "$ac_new_val_w"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 +printf "%s\n" "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} + ac_cache_corrupted=: + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 +printf "%s\n" "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} + eval $ac_var=\$ac_old_val + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 +printf "%s\n" "$as_me: former value: \`$ac_old_val'" >&2;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 +printf "%s\n" "$as_me: current value: \`$ac_new_val'" >&2;} + fi;; + esac + # Pass precious variables to config.status. + if test "$ac_new_set" = set; then + case $ac_new_val in + *\'*) ac_arg=$ac_var=`printf "%s\n" "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; + *) ac_arg=$ac_var=$ac_new_val ;; + esac + case " $ac_configure_args " in + *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. + *) as_fn_append ac_configure_args " '$ac_arg'" ;; + esac + fi +done +if $ac_cache_corrupted; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 +printf "%s\n" "$as_me: error: changes in the environment can compromise the build" >&2;} + as_fn_error $? "run \`${MAKE-make} distclean' and/or \`rm $cache_file' + and start over" "$LINENO" 5 +fi +## -------------------- ## +## Main body of script. ## +## -------------------- ## + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + +am__api_version='1.16' + + + + # Find a good install program. We prefer a C program (faster), +# so one script is as good as another. But avoid the broken or +# incompatible versions: +# SysV /etc/install, /usr/sbin/install +# SunOS /usr/etc/install +# IRIX /sbin/install +# AIX /bin/install +# AmigaOS /C/install, which installs bootblocks on floppy discs +# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag +# AFS /usr/afsws/bin/install, which mishandles nonexistent args +# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" +# OS/2's system install, which has a completely different semantic +# ./install, which can be erroneously created by make from ./install.sh. +# Reject install programs that cannot install multiple files. +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 +printf %s "checking for a BSD-compatible install... " >&6; } +if test -z "$INSTALL"; then +if test ${ac_cv_path_install+y} +then : + printf %s "(cached) " >&6 +else $as_nop + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + # Account for fact that we put trailing slashes in our PATH walk. +case $as_dir in @%:@(( + ./ | /[cC]/* | \ + /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ + ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ + /usr/ucb/* ) ;; + *) + # OSF1 and SCO ODT 3.0 have their own names for install. + # Don't use installbsd from OSF since it installs stuff as root + # by default. + for ac_prog in ginstall scoinst install; do + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_prog$ac_exec_ext"; then + if test $ac_prog = install && + grep dspmsg "$as_dir$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # AIX install. It has an incompatible calling convention. + : + elif test $ac_prog = install && + grep pwplus "$as_dir$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # program-specific install script used by HP pwplus--don't use. + : + else + rm -rf conftest.one conftest.two conftest.dir + echo one > conftest.one + echo two > conftest.two + mkdir conftest.dir + if "$as_dir$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir/" && + test -s conftest.one && test -s conftest.two && + test -s conftest.dir/conftest.one && + test -s conftest.dir/conftest.two + then + ac_cv_path_install="$as_dir$ac_prog$ac_exec_ext -c" + break 3 + fi + fi + fi + done + done + ;; +esac + + done +IFS=$as_save_IFS + +rm -rf conftest.one conftest.two conftest.dir + +fi + if test ${ac_cv_path_install+y}; then + INSTALL=$ac_cv_path_install + else + # As a last resort, use the slow shell script. Don't cache a + # value for INSTALL within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + INSTALL=$ac_install_sh + fi +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 +printf "%s\n" "$INSTALL" >&6; } + +# Use test -z because SunOS4 sh mishandles braces in ${var-val}. +# It thinks the first close brace ends the variable substitution. +test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' + +test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' + +test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 +printf %s "checking whether build environment is sane... " >&6; } +# Reject unsafe characters in $srcdir or the absolute working directory +# name. Accept space and tab only in the latter. +am_lf=' +' +case `pwd` in + *[\\\"\#\$\&\'\`$am_lf]*) + as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; +esac +case $srcdir in + *[\\\"\#\$\&\'\`$am_lf\ \ ]*) + as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; +esac + +# Do 'set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + am_has_slept=no + for am_try in 1 2; do + echo "timestamp, slept: $am_has_slept" > conftest.file + set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` + if test "$*" = "X"; then + # -L didn't work. + set X `ls -t "$srcdir/configure" conftest.file` + fi + if test "$*" != "X $srcdir/configure conftest.file" \ + && test "$*" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + as_fn_error $? "ls -t appears to fail. Make sure there is not a broken + alias in your environment" "$LINENO" 5 + fi + if test "$2" = conftest.file || test $am_try -eq 2; then + break + fi + # Just in case. + sleep 1 + am_has_slept=yes + done + test "$2" = conftest.file + ) +then + # Ok. + : +else + as_fn_error $? "newly created file is older than distributed files! +Check your system clock" "$LINENO" 5 +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } +# If we didn't sleep, we still need to ensure time stamps of config.status and +# generated files are strictly newer. +am_sleep_pid= +if grep 'slept: no' conftest.file >/dev/null 2>&1; then + ( sleep 1 ) & + am_sleep_pid=$! +fi + +rm -f conftest.file + +test "$program_prefix" != NONE && + program_transform_name="s&^&$program_prefix&;$program_transform_name" +# Use a double $ so make ignores it. +test "$program_suffix" != NONE && + program_transform_name="s&\$&$program_suffix&;$program_transform_name" +# Double any \ or $. +# By default was `s,x,x', remove it if useless. +ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' +program_transform_name=`printf "%s\n" "$program_transform_name" | sed "$ac_script"` + + +# Expand $ac_aux_dir to an absolute path. +am_aux_dir=`cd "$ac_aux_dir" && pwd` + + + if test x"${MISSING+set}" != xset; then + MISSING="\${SHELL} '$am_aux_dir/missing'" +fi +# Use eval to expand $SHELL +if eval "$MISSING --is-lightweight"; then + am_missing_run="$MISSING " +else + am_missing_run= + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 +printf "%s\n" "$as_me: WARNING: 'missing' script is too old or missing" >&2;} +fi + +if test x"${install_sh+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; + *) + install_sh="\${SHELL} $am_aux_dir/install-sh" + esac +fi + +# Installed binaries are usually stripped using 'strip' when the user +# run "make install-strip". However 'strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the 'STRIP' environment variable to overrule this program. +if test "$cross_compiling" != no; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. +set dummy ${ac_tool_prefix}strip; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_STRIP+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$STRIP"; then + ac_cv_prog_STRIP="$STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_STRIP="${ac_tool_prefix}strip" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +STRIP=$ac_cv_prog_STRIP +if test -n "$STRIP"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 +printf "%s\n" "$STRIP" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_STRIP"; then + ac_ct_STRIP=$STRIP + # Extract the first word of "strip", so it can be a program name with args. +set dummy strip; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_STRIP+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_STRIP"; then + ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_STRIP="strip" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP +if test -n "$ac_ct_STRIP"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 +printf "%s\n" "$ac_ct_STRIP" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + if test "x$ac_ct_STRIP" = x; then + STRIP=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + STRIP=$ac_ct_STRIP + fi +else + STRIP="$ac_cv_prog_STRIP" +fi + +fi +INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a race-free mkdir -p" >&5 +printf %s "checking for a race-free mkdir -p... " >&6; } +if test -z "$MKDIR_P"; then + if test ${ac_cv_path_mkdir+y} +then : + printf %s "(cached) " >&6 +else $as_nop + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_prog in mkdir gmkdir; do + for ac_exec_ext in '' $ac_executable_extensions; do + as_fn_executable_p "$as_dir$ac_prog$ac_exec_ext" || continue + case `"$as_dir$ac_prog$ac_exec_ext" --version 2>&1` in #( + 'mkdir ('*'coreutils) '* | \ + 'BusyBox '* | \ + 'mkdir (fileutils) '4.1*) + ac_cv_path_mkdir=$as_dir$ac_prog$ac_exec_ext + break 3;; + esac + done + done + done +IFS=$as_save_IFS + +fi + + test -d ./--version && rmdir ./--version + if test ${ac_cv_path_mkdir+y}; then + MKDIR_P="$ac_cv_path_mkdir -p" + else + # As a last resort, use the slow shell script. Don't cache a + # value for MKDIR_P within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + MKDIR_P="$ac_install_sh -d" + fi +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 +printf "%s\n" "$MKDIR_P" >&6; } + +for ac_prog in gawk mawk nawk awk +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_AWK+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$AWK"; then + ac_cv_prog_AWK="$AWK" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_AWK="$ac_prog" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +AWK=$ac_cv_prog_AWK +if test -n "$AWK"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 +printf "%s\n" "$AWK" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + + test -n "$AWK" && break +done + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 +printf %s "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } +set x ${MAKE-make} +ac_make=`printf "%s\n" "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` +if eval test \${ac_cv_prog_make_${ac_make}_set+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat >conftest.make <<\_ACEOF +SHELL = /bin/sh +all: + @echo '@@@%%%=$(MAKE)=@@@%%%' +_ACEOF +# GNU make sometimes prints "make[1]: Entering ...", which would confuse us. +case `${MAKE-make} -f conftest.make 2>/dev/null` in + *@@@%%%=?*=@@@%%%*) + eval ac_cv_prog_make_${ac_make}_set=yes;; + *) + eval ac_cv_prog_make_${ac_make}_set=no;; +esac +rm -f conftest.make +fi +if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + SET_MAKE= +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + SET_MAKE="MAKE=${MAKE-make}" +fi + +rm -rf .tst 2>/dev/null +mkdir .tst 2>/dev/null +if test -d .tst; then + am__leading_dot=. +else + am__leading_dot=_ +fi +rmdir .tst 2>/dev/null + +@%:@ Check whether --enable-silent-rules was given. +if test ${enable_silent_rules+y} +then : + enableval=$enable_silent_rules; +fi + +case $enable_silent_rules in @%:@ ((( + yes) AM_DEFAULT_VERBOSITY=0;; + no) AM_DEFAULT_VERBOSITY=1;; + *) AM_DEFAULT_VERBOSITY=1;; +esac +am_make=${MAKE-make} +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 +printf %s "checking whether $am_make supports nested variables... " >&6; } +if test ${am_cv_make_support_nested_variables+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if printf "%s\n" 'TRUE=$(BAR$(V)) +BAR0=false +BAR1=true +V=1 +am__doit: + @$(TRUE) +.PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then + am_cv_make_support_nested_variables=yes +else + am_cv_make_support_nested_variables=no +fi +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 +printf "%s\n" "$am_cv_make_support_nested_variables" >&6; } +if test $am_cv_make_support_nested_variables = yes; then + AM_V='$(V)' + AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' +else + AM_V=$AM_DEFAULT_VERBOSITY + AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY +fi +AM_BACKSLASH='\' + +if test "`cd $srcdir && pwd`" != "`pwd`"; then + # Use -I$(srcdir) only when $(srcdir) != ., so that make's output + # is not polluted with repeated "-I." + am__isrc=' -I$(srcdir)' + # test to see if srcdir already configured + if test -f $srcdir/config.status; then + as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 + fi +fi + +# test whether we have cygpath +if test -z "$CYGPATH_W"; then + if (cygpath --version) >/dev/null 2>/dev/null; then + CYGPATH_W='cygpath -w' + else + CYGPATH_W=echo + fi +fi + + +# Define the identity of the package. + PACKAGE='portaudiocpp' + VERSION='12' + + +printf "%s\n" "@%:@define PACKAGE \"$PACKAGE\"" >>confdefs.h + + +printf "%s\n" "@%:@define VERSION \"$VERSION\"" >>confdefs.h + +# Some tools Automake needs. + +ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} + + +AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} + + +AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} + + +AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} + + +MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} + +# For better backward compatibility. To be removed once Automake 1.9.x +# dies out for good. For more background, see: +# +# +mkdir_p='$(MKDIR_P)' + +# We need awk for the "check" target (and possibly the TAP driver). The +# system "awk" is bad on some platforms. +# Always define AMTAR for backward compatibility. Yes, it's still used +# in the wild :-( We should find a proper way to deprecate it ... +AMTAR='$${TAR-tar}' + + +# We'll loop over all known methods to create a tar archive until one works. +_am_tools='gnutar pax cpio none' + +am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' + + + + + +# Variables for tags utilities; see am/tags.am +if test -z "$CTAGS"; then + CTAGS=ctags +fi + +if test -z "$ETAGS"; then + ETAGS=etags +fi + +if test -z "$CSCOPE"; then + CSCOPE=cscope +fi + + + +# POSIX will say in a future version that running "rm -f" with no argument +# is OK; and we want to be able to make that assumption in our Makefile +# recipes. So use an aggressive probe to check that the usage we want is +# actually supported "in the wild" to an acceptable degree. +# See automake bug#10828. +# To make any issue more visible, cause the running configure to be aborted +# by default if the 'rm' program in use doesn't match our expectations; the +# user can still override this though. +if rm -f && rm -fr && rm -rf; then : OK; else + cat >&2 <<'END' +Oops! + +Your 'rm' program seems unable to run without file operands specified +on the command line, even when the '-f' option is present. This is contrary +to the behaviour of most rm programs out there, and not conforming with +the upcoming POSIX standard: + +Please tell bug-automake@gnu.org about your system, including the value +of your $PATH and any error possibly output before this message. This +can help us improve future automake versions. + +END + if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then + echo 'Configuration will proceed anyway, since you have set the' >&2 + echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 + echo >&2 + else + cat >&2 <<'END' +Aborting the configuration process, to ensure you take notice of the issue. + +You can download and install GNU coreutils to get an 'rm' implementation +that behaves properly: . + +If you want to complete the configuration process using your problematic +'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM +to "yes", and re-run configure. + +END + as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5 + fi +fi + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to enable maintainer-specific portions of Makefiles" >&5 +printf %s "checking whether to enable maintainer-specific portions of Makefiles... " >&6; } + @%:@ Check whether --enable-maintainer-mode was given. +if test ${enable_maintainer_mode+y} +then : + enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval +else $as_nop + USE_MAINTAINER_MODE=no +fi + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $USE_MAINTAINER_MODE" >&5 +printf "%s\n" "$USE_MAINTAINER_MODE" >&6; } + if test $USE_MAINTAINER_MODE = yes; then + MAINTAINER_MODE_TRUE= + MAINTAINER_MODE_FALSE='#' +else + MAINTAINER_MODE_TRUE='#' + MAINTAINER_MODE_FALSE= +fi + + MAINT=$MAINTAINER_MODE_TRUE + + + +###### Top-level directory of pacpp +###### This makes it easy to shuffle the build directories +###### Also edit AC_CONFIG_SRCDIR above (wouldn't accept this variable)! +PACPP_ROOT="\$(top_srcdir)" +PORTAUDIO_ROOT="../.." + +# Various other variables and flags +DEFAULT_INCLUDES="-I$PACPP_ROOT/include -I$PACPP_ROOT/$PORTAUDIO_ROOT/include" +CFLAGS=${CFLAGS-"-g -O2 -Wall -ansi -pedantic"} +CXXFLAGS=${CXXFLAGS-"${CFLAGS}"} + +LT_VERSION_INFO="0:12:0" + +# Checks for programs + + + + + + + + + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. +set dummy ${ac_tool_prefix}gcc; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +printf "%s\n" "$CC" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="gcc" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +printf "%s\n" "$ac_ct_CC" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +else + CC="$ac_cv_prog_CC" +fi + +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. +set dummy ${ac_tool_prefix}cc; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +printf "%s\n" "$CC" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + + fi +fi +if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + ac_prog_rejected=no +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + if test "$as_dir$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC + shift + if test $@%:@ != 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + ac_cv_prog_CC="$as_dir$ac_word${1+' '}$@" + fi +fi +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +printf "%s\n" "$CC" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + for ac_prog in cl.exe + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +printf "%s\n" "$CC" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + + test -n "$CC" && break + done +fi +if test -z "$CC"; then + ac_ct_CC=$CC + for ac_prog in cl.exe +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="$ac_prog" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +printf "%s\n" "$ac_ct_CC" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + + test -n "$ac_ct_CC" && break +done + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +fi + +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}clang", so it can be a program name with args. +set dummy ${ac_tool_prefix}clang; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}clang" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +printf "%s\n" "$CC" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "clang", so it can be a program name with args. +set dummy clang; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_CC+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="clang" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +printf "%s\n" "$ac_ct_CC" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +else + CC="$ac_cv_prog_CC" +fi + +fi + + +test -z "$CC" && { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "no acceptable C compiler found in \$PATH +See \`config.log' for more details" "$LINENO" 5; } + +# Provide some information about the compiler. +printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion -version; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done + +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" +# Try to create an executable without -o first, disregard a.out. +# It will help us diagnose broken compilers, and finding out an intuition +# of exeext. +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 +printf %s "checking whether the C compiler works... " >&6; } +ac_link_default=`printf "%s\n" "$ac_link" | sed 's/ -o *conftest[^ ]*//'` + +# The possible output files: +ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" + +ac_rmfiles= +for ac_file in $ac_files +do + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + * ) ac_rmfiles="$ac_rmfiles $ac_file";; + esac +done +rm -f $ac_rmfiles + +if { { ac_try="$ac_link_default" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_link_default") 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +then : + # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. +# So ignore a value of `no', otherwise this would lead to `EXEEXT = no' +# in a Makefile. We should not override ac_cv_exeext if it was cached, +# so that the user can short-circuit this test for compilers unknown to +# Autoconf. +for ac_file in $ac_files '' +do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) + ;; + [ab].out ) + # We found the default executable, but exeext='' is most + # certainly right. + break;; + *.* ) + if test ${ac_cv_exeext+y} && test "$ac_cv_exeext" != no; + then :; else + ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + fi + # We set ac_cv_exeext here because the later test for it is not + # safe: cross compilers may not add the suffix if given an `-o' + # argument, so we may need to know it at that point already. + # Even if this section looks crufty: it has the advantage of + # actually working. + break;; + * ) + break;; + esac +done +test "$ac_cv_exeext" = no && ac_cv_exeext= + +else $as_nop + ac_file='' +fi +if test -z "$ac_file" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +printf "%s\n" "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "C compiler cannot create executables +See \`config.log' for more details" "$LINENO" 5; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 +printf %s "checking for C compiler default output file name... " >&6; } +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 +printf "%s\n" "$ac_file" >&6; } +ac_exeext=$ac_cv_exeext + +rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out +ac_clean_files=$ac_clean_files_save +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 +printf %s "checking for suffix of executables... " >&6; } +if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +then : + # If both `conftest.exe' and `conftest' are `present' (well, observable) +# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will +# work properly (i.e., refer to `conftest.exe'), while it won't with +# `rm'. +for ac_file in conftest.exe conftest conftest.*; do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + break;; + * ) break;; + esac +done +else $as_nop + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details" "$LINENO" 5; } +fi +rm -f conftest conftest$ac_cv_exeext +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 +printf "%s\n" "$ac_cv_exeext" >&6; } + +rm -f conftest.$ac_ext +EXEEXT=$ac_cv_exeext +ac_exeext=$EXEEXT +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +@%:@include +int +main (void) +{ +FILE *f = fopen ("conftest.out", "w"); + return ferror (f) || fclose (f) != 0; + + ; + return 0; +} +_ACEOF +ac_clean_files="$ac_clean_files conftest.out" +# Check that the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 +printf %s "checking whether we are cross compiling... " >&6; } +if test "$cross_compiling" != yes; then + { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if { ac_try='./conftest$ac_cv_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then + cross_compiling=no + else + if test "$cross_compiling" = maybe; then + cross_compiling=yes + else + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details" "$LINENO" 5; } + fi + fi +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 +printf "%s\n" "$cross_compiling" >&6; } + +rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out +ac_clean_files=$ac_clean_files_save +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 +printf %s "checking for suffix of object files... " >&6; } +if test ${ac_cv_objext+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.o conftest.obj +if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +then : + for ac_file in conftest.o conftest.obj conftest.*; do + test -f "$ac_file" || continue; + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; + *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` + break;; + esac +done +else $as_nop + printf "%s\n" "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot compute suffix of object files: cannot compile +See \`config.log' for more details" "$LINENO" 5; } +fi +rm -f conftest.$ac_cv_objext conftest.$ac_ext +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 +printf "%s\n" "$ac_cv_objext" >&6; } +OBJEXT=$ac_cv_objext +ac_objext=$OBJEXT +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports GNU C" >&5 +printf %s "checking whether the compiler supports GNU C... " >&6; } +if test ${ac_cv_c_compiler_gnu+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_compiler_gnu=yes +else $as_nop + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +ac_cv_c_compiler_gnu=$ac_compiler_gnu + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 +printf "%s\n" "$ac_cv_c_compiler_gnu" >&6; } +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +if test $ac_compiler_gnu = yes; then + GCC=yes +else + GCC= +fi +ac_test_CFLAGS=${CFLAGS+y} +ac_save_CFLAGS=$CFLAGS +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 +printf %s "checking whether $CC accepts -g... " >&6; } +if test ${ac_cv_prog_cc_g+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_save_c_werror_flag=$ac_c_werror_flag + ac_c_werror_flag=yes + ac_cv_prog_cc_g=no + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_prog_cc_g=yes +else $as_nop + CFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + +else $as_nop + ac_c_werror_flag=$ac_save_c_werror_flag + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_prog_cc_g=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + ac_c_werror_flag=$ac_save_c_werror_flag +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 +printf "%s\n" "$ac_cv_prog_cc_g" >&6; } +if test $ac_test_CFLAGS; then + CFLAGS=$ac_save_CFLAGS +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi +ac_prog_cc_stdc=no +if test x$ac_prog_cc_stdc = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C11 features" >&5 +printf %s "checking for $CC option to enable C11 features... " >&6; } +if test ${ac_cv_prog_cc_c11+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_cv_prog_cc_c11=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_c_conftest_c11_program +_ACEOF +for ac_arg in '' -std=gnu11 +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_prog_cc_c11=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam + test "x$ac_cv_prog_cc_c11" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC +fi + +if test "x$ac_cv_prog_cc_c11" = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +printf "%s\n" "unsupported" >&6; } +else $as_nop + if test "x$ac_cv_prog_cc_c11" = x +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +printf "%s\n" "none needed" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c11" >&5 +printf "%s\n" "$ac_cv_prog_cc_c11" >&6; } + CC="$CC $ac_cv_prog_cc_c11" +fi + ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c11 + ac_prog_cc_stdc=c11 +fi +fi +if test x$ac_prog_cc_stdc = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C99 features" >&5 +printf %s "checking for $CC option to enable C99 features... " >&6; } +if test ${ac_cv_prog_cc_c99+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_cv_prog_cc_c99=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_c_conftest_c99_program +_ACEOF +for ac_arg in '' -std=gnu99 -std=c99 -c99 -qlanglvl=extc1x -qlanglvl=extc99 -AC99 -D_STDC_C99= +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_prog_cc_c99=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam + test "x$ac_cv_prog_cc_c99" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC +fi + +if test "x$ac_cv_prog_cc_c99" = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +printf "%s\n" "unsupported" >&6; } +else $as_nop + if test "x$ac_cv_prog_cc_c99" = x +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +printf "%s\n" "none needed" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5 +printf "%s\n" "$ac_cv_prog_cc_c99" >&6; } + CC="$CC $ac_cv_prog_cc_c99" +fi + ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99 + ac_prog_cc_stdc=c99 +fi +fi +if test x$ac_prog_cc_stdc = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C89 features" >&5 +printf %s "checking for $CC option to enable C89 features... " >&6; } +if test ${ac_cv_prog_cc_c89+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_cv_prog_cc_c89=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_c_conftest_c89_program +_ACEOF +for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO" +then : + ac_cv_prog_cc_c89=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam + test "x$ac_cv_prog_cc_c89" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC +fi + +if test "x$ac_cv_prog_cc_c89" = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +printf "%s\n" "unsupported" >&6; } +else $as_nop + if test "x$ac_cv_prog_cc_c89" = x +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +printf "%s\n" "none needed" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 +printf "%s\n" "$ac_cv_prog_cc_c89" >&6; } + CC="$CC $ac_cv_prog_cc_c89" +fi + ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89 + ac_prog_cc_stdc=c89 +fi +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 +printf %s "checking whether $CC understands -c and -o together... " >&6; } +if test ${am_cv_prog_cc_c_o+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF + # Make sure it works both with $CC and with simple cc. + # Following AC_PROG_CC_C_O, we do the test twice because some + # compilers refuse to overwrite an existing .o file with -o, + # though they will create one. + am_cv_prog_cc_c_o=yes + for am_i in 1 2; do + if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 + ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } \ + && test -f conftest2.$ac_objext; then + : OK + else + am_cv_prog_cc_c_o=no + break + fi + done + rm -f core conftest* + unset am_i +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 +printf "%s\n" "$am_cv_prog_cc_c_o" >&6; } +if test "$am_cv_prog_cc_c_o" != yes; then + # Losing compiler, so override with the script. + # FIXME: It is wrong to rewrite CC. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__CC in this case, + # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" + CC="$am_aux_dir/compile $CC" +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +DEPDIR="${am__leading_dot}deps" + +ac_config_commands="$ac_config_commands depfiles" + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} supports the include directive" >&5 +printf %s "checking whether ${MAKE-make} supports the include directive... " >&6; } +cat > confinc.mk << 'END' +am__doit: + @echo this is the am__doit target >confinc.out +.PHONY: am__doit +END +am__include="#" +am__quote= +# BSD make does it like this. +echo '.include "confinc.mk" # ignored' > confmf.BSD +# Other make implementations (GNU, Solaris 10, AIX) do it like this. +echo 'include confinc.mk # ignored' > confmf.GNU +_am_result=no +for s in GNU BSD; do + { echo "$as_me:$LINENO: ${MAKE-make} -f confmf.$s && cat confinc.out" >&5 + (${MAKE-make} -f confmf.$s && cat confinc.out) >&5 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + case $?:`cat confinc.out 2>/dev/null` in @%:@( + '0:this is the am__doit target') : + case $s in @%:@( + BSD) : + am__include='.include' am__quote='"' ;; @%:@( + *) : + am__include='include' am__quote='' ;; +esac ;; @%:@( + *) : + ;; +esac + if test "$am__include" != "#"; then + _am_result="yes ($s style)" + break + fi +done +rm -f confinc.* confmf.* +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: ${_am_result}" >&5 +printf "%s\n" "${_am_result}" >&6; } + +@%:@ Check whether --enable-dependency-tracking was given. +if test ${enable_dependency_tracking+y} +then : + enableval=$enable_dependency_tracking; +fi + +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' + am__nodep='_no' +fi + if test "x$enable_dependency_tracking" != xno; then + AMDEP_TRUE= + AMDEP_FALSE='#' +else + AMDEP_TRUE='#' + AMDEP_FALSE= +fi + + + +depcc="$CC" am_compiler_list= + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +printf %s "checking dependency style of $depcc... " >&6; } +if test ${am_cv_CC_dependencies_compiler_type+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named 'D' -- because '-MD' means "put the output + # in D". + rm -rf conftest.dir + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CC_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + am__universal=false + case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with + # Solaris 10 /bin/sh. + echo '/* dummy */' > sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with '-c' and '-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle '-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs. + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # After this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested. + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok '-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CC_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CC_dependencies_compiler_type=none +fi + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 +printf "%s\n" "$am_cv_CC_dependencies_compiler_type" >&6; } +CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type + + if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then + am__fastdepCC_TRUE= + am__fastdepCC_FALSE='#' +else + am__fastdepCC_TRUE='#' + am__fastdepCC_FALSE= +fi + + + + + + + + +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +if test -z "$CXX"; then + if test -n "$CCC"; then + CXX=$CCC + else + if test -n "$ac_tool_prefix"; then + for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC clang++ + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_CXX+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$CXX"; then + ac_cv_prog_CXX="$CXX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CXX=$ac_cv_prog_CXX +if test -n "$CXX"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 +printf "%s\n" "$CXX" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + + test -n "$CXX" && break + done +fi +if test -z "$CXX"; then + ac_ct_CXX=$CXX + for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC clang++ +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_CXX+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_CXX"; then + ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CXX="$ac_prog" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CXX=$ac_cv_prog_ac_ct_CXX +if test -n "$ac_ct_CXX"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 +printf "%s\n" "$ac_ct_CXX" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + + test -n "$ac_ct_CXX" && break +done + + if test "x$ac_ct_CXX" = x; then + CXX="g++" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CXX=$ac_ct_CXX + fi +fi + + fi +fi +# Provide some information about the compiler. +printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +printf "%s\n" "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports GNU C++" >&5 +printf %s "checking whether the compiler supports GNU C++... " >&6; } +if test ${ac_cv_cxx_compiler_gnu+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO" +then : + ac_compiler_gnu=yes +else $as_nop + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +ac_cv_cxx_compiler_gnu=$ac_compiler_gnu + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 +printf "%s\n" "$ac_cv_cxx_compiler_gnu" >&6; } +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + +if test $ac_compiler_gnu = yes; then + GXX=yes +else + GXX= +fi +ac_test_CXXFLAGS=${CXXFLAGS+y} +ac_save_CXXFLAGS=$CXXFLAGS +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 +printf %s "checking whether $CXX accepts -g... " >&6; } +if test ${ac_cv_prog_cxx_g+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_save_cxx_werror_flag=$ac_cxx_werror_flag + ac_cxx_werror_flag=yes + ac_cv_prog_cxx_g=no + CXXFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO" +then : + ac_cv_prog_cxx_g=yes +else $as_nop + CXXFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO" +then : + +else $as_nop + ac_cxx_werror_flag=$ac_save_cxx_werror_flag + CXXFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO" +then : + ac_cv_prog_cxx_g=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + ac_cxx_werror_flag=$ac_save_cxx_werror_flag +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 +printf "%s\n" "$ac_cv_prog_cxx_g" >&6; } +if test $ac_test_CXXFLAGS; then + CXXFLAGS=$ac_save_CXXFLAGS +elif test $ac_cv_prog_cxx_g = yes; then + if test "$GXX" = yes; then + CXXFLAGS="-g -O2" + else + CXXFLAGS="-g" + fi +else + if test "$GXX" = yes; then + CXXFLAGS="-O2" + else + CXXFLAGS= + fi +fi +ac_prog_cxx_stdcxx=no +if test x$ac_prog_cxx_stdcxx = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CXX option to enable C++11 features" >&5 +printf %s "checking for $CXX option to enable C++11 features... " >&6; } +if test ${ac_cv_prog_cxx_11+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_cv_prog_cxx_11=no +ac_save_CXX=$CXX +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_cxx_conftest_cxx11_program +_ACEOF +for ac_arg in '' -std=gnu++11 -std=gnu++0x -std=c++11 -std=c++0x -qlanglvl=extended0x -AA +do + CXX="$ac_save_CXX $ac_arg" + if ac_fn_cxx_try_compile "$LINENO" +then : + ac_cv_prog_cxx_cxx11=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam + test "x$ac_cv_prog_cxx_cxx11" != "xno" && break +done +rm -f conftest.$ac_ext +CXX=$ac_save_CXX +fi + +if test "x$ac_cv_prog_cxx_cxx11" = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +printf "%s\n" "unsupported" >&6; } +else $as_nop + if test "x$ac_cv_prog_cxx_cxx11" = x +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +printf "%s\n" "none needed" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_cxx11" >&5 +printf "%s\n" "$ac_cv_prog_cxx_cxx11" >&6; } + CXX="$CXX $ac_cv_prog_cxx_cxx11" +fi + ac_cv_prog_cxx_stdcxx=$ac_cv_prog_cxx_cxx11 + ac_prog_cxx_stdcxx=cxx11 +fi +fi +if test x$ac_prog_cxx_stdcxx = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CXX option to enable C++98 features" >&5 +printf %s "checking for $CXX option to enable C++98 features... " >&6; } +if test ${ac_cv_prog_cxx_98+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_cv_prog_cxx_98=no +ac_save_CXX=$CXX +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_cxx_conftest_cxx98_program +_ACEOF +for ac_arg in '' -std=gnu++98 -std=c++98 -qlanglvl=extended -AA +do + CXX="$ac_save_CXX $ac_arg" + if ac_fn_cxx_try_compile "$LINENO" +then : + ac_cv_prog_cxx_cxx98=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam + test "x$ac_cv_prog_cxx_cxx98" != "xno" && break +done +rm -f conftest.$ac_ext +CXX=$ac_save_CXX +fi + +if test "x$ac_cv_prog_cxx_cxx98" = xno +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +printf "%s\n" "unsupported" >&6; } +else $as_nop + if test "x$ac_cv_prog_cxx_cxx98" = x +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +printf "%s\n" "none needed" >&6; } +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_cxx98" >&5 +printf "%s\n" "$ac_cv_prog_cxx_cxx98" >&6; } + CXX="$CXX $ac_cv_prog_cxx_cxx98" +fi + ac_cv_prog_cxx_stdcxx=$ac_cv_prog_cxx_cxx98 + ac_prog_cxx_stdcxx=cxx98 +fi +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +depcc="$CXX" am_compiler_list= + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +printf %s "checking dependency style of $depcc... " >&6; } +if test ${am_cv_CXX_dependencies_compiler_type+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named 'D' -- because '-MD' means "put the output + # in D". + rm -rf conftest.dir + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CXX_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + am__universal=false + case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with + # Solaris 10 /bin/sh. + echo '/* dummy */' > sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with '-c' and '-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle '-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs. + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # After this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested. + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok '-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CXX_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CXX_dependencies_compiler_type=none +fi + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 +printf "%s\n" "$am_cv_CXX_dependencies_compiler_type" >&6; } +CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type + + if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then + am__fastdepCXX_TRUE= + am__fastdepCXX_FALSE='#' +else + am__fastdepCXX_TRUE='#' + am__fastdepCXX_FALSE= +fi + + + + + # Make sure we can run config.sub. +$SHELL "${ac_aux_dir}config.sub" sun4 >/dev/null 2>&1 || + as_fn_error $? "cannot run $SHELL ${ac_aux_dir}config.sub" "$LINENO" 5 + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 +printf %s "checking build system type... " >&6; } +if test ${ac_cv_build+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_build_alias=$build_alias +test "x$ac_build_alias" = x && + ac_build_alias=`$SHELL "${ac_aux_dir}config.guess"` +test "x$ac_build_alias" = x && + as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 +ac_cv_build=`$SHELL "${ac_aux_dir}config.sub" $ac_build_alias` || + as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $ac_build_alias failed" "$LINENO" 5 + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 +printf "%s\n" "$ac_cv_build" >&6; } +case $ac_cv_build in +*-*-*) ;; +*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; +esac +build=$ac_cv_build +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_build +shift +build_cpu=$1 +build_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +build_os=$* +IFS=$ac_save_IFS +case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 +printf %s "checking host system type... " >&6; } +if test ${ac_cv_host+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test "x$host_alias" = x; then + ac_cv_host=$ac_cv_build +else + ac_cv_host=`$SHELL "${ac_aux_dir}config.sub" $host_alias` || + as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $host_alias failed" "$LINENO" 5 +fi + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 +printf "%s\n" "$ac_cv_host" >&6; } +case $ac_cv_host in +*-*-*) ;; +*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; +esac +host=$ac_cv_host +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_host +shift +host_cpu=$1 +host_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +host_os=$* +IFS=$ac_save_IFS +case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac + + +enable_win32_dll=yes + +case $host in +*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*) + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}as", so it can be a program name with args. +set dummy ${ac_tool_prefix}as; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_AS+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$AS"; then + ac_cv_prog_AS="$AS" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_AS="${ac_tool_prefix}as" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +AS=$ac_cv_prog_AS +if test -n "$AS"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $AS" >&5 +printf "%s\n" "$AS" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_AS"; then + ac_ct_AS=$AS + # Extract the first word of "as", so it can be a program name with args. +set dummy as; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_AS+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_AS"; then + ac_cv_prog_ac_ct_AS="$ac_ct_AS" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_AS="as" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_AS=$ac_cv_prog_ac_ct_AS +if test -n "$ac_ct_AS"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AS" >&5 +printf "%s\n" "$ac_ct_AS" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + if test "x$ac_ct_AS" = x; then + AS="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + AS=$ac_ct_AS + fi +else + AS="$ac_cv_prog_AS" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. +set dummy ${ac_tool_prefix}dlltool; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_DLLTOOL+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$DLLTOOL"; then + ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +DLLTOOL=$ac_cv_prog_DLLTOOL +if test -n "$DLLTOOL"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 +printf "%s\n" "$DLLTOOL" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_DLLTOOL"; then + ac_ct_DLLTOOL=$DLLTOOL + # Extract the first word of "dlltool", so it can be a program name with args. +set dummy dlltool; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_DLLTOOL+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_DLLTOOL"; then + ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_DLLTOOL="dlltool" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL +if test -n "$ac_ct_DLLTOOL"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 +printf "%s\n" "$ac_ct_DLLTOOL" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + if test "x$ac_ct_DLLTOOL" = x; then + DLLTOOL="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DLLTOOL=$ac_ct_DLLTOOL + fi +else + DLLTOOL="$ac_cv_prog_DLLTOOL" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. +set dummy ${ac_tool_prefix}objdump; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_OBJDUMP+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$OBJDUMP"; then + ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +OBJDUMP=$ac_cv_prog_OBJDUMP +if test -n "$OBJDUMP"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 +printf "%s\n" "$OBJDUMP" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OBJDUMP"; then + ac_ct_OBJDUMP=$OBJDUMP + # Extract the first word of "objdump", so it can be a program name with args. +set dummy objdump; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_OBJDUMP+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_OBJDUMP"; then + ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_OBJDUMP="objdump" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP +if test -n "$ac_ct_OBJDUMP"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 +printf "%s\n" "$ac_ct_OBJDUMP" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + if test "x$ac_ct_OBJDUMP" = x; then + OBJDUMP="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OBJDUMP=$ac_ct_OBJDUMP + fi +else + OBJDUMP="$ac_cv_prog_OBJDUMP" +fi + + ;; +esac + +test -z "$AS" && AS=as + + + + + +test -z "$DLLTOOL" && DLLTOOL=dlltool + + + + + +test -z "$OBJDUMP" && OBJDUMP=objdump + + + + + + + +case `pwd` in + *\ * | *\ *) + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 +printf "%s\n" "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;; +esac + + + +macro_version='2.4.6' +macro_revision='2.4.6' + + + + + + + + + + + + + + +ltmain=$ac_aux_dir/ltmain.sh + +# Backslashify metacharacters that are still active within +# double-quoted strings. +sed_quote_subst='s/\(["`$\\]\)/\\\1/g' + +# Same as above, but do not quote variable references. +double_quote_subst='s/\(["`\\]\)/\\\1/g' + +# Sed substitution to delay expansion of an escaped shell variable in a +# double_quote_subst'ed string. +delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' + +# Sed substitution to delay expansion of an escaped single quote. +delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' + +# Sed substitution to avoid accidental globbing in evaled expressions +no_glob_subst='s/\*/\\\*/g' + +ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5 +printf %s "checking how to print strings... " >&6; } +# Test print first, because it will be a builtin if present. +if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ + test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then + ECHO='print -r --' +elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then + ECHO='printf %s\n' +else + # Use this function as a fallback that always works. + func_fallback_echo () + { + eval 'cat <<_LTECHO_EOF +$1 +_LTECHO_EOF' + } + ECHO='func_fallback_echo' +fi + +# func_echo_all arg... +# Invoke $ECHO with all args, space-separated. +func_echo_all () +{ + $ECHO "" +} + +case $ECHO in + printf*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: printf" >&5 +printf "%s\n" "printf" >&6; } ;; + print*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: print -r" >&5 +printf "%s\n" "print -r" >&6; } ;; + *) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: cat" >&5 +printf "%s\n" "cat" >&6; } ;; +esac + + + + + + + + + + + + + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 +printf %s "checking for a sed that does not truncate output... " >&6; } +if test ${ac_cv_path_SED+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ + for ac_i in 1 2 3 4 5 6 7; do + ac_script="$ac_script$as_nl$ac_script" + done + echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed + { ac_script=; unset ac_script;} + if test -z "$SED"; then + ac_path_SED_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_prog in sed gsed + do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_SED="$as_dir$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_SED" || continue +# Check for GNU ac_path_SED and select it if it is found. + # Check for GNU $ac_path_SED +case `"$ac_path_SED" --version 2>&1` in +*GNU*) + ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; +*) + ac_count=0 + printf %s 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + printf "%s\n" '' >> "conftest.nl" + "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_SED_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_SED="$ac_path_SED" + ac_path_SED_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_SED_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_SED"; then + as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 + fi +else + ac_cv_path_SED=$SED +fi + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 +printf "%s\n" "$ac_cv_path_SED" >&6; } + SED="$ac_cv_path_SED" + rm -f conftest.sed + +test -z "$SED" && SED=sed +Xsed="$SED -e 1s/^X//" + + + + + + + + + + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 +printf %s "checking for grep that handles long lines and -e... " >&6; } +if test ${ac_cv_path_GREP+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -z "$GREP"; then + ac_path_GREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_prog in grep ggrep + do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_GREP="$as_dir$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_GREP" || continue +# Check for GNU ac_path_GREP and select it if it is found. + # Check for GNU $ac_path_GREP +case `"$ac_path_GREP" --version 2>&1` in +*GNU*) + ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; +*) + ac_count=0 + printf %s 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + printf "%s\n" 'GREP' >> "conftest.nl" + "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_GREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_GREP="$ac_path_GREP" + ac_path_GREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_GREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_GREP"; then + as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_GREP=$GREP +fi + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 +printf "%s\n" "$ac_cv_path_GREP" >&6; } + GREP="$ac_cv_path_GREP" + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 +printf %s "checking for egrep... " >&6; } +if test ${ac_cv_path_EGREP+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 + then ac_cv_path_EGREP="$GREP -E" + else + if test -z "$EGREP"; then + ac_path_EGREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_prog in egrep + do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_EGREP="$as_dir$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_EGREP" || continue +# Check for GNU ac_path_EGREP and select it if it is found. + # Check for GNU $ac_path_EGREP +case `"$ac_path_EGREP" --version 2>&1` in +*GNU*) + ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; +*) + ac_count=0 + printf %s 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + printf "%s\n" 'EGREP' >> "conftest.nl" + "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_EGREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_EGREP="$ac_path_EGREP" + ac_path_EGREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_EGREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_EGREP"; then + as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_EGREP=$EGREP +fi + + fi +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 +printf "%s\n" "$ac_cv_path_EGREP" >&6; } + EGREP="$ac_cv_path_EGREP" + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5 +printf %s "checking for fgrep... " >&6; } +if test ${ac_cv_path_FGREP+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 + then ac_cv_path_FGREP="$GREP -F" + else + if test -z "$FGREP"; then + ac_path_FGREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_prog in fgrep + do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_FGREP="$as_dir$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_FGREP" || continue +# Check for GNU ac_path_FGREP and select it if it is found. + # Check for GNU $ac_path_FGREP +case `"$ac_path_FGREP" --version 2>&1` in +*GNU*) + ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;; +*) + ac_count=0 + printf %s 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + printf "%s\n" 'FGREP' >> "conftest.nl" + "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_FGREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_FGREP="$ac_path_FGREP" + ac_path_FGREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_FGREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_FGREP"; then + as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_FGREP=$FGREP +fi + + fi +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5 +printf "%s\n" "$ac_cv_path_FGREP" >&6; } + FGREP="$ac_cv_path_FGREP" + + +test -z "$GREP" && GREP=grep + + + + + + + + + + + + + + + + + + + +@%:@ Check whether --with-gnu-ld was given. +if test ${with_gnu_ld+y} +then : + withval=$with_gnu_ld; test no = "$withval" || with_gnu_ld=yes +else $as_nop + with_gnu_ld=no +fi + +ac_prog=ld +if test yes = "$GCC"; then + # Check if gcc -print-prog-name=ld gives a path. + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 +printf %s "checking for ld used by $CC... " >&6; } + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return, which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [\\/]* | ?:[\\/]*) + re_direlt='/[^/][^/]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` + while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do + ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` + done + test -z "$LD" && LD=$ac_prog + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test yes = "$with_gnu_ld"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 +printf %s "checking for GNU ld... " >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 +printf %s "checking for non-GNU ld... " >&6; } +fi +if test ${lt_cv_path_LD+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -z "$LD"; then + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS=$lt_save_ifs + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD=$ac_dir/$ac_prog + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some variants of GNU ld only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 &5 +printf "%s\n" "$LD" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi +test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 +printf %s "checking if the linker ($LD) is GNU ld... " >&6; } +if test ${lt_cv_prog_gnu_ld+y} +then : + printf %s "(cached) " >&6 +else $as_nop + # I'd rather use --version here, but apparently some GNU lds only accept -v. +case `$LD -v 2>&1 &5 +printf "%s\n" "$lt_cv_prog_gnu_ld" >&6; } +with_gnu_ld=$lt_cv_prog_gnu_ld + + + + + + + + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5 +printf %s "checking for BSD- or MS-compatible name lister (nm)... " >&6; } +if test ${lt_cv_path_NM+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$NM"; then + # Let the user override the test. + lt_cv_path_NM=$NM +else + lt_nm_to_check=${ac_tool_prefix}nm + if test -n "$ac_tool_prefix" && test "$build" = "$host"; then + lt_nm_to_check="$lt_nm_to_check nm" + fi + for lt_tmp_nm in $lt_nm_to_check; do + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR + for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do + IFS=$lt_save_ifs + test -z "$ac_dir" && ac_dir=. + tmp_nm=$ac_dir/$lt_tmp_nm + if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext"; then + # Check to see if the nm accepts a BSD-compat flag. + # Adding the 'sed 1q' prevents false positives on HP-UX, which says: + # nm: unknown option "B" ignored + # Tru64's nm complains that /dev/null is an invalid object file + # MSYS converts /dev/null to NUL, MinGW nm treats NUL as empty + case $build_os in + mingw*) lt_bad_file=conftest.nm/nofile ;; + *) lt_bad_file=/dev/null ;; + esac + case `"$tmp_nm" -B $lt_bad_file 2>&1 | sed '1q'` in + *$lt_bad_file* | *'Invalid file or object type'*) + lt_cv_path_NM="$tmp_nm -B" + break 2 + ;; + *) + case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in + */dev/null*) + lt_cv_path_NM="$tmp_nm -p" + break 2 + ;; + *) + lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but + continue # so that we can try to find one that supports BSD flags + ;; + esac + ;; + esac + fi + done + IFS=$lt_save_ifs + done + : ${lt_cv_path_NM=no} +fi +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5 +printf "%s\n" "$lt_cv_path_NM" >&6; } +if test no != "$lt_cv_path_NM"; then + NM=$lt_cv_path_NM +else + # Didn't find any BSD compatible name lister, look for dumpbin. + if test -n "$DUMPBIN"; then : + # Let the user override the test. + else + if test -n "$ac_tool_prefix"; then + for ac_prog in dumpbin "link -dump" + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_DUMPBIN+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$DUMPBIN"; then + ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +DUMPBIN=$ac_cv_prog_DUMPBIN +if test -n "$DUMPBIN"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5 +printf "%s\n" "$DUMPBIN" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + + test -n "$DUMPBIN" && break + done +fi +if test -z "$DUMPBIN"; then + ac_ct_DUMPBIN=$DUMPBIN + for ac_prog in dumpbin "link -dump" +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_DUMPBIN+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_DUMPBIN"; then + ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_DUMPBIN="$ac_prog" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN +if test -n "$ac_ct_DUMPBIN"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5 +printf "%s\n" "$ac_ct_DUMPBIN" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + + test -n "$ac_ct_DUMPBIN" && break +done + + if test "x$ac_ct_DUMPBIN" = x; then + DUMPBIN=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DUMPBIN=$ac_ct_DUMPBIN + fi +fi + + case `$DUMPBIN -symbols -headers /dev/null 2>&1 | sed '1q'` in + *COFF*) + DUMPBIN="$DUMPBIN -symbols -headers" + ;; + *) + DUMPBIN=: + ;; + esac + fi + + if test : != "$DUMPBIN"; then + NM=$DUMPBIN + fi +fi +test -z "$NM" && NM=nm + + + + + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5 +printf %s "checking the name lister ($NM) interface... " >&6; } +if test ${lt_cv_nm_interface+y} +then : + printf %s "(cached) " >&6 +else $as_nop + lt_cv_nm_interface="BSD nm" + echo "int some_variable = 0;" > conftest.$ac_ext + (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5) + (eval "$ac_compile" 2>conftest.err) + cat conftest.err >&5 + (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5) + (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) + cat conftest.err >&5 + (eval echo "\"\$as_me:$LINENO: output\"" >&5) + cat conftest.out >&5 + if $GREP 'External.*some_variable' conftest.out > /dev/null; then + lt_cv_nm_interface="MS dumpbin" + fi + rm -f conftest* +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5 +printf "%s\n" "$lt_cv_nm_interface" >&6; } + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 +printf %s "checking whether ln -s works... " >&6; } +LN_S=$as_ln_s +if test "$LN_S" = "ln -s"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 +printf "%s\n" "no, using $LN_S" >&6; } +fi + +# find the maximum length of command line arguments +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5 +printf %s "checking the maximum length of command line arguments... " >&6; } +if test ${lt_cv_sys_max_cmd_len+y} +then : + printf %s "(cached) " >&6 +else $as_nop + i=0 + teststring=ABCD + + case $build_os in + msdosdjgpp*) + # On DJGPP, this test can blow up pretty badly due to problems in libc + # (any single argument exceeding 2000 bytes causes a buffer overrun + # during glob expansion). Even if it were fixed, the result of this + # check would be larger than it should be. + lt_cv_sys_max_cmd_len=12288; # 12K is about right + ;; + + gnu*) + # Under GNU Hurd, this test is not required because there is + # no limit to the length of command line arguments. + # Libtool will interpret -1 as no limit whatsoever + lt_cv_sys_max_cmd_len=-1; + ;; + + cygwin* | mingw* | cegcc*) + # On Win9x/ME, this test blows up -- it succeeds, but takes + # about 5 minutes as the teststring grows exponentially. + # Worse, since 9x/ME are not pre-emptively multitasking, + # you end up with a "frozen" computer, even though with patience + # the test eventually succeeds (with a max line length of 256k). + # Instead, let's just punt: use the minimum linelength reported by + # all of the supported platforms: 8192 (on NT/2K/XP). + lt_cv_sys_max_cmd_len=8192; + ;; + + mint*) + # On MiNT this can take a long time and run out of memory. + lt_cv_sys_max_cmd_len=8192; + ;; + + amigaos*) + # On AmigaOS with pdksh, this test takes hours, literally. + # So we just punt and use a minimum line length of 8192. + lt_cv_sys_max_cmd_len=8192; + ;; + + bitrig* | darwin* | dragonfly* | freebsd* | netbsd* | openbsd*) + # This has been around since 386BSD, at least. Likely further. + if test -x /sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` + elif test -x /usr/sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` + else + lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs + fi + # And add a safety zone + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + ;; + + interix*) + # We know the value 262144 and hardcode it with a safety zone (like BSD) + lt_cv_sys_max_cmd_len=196608 + ;; + + os2*) + # The test takes a long time on OS/2. + lt_cv_sys_max_cmd_len=8192 + ;; + + osf*) + # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure + # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not + # nice to cause kernel panics so lets avoid the loop below. + # First set a reasonable default. + lt_cv_sys_max_cmd_len=16384 + # + if test -x /sbin/sysconfig; then + case `/sbin/sysconfig -q proc exec_disable_arg_limit` in + *1*) lt_cv_sys_max_cmd_len=-1 ;; + esac + fi + ;; + sco3.2v5*) + lt_cv_sys_max_cmd_len=102400 + ;; + sysv5* | sco5v6* | sysv4.2uw2*) + kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` + if test -n "$kargmax"; then + lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[ ]//'` + else + lt_cv_sys_max_cmd_len=32768 + fi + ;; + *) + lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` + if test -n "$lt_cv_sys_max_cmd_len" && \ + test undefined != "$lt_cv_sys_max_cmd_len"; then + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + else + # Make teststring a little bigger before we do anything with it. + # a 1K string should be a reasonable start. + for i in 1 2 3 4 5 6 7 8; do + teststring=$teststring$teststring + done + SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} + # If test is not a shell built-in, we'll probably end up computing a + # maximum length that is only half of the actual maximum length, but + # we can't tell. + while { test X`env echo "$teststring$teststring" 2>/dev/null` \ + = "X$teststring$teststring"; } >/dev/null 2>&1 && + test 17 != "$i" # 1/2 MB should be enough + do + i=`expr $i + 1` + teststring=$teststring$teststring + done + # Only check the string length outside the loop. + lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` + teststring= + # Add a significant safety factor because C++ compilers can tack on + # massive amounts of additional arguments before passing them to the + # linker. It appears as though 1/2 is a usable value. + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` + fi + ;; + esac + +fi + +if test -n "$lt_cv_sys_max_cmd_len"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5 +printf "%s\n" "$lt_cv_sys_max_cmd_len" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none" >&5 +printf "%s\n" "none" >&6; } +fi +max_cmd_len=$lt_cv_sys_max_cmd_len + + + + + + +: ${CP="cp -f"} +: ${MV="mv -f"} +: ${RM="rm -f"} + +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + lt_unset=unset +else + lt_unset=false +fi + + + + + +# test EBCDIC or ASCII +case `echo X|tr X '\101'` in + A) # ASCII based system + # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr + lt_SP2NL='tr \040 \012' + lt_NL2SP='tr \015\012 \040\040' + ;; + *) # EBCDIC based system + lt_SP2NL='tr \100 \n' + lt_NL2SP='tr \r\n \100\100' + ;; +esac + + + + + + + + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5 +printf %s "checking how to convert $build file names to $host format... " >&6; } +if test ${lt_cv_to_host_file_cmd+y} +then : + printf %s "(cached) " >&6 +else $as_nop + case $host in + *-*-mingw* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 + ;; + *-*-cygwin* ) + lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 + ;; + * ) # otherwise, assume *nix + lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 + ;; + esac + ;; + *-*-cygwin* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin + ;; + *-*-cygwin* ) + lt_cv_to_host_file_cmd=func_convert_file_noop + ;; + * ) # otherwise, assume *nix + lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin + ;; + esac + ;; + * ) # unhandled hosts (and "normal" native builds) + lt_cv_to_host_file_cmd=func_convert_file_noop + ;; +esac + +fi + +to_host_file_cmd=$lt_cv_to_host_file_cmd +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5 +printf "%s\n" "$lt_cv_to_host_file_cmd" >&6; } + + + + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5 +printf %s "checking how to convert $build file names to toolchain format... " >&6; } +if test ${lt_cv_to_tool_file_cmd+y} +then : + printf %s "(cached) " >&6 +else $as_nop + #assume ordinary cross tools, or native build. +lt_cv_to_tool_file_cmd=func_convert_file_noop +case $host in + *-*-mingw* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 + ;; + esac + ;; +esac + +fi + +to_tool_file_cmd=$lt_cv_to_tool_file_cmd +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5 +printf "%s\n" "$lt_cv_to_tool_file_cmd" >&6; } + + + + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5 +printf %s "checking for $LD option to reload object files... " >&6; } +if test ${lt_cv_ld_reload_flag+y} +then : + printf %s "(cached) " >&6 +else $as_nop + lt_cv_ld_reload_flag='-r' +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5 +printf "%s\n" "$lt_cv_ld_reload_flag" >&6; } +reload_flag=$lt_cv_ld_reload_flag +case $reload_flag in +"" | " "*) ;; +*) reload_flag=" $reload_flag" ;; +esac +reload_cmds='$LD$reload_flag -o $output$reload_objs' +case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + if test yes != "$GCC"; then + reload_cmds=false + fi + ;; + darwin*) + if test yes = "$GCC"; then + reload_cmds='$LTCC $LTCFLAGS -nostdlib $wl-r -o $output$reload_objs' + else + reload_cmds='$LD$reload_flag -o $output$reload_objs' + fi + ;; +esac + + + + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. +set dummy ${ac_tool_prefix}objdump; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_OBJDUMP+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$OBJDUMP"; then + ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +OBJDUMP=$ac_cv_prog_OBJDUMP +if test -n "$OBJDUMP"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 +printf "%s\n" "$OBJDUMP" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OBJDUMP"; then + ac_ct_OBJDUMP=$OBJDUMP + # Extract the first word of "objdump", so it can be a program name with args. +set dummy objdump; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_OBJDUMP+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_OBJDUMP"; then + ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_OBJDUMP="objdump" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP +if test -n "$ac_ct_OBJDUMP"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 +printf "%s\n" "$ac_ct_OBJDUMP" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + if test "x$ac_ct_OBJDUMP" = x; then + OBJDUMP="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OBJDUMP=$ac_ct_OBJDUMP + fi +else + OBJDUMP="$ac_cv_prog_OBJDUMP" +fi + +test -z "$OBJDUMP" && OBJDUMP=objdump + + + + + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5 +printf %s "checking how to recognize dependent libraries... " >&6; } +if test ${lt_cv_deplibs_check_method+y} +then : + printf %s "(cached) " >&6 +else $as_nop + lt_cv_file_magic_cmd='$MAGIC_CMD' +lt_cv_file_magic_test_file= +lt_cv_deplibs_check_method='unknown' +# Need to set the preceding variable on all platforms that support +# interlibrary dependencies. +# 'none' -- dependencies not supported. +# 'unknown' -- same as none, but documents that we really don't know. +# 'pass_all' -- all dependencies passed with no checks. +# 'test_compile' -- check by making test program. +# 'file_magic [[regex]]' -- check by looking for files in library path +# that responds to the $file_magic_cmd with a given extended regex. +# If you have 'file' or equivalent on your system and you're not sure +# whether 'pass_all' will *always* work, you probably want this one. + +case $host_os in +aix[4-9]*) + lt_cv_deplibs_check_method=pass_all + ;; + +beos*) + lt_cv_deplibs_check_method=pass_all + ;; + +bsdi[45]*) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' + lt_cv_file_magic_cmd='/usr/bin/file -L' + lt_cv_file_magic_test_file=/shlib/libc.so + ;; + +cygwin*) + # func_win32_libid is a shell function defined in ltmain.sh + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + ;; + +mingw* | pw32*) + # Base MSYS/MinGW do not provide the 'file' command needed by + # func_win32_libid shell function, so use a weaker test based on 'objdump', + # unless we find 'file', for example because we are cross-compiling. + if ( file / ) >/dev/null 2>&1; then + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + else + # Keep this pattern in sync with the one in func_win32_libid. + lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' + lt_cv_file_magic_cmd='$OBJDUMP -f' + fi + ;; + +cegcc*) + # use the weaker test based on 'objdump'. See mingw*. + lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' + lt_cv_file_magic_cmd='$OBJDUMP -f' + ;; + +darwin* | rhapsody*) + lt_cv_deplibs_check_method=pass_all + ;; + +freebsd* | dragonfly*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + case $host_cpu in + i*86 ) + # Not sure whether the presence of OpenBSD here was a mistake. + # Let's accept both of them until this is cleared up. + lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` + ;; + esac + else + lt_cv_deplibs_check_method=pass_all + fi + ;; + +haiku*) + lt_cv_deplibs_check_method=pass_all + ;; + +hpux10.20* | hpux11*) + lt_cv_file_magic_cmd=/usr/bin/file + case $host_cpu in + ia64*) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64' + lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so + ;; + hppa*64*) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]' + lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl + ;; + *) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library' + lt_cv_file_magic_test_file=/usr/lib/libc.sl + ;; + esac + ;; + +interix[3-9]*) + # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$' + ;; + +irix5* | irix6* | nonstopux*) + case $LD in + *-32|*"-32 ") libmagic=32-bit;; + *-n32|*"-n32 ") libmagic=N32;; + *-64|*"-64 ") libmagic=64-bit;; + *) libmagic=never-match;; + esac + lt_cv_deplibs_check_method=pass_all + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + lt_cv_deplibs_check_method=pass_all + ;; + +netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$' + fi + ;; + +newos6*) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=/usr/lib/libnls.so + ;; + +*nto* | *qnx*) + lt_cv_deplibs_check_method=pass_all + ;; + +openbsd* | bitrig*) + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' + fi + ;; + +osf3* | osf4* | osf5*) + lt_cv_deplibs_check_method=pass_all + ;; + +rdos*) + lt_cv_deplibs_check_method=pass_all + ;; + +solaris*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv4 | sysv4.3*) + case $host_vendor in + motorola) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]' + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` + ;; + ncr) + lt_cv_deplibs_check_method=pass_all + ;; + sequent) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' + ;; + sni) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib" + lt_cv_file_magic_test_file=/lib/libc.so + ;; + siemens) + lt_cv_deplibs_check_method=pass_all + ;; + pc) + lt_cv_deplibs_check_method=pass_all + ;; + esac + ;; + +tpf*) + lt_cv_deplibs_check_method=pass_all + ;; +os2*) + lt_cv_deplibs_check_method=pass_all + ;; +esac + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5 +printf "%s\n" "$lt_cv_deplibs_check_method" >&6; } + +file_magic_glob= +want_nocaseglob=no +if test "$build" = "$host"; then + case $host_os in + mingw* | pw32*) + if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then + want_nocaseglob=yes + else + file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[\1]\/[\1]\/g;/g"` + fi + ;; + esac +fi + +file_magic_cmd=$lt_cv_file_magic_cmd +deplibs_check_method=$lt_cv_deplibs_check_method +test -z "$deplibs_check_method" && deplibs_check_method=unknown + + + + + + + + + + + + + + + + + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. +set dummy ${ac_tool_prefix}dlltool; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_DLLTOOL+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$DLLTOOL"; then + ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +DLLTOOL=$ac_cv_prog_DLLTOOL +if test -n "$DLLTOOL"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 +printf "%s\n" "$DLLTOOL" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_DLLTOOL"; then + ac_ct_DLLTOOL=$DLLTOOL + # Extract the first word of "dlltool", so it can be a program name with args. +set dummy dlltool; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_DLLTOOL+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_DLLTOOL"; then + ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_DLLTOOL="dlltool" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL +if test -n "$ac_ct_DLLTOOL"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 +printf "%s\n" "$ac_ct_DLLTOOL" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + if test "x$ac_ct_DLLTOOL" = x; then + DLLTOOL="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DLLTOOL=$ac_ct_DLLTOOL + fi +else + DLLTOOL="$ac_cv_prog_DLLTOOL" +fi + +test -z "$DLLTOOL" && DLLTOOL=dlltool + + + + + + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5 +printf %s "checking how to associate runtime and link libraries... " >&6; } +if test ${lt_cv_sharedlib_from_linklib_cmd+y} +then : + printf %s "(cached) " >&6 +else $as_nop + lt_cv_sharedlib_from_linklib_cmd='unknown' + +case $host_os in +cygwin* | mingw* | pw32* | cegcc*) + # two different shell functions defined in ltmain.sh; + # decide which one to use based on capabilities of $DLLTOOL + case `$DLLTOOL --help 2>&1` in + *--identify-strict*) + lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib + ;; + *) + lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback + ;; + esac + ;; +*) + # fallback: assume linklib IS sharedlib + lt_cv_sharedlib_from_linklib_cmd=$ECHO + ;; +esac + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5 +printf "%s\n" "$lt_cv_sharedlib_from_linklib_cmd" >&6; } +sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd +test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO + + + + + + + + +if test -n "$ac_tool_prefix"; then + for ac_prog in ar + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_AR+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$AR"; then + ac_cv_prog_AR="$AR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_AR="$ac_tool_prefix$ac_prog" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +AR=$ac_cv_prog_AR +if test -n "$AR"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 +printf "%s\n" "$AR" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + + test -n "$AR" && break + done +fi +if test -z "$AR"; then + ac_ct_AR=$AR + for ac_prog in ar +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_AR+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_AR"; then + ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_AR="$ac_prog" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_AR=$ac_cv_prog_ac_ct_AR +if test -n "$ac_ct_AR"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 +printf "%s\n" "$ac_ct_AR" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + + test -n "$ac_ct_AR" && break +done + + if test "x$ac_ct_AR" = x; then + AR="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + AR=$ac_ct_AR + fi +fi + +: ${AR=ar} +: ${AR_FLAGS=cru} + + + + + + + + + + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5 +printf %s "checking for archiver @FILE support... " >&6; } +if test ${lt_cv_ar_at_file+y} +then : + printf %s "(cached) " >&6 +else $as_nop + lt_cv_ar_at_file=no + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO" +then : + echo conftest.$ac_objext > conftest.lst + lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5' + { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 + (eval $lt_ar_try) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if test 0 -eq "$ac_status"; then + # Ensure the archiver fails upon bogus file names. + rm -f conftest.$ac_objext libconftest.a + { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 + (eval $lt_ar_try) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if test 0 -ne "$ac_status"; then + lt_cv_ar_at_file=@ + fi + fi + rm -f conftest.* libconftest.a + +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5 +printf "%s\n" "$lt_cv_ar_at_file" >&6; } + +if test no = "$lt_cv_ar_at_file"; then + archiver_list_spec= +else + archiver_list_spec=$lt_cv_ar_at_file +fi + + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. +set dummy ${ac_tool_prefix}strip; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_STRIP+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$STRIP"; then + ac_cv_prog_STRIP="$STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_STRIP="${ac_tool_prefix}strip" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +STRIP=$ac_cv_prog_STRIP +if test -n "$STRIP"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 +printf "%s\n" "$STRIP" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_STRIP"; then + ac_ct_STRIP=$STRIP + # Extract the first word of "strip", so it can be a program name with args. +set dummy strip; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_STRIP+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_STRIP"; then + ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_STRIP="strip" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP +if test -n "$ac_ct_STRIP"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 +printf "%s\n" "$ac_ct_STRIP" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + if test "x$ac_ct_STRIP" = x; then + STRIP=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + STRIP=$ac_ct_STRIP + fi +else + STRIP="$ac_cv_prog_STRIP" +fi + +test -z "$STRIP" && STRIP=: + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. +set dummy ${ac_tool_prefix}ranlib; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_RANLIB+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$RANLIB"; then + ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +RANLIB=$ac_cv_prog_RANLIB +if test -n "$RANLIB"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 +printf "%s\n" "$RANLIB" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_RANLIB"; then + ac_ct_RANLIB=$RANLIB + # Extract the first word of "ranlib", so it can be a program name with args. +set dummy ranlib; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_RANLIB+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_RANLIB"; then + ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_RANLIB="ranlib" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB +if test -n "$ac_ct_RANLIB"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 +printf "%s\n" "$ac_ct_RANLIB" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + if test "x$ac_ct_RANLIB" = x; then + RANLIB=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + RANLIB=$ac_ct_RANLIB + fi +else + RANLIB="$ac_cv_prog_RANLIB" +fi + +test -z "$RANLIB" && RANLIB=: + + + + + + +# Determine commands to create old-style static archives. +old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' +old_postinstall_cmds='chmod 644 $oldlib' +old_postuninstall_cmds= + +if test -n "$RANLIB"; then + case $host_os in + bitrig* | openbsd*) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" + ;; + *) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" + ;; + esac + old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" +fi + +case $host_os in + darwin*) + lock_old_archive_extraction=yes ;; + *) + lock_old_archive_extraction=no ;; +esac + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC + + +# Check for command to grab the raw symbol name followed by C symbol from nm. +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5 +printf %s "checking command to parse $NM output from $compiler object... " >&6; } +if test ${lt_cv_sys_global_symbol_pipe+y} +then : + printf %s "(cached) " >&6 +else $as_nop + +# These are sane defaults that work on at least a few old systems. +# [They come from Ultrix. What could be older than Ultrix?!! ;)] + +# Character class describing NM global symbol codes. +symcode='[BCDEGRST]' + +# Regexp to match symbols that can be accessed directly from C. +sympat='\([_A-Za-z][_A-Za-z0-9]*\)' + +# Define system-specific variables. +case $host_os in +aix*) + symcode='[BCDT]' + ;; +cygwin* | mingw* | pw32* | cegcc*) + symcode='[ABCDGISTW]' + ;; +hpux*) + if test ia64 = "$host_cpu"; then + symcode='[ABCDEGRST]' + fi + ;; +irix* | nonstopux*) + symcode='[BCDEGRST]' + ;; +osf*) + symcode='[BCDEGQRST]' + ;; +solaris*) + symcode='[BDRT]' + ;; +sco3.2v5*) + symcode='[DT]' + ;; +sysv4.2uw2*) + symcode='[DT]' + ;; +sysv5* | sco5v6* | unixware* | OpenUNIX*) + symcode='[ABDT]' + ;; +sysv4) + symcode='[DFNSTU]' + ;; +esac + +# If we're using GNU nm, then use its standard symbol codes. +case `$NM -V 2>&1` in +*GNU* | *'with BFD'*) + symcode='[ABCDGIRSTW]' ;; +esac + +if test "$lt_cv_nm_interface" = "MS dumpbin"; then + # Gets list of data symbols to import. + lt_cv_sys_global_symbol_to_import="sed -n -e 's/^I .* \(.*\)$/\1/p'" + # Adjust the below global symbol transforms to fixup imported variables. + lt_cdecl_hook=" -e 's/^I .* \(.*\)$/extern __declspec(dllimport) char \1;/p'" + lt_c_name_hook=" -e 's/^I .* \(.*\)$/ {\"\1\", (void *) 0},/p'" + lt_c_name_lib_hook="\ + -e 's/^I .* \(lib.*\)$/ {\"\1\", (void *) 0},/p'\ + -e 's/^I .* \(.*\)$/ {\"lib\1\", (void *) 0},/p'" +else + # Disable hooks by default. + lt_cv_sys_global_symbol_to_import= + lt_cdecl_hook= + lt_c_name_hook= + lt_c_name_lib_hook= +fi + +# Transform an extracted symbol line into a proper C declaration. +# Some systems (esp. on ia64) link data and code symbols differently, +# so use this general approach. +lt_cv_sys_global_symbol_to_cdecl="sed -n"\ +$lt_cdecl_hook\ +" -e 's/^T .* \(.*\)$/extern int \1();/p'"\ +" -e 's/^$symcode$symcode* .* \(.*\)$/extern char \1;/p'" + +# Transform an extracted symbol line into symbol name and symbol address +lt_cv_sys_global_symbol_to_c_name_address="sed -n"\ +$lt_c_name_hook\ +" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ +" -e 's/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/p'" + +# Transform an extracted symbol line into symbol name with lib prefix and +# symbol address. +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n"\ +$lt_c_name_lib_hook\ +" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ +" -e 's/^$symcode$symcode* .* \(lib.*\)$/ {\"\1\", (void *) \&\1},/p'"\ +" -e 's/^$symcode$symcode* .* \(.*\)$/ {\"lib\1\", (void *) \&\1},/p'" + +# Handle CRLF in mingw tool chain +opt_cr= +case $build_os in +mingw*) + opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp + ;; +esac + +# Try without a prefix underscore, then with it. +for ac_symprfx in "" "_"; do + + # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. + symxfrm="\\1 $ac_symprfx\\2 \\2" + + # Write the raw and C identifiers. + if test "$lt_cv_nm_interface" = "MS dumpbin"; then + # Fake it for dumpbin and say T for any non-static function, + # D for any global variable and I for any imported variable. + # Also find C++ and __fastcall symbols from MSVC++, + # which start with @ or ?. + lt_cv_sys_global_symbol_pipe="$AWK '"\ +" {last_section=section; section=\$ 3};"\ +" /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ +" /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ +" /^ *Symbol name *: /{split(\$ 0,sn,\":\"); si=substr(sn[2],2)};"\ +" /^ *Type *: code/{print \"T\",si,substr(si,length(prfx))};"\ +" /^ *Type *: data/{print \"I\",si,substr(si,length(prfx))};"\ +" \$ 0!~/External *\|/{next};"\ +" / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ +" {if(hide[section]) next};"\ +" {f=\"D\"}; \$ 0~/\(\).*\|/{f=\"T\"};"\ +" {split(\$ 0,a,/\||\r/); split(a[2],s)};"\ +" s[1]~/^[@?]/{print f,s[1],s[1]; next};"\ +" s[1]~prfx {split(s[1],t,\"@\"); print f,t[1],substr(t[1],length(prfx))}"\ +" ' prfx=^$ac_symprfx" + else + lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" + fi + lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" + + # Check to see that the pipe works correctly. + pipe_works=no + + rm -f conftest* + cat > conftest.$ac_ext <<_LT_EOF +#ifdef __cplusplus +extern "C" { +#endif +char nm_test_var; +void nm_test_func(void); +void nm_test_func(void){} +#ifdef __cplusplus +} +#endif +int main(){nm_test_var='a';nm_test_func();return(0);} +_LT_EOF + + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + # Now try to grab the symbols. + nlist=conftest.nm + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist\""; } >&5 + (eval $NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s "$nlist"; then + # Try sorting and uniquifying the output. + if sort "$nlist" | uniq > "$nlist"T; then + mv -f "$nlist"T "$nlist" + else + rm -f "$nlist"T + fi + + # Make sure that we snagged all the symbols we need. + if $GREP ' nm_test_var$' "$nlist" >/dev/null; then + if $GREP ' nm_test_func$' "$nlist" >/dev/null; then + cat <<_LT_EOF > conftest.$ac_ext +/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ +#if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE +/* DATA imports from DLLs on WIN32 can't be const, because runtime + relocations are performed -- see ld's documentation on pseudo-relocs. */ +# define LT@&t@_DLSYM_CONST +#elif defined __osf__ +/* This system does not cope well with relocations in const data. */ +# define LT@&t@_DLSYM_CONST +#else +# define LT@&t@_DLSYM_CONST const +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +_LT_EOF + # Now generate the symbol file. + eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' + + cat <<_LT_EOF >> conftest.$ac_ext + +/* The mapping between symbol names and symbols. */ +LT@&t@_DLSYM_CONST struct { + const char *name; + void *address; +} +lt__PROGRAM__LTX_preloaded_symbols[] = +{ + { "@PROGRAM@", (void *) 0 }, +_LT_EOF + $SED "s/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext + cat <<\_LT_EOF >> conftest.$ac_ext + {0, (void *) 0} +}; + +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt__PROGRAM__LTX_preloaded_symbols; +} +#endif + +#ifdef __cplusplus +} +#endif +_LT_EOF + # Now try linking the two files. + mv conftest.$ac_objext conftstm.$ac_objext + lt_globsym_save_LIBS=$LIBS + lt_globsym_save_CFLAGS=$CFLAGS + LIBS=conftstm.$ac_objext + CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 + (eval $ac_link) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s conftest$ac_exeext; then + pipe_works=yes + fi + LIBS=$lt_globsym_save_LIBS + CFLAGS=$lt_globsym_save_CFLAGS + else + echo "cannot find nm_test_func in $nlist" >&5 + fi + else + echo "cannot find nm_test_var in $nlist" >&5 + fi + else + echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5 + fi + else + echo "$progname: failed program was:" >&5 + cat conftest.$ac_ext >&5 + fi + rm -rf conftest* conftst* + + # Do not use the global_symbol_pipe unless it works. + if test yes = "$pipe_works"; then + break + else + lt_cv_sys_global_symbol_pipe= + fi +done + +fi + +if test -z "$lt_cv_sys_global_symbol_pipe"; then + lt_cv_sys_global_symbol_to_cdecl= +fi +if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: failed" >&5 +printf "%s\n" "failed" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: ok" >&5 +printf "%s\n" "ok" >&6; } +fi + +# Response file support. +if test "$lt_cv_nm_interface" = "MS dumpbin"; then + nm_file_list_spec='@' +elif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then + nm_file_list_spec='@' +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5 +printf %s "checking for sysroot... " >&6; } + +@%:@ Check whether --with-sysroot was given. +if test ${with_sysroot+y} +then : + withval=$with_sysroot; +else $as_nop + with_sysroot=no +fi + + +lt_sysroot= +case $with_sysroot in #( + yes) + if test yes = "$GCC"; then + lt_sysroot=`$CC --print-sysroot 2>/dev/null` + fi + ;; #( + /*) + lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` + ;; #( + no|'') + ;; #( + *) + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $with_sysroot" >&5 +printf "%s\n" "$with_sysroot" >&6; } + as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5 + ;; +esac + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5 +printf "%s\n" "${lt_sysroot:-no}" >&6; } + + + + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a working dd" >&5 +printf %s "checking for a working dd... " >&6; } +if test ${ac_cv_path_lt_DD+y} +then : + printf %s "(cached) " >&6 +else $as_nop + printf 0123456789abcdef0123456789abcdef >conftest.i +cat conftest.i conftest.i >conftest2.i +: ${lt_DD:=$DD} +if test -z "$lt_DD"; then + ac_path_lt_DD_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_prog in dd + do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_lt_DD="$as_dir$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_lt_DD" || continue +if "$ac_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then + cmp -s conftest.i conftest.out \ + && ac_cv_path_lt_DD="$ac_path_lt_DD" ac_path_lt_DD_found=: +fi + $ac_path_lt_DD_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_lt_DD"; then + : + fi +else + ac_cv_path_lt_DD=$lt_DD +fi + +rm -f conftest.i conftest2.i conftest.out +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_lt_DD" >&5 +printf "%s\n" "$ac_cv_path_lt_DD" >&6; } + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to truncate binary pipes" >&5 +printf %s "checking how to truncate binary pipes... " >&6; } +if test ${lt_cv_truncate_bin+y} +then : + printf %s "(cached) " >&6 +else $as_nop + printf 0123456789abcdef0123456789abcdef >conftest.i +cat conftest.i conftest.i >conftest2.i +lt_cv_truncate_bin= +if "$ac_cv_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then + cmp -s conftest.i conftest.out \ + && lt_cv_truncate_bin="$ac_cv_path_lt_DD bs=4096 count=1" +fi +rm -f conftest.i conftest2.i conftest.out +test -z "$lt_cv_truncate_bin" && lt_cv_truncate_bin="$SED -e 4q" +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_truncate_bin" >&5 +printf "%s\n" "$lt_cv_truncate_bin" >&6; } + + + + + + + +# Calculate cc_basename. Skip known compiler wrappers and cross-prefix. +func_cc_basename () +{ + for cc_temp in @S|@*""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac + done + func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` +} + +@%:@ Check whether --enable-libtool-lock was given. +if test ${enable_libtool_lock+y} +then : + enableval=$enable_libtool_lock; +fi + +test no = "$enable_libtool_lock" || enable_libtool_lock=yes + +# Some flags need to be propagated to the compiler or linker for good +# libtool support. +case $host in +ia64-*-hpux*) + # Find out what ABI is being produced by ac_compile, and set mode + # options accordingly. + echo 'int i;' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + case `/usr/bin/file conftest.$ac_objext` in + *ELF-32*) + HPUX_IA64_MODE=32 + ;; + *ELF-64*) + HPUX_IA64_MODE=64 + ;; + esac + fi + rm -rf conftest* + ;; +*-*-irix6*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. + echo '#line '$LINENO' "configure"' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + if test yes = "$lt_cv_prog_gnu_ld"; then + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -melf32bsmip" + ;; + *N32*) + LD="${LD-ld} -melf32bmipn32" + ;; + *64-bit*) + LD="${LD-ld} -melf64bmip" + ;; + esac + else + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -32" + ;; + *N32*) + LD="${LD-ld} -n32" + ;; + *64-bit*) + LD="${LD-ld} -64" + ;; + esac + fi + fi + rm -rf conftest* + ;; + +mips64*-*linux*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. + echo '#line '$LINENO' "configure"' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + emul=elf + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + emul="${emul}32" + ;; + *64-bit*) + emul="${emul}64" + ;; + esac + case `/usr/bin/file conftest.$ac_objext` in + *MSB*) + emul="${emul}btsmip" + ;; + *LSB*) + emul="${emul}ltsmip" + ;; + esac + case `/usr/bin/file conftest.$ac_objext` in + *N32*) + emul="${emul}n32" + ;; + esac + LD="${LD-ld} -m $emul" + fi + rm -rf conftest* + ;; + +x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \ +s390*-*linux*|s390*-*tpf*|sparc*-*linux*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. Note that the listed cases only cover the + # situations where additional linker options are needed (such as when + # doing 32-bit compilation for a host where ld defaults to 64-bit, or + # vice versa); the common cases where no linker options are needed do + # not appear in the list. + echo 'int i;' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + case `/usr/bin/file conftest.o` in + *32-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_i386_fbsd" + ;; + x86_64-*linux*) + case `/usr/bin/file conftest.o` in + *x86-64*) + LD="${LD-ld} -m elf32_x86_64" + ;; + *) + LD="${LD-ld} -m elf_i386" + ;; + esac + ;; + powerpc64le-*linux*) + LD="${LD-ld} -m elf32lppclinux" + ;; + powerpc64-*linux*) + LD="${LD-ld} -m elf32ppclinux" + ;; + s390x-*linux*) + LD="${LD-ld} -m elf_s390" + ;; + sparc64-*linux*) + LD="${LD-ld} -m elf32_sparc" + ;; + esac + ;; + *64-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_x86_64_fbsd" + ;; + x86_64-*linux*) + LD="${LD-ld} -m elf_x86_64" + ;; + powerpcle-*linux*) + LD="${LD-ld} -m elf64lppc" + ;; + powerpc-*linux*) + LD="${LD-ld} -m elf64ppc" + ;; + s390*-*linux*|s390*-*tpf*) + LD="${LD-ld} -m elf64_s390" + ;; + sparc*-*linux*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; + +*-*-sco3.2v5*) + # On SCO OpenServer 5, we need -belf to get full-featured binaries. + SAVE_CFLAGS=$CFLAGS + CFLAGS="$CFLAGS -belf" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5 +printf %s "checking whether the C compiler needs -belf... " >&6; } +if test ${lt_cv_cc_needs_belf+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + lt_cv_cc_needs_belf=yes +else $as_nop + lt_cv_cc_needs_belf=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5 +printf "%s\n" "$lt_cv_cc_needs_belf" >&6; } + if test yes != "$lt_cv_cc_needs_belf"; then + # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf + CFLAGS=$SAVE_CFLAGS + fi + ;; +*-*solaris*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. + echo 'int i;' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + case `/usr/bin/file conftest.o` in + *64-bit*) + case $lt_cv_prog_gnu_ld in + yes*) + case $host in + i?86-*-solaris*|x86_64-*-solaris*) + LD="${LD-ld} -m elf_x86_64" + ;; + sparc*-*-solaris*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + # GNU ld 2.21 introduced _sol2 emulations. Use them if available. + if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then + LD=${LD-ld}_sol2 + fi + ;; + *) + if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then + LD="${LD-ld} -64" + fi + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; +esac + +need_locks=$enable_libtool_lock + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args. +set dummy ${ac_tool_prefix}mt; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_MANIFEST_TOOL+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$MANIFEST_TOOL"; then + ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL +if test -n "$MANIFEST_TOOL"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5 +printf "%s\n" "$MANIFEST_TOOL" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_MANIFEST_TOOL"; then + ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL + # Extract the first word of "mt", so it can be a program name with args. +set dummy mt; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_MANIFEST_TOOL+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_MANIFEST_TOOL"; then + ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_MANIFEST_TOOL="mt" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL +if test -n "$ac_ct_MANIFEST_TOOL"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5 +printf "%s\n" "$ac_ct_MANIFEST_TOOL" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + if test "x$ac_ct_MANIFEST_TOOL" = x; then + MANIFEST_TOOL=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL + fi +else + MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL" +fi + +test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5 +printf %s "checking if $MANIFEST_TOOL is a manifest tool... " >&6; } +if test ${lt_cv_path_mainfest_tool+y} +then : + printf %s "(cached) " >&6 +else $as_nop + lt_cv_path_mainfest_tool=no + echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5 + $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out + cat conftest.err >&5 + if $GREP 'Manifest Tool' conftest.out > /dev/null; then + lt_cv_path_mainfest_tool=yes + fi + rm -f conftest* +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5 +printf "%s\n" "$lt_cv_path_mainfest_tool" >&6; } +if test yes != "$lt_cv_path_mainfest_tool"; then + MANIFEST_TOOL=: +fi + + + + + + + case $host_os in + rhapsody* | darwin*) + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args. +set dummy ${ac_tool_prefix}dsymutil; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_DSYMUTIL+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$DSYMUTIL"; then + ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +DSYMUTIL=$ac_cv_prog_DSYMUTIL +if test -n "$DSYMUTIL"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5 +printf "%s\n" "$DSYMUTIL" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_DSYMUTIL"; then + ac_ct_DSYMUTIL=$DSYMUTIL + # Extract the first word of "dsymutil", so it can be a program name with args. +set dummy dsymutil; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_DSYMUTIL+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_DSYMUTIL"; then + ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_DSYMUTIL="dsymutil" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL +if test -n "$ac_ct_DSYMUTIL"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5 +printf "%s\n" "$ac_ct_DSYMUTIL" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + if test "x$ac_ct_DSYMUTIL" = x; then + DSYMUTIL=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DSYMUTIL=$ac_ct_DSYMUTIL + fi +else + DSYMUTIL="$ac_cv_prog_DSYMUTIL" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args. +set dummy ${ac_tool_prefix}nmedit; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_NMEDIT+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$NMEDIT"; then + ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +NMEDIT=$ac_cv_prog_NMEDIT +if test -n "$NMEDIT"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5 +printf "%s\n" "$NMEDIT" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_NMEDIT"; then + ac_ct_NMEDIT=$NMEDIT + # Extract the first word of "nmedit", so it can be a program name with args. +set dummy nmedit; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_NMEDIT+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_NMEDIT"; then + ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_NMEDIT="nmedit" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT +if test -n "$ac_ct_NMEDIT"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5 +printf "%s\n" "$ac_ct_NMEDIT" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + if test "x$ac_ct_NMEDIT" = x; then + NMEDIT=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + NMEDIT=$ac_ct_NMEDIT + fi +else + NMEDIT="$ac_cv_prog_NMEDIT" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args. +set dummy ${ac_tool_prefix}lipo; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_LIPO+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$LIPO"; then + ac_cv_prog_LIPO="$LIPO" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_LIPO="${ac_tool_prefix}lipo" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +LIPO=$ac_cv_prog_LIPO +if test -n "$LIPO"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5 +printf "%s\n" "$LIPO" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_LIPO"; then + ac_ct_LIPO=$LIPO + # Extract the first word of "lipo", so it can be a program name with args. +set dummy lipo; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_LIPO+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_LIPO"; then + ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_LIPO="lipo" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO +if test -n "$ac_ct_LIPO"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5 +printf "%s\n" "$ac_ct_LIPO" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + if test "x$ac_ct_LIPO" = x; then + LIPO=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + LIPO=$ac_ct_LIPO + fi +else + LIPO="$ac_cv_prog_LIPO" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args. +set dummy ${ac_tool_prefix}otool; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_OTOOL+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$OTOOL"; then + ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_OTOOL="${ac_tool_prefix}otool" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +OTOOL=$ac_cv_prog_OTOOL +if test -n "$OTOOL"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5 +printf "%s\n" "$OTOOL" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OTOOL"; then + ac_ct_OTOOL=$OTOOL + # Extract the first word of "otool", so it can be a program name with args. +set dummy otool; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_OTOOL+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_OTOOL"; then + ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_OTOOL="otool" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL +if test -n "$ac_ct_OTOOL"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5 +printf "%s\n" "$ac_ct_OTOOL" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + if test "x$ac_ct_OTOOL" = x; then + OTOOL=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OTOOL=$ac_ct_OTOOL + fi +else + OTOOL="$ac_cv_prog_OTOOL" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args. +set dummy ${ac_tool_prefix}otool64; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_OTOOL64+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$OTOOL64"; then + ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +OTOOL64=$ac_cv_prog_OTOOL64 +if test -n "$OTOOL64"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5 +printf "%s\n" "$OTOOL64" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OTOOL64"; then + ac_ct_OTOOL64=$OTOOL64 + # Extract the first word of "otool64", so it can be a program name with args. +set dummy otool64; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_OTOOL64+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -n "$ac_ct_OTOOL64"; then + ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_OTOOL64="otool64" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64 +if test -n "$ac_ct_OTOOL64"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5 +printf "%s\n" "$ac_ct_OTOOL64" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + if test "x$ac_ct_OTOOL64" = x; then + OTOOL64=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OTOOL64=$ac_ct_OTOOL64 + fi +else + OTOOL64="$ac_cv_prog_OTOOL64" +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5 +printf %s "checking for -single_module linker flag... " >&6; } +if test ${lt_cv_apple_cc_single_mod+y} +then : + printf %s "(cached) " >&6 +else $as_nop + lt_cv_apple_cc_single_mod=no + if test -z "$LT_MULTI_MODULE"; then + # By default we will add the -single_module flag. You can override + # by either setting the environment variable LT_MULTI_MODULE + # non-empty at configure time, or by adding -multi_module to the + # link flags. + rm -rf libconftest.dylib* + echo "int foo(void){return 1;}" > conftest.c + echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ +-dynamiclib -Wl,-single_module conftest.c" >&5 + $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ + -dynamiclib -Wl,-single_module conftest.c 2>conftest.err + _lt_result=$? + # If there is a non-empty error log, and "single_module" + # appears in it, assume the flag caused a linker warning + if test -s conftest.err && $GREP single_module conftest.err; then + cat conftest.err >&5 + # Otherwise, if the output was created with a 0 exit code from + # the compiler, it worked. + elif test -f libconftest.dylib && test 0 = "$_lt_result"; then + lt_cv_apple_cc_single_mod=yes + else + cat conftest.err >&5 + fi + rm -rf libconftest.dylib* + rm -f conftest.* + fi +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5 +printf "%s\n" "$lt_cv_apple_cc_single_mod" >&6; } + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5 +printf %s "checking for -exported_symbols_list linker flag... " >&6; } +if test ${lt_cv_ld_exported_symbols_list+y} +then : + printf %s "(cached) " >&6 +else $as_nop + lt_cv_ld_exported_symbols_list=no + save_LDFLAGS=$LDFLAGS + echo "_main" > conftest.sym + LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + lt_cv_ld_exported_symbols_list=yes +else $as_nop + lt_cv_ld_exported_symbols_list=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$save_LDFLAGS + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5 +printf "%s\n" "$lt_cv_ld_exported_symbols_list" >&6; } + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5 +printf %s "checking for -force_load linker flag... " >&6; } +if test ${lt_cv_ld_force_load+y} +then : + printf %s "(cached) " >&6 +else $as_nop + lt_cv_ld_force_load=no + cat > conftest.c << _LT_EOF +int forced_loaded() { return 2;} +_LT_EOF + echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5 + $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5 + echo "$AR cru libconftest.a conftest.o" >&5 + $AR cru libconftest.a conftest.o 2>&5 + echo "$RANLIB libconftest.a" >&5 + $RANLIB libconftest.a 2>&5 + cat > conftest.c << _LT_EOF +int main() { return 0;} +_LT_EOF + echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5 + $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err + _lt_result=$? + if test -s conftest.err && $GREP force_load conftest.err; then + cat conftest.err >&5 + elif test -f conftest && test 0 = "$_lt_result" && $GREP forced_load conftest >/dev/null 2>&1; then + lt_cv_ld_force_load=yes + else + cat conftest.err >&5 + fi + rm -f conftest.err libconftest.a conftest conftest.c + rm -rf conftest.dSYM + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5 +printf "%s\n" "$lt_cv_ld_force_load" >&6; } + case $host_os in + rhapsody* | darwin1.[012]) + _lt_dar_allow_undefined='$wl-undefined ${wl}suppress' ;; + darwin1.*) + _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; + darwin*) + case ${MACOSX_DEPLOYMENT_TARGET},$host in + 10.[012],*|,*powerpc*) + _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; + *) + _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; + esac + ;; + esac + if test yes = "$lt_cv_apple_cc_single_mod"; then + _lt_dar_single_mod='$single_module' + fi + if test yes = "$lt_cv_ld_exported_symbols_list"; then + _lt_dar_export_syms=' $wl-exported_symbols_list,$output_objdir/$libname-symbols.expsym' + else + _lt_dar_export_syms='~$NMEDIT -s $output_objdir/$libname-symbols.expsym $lib' + fi + if test : != "$DSYMUTIL" && test no = "$lt_cv_ld_force_load"; then + _lt_dsymutil='~$DSYMUTIL $lib || :' + else + _lt_dsymutil= + fi + ;; + esac + +# func_munge_path_list VARIABLE PATH +# ----------------------------------- +# VARIABLE is name of variable containing _space_ separated list of +# directories to be munged by the contents of PATH, which is string +# having a format: +# "DIR[:DIR]:" +# string "DIR[ DIR]" will be prepended to VARIABLE +# ":DIR[:DIR]" +# string "DIR[ DIR]" will be appended to VARIABLE +# "DIRP[:DIRP]::[DIRA:]DIRA" +# string "DIRP[ DIRP]" will be prepended to VARIABLE and string +# "DIRA[ DIRA]" will be appended to VARIABLE +# "DIR[:DIR]" +# VARIABLE will be replaced by "DIR[ DIR]" +func_munge_path_list () +{ + case x@S|@2 in + x) + ;; + *:) + eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'` \@S|@@S|@1\" + ;; + x:*) + eval @S|@1=\"\@S|@@S|@1 `$ECHO @S|@2 | $SED 's/:/ /g'`\" + ;; + *::*) + eval @S|@1=\"\@S|@@S|@1\ `$ECHO @S|@2 | $SED -e 's/.*:://' -e 's/:/ /g'`\" + eval @S|@1=\"`$ECHO @S|@2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \@S|@@S|@1\" + ;; + *) + eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'`\" + ;; + esac +} + +ac_header= ac_cache= +for ac_item in $ac_header_c_list +do + if test $ac_cache; then + ac_fn_c_check_header_compile "$LINENO" $ac_header ac_cv_header_$ac_cache "$ac_includes_default" + if eval test \"x\$ac_cv_header_$ac_cache\" = xyes; then + printf "%s\n" "#define $ac_item 1" >> confdefs.h + fi + ac_header= ac_cache= + elif test $ac_header; then + ac_cache=$ac_item + else + ac_header=$ac_item + fi +done + + + + + + + + +if test $ac_cv_header_stdlib_h = yes && test $ac_cv_header_string_h = yes +then : + +printf "%s\n" "@%:@define STDC_HEADERS 1" >>confdefs.h + +fi +ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default +" +if test "x$ac_cv_header_dlfcn_h" = xyes +then : + printf "%s\n" "@%:@define HAVE_DLFCN_H 1" >>confdefs.h + +fi + + + + +func_stripname_cnf () +{ + case @S|@2 in + .*) func_stripname_result=`$ECHO "@S|@3" | $SED "s%^@S|@1%%; s%\\\\@S|@2\$%%"`;; + *) func_stripname_result=`$ECHO "@S|@3" | $SED "s%^@S|@1%%; s%@S|@2\$%%"`;; + esac +} # func_stripname_cnf + + + + + +# Set options + + + + enable_dlopen=no + + + + @%:@ Check whether --enable-shared was given. +if test ${enable_shared+y} +then : + enableval=$enable_shared; p=${PACKAGE-default} + case $enableval in + yes) enable_shared=yes ;; + no) enable_shared=no ;; + *) + enable_shared=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for pkg in $enableval; do + IFS=$lt_save_ifs + if test "X$pkg" = "X$p"; then + enable_shared=yes + fi + done + IFS=$lt_save_ifs + ;; + esac +else $as_nop + enable_shared=yes +fi + + + + + + + + + + @%:@ Check whether --enable-static was given. +if test ${enable_static+y} +then : + enableval=$enable_static; p=${PACKAGE-default} + case $enableval in + yes) enable_static=yes ;; + no) enable_static=no ;; + *) + enable_static=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for pkg in $enableval; do + IFS=$lt_save_ifs + if test "X$pkg" = "X$p"; then + enable_static=yes + fi + done + IFS=$lt_save_ifs + ;; + esac +else $as_nop + enable_static=yes +fi + + + + + + + + + + +@%:@ Check whether --with-pic was given. +if test ${with_pic+y} +then : + withval=$with_pic; lt_p=${PACKAGE-default} + case $withval in + yes|no) pic_mode=$withval ;; + *) + pic_mode=default + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for lt_pkg in $withval; do + IFS=$lt_save_ifs + if test "X$lt_pkg" = "X$lt_p"; then + pic_mode=yes + fi + done + IFS=$lt_save_ifs + ;; + esac +else $as_nop + pic_mode=default +fi + + + + + + + + + @%:@ Check whether --enable-fast-install was given. +if test ${enable_fast_install+y} +then : + enableval=$enable_fast_install; p=${PACKAGE-default} + case $enableval in + yes) enable_fast_install=yes ;; + no) enable_fast_install=no ;; + *) + enable_fast_install=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for pkg in $enableval; do + IFS=$lt_save_ifs + if test "X$pkg" = "X$p"; then + enable_fast_install=yes + fi + done + IFS=$lt_save_ifs + ;; + esac +else $as_nop + enable_fast_install=yes +fi + + + + + + + + + shared_archive_member_spec= +case $host,$enable_shared in +power*-*-aix[5-9]*,yes) + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking which variant of shared library versioning to provide" >&5 +printf %s "checking which variant of shared library versioning to provide... " >&6; } + +@%:@ Check whether --with-aix-soname was given. +if test ${with_aix_soname+y} +then : + withval=$with_aix_soname; case $withval in + aix|svr4|both) + ;; + *) + as_fn_error $? "Unknown argument to --with-aix-soname" "$LINENO" 5 + ;; + esac + lt_cv_with_aix_soname=$with_aix_soname +else $as_nop + if test ${lt_cv_with_aix_soname+y} +then : + printf %s "(cached) " >&6 +else $as_nop + lt_cv_with_aix_soname=aix +fi + + with_aix_soname=$lt_cv_with_aix_soname +fi + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $with_aix_soname" >&5 +printf "%s\n" "$with_aix_soname" >&6; } + if test aix != "$with_aix_soname"; then + # For the AIX way of multilib, we name the shared archive member + # based on the bitwidth used, traditionally 'shr.o' or 'shr_64.o', + # and 'shr.imp' or 'shr_64.imp', respectively, for the Import File. + # Even when GNU compilers ignore OBJECT_MODE but need '-maix64' flag, + # the AIX toolchain works better with OBJECT_MODE set (default 32). + if test 64 = "${OBJECT_MODE-32}"; then + shared_archive_member_spec=shr_64 + else + shared_archive_member_spec=shr + fi + fi + ;; +*) + with_aix_soname=aix + ;; +esac + + + + + + + + + + +# This can be used to rebuild libtool when needed +LIBTOOL_DEPS=$ltmain + +# Always use our own libtool. +LIBTOOL='$(SHELL) $(top_builddir)/libtool' + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +test -z "$LN_S" && LN_S="ln -s" + + + + + + + + + + + + + + +if test -n "${ZSH_VERSION+set}"; then + setopt NO_GLOB_SUBST +fi + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5 +printf %s "checking for objdir... " >&6; } +if test ${lt_cv_objdir+y} +then : + printf %s "(cached) " >&6 +else $as_nop + rm -f .libs 2>/dev/null +mkdir .libs 2>/dev/null +if test -d .libs; then + lt_cv_objdir=.libs +else + # MS-DOS does not allow filenames that begin with a dot. + lt_cv_objdir=_libs +fi +rmdir .libs 2>/dev/null +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5 +printf "%s\n" "$lt_cv_objdir" >&6; } +objdir=$lt_cv_objdir + + + + + +printf "%s\n" "@%:@define LT_OBJDIR \"$lt_cv_objdir/\"" >>confdefs.h + + + + +case $host_os in +aix3*) + # AIX sometimes has problems with the GCC collect2 program. For some + # reason, if we set the COLLECT_NAMES environment variable, the problems + # vanish in a puff of smoke. + if test set != "${COLLECT_NAMES+set}"; then + COLLECT_NAMES= + export COLLECT_NAMES + fi + ;; +esac + +# Global variables: +ofile=libtool +can_build_shared=yes + +# All known linkers require a '.a' archive for static linking (except MSVC, +# which needs '.lib'). +libext=a + +with_gnu_ld=$lt_cv_prog_gnu_ld + +old_CC=$CC +old_CFLAGS=$CFLAGS + +# Set sane defaults for various variables +test -z "$CC" && CC=cc +test -z "$LTCC" && LTCC=$CC +test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS +test -z "$LD" && LD=ld +test -z "$ac_objext" && ac_objext=o + +func_cc_basename $compiler +cc_basename=$func_cc_basename_result + + +# Only perform the check for file, if the check method requires it +test -z "$MAGIC_CMD" && MAGIC_CMD=file +case $deplibs_check_method in +file_magic*) + if test "$file_magic_cmd" = '$MAGIC_CMD'; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5 +printf %s "checking for ${ac_tool_prefix}file... " >&6; } +if test ${lt_cv_path_MAGIC_CMD+y} +then : + printf %s "(cached) " >&6 +else $as_nop + case $MAGIC_CMD in +[\\/*] | ?:[\\/]*) + lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD=$MAGIC_CMD + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR + ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" + for ac_dir in $ac_dummy; do + IFS=$lt_save_ifs + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/${ac_tool_prefix}file"; then + lt_cv_path_MAGIC_CMD=$ac_dir/"${ac_tool_prefix}file" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` + MAGIC_CMD=$lt_cv_path_MAGIC_CMD + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <<_LT_EOF 1>&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +_LT_EOF + fi ;; + esac + fi + break + fi + done + IFS=$lt_save_ifs + MAGIC_CMD=$lt_save_MAGIC_CMD + ;; +esac +fi + +MAGIC_CMD=$lt_cv_path_MAGIC_CMD +if test -n "$MAGIC_CMD"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 +printf "%s\n" "$MAGIC_CMD" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + + + + +if test -z "$lt_cv_path_MAGIC_CMD"; then + if test -n "$ac_tool_prefix"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for file" >&5 +printf %s "checking for file... " >&6; } +if test ${lt_cv_path_MAGIC_CMD+y} +then : + printf %s "(cached) " >&6 +else $as_nop + case $MAGIC_CMD in +[\\/*] | ?:[\\/]*) + lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD=$MAGIC_CMD + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR + ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" + for ac_dir in $ac_dummy; do + IFS=$lt_save_ifs + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/file"; then + lt_cv_path_MAGIC_CMD=$ac_dir/"file" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` + MAGIC_CMD=$lt_cv_path_MAGIC_CMD + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <<_LT_EOF 1>&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +_LT_EOF + fi ;; + esac + fi + break + fi + done + IFS=$lt_save_ifs + MAGIC_CMD=$lt_save_MAGIC_CMD + ;; +esac +fi + +MAGIC_CMD=$lt_cv_path_MAGIC_CMD +if test -n "$MAGIC_CMD"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 +printf "%s\n" "$MAGIC_CMD" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + + else + MAGIC_CMD=: + fi +fi + + fi + ;; +esac + +# Use C for the default configuration in the libtool script + +lt_save_CC=$CC +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +# Source file extension for C test sources. +ac_ext=c + +# Object file extension for compiled C test sources. +objext=o +objext=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="int some_variable = 0;" + +# Code to be used in simple link tests +lt_simple_link_test_code='int main(){return(0);}' + + + + + + + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC + +# Save the default compiler, since it gets overwritten when the other +# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. +compiler_DEFAULT=$CC + +# save warnings/boilerplate of simple test code +ac_outfile=conftest.$ac_objext +echo "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$RM conftest* + +ac_outfile=conftest.$ac_objext +echo "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$RM -r conftest* + + +if test -n "$compiler"; then + +lt_prog_compiler_no_builtin_flag= + +if test yes = "$GCC"; then + case $cc_basename in + nvcc*) + lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;; + *) + lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;; + esac + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 +printf %s "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } +if test ${lt_cv_prog_compiler_rtti_exceptions+y} +then : + printf %s "(cached) " >&6 +else $as_nop + lt_cv_prog_compiler_rtti_exceptions=no + ac_outfile=conftest.$ac_objext + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="-fno-rtti -fno-exceptions" ## exclude from sc_useless_quotes_in_assignment + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_rtti_exceptions=yes + fi + fi + $RM conftest* + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 +printf "%s\n" "$lt_cv_prog_compiler_rtti_exceptions" >&6; } + +if test yes = "$lt_cv_prog_compiler_rtti_exceptions"; then + lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" +else + : +fi + +fi + + + + + + + lt_prog_compiler_wl= +lt_prog_compiler_pic= +lt_prog_compiler_static= + + + if test yes = "$GCC"; then + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_static='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static='-Bstatic' + fi + lt_prog_compiler_pic='-fPIC' + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + lt_prog_compiler_pic='-fPIC' + ;; + m68k) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the '-m68020' flag to GCC prevents building anything better, + # like '-m68040'. + lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + lt_prog_compiler_pic='-DDLL_EXPORT' + case $host_os in + os2*) + lt_prog_compiler_static='$wl-static' + ;; + esac + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic='-fno-common' + ;; + + haiku*) + # PIC is the default for Haiku. + # The "-static" flag exists, but is broken. + lt_prog_compiler_static= + ;; + + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic='-fPIC' + ;; + esac + ;; + + interix[3-9]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + + msdosdjgpp*) + # Just because we use GCC doesn't mean we suddenly get shared libraries + # on systems that don't support them. + lt_prog_compiler_can_build_shared=no + enable_shared=no + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic='-fPIC -shared' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic=-Kconform_pic + fi + ;; + + *) + lt_prog_compiler_pic='-fPIC' + ;; + esac + + case $cc_basename in + nvcc*) # Cuda Compiler Driver 2.2 + lt_prog_compiler_wl='-Xlinker ' + if test -n "$lt_prog_compiler_pic"; then + lt_prog_compiler_pic="-Xcompiler $lt_prog_compiler_pic" + fi + ;; + esac + else + # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in + aix*) + lt_prog_compiler_wl='-Wl,' + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static='-Bstatic' + else + lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' + fi + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic='-fno-common' + case $cc_basename in + nagfor*) + # NAG Fortran compiler + lt_prog_compiler_wl='-Wl,-Wl,,' + lt_prog_compiler_pic='-PIC' + lt_prog_compiler_static='-Bstatic' + ;; + esac + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_prog_compiler_pic='-DDLL_EXPORT' + case $host_os in + os2*) + lt_prog_compiler_static='$wl-static' + ;; + esac + ;; + + hpux9* | hpux10* | hpux11*) + lt_prog_compiler_wl='-Wl,' + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic='+Z' + ;; + esac + # Is there a better lt_prog_compiler_static that works with the bundled CC? + lt_prog_compiler_static='$wl-a ${wl}archive' + ;; + + irix5* | irix6* | nonstopux*) + lt_prog_compiler_wl='-Wl,' + # PIC (with -KPIC) is the default. + lt_prog_compiler_static='-non_shared' + ;; + + linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + case $cc_basename in + # old Intel for x86_64, which still supported -KPIC. + ecc*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-static' + ;; + # icc used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + icc* | ifort*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fPIC' + lt_prog_compiler_static='-static' + ;; + # Lahey Fortran 8.1. + lf95*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='--shared' + lt_prog_compiler_static='--static' + ;; + nagfor*) + # NAG Fortran compiler + lt_prog_compiler_wl='-Wl,-Wl,,' + lt_prog_compiler_pic='-PIC' + lt_prog_compiler_static='-Bstatic' + ;; + tcc*) + # Fabrice Bellard et al's Tiny C Compiler + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fPIC' + lt_prog_compiler_static='-static' + ;; + pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group compilers (*not* the Pentium gcc compiler, + # which looks to be a dead project) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fpic' + lt_prog_compiler_static='-Bstatic' + ;; + ccc*) + lt_prog_compiler_wl='-Wl,' + # All Alpha code is PIC. + lt_prog_compiler_static='-non_shared' + ;; + xl* | bgxl* | bgf* | mpixl*) + # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-qpic' + lt_prog_compiler_static='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*) + # Sun Fortran 8.3 passes all unrecognized flags to the linker + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + lt_prog_compiler_wl='' + ;; + *Sun\ F* | *Sun*Fortran*) + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + lt_prog_compiler_wl='-Qoption ld ' + ;; + *Sun\ C*) + # Sun C 5.9 + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + lt_prog_compiler_wl='-Wl,' + ;; + *Intel*\ [CF]*Compiler*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fPIC' + lt_prog_compiler_static='-static' + ;; + *Portland\ Group*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fpic' + lt_prog_compiler_static='-Bstatic' + ;; + esac + ;; + esac + ;; + + newsos6) + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic='-fPIC -shared' + ;; + + osf3* | osf4* | osf5*) + lt_prog_compiler_wl='-Wl,' + # All OSF/1 code is PIC. + lt_prog_compiler_static='-non_shared' + ;; + + rdos*) + lt_prog_compiler_static='-non_shared' + ;; + + solaris*) + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + case $cc_basename in + f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) + lt_prog_compiler_wl='-Qoption ld ';; + *) + lt_prog_compiler_wl='-Wl,';; + esac + ;; + + sunos4*) + lt_prog_compiler_wl='-Qoption ld ' + lt_prog_compiler_pic='-PIC' + lt_prog_compiler_static='-Bstatic' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic='-Kconform_pic' + lt_prog_compiler_static='-Bstatic' + fi + ;; + + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + unicos*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_can_build_shared=no + ;; + + uts4*) + lt_prog_compiler_pic='-pic' + lt_prog_compiler_static='-Bstatic' + ;; + + *) + lt_prog_compiler_can_build_shared=no + ;; + esac + fi + +case $host_os in + # For platforms that do not support PIC, -DPIC is meaningless: + *djgpp*) + lt_prog_compiler_pic= + ;; + *) + lt_prog_compiler_pic="$lt_prog_compiler_pic@&t@ -DPIC" + ;; +esac + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 +printf %s "checking for $compiler option to produce PIC... " >&6; } +if test ${lt_cv_prog_compiler_pic+y} +then : + printf %s "(cached) " >&6 +else $as_nop + lt_cv_prog_compiler_pic=$lt_prog_compiler_pic +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5 +printf "%s\n" "$lt_cv_prog_compiler_pic" >&6; } +lt_prog_compiler_pic=$lt_cv_prog_compiler_pic + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$lt_prog_compiler_pic"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 +printf %s "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } +if test ${lt_cv_prog_compiler_pic_works+y} +then : + printf %s "(cached) " >&6 +else $as_nop + lt_cv_prog_compiler_pic_works=no + ac_outfile=conftest.$ac_objext + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$lt_prog_compiler_pic@&t@ -DPIC" ## exclude from sc_useless_quotes_in_assignment + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_pic_works=yes + fi + fi + $RM conftest* + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5 +printf "%s\n" "$lt_cv_prog_compiler_pic_works" >&6; } + +if test yes = "$lt_cv_prog_compiler_pic_works"; then + case $lt_prog_compiler_pic in + "" | " "*) ;; + *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;; + esac +else + lt_prog_compiler_pic= + lt_prog_compiler_can_build_shared=no +fi + +fi + + + + + + + + + + + +# +# Check to make sure the static flag actually works. +# +wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 +printf %s "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } +if test ${lt_cv_prog_compiler_static_works+y} +then : + printf %s "(cached) " >&6 +else $as_nop + lt_cv_prog_compiler_static_works=no + save_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS $lt_tmp_static_flag" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&5 + $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_static_works=yes + fi + else + lt_cv_prog_compiler_static_works=yes + fi + fi + $RM -r conftest* + LDFLAGS=$save_LDFLAGS + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5 +printf "%s\n" "$lt_cv_prog_compiler_static_works" >&6; } + +if test yes = "$lt_cv_prog_compiler_static_works"; then + : +else + lt_prog_compiler_static= +fi + + + + + + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +printf %s "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if test ${lt_cv_prog_compiler_c_o+y} +then : + printf %s "(cached) " >&6 +else $as_nop + lt_cv_prog_compiler_c_o=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 +printf "%s\n" "$lt_cv_prog_compiler_c_o" >&6; } + + + + + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +printf %s "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if test ${lt_cv_prog_compiler_c_o+y} +then : + printf %s "(cached) " >&6 +else $as_nop + lt_cv_prog_compiler_c_o=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 +printf "%s\n" "$lt_cv_prog_compiler_c_o" >&6; } + + + + +hard_links=nottested +if test no = "$lt_cv_prog_compiler_c_o" && test no != "$need_locks"; then + # do not overwrite the value of need_locks provided by the user + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 +printf %s "checking if we can lock with hard links... " >&6; } + hard_links=yes + $RM conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 +printf "%s\n" "$hard_links" >&6; } + if test no = "$hard_links"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&5 +printf "%s\n" "$as_me: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&2;} + need_locks=warn + fi +else + need_locks=no +fi + + + + + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +printf %s "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } + + runpath_var= + allow_undefined_flag= + always_export_symbols=no + archive_cmds= + archive_expsym_cmds= + compiler_needs_object=no + enable_shared_with_static_runtimes=no + export_dynamic_flag_spec= + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + hardcode_automatic=no + hardcode_direct=no + hardcode_direct_absolute=no + hardcode_libdir_flag_spec= + hardcode_libdir_separator= + hardcode_minus_L=no + hardcode_shlibpath_var=unsupported + inherit_rpath=no + link_all_deplibs=unknown + module_cmds= + module_expsym_cmds= + old_archive_from_new_cmds= + old_archive_from_expsyms_cmds= + thread_safe_flag_spec= + whole_archive_flag_spec= + # include_expsyms should be a list of space-separated symbols to be *always* + # included in the symbol list + include_expsyms= + # exclude_expsyms can be an extended regexp of symbols to exclude + # it will be wrapped by ' (' and ')$', so one must not match beginning or + # end of line. Example: 'a|bc|.*d.*' will exclude the symbols 'a' and 'bc', + # as well as any symbol that contains 'd'. + exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' + # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out + # platforms (ab)use it in PIC code, but their linkers get confused if + # the symbol is explicitly referenced. Since portable code cannot + # rely on this symbol name, it's probably fine to never include it in + # preloaded symbol tables. + # Exclude shared library initialization/finalization symbols. + extract_expsyms_cmds= + + case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test yes != "$GCC"; then + with_gnu_ld=no + fi + ;; + interix*) + # we just hope/assume this is gcc and not c89 (= MSVC++) + with_gnu_ld=yes + ;; + openbsd* | bitrig*) + with_gnu_ld=no + ;; + esac + + ld_shlibs=yes + + # On some targets, GNU ld is compatible enough with the native linker + # that we're better off using the native interface for both. + lt_use_gnu_ld_interface=no + if test yes = "$with_gnu_ld"; then + case $host_os in + aix*) + # The AIX port of GNU ld has always aspired to compatibility + # with the native linker. However, as the warning in the GNU ld + # block says, versions before 2.19.5* couldn't really create working + # shared libraries, regardless of the interface used. + case `$LD -v 2>&1` in + *\ \(GNU\ Binutils\)\ 2.19.5*) ;; + *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;; + *\ \(GNU\ Binutils\)\ [3-9]*) ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + fi + + if test yes = "$lt_use_gnu_ld_interface"; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='$wl' + + # Set some defaults for GNU ld with shared library support. These + # are reset later if shared libraries are not supported. Putting them + # here allows them to be overridden if necessary. + runpath_var=LD_RUN_PATH + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + export_dynamic_flag_spec='$wl--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then + whole_archive_flag_spec=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' + else + whole_archive_flag_spec= + fi + supports_anon_versioning=no + case `$LD -v | $SED -e 's/(^)\+)\s\+//' 2>&1` in + *GNU\ gold*) supports_anon_versioning=yes ;; + *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + + # See if GNU ld supports shared libraries. + case $host_os in + aix[3-9]*) + # On AIX/PPC, the GNU linker is very broken + if test ia64 != "$host_cpu"; then + ld_shlibs=no + cat <<_LT_EOF 1>&2 + +*** Warning: the GNU linker, at least up to release 2.19, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to install binutils +*** 2.20 or above, or modify your PATH so that a non-GNU linker is found. +*** You will then need to restart the configuration process. + +_LT_EOF + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds='' + ;; + m68k) + archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + ;; + esac + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + allow_undefined_flag=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + else + ld_shlibs=no + fi + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, + # as there is no search path for DLLs. + hardcode_libdir_flag_spec='-L$libdir' + export_dynamic_flag_spec='$wl--export-all-symbols' + allow_undefined_flag=unsupported + always_export_symbols=no + enable_shared_with_static_runtimes=yes + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' + exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file, use it as + # is; otherwise, prepend EXPORTS... + archive_expsym_cmds='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + ld_shlibs=no + fi + ;; + + haiku*) + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + link_all_deplibs=yes + ;; + + os2*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + allow_undefined_flag=unsupported + shrext_cmds=.dll + archive_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + archive_expsym_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + prefix_cmds="$SED"~ + if test EXPORTS = "`$SED 1q $export_symbols`"; then + prefix_cmds="$prefix_cmds -e 1d"; + fi~ + prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ + cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + old_archive_From_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + enable_shared_with_static_runtimes=yes + ;; + + interix[3-9]*) + hardcode_direct=no + hardcode_shlibpath_var=no + hardcode_libdir_flag_spec='$wl-rpath,$libdir' + export_dynamic_flag_spec='$wl-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + archive_expsym_cmds='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + + gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) + tmp_diet=no + if test linux-dietlibc = "$host_os"; then + case $cc_basename in + diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) + esac + fi + if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ + && test no = "$tmp_diet" + then + tmp_addflag=' $pic_flag' + tmp_sharedflag='-shared' + case $cc_basename,$host_cpu in + pgcc*) # Portland Group C compiler + whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + tmp_addflag=' $pic_flag' + ;; + pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group f77 and f90 compilers + whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + tmp_addflag=' $pic_flag -Mnomain' ;; + ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 + tmp_addflag=' -i_dynamic' ;; + efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 + tmp_addflag=' -i_dynamic -nofor_main' ;; + ifc* | ifort*) # Intel Fortran compiler + tmp_addflag=' -nofor_main' ;; + lf95*) # Lahey Fortran 8.1 + whole_archive_flag_spec= + tmp_sharedflag='--shared' ;; + nagfor*) # NAGFOR 5.3 + tmp_sharedflag='-Wl,-shared' ;; + xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below) + tmp_sharedflag='-qmkshrobj' + tmp_addflag= ;; + nvcc*) # Cuda Compiler Driver 2.2 + whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + compiler_needs_object=yes + ;; + esac + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) # Sun C 5.9 + whole_archive_flag_spec='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + compiler_needs_object=yes + tmp_sharedflag='-G' ;; + *Sun\ F*) # Sun Fortran 8.3 + tmp_sharedflag='-G' ;; + esac + archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + + if test yes = "$supports_anon_versioning"; then + archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' + fi + + case $cc_basename in + tcc*) + export_dynamic_flag_spec='-rdynamic' + ;; + xlf* | bgf* | bgxlf* | mpixlf*) + # IBM XL Fortran 10.1 on PPC cannot create shared libs itself + whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive' + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' + if test yes = "$supports_anon_versioning"; then + archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' + fi + ;; + esac + else + ld_shlibs=no + fi + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris*) + if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then + ld_shlibs=no + cat <<_LT_EOF 1>&2 + +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) + case `$LD -v 2>&1` in + *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) + ld_shlibs=no + cat <<_LT_EOF 1>&2 + +*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 cannot +*** reliably create shared libraries on SCO systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.16.91.0.3 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + ;; + *) + # For security reasons, it is highly recommended that you always + # use absolute paths for naming shared libraries, and exclude the + # DT_RUNPATH tag from executables and libraries. But doing so + # requires that you compile everything twice, which is a pain. + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + esac + ;; + + sunos4*) + archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + *) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + esac + + if test no = "$ld_shlibs"; then + runpath_var= + hardcode_libdir_flag_spec= + export_dynamic_flag_spec= + whole_archive_flag_spec= + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + allow_undefined_flag=unsupported + always_export_symbols=yes + archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + hardcode_minus_L=yes + if test yes = "$GCC" && test -z "$lt_prog_compiler_static"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + hardcode_direct=unsupported + fi + ;; + + aix[4-9]*) + if test ia64 = "$host_cpu"; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag= + else + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to GNU nm, but means don't demangle to AIX nm. + # Without the "-l" option, or with the "-B" option, AIX nm treats + # weak defined symbols like other global defined symbols, whereas + # GNU nm marks them as "W". + # While the 'weak' keyword is ignored in the Export File, we need + # it in the Import File for the 'aix-soname' feature, so we have + # to replace the "-B" option with "-P" for AIX nm. + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' + else + export_symbols_cmds='`func_echo_all $NM | $SED -e '\''s/B\([^B]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && (substr(\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' + fi + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # have runtime linking enabled, and use it for executables. + # For shared libraries, we enable/disable runtime linking + # depending on the kind of the shared library created - + # when "with_aix_soname,aix_use_runtimelinking" is: + # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables + # "aix,yes" lib.so shared, rtl:yes, for executables + # lib.a static archive + # "both,no" lib.so.V(shr.o) shared, rtl:yes + # lib.a(lib.so.V) shared, rtl:no, for executables + # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a(lib.so.V) shared, rtl:no + # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a static archive + case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) + for ld_flag in $LDFLAGS; do + if (test x-brtl = "x$ld_flag" || test x-Wl,-brtl = "x$ld_flag"); then + aix_use_runtimelinking=yes + break + fi + done + if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then + # With aix-soname=svr4, we create the lib.so.V shared archives only, + # so we don't have lib.a shared libs to link our executables. + # We have to force runtime linking in this case. + aix_use_runtimelinking=yes + LDFLAGS="$LDFLAGS -Wl,-brtl" + fi + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + archive_cmds='' + hardcode_direct=yes + hardcode_direct_absolute=yes + hardcode_libdir_separator=':' + link_all_deplibs=yes + file_list_spec='$wl-f,' + case $with_aix_soname,$aix_use_runtimelinking in + aix,*) ;; # traditional, no import file + svr4,* | *,yes) # use import file + # The Import File defines what to hardcode. + hardcode_direct=no + hardcode_direct_absolute=no + ;; + esac + + if test yes = "$GCC"; then + case $host_os in aix4.[012]|aix4.[012].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`$CC -print-prog-name=collect2` + if test -f "$collect2name" && + strings "$collect2name" | $GREP resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + hardcode_direct=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + hardcode_minus_L=yes + hardcode_libdir_flag_spec='-L$libdir' + hardcode_libdir_separator= + fi + ;; + esac + shared_flag='-shared' + if test yes = "$aix_use_runtimelinking"; then + shared_flag="$shared_flag "'$wl-G' + fi + # Need to ensure runtime linking is disabled for the traditional + # shared library, or the linker may eventually find shared libraries + # /with/ Import File - we do not want to mix them. + shared_flag_aix='-shared' + shared_flag_svr4='-shared $wl-G' + else + # not using gcc + if test ia64 = "$host_cpu"; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test yes = "$aix_use_runtimelinking"; then + shared_flag='$wl-G' + else + shared_flag='$wl-bM:SRE' + fi + shared_flag_aix='$wl-bM:SRE' + shared_flag_svr4='$wl-G' + fi + fi + + export_dynamic_flag_spec='$wl-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + always_export_symbols=yes + if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + allow_undefined_flag='-berok' + # Determine the default libpath from the value encoded in an + # empty executable. + if test set = "${lt_cv_aix_libpath+set}"; then + aix_libpath=$lt_cv_aix_libpath +else + if test ${lt_cv_aix_libpath_+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + + lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }' + lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_=/usr/lib:/lib + fi + +fi + + aix_libpath=$lt_cv_aix_libpath_ +fi + + hardcode_libdir_flag_spec='$wl-blibpath:$libdir:'"$aix_libpath" + archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag + else + if test ia64 = "$host_cpu"; then + hardcode_libdir_flag_spec='$wl-R $libdir:/usr/lib:/lib' + allow_undefined_flag="-z nodefs" + archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + if test set = "${lt_cv_aix_libpath+set}"; then + aix_libpath=$lt_cv_aix_libpath +else + if test ${lt_cv_aix_libpath_+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + + lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }' + lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_=/usr/lib:/lib + fi + +fi + + aix_libpath=$lt_cv_aix_libpath_ +fi + + hardcode_libdir_flag_spec='$wl-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + no_undefined_flag=' $wl-bernotok' + allow_undefined_flag=' $wl-berok' + if test yes = "$with_gnu_ld"; then + # We only use this code for GNU lds that support --whole-archive. + whole_archive_flag_spec='$wl--whole-archive$convenience $wl--no-whole-archive' + else + # Exported symbols can be pulled into shared objects from archives + whole_archive_flag_spec='$convenience' + fi + archive_cmds_need_lc=yes + archive_expsym_cmds='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' + # -brtl affects multiple linker settings, -berok does not and is overridden later + compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([, ]\\)%-berok\\1%g"`' + if test svr4 != "$with_aix_soname"; then + # This is similar to how AIX traditionally builds its shared libraries. + archive_expsym_cmds="$archive_expsym_cmds"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' + fi + if test aix != "$with_aix_soname"; then + archive_expsym_cmds="$archive_expsym_cmds"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' + else + # used by -dlpreopen to get the symbols + archive_expsym_cmds="$archive_expsym_cmds"'~$MV $output_objdir/$realname.d/$soname $output_objdir' + fi + archive_expsym_cmds="$archive_expsym_cmds"'~$RM -r $output_objdir/$realname.d' + fi + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds='' + ;; + m68k) + archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + ;; + esac + ;; + + bsdi[45]*) + export_dynamic_flag_spec=-rdynamic + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + case $cc_basename in + cl*) + # Native MSVC + hardcode_libdir_flag_spec=' ' + allow_undefined_flag=unsupported + always_export_symbols=yes + file_list_spec='@' + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=.dll + # FIXME: Setting linknames here is a bad hack. + archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' + archive_expsym_cmds='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then + cp "$export_symbols" "$output_objdir/$soname.def"; + echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; + else + $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; + fi~ + $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ + linknames=' + # The linker will not automatically build a static lib if we build a DLL. + # _LT_TAGVAR(old_archive_from_new_cmds, )='true' + enable_shared_with_static_runtimes=yes + exclude_expsyms='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' + # Don't use ranlib + old_postinstall_cmds='chmod 644 $oldlib' + postlink_cmds='lt_outputfile="@OUTPUT@"~ + lt_tool_outputfile="@TOOL_OUTPUT@"~ + case $lt_outputfile in + *.exe|*.EXE) ;; + *) + lt_outputfile=$lt_outputfile.exe + lt_tool_outputfile=$lt_tool_outputfile.exe + ;; + esac~ + if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then + $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; + $RM "$lt_outputfile.manifest"; + fi' + ;; + *) + # Assume MSVC wrapper + hardcode_libdir_flag_spec=' ' + allow_undefined_flag=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=.dll + # FIXME: Setting linknames here is a bad hack. + archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + old_archive_from_new_cmds='true' + # FIXME: Should let the user specify the lib program. + old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs' + enable_shared_with_static_runtimes=yes + ;; + esac + ;; + + darwin* | rhapsody*) + + + archive_cmds_need_lc=no + hardcode_direct=no + hardcode_automatic=yes + hardcode_shlibpath_var=unsupported + if test yes = "$lt_cv_ld_force_load"; then + whole_archive_flag_spec='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' + + else + whole_archive_flag_spec='' + fi + link_all_deplibs=yes + allow_undefined_flag=$_lt_dar_allow_undefined + case $cc_basename in + ifort*|nagfor*) _lt_dar_can_shared=yes ;; + *) _lt_dar_can_shared=$GCC ;; + esac + if test yes = "$_lt_dar_can_shared"; then + output_verbose_link_cmd=func_echo_all + archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil" + module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil" + archive_expsym_cmds="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil" + module_expsym_cmds="sed -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil" + + else + ld_shlibs=no + fi + + ;; + + dgux*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_shlibpath_var=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2.*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes + hardcode_minus_L=yes + hardcode_shlibpath_var=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | dragonfly*) + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + hpux9*) + if test yes = "$GCC"; then + archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' + else + archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' + fi + hardcode_libdir_flag_spec='$wl+b $wl$libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + export_dynamic_flag_spec='$wl-E' + ;; + + hpux10*) + if test yes,no = "$GCC,$with_gnu_ld"; then + archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + fi + if test no = "$with_gnu_ld"; then + hardcode_libdir_flag_spec='$wl+b $wl$libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + hardcode_direct_absolute=yes + export_dynamic_flag_spec='$wl-E' + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + fi + ;; + + hpux11*) + if test yes,no = "$GCC,$with_gnu_ld"; then + case $host_cpu in + hppa*64*) + archive_cmds='$CC -shared $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else + case $host_cpu in + hppa*64*) + archive_cmds='$CC -b $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + archive_cmds='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + + # Older versions of the 11.00 compiler do not understand -b yet + # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5 +printf %s "checking if $CC understands -b... " >&6; } +if test ${lt_cv_prog_compiler__b+y} +then : + printf %s "(cached) " >&6 +else $as_nop + lt_cv_prog_compiler__b=no + save_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS -b" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&5 + $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler__b=yes + fi + else + lt_cv_prog_compiler__b=yes + fi + fi + $RM -r conftest* + LDFLAGS=$save_LDFLAGS + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5 +printf "%s\n" "$lt_cv_prog_compiler__b" >&6; } + +if test yes = "$lt_cv_prog_compiler__b"; then + archive_cmds='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' +else + archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' +fi + + ;; + esac + fi + if test no = "$with_gnu_ld"; then + hardcode_libdir_flag_spec='$wl+b $wl$libdir' + hardcode_libdir_separator=: + + case $host_cpu in + hppa*64*|ia64*) + hardcode_direct=no + hardcode_shlibpath_var=no + ;; + *) + hardcode_direct=yes + hardcode_direct_absolute=yes + export_dynamic_flag_spec='$wl-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + ;; + esac + fi + ;; + + irix5* | irix6* | nonstopux*) + if test yes = "$GCC"; then + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + # Try to use the -exported_symbol ld option, if it does not + # work, assume that -exports_file does not work either and + # implicitly export all symbols. + # This should be the same for all languages, so no per-tag cache variable. + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5 +printf %s "checking whether the $host_os linker accepts -exported_symbol... " >&6; } +if test ${lt_cv_irix_exported_symbol+y} +then : + printf %s "(cached) " >&6 +else $as_nop + save_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS -shared $wl-exported_symbol ${wl}foo $wl-update_registry $wl/dev/null" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +int foo (void) { return 0; } +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + lt_cv_irix_exported_symbol=yes +else $as_nop + lt_cv_irix_exported_symbol=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$save_LDFLAGS +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5 +printf "%s\n" "$lt_cv_irix_exported_symbol" >&6; } + if test yes = "$lt_cv_irix_exported_symbol"; then + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations $wl-exports_file $wl$export_symbols -o $lib' + fi + else + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -exports_file $export_symbols -o $lib' + fi + archive_cmds_need_lc='no' + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + hardcode_libdir_separator=: + inherit_rpath=yes + link_all_deplibs=yes + ;; + + linux*) + case $cc_basename in + tcc*) + # Fabrice Bellard et al's Tiny C Compiler + ld_shlibs=yes + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + newsos6) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + hardcode_libdir_separator=: + hardcode_shlibpath_var=no + ;; + + *nto* | *qnx*) + ;; + + openbsd* | bitrig*) + if test -f /usr/libexec/ld.so; then + hardcode_direct=yes + hardcode_shlibpath_var=no + hardcode_direct_absolute=yes + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags $wl-retain-symbols-file,$export_symbols' + hardcode_libdir_flag_spec='$wl-rpath,$libdir' + export_dynamic_flag_spec='$wl-E' + else + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec='$wl-rpath,$libdir' + fi + else + ld_shlibs=no + fi + ;; + + os2*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + allow_undefined_flag=unsupported + shrext_cmds=.dll + archive_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + archive_expsym_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + prefix_cmds="$SED"~ + if test EXPORTS = "`$SED 1q $export_symbols`"; then + prefix_cmds="$prefix_cmds -e 1d"; + fi~ + prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ + cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + old_archive_From_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + enable_shared_with_static_runtimes=yes + ;; + + osf3*) + if test yes = "$GCC"; then + allow_undefined_flag=' $wl-expect_unresolved $wl\*' + archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + else + allow_undefined_flag=' -expect_unresolved \*' + archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + fi + archive_cmds_need_lc='no' + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + hardcode_libdir_separator=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test yes = "$GCC"; then + allow_undefined_flag=' $wl-expect_unresolved $wl\*' + archive_cmds='$CC -shared$allow_undefined_flag $pic_flag $libobjs $deplibs $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + else + allow_undefined_flag=' -expect_unresolved \*' + archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ + $CC -shared$allow_undefined_flag $wl-input $wl$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~$RM $lib.exp' + + # Both c and cxx compiler support -rpath directly + hardcode_libdir_flag_spec='-rpath $libdir' + fi + archive_cmds_need_lc='no' + hardcode_libdir_separator=: + ;; + + solaris*) + no_undefined_flag=' -z defs' + if test yes = "$GCC"; then + wlarc='$wl' + archive_cmds='$CC -shared $pic_flag $wl-z ${wl}text $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared $pic_flag $wl-z ${wl}text $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + else + case `$CC -V 2>&1` in + *"Compilers 5.0"*) + wlarc='' + archive_cmds='$LD -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $linker_flags' + archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $LD -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' + ;; + *) + wlarc='$wl' + archive_cmds='$CC -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + ;; + esac + fi + hardcode_libdir_flag_spec='-R$libdir' + hardcode_shlibpath_var=no + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands '-z linker_flag'. GCC discards it without '$wl', + # but is careful enough not to reorder. + # Supported since Solaris 2.6 (maybe 2.5.1?) + if test yes = "$GCC"; then + whole_archive_flag_spec='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' + else + whole_archive_flag_spec='-z allextract$convenience -z defaultextract' + fi + ;; + esac + link_all_deplibs=yes + ;; + + sunos4*) + if test sequent = "$host_vendor"; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + archive_cmds='$CC -G $wl-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + hardcode_libdir_flag_spec='-L$libdir' + hardcode_direct=yes + hardcode_minus_L=yes + hardcode_shlibpath_var=no + ;; + + sysv4) + case $host_vendor in + sni) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes # is this really true??? + ;; + siemens) + ## LD is ld it makes a PLAMLIB + ## CC just makes a GrossModule. + archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' + reload_cmds='$CC -r -o $output$reload_objs' + hardcode_direct=no + ;; + motorola) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=no #Motorola manual says yes, but my tests say they lie + ;; + esac + runpath_var='LD_RUN_PATH' + hardcode_shlibpath_var=no + ;; + + sysv4.3*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var=no + export_dynamic_flag_spec='-Bexport' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + ld_shlibs=yes + fi + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) + no_undefined_flag='$wl-z,text' + archive_cmds_need_lc=no + hardcode_shlibpath_var=no + runpath_var='LD_RUN_PATH' + + if test yes = "$GCC"; then + archive_cmds='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We CANNOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + no_undefined_flag='$wl-z,text' + allow_undefined_flag='$wl-z,nodefs' + archive_cmds_need_lc=no + hardcode_shlibpath_var=no + hardcode_libdir_flag_spec='$wl-R,$libdir' + hardcode_libdir_separator=':' + link_all_deplibs=yes + export_dynamic_flag_spec='$wl-Bexport' + runpath_var='LD_RUN_PATH' + + if test yes = "$GCC"; then + archive_cmds='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + uts4*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_shlibpath_var=no + ;; + + *) + ld_shlibs=no + ;; + esac + + if test sni = "$host_vendor"; then + case $host in + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + export_dynamic_flag_spec='$wl-Blargedynsym' + ;; + esac + fi + fi + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5 +printf "%s\n" "$ld_shlibs" >&6; } +test no = "$ld_shlibs" && can_build_shared=no + +with_gnu_ld=$with_gnu_ld + + + + + + + + + + + + + + + +# +# Do we need to explicitly link libc? +# +case "x$archive_cmds_need_lc" in +x|xyes) + # Assume -lc should be added + archive_cmds_need_lc=yes + + if test yes,yes = "$GCC,$enable_shared"; then + case $archive_cmds in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 +printf %s "checking whether -lc should be explicitly linked in... " >&6; } +if test ${lt_cv_archive_cmds_need_lc+y} +then : + printf %s "(cached) " >&6 +else $as_nop + $RM conftest* + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$lt_prog_compiler_wl + pic_flag=$lt_prog_compiler_pic + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$allow_undefined_flag + allow_undefined_flag= + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 + (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + then + lt_cv_archive_cmds_need_lc=no + else + lt_cv_archive_cmds_need_lc=yes + fi + allow_undefined_flag=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $RM conftest* + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5 +printf "%s\n" "$lt_cv_archive_cmds_need_lc" >&6; } + archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc + ;; + esac + fi + ;; +esac + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 +printf %s "checking dynamic linker characteristics... " >&6; } + +if test yes = "$GCC"; then + case $host_os in + darwin*) lt_awk_arg='/^libraries:/,/LR/' ;; + *) lt_awk_arg='/^libraries:/' ;; + esac + case $host_os in + mingw* | cegcc*) lt_sed_strip_eq='s|=\([A-Za-z]:\)|\1|g' ;; + *) lt_sed_strip_eq='s|=/|/|g' ;; + esac + lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` + case $lt_search_path_spec in + *\;*) + # if the path contains ";" then we assume it to be the separator + # otherwise default to the standard path separator (i.e. ":") - it is + # assumed that no part of a normal pathname contains ";" but that should + # okay in the real world where ";" in dirpaths is itself problematic. + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` + ;; + *) + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` + ;; + esac + # Ok, now we have the path, separated by spaces, we can step through it + # and add multilib dir if necessary... + lt_tmp_lt_search_path_spec= + lt_multi_os_dir=/`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` + # ...but if some path component already ends with the multilib dir we assume + # that all is fine and trust -print-search-dirs as is (GCC 4.2? or newer). + case "$lt_multi_os_dir; $lt_search_path_spec " in + "/; "* | "/.; "* | "/./; "* | *"$lt_multi_os_dir "* | *"$lt_multi_os_dir/ "*) + lt_multi_os_dir= + ;; + esac + for lt_sys_path in $lt_search_path_spec; do + if test -d "$lt_sys_path$lt_multi_os_dir"; then + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path$lt_multi_os_dir" + elif test -n "$lt_multi_os_dir"; then + test -d "$lt_sys_path" && \ + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" + fi + done + lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' +BEGIN {RS = " "; FS = "/|\n";} { + lt_foo = ""; + lt_count = 0; + for (lt_i = NF; lt_i > 0; lt_i--) { + if ($lt_i != "" && $lt_i != ".") { + if ($lt_i == "..") { + lt_count++; + } else { + if (lt_count == 0) { + lt_foo = "/" $lt_i lt_foo; + } else { + lt_count--; + } + } + } + } + if (lt_foo != "") { lt_freq[lt_foo]++; } + if (lt_freq[lt_foo] == 1) { print lt_foo; } +}'` + # AWK program above erroneously prepends '/' to C:/dos/paths + # for these hosts. + case $host_os in + mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ + $SED 's|/\([A-Za-z]:\)|\1|g'` ;; + esac + sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` +else + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +fi +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=.so +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + + + +case $host_os in +aix3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='$libname$release$shared_ext$major' + ;; + +aix[4-9]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test ia64 = "$host_cpu"; then + # AIX 5 supports IA64 + library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line '#! .'. This would cause the generated library to + # depend on '.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[01] | aix4.[01].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # Using Import Files as archive members, it is possible to support + # filename-based versioning of shared library archives on AIX. While + # this would work for both with and without runtime linking, it will + # prevent static linking of such archives. So we do filename-based + # shared library versioning with .so extension only, which is used + # when both runtime linking and shared linking is enabled. + # Unfortunately, runtime linking may impact performance, so we do + # not want this to be the default eventually. Also, we use the + # versioned .so libs for executables only if there is the -brtl + # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only. + # To allow for filename-based versioning support, we need to create + # libNAME.so.V as an archive file, containing: + # *) an Import File, referring to the versioned filename of the + # archive as well as the shared archive member, telling the + # bitwidth (32 or 64) of that shared object, and providing the + # list of exported symbols of that shared object, eventually + # decorated with the 'weak' keyword + # *) the shared object with the F_LOADONLY flag set, to really avoid + # it being seen by the linker. + # At run time we better use the real file rather than another symlink, + # but for link time we create the symlink libNAME.so -> libNAME.so.V + + case $with_aix_soname,$aix_use_runtimelinking in + # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + aix,yes) # traditional libtool + dynamic_linker='AIX unversionable lib.so' + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + ;; + aix,no) # traditional AIX only + dynamic_linker='AIX lib.a(lib.so.V)' + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='$libname$release.a $libname.a' + soname_spec='$libname$release$shared_ext$major' + ;; + svr4,*) # full svr4 only + dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o)" + library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' + # We do not specify a path in Import Files, so LIBPATH fires. + shlibpath_overrides_runpath=yes + ;; + *,yes) # both, prefer svr4 + dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o), lib.a(lib.so.V)" + library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' + # unpreferred sharedlib libNAME.a needs extra handling + postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"' + postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"' + # We do not specify a path in Import Files, so LIBPATH fires. + shlibpath_overrides_runpath=yes + ;; + *,no) # both, prefer aix + dynamic_linker="AIX lib.a(lib.so.V), lib.so.V($shared_archive_member_spec.o)" + library_names_spec='$libname$release.a $libname.a' + soname_spec='$libname$release$shared_ext$major' + # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling + postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)' + postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"' + ;; + esac + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + case $host_cpu in + powerpc) + # Since July 2007 AmigaOS4 officially supports .so libraries. + # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + ;; + m68k) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + esac + ;; + +beos*) + library_names_spec='$libname$shared_ext' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[45]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32* | cegcc*) + version_type=windows + shrext_cmds=.dll + need_version=no + need_lib_prefix=no + + case $GCC,$cc_basename in + yes,*) + # gcc + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo $libname | sed -e 's/^lib/cyg/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api" + ;; + mingw* | cegcc*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo $libname | sed -e 's/^lib/pw/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + ;; + esac + dynamic_linker='Win32 ld.exe' + ;; + + *,cl*) + # Native MSVC + libname_spec='$name' + soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + library_names_spec='$libname.dll.lib' + + case $build_os in + mingw*) + sys_lib_search_path_spec= + lt_save_ifs=$IFS + IFS=';' + for lt_path in $LIB + do + IFS=$lt_save_ifs + # Let DOS variable expansion print the short 8.3 style file name. + lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` + sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" + done + IFS=$lt_save_ifs + # Convert to MSYS style. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` + ;; + cygwin*) + # Convert to unix form, then to dos form, then back to unix form + # but this time dos style (no spaces!) so that the unix form looks + # like /cygdrive/c/PROGRA~1:/cygdr... + sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` + sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` + sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + ;; + *) + sys_lib_search_path_spec=$LIB + if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then + # It is most probably a Windows format PATH. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + # FIXME: find the short name or the path components, as spaces are + # common. (e.g. "Program Files" -> "PROGRA~1") + ;; + esac + + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + dynamic_linker='Win32 link.exe' + ;; + + *) + # Assume MSVC wrapper + library_names_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext $libname.lib' + dynamic_linker='Win32 ld.exe' + ;; + esac + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$major$shared_ext $libname$shared_ext' + soname_spec='$libname$release$major$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' + + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib" + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[23].*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2.*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[01]* | freebsdelf3.[01]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ + freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + *) # from 4.6 on, and DragonFly + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +haiku*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + dynamic_linker="$host_os runtime_loader" + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LIBRARY_PATH + shlibpath_overrides_runpath=no + sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + if test 32 = "$HPUX_IA64_MODE"; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + sys_lib_dlsearch_path_spec=/usr/lib/hpux32 + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + sys_lib_dlsearch_path_spec=/usr/lib/hpux64 + fi + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555, ... + postinstall_cmds='chmod 555 $lib' + # or fails outright, so override atomically: + install_override_mode=555 + ;; + +interix[3-9]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test yes = "$lt_cv_prog_gnu_ld"; then + version_type=linux # correct to gnu/linux during the next big refactor + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='$libname$release$shared_ext$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff" + sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +linux*android*) + version_type=none # Android doesn't support versioned libraries. + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext' + soname_spec='$libname$release$shared_ext' + finish_cmds= + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + dynamic_linker='Android linker' + # Don't embed -rpath directories since the linker doesn't support them. + hardcode_libdir_flag_spec='-L$libdir' + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + + # Some binutils ld are patched to set DT_RUNPATH + if test ${lt_cv_shlibpath_overrides_runpath+y} +then : + printf %s "(cached) " >&6 +else $as_nop + lt_cv_shlibpath_overrides_runpath=no + save_LDFLAGS=$LDFLAGS + save_libdir=$libdir + eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \ + LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\"" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null +then : + lt_cv_shlibpath_overrides_runpath=yes +fi +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$save_LDFLAGS + libdir=$save_libdir + +fi + + shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # Ideally, we could use ldconfig to report *all* directores which are + # searched for libraries, however this is still not possible. Aside from not + # being certain /sbin/ldconfig is available, command + # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64, + # even though it is searched at run-time. Try to do the best guess by + # appending ld.so.conf contents (and includes) to the search path. + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +*nto* | *qnx*) + version_type=qnx + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='ldqnx.so' + ;; + +openbsd* | bitrig*) + version_type=sunos + sys_lib_dlsearch_path_spec=/usr/lib + need_lib_prefix=no + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then + need_version=no + else + need_version=yes + fi + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +os2*) + libname_spec='$name' + version_type=windows + shrext_cmds=.dll + need_version=no + need_lib_prefix=no + # OS/2 can only load a DLL with a base name of 8 characters or less. + soname_spec='`test -n "$os2dllname" && libname="$os2dllname"; + v=$($ECHO $release$versuffix | tr -d .-); + n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _); + $ECHO $n$v`$shared_ext' + library_names_spec='${libname}_dll.$libext' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=BEGINLIBPATH + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='$libname$release$shared_ext$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + +rdos*) + dynamic_linker=no + ;; + +solaris*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test yes = "$with_gnu_ld"; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec; then + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext' + soname_spec='$libname$shared_ext.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=sco + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + if test yes = "$with_gnu_ld"; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + +tpf*) + # TPF is a cross-target only. Preferred cross-host = GNU/Linux. + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +uts4*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 +printf "%s\n" "$dynamic_linker" >&6; } +test no = "$dynamic_linker" && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test yes = "$GCC"; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then + sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec +fi + +if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then + sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec +fi + +# remember unaugmented sys_lib_dlsearch_path content for libtool script decls... +configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec + +# ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code +func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH" + +# to be used as default LT_SYS_LIBRARY_PATH value in generated libtool +configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 +printf %s "checking how to hardcode library paths into programs... " >&6; } +hardcode_action= +if test -n "$hardcode_libdir_flag_spec" || + test -n "$runpath_var" || + test yes = "$hardcode_automatic"; then + + # We can hardcode non-existent directories. + if test no != "$hardcode_direct" && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, )" && + test no != "$hardcode_minus_L"; then + # Linking always hardcodes the temporary library directory. + hardcode_action=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + hardcode_action=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + hardcode_action=unsupported +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5 +printf "%s\n" "$hardcode_action" >&6; } + +if test relink = "$hardcode_action" || + test yes = "$inherit_rpath"; then + # Fast installation is not supported + enable_fast_install=no +elif test yes = "$shlibpath_overrides_runpath" || + test no = "$enable_shared"; then + # Fast installation is not necessary + enable_fast_install=needless +fi + + + + + + + if test yes != "$enable_dlopen"; then + enable_dlopen=unknown + enable_dlopen_self=unknown + enable_dlopen_self_static=unknown +else + lt_cv_dlopen=no + lt_cv_dlopen_libs= + + case $host_os in + beos*) + lt_cv_dlopen=load_add_on + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ;; + + mingw* | pw32* | cegcc*) + lt_cv_dlopen=LoadLibrary + lt_cv_dlopen_libs= + ;; + + cygwin*) + lt_cv_dlopen=dlopen + lt_cv_dlopen_libs= + ;; + + darwin*) + # if libdl is installed we need to link against it + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 +printf %s "checking for dlopen in -ldl... " >&6; } +if test ${ac_cv_lib_dl_dlopen+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +char dlopen (); +int +main (void) +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_lib_dl_dlopen=yes +else $as_nop + ac_cv_lib_dl_dlopen=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 +printf "%s\n" "$ac_cv_lib_dl_dlopen" >&6; } +if test "x$ac_cv_lib_dl_dlopen" = xyes +then : + lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl +else $as_nop + + lt_cv_dlopen=dyld + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + +fi + + ;; + + tpf*) + # Don't try to run any link tests for TPF. We know it's impossible + # because TPF is a cross-compiler, and we know how we open DSOs. + lt_cv_dlopen=dlopen + lt_cv_dlopen_libs= + lt_cv_dlopen_self=no + ;; + + *) + ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load" +if test "x$ac_cv_func_shl_load" = xyes +then : + lt_cv_dlopen=shl_load +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 +printf %s "checking for shl_load in -ldld... " >&6; } +if test ${ac_cv_lib_dld_shl_load+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldld $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +char shl_load (); +int +main (void) +{ +return shl_load (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_lib_dld_shl_load=yes +else $as_nop + ac_cv_lib_dld_shl_load=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 +printf "%s\n" "$ac_cv_lib_dld_shl_load" >&6; } +if test "x$ac_cv_lib_dld_shl_load" = xyes +then : + lt_cv_dlopen=shl_load lt_cv_dlopen_libs=-ldld +else $as_nop + ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" +if test "x$ac_cv_func_dlopen" = xyes +then : + lt_cv_dlopen=dlopen +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 +printf %s "checking for dlopen in -ldl... " >&6; } +if test ${ac_cv_lib_dl_dlopen+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +char dlopen (); +int +main (void) +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_lib_dl_dlopen=yes +else $as_nop + ac_cv_lib_dl_dlopen=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 +printf "%s\n" "$ac_cv_lib_dl_dlopen" >&6; } +if test "x$ac_cv_lib_dl_dlopen" = xyes +then : + lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 +printf %s "checking for dlopen in -lsvld... " >&6; } +if test ${ac_cv_lib_svld_dlopen+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_check_lib_save_LIBS=$LIBS +LIBS="-lsvld $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +char dlopen (); +int +main (void) +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_lib_svld_dlopen=yes +else $as_nop + ac_cv_lib_svld_dlopen=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 +printf "%s\n" "$ac_cv_lib_svld_dlopen" >&6; } +if test "x$ac_cv_lib_svld_dlopen" = xyes +then : + lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-lsvld +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 +printf %s "checking for dld_link in -ldld... " >&6; } +if test ${ac_cv_lib_dld_dld_link+y} +then : + printf %s "(cached) " >&6 +else $as_nop + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldld $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +char dld_link (); +int +main (void) +{ +return dld_link (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO" +then : + ac_cv_lib_dld_dld_link=yes +else $as_nop + ac_cv_lib_dld_dld_link=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 +printf "%s\n" "$ac_cv_lib_dld_dld_link" >&6; } +if test "x$ac_cv_lib_dld_dld_link" = xyes +then : + lt_cv_dlopen=dld_link lt_cv_dlopen_libs=-ldld +fi + + +fi + + +fi + + +fi + + +fi + + +fi + + ;; + esac + + if test no = "$lt_cv_dlopen"; then + enable_dlopen=no + else + enable_dlopen=yes + fi + + case $lt_cv_dlopen in + dlopen) + save_CPPFLAGS=$CPPFLAGS + test yes = "$ac_cv_header_dlfcn_h" && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" + + save_LDFLAGS=$LDFLAGS + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" + + save_LIBS=$LIBS + LIBS="$lt_cv_dlopen_libs $LIBS" + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 +printf %s "checking whether a program can dlopen itself... " >&6; } +if test ${lt_cv_dlopen_self+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test yes = "$cross_compiling"; then : + lt_cv_dlopen_self=cross +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext <<_LT_EOF +#line $LINENO "configure" +#include "confdefs.h" + +#if HAVE_DLFCN_H +#include +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +/* When -fvisibility=hidden is used, assume the code has been annotated + correspondingly for the symbols needed. */ +#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) +int fnord () __attribute__((visibility("default"))); +#endif + +int fnord () { return 42; } +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else + { + if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + else puts (dlerror ()); + } + /* dlclose (self); */ + } + else + puts (dlerror ()); + + return status; +} +_LT_EOF + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 + (eval $ac_link) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s "conftest$ac_exeext" 2>/dev/null; then + (./conftest; exit; ) >&5 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; + x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; + x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;; + esac + else : + # compilation failed + lt_cv_dlopen_self=no + fi +fi +rm -fr conftest* + + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 +printf "%s\n" "$lt_cv_dlopen_self" >&6; } + + if test yes = "$lt_cv_dlopen_self"; then + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 +printf %s "checking whether a statically linked program can dlopen itself... " >&6; } +if test ${lt_cv_dlopen_self_static+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test yes = "$cross_compiling"; then : + lt_cv_dlopen_self_static=cross +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext <<_LT_EOF +#line $LINENO "configure" +#include "confdefs.h" + +#if HAVE_DLFCN_H +#include +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +/* When -fvisibility=hidden is used, assume the code has been annotated + correspondingly for the symbols needed. */ +#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) +int fnord () __attribute__((visibility("default"))); +#endif + +int fnord () { return 42; } +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else + { + if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + else puts (dlerror ()); + } + /* dlclose (self); */ + } + else + puts (dlerror ()); + + return status; +} +_LT_EOF + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 + (eval $ac_link) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s "conftest$ac_exeext" 2>/dev/null; then + (./conftest; exit; ) >&5 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; + x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; + x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;; + esac + else : + # compilation failed + lt_cv_dlopen_self_static=no + fi +fi +rm -fr conftest* + + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 +printf "%s\n" "$lt_cv_dlopen_self_static" >&6; } + fi + + CPPFLAGS=$save_CPPFLAGS + LDFLAGS=$save_LDFLAGS + LIBS=$save_LIBS + ;; + esac + + case $lt_cv_dlopen_self in + yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; + *) enable_dlopen_self=unknown ;; + esac + + case $lt_cv_dlopen_self_static in + yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; + *) enable_dlopen_self_static=unknown ;; + esac +fi + + + + + + + + + + + + + + + + + +striplib= +old_striplib= +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 +printf %s "checking whether stripping libraries is possible... " >&6; } +if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then + test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" + test -z "$striplib" && striplib="$STRIP --strip-unneeded" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } +else +# FIXME - insert some real tests, host_os isn't really good enough + case $host_os in + darwin*) + if test -n "$STRIP"; then + striplib="$STRIP -x" + old_striplib="$STRIP -S" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + fi + ;; + *) + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + ;; + esac +fi + + + + + + + + + + + + + # Report what library types will actually be built + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 +printf %s "checking if libtool supports shared libraries... " >&6; } + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 +printf "%s\n" "$can_build_shared" >&6; } + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 +printf %s "checking whether to build shared libraries... " >&6; } + test no = "$can_build_shared" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test yes = "$enable_shared" && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + + aix[4-9]*) + if test ia64 != "$host_cpu"; then + case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in + yes,aix,yes) ;; # shared object as lib.so file only + yes,svr4,*) ;; # shared object as lib.so archive member only + yes,*) enable_static=no ;; # shared object in lib.a archive as well + esac + fi + ;; + esac + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 +printf "%s\n" "$enable_shared" >&6; } + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 +printf %s "checking whether to build static libraries... " >&6; } + # Make sure either enable_shared or enable_static is yes. + test yes = "$enable_shared" || enable_static=yes + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 +printf "%s\n" "$enable_static" >&6; } + + + + +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +CC=$lt_save_CC + + if test -n "$CXX" && ( test no != "$CXX" && + ( (test g++ = "$CXX" && `g++ -v >/dev/null 2>&1` ) || + (test g++ != "$CXX"))); then + ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5 +printf %s "checking how to run the C++ preprocessor... " >&6; } +if test -z "$CXXCPP"; then + if test ${ac_cv_prog_CXXCPP+y} +then : + printf %s "(cached) " >&6 +else $as_nop + # Double quotes because $CXX needs to be expanded + for CXXCPP in "$CXX -E" cpp /lib/cpp + do + ac_preproc_ok=false +for ac_cxx_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +@%:@include + Syntax error +_ACEOF +if ac_fn_cxx_try_cpp "$LINENO" +then : + +else $as_nop + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +@%:@include +_ACEOF +if ac_fn_cxx_try_cpp "$LINENO" +then : + # Broken: success on invalid input. +continue +else $as_nop + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok +then : + break +fi + + done + ac_cv_prog_CXXCPP=$CXXCPP + +fi + CXXCPP=$ac_cv_prog_CXXCPP +else + ac_cv_prog_CXXCPP=$CXXCPP +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5 +printf "%s\n" "$CXXCPP" >&6; } +ac_preproc_ok=false +for ac_cxx_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +@%:@include + Syntax error +_ACEOF +if ac_fn_cxx_try_cpp "$LINENO" +then : + +else $as_nop + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +@%:@include +_ACEOF +if ac_fn_cxx_try_cpp "$LINENO" +then : + # Broken: success on invalid input. +continue +else $as_nop + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok +then : + +else $as_nop + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check +See \`config.log' for more details" "$LINENO" 5; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +else + _lt_caught_CXX_error=yes +fi + +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + +archive_cmds_need_lc_CXX=no +allow_undefined_flag_CXX= +always_export_symbols_CXX=no +archive_expsym_cmds_CXX= +compiler_needs_object_CXX=no +export_dynamic_flag_spec_CXX= +hardcode_direct_CXX=no +hardcode_direct_absolute_CXX=no +hardcode_libdir_flag_spec_CXX= +hardcode_libdir_separator_CXX= +hardcode_minus_L_CXX=no +hardcode_shlibpath_var_CXX=unsupported +hardcode_automatic_CXX=no +inherit_rpath_CXX=no +module_cmds_CXX= +module_expsym_cmds_CXX= +link_all_deplibs_CXX=unknown +old_archive_cmds_CXX=$old_archive_cmds +reload_flag_CXX=$reload_flag +reload_cmds_CXX=$reload_cmds +no_undefined_flag_CXX= +whole_archive_flag_spec_CXX= +enable_shared_with_static_runtimes_CXX=no + +# Source file extension for C++ test sources. +ac_ext=cpp + +# Object file extension for compiled C++ test sources. +objext=o +objext_CXX=$objext + +# No sense in running all these tests if we already determined that +# the CXX compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test yes != "$_lt_caught_CXX_error"; then + # Code to be used in simple compile tests + lt_simple_compile_test_code="int some_variable = 0;" + + # Code to be used in simple link tests + lt_simple_link_test_code='int main(int, char *[]) { return(0); }' + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + + + + + + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC + + + # save warnings/boilerplate of simple test code + ac_outfile=conftest.$ac_objext +echo "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$RM conftest* + + ac_outfile=conftest.$ac_objext +echo "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$RM -r conftest* + + + # Allow CC to be a program name with arguments. + lt_save_CC=$CC + lt_save_CFLAGS=$CFLAGS + lt_save_LD=$LD + lt_save_GCC=$GCC + GCC=$GXX + lt_save_with_gnu_ld=$with_gnu_ld + lt_save_path_LD=$lt_cv_path_LD + if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then + lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx + else + $as_unset lt_cv_prog_gnu_ld + fi + if test -n "${lt_cv_path_LDCXX+set}"; then + lt_cv_path_LD=$lt_cv_path_LDCXX + else + $as_unset lt_cv_path_LD + fi + test -z "${LDCXX+set}" || LD=$LDCXX + CC=${CXX-"c++"} + CFLAGS=$CXXFLAGS + compiler=$CC + compiler_CXX=$CC + func_cc_basename $compiler +cc_basename=$func_cc_basename_result + + + if test -n "$compiler"; then + # We don't want -fno-exception when compiling C++ code, so set the + # no_builtin_flag separately + if test yes = "$GXX"; then + lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin' + else + lt_prog_compiler_no_builtin_flag_CXX= + fi + + if test yes = "$GXX"; then + # Set up default GNU C++ configuration + + + +@%:@ Check whether --with-gnu-ld was given. +if test ${with_gnu_ld+y} +then : + withval=$with_gnu_ld; test no = "$withval" || with_gnu_ld=yes +else $as_nop + with_gnu_ld=no +fi + +ac_prog=ld +if test yes = "$GCC"; then + # Check if gcc -print-prog-name=ld gives a path. + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 +printf %s "checking for ld used by $CC... " >&6; } + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return, which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [\\/]* | ?:[\\/]*) + re_direlt='/[^/][^/]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` + while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do + ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` + done + test -z "$LD" && LD=$ac_prog + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test yes = "$with_gnu_ld"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 +printf %s "checking for GNU ld... " >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 +printf %s "checking for non-GNU ld... " >&6; } +fi +if test ${lt_cv_path_LD+y} +then : + printf %s "(cached) " >&6 +else $as_nop + if test -z "$LD"; then + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS=$lt_save_ifs + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD=$ac_dir/$ac_prog + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some variants of GNU ld only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 &5 +printf "%s\n" "$LD" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi +test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 +printf %s "checking if the linker ($LD) is GNU ld... " >&6; } +if test ${lt_cv_prog_gnu_ld+y} +then : + printf %s "(cached) " >&6 +else $as_nop + # I'd rather use --version here, but apparently some GNU lds only accept -v. +case `$LD -v 2>&1 &5 +printf "%s\n" "$lt_cv_prog_gnu_ld" >&6; } +with_gnu_ld=$lt_cv_prog_gnu_ld + + + + + + + + # Check if GNU C++ uses GNU ld as the underlying linker, since the + # archiving commands below assume that GNU ld is being used. + if test yes = "$with_gnu_ld"; then + archive_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + + hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir' + export_dynamic_flag_spec_CXX='$wl--export-dynamic' + + # If archive_cmds runs LD, not CC, wlarc should be empty + # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to + # investigate it a little bit more. (MM) + wlarc='$wl' + + # ancient GNU ld didn't support --whole-archive et. al. + if eval "`$CC -print-prog-name=ld` --help 2>&1" | + $GREP 'no-whole-archive' > /dev/null; then + whole_archive_flag_spec_CXX=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' + else + whole_archive_flag_spec_CXX= + fi + else + with_gnu_ld=no + wlarc= + + # A generic and very simple default shared library creation + # command for GNU C++ for the case where it uses the native + # linker, instead of GNU ld. If possible, this setting should + # overridden to take advantage of the native linker features on + # the platform it is being used on. + archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + fi + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + + else + GXX=no + with_gnu_ld=no + wlarc= + fi + + # PORTME: fill in a description of your system's C++ link characteristics + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +printf %s "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } + ld_shlibs_CXX=yes + case $host_os in + aix3*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + aix[4-9]*) + if test ia64 = "$host_cpu"; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag= + else + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # have runtime linking enabled, and use it for executables. + # For shared libraries, we enable/disable runtime linking + # depending on the kind of the shared library created - + # when "with_aix_soname,aix_use_runtimelinking" is: + # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables + # "aix,yes" lib.so shared, rtl:yes, for executables + # lib.a static archive + # "both,no" lib.so.V(shr.o) shared, rtl:yes + # lib.a(lib.so.V) shared, rtl:no, for executables + # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a(lib.so.V) shared, rtl:no + # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a static archive + case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) + for ld_flag in $LDFLAGS; do + case $ld_flag in + *-brtl*) + aix_use_runtimelinking=yes + break + ;; + esac + done + if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then + # With aix-soname=svr4, we create the lib.so.V shared archives only, + # so we don't have lib.a shared libs to link our executables. + # We have to force runtime linking in this case. + aix_use_runtimelinking=yes + LDFLAGS="$LDFLAGS -Wl,-brtl" + fi + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + archive_cmds_CXX='' + hardcode_direct_CXX=yes + hardcode_direct_absolute_CXX=yes + hardcode_libdir_separator_CXX=':' + link_all_deplibs_CXX=yes + file_list_spec_CXX='$wl-f,' + case $with_aix_soname,$aix_use_runtimelinking in + aix,*) ;; # no import file + svr4,* | *,yes) # use import file + # The Import File defines what to hardcode. + hardcode_direct_CXX=no + hardcode_direct_absolute_CXX=no + ;; + esac + + if test yes = "$GXX"; then + case $host_os in aix4.[012]|aix4.[012].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`$CC -print-prog-name=collect2` + if test -f "$collect2name" && + strings "$collect2name" | $GREP resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + hardcode_direct_CXX=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + hardcode_minus_L_CXX=yes + hardcode_libdir_flag_spec_CXX='-L$libdir' + hardcode_libdir_separator_CXX= + fi + esac + shared_flag='-shared' + if test yes = "$aix_use_runtimelinking"; then + shared_flag=$shared_flag' $wl-G' + fi + # Need to ensure runtime linking is disabled for the traditional + # shared library, or the linker may eventually find shared libraries + # /with/ Import File - we do not want to mix them. + shared_flag_aix='-shared' + shared_flag_svr4='-shared $wl-G' + else + # not using gcc + if test ia64 = "$host_cpu"; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test yes = "$aix_use_runtimelinking"; then + shared_flag='$wl-G' + else + shared_flag='$wl-bM:SRE' + fi + shared_flag_aix='$wl-bM:SRE' + shared_flag_svr4='$wl-G' + fi + fi + + export_dynamic_flag_spec_CXX='$wl-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to + # export. + always_export_symbols_CXX=yes + if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + # The "-G" linker flag allows undefined symbols. + no_undefined_flag_CXX='-bernotok' + # Determine the default libpath from the value encoded in an empty + # executable. + if test set = "${lt_cv_aix_libpath+set}"; then + aix_libpath=$lt_cv_aix_libpath +else + if test ${lt_cv_aix_libpath__CXX+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_link "$LINENO" +then : + + lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }' + lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$lt_cv_aix_libpath__CXX"; then + lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + if test -z "$lt_cv_aix_libpath__CXX"; then + lt_cv_aix_libpath__CXX=/usr/lib:/lib + fi + +fi + + aix_libpath=$lt_cv_aix_libpath__CXX +fi + + hardcode_libdir_flag_spec_CXX='$wl-blibpath:$libdir:'"$aix_libpath" + + archive_expsym_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag + else + if test ia64 = "$host_cpu"; then + hardcode_libdir_flag_spec_CXX='$wl-R $libdir:/usr/lib:/lib' + allow_undefined_flag_CXX="-z nodefs" + archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + if test set = "${lt_cv_aix_libpath+set}"; then + aix_libpath=$lt_cv_aix_libpath +else + if test ${lt_cv_aix_libpath__CXX+y} +then : + printf %s "(cached) " >&6 +else $as_nop + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_link "$LINENO" +then : + + lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }' + lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$lt_cv_aix_libpath__CXX"; then + lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + if test -z "$lt_cv_aix_libpath__CXX"; then + lt_cv_aix_libpath__CXX=/usr/lib:/lib + fi + +fi + + aix_libpath=$lt_cv_aix_libpath__CXX +fi + + hardcode_libdir_flag_spec_CXX='$wl-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + no_undefined_flag_CXX=' $wl-bernotok' + allow_undefined_flag_CXX=' $wl-berok' + if test yes = "$with_gnu_ld"; then + # We only use this code for GNU lds that support --whole-archive. + whole_archive_flag_spec_CXX='$wl--whole-archive$convenience $wl--no-whole-archive' + else + # Exported symbols can be pulled into shared objects from archives + whole_archive_flag_spec_CXX='$convenience' + fi + archive_cmds_need_lc_CXX=yes + archive_expsym_cmds_CXX='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' + # -brtl affects multiple linker settings, -berok does not and is overridden later + compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([, ]\\)%-berok\\1%g"`' + if test svr4 != "$with_aix_soname"; then + # This is similar to how AIX traditionally builds its shared + # libraries. Need -bnortl late, we may have -brtl in LDFLAGS. + archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' + fi + if test aix != "$with_aix_soname"; then + archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' + else + # used by -dlpreopen to get the symbols + archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$MV $output_objdir/$realname.d/$soname $output_objdir' + fi + archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$RM -r $output_objdir/$realname.d' + fi + fi + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + allow_undefined_flag_CXX=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + else + ld_shlibs_CXX=no + fi + ;; + + chorus*) + case $cc_basename in + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + cygwin* | mingw* | pw32* | cegcc*) + case $GXX,$cc_basename in + ,cl* | no,cl*) + # Native MSVC + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + hardcode_libdir_flag_spec_CXX=' ' + allow_undefined_flag_CXX=unsupported + always_export_symbols_CXX=yes + file_list_spec_CXX='@' + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=.dll + # FIXME: Setting linknames here is a bad hack. + archive_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' + archive_expsym_cmds_CXX='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then + cp "$export_symbols" "$output_objdir/$soname.def"; + echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; + else + $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; + fi~ + $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ + linknames=' + # The linker will not automatically build a static lib if we build a DLL. + # _LT_TAGVAR(old_archive_from_new_cmds, CXX)='true' + enable_shared_with_static_runtimes_CXX=yes + # Don't use ranlib + old_postinstall_cmds_CXX='chmod 644 $oldlib' + postlink_cmds_CXX='lt_outputfile="@OUTPUT@"~ + lt_tool_outputfile="@TOOL_OUTPUT@"~ + case $lt_outputfile in + *.exe|*.EXE) ;; + *) + lt_outputfile=$lt_outputfile.exe + lt_tool_outputfile=$lt_tool_outputfile.exe + ;; + esac~ + func_to_tool_file "$lt_outputfile"~ + if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then + $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; + $RM "$lt_outputfile.manifest"; + fi' + ;; + *) + # g++ + # _LT_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless, + # as there is no search path for DLLs. + hardcode_libdir_flag_spec_CXX='-L$libdir' + export_dynamic_flag_spec_CXX='$wl--export-all-symbols' + allow_undefined_flag_CXX=unsupported + always_export_symbols_CXX=no + enable_shared_with_static_runtimes_CXX=yes + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file, use it as + # is; otherwise, prepend EXPORTS... + archive_expsym_cmds_CXX='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + ld_shlibs_CXX=no + fi + ;; + esac + ;; + darwin* | rhapsody*) + + + archive_cmds_need_lc_CXX=no + hardcode_direct_CXX=no + hardcode_automatic_CXX=yes + hardcode_shlibpath_var_CXX=unsupported + if test yes = "$lt_cv_ld_force_load"; then + whole_archive_flag_spec_CXX='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' + + else + whole_archive_flag_spec_CXX='' + fi + link_all_deplibs_CXX=yes + allow_undefined_flag_CXX=$_lt_dar_allow_undefined + case $cc_basename in + ifort*|nagfor*) _lt_dar_can_shared=yes ;; + *) _lt_dar_can_shared=$GCC ;; + esac + if test yes = "$_lt_dar_can_shared"; then + output_verbose_link_cmd=func_echo_all + archive_cmds_CXX="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil" + module_cmds_CXX="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil" + archive_expsym_cmds_CXX="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil" + module_expsym_cmds_CXX="sed -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil" + if test yes != "$lt_cv_apple_cc_single_mod"; then + archive_cmds_CXX="\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dsymutil" + archive_expsym_cmds_CXX="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dar_export_syms$_lt_dsymutil" + fi + + else + ld_shlibs_CXX=no + fi + + ;; + + os2*) + hardcode_libdir_flag_spec_CXX='-L$libdir' + hardcode_minus_L_CXX=yes + allow_undefined_flag_CXX=unsupported + shrext_cmds=.dll + archive_cmds_CXX='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + archive_expsym_cmds_CXX='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + prefix_cmds="$SED"~ + if test EXPORTS = "`$SED 1q $export_symbols`"; then + prefix_cmds="$prefix_cmds -e 1d"; + fi~ + prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ + cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + old_archive_From_new_cmds_CXX='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + enable_shared_with_static_runtimes_CXX=yes + ;; + + dgux*) + case $cc_basename in + ec++*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + ghcx*) + # Green Hills C++ Compiler + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + freebsd2.*) + # C++ shared libraries reported to be fairly broken before + # switch to ELF + ld_shlibs_CXX=no + ;; + + freebsd-elf*) + archive_cmds_need_lc_CXX=no + ;; + + freebsd* | dragonfly*) + # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF + # conventions + ld_shlibs_CXX=yes + ;; + + haiku*) + archive_cmds_CXX='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + link_all_deplibs_CXX=yes + ;; + + hpux9*) + hardcode_libdir_flag_spec_CXX='$wl+b $wl$libdir' + hardcode_libdir_separator_CXX=: + export_dynamic_flag_spec_CXX='$wl-E' + hardcode_direct_CXX=yes + hardcode_minus_L_CXX=yes # Not in the search PATH, + # but as the default + # location of the library. + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + aCC*) + archive_cmds_CXX='$RM $output_objdir/$soname~$CC -b $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test yes = "$GXX"; then + archive_cmds_CXX='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' + else + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + fi + ;; + esac + ;; + + hpux10*|hpux11*) + if test no = "$with_gnu_ld"; then + hardcode_libdir_flag_spec_CXX='$wl+b $wl$libdir' + hardcode_libdir_separator_CXX=: + + case $host_cpu in + hppa*64*|ia64*) + ;; + *) + export_dynamic_flag_spec_CXX='$wl-E' + ;; + esac + fi + case $host_cpu in + hppa*64*|ia64*) + hardcode_direct_CXX=no + hardcode_shlibpath_var_CXX=no + ;; + *) + hardcode_direct_CXX=yes + hardcode_direct_absolute_CXX=yes + hardcode_minus_L_CXX=yes # Not in the search PATH, + # but as the default + # location of the library. + ;; + esac + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + aCC*) + case $host_cpu in + hppa*64*) + archive_cmds_CXX='$CC -b $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + archive_cmds_CXX='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + archive_cmds_CXX='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test yes = "$GXX"; then + if test no = "$with_gnu_ld"; then + case $host_cpu in + hppa*64*) + archive_cmds_CXX='$CC -shared -nostdlib -fPIC $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + archive_cmds_CXX='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + archive_cmds_CXX='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + fi + else + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + fi + ;; + esac + ;; + + interix[3-9]*) + hardcode_direct_CXX=no + hardcode_shlibpath_var_CXX=no + hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir' + export_dynamic_flag_spec_CXX='$wl-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + archive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + archive_expsym_cmds_CXX='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + irix5* | irix6*) + case $cc_basename in + CC*) + # SGI C++ + archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + + # Archives containing C++ object files must be created using + # "CC -ar", where "CC" is the IRIX C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs' + ;; + *) + if test yes = "$GXX"; then + if test no = "$with_gnu_ld"; then + archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + else + archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` -o $lib' + fi + fi + link_all_deplibs_CXX=yes + ;; + esac + hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir' + hardcode_libdir_separator_CXX=: + inherit_rpath_CXX=yes + ;; + + linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib $wl-retain-symbols-file,$export_symbols; mv \$templib $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + + hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir' + export_dynamic_flag_spec_CXX='$wl--export-dynamic' + + # Archives containing C++ object files must be created using + # "CC -Bstatic", where "CC" is the KAI C++ compiler. + old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' + ;; + icpc* | ecpc* ) + # Intel C++ + with_gnu_ld=yes + # version 8.0 and above of icpc choke on multiply defined symbols + # if we add $predep_objects and $postdep_objects, however 7.1 and + # earlier do not add the objects themselves. + case `$CC -V 2>&1` in + *"Version 7."*) + archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + ;; + *) # Version 8.0 or newer + tmp_idyn= + case $host_cpu in + ia64*) tmp_idyn=' -i_dynamic';; + esac + archive_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + ;; + esac + archive_cmds_need_lc_CXX=no + hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir' + export_dynamic_flag_spec_CXX='$wl--export-dynamic' + whole_archive_flag_spec_CXX='$wl--whole-archive$convenience $wl--no-whole-archive' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler + case `$CC -V` in + *pgCC\ [1-5].* | *pgcpp\ [1-5].*) + prelink_cmds_CXX='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ + compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' + old_archive_cmds_CXX='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ + $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ + $RANLIB $oldlib' + archive_cmds_CXX='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ + $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ + $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + ;; + *) # Version 6 and above use weak symbols + archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + ;; + esac + + hardcode_libdir_flag_spec_CXX='$wl--rpath $wl$libdir' + export_dynamic_flag_spec_CXX='$wl--export-dynamic' + whole_archive_flag_spec_CXX='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + ;; + cxx*) + # Compaq C++ + archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib $wl-retain-symbols-file $wl$export_symbols' + + runpath_var=LD_RUN_PATH + hardcode_libdir_flag_spec_CXX='-rpath $libdir' + hardcode_libdir_separator_CXX=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' + ;; + xl* | mpixl* | bgxl*) + # IBM XL 8.0 on PPC, with GNU ld + hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir' + export_dynamic_flag_spec_CXX='$wl--export-dynamic' + archive_cmds_CXX='$CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + if test yes = "$supports_anon_versioning"; then + archive_expsym_cmds_CXX='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' + fi + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + no_undefined_flag_CXX=' -zdefs' + archive_cmds_CXX='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + archive_expsym_cmds_CXX='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file $wl$export_symbols' + hardcode_libdir_flag_spec_CXX='-R$libdir' + whole_archive_flag_spec_CXX='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + compiler_needs_object_CXX=yes + + # Not sure whether something based on + # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 + # would be better. + output_verbose_link_cmd='func_echo_all' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' + ;; + esac + ;; + esac + ;; + + lynxos*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + + m88k*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + + mvs*) + case $cc_basename in + cxx*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + archive_cmds_CXX='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' + wlarc= + hardcode_libdir_flag_spec_CXX='-R$libdir' + hardcode_direct_CXX=yes + hardcode_shlibpath_var_CXX=no + fi + # Workaround some broken pre-1.5 toolchains + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' + ;; + + *nto* | *qnx*) + ld_shlibs_CXX=yes + ;; + + openbsd* | bitrig*) + if test -f /usr/libexec/ld.so; then + hardcode_direct_CXX=yes + hardcode_shlibpath_var_CXX=no + hardcode_direct_absolute_CXX=yes + archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir' + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`"; then + archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file,$export_symbols -o $lib' + export_dynamic_flag_spec_CXX='$wl-E' + whole_archive_flag_spec_CXX=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' + fi + output_verbose_link_cmd=func_echo_all + else + ld_shlibs_CXX=no + fi + ;; + + osf3* | osf4* | osf5*) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + + hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir' + hardcode_libdir_separator_CXX=: + + # Archives containing C++ object files must be created using + # the KAI C++ compiler. + case $host in + osf3*) old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;; + *) old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' ;; + esac + ;; + RCC*) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + cxx*) + case $host in + osf3*) + allow_undefined_flag_CXX=' $wl-expect_unresolved $wl\*' + archive_cmds_CXX='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $soname `test -n "$verstring" && func_echo_all "$wl-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir' + ;; + *) + allow_undefined_flag_CXX=' -expect_unresolved \*' + archive_cmds_CXX='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ + echo "-hidden">> $lib.exp~ + $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname $wl-input $wl$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~ + $RM $lib.exp' + hardcode_libdir_flag_spec_CXX='-rpath $libdir' + ;; + esac + + hardcode_libdir_separator_CXX=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test yes,no = "$GXX,$with_gnu_ld"; then + allow_undefined_flag_CXX=' $wl-expect_unresolved $wl\*' + case $host in + osf3*) + archive_cmds_CXX='$CC -shared -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + ;; + *) + archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + ;; + esac + + hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir' + hardcode_libdir_separator_CXX=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + + else + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + fi + ;; + esac + ;; + + psos*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + lcc*) + # Lucid + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + solaris*) + case $cc_basename in + CC* | sunCC*) + # Sun C++ 4.2, 5.x and Centerline C++ + archive_cmds_need_lc_CXX=yes + no_undefined_flag_CXX=' -zdefs' + archive_cmds_CXX='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G$allow_undefined_flag $wl-M $wl$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + hardcode_libdir_flag_spec_CXX='-R$libdir' + hardcode_shlibpath_var_CXX=no + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands '-z linker_flag'. + # Supported since Solaris 2.6 (maybe 2.5.1?) + whole_archive_flag_spec_CXX='-z allextract$convenience -z defaultextract' + ;; + esac + link_all_deplibs_CXX=yes + + output_verbose_link_cmd='func_echo_all' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' + ;; + gcx*) + # Green Hills C++ Compiler + archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' + + # The C++ compiler must be used to create the archive. + old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs' + ;; + *) + # GNU C++ compiler with Solaris linker + if test yes,no = "$GXX,$with_gnu_ld"; then + no_undefined_flag_CXX=' $wl-z ${wl}defs' + if $CC --version | $GREP -v '^2\.7' > /dev/null; then + archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' + archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared $pic_flag -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + else + # g++ 2.7 appears to require '-G' NOT '-shared' on this + # platform. + archive_cmds_CXX='$CC -G -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' + archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + fi + + hardcode_libdir_flag_spec_CXX='$wl-R $wl$libdir' + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) + whole_archive_flag_spec_CXX='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' + ;; + esac + fi + ;; + esac + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) + no_undefined_flag_CXX='$wl-z,text' + archive_cmds_need_lc_CXX=no + hardcode_shlibpath_var_CXX=no + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + archive_cmds_CXX='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_CXX='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds_CXX='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_CXX='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We CANNOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + no_undefined_flag_CXX='$wl-z,text' + allow_undefined_flag_CXX='$wl-z,nodefs' + archive_cmds_need_lc_CXX=no + hardcode_shlibpath_var_CXX=no + hardcode_libdir_flag_spec_CXX='$wl-R,$libdir' + hardcode_libdir_separator_CXX=':' + link_all_deplibs_CXX=yes + export_dynamic_flag_spec_CXX='$wl-Bexport' + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + archive_cmds_CXX='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_CXX='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + old_archive_cmds_CXX='$CC -Tprelink_objects $oldobjs~ + '"$old_archive_cmds_CXX" + reload_cmds_CXX='$CC -Tprelink_objects $reload_objs~ + '"$reload_cmds_CXX" + ;; + *) + archive_cmds_CXX='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_CXX='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + vxworks*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 +printf "%s\n" "$ld_shlibs_CXX" >&6; } + test no = "$ld_shlibs_CXX" && can_build_shared=no + + GCC_CXX=$GXX + LD_CXX=$LD + + ## CAVEAT EMPTOR: + ## There is no encapsulation within the following macros, do not change + ## the running order or otherwise move them around unless you know exactly + ## what you are doing... + # Dependencies to place before and after the object being linked: +predep_objects_CXX= +postdep_objects_CXX= +predeps_CXX= +postdeps_CXX= +compiler_lib_search_path_CXX= + +cat > conftest.$ac_ext <<_LT_EOF +class Foo +{ +public: + Foo (void) { a = 0; } +private: + int a; +}; +_LT_EOF + + +_lt_libdeps_save_CFLAGS=$CFLAGS +case "$CC $CFLAGS " in #( +*\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; +*\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; +*\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; +esac + +if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + # Parse the compiler output and extract the necessary + # objects, libraries and library flags. + + # Sentinel used to keep track of whether or not we are before + # the conftest object file. + pre_test_object_deps_done=no + + for p in `eval "$output_verbose_link_cmd"`; do + case $prev$p in + + -L* | -R* | -l*) + # Some compilers place space between "-{L,R}" and the path. + # Remove the space. + if test x-L = "$p" || + test x-R = "$p"; then + prev=$p + continue + fi + + # Expand the sysroot to ease extracting the directories later. + if test -z "$prev"; then + case $p in + -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; + -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; + -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; + esac + fi + case $p in + =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; + esac + if test no = "$pre_test_object_deps_done"; then + case $prev in + -L | -R) + # Internal compiler library paths should come after those + # provided the user. The postdeps already come after the + # user supplied libs so there is no need to process them. + if test -z "$compiler_lib_search_path_CXX"; then + compiler_lib_search_path_CXX=$prev$p + else + compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} $prev$p" + fi + ;; + # The "-l" case would never come before the object being + # linked, so don't bother handling this case. + esac + else + if test -z "$postdeps_CXX"; then + postdeps_CXX=$prev$p + else + postdeps_CXX="${postdeps_CXX} $prev$p" + fi + fi + prev= + ;; + + *.lto.$objext) ;; # Ignore GCC LTO objects + *.$objext) + # This assumes that the test object file only shows up + # once in the compiler output. + if test "$p" = "conftest.$objext"; then + pre_test_object_deps_done=yes + continue + fi + + if test no = "$pre_test_object_deps_done"; then + if test -z "$predep_objects_CXX"; then + predep_objects_CXX=$p + else + predep_objects_CXX="$predep_objects_CXX $p" + fi + else + if test -z "$postdep_objects_CXX"; then + postdep_objects_CXX=$p + else + postdep_objects_CXX="$postdep_objects_CXX $p" + fi + fi + ;; + + *) ;; # Ignore the rest. + + esac + done + + # Clean up. + rm -f a.out a.exe +else + echo "libtool.m4: error: problem compiling CXX test program" +fi + +$RM -f confest.$objext +CFLAGS=$_lt_libdeps_save_CFLAGS + +# PORTME: override above test on systems where it is broken +case $host_os in +interix[3-9]*) + # Interix 3.5 installs completely hosed .la files for C++, so rather than + # hack all around it, let's just trust "g++" to DTRT. + predep_objects_CXX= + postdep_objects_CXX= + postdeps_CXX= + ;; +esac + + +case " $postdeps_CXX " in +*" -lc "*) archive_cmds_need_lc_CXX=no ;; +esac + compiler_lib_search_dirs_CXX= +if test -n "${compiler_lib_search_path_CXX}"; then + compiler_lib_search_dirs_CXX=`echo " ${compiler_lib_search_path_CXX}" | $SED -e 's! -L! !g' -e 's!^ !!'` +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + lt_prog_compiler_wl_CXX= +lt_prog_compiler_pic_CXX= +lt_prog_compiler_static_CXX= + + + # C++ specific cases for pic, static, wl, etc. + if test yes = "$GXX"; then + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static_CXX='-Bstatic' + fi + lt_prog_compiler_pic_CXX='-fPIC' + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + lt_prog_compiler_pic_CXX='-fPIC' + ;; + m68k) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the '-m68020' flag to GCC prevents building anything better, + # like '-m68040'. + lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + mingw* | cygwin* | os2* | pw32* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + lt_prog_compiler_pic_CXX='-DDLL_EXPORT' + case $host_os in + os2*) + lt_prog_compiler_static_CXX='$wl-static' + ;; + esac + ;; + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic_CXX='-fno-common' + ;; + *djgpp*) + # DJGPP does not support shared libraries at all + lt_prog_compiler_pic_CXX= + ;; + haiku*) + # PIC is the default for Haiku. + # The "-static" flag exists, but is broken. + lt_prog_compiler_static_CXX= + ;; + interix[3-9]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic_CXX=-Kconform_pic + fi + ;; + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + ;; + *) + lt_prog_compiler_pic_CXX='-fPIC' + ;; + esac + ;; + *qnx* | *nto*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic_CXX='-fPIC -shared' + ;; + *) + lt_prog_compiler_pic_CXX='-fPIC' + ;; + esac + else + case $host_os in + aix[4-9]*) + # All AIX code is PIC. + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static_CXX='-Bstatic' + else + lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp' + fi + ;; + chorus*) + case $cc_basename in + cxch68*) + # Green Hills C++ Compiler + # _LT_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" + ;; + esac + ;; + mingw* | cygwin* | os2* | pw32* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_prog_compiler_pic_CXX='-DDLL_EXPORT' + ;; + dgux*) + case $cc_basename in + ec++*) + lt_prog_compiler_pic_CXX='-KPIC' + ;; + ghcx*) + # Green Hills C++ Compiler + lt_prog_compiler_pic_CXX='-pic' + ;; + *) + ;; + esac + ;; + freebsd* | dragonfly*) + # FreeBSD uses GNU C++ + ;; + hpux9* | hpux10* | hpux11*) + case $cc_basename in + CC*) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='$wl-a ${wl}archive' + if test ia64 != "$host_cpu"; then + lt_prog_compiler_pic_CXX='+Z' + fi + ;; + aCC*) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='$wl-a ${wl}archive' + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic_CXX='+Z' + ;; + esac + ;; + *) + ;; + esac + ;; + interix*) + # This is c89, which is MS Visual C++ (no shared libs) + # Anyone wants to do a port? + ;; + irix5* | irix6* | nonstopux*) + case $cc_basename in + CC*) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='-non_shared' + # CC pic flag -KPIC is the default. + ;; + *) + ;; + esac + ;; + linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + case $cc_basename in + KCC*) + # KAI C++ Compiler + lt_prog_compiler_wl_CXX='--backend -Wl,' + lt_prog_compiler_pic_CXX='-fPIC' + ;; + ecpc* ) + # old Intel C++ for x86_64, which still supported -KPIC. + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-static' + ;; + icpc* ) + # Intel C++, used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-fPIC' + lt_prog_compiler_static_CXX='-static' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-fpic' + lt_prog_compiler_static_CXX='-Bstatic' + ;; + cxx*) + # Compaq C++ + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + lt_prog_compiler_pic_CXX= + lt_prog_compiler_static_CXX='-non_shared' + ;; + xlc* | xlC* | bgxl[cC]* | mpixl[cC]*) + # IBM XL 8.0, 9.0 on PPC and BlueGene + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-qpic' + lt_prog_compiler_static_CXX='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-Bstatic' + lt_prog_compiler_wl_CXX='-Qoption ld ' + ;; + esac + ;; + esac + ;; + lynxos*) + ;; + m88k*) + ;; + mvs*) + case $cc_basename in + cxx*) + lt_prog_compiler_pic_CXX='-W c,exportall' + ;; + *) + ;; + esac + ;; + netbsd*) + ;; + *qnx* | *nto*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic_CXX='-fPIC -shared' + ;; + osf3* | osf4* | osf5*) + case $cc_basename in + KCC*) + lt_prog_compiler_wl_CXX='--backend -Wl,' + ;; + RCC*) + # Rational C++ 2.4.1 + lt_prog_compiler_pic_CXX='-pic' + ;; + cxx*) + # Digital/Compaq C++ + lt_prog_compiler_wl_CXX='-Wl,' + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + lt_prog_compiler_pic_CXX= + lt_prog_compiler_static_CXX='-non_shared' + ;; + *) + ;; + esac + ;; + psos*) + ;; + solaris*) + case $cc_basename in + CC* | sunCC*) + # Sun C++ 4.2, 5.x and Centerline C++ + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-Bstatic' + lt_prog_compiler_wl_CXX='-Qoption ld ' + ;; + gcx*) + # Green Hills C++ Compiler + lt_prog_compiler_pic_CXX='-PIC' + ;; + *) + ;; + esac + ;; + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + lt_prog_compiler_pic_CXX='-pic' + lt_prog_compiler_static_CXX='-Bstatic' + ;; + lcc*) + # Lucid + lt_prog_compiler_pic_CXX='-pic' + ;; + *) + ;; + esac + ;; + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + case $cc_basename in + CC*) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-Bstatic' + ;; + esac + ;; + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + lt_prog_compiler_pic_CXX='-KPIC' + ;; + *) + ;; + esac + ;; + vxworks*) + ;; + *) + lt_prog_compiler_can_build_shared_CXX=no + ;; + esac + fi + +case $host_os in + # For platforms that do not support PIC, -DPIC is meaningless: + *djgpp*) + lt_prog_compiler_pic_CXX= + ;; + *) + lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX@&t@ -DPIC" + ;; +esac + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 +printf %s "checking for $compiler option to produce PIC... " >&6; } +if test ${lt_cv_prog_compiler_pic_CXX+y} +then : + printf %s "(cached) " >&6 +else $as_nop + lt_cv_prog_compiler_pic_CXX=$lt_prog_compiler_pic_CXX +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_CXX" >&5 +printf "%s\n" "$lt_cv_prog_compiler_pic_CXX" >&6; } +lt_prog_compiler_pic_CXX=$lt_cv_prog_compiler_pic_CXX + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$lt_prog_compiler_pic_CXX"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5 +printf %s "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... " >&6; } +if test ${lt_cv_prog_compiler_pic_works_CXX+y} +then : + printf %s "(cached) " >&6 +else $as_nop + lt_cv_prog_compiler_pic_works_CXX=no + ac_outfile=conftest.$ac_objext + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$lt_prog_compiler_pic_CXX@&t@ -DPIC" ## exclude from sc_useless_quotes_in_assignment + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_pic_works_CXX=yes + fi + fi + $RM conftest* + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_CXX" >&5 +printf "%s\n" "$lt_cv_prog_compiler_pic_works_CXX" >&6; } + +if test yes = "$lt_cv_prog_compiler_pic_works_CXX"; then + case $lt_prog_compiler_pic_CXX in + "" | " "*) ;; + *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;; + esac +else + lt_prog_compiler_pic_CXX= + lt_prog_compiler_can_build_shared_CXX=no +fi + +fi + + + + + +# +# Check to make sure the static flag actually works. +# +wl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\"$lt_prog_compiler_static_CXX\" +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 +printf %s "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } +if test ${lt_cv_prog_compiler_static_works_CXX+y} +then : + printf %s "(cached) " >&6 +else $as_nop + lt_cv_prog_compiler_static_works_CXX=no + save_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS $lt_tmp_static_flag" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&5 + $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_static_works_CXX=yes + fi + else + lt_cv_prog_compiler_static_works_CXX=yes + fi + fi + $RM -r conftest* + LDFLAGS=$save_LDFLAGS + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_CXX" >&5 +printf "%s\n" "$lt_cv_prog_compiler_static_works_CXX" >&6; } + +if test yes = "$lt_cv_prog_compiler_static_works_CXX"; then + : +else + lt_prog_compiler_static_CXX= +fi + + + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +printf %s "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if test ${lt_cv_prog_compiler_c_o_CXX+y} +then : + printf %s "(cached) " >&6 +else $as_nop + lt_cv_prog_compiler_c_o_CXX=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o_CXX=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 +printf "%s\n" "$lt_cv_prog_compiler_c_o_CXX" >&6; } + + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +printf %s "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if test ${lt_cv_prog_compiler_c_o_CXX+y} +then : + printf %s "(cached) " >&6 +else $as_nop + lt_cv_prog_compiler_c_o_CXX=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o_CXX=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 +printf "%s\n" "$lt_cv_prog_compiler_c_o_CXX" >&6; } + + + + +hard_links=nottested +if test no = "$lt_cv_prog_compiler_c_o_CXX" && test no != "$need_locks"; then + # do not overwrite the value of need_locks provided by the user + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 +printf %s "checking if we can lock with hard links... " >&6; } + hard_links=yes + $RM conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 +printf "%s\n" "$hard_links" >&6; } + if test no = "$hard_links"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&5 +printf "%s\n" "$as_me: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&2;} + need_locks=warn + fi +else + need_locks=no +fi + + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +printf %s "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } + + export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + exclude_expsyms_CXX='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' + case $host_os in + aix[4-9]*) + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to GNU nm, but means don't demangle to AIX nm. + # Without the "-l" option, or with the "-B" option, AIX nm treats + # weak defined symbols like other global defined symbols, whereas + # GNU nm marks them as "W". + # While the 'weak' keyword is ignored in the Export File, we need + # it in the Import File for the 'aix-soname' feature, so we have + # to replace the "-B" option with "-P" for AIX nm. + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' + else + export_symbols_cmds_CXX='`func_echo_all $NM | $SED -e '\''s/B\([^B]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && (substr(\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' + fi + ;; + pw32*) + export_symbols_cmds_CXX=$ltdll_cmds + ;; + cygwin* | mingw* | cegcc*) + case $cc_basename in + cl*) + exclude_expsyms_CXX='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' + ;; + *) + export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' + exclude_expsyms_CXX='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' + ;; + esac + ;; + *) + export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + ;; + esac + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 +printf "%s\n" "$ld_shlibs_CXX" >&6; } +test no = "$ld_shlibs_CXX" && can_build_shared=no + +with_gnu_ld_CXX=$with_gnu_ld + + + + + + +# +# Do we need to explicitly link libc? +# +case "x$archive_cmds_need_lc_CXX" in +x|xyes) + # Assume -lc should be added + archive_cmds_need_lc_CXX=yes + + if test yes,yes = "$GCC,$enable_shared"; then + case $archive_cmds_CXX in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 +printf %s "checking whether -lc should be explicitly linked in... " >&6; } +if test ${lt_cv_archive_cmds_need_lc_CXX+y} +then : + printf %s "(cached) " >&6 +else $as_nop + $RM conftest* + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$lt_prog_compiler_wl_CXX + pic_flag=$lt_prog_compiler_pic_CXX + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$allow_undefined_flag_CXX + allow_undefined_flag_CXX= + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 + (eval $archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 + ac_status=$? + printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + then + lt_cv_archive_cmds_need_lc_CXX=no + else + lt_cv_archive_cmds_need_lc_CXX=yes + fi + allow_undefined_flag_CXX=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $RM conftest* + +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc_CXX" >&5 +printf "%s\n" "$lt_cv_archive_cmds_need_lc_CXX" >&6; } + archive_cmds_need_lc_CXX=$lt_cv_archive_cmds_need_lc_CXX + ;; + esac + fi + ;; +esac + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 +printf %s "checking dynamic linker characteristics... " >&6; } + +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=.so +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + + + +case $host_os in +aix3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='$libname$release$shared_ext$major' + ;; + +aix[4-9]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test ia64 = "$host_cpu"; then + # AIX 5 supports IA64 + library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line '#! .'. This would cause the generated library to + # depend on '.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[01] | aix4.[01].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # Using Import Files as archive members, it is possible to support + # filename-based versioning of shared library archives on AIX. While + # this would work for both with and without runtime linking, it will + # prevent static linking of such archives. So we do filename-based + # shared library versioning with .so extension only, which is used + # when both runtime linking and shared linking is enabled. + # Unfortunately, runtime linking may impact performance, so we do + # not want this to be the default eventually. Also, we use the + # versioned .so libs for executables only if there is the -brtl + # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only. + # To allow for filename-based versioning support, we need to create + # libNAME.so.V as an archive file, containing: + # *) an Import File, referring to the versioned filename of the + # archive as well as the shared archive member, telling the + # bitwidth (32 or 64) of that shared object, and providing the + # list of exported symbols of that shared object, eventually + # decorated with the 'weak' keyword + # *) the shared object with the F_LOADONLY flag set, to really avoid + # it being seen by the linker. + # At run time we better use the real file rather than another symlink, + # but for link time we create the symlink libNAME.so -> libNAME.so.V + + case $with_aix_soname,$aix_use_runtimelinking in + # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + aix,yes) # traditional libtool + dynamic_linker='AIX unversionable lib.so' + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + ;; + aix,no) # traditional AIX only + dynamic_linker='AIX lib.a(lib.so.V)' + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='$libname$release.a $libname.a' + soname_spec='$libname$release$shared_ext$major' + ;; + svr4,*) # full svr4 only + dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o)" + library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' + # We do not specify a path in Import Files, so LIBPATH fires. + shlibpath_overrides_runpath=yes + ;; + *,yes) # both, prefer svr4 + dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o), lib.a(lib.so.V)" + library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' + # unpreferred sharedlib libNAME.a needs extra handling + postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"' + postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"' + # We do not specify a path in Import Files, so LIBPATH fires. + shlibpath_overrides_runpath=yes + ;; + *,no) # both, prefer aix + dynamic_linker="AIX lib.a(lib.so.V), lib.so.V($shared_archive_member_spec.o)" + library_names_spec='$libname$release.a $libname.a' + soname_spec='$libname$release$shared_ext$major' + # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling + postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)' + postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"' + ;; + esac + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + case $host_cpu in + powerpc) + # Since July 2007 AmigaOS4 officially supports .so libraries. + # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + ;; + m68k) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + esac + ;; + +beos*) + library_names_spec='$libname$shared_ext' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[45]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32* | cegcc*) + version_type=windows + shrext_cmds=.dll + need_version=no + need_lib_prefix=no + + case $GCC,$cc_basename in + yes,*) + # gcc + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo $libname | sed -e 's/^lib/cyg/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + + ;; + mingw* | cegcc*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo $libname | sed -e 's/^lib/pw/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + ;; + esac + dynamic_linker='Win32 ld.exe' + ;; + + *,cl*) + # Native MSVC + libname_spec='$name' + soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + library_names_spec='$libname.dll.lib' + + case $build_os in + mingw*) + sys_lib_search_path_spec= + lt_save_ifs=$IFS + IFS=';' + for lt_path in $LIB + do + IFS=$lt_save_ifs + # Let DOS variable expansion print the short 8.3 style file name. + lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` + sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" + done + IFS=$lt_save_ifs + # Convert to MSYS style. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` + ;; + cygwin*) + # Convert to unix form, then to dos form, then back to unix form + # but this time dos style (no spaces!) so that the unix form looks + # like /cygdrive/c/PROGRA~1:/cygdr... + sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` + sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` + sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + ;; + *) + sys_lib_search_path_spec=$LIB + if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then + # It is most probably a Windows format PATH. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + # FIXME: find the short name or the path components, as spaces are + # common. (e.g. "Program Files" -> "PROGRA~1") + ;; + esac + + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + dynamic_linker='Win32 link.exe' + ;; + + *) + # Assume MSVC wrapper + library_names_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext $libname.lib' + dynamic_linker='Win32 ld.exe' + ;; + esac + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$major$shared_ext $libname$shared_ext' + soname_spec='$libname$release$major$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' + + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[23].*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2.*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[01]* | freebsdelf3.[01]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ + freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + *) # from 4.6 on, and DragonFly + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +haiku*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + dynamic_linker="$host_os runtime_loader" + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LIBRARY_PATH + shlibpath_overrides_runpath=no + sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + if test 32 = "$HPUX_IA64_MODE"; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + sys_lib_dlsearch_path_spec=/usr/lib/hpux32 + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + sys_lib_dlsearch_path_spec=/usr/lib/hpux64 + fi + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555, ... + postinstall_cmds='chmod 555 $lib' + # or fails outright, so override atomically: + install_override_mode=555 + ;; + +interix[3-9]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test yes = "$lt_cv_prog_gnu_ld"; then + version_type=linux # correct to gnu/linux during the next big refactor + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='$libname$release$shared_ext$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff" + sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +linux*android*) + version_type=none # Android doesn't support versioned libraries. + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext' + soname_spec='$libname$release$shared_ext' + finish_cmds= + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + dynamic_linker='Android linker' + # Don't embed -rpath directories since the linker doesn't support them. + hardcode_libdir_flag_spec_CXX='-L$libdir' + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + + # Some binutils ld are patched to set DT_RUNPATH + if test ${lt_cv_shlibpath_overrides_runpath+y} +then : + printf %s "(cached) " >&6 +else $as_nop + lt_cv_shlibpath_overrides_runpath=no + save_LDFLAGS=$LDFLAGS + save_libdir=$libdir + eval "libdir=/foo; wl=\"$lt_prog_compiler_wl_CXX\"; \ + LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec_CXX\"" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_link "$LINENO" +then : + if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null +then : + lt_cv_shlibpath_overrides_runpath=yes +fi +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$save_LDFLAGS + libdir=$save_libdir + +fi + + shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # Ideally, we could use ldconfig to report *all* directores which are + # searched for libraries, however this is still not possible. Aside from not + # being certain /sbin/ldconfig is available, command + # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64, + # even though it is searched at run-time. Try to do the best guess by + # appending ld.so.conf contents (and includes) to the search path. + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +*nto* | *qnx*) + version_type=qnx + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='ldqnx.so' + ;; + +openbsd* | bitrig*) + version_type=sunos + sys_lib_dlsearch_path_spec=/usr/lib + need_lib_prefix=no + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then + need_version=no + else + need_version=yes + fi + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +os2*) + libname_spec='$name' + version_type=windows + shrext_cmds=.dll + need_version=no + need_lib_prefix=no + # OS/2 can only load a DLL with a base name of 8 characters or less. + soname_spec='`test -n "$os2dllname" && libname="$os2dllname"; + v=$($ECHO $release$versuffix | tr -d .-); + n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _); + $ECHO $n$v`$shared_ext' + library_names_spec='${libname}_dll.$libext' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=BEGINLIBPATH + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='$libname$release$shared_ext$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + +rdos*) + dynamic_linker=no + ;; + +solaris*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test yes = "$with_gnu_ld"; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec; then + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext' + soname_spec='$libname$shared_ext.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=sco + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + if test yes = "$with_gnu_ld"; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + +tpf*) + # TPF is a cross-target only. Preferred cross-host = GNU/Linux. + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +uts4*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 +printf "%s\n" "$dynamic_linker" >&6; } +test no = "$dynamic_linker" && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test yes = "$GCC"; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then + sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec +fi + +if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then + sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec +fi + +# remember unaugmented sys_lib_dlsearch_path content for libtool script decls... +configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec + +# ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code +func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH" + +# to be used as default LT_SYS_LIBRARY_PATH value in generated libtool +configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 +printf %s "checking how to hardcode library paths into programs... " >&6; } +hardcode_action_CXX= +if test -n "$hardcode_libdir_flag_spec_CXX" || + test -n "$runpath_var_CXX" || + test yes = "$hardcode_automatic_CXX"; then + + # We can hardcode non-existent directories. + if test no != "$hardcode_direct_CXX" && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, CXX)" && + test no != "$hardcode_minus_L_CXX"; then + # Linking always hardcodes the temporary library directory. + hardcode_action_CXX=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + hardcode_action_CXX=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + hardcode_action_CXX=unsupported +fi +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_CXX" >&5 +printf "%s\n" "$hardcode_action_CXX" >&6; } + +if test relink = "$hardcode_action_CXX" || + test yes = "$inherit_rpath_CXX"; then + # Fast installation is not supported + enable_fast_install=no +elif test yes = "$shlibpath_overrides_runpath" || + test no = "$enable_shared"; then + # Fast installation is not necessary + enable_fast_install=needless +fi + + + + + + + + fi # test -n "$compiler" + + CC=$lt_save_CC + CFLAGS=$lt_save_CFLAGS + LDCXX=$LD + LD=$lt_save_LD + GCC=$lt_save_GCC + with_gnu_ld=$lt_save_with_gnu_ld + lt_cv_path_LDCXX=$lt_cv_path_LD + lt_cv_path_LD=$lt_save_path_LD + lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld + lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld +fi # test yes != "$_lt_caught_CXX_error" + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + + + + + + + + + + + + + + ac_config_commands="$ac_config_commands libtool" + + + + +# Only expand once: + + + +# Transfer these variables to the Makefile + + + + + +ac_config_files="$ac_config_files Makefile lib/Makefile include/Makefile bin/Makefile doc/Makefile portaudiocpp.pc" + +cat >confcache <<\_ACEOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs, see configure's option --config-cache. +# It is not useful on other systems. If it contains results you don't +# want to keep, you may remove or edit it. +# +# config.status only pays attention to the cache file if you give it +# the --recheck option to rerun configure. +# +# `ac_cv_env_foo' variables (set or unset) will be overridden when +# loading this file, other *unset* `ac_cv_foo' will be assigned the +# following values. + +_ACEOF + +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, we kill variables containing newlines. +# Ultrix sh set writes to stderr and can't be redirected directly, +# and sets the high bit in the cache file unless we assign to the vars. +( + for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + + (set) 2>&1 | + case $as_nl`(ac_space=' '; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + # `set' does not quote correctly, so add quotes: double-quote + # substitution turns \\\\ into \\, and sed turns \\ into \. + sed -n \ + "s/'/'\\\\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" + ;; #( + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) | + sed ' + /^ac_cv_env_/b end + t clear + :clear + s/^\([^=]*\)=\(.*[{}].*\)$/test ${\1+y} || &/ + t end + s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ + :end' >>confcache +if diff "$cache_file" confcache >/dev/null 2>&1; then :; else + if test -w "$cache_file"; then + if test "x$cache_file" != "x/dev/null"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 +printf "%s\n" "$as_me: updating cache $cache_file" >&6;} + if test ! -f "$cache_file" || test -h "$cache_file"; then + cat confcache >"$cache_file" + else + case $cache_file in #( + */* | ?:*) + mv -f confcache "$cache_file"$$ && + mv -f "$cache_file"$$ "$cache_file" ;; #( + *) + mv -f confcache "$cache_file" ;; + esac + fi + fi + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 +printf "%s\n" "$as_me: not updating unwritable cache $cache_file" >&6;} + fi +fi +rm -f confcache + +test "x$prefix" = xNONE && prefix=$ac_default_prefix +# Let make expand exec_prefix. +test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' + +# Transform confdefs.h into DEFS. +# Protect against shell expansion while executing Makefile rules. +# Protect against Makefile macro expansion. +# +# If the first sed substitution is executed (which looks for macros that +# take arguments), then branch to the quote section. Otherwise, +# look for a macro that doesn't take arguments. +ac_script=' +:mline +/\\$/{ + N + s,\\\n,, + b mline +} +t clear +:clear +s/^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\)/-D\1=\2/g +t quote +s/^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)/-D\1=\2/g +t quote +b any +:quote +s/[ `~#$^&*(){}\\|;'\''"<>?]/\\&/g +s/\[/\\&/g +s/\]/\\&/g +s/\$/$$/g +H +:any +${ + g + s/^\n// + s/\n/ /g + p +} +' +DEFS=`sed -n "$ac_script" confdefs.h` + + +ac_libobjs= +ac_ltlibobjs= +U= +for ac_i in : $LIB@&t@OBJS; do test "x$ac_i" = x: && continue + # 1. Remove the extension, and $U if already installed. + ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' + ac_i=`printf "%s\n" "$ac_i" | sed "$ac_script"` + # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR + # will be set to the directory where LIBOBJS objects are built. + as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" + as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' +done +LIB@&t@OBJS=$ac_libobjs + +LTLIBOBJS=$ac_ltlibobjs + + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 +printf %s "checking that generated files are newer than configure... " >&6; } + if test -n "$am_sleep_pid"; then + # Hide warnings about reused PIDs. + wait $am_sleep_pid 2>/dev/null + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: done" >&5 +printf "%s\n" "done" >&6; } + if test -n "$EXEEXT"; then + am__EXEEXT_TRUE= + am__EXEEXT_FALSE='#' +else + am__EXEEXT_TRUE='#' + am__EXEEXT_FALSE= +fi + +if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then + as_fn_error $? "conditional \"MAINTAINER_MODE\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then + as_fn_error $? "conditional \"AMDEP\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then + as_fn_error $? "conditional \"am__fastdepCC\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then + as_fn_error $? "conditional \"am__fastdepCXX\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi + +: "${CONFIG_STATUS=./config.status}" +ac_write_fail=0 +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files $CONFIG_STATUS" +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 +printf "%s\n" "$as_me: creating $CONFIG_STATUS" >&6;} +as_write_fail=0 +cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 +#! $SHELL +# Generated by $as_me. +# Run this file to recreate the current configuration. +# Compiler output produced by configure, useful for debugging +# configure, is in config.log if it exists. + +debug=false +ac_cs_recheck=false +ac_cs_silent=false + +SHELL=\${CONFIG_SHELL-$SHELL} +export SHELL +_ASEOF +cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +as_nop=: +if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 +then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else $as_nop + case `(set -o) 2>/dev/null` in @%:@( + *posix*) : + set -o posix ;; @%:@( + *) : + ;; +esac +fi + + + +# Reset variables that may have inherited troublesome values from +# the environment. + +# IFS needs to be set, to space, tab, and newline, in precisely that order. +# (If _AS_PATH_WALK were called with IFS unset, it would have the +# side effect of setting IFS to empty, thus disabling word splitting.) +# Quoting is to prevent editors from complaining about space-tab. +as_nl=' +' +export as_nl +IFS=" "" $as_nl" + +PS1='$ ' +PS2='> ' +PS4='+ ' + +# Ensure predictable behavior from utilities with locale-dependent output. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# We cannot yet rely on "unset" to work, but we need these variables +# to be unset--not just set to an empty or harmless value--now, to +# avoid bugs in old shells (e.g. pre-3.0 UWIN ksh). This construct +# also avoids known problems related to "unset" and subshell syntax +# in other old shells (e.g. bash 2.01 and pdksh 5.2.14). +for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH +do eval test \${$as_var+y} \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done + +# Ensure that fds 0, 1, and 2 are open. +if (exec 3>&0) 2>/dev/null; then :; else exec 0&1) 2>/dev/null; then :; else exec 1>/dev/null; fi +if (exec 3>&2) ; then :; else exec 2>/dev/null; fi + +# The user is always right. +if ${PATH_SEPARATOR+false} :; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# Find who we are. Look in the path if we contain no directory separator. +as_myself= +case $0 in @%:@(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + test -r "$as_dir$0" && as_myself=$as_dir$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + + + +@%:@ as_fn_error STATUS ERROR [LINENO LOG_FD] +@%:@ ---------------------------------------- +@%:@ Output "`basename @S|@0`: error: ERROR" to stderr. If LINENO and LOG_FD are +@%:@ provided, also output the error to LOG_FD, referencing LINENO. Then exit the +@%:@ script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + printf "%s\n" "$as_me: error: $2" >&2 + as_fn_exit $as_status +} @%:@ as_fn_error + + + +@%:@ as_fn_set_status STATUS +@%:@ ----------------------- +@%:@ Set @S|@? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} @%:@ as_fn_set_status + +@%:@ as_fn_exit STATUS +@%:@ ----------------- +@%:@ Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} @%:@ as_fn_exit + +@%:@ as_fn_unset VAR +@%:@ --------------- +@%:@ Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset + +@%:@ as_fn_append VAR VALUE +@%:@ ---------------------- +@%:@ Append the text in VALUE to the end of the definition contained in VAR. Take +@%:@ advantage of any shell optimizations that allow amortized linear growth over +@%:@ repeated appends, instead of the typical quadratic growth present in naive +@%:@ implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null +then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else $as_nop + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +@%:@ as_fn_arith ARG... +@%:@ ------------------ +@%:@ Perform arithmetic evaluation on the ARGs, and store the result in the +@%:@ global @S|@as_val. Take advantage of shells that can avoid forks. The arguments +@%:@ must be portable across @S|@(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null +then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else $as_nop + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +printf "%s\n" X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + + +# Determine whether it's possible to make 'echo' print without a newline. +# These variables are no longer used directly by Autoconf, but are AC_SUBSTed +# for compatibility with existing Makefiles. +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in @%:@((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +# For backward compatibility with old third-party macros, we provide +# the shell variables $as_echo and $as_echo_n. New code should use +# AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively. +as_@&t@echo='printf %s\n' +as_@&t@echo_n='printf %s' + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -pR'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -pR' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -pR' + fi +else + as_ln_s='cp -pR' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + + +@%:@ as_fn_mkdir_p +@%:@ ------------- +@%:@ Create "@S|@as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`printf "%s\n" "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +printf "%s\n" X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} @%:@ as_fn_mkdir_p +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + + +@%:@ as_fn_executable_p FILE +@%:@ ----------------------- +@%:@ Test if FILE is an executable regular file. +as_fn_executable_p () +{ + test -f "$1" && test -x "$1" +} @%:@ as_fn_executable_p +as_test_x='test -x' +as_executable_p=as_fn_executable_p + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +exec 6>&1 +## ----------------------------------- ## +## Main body of $CONFIG_STATUS script. ## +## ----------------------------------- ## +_ASEOF +test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# Save the log message, to keep $0 and so on meaningful, and to +# report actual input values of CONFIG_FILES etc. instead of their +# values after options handling. +ac_log=" +This file was extended by PortAudioCpp $as_me 12, which was +generated by GNU Autoconf 2.71. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES + CONFIG_HEADERS = $CONFIG_HEADERS + CONFIG_LINKS = $CONFIG_LINKS + CONFIG_COMMANDS = $CONFIG_COMMANDS + $ $0 $@ + +on `(hostname || uname -n) 2>/dev/null | sed 1q` +" + +_ACEOF + +case $ac_config_files in *" +"*) set x $ac_config_files; shift; ac_config_files=$*;; +esac + + + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# Files that config.status was made for. +config_files="$ac_config_files" +config_commands="$ac_config_commands" + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +ac_cs_usage="\ +\`$as_me' instantiates files and other configuration actions +from templates according to the current configuration. Unless the files +and actions are specified as TAGs, all are instantiated by default. + +Usage: $0 [OPTION]... [TAG]... + + -h, --help print this help, then exit + -V, --version print version number and configuration settings, then exit + --config print configuration, then exit + -q, --quiet, --silent + do not print progress messages + -d, --debug don't remove temporary files + --recheck update $as_me by reconfiguring in the same conditions + --file=FILE[:TEMPLATE] + instantiate the configuration file FILE + +Configuration files: +$config_files + +Configuration commands: +$config_commands + +Report bugs to the package provider." + +_ACEOF +ac_cs_config=`printf "%s\n" "$ac_configure_args" | sed "$ac_safe_unquote"` +ac_cs_config_escaped=`printf "%s\n" "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\''/g"` +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_cs_config='$ac_cs_config_escaped' +ac_cs_version="\\ +PortAudioCpp config.status 12 +configured by $0, generated by GNU Autoconf 2.71, + with options \\"\$ac_cs_config\\" + +Copyright (C) 2021 Free Software Foundation, Inc. +This config.status script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it." + +ac_pwd='$ac_pwd' +srcdir='$srcdir' +INSTALL='$INSTALL' +MKDIR_P='$MKDIR_P' +AWK='$AWK' +test -n "\$AWK" || AWK=awk +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# The default lists apply if the user does not specify any file. +ac_need_defaults=: +while test $# != 0 +do + case $1 in + --*=?*) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` + ac_shift=: + ;; + --*=) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg= + ac_shift=: + ;; + *) + ac_option=$1 + ac_optarg=$2 + ac_shift=shift + ;; + esac + + case $ac_option in + # Handling of the options. + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + ac_cs_recheck=: ;; + --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) + printf "%s\n" "$ac_cs_version"; exit ;; + --config | --confi | --conf | --con | --co | --c ) + printf "%s\n" "$ac_cs_config"; exit ;; + --debug | --debu | --deb | --de | --d | -d ) + debug=: ;; + --file | --fil | --fi | --f ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`printf "%s\n" "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + '') as_fn_error $? "missing file argument" ;; + esac + as_fn_append CONFIG_FILES " '$ac_optarg'" + ac_need_defaults=false;; + --he | --h | --help | --hel | -h ) + printf "%s\n" "$ac_cs_usage"; exit ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil | --si | --s) + ac_cs_silent=: ;; + + # This is an error. + -*) as_fn_error $? "unrecognized option: \`$1' +Try \`$0 --help' for more information." ;; + + *) as_fn_append ac_config_targets " $1" + ac_need_defaults=false ;; + + esac + shift +done + +ac_configure_extra_args= + +if $ac_cs_silent; then + exec 6>/dev/null + ac_configure_extra_args="$ac_configure_extra_args --silent" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +if \$ac_cs_recheck; then + set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion + shift + \printf "%s\n" "running CONFIG_SHELL=$SHELL \$*" >&6 + CONFIG_SHELL='$SHELL' + export CONFIG_SHELL + exec "\$@" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +exec 5>>config.log +{ + echo + sed 'h;s/./-/g;s/^.../@%:@@%:@ /;s/...$/ @%:@@%:@/;p;x;p;x' <<_ASBOX +@%:@@%:@ Running $as_me. @%:@@%:@ +_ASBOX + printf "%s\n" "$ac_log" +} >&5 + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# +# INIT-COMMANDS +# +AMDEP_TRUE="$AMDEP_TRUE" MAKE="${MAKE-make}" + + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +sed_quote_subst='$sed_quote_subst' +double_quote_subst='$double_quote_subst' +delay_variable_subst='$delay_variable_subst' +AS='`$ECHO "$AS" | $SED "$delay_single_quote_subst"`' +DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`' +OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`' +macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`' +macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`' +enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`' +enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`' +pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`' +enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`' +shared_archive_member_spec='`$ECHO "$shared_archive_member_spec" | $SED "$delay_single_quote_subst"`' +SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`' +ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`' +PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`' +host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`' +host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`' +host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`' +build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`' +build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`' +build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`' +SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`' +Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`' +GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`' +EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`' +FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`' +LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`' +NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`' +LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`' +max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`' +ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`' +exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`' +lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`' +lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`' +lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`' +lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`' +lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`' +reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`' +reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`' +deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`' +file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`' +file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`' +want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`' +sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`' +AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`' +AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`' +archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`' +STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`' +RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`' +old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`' +old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`' +old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`' +lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`' +CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`' +CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`' +compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`' +GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_import='`$ECHO "$lt_cv_sys_global_symbol_to_import" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`' +lt_cv_nm_interface='`$ECHO "$lt_cv_nm_interface" | $SED "$delay_single_quote_subst"`' +nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`' +lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`' +lt_cv_truncate_bin='`$ECHO "$lt_cv_truncate_bin" | $SED "$delay_single_quote_subst"`' +objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`' +MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`' +lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`' +need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`' +MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`' +DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`' +NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`' +LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`' +OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`' +OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`' +libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`' +shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`' +extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`' +archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`' +enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`' +export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`' +whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`' +compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`' +old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`' +old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`' +archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`' +archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`' +module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`' +module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`' +with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`' +allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`' +no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`' +hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`' +hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`' +hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`' +hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`' +hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`' +hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`' +hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`' +inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`' +link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`' +always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`' +export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`' +exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`' +include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`' +prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`' +postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`' +file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`' +variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`' +need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`' +need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`' +version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`' +runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`' +shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`' +shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`' +libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`' +library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`' +soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`' +install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`' +postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`' +postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`' +finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`' +finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`' +hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`' +sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`' +configure_time_dlsearch_path='`$ECHO "$configure_time_dlsearch_path" | $SED "$delay_single_quote_subst"`' +configure_time_lt_sys_library_path='`$ECHO "$configure_time_lt_sys_library_path" | $SED "$delay_single_quote_subst"`' +hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`' +enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`' +enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`' +enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`' +old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`' +striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`' +compiler_lib_search_dirs='`$ECHO "$compiler_lib_search_dirs" | $SED "$delay_single_quote_subst"`' +predep_objects='`$ECHO "$predep_objects" | $SED "$delay_single_quote_subst"`' +postdep_objects='`$ECHO "$postdep_objects" | $SED "$delay_single_quote_subst"`' +predeps='`$ECHO "$predeps" | $SED "$delay_single_quote_subst"`' +postdeps='`$ECHO "$postdeps" | $SED "$delay_single_quote_subst"`' +compiler_lib_search_path='`$ECHO "$compiler_lib_search_path" | $SED "$delay_single_quote_subst"`' +LD_CXX='`$ECHO "$LD_CXX" | $SED "$delay_single_quote_subst"`' +reload_flag_CXX='`$ECHO "$reload_flag_CXX" | $SED "$delay_single_quote_subst"`' +reload_cmds_CXX='`$ECHO "$reload_cmds_CXX" | $SED "$delay_single_quote_subst"`' +old_archive_cmds_CXX='`$ECHO "$old_archive_cmds_CXX" | $SED "$delay_single_quote_subst"`' +compiler_CXX='`$ECHO "$compiler_CXX" | $SED "$delay_single_quote_subst"`' +GCC_CXX='`$ECHO "$GCC_CXX" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_no_builtin_flag_CXX='`$ECHO "$lt_prog_compiler_no_builtin_flag_CXX" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_pic_CXX='`$ECHO "$lt_prog_compiler_pic_CXX" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_wl_CXX='`$ECHO "$lt_prog_compiler_wl_CXX" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_static_CXX='`$ECHO "$lt_prog_compiler_static_CXX" | $SED "$delay_single_quote_subst"`' +lt_cv_prog_compiler_c_o_CXX='`$ECHO "$lt_cv_prog_compiler_c_o_CXX" | $SED "$delay_single_quote_subst"`' +archive_cmds_need_lc_CXX='`$ECHO "$archive_cmds_need_lc_CXX" | $SED "$delay_single_quote_subst"`' +enable_shared_with_static_runtimes_CXX='`$ECHO "$enable_shared_with_static_runtimes_CXX" | $SED "$delay_single_quote_subst"`' +export_dynamic_flag_spec_CXX='`$ECHO "$export_dynamic_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' +whole_archive_flag_spec_CXX='`$ECHO "$whole_archive_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' +compiler_needs_object_CXX='`$ECHO "$compiler_needs_object_CXX" | $SED "$delay_single_quote_subst"`' +old_archive_from_new_cmds_CXX='`$ECHO "$old_archive_from_new_cmds_CXX" | $SED "$delay_single_quote_subst"`' +old_archive_from_expsyms_cmds_CXX='`$ECHO "$old_archive_from_expsyms_cmds_CXX" | $SED "$delay_single_quote_subst"`' +archive_cmds_CXX='`$ECHO "$archive_cmds_CXX" | $SED "$delay_single_quote_subst"`' +archive_expsym_cmds_CXX='`$ECHO "$archive_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`' +module_cmds_CXX='`$ECHO "$module_cmds_CXX" | $SED "$delay_single_quote_subst"`' +module_expsym_cmds_CXX='`$ECHO "$module_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`' +with_gnu_ld_CXX='`$ECHO "$with_gnu_ld_CXX" | $SED "$delay_single_quote_subst"`' +allow_undefined_flag_CXX='`$ECHO "$allow_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`' +no_undefined_flag_CXX='`$ECHO "$no_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_libdir_flag_spec_CXX='`$ECHO "$hardcode_libdir_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_libdir_separator_CXX='`$ECHO "$hardcode_libdir_separator_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_direct_CXX='`$ECHO "$hardcode_direct_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_direct_absolute_CXX='`$ECHO "$hardcode_direct_absolute_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_minus_L_CXX='`$ECHO "$hardcode_minus_L_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_shlibpath_var_CXX='`$ECHO "$hardcode_shlibpath_var_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_automatic_CXX='`$ECHO "$hardcode_automatic_CXX" | $SED "$delay_single_quote_subst"`' +inherit_rpath_CXX='`$ECHO "$inherit_rpath_CXX" | $SED "$delay_single_quote_subst"`' +link_all_deplibs_CXX='`$ECHO "$link_all_deplibs_CXX" | $SED "$delay_single_quote_subst"`' +always_export_symbols_CXX='`$ECHO "$always_export_symbols_CXX" | $SED "$delay_single_quote_subst"`' +export_symbols_cmds_CXX='`$ECHO "$export_symbols_cmds_CXX" | $SED "$delay_single_quote_subst"`' +exclude_expsyms_CXX='`$ECHO "$exclude_expsyms_CXX" | $SED "$delay_single_quote_subst"`' +include_expsyms_CXX='`$ECHO "$include_expsyms_CXX" | $SED "$delay_single_quote_subst"`' +prelink_cmds_CXX='`$ECHO "$prelink_cmds_CXX" | $SED "$delay_single_quote_subst"`' +postlink_cmds_CXX='`$ECHO "$postlink_cmds_CXX" | $SED "$delay_single_quote_subst"`' +file_list_spec_CXX='`$ECHO "$file_list_spec_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_action_CXX='`$ECHO "$hardcode_action_CXX" | $SED "$delay_single_quote_subst"`' +compiler_lib_search_dirs_CXX='`$ECHO "$compiler_lib_search_dirs_CXX" | $SED "$delay_single_quote_subst"`' +predep_objects_CXX='`$ECHO "$predep_objects_CXX" | $SED "$delay_single_quote_subst"`' +postdep_objects_CXX='`$ECHO "$postdep_objects_CXX" | $SED "$delay_single_quote_subst"`' +predeps_CXX='`$ECHO "$predeps_CXX" | $SED "$delay_single_quote_subst"`' +postdeps_CXX='`$ECHO "$postdeps_CXX" | $SED "$delay_single_quote_subst"`' +compiler_lib_search_path_CXX='`$ECHO "$compiler_lib_search_path_CXX" | $SED "$delay_single_quote_subst"`' + +LTCC='$LTCC' +LTCFLAGS='$LTCFLAGS' +compiler='$compiler_DEFAULT' + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +\$1 +_LTECHO_EOF' +} + +# Quote evaled strings. +for var in AS \ +DLLTOOL \ +OBJDUMP \ +SHELL \ +ECHO \ +PATH_SEPARATOR \ +SED \ +GREP \ +EGREP \ +FGREP \ +LD \ +NM \ +LN_S \ +lt_SP2NL \ +lt_NL2SP \ +reload_flag \ +deplibs_check_method \ +file_magic_cmd \ +file_magic_glob \ +want_nocaseglob \ +sharedlib_from_linklib_cmd \ +AR \ +AR_FLAGS \ +archiver_list_spec \ +STRIP \ +RANLIB \ +CC \ +CFLAGS \ +compiler \ +lt_cv_sys_global_symbol_pipe \ +lt_cv_sys_global_symbol_to_cdecl \ +lt_cv_sys_global_symbol_to_import \ +lt_cv_sys_global_symbol_to_c_name_address \ +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \ +lt_cv_nm_interface \ +nm_file_list_spec \ +lt_cv_truncate_bin \ +lt_prog_compiler_no_builtin_flag \ +lt_prog_compiler_pic \ +lt_prog_compiler_wl \ +lt_prog_compiler_static \ +lt_cv_prog_compiler_c_o \ +need_locks \ +MANIFEST_TOOL \ +DSYMUTIL \ +NMEDIT \ +LIPO \ +OTOOL \ +OTOOL64 \ +shrext_cmds \ +export_dynamic_flag_spec \ +whole_archive_flag_spec \ +compiler_needs_object \ +with_gnu_ld \ +allow_undefined_flag \ +no_undefined_flag \ +hardcode_libdir_flag_spec \ +hardcode_libdir_separator \ +exclude_expsyms \ +include_expsyms \ +file_list_spec \ +variables_saved_for_relink \ +libname_spec \ +library_names_spec \ +soname_spec \ +install_override_mode \ +finish_eval \ +old_striplib \ +striplib \ +compiler_lib_search_dirs \ +predep_objects \ +postdep_objects \ +predeps \ +postdeps \ +compiler_lib_search_path \ +LD_CXX \ +reload_flag_CXX \ +compiler_CXX \ +lt_prog_compiler_no_builtin_flag_CXX \ +lt_prog_compiler_pic_CXX \ +lt_prog_compiler_wl_CXX \ +lt_prog_compiler_static_CXX \ +lt_cv_prog_compiler_c_o_CXX \ +export_dynamic_flag_spec_CXX \ +whole_archive_flag_spec_CXX \ +compiler_needs_object_CXX \ +with_gnu_ld_CXX \ +allow_undefined_flag_CXX \ +no_undefined_flag_CXX \ +hardcode_libdir_flag_spec_CXX \ +hardcode_libdir_separator_CXX \ +exclude_expsyms_CXX \ +include_expsyms_CXX \ +file_list_spec_CXX \ +compiler_lib_search_dirs_CXX \ +predep_objects_CXX \ +postdep_objects_CXX \ +predeps_CXX \ +postdeps_CXX \ +compiler_lib_search_path_CXX; do + case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in + *[\\\\\\\`\\"\\\$]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +# Double-quote double-evaled strings. +for var in reload_cmds \ +old_postinstall_cmds \ +old_postuninstall_cmds \ +old_archive_cmds \ +extract_expsyms_cmds \ +old_archive_from_new_cmds \ +old_archive_from_expsyms_cmds \ +archive_cmds \ +archive_expsym_cmds \ +module_cmds \ +module_expsym_cmds \ +export_symbols_cmds \ +prelink_cmds \ +postlink_cmds \ +postinstall_cmds \ +postuninstall_cmds \ +finish_cmds \ +sys_lib_search_path_spec \ +configure_time_dlsearch_path \ +configure_time_lt_sys_library_path \ +reload_cmds_CXX \ +old_archive_cmds_CXX \ +old_archive_from_new_cmds_CXX \ +old_archive_from_expsyms_cmds_CXX \ +archive_cmds_CXX \ +archive_expsym_cmds_CXX \ +module_cmds_CXX \ +module_expsym_cmds_CXX \ +export_symbols_cmds_CXX \ +prelink_cmds_CXX \ +postlink_cmds_CXX; do + case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in + *[\\\\\\\`\\"\\\$]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +ac_aux_dir='$ac_aux_dir' + +# See if we are running on zsh, and set the options that allow our +# commands through without removal of \ escapes INIT. +if test -n "\${ZSH_VERSION+set}"; then + setopt NO_GLOB_SUBST +fi + + + PACKAGE='$PACKAGE' + VERSION='$VERSION' + RM='$RM' + ofile='$ofile' + + + + + + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + +# Handling of arguments. +for ac_config_target in $ac_config_targets +do + case $ac_config_target in + "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; + "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;; + "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; + "lib/Makefile") CONFIG_FILES="$CONFIG_FILES lib/Makefile" ;; + "include/Makefile") CONFIG_FILES="$CONFIG_FILES include/Makefile" ;; + "bin/Makefile") CONFIG_FILES="$CONFIG_FILES bin/Makefile" ;; + "doc/Makefile") CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;; + "portaudiocpp.pc") CONFIG_FILES="$CONFIG_FILES portaudiocpp.pc" ;; + + *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; + esac +done + + +# If the user did not use the arguments to specify the items to instantiate, +# then the envvar interface is used. Set only those that are not. +# We use the long form for the default assignment because of an extremely +# bizarre bug on SunOS 4.1.3. +if $ac_need_defaults; then + test ${CONFIG_FILES+y} || CONFIG_FILES=$config_files + test ${CONFIG_COMMANDS+y} || CONFIG_COMMANDS=$config_commands +fi + +# Have a temporary directory for convenience. Make it in the build tree +# simply because there is no reason against having it here, and in addition, +# creating and moving files from /tmp can sometimes cause problems. +# Hook for its removal unless debugging. +# Note that there is a small window in which the directory will not be cleaned: +# after its creation but before its name has been assigned to `$tmp'. +$debug || +{ + tmp= ac_tmp= + trap 'exit_status=$? + : "${ac_tmp:=$tmp}" + { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status +' 0 + trap 'as_fn_exit 1' 1 2 13 15 +} +# Create a (secure) tmp directory for tmp files. + +{ + tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && + test -d "$tmp" +} || +{ + tmp=./conf$$-$RANDOM + (umask 077 && mkdir "$tmp") +} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 +ac_tmp=$tmp + +# Set up the scripts for CONFIG_FILES section. +# No need to generate them if there are no CONFIG_FILES. +# This happens for instance with `./config.status config.h'. +if test -n "$CONFIG_FILES"; then + + +ac_cr=`echo X | tr X '\015'` +# On cygwin, bash can eat \r inside `` if the user requested igncr. +# But we know of no other shell where ac_cr would be empty at this +# point, so we can use a bashism as a fallback. +if test "x$ac_cr" = x; then + eval ac_cr=\$\'\\r\' +fi +ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` +if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then + ac_cs_awk_cr='\\r' +else + ac_cs_awk_cr=$ac_cr +fi + +echo 'BEGIN {' >"$ac_tmp/subs1.awk" && +_ACEOF + + +{ + echo "cat >conf$$subs.awk <<_ACEOF" && + echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && + echo "_ACEOF" +} >conf$$subs.sh || + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 +ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` +ac_delim='%!_!# ' +for ac_last_try in false false false false false :; do + . ./conf$$subs.sh || + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + + ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` + if test $ac_delim_n = $ac_delim_num; then + break + elif $ac_last_try; then + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done +rm -f conf$$subs.sh + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && +_ACEOF +sed -n ' +h +s/^/S["/; s/!.*/"]=/ +p +g +s/^[^!]*!// +:repl +t repl +s/'"$ac_delim"'$// +t delim +:nl +h +s/\(.\{148\}\)..*/\1/ +t more1 +s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ +p +n +b repl +:more1 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t nl +:delim +h +s/\(.\{148\}\)..*/\1/ +t more2 +s/["\\]/\\&/g; s/^/"/; s/$/"/ +p +b +:more2 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t delim +' >$CONFIG_STATUS || ac_write_fail=1 +rm -f conf$$subs.awk +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +_ACAWK +cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && + for (key in S) S_is_set[key] = 1 + FS = "" + +} +{ + line = $ 0 + nfields = split(line, field, "@") + substed = 0 + len = length(field[1]) + for (i = 2; i < nfields; i++) { + key = field[i] + keylen = length(key) + if (S_is_set[key]) { + value = S[key] + line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) + len += length(value) + length(field[++i]) + substed = 1 + } else + len += 1 + keylen + } + + print line +} + +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then + sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" +else + cat +fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ + || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 +_ACEOF + +# VPATH may cause trouble with some makes, so we remove sole $(srcdir), +# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and +# trailing colons and then remove the whole line if VPATH becomes empty +# (actually we leave an empty line to preserve line numbers). +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ +h +s/// +s/^/:/ +s/[ ]*$/:/ +s/:\$(srcdir):/:/g +s/:\${srcdir}:/:/g +s/:@srcdir@:/:/g +s/^:*// +s/:*$// +x +s/\(=[ ]*\).*/\1/ +G +s/\n// +s/^[^=]*=[ ]*$// +}' +fi + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +fi # test -n "$CONFIG_FILES" + + +eval set X " :F $CONFIG_FILES :C $CONFIG_COMMANDS" +shift +for ac_tag +do + case $ac_tag in + :[FHLC]) ac_mode=$ac_tag; continue;; + esac + case $ac_mode$ac_tag in + :[FHL]*:*);; + :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; + :[FH]-) ac_tag=-:-;; + :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; + esac + ac_save_IFS=$IFS + IFS=: + set x $ac_tag + IFS=$ac_save_IFS + shift + ac_file=$1 + shift + + case $ac_mode in + :L) ac_source=$1;; + :[FH]) + ac_file_inputs= + for ac_f + do + case $ac_f in + -) ac_f="$ac_tmp/stdin";; + *) # Look for the file first in the build tree, then in the source tree + # (if the path is not absolute). The absolute path cannot be DOS-style, + # because $ac_f cannot contain `:'. + test -f "$ac_f" || + case $ac_f in + [\\/$]*) false;; + *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; + esac || + as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; + esac + case $ac_f in *\'*) ac_f=`printf "%s\n" "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac + as_fn_append ac_file_inputs " '$ac_f'" + done + + # Let's still pretend it is `configure' which instantiates (i.e., don't + # use $as_me), people would be surprised to read: + # /* config.h. Generated by config.status. */ + configure_input='Generated from '` + printf "%s\n" "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' + `' by configure.' + if test x"$ac_file" != x-; then + configure_input="$ac_file. $configure_input" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 +printf "%s\n" "$as_me: creating $ac_file" >&6;} + fi + # Neutralize special characters interpreted by sed in replacement strings. + case $configure_input in #( + *\&* | *\|* | *\\* ) + ac_sed_conf_input=`printf "%s\n" "$configure_input" | + sed 's/[\\\\&|]/\\\\&/g'`;; #( + *) ac_sed_conf_input=$configure_input;; + esac + + case $ac_tag in + *:-:* | *:-) cat >"$ac_tmp/stdin" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; + esac + ;; + esac + + ac_dir=`$as_dirname -- "$ac_file" || +$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || +printf "%s\n" X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + as_dir="$ac_dir"; as_fn_mkdir_p + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + + case $ac_mode in + :F) + # + # CONFIG_FILE + # + + case $INSTALL in + [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; + *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; + esac + ac_MKDIR_P=$MKDIR_P + case $MKDIR_P in + [\\/$]* | ?:[\\/]* ) ;; + */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; + esac +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# If the template does not know about datarootdir, expand it. +# FIXME: This hack should be removed a few years after 2.60. +ac_datarootdir_hack=; ac_datarootdir_seen= +ac_sed_dataroot=' +/datarootdir/ { + p + q +} +/@datadir@/p +/@docdir@/p +/@infodir@/p +/@localedir@/p +/@mandir@/p' +case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in +*datarootdir*) ac_datarootdir_seen=yes;; +*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 +printf "%s\n" "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + ac_datarootdir_hack=' + s&@datadir@&$datadir&g + s&@docdir@&$docdir&g + s&@infodir@&$infodir&g + s&@localedir@&$localedir&g + s&@mandir@&$mandir&g + s&\\\${datarootdir}&$datarootdir&g' ;; +esac +_ACEOF + +# Neutralize VPATH when `$srcdir' = `.'. +# Shell code in configure.ac might set extrasub. +# FIXME: do we really want to maintain this feature? +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_sed_extra="$ac_vpsub +$extrasub +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +:t +/@[a-zA-Z_][a-zA-Z_0-9]*@/!b +s|@configure_input@|$ac_sed_conf_input|;t t +s&@top_builddir@&$ac_top_builddir_sub&;t t +s&@top_build_prefix@&$ac_top_build_prefix&;t t +s&@srcdir@&$ac_srcdir&;t t +s&@abs_srcdir@&$ac_abs_srcdir&;t t +s&@top_srcdir@&$ac_top_srcdir&;t t +s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t +s&@builddir@&$ac_builddir&;t t +s&@abs_builddir@&$ac_abs_builddir&;t t +s&@abs_top_builddir@&$ac_abs_top_builddir&;t t +s&@INSTALL@&$ac_INSTALL&;t t +s&@MKDIR_P@&$ac_MKDIR_P&;t t +$ac_datarootdir_hack +" +eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ + >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + +test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && + { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && + { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ + "$ac_tmp/out"`; test -z "$ac_out"; } && + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&5 +printf "%s\n" "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&2;} + + rm -f "$ac_tmp/stdin" + case $ac_file in + -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; + *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; + esac \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + ;; + + + :C) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 +printf "%s\n" "$as_me: executing $ac_file commands" >&6;} + ;; + esac + + + case $ac_file$ac_mode in + "depfiles":C) test x"$AMDEP_TRUE" != x"" || { + # Older Autoconf quotes --file arguments for eval, but not when files + # are listed without --file. Let's play safe and only enable the eval + # if we detect the quoting. + # TODO: see whether this extra hack can be removed once we start + # requiring Autoconf 2.70 or later. + case $CONFIG_FILES in @%:@( + *\'*) : + eval set x "$CONFIG_FILES" ;; @%:@( + *) : + set x $CONFIG_FILES ;; @%:@( + *) : + ;; +esac + shift + # Used to flag and report bootstrapping failures. + am_rc=0 + for am_mf + do + # Strip MF so we end up with the name of the file. + am_mf=`printf "%s\n" "$am_mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile which includes + # dependency-tracking related rules and includes. + # Grep'ing the whole file directly is not great: AIX grep has a line + # limit of 2048, but all sed's we know have understand at least 4000. + sed -n 's,^am--depfiles:.*,X,p' "$am_mf" | grep X >/dev/null 2>&1 \ + || continue + am_dirpart=`$as_dirname -- "$am_mf" || +$as_expr X"$am_mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$am_mf" : 'X\(//\)[^/]' \| \ + X"$am_mf" : 'X\(//\)$' \| \ + X"$am_mf" : 'X\(/\)' \| . 2>/dev/null || +printf "%s\n" X"$am_mf" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + am_filepart=`$as_basename -- "$am_mf" || +$as_expr X/"$am_mf" : '.*/\([^/][^/]*\)/*$' \| \ + X"$am_mf" : 'X\(//\)$' \| \ + X"$am_mf" : 'X\(/\)' \| . 2>/dev/null || +printf "%s\n" X/"$am_mf" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + { echo "$as_me:$LINENO: cd "$am_dirpart" \ + && sed -e '/# am--include-marker/d' "$am_filepart" \ + | $MAKE -f - am--depfiles" >&5 + (cd "$am_dirpart" \ + && sed -e '/# am--include-marker/d' "$am_filepart" \ + | $MAKE -f - am--depfiles) >&5 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } || am_rc=$? + done + if test $am_rc -ne 0; then + { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "Something went wrong bootstrapping makefile fragments + for automatic dependency tracking. If GNU make was not used, consider + re-running the configure script with MAKE=\"gmake\" (or whatever is + necessary). You can also try re-running configure with the + '--disable-dependency-tracking' option to at least be able to build + the package (albeit without support for automatic dependency tracking). +See \`config.log' for more details" "$LINENO" 5; } + fi + { am_dirpart=; unset am_dirpart;} + { am_filepart=; unset am_filepart;} + { am_mf=; unset am_mf;} + { am_rc=; unset am_rc;} + rm -f conftest-deps.mk +} + ;; + "libtool":C) + + # See if we are running on zsh, and set the options that allow our + # commands through without removal of \ escapes. + if test -n "${ZSH_VERSION+set}"; then + setopt NO_GLOB_SUBST + fi + + cfgfile=${ofile}T + trap "$RM \"$cfgfile\"; exit 1" 1 2 15 + $RM "$cfgfile" + + cat <<_LT_EOF >> "$cfgfile" +#! $SHELL +# Generated automatically by $as_me ($PACKAGE) $VERSION +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: +# NOTE: Changes made to this file will be lost: look at ltmain.sh. + +# Provide generalized library-building support services. +# Written by Gordon Matzigkeit, 1996 + +# Copyright (C) 2014 Free Software Foundation, Inc. +# This is free software; see the source for copying conditions. There is NO +# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +# GNU Libtool is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of of the License, or +# (at your option) any later version. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program or library that is built +# using GNU Libtool, you may include this file under the same +# distribution terms that you use for the rest of that program. +# +# GNU Libtool is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + + +# The names of the tagged configurations supported by this script. +available_tags='CXX ' + +# Configured defaults for sys_lib_dlsearch_path munging. +: \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"} + +# ### BEGIN LIBTOOL CONFIG + +# Assembler program. +AS=$lt_AS + +# DLL creation program. +DLLTOOL=$lt_DLLTOOL + +# Object dumper program. +OBJDUMP=$lt_OBJDUMP + +# Which release of libtool.m4 was used? +macro_version=$macro_version +macro_revision=$macro_revision + +# Whether or not to build shared libraries. +build_libtool_libs=$enable_shared + +# Whether or not to build static libraries. +build_old_libs=$enable_static + +# What type of objects to build. +pic_mode=$pic_mode + +# Whether or not to optimize for fast installation. +fast_install=$enable_fast_install + +# Shared archive member basename,for filename based shared library versioning on AIX. +shared_archive_member_spec=$shared_archive_member_spec + +# Shell to use when invoking shell scripts. +SHELL=$lt_SHELL + +# An echo program that protects backslashes. +ECHO=$lt_ECHO + +# The PATH separator for the build system. +PATH_SEPARATOR=$lt_PATH_SEPARATOR + +# The host system. +host_alias=$host_alias +host=$host +host_os=$host_os + +# The build system. +build_alias=$build_alias +build=$build +build_os=$build_os + +# A sed program that does not truncate output. +SED=$lt_SED + +# Sed that helps us avoid accidentally triggering echo(1) options like -n. +Xsed="\$SED -e 1s/^X//" + +# A grep program that handles long lines. +GREP=$lt_GREP + +# An ERE matcher. +EGREP=$lt_EGREP + +# A literal string matcher. +FGREP=$lt_FGREP + +# A BSD- or MS-compatible name lister. +NM=$lt_NM + +# Whether we need soft or hard links. +LN_S=$lt_LN_S + +# What is the maximum length of a command? +max_cmd_len=$max_cmd_len + +# Object file suffix (normally "o"). +objext=$ac_objext + +# Executable file suffix (normally ""). +exeext=$exeext + +# whether the shell understands "unset". +lt_unset=$lt_unset + +# turn spaces into newlines. +SP2NL=$lt_lt_SP2NL + +# turn newlines into spaces. +NL2SP=$lt_lt_NL2SP + +# convert \$build file names to \$host format. +to_host_file_cmd=$lt_cv_to_host_file_cmd + +# convert \$build files to toolchain format. +to_tool_file_cmd=$lt_cv_to_tool_file_cmd + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method=$lt_deplibs_check_method + +# Command to use when deplibs_check_method = "file_magic". +file_magic_cmd=$lt_file_magic_cmd + +# How to find potential files when deplibs_check_method = "file_magic". +file_magic_glob=$lt_file_magic_glob + +# Find potential files using nocaseglob when deplibs_check_method = "file_magic". +want_nocaseglob=$lt_want_nocaseglob + +# Command to associate shared and link libraries. +sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd + +# The archiver. +AR=$lt_AR + +# Flags to create an archive. +AR_FLAGS=$lt_AR_FLAGS + +# How to feed a file listing to the archiver. +archiver_list_spec=$lt_archiver_list_spec + +# A symbol stripping program. +STRIP=$lt_STRIP + +# Commands used to install an old-style archive. +RANLIB=$lt_RANLIB +old_postinstall_cmds=$lt_old_postinstall_cmds +old_postuninstall_cmds=$lt_old_postuninstall_cmds + +# Whether to use a lock for old archive extraction. +lock_old_archive_extraction=$lock_old_archive_extraction + +# A C compiler. +LTCC=$lt_CC + +# LTCC compiler flags. +LTCFLAGS=$lt_CFLAGS + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe + +# Transform the output of nm in a proper C declaration. +global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl + +# Transform the output of nm into a list of symbols to manually relocate. +global_symbol_to_import=$lt_lt_cv_sys_global_symbol_to_import + +# Transform the output of nm in a C name address pair. +global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address + +# Transform the output of nm in a C name address pair when lib prefix is needed. +global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix + +# The name lister interface. +nm_interface=$lt_lt_cv_nm_interface + +# Specify filename containing input files for \$NM. +nm_file_list_spec=$lt_nm_file_list_spec + +# The root where to search for dependent libraries,and where our libraries should be installed. +lt_sysroot=$lt_sysroot + +# Command to truncate a binary pipe. +lt_truncate_bin=$lt_lt_cv_truncate_bin + +# The name of the directory that contains temporary libtool files. +objdir=$objdir + +# Used to examine libraries when file_magic_cmd begins with "file". +MAGIC_CMD=$MAGIC_CMD + +# Must we lock files when doing compilation? +need_locks=$lt_need_locks + +# Manifest tool. +MANIFEST_TOOL=$lt_MANIFEST_TOOL + +# Tool to manipulate archived DWARF debug symbol files on Mac OS X. +DSYMUTIL=$lt_DSYMUTIL + +# Tool to change global to local symbols on Mac OS X. +NMEDIT=$lt_NMEDIT + +# Tool to manipulate fat objects and archives on Mac OS X. +LIPO=$lt_LIPO + +# ldd/readelf like tool for Mach-O binaries on Mac OS X. +OTOOL=$lt_OTOOL + +# ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4. +OTOOL64=$lt_OTOOL64 + +# Old archive suffix (normally "a"). +libext=$libext + +# Shared library suffix (normally ".so"). +shrext_cmds=$lt_shrext_cmds + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds=$lt_extract_expsyms_cmds + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at link time. +variables_saved_for_relink=$lt_variables_saved_for_relink + +# Do we need the "lib" prefix for modules? +need_lib_prefix=$need_lib_prefix + +# Do we need a version for libraries? +need_version=$need_version + +# Library versioning type. +version_type=$version_type + +# Shared library runtime path variable. +runpath_var=$runpath_var + +# Shared library path variable. +shlibpath_var=$shlibpath_var + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=$shlibpath_overrides_runpath + +# Format of library name prefix. +libname_spec=$lt_libname_spec + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME +library_names_spec=$lt_library_names_spec + +# The coded name of the library, if different from the real name. +soname_spec=$lt_soname_spec + +# Permission mode override for installation of shared libraries. +install_override_mode=$lt_install_override_mode + +# Command to use after installation of a shared archive. +postinstall_cmds=$lt_postinstall_cmds + +# Command to use after uninstallation of a shared archive. +postuninstall_cmds=$lt_postuninstall_cmds + +# Commands used to finish a libtool library installation in a directory. +finish_cmds=$lt_finish_cmds + +# As "finish_cmds", except a single script fragment to be evaled but +# not shown. +finish_eval=$lt_finish_eval + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=$hardcode_into_libs + +# Compile-time system search path for libraries. +sys_lib_search_path_spec=$lt_sys_lib_search_path_spec + +# Detected run-time system search path for libraries. +sys_lib_dlsearch_path_spec=$lt_configure_time_dlsearch_path + +# Explicit LT_SYS_LIBRARY_PATH set during ./configure time. +configure_time_lt_sys_library_path=$lt_configure_time_lt_sys_library_path + +# Whether dlopen is supported. +dlopen_support=$enable_dlopen + +# Whether dlopen of programs is supported. +dlopen_self=$enable_dlopen_self + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=$enable_dlopen_self_static + +# Commands to strip libraries. +old_striplib=$lt_old_striplib +striplib=$lt_striplib + + +# The linker used to build libraries. +LD=$lt_LD + +# How to create reloadable object files. +reload_flag=$lt_reload_flag +reload_cmds=$lt_reload_cmds + +# Commands used to build an old-style archive. +old_archive_cmds=$lt_old_archive_cmds + +# A language specific compiler. +CC=$lt_compiler + +# Is the compiler the GNU compiler? +with_gcc=$GCC + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_lt_prog_compiler_static + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_lt_cv_prog_compiler_c_o + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$archive_cmds_need_lc + +# Whether or not to disallow shared libs when runtime libs are static. +allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec + +# Whether the compiler copes with passing no objects directly. +compiler_needs_object=$lt_compiler_needs_object + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds + +# Commands used to build a shared archive. +archive_cmds=$lt_archive_cmds +archive_expsym_cmds=$lt_archive_expsym_cmds + +# Commands used to build a loadable module if different from building +# a shared archive. +module_cmds=$lt_module_cmds +module_expsym_cmds=$lt_module_expsym_cmds + +# Whether we are building with GNU ld or not. +with_gnu_ld=$lt_with_gnu_ld + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag + +# Flag that enforces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist +hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec + +# Whether we need a single "-rpath" flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator + +# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes +# DIR into the resulting binary. +hardcode_direct=$hardcode_direct + +# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes +# DIR into the resulting binary and the resulting library dependency is +# "absolute",i.e impossible to change by setting \$shlibpath_var if the +# library is relocated. +hardcode_direct_absolute=$hardcode_direct_absolute + +# Set to "yes" if using the -LDIR flag during linking hardcodes DIR +# into the resulting binary. +hardcode_minus_L=$hardcode_minus_L + +# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR +# into the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var + +# Set to "yes" if building a shared library automatically hardcodes DIR +# into the library and all subsequent libraries and executables linked +# against it. +hardcode_automatic=$hardcode_automatic + +# Set to yes if linker adds runtime paths of dependent libraries +# to runtime path list. +inherit_rpath=$inherit_rpath + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs + +# Set to "yes" if exported symbols are required. +always_export_symbols=$always_export_symbols + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_exclude_expsyms + +# Symbols that must always be exported. +include_expsyms=$lt_include_expsyms + +# Commands necessary for linking programs (against libraries) with templates. +prelink_cmds=$lt_prelink_cmds + +# Commands necessary for finishing linking programs. +postlink_cmds=$lt_postlink_cmds + +# Specify filename containing input files. +file_list_spec=$lt_file_list_spec + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action + +# The directories searched by this compiler when creating a shared library. +compiler_lib_search_dirs=$lt_compiler_lib_search_dirs + +# Dependencies to place before and after the objects being linked to +# create a shared library. +predep_objects=$lt_predep_objects +postdep_objects=$lt_postdep_objects +predeps=$lt_predeps +postdeps=$lt_postdeps + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_compiler_lib_search_path + +# ### END LIBTOOL CONFIG + +_LT_EOF + + cat <<'_LT_EOF' >> "$cfgfile" + +# ### BEGIN FUNCTIONS SHARED WITH CONFIGURE + +# func_munge_path_list VARIABLE PATH +# ----------------------------------- +# VARIABLE is name of variable containing _space_ separated list of +# directories to be munged by the contents of PATH, which is string +# having a format: +# "DIR[:DIR]:" +# string "DIR[ DIR]" will be prepended to VARIABLE +# ":DIR[:DIR]" +# string "DIR[ DIR]" will be appended to VARIABLE +# "DIRP[:DIRP]::[DIRA:]DIRA" +# string "DIRP[ DIRP]" will be prepended to VARIABLE and string +# "DIRA[ DIRA]" will be appended to VARIABLE +# "DIR[:DIR]" +# VARIABLE will be replaced by "DIR[ DIR]" +func_munge_path_list () +{ + case x@S|@2 in + x) + ;; + *:) + eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'` \@S|@@S|@1\" + ;; + x:*) + eval @S|@1=\"\@S|@@S|@1 `$ECHO @S|@2 | $SED 's/:/ /g'`\" + ;; + *::*) + eval @S|@1=\"\@S|@@S|@1\ `$ECHO @S|@2 | $SED -e 's/.*:://' -e 's/:/ /g'`\" + eval @S|@1=\"`$ECHO @S|@2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \@S|@@S|@1\" + ;; + *) + eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'`\" + ;; + esac +} + + +# Calculate cc_basename. Skip known compiler wrappers and cross-prefix. +func_cc_basename () +{ + for cc_temp in @S|@*""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac + done + func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` +} + + +# ### END FUNCTIONS SHARED WITH CONFIGURE + +_LT_EOF + + case $host_os in + aix3*) + cat <<\_LT_EOF >> "$cfgfile" +# AIX sometimes has problems with the GCC collect2 program. For some +# reason, if we set the COLLECT_NAMES environment variable, the problems +# vanish in a puff of smoke. +if test set != "${COLLECT_NAMES+set}"; then + COLLECT_NAMES= + export COLLECT_NAMES +fi +_LT_EOF + ;; + esac + + + +ltmain=$ac_aux_dir/ltmain.sh + + + # We use sed instead of cat because bash on DJGPP gets confused if + # if finds mixed CR/LF and LF-only lines. Since sed operates in + # text mode, it properly converts lines to CR/LF. This bash problem + # is reportedly fixed, but why not run on old versions too? + sed '$q' "$ltmain" >> "$cfgfile" \ + || (rm -f "$cfgfile"; exit 1) + + mv -f "$cfgfile" "$ofile" || + (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") + chmod +x "$ofile" + + + cat <<_LT_EOF >> "$ofile" + +# ### BEGIN LIBTOOL TAG CONFIG: CXX + +# The linker used to build libraries. +LD=$lt_LD_CXX + +# How to create reloadable object files. +reload_flag=$lt_reload_flag_CXX +reload_cmds=$lt_reload_cmds_CXX + +# Commands used to build an old-style archive. +old_archive_cmds=$lt_old_archive_cmds_CXX + +# A language specific compiler. +CC=$lt_compiler_CXX + +# Is the compiler the GNU compiler? +with_gcc=$GCC_CXX + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic_CXX + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl_CXX + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_lt_prog_compiler_static_CXX + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$archive_cmds_need_lc_CXX + +# Whether or not to disallow shared libs when runtime libs are static. +allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX + +# Whether the compiler copes with passing no objects directly. +compiler_needs_object=$lt_compiler_needs_object_CXX + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX + +# Commands used to build a shared archive. +archive_cmds=$lt_archive_cmds_CXX +archive_expsym_cmds=$lt_archive_expsym_cmds_CXX + +# Commands used to build a loadable module if different from building +# a shared archive. +module_cmds=$lt_module_cmds_CXX +module_expsym_cmds=$lt_module_expsym_cmds_CXX + +# Whether we are building with GNU ld or not. +with_gnu_ld=$lt_with_gnu_ld_CXX + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag_CXX + +# Flag that enforces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag_CXX + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist +hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX + +# Whether we need a single "-rpath" flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX + +# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes +# DIR into the resulting binary. +hardcode_direct=$hardcode_direct_CXX + +# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes +# DIR into the resulting binary and the resulting library dependency is +# "absolute",i.e impossible to change by setting \$shlibpath_var if the +# library is relocated. +hardcode_direct_absolute=$hardcode_direct_absolute_CXX + +# Set to "yes" if using the -LDIR flag during linking hardcodes DIR +# into the resulting binary. +hardcode_minus_L=$hardcode_minus_L_CXX + +# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR +# into the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX + +# Set to "yes" if building a shared library automatically hardcodes DIR +# into the library and all subsequent libraries and executables linked +# against it. +hardcode_automatic=$hardcode_automatic_CXX + +# Set to yes if linker adds runtime paths of dependent libraries +# to runtime path list. +inherit_rpath=$inherit_rpath_CXX + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs_CXX + +# Set to "yes" if exported symbols are required. +always_export_symbols=$always_export_symbols_CXX + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds_CXX + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_exclude_expsyms_CXX + +# Symbols that must always be exported. +include_expsyms=$lt_include_expsyms_CXX + +# Commands necessary for linking programs (against libraries) with templates. +prelink_cmds=$lt_prelink_cmds_CXX + +# Commands necessary for finishing linking programs. +postlink_cmds=$lt_postlink_cmds_CXX + +# Specify filename containing input files. +file_list_spec=$lt_file_list_spec_CXX + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action_CXX + +# The directories searched by this compiler when creating a shared library. +compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_CXX + +# Dependencies to place before and after the objects being linked to +# create a shared library. +predep_objects=$lt_predep_objects_CXX +postdep_objects=$lt_postdep_objects_CXX +predeps=$lt_predeps_CXX +postdeps=$lt_postdeps_CXX + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_compiler_lib_search_path_CXX + +# ### END LIBTOOL TAG CONFIG: CXX +_LT_EOF + + ;; + + esac +done # for ac_tag + + +as_fn_exit 0 +_ACEOF +ac_clean_files=$ac_clean_files_save + +test $ac_write_fail = 0 || + as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 + + +# configure is writing to config.log, and then calls config.status. +# config.status does its own redirection, appending to config.log. +# Unfortunately, on DOS this fails, as config.log is still kept open +# by configure, so config.status won't be able to write to it; its +# output is simply discarded. So we exec the FD to /dev/null, +# effectively closing config.log, so it can be properly (re)opened and +# appended to by config.status. When coming back to configure, we +# need to make the FD available again. +if test "$no_create" != yes; then + ac_cs_success=: + ac_config_status_args= + test "$silent" = yes && + ac_config_status_args="$ac_config_status_args --quiet" + exec 5>/dev/null + $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false + exec 5>>config.log + # Use ||, not &&, to avoid exiting from the if with $? = 1, which + # would make configure fail if this is the last instruction. + $ac_cs_success || as_fn_exit 1 +fi +if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 +printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} +fi + + \ No newline at end of file diff --git a/bindings/cpp/autom4te.cache/requests b/bindings/cpp/autom4te.cache/requests new file mode 100644 index 0000000..429bbf2 --- /dev/null +++ b/bindings/cpp/autom4te.cache/requests @@ -0,0 +1,382 @@ +# This file was generated by Autom4te 2.71. +# It contains the lists of macros which have been traced. +# It can be safely removed. + +@request = ( + bless( [ + '0', + 1, + [ + '/usr/local/Cellar/autoconf/2.71/share/autoconf' + ], + [ + '/usr/local/Cellar/autoconf/2.71/share/autoconf/autoconf/autoconf.m4f', + '/usr/local/Cellar/automake/1.16.5/share/aclocal-1.16/internal/ac-config-macro-dirs.m4', + '/usr/local/share/aclocal/libtool.m4', + '/usr/local/share/aclocal/ltargz.m4', + '/usr/local/share/aclocal/ltdl.m4', + '/usr/local/share/aclocal/ltoptions.m4', + '/usr/local/share/aclocal/ltsugar.m4', + '/usr/local/share/aclocal/ltversion.m4', + '/usr/local/share/aclocal/lt~obsolete.m4', + '/usr/local/Cellar/automake/1.16.5/share/aclocal-1.16/amversion.m4', + '/usr/local/Cellar/automake/1.16.5/share/aclocal-1.16/auxdir.m4', + '/usr/local/Cellar/automake/1.16.5/share/aclocal-1.16/cond.m4', + '/usr/local/Cellar/automake/1.16.5/share/aclocal-1.16/depend.m4', + '/usr/local/Cellar/automake/1.16.5/share/aclocal-1.16/depout.m4', + '/usr/local/Cellar/automake/1.16.5/share/aclocal-1.16/init.m4', + '/usr/local/Cellar/automake/1.16.5/share/aclocal-1.16/install-sh.m4', + '/usr/local/Cellar/automake/1.16.5/share/aclocal-1.16/lead-dot.m4', + '/usr/local/Cellar/automake/1.16.5/share/aclocal-1.16/maintainer.m4', + '/usr/local/Cellar/automake/1.16.5/share/aclocal-1.16/make.m4', + '/usr/local/Cellar/automake/1.16.5/share/aclocal-1.16/missing.m4', + '/usr/local/Cellar/automake/1.16.5/share/aclocal-1.16/options.m4', + '/usr/local/Cellar/automake/1.16.5/share/aclocal-1.16/prog-cc-c-o.m4', + '/usr/local/Cellar/automake/1.16.5/share/aclocal-1.16/runlog.m4', + '/usr/local/Cellar/automake/1.16.5/share/aclocal-1.16/sanity.m4', + '/usr/local/Cellar/automake/1.16.5/share/aclocal-1.16/silent.m4', + '/usr/local/Cellar/automake/1.16.5/share/aclocal-1.16/strip.m4', + '/usr/local/Cellar/automake/1.16.5/share/aclocal-1.16/substnot.m4', + '/usr/local/Cellar/automake/1.16.5/share/aclocal-1.16/tar.m4', + 'configure.ac' + ], + { + 'AC_LIBTOOL_LINKER_OPTION' => 1, + 'LT_WITH_LTDL' => 1, + 'AC_LIBLTDL_CONVENIENCE' => 1, + 'AC_LTDL_SYSSEARCHPATH' => 1, + 'LT_LIB_DLLOAD' => 1, + 'AM_AUTOMAKE_VERSION' => 1, + 'AC_CONFIG_MACRO_DIR_TRACE' => 1, + 'LTOBSOLETE_VERSION' => 1, + '_AM_MANGLE_OPTION' => 1, + 'AM_DEP_TRACK' => 1, + 'LTDL_INSTALLABLE' => 1, + 'AM_PROG_INSTALL_SH' => 1, + 'AM_PROG_LD' => 1, + 'AM_SET_DEPDIR' => 1, + 'AC_LIBTOOL_SYS_OLD_ARCHIVE' => 1, + 'AM_INIT_AUTOMAKE' => 1, + 'm4_pattern_forbid' => 1, + '_AC_PROG_LIBTOOL' => 1, + 'AC_LIBTOOL_SYS_MAX_CMD_LEN' => 1, + 'LT_SYS_SYMBOL_USCORE' => 1, + 'AC_LIBTOOL_RC' => 1, + '_LT_REQUIRED_DARWIN_CHECKS' => 1, + 'AM_DISABLE_SHARED' => 1, + 'AC_PATH_TOOL_PREFIX' => 1, + '_LT_AC_LANG_CXX_CONFIG' => 1, + 'LT_AC_PROG_SED' => 1, + 'AC_PROG_NM' => 1, + 'AM_ENABLE_SHARED' => 1, + 'AC_LIBTOOL_LANG_GCJ_CONFIG' => 1, + 'LTDL_CONVENIENCE' => 1, + 'AC_CONFIG_MACRO_DIR' => 1, + '_LT_AC_LANG_GCJ_CONFIG' => 1, + 'AM_PROG_CC_C_O' => 1, + 'LT_AC_PROG_EGREP' => 1, + 'AC_LTDL_SHLIBEXT' => 1, + 'AM_ENABLE_STATIC' => 1, + '_LT_COMPILER_BOILERPLATE' => 1, + '_AM_SET_OPTIONS' => 1, + '_LT_AC_LANG_F77_CONFIG' => 1, + 'AM_SILENT_RULES' => 1, + 'AC_LIBTOOL_LANG_CXX_CONFIG' => 1, + '_AM_CONFIG_MACRO_DIRS' => 1, + 'm4_pattern_allow' => 1, + 'AU_DEFUN' => 1, + 'AM_RUN_LOG' => 1, + 'AC_PROG_LD_RELOAD_FLAG' => 1, + '_AM_DEPENDENCIES' => 1, + 'LTOPTIONS_VERSION' => 1, + 'AM_SUBST_NOTMAKE' => 1, + 'LT_SYS_DLSEARCH_PATH' => 1, + 'LT_FUNC_DLSYM_USCORE' => 1, + 'AC_LIBTOOL_CXX' => 1, + 'AC_LTDL_SYMBOL_USCORE' => 1, + 'AM_PROG_LIBTOOL' => 1, + 'LT_PROG_GO' => 1, + 'AM_MAINTAINER_MODE' => 1, + 'AC_LTDL_SHLIBPATH' => 1, + '_AM_SET_OPTION' => 1, + 'AC_DEFUN' => 1, + 'AM_CONDITIONAL' => 1, + 'LT_INIT' => 1, + '_LT_AC_CHECK_DLFCN' => 1, + '_LT_PROG_F77' => 1, + '_AM_IF_OPTION' => 1, + 'AC_LIBTOOL_SETUP' => 1, + '_LT_PATH_TOOL_PREFIX' => 1, + 'AC_PROG_LD_GNU' => 1, + '_AM_SUBST_NOTMAKE' => 1, + 'AC_LIBTOOL_PROG_CC_C_O' => 1, + 'AC_LIBTOOL_PROG_LD_SHLIBS' => 1, + 'AC_CHECK_LIBM' => 1, + '_m4_warn' => 1, + 'AC_LIBTOOL_FC' => 1, + 'LT_PATH_LD' => 1, + '_LT_WITH_SYSROOT' => 1, + 'LT_SYS_DLOPEN_SELF' => 1, + '_LT_PROG_CXX' => 1, + 'LT_AC_PROG_RC' => 1, + '_LT_AC_LOCK' => 1, + 'LT_SYS_MODULE_EXT' => 1, + 'AM_DISABLE_STATIC' => 1, + '_LT_LIBOBJ' => 1, + '_LT_AC_PROG_CXXCPP' => 1, + 'AC_LIBTOOL_LANG_RC_CONFIG' => 1, + 'LTDL_INIT' => 1, + 'LT_OUTPUT' => 1, + 'LT_PROG_GCJ' => 1, + '_LT_COMPILER_OPTION' => 1, + 'LT_SYS_DLOPEN_DEPLIBS' => 1, + 'AC_WITH_LTDL' => 1, + '_LT_LINKER_BOILERPLATE' => 1, + '_LT_AC_SHELL_INIT' => 1, + 'LT_SUPPORTED_TAG' => 1, + 'AC_LTDL_ENABLE_INSTALL' => 1, + 'LTVERSION_VERSION' => 1, + 'AC_LIBTOOL_WIN32_DLL' => 1, + 'AM_MISSING_HAS_RUN' => 1, + 'AC_LIBTOOL_PROG_COMPILER_NO_RTTI' => 1, + '_LT_AC_LANG_RC_CONFIG' => 1, + 'AC_DISABLE_STATIC' => 1, + 'AC_DISABLE_FAST_INSTALL' => 1, + '_LT_PROG_LTMAIN' => 1, + '_LT_AC_PROG_ECHO_BACKSLASH' => 1, + 'AM_AUX_DIR_EXPAND' => 1, + '_LT_AC_SYS_COMPILER' => 1, + 'AM_SANITY_CHECK' => 1, + '_LT_PROG_FC' => 1, + 'AC_LIBTOOL_PROG_COMPILER_PIC' => 1, + 'AC_LIBTOOL_GCJ' => 1, + 'AC_LIBTOOL_SYS_HARD_LINK_LOCKS' => 1, + 'AC_PROG_LIBTOOL' => 1, + '_AM_AUTOCONF_VERSION' => 1, + 'AC_ENABLE_FAST_INSTALL' => 1, + 'LT_PATH_NM' => 1, + '_LT_CC_BASENAME' => 1, + 'AC_DEFUN_ONCE' => 1, + '_LTDL_SETUP' => 1, + '_AM_OUTPUT_DEPENDENCY_COMMANDS' => 1, + 'AC_LIBTOOL_CONFIG' => 1, + 'LT_CONFIG_LTDL_DIR' => 1, + 'AC_LTDL_OBJDIR' => 1, + '_LT_AC_FILE_LTDLL_C' => 1, + 'AC_LTDL_DLSYM_USCORE' => 1, + 'AC_LIBTOOL_OBJDIR' => 1, + 'AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH' => 1, + 'AC_LIBLTDL_INSTALLABLE' => 1, + 'AC_LTDL_DLLIB' => 1, + 'AC_LIBTOOL_LANG_C_CONFIG' => 1, + 'AC_DISABLE_SHARED' => 1, + 'AM_OUTPUT_DEPENDENCY_COMMANDS' => 1, + '_LT_AC_TAGVAR' => 1, + 'AC_ENABLE_SHARED' => 1, + 'AM_PROG_NM' => 1, + 'AC_LIBTOOL_COMPILER_OPTION' => 1, + 'AM_PROG_INSTALL_STRIP' => 1, + 'AC_LIBTOOL_PICMODE' => 1, + 'AM_SET_LEADING_DOT' => 1, + 'AC_DEPLIBS_CHECK_METHOD' => 1, + '_LT_PREPARE_SED_QUOTE_VARS' => 1, + 'AC_LIBTOOL_DLOPEN_SELF' => 1, + 'AC_LIB_LTDL' => 1, + 'LT_LIB_M' => 1, + 'AC_ENABLE_STATIC' => 1, + 'AC_PATH_MAGIC' => 1, + 'AC_LIBTOOL_F77' => 1, + 'AC_LIBTOOL_LANG_F77_CONFIG' => 1, + 'LT_LANG' => 1, + '_LT_LINKER_OPTION' => 1, + 'AM_MISSING_PROG' => 1, + 'LTSUGAR_VERSION' => 1, + 'include' => 1, + '_AM_PROG_CC_C_O' => 1, + 'LT_AC_PROG_GCJ' => 1, + 'AC_LIBTOOL_SYS_LIB_STRIP' => 1, + '_LT_AC_TAGCONFIG' => 1, + '_AM_PROG_TAR' => 1, + 'AM_MAKE_INCLUDE' => 1, + '_LT_AC_LANG_F77' => 1, + 'AC_LTDL_PREOPEN' => 1, + 'AC_LIBTOOL_DLOPEN' => 1, + 'LT_CMD_MAX_LEN' => 1, + 'AC_LIBTOOL_POSTDEP_PREDEP' => 1, + '_LT_AC_SYS_LIBPATH_AIX' => 1, + '_LT_AC_TRY_DLOPEN_SELF' => 1, + 'AC_PROG_EGREP' => 1, + 'LT_PROG_RC' => 1, + 'AC_LTDL_SYS_DLOPEN_DEPLIBS' => 1, + '_AC_AM_CONFIG_HEADER_HOOK' => 1, + 'AC_LIBTOOL_SYS_DYNAMIC_LINKER' => 1, + 'AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE' => 1, + 'LT_FUNC_ARGZ' => 1, + 'AM_SET_CURRENT_AUTOMAKE_VERSION' => 1, + '_LT_PROG_ECHO_BACKSLASH' => 1, + '_LT_AC_LANG_CXX' => 1, + 'LT_SYS_MODULE_PATH' => 1, + '_LT_AC_LANG_C_CONFIG' => 1, + 'AC_PROG_LD' => 1, + '_LT_DLL_DEF_P' => 1, + '_LT_AC_LANG_GCJ' => 1, + 'm4_include' => 1 + } + ], 'Autom4te::Request' ), + bless( [ + '1', + 1, + [ + '/usr/local/Cellar/autoconf/2.71/share/autoconf' + ], + [ + '/usr/local/Cellar/autoconf/2.71/share/autoconf/autoconf/autoconf.m4f', + 'aclocal.m4', + 'configure.ac' + ], + { + '_m4_warn' => 1, + 'AC_PROG_LIBTOOL' => 1, + 'AM_PROG_CC_C_O' => 1, + 'AM_PROG_FC_C_O' => 1, + 'AM_PROG_MKDIR_P' => 1, + 'sinclude' => 1, + 'GTK_DOC_CHECK' => 1, + 'AC_LIBSOURCE' => 1, + 'AC_CONFIG_FILES' => 1, + 'AM_PROG_F77_C_O' => 1, + 'AC_CANONICAL_SYSTEM' => 1, + 'AC_REQUIRE_AUX_FILE' => 1, + '_AM_SUBST_NOTMAKE' => 1, + 'm4_sinclude' => 1, + 'AM_PROG_AR' => 1, + 'm4_include' => 1, + 'AM_NLS' => 1, + 'AM_XGETTEXT_OPTION' => 1, + 'LT_CONFIG_LTDL_DIR' => 1, + 'AM_SILENT_RULES' => 1, + 'm4_pattern_allow' => 1, + '_AM_COND_ENDIF' => 1, + 'AC_CANONICAL_HOST' => 1, + 'AM_PATH_GUILE' => 1, + 'AC_SUBST_TRACE' => 1, + 'IT_PROG_INTLTOOL' => 1, + 'AM_PROG_LIBTOOL' => 1, + 'AM_ENABLE_MULTILIB' => 1, + 'AC_CONFIG_MACRO_DIR_TRACE' => 1, + 'AM_AUTOMAKE_VERSION' => 1, + 'AM_MAINTAINER_MODE' => 1, + 'AC_CANONICAL_BUILD' => 1, + 'AM_PROG_MOC' => 1, + 'AC_CONFIG_LIBOBJ_DIR' => 1, + 'AM_PROG_CXX_C_O' => 1, + 'AC_CONFIG_AUX_DIR' => 1, + 'LT_SUPPORTED_TAG' => 1, + 'AM_EXTRA_RECURSIVE_TARGETS' => 1, + '_AM_COND_ELSE' => 1, + 'AC_FC_PP_DEFINE' => 1, + 'AM_MAKEFILE_INCLUDE' => 1, + 'AH_OUTPUT' => 1, + 'AM_POT_TOOLS' => 1, + 'AC_FC_FREEFORM' => 1, + 'AC_FC_SRCEXT' => 1, + 'AC_DEFINE_TRACE_LITERAL' => 1, + 'AC_CONFIG_HEADERS' => 1, + 'AC_CANONICAL_TARGET' => 1, + '_LT_AC_TAGCONFIG' => 1, + 'include' => 1, + '_AM_MAKEFILE_INCLUDE' => 1, + 'AM_INIT_AUTOMAKE' => 1, + 'm4_pattern_forbid' => 1, + 'AC_CONFIG_SUBDIRS' => 1, + 'AC_SUBST' => 1, + 'AM_GNU_GETTEXT_INTL_SUBDIR' => 1, + 'AM_CONDITIONAL' => 1, + 'AC_CONFIG_LINKS' => 1, + 'LT_INIT' => 1, + 'AC_FC_PP_SRCEXT' => 1, + 'AM_GNU_GETTEXT' => 1, + '_AM_COND_IF' => 1, + 'AC_INIT' => 1 + } + ], 'Autom4te::Request' ), + bless( [ + '2', + 1, + [ + '/usr/local/Cellar/autoconf/2.71/share/autoconf' + ], + [ + '/usr/local/Cellar/autoconf/2.71/share/autoconf/autoconf/autoconf.m4f', + 'aclocal.m4', + '/usr/local/Cellar/autoconf/2.71/share/autoconf/autoconf/trailer.m4', + 'configure.ac' + ], + { + 'GTK_DOC_CHECK' => 1, + 'AC_LIBSOURCE' => 1, + 'AM_PROG_MKDIR_P' => 1, + 'sinclude' => 1, + 'AM_PROG_CC_C_O' => 1, + 'AM_PROG_FC_C_O' => 1, + '_m4_warn' => 1, + 'AC_PROG_LIBTOOL' => 1, + 'm4_sinclude' => 1, + 'AM_PROG_AR' => 1, + '_AM_SUBST_NOTMAKE' => 1, + 'AC_REQUIRE_AUX_FILE' => 1, + 'AM_PROG_F77_C_O' => 1, + 'AC_CANONICAL_SYSTEM' => 1, + 'AC_CONFIG_FILES' => 1, + 'm4_pattern_allow' => 1, + '_AM_COND_ENDIF' => 1, + 'LT_CONFIG_LTDL_DIR' => 1, + 'AM_SILENT_RULES' => 1, + 'AM_XGETTEXT_OPTION' => 1, + 'm4_include' => 1, + 'AM_NLS' => 1, + 'AC_SUBST_TRACE' => 1, + 'IT_PROG_INTLTOOL' => 1, + 'AC_CANONICAL_HOST' => 1, + 'AM_PATH_GUILE' => 1, + 'AC_CONFIG_AUX_DIR' => 1, + 'LT_SUPPORTED_TAG' => 1, + 'AM_EXTRA_RECURSIVE_TARGETS' => 1, + 'AM_PROG_MOC' => 1, + 'AC_CONFIG_LIBOBJ_DIR' => 1, + 'AM_PROG_CXX_C_O' => 1, + 'AM_MAINTAINER_MODE' => 1, + 'AC_CANONICAL_BUILD' => 1, + 'AM_PROG_LIBTOOL' => 1, + 'AM_ENABLE_MULTILIB' => 1, + 'AC_CONFIG_MACRO_DIR_TRACE' => 1, + 'AM_AUTOMAKE_VERSION' => 1, + 'AC_FC_SRCEXT' => 1, + 'AC_DEFINE_TRACE_LITERAL' => 1, + 'AH_OUTPUT' => 1, + 'AM_MAKEFILE_INCLUDE' => 1, + 'AM_POT_TOOLS' => 1, + 'AC_FC_FREEFORM' => 1, + '_AM_COND_ELSE' => 1, + 'AC_FC_PP_DEFINE' => 1, + '_AM_MAKEFILE_INCLUDE' => 1, + 'AM_INIT_AUTOMAKE' => 1, + 'm4_pattern_forbid' => 1, + 'include' => 1, + 'AC_CANONICAL_TARGET' => 1, + 'AC_CONFIG_HEADERS' => 1, + '_LT_AC_TAGCONFIG' => 1, + 'AM_GNU_GETTEXT' => 1, + 'AC_FC_PP_SRCEXT' => 1, + 'AC_INIT' => 1, + '_AM_COND_IF' => 1, + 'AM_GNU_GETTEXT_INTL_SUBDIR' => 1, + 'AM_CONDITIONAL' => 1, + 'LT_INIT' => 1, + 'AC_CONFIG_LINKS' => 1, + 'AC_CONFIG_SUBDIRS' => 1, + 'AC_SUBST' => 1 + } + ], 'Autom4te::Request' ) + ); + diff --git a/bindings/cpp/autom4te.cache/traces.0 b/bindings/cpp/autom4te.cache/traces.0 new file mode 100644 index 0000000..f7433e3 --- /dev/null +++ b/bindings/cpp/autom4te.cache/traces.0 @@ -0,0 +1,2802 @@ +m4trace:/usr/local/share/aclocal/libtool.m4:61: -1- AC_DEFUN([LT_INIT], [AC_PREREQ([2.62])dnl We use AC_PATH_PROGS_FEATURE_CHECK +AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl +AC_BEFORE([$0], [LT_LANG])dnl +AC_BEFORE([$0], [LT_OUTPUT])dnl +AC_BEFORE([$0], [LTDL_INIT])dnl +m4_require([_LT_CHECK_BUILDDIR])dnl + +dnl Autoconf doesn't catch unexpanded LT_ macros by default: +m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl +m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl +dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4 +dnl unless we require an AC_DEFUNed macro: +AC_REQUIRE([LTOPTIONS_VERSION])dnl +AC_REQUIRE([LTSUGAR_VERSION])dnl +AC_REQUIRE([LTVERSION_VERSION])dnl +AC_REQUIRE([LTOBSOLETE_VERSION])dnl +m4_require([_LT_PROG_LTMAIN])dnl + +_LT_SHELL_INIT([SHELL=${CONFIG_SHELL-/bin/sh}]) + +dnl Parse OPTIONS +_LT_SET_OPTIONS([$0], [$1]) + +# This can be used to rebuild libtool when needed +LIBTOOL_DEPS=$ltmain + +# Always use our own libtool. +LIBTOOL='$(SHELL) $(top_builddir)/libtool' +AC_SUBST(LIBTOOL)dnl + +_LT_SETUP + +# Only expand once: +m4_define([LT_INIT]) +]) +m4trace:/usr/local/share/aclocal/libtool.m4:99: -1- AU_DEFUN([AC_PROG_LIBTOOL], [m4_if($#, 0, [LT_INIT], [LT_INIT($@)])], [], []) +m4trace:/usr/local/share/aclocal/libtool.m4:99: -1- AC_DEFUN([AC_PROG_LIBTOOL], [m4_warn([obsolete], [The macro `AC_PROG_LIBTOOL' is obsolete. +You should run autoupdate.])dnl +m4_if($#, 0, [LT_INIT], [LT_INIT($@)])]) +m4trace:/usr/local/share/aclocal/libtool.m4:100: -1- AU_DEFUN([AM_PROG_LIBTOOL], [m4_if($#, 0, [LT_INIT], [LT_INIT($@)])], [], []) +m4trace:/usr/local/share/aclocal/libtool.m4:100: -1- AC_DEFUN([AM_PROG_LIBTOOL], [m4_warn([obsolete], [The macro `AM_PROG_LIBTOOL' is obsolete. +You should run autoupdate.])dnl +m4_if($#, 0, [LT_INIT], [LT_INIT($@)])]) +m4trace:/usr/local/share/aclocal/libtool.m4:619: -1- AC_DEFUN([LT_OUTPUT], [: ${CONFIG_LT=./config.lt} +AC_MSG_NOTICE([creating $CONFIG_LT]) +_LT_GENERATED_FILE_INIT(["$CONFIG_LT"], +[# Run this file to recreate a libtool stub with the current configuration.]) + +cat >>"$CONFIG_LT" <<\_LTEOF +lt_cl_silent=false +exec AS_MESSAGE_LOG_FD>>config.log +{ + echo + AS_BOX([Running $as_me.]) +} >&AS_MESSAGE_LOG_FD + +lt_cl_help="\ +'$as_me' creates a local libtool stub from the current configuration, +for use in further configure time tests before the real libtool is +generated. + +Usage: $[0] [[OPTIONS]] + + -h, --help print this help, then exit + -V, --version print version number, then exit + -q, --quiet do not print progress messages + -d, --debug don't remove temporary files + +Report bugs to ." + +lt_cl_version="\ +m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl +m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION]) +configured by $[0], generated by m4_PACKAGE_STRING. + +Copyright (C) 2011 Free Software Foundation, Inc. +This config.lt script is free software; the Free Software Foundation +gives unlimited permision to copy, distribute and modify it." + +while test 0 != $[#] +do + case $[1] in + --version | --v* | -V ) + echo "$lt_cl_version"; exit 0 ;; + --help | --h* | -h ) + echo "$lt_cl_help"; exit 0 ;; + --debug | --d* | -d ) + debug=: ;; + --quiet | --q* | --silent | --s* | -q ) + lt_cl_silent=: ;; + + -*) AC_MSG_ERROR([unrecognized option: $[1] +Try '$[0] --help' for more information.]) ;; + + *) AC_MSG_ERROR([unrecognized argument: $[1] +Try '$[0] --help' for more information.]) ;; + esac + shift +done + +if $lt_cl_silent; then + exec AS_MESSAGE_FD>/dev/null +fi +_LTEOF + +cat >>"$CONFIG_LT" <<_LTEOF +_LT_OUTPUT_LIBTOOL_COMMANDS_INIT +_LTEOF + +cat >>"$CONFIG_LT" <<\_LTEOF +AC_MSG_NOTICE([creating $ofile]) +_LT_OUTPUT_LIBTOOL_COMMANDS +AS_EXIT(0) +_LTEOF +chmod +x "$CONFIG_LT" + +# configure is writing to config.log, but config.lt does its own redirection, +# appending to config.log, which fails on DOS, as config.log is still kept +# open by configure. Here we exec the FD to /dev/null, effectively closing +# config.log, so it can be properly (re)opened and appended to by config.lt. +lt_cl_success=: +test yes = "$silent" && + lt_config_lt_args="$lt_config_lt_args --quiet" +exec AS_MESSAGE_LOG_FD>/dev/null +$SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false +exec AS_MESSAGE_LOG_FD>>config.log +$lt_cl_success || AS_EXIT(1) +]) +m4trace:/usr/local/share/aclocal/libtool.m4:812: -1- AC_DEFUN([LT_SUPPORTED_TAG], []) +m4trace:/usr/local/share/aclocal/libtool.m4:823: -1- AC_DEFUN([LT_LANG], [AC_BEFORE([$0], [LT_OUTPUT])dnl +m4_case([$1], + [C], [_LT_LANG(C)], + [C++], [_LT_LANG(CXX)], + [Go], [_LT_LANG(GO)], + [Java], [_LT_LANG(GCJ)], + [Fortran 77], [_LT_LANG(F77)], + [Fortran], [_LT_LANG(FC)], + [Windows Resource], [_LT_LANG(RC)], + [m4_ifdef([_LT_LANG_]$1[_CONFIG], + [_LT_LANG($1)], + [m4_fatal([$0: unsupported language: "$1"])])])dnl +]) +m4trace:/usr/local/share/aclocal/libtool.m4:915: -1- AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)]) +m4trace:/usr/local/share/aclocal/libtool.m4:915: -1- AC_DEFUN([AC_LIBTOOL_CXX], [m4_warn([obsolete], [The macro `AC_LIBTOOL_CXX' is obsolete. +You should run autoupdate.])dnl +LT_LANG(C++)]) +m4trace:/usr/local/share/aclocal/libtool.m4:916: -1- AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)]) +m4trace:/usr/local/share/aclocal/libtool.m4:916: -1- AC_DEFUN([AC_LIBTOOL_F77], [m4_warn([obsolete], [The macro `AC_LIBTOOL_F77' is obsolete. +You should run autoupdate.])dnl +LT_LANG(Fortran 77)]) +m4trace:/usr/local/share/aclocal/libtool.m4:917: -1- AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)]) +m4trace:/usr/local/share/aclocal/libtool.m4:917: -1- AC_DEFUN([AC_LIBTOOL_FC], [m4_warn([obsolete], [The macro `AC_LIBTOOL_FC' is obsolete. +You should run autoupdate.])dnl +LT_LANG(Fortran)]) +m4trace:/usr/local/share/aclocal/libtool.m4:918: -1- AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)]) +m4trace:/usr/local/share/aclocal/libtool.m4:918: -1- AC_DEFUN([AC_LIBTOOL_GCJ], [m4_warn([obsolete], [The macro `AC_LIBTOOL_GCJ' is obsolete. +You should run autoupdate.])dnl +LT_LANG(Java)]) +m4trace:/usr/local/share/aclocal/libtool.m4:919: -1- AU_DEFUN([AC_LIBTOOL_RC], [LT_LANG(Windows Resource)]) +m4trace:/usr/local/share/aclocal/libtool.m4:919: -1- AC_DEFUN([AC_LIBTOOL_RC], [m4_warn([obsolete], [The macro `AC_LIBTOOL_RC' is obsolete. +You should run autoupdate.])dnl +LT_LANG(Windows Resource)]) +m4trace:/usr/local/share/aclocal/libtool.m4:1242: -1- AC_DEFUN([_LT_WITH_SYSROOT], [AC_MSG_CHECKING([for sysroot]) +AC_ARG_WITH([sysroot], +[AS_HELP_STRING([--with-sysroot@<:@=DIR@:>@], + [Search for dependent libraries within DIR (or the compiler's sysroot + if not specified).])], +[], [with_sysroot=no]) + +dnl lt_sysroot will always be passed unquoted. We quote it here +dnl in case the user passed a directory name. +lt_sysroot= +case $with_sysroot in #( + yes) + if test yes = "$GCC"; then + lt_sysroot=`$CC --print-sysroot 2>/dev/null` + fi + ;; #( + /*) + lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` + ;; #( + no|'') + ;; #( + *) + AC_MSG_RESULT([$with_sysroot]) + AC_MSG_ERROR([The sysroot must be an absolute path.]) + ;; +esac + + AC_MSG_RESULT([${lt_sysroot:-no}]) +_LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl +[dependent libraries, and where our libraries should be installed.])]) +m4trace:/usr/local/share/aclocal/libtool.m4:1573: -1- AC_DEFUN([_LT_COMPILER_OPTION], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_SED])dnl +AC_CACHE_CHECK([$1], [$2], + [$2=no + m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$3" ## exclude from sc_useless_quotes_in_assignment + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&AS_MESSAGE_LOG_FD + echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + $2=yes + fi + fi + $RM conftest* +]) + +if test yes = "[$]$2"; then + m4_if([$5], , :, [$5]) +else + m4_if([$6], , :, [$6]) +fi +]) +m4trace:/usr/local/share/aclocal/libtool.m4:1615: -1- AU_DEFUN([AC_LIBTOOL_COMPILER_OPTION], [m4_if($#, 0, [_LT_COMPILER_OPTION], [_LT_COMPILER_OPTION($@)])], [], []) +m4trace:/usr/local/share/aclocal/libtool.m4:1615: -1- AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], [m4_warn([obsolete], [The macro `AC_LIBTOOL_COMPILER_OPTION' is obsolete. +You should run autoupdate.])dnl +m4_if($#, 0, [_LT_COMPILER_OPTION], [_LT_COMPILER_OPTION($@)])]) +m4trace:/usr/local/share/aclocal/libtool.m4:1624: -1- AC_DEFUN([_LT_LINKER_OPTION], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_SED])dnl +AC_CACHE_CHECK([$1], [$2], + [$2=no + save_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS $3" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&AS_MESSAGE_LOG_FD + $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + $2=yes + fi + else + $2=yes + fi + fi + $RM -r conftest* + LDFLAGS=$save_LDFLAGS +]) + +if test yes = "[$]$2"; then + m4_if([$4], , :, [$4]) +else + m4_if([$5], , :, [$5]) +fi +]) +m4trace:/usr/local/share/aclocal/libtool.m4:1659: -1- AU_DEFUN([AC_LIBTOOL_LINKER_OPTION], [m4_if($#, 0, [_LT_LINKER_OPTION], [_LT_LINKER_OPTION($@)])], [], []) +m4trace:/usr/local/share/aclocal/libtool.m4:1659: -1- AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], [m4_warn([obsolete], [The macro `AC_LIBTOOL_LINKER_OPTION' is obsolete. +You should run autoupdate.])dnl +m4_if($#, 0, [_LT_LINKER_OPTION], [_LT_LINKER_OPTION($@)])]) +m4trace:/usr/local/share/aclocal/libtool.m4:1666: -1- AC_DEFUN([LT_CMD_MAX_LEN], [AC_REQUIRE([AC_CANONICAL_HOST])dnl +# find the maximum length of command line arguments +AC_MSG_CHECKING([the maximum length of command line arguments]) +AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl + i=0 + teststring=ABCD + + case $build_os in + msdosdjgpp*) + # On DJGPP, this test can blow up pretty badly due to problems in libc + # (any single argument exceeding 2000 bytes causes a buffer overrun + # during glob expansion). Even if it were fixed, the result of this + # check would be larger than it should be. + lt_cv_sys_max_cmd_len=12288; # 12K is about right + ;; + + gnu*) + # Under GNU Hurd, this test is not required because there is + # no limit to the length of command line arguments. + # Libtool will interpret -1 as no limit whatsoever + lt_cv_sys_max_cmd_len=-1; + ;; + + cygwin* | mingw* | cegcc*) + # On Win9x/ME, this test blows up -- it succeeds, but takes + # about 5 minutes as the teststring grows exponentially. + # Worse, since 9x/ME are not pre-emptively multitasking, + # you end up with a "frozen" computer, even though with patience + # the test eventually succeeds (with a max line length of 256k). + # Instead, let's just punt: use the minimum linelength reported by + # all of the supported platforms: 8192 (on NT/2K/XP). + lt_cv_sys_max_cmd_len=8192; + ;; + + mint*) + # On MiNT this can take a long time and run out of memory. + lt_cv_sys_max_cmd_len=8192; + ;; + + amigaos*) + # On AmigaOS with pdksh, this test takes hours, literally. + # So we just punt and use a minimum line length of 8192. + lt_cv_sys_max_cmd_len=8192; + ;; + + bitrig* | darwin* | dragonfly* | freebsd* | netbsd* | openbsd*) + # This has been around since 386BSD, at least. Likely further. + if test -x /sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` + elif test -x /usr/sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` + else + lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs + fi + # And add a safety zone + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + ;; + + interix*) + # We know the value 262144 and hardcode it with a safety zone (like BSD) + lt_cv_sys_max_cmd_len=196608 + ;; + + os2*) + # The test takes a long time on OS/2. + lt_cv_sys_max_cmd_len=8192 + ;; + + osf*) + # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure + # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not + # nice to cause kernel panics so lets avoid the loop below. + # First set a reasonable default. + lt_cv_sys_max_cmd_len=16384 + # + if test -x /sbin/sysconfig; then + case `/sbin/sysconfig -q proc exec_disable_arg_limit` in + *1*) lt_cv_sys_max_cmd_len=-1 ;; + esac + fi + ;; + sco3.2v5*) + lt_cv_sys_max_cmd_len=102400 + ;; + sysv5* | sco5v6* | sysv4.2uw2*) + kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` + if test -n "$kargmax"; then + lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ ]]//'` + else + lt_cv_sys_max_cmd_len=32768 + fi + ;; + *) + lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` + if test -n "$lt_cv_sys_max_cmd_len" && \ + test undefined != "$lt_cv_sys_max_cmd_len"; then + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + else + # Make teststring a little bigger before we do anything with it. + # a 1K string should be a reasonable start. + for i in 1 2 3 4 5 6 7 8; do + teststring=$teststring$teststring + done + SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} + # If test is not a shell built-in, we'll probably end up computing a + # maximum length that is only half of the actual maximum length, but + # we can't tell. + while { test X`env echo "$teststring$teststring" 2>/dev/null` \ + = "X$teststring$teststring"; } >/dev/null 2>&1 && + test 17 != "$i" # 1/2 MB should be enough + do + i=`expr $i + 1` + teststring=$teststring$teststring + done + # Only check the string length outside the loop. + lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` + teststring= + # Add a significant safety factor because C++ compilers can tack on + # massive amounts of additional arguments before passing them to the + # linker. It appears as though 1/2 is a usable value. + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` + fi + ;; + esac +]) +if test -n "$lt_cv_sys_max_cmd_len"; then + AC_MSG_RESULT($lt_cv_sys_max_cmd_len) +else + AC_MSG_RESULT(none) +fi +max_cmd_len=$lt_cv_sys_max_cmd_len +_LT_DECL([], [max_cmd_len], [0], + [What is the maximum length of a command?]) +]) +m4trace:/usr/local/share/aclocal/libtool.m4:1805: -1- AU_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], [m4_if($#, 0, [LT_CMD_MAX_LEN], [LT_CMD_MAX_LEN($@)])], [], []) +m4trace:/usr/local/share/aclocal/libtool.m4:1805: -1- AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], [m4_warn([obsolete], [The macro `AC_LIBTOOL_SYS_MAX_CMD_LEN' is obsolete. +You should run autoupdate.])dnl +m4_if($#, 0, [LT_CMD_MAX_LEN], [LT_CMD_MAX_LEN($@)])]) +m4trace:/usr/local/share/aclocal/libtool.m4:1916: -1- AC_DEFUN([LT_SYS_DLOPEN_SELF], [m4_require([_LT_HEADER_DLFCN])dnl +if test yes != "$enable_dlopen"; then + enable_dlopen=unknown + enable_dlopen_self=unknown + enable_dlopen_self_static=unknown +else + lt_cv_dlopen=no + lt_cv_dlopen_libs= + + case $host_os in + beos*) + lt_cv_dlopen=load_add_on + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ;; + + mingw* | pw32* | cegcc*) + lt_cv_dlopen=LoadLibrary + lt_cv_dlopen_libs= + ;; + + cygwin*) + lt_cv_dlopen=dlopen + lt_cv_dlopen_libs= + ;; + + darwin*) + # if libdl is installed we need to link against it + AC_CHECK_LIB([dl], [dlopen], + [lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl],[ + lt_cv_dlopen=dyld + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ]) + ;; + + tpf*) + # Don't try to run any link tests for TPF. We know it's impossible + # because TPF is a cross-compiler, and we know how we open DSOs. + lt_cv_dlopen=dlopen + lt_cv_dlopen_libs= + lt_cv_dlopen_self=no + ;; + + *) + AC_CHECK_FUNC([shl_load], + [lt_cv_dlopen=shl_load], + [AC_CHECK_LIB([dld], [shl_load], + [lt_cv_dlopen=shl_load lt_cv_dlopen_libs=-ldld], + [AC_CHECK_FUNC([dlopen], + [lt_cv_dlopen=dlopen], + [AC_CHECK_LIB([dl], [dlopen], + [lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl], + [AC_CHECK_LIB([svld], [dlopen], + [lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-lsvld], + [AC_CHECK_LIB([dld], [dld_link], + [lt_cv_dlopen=dld_link lt_cv_dlopen_libs=-ldld]) + ]) + ]) + ]) + ]) + ]) + ;; + esac + + if test no = "$lt_cv_dlopen"; then + enable_dlopen=no + else + enable_dlopen=yes + fi + + case $lt_cv_dlopen in + dlopen) + save_CPPFLAGS=$CPPFLAGS + test yes = "$ac_cv_header_dlfcn_h" && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" + + save_LDFLAGS=$LDFLAGS + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" + + save_LIBS=$LIBS + LIBS="$lt_cv_dlopen_libs $LIBS" + + AC_CACHE_CHECK([whether a program can dlopen itself], + lt_cv_dlopen_self, [dnl + _LT_TRY_DLOPEN_SELF( + lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes, + lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) + ]) + + if test yes = "$lt_cv_dlopen_self"; then + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" + AC_CACHE_CHECK([whether a statically linked program can dlopen itself], + lt_cv_dlopen_self_static, [dnl + _LT_TRY_DLOPEN_SELF( + lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes, + lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross) + ]) + fi + + CPPFLAGS=$save_CPPFLAGS + LDFLAGS=$save_LDFLAGS + LIBS=$save_LIBS + ;; + esac + + case $lt_cv_dlopen_self in + yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; + *) enable_dlopen_self=unknown ;; + esac + + case $lt_cv_dlopen_self_static in + yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; + *) enable_dlopen_self_static=unknown ;; + esac +fi +_LT_DECL([dlopen_support], [enable_dlopen], [0], + [Whether dlopen is supported]) +_LT_DECL([dlopen_self], [enable_dlopen_self], [0], + [Whether dlopen of programs is supported]) +_LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0], + [Whether dlopen of statically linked programs is supported]) +]) +m4trace:/usr/local/share/aclocal/libtool.m4:2041: -1- AU_DEFUN([AC_LIBTOOL_DLOPEN_SELF], [m4_if($#, 0, [LT_SYS_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF($@)])], [], []) +m4trace:/usr/local/share/aclocal/libtool.m4:2041: -1- AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], [m4_warn([obsolete], [The macro `AC_LIBTOOL_DLOPEN_SELF' is obsolete. +You should run autoupdate.])dnl +m4_if($#, 0, [LT_SYS_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF($@)])]) +m4trace:/usr/local/share/aclocal/libtool.m4:3150: -1- AC_DEFUN([_LT_PATH_TOOL_PREFIX], [m4_require([_LT_DECL_EGREP])dnl +AC_MSG_CHECKING([for $1]) +AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, +[case $MAGIC_CMD in +[[\\/*] | ?:[\\/]*]) + lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD=$MAGIC_CMD + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR +dnl $ac_dummy forces splitting on constant user-supplied paths. +dnl POSIX.2 word splitting is done only on the output of word expansions, +dnl not every word. This closes a longstanding sh security hole. + ac_dummy="m4_if([$2], , $PATH, [$2])" + for ac_dir in $ac_dummy; do + IFS=$lt_save_ifs + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$1"; then + lt_cv_path_MAGIC_CMD=$ac_dir/"$1" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` + MAGIC_CMD=$lt_cv_path_MAGIC_CMD + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <<_LT_EOF 1>&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +_LT_EOF + fi ;; + esac + fi + break + fi + done + IFS=$lt_save_ifs + MAGIC_CMD=$lt_save_MAGIC_CMD + ;; +esac]) +MAGIC_CMD=$lt_cv_path_MAGIC_CMD +if test -n "$MAGIC_CMD"; then + AC_MSG_RESULT($MAGIC_CMD) +else + AC_MSG_RESULT(no) +fi +_LT_DECL([], [MAGIC_CMD], [0], + [Used to examine libraries when file_magic_cmd begins with "file"])dnl +]) +m4trace:/usr/local/share/aclocal/libtool.m4:3212: -1- AU_DEFUN([AC_PATH_TOOL_PREFIX], [m4_if($#, 0, [_LT_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX($@)])], [], []) +m4trace:/usr/local/share/aclocal/libtool.m4:3212: -1- AC_DEFUN([AC_PATH_TOOL_PREFIX], [m4_warn([obsolete], [The macro `AC_PATH_TOOL_PREFIX' is obsolete. +You should run autoupdate.])dnl +m4_if($#, 0, [_LT_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX($@)])]) +m4trace:/usr/local/share/aclocal/libtool.m4:3235: -1- AC_DEFUN([LT_PATH_LD], [AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_PROG_ECHO_BACKSLASH])dnl + +AC_ARG_WITH([gnu-ld], + [AS_HELP_STRING([--with-gnu-ld], + [assume the C compiler uses GNU ld @<:@default=no@:>@])], + [test no = "$withval" || with_gnu_ld=yes], + [with_gnu_ld=no])dnl + +ac_prog=ld +if test yes = "$GCC"; then + # Check if gcc -print-prog-name=ld gives a path. + AC_MSG_CHECKING([for ld used by $CC]) + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return, which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [[\\/]]* | ?:[[\\/]]*) + re_direlt='/[[^/]][[^/]]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` + while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do + ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` + done + test -z "$LD" && LD=$ac_prog + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test yes = "$with_gnu_ld"; then + AC_MSG_CHECKING([for GNU ld]) +else + AC_MSG_CHECKING([for non-GNU ld]) +fi +AC_CACHE_VAL(lt_cv_path_LD, +[if test -z "$LD"; then + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS=$lt_save_ifs + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD=$ac_dir/$ac_prog + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some variants of GNU ld only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 &1 | sed '1q'` in + *$lt_bad_file* | *'Invalid file or object type'*) + lt_cv_path_NM="$tmp_nm -B" + break 2 + ;; + *) + case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in + */dev/null*) + lt_cv_path_NM="$tmp_nm -p" + break 2 + ;; + *) + lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but + continue # so that we can try to find one that supports BSD flags + ;; + esac + ;; + esac + fi + done + IFS=$lt_save_ifs + done + : ${lt_cv_path_NM=no} +fi]) +if test no != "$lt_cv_path_NM"; then + NM=$lt_cv_path_NM +else + # Didn't find any BSD compatible name lister, look for dumpbin. + if test -n "$DUMPBIN"; then : + # Let the user override the test. + else + AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :) + case `$DUMPBIN -symbols -headers /dev/null 2>&1 | sed '1q'` in + *COFF*) + DUMPBIN="$DUMPBIN -symbols -headers" + ;; + *) + DUMPBIN=: + ;; + esac + fi + AC_SUBST([DUMPBIN]) + if test : != "$DUMPBIN"; then + NM=$DUMPBIN + fi +fi +test -z "$NM" && NM=nm +AC_SUBST([NM]) +_LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl + +AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface], + [lt_cv_nm_interface="BSD nm" + echo "int some_variable = 0;" > conftest.$ac_ext + (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$ac_compile" 2>conftest.err) + cat conftest.err >&AS_MESSAGE_LOG_FD + (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD) + (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) + cat conftest.err >&AS_MESSAGE_LOG_FD + (eval echo "\"\$as_me:$LINENO: output\"" >&AS_MESSAGE_LOG_FD) + cat conftest.out >&AS_MESSAGE_LOG_FD + if $GREP 'External.*some_variable' conftest.out > /dev/null; then + lt_cv_nm_interface="MS dumpbin" + fi + rm -f conftest*]) +]) +m4trace:/usr/local/share/aclocal/libtool.m4:3749: -1- AU_DEFUN([AM_PROG_NM], [m4_if($#, 0, [LT_PATH_NM], [LT_PATH_NM($@)])], [], []) +m4trace:/usr/local/share/aclocal/libtool.m4:3749: -1- AC_DEFUN([AM_PROG_NM], [m4_warn([obsolete], [The macro `AM_PROG_NM' is obsolete. +You should run autoupdate.])dnl +m4_if($#, 0, [LT_PATH_NM], [LT_PATH_NM($@)])]) +m4trace:/usr/local/share/aclocal/libtool.m4:3750: -1- AU_DEFUN([AC_PROG_NM], [m4_if($#, 0, [LT_PATH_NM], [LT_PATH_NM($@)])], [], []) +m4trace:/usr/local/share/aclocal/libtool.m4:3750: -1- AC_DEFUN([AC_PROG_NM], [m4_warn([obsolete], [The macro `AC_PROG_NM' is obsolete. +You should run autoupdate.])dnl +m4_if($#, 0, [LT_PATH_NM], [LT_PATH_NM($@)])]) +m4trace:/usr/local/share/aclocal/libtool.m4:3821: -1- AC_DEFUN([_LT_DLL_DEF_P], [dnl + test DEF = "`$SED -n dnl + -e '\''s/^[[ ]]*//'\'' dnl Strip leading whitespace + -e '\''/^\(;.*\)*$/d'\'' dnl Delete empty lines and comments + -e '\''s/^\(EXPORTS\|LIBRARY\)\([[ ]].*\)*$/DEF/p'\'' dnl + -e q dnl Only consider the first "real" line + $1`" dnl +]) +m4trace:/usr/local/share/aclocal/libtool.m4:3835: -1- AC_DEFUN([LT_LIB_M], [AC_REQUIRE([AC_CANONICAL_HOST])dnl +LIBM= +case $host in +*-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*) + # These system don't have libm, or don't need it + ;; +*-ncr-sysv4.3*) + AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM=-lmw) + AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") + ;; +*) + AC_CHECK_LIB(m, cos, LIBM=-lm) + ;; +esac +AC_SUBST([LIBM]) +]) +m4trace:/usr/local/share/aclocal/libtool.m4:3854: -1- AU_DEFUN([AC_CHECK_LIBM], [m4_if($#, 0, [LT_LIB_M], [LT_LIB_M($@)])], [], []) +m4trace:/usr/local/share/aclocal/libtool.m4:3854: -1- AC_DEFUN([AC_CHECK_LIBM], [m4_warn([obsolete], [The macro `AC_CHECK_LIBM' is obsolete. +You should run autoupdate.])dnl +m4_if($#, 0, [LT_LIB_M], [LT_LIB_M($@)])]) +m4trace:/usr/local/share/aclocal/libtool.m4:8117: -1- AC_DEFUN([LT_PROG_GCJ], [m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ], + [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ], + [AC_CHECK_TOOL(GCJ, gcj,) + test set = "${GCJFLAGS+set}" || GCJFLAGS="-g -O2" + AC_SUBST(GCJFLAGS)])])[]dnl +]) +m4trace:/usr/local/share/aclocal/libtool.m4:8126: -1- AU_DEFUN([LT_AC_PROG_GCJ], [m4_if($#, 0, [LT_PROG_GCJ], [LT_PROG_GCJ($@)])], [], []) +m4trace:/usr/local/share/aclocal/libtool.m4:8126: -1- AC_DEFUN([LT_AC_PROG_GCJ], [m4_warn([obsolete], [The macro `LT_AC_PROG_GCJ' is obsolete. +You should run autoupdate.])dnl +m4_if($#, 0, [LT_PROG_GCJ], [LT_PROG_GCJ($@)])]) +m4trace:/usr/local/share/aclocal/libtool.m4:8133: -1- AC_DEFUN([LT_PROG_GO], [AC_CHECK_TOOL(GOC, gccgo,) +]) +m4trace:/usr/local/share/aclocal/libtool.m4:8140: -1- AC_DEFUN([LT_PROG_RC], [AC_CHECK_TOOL(RC, windres,) +]) +m4trace:/usr/local/share/aclocal/libtool.m4:8145: -1- AU_DEFUN([LT_AC_PROG_RC], [m4_if($#, 0, [LT_PROG_RC], [LT_PROG_RC($@)])], [], []) +m4trace:/usr/local/share/aclocal/libtool.m4:8145: -1- AC_DEFUN([LT_AC_PROG_RC], [m4_warn([obsolete], [The macro `LT_AC_PROG_RC' is obsolete. +You should run autoupdate.])dnl +m4_if($#, 0, [LT_PROG_RC], [LT_PROG_RC($@)])]) +m4trace:/usr/local/share/aclocal/libtool.m4:8265: -1- AU_DEFUN([LT_AC_PROG_SED], [m4_if($#, 0, [AC_PROG_SED], [AC_PROG_SED($@)])], [], []) +m4trace:/usr/local/share/aclocal/libtool.m4:8265: -1- AC_DEFUN([LT_AC_PROG_SED], [m4_warn([obsolete], [The macro `LT_AC_PROG_SED' is obsolete. +You should run autoupdate.])dnl +m4_if($#, 0, [AC_PROG_SED], [AC_PROG_SED($@)])]) +m4trace:/usr/local/share/aclocal/ltargz.m4:12: -1- AC_DEFUN([LT_FUNC_ARGZ], [ +AC_CHECK_HEADERS([argz.h], [], [], [AC_INCLUDES_DEFAULT]) + +AC_CHECK_TYPES([error_t], + [], + [AC_DEFINE([error_t], [int], + [Define to a type to use for 'error_t' if it is not otherwise available.]) + AC_DEFINE([__error_t_defined], [1], [Define so that glibc/gnulib argp.h + does not typedef error_t.])], + [#if defined(HAVE_ARGZ_H) +# include +#endif]) + +LT_ARGZ_H= +AC_CHECK_FUNCS([argz_add argz_append argz_count argz_create_sep argz_insert \ + argz_next argz_stringify], [], [LT_ARGZ_H=lt__argz.h; AC_LIBOBJ([lt__argz])]) + +dnl if have system argz functions, allow forced use of +dnl libltdl-supplied implementation (and default to do so +dnl on "known bad" systems). Could use a runtime check, but +dnl (a) detecting malloc issues is notoriously unreliable +dnl (b) only known system that declares argz functions, +dnl provides them, yet they are broken, is cygwin +dnl releases prior to 16-Mar-2007 (1.5.24 and earlier) +dnl So, it's more straightforward simply to special case +dnl this for known bad systems. +AS_IF([test -z "$LT_ARGZ_H"], + [AC_CACHE_CHECK( + [if argz actually works], + [lt_cv_sys_argz_works], + [[case $host_os in #( + *cygwin*) + lt_cv_sys_argz_works=no + if test no != "$cross_compiling"; then + lt_cv_sys_argz_works="guessing no" + else + lt_sed_extract_leading_digits='s/^\([0-9\.]*\).*/\1/' + save_IFS=$IFS + IFS=-. + set x `uname -r | sed -e "$lt_sed_extract_leading_digits"` + IFS=$save_IFS + lt_os_major=${2-0} + lt_os_minor=${3-0} + lt_os_micro=${4-0} + if test 1 -lt "$lt_os_major" \ + || { test 1 -eq "$lt_os_major" \ + && { test 5 -lt "$lt_os_minor" \ + || { test 5 -eq "$lt_os_minor" \ + && test 24 -lt "$lt_os_micro"; }; }; }; then + lt_cv_sys_argz_works=yes + fi + fi + ;; #( + *) lt_cv_sys_argz_works=yes ;; + esac]]) + AS_IF([test yes = "$lt_cv_sys_argz_works"], + [AC_DEFINE([HAVE_WORKING_ARGZ], 1, + [This value is set to 1 to indicate that the system argz facility works])], + [LT_ARGZ_H=lt__argz.h + AC_LIBOBJ([lt__argz])])]) + +AC_SUBST([LT_ARGZ_H]) +]) +m4trace:/usr/local/share/aclocal/ltdl.m4:16: -1- AC_DEFUN([LT_CONFIG_LTDL_DIR], [AC_BEFORE([$0], [LTDL_INIT]) +_$0($*) +]) +m4trace:/usr/local/share/aclocal/ltdl.m4:68: -1- AC_DEFUN([LTDL_CONVENIENCE], [AC_BEFORE([$0], [LTDL_INIT])dnl +dnl Although the argument is deprecated and no longer documented, +dnl LTDL_CONVENIENCE used to take a DIRECTORY orgument, if we have one +dnl here make sure it is the same as any other declaration of libltdl's +dnl location! This also ensures lt_ltdl_dir is set when configure.ac is +dnl not yet using an explicit LT_CONFIG_LTDL_DIR. +m4_ifval([$1], [_LT_CONFIG_LTDL_DIR([$1])])dnl +_$0() +]) +m4trace:/usr/local/share/aclocal/ltdl.m4:81: -1- AU_DEFUN([AC_LIBLTDL_CONVENIENCE], [_LT_CONFIG_LTDL_DIR([m4_default([$1], [libltdl])]) +_LTDL_CONVENIENCE]) +m4trace:/usr/local/share/aclocal/ltdl.m4:81: -1- AC_DEFUN([AC_LIBLTDL_CONVENIENCE], [m4_warn([obsolete], [The macro `AC_LIBLTDL_CONVENIENCE' is obsolete. +You should run autoupdate.])dnl +_LT_CONFIG_LTDL_DIR([m4_default([$1], [libltdl])]) +_LTDL_CONVENIENCE]) +m4trace:/usr/local/share/aclocal/ltdl.m4:124: -1- AC_DEFUN([LTDL_INSTALLABLE], [AC_BEFORE([$0], [LTDL_INIT])dnl +dnl Although the argument is deprecated and no longer documented, +dnl LTDL_INSTALLABLE used to take a DIRECTORY orgument, if we have one +dnl here make sure it is the same as any other declaration of libltdl's +dnl location! This also ensures lt_ltdl_dir is set when configure.ac is +dnl not yet using an explicit LT_CONFIG_LTDL_DIR. +m4_ifval([$1], [_LT_CONFIG_LTDL_DIR([$1])])dnl +_$0() +]) +m4trace:/usr/local/share/aclocal/ltdl.m4:137: -1- AU_DEFUN([AC_LIBLTDL_INSTALLABLE], [_LT_CONFIG_LTDL_DIR([m4_default([$1], [libltdl])]) +_LTDL_INSTALLABLE]) +m4trace:/usr/local/share/aclocal/ltdl.m4:137: -1- AC_DEFUN([AC_LIBLTDL_INSTALLABLE], [m4_warn([obsolete], [The macro `AC_LIBLTDL_INSTALLABLE' is obsolete. +You should run autoupdate.])dnl +_LT_CONFIG_LTDL_DIR([m4_default([$1], [libltdl])]) +_LTDL_INSTALLABLE]) +m4trace:/usr/local/share/aclocal/ltdl.m4:213: -1- AC_DEFUN([_LT_LIBOBJ], [ + m4_pattern_allow([^_LT_LIBOBJS$]) + _LT_LIBOBJS="$_LT_LIBOBJS $1.$ac_objext" +]) +m4trace:/usr/local/share/aclocal/ltdl.m4:226: -1- AC_DEFUN([LTDL_INIT], [dnl Parse OPTIONS +_LT_SET_OPTIONS([$0], [$1]) + +dnl We need to keep our own list of libobjs separate from our parent project, +dnl and the easiest way to do that is redefine the AC_LIBOBJs macro while +dnl we look for our own LIBOBJs. +m4_pushdef([AC_LIBOBJ], m4_defn([_LT_LIBOBJ])) +m4_pushdef([AC_LIBSOURCES]) + +dnl If not otherwise defined, default to the 1.5.x compatible subproject mode: +m4_if(_LTDL_MODE, [], + [m4_define([_LTDL_MODE], m4_default([$2], [subproject])) + m4_if([-1], [m4_bregexp(_LTDL_MODE, [\(subproject\|\(non\)?recursive\)])], + [m4_fatal([unknown libltdl mode: ]_LTDL_MODE)])]) + +AC_ARG_WITH([included_ltdl], + [AS_HELP_STRING([--with-included-ltdl], + [use the GNU ltdl sources included here])]) + +if test yes != "$with_included_ltdl"; then + # We are not being forced to use the included libltdl sources, so + # decide whether there is a useful installed version we can use. + AC_CHECK_HEADER([ltdl.h], + [AC_CHECK_DECL([lt_dlinterface_register], + [AC_CHECK_LIB([ltdl], [lt_dladvise_preload], + [with_included_ltdl=no], + [with_included_ltdl=yes])], + [with_included_ltdl=yes], + [AC_INCLUDES_DEFAULT + #include ])], + [with_included_ltdl=yes], + [AC_INCLUDES_DEFAULT] + ) +fi + +dnl If neither LT_CONFIG_LTDL_DIR, LTDL_CONVENIENCE nor LTDL_INSTALLABLE +dnl was called yet, then for old times' sake, we assume libltdl is in an +dnl eponymous directory: +AC_PROVIDE_IFELSE([LT_CONFIG_LTDL_DIR], [], [_LT_CONFIG_LTDL_DIR([libltdl])]) + +AC_ARG_WITH([ltdl_include], + [AS_HELP_STRING([--with-ltdl-include=DIR], + [use the ltdl headers installed in DIR])]) + +if test -n "$with_ltdl_include"; then + if test -f "$with_ltdl_include/ltdl.h"; then : + else + AC_MSG_ERROR([invalid ltdl include directory: '$with_ltdl_include']) + fi +else + with_ltdl_include=no +fi + +AC_ARG_WITH([ltdl_lib], + [AS_HELP_STRING([--with-ltdl-lib=DIR], + [use the libltdl.la installed in DIR])]) + +if test -n "$with_ltdl_lib"; then + if test -f "$with_ltdl_lib/libltdl.la"; then : + else + AC_MSG_ERROR([invalid ltdl library directory: '$with_ltdl_lib']) + fi +else + with_ltdl_lib=no +fi + +case ,$with_included_ltdl,$with_ltdl_include,$with_ltdl_lib, in + ,yes,no,no,) + m4_case(m4_default(_LTDL_TYPE, [convenience]), + [convenience], [_LTDL_CONVENIENCE], + [installable], [_LTDL_INSTALLABLE], + [m4_fatal([unknown libltdl build type: ]_LTDL_TYPE)]) + ;; + ,no,no,no,) + # If the included ltdl is not to be used, then use the + # preinstalled libltdl we found. + AC_DEFINE([HAVE_LTDL], [1], + [Define this if a modern libltdl is already installed]) + LIBLTDL=-lltdl + LTDLDEPS= + LTDLINCL= + ;; + ,no*,no,*) + AC_MSG_ERROR(['--with-ltdl-include' and '--with-ltdl-lib' options must be used together]) + ;; + *) with_included_ltdl=no + LIBLTDL="-L$with_ltdl_lib -lltdl" + LTDLDEPS= + LTDLINCL=-I$with_ltdl_include + ;; +esac +INCLTDL=$LTDLINCL + +# Report our decision... +AC_MSG_CHECKING([where to find libltdl headers]) +AC_MSG_RESULT([$LTDLINCL]) +AC_MSG_CHECKING([where to find libltdl library]) +AC_MSG_RESULT([$LIBLTDL]) + +_LTDL_SETUP + +dnl restore autoconf definition. +m4_popdef([AC_LIBOBJ]) +m4_popdef([AC_LIBSOURCES]) + +AC_CONFIG_COMMANDS_PRE([ + _ltdl_libobjs= + _ltdl_ltlibobjs= + if test -n "$_LT_LIBOBJS"; then + # Remove the extension. + _lt_sed_drop_objext='s/\.o$//;s/\.obj$//' + for i in `for i in $_LT_LIBOBJS; do echo "$i"; done | sed "$_lt_sed_drop_objext" | sort -u`; do + _ltdl_libobjs="$_ltdl_libobjs $lt_libobj_prefix$i.$ac_objext" + _ltdl_ltlibobjs="$_ltdl_ltlibobjs $lt_libobj_prefix$i.lo" + done + fi + AC_SUBST([ltdl_LIBOBJS], [$_ltdl_libobjs]) + AC_SUBST([ltdl_LTLIBOBJS], [$_ltdl_ltlibobjs]) +]) + +# Only expand once: +m4_define([LTDL_INIT]) +]) +m4trace:/usr/local/share/aclocal/ltdl.m4:352: -1- AU_DEFUN([AC_LIB_LTDL], [LTDL_INIT($@)]) +m4trace:/usr/local/share/aclocal/ltdl.m4:352: -1- AC_DEFUN([AC_LIB_LTDL], [m4_warn([obsolete], [The macro `AC_LIB_LTDL' is obsolete. +You should run autoupdate.])dnl +LTDL_INIT($@)]) +m4trace:/usr/local/share/aclocal/ltdl.m4:353: -1- AU_DEFUN([AC_WITH_LTDL], [LTDL_INIT($@)]) +m4trace:/usr/local/share/aclocal/ltdl.m4:353: -1- AC_DEFUN([AC_WITH_LTDL], [m4_warn([obsolete], [The macro `AC_WITH_LTDL' is obsolete. +You should run autoupdate.])dnl +LTDL_INIT($@)]) +m4trace:/usr/local/share/aclocal/ltdl.m4:354: -1- AU_DEFUN([LT_WITH_LTDL], [LTDL_INIT($@)]) +m4trace:/usr/local/share/aclocal/ltdl.m4:354: -1- AC_DEFUN([LT_WITH_LTDL], [m4_warn([obsolete], [The macro `LT_WITH_LTDL' is obsolete. +You should run autoupdate.])dnl +LTDL_INIT($@)]) +m4trace:/usr/local/share/aclocal/ltdl.m4:367: -1- AC_DEFUN([_LTDL_SETUP], [AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([LT_SYS_MODULE_EXT])dnl +AC_REQUIRE([LT_SYS_MODULE_PATH])dnl +AC_REQUIRE([LT_SYS_DLSEARCH_PATH])dnl +AC_REQUIRE([LT_LIB_DLLOAD])dnl +AC_REQUIRE([LT_SYS_SYMBOL_USCORE])dnl +AC_REQUIRE([LT_FUNC_DLSYM_USCORE])dnl +AC_REQUIRE([LT_SYS_DLOPEN_DEPLIBS])dnl +AC_REQUIRE([LT_FUNC_ARGZ])dnl + +m4_require([_LT_CHECK_OBJDIR])dnl +m4_require([_LT_HEADER_DLFCN])dnl +m4_require([_LT_CHECK_DLPREOPEN])dnl +m4_require([_LT_DECL_SED])dnl + +dnl Don't require this, or it will be expanded earlier than the code +dnl that sets the variables it relies on: +_LT_ENABLE_INSTALL + +dnl _LTDL_MODE specific code must be called at least once: +_LTDL_MODE_DISPATCH + +# In order that ltdl.c can compile, find out the first AC_CONFIG_HEADERS +# the user used. This is so that ltdl.h can pick up the parent projects +# config.h file, The first file in AC_CONFIG_HEADERS must contain the +# definitions required by ltdl.c. +# FIXME: Remove use of undocumented AC_LIST_HEADERS (2.59 compatibility). +AC_CONFIG_COMMANDS_PRE([dnl +m4_pattern_allow([^LT_CONFIG_H$])dnl +m4_ifset([AH_HEADER], + [LT_CONFIG_H=AH_HEADER], + [m4_ifset([AC_LIST_HEADERS], + [LT_CONFIG_H=`echo "AC_LIST_HEADERS" | $SED 's|^[[ ]]*||;s|[[ :]].*$||'`], + [])])]) +AC_SUBST([LT_CONFIG_H]) + +AC_CHECK_HEADERS([unistd.h dl.h sys/dl.h dld.h mach-o/dyld.h dirent.h], + [], [], [AC_INCLUDES_DEFAULT]) + +AC_CHECK_FUNCS([closedir opendir readdir], [], [AC_LIBOBJ([lt__dirent])]) +AC_CHECK_FUNCS([strlcat strlcpy], [], [AC_LIBOBJ([lt__strl])]) + +m4_pattern_allow([LT_LIBEXT])dnl +AC_DEFINE_UNQUOTED([LT_LIBEXT],["$libext"],[The archive extension]) + +name= +eval "lt_libprefix=\"$libname_spec\"" +m4_pattern_allow([LT_LIBPREFIX])dnl +AC_DEFINE_UNQUOTED([LT_LIBPREFIX],["$lt_libprefix"],[The archive prefix]) + +name=ltdl +eval "LTDLOPEN=\"$libname_spec\"" +AC_SUBST([LTDLOPEN]) +]) +m4trace:/usr/local/share/aclocal/ltdl.m4:443: -1- AC_DEFUN([LT_SYS_DLOPEN_DEPLIBS], [AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_CACHE_CHECK([whether deplibs are loaded by dlopen], + [lt_cv_sys_dlopen_deplibs], + [# PORTME does your system automatically load deplibs for dlopen? + # or its logical equivalent (e.g. shl_load for HP-UX < 11) + # For now, we just catch OSes we know something about -- in the + # future, we'll try test this programmatically. + lt_cv_sys_dlopen_deplibs=unknown + case $host_os in + aix3*|aix4.1.*|aix4.2.*) + # Unknown whether this is true for these versions of AIX, but + # we want this 'case' here to explicitly catch those versions. + lt_cv_sys_dlopen_deplibs=unknown + ;; + aix[[4-9]]*) + lt_cv_sys_dlopen_deplibs=yes + ;; + amigaos*) + case $host_cpu in + powerpc) + lt_cv_sys_dlopen_deplibs=no + ;; + esac + ;; + bitrig*) + lt_cv_sys_dlopen_deplibs=yes + ;; + darwin*) + # Assuming the user has installed a libdl from somewhere, this is true + # If you are looking for one http://www.opendarwin.org/projects/dlcompat + lt_cv_sys_dlopen_deplibs=yes + ;; + freebsd* | dragonfly*) + lt_cv_sys_dlopen_deplibs=yes + ;; + gnu* | linux* | k*bsd*-gnu | kopensolaris*-gnu) + # GNU and its variants, using gnu ld.so (Glibc) + lt_cv_sys_dlopen_deplibs=yes + ;; + hpux10*|hpux11*) + lt_cv_sys_dlopen_deplibs=yes + ;; + interix*) + lt_cv_sys_dlopen_deplibs=yes + ;; + irix[[12345]]*|irix6.[[01]]*) + # Catch all versions of IRIX before 6.2, and indicate that we don't + # know how it worked for any of those versions. + lt_cv_sys_dlopen_deplibs=unknown + ;; + irix*) + # The case above catches anything before 6.2, and it's known that + # at 6.2 and later dlopen does load deplibs. + lt_cv_sys_dlopen_deplibs=yes + ;; + netbsd*) + lt_cv_sys_dlopen_deplibs=yes + ;; + openbsd*) + lt_cv_sys_dlopen_deplibs=yes + ;; + osf[[1234]]*) + # dlopen did load deplibs (at least at 4.x), but until the 5.x series, + # it did *not* use an RPATH in a shared library to find objects the + # library depends on, so we explicitly say 'no'. + lt_cv_sys_dlopen_deplibs=no + ;; + osf5.0|osf5.0a|osf5.1) + # dlopen *does* load deplibs and with the right loader patch applied + # it even uses RPATH in a shared library to search for shared objects + # that the library depends on, but there's no easy way to know if that + # patch is installed. Since this is the case, all we can really + # say is unknown -- it depends on the patch being installed. If + # it is, this changes to 'yes'. Without it, it would be 'no'. + lt_cv_sys_dlopen_deplibs=unknown + ;; + osf*) + # the two cases above should catch all versions of osf <= 5.1. Read + # the comments above for what we know about them. + # At > 5.1, deplibs are loaded *and* any RPATH in a shared library + # is used to find them so we can finally say 'yes'. + lt_cv_sys_dlopen_deplibs=yes + ;; + qnx*) + lt_cv_sys_dlopen_deplibs=yes + ;; + solaris*) + lt_cv_sys_dlopen_deplibs=yes + ;; + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + libltdl_cv_sys_dlopen_deplibs=yes + ;; + esac + ]) +if test yes != "$lt_cv_sys_dlopen_deplibs"; then + AC_DEFINE([LTDL_DLOPEN_DEPLIBS], [1], + [Define if the OS needs help to load dependent libraries for dlopen().]) +fi +]) +m4trace:/usr/local/share/aclocal/ltdl.m4:545: -1- AU_DEFUN([AC_LTDL_SYS_DLOPEN_DEPLIBS], [m4_if($#, 0, [LT_SYS_DLOPEN_DEPLIBS], [LT_SYS_DLOPEN_DEPLIBS($@)])], [], []) +m4trace:/usr/local/share/aclocal/ltdl.m4:545: -1- AC_DEFUN([AC_LTDL_SYS_DLOPEN_DEPLIBS], [m4_warn([obsolete], [The macro `AC_LTDL_SYS_DLOPEN_DEPLIBS' is obsolete. +You should run autoupdate.])dnl +m4_if($#, 0, [LT_SYS_DLOPEN_DEPLIBS], [LT_SYS_DLOPEN_DEPLIBS($@)])]) +m4trace:/usr/local/share/aclocal/ltdl.m4:552: -1- AC_DEFUN([LT_SYS_MODULE_EXT], [m4_require([_LT_SYS_DYNAMIC_LINKER])dnl +AC_CACHE_CHECK([what extension is used for runtime loadable modules], + [libltdl_cv_shlibext], +[ +module=yes +eval libltdl_cv_shlibext=$shrext_cmds +module=no +eval libltdl_cv_shrext=$shrext_cmds + ]) +if test -n "$libltdl_cv_shlibext"; then + m4_pattern_allow([LT_MODULE_EXT])dnl + AC_DEFINE_UNQUOTED([LT_MODULE_EXT], ["$libltdl_cv_shlibext"], + [Define to the extension used for runtime loadable modules, say, ".so".]) +fi +if test "$libltdl_cv_shrext" != "$libltdl_cv_shlibext"; then + m4_pattern_allow([LT_SHARED_EXT])dnl + AC_DEFINE_UNQUOTED([LT_SHARED_EXT], ["$libltdl_cv_shrext"], + [Define to the shared library suffix, say, ".dylib".]) +fi +if test -n "$shared_archive_member_spec"; then + m4_pattern_allow([LT_SHARED_LIB_MEMBER])dnl + AC_DEFINE_UNQUOTED([LT_SHARED_LIB_MEMBER], ["($shared_archive_member_spec.o)"], + [Define to the shared archive member specification, say "(shr.o)".]) +fi +]) +m4trace:/usr/local/share/aclocal/ltdl.m4:580: -1- AU_DEFUN([AC_LTDL_SHLIBEXT], [m4_if($#, 0, [LT_SYS_MODULE_EXT], [LT_SYS_MODULE_EXT($@)])], [], []) +m4trace:/usr/local/share/aclocal/ltdl.m4:580: -1- AC_DEFUN([AC_LTDL_SHLIBEXT], [m4_warn([obsolete], [The macro `AC_LTDL_SHLIBEXT' is obsolete. +You should run autoupdate.])dnl +m4_if($#, 0, [LT_SYS_MODULE_EXT], [LT_SYS_MODULE_EXT($@)])]) +m4trace:/usr/local/share/aclocal/ltdl.m4:587: -1- AC_DEFUN([LT_SYS_MODULE_PATH], [m4_require([_LT_SYS_DYNAMIC_LINKER])dnl +AC_CACHE_CHECK([what variable specifies run-time module search path], + [lt_cv_module_path_var], [lt_cv_module_path_var=$shlibpath_var]) +if test -n "$lt_cv_module_path_var"; then + m4_pattern_allow([LT_MODULE_PATH_VAR])dnl + AC_DEFINE_UNQUOTED([LT_MODULE_PATH_VAR], ["$lt_cv_module_path_var"], + [Define to the name of the environment variable that determines the run-time module search path.]) +fi +]) +m4trace:/usr/local/share/aclocal/ltdl.m4:599: -1- AU_DEFUN([AC_LTDL_SHLIBPATH], [m4_if($#, 0, [LT_SYS_MODULE_PATH], [LT_SYS_MODULE_PATH($@)])], [], []) +m4trace:/usr/local/share/aclocal/ltdl.m4:599: -1- AC_DEFUN([AC_LTDL_SHLIBPATH], [m4_warn([obsolete], [The macro `AC_LTDL_SHLIBPATH' is obsolete. +You should run autoupdate.])dnl +m4_if($#, 0, [LT_SYS_MODULE_PATH], [LT_SYS_MODULE_PATH($@)])]) +m4trace:/usr/local/share/aclocal/ltdl.m4:606: -1- AC_DEFUN([LT_SYS_DLSEARCH_PATH], [m4_require([_LT_SYS_DYNAMIC_LINKER])dnl +AC_CACHE_CHECK([for the default library search path], + [lt_cv_sys_dlsearch_path], + [lt_cv_sys_dlsearch_path=$sys_lib_dlsearch_path_spec]) +if test -n "$lt_cv_sys_dlsearch_path"; then + sys_dlsearch_path= + for dir in $lt_cv_sys_dlsearch_path; do + if test -z "$sys_dlsearch_path"; then + sys_dlsearch_path=$dir + else + sys_dlsearch_path=$sys_dlsearch_path$PATH_SEPARATOR$dir + fi + done + m4_pattern_allow([LT_DLSEARCH_PATH])dnl + AC_DEFINE_UNQUOTED([LT_DLSEARCH_PATH], ["$sys_dlsearch_path"], + [Define to the system default library search path.]) +fi +]) +m4trace:/usr/local/share/aclocal/ltdl.m4:627: -1- AU_DEFUN([AC_LTDL_SYSSEARCHPATH], [m4_if($#, 0, [LT_SYS_DLSEARCH_PATH], [LT_SYS_DLSEARCH_PATH($@)])], [], []) +m4trace:/usr/local/share/aclocal/ltdl.m4:627: -1- AC_DEFUN([AC_LTDL_SYSSEARCHPATH], [m4_warn([obsolete], [The macro `AC_LTDL_SYSSEARCHPATH' is obsolete. +You should run autoupdate.])dnl +m4_if($#, 0, [LT_SYS_DLSEARCH_PATH], [LT_SYS_DLSEARCH_PATH($@)])]) +m4trace:/usr/local/share/aclocal/ltdl.m4:653: -1- AC_DEFUN([LT_LIB_DLLOAD], [m4_pattern_allow([^LT_DLLOADERS$]) +LT_DLLOADERS= +AC_SUBST([LT_DLLOADERS]) + +AC_LANG_PUSH([C]) +lt_dlload_save_LIBS=$LIBS + +LIBADD_DLOPEN= +AC_SEARCH_LIBS([dlopen], [dl], + [AC_DEFINE([HAVE_LIBDL], [1], + [Define if you have the libdl library or equivalent.]) + if test "$ac_cv_search_dlopen" != "none required"; then + LIBADD_DLOPEN=-ldl + fi + libltdl_cv_lib_dl_dlopen=yes + LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}dlopen.la"], + [AC_LINK_IFELSE([AC_LANG_PROGRAM([[#if HAVE_DLFCN_H +# include +#endif + ]], [[dlopen(0, 0);]])], + [AC_DEFINE([HAVE_LIBDL], [1], + [Define if you have the libdl library or equivalent.]) + libltdl_cv_func_dlopen=yes + LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}dlopen.la"], + [AC_CHECK_LIB([svld], [dlopen], + [AC_DEFINE([HAVE_LIBDL], [1], + [Define if you have the libdl library or equivalent.]) + LIBADD_DLOPEN=-lsvld libltdl_cv_func_dlopen=yes + LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}dlopen.la"])])]) +if test yes = "$libltdl_cv_func_dlopen" || test yes = "$libltdl_cv_lib_dl_dlopen" +then + lt_save_LIBS=$LIBS + LIBS="$LIBS $LIBADD_DLOPEN" + AC_CHECK_FUNCS([dlerror]) + LIBS=$lt_save_LIBS +fi +AC_SUBST([LIBADD_DLOPEN]) + +LIBADD_SHL_LOAD= +AC_CHECK_FUNC([shl_load], + [AC_DEFINE([HAVE_SHL_LOAD], [1], + [Define if you have the shl_load function.]) + LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}shl_load.la"], + [AC_CHECK_LIB([dld], [shl_load], + [AC_DEFINE([HAVE_SHL_LOAD], [1], + [Define if you have the shl_load function.]) + LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}shl_load.la" + LIBADD_SHL_LOAD=-ldld])]) +AC_SUBST([LIBADD_SHL_LOAD]) + +case $host_os in +darwin[[1567]].*) +# We only want this for pre-Mac OS X 10.4. + AC_CHECK_FUNC([_dyld_func_lookup], + [AC_DEFINE([HAVE_DYLD], [1], + [Define if you have the _dyld_func_lookup function.]) + LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}dyld.la"]) + ;; +beos*) + LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}load_add_on.la" + ;; +cygwin* | mingw* | pw32*) + AC_CHECK_DECLS([cygwin_conv_path], [], [], [[#include ]]) + LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}loadlibrary.la" + ;; +esac + +AC_CHECK_LIB([dld], [dld_link], + [AC_DEFINE([HAVE_DLD], [1], + [Define if you have the GNU dld library.]) + LT_DLLOADERS="$LT_DLLOADERS ${lt_dlopen_dir+$lt_dlopen_dir/}dld_link.la"]) +AC_SUBST([LIBADD_DLD_LINK]) + +m4_pattern_allow([^LT_DLPREOPEN$]) +LT_DLPREOPEN= +if test -n "$LT_DLLOADERS" +then + for lt_loader in $LT_DLLOADERS; do + LT_DLPREOPEN="$LT_DLPREOPEN-dlpreopen $lt_loader " + done + AC_DEFINE([HAVE_LIBDLLOADER], [1], + [Define if libdlloader will be built on this platform]) +fi +AC_SUBST([LT_DLPREOPEN]) + +dnl This isn't used anymore, but set it for backwards compatibility +LIBADD_DL="$LIBADD_DLOPEN $LIBADD_SHL_LOAD" +AC_SUBST([LIBADD_DL]) + +LIBS=$lt_dlload_save_LIBS +AC_LANG_POP +]) +m4trace:/usr/local/share/aclocal/ltdl.m4:748: -1- AU_DEFUN([AC_LTDL_DLLIB], [m4_if($#, 0, [LT_LIB_DLLOAD], [LT_LIB_DLLOAD($@)])], [], []) +m4trace:/usr/local/share/aclocal/ltdl.m4:748: -1- AC_DEFUN([AC_LTDL_DLLIB], [m4_warn([obsolete], [The macro `AC_LTDL_DLLIB' is obsolete. +You should run autoupdate.])dnl +m4_if($#, 0, [LT_LIB_DLLOAD], [LT_LIB_DLLOAD($@)])]) +m4trace:/usr/local/share/aclocal/ltdl.m4:756: -1- AC_DEFUN([LT_SYS_SYMBOL_USCORE], [m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl +AC_CACHE_CHECK([for _ prefix in compiled symbols], + [lt_cv_sys_symbol_underscore], + [lt_cv_sys_symbol_underscore=no + cat > conftest.$ac_ext <<_LT_EOF +void nm_test_func(){} +int main(){nm_test_func;return 0;} +_LT_EOF + if AC_TRY_EVAL(ac_compile); then + # Now try to grab the symbols. + ac_nlist=conftest.nm + if AC_TRY_EVAL(NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $ac_nlist) && test -s "$ac_nlist"; then + # See whether the symbols have a leading underscore. + if grep '^. _nm_test_func' "$ac_nlist" >/dev/null; then + lt_cv_sys_symbol_underscore=yes + else + if grep '^. nm_test_func ' "$ac_nlist" >/dev/null; then + : + else + echo "configure: cannot find nm_test_func in $ac_nlist" >&AS_MESSAGE_LOG_FD + fi + fi + else + echo "configure: cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD + fi + else + echo "configure: failed program was:" >&AS_MESSAGE_LOG_FD + cat conftest.c >&AS_MESSAGE_LOG_FD + fi + rm -rf conftest* + ]) + sys_symbol_underscore=$lt_cv_sys_symbol_underscore + AC_SUBST([sys_symbol_underscore]) +]) +m4trace:/usr/local/share/aclocal/ltdl.m4:793: -1- AU_DEFUN([AC_LTDL_SYMBOL_USCORE], [m4_if($#, 0, [LT_SYS_SYMBOL_USCORE], [LT_SYS_SYMBOL_USCORE($@)])], [], []) +m4trace:/usr/local/share/aclocal/ltdl.m4:793: -1- AC_DEFUN([AC_LTDL_SYMBOL_USCORE], [m4_warn([obsolete], [The macro `AC_LTDL_SYMBOL_USCORE' is obsolete. +You should run autoupdate.])dnl +m4_if($#, 0, [LT_SYS_SYMBOL_USCORE], [LT_SYS_SYMBOL_USCORE($@)])]) +m4trace:/usr/local/share/aclocal/ltdl.m4:800: -1- AC_DEFUN([LT_FUNC_DLSYM_USCORE], [AC_REQUIRE([_LT_COMPILER_PIC])dnl for lt_prog_compiler_wl +AC_REQUIRE([LT_SYS_SYMBOL_USCORE])dnl for lt_cv_sys_symbol_underscore +AC_REQUIRE([LT_SYS_MODULE_EXT])dnl for libltdl_cv_shlibext +if test yes = "$lt_cv_sys_symbol_underscore"; then + if test yes = "$libltdl_cv_func_dlopen" || test yes = "$libltdl_cv_lib_dl_dlopen"; then + AC_CACHE_CHECK([whether we have to add an underscore for dlsym], + [libltdl_cv_need_uscore], + [libltdl_cv_need_uscore=unknown + dlsym_uscore_save_LIBS=$LIBS + LIBS="$LIBS $LIBADD_DLOPEN" + libname=conftmod # stay within 8.3 filename limits! + cat >$libname.$ac_ext <<_LT_EOF +[#line $LINENO "configure" +#include "confdefs.h" +/* When -fvisibility=hidden is used, assume the code has been annotated + correspondingly for the symbols needed. */ +#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) +int fnord () __attribute__((visibility("default"))); +#endif +int fnord () { return 42; }] +_LT_EOF + + # ltfn_module_cmds module_cmds + # Execute tilde-delimited MODULE_CMDS with environment primed for + # $module_cmds or $archive_cmds type content. + ltfn_module_cmds () + {( # subshell avoids polluting parent global environment + module_cmds_save_ifs=$IFS; IFS='~' + for cmd in @S|@1; do + IFS=$module_cmds_save_ifs + libobjs=$libname.$ac_objext; lib=$libname$libltdl_cv_shlibext + rpath=/not-exists; soname=$libname$libltdl_cv_shlibext; output_objdir=. + major=; versuffix=; verstring=; deplibs= + ECHO=echo; wl=$lt_prog_compiler_wl; allow_undefined_flag= + eval $cmd + done + IFS=$module_cmds_save_ifs + )} + + # Compile a loadable module using libtool macro expansion results. + $CC $pic_flag -c $libname.$ac_ext + ltfn_module_cmds "${module_cmds:-$archive_cmds}" + + # Try to fetch fnord with dlsym(). + libltdl_dlunknown=0; libltdl_dlnouscore=1; libltdl_dluscore=2 + cat >conftest.$ac_ext <<_LT_EOF +[#line $LINENO "configure" +#include "confdefs.h" +#if HAVE_DLFCN_H +#include +#endif +#include +#ifndef RTLD_GLOBAL +# ifdef DL_GLOBAL +# define RTLD_GLOBAL DL_GLOBAL +# else +# define RTLD_GLOBAL 0 +# endif +#endif +#ifndef RTLD_NOW +# ifdef DL_NOW +# define RTLD_NOW DL_NOW +# else +# define RTLD_NOW 0 +# endif +#endif +int main () { + void *handle = dlopen ("`pwd`/$libname$libltdl_cv_shlibext", RTLD_GLOBAL|RTLD_NOW); + int status = $libltdl_dlunknown; + if (handle) { + if (dlsym (handle, "fnord")) + status = $libltdl_dlnouscore; + else { + if (dlsym (handle, "_fnord")) + status = $libltdl_dluscore; + else + puts (dlerror ()); + } + dlclose (handle); + } else + puts (dlerror ()); + return status; +}] +_LT_EOF + if AC_TRY_EVAL(ac_link) && test -s "conftest$ac_exeext" 2>/dev/null; then + (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null + libltdl_status=$? + case x$libltdl_status in + x$libltdl_dlnouscore) libltdl_cv_need_uscore=no ;; + x$libltdl_dluscore) libltdl_cv_need_uscore=yes ;; + x*) libltdl_cv_need_uscore=unknown ;; + esac + fi + rm -rf conftest* $libname* + LIBS=$dlsym_uscore_save_LIBS + ]) + fi +fi + +if test yes = "$libltdl_cv_need_uscore"; then + AC_DEFINE([NEED_USCORE], [1], + [Define if dlsym() requires a leading underscore in symbol names.]) +fi +]) +m4trace:/usr/local/share/aclocal/ltdl.m4:907: -1- AU_DEFUN([AC_LTDL_DLSYM_USCORE], [m4_if($#, 0, [LT_FUNC_DLSYM_USCORE], [LT_FUNC_DLSYM_USCORE($@)])], [], []) +m4trace:/usr/local/share/aclocal/ltdl.m4:907: -1- AC_DEFUN([AC_LTDL_DLSYM_USCORE], [m4_warn([obsolete], [The macro `AC_LTDL_DLSYM_USCORE' is obsolete. +You should run autoupdate.])dnl +m4_if($#, 0, [LT_FUNC_DLSYM_USCORE], [LT_FUNC_DLSYM_USCORE($@)])]) +m4trace:/usr/local/share/aclocal/ltoptions.m4:14: -1- AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])]) +m4trace:/usr/local/share/aclocal/ltoptions.m4:113: -1- AU_DEFUN([AC_LIBTOOL_DLOPEN], [_LT_SET_OPTION([LT_INIT], [dlopen]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you +put the 'dlopen' option into LT_INIT's first parameter.]) +]) +m4trace:/usr/local/share/aclocal/ltoptions.m4:113: -1- AC_DEFUN([AC_LIBTOOL_DLOPEN], [m4_warn([obsolete], [The macro `AC_LIBTOOL_DLOPEN' is obsolete. +You should run autoupdate.])dnl +_LT_SET_OPTION([LT_INIT], [dlopen]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you +put the 'dlopen' option into LT_INIT's first parameter.]) +]) +m4trace:/usr/local/share/aclocal/ltoptions.m4:148: -1- AU_DEFUN([AC_LIBTOOL_WIN32_DLL], [AC_REQUIRE([AC_CANONICAL_HOST])dnl +_LT_SET_OPTION([LT_INIT], [win32-dll]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you +put the 'win32-dll' option into LT_INIT's first parameter.]) +]) +m4trace:/usr/local/share/aclocal/ltoptions.m4:148: -1- AC_DEFUN([AC_LIBTOOL_WIN32_DLL], [m4_warn([obsolete], [The macro `AC_LIBTOOL_WIN32_DLL' is obsolete. +You should run autoupdate.])dnl +AC_REQUIRE([AC_CANONICAL_HOST])dnl +_LT_SET_OPTION([LT_INIT], [win32-dll]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you +put the 'win32-dll' option into LT_INIT's first parameter.]) +]) +m4trace:/usr/local/share/aclocal/ltoptions.m4:197: -1- AC_DEFUN([AC_ENABLE_SHARED], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared]) +]) +m4trace:/usr/local/share/aclocal/ltoptions.m4:201: -1- AC_DEFUN([AC_DISABLE_SHARED], [_LT_SET_OPTION([LT_INIT], [disable-shared]) +]) +m4trace:/usr/local/share/aclocal/ltoptions.m4:205: -1- AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) +m4trace:/usr/local/share/aclocal/ltoptions.m4:205: -1- AC_DEFUN([AM_ENABLE_SHARED], [m4_warn([obsolete], [The macro `AM_ENABLE_SHARED' is obsolete. +You should run autoupdate.])dnl +AC_ENABLE_SHARED($@)]) +m4trace:/usr/local/share/aclocal/ltoptions.m4:206: -1- AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) +m4trace:/usr/local/share/aclocal/ltoptions.m4:206: -1- AC_DEFUN([AM_DISABLE_SHARED], [m4_warn([obsolete], [The macro `AM_DISABLE_SHARED' is obsolete. +You should run autoupdate.])dnl +AC_DISABLE_SHARED($@)]) +m4trace:/usr/local/share/aclocal/ltoptions.m4:251: -1- AC_DEFUN([AC_ENABLE_STATIC], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static]) +]) +m4trace:/usr/local/share/aclocal/ltoptions.m4:255: -1- AC_DEFUN([AC_DISABLE_STATIC], [_LT_SET_OPTION([LT_INIT], [disable-static]) +]) +m4trace:/usr/local/share/aclocal/ltoptions.m4:259: -1- AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) +m4trace:/usr/local/share/aclocal/ltoptions.m4:259: -1- AC_DEFUN([AM_ENABLE_STATIC], [m4_warn([obsolete], [The macro `AM_ENABLE_STATIC' is obsolete. +You should run autoupdate.])dnl +AC_ENABLE_STATIC($@)]) +m4trace:/usr/local/share/aclocal/ltoptions.m4:260: -1- AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) +m4trace:/usr/local/share/aclocal/ltoptions.m4:260: -1- AC_DEFUN([AM_DISABLE_STATIC], [m4_warn([obsolete], [The macro `AM_DISABLE_STATIC' is obsolete. +You should run autoupdate.])dnl +AC_DISABLE_STATIC($@)]) +m4trace:/usr/local/share/aclocal/ltoptions.m4:305: -1- AU_DEFUN([AC_ENABLE_FAST_INSTALL], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you put +the 'fast-install' option into LT_INIT's first parameter.]) +]) +m4trace:/usr/local/share/aclocal/ltoptions.m4:305: -1- AC_DEFUN([AC_ENABLE_FAST_INSTALL], [m4_warn([obsolete], [The macro `AC_ENABLE_FAST_INSTALL' is obsolete. +You should run autoupdate.])dnl +_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you put +the 'fast-install' option into LT_INIT's first parameter.]) +]) +m4trace:/usr/local/share/aclocal/ltoptions.m4:312: -1- AU_DEFUN([AC_DISABLE_FAST_INSTALL], [_LT_SET_OPTION([LT_INIT], [disable-fast-install]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you put +the 'disable-fast-install' option into LT_INIT's first parameter.]) +]) +m4trace:/usr/local/share/aclocal/ltoptions.m4:312: -1- AC_DEFUN([AC_DISABLE_FAST_INSTALL], [m4_warn([obsolete], [The macro `AC_DISABLE_FAST_INSTALL' is obsolete. +You should run autoupdate.])dnl +_LT_SET_OPTION([LT_INIT], [disable-fast-install]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you put +the 'disable-fast-install' option into LT_INIT's first parameter.]) +]) +m4trace:/usr/local/share/aclocal/ltoptions.m4:411: -1- AU_DEFUN([AC_LIBTOOL_PICMODE], [_LT_SET_OPTION([LT_INIT], [pic-only]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you +put the 'pic-only' option into LT_INIT's first parameter.]) +]) +m4trace:/usr/local/share/aclocal/ltoptions.m4:411: -1- AC_DEFUN([AC_LIBTOOL_PICMODE], [m4_warn([obsolete], [The macro `AC_LIBTOOL_PICMODE' is obsolete. +You should run autoupdate.])dnl +_LT_SET_OPTION([LT_INIT], [pic-only]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you +put the 'pic-only' option into LT_INIT's first parameter.]) +]) +m4trace:/usr/local/share/aclocal/ltsugar.m4:14: -1- AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])]) +m4trace:/usr/local/share/aclocal/ltversion.m4:18: -1- AC_DEFUN([LTVERSION_VERSION], [macro_version='2.4.6' +macro_revision='2.4.6' +_LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?]) +_LT_DECL(, macro_revision, 0) +]) +m4trace:/usr/local/share/aclocal/lt~obsolete.m4:37: -1- AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])]) +m4trace:/usr/local/share/aclocal/lt~obsolete.m4:41: -1- AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH]) +m4trace:/usr/local/share/aclocal/lt~obsolete.m4:42: -1- AC_DEFUN([_LT_AC_SHELL_INIT]) +m4trace:/usr/local/share/aclocal/lt~obsolete.m4:43: -1- AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX]) +m4trace:/usr/local/share/aclocal/lt~obsolete.m4:45: -1- AC_DEFUN([_LT_AC_TAGVAR]) +m4trace:/usr/local/share/aclocal/lt~obsolete.m4:46: -1- AC_DEFUN([AC_LTDL_ENABLE_INSTALL]) +m4trace:/usr/local/share/aclocal/lt~obsolete.m4:47: -1- AC_DEFUN([AC_LTDL_PREOPEN]) +m4trace:/usr/local/share/aclocal/lt~obsolete.m4:48: -1- AC_DEFUN([_LT_AC_SYS_COMPILER]) +m4trace:/usr/local/share/aclocal/lt~obsolete.m4:49: -1- AC_DEFUN([_LT_AC_LOCK]) +m4trace:/usr/local/share/aclocal/lt~obsolete.m4:50: -1- AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE]) +m4trace:/usr/local/share/aclocal/lt~obsolete.m4:51: -1- AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF]) +m4trace:/usr/local/share/aclocal/lt~obsolete.m4:52: -1- AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O]) +m4trace:/usr/local/share/aclocal/lt~obsolete.m4:53: -1- AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS]) +m4trace:/usr/local/share/aclocal/lt~obsolete.m4:54: -1- AC_DEFUN([AC_LIBTOOL_OBJDIR]) +m4trace:/usr/local/share/aclocal/lt~obsolete.m4:55: -1- AC_DEFUN([AC_LTDL_OBJDIR]) +m4trace:/usr/local/share/aclocal/lt~obsolete.m4:56: -1- AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH]) +m4trace:/usr/local/share/aclocal/lt~obsolete.m4:57: -1- AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP]) +m4trace:/usr/local/share/aclocal/lt~obsolete.m4:58: -1- AC_DEFUN([AC_PATH_MAGIC]) +m4trace:/usr/local/share/aclocal/lt~obsolete.m4:59: -1- AC_DEFUN([AC_PROG_LD_GNU]) +m4trace:/usr/local/share/aclocal/lt~obsolete.m4:60: -1- AC_DEFUN([AC_PROG_LD_RELOAD_FLAG]) +m4trace:/usr/local/share/aclocal/lt~obsolete.m4:61: -1- AC_DEFUN([AC_DEPLIBS_CHECK_METHOD]) +m4trace:/usr/local/share/aclocal/lt~obsolete.m4:62: -1- AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI]) +m4trace:/usr/local/share/aclocal/lt~obsolete.m4:63: -1- AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE]) +m4trace:/usr/local/share/aclocal/lt~obsolete.m4:64: -1- AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC]) +m4trace:/usr/local/share/aclocal/lt~obsolete.m4:65: -1- AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS]) +m4trace:/usr/local/share/aclocal/lt~obsolete.m4:66: -1- AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP]) +m4trace:/usr/local/share/aclocal/lt~obsolete.m4:67: -1- AC_DEFUN([LT_AC_PROG_EGREP]) +m4trace:/usr/local/share/aclocal/lt~obsolete.m4:72: -1- AC_DEFUN([_AC_PROG_LIBTOOL]) +m4trace:/usr/local/share/aclocal/lt~obsolete.m4:73: -1- AC_DEFUN([AC_LIBTOOL_SETUP]) +m4trace:/usr/local/share/aclocal/lt~obsolete.m4:74: -1- AC_DEFUN([_LT_AC_CHECK_DLFCN]) +m4trace:/usr/local/share/aclocal/lt~obsolete.m4:75: -1- AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER]) +m4trace:/usr/local/share/aclocal/lt~obsolete.m4:76: -1- AC_DEFUN([_LT_AC_TAGCONFIG]) +m4trace:/usr/local/share/aclocal/lt~obsolete.m4:78: -1- AC_DEFUN([_LT_AC_LANG_CXX]) +m4trace:/usr/local/share/aclocal/lt~obsolete.m4:79: -1- AC_DEFUN([_LT_AC_LANG_F77]) +m4trace:/usr/local/share/aclocal/lt~obsolete.m4:80: -1- AC_DEFUN([_LT_AC_LANG_GCJ]) +m4trace:/usr/local/share/aclocal/lt~obsolete.m4:81: -1- AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG]) +m4trace:/usr/local/share/aclocal/lt~obsolete.m4:82: -1- AC_DEFUN([_LT_AC_LANG_C_CONFIG]) +m4trace:/usr/local/share/aclocal/lt~obsolete.m4:83: -1- AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG]) +m4trace:/usr/local/share/aclocal/lt~obsolete.m4:84: -1- AC_DEFUN([_LT_AC_LANG_CXX_CONFIG]) +m4trace:/usr/local/share/aclocal/lt~obsolete.m4:85: -1- AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG]) +m4trace:/usr/local/share/aclocal/lt~obsolete.m4:86: -1- AC_DEFUN([_LT_AC_LANG_F77_CONFIG]) +m4trace:/usr/local/share/aclocal/lt~obsolete.m4:87: -1- AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG]) +m4trace:/usr/local/share/aclocal/lt~obsolete.m4:88: -1- AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG]) +m4trace:/usr/local/share/aclocal/lt~obsolete.m4:89: -1- AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG]) +m4trace:/usr/local/share/aclocal/lt~obsolete.m4:90: -1- AC_DEFUN([_LT_AC_LANG_RC_CONFIG]) +m4trace:/usr/local/share/aclocal/lt~obsolete.m4:91: -1- AC_DEFUN([AC_LIBTOOL_CONFIG]) +m4trace:/usr/local/share/aclocal/lt~obsolete.m4:92: -1- AC_DEFUN([_LT_AC_FILE_LTDLL_C]) +m4trace:/usr/local/share/aclocal/lt~obsolete.m4:94: -1- AC_DEFUN([_LT_AC_PROG_CXXCPP]) +m4trace:/usr/local/share/aclocal/lt~obsolete.m4:97: -1- AC_DEFUN([_LT_PROG_F77]) +m4trace:/usr/local/share/aclocal/lt~obsolete.m4:98: -1- AC_DEFUN([_LT_PROG_FC]) +m4trace:/usr/local/share/aclocal/lt~obsolete.m4:99: -1- AC_DEFUN([_LT_PROG_CXX]) +m4trace:/usr/local/Cellar/automake/1.16.5/share/aclocal-1.16/amversion.m4:14: -1- AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version='1.16' +dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to +dnl require some minimum version. Point them to the right macro. +m4_if([$1], [1.16.5], [], + [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl +]) +m4trace:/usr/local/Cellar/automake/1.16.5/share/aclocal-1.16/amversion.m4:33: -1- AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], [AM_AUTOMAKE_VERSION([1.16.5])dnl +m4_ifndef([AC_AUTOCONF_VERSION], + [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl +_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) +m4trace:/usr/local/Cellar/automake/1.16.5/share/aclocal-1.16/auxdir.m4:47: -1- AC_DEFUN([AM_AUX_DIR_EXPAND], [AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl +# Expand $ac_aux_dir to an absolute path. +am_aux_dir=`cd "$ac_aux_dir" && pwd` +]) +m4trace:/usr/local/Cellar/automake/1.16.5/share/aclocal-1.16/cond.m4:12: -1- AC_DEFUN([AM_CONDITIONAL], [AC_PREREQ([2.52])dnl + m4_if([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], + [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl +AC_SUBST([$1_TRUE])dnl +AC_SUBST([$1_FALSE])dnl +_AM_SUBST_NOTMAKE([$1_TRUE])dnl +_AM_SUBST_NOTMAKE([$1_FALSE])dnl +m4_define([_AM_COND_VALUE_$1], [$2])dnl +if $2; then + $1_TRUE= + $1_FALSE='#' +else + $1_TRUE='#' + $1_FALSE= +fi +AC_CONFIG_COMMANDS_PRE( +[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then + AC_MSG_ERROR([[conditional "$1" was never defined. +Usually this means the macro was only invoked conditionally.]]) +fi])]) +m4trace:/usr/local/Cellar/automake/1.16.5/share/aclocal-1.16/depend.m4:26: -1- AC_DEFUN([_AM_DEPENDENCIES], [AC_REQUIRE([AM_SET_DEPDIR])dnl +AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl +AC_REQUIRE([AM_MAKE_INCLUDE])dnl +AC_REQUIRE([AM_DEP_TRACK])dnl + +m4_if([$1], [CC], [depcc="$CC" am_compiler_list=], + [$1], [CXX], [depcc="$CXX" am_compiler_list=], + [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'], + [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'], + [$1], [UPC], [depcc="$UPC" am_compiler_list=], + [$1], [GCJ], [depcc="$GCJ" am_compiler_list='gcc3 gcc'], + [depcc="$$1" am_compiler_list=]) + +AC_CACHE_CHECK([dependency style of $depcc], + [am_cv_$1_dependencies_compiler_type], +[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named 'D' -- because '-MD' means "put the output + # in D". + rm -rf conftest.dir + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_$1_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` + fi + am__universal=false + m4_case([$1], [CC], + [case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac], + [CXX], + [case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac]) + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with + # Solaris 10 /bin/sh. + echo '/* dummy */' > sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with '-c' and '-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle '-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs. + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # After this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested. + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok '-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_$1_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_$1_dependencies_compiler_type=none +fi +]) +AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) +AM_CONDITIONAL([am__fastdep$1], [ + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) +]) +m4trace:/usr/local/Cellar/automake/1.16.5/share/aclocal-1.16/depend.m4:163: -1- AC_DEFUN([AM_SET_DEPDIR], [AC_REQUIRE([AM_SET_LEADING_DOT])dnl +AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl +]) +m4trace:/usr/local/Cellar/automake/1.16.5/share/aclocal-1.16/depend.m4:171: -1- AC_DEFUN([AM_DEP_TRACK], [AC_ARG_ENABLE([dependency-tracking], [dnl +AS_HELP_STRING( + [--enable-dependency-tracking], + [do not reject slow dependency extractors]) +AS_HELP_STRING( + [--disable-dependency-tracking], + [speeds up one-time build])]) +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' + am__nodep='_no' +fi +AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) +AC_SUBST([AMDEPBACKSLASH])dnl +_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl +AC_SUBST([am__nodep])dnl +_AM_SUBST_NOTMAKE([am__nodep])dnl +]) +m4trace:/usr/local/Cellar/automake/1.16.5/share/aclocal-1.16/depout.m4:11: -1- AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], [{ + # Older Autoconf quotes --file arguments for eval, but not when files + # are listed without --file. Let's play safe and only enable the eval + # if we detect the quoting. + # TODO: see whether this extra hack can be removed once we start + # requiring Autoconf 2.70 or later. + AS_CASE([$CONFIG_FILES], + [*\'*], [eval set x "$CONFIG_FILES"], + [*], [set x $CONFIG_FILES]) + shift + # Used to flag and report bootstrapping failures. + am_rc=0 + for am_mf + do + # Strip MF so we end up with the name of the file. + am_mf=`AS_ECHO(["$am_mf"]) | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile which includes + # dependency-tracking related rules and includes. + # Grep'ing the whole file directly is not great: AIX grep has a line + # limit of 2048, but all sed's we know have understand at least 4000. + sed -n 's,^am--depfiles:.*,X,p' "$am_mf" | grep X >/dev/null 2>&1 \ + || continue + am_dirpart=`AS_DIRNAME(["$am_mf"])` + am_filepart=`AS_BASENAME(["$am_mf"])` + AM_RUN_LOG([cd "$am_dirpart" \ + && sed -e '/# am--include-marker/d' "$am_filepart" \ + | $MAKE -f - am--depfiles]) || am_rc=$? + done + if test $am_rc -ne 0; then + AC_MSG_FAILURE([Something went wrong bootstrapping makefile fragments + for automatic dependency tracking. If GNU make was not used, consider + re-running the configure script with MAKE="gmake" (or whatever is + necessary). You can also try re-running configure with the + '--disable-dependency-tracking' option to at least be able to build + the package (albeit without support for automatic dependency tracking).]) + fi + AS_UNSET([am_dirpart]) + AS_UNSET([am_filepart]) + AS_UNSET([am_mf]) + AS_UNSET([am_rc]) + rm -f conftest-deps.mk +} +]) +m4trace:/usr/local/Cellar/automake/1.16.5/share/aclocal-1.16/depout.m4:64: -1- AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], [AC_CONFIG_COMMANDS([depfiles], + [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], + [AMDEP_TRUE="$AMDEP_TRUE" MAKE="${MAKE-make}"])]) +m4trace:/usr/local/Cellar/automake/1.16.5/share/aclocal-1.16/init.m4:29: -1- AC_DEFUN([AM_INIT_AUTOMAKE], [AC_PREREQ([2.65])dnl +m4_ifdef([_$0_ALREADY_INIT], + [m4_fatal([$0 expanded multiple times +]m4_defn([_$0_ALREADY_INIT]))], + [m4_define([_$0_ALREADY_INIT], m4_expansion_stack)])dnl +dnl Autoconf wants to disallow AM_ names. We explicitly allow +dnl the ones we care about. +m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl +AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl +AC_REQUIRE([AC_PROG_INSTALL])dnl +if test "`cd $srcdir && pwd`" != "`pwd`"; then + # Use -I$(srcdir) only when $(srcdir) != ., so that make's output + # is not polluted with repeated "-I." + AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl + # test to see if srcdir already configured + if test -f $srcdir/config.status; then + AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) + fi +fi + +# test whether we have cygpath +if test -z "$CYGPATH_W"; then + if (cygpath --version) >/dev/null 2>/dev/null; then + CYGPATH_W='cygpath -w' + else + CYGPATH_W=echo + fi +fi +AC_SUBST([CYGPATH_W]) + +# Define the identity of the package. +dnl Distinguish between old-style and new-style calls. +m4_ifval([$2], +[AC_DIAGNOSE([obsolete], + [$0: two- and three-arguments forms are deprecated.]) +m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl + AC_SUBST([PACKAGE], [$1])dnl + AC_SUBST([VERSION], [$2])], +[_AM_SET_OPTIONS([$1])dnl +dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. +m4_if( + m4_ifset([AC_PACKAGE_NAME], [ok]):m4_ifset([AC_PACKAGE_VERSION], [ok]), + [ok:ok],, + [m4_fatal([AC_INIT should be called with package and version arguments])])dnl + AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl + AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl + +_AM_IF_OPTION([no-define],, +[AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package]) + AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl + +# Some tools Automake needs. +AC_REQUIRE([AM_SANITY_CHECK])dnl +AC_REQUIRE([AC_ARG_PROGRAM])dnl +AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}]) +AM_MISSING_PROG([AUTOCONF], [autoconf]) +AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}]) +AM_MISSING_PROG([AUTOHEADER], [autoheader]) +AM_MISSING_PROG([MAKEINFO], [makeinfo]) +AC_REQUIRE([AM_PROG_INSTALL_SH])dnl +AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl +AC_REQUIRE([AC_PROG_MKDIR_P])dnl +# For better backward compatibility. To be removed once Automake 1.9.x +# dies out for good. For more background, see: +# +# +AC_SUBST([mkdir_p], ['$(MKDIR_P)']) +# We need awk for the "check" target (and possibly the TAP driver). The +# system "awk" is bad on some platforms. +AC_REQUIRE([AC_PROG_AWK])dnl +AC_REQUIRE([AC_PROG_MAKE_SET])dnl +AC_REQUIRE([AM_SET_LEADING_DOT])dnl +_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], + [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], + [_AM_PROG_TAR([v7])])]) +_AM_IF_OPTION([no-dependencies],, +[AC_PROVIDE_IFELSE([AC_PROG_CC], + [_AM_DEPENDENCIES([CC])], + [m4_define([AC_PROG_CC], + m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl +AC_PROVIDE_IFELSE([AC_PROG_CXX], + [_AM_DEPENDENCIES([CXX])], + [m4_define([AC_PROG_CXX], + m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl +AC_PROVIDE_IFELSE([AC_PROG_OBJC], + [_AM_DEPENDENCIES([OBJC])], + [m4_define([AC_PROG_OBJC], + m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl +AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], + [_AM_DEPENDENCIES([OBJCXX])], + [m4_define([AC_PROG_OBJCXX], + m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl +]) +# Variables for tags utilities; see am/tags.am +if test -z "$CTAGS"; then + CTAGS=ctags +fi +AC_SUBST([CTAGS]) +if test -z "$ETAGS"; then + ETAGS=etags +fi +AC_SUBST([ETAGS]) +if test -z "$CSCOPE"; then + CSCOPE=cscope +fi +AC_SUBST([CSCOPE]) + +AC_REQUIRE([AM_SILENT_RULES])dnl +dnl The testsuite driver may need to know about EXEEXT, so add the +dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This +dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below. +AC_CONFIG_COMMANDS_PRE(dnl +[m4_provide_if([_AM_COMPILER_EXEEXT], + [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl + +# POSIX will say in a future version that running "rm -f" with no argument +# is OK; and we want to be able to make that assumption in our Makefile +# recipes. So use an aggressive probe to check that the usage we want is +# actually supported "in the wild" to an acceptable degree. +# See automake bug#10828. +# To make any issue more visible, cause the running configure to be aborted +# by default if the 'rm' program in use doesn't match our expectations; the +# user can still override this though. +if rm -f && rm -fr && rm -rf; then : OK; else + cat >&2 <<'END' +Oops! + +Your 'rm' program seems unable to run without file operands specified +on the command line, even when the '-f' option is present. This is contrary +to the behaviour of most rm programs out there, and not conforming with +the upcoming POSIX standard: + +Please tell bug-automake@gnu.org about your system, including the value +of your $PATH and any error possibly output before this message. This +can help us improve future automake versions. + +END + if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then + echo 'Configuration will proceed anyway, since you have set the' >&2 + echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 + echo >&2 + else + cat >&2 <<'END' +Aborting the configuration process, to ensure you take notice of the issue. + +You can download and install GNU coreutils to get an 'rm' implementation +that behaves properly: . + +If you want to complete the configuration process using your problematic +'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM +to "yes", and re-run configure. + +END + AC_MSG_ERROR([Your 'rm' program is bad, sorry.]) + fi +fi +dnl The trailing newline in this macro's definition is deliberate, for +dnl backward compatibility and to allow trailing 'dnl'-style comments +dnl after the AM_INIT_AUTOMAKE invocation. See automake bug#16841. +]) +m4trace:/usr/local/Cellar/automake/1.16.5/share/aclocal-1.16/init.m4:204: -1- AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], [# Compute $1's index in $config_headers. +_am_arg=$1 +_am_stamp_count=1 +for _am_header in $config_headers :; do + case $_am_header in + $_am_arg | $_am_arg:* ) + break ;; + * ) + _am_stamp_count=`expr $_am_stamp_count + 1` ;; + esac +done +echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) +m4trace:/usr/local/Cellar/automake/1.16.5/share/aclocal-1.16/install-sh.m4:11: -1- AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +if test x"${install_sh+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; + *) + install_sh="\${SHELL} $am_aux_dir/install-sh" + esac +fi +AC_SUBST([install_sh])]) +m4trace:/usr/local/Cellar/automake/1.16.5/share/aclocal-1.16/lead-dot.m4:10: -1- AC_DEFUN([AM_SET_LEADING_DOT], [rm -rf .tst 2>/dev/null +mkdir .tst 2>/dev/null +if test -d .tst; then + am__leading_dot=. +else + am__leading_dot=_ +fi +rmdir .tst 2>/dev/null +AC_SUBST([am__leading_dot])]) +m4trace:/usr/local/Cellar/automake/1.16.5/share/aclocal-1.16/maintainer.m4:16: -1- AC_DEFUN([AM_MAINTAINER_MODE], [m4_case(m4_default([$1], [disable]), + [enable], [m4_define([am_maintainer_other], [disable])], + [disable], [m4_define([am_maintainer_other], [enable])], + [m4_define([am_maintainer_other], [enable]) + m4_warn([syntax], [unexpected argument to AM@&t@_MAINTAINER_MODE: $1])]) +AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles]) + dnl maintainer-mode's default is 'disable' unless 'enable' is passed + AC_ARG_ENABLE([maintainer-mode], + [AS_HELP_STRING([--]am_maintainer_other[-maintainer-mode], + am_maintainer_other[ make rules and dependencies not useful + (and sometimes confusing) to the casual installer])], + [USE_MAINTAINER_MODE=$enableval], + [USE_MAINTAINER_MODE=]m4_if(am_maintainer_other, [enable], [no], [yes])) + AC_MSG_RESULT([$USE_MAINTAINER_MODE]) + AM_CONDITIONAL([MAINTAINER_MODE], [test $USE_MAINTAINER_MODE = yes]) + MAINT=$MAINTAINER_MODE_TRUE + AC_SUBST([MAINT])dnl + +]) +m4trace:/usr/local/Cellar/automake/1.16.5/share/aclocal-1.16/make.m4:13: -1- AC_DEFUN([AM_MAKE_INCLUDE], [AC_MSG_CHECKING([whether ${MAKE-make} supports the include directive]) +cat > confinc.mk << 'END' +am__doit: + @echo this is the am__doit target >confinc.out +.PHONY: am__doit +END +am__include="#" +am__quote= +# BSD make does it like this. +echo '.include "confinc.mk" # ignored' > confmf.BSD +# Other make implementations (GNU, Solaris 10, AIX) do it like this. +echo 'include confinc.mk # ignored' > confmf.GNU +_am_result=no +for s in GNU BSD; do + AM_RUN_LOG([${MAKE-make} -f confmf.$s && cat confinc.out]) + AS_CASE([$?:`cat confinc.out 2>/dev/null`], + ['0:this is the am__doit target'], + [AS_CASE([$s], + [BSD], [am__include='.include' am__quote='"'], + [am__include='include' am__quote=''])]) + if test "$am__include" != "#"; then + _am_result="yes ($s style)" + break + fi +done +rm -f confinc.* confmf.* +AC_MSG_RESULT([${_am_result}]) +AC_SUBST([am__include])]) +m4trace:/usr/local/Cellar/automake/1.16.5/share/aclocal-1.16/make.m4:42: -1- m4_pattern_allow([^am__quote$]) +m4trace:/usr/local/Cellar/automake/1.16.5/share/aclocal-1.16/missing.m4:11: -1- AC_DEFUN([AM_MISSING_PROG], [AC_REQUIRE([AM_MISSING_HAS_RUN]) +$1=${$1-"${am_missing_run}$2"} +AC_SUBST($1)]) +m4trace:/usr/local/Cellar/automake/1.16.5/share/aclocal-1.16/missing.m4:20: -1- AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +AC_REQUIRE_AUX_FILE([missing])dnl +if test x"${MISSING+set}" != xset; then + MISSING="\${SHELL} '$am_aux_dir/missing'" +fi +# Use eval to expand $SHELL +if eval "$MISSING --is-lightweight"; then + am_missing_run="$MISSING " +else + am_missing_run= + AC_MSG_WARN(['missing' script is too old or missing]) +fi +]) +m4trace:/usr/local/Cellar/automake/1.16.5/share/aclocal-1.16/options.m4:11: -1- AC_DEFUN([_AM_MANGLE_OPTION], [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) +m4trace:/usr/local/Cellar/automake/1.16.5/share/aclocal-1.16/options.m4:17: -1- AC_DEFUN([_AM_SET_OPTION], [m4_define(_AM_MANGLE_OPTION([$1]), [1])]) +m4trace:/usr/local/Cellar/automake/1.16.5/share/aclocal-1.16/options.m4:23: -1- AC_DEFUN([_AM_SET_OPTIONS], [m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) +m4trace:/usr/local/Cellar/automake/1.16.5/share/aclocal-1.16/options.m4:29: -1- AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) +m4trace:/usr/local/Cellar/automake/1.16.5/share/aclocal-1.16/prog-cc-c-o.m4:12: -1- AC_DEFUN([_AM_PROG_CC_C_O], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +AC_REQUIRE_AUX_FILE([compile])dnl +AC_LANG_PUSH([C])dnl +AC_CACHE_CHECK( + [whether $CC understands -c and -o together], + [am_cv_prog_cc_c_o], + [AC_LANG_CONFTEST([AC_LANG_PROGRAM([])]) + # Make sure it works both with $CC and with simple cc. + # Following AC_PROG_CC_C_O, we do the test twice because some + # compilers refuse to overwrite an existing .o file with -o, + # though they will create one. + am_cv_prog_cc_c_o=yes + for am_i in 1 2; do + if AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) \ + && test -f conftest2.$ac_objext; then + : OK + else + am_cv_prog_cc_c_o=no + break + fi + done + rm -f core conftest* + unset am_i]) +if test "$am_cv_prog_cc_c_o" != yes; then + # Losing compiler, so override with the script. + # FIXME: It is wrong to rewrite CC. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__CC in this case, + # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" + CC="$am_aux_dir/compile $CC" +fi +AC_LANG_POP([C])]) +m4trace:/usr/local/Cellar/automake/1.16.5/share/aclocal-1.16/prog-cc-c-o.m4:47: -1- AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])]) +m4trace:/usr/local/Cellar/automake/1.16.5/share/aclocal-1.16/runlog.m4:12: -1- AC_DEFUN([AM_RUN_LOG], [{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD + ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + (exit $ac_status); }]) +m4trace:/usr/local/Cellar/automake/1.16.5/share/aclocal-1.16/sanity.m4:11: -1- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) +# Reject unsafe characters in $srcdir or the absolute working directory +# name. Accept space and tab only in the latter. +am_lf=' +' +case `pwd` in + *[[\\\"\#\$\&\'\`$am_lf]]*) + AC_MSG_ERROR([unsafe absolute working directory name]);; +esac +case $srcdir in + *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) + AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);; +esac + +# Do 'set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + am_has_slept=no + for am_try in 1 2; do + echo "timestamp, slept: $am_has_slept" > conftest.file + set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` + if test "$[*]" = "X"; then + # -L didn't work. + set X `ls -t "$srcdir/configure" conftest.file` + fi + if test "$[*]" != "X $srcdir/configure conftest.file" \ + && test "$[*]" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken + alias in your environment]) + fi + if test "$[2]" = conftest.file || test $am_try -eq 2; then + break + fi + # Just in case. + sleep 1 + am_has_slept=yes + done + test "$[2]" = conftest.file + ) +then + # Ok. + : +else + AC_MSG_ERROR([newly created file is older than distributed files! +Check your system clock]) +fi +AC_MSG_RESULT([yes]) +# If we didn't sleep, we still need to ensure time stamps of config.status and +# generated files are strictly newer. +am_sleep_pid= +if grep 'slept: no' conftest.file >/dev/null 2>&1; then + ( sleep 1 ) & + am_sleep_pid=$! +fi +AC_CONFIG_COMMANDS_PRE( + [AC_MSG_CHECKING([that generated files are newer than configure]) + if test -n "$am_sleep_pid"; then + # Hide warnings about reused PIDs. + wait $am_sleep_pid 2>/dev/null + fi + AC_MSG_RESULT([done])]) +rm -f conftest.file +]) +m4trace:/usr/local/Cellar/automake/1.16.5/share/aclocal-1.16/silent.m4:12: -1- AC_DEFUN([AM_SILENT_RULES], [AC_ARG_ENABLE([silent-rules], [dnl +AS_HELP_STRING( + [--enable-silent-rules], + [less verbose build output (undo: "make V=1")]) +AS_HELP_STRING( + [--disable-silent-rules], + [verbose build output (undo: "make V=0")])dnl +]) +case $enable_silent_rules in @%:@ ((( + yes) AM_DEFAULT_VERBOSITY=0;; + no) AM_DEFAULT_VERBOSITY=1;; + *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; +esac +dnl +dnl A few 'make' implementations (e.g., NonStop OS and NextStep) +dnl do not support nested variable expansions. +dnl See automake bug#9928 and bug#10237. +am_make=${MAKE-make} +AC_CACHE_CHECK([whether $am_make supports nested variables], + [am_cv_make_support_nested_variables], + [if AS_ECHO([['TRUE=$(BAR$(V)) +BAR0=false +BAR1=true +V=1 +am__doit: + @$(TRUE) +.PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then + am_cv_make_support_nested_variables=yes +else + am_cv_make_support_nested_variables=no +fi]) +if test $am_cv_make_support_nested_variables = yes; then + dnl Using '$V' instead of '$(V)' breaks IRIX make. + AM_V='$(V)' + AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' +else + AM_V=$AM_DEFAULT_VERBOSITY + AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY +fi +AC_SUBST([AM_V])dnl +AM_SUBST_NOTMAKE([AM_V])dnl +AC_SUBST([AM_DEFAULT_V])dnl +AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl +AC_SUBST([AM_DEFAULT_VERBOSITY])dnl +AM_BACKSLASH='\' +AC_SUBST([AM_BACKSLASH])dnl +_AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl +]) +m4trace:/usr/local/Cellar/automake/1.16.5/share/aclocal-1.16/strip.m4:17: -1- AC_DEFUN([AM_PROG_INSTALL_STRIP], [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl +# Installed binaries are usually stripped using 'strip' when the user +# run "make install-strip". However 'strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the 'STRIP' environment variable to overrule this program. +dnl Don't test for $cross_compiling = yes, because it might be 'maybe'. +if test "$cross_compiling" != no; then + AC_CHECK_TOOL([STRIP], [strip], :) +fi +INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" +AC_SUBST([INSTALL_STRIP_PROGRAM])]) +m4trace:/usr/local/Cellar/automake/1.16.5/share/aclocal-1.16/substnot.m4:12: -1- AC_DEFUN([_AM_SUBST_NOTMAKE]) +m4trace:/usr/local/Cellar/automake/1.16.5/share/aclocal-1.16/substnot.m4:17: -1- AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) +m4trace:/usr/local/Cellar/automake/1.16.5/share/aclocal-1.16/tar.m4:23: -1- AC_DEFUN([_AM_PROG_TAR], [# Always define AMTAR for backward compatibility. Yes, it's still used +# in the wild :-( We should find a proper way to deprecate it ... +AC_SUBST([AMTAR], ['$${TAR-tar}']) + +# We'll loop over all known methods to create a tar archive until one works. +_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' + +m4_if([$1], [v7], + [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], + + [m4_case([$1], + [ustar], + [# The POSIX 1988 'ustar' format is defined with fixed-size fields. + # There is notably a 21 bits limit for the UID and the GID. In fact, + # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343 + # and bug#13588). + am_max_uid=2097151 # 2^21 - 1 + am_max_gid=$am_max_uid + # The $UID and $GID variables are not portable, so we need to resort + # to the POSIX-mandated id(1) utility. Errors in the 'id' calls + # below are definitely unexpected, so allow the users to see them + # (that is, avoid stderr redirection). + am_uid=`id -u || echo unknown` + am_gid=`id -g || echo unknown` + AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format]) + if test $am_uid -le $am_max_uid; then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + _am_tools=none + fi + AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format]) + if test $am_gid -le $am_max_gid; then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + _am_tools=none + fi], + + [pax], + [], + + [m4_fatal([Unknown tar format])]) + + AC_MSG_CHECKING([how to create a $1 tar archive]) + + # Go ahead even if we have the value already cached. We do so because we + # need to set the values for the 'am__tar' and 'am__untar' variables. + _am_tools=${am_cv_prog_tar_$1-$_am_tools} + + for _am_tool in $_am_tools; do + case $_am_tool in + gnutar) + for _am_tar in tar gnutar gtar; do + AM_RUN_LOG([$_am_tar --version]) && break + done + am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' + am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' + am__untar="$_am_tar -xf -" + ;; + plaintar) + # Must skip GNU tar: if it does not support --format= it doesn't create + # ustar tarball either. + (tar --version) >/dev/null 2>&1 && continue + am__tar='tar chf - "$$tardir"' + am__tar_='tar chf - "$tardir"' + am__untar='tar xf -' + ;; + pax) + am__tar='pax -L -x $1 -w "$$tardir"' + am__tar_='pax -L -x $1 -w "$tardir"' + am__untar='pax -r' + ;; + cpio) + am__tar='find "$$tardir" -print | cpio -o -H $1 -L' + am__tar_='find "$tardir" -print | cpio -o -H $1 -L' + am__untar='cpio -i -H $1 -d' + ;; + none) + am__tar=false + am__tar_=false + am__untar=false + ;; + esac + + # If the value was cached, stop now. We just wanted to have am__tar + # and am__untar set. + test -n "${am_cv_prog_tar_$1}" && break + + # tar/untar a dummy directory, and stop if the command works. + rm -rf conftest.dir + mkdir conftest.dir + echo GrepMe > conftest.dir/file + AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) + rm -rf conftest.dir + if test -s conftest.tar; then + AM_RUN_LOG([$am__untar /dev/null 2>&1 && break + fi + done + rm -rf conftest.dir + + AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) + AC_MSG_RESULT([$am_cv_prog_tar_$1])]) + +AC_SUBST([am__tar]) +AC_SUBST([am__untar]) +]) +m4trace:configure.ac:15: -1- m4_pattern_forbid([^_?A[CHUM]_]) +m4trace:configure.ac:15: -1- m4_pattern_forbid([_AC_]) +m4trace:configure.ac:15: -1- m4_pattern_forbid([^LIBOBJS$], [do not use LIBOBJS directly, use AC_LIBOBJ (see section `AC_LIBOBJ vs LIBOBJS']) +m4trace:configure.ac:15: -1- m4_pattern_allow([^AS_FLAGS$]) +m4trace:configure.ac:15: -1- m4_pattern_forbid([^_?m4_]) +m4trace:configure.ac:15: -1- m4_pattern_forbid([^dnl$]) +m4trace:configure.ac:15: -1- m4_pattern_forbid([^_?AS_]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^SHELL$]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^PATH_SEPARATOR$]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^PACKAGE_NAME$]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^PACKAGE_TARNAME$]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^PACKAGE_VERSION$]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^PACKAGE_STRING$]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^PACKAGE_BUGREPORT$]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^PACKAGE_URL$]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^exec_prefix$]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^prefix$]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^program_transform_name$]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^bindir$]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^sbindir$]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^libexecdir$]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^datarootdir$]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^datadir$]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^sysconfdir$]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^sharedstatedir$]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^localstatedir$]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^runstatedir$]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^includedir$]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^oldincludedir$]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^docdir$]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^infodir$]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^htmldir$]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^dvidir$]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^pdfdir$]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^psdir$]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^libdir$]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^localedir$]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^mandir$]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^PACKAGE_NAME$]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^PACKAGE_TARNAME$]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^PACKAGE_VERSION$]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^PACKAGE_STRING$]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^PACKAGE_BUGREPORT$]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^PACKAGE_URL$]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^DEFS$]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^ECHO_C$]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^ECHO_N$]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^ECHO_T$]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^LIBS$]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^build_alias$]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^host_alias$]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^target_alias$]) +m4trace:configure.ac:17: -1- AM_INIT_AUTOMAKE +m4trace:configure.ac:17: -1- m4_pattern_allow([^AM_[A-Z]+FLAGS$]) +m4trace:configure.ac:17: -1- AM_SET_CURRENT_AUTOMAKE_VERSION +m4trace:configure.ac:17: -1- AM_AUTOMAKE_VERSION([1.16.5]) +m4trace:configure.ac:17: -1- _AM_AUTOCONF_VERSION([2.71]) +m4trace:configure.ac:17: -1- m4_pattern_allow([^INSTALL_PROGRAM$]) +m4trace:configure.ac:17: -1- m4_pattern_allow([^INSTALL_SCRIPT$]) +m4trace:configure.ac:17: -1- m4_pattern_allow([^INSTALL_DATA$]) +m4trace:configure.ac:17: -1- m4_pattern_allow([^am__isrc$]) +m4trace:configure.ac:17: -1- _AM_SUBST_NOTMAKE([am__isrc]) +m4trace:configure.ac:17: -1- m4_pattern_allow([^CYGPATH_W$]) +m4trace:configure.ac:17: -1- _AM_SET_OPTIONS([]) +m4trace:configure.ac:17: -1- m4_pattern_allow([^PACKAGE$]) +m4trace:configure.ac:17: -1- m4_pattern_allow([^VERSION$]) +m4trace:configure.ac:17: -1- _AM_IF_OPTION([no-define], [], [AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package]) + AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])]) +m4trace:configure.ac:17: -2- _AM_MANGLE_OPTION([no-define]) +m4trace:configure.ac:17: -1- m4_pattern_allow([^PACKAGE$]) +m4trace:configure.ac:17: -1- m4_pattern_allow([^VERSION$]) +m4trace:configure.ac:17: -1- AM_SANITY_CHECK +m4trace:configure.ac:17: -1- AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}]) +m4trace:configure.ac:17: -1- AM_MISSING_HAS_RUN +m4trace:configure.ac:17: -1- AM_AUX_DIR_EXPAND +m4trace:configure.ac:17: -1- m4_pattern_allow([^ACLOCAL$]) +m4trace:configure.ac:17: -1- AM_MISSING_PROG([AUTOCONF], [autoconf]) +m4trace:configure.ac:17: -1- m4_pattern_allow([^AUTOCONF$]) +m4trace:configure.ac:17: -1- AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}]) +m4trace:configure.ac:17: -1- m4_pattern_allow([^AUTOMAKE$]) +m4trace:configure.ac:17: -1- AM_MISSING_PROG([AUTOHEADER], [autoheader]) +m4trace:configure.ac:17: -1- m4_pattern_allow([^AUTOHEADER$]) +m4trace:configure.ac:17: -1- AM_MISSING_PROG([MAKEINFO], [makeinfo]) +m4trace:configure.ac:17: -1- m4_pattern_allow([^MAKEINFO$]) +m4trace:configure.ac:17: -1- AM_PROG_INSTALL_SH +m4trace:configure.ac:17: -1- m4_pattern_allow([^install_sh$]) +m4trace:configure.ac:17: -1- AM_PROG_INSTALL_STRIP +m4trace:configure.ac:17: -1- m4_pattern_allow([^STRIP$]) +m4trace:configure.ac:17: -1- m4_pattern_allow([^INSTALL_STRIP_PROGRAM$]) +m4trace:configure.ac:17: -1- m4_pattern_allow([^MKDIR_P$]) +m4trace:configure.ac:17: -1- m4_pattern_allow([^mkdir_p$]) +m4trace:configure.ac:17: -1- m4_pattern_allow([^AWK$]) +m4trace:configure.ac:17: -1- m4_pattern_allow([^SET_MAKE$]) +m4trace:configure.ac:17: -1- AM_SET_LEADING_DOT +m4trace:configure.ac:17: -1- m4_pattern_allow([^am__leading_dot$]) +m4trace:configure.ac:17: -1- _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], + [_AM_PROG_TAR([v7])])]) +m4trace:configure.ac:17: -2- _AM_MANGLE_OPTION([tar-ustar]) +m4trace:configure.ac:17: -1- _AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], [_AM_PROG_TAR([v7])]) +m4trace:configure.ac:17: -2- _AM_MANGLE_OPTION([tar-pax]) +m4trace:configure.ac:17: -1- _AM_PROG_TAR([v7]) +m4trace:configure.ac:17: -1- m4_pattern_allow([^AMTAR$]) +m4trace:configure.ac:17: -1- m4_pattern_allow([^am__tar$]) +m4trace:configure.ac:17: -1- m4_pattern_allow([^am__untar$]) +m4trace:configure.ac:17: -1- _AM_IF_OPTION([no-dependencies], [], [AC_PROVIDE_IFELSE([AC_PROG_CC], + [_AM_DEPENDENCIES([CC])], + [m4_define([AC_PROG_CC], + m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl +AC_PROVIDE_IFELSE([AC_PROG_CXX], + [_AM_DEPENDENCIES([CXX])], + [m4_define([AC_PROG_CXX], + m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl +AC_PROVIDE_IFELSE([AC_PROG_OBJC], + [_AM_DEPENDENCIES([OBJC])], + [m4_define([AC_PROG_OBJC], + m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl +AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], + [_AM_DEPENDENCIES([OBJCXX])], + [m4_define([AC_PROG_OBJCXX], + m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl +]) +m4trace:configure.ac:17: -2- _AM_MANGLE_OPTION([no-dependencies]) +m4trace:configure.ac:17: -1- m4_pattern_allow([^CTAGS$]) +m4trace:configure.ac:17: -1- m4_pattern_allow([^ETAGS$]) +m4trace:configure.ac:17: -1- m4_pattern_allow([^CSCOPE$]) +m4trace:configure.ac:17: -1- AM_SILENT_RULES +m4trace:configure.ac:17: -1- m4_pattern_allow([^AM_V$]) +m4trace:configure.ac:17: -1- AM_SUBST_NOTMAKE([AM_V]) +m4trace:configure.ac:17: -1- _AM_SUBST_NOTMAKE([AM_V]) +m4trace:configure.ac:17: -1- m4_pattern_allow([^AM_DEFAULT_V$]) +m4trace:configure.ac:17: -1- AM_SUBST_NOTMAKE([AM_DEFAULT_V]) +m4trace:configure.ac:17: -1- _AM_SUBST_NOTMAKE([AM_DEFAULT_V]) +m4trace:configure.ac:17: -1- m4_pattern_allow([^AM_DEFAULT_VERBOSITY$]) +m4trace:configure.ac:17: -1- m4_pattern_allow([^AM_BACKSLASH$]) +m4trace:configure.ac:17: -1- _AM_SUBST_NOTMAKE([AM_BACKSLASH]) +m4trace:configure.ac:18: -1- AM_MAINTAINER_MODE +m4trace:configure.ac:18: -1- AM_CONDITIONAL([MAINTAINER_MODE], [test $USE_MAINTAINER_MODE = yes]) +m4trace:configure.ac:18: -1- m4_pattern_allow([^MAINTAINER_MODE_TRUE$]) +m4trace:configure.ac:18: -1- m4_pattern_allow([^MAINTAINER_MODE_FALSE$]) +m4trace:configure.ac:18: -1- _AM_SUBST_NOTMAKE([MAINTAINER_MODE_TRUE]) +m4trace:configure.ac:18: -1- _AM_SUBST_NOTMAKE([MAINTAINER_MODE_FALSE]) +m4trace:configure.ac:18: -1- m4_pattern_allow([^MAINT$]) +m4trace:configure.ac:35: -1- m4_pattern_allow([^CC$]) +m4trace:configure.ac:35: -1- m4_pattern_allow([^CFLAGS$]) +m4trace:configure.ac:35: -1- m4_pattern_allow([^LDFLAGS$]) +m4trace:configure.ac:35: -1- m4_pattern_allow([^LIBS$]) +m4trace:configure.ac:35: -1- m4_pattern_allow([^CPPFLAGS$]) +m4trace:configure.ac:35: -1- m4_pattern_allow([^CC$]) +m4trace:configure.ac:35: -1- m4_pattern_allow([^CC$]) +m4trace:configure.ac:35: -1- m4_pattern_allow([^CC$]) +m4trace:configure.ac:35: -1- m4_pattern_allow([^CC$]) +m4trace:configure.ac:35: -1- m4_pattern_allow([^ac_ct_CC$]) +m4trace:configure.ac:35: -1- m4_pattern_allow([^CC$]) +m4trace:configure.ac:35: -1- m4_pattern_allow([^EXEEXT$]) +m4trace:configure.ac:35: -1- m4_pattern_allow([^OBJEXT$]) +m4trace:configure.ac:35: -1- _AM_PROG_CC_C_O +m4trace:configure.ac:35: -1- AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) +m4trace:configure.ac:35: -1- _AM_DEPENDENCIES([CC]) +m4trace:configure.ac:35: -1- AM_SET_DEPDIR +m4trace:configure.ac:35: -1- m4_pattern_allow([^DEPDIR$]) +m4trace:configure.ac:35: -1- AM_OUTPUT_DEPENDENCY_COMMANDS +m4trace:configure.ac:35: -1- AM_MAKE_INCLUDE +m4trace:configure.ac:35: -1- AM_RUN_LOG([${MAKE-make} -f confmf.$s && cat confinc.out]) +m4trace:configure.ac:35: -1- m4_pattern_allow([^am__include$]) +m4trace:configure.ac:35: -1- AM_DEP_TRACK +m4trace:configure.ac:35: -1- AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) +m4trace:configure.ac:35: -1- m4_pattern_allow([^AMDEP_TRUE$]) +m4trace:configure.ac:35: -1- m4_pattern_allow([^AMDEP_FALSE$]) +m4trace:configure.ac:35: -1- _AM_SUBST_NOTMAKE([AMDEP_TRUE]) +m4trace:configure.ac:35: -1- _AM_SUBST_NOTMAKE([AMDEP_FALSE]) +m4trace:configure.ac:35: -1- m4_pattern_allow([^AMDEPBACKSLASH$]) +m4trace:configure.ac:35: -1- _AM_SUBST_NOTMAKE([AMDEPBACKSLASH]) +m4trace:configure.ac:35: -1- m4_pattern_allow([^am__nodep$]) +m4trace:configure.ac:35: -1- _AM_SUBST_NOTMAKE([am__nodep]) +m4trace:configure.ac:35: -1- m4_pattern_allow([^CCDEPMODE$]) +m4trace:configure.ac:35: -1- AM_CONDITIONAL([am__fastdepCC], [ + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CC_dependencies_compiler_type" = gcc3]) +m4trace:configure.ac:35: -1- m4_pattern_allow([^am__fastdepCC_TRUE$]) +m4trace:configure.ac:35: -1- m4_pattern_allow([^am__fastdepCC_FALSE$]) +m4trace:configure.ac:35: -1- _AM_SUBST_NOTMAKE([am__fastdepCC_TRUE]) +m4trace:configure.ac:35: -1- _AM_SUBST_NOTMAKE([am__fastdepCC_FALSE]) +m4trace:configure.ac:36: -1- m4_pattern_allow([^CXX$]) +m4trace:configure.ac:36: -1- m4_pattern_allow([^CXXFLAGS$]) +m4trace:configure.ac:36: -1- m4_pattern_allow([^LDFLAGS$]) +m4trace:configure.ac:36: -1- m4_pattern_allow([^LIBS$]) +m4trace:configure.ac:36: -1- m4_pattern_allow([^CPPFLAGS$]) +m4trace:configure.ac:36: -1- m4_pattern_allow([^CXX$]) +m4trace:configure.ac:36: -1- m4_pattern_allow([^ac_ct_CXX$]) +m4trace:configure.ac:36: -1- _AM_DEPENDENCIES([CXX]) +m4trace:configure.ac:36: -1- m4_pattern_allow([^CXXDEPMODE$]) +m4trace:configure.ac:36: -1- AM_CONDITIONAL([am__fastdepCXX], [ + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CXX_dependencies_compiler_type" = gcc3]) +m4trace:configure.ac:36: -1- m4_pattern_allow([^am__fastdepCXX_TRUE$]) +m4trace:configure.ac:36: -1- m4_pattern_allow([^am__fastdepCXX_FALSE$]) +m4trace:configure.ac:36: -1- _AM_SUBST_NOTMAKE([am__fastdepCXX_TRUE]) +m4trace:configure.ac:36: -1- _AM_SUBST_NOTMAKE([am__fastdepCXX_FALSE]) +m4trace:configure.ac:37: -1- AC_LIBTOOL_WIN32_DLL +m4trace:configure.ac:37: -1- _m4_warn([obsolete], [The macro `AC_LIBTOOL_WIN32_DLL' is obsolete. +You should run autoupdate.], [/usr/local/share/aclocal/ltoptions.m4:148: AC_LIBTOOL_WIN32_DLL is expanded from... +configure.ac:37: the top level]) +m4trace:configure.ac:37: -1- m4_pattern_allow([^build$]) +m4trace:configure.ac:37: -1- m4_pattern_allow([^build_cpu$]) +m4trace:configure.ac:37: -1- m4_pattern_allow([^build_vendor$]) +m4trace:configure.ac:37: -1- m4_pattern_allow([^build_os$]) +m4trace:configure.ac:37: -1- m4_pattern_allow([^host$]) +m4trace:configure.ac:37: -1- m4_pattern_allow([^host_cpu$]) +m4trace:configure.ac:37: -1- m4_pattern_allow([^host_vendor$]) +m4trace:configure.ac:37: -1- m4_pattern_allow([^host_os$]) +m4trace:configure.ac:37: -1- m4_pattern_allow([^AS$]) +m4trace:configure.ac:37: -1- m4_pattern_allow([^DLLTOOL$]) +m4trace:configure.ac:37: -1- m4_pattern_allow([^OBJDUMP$]) +m4trace:configure.ac:37: -1- _m4_warn([obsolete], [AC_LIBTOOL_WIN32_DLL: Remove this warning and the call to _LT_SET_OPTION when you +put the 'win32-dll' option into LT_INIT's first parameter.], [./lib/autoconf/general.m4:2434: AC_DIAGNOSE is expanded from... +/usr/local/share/aclocal/ltoptions.m4:148: AC_LIBTOOL_WIN32_DLL is expanded from... +configure.ac:37: the top level]) +m4trace:configure.ac:38: -1- AC_PROG_LIBTOOL +m4trace:configure.ac:38: -1- _m4_warn([obsolete], [The macro `AC_PROG_LIBTOOL' is obsolete. +You should run autoupdate.], [/usr/local/share/aclocal/libtool.m4:99: AC_PROG_LIBTOOL is expanded from... +configure.ac:38: the top level]) +m4trace:configure.ac:38: -1- LT_INIT +m4trace:configure.ac:38: -1- m4_pattern_forbid([^_?LT_[A-Z_]+$]) +m4trace:configure.ac:38: -1- m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$]) +m4trace:configure.ac:38: -1- LTOPTIONS_VERSION +m4trace:configure.ac:38: -1- LTSUGAR_VERSION +m4trace:configure.ac:38: -1- LTVERSION_VERSION +m4trace:configure.ac:38: -1- LTOBSOLETE_VERSION +m4trace:configure.ac:38: -1- _LT_PROG_LTMAIN +m4trace:configure.ac:38: -1- m4_pattern_allow([^LIBTOOL$]) +m4trace:configure.ac:38: -1- _LT_PREPARE_SED_QUOTE_VARS +m4trace:configure.ac:38: -1- _LT_PROG_ECHO_BACKSLASH +m4trace:configure.ac:38: -1- LT_PATH_LD +m4trace:configure.ac:38: -1- m4_pattern_allow([^SED$]) +m4trace:configure.ac:38: -1- AC_PROG_EGREP +m4trace:configure.ac:38: -1- m4_pattern_allow([^GREP$]) +m4trace:configure.ac:38: -1- m4_pattern_allow([^EGREP$]) +m4trace:configure.ac:38: -1- m4_pattern_allow([^FGREP$]) +m4trace:configure.ac:38: -1- m4_pattern_allow([^GREP$]) +m4trace:configure.ac:38: -1- m4_pattern_allow([^LD$]) +m4trace:configure.ac:38: -1- LT_PATH_NM +m4trace:configure.ac:38: -1- m4_pattern_allow([^DUMPBIN$]) +m4trace:configure.ac:38: -1- m4_pattern_allow([^ac_ct_DUMPBIN$]) +m4trace:configure.ac:38: -1- m4_pattern_allow([^DUMPBIN$]) +m4trace:configure.ac:38: -1- m4_pattern_allow([^NM$]) +m4trace:configure.ac:38: -1- m4_pattern_allow([^LN_S$]) +m4trace:configure.ac:38: -1- LT_CMD_MAX_LEN +m4trace:configure.ac:38: -1- m4_pattern_allow([^OBJDUMP$]) +m4trace:configure.ac:38: -1- m4_pattern_allow([^OBJDUMP$]) +m4trace:configure.ac:38: -1- m4_pattern_allow([^DLLTOOL$]) +m4trace:configure.ac:38: -1- m4_pattern_allow([^DLLTOOL$]) +m4trace:configure.ac:38: -1- m4_pattern_allow([^AR$]) +m4trace:configure.ac:38: -1- m4_pattern_allow([^ac_ct_AR$]) +m4trace:configure.ac:38: -1- m4_pattern_allow([^STRIP$]) +m4trace:configure.ac:38: -1- m4_pattern_allow([^RANLIB$]) +m4trace:configure.ac:38: -1- _LT_WITH_SYSROOT +m4trace:configure.ac:38: -1- m4_pattern_allow([LT_OBJDIR]) +m4trace:configure.ac:38: -1- m4_pattern_allow([^LT_OBJDIR$]) +m4trace:configure.ac:38: -1- _LT_CC_BASENAME([$compiler]) +m4trace:configure.ac:38: -1- _LT_PATH_TOOL_PREFIX([${ac_tool_prefix}file], [/usr/bin$PATH_SEPARATOR$PATH]) +m4trace:configure.ac:38: -1- _LT_PATH_TOOL_PREFIX([file], [/usr/bin$PATH_SEPARATOR$PATH]) +m4trace:configure.ac:38: -1- LT_SUPPORTED_TAG([CC]) +m4trace:configure.ac:38: -1- _LT_COMPILER_BOILERPLATE +m4trace:configure.ac:38: -1- _LT_LINKER_BOILERPLATE +m4trace:configure.ac:38: -1- _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], [lt_cv_prog_compiler_rtti_exceptions], [-fno-rtti -fno-exceptions], [], [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, )="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, ) -fno-rtti -fno-exceptions"]) +m4trace:configure.ac:38: -1- _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, ) works], [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, )], [$_LT_TAGVAR(lt_prog_compiler_pic, )@&t@m4_if([],[],[ -DPIC],[m4_if([],[CXX],[ -DPIC],[])])], [], [case $_LT_TAGVAR(lt_prog_compiler_pic, ) in + "" | " "*) ;; + *) _LT_TAGVAR(lt_prog_compiler_pic, )=" $_LT_TAGVAR(lt_prog_compiler_pic, )" ;; + esac], [_LT_TAGVAR(lt_prog_compiler_pic, )= + _LT_TAGVAR(lt_prog_compiler_can_build_shared, )=no]) +m4trace:configure.ac:38: -1- _LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], [lt_cv_prog_compiler_static_works], [$lt_tmp_static_flag], [], [_LT_TAGVAR(lt_prog_compiler_static, )=]) +m4trace:configure.ac:38: -1- m4_pattern_allow([^MANIFEST_TOOL$]) +m4trace:configure.ac:38: -1- _LT_DLL_DEF_P([$export_symbols]) +m4trace:configure.ac:38: -1- _LT_DLL_DEF_P([$export_symbols]) +m4trace:configure.ac:38: -1- _LT_REQUIRED_DARWIN_CHECKS +m4trace:configure.ac:38: -1- m4_pattern_allow([^DSYMUTIL$]) +m4trace:configure.ac:38: -1- m4_pattern_allow([^NMEDIT$]) +m4trace:configure.ac:38: -1- m4_pattern_allow([^LIPO$]) +m4trace:configure.ac:38: -1- m4_pattern_allow([^OTOOL$]) +m4trace:configure.ac:38: -1- m4_pattern_allow([^OTOOL64$]) +m4trace:configure.ac:38: -1- _LT_LINKER_OPTION([if $CC understands -b], [lt_cv_prog_compiler__b], [-b], [_LT_TAGVAR(archive_cmds, )='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'], [_LT_TAGVAR(archive_cmds, )='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags']) +m4trace:configure.ac:38: -1- m4_pattern_allow([^LT_SYS_LIBRARY_PATH$]) +m4trace:configure.ac:38: -1- LT_SYS_DLOPEN_SELF +m4trace:configure.ac:38: -1- AC_DEFUN([_AC_Header_stdio_h], [m4_divert_text([INIT_PREPARE], + [AS_VAR_APPEND([ac_header_]]_AC_LANG_ABBREV[[_list], + [" stdio.h ]AS_TR_SH([stdio.h]) AS_TR_CPP([HAVE_stdio.h])["])])_AC_HEADERS_EXPANSION(_AC_LANG_ABBREV)]) +m4trace:configure.ac:38: -1- AC_DEFUN([_AC_Header_stdlib_h], [m4_divert_text([INIT_PREPARE], + [AS_VAR_APPEND([ac_header_]]_AC_LANG_ABBREV[[_list], + [" stdlib.h ]AS_TR_SH([stdlib.h]) AS_TR_CPP([HAVE_stdlib.h])["])])_AC_HEADERS_EXPANSION(_AC_LANG_ABBREV)]) +m4trace:configure.ac:38: -1- AC_DEFUN([_AC_Header_string_h], [m4_divert_text([INIT_PREPARE], + [AS_VAR_APPEND([ac_header_]]_AC_LANG_ABBREV[[_list], + [" string.h ]AS_TR_SH([string.h]) AS_TR_CPP([HAVE_string.h])["])])_AC_HEADERS_EXPANSION(_AC_LANG_ABBREV)]) +m4trace:configure.ac:38: -1- AC_DEFUN([_AC_Header_inttypes_h], [m4_divert_text([INIT_PREPARE], + [AS_VAR_APPEND([ac_header_]]_AC_LANG_ABBREV[[_list], + [" inttypes.h ]AS_TR_SH([inttypes.h]) AS_TR_CPP([HAVE_inttypes.h])["])])_AC_HEADERS_EXPANSION(_AC_LANG_ABBREV)]) +m4trace:configure.ac:38: -1- AC_DEFUN([_AC_Header_stdint_h], [m4_divert_text([INIT_PREPARE], + [AS_VAR_APPEND([ac_header_]]_AC_LANG_ABBREV[[_list], + [" stdint.h ]AS_TR_SH([stdint.h]) AS_TR_CPP([HAVE_stdint.h])["])])_AC_HEADERS_EXPANSION(_AC_LANG_ABBREV)]) +m4trace:configure.ac:38: -1- AC_DEFUN([_AC_Header_strings_h], [m4_divert_text([INIT_PREPARE], + [AS_VAR_APPEND([ac_header_]]_AC_LANG_ABBREV[[_list], + [" strings.h ]AS_TR_SH([strings.h]) AS_TR_CPP([HAVE_strings.h])["])])_AC_HEADERS_EXPANSION(_AC_LANG_ABBREV)]) +m4trace:configure.ac:38: -1- AC_DEFUN([_AC_Header_sys_stat_h], [m4_divert_text([INIT_PREPARE], + [AS_VAR_APPEND([ac_header_]]_AC_LANG_ABBREV[[_list], + [" sys/stat.h ]AS_TR_SH([sys/stat.h]) AS_TR_CPP([HAVE_sys/stat.h])["])])_AC_HEADERS_EXPANSION(_AC_LANG_ABBREV)]) +m4trace:configure.ac:38: -1- AC_DEFUN([_AC_Header_sys_types_h], [m4_divert_text([INIT_PREPARE], + [AS_VAR_APPEND([ac_header_]]_AC_LANG_ABBREV[[_list], + [" sys/types.h ]AS_TR_SH([sys/types.h]) AS_TR_CPP([HAVE_sys/types.h])["])])_AC_HEADERS_EXPANSION(_AC_LANG_ABBREV)]) +m4trace:configure.ac:38: -1- AC_DEFUN([_AC_Header_unistd_h], [m4_divert_text([INIT_PREPARE], + [AS_VAR_APPEND([ac_header_]]_AC_LANG_ABBREV[[_list], + [" unistd.h ]AS_TR_SH([unistd.h]) AS_TR_CPP([HAVE_unistd.h])["])])_AC_HEADERS_EXPANSION(_AC_LANG_ABBREV)]) +m4trace:configure.ac:38: -1- m4_pattern_allow([^STDC_HEADERS$]) +m4trace:configure.ac:38: -1- m4_pattern_allow([^HAVE_DLFCN_H$]) +m4trace:configure.ac:38: -1- LT_LANG([CXX]) +m4trace:configure.ac:38: -1- LT_SUPPORTED_TAG([CXX]) +m4trace:configure.ac:38: -1- m4_pattern_allow([^CXXCPP$]) +m4trace:configure.ac:38: -1- m4_pattern_allow([^CPPFLAGS$]) +m4trace:configure.ac:38: -1- m4_pattern_allow([^CXXCPP$]) +m4trace:configure.ac:38: -1- _LT_COMPILER_BOILERPLATE +m4trace:configure.ac:38: -1- _LT_LINKER_BOILERPLATE +m4trace:configure.ac:38: -1- _LT_CC_BASENAME([$compiler]) +m4trace:configure.ac:38: -1- LT_PATH_LD +m4trace:configure.ac:38: -1- m4_pattern_allow([^LD$]) +m4trace:configure.ac:38: -1- _LT_DLL_DEF_P([$export_symbols]) +m4trace:configure.ac:38: -1- _LT_DLL_DEF_P([$export_symbols]) +m4trace:configure.ac:38: -1- _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, CXX) works], [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, CXX)], [$_LT_TAGVAR(lt_prog_compiler_pic, CXX)@&t@m4_if([CXX],[],[ -DPIC],[m4_if([CXX],[CXX],[ -DPIC],[])])], [], [case $_LT_TAGVAR(lt_prog_compiler_pic, CXX) in + "" | " "*) ;; + *) _LT_TAGVAR(lt_prog_compiler_pic, CXX)=" $_LT_TAGVAR(lt_prog_compiler_pic, CXX)" ;; + esac], [_LT_TAGVAR(lt_prog_compiler_pic, CXX)= + _LT_TAGVAR(lt_prog_compiler_can_build_shared, CXX)=no]) +m4trace:configure.ac:38: -1- _LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], [lt_cv_prog_compiler_static_works_CXX], [$lt_tmp_static_flag], [], [_LT_TAGVAR(lt_prog_compiler_static, CXX)=]) +m4trace:configure.ac:38: -1- m4_pattern_allow([^LT_SYS_LIBRARY_PATH$]) +m4trace:configure.ac:41: -1- m4_pattern_allow([^DEFAULT_INCLUDES$]) +m4trace:configure.ac:42: -1- m4_pattern_allow([^PORTAUDIO_ROOT$]) +m4trace:configure.ac:43: -1- m4_pattern_allow([^CXXFLAGS$]) +m4trace:configure.ac:44: -1- m4_pattern_allow([^LT_VERSION_INFO$]) +m4trace:configure.ac:54: -1- m4_pattern_allow([^LIB@&t@OBJS$]) +m4trace:configure.ac:54: -1- m4_pattern_allow([^LTLIBOBJS$]) +m4trace:configure.ac:54: -1- AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"]) +m4trace:configure.ac:54: -1- m4_pattern_allow([^am__EXEEXT_TRUE$]) +m4trace:configure.ac:54: -1- m4_pattern_allow([^am__EXEEXT_FALSE$]) +m4trace:configure.ac:54: -1- _AM_SUBST_NOTMAKE([am__EXEEXT_TRUE]) +m4trace:configure.ac:54: -1- _AM_SUBST_NOTMAKE([am__EXEEXT_FALSE]) +m4trace:configure.ac:54: -1- _AM_OUTPUT_DEPENDENCY_COMMANDS +m4trace:configure.ac:54: -1- AM_RUN_LOG([cd "$am_dirpart" \ + && sed -e '/# am--include-marker/d' "$am_filepart" \ + | $MAKE -f - am--depfiles]) +m4trace:configure.ac:54: -1- _LT_PROG_LTMAIN diff --git a/bindings/cpp/autom4te.cache/traces.1 b/bindings/cpp/autom4te.cache/traces.1 new file mode 100644 index 0000000..b8a0945 --- /dev/null +++ b/bindings/cpp/autom4te.cache/traces.1 @@ -0,0 +1,618 @@ +m4trace:aclocal.m4:9759: -1- AC_SUBST([am__quote]) +m4trace:aclocal.m4:9759: -1- AC_SUBST_TRACE([am__quote]) +m4trace:aclocal.m4:9759: -1- m4_pattern_allow([^am__quote$]) +m4trace:configure.ac:15: -1- AC_INIT([PortAudioCpp], [12]) +m4trace:configure.ac:15: -1- m4_pattern_forbid([^_?A[CHUM]_]) +m4trace:configure.ac:15: -1- m4_pattern_forbid([_AC_]) +m4trace:configure.ac:15: -1- m4_pattern_forbid([^LIBOBJS$], [do not use LIBOBJS directly, use AC_LIBOBJ (see section `AC_LIBOBJ vs LIBOBJS']) +m4trace:configure.ac:15: -1- m4_pattern_allow([^AS_FLAGS$]) +m4trace:configure.ac:15: -1- m4_pattern_forbid([^_?m4_]) +m4trace:configure.ac:15: -1- m4_pattern_forbid([^dnl$]) +m4trace:configure.ac:15: -1- m4_pattern_forbid([^_?AS_]) +m4trace:configure.ac:15: -1- AC_SUBST([SHELL]) +m4trace:configure.ac:15: -1- AC_SUBST_TRACE([SHELL]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^SHELL$]) +m4trace:configure.ac:15: -1- AC_SUBST([PATH_SEPARATOR]) +m4trace:configure.ac:15: -1- AC_SUBST_TRACE([PATH_SEPARATOR]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^PATH_SEPARATOR$]) +m4trace:configure.ac:15: -1- AC_SUBST([PACKAGE_NAME], [m4_ifdef([AC_PACKAGE_NAME], ['AC_PACKAGE_NAME'])]) +m4trace:configure.ac:15: -1- AC_SUBST_TRACE([PACKAGE_NAME]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^PACKAGE_NAME$]) +m4trace:configure.ac:15: -1- AC_SUBST([PACKAGE_TARNAME], [m4_ifdef([AC_PACKAGE_TARNAME], ['AC_PACKAGE_TARNAME'])]) +m4trace:configure.ac:15: -1- AC_SUBST_TRACE([PACKAGE_TARNAME]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^PACKAGE_TARNAME$]) +m4trace:configure.ac:15: -1- AC_SUBST([PACKAGE_VERSION], [m4_ifdef([AC_PACKAGE_VERSION], ['AC_PACKAGE_VERSION'])]) +m4trace:configure.ac:15: -1- AC_SUBST_TRACE([PACKAGE_VERSION]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^PACKAGE_VERSION$]) +m4trace:configure.ac:15: -1- AC_SUBST([PACKAGE_STRING], [m4_ifdef([AC_PACKAGE_STRING], ['AC_PACKAGE_STRING'])]) +m4trace:configure.ac:15: -1- AC_SUBST_TRACE([PACKAGE_STRING]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^PACKAGE_STRING$]) +m4trace:configure.ac:15: -1- AC_SUBST([PACKAGE_BUGREPORT], [m4_ifdef([AC_PACKAGE_BUGREPORT], ['AC_PACKAGE_BUGREPORT'])]) +m4trace:configure.ac:15: -1- AC_SUBST_TRACE([PACKAGE_BUGREPORT]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^PACKAGE_BUGREPORT$]) +m4trace:configure.ac:15: -1- AC_SUBST([PACKAGE_URL], [m4_ifdef([AC_PACKAGE_URL], ['AC_PACKAGE_URL'])]) +m4trace:configure.ac:15: -1- AC_SUBST_TRACE([PACKAGE_URL]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^PACKAGE_URL$]) +m4trace:configure.ac:15: -1- AC_SUBST([exec_prefix], [NONE]) +m4trace:configure.ac:15: -1- AC_SUBST_TRACE([exec_prefix]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^exec_prefix$]) +m4trace:configure.ac:15: -1- AC_SUBST([prefix], [NONE]) +m4trace:configure.ac:15: -1- AC_SUBST_TRACE([prefix]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^prefix$]) +m4trace:configure.ac:15: -1- AC_SUBST([program_transform_name], [s,x,x,]) +m4trace:configure.ac:15: -1- AC_SUBST_TRACE([program_transform_name]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^program_transform_name$]) +m4trace:configure.ac:15: -1- AC_SUBST([bindir], ['${exec_prefix}/bin']) +m4trace:configure.ac:15: -1- AC_SUBST_TRACE([bindir]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^bindir$]) +m4trace:configure.ac:15: -1- AC_SUBST([sbindir], ['${exec_prefix}/sbin']) +m4trace:configure.ac:15: -1- AC_SUBST_TRACE([sbindir]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^sbindir$]) +m4trace:configure.ac:15: -1- AC_SUBST([libexecdir], ['${exec_prefix}/libexec']) +m4trace:configure.ac:15: -1- AC_SUBST_TRACE([libexecdir]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^libexecdir$]) +m4trace:configure.ac:15: -1- AC_SUBST([datarootdir], ['${prefix}/share']) +m4trace:configure.ac:15: -1- AC_SUBST_TRACE([datarootdir]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^datarootdir$]) +m4trace:configure.ac:15: -1- AC_SUBST([datadir], ['${datarootdir}']) +m4trace:configure.ac:15: -1- AC_SUBST_TRACE([datadir]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^datadir$]) +m4trace:configure.ac:15: -1- AC_SUBST([sysconfdir], ['${prefix}/etc']) +m4trace:configure.ac:15: -1- AC_SUBST_TRACE([sysconfdir]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^sysconfdir$]) +m4trace:configure.ac:15: -1- AC_SUBST([sharedstatedir], ['${prefix}/com']) +m4trace:configure.ac:15: -1- AC_SUBST_TRACE([sharedstatedir]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^sharedstatedir$]) +m4trace:configure.ac:15: -1- AC_SUBST([localstatedir], ['${prefix}/var']) +m4trace:configure.ac:15: -1- AC_SUBST_TRACE([localstatedir]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^localstatedir$]) +m4trace:configure.ac:15: -1- AC_SUBST([runstatedir], ['${localstatedir}/run']) +m4trace:configure.ac:15: -1- AC_SUBST_TRACE([runstatedir]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^runstatedir$]) +m4trace:configure.ac:15: -1- AC_SUBST([includedir], ['${prefix}/include']) +m4trace:configure.ac:15: -1- AC_SUBST_TRACE([includedir]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^includedir$]) +m4trace:configure.ac:15: -1- AC_SUBST([oldincludedir], ['/usr/include']) +m4trace:configure.ac:15: -1- AC_SUBST_TRACE([oldincludedir]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^oldincludedir$]) +m4trace:configure.ac:15: -1- AC_SUBST([docdir], [m4_ifset([AC_PACKAGE_TARNAME], + ['${datarootdir}/doc/${PACKAGE_TARNAME}'], + ['${datarootdir}/doc/${PACKAGE}'])]) +m4trace:configure.ac:15: -1- AC_SUBST_TRACE([docdir]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^docdir$]) +m4trace:configure.ac:15: -1- AC_SUBST([infodir], ['${datarootdir}/info']) +m4trace:configure.ac:15: -1- AC_SUBST_TRACE([infodir]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^infodir$]) +m4trace:configure.ac:15: -1- AC_SUBST([htmldir], ['${docdir}']) +m4trace:configure.ac:15: -1- AC_SUBST_TRACE([htmldir]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^htmldir$]) +m4trace:configure.ac:15: -1- AC_SUBST([dvidir], ['${docdir}']) +m4trace:configure.ac:15: -1- AC_SUBST_TRACE([dvidir]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^dvidir$]) +m4trace:configure.ac:15: -1- AC_SUBST([pdfdir], ['${docdir}']) +m4trace:configure.ac:15: -1- AC_SUBST_TRACE([pdfdir]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^pdfdir$]) +m4trace:configure.ac:15: -1- AC_SUBST([psdir], ['${docdir}']) +m4trace:configure.ac:15: -1- AC_SUBST_TRACE([psdir]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^psdir$]) +m4trace:configure.ac:15: -1- AC_SUBST([libdir], ['${exec_prefix}/lib']) +m4trace:configure.ac:15: -1- AC_SUBST_TRACE([libdir]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^libdir$]) +m4trace:configure.ac:15: -1- AC_SUBST([localedir], ['${datarootdir}/locale']) +m4trace:configure.ac:15: -1- AC_SUBST_TRACE([localedir]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^localedir$]) +m4trace:configure.ac:15: -1- AC_SUBST([mandir], ['${datarootdir}/man']) +m4trace:configure.ac:15: -1- AC_SUBST_TRACE([mandir]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^mandir$]) +m4trace:configure.ac:15: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_NAME]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^PACKAGE_NAME$]) +m4trace:configure.ac:15: -1- AH_OUTPUT([PACKAGE_NAME], [/* Define to the full name of this package. */ +@%:@undef PACKAGE_NAME]) +m4trace:configure.ac:15: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_TARNAME]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^PACKAGE_TARNAME$]) +m4trace:configure.ac:15: -1- AH_OUTPUT([PACKAGE_TARNAME], [/* Define to the one symbol short name of this package. */ +@%:@undef PACKAGE_TARNAME]) +m4trace:configure.ac:15: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_VERSION]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^PACKAGE_VERSION$]) +m4trace:configure.ac:15: -1- AH_OUTPUT([PACKAGE_VERSION], [/* Define to the version of this package. */ +@%:@undef PACKAGE_VERSION]) +m4trace:configure.ac:15: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_STRING]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^PACKAGE_STRING$]) +m4trace:configure.ac:15: -1- AH_OUTPUT([PACKAGE_STRING], [/* Define to the full name and version of this package. */ +@%:@undef PACKAGE_STRING]) +m4trace:configure.ac:15: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_BUGREPORT]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^PACKAGE_BUGREPORT$]) +m4trace:configure.ac:15: -1- AH_OUTPUT([PACKAGE_BUGREPORT], [/* Define to the address where bug reports for this package should be sent. */ +@%:@undef PACKAGE_BUGREPORT]) +m4trace:configure.ac:15: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_URL]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^PACKAGE_URL$]) +m4trace:configure.ac:15: -1- AH_OUTPUT([PACKAGE_URL], [/* Define to the home page for this package. */ +@%:@undef PACKAGE_URL]) +m4trace:configure.ac:15: -1- AC_SUBST([DEFS]) +m4trace:configure.ac:15: -1- AC_SUBST_TRACE([DEFS]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^DEFS$]) +m4trace:configure.ac:15: -1- AC_SUBST([ECHO_C]) +m4trace:configure.ac:15: -1- AC_SUBST_TRACE([ECHO_C]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^ECHO_C$]) +m4trace:configure.ac:15: -1- AC_SUBST([ECHO_N]) +m4trace:configure.ac:15: -1- AC_SUBST_TRACE([ECHO_N]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^ECHO_N$]) +m4trace:configure.ac:15: -1- AC_SUBST([ECHO_T]) +m4trace:configure.ac:15: -1- AC_SUBST_TRACE([ECHO_T]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^ECHO_T$]) +m4trace:configure.ac:15: -1- AC_SUBST([LIBS]) +m4trace:configure.ac:15: -1- AC_SUBST_TRACE([LIBS]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^LIBS$]) +m4trace:configure.ac:15: -1- AC_SUBST([build_alias]) +m4trace:configure.ac:15: -1- AC_SUBST_TRACE([build_alias]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^build_alias$]) +m4trace:configure.ac:15: -1- AC_SUBST([host_alias]) +m4trace:configure.ac:15: -1- AC_SUBST_TRACE([host_alias]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^host_alias$]) +m4trace:configure.ac:15: -1- AC_SUBST([target_alias]) +m4trace:configure.ac:15: -1- AC_SUBST_TRACE([target_alias]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^target_alias$]) +m4trace:configure.ac:17: -1- AM_INIT_AUTOMAKE +m4trace:configure.ac:17: -1- m4_pattern_allow([^AM_[A-Z]+FLAGS$]) +m4trace:configure.ac:17: -1- AM_AUTOMAKE_VERSION([1.16.5]) +m4trace:configure.ac:17: -1- AC_REQUIRE_AUX_FILE([install-sh]) +m4trace:configure.ac:17: -1- AC_SUBST([INSTALL_PROGRAM]) +m4trace:configure.ac:17: -1- AC_SUBST_TRACE([INSTALL_PROGRAM]) +m4trace:configure.ac:17: -1- m4_pattern_allow([^INSTALL_PROGRAM$]) +m4trace:configure.ac:17: -1- AC_SUBST([INSTALL_SCRIPT]) +m4trace:configure.ac:17: -1- AC_SUBST_TRACE([INSTALL_SCRIPT]) +m4trace:configure.ac:17: -1- m4_pattern_allow([^INSTALL_SCRIPT$]) +m4trace:configure.ac:17: -1- AC_SUBST([INSTALL_DATA]) +m4trace:configure.ac:17: -1- AC_SUBST_TRACE([INSTALL_DATA]) +m4trace:configure.ac:17: -1- m4_pattern_allow([^INSTALL_DATA$]) +m4trace:configure.ac:17: -1- AC_SUBST([am__isrc], [' -I$(srcdir)']) +m4trace:configure.ac:17: -1- AC_SUBST_TRACE([am__isrc]) +m4trace:configure.ac:17: -1- m4_pattern_allow([^am__isrc$]) +m4trace:configure.ac:17: -1- _AM_SUBST_NOTMAKE([am__isrc]) +m4trace:configure.ac:17: -1- AC_SUBST([CYGPATH_W]) +m4trace:configure.ac:17: -1- AC_SUBST_TRACE([CYGPATH_W]) +m4trace:configure.ac:17: -1- m4_pattern_allow([^CYGPATH_W$]) +m4trace:configure.ac:17: -1- AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME']) +m4trace:configure.ac:17: -1- AC_SUBST_TRACE([PACKAGE]) +m4trace:configure.ac:17: -1- m4_pattern_allow([^PACKAGE$]) +m4trace:configure.ac:17: -1- AC_SUBST([VERSION], ['AC_PACKAGE_VERSION']) +m4trace:configure.ac:17: -1- AC_SUBST_TRACE([VERSION]) +m4trace:configure.ac:17: -1- m4_pattern_allow([^VERSION$]) +m4trace:configure.ac:17: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE]) +m4trace:configure.ac:17: -1- m4_pattern_allow([^PACKAGE$]) +m4trace:configure.ac:17: -1- AH_OUTPUT([PACKAGE], [/* Name of package */ +@%:@undef PACKAGE]) +m4trace:configure.ac:17: -1- AC_DEFINE_TRACE_LITERAL([VERSION]) +m4trace:configure.ac:17: -1- m4_pattern_allow([^VERSION$]) +m4trace:configure.ac:17: -1- AH_OUTPUT([VERSION], [/* Version number of package */ +@%:@undef VERSION]) +m4trace:configure.ac:17: -1- AC_REQUIRE_AUX_FILE([missing]) +m4trace:configure.ac:17: -1- AC_SUBST([ACLOCAL]) +m4trace:configure.ac:17: -1- AC_SUBST_TRACE([ACLOCAL]) +m4trace:configure.ac:17: -1- m4_pattern_allow([^ACLOCAL$]) +m4trace:configure.ac:17: -1- AC_SUBST([AUTOCONF]) +m4trace:configure.ac:17: -1- AC_SUBST_TRACE([AUTOCONF]) +m4trace:configure.ac:17: -1- m4_pattern_allow([^AUTOCONF$]) +m4trace:configure.ac:17: -1- AC_SUBST([AUTOMAKE]) +m4trace:configure.ac:17: -1- AC_SUBST_TRACE([AUTOMAKE]) +m4trace:configure.ac:17: -1- m4_pattern_allow([^AUTOMAKE$]) +m4trace:configure.ac:17: -1- AC_SUBST([AUTOHEADER]) +m4trace:configure.ac:17: -1- AC_SUBST_TRACE([AUTOHEADER]) +m4trace:configure.ac:17: -1- m4_pattern_allow([^AUTOHEADER$]) +m4trace:configure.ac:17: -1- AC_SUBST([MAKEINFO]) +m4trace:configure.ac:17: -1- AC_SUBST_TRACE([MAKEINFO]) +m4trace:configure.ac:17: -1- m4_pattern_allow([^MAKEINFO$]) +m4trace:configure.ac:17: -1- AC_SUBST([install_sh]) +m4trace:configure.ac:17: -1- AC_SUBST_TRACE([install_sh]) +m4trace:configure.ac:17: -1- m4_pattern_allow([^install_sh$]) +m4trace:configure.ac:17: -1- AC_SUBST([STRIP]) +m4trace:configure.ac:17: -1- AC_SUBST_TRACE([STRIP]) +m4trace:configure.ac:17: -1- m4_pattern_allow([^STRIP$]) +m4trace:configure.ac:17: -1- AC_SUBST([INSTALL_STRIP_PROGRAM]) +m4trace:configure.ac:17: -1- AC_SUBST_TRACE([INSTALL_STRIP_PROGRAM]) +m4trace:configure.ac:17: -1- m4_pattern_allow([^INSTALL_STRIP_PROGRAM$]) +m4trace:configure.ac:17: -1- AC_REQUIRE_AUX_FILE([install-sh]) +m4trace:configure.ac:17: -1- AC_SUBST([MKDIR_P]) +m4trace:configure.ac:17: -1- AC_SUBST_TRACE([MKDIR_P]) +m4trace:configure.ac:17: -1- m4_pattern_allow([^MKDIR_P$]) +m4trace:configure.ac:17: -1- AC_SUBST([mkdir_p], ['$(MKDIR_P)']) +m4trace:configure.ac:17: -1- AC_SUBST_TRACE([mkdir_p]) +m4trace:configure.ac:17: -1- m4_pattern_allow([^mkdir_p$]) +m4trace:configure.ac:17: -1- AC_SUBST([AWK]) +m4trace:configure.ac:17: -1- AC_SUBST_TRACE([AWK]) +m4trace:configure.ac:17: -1- m4_pattern_allow([^AWK$]) +m4trace:configure.ac:17: -1- AC_SUBST([SET_MAKE]) +m4trace:configure.ac:17: -1- AC_SUBST_TRACE([SET_MAKE]) +m4trace:configure.ac:17: -1- m4_pattern_allow([^SET_MAKE$]) +m4trace:configure.ac:17: -1- AC_SUBST([am__leading_dot]) +m4trace:configure.ac:17: -1- AC_SUBST_TRACE([am__leading_dot]) +m4trace:configure.ac:17: -1- m4_pattern_allow([^am__leading_dot$]) +m4trace:configure.ac:17: -1- AC_SUBST([AMTAR], ['$${TAR-tar}']) +m4trace:configure.ac:17: -1- AC_SUBST_TRACE([AMTAR]) +m4trace:configure.ac:17: -1- m4_pattern_allow([^AMTAR$]) +m4trace:configure.ac:17: -1- AC_SUBST([am__tar]) +m4trace:configure.ac:17: -1- AC_SUBST_TRACE([am__tar]) +m4trace:configure.ac:17: -1- m4_pattern_allow([^am__tar$]) +m4trace:configure.ac:17: -1- AC_SUBST([am__untar]) +m4trace:configure.ac:17: -1- AC_SUBST_TRACE([am__untar]) +m4trace:configure.ac:17: -1- m4_pattern_allow([^am__untar$]) +m4trace:configure.ac:17: -1- AC_SUBST([CTAGS]) +m4trace:configure.ac:17: -1- AC_SUBST_TRACE([CTAGS]) +m4trace:configure.ac:17: -1- m4_pattern_allow([^CTAGS$]) +m4trace:configure.ac:17: -1- AC_SUBST([ETAGS]) +m4trace:configure.ac:17: -1- AC_SUBST_TRACE([ETAGS]) +m4trace:configure.ac:17: -1- m4_pattern_allow([^ETAGS$]) +m4trace:configure.ac:17: -1- AC_SUBST([CSCOPE]) +m4trace:configure.ac:17: -1- AC_SUBST_TRACE([CSCOPE]) +m4trace:configure.ac:17: -1- m4_pattern_allow([^CSCOPE$]) +m4trace:configure.ac:17: -1- AM_SILENT_RULES +m4trace:configure.ac:17: -1- AC_SUBST([AM_V]) +m4trace:configure.ac:17: -1- AC_SUBST_TRACE([AM_V]) +m4trace:configure.ac:17: -1- m4_pattern_allow([^AM_V$]) +m4trace:configure.ac:17: -1- _AM_SUBST_NOTMAKE([AM_V]) +m4trace:configure.ac:17: -1- AC_SUBST([AM_DEFAULT_V]) +m4trace:configure.ac:17: -1- AC_SUBST_TRACE([AM_DEFAULT_V]) +m4trace:configure.ac:17: -1- m4_pattern_allow([^AM_DEFAULT_V$]) +m4trace:configure.ac:17: -1- _AM_SUBST_NOTMAKE([AM_DEFAULT_V]) +m4trace:configure.ac:17: -1- AC_SUBST([AM_DEFAULT_VERBOSITY]) +m4trace:configure.ac:17: -1- AC_SUBST_TRACE([AM_DEFAULT_VERBOSITY]) +m4trace:configure.ac:17: -1- m4_pattern_allow([^AM_DEFAULT_VERBOSITY$]) +m4trace:configure.ac:17: -1- AC_SUBST([AM_BACKSLASH]) +m4trace:configure.ac:17: -1- AC_SUBST_TRACE([AM_BACKSLASH]) +m4trace:configure.ac:17: -1- m4_pattern_allow([^AM_BACKSLASH$]) +m4trace:configure.ac:17: -1- _AM_SUBST_NOTMAKE([AM_BACKSLASH]) +m4trace:configure.ac:18: -1- AM_MAINTAINER_MODE +m4trace:configure.ac:18: -1- AM_CONDITIONAL([MAINTAINER_MODE], [test $USE_MAINTAINER_MODE = yes]) +m4trace:configure.ac:18: -1- AC_SUBST([MAINTAINER_MODE_TRUE]) +m4trace:configure.ac:18: -1- AC_SUBST_TRACE([MAINTAINER_MODE_TRUE]) +m4trace:configure.ac:18: -1- m4_pattern_allow([^MAINTAINER_MODE_TRUE$]) +m4trace:configure.ac:18: -1- AC_SUBST([MAINTAINER_MODE_FALSE]) +m4trace:configure.ac:18: -1- AC_SUBST_TRACE([MAINTAINER_MODE_FALSE]) +m4trace:configure.ac:18: -1- m4_pattern_allow([^MAINTAINER_MODE_FALSE$]) +m4trace:configure.ac:18: -1- _AM_SUBST_NOTMAKE([MAINTAINER_MODE_TRUE]) +m4trace:configure.ac:18: -1- _AM_SUBST_NOTMAKE([MAINTAINER_MODE_FALSE]) +m4trace:configure.ac:18: -1- AC_SUBST([MAINT]) +m4trace:configure.ac:18: -1- AC_SUBST_TRACE([MAINT]) +m4trace:configure.ac:18: -1- m4_pattern_allow([^MAINT$]) +m4trace:configure.ac:35: -1- AC_SUBST([CC]) +m4trace:configure.ac:35: -1- AC_SUBST_TRACE([CC]) +m4trace:configure.ac:35: -1- m4_pattern_allow([^CC$]) +m4trace:configure.ac:35: -1- AC_SUBST([CFLAGS]) +m4trace:configure.ac:35: -1- AC_SUBST_TRACE([CFLAGS]) +m4trace:configure.ac:35: -1- m4_pattern_allow([^CFLAGS$]) +m4trace:configure.ac:35: -1- AC_SUBST([LDFLAGS]) +m4trace:configure.ac:35: -1- AC_SUBST_TRACE([LDFLAGS]) +m4trace:configure.ac:35: -1- m4_pattern_allow([^LDFLAGS$]) +m4trace:configure.ac:35: -1- AC_SUBST([LIBS]) +m4trace:configure.ac:35: -1- AC_SUBST_TRACE([LIBS]) +m4trace:configure.ac:35: -1- m4_pattern_allow([^LIBS$]) +m4trace:configure.ac:35: -1- AC_SUBST([CPPFLAGS]) +m4trace:configure.ac:35: -1- AC_SUBST_TRACE([CPPFLAGS]) +m4trace:configure.ac:35: -1- m4_pattern_allow([^CPPFLAGS$]) +m4trace:configure.ac:35: -1- AC_SUBST([CC]) +m4trace:configure.ac:35: -1- AC_SUBST_TRACE([CC]) +m4trace:configure.ac:35: -1- m4_pattern_allow([^CC$]) +m4trace:configure.ac:35: -1- AC_SUBST([CC]) +m4trace:configure.ac:35: -1- AC_SUBST_TRACE([CC]) +m4trace:configure.ac:35: -1- m4_pattern_allow([^CC$]) +m4trace:configure.ac:35: -1- AC_SUBST([CC]) +m4trace:configure.ac:35: -1- AC_SUBST_TRACE([CC]) +m4trace:configure.ac:35: -1- m4_pattern_allow([^CC$]) +m4trace:configure.ac:35: -1- AC_SUBST([CC]) +m4trace:configure.ac:35: -1- AC_SUBST_TRACE([CC]) +m4trace:configure.ac:35: -1- m4_pattern_allow([^CC$]) +m4trace:configure.ac:35: -1- AC_SUBST([ac_ct_CC]) +m4trace:configure.ac:35: -1- AC_SUBST_TRACE([ac_ct_CC]) +m4trace:configure.ac:35: -1- m4_pattern_allow([^ac_ct_CC$]) +m4trace:configure.ac:35: -1- AC_SUBST([CC]) +m4trace:configure.ac:35: -1- AC_SUBST_TRACE([CC]) +m4trace:configure.ac:35: -1- m4_pattern_allow([^CC$]) +m4trace:configure.ac:35: -1- AC_SUBST([EXEEXT], [$ac_cv_exeext]) +m4trace:configure.ac:35: -1- AC_SUBST_TRACE([EXEEXT]) +m4trace:configure.ac:35: -1- m4_pattern_allow([^EXEEXT$]) +m4trace:configure.ac:35: -1- AC_SUBST([OBJEXT], [$ac_cv_objext]) +m4trace:configure.ac:35: -1- AC_SUBST_TRACE([OBJEXT]) +m4trace:configure.ac:35: -1- m4_pattern_allow([^OBJEXT$]) +m4trace:configure.ac:35: -1- AC_REQUIRE_AUX_FILE([compile]) +m4trace:configure.ac:35: -1- AC_SUBST([DEPDIR], ["${am__leading_dot}deps"]) +m4trace:configure.ac:35: -1- AC_SUBST_TRACE([DEPDIR]) +m4trace:configure.ac:35: -1- m4_pattern_allow([^DEPDIR$]) +m4trace:configure.ac:35: -1- AC_SUBST([am__include]) +m4trace:configure.ac:35: -1- AC_SUBST_TRACE([am__include]) +m4trace:configure.ac:35: -1- m4_pattern_allow([^am__include$]) +m4trace:configure.ac:35: -1- AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) +m4trace:configure.ac:35: -1- AC_SUBST([AMDEP_TRUE]) +m4trace:configure.ac:35: -1- AC_SUBST_TRACE([AMDEP_TRUE]) +m4trace:configure.ac:35: -1- m4_pattern_allow([^AMDEP_TRUE$]) +m4trace:configure.ac:35: -1- AC_SUBST([AMDEP_FALSE]) +m4trace:configure.ac:35: -1- AC_SUBST_TRACE([AMDEP_FALSE]) +m4trace:configure.ac:35: -1- m4_pattern_allow([^AMDEP_FALSE$]) +m4trace:configure.ac:35: -1- _AM_SUBST_NOTMAKE([AMDEP_TRUE]) +m4trace:configure.ac:35: -1- _AM_SUBST_NOTMAKE([AMDEP_FALSE]) +m4trace:configure.ac:35: -1- AC_SUBST([AMDEPBACKSLASH]) +m4trace:configure.ac:35: -1- AC_SUBST_TRACE([AMDEPBACKSLASH]) +m4trace:configure.ac:35: -1- m4_pattern_allow([^AMDEPBACKSLASH$]) +m4trace:configure.ac:35: -1- _AM_SUBST_NOTMAKE([AMDEPBACKSLASH]) +m4trace:configure.ac:35: -1- AC_SUBST([am__nodep]) +m4trace:configure.ac:35: -1- AC_SUBST_TRACE([am__nodep]) +m4trace:configure.ac:35: -1- m4_pattern_allow([^am__nodep$]) +m4trace:configure.ac:35: -1- _AM_SUBST_NOTMAKE([am__nodep]) +m4trace:configure.ac:35: -1- AC_SUBST([CCDEPMODE], [depmode=$am_cv_CC_dependencies_compiler_type]) +m4trace:configure.ac:35: -1- AC_SUBST_TRACE([CCDEPMODE]) +m4trace:configure.ac:35: -1- m4_pattern_allow([^CCDEPMODE$]) +m4trace:configure.ac:35: -1- AM_CONDITIONAL([am__fastdepCC], [ + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CC_dependencies_compiler_type" = gcc3]) +m4trace:configure.ac:35: -1- AC_SUBST([am__fastdepCC_TRUE]) +m4trace:configure.ac:35: -1- AC_SUBST_TRACE([am__fastdepCC_TRUE]) +m4trace:configure.ac:35: -1- m4_pattern_allow([^am__fastdepCC_TRUE$]) +m4trace:configure.ac:35: -1- AC_SUBST([am__fastdepCC_FALSE]) +m4trace:configure.ac:35: -1- AC_SUBST_TRACE([am__fastdepCC_FALSE]) +m4trace:configure.ac:35: -1- m4_pattern_allow([^am__fastdepCC_FALSE$]) +m4trace:configure.ac:35: -1- _AM_SUBST_NOTMAKE([am__fastdepCC_TRUE]) +m4trace:configure.ac:35: -1- _AM_SUBST_NOTMAKE([am__fastdepCC_FALSE]) +m4trace:configure.ac:36: -1- AC_SUBST([CXX]) +m4trace:configure.ac:36: -1- AC_SUBST_TRACE([CXX]) +m4trace:configure.ac:36: -1- m4_pattern_allow([^CXX$]) +m4trace:configure.ac:36: -1- AC_SUBST([CXXFLAGS]) +m4trace:configure.ac:36: -1- AC_SUBST_TRACE([CXXFLAGS]) +m4trace:configure.ac:36: -1- m4_pattern_allow([^CXXFLAGS$]) +m4trace:configure.ac:36: -1- AC_SUBST([LDFLAGS]) +m4trace:configure.ac:36: -1- AC_SUBST_TRACE([LDFLAGS]) +m4trace:configure.ac:36: -1- m4_pattern_allow([^LDFLAGS$]) +m4trace:configure.ac:36: -1- AC_SUBST([LIBS]) +m4trace:configure.ac:36: -1- AC_SUBST_TRACE([LIBS]) +m4trace:configure.ac:36: -1- m4_pattern_allow([^LIBS$]) +m4trace:configure.ac:36: -1- AC_SUBST([CPPFLAGS]) +m4trace:configure.ac:36: -1- AC_SUBST_TRACE([CPPFLAGS]) +m4trace:configure.ac:36: -1- m4_pattern_allow([^CPPFLAGS$]) +m4trace:configure.ac:36: -1- AC_SUBST([CXX]) +m4trace:configure.ac:36: -1- AC_SUBST_TRACE([CXX]) +m4trace:configure.ac:36: -1- m4_pattern_allow([^CXX$]) +m4trace:configure.ac:36: -1- AC_SUBST([ac_ct_CXX]) +m4trace:configure.ac:36: -1- AC_SUBST_TRACE([ac_ct_CXX]) +m4trace:configure.ac:36: -1- m4_pattern_allow([^ac_ct_CXX$]) +m4trace:configure.ac:36: -1- AC_SUBST([CXXDEPMODE], [depmode=$am_cv_CXX_dependencies_compiler_type]) +m4trace:configure.ac:36: -1- AC_SUBST_TRACE([CXXDEPMODE]) +m4trace:configure.ac:36: -1- m4_pattern_allow([^CXXDEPMODE$]) +m4trace:configure.ac:36: -1- AM_CONDITIONAL([am__fastdepCXX], [ + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CXX_dependencies_compiler_type" = gcc3]) +m4trace:configure.ac:36: -1- AC_SUBST([am__fastdepCXX_TRUE]) +m4trace:configure.ac:36: -1- AC_SUBST_TRACE([am__fastdepCXX_TRUE]) +m4trace:configure.ac:36: -1- m4_pattern_allow([^am__fastdepCXX_TRUE$]) +m4trace:configure.ac:36: -1- AC_SUBST([am__fastdepCXX_FALSE]) +m4trace:configure.ac:36: -1- AC_SUBST_TRACE([am__fastdepCXX_FALSE]) +m4trace:configure.ac:36: -1- m4_pattern_allow([^am__fastdepCXX_FALSE$]) +m4trace:configure.ac:36: -1- _AM_SUBST_NOTMAKE([am__fastdepCXX_TRUE]) +m4trace:configure.ac:36: -1- _AM_SUBST_NOTMAKE([am__fastdepCXX_FALSE]) +m4trace:configure.ac:37: -1- _m4_warn([obsolete], [The macro `AC_LIBTOOL_WIN32_DLL' is obsolete. +You should run autoupdate.], [aclocal.m4:8510: AC_LIBTOOL_WIN32_DLL is expanded from... +configure.ac:37: the top level]) +m4trace:configure.ac:37: -1- AC_CANONICAL_HOST +m4trace:configure.ac:37: -1- AC_CANONICAL_BUILD +m4trace:configure.ac:37: -1- AC_REQUIRE_AUX_FILE([config.sub]) +m4trace:configure.ac:37: -1- AC_REQUIRE_AUX_FILE([config.guess]) +m4trace:configure.ac:37: -1- AC_SUBST([build], [$ac_cv_build]) +m4trace:configure.ac:37: -1- AC_SUBST_TRACE([build]) +m4trace:configure.ac:37: -1- m4_pattern_allow([^build$]) +m4trace:configure.ac:37: -1- AC_SUBST([build_cpu], [$[1]]) +m4trace:configure.ac:37: -1- AC_SUBST_TRACE([build_cpu]) +m4trace:configure.ac:37: -1- m4_pattern_allow([^build_cpu$]) +m4trace:configure.ac:37: -1- AC_SUBST([build_vendor], [$[2]]) +m4trace:configure.ac:37: -1- AC_SUBST_TRACE([build_vendor]) +m4trace:configure.ac:37: -1- m4_pattern_allow([^build_vendor$]) +m4trace:configure.ac:37: -1- AC_SUBST([build_os]) +m4trace:configure.ac:37: -1- AC_SUBST_TRACE([build_os]) +m4trace:configure.ac:37: -1- m4_pattern_allow([^build_os$]) +m4trace:configure.ac:37: -1- AC_SUBST([host], [$ac_cv_host]) +m4trace:configure.ac:37: -1- AC_SUBST_TRACE([host]) +m4trace:configure.ac:37: -1- m4_pattern_allow([^host$]) +m4trace:configure.ac:37: -1- AC_SUBST([host_cpu], [$[1]]) +m4trace:configure.ac:37: -1- AC_SUBST_TRACE([host_cpu]) +m4trace:configure.ac:37: -1- m4_pattern_allow([^host_cpu$]) +m4trace:configure.ac:37: -1- AC_SUBST([host_vendor], [$[2]]) +m4trace:configure.ac:37: -1- AC_SUBST_TRACE([host_vendor]) +m4trace:configure.ac:37: -1- m4_pattern_allow([^host_vendor$]) +m4trace:configure.ac:37: -1- AC_SUBST([host_os]) +m4trace:configure.ac:37: -1- AC_SUBST_TRACE([host_os]) +m4trace:configure.ac:37: -1- m4_pattern_allow([^host_os$]) +m4trace:configure.ac:37: -1- AC_SUBST([AS]) +m4trace:configure.ac:37: -1- AC_SUBST_TRACE([AS]) +m4trace:configure.ac:37: -1- m4_pattern_allow([^AS$]) +m4trace:configure.ac:37: -1- AC_SUBST([DLLTOOL]) +m4trace:configure.ac:37: -1- AC_SUBST_TRACE([DLLTOOL]) +m4trace:configure.ac:37: -1- m4_pattern_allow([^DLLTOOL$]) +m4trace:configure.ac:37: -1- AC_SUBST([OBJDUMP]) +m4trace:configure.ac:37: -1- AC_SUBST_TRACE([OBJDUMP]) +m4trace:configure.ac:37: -1- m4_pattern_allow([^OBJDUMP$]) +m4trace:configure.ac:37: -1- _m4_warn([obsolete], [AC_LIBTOOL_WIN32_DLL: Remove this warning and the call to _LT_SET_OPTION when you +put the 'win32-dll' option into LT_INIT's first parameter.], [./lib/autoconf/general.m4:2434: AC_DIAGNOSE is expanded from... +aclocal.m4:8510: AC_LIBTOOL_WIN32_DLL is expanded from... +configure.ac:37: the top level]) +m4trace:configure.ac:38: -1- AC_PROG_LIBTOOL +m4trace:configure.ac:38: -1- _m4_warn([obsolete], [The macro `AC_PROG_LIBTOOL' is obsolete. +You should run autoupdate.], [aclocal.m4:121: AC_PROG_LIBTOOL is expanded from... +configure.ac:38: the top level]) +m4trace:configure.ac:38: -1- LT_INIT +m4trace:configure.ac:38: -1- m4_pattern_forbid([^_?LT_[A-Z_]+$]) +m4trace:configure.ac:38: -1- m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$]) +m4trace:configure.ac:38: -1- AC_REQUIRE_AUX_FILE([ltmain.sh]) +m4trace:configure.ac:38: -1- AC_SUBST([LIBTOOL]) +m4trace:configure.ac:38: -1- AC_SUBST_TRACE([LIBTOOL]) +m4trace:configure.ac:38: -1- m4_pattern_allow([^LIBTOOL$]) +m4trace:configure.ac:38: -1- AC_SUBST([SED]) +m4trace:configure.ac:38: -1- AC_SUBST_TRACE([SED]) +m4trace:configure.ac:38: -1- m4_pattern_allow([^SED$]) +m4trace:configure.ac:38: -1- AC_SUBST([GREP]) +m4trace:configure.ac:38: -1- AC_SUBST_TRACE([GREP]) +m4trace:configure.ac:38: -1- m4_pattern_allow([^GREP$]) +m4trace:configure.ac:38: -1- AC_SUBST([EGREP]) +m4trace:configure.ac:38: -1- AC_SUBST_TRACE([EGREP]) +m4trace:configure.ac:38: -1- m4_pattern_allow([^EGREP$]) +m4trace:configure.ac:38: -1- AC_SUBST([FGREP]) +m4trace:configure.ac:38: -1- AC_SUBST_TRACE([FGREP]) +m4trace:configure.ac:38: -1- m4_pattern_allow([^FGREP$]) +m4trace:configure.ac:38: -1- AC_SUBST([GREP]) +m4trace:configure.ac:38: -1- AC_SUBST_TRACE([GREP]) +m4trace:configure.ac:38: -1- m4_pattern_allow([^GREP$]) +m4trace:configure.ac:38: -1- AC_SUBST([LD]) +m4trace:configure.ac:38: -1- AC_SUBST_TRACE([LD]) +m4trace:configure.ac:38: -1- m4_pattern_allow([^LD$]) +m4trace:configure.ac:38: -1- AC_SUBST([DUMPBIN]) +m4trace:configure.ac:38: -1- AC_SUBST_TRACE([DUMPBIN]) +m4trace:configure.ac:38: -1- m4_pattern_allow([^DUMPBIN$]) +m4trace:configure.ac:38: -1- AC_SUBST([ac_ct_DUMPBIN]) +m4trace:configure.ac:38: -1- AC_SUBST_TRACE([ac_ct_DUMPBIN]) +m4trace:configure.ac:38: -1- m4_pattern_allow([^ac_ct_DUMPBIN$]) +m4trace:configure.ac:38: -1- AC_SUBST([DUMPBIN]) +m4trace:configure.ac:38: -1- AC_SUBST_TRACE([DUMPBIN]) +m4trace:configure.ac:38: -1- m4_pattern_allow([^DUMPBIN$]) +m4trace:configure.ac:38: -1- AC_SUBST([NM]) +m4trace:configure.ac:38: -1- AC_SUBST_TRACE([NM]) +m4trace:configure.ac:38: -1- m4_pattern_allow([^NM$]) +m4trace:configure.ac:38: -1- AC_SUBST([LN_S], [$as_ln_s]) +m4trace:configure.ac:38: -1- AC_SUBST_TRACE([LN_S]) +m4trace:configure.ac:38: -1- m4_pattern_allow([^LN_S$]) +m4trace:configure.ac:38: -1- AC_SUBST([OBJDUMP]) +m4trace:configure.ac:38: -1- AC_SUBST_TRACE([OBJDUMP]) +m4trace:configure.ac:38: -1- m4_pattern_allow([^OBJDUMP$]) +m4trace:configure.ac:38: -1- AC_SUBST([OBJDUMP]) +m4trace:configure.ac:38: -1- AC_SUBST_TRACE([OBJDUMP]) +m4trace:configure.ac:38: -1- m4_pattern_allow([^OBJDUMP$]) +m4trace:configure.ac:38: -1- AC_SUBST([DLLTOOL]) +m4trace:configure.ac:38: -1- AC_SUBST_TRACE([DLLTOOL]) +m4trace:configure.ac:38: -1- m4_pattern_allow([^DLLTOOL$]) +m4trace:configure.ac:38: -1- AC_SUBST([DLLTOOL]) +m4trace:configure.ac:38: -1- AC_SUBST_TRACE([DLLTOOL]) +m4trace:configure.ac:38: -1- m4_pattern_allow([^DLLTOOL$]) +m4trace:configure.ac:38: -1- AC_SUBST([AR]) +m4trace:configure.ac:38: -1- AC_SUBST_TRACE([AR]) +m4trace:configure.ac:38: -1- m4_pattern_allow([^AR$]) +m4trace:configure.ac:38: -1- AC_SUBST([ac_ct_AR]) +m4trace:configure.ac:38: -1- AC_SUBST_TRACE([ac_ct_AR]) +m4trace:configure.ac:38: -1- m4_pattern_allow([^ac_ct_AR$]) +m4trace:configure.ac:38: -1- AC_SUBST([STRIP]) +m4trace:configure.ac:38: -1- AC_SUBST_TRACE([STRIP]) +m4trace:configure.ac:38: -1- m4_pattern_allow([^STRIP$]) +m4trace:configure.ac:38: -1- AC_SUBST([RANLIB]) +m4trace:configure.ac:38: -1- AC_SUBST_TRACE([RANLIB]) +m4trace:configure.ac:38: -1- m4_pattern_allow([^RANLIB$]) +m4trace:configure.ac:38: -1- m4_pattern_allow([LT_OBJDIR]) +m4trace:configure.ac:38: -1- AC_DEFINE_TRACE_LITERAL([LT_OBJDIR]) +m4trace:configure.ac:38: -1- m4_pattern_allow([^LT_OBJDIR$]) +m4trace:configure.ac:38: -1- AH_OUTPUT([LT_OBJDIR], [/* Define to the sub-directory where libtool stores uninstalled libraries. */ +@%:@undef LT_OBJDIR]) +m4trace:configure.ac:38: -1- LT_SUPPORTED_TAG([CC]) +m4trace:configure.ac:38: -1- AC_SUBST([MANIFEST_TOOL]) +m4trace:configure.ac:38: -1- AC_SUBST_TRACE([MANIFEST_TOOL]) +m4trace:configure.ac:38: -1- m4_pattern_allow([^MANIFEST_TOOL$]) +m4trace:configure.ac:38: -1- AC_SUBST([DSYMUTIL]) +m4trace:configure.ac:38: -1- AC_SUBST_TRACE([DSYMUTIL]) +m4trace:configure.ac:38: -1- m4_pattern_allow([^DSYMUTIL$]) +m4trace:configure.ac:38: -1- AC_SUBST([NMEDIT]) +m4trace:configure.ac:38: -1- AC_SUBST_TRACE([NMEDIT]) +m4trace:configure.ac:38: -1- m4_pattern_allow([^NMEDIT$]) +m4trace:configure.ac:38: -1- AC_SUBST([LIPO]) +m4trace:configure.ac:38: -1- AC_SUBST_TRACE([LIPO]) +m4trace:configure.ac:38: -1- m4_pattern_allow([^LIPO$]) +m4trace:configure.ac:38: -1- AC_SUBST([OTOOL]) +m4trace:configure.ac:38: -1- AC_SUBST_TRACE([OTOOL]) +m4trace:configure.ac:38: -1- m4_pattern_allow([^OTOOL$]) +m4trace:configure.ac:38: -1- AC_SUBST([OTOOL64]) +m4trace:configure.ac:38: -1- AC_SUBST_TRACE([OTOOL64]) +m4trace:configure.ac:38: -1- m4_pattern_allow([^OTOOL64$]) +m4trace:configure.ac:38: -1- AC_SUBST([LT_SYS_LIBRARY_PATH]) +m4trace:configure.ac:38: -1- AC_SUBST_TRACE([LT_SYS_LIBRARY_PATH]) +m4trace:configure.ac:38: -1- m4_pattern_allow([^LT_SYS_LIBRARY_PATH$]) +m4trace:configure.ac:38: -1- AH_OUTPUT([HAVE_DLFCN_H], [/* Define to 1 if you have the header file. */ +@%:@undef HAVE_DLFCN_H]) +m4trace:configure.ac:38: -1- AH_OUTPUT([HAVE_STDIO_H], [/* Define to 1 if you have the header file. */ +@%:@undef HAVE_STDIO_H]) +m4trace:configure.ac:38: -1- AH_OUTPUT([HAVE_STDLIB_H], [/* Define to 1 if you have the header file. */ +@%:@undef HAVE_STDLIB_H]) +m4trace:configure.ac:38: -1- AH_OUTPUT([HAVE_STRING_H], [/* Define to 1 if you have the header file. */ +@%:@undef HAVE_STRING_H]) +m4trace:configure.ac:38: -1- AH_OUTPUT([HAVE_INTTYPES_H], [/* Define to 1 if you have the header file. */ +@%:@undef HAVE_INTTYPES_H]) +m4trace:configure.ac:38: -1- AH_OUTPUT([HAVE_STDINT_H], [/* Define to 1 if you have the header file. */ +@%:@undef HAVE_STDINT_H]) +m4trace:configure.ac:38: -1- AH_OUTPUT([HAVE_STRINGS_H], [/* Define to 1 if you have the header file. */ +@%:@undef HAVE_STRINGS_H]) +m4trace:configure.ac:38: -1- AH_OUTPUT([HAVE_SYS_STAT_H], [/* Define to 1 if you have the header file. */ +@%:@undef HAVE_SYS_STAT_H]) +m4trace:configure.ac:38: -1- AH_OUTPUT([HAVE_SYS_TYPES_H], [/* Define to 1 if you have the header file. */ +@%:@undef HAVE_SYS_TYPES_H]) +m4trace:configure.ac:38: -1- AH_OUTPUT([HAVE_UNISTD_H], [/* Define to 1 if you have the header file. */ +@%:@undef HAVE_UNISTD_H]) +m4trace:configure.ac:38: -1- AC_DEFINE_TRACE_LITERAL([STDC_HEADERS]) +m4trace:configure.ac:38: -1- m4_pattern_allow([^STDC_HEADERS$]) +m4trace:configure.ac:38: -1- AH_OUTPUT([STDC_HEADERS], [/* Define to 1 if all of the C90 standard headers exist (not just the ones + required in a freestanding environment). This macro is provided for + backward compatibility; new code need not use it. */ +@%:@undef STDC_HEADERS]) +m4trace:configure.ac:38: -1- AC_DEFINE_TRACE_LITERAL([HAVE_DLFCN_H]) +m4trace:configure.ac:38: -1- m4_pattern_allow([^HAVE_DLFCN_H$]) +m4trace:configure.ac:38: -1- LT_SUPPORTED_TAG([CXX]) +m4trace:configure.ac:38: -1- AC_SUBST([CXXCPP]) +m4trace:configure.ac:38: -1- AC_SUBST_TRACE([CXXCPP]) +m4trace:configure.ac:38: -1- m4_pattern_allow([^CXXCPP$]) +m4trace:configure.ac:38: -1- AC_SUBST([CPPFLAGS]) +m4trace:configure.ac:38: -1- AC_SUBST_TRACE([CPPFLAGS]) +m4trace:configure.ac:38: -1- m4_pattern_allow([^CPPFLAGS$]) +m4trace:configure.ac:38: -1- AC_SUBST([CXXCPP]) +m4trace:configure.ac:38: -1- AC_SUBST_TRACE([CXXCPP]) +m4trace:configure.ac:38: -1- m4_pattern_allow([^CXXCPP$]) +m4trace:configure.ac:38: -1- AC_SUBST([LD]) +m4trace:configure.ac:38: -1- AC_SUBST_TRACE([LD]) +m4trace:configure.ac:38: -1- m4_pattern_allow([^LD$]) +m4trace:configure.ac:38: -1- AC_SUBST([LT_SYS_LIBRARY_PATH]) +m4trace:configure.ac:38: -1- AC_SUBST_TRACE([LT_SYS_LIBRARY_PATH]) +m4trace:configure.ac:38: -1- m4_pattern_allow([^LT_SYS_LIBRARY_PATH$]) +m4trace:configure.ac:41: -1- AC_SUBST([DEFAULT_INCLUDES]) +m4trace:configure.ac:41: -1- AC_SUBST_TRACE([DEFAULT_INCLUDES]) +m4trace:configure.ac:41: -1- m4_pattern_allow([^DEFAULT_INCLUDES$]) +m4trace:configure.ac:42: -1- AC_SUBST([PORTAUDIO_ROOT]) +m4trace:configure.ac:42: -1- AC_SUBST_TRACE([PORTAUDIO_ROOT]) +m4trace:configure.ac:42: -1- m4_pattern_allow([^PORTAUDIO_ROOT$]) +m4trace:configure.ac:43: -1- AC_SUBST([CXXFLAGS]) +m4trace:configure.ac:43: -1- AC_SUBST_TRACE([CXXFLAGS]) +m4trace:configure.ac:43: -1- m4_pattern_allow([^CXXFLAGS$]) +m4trace:configure.ac:44: -1- AC_SUBST([LT_VERSION_INFO]) +m4trace:configure.ac:44: -1- AC_SUBST_TRACE([LT_VERSION_INFO]) +m4trace:configure.ac:44: -1- m4_pattern_allow([^LT_VERSION_INFO$]) +m4trace:configure.ac:46: -1- AC_CONFIG_FILES([ + Makefile + lib/Makefile + include/Makefile + bin/Makefile + doc/Makefile + portaudiocpp.pc + ]) +m4trace:configure.ac:54: -1- AC_SUBST([LIB@&t@OBJS], [$ac_libobjs]) +m4trace:configure.ac:54: -1- AC_SUBST_TRACE([LIB@&t@OBJS]) +m4trace:configure.ac:54: -1- m4_pattern_allow([^LIB@&t@OBJS$]) +m4trace:configure.ac:54: -1- AC_SUBST([LTLIBOBJS], [$ac_ltlibobjs]) +m4trace:configure.ac:54: -1- AC_SUBST_TRACE([LTLIBOBJS]) +m4trace:configure.ac:54: -1- m4_pattern_allow([^LTLIBOBJS$]) +m4trace:configure.ac:54: -1- AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"]) +m4trace:configure.ac:54: -1- AC_SUBST([am__EXEEXT_TRUE]) +m4trace:configure.ac:54: -1- AC_SUBST_TRACE([am__EXEEXT_TRUE]) +m4trace:configure.ac:54: -1- m4_pattern_allow([^am__EXEEXT_TRUE$]) +m4trace:configure.ac:54: -1- AC_SUBST([am__EXEEXT_FALSE]) +m4trace:configure.ac:54: -1- AC_SUBST_TRACE([am__EXEEXT_FALSE]) +m4trace:configure.ac:54: -1- m4_pattern_allow([^am__EXEEXT_FALSE$]) +m4trace:configure.ac:54: -1- _AM_SUBST_NOTMAKE([am__EXEEXT_TRUE]) +m4trace:configure.ac:54: -1- _AM_SUBST_NOTMAKE([am__EXEEXT_FALSE]) +m4trace:configure.ac:54: -1- AC_SUBST_TRACE([top_builddir]) +m4trace:configure.ac:54: -1- AC_SUBST_TRACE([top_build_prefix]) +m4trace:configure.ac:54: -1- AC_SUBST_TRACE([srcdir]) +m4trace:configure.ac:54: -1- AC_SUBST_TRACE([abs_srcdir]) +m4trace:configure.ac:54: -1- AC_SUBST_TRACE([top_srcdir]) +m4trace:configure.ac:54: -1- AC_SUBST_TRACE([abs_top_srcdir]) +m4trace:configure.ac:54: -1- AC_SUBST_TRACE([builddir]) +m4trace:configure.ac:54: -1- AC_SUBST_TRACE([abs_builddir]) +m4trace:configure.ac:54: -1- AC_SUBST_TRACE([abs_top_builddir]) +m4trace:configure.ac:54: -1- AC_SUBST_TRACE([INSTALL]) +m4trace:configure.ac:54: -1- AC_SUBST_TRACE([MKDIR_P]) +m4trace:configure.ac:54: -1- AC_REQUIRE_AUX_FILE([ltmain.sh]) diff --git a/bindings/cpp/autom4te.cache/traces.2 b/bindings/cpp/autom4te.cache/traces.2 new file mode 100644 index 0000000..b8a0945 --- /dev/null +++ b/bindings/cpp/autom4te.cache/traces.2 @@ -0,0 +1,618 @@ +m4trace:aclocal.m4:9759: -1- AC_SUBST([am__quote]) +m4trace:aclocal.m4:9759: -1- AC_SUBST_TRACE([am__quote]) +m4trace:aclocal.m4:9759: -1- m4_pattern_allow([^am__quote$]) +m4trace:configure.ac:15: -1- AC_INIT([PortAudioCpp], [12]) +m4trace:configure.ac:15: -1- m4_pattern_forbid([^_?A[CHUM]_]) +m4trace:configure.ac:15: -1- m4_pattern_forbid([_AC_]) +m4trace:configure.ac:15: -1- m4_pattern_forbid([^LIBOBJS$], [do not use LIBOBJS directly, use AC_LIBOBJ (see section `AC_LIBOBJ vs LIBOBJS']) +m4trace:configure.ac:15: -1- m4_pattern_allow([^AS_FLAGS$]) +m4trace:configure.ac:15: -1- m4_pattern_forbid([^_?m4_]) +m4trace:configure.ac:15: -1- m4_pattern_forbid([^dnl$]) +m4trace:configure.ac:15: -1- m4_pattern_forbid([^_?AS_]) +m4trace:configure.ac:15: -1- AC_SUBST([SHELL]) +m4trace:configure.ac:15: -1- AC_SUBST_TRACE([SHELL]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^SHELL$]) +m4trace:configure.ac:15: -1- AC_SUBST([PATH_SEPARATOR]) +m4trace:configure.ac:15: -1- AC_SUBST_TRACE([PATH_SEPARATOR]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^PATH_SEPARATOR$]) +m4trace:configure.ac:15: -1- AC_SUBST([PACKAGE_NAME], [m4_ifdef([AC_PACKAGE_NAME], ['AC_PACKAGE_NAME'])]) +m4trace:configure.ac:15: -1- AC_SUBST_TRACE([PACKAGE_NAME]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^PACKAGE_NAME$]) +m4trace:configure.ac:15: -1- AC_SUBST([PACKAGE_TARNAME], [m4_ifdef([AC_PACKAGE_TARNAME], ['AC_PACKAGE_TARNAME'])]) +m4trace:configure.ac:15: -1- AC_SUBST_TRACE([PACKAGE_TARNAME]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^PACKAGE_TARNAME$]) +m4trace:configure.ac:15: -1- AC_SUBST([PACKAGE_VERSION], [m4_ifdef([AC_PACKAGE_VERSION], ['AC_PACKAGE_VERSION'])]) +m4trace:configure.ac:15: -1- AC_SUBST_TRACE([PACKAGE_VERSION]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^PACKAGE_VERSION$]) +m4trace:configure.ac:15: -1- AC_SUBST([PACKAGE_STRING], [m4_ifdef([AC_PACKAGE_STRING], ['AC_PACKAGE_STRING'])]) +m4trace:configure.ac:15: -1- AC_SUBST_TRACE([PACKAGE_STRING]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^PACKAGE_STRING$]) +m4trace:configure.ac:15: -1- AC_SUBST([PACKAGE_BUGREPORT], [m4_ifdef([AC_PACKAGE_BUGREPORT], ['AC_PACKAGE_BUGREPORT'])]) +m4trace:configure.ac:15: -1- AC_SUBST_TRACE([PACKAGE_BUGREPORT]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^PACKAGE_BUGREPORT$]) +m4trace:configure.ac:15: -1- AC_SUBST([PACKAGE_URL], [m4_ifdef([AC_PACKAGE_URL], ['AC_PACKAGE_URL'])]) +m4trace:configure.ac:15: -1- AC_SUBST_TRACE([PACKAGE_URL]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^PACKAGE_URL$]) +m4trace:configure.ac:15: -1- AC_SUBST([exec_prefix], [NONE]) +m4trace:configure.ac:15: -1- AC_SUBST_TRACE([exec_prefix]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^exec_prefix$]) +m4trace:configure.ac:15: -1- AC_SUBST([prefix], [NONE]) +m4trace:configure.ac:15: -1- AC_SUBST_TRACE([prefix]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^prefix$]) +m4trace:configure.ac:15: -1- AC_SUBST([program_transform_name], [s,x,x,]) +m4trace:configure.ac:15: -1- AC_SUBST_TRACE([program_transform_name]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^program_transform_name$]) +m4trace:configure.ac:15: -1- AC_SUBST([bindir], ['${exec_prefix}/bin']) +m4trace:configure.ac:15: -1- AC_SUBST_TRACE([bindir]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^bindir$]) +m4trace:configure.ac:15: -1- AC_SUBST([sbindir], ['${exec_prefix}/sbin']) +m4trace:configure.ac:15: -1- AC_SUBST_TRACE([sbindir]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^sbindir$]) +m4trace:configure.ac:15: -1- AC_SUBST([libexecdir], ['${exec_prefix}/libexec']) +m4trace:configure.ac:15: -1- AC_SUBST_TRACE([libexecdir]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^libexecdir$]) +m4trace:configure.ac:15: -1- AC_SUBST([datarootdir], ['${prefix}/share']) +m4trace:configure.ac:15: -1- AC_SUBST_TRACE([datarootdir]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^datarootdir$]) +m4trace:configure.ac:15: -1- AC_SUBST([datadir], ['${datarootdir}']) +m4trace:configure.ac:15: -1- AC_SUBST_TRACE([datadir]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^datadir$]) +m4trace:configure.ac:15: -1- AC_SUBST([sysconfdir], ['${prefix}/etc']) +m4trace:configure.ac:15: -1- AC_SUBST_TRACE([sysconfdir]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^sysconfdir$]) +m4trace:configure.ac:15: -1- AC_SUBST([sharedstatedir], ['${prefix}/com']) +m4trace:configure.ac:15: -1- AC_SUBST_TRACE([sharedstatedir]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^sharedstatedir$]) +m4trace:configure.ac:15: -1- AC_SUBST([localstatedir], ['${prefix}/var']) +m4trace:configure.ac:15: -1- AC_SUBST_TRACE([localstatedir]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^localstatedir$]) +m4trace:configure.ac:15: -1- AC_SUBST([runstatedir], ['${localstatedir}/run']) +m4trace:configure.ac:15: -1- AC_SUBST_TRACE([runstatedir]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^runstatedir$]) +m4trace:configure.ac:15: -1- AC_SUBST([includedir], ['${prefix}/include']) +m4trace:configure.ac:15: -1- AC_SUBST_TRACE([includedir]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^includedir$]) +m4trace:configure.ac:15: -1- AC_SUBST([oldincludedir], ['/usr/include']) +m4trace:configure.ac:15: -1- AC_SUBST_TRACE([oldincludedir]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^oldincludedir$]) +m4trace:configure.ac:15: -1- AC_SUBST([docdir], [m4_ifset([AC_PACKAGE_TARNAME], + ['${datarootdir}/doc/${PACKAGE_TARNAME}'], + ['${datarootdir}/doc/${PACKAGE}'])]) +m4trace:configure.ac:15: -1- AC_SUBST_TRACE([docdir]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^docdir$]) +m4trace:configure.ac:15: -1- AC_SUBST([infodir], ['${datarootdir}/info']) +m4trace:configure.ac:15: -1- AC_SUBST_TRACE([infodir]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^infodir$]) +m4trace:configure.ac:15: -1- AC_SUBST([htmldir], ['${docdir}']) +m4trace:configure.ac:15: -1- AC_SUBST_TRACE([htmldir]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^htmldir$]) +m4trace:configure.ac:15: -1- AC_SUBST([dvidir], ['${docdir}']) +m4trace:configure.ac:15: -1- AC_SUBST_TRACE([dvidir]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^dvidir$]) +m4trace:configure.ac:15: -1- AC_SUBST([pdfdir], ['${docdir}']) +m4trace:configure.ac:15: -1- AC_SUBST_TRACE([pdfdir]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^pdfdir$]) +m4trace:configure.ac:15: -1- AC_SUBST([psdir], ['${docdir}']) +m4trace:configure.ac:15: -1- AC_SUBST_TRACE([psdir]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^psdir$]) +m4trace:configure.ac:15: -1- AC_SUBST([libdir], ['${exec_prefix}/lib']) +m4trace:configure.ac:15: -1- AC_SUBST_TRACE([libdir]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^libdir$]) +m4trace:configure.ac:15: -1- AC_SUBST([localedir], ['${datarootdir}/locale']) +m4trace:configure.ac:15: -1- AC_SUBST_TRACE([localedir]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^localedir$]) +m4trace:configure.ac:15: -1- AC_SUBST([mandir], ['${datarootdir}/man']) +m4trace:configure.ac:15: -1- AC_SUBST_TRACE([mandir]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^mandir$]) +m4trace:configure.ac:15: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_NAME]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^PACKAGE_NAME$]) +m4trace:configure.ac:15: -1- AH_OUTPUT([PACKAGE_NAME], [/* Define to the full name of this package. */ +@%:@undef PACKAGE_NAME]) +m4trace:configure.ac:15: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_TARNAME]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^PACKAGE_TARNAME$]) +m4trace:configure.ac:15: -1- AH_OUTPUT([PACKAGE_TARNAME], [/* Define to the one symbol short name of this package. */ +@%:@undef PACKAGE_TARNAME]) +m4trace:configure.ac:15: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_VERSION]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^PACKAGE_VERSION$]) +m4trace:configure.ac:15: -1- AH_OUTPUT([PACKAGE_VERSION], [/* Define to the version of this package. */ +@%:@undef PACKAGE_VERSION]) +m4trace:configure.ac:15: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_STRING]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^PACKAGE_STRING$]) +m4trace:configure.ac:15: -1- AH_OUTPUT([PACKAGE_STRING], [/* Define to the full name and version of this package. */ +@%:@undef PACKAGE_STRING]) +m4trace:configure.ac:15: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_BUGREPORT]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^PACKAGE_BUGREPORT$]) +m4trace:configure.ac:15: -1- AH_OUTPUT([PACKAGE_BUGREPORT], [/* Define to the address where bug reports for this package should be sent. */ +@%:@undef PACKAGE_BUGREPORT]) +m4trace:configure.ac:15: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_URL]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^PACKAGE_URL$]) +m4trace:configure.ac:15: -1- AH_OUTPUT([PACKAGE_URL], [/* Define to the home page for this package. */ +@%:@undef PACKAGE_URL]) +m4trace:configure.ac:15: -1- AC_SUBST([DEFS]) +m4trace:configure.ac:15: -1- AC_SUBST_TRACE([DEFS]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^DEFS$]) +m4trace:configure.ac:15: -1- AC_SUBST([ECHO_C]) +m4trace:configure.ac:15: -1- AC_SUBST_TRACE([ECHO_C]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^ECHO_C$]) +m4trace:configure.ac:15: -1- AC_SUBST([ECHO_N]) +m4trace:configure.ac:15: -1- AC_SUBST_TRACE([ECHO_N]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^ECHO_N$]) +m4trace:configure.ac:15: -1- AC_SUBST([ECHO_T]) +m4trace:configure.ac:15: -1- AC_SUBST_TRACE([ECHO_T]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^ECHO_T$]) +m4trace:configure.ac:15: -1- AC_SUBST([LIBS]) +m4trace:configure.ac:15: -1- AC_SUBST_TRACE([LIBS]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^LIBS$]) +m4trace:configure.ac:15: -1- AC_SUBST([build_alias]) +m4trace:configure.ac:15: -1- AC_SUBST_TRACE([build_alias]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^build_alias$]) +m4trace:configure.ac:15: -1- AC_SUBST([host_alias]) +m4trace:configure.ac:15: -1- AC_SUBST_TRACE([host_alias]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^host_alias$]) +m4trace:configure.ac:15: -1- AC_SUBST([target_alias]) +m4trace:configure.ac:15: -1- AC_SUBST_TRACE([target_alias]) +m4trace:configure.ac:15: -1- m4_pattern_allow([^target_alias$]) +m4trace:configure.ac:17: -1- AM_INIT_AUTOMAKE +m4trace:configure.ac:17: -1- m4_pattern_allow([^AM_[A-Z]+FLAGS$]) +m4trace:configure.ac:17: -1- AM_AUTOMAKE_VERSION([1.16.5]) +m4trace:configure.ac:17: -1- AC_REQUIRE_AUX_FILE([install-sh]) +m4trace:configure.ac:17: -1- AC_SUBST([INSTALL_PROGRAM]) +m4trace:configure.ac:17: -1- AC_SUBST_TRACE([INSTALL_PROGRAM]) +m4trace:configure.ac:17: -1- m4_pattern_allow([^INSTALL_PROGRAM$]) +m4trace:configure.ac:17: -1- AC_SUBST([INSTALL_SCRIPT]) +m4trace:configure.ac:17: -1- AC_SUBST_TRACE([INSTALL_SCRIPT]) +m4trace:configure.ac:17: -1- m4_pattern_allow([^INSTALL_SCRIPT$]) +m4trace:configure.ac:17: -1- AC_SUBST([INSTALL_DATA]) +m4trace:configure.ac:17: -1- AC_SUBST_TRACE([INSTALL_DATA]) +m4trace:configure.ac:17: -1- m4_pattern_allow([^INSTALL_DATA$]) +m4trace:configure.ac:17: -1- AC_SUBST([am__isrc], [' -I$(srcdir)']) +m4trace:configure.ac:17: -1- AC_SUBST_TRACE([am__isrc]) +m4trace:configure.ac:17: -1- m4_pattern_allow([^am__isrc$]) +m4trace:configure.ac:17: -1- _AM_SUBST_NOTMAKE([am__isrc]) +m4trace:configure.ac:17: -1- AC_SUBST([CYGPATH_W]) +m4trace:configure.ac:17: -1- AC_SUBST_TRACE([CYGPATH_W]) +m4trace:configure.ac:17: -1- m4_pattern_allow([^CYGPATH_W$]) +m4trace:configure.ac:17: -1- AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME']) +m4trace:configure.ac:17: -1- AC_SUBST_TRACE([PACKAGE]) +m4trace:configure.ac:17: -1- m4_pattern_allow([^PACKAGE$]) +m4trace:configure.ac:17: -1- AC_SUBST([VERSION], ['AC_PACKAGE_VERSION']) +m4trace:configure.ac:17: -1- AC_SUBST_TRACE([VERSION]) +m4trace:configure.ac:17: -1- m4_pattern_allow([^VERSION$]) +m4trace:configure.ac:17: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE]) +m4trace:configure.ac:17: -1- m4_pattern_allow([^PACKAGE$]) +m4trace:configure.ac:17: -1- AH_OUTPUT([PACKAGE], [/* Name of package */ +@%:@undef PACKAGE]) +m4trace:configure.ac:17: -1- AC_DEFINE_TRACE_LITERAL([VERSION]) +m4trace:configure.ac:17: -1- m4_pattern_allow([^VERSION$]) +m4trace:configure.ac:17: -1- AH_OUTPUT([VERSION], [/* Version number of package */ +@%:@undef VERSION]) +m4trace:configure.ac:17: -1- AC_REQUIRE_AUX_FILE([missing]) +m4trace:configure.ac:17: -1- AC_SUBST([ACLOCAL]) +m4trace:configure.ac:17: -1- AC_SUBST_TRACE([ACLOCAL]) +m4trace:configure.ac:17: -1- m4_pattern_allow([^ACLOCAL$]) +m4trace:configure.ac:17: -1- AC_SUBST([AUTOCONF]) +m4trace:configure.ac:17: -1- AC_SUBST_TRACE([AUTOCONF]) +m4trace:configure.ac:17: -1- m4_pattern_allow([^AUTOCONF$]) +m4trace:configure.ac:17: -1- AC_SUBST([AUTOMAKE]) +m4trace:configure.ac:17: -1- AC_SUBST_TRACE([AUTOMAKE]) +m4trace:configure.ac:17: -1- m4_pattern_allow([^AUTOMAKE$]) +m4trace:configure.ac:17: -1- AC_SUBST([AUTOHEADER]) +m4trace:configure.ac:17: -1- AC_SUBST_TRACE([AUTOHEADER]) +m4trace:configure.ac:17: -1- m4_pattern_allow([^AUTOHEADER$]) +m4trace:configure.ac:17: -1- AC_SUBST([MAKEINFO]) +m4trace:configure.ac:17: -1- AC_SUBST_TRACE([MAKEINFO]) +m4trace:configure.ac:17: -1- m4_pattern_allow([^MAKEINFO$]) +m4trace:configure.ac:17: -1- AC_SUBST([install_sh]) +m4trace:configure.ac:17: -1- AC_SUBST_TRACE([install_sh]) +m4trace:configure.ac:17: -1- m4_pattern_allow([^install_sh$]) +m4trace:configure.ac:17: -1- AC_SUBST([STRIP]) +m4trace:configure.ac:17: -1- AC_SUBST_TRACE([STRIP]) +m4trace:configure.ac:17: -1- m4_pattern_allow([^STRIP$]) +m4trace:configure.ac:17: -1- AC_SUBST([INSTALL_STRIP_PROGRAM]) +m4trace:configure.ac:17: -1- AC_SUBST_TRACE([INSTALL_STRIP_PROGRAM]) +m4trace:configure.ac:17: -1- m4_pattern_allow([^INSTALL_STRIP_PROGRAM$]) +m4trace:configure.ac:17: -1- AC_REQUIRE_AUX_FILE([install-sh]) +m4trace:configure.ac:17: -1- AC_SUBST([MKDIR_P]) +m4trace:configure.ac:17: -1- AC_SUBST_TRACE([MKDIR_P]) +m4trace:configure.ac:17: -1- m4_pattern_allow([^MKDIR_P$]) +m4trace:configure.ac:17: -1- AC_SUBST([mkdir_p], ['$(MKDIR_P)']) +m4trace:configure.ac:17: -1- AC_SUBST_TRACE([mkdir_p]) +m4trace:configure.ac:17: -1- m4_pattern_allow([^mkdir_p$]) +m4trace:configure.ac:17: -1- AC_SUBST([AWK]) +m4trace:configure.ac:17: -1- AC_SUBST_TRACE([AWK]) +m4trace:configure.ac:17: -1- m4_pattern_allow([^AWK$]) +m4trace:configure.ac:17: -1- AC_SUBST([SET_MAKE]) +m4trace:configure.ac:17: -1- AC_SUBST_TRACE([SET_MAKE]) +m4trace:configure.ac:17: -1- m4_pattern_allow([^SET_MAKE$]) +m4trace:configure.ac:17: -1- AC_SUBST([am__leading_dot]) +m4trace:configure.ac:17: -1- AC_SUBST_TRACE([am__leading_dot]) +m4trace:configure.ac:17: -1- m4_pattern_allow([^am__leading_dot$]) +m4trace:configure.ac:17: -1- AC_SUBST([AMTAR], ['$${TAR-tar}']) +m4trace:configure.ac:17: -1- AC_SUBST_TRACE([AMTAR]) +m4trace:configure.ac:17: -1- m4_pattern_allow([^AMTAR$]) +m4trace:configure.ac:17: -1- AC_SUBST([am__tar]) +m4trace:configure.ac:17: -1- AC_SUBST_TRACE([am__tar]) +m4trace:configure.ac:17: -1- m4_pattern_allow([^am__tar$]) +m4trace:configure.ac:17: -1- AC_SUBST([am__untar]) +m4trace:configure.ac:17: -1- AC_SUBST_TRACE([am__untar]) +m4trace:configure.ac:17: -1- m4_pattern_allow([^am__untar$]) +m4trace:configure.ac:17: -1- AC_SUBST([CTAGS]) +m4trace:configure.ac:17: -1- AC_SUBST_TRACE([CTAGS]) +m4trace:configure.ac:17: -1- m4_pattern_allow([^CTAGS$]) +m4trace:configure.ac:17: -1- AC_SUBST([ETAGS]) +m4trace:configure.ac:17: -1- AC_SUBST_TRACE([ETAGS]) +m4trace:configure.ac:17: -1- m4_pattern_allow([^ETAGS$]) +m4trace:configure.ac:17: -1- AC_SUBST([CSCOPE]) +m4trace:configure.ac:17: -1- AC_SUBST_TRACE([CSCOPE]) +m4trace:configure.ac:17: -1- m4_pattern_allow([^CSCOPE$]) +m4trace:configure.ac:17: -1- AM_SILENT_RULES +m4trace:configure.ac:17: -1- AC_SUBST([AM_V]) +m4trace:configure.ac:17: -1- AC_SUBST_TRACE([AM_V]) +m4trace:configure.ac:17: -1- m4_pattern_allow([^AM_V$]) +m4trace:configure.ac:17: -1- _AM_SUBST_NOTMAKE([AM_V]) +m4trace:configure.ac:17: -1- AC_SUBST([AM_DEFAULT_V]) +m4trace:configure.ac:17: -1- AC_SUBST_TRACE([AM_DEFAULT_V]) +m4trace:configure.ac:17: -1- m4_pattern_allow([^AM_DEFAULT_V$]) +m4trace:configure.ac:17: -1- _AM_SUBST_NOTMAKE([AM_DEFAULT_V]) +m4trace:configure.ac:17: -1- AC_SUBST([AM_DEFAULT_VERBOSITY]) +m4trace:configure.ac:17: -1- AC_SUBST_TRACE([AM_DEFAULT_VERBOSITY]) +m4trace:configure.ac:17: -1- m4_pattern_allow([^AM_DEFAULT_VERBOSITY$]) +m4trace:configure.ac:17: -1- AC_SUBST([AM_BACKSLASH]) +m4trace:configure.ac:17: -1- AC_SUBST_TRACE([AM_BACKSLASH]) +m4trace:configure.ac:17: -1- m4_pattern_allow([^AM_BACKSLASH$]) +m4trace:configure.ac:17: -1- _AM_SUBST_NOTMAKE([AM_BACKSLASH]) +m4trace:configure.ac:18: -1- AM_MAINTAINER_MODE +m4trace:configure.ac:18: -1- AM_CONDITIONAL([MAINTAINER_MODE], [test $USE_MAINTAINER_MODE = yes]) +m4trace:configure.ac:18: -1- AC_SUBST([MAINTAINER_MODE_TRUE]) +m4trace:configure.ac:18: -1- AC_SUBST_TRACE([MAINTAINER_MODE_TRUE]) +m4trace:configure.ac:18: -1- m4_pattern_allow([^MAINTAINER_MODE_TRUE$]) +m4trace:configure.ac:18: -1- AC_SUBST([MAINTAINER_MODE_FALSE]) +m4trace:configure.ac:18: -1- AC_SUBST_TRACE([MAINTAINER_MODE_FALSE]) +m4trace:configure.ac:18: -1- m4_pattern_allow([^MAINTAINER_MODE_FALSE$]) +m4trace:configure.ac:18: -1- _AM_SUBST_NOTMAKE([MAINTAINER_MODE_TRUE]) +m4trace:configure.ac:18: -1- _AM_SUBST_NOTMAKE([MAINTAINER_MODE_FALSE]) +m4trace:configure.ac:18: -1- AC_SUBST([MAINT]) +m4trace:configure.ac:18: -1- AC_SUBST_TRACE([MAINT]) +m4trace:configure.ac:18: -1- m4_pattern_allow([^MAINT$]) +m4trace:configure.ac:35: -1- AC_SUBST([CC]) +m4trace:configure.ac:35: -1- AC_SUBST_TRACE([CC]) +m4trace:configure.ac:35: -1- m4_pattern_allow([^CC$]) +m4trace:configure.ac:35: -1- AC_SUBST([CFLAGS]) +m4trace:configure.ac:35: -1- AC_SUBST_TRACE([CFLAGS]) +m4trace:configure.ac:35: -1- m4_pattern_allow([^CFLAGS$]) +m4trace:configure.ac:35: -1- AC_SUBST([LDFLAGS]) +m4trace:configure.ac:35: -1- AC_SUBST_TRACE([LDFLAGS]) +m4trace:configure.ac:35: -1- m4_pattern_allow([^LDFLAGS$]) +m4trace:configure.ac:35: -1- AC_SUBST([LIBS]) +m4trace:configure.ac:35: -1- AC_SUBST_TRACE([LIBS]) +m4trace:configure.ac:35: -1- m4_pattern_allow([^LIBS$]) +m4trace:configure.ac:35: -1- AC_SUBST([CPPFLAGS]) +m4trace:configure.ac:35: -1- AC_SUBST_TRACE([CPPFLAGS]) +m4trace:configure.ac:35: -1- m4_pattern_allow([^CPPFLAGS$]) +m4trace:configure.ac:35: -1- AC_SUBST([CC]) +m4trace:configure.ac:35: -1- AC_SUBST_TRACE([CC]) +m4trace:configure.ac:35: -1- m4_pattern_allow([^CC$]) +m4trace:configure.ac:35: -1- AC_SUBST([CC]) +m4trace:configure.ac:35: -1- AC_SUBST_TRACE([CC]) +m4trace:configure.ac:35: -1- m4_pattern_allow([^CC$]) +m4trace:configure.ac:35: -1- AC_SUBST([CC]) +m4trace:configure.ac:35: -1- AC_SUBST_TRACE([CC]) +m4trace:configure.ac:35: -1- m4_pattern_allow([^CC$]) +m4trace:configure.ac:35: -1- AC_SUBST([CC]) +m4trace:configure.ac:35: -1- AC_SUBST_TRACE([CC]) +m4trace:configure.ac:35: -1- m4_pattern_allow([^CC$]) +m4trace:configure.ac:35: -1- AC_SUBST([ac_ct_CC]) +m4trace:configure.ac:35: -1- AC_SUBST_TRACE([ac_ct_CC]) +m4trace:configure.ac:35: -1- m4_pattern_allow([^ac_ct_CC$]) +m4trace:configure.ac:35: -1- AC_SUBST([CC]) +m4trace:configure.ac:35: -1- AC_SUBST_TRACE([CC]) +m4trace:configure.ac:35: -1- m4_pattern_allow([^CC$]) +m4trace:configure.ac:35: -1- AC_SUBST([EXEEXT], [$ac_cv_exeext]) +m4trace:configure.ac:35: -1- AC_SUBST_TRACE([EXEEXT]) +m4trace:configure.ac:35: -1- m4_pattern_allow([^EXEEXT$]) +m4trace:configure.ac:35: -1- AC_SUBST([OBJEXT], [$ac_cv_objext]) +m4trace:configure.ac:35: -1- AC_SUBST_TRACE([OBJEXT]) +m4trace:configure.ac:35: -1- m4_pattern_allow([^OBJEXT$]) +m4trace:configure.ac:35: -1- AC_REQUIRE_AUX_FILE([compile]) +m4trace:configure.ac:35: -1- AC_SUBST([DEPDIR], ["${am__leading_dot}deps"]) +m4trace:configure.ac:35: -1- AC_SUBST_TRACE([DEPDIR]) +m4trace:configure.ac:35: -1- m4_pattern_allow([^DEPDIR$]) +m4trace:configure.ac:35: -1- AC_SUBST([am__include]) +m4trace:configure.ac:35: -1- AC_SUBST_TRACE([am__include]) +m4trace:configure.ac:35: -1- m4_pattern_allow([^am__include$]) +m4trace:configure.ac:35: -1- AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) +m4trace:configure.ac:35: -1- AC_SUBST([AMDEP_TRUE]) +m4trace:configure.ac:35: -1- AC_SUBST_TRACE([AMDEP_TRUE]) +m4trace:configure.ac:35: -1- m4_pattern_allow([^AMDEP_TRUE$]) +m4trace:configure.ac:35: -1- AC_SUBST([AMDEP_FALSE]) +m4trace:configure.ac:35: -1- AC_SUBST_TRACE([AMDEP_FALSE]) +m4trace:configure.ac:35: -1- m4_pattern_allow([^AMDEP_FALSE$]) +m4trace:configure.ac:35: -1- _AM_SUBST_NOTMAKE([AMDEP_TRUE]) +m4trace:configure.ac:35: -1- _AM_SUBST_NOTMAKE([AMDEP_FALSE]) +m4trace:configure.ac:35: -1- AC_SUBST([AMDEPBACKSLASH]) +m4trace:configure.ac:35: -1- AC_SUBST_TRACE([AMDEPBACKSLASH]) +m4trace:configure.ac:35: -1- m4_pattern_allow([^AMDEPBACKSLASH$]) +m4trace:configure.ac:35: -1- _AM_SUBST_NOTMAKE([AMDEPBACKSLASH]) +m4trace:configure.ac:35: -1- AC_SUBST([am__nodep]) +m4trace:configure.ac:35: -1- AC_SUBST_TRACE([am__nodep]) +m4trace:configure.ac:35: -1- m4_pattern_allow([^am__nodep$]) +m4trace:configure.ac:35: -1- _AM_SUBST_NOTMAKE([am__nodep]) +m4trace:configure.ac:35: -1- AC_SUBST([CCDEPMODE], [depmode=$am_cv_CC_dependencies_compiler_type]) +m4trace:configure.ac:35: -1- AC_SUBST_TRACE([CCDEPMODE]) +m4trace:configure.ac:35: -1- m4_pattern_allow([^CCDEPMODE$]) +m4trace:configure.ac:35: -1- AM_CONDITIONAL([am__fastdepCC], [ + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CC_dependencies_compiler_type" = gcc3]) +m4trace:configure.ac:35: -1- AC_SUBST([am__fastdepCC_TRUE]) +m4trace:configure.ac:35: -1- AC_SUBST_TRACE([am__fastdepCC_TRUE]) +m4trace:configure.ac:35: -1- m4_pattern_allow([^am__fastdepCC_TRUE$]) +m4trace:configure.ac:35: -1- AC_SUBST([am__fastdepCC_FALSE]) +m4trace:configure.ac:35: -1- AC_SUBST_TRACE([am__fastdepCC_FALSE]) +m4trace:configure.ac:35: -1- m4_pattern_allow([^am__fastdepCC_FALSE$]) +m4trace:configure.ac:35: -1- _AM_SUBST_NOTMAKE([am__fastdepCC_TRUE]) +m4trace:configure.ac:35: -1- _AM_SUBST_NOTMAKE([am__fastdepCC_FALSE]) +m4trace:configure.ac:36: -1- AC_SUBST([CXX]) +m4trace:configure.ac:36: -1- AC_SUBST_TRACE([CXX]) +m4trace:configure.ac:36: -1- m4_pattern_allow([^CXX$]) +m4trace:configure.ac:36: -1- AC_SUBST([CXXFLAGS]) +m4trace:configure.ac:36: -1- AC_SUBST_TRACE([CXXFLAGS]) +m4trace:configure.ac:36: -1- m4_pattern_allow([^CXXFLAGS$]) +m4trace:configure.ac:36: -1- AC_SUBST([LDFLAGS]) +m4trace:configure.ac:36: -1- AC_SUBST_TRACE([LDFLAGS]) +m4trace:configure.ac:36: -1- m4_pattern_allow([^LDFLAGS$]) +m4trace:configure.ac:36: -1- AC_SUBST([LIBS]) +m4trace:configure.ac:36: -1- AC_SUBST_TRACE([LIBS]) +m4trace:configure.ac:36: -1- m4_pattern_allow([^LIBS$]) +m4trace:configure.ac:36: -1- AC_SUBST([CPPFLAGS]) +m4trace:configure.ac:36: -1- AC_SUBST_TRACE([CPPFLAGS]) +m4trace:configure.ac:36: -1- m4_pattern_allow([^CPPFLAGS$]) +m4trace:configure.ac:36: -1- AC_SUBST([CXX]) +m4trace:configure.ac:36: -1- AC_SUBST_TRACE([CXX]) +m4trace:configure.ac:36: -1- m4_pattern_allow([^CXX$]) +m4trace:configure.ac:36: -1- AC_SUBST([ac_ct_CXX]) +m4trace:configure.ac:36: -1- AC_SUBST_TRACE([ac_ct_CXX]) +m4trace:configure.ac:36: -1- m4_pattern_allow([^ac_ct_CXX$]) +m4trace:configure.ac:36: -1- AC_SUBST([CXXDEPMODE], [depmode=$am_cv_CXX_dependencies_compiler_type]) +m4trace:configure.ac:36: -1- AC_SUBST_TRACE([CXXDEPMODE]) +m4trace:configure.ac:36: -1- m4_pattern_allow([^CXXDEPMODE$]) +m4trace:configure.ac:36: -1- AM_CONDITIONAL([am__fastdepCXX], [ + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CXX_dependencies_compiler_type" = gcc3]) +m4trace:configure.ac:36: -1- AC_SUBST([am__fastdepCXX_TRUE]) +m4trace:configure.ac:36: -1- AC_SUBST_TRACE([am__fastdepCXX_TRUE]) +m4trace:configure.ac:36: -1- m4_pattern_allow([^am__fastdepCXX_TRUE$]) +m4trace:configure.ac:36: -1- AC_SUBST([am__fastdepCXX_FALSE]) +m4trace:configure.ac:36: -1- AC_SUBST_TRACE([am__fastdepCXX_FALSE]) +m4trace:configure.ac:36: -1- m4_pattern_allow([^am__fastdepCXX_FALSE$]) +m4trace:configure.ac:36: -1- _AM_SUBST_NOTMAKE([am__fastdepCXX_TRUE]) +m4trace:configure.ac:36: -1- _AM_SUBST_NOTMAKE([am__fastdepCXX_FALSE]) +m4trace:configure.ac:37: -1- _m4_warn([obsolete], [The macro `AC_LIBTOOL_WIN32_DLL' is obsolete. +You should run autoupdate.], [aclocal.m4:8510: AC_LIBTOOL_WIN32_DLL is expanded from... +configure.ac:37: the top level]) +m4trace:configure.ac:37: -1- AC_CANONICAL_HOST +m4trace:configure.ac:37: -1- AC_CANONICAL_BUILD +m4trace:configure.ac:37: -1- AC_REQUIRE_AUX_FILE([config.sub]) +m4trace:configure.ac:37: -1- AC_REQUIRE_AUX_FILE([config.guess]) +m4trace:configure.ac:37: -1- AC_SUBST([build], [$ac_cv_build]) +m4trace:configure.ac:37: -1- AC_SUBST_TRACE([build]) +m4trace:configure.ac:37: -1- m4_pattern_allow([^build$]) +m4trace:configure.ac:37: -1- AC_SUBST([build_cpu], [$[1]]) +m4trace:configure.ac:37: -1- AC_SUBST_TRACE([build_cpu]) +m4trace:configure.ac:37: -1- m4_pattern_allow([^build_cpu$]) +m4trace:configure.ac:37: -1- AC_SUBST([build_vendor], [$[2]]) +m4trace:configure.ac:37: -1- AC_SUBST_TRACE([build_vendor]) +m4trace:configure.ac:37: -1- m4_pattern_allow([^build_vendor$]) +m4trace:configure.ac:37: -1- AC_SUBST([build_os]) +m4trace:configure.ac:37: -1- AC_SUBST_TRACE([build_os]) +m4trace:configure.ac:37: -1- m4_pattern_allow([^build_os$]) +m4trace:configure.ac:37: -1- AC_SUBST([host], [$ac_cv_host]) +m4trace:configure.ac:37: -1- AC_SUBST_TRACE([host]) +m4trace:configure.ac:37: -1- m4_pattern_allow([^host$]) +m4trace:configure.ac:37: -1- AC_SUBST([host_cpu], [$[1]]) +m4trace:configure.ac:37: -1- AC_SUBST_TRACE([host_cpu]) +m4trace:configure.ac:37: -1- m4_pattern_allow([^host_cpu$]) +m4trace:configure.ac:37: -1- AC_SUBST([host_vendor], [$[2]]) +m4trace:configure.ac:37: -1- AC_SUBST_TRACE([host_vendor]) +m4trace:configure.ac:37: -1- m4_pattern_allow([^host_vendor$]) +m4trace:configure.ac:37: -1- AC_SUBST([host_os]) +m4trace:configure.ac:37: -1- AC_SUBST_TRACE([host_os]) +m4trace:configure.ac:37: -1- m4_pattern_allow([^host_os$]) +m4trace:configure.ac:37: -1- AC_SUBST([AS]) +m4trace:configure.ac:37: -1- AC_SUBST_TRACE([AS]) +m4trace:configure.ac:37: -1- m4_pattern_allow([^AS$]) +m4trace:configure.ac:37: -1- AC_SUBST([DLLTOOL]) +m4trace:configure.ac:37: -1- AC_SUBST_TRACE([DLLTOOL]) +m4trace:configure.ac:37: -1- m4_pattern_allow([^DLLTOOL$]) +m4trace:configure.ac:37: -1- AC_SUBST([OBJDUMP]) +m4trace:configure.ac:37: -1- AC_SUBST_TRACE([OBJDUMP]) +m4trace:configure.ac:37: -1- m4_pattern_allow([^OBJDUMP$]) +m4trace:configure.ac:37: -1- _m4_warn([obsolete], [AC_LIBTOOL_WIN32_DLL: Remove this warning and the call to _LT_SET_OPTION when you +put the 'win32-dll' option into LT_INIT's first parameter.], [./lib/autoconf/general.m4:2434: AC_DIAGNOSE is expanded from... +aclocal.m4:8510: AC_LIBTOOL_WIN32_DLL is expanded from... +configure.ac:37: the top level]) +m4trace:configure.ac:38: -1- AC_PROG_LIBTOOL +m4trace:configure.ac:38: -1- _m4_warn([obsolete], [The macro `AC_PROG_LIBTOOL' is obsolete. +You should run autoupdate.], [aclocal.m4:121: AC_PROG_LIBTOOL is expanded from... +configure.ac:38: the top level]) +m4trace:configure.ac:38: -1- LT_INIT +m4trace:configure.ac:38: -1- m4_pattern_forbid([^_?LT_[A-Z_]+$]) +m4trace:configure.ac:38: -1- m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$]) +m4trace:configure.ac:38: -1- AC_REQUIRE_AUX_FILE([ltmain.sh]) +m4trace:configure.ac:38: -1- AC_SUBST([LIBTOOL]) +m4trace:configure.ac:38: -1- AC_SUBST_TRACE([LIBTOOL]) +m4trace:configure.ac:38: -1- m4_pattern_allow([^LIBTOOL$]) +m4trace:configure.ac:38: -1- AC_SUBST([SED]) +m4trace:configure.ac:38: -1- AC_SUBST_TRACE([SED]) +m4trace:configure.ac:38: -1- m4_pattern_allow([^SED$]) +m4trace:configure.ac:38: -1- AC_SUBST([GREP]) +m4trace:configure.ac:38: -1- AC_SUBST_TRACE([GREP]) +m4trace:configure.ac:38: -1- m4_pattern_allow([^GREP$]) +m4trace:configure.ac:38: -1- AC_SUBST([EGREP]) +m4trace:configure.ac:38: -1- AC_SUBST_TRACE([EGREP]) +m4trace:configure.ac:38: -1- m4_pattern_allow([^EGREP$]) +m4trace:configure.ac:38: -1- AC_SUBST([FGREP]) +m4trace:configure.ac:38: -1- AC_SUBST_TRACE([FGREP]) +m4trace:configure.ac:38: -1- m4_pattern_allow([^FGREP$]) +m4trace:configure.ac:38: -1- AC_SUBST([GREP]) +m4trace:configure.ac:38: -1- AC_SUBST_TRACE([GREP]) +m4trace:configure.ac:38: -1- m4_pattern_allow([^GREP$]) +m4trace:configure.ac:38: -1- AC_SUBST([LD]) +m4trace:configure.ac:38: -1- AC_SUBST_TRACE([LD]) +m4trace:configure.ac:38: -1- m4_pattern_allow([^LD$]) +m4trace:configure.ac:38: -1- AC_SUBST([DUMPBIN]) +m4trace:configure.ac:38: -1- AC_SUBST_TRACE([DUMPBIN]) +m4trace:configure.ac:38: -1- m4_pattern_allow([^DUMPBIN$]) +m4trace:configure.ac:38: -1- AC_SUBST([ac_ct_DUMPBIN]) +m4trace:configure.ac:38: -1- AC_SUBST_TRACE([ac_ct_DUMPBIN]) +m4trace:configure.ac:38: -1- m4_pattern_allow([^ac_ct_DUMPBIN$]) +m4trace:configure.ac:38: -1- AC_SUBST([DUMPBIN]) +m4trace:configure.ac:38: -1- AC_SUBST_TRACE([DUMPBIN]) +m4trace:configure.ac:38: -1- m4_pattern_allow([^DUMPBIN$]) +m4trace:configure.ac:38: -1- AC_SUBST([NM]) +m4trace:configure.ac:38: -1- AC_SUBST_TRACE([NM]) +m4trace:configure.ac:38: -1- m4_pattern_allow([^NM$]) +m4trace:configure.ac:38: -1- AC_SUBST([LN_S], [$as_ln_s]) +m4trace:configure.ac:38: -1- AC_SUBST_TRACE([LN_S]) +m4trace:configure.ac:38: -1- m4_pattern_allow([^LN_S$]) +m4trace:configure.ac:38: -1- AC_SUBST([OBJDUMP]) +m4trace:configure.ac:38: -1- AC_SUBST_TRACE([OBJDUMP]) +m4trace:configure.ac:38: -1- m4_pattern_allow([^OBJDUMP$]) +m4trace:configure.ac:38: -1- AC_SUBST([OBJDUMP]) +m4trace:configure.ac:38: -1- AC_SUBST_TRACE([OBJDUMP]) +m4trace:configure.ac:38: -1- m4_pattern_allow([^OBJDUMP$]) +m4trace:configure.ac:38: -1- AC_SUBST([DLLTOOL]) +m4trace:configure.ac:38: -1- AC_SUBST_TRACE([DLLTOOL]) +m4trace:configure.ac:38: -1- m4_pattern_allow([^DLLTOOL$]) +m4trace:configure.ac:38: -1- AC_SUBST([DLLTOOL]) +m4trace:configure.ac:38: -1- AC_SUBST_TRACE([DLLTOOL]) +m4trace:configure.ac:38: -1- m4_pattern_allow([^DLLTOOL$]) +m4trace:configure.ac:38: -1- AC_SUBST([AR]) +m4trace:configure.ac:38: -1- AC_SUBST_TRACE([AR]) +m4trace:configure.ac:38: -1- m4_pattern_allow([^AR$]) +m4trace:configure.ac:38: -1- AC_SUBST([ac_ct_AR]) +m4trace:configure.ac:38: -1- AC_SUBST_TRACE([ac_ct_AR]) +m4trace:configure.ac:38: -1- m4_pattern_allow([^ac_ct_AR$]) +m4trace:configure.ac:38: -1- AC_SUBST([STRIP]) +m4trace:configure.ac:38: -1- AC_SUBST_TRACE([STRIP]) +m4trace:configure.ac:38: -1- m4_pattern_allow([^STRIP$]) +m4trace:configure.ac:38: -1- AC_SUBST([RANLIB]) +m4trace:configure.ac:38: -1- AC_SUBST_TRACE([RANLIB]) +m4trace:configure.ac:38: -1- m4_pattern_allow([^RANLIB$]) +m4trace:configure.ac:38: -1- m4_pattern_allow([LT_OBJDIR]) +m4trace:configure.ac:38: -1- AC_DEFINE_TRACE_LITERAL([LT_OBJDIR]) +m4trace:configure.ac:38: -1- m4_pattern_allow([^LT_OBJDIR$]) +m4trace:configure.ac:38: -1- AH_OUTPUT([LT_OBJDIR], [/* Define to the sub-directory where libtool stores uninstalled libraries. */ +@%:@undef LT_OBJDIR]) +m4trace:configure.ac:38: -1- LT_SUPPORTED_TAG([CC]) +m4trace:configure.ac:38: -1- AC_SUBST([MANIFEST_TOOL]) +m4trace:configure.ac:38: -1- AC_SUBST_TRACE([MANIFEST_TOOL]) +m4trace:configure.ac:38: -1- m4_pattern_allow([^MANIFEST_TOOL$]) +m4trace:configure.ac:38: -1- AC_SUBST([DSYMUTIL]) +m4trace:configure.ac:38: -1- AC_SUBST_TRACE([DSYMUTIL]) +m4trace:configure.ac:38: -1- m4_pattern_allow([^DSYMUTIL$]) +m4trace:configure.ac:38: -1- AC_SUBST([NMEDIT]) +m4trace:configure.ac:38: -1- AC_SUBST_TRACE([NMEDIT]) +m4trace:configure.ac:38: -1- m4_pattern_allow([^NMEDIT$]) +m4trace:configure.ac:38: -1- AC_SUBST([LIPO]) +m4trace:configure.ac:38: -1- AC_SUBST_TRACE([LIPO]) +m4trace:configure.ac:38: -1- m4_pattern_allow([^LIPO$]) +m4trace:configure.ac:38: -1- AC_SUBST([OTOOL]) +m4trace:configure.ac:38: -1- AC_SUBST_TRACE([OTOOL]) +m4trace:configure.ac:38: -1- m4_pattern_allow([^OTOOL$]) +m4trace:configure.ac:38: -1- AC_SUBST([OTOOL64]) +m4trace:configure.ac:38: -1- AC_SUBST_TRACE([OTOOL64]) +m4trace:configure.ac:38: -1- m4_pattern_allow([^OTOOL64$]) +m4trace:configure.ac:38: -1- AC_SUBST([LT_SYS_LIBRARY_PATH]) +m4trace:configure.ac:38: -1- AC_SUBST_TRACE([LT_SYS_LIBRARY_PATH]) +m4trace:configure.ac:38: -1- m4_pattern_allow([^LT_SYS_LIBRARY_PATH$]) +m4trace:configure.ac:38: -1- AH_OUTPUT([HAVE_DLFCN_H], [/* Define to 1 if you have the header file. */ +@%:@undef HAVE_DLFCN_H]) +m4trace:configure.ac:38: -1- AH_OUTPUT([HAVE_STDIO_H], [/* Define to 1 if you have the header file. */ +@%:@undef HAVE_STDIO_H]) +m4trace:configure.ac:38: -1- AH_OUTPUT([HAVE_STDLIB_H], [/* Define to 1 if you have the header file. */ +@%:@undef HAVE_STDLIB_H]) +m4trace:configure.ac:38: -1- AH_OUTPUT([HAVE_STRING_H], [/* Define to 1 if you have the header file. */ +@%:@undef HAVE_STRING_H]) +m4trace:configure.ac:38: -1- AH_OUTPUT([HAVE_INTTYPES_H], [/* Define to 1 if you have the header file. */ +@%:@undef HAVE_INTTYPES_H]) +m4trace:configure.ac:38: -1- AH_OUTPUT([HAVE_STDINT_H], [/* Define to 1 if you have the header file. */ +@%:@undef HAVE_STDINT_H]) +m4trace:configure.ac:38: -1- AH_OUTPUT([HAVE_STRINGS_H], [/* Define to 1 if you have the header file. */ +@%:@undef HAVE_STRINGS_H]) +m4trace:configure.ac:38: -1- AH_OUTPUT([HAVE_SYS_STAT_H], [/* Define to 1 if you have the header file. */ +@%:@undef HAVE_SYS_STAT_H]) +m4trace:configure.ac:38: -1- AH_OUTPUT([HAVE_SYS_TYPES_H], [/* Define to 1 if you have the header file. */ +@%:@undef HAVE_SYS_TYPES_H]) +m4trace:configure.ac:38: -1- AH_OUTPUT([HAVE_UNISTD_H], [/* Define to 1 if you have the header file. */ +@%:@undef HAVE_UNISTD_H]) +m4trace:configure.ac:38: -1- AC_DEFINE_TRACE_LITERAL([STDC_HEADERS]) +m4trace:configure.ac:38: -1- m4_pattern_allow([^STDC_HEADERS$]) +m4trace:configure.ac:38: -1- AH_OUTPUT([STDC_HEADERS], [/* Define to 1 if all of the C90 standard headers exist (not just the ones + required in a freestanding environment). This macro is provided for + backward compatibility; new code need not use it. */ +@%:@undef STDC_HEADERS]) +m4trace:configure.ac:38: -1- AC_DEFINE_TRACE_LITERAL([HAVE_DLFCN_H]) +m4trace:configure.ac:38: -1- m4_pattern_allow([^HAVE_DLFCN_H$]) +m4trace:configure.ac:38: -1- LT_SUPPORTED_TAG([CXX]) +m4trace:configure.ac:38: -1- AC_SUBST([CXXCPP]) +m4trace:configure.ac:38: -1- AC_SUBST_TRACE([CXXCPP]) +m4trace:configure.ac:38: -1- m4_pattern_allow([^CXXCPP$]) +m4trace:configure.ac:38: -1- AC_SUBST([CPPFLAGS]) +m4trace:configure.ac:38: -1- AC_SUBST_TRACE([CPPFLAGS]) +m4trace:configure.ac:38: -1- m4_pattern_allow([^CPPFLAGS$]) +m4trace:configure.ac:38: -1- AC_SUBST([CXXCPP]) +m4trace:configure.ac:38: -1- AC_SUBST_TRACE([CXXCPP]) +m4trace:configure.ac:38: -1- m4_pattern_allow([^CXXCPP$]) +m4trace:configure.ac:38: -1- AC_SUBST([LD]) +m4trace:configure.ac:38: -1- AC_SUBST_TRACE([LD]) +m4trace:configure.ac:38: -1- m4_pattern_allow([^LD$]) +m4trace:configure.ac:38: -1- AC_SUBST([LT_SYS_LIBRARY_PATH]) +m4trace:configure.ac:38: -1- AC_SUBST_TRACE([LT_SYS_LIBRARY_PATH]) +m4trace:configure.ac:38: -1- m4_pattern_allow([^LT_SYS_LIBRARY_PATH$]) +m4trace:configure.ac:41: -1- AC_SUBST([DEFAULT_INCLUDES]) +m4trace:configure.ac:41: -1- AC_SUBST_TRACE([DEFAULT_INCLUDES]) +m4trace:configure.ac:41: -1- m4_pattern_allow([^DEFAULT_INCLUDES$]) +m4trace:configure.ac:42: -1- AC_SUBST([PORTAUDIO_ROOT]) +m4trace:configure.ac:42: -1- AC_SUBST_TRACE([PORTAUDIO_ROOT]) +m4trace:configure.ac:42: -1- m4_pattern_allow([^PORTAUDIO_ROOT$]) +m4trace:configure.ac:43: -1- AC_SUBST([CXXFLAGS]) +m4trace:configure.ac:43: -1- AC_SUBST_TRACE([CXXFLAGS]) +m4trace:configure.ac:43: -1- m4_pattern_allow([^CXXFLAGS$]) +m4trace:configure.ac:44: -1- AC_SUBST([LT_VERSION_INFO]) +m4trace:configure.ac:44: -1- AC_SUBST_TRACE([LT_VERSION_INFO]) +m4trace:configure.ac:44: -1- m4_pattern_allow([^LT_VERSION_INFO$]) +m4trace:configure.ac:46: -1- AC_CONFIG_FILES([ + Makefile + lib/Makefile + include/Makefile + bin/Makefile + doc/Makefile + portaudiocpp.pc + ]) +m4trace:configure.ac:54: -1- AC_SUBST([LIB@&t@OBJS], [$ac_libobjs]) +m4trace:configure.ac:54: -1- AC_SUBST_TRACE([LIB@&t@OBJS]) +m4trace:configure.ac:54: -1- m4_pattern_allow([^LIB@&t@OBJS$]) +m4trace:configure.ac:54: -1- AC_SUBST([LTLIBOBJS], [$ac_ltlibobjs]) +m4trace:configure.ac:54: -1- AC_SUBST_TRACE([LTLIBOBJS]) +m4trace:configure.ac:54: -1- m4_pattern_allow([^LTLIBOBJS$]) +m4trace:configure.ac:54: -1- AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"]) +m4trace:configure.ac:54: -1- AC_SUBST([am__EXEEXT_TRUE]) +m4trace:configure.ac:54: -1- AC_SUBST_TRACE([am__EXEEXT_TRUE]) +m4trace:configure.ac:54: -1- m4_pattern_allow([^am__EXEEXT_TRUE$]) +m4trace:configure.ac:54: -1- AC_SUBST([am__EXEEXT_FALSE]) +m4trace:configure.ac:54: -1- AC_SUBST_TRACE([am__EXEEXT_FALSE]) +m4trace:configure.ac:54: -1- m4_pattern_allow([^am__EXEEXT_FALSE$]) +m4trace:configure.ac:54: -1- _AM_SUBST_NOTMAKE([am__EXEEXT_TRUE]) +m4trace:configure.ac:54: -1- _AM_SUBST_NOTMAKE([am__EXEEXT_FALSE]) +m4trace:configure.ac:54: -1- AC_SUBST_TRACE([top_builddir]) +m4trace:configure.ac:54: -1- AC_SUBST_TRACE([top_build_prefix]) +m4trace:configure.ac:54: -1- AC_SUBST_TRACE([srcdir]) +m4trace:configure.ac:54: -1- AC_SUBST_TRACE([abs_srcdir]) +m4trace:configure.ac:54: -1- AC_SUBST_TRACE([top_srcdir]) +m4trace:configure.ac:54: -1- AC_SUBST_TRACE([abs_top_srcdir]) +m4trace:configure.ac:54: -1- AC_SUBST_TRACE([builddir]) +m4trace:configure.ac:54: -1- AC_SUBST_TRACE([abs_builddir]) +m4trace:configure.ac:54: -1- AC_SUBST_TRACE([abs_top_builddir]) +m4trace:configure.ac:54: -1- AC_SUBST_TRACE([INSTALL]) +m4trace:configure.ac:54: -1- AC_SUBST_TRACE([MKDIR_P]) +m4trace:configure.ac:54: -1- AC_REQUIRE_AUX_FILE([ltmain.sh]) diff --git a/bindings/cpp/bin/Makefile.in b/bindings/cpp/bin/Makefile.in index af20830..539bc58 100644 --- a/bindings/cpp/bin/Makefile.in +++ b/bindings/cpp/bin/Makefile.in @@ -1,7 +1,7 @@ -# Makefile.in generated by automake 1.14.1 from Makefile.am. +# Makefile.in generated by automake 1.16.5 from Makefile.am. # @configure_input@ -# Copyright (C) 1994-2013 Free Software Foundation, Inc. +# Copyright (C) 1994-2021 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -15,7 +15,17 @@ @SET_MAKE@ VPATH = @srcdir@ -am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ @@ -80,12 +90,11 @@ build_triplet = @build@ host_triplet = @host@ noinst_PROGRAMS = devs$(EXEEXT) sine$(EXEEXT) subdir = bin -DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ - $(top_srcdir)/../../depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = @@ -116,8 +125,9 @@ AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = -depcomp = $(SHELL) $(top_srcdir)/../../depcomp -am__depfiles_maybe = depfiles +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__maybe_remake_depfiles = depfiles +am__depfiles_remade = ./$(DEPDIR)/devs.Po ./$(DEPDIR)/sine.Po am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) @@ -161,8 +171,7 @@ am__define_uniq_tagged_files = \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` -ETAGS = etags -CTAGS = ctags +am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ @@ -176,8 +185,9 @@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ -CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ +CSCOPE = @CSCOPE@ +CTAGS = @CTAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ @@ -193,6 +203,7 @@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ +ETAGS = @ETAGS@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ @@ -209,6 +220,7 @@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ LT_VERSION_INFO = @LT_VERSION_INFO@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ @@ -280,6 +292,7 @@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ +runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ @@ -309,14 +322,13 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__confi echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu bin/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu bin/Makefile -.PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) @@ -351,8 +363,14 @@ mostlyclean-compile: distclean-compile: -rm -f *.tab.c -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/devs.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sine.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/devs.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sine.Po@am__quote@ # am--include-marker + +$(am__depfiles_remade): + @$(MKDIR_P) $(@D) + @echo '# dummy' >$@-t && $(am__mv) $@-t $@ + +am--depfiles: $(am__depfiles_remade) .cxx.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @@ -460,8 +478,10 @@ cscopelist-am: $(am__tagged_files) distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags +distdir: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am -distdir: $(DISTFILES) +distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ @@ -531,7 +551,8 @@ clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ mostlyclean-am distclean: distclean-am - -rm -rf ./$(DEPDIR) + -rm -f ./$(DEPDIR)/devs.Po + -rm -f ./$(DEPDIR)/sine.Po -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags @@ -577,7 +598,8 @@ install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am - -rm -rf ./$(DEPDIR) + -rm -f ./$(DEPDIR)/devs.Po + -rm -f ./$(DEPDIR)/sine.Po -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic @@ -598,9 +620,9 @@ uninstall-am: .MAKE: install-am install-strip -.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ - clean-libtool clean-noinstPROGRAMS cscopelist-am ctags \ - ctags-am distclean distclean-compile distclean-generic \ +.PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \ + clean-generic clean-libtool clean-noinstPROGRAMS cscopelist-am \ + ctags ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ @@ -612,6 +634,8 @@ uninstall-am: mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am +.PRECIOUS: Makefile + # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. diff --git a/bindings/cpp/compile b/bindings/cpp/compile new file mode 100755 index 0000000..df363c8 --- /dev/null +++ b/bindings/cpp/compile @@ -0,0 +1,348 @@ +#! /bin/sh +# Wrapper for compilers which do not understand '-c -o'. + +scriptversion=2018-03-07.03; # UTC + +# Copyright (C) 1999-2021 Free Software Foundation, Inc. +# Written by Tom Tromey . +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# This file is maintained in Automake, please report +# bugs to or send patches to +# . + +nl=' +' + +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent tools from complaining about whitespace usage. +IFS=" "" $nl" + +file_conv= + +# func_file_conv build_file lazy +# Convert a $build file to $host form and store it in $file +# Currently only supports Windows hosts. If the determined conversion +# type is listed in (the comma separated) LAZY, no conversion will +# take place. +func_file_conv () +{ + file=$1 + case $file in + / | /[!/]*) # absolute file, and not a UNC file + if test -z "$file_conv"; then + # lazily determine how to convert abs files + case `uname -s` in + MINGW*) + file_conv=mingw + ;; + CYGWIN* | MSYS*) + file_conv=cygwin + ;; + *) + file_conv=wine + ;; + esac + fi + case $file_conv/,$2, in + *,$file_conv,*) + ;; + mingw/*) + file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` + ;; + cygwin/* | msys/*) + file=`cygpath -m "$file" || echo "$file"` + ;; + wine/*) + file=`winepath -w "$file" || echo "$file"` + ;; + esac + ;; + esac +} + +# func_cl_dashL linkdir +# Make cl look for libraries in LINKDIR +func_cl_dashL () +{ + func_file_conv "$1" + if test -z "$lib_path"; then + lib_path=$file + else + lib_path="$lib_path;$file" + fi + linker_opts="$linker_opts -LIBPATH:$file" +} + +# func_cl_dashl library +# Do a library search-path lookup for cl +func_cl_dashl () +{ + lib=$1 + found=no + save_IFS=$IFS + IFS=';' + for dir in $lib_path $LIB + do + IFS=$save_IFS + if $shared && test -f "$dir/$lib.dll.lib"; then + found=yes + lib=$dir/$lib.dll.lib + break + fi + if test -f "$dir/$lib.lib"; then + found=yes + lib=$dir/$lib.lib + break + fi + if test -f "$dir/lib$lib.a"; then + found=yes + lib=$dir/lib$lib.a + break + fi + done + IFS=$save_IFS + + if test "$found" != yes; then + lib=$lib.lib + fi +} + +# func_cl_wrapper cl arg... +# Adjust compile command to suit cl +func_cl_wrapper () +{ + # Assume a capable shell + lib_path= + shared=: + linker_opts= + for arg + do + if test -n "$eat"; then + eat= + else + case $1 in + -o) + # configure might choose to run compile as 'compile cc -o foo foo.c'. + eat=1 + case $2 in + *.o | *.[oO][bB][jJ]) + func_file_conv "$2" + set x "$@" -Fo"$file" + shift + ;; + *) + func_file_conv "$2" + set x "$@" -Fe"$file" + shift + ;; + esac + ;; + -I) + eat=1 + func_file_conv "$2" mingw + set x "$@" -I"$file" + shift + ;; + -I*) + func_file_conv "${1#-I}" mingw + set x "$@" -I"$file" + shift + ;; + -l) + eat=1 + func_cl_dashl "$2" + set x "$@" "$lib" + shift + ;; + -l*) + func_cl_dashl "${1#-l}" + set x "$@" "$lib" + shift + ;; + -L) + eat=1 + func_cl_dashL "$2" + ;; + -L*) + func_cl_dashL "${1#-L}" + ;; + -static) + shared=false + ;; + -Wl,*) + arg=${1#-Wl,} + save_ifs="$IFS"; IFS=',' + for flag in $arg; do + IFS="$save_ifs" + linker_opts="$linker_opts $flag" + done + IFS="$save_ifs" + ;; + -Xlinker) + eat=1 + linker_opts="$linker_opts $2" + ;; + -*) + set x "$@" "$1" + shift + ;; + *.cc | *.CC | *.cxx | *.CXX | *.[cC]++) + func_file_conv "$1" + set x "$@" -Tp"$file" + shift + ;; + *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) + func_file_conv "$1" mingw + set x "$@" "$file" + shift + ;; + *) + set x "$@" "$1" + shift + ;; + esac + fi + shift + done + if test -n "$linker_opts"; then + linker_opts="-link$linker_opts" + fi + exec "$@" $linker_opts + exit 1 +} + +eat= + +case $1 in + '') + echo "$0: No command. Try '$0 --help' for more information." 1>&2 + exit 1; + ;; + -h | --h*) + cat <<\EOF +Usage: compile [--help] [--version] PROGRAM [ARGS] + +Wrapper for compilers which do not understand '-c -o'. +Remove '-o dest.o' from ARGS, run PROGRAM with the remaining +arguments, and rename the output as expected. + +If you are trying to build a whole package this is not the +right script to run: please start by reading the file 'INSTALL'. + +Report bugs to . +EOF + exit $? + ;; + -v | --v*) + echo "compile $scriptversion" + exit $? + ;; + cl | *[/\\]cl | cl.exe | *[/\\]cl.exe | \ + icl | *[/\\]icl | icl.exe | *[/\\]icl.exe ) + func_cl_wrapper "$@" # Doesn't return... + ;; +esac + +ofile= +cfile= + +for arg +do + if test -n "$eat"; then + eat= + else + case $1 in + -o) + # configure might choose to run compile as 'compile cc -o foo foo.c'. + # So we strip '-o arg' only if arg is an object. + eat=1 + case $2 in + *.o | *.obj) + ofile=$2 + ;; + *) + set x "$@" -o "$2" + shift + ;; + esac + ;; + *.c) + cfile=$1 + set x "$@" "$1" + shift + ;; + *) + set x "$@" "$1" + shift + ;; + esac + fi + shift +done + +if test -z "$ofile" || test -z "$cfile"; then + # If no '-o' option was seen then we might have been invoked from a + # pattern rule where we don't need one. That is ok -- this is a + # normal compilation that the losing compiler can handle. If no + # '.c' file was seen then we are probably linking. That is also + # ok. + exec "$@" +fi + +# Name of file we expect compiler to create. +cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` + +# Create the lock directory. +# Note: use '[/\\:.-]' here to ensure that we don't use the same name +# that we are using for the .o file. Also, base the name on the expected +# object file name, since that is what matters with a parallel build. +lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d +while true; do + if mkdir "$lockdir" >/dev/null 2>&1; then + break + fi + sleep 1 +done +# FIXME: race condition here if user kills between mkdir and trap. +trap "rmdir '$lockdir'; exit 1" 1 2 15 + +# Run the compile. +"$@" +ret=$? + +if test -f "$cofile"; then + test "$cofile" = "$ofile" || mv "$cofile" "$ofile" +elif test -f "${cofile}bj"; then + test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" +fi + +rmdir "$lockdir" +exit $ret + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC0" +# time-stamp-end: "; # UTC" +# End: diff --git a/bindings/cpp/config.guess b/bindings/cpp/config.guess new file mode 100755 index 0000000000000000000000000000000000000000..e81d3ae7c210ba487bc74ef7ef1af6024c6f0df8 GIT binary patch literal 49348 zcmc(I{a+imvi{Hbuh4O50bkbUErd9sDG(>&louZil-|5Ji@kskw%7IAyfn%G{(YX2 zw5wgeK$?C(xA&eFYo(Di8qJJmMx!VHQl;}&w-jCFo~W(CAn5c4Y7nZ+VGu>iR}H@# zc3TahQeXYN)+d zBj`qf@*~w_38vLl=l6iY)|1fiLIo{+@2i`j9|0|D)plXvEvm2&81w#s!|toFN9-+N ztoN$zV^FpwmcUNC*AFlIeupzpCfHQ1t_|r)n0Ej8yw%To=Rt=-zV%T0(Kn0-u zzI*)c@Z?x+9sHqw-#R+lIynC01?mp2!r?##H-U!K>h#(z%o0o6_q&683>}U4D@Qx; z&|+(QcW?Lj4~$>E**!j})N1O@;gQ->)vcrB-JO%Yts_-EIjSDkDn+GgSRo<`m<5ap zxaI11LeNn&82GJrr04txmNUZ0+D&!k-vn6JM$o#!xInC+NQ=Gt-vc-b8m!~SInYtMC$O26pQY;luBy`a$oZ3K6X zKo*QU$V_j-OCNxau0!MWJ9uY zANx>a+9w4W{9$2bBUWNO0JqqAezVyk9Ro!@?5kEJw68Z?6g2orJp-5rx7(s6e{7uj z{M+i@&1!x@FT^2OQ42k^@6~O;1xD7zc2rgDnC)gg}AqEV0%$ zDp%Ur#DlP#5E*&KWdLr7`Eu`J#&+AvKruIi@QZ%fDP#PWU@lvOV&vcW-L8KXQ%(b= zCB0rn{@H6|C~*PVt!(LPJMe+%DCjmp0RwQ#h}85_xAaWWuZA8$g_`{ZDnH6u^Qw*6 zD*rshKH)TC1_~m$YMr+R5hw`TnutO7tce|e5%_~4R+t-HrhT`umQvl z`v5QfYTCRF`T@X1Lo9O?G=XSr;dbkSv z#nx;R(2d`31;S}SVu2^^jUWP6xEq=wH>~Ca<}(EhV1U85!QwCn01_q^g`n_0&=Lfq!C}tI(icL-LZxi?cZ4c1!)4vf=Z^dLN~pt7 zz?_UlBx$P)@EuvdA{snVRUaD_j2QU(ydhx;lu_S_aHzV!L$I(_o+wAm8db}EG zDLXBn?My8QaXwMCLD)0;73Eh03>ZsgM;%>(YrRnCU>Dc%NY%p36LmuFJZOTQfk(8u z*sn#~C|$cSGNKOld#iinw_9M0T2Yu?p5;XH>X)BaEEvJgvhCFYFhzmaQ(Sgsrt z3A{)*8#yAnT!o z6XFiKH?4lyC5&S3?FrPpO*Y!usYBbVZ=dY$y~dJ|pn9O9K9vUQ#b^tH*W$9M4npu0 zVc*;@)GMgw08HEr63+*cFbu=(paL320dSx(HL%IRKcV$u5eDGue-2v^S%ASKOxX9a z2dGGi@Px+Oz(P_AfyyBhqWDk{pEaP6VcK9s0C5%gO&^k%g0~q!YoRX8!GP_9WAV_U zE_{%PaNQ^B9W{qOPf6|jMfKT5#+=3g0AUd1;!XAW-C^yxzOyq|RKJsyv{)e);xAMV zo52ND6;aa7*qQ;P4!Cd7l%rJDj%Cp40Vnu`Q9!J5s#K|9pzp0O~D-4!?IdY%d2YnX)YH9gLDu)B^Uqji z=p|jXB;U&D|I6`y_4V%2W(n=T94E}xrIih-_C;~_pXY}iKe|>+&z>p3 z?_863l-C4k4Y|~~Jd=O&3u@(;QZu+Ib%*WtXV%tu=~}$RC2TF2dZE4nTe%tZMdi_B zRUEEfAMWR+JqD0;Gdt^Hqe`?lIb0XEt71>ghsKK%+xI)%kg^B9@$d4pF08!TRClS~+^?J6ux|M)wkJ+sF>t3J2xVZd zurM;rogE6KnZ<&9OaY!X__q>EWYaf&E&)fy|91m941f!Qr!`?_5p|aQw0aNI1vvd- z?M~fNAEh#jRiI$luDwQ8u1h2)r}@h(|F71s-LO&Y4+obhE(XmZtxs#-(uTLPwh+rg z??RP|{$N1UmhR0iLUrr--R3O+UA8rVvfxfsQ5K6BJUQ6fuhjRqcHZqCRLCY|#9k-E z1;7i_HHY2nZg|_x>C&UhUS+H1wC_)9Z)>L8*Z!y-SN4y+prNTmPW^Z?UXESa!ljZ%n83-%&@}*Zfe3RLF zPplQ2X&0B1@oAW^T0Ln6N}bV0rdrYHOiiW1ez$pk}6>JY9ura7y?#43Qr9A8IGyBUh1pCwM zQ0_uXkV5$&7=S&N3uSIY3{8Hj`R;ktTu=iLZvfklF_X@Nv0^NK5BA#zmDdFv24Go& z(EyrvpY7#vXv}YeA#}5-tO{Pi>jncr4B8ikMd!B z=UF=-(fMhx?GD=aY#%|h2C|ymQi9CHUP|)Dc}k_sDZQ zI-SrViupy8gu#9@45IEF=n;n7R$~ZT5{*nG18rC16rcb%HOeV)sHGdMQ@~&vAYQ+H z>)&JXV0y%n1c=F-otFporo>Hs3%2)!zxUG2;j8+fC44Co56^wn7__N{UfmWuINsoN zQTO{G14pBzc5hn^qyFD(DJqv4^8(n=7^0VvlbS`P@i~n3wcwnDDFfRyMfLN*vwVl@ z2Z`VBcTzR^b6h1TF)_4$XQW1SwHmaOD$!MYY!zor(bbq5Pt!o2wnqmXV8l1vr!$;q zY#|(7%CyPwQ}AJ)E#EJB&p&=xC>CZHKP=ORI5R^D;&&ed2|FAD;Zw2jVLmwjupl6M z0>k2F_6tY#ZT5=>`pwP}-B^q}m^94F@Ge(IF80 zh%1;6mK0vYbOWakC=rVUQE&-I-gm4NRP+AkTvYlb+ekJ;$qW4RR_R4l3eIOsr8#tn z-;dc2aFfguV4k~(UQrMl9SX*A&FqA%Zl3|33^$Apioz?3#%KNQ;c3eGp zjr+ZZgRB0u;f#S`x-`nmV*%BusNX$iVv*EzHsJAX>#x7y26;^5fvM{>KMI=RqdEr5 z3-98Fofg7Y4r_0g%Y`DDxLypFdd;BWh0(=wT-R^+u6$G3oF$I}9z7~&yT=e%Z~&YK zV3&dT?Bq-Y*UU`_lU>w={C*f~2@I z@WlA%qDn^7i{L=N2t`dj4`8Z9gh#6_(l+c;0s-ZvWzj~D`@{9MIIaMv(&mtIT1TD0 zUilOn*RF~~v$Xi4of8Lf7&NraLmd0G#zPTq`uFyXOZ>v*(W7e%A`KFZ%?J0opdSt| zuf&1Hlispu47U*eT^vQV4^3LJIyC~cR!dl|t-b2It-6(lo6Z{8S<5O&JVRH9G?YFu z+K0+1C`f&n#}Q+}I#R6+C8pt%Qp{Kix&w=^M>6)5fSzcOSTgWGr zVa>3*C#!(4a`EZotMBb>8Q|+BcCqoOE~JCyDdP!lp31?8;vPeKT3qLl&|+&Md^A}f z-=?}Vu~Dz#XInipJw4FsncJ6)Ze{9xQe#^$N-tsZi(>PFQfCZbZgV|?}Yhw=$ zpWatbkIz2pQ^TN-1LO`Y>u=xf{`!4pB(I-)wSWGep-g867gtcDU1WL`T%Zy zvlh25l;3ap9|_|9VfgWVE&BKv;SV3!r5{Evl>N@fu;07-9w@Nl_O4P;4r`^==NP#& z_SWjNC9ief@urV=^C6JCo~|=NU!=uGpo9^JO`rwo z>adoY2EiFiq5yQzR6AOEwX|G*x9gppmG-Muwu9KJ9c>^!G+i8z?yA@Gmy65Z70%nR zSmM9KyH2kcPuTc13s9}@08Rkz@76|t*Y>OR*E^oAh7J&hc^w45-u7TOSXwRK_WX!aGM zb)p{QzLTA|o~W^6hx1yEw%5H|kI@}B(Yu!Wb)`^##$}8@wP5YHRx|k2Jh@5k%C%uPrn=h6!DG4H`%lG>w2Vw*RNPKDeK9n3W!AurXC4i^ zYwt|Y(1m5A|483@qE~)r};qk+L2vUr$ zqx~oF9*{2d{U5Y%4dx;#L1nbYXYmIM?Z8ANG4UX~t_HFO`uGuCX$})5`+9XOQ?rQD zc*<~Vv6_0<3A3(27Y(Aq*V>wxturPCqkZ0h!=|kM|Mq)+7v>JN=XWoMh$pq`b!_7| z8nM#h>v}tVUMnsaSG|Al&3zvxyi(m^@(vn?-7p%5gVi(+9Nkl}C(Tkbb)^EuE~KDX z(ZHor_24t+QGWSPRSE`;QYRcVvH4sZ3n&nG<>qIfE-o*wE_}o0biBksqvj47-l+r7 z5KNfvY&90P6trBrWZf{4RgBKssHj&@oLlUBKn=ut*+yAJraDh8xKT>{VRY3?32Tj6 z4G3R*!5v3|MajT20JM8EY7K@u(3UK8zjbh|**n~H1L$bn$_V@DUW(xcTS|MjB?wqF zXt*r2Cl3+TfW(_iI6?LA5h@Lv&%EhH?(YfG2I7-NRP!0b?hh1vnaqKP1b z-1h+vZ-i?Uc(<5y8dHpJSPJTNcB{1W*kS@fNd+{^_JyKqGwPkCII09U;aG*LTF!OQ6XHd zuL}74=KV)rus}pC12vMWx*97i@F*b7UZk46kY*+n6?(h5Z=&X5K^oLK{RLhjh>MAr z$~N%e#OSJdI^f}^rz8Fp-^{H+oB|*N;BS(D(S8#~KSeYqeE87K;{px`zWi~)T+W(b zT7cmoj*E2%6T?3}qR5{PA4Y_~3mSr9b00tj0pms@`ALb=s2Cf;zUWh-2S67Hf9XU~Focrcy zbCDtL4AAqoqEcV<*)2cov@!SUaQ`HhbeZ*@z_s>6TvEcBqFklgu)lRy&qz$mx}cOw zMcltd#g3o&H)9Y~a97LKy$vrBxVAYq2@&9$#~pRVAI#`aZ&v8-YreB zr|$q><*4g4M?DCEX0Dhub~YdvcFsyLXFPK`Bg;KAsm9&#?peA8Pyw^29Da=A!TK={ zx%CnQoAgmA<9KnjnqW?PNVQ1#{nlx#b$C#2UJk848Ua#oF-UVKD^j|K@G*v~QOj>J zMxGbR?dhX>bhv{XgNH}P!I-kUxkd-AcE{CuuIMy2HkNT+A3M}oCMH!{hS^!4_o>Py zmW<=Aqqmjg`u6U@*3lpJ-Gk%G5dw=U`8z@fwm3P&w%s`~uxM{Oo7NbM$DWLh!9joX z(j(C9PGDsdST|bvyfJd>V0{`WbQ}KC&00@k$ePdx>l<0Uzp+s$zYgK1ZCUdq&iru! zc=+iN&tUFYbZw7hlMsOb5}FZ-%@Dcvz*j(>Rn>8MM;z9Km;yL~tj=C@Z1R5#IF%d+ z*8^NGZQUt;$O1jV=hJbc9oS}>@uL3Ps_;MgSD650Gp4$N@~||nD>bh4jNsyycRVl3n=dAmHDTqw%jJ~? zkOPcJyJu>pxKdo^aZvw&cY;U8qvKL_hefbe=x%V8w#U@KTH^vlC zxaF^}IW_H0_U?302DwKViPtf?^tQXb5A2^h48~M}&BE+CTg7Zk6Z}}r?o#d`jWF}Y zh7Flv&KfxJa0@cll`{7d#wu3H^AHilPxW}s?V=Jdk3;WsY?QFA{Jd<UEK4^V$XCHxKQVe5kc3-;@Hf>z6 zxl!JZ!lhE!d9|HJdGO}N@kKh52+VcXNT<&VOvNB!OqgpDr__#c@eyHD72f?yx@0)6 zzAlD5EWcNd<|Yy#+lc!@PcNQxTyBU$PZoWPjC8kUJ8JiO(>A59;O+g{fbStHA}F`W z`&$^IgvEo)&=~2xDI@61&UF=YMFsAKsHD}}+0s(!M>e*dk)@ysd)n2*(n}t1e(aC_ z0P5(P*jv9^9vhcn^)uX8PSlA`rU5Yi6i)28x%?!HkN;tyGwp1Kv7-XLzT=>$85#jR zQP7ulw76!`NX!Im4nj^N?qT8|PoV7a)>2v7@yQik+6CCAP~JYQrP;bc);X@sdsyd$ zwZE>OmEd$=DsLALi?w1(7SJ-{Nt3kt@f=&d^nP{i9& zCiX!~pR3ESQY7%Ms<)>$;l|#1J3b69sqWO3JSH<-DP5EENVFpgfN@(H7YS*}j-?aZ zM~!-;H>?|TuOn+sWmVe|K4;m%O>QantZlF=>K9Rx`6t!K ziu7SZAJY@p;{`ZEa>u$-Ti7kHkH;>2e%3(Zi7SsYzLCYOKWhFGEIh25pz9~vilpkYQEG=LM>`c38wbK;cdEOU2SzGTdkX^h9&o5#?4mC)cTg-Kx~*| z4E>ieI*u%rT(Z|I>mU4j%omf!q z=8UauRB}n2T5V!top{&5;A*RrOi=NnC0kbS*0KAP6}e2V)njC{Y7+%g8=1-;d_#sV$WGDo|6OXuwE&oxo>C`F+jwz-SESh?ozl`8v8Ih_m zS&W5~2cZ9Xy(L>=I>ZDC8lDD-RTH%!j?MY1Ceu^}xdc)a^c6%PdOLC^SO^-fVa_hW zXgc65%sIvVm<@O_r(09SE+2?dD>Jd;Bj@mcOx@AF66WL{SC^hH70MEjX*8@6f=G>G{+!oodE(V6yR9GEzfhL>5g03a zzJiSzN*LPFPo$%-G7v;8VWMm&ljR>7k%e-6AC*8$Dc%jfnTmG34OUWIcN~Nf8TOqJ zDAY32=m7}hIR4Zo;QmC3{D*r+LfEoP>0;3c9(~wwqJK3$2u;A4YSt6%#tAz$#StVT z=llFX6RaoV+d;lDa|&@xC!_wF2_uVly&MvrC1)+1v~c>C(v4T|pFRI*4`J>ROzSoX zi%y@yOsn|ZHrfQVm2Oga{_0hsykD)9T5`%l-vu1yz!s7+(6#0!x?6$K=>?7n@v6re z=(}(-{;QrDye-SXkfGy-T#N=bNFZctOOI}CF>X4bt-!X%5u1s_M#@+XnFPhjr0ex1agnr8Lh%g_Rv^Z$C=aWTB@%Y5*!x~LZWjcCYi?S##l&? z7*cvf;|FxK^+(|kZ(nXNNUu96d8{YmLs5dzXG_I1Cq(fcj)F$tzsJRi7CiW~7Ggpn z?DYMX_rD+YB@^j4WdbpDoOj{m)0U|`ZGKL!)?Oya_!+i~Z5!b;Xo zab@@)>pHptJD5g2a>r^1SCl%vf2>n>*u8Q4?es=x`(||sw~#(&?s#G9U~zAr!C;ua z{G}J;&B?!EiGt+_UhGZl;K=+{O>Mb3fF0* z=}6-5LX~I^u;!O=WrVu{(Bq<5{KBIYH4sMhK~<1VoyPl8CVD1qN9Jt=Si@Ush8r)B z3=?L1^qK*qCt#J2DImtS&J5xaU~oIH%GP1FyoBO9ImZ2aI-Ku?OlV)o1;nvgL|wzeeccdY&RI~h_V*PwZs<^86*uP&pN#@ z-wv}JxhkLY`B9#Re{2v}(1)FflEOo4HF~Sg-u%xjYwYNdTS8Ek%sqt|MVtDjj@ZD6 zNCpawtHxLu$58eIm`bVP@i?X}RlJ{CPznEd`}^*J78of=R-wm^Y}{Yo^6sT!k~q;I zmC^6(DJ3tnh0qGI#Fw`;;iQ{Q?@Ai2uDFfBa35#`{X1@eDOG=;UcYyn>R^}gwyite zM*C<|N1Axav9erAjU|a?!YpB)Ve2fz;-qCG`9mH9kX{i4gZ&Nr;Sia{*s6`6mHqX# z;{>Rtop|XUg1x&1M@upyTBt1Rn%0!2S$n_$x=tQk|Dn73Lih>U2;N9!P$%Is4+y^JxU77Zc+JgaBE!J2T z-+Lvn%~^RVMH)U%WmzmGjpRv!S=(v6fRe>liUBgFZW(zAq$(l@nME=9z8QI>9pyAc zOK1XZ;xO|`o;N)!QC(7}9h4wpvrT-)#Eb7gmEh;agfLGi8u|C-A*0gE9}#Q&zART~ z@HeCcNBp?iB9&SqT*mSkOSLjzjLFX16D&Bh-*54T^_1;xA%TxLRuz++6UGGOlY2~a zop>(Ydy?TZ1t-NToHU?z17sMZ9pKm=B)5?}NMT2xh29VzUHU|$FW!F(+9gEsLoqdJ zY)s~w5~FcSs3X=0$0%>FuOZ#b0%THV$m})A3WGZ9s5HKgO|??p*9ew7VVWnGEc;$KM9o-Kh3Go}q)2foj^B<8r^LvYMJ;X-&wQLP{&<|A{3Qu#^HSO-hpuj}TnnmUyo zv?cwc*@fCaM5upXcTS}*O)1WV%jJxv>2xf9;i`Yr>Mon=!5NYF*rrrc*_agLD69TW ze--9McUc~fC8KNMUA^dG2>u-|9Hfx!G{14lZ4z-!gb=J;KivPc9dXgW`7r>92lg++ z?vDYH6YYa50p(^K7R3$uVB={>xL(FPeLn=D9pd3g-feJK6ZzYZ72^xqsy>PNuG7Lso~JEeZgcW}SiFShS*97r5|0_H3S0x~E3 zO{s(fxq#6OiUCMd8Xq92OTYY(wC?h(WNzzOxCR+4PrVF*f+-!y6+K3VxkHx1I^NZ- zU75DHQhXn1nyITjFLM#cMGJS22?`wNZU+FUGi?=G> zzTy?h7N*F`j#M)&aC~D;0m=dc;%zXl4KYab<^nzc8Dw&Na{eB4hz@tgB zgY$Q@Xq#8a2XjXPj9tzso&DkfjMK@xEFIgy^+y{isd-7zP8iJJ;gig2W?h}x(@EH0 zPSUoG6EPuFg`|7ni7kGRXZHMNKS+Sab4r_7$Bjn&Y+d$>5z$-g7RB)Nhxoud8DKIN z11>25uqSFS46o%LAJ!7dB#_k4=I_wg2Y70F|H=3MLK3$*HSv%H;5yIuoSK6xcf}r> zs$0)+s?aK!bv=&}e8%Ee-QpP}sf_@qaZ@z4B|(`}dtz06a5033e8XcgYD^%G8E7n0 zk%4M&?%6TFOz3-B`v+Qco21lIESV`gcSdDPT^uE4Zq1k$ zr>pGbFfkICIW55-;ObOrqZrM=Ev+sI;IUHWJKH$HhCV``%K)8$Fh-QvIRS+ z2~xs^P-L#_Abk)#%fp_8M`5oq0!V9lR?1X!;m>-fUX^SvBNzB3_ zA9>O*Xfd0RJcPBYTrV?R#5$n8lD10uHSaxyn~T44$|8kMk`*>NiKTHh|Z2{9J*RyRdZrse^9Wghe> zNSMfem9OYP;Rm-C9q#~F43We^+_?7IG9|-tDiZ{yU*fgqYomz8(Z97bD*kDBMG~B2kceB;;{CFcnopD%}A*$lj|g~!PKi-1qq`%yGxJcVMcg6Iqf@*pVF ztMVEKKtNhTA7D58C$(cHQYF}kgb2+<@~|Rq8Ciar;g!8QLuSpqu=G6ChiI_KR32oJ z>h0@o243srz|dO2nW3WNol8+5^x&mu<`(XUQH0ymczHe6BW!HN7@@Jtz=^WtenU2( zBvx4@7Uc}MA+AN)gRDS>QR$Q15;UYt>?dTLYO8dS$7C|vGsNk(yt?b3) zgbK;WI`Nul07pGn5NiZF03{+dyIjK;T_`maE9TR}&W;2_InhrQR8^wrp#{m}X!Z0xvRyzZOA|T!d40uv zBycA?rouUalgbOklN|!E`KG-gxK&*Df6B}DB%>uv0QsL33sJT;u5giK7^x}|9!cq% zez(9W*m$Zb)pk+)ZEG!4^14Q)I%!jT_cl}T?CBD3L)bb%^kGdxI_B_hUW^Fl+b!Y| z4LqO(5dZ;TDis}R`u>ypSWx=kCWD(?)K9Xwsh2u)uZ9E><_gQqJFr@_Nr^HY_?Xyj zDaX8Sqi+rvt9d+%!J)fW+G#z=H<7bi2Xdt5NLOH<)4OsPKUsTf*=FVAMJ7>B8;e~8CoeG>(EsT&OZUb=|NniVQ=L7y)YF$Q zp{gE&0-;+bx|pV_@9WIc6&Me!F6ncfTLvzJHBR$M%hlV{4sT?+OGrhUzC2(LWHHyi z_H;gAN{Gbzftv-$#kiXqSUiS|uVC6Bbjp?SU`#reM@^>6{Dsw>6d-JYOtE_g&U_j@ z1{to+kJF(*fUa<5G zj(1P^whx3DaRK!cHXl%-`n-dj;r%L%C+gjPRpHbO3Ar>UwlzG6qk;=)-UA+3VBO=} z9qmo;gz4KynND#(Bx8Q2t(^*;%{L$j@-& zgsDhVdx!a%bYf|LG`XeG+`7Rnu9+TGey`zaqq2GI!mvQ@-YD$ed#n^jIG&nDN7U?i zWvEb-)bI6EBAt@=hy-bP0WuBS(n3;dIYey6XzD{nH)zCr&gmb;W4T9aH_;;JB=PY5 zIgFk$ZnguQ(x$@4cODt}p9b>YOarc0F9RRUe%kQmsHiYpdjfCMTcA;DPne?+-}$ZU zp^y(SB0pS|JO<_!A;f4fKBxq&9fAprx3VqWs&?kBm1`$>Haf}KrAHp!t$_?d3qwR@ zPo!qFe>$oC)5o=6pVS`O@MHRaHmUuy$F<*>)PCcU?T;n`=sykua_vq6fmh5Q0YelF zNcAhf7lqCH6jQR>MpJg*R7tE*dcPVzGXX}1!9EHUF0R3?``Yj0PDg4$CcND+%BED9 zIGj{_Z4r!b9;I%+x%X+}8u5)9L;TjD99P&h*b!TGoJk1#xI-TuUUt1>)*X*eIO3K1 zUsP1E&~TE&r9SE>YjGKHz~$S4w zA1qmTj$;spZKxPX{`0HYeb6wohN7`ExQW2>E=`kTX}`u550-s{Z~pS62E zZ`2u1!;Te5`5*Uy>!-aO2l#_;X<_`|lWIuT7j5L={HPbTCKIF}Pp<138+SsEnpX=o zN-aa46X_OjDP!mA1a^tfor{A z3g!PCoR#@5D9n8@9zHkL!|X8ZrTdl7`68NMOxryoiM5N{5=fa z`?EW8Nimi#oDGgy$#Ii?(mReuu_kj+ImDs#;P8Mxag)0+B|(ro${T<|2OX~)T~Cl5 z2erxrP@>>5P>vpg(tiw;(}$qkJO&C6>(lTO-8~Ei5W;Q^kpx+VPjq@wVgK~-iXMXv zhRLFA*H(C>s2+XbNVD3FXihREX--Ek9%OsP>=bkt@7T4b;Y$? zJfQU45X2LexBE74-T|XW2oc-}B7&y~u_VkuHjBtic{YX;4Og&=N@!i8IJBjIAnAVf zp4Z+q1Ehgx0$UK^+699B!$UY_p*~0B@G}S`k|hymUrcY_H?kV^WVaj{jo!L;d+9yr zFsr*+w>6`PCpWgU8nZ*~S=eg*@Yi*p$IDVEV`tSM8B*J-*X+SA82HbHVOw(!xa`xMvx9m2- zA(&vEx@8$Kch~JK7=r>mxJ-2y1y0X+&Om3qnNS_^Rq-fmm0ixdjQ^gT#r0*2MFEU! z0bWI(NZ_xZBuc=7>yW$?z5gdTzhA9D`qniomm;Qw7dym%EfAJgy9RvxoEsJsB2>{FC8j7Z1)Nu3+S#(?F!;FUVsnPg50f+vMd--cG^wCESxy z^;+dWC$K)(-N(=1-lj4P{8Da2(Rj?Lcm zQuEkmE<~jNtdB3sT=OBPa~q=FgrZDC-jK;OluI)*Fr>E~!b12mYF&2ywnk7qSmZ?B z{ohLcIDNONw)=MPu!htZ52DgwRR2dmE4Prt19C1pXq?Sph@<1{Z;}Lc`^{@SMchT8 zZ5~-`ppj^GgW7@U8K_y`@ROzNbK`mnZ!2KlwTc}Nd` z^G~^MrBtRmy*Ecn;!_&C$CaJqlcS1Ip1wPVWWMPyD$kGzr(eX> z*eGUle1v&0!VYiuGCW9f5}4c>^3+?g!0u`Oy+RrT{XRw#FpzdD5gZnL-hf0j0TQ2( zPe?oxU+?=Vffw*9Uyx=j7hzYC1aPO z#!k6jhkDKQQ{WE{WGm_?15IPZ#NB7`L@1+RZH#{N9%{ts9QBZ0ra|Q5gp`70+>s{S ze<~=w+0x^U1qXq`-!+7F(ntpgC}iMQT29UXJnRYqlBQ9w+vxP*P%RqrUR3$h6%a3; zSlC3S3BH$^B2q!4oiA=qtYoLl^uT(?pI<#}W>unBX*FNJcKAG?p_Ex-s8OZ6T1HZjL{QyEVS_5|79#ryxJP$1*w| zK1oV&rt$J~qyb)^44{vPpT`3k-{)xE^gd$u-`UcRIKJIGRo0HBNkft=>^b2 z2=vPkE+~#cM#@YWy>9%_)U&&Dew;EiuIxLsruhk)j?0#fKJ-1xPt1BBP;^F+Um!=A zjD0zj@}Tv%(4T4jDEy~+87|H+7R9};j|Y7bB9LO35_@W@GIQgEjxbOCS_R)~)0x9_ zDffc%9(TJVY?mTevr8frfo#Z7@+9QQ9&1P z+lO6P%y6qohd>&)yf2NNcu+i5R;$8#Oqia$Gz)8o+o3taAR#=?Cgv)WJ{36~=hZJi zujF!L&gNxv($dr6NuAu7>#A?y!M?&D_Kqfws!!CeT%Nkb=|?qA1e5LWCf?OuoHLOfF! zcsPrX2biN*jyQE@TU1qH9io8CtE+B%`t}BW#4BIIjaJmp48wGwkC&Oz9W!)2LYkW% zG%u?a&JJ3*^*8W4y#>5Afbi!Fg!pI!Vmu@+b1rKqRQKUf!lZ{tX?C0TX9 z-G?pt9#QZJq#E`(J}h1Yg-!PO1$QjG-AU-JCh0V*BSTMNyG>M6!x(F8Fl2A;@ zFjOb2kjrT+hu1-IZ0PHxj!H}*BAmxqj6T~oeYZ{jac%etRoo8@2kxDwN&VcoZIIGs zYMb0h;#FxqQknwuIp@YupOG!uL9TH%+iG^t2mDMd%otaPLT7u^A_(92e z!XR!r@+s3kmohtJkTyxav9ab&1!JCdDp-T9sbJ)rQ$d$l0QOD3qz6-y7oJ6npr{th zv<&Wr452{c7hLyf2T>VC%n4Ig^LRPZ!xijnHFq9B>ft!;-yrXwlyJ8p@R4!@4U%6h q6%2*)~rA literal 0 HcmV?d00001 diff --git a/bindings/cpp/config.sub b/bindings/cpp/config.sub new file mode 100755 index 0000000000000000000000000000000000000000..d74fb6deac942a4e21f49fa752c3280e66c196a0 GIT binary patch literal 35276 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≫C?zB7)a zlAZ*Kw}3PlDh!hV3x>vQ5xDH2>sRFC|9RC6Y;HD^v2C}0$;&GSwA_bx$-GW)5@d#) z*_2&1YOb$#!Zh_t!thSThqm~jDGs(5yZI&`1}!>mu~5|w4=E?t61Srx_|UYm>cWqi zX+YG>6#cS|zM0SYs)j98nQxPfV>RO@2%XT>juT|@FS@KJ2k~$Ev${qlMrndAkRy{HgDfdqK06dPN;^3``cuFzjgLsc zv`pI~?3btkw959BnJIkRZHKr~ZeQQqlI0tSDiv(p4}(A$f-^+80AW9k)A z9iPaLU6_vNJ;_-m3%Lr0lt_K?vSR2%^thjz5r=|tjU^d)3gr?SjLoT3h-(CJXkA8y zcxVG~Bsd8~k8(Ons{+O)c=a*G+71z#I_V-NNU^3v?F928;)44K&SuC`U|u>^k9b`h zzQHkgF}p>%=xTKr<_TRb+-x6sHp>bD3LKco*<{{t$HflU6*!_nUx^o5!~Mtk0vCA= z{nhEf(srZ>5U0l{esLP;A>OVX*3$+t6X4=9+oXEkhoc;aRMR(9%pZk*k|2+PSe+;sA7;|$hFTco7DZucstr`?ddVR z2^xA8W%q0tiG?{je}vV{ z)<8RDq8o?Kio$qm62?HQL~8Y{vbh1Mm$Noz6dFL zS6dTAO4y3p=T)#aO0X&Pf7gGf>kWDS2(m54GfXSgvSyNVTT5B#6q+8s5Qrxuu{l}D zVhdal1mhUz@{9un=>{saUq;@P@}f93;)FiS2tXJpK6L@;w-^JZu*QM~!TT7ZJ^iyQ)?}akQ62gDo2$a$yjYfj^Y~E&Aa!_HQz+DVe0=yfTT`&aSY?3vVcsljvr?{VEV0C_u8|O^}L^Fc; z2y+TQbU(>#Z~`g1Fa%9^`i1gJs**XT&;`|$4QW8b_XHE+=rz@cO3czDk>X#Fp*inO z`o#?6W|{=yl$tgV8*KgiN}VMZi<*urT+_UYqfNBp&6K1So?H6g;wPLph%HHeqlJI9ItbUr=|Q zocoZHtE=3k+2@;3or>IqZxmmG0yIf}QQGA*i(U8_ri)AdQdHwF=LN9~n#jz#ViBVsUm&Bx}AZjTn`fDTxSPa#rr(bmA$u0F$!rWL7^+g`tTrdi^F#V!9 z)?(~R+gC($kdYDQaWMungcF@Z#=Ec&KorQ#Ca;`oH&gCm6t!^trIrgnXfR&TZB;Mk z5U>hk^4K&rTk{M#TR*{HI9Ze=@zgn)w*~^N4i(o~lwQeXrawukFQ`S&W0~>znjDd@ zVdF`9eqj8;BpT`+8Lv1!&Oi+&!^c!arBD>h*0Bl{kld?-V6fx?^ zNlqlV)xuhk(2bKwI~3KdxFKNf^uizXeLR}S;l<7qdH<0=d)WP)Ct$E@g(ijbM&zqE zm(W4*v25JTlna}lj7X6Q>E=`uTk{dh%Bc=+sLIpHfTyn_;jlIyY$j^B z86Wxx(1(JNR2_H{%E+v(!uIkkRjG0q%3MK;XOTrYCKSUtzMO>OF*H!0Qn9L|VClkr z(>=(;P_zO-LpNiqaj@&T$HN}pdX%d0s%u`sGy{ik9MQbEi!rAZKR&QF8vcmb+kWIw zxT!fSm5#CWGSWoo3Cvy;S(FOSF0v7z&6&NE?LAup-TPU2UY2ARIFhart8jO|{wnMSvh?!Uyuf=}WqrPQ`X9zdilPEUTy5oETJ!ripA zv#UeVEW0R}2cTcEZz5>fM$oE*&cZmq>~rspt{bt?S^5?!(2o8+31De=B}MEzqOC03 zW-{J=P~FXmC6AeZum=i_bi{skmNKHSln8bZbIE={XzDT{s+Gm;9H0&XOKySFo1fY< z1SVoZD~EY#%+@9wj8+EmVbnlah(K{$4tH+q@NK+qG;pY}XyfW$+OfFEZl+b!c-m^W zYBAI^zrtGDA0T{uB@L12crC`qeb!T{y{qj{U{{fpF7+(MY literal 0 HcmV?d00001 diff --git a/bindings/cpp/configure b/bindings/cpp/configure index 0186597b2086e7d5debf1f8d8812e21bf87b8fbb..43113da025af398ff90dfdbfd381afe20bf895bd 100755 GIT binary patch delta 119750 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 From 933b05c331e65edc5c93dcc51fd3d93f5f4b8470 Mon Sep 17 00:00:00 2001 From: Ross Bencina Date: Sun, 12 May 2019 21:38:30 +1000 Subject: [PATCH 008/164] fix uninitialized dir variable in pa_linux_alsa.c GropeDevice() by removing it. pass NULL as parameter to ALSA functions instead. see ticket #263. --- src/hostapi/alsa/pa_linux_alsa.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/hostapi/alsa/pa_linux_alsa.c b/src/hostapi/alsa/pa_linux_alsa.c index 584cde8..b5bdd3a 100644 --- a/src/hostapi/alsa/pa_linux_alsa.c +++ b/src/hostapi/alsa/pa_linux_alsa.c @@ -842,7 +842,6 @@ static PaError GropeDevice( snd_pcm_t* pcm, int isPlug, StreamDirection mode, in double * defaultLowLatency, * defaultHighLatency, * defaultSampleRate = &devInfo->baseDeviceInfo.defaultSampleRate; double defaultSr = *defaultSampleRate; - int dir; assert( pcm ); @@ -920,7 +919,7 @@ static PaError GropeDevice( snd_pcm_t* pcm, int isPlug, StreamDirection mode, in alsaBufferFrames = 512; alsaPeriodFrames = 128; ENSURE_( alsa_snd_pcm_hw_params_set_buffer_size_near( pcm, hwParams, &alsaBufferFrames ), paUnanticipatedHostError ); - ENSURE_( alsa_snd_pcm_hw_params_set_period_size_near( pcm, hwParams, &alsaPeriodFrames, &dir ), paUnanticipatedHostError ); + ENSURE_( alsa_snd_pcm_hw_params_set_period_size_near( pcm, hwParams, &alsaPeriodFrames, NULL ), paUnanticipatedHostError ); *defaultLowLatency = (double) (alsaBufferFrames - alsaPeriodFrames) / defaultSr; /* Base the high latency case on values four times larger */ @@ -930,7 +929,7 @@ static PaError GropeDevice( snd_pcm_t* pcm, int isPlug, StreamDirection mode, in ENSURE_( alsa_snd_pcm_hw_params_any( pcm, hwParams ), paUnanticipatedHostError ); ENSURE_( SetApproximateSampleRate( pcm, hwParams, defaultSr ), paUnanticipatedHostError ); ENSURE_( alsa_snd_pcm_hw_params_set_buffer_size_near( pcm, hwParams, &alsaBufferFrames ), paUnanticipatedHostError ); - ENSURE_( alsa_snd_pcm_hw_params_set_period_size_near( pcm, hwParams, &alsaPeriodFrames, &dir ), paUnanticipatedHostError ); + ENSURE_( alsa_snd_pcm_hw_params_set_period_size_near( pcm, hwParams, &alsaPeriodFrames, NULL ), paUnanticipatedHostError ); *defaultHighLatency = (double) (alsaBufferFrames - alsaPeriodFrames) / defaultSr; *minChannels = (int)minChans; From f269bf93e6ccbfef5b1221e2c3839d84dd008138 Mon Sep 17 00:00:00 2001 From: Ross Bencina Date: Tue, 14 May 2019 07:36:24 +1000 Subject: [PATCH 009/164] follow up fix related to 933b05c331 (ticket #263 uninitialized dir variable): fix the three other places where dir parameter wasn't set prior to entry to a snd_pcm_*_get_* function. There is some ambiguity about (a) whether this is intentional (i.e. use the rounding dir returned by previous *_get_* call, the PA source code does not indicate), and (b) whether it is meaningful (i.e. whether *_get_* functions actually use the value upon input -- the ALSA docs are not clear. regarding (a): I don't think it's intentional, i think it was just oversight. In any case thr risk is low: the underlying values of period_size, periods_max, periods_min, are all integer and should not be rounded, get_rate_min/get_rate_max are used only for debug reporting (I've set them to 0,0 for a minimal change from the current code, but -1,1 makes more sense). --- src/hostapi/alsa/pa_linux_alsa.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/hostapi/alsa/pa_linux_alsa.c b/src/hostapi/alsa/pa_linux_alsa.c index 584cde8..e600821 100644 --- a/src/hostapi/alsa/pa_linux_alsa.c +++ b/src/hostapi/alsa/pa_linux_alsa.c @@ -323,8 +323,10 @@ int _PA_LOCAL_IMPL(snd_pcm_hw_params_get_buffer_size_max) (const snd_pcm_hw_para snd_pcm_uframes_t pmax = 0; unsigned int pcnt = 0; + dir = 0; if(( ret = _PA_LOCAL_IMPL(snd_pcm_hw_params_get_period_size_max)(params, &pmax, &dir) ) < 0 ) return ret; + dir = 0; if(( ret = _PA_LOCAL_IMPL(snd_pcm_hw_params_get_periods_max)(params, &pcnt, &dir) ) < 0 ) return ret; @@ -2324,6 +2326,7 @@ static PaError PaAlsaStreamComponent_DetermineFramesPerBuffer( PaAlsaStreamCompo /* It may be that the device only supports 2 periods for instance */ dir = 0; ENSURE_( alsa_snd_pcm_hw_params_get_periods_min( hwParams, &minPeriods, &dir ), paUnanticipatedHostError ); + dir = 0; ENSURE_( alsa_snd_pcm_hw_params_get_periods_max( hwParams, &maxPeriods, &dir ), paUnanticipatedHostError ); assert( maxPeriods > 1 ); @@ -3209,6 +3212,7 @@ error: unsigned int _min = 0, _max = 0; int _dir = 0; ENSURE_( alsa_snd_pcm_hw_params_get_rate_min( hwParams, &_min, &_dir ), paUnanticipatedHostError ); + _dir = 0; ENSURE_( alsa_snd_pcm_hw_params_get_rate_max( hwParams, &_max, &_dir ), paUnanticipatedHostError ); PA_DEBUG(( "%s: SR min = %u, max = %u, req = %u\n", __FUNCTION__, _min, _max, reqRate )); } From 799a6834a58592eadc5712cba73b35956dc51579 Mon Sep 17 00:00:00 2001 From: dmitrykos Date: Thu, 26 Mar 2020 20:05:53 +0200 Subject: [PATCH 010/164] wasapi: Fixed OSVERSIONINFO initialization (patch provided by Carlo Bramini). --- src/hostapi/wasapi/pa_win_wasapi.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hostapi/wasapi/pa_win_wasapi.c b/src/hostapi/wasapi/pa_win_wasapi.c index 1d8f200..f4b3186 100644 --- a/src/hostapi/wasapi/pa_win_wasapi.c +++ b/src/hostapi/wasapi/pa_win_wasapi.c @@ -1081,7 +1081,7 @@ static EWindowsVersion GetWindowsVersion() // by GetVersion API) if ((fnRtlGetVersion = (LPFN_RTLGETVERSION)GetProcAddress(GetModuleHandleA("ntdll"), "RtlGetVersion")) != NULL) { - OSVERSIONINFOW ver = { sizeof(OSVERSIONINFOW), 0, 0, 0, {0} }; + OSVERSIONINFOW ver = { sizeof(OSVERSIONINFOW), 0, 0, 0, 0, {0} }; PRINT(("WASAPI: getting Windows version with RtlGetVersion()\n")); From 7273b8de2755902aa1123fd15a9e53b3ca469159 Mon Sep 17 00:00:00 2001 From: Phil Burk Date: Wed, 23 Sep 2020 20:36:04 -0700 Subject: [PATCH 011/164] Update and rename README.txt to README.md Use markdown --- README.txt => README.md | 60 +++++++++-------------------------------- 1 file changed, 12 insertions(+), 48 deletions(-) rename README.txt => README.md (54%) diff --git a/README.txt b/README.md similarity index 54% rename from README.txt rename to README.md index 2113827..fde4556 100644 --- a/README.txt +++ b/README.md @@ -1,42 +1,4 @@ -README for PortAudio - -/* - * PortAudio Portable Real-Time Audio Library - * Latest Version at: http://www.portaudio.com - * - * Copyright (c) 1999-2008 Phil Burk and 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. - * - * 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. - */ - -/* - * The text above constitutes the entire PortAudio license; however, - * the PortAudio community also makes the following non-binding requests: - * - * 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. It is also - * requested that these non-binding requests be included along with the - * license above. - */ - +# PortAudio - portable audio I/O library PortAudio is a portable audio I/O library designed for cross-platform support of audio. It uses either a callback mechanism to request audio @@ -45,12 +7,12 @@ native audio subsystem and the client. Audio can be processed in various formats, including 32 bit floating point, and will be converted to the native format internally. -Documentation: - Documentation is available in "/doc/html/index.html" - Also see "src/common/portaudio.h" for API spec. - Also see http://www.portaudio.com/docs/ - And see the "test/" directory for many examples of usage - (we suggest "test/patest_saw.c" for an example) +## Documentation: + +* Documentation is available in "/doc/html/index.html" +* Also see "src/common/portaudio.h" for API spec. +* Also see http://www.portaudio.com/docs/ +* And see the "test/" directory for many examples of usage. (we suggest "test/patest_saw.c" for an example) For information on compiling programs with PortAudio, please see the tutorial at: @@ -60,8 +22,8 @@ tutorial at: We have an active mailing list for user and developer discussions. Please feel free to join. See http://www.portaudio.com for details. +## Important Files and Folders: -Important Files and Folders: include/portaudio.h = header file for PortAudio API. Specifies API. src/common/ = platform independant code, host independant code for all implementations. @@ -69,7 +31,8 @@ Important Files and Folders: src/hostapi = implementations for different host apis -Host API Implementations: +### Host API Implementations: + src/hostapi/alsa = Advanced Linux Sound Architecture (ALSA) src/hostapi/asihpi = AudioScience HPI src/hostapi/asio = ASIO for Windows and Macintosh @@ -82,7 +45,8 @@ Host API Implementations: src/hostapi/wmme = Windows MultiMedia Extensions (MME) -Test Programs: +### Test Programs: + test/pa_fuzz.c = guitar fuzz box test/pa_devs.c = print a list of available devices test/pa_minlat.c = determine minimum latency for your machine From ffa556a4750707518f55a906bf856e6d984a0ba9 Mon Sep 17 00:00:00 2001 From: Ross Bencina Date: Thu, 24 Sep 2020 14:11:42 +1000 Subject: [PATCH 012/164] Fix doc and examples references in README.md --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index fde4556..919ab31 100644 --- a/README.md +++ b/README.md @@ -9,10 +9,10 @@ native format internally. ## Documentation: -* Documentation is available in "/doc/html/index.html" -* Also see "src/common/portaudio.h" for API spec. -* Also see http://www.portaudio.com/docs/ -* And see the "test/" directory for many examples of usage. (we suggest "test/patest_saw.c" for an example) +* Documentation is available at http://www.portaudio.com/docs/ +* Or at `/doc/html/index.html` after running Doxygen. +* Also see `src/common/portaudio.h` for the API spec. +* And see the `examples/` and `test/` directories for many examples of usage. (We suggest `examples/paex_saw.c` for an example.) For information on compiling programs with PortAudio, please see the tutorial at: From e1443bae258f16c69b22b5054f275676f76a3873 Mon Sep 17 00:00:00 2001 From: Ingo Bauersachs Date: Sun, 27 Sep 2020 00:02:53 +0200 Subject: [PATCH 013/164] Fix CMake build after renaming readme --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 1024016..4fbb3a8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -441,7 +441,7 @@ IF(NOT PA_OUTPUT_OSX_FRAMEWORK AND NOT PA_DISABLE_INSTALL) VERSION ${PA_VERSION} COMPATIBILITY SameMajorVersion) CONFIGURE_FILE(cmake_support/portaudio-2.0.pc.in ${CMAKE_CURRENT_BINARY_DIR}/portaudio-2.0.pc @ONLY) - INSTALL(FILES README.txt DESTINATION share/doc/portaudio) + INSTALL(FILES README.md DESTINATION share/doc/portaudio) INSTALL(FILES LICENSE.txt DESTINATION share/doc/portaudio) INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/portaudio-2.0.pc DESTINATION lib/pkgconfig) INSTALL(FILES ${PA_PUBLIC_INCLUDES} DESTINATION include) From 9ebe293dc5e9b929852acdbdaa310caee1bdc3e6 Mon Sep 17 00:00:00 2001 From: Svein Seldal Date: Sun, 27 Sep 2020 18:28:19 +0200 Subject: [PATCH 014/164] Implement fix for glitching WASAPI playback #303 --- src/hostapi/wasapi/pa_win_wasapi.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/hostapi/wasapi/pa_win_wasapi.c b/src/hostapi/wasapi/pa_win_wasapi.c index f4b3186..7354f8a 100644 --- a/src/hostapi/wasapi/pa_win_wasapi.c +++ b/src/hostapi/wasapi/pa_win_wasapi.c @@ -5764,6 +5764,7 @@ PA_THREAD_FUNC ProcThreadPoll(void *param) // Calculate timeout for next polling attempt. sleep_ms_in = GetFramesSleepTime(stream->in.framesPerHostCallback / WASAPI_PACKETS_PER_INPUT_BUFFER, stream->in.wavex.Format.nSamplesPerSec); sleep_ms_out = GetFramesSleepTime(stream->out.framesPerBuffer, stream->out.wavex.Format.nSamplesPerSec); + sleep_ms_out /= 2; // wait only for half of the buffer // WASAPI Input packets tend to expire very easily, let's limit sleep time to 2 milliseconds // for all cases. Please propose better solution if any. @@ -5776,6 +5777,7 @@ PA_THREAD_FUNC ProcThreadPoll(void *param) { //sleep_ms_in = GetFramesSleepTime((stream->bufferProcessor.framesPerUserBuffer ? stream->bufferProcessor.framesPerUserBuffer : stream->in.params.frames_per_buffer), stream->in.wavex.Format.nSamplesPerSec); sleep_ms_out = GetFramesSleepTime((stream->bufferProcessor.framesPerUserBuffer ? stream->bufferProcessor.framesPerUserBuffer : stream->out.params.frames_per_buffer), stream->out.wavex.Format.nSamplesPerSec); + sleep_ms_out /= 2; // wait only for half of the buffer } // Choose smallest @@ -5789,6 +5791,7 @@ PA_THREAD_FUNC ProcThreadPoll(void *param) { sleep_ms_in = GetFramesSleepTimeMicroseconds(stream->in.framesPerHostCallback / WASAPI_PACKETS_PER_INPUT_BUFFER, stream->in.wavex.Format.nSamplesPerSec); sleep_ms_out = GetFramesSleepTimeMicroseconds((stream->bufferProcessor.framesPerUserBuffer ? stream->bufferProcessor.framesPerUserBuffer : stream->out.params.frames_per_buffer), stream->out.wavex.Format.nSamplesPerSec); + sleep_ms_out /= 2; // wait only for half of the buffer // Choose smallest if ((sleep_ms_in != 0) && (sleep_ms_out != 0)) From df4e0bf4052eddbe4a0e09ca751c18597df852f9 Mon Sep 17 00:00:00 2001 From: Phil Burk Date: Thu, 24 Sep 2020 10:55:57 -0700 Subject: [PATCH 015/164] Create c-cpp.yml Add continuous integration build test. --- .github/workflows/c-cpp.yml | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 .github/workflows/c-cpp.yml diff --git a/.github/workflows/c-cpp.yml b/.github/workflows/c-cpp.yml new file mode 100644 index 0000000..10ecb69 --- /dev/null +++ b/.github/workflows/c-cpp.yml @@ -0,0 +1,19 @@ +name: C/C++ CI + +on: + push: + branches: [ master ] + pull_request: + branches: [ master ] + +jobs: + build: + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + - name: configure + run: ./configure + - name: make + run: make From 2a1b7d4ad6546b1f6075226001d7d99c445fb935 Mon Sep 17 00:00:00 2001 From: Phil Burk Date: Mon, 28 Sep 2020 07:40:34 -0700 Subject: [PATCH 016/164] Add bug report template --- .github/ISSUE_TEMPLATE/bug_report.md | 34 ++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/bug_report.md diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 0000000..7870a2e --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,34 @@ +--- +name: Bug report +about: Create a report to help us improve +title: '' +labels: '' +assignees: '' + +--- + +(Please use the mailing list for general discussion. This is only for actual bugs.) + +**Describe the bug** +A clear and concise description of what the bug is. + +**To Reproduce** +Steps to reproduce the behavior. Include code if applicable. +1. + +**Expected behavior** +A clear and concise description of what you expected to happen. + +**Actual behavior** +What actually happened. +Include a recording if helpful. +Error messages or logs longer than a page should be attached as a .txt file. + +**Desktop (please complete the following information):** + - OS: [e.g. iOS] + - OS Version [e.g. 22] + - PortAudio: stable or current + - If Windows, which API: + +**Additional context** +Add any other context about the problem here. From 8119355f76247f95883ae0940b579877e82de17d Mon Sep 17 00:00:00 2001 From: Ross Bencina Date: Thu, 1 Oct 2020 10:38:48 +1000 Subject: [PATCH 017/164] Update bug_report.md with more details --- .github/ISSUE_TEMPLATE/bug_report.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 7870a2e..794c5e9 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -7,7 +7,7 @@ assignees: '' --- -(Please use the mailing list for general discussion. This is only for actual bugs.) +(Please use the mailing list for support requests and general discussion. This is only for actual bugs.) **Describe the bug** A clear and concise description of what the bug is. @@ -25,10 +25,10 @@ Include a recording if helpful. Error messages or logs longer than a page should be attached as a .txt file. **Desktop (please complete the following information):** - - OS: [e.g. iOS] + - OS: [e.g. Mac OS] - OS Version [e.g. 22] - - PortAudio: stable or current - - If Windows, which API: + - PortAudio version: stable, nightly snapshot (which?), current (please give date and/or Git hash): + - If Windows or Linux, which Host API (e.g. WASAPI): **Additional context** Add any other context about the problem here. From 519364b9a59184a2b55def8141a692a439dbdb21 Mon Sep 17 00:00:00 2001 From: Tatsuya Matsumoto Date: Sat, 3 Oct 2020 22:19:10 +0900 Subject: [PATCH 018/164] Fix a broken link (Tutorial Start) in README.md. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 919ab31..74cfe6f 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ native format internally. For information on compiling programs with PortAudio, please see the tutorial at: - http://portaudio.com/trac/wiki/TutorialDir/TutorialStart + http://portaudio.com/docs/v19-doxydocs/tutorial_start.html We have an active mailing list for user and developer discussions. Please feel free to join. See http://www.portaudio.com for details. From 697fcddce5e9f1307711489f5b47b15c139c5e12 Mon Sep 17 00:00:00 2001 From: dmitrykos Date: Wed, 30 Sep 2020 12:55:28 +0300 Subject: [PATCH 019/164] wasapi: Improve stability of playback in Polling Shared mode with a low host latency requsted (22 ms): - Implement workaround for system timer coarse granularity causing underruns by using timeBeginPeriod/timeEndPeriod APIs inside the Event and Poll thread handlers. - Update next sleep time of the Poll rendering loop dynamically depending on time taken for processing/rendering of audio data into the available host buffer to avoid underruns and fit processing time into periodic polling time slots. - Add support for time slots logging in Poll mode if PA_WASAPI_LOG_TIME_SLOTS is defined. Fixed audible glitches by preloading the whole host buffer before stream is started. - Fix audible glitches on stream start by preloading the whole host buffer before stream is started. --- src/hostapi/wasapi/pa_win_wasapi.c | 601 +++++++++++++++-------------- 1 file changed, 317 insertions(+), 284 deletions(-) diff --git a/src/hostapi/wasapi/pa_win_wasapi.c b/src/hostapi/wasapi/pa_win_wasapi.c index 7354f8a..17846bd 100644 --- a/src/hostapi/wasapi/pa_win_wasapi.c +++ b/src/hostapi/wasapi/pa_win_wasapi.c @@ -61,6 +61,9 @@ // not change the Event mode to Polling and use the mode which user provided. //#define PA_WASAPI_FORCE_POLL_IF_LARGE_BUFFER +//! Poll mode time slots logging. +//#define PA_WASAPI_LOG_TIME_SLOTS + // WinRT #if defined(WINAPI_FAMILY) && (WINAPI_FAMILY == WINAPI_FAMILY_APP) #define PA_WINRT @@ -741,6 +744,7 @@ typedef struct ThreadIdleScheduler UINT32 m_resolution; //!< resolution in number of milliseconds } ThreadIdleScheduler; + //! Setup scheduler. static void ThreadIdleScheduler_Setup(ThreadIdleScheduler *sched, UINT32 resolution, UINT32 microseconds) { @@ -754,11 +758,12 @@ static void ThreadIdleScheduler_Setup(ThreadIdleScheduler *sched, UINT32 resolut sched->m_resolution = resolution; sched->m_next_sleep = (resolution * 1000) / microseconds; } + //! Iterate and check if can sleep. -static UINT32 ThreadIdleScheduler_NextSleep(ThreadIdleScheduler *sched) +static inline UINT32 ThreadIdleScheduler_NextSleep(ThreadIdleScheduler *sched) { // advance and check if thread can sleep - if (++ sched->m_i == sched->m_next_sleep) + if (++sched->m_i == sched->m_next_sleep) { sched->m_i = 0; return sched->m_resolution; @@ -766,6 +771,81 @@ static UINT32 ThreadIdleScheduler_NextSleep(ThreadIdleScheduler *sched) return 0; } +// ------------------------------------------------------------------------------------------ +typedef struct _SystemTimer +{ + UINT32 granularity; + +} SystemTimer; +static LARGE_INTEGER g_SystemTimerFrequency; +static BOOL g_SystemTimerUseQpc = FALSE; + +//! Set granularity of the system timer. +static BOOL SystemTimer_SetGranularity(SystemTimer *timer, UINT32 granularity) +{ +#ifndef PA_WINRT + TIMECAPS caps; + + timer->granularity = granularity; + + if (timeGetDevCaps(&caps, sizeof(caps)) == MMSYSERR_NOERROR) + { + if (timer->granularity < caps.wPeriodMin) + timer->granularity = caps.wPeriodMin; + } + + if (timeBeginPeriod(timer->granularity) != TIMERR_NOERROR) + { + PRINT(("SetSystemTimer: timeBeginPeriod(1) failed!\n")); + + timer->granularity = 0; + return FALSE; + } +#endif + + return TRUE; +} + +//! Restore granularity of the system timer. +static void SystemTimer_RestoreGranularity(SystemTimer *timer) +{ +#ifndef PA_WINRT + if (timer->granularity != 0) + { + if (timeEndPeriod(timer->granularity) != TIMERR_NOERROR) + { + PRINT(("RestoreSystemTimer: timeEndPeriod(1) failed!\n")); + } + } +#endif +} + +//! Initialize high-resolution time getter. +static void SystemTimer_InitializeTimeGetter() +{ + g_SystemTimerUseQpc = QueryPerformanceFrequency(&g_SystemTimerFrequency); +} + +//! Get high-resolution time in milliseconds (using QPC by default). +static inline LONGLONG SystemTimer_GetTime(SystemTimer *timer) +{ + // QPC: https://docs.microsoft.com/en-us/windows/win32/sysinfo/acquiring-high-resolution-time-stamps + if (g_SystemTimerUseQpc) + { + LARGE_INTEGER now; + QueryPerformanceCounter(&now); + return (now.QuadPart * 1000LL) / g_SystemTimerFrequency.QuadPart; + } + else + { + #ifdef PA_WINRT + return GetTickCount64(); + #else + return timeGetTime(); + #endif + } +} + // ------------------------------------------------------------------------------------------ /*static double nano100ToMillis(REFERENCE_TIME ref) { @@ -2140,6 +2220,9 @@ PaError PaWasapi_Initialize( PaUtilHostApiRepresentation **hostApi, PaHostApiInd // Detect if platform workaround is required paWasapi->useWOW64Workaround = UseWOW64Workaround(); + // Initialize time getter + SystemTimer_InitializeTimeGetter(); + PaUtil_InitializeStreamInterface( &paWasapi->callbackStreamInterface, CloseStream, StartStream, StopStream, AbortStream, IsStreamStopped, IsStreamActive, GetStreamTime, GetStreamCpuLoad, @@ -5507,19 +5590,9 @@ void _StreamOnStop(PaWasapiStream *stream) } // ------------------------------------------------------------------------------------------ -PA_THREAD_FUNC ProcThreadEvent(void *param) +static BOOL PrepareComPointers(PaWasapiStream *stream, BOOL *threadComInitialized) { - PaWasapiHostProcessor processor[S_COUNT]; HRESULT hr; - DWORD dwResult; - PaWasapiStream *stream = (PaWasapiStream *)param; - PaWasapiHostProcessor defaultProcessor; - BOOL set_event[S_COUNT] = { FALSE, FALSE }; - BOOL bWaitAllEvents = FALSE; - BOOL bThreadComInitialized = FALSE; - - // Notify: state - NotifyStateChanged(stream, paWasapiStreamStateThreadPrepare, ERROR_SUCCESS); /* If COM is already initialized CoInitialize will either return @@ -5532,22 +5605,61 @@ PA_THREAD_FUNC ProcThreadEvent(void *param) if (FAILED(hr) && (hr != RPC_E_CHANGED_MODE)) { PRINT(("WASAPI: failed ProcThreadEvent CoInitialize")); - return (UINT32)paUnanticipatedHostError; + return FALSE; } if (hr != RPC_E_CHANGED_MODE) - bThreadComInitialized = TRUE; + *threadComInitialized = TRUE; // Unmarshal stream pointers for safe COM operation hr = UnmarshalStreamComPointers(stream); - if (hr != S_OK) { - PRINT(("Error unmarshaling stream COM pointers. HRESULT: %i\n", hr)); - goto thread_end; + if (hr != S_OK) + { + PRINT(("WASAPI: Error unmarshaling stream COM pointers. HRESULT: %i\n", hr)); + CoUninitialize(); + return FALSE; } + return TRUE; +} + +// ------------------------------------------------------------------------------------------ +static void FinishComPointers(PaWasapiStream *stream, BOOL threadComInitialized) +{ + // Release unmarshaled COM pointers + ReleaseUnmarshaledComPointers(stream); + + // Cleanup COM for this thread + if (threadComInitialized == TRUE) + CoUninitialize(); +} + +// ------------------------------------------------------------------------------------------ +PA_THREAD_FUNC ProcThreadEvent(void *param) +{ + PaWasapiHostProcessor processor[S_COUNT]; + HRESULT hr; + DWORD dwResult; + PaWasapiStream *stream = (PaWasapiStream *)param; + PaWasapiHostProcessor defaultProcessor; + BOOL setEvent[S_COUNT] = { FALSE, FALSE }; + BOOL waitAllEvents = FALSE; + BOOL threadComInitialized = FALSE; + SystemTimer timer; + + // Notify: state + NotifyStateChanged(stream, paWasapiStreamStateThreadPrepare, ERROR_SUCCESS); + + // Prepare COM pointers + if (!PrepareComPointers(stream, &threadComInitialized)) + return (UINT32)paUnanticipatedHostError; + + // Request fine (1 ms) granularity of the system timer functions for precise operation of waitable timers + SystemTimer_SetGranularity(&timer, 1); + // Waiting on all events in case of Full-Duplex/Exclusive mode. if ((stream->in.clientProc != NULL) && (stream->out.clientProc != NULL)) { - bWaitAllEvents = (stream->in.shareMode == AUDCLNT_SHAREMODE_EXCLUSIVE) && + waitAllEvents = (stream->in.shareMode == AUDCLNT_SHAREMODE_EXCLUSIVE) && (stream->out.shareMode == AUDCLNT_SHAREMODE_EXCLUSIVE); } @@ -5564,12 +5676,12 @@ PA_THREAD_FUNC ProcThreadEvent(void *param) if (stream->event[S_OUTPUT] == NULL) { stream->event[S_OUTPUT] = CreateEvent(NULL, FALSE, FALSE, NULL); - set_event[S_OUTPUT] = TRUE; + setEvent[S_OUTPUT] = TRUE; } if (stream->event[S_INPUT] == NULL) { stream->event[S_INPUT] = CreateEvent(NULL, FALSE, FALSE, NULL); - set_event[S_INPUT] = TRUE; + setEvent[S_INPUT] = TRUE; } if ((stream->event[S_OUTPUT] == NULL) || (stream->event[S_INPUT] == NULL)) { @@ -5581,7 +5693,7 @@ PA_THREAD_FUNC ProcThreadEvent(void *param) if (stream->in.clientProc) { // Create & set handle - if (set_event[S_INPUT]) + if (setEvent[S_INPUT]) { if ((hr = IAudioClient_SetEventHandle(stream->in.clientProc, stream->event[S_INPUT])) != S_OK) { @@ -5602,7 +5714,7 @@ PA_THREAD_FUNC ProcThreadEvent(void *param) if (stream->out.clientProc) { // Create & set handle - if (set_event[S_OUTPUT]) + if (setEvent[S_OUTPUT]) { if ((hr = IAudioClient_SetEventHandle(stream->out.clientProc, stream->event[S_OUTPUT])) != S_OK) { @@ -5640,7 +5752,7 @@ PA_THREAD_FUNC ProcThreadEvent(void *param) for (;;) { // 10 sec timeout (on timeout stream will auto-stop when processed by WAIT_TIMEOUT case) - dwResult = WaitForMultipleObjects(S_COUNT, stream->event, bWaitAllEvents, 10*1000); + dwResult = WaitForMultipleObjects(S_COUNT, stream->event, waitAllEvents, 10*1000); // Check for close event (after wait for buffers to avoid any calls to user // callback when hCloseRequest was set) @@ -5691,11 +5803,10 @@ thread_end: _StreamOnStop(stream); // Release unmarshaled COM pointers - ReleaseUnmarshaledComPointers(stream); + FinishComPointers(stream, threadComInitialized); - // Cleanup COM for this thread - if (bThreadComInitialized == TRUE) - CoUninitialize(); + // Restore system timer granularity + SystemTimer_RestoreGranularity(&timer); // Notify: not running stream->running = FALSE; @@ -5717,6 +5828,105 @@ thread_error: goto thread_end; } +// ------------------------------------------------------------------------------------------ +static UINT32 GetSleepTime(PaWasapiStream *stream, UINT32 sleepTimeIn, UINT32 sleepTimeOut, UINT32 userFramesOut) +{ + UINT32 sleepTime; + + // According to the issue [https://github.com/PortAudio/portaudio/issues/303] glitches may occur when user frames + // equal to 1/2 of the host buffer frames, therefore the emperical workaround for this problem is to lower + // the sleep time by 2 + if (userFramesOut != 0) + { + UINT32 chunks = stream->out.framesPerHostCallback / userFramesOut; + if (chunks <= 2) + { + sleepTimeOut /= 2; + PRINT(("WASAPI: underrun workaround, sleep [%d] ms - 1/2 of the user buffer[%d] | host buffer[%d]\n", sleepTimeOut, userFramesOut, stream->out.framesPerHostCallback)); + } + } + + // Choose the smallest + if ((sleepTimeIn != 0) && (sleepTimeOut != 0)) + sleepTime = min(sleepTimeIn, sleepTimeOut); + else + sleepTime = (sleepTimeIn ? sleepTimeIn : sleepTimeOut); + + return sleepTime; +} + +// ------------------------------------------------------------------------------------------ +static UINT32 ConfigureLoopSleepTimeAndScheduler(PaWasapiStream *stream, ThreadIdleScheduler *scheduler) +{ + UINT32 sleepTime, sleepTimeIn, sleepTimeOut; + UINT32 userFramesIn = stream->in.framesPerHostCallback / WASAPI_PACKETS_PER_INPUT_BUFFER; + UINT32 userFramesOut = stream->out.framesPerBuffer; + + // Adjust polling time for non-paUtilFixedHostBufferSize, input stream is not adjustable as it is being + // polled according its packet length + if (stream->bufferMode != paUtilFixedHostBufferSize) + { + userFramesOut = (stream->bufferProcessor.framesPerUserBuffer ? stream->bufferProcessor.framesPerUserBuffer : + stream->out.params.frames_per_buffer); + } + + // Calculate timeout for the next polling attempt + sleepTimeIn = GetFramesSleepTime(userFramesIn, stream->in.wavex.Format.nSamplesPerSec); + sleepTimeOut = GetFramesSleepTime(userFramesOut, stream->out.wavex.Format.nSamplesPerSec); + + // WASAPI input packets tend to expire very easily, let's limit sleep time to 2 milliseconds + // for all cases. Please propose better solution if any + if (sleepTimeIn > 2) + sleepTimeIn = 2; + + sleepTime = GetSleepTime(stream, sleepTimeIn, sleepTimeOut, userFramesOut); + + // Make sure not 0, othervise use ThreadIdleScheduler to bounce between [0, 1] ms to avoid too busy loop + if (sleepTime == 0) + { + sleepTimeIn = GetFramesSleepTimeMicroseconds(userFramesIn, stream->in.wavex.Format.nSamplesPerSec); + sleepTimeOut = GetFramesSleepTimeMicroseconds(userFramesOut, stream->out.wavex.Format.nSamplesPerSec); + + sleepTime = GetSleepTime(stream, sleepTimeIn, sleepTimeOut, userFramesOut); + + // Setup thread sleep scheduler + ThreadIdleScheduler_Setup(scheduler, 1, sleepTime/* microseconds here */); + sleepTime = 0; + } + + return sleepTime; +} + +// ------------------------------------------------------------------------------------------ +static inline INT32 GetNextSleepTime(SystemTimer *timer, ThreadIdleScheduler *scheduler, LONGLONG startTime, + UINT32 sleepTime) +{ + INT32 nextSleepTime; + + // Get next sleep time + if (sleepTime == 0) + nextSleepTime = ThreadIdleScheduler_NextSleep(scheduler); + else + nextSleepTime = sleepTime; + + // Adjust next sleep time dynamically depending on how much time was spent in ProcessOutputBuffer/ProcessInputBuffer + // therefore periodicity will not jitter or be increased for the amount of time spent in processing; + // example when sleepTime is 10 ms where [] is polling time slot, {} processing time slot: + // + // [9],{2},[8],{1},[9],{1},[9],{3},[7],{2},[8],{3},[7],{2},[8],{2},[8],{3},[7],{2},[8],... + // + INT32 procTime = (INT32)(SystemTimer_GetTime(timer) - startTime); + nextSleepTime -= procTime; + if (nextSleepTime < 0) + nextSleepTime = 0; + +#ifdef PA_WASAPI_LOG_TIME_SLOTS + printf("{%d},", procTime); +#endif + + return nextSleepTime; +} + // ------------------------------------------------------------------------------------------ PA_THREAD_FUNC ProcThreadPoll(void *param) { @@ -5726,83 +5936,27 @@ PA_THREAD_FUNC ProcThreadPoll(void *param) PaWasapiHostProcessor defaultProcessor; INT32 i; ThreadIdleScheduler scheduler; - - // Calculate the actual duration of the allocated buffer. - DWORD sleep_ms = 0; - DWORD sleep_ms_in; - DWORD sleep_ms_out; - - BOOL bThreadComInitialized = FALSE; + SystemTimer timer; + LONGLONG startTime; + UINT32 sleepTime; + INT32 nextSleepTime = 0; //! Do first loop without waiting as time could be spent when calling other APIs before ProcessXXXBuffer. + BOOL threadComInitialized = FALSE; +#ifdef PA_WASAPI_LOG_TIME_SLOTS + LONGLONG startWaitTime; +#endif // Notify: state NotifyStateChanged(stream, paWasapiStreamStateThreadPrepare, ERROR_SUCCESS); - /* - If COM is already initialized CoInitialize will either return - FALSE, or RPC_E_CHANGED_MODE if it was initialized in a different - threading mode. In either case we shouldn't consider it an error - but we need to be careful to not call CoUninitialize() if - RPC_E_CHANGED_MODE was returned. - */ - hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED); - if (FAILED(hr) && (hr != RPC_E_CHANGED_MODE)) - { - PRINT(("WASAPI: failed ProcThreadPoll CoInitialize")); + // Prepare COM pointers + if (!PrepareComPointers(stream, &threadComInitialized)) return (UINT32)paUnanticipatedHostError; - } - if (hr != RPC_E_CHANGED_MODE) - bThreadComInitialized = TRUE; - // Unmarshal stream pointers for safe COM operation - hr = UnmarshalStreamComPointers(stream); - if (hr != S_OK) - { - PRINT(("Error unmarshaling stream COM pointers. HRESULT: %i\n", hr)); - return 0; - } + // Request fine (1 ms) granularity of the system timer functions to guarantee correct logic around WaitForSingleObject + SystemTimer_SetGranularity(&timer, 1); - // Calculate timeout for next polling attempt. - sleep_ms_in = GetFramesSleepTime(stream->in.framesPerHostCallback / WASAPI_PACKETS_PER_INPUT_BUFFER, stream->in.wavex.Format.nSamplesPerSec); - sleep_ms_out = GetFramesSleepTime(stream->out.framesPerBuffer, stream->out.wavex.Format.nSamplesPerSec); - sleep_ms_out /= 2; // wait only for half of the buffer - - // WASAPI Input packets tend to expire very easily, let's limit sleep time to 2 milliseconds - // for all cases. Please propose better solution if any. - if (sleep_ms_in > 2) - sleep_ms_in = 2; - - // Adjust polling time for non-paUtilFixedHostBufferSize. Input stream is not adjustable as it is being - // polled according its packet length. - if (stream->bufferMode != paUtilFixedHostBufferSize) - { - //sleep_ms_in = GetFramesSleepTime((stream->bufferProcessor.framesPerUserBuffer ? stream->bufferProcessor.framesPerUserBuffer : stream->in.params.frames_per_buffer), stream->in.wavex.Format.nSamplesPerSec); - sleep_ms_out = GetFramesSleepTime((stream->bufferProcessor.framesPerUserBuffer ? stream->bufferProcessor.framesPerUserBuffer : stream->out.params.frames_per_buffer), stream->out.wavex.Format.nSamplesPerSec); - sleep_ms_out /= 2; // wait only for half of the buffer - } - - // Choose smallest - if ((sleep_ms_in != 0) && (sleep_ms_out != 0)) - sleep_ms = min(sleep_ms_in, sleep_ms_out); - else - sleep_ms = (sleep_ms_in ? sleep_ms_in : sleep_ms_out); - - // Make sure not 0, othervise use ThreadIdleScheduler - if (sleep_ms == 0) - { - sleep_ms_in = GetFramesSleepTimeMicroseconds(stream->in.framesPerHostCallback / WASAPI_PACKETS_PER_INPUT_BUFFER, stream->in.wavex.Format.nSamplesPerSec); - sleep_ms_out = GetFramesSleepTimeMicroseconds((stream->bufferProcessor.framesPerUserBuffer ? stream->bufferProcessor.framesPerUserBuffer : stream->out.params.frames_per_buffer), stream->out.wavex.Format.nSamplesPerSec); - sleep_ms_out /= 2; // wait only for half of the buffer - - // Choose smallest - if ((sleep_ms_in != 0) && (sleep_ms_out != 0)) - sleep_ms = min(sleep_ms_in, sleep_ms_out); - else - sleep_ms = (sleep_ms_in ? sleep_ms_in : sleep_ms_out); - - // Setup thread sleep scheduler - ThreadIdleScheduler_Setup(&scheduler, 1, sleep_ms/* microseconds here */); - sleep_ms = 0; - } + // Claculate sleep time of the processing loop (inside WaitForSingleObject) + sleepTime = ConfigureLoopSleepTimeAndScheduler(stream, &scheduler); // Setup data processors defaultProcessor.processor = WaspiHostProcessingLoop; @@ -5832,17 +5986,20 @@ PA_THREAD_FUNC ProcThreadPoll(void *param) { UINT32 frames = 0; if ((hr = _PollGetOutputFramesAvailable(stream, &frames)) == S_OK) - { + { if (stream->bufferMode == paUtilFixedHostBufferSize) { - if (frames >= stream->out.framesPerBuffer) + // It is important to preload whole host buffer to avoid underruns/glitches when stream is started, + // for more details see the discussion: https://github.com/PortAudio/portaudio/issues/303 + while (frames >= stream->out.framesPerBuffer) { - frames = stream->out.framesPerBuffer; - - if ((hr = ProcessOutputBuffer(stream, processor, frames)) != S_OK) + if ((hr = ProcessOutputBuffer(stream, processor, stream->out.framesPerBuffer)) != S_OK) { LogHostError(hr); // not fatal, just log + break; } + + frames -= stream->out.framesPerBuffer; } } else @@ -5862,8 +6019,8 @@ PA_THREAD_FUNC ProcThreadPoll(void *param) LogHostError(hr); // not fatal, just log } } - } - else + } + else { LogHostError(hr); // not fatal, just log } @@ -5886,16 +6043,20 @@ PA_THREAD_FUNC ProcThreadPoll(void *param) // Notify: state NotifyStateChanged(stream, paWasapiStreamStateThreadStart, ERROR_SUCCESS); +#ifdef PA_WASAPI_LOG_TIME_SLOTS + startWaitTime = SystemTimer_GetTime(&timer); +#endif + if (!PA_WASAPI__IS_FULLDUPLEX(stream)) { - UINT32 next_sleep = sleep_ms; - // Processing Loop - while (WaitForSingleObject(stream->hCloseRequest, next_sleep) == WAIT_TIMEOUT) + while (WaitForSingleObject(stream->hCloseRequest, nextSleepTime) == WAIT_TIMEOUT) { - // Get next sleep time - if (sleep_ms == 0) - next_sleep = ThreadIdleScheduler_NextSleep(&scheduler); + startTime = SystemTimer_GetTime(&timer); + + #ifdef PA_WASAPI_LOG_TIME_SLOTS + printf("[%d|%d],", nextSleepTime, (INT32)(startTime - startWaitTime)); + #endif for (i = 0; i < S_COUNT; ++i) { @@ -5919,12 +6080,13 @@ PA_THREAD_FUNC ProcThreadPoll(void *param) // Output stream case S_OUTPUT: { - UINT32 frames; + UINT32 framesAvail; + if (stream->renderClient == NULL) break; // Get available frames - if ((hr = _PollGetOutputFramesAvailable(stream, &frames)) != S_OK) + if ((hr = _PollGetOutputFramesAvailable(stream, &framesAvail)) != S_OK) { LogHostError(hr); goto thread_error; @@ -5933,21 +6095,33 @@ PA_THREAD_FUNC ProcThreadPoll(void *param) // Output data to the user callback if (stream->bufferMode == paUtilFixedHostBufferSize) { - while (frames >= stream->out.framesPerBuffer) + UINT32 framesProc = stream->out.framesPerBuffer; + + // If we got less frames avoid sleeping again as it might be the corner case and buffer + // has sufficient number of frames now, in case 'out.framesPerBuffer' is 1/2 of the host + // buffer sleeping again may cause underruns. Do short busy waiting (normally might take + // 1-2 iterations) + if (framesAvail < framesProc) { - if ((hr = ProcessOutputBuffer(stream, processor, stream->out.framesPerBuffer)) != S_OK) + nextSleepTime = 0; + continue; + } + + while (framesAvail >= framesProc) + { + if ((hr = ProcessOutputBuffer(stream, processor, framesProc)) != S_OK) { LogHostError(hr); goto thread_error; } - frames -= stream->out.framesPerBuffer; + framesAvail -= framesProc; } } else - if (frames != 0) + if (framesAvail != 0) { - if ((hr = ProcessOutputBuffer(stream, processor, frames)) != S_OK) + if ((hr = ProcessOutputBuffer(stream, processor, framesAvail)) != S_OK) { LogHostError(hr); goto thread_error; @@ -5957,143 +6131,29 @@ PA_THREAD_FUNC ProcThreadPoll(void *param) break; } } } + + // Get next sleep time + nextSleepTime = GetNextSleepTime(&timer, &scheduler, startTime, sleepTime); + + #ifdef PA_WASAPI_LOG_TIME_SLOTS + startWaitTime = SystemTimer_GetTime(&timer); + #endif } } else { -#if 0 - // Processing Loop - while (WaitForSingleObject(stream->hCloseRequest, 1) == WAIT_TIMEOUT) + // Processing Loop (full-duplex) + while (WaitForSingleObject(stream->hCloseRequest, nextSleepTime) == WAIT_TIMEOUT) { - UINT32 i_frames = 0, i_processed = 0; + UINT32 i_frames = 0, i_processed = 0, o_frames = 0; BYTE *i_data = NULL, *o_data = NULL, *o_data_host = NULL; DWORD i_flags = 0; - UINT32 o_frames = 0; + + startTime = SystemTimer_GetTime(&timer); - // get host input buffer - if ((hr = IAudioCaptureClient_GetBuffer(stream->captureClient, &i_data, &i_frames, &i_flags, NULL, NULL)) != S_OK) - { - if (hr == AUDCLNT_S_BUFFER_EMPTY) - continue; // no data in capture buffer - - LogHostError(hr); - break; - } - - // get available frames - if ((hr = _PollGetOutputFramesAvailable(stream, &o_frames)) != S_OK) - { - // release input buffer - IAudioCaptureClient_ReleaseBuffer(stream->captureClient, 0); - - LogHostError(hr); - break; - } - - // process equal ammount of frames - if (o_frames >= i_frames) - { - // process input ammount of frames - UINT32 o_processed = i_frames; - - // get host output buffer - if ((hr = IAudioRenderClient_GetBuffer(stream->procRCClient, o_processed, &o_data)) == S_OK) - { - // processed amount of i_frames - i_processed = i_frames; - o_data_host = o_data; - - // convert output mono - if (stream->out.monoMixer) - { - UINT32 mono_frames_size = o_processed * (stream->out.wavex.Format.wBitsPerSample / 8); - // expand buffer - if (mono_frames_size > stream->out.monoBufferSize) - { - stream->out.monoBuffer = PaWasapi_ReallocateMemory(stream->out.monoBuffer, (stream->out.monoBufferSize = mono_frames_size)); - if (stream->out.monoBuffer == NULL) - { - // release input buffer - IAudioCaptureClient_ReleaseBuffer(stream->captureClient, 0); - // release output buffer - IAudioRenderClient_ReleaseBuffer(stream->renderClient, 0, 0); - - LogPaError(paInsufficientMemory); - break; - } - } - - // replace buffer pointer - o_data = (BYTE *)stream->out.monoBuffer; - } - - // convert input mono - if (stream->in.monoMixer) - { - UINT32 mono_frames_size = i_processed * (stream->in.wavex.Format.wBitsPerSample / 8); - // expand buffer - if (mono_frames_size > stream->in.monoBufferSize) - { - stream->in.monoBuffer = PaWasapi_ReallocateMemory(stream->in.monoBuffer, (stream->in.monoBufferSize = mono_frames_size)); - if (stream->in.monoBuffer == NULL) - { - // release input buffer - IAudioCaptureClient_ReleaseBuffer(stream->captureClient, 0); - // release output buffer - IAudioRenderClient_ReleaseBuffer(stream->renderClient, 0, 0); - - LogPaError(paInsufficientMemory); - break; - } - } - - // mix 2 to 1 input channels - stream->in.monoMixer(stream->in.monoBuffer, i_data, i_processed); - - // replace buffer pointer - i_data = (BYTE *)stream->in.monoBuffer; - } - - // process - processor[S_FULLDUPLEX].processor(i_data, i_processed, o_data, o_processed, processor[S_FULLDUPLEX].userData); - - // mix 1 to 2 output channels - if (stream->out.monoBuffer) - stream->out.monoMixer(o_data_host, stream->out.monoBuffer, o_processed); - - // release host output buffer - if ((hr = IAudioRenderClient_ReleaseBuffer(stream->renderClient, o_processed, 0)) != S_OK) - LogHostError(hr); - } - else - { - if (stream->out.shareMode != AUDCLNT_SHAREMODE_SHARED) - LogHostError(hr); // be silent in shared mode, try again next time - } - } - - // release host input buffer - if ((hr = IAudioCaptureClient_ReleaseBuffer(stream->captureClient, i_processed)) != S_OK) - { - LogHostError(hr); - break; - } - } -#else - // Processing Loop - UINT32 next_sleep = sleep_ms; - while (WaitForSingleObject(stream->hCloseRequest, next_sleep) == WAIT_TIMEOUT) - { - UINT32 i_frames = 0, i_processed = 0; - BYTE *i_data = NULL, *o_data = NULL, *o_data_host = NULL; - DWORD i_flags = 0; - UINT32 o_frames = 0; - - // Get next sleep time - if (sleep_ms == 0) - { - next_sleep = ThreadIdleScheduler_NextSleep(&scheduler); - } + #ifdef PA_WASAPI_LOG_TIME_SLOTS + printf("[%d|%d],", nextSleepTime, (INT32)(startTime - startWaitTime)); + #endif // get available frames if ((hr = _PollGetOutputFramesAvailable(stream, &o_frames)) != S_OK) @@ -6216,8 +6276,14 @@ fd_release_buffer_in: if (i_processed == 0) break; } + + // Get next sleep time + nextSleepTime = GetNextSleepTime(&timer, &scheduler, startTime, sleepTime); + + #ifdef PA_WASAPI_LOG_TIME_SLOTS + startWaitTime = SystemTimer_GetTime(&timer); + #endif } -#endif } thread_end: @@ -6226,11 +6292,10 @@ thread_end: _StreamOnStop(stream); // Release unmarshaled COM pointers - ReleaseUnmarshaledComPointers(stream); + FinishComPointers(stream, threadComInitialized); - // Cleanup COM for this thread - if (bThreadComInitialized == TRUE) - CoUninitialize(); + // Restore system timer granularity + SystemTimer_RestoreGranularity(&timer); // Notify: not running stream->running = FALSE; @@ -6269,35 +6334,3 @@ void PaWasapi_FreeMemory(void *ptr) { free(ptr); } - -//#endif //VC 2005 - - - - -#if 0 - if(bFirst) { - float masteur; - hr = stream->outVol->GetMasterVolumeLevelScalar(&masteur); - if (hr != S_OK) - LogHostError(hr); - float chan1, chan2; - hr = stream->outVol->GetChannelVolumeLevelScalar(0, &chan1); - if (hr != S_OK) - LogHostError(hr); - hr = stream->outVol->GetChannelVolumeLevelScalar(1, &chan2); - if (hr != S_OK) - LogHostError(hr); - - BOOL bMute; - hr = stream->outVol->GetMute(&bMute); - if (hr != S_OK) - LogHostError(hr); - - stream->outVol->SetMasterVolumeLevelScalar(0.5, NULL); - stream->outVol->SetChannelVolumeLevelScalar(0, 0.5, NULL); - stream->outVol->SetChannelVolumeLevelScalar(1, 0.5, NULL); - stream->outVol->SetMute(FALSE, NULL); - bFirst = FALSE; - } -#endif From dcc2f7fa48d0e15febdfae71b5038b4a7bd1f4fb Mon Sep 17 00:00:00 2001 From: dmitrykos Date: Sat, 3 Oct 2020 23:21:11 +0300 Subject: [PATCH 020/164] wasapi: Fix paInvalidSampleRate (and any other) error code is replaced with paInvalidDevice if audio client failed to be created due to some reason. --- src/hostapi/wasapi/pa_win_wasapi.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/hostapi/wasapi/pa_win_wasapi.c b/src/hostapi/wasapi/pa_win_wasapi.c index 17846bd..f23fd58 100644 --- a/src/hostapi/wasapi/pa_win_wasapi.c +++ b/src/hostapi/wasapi/pa_win_wasapi.c @@ -3705,11 +3705,11 @@ static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi, stream->in.params.wow64_workaround = paWasapi->useWOW64Workaround; // Create and activate audio client - if (FAILED(hr = ActivateAudioClientInput(stream))) + if ((result = ActivateAudioClientInput(stream)) != paNoError) { - LogPaError(result = paInvalidDevice); + LogPaError(result); goto error; - } + } // Get closest format hostInputSampleFormat = PaUtil_SelectClosestAvailableFormat(WaveToPaFormat(&stream->in.wavex), inputSampleFormat); @@ -3839,11 +3839,11 @@ static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi, stream->out.params.wow64_workaround = paWasapi->useWOW64Workaround; // Create and activate audio client - if (FAILED(hr = ActivateAudioClientOutput(stream))) + if ((result = ActivateAudioClientOutput(stream)) != paNoError) { - LogPaError(result = paInvalidDevice); + LogPaError(result); goto error; - } + } // Get closest format hostOutputSampleFormat = PaUtil_SelectClosestAvailableFormat(WaveToPaFormat(&stream->out.wavex), outputSampleFormat); From 2a7f8fcd7a5f64835be907c5dd56dc962793e7b8 Mon Sep 17 00:00:00 2001 From: Phil Burk Date: Sat, 3 Oct 2020 16:54:12 -0700 Subject: [PATCH 021/164] build: add new Mac SDKs to configure Add SDK 10.14 and 10.15 to configure.in Removed i386 and PPC architectures on Mac because they are deprecated and make fails if they are used. The configure file was generated from the configure.in file by entering this on Linux: aclocal autoconf Fixes 308 --- configure | Bin 576035 -> 576931 bytes configure.in | 22 ++++++++++++++-------- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/configure b/configure index e1703271b253ccf2d992b39eff5420e16a83d319..34a341bdd51bb1616ed8d3eb63ae12868f780726 100755 GIT binary patch delta 621 zcmZ2HMS1aT&lqu9G=<4F;qe?5pa4DdOAajt|2qv6`thF903ZXQCW-2HoCdU^PrIy(uJH^@> zD241eTP?VGP)}iqpbG%`F=&pqO+YaQMF%nmi4A1NAWVTvz!@5pnXFk`}Pfq9K{&`^yJp9 delta 168 zcmZ2HTY2#mOT}hnq<`?bDg`02AZofI35r~<9m>Gy!fS7gr z&Dm_HR`VDdY1J6(833`N=H!Wsq^BQnXHVI#<-vZRbNYJ^c9H3O9T)|s{|siIE}Us> zVWv=FVHR&@qEJwf48q%|gs{&Mn10@sU10i}ICdV9^2FlAf=vC~%)In+-ORk?oYIuk OcD+>g?Ru#kr5OOqkwV-6 diff --git a/configure.in b/configure.in index b2129ba..90a811c 100644 --- a/configure.in +++ b/configure.in @@ -210,7 +210,7 @@ case "${host_os}" in if test "x$enable_mac_universal" = "xyes" ; then case `xcodebuild -version | sed -n 's/Xcode \(.*\)/\1/p'` in - [12]*|3.0|3.1) + 3.0|3.1) dnl In pre-3.2 versions of Xcode, xcodebuild doesn't dnl support -sdk, so we can't use that to look for dnl SDKs. However, in those versions of Xcode, the @@ -261,6 +261,12 @@ case "${host_os}" in elif xcodebuild -version -sdk macosx10.13 Path >/dev/null 2>&1 ; then mac_version_min="-mmacosx-version-min=10.4" mac_sysroot="-isysroot `xcodebuild -version -sdk macosx10.13 Path`" + elif xcodebuild -version -sdk macosx10.14 Path >/dev/null 2>&1 ; then + mac_version_min="-mmacosx-version-min=10.4" + mac_sysroot="-isysroot `xcodebuild -version -sdk macosx10.14 Path`" + elif xcodebuild -version -sdk macosx10.15 Path >/dev/null 2>&1 ; then + mac_version_min="-mmacosx-version-min=10.4" + mac_sysroot="-isysroot `xcodebuild -version -sdk macosx10.15 Path`" else AC_MSG_ERROR([Could not find 10.5 to 10.13 SDK.]) fi @@ -269,7 +275,7 @@ case "${host_os}" in dnl Pick which architectures to build for based on what dnl the compiler supports. mac_arches="" - for arch in i386 x86_64 ppc ppc64 + for arch in x86_64 do save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -arch $arch" @@ -319,12 +325,12 @@ case "${host_os}" in DLL_LIBS="${DLL_LIBS} -lwinmm -lm -lole32 -luuid" CFLAGS="$CFLAGS -ffast-math -fomit-frame-pointer -I\$(top_srcdir)/src/hostapi/asio -I$ASIODIR/host/pc -I$ASIODIR/common -I$ASIODIR/host -UPA_USE_ASIO -DPA_USE_ASIO=1 -DWINDOWS" - dnl Setting the windows version flags below resolves a conflict between Interlocked* - dnl definitions in mingw winbase.h and Interlocked* hacks in ASIO SDK combase.h + dnl Setting the windows version flags below resolves a conflict between Interlocked* + dnl definitions in mingw winbase.h and Interlocked* hacks in ASIO SDK combase.h dnl combase.h is included by asiodrvr.h - dnl PortAudio does not actually require Win XP (winver 501) APIs + dnl PortAudio does not actually require Win XP (winver 501) APIs CFLAGS="$CFLAGS -D_WIN32_WINNT=0x0501 -DWINVER=0x0501" - + CXXFLAGS="$CFLAGS" fi @@ -383,7 +389,7 @@ case "${host_os}" in dnl The _REENTRANT option for pthread safety. Perhaps not necessary but it 'll do no harm. dnl THREAD_CFLAGS="-D_REENTRANT" - + OTHER_OBJS="pa_sgi/pa_sgi.o src/os/unix/pa_unix_hostapis.o src/os/unix/pa_unix_util.o" dnl SGI books say -lpthread should be the last of the libs mentioned. @@ -397,7 +403,7 @@ case "${host_os}" in dnl Unix configuration CFLAGS="$CFLAGS -I\$(top_srcdir)/src/os/unix" - + AC_CHECK_LIB(pthread, pthread_create,[have_pthread="yes"], AC_MSG_ERROR([libpthread not found!])) From e90b19ef2b56f92e8bf79017a9cc2669e20f2e16 Mon Sep 17 00:00:00 2001 From: Phil Burk Date: Sun, 4 Oct 2020 11:06:03 -0700 Subject: [PATCH 022/164] docs: change Assembla links to GitHub Fixes #298 --- doc/src/mainpage.dox | 18 ++++++++++-------- doc/src/tutorial/compile_windows_mingw.dox | 7 +++++-- doc/src/tutorial/tutorial_start.dox | 6 ++++-- 3 files changed, 19 insertions(+), 12 deletions(-) diff --git a/doc/src/mainpage.dox b/doc/src/mainpage.dox index 7a54d32..53e0060 100644 --- a/doc/src/mainpage.dox +++ b/doc/src/mainpage.dox @@ -34,9 +34,9 @@ Documentation for non-portable platform-specific host API extensions - The PortAudio website -- Our mailing list for users and developers
+- Our mailing list for users and developers
-- The PortAudio wiki +- The PortAudio wiki @section developer_resources Developer Resources @@ -44,18 +44,20 @@ Documentation for non-portable platform-specific host API extensions - @ref srcguide @endif -- Our wiki and issue tracking system +- Our repository on GitHub -- Developer guidelines +- Developer guidelines -- Implementation style guidelines - -If you're interested in helping out with PortAudio development we're more than happy for you to be involved. Just drop by the PortAudio mailing list and ask how you can help. Or check out the starter tickets. +- Implementation style guidelines +If you're interested in helping out with PortAudio development we're more than happy for you to be involved. +Just drop by the PortAudio mailing list and ask how you can help. +Or check out these +recommended starter issues. @section older_api_versions Older API Versions This documentation covers the current API version: PortAudio V19, API version 2.0. API 2.0 differs in a number of ways from previous versions (most often encountered in PortAudio V18), please consult the enhancement proposals for details of what was added/changed for V19: http://www.portaudio.com/docs/proposals/index.html -*/ \ No newline at end of file +*/ diff --git a/doc/src/tutorial/compile_windows_mingw.dox b/doc/src/tutorial/compile_windows_mingw.dox index d521b7b..30143dc 100644 --- a/doc/src/tutorial/compile_windows_mingw.dox +++ b/doc/src/tutorial/compile_windows_mingw.dox @@ -3,7 +3,10 @@ @section comp_mingw1 Portaudio for Windows With MinGW -This document contains old or out-of-date information. Please see a draft of new MinGW information on our Wiki: PortAudio Wiki: Notes about building PortAudio with MinGW +This document contains old or out-of-date information. Please see +a draft of new MinGW information on our +Wiki: +PortAudio Wiki: Notes about building PortAudio with MinGW = MinGW/MSYS = @@ -50,4 +53,4 @@ To update your copy or check out a fresh copy of the source Back to the Tutorial: \ref tutorial_start -*/ \ No newline at end of file +*/ diff --git a/doc/src/tutorial/tutorial_start.dox b/doc/src/tutorial/tutorial_start.dox index f920178..42fa4bf 100644 --- a/doc/src/tutorial/tutorial_start.dox +++ b/doc/src/tutorial/tutorial_start.dox @@ -37,7 +37,9 @@ Below are the steps to writing a PortAudio application using the callback techni In addition to this "Callback" architecture, V19 also supports a "Blocking I/O" model which uses read and write calls which may be more familiar to non-audio programmers. Note that at this time, not all APIs support this functionality. -In this tutorial, we'll show how to use the callback architecture to play a sawtooth wave. Much of the tutorial is taken from the file paex_saw.c, which is part of the PortAudio distribution. When you're done with this tutorial, you'll be armed with the basic knowledge you need to write an audio program. If you need more sample code, look in the "examples" and "test" directory of the PortAudio distribution. Another great source of info is the portaudio.h Doxygen page, which documents the entire V19 API. Also see the page for tips on programming PortAudio on the PortAudio wiki. +In this tutorial, we'll show how to use the callback architecture to play a sawtooth wave. Much of the tutorial is taken from the file paex_saw.c, which is part of the PortAudio distribution. When you're done with this tutorial, you'll be armed with the basic knowledge you need to write an audio program. If you need more sample code, look in the "examples" and "test" directory of the PortAudio distribution. Another great source of info is the portaudio.h Doxygen page, which documents the entire V19 API. +Also see the page for tips on programming PortAudio +on the PortAudio wiki. @section tut_start4 Programming Tutorial Contents @@ -56,4 +58,4 @@ Once you have a basic understanding of how to use PortAudio, you might be intere Next: \ref writing_a_callback -*/ \ No newline at end of file +*/ From 19f638da5ac187ba17787c1a8d456642b024a297 Mon Sep 17 00:00:00 2001 From: Ross Bencina Date: Thu, 1 Oct 2020 14:08:39 +1000 Subject: [PATCH 023/164] wdmks: ensure that pins that failed creation by PinNew() are set to NULL. Note that PaUtil_AllocateMemory currently calls GlobalAlloc without the GMEM_ZEROINIT flag, so there was no guarantee that filter->pins[pinId] was zero. --- src/hostapi/wdmks/pa_win_wdmks.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/hostapi/wdmks/pa_win_wdmks.c b/src/hostapi/wdmks/pa_win_wdmks.c index 70a48d8..2403ed5 100644 --- a/src/hostapi/wdmks/pa_win_wdmks.c +++ b/src/hostapi/wdmks/pa_win_wdmks.c @@ -2844,6 +2844,10 @@ PaError FilterInitializePins( PaWinWdmFilter* filter ) filter->pins[pinId] = newPin; ++filter->validPinCount; } + else + { + filter->pins[pinId] = 0; + } } if (filter->validPinCount == 0) From aa6ff975af2aedfad878aa40c85edbfa0176d034 Mon Sep 17 00:00:00 2001 From: dmitrykos Date: Fri, 9 Oct 2020 00:57:23 +0300 Subject: [PATCH 024/164] wasapi: Replace tabs with 4-spaces to comply with PortAudio code style guidelines (http://github.com/PortAudio/portaudio/wiki/ImplementationStyleGuidelines). --- src/hostapi/wasapi/pa_win_wasapi.c | 7328 ++++++++++++++-------------- 1 file changed, 3664 insertions(+), 3664 deletions(-) diff --git a/src/hostapi/wasapi/pa_win_wasapi.c b/src/hostapi/wasapi/pa_win_wasapi.c index f23fd58..cdefe13 100644 --- a/src/hostapi/wasapi/pa_win_wasapi.c +++ b/src/hostapi/wasapi/pa_win_wasapi.c @@ -51,7 +51,7 @@ // Max device count (if defined) causes max constant device count in the device list that // enables PaWasapi_UpdateDeviceList() API and makes it possible to update WASAPI list dynamically #ifndef PA_WASAPI_MAX_CONST_DEVICE_COUNT - #define PA_WASAPI_MAX_CONST_DEVICE_COUNT 0 // Force basic behavior by defining 0 if not defined by user + #define PA_WASAPI_MAX_CONST_DEVICE_COUNT 0 // Force basic behavior by defining 0 if not defined by user #endif // Fallback from Event to the Polling method in case if latency is higher than 21.33ms, as it allows to use @@ -66,8 +66,8 @@ // WinRT #if defined(WINAPI_FAMILY) && (WINAPI_FAMILY == WINAPI_FAMILY_APP) - #define PA_WINRT - #define INITGUID + #define PA_WINRT + #define INITGUID #endif // WASAPI @@ -75,22 +75,22 @@ // https://github.com/mxe/mxe/commit/f4bbc45682f021948bdaefd9fd476e2a04c4740f #include // must be before other Wasapi headers #if defined(_MSC_VER) && (_MSC_VER >= 1400) || defined(__MINGW64_VERSION_MAJOR) - #include - #define COBJMACROS - #include - #include - #define INITGUID // Avoid additional linkage of static libs, excessive code will be optimized out by the compiler + #include + #define COBJMACROS + #include + #include + #define INITGUID // Avoid additional linkage of static libs, excessive code will be optimized out by the compiler #ifndef _MSC_VER - #include + #include #endif - #include - #include - #include // Used to get IKsJackDescription interface - #undef INITGUID + #include + #include + #include // Used to get IKsJackDescription interface + #undef INITGUID #endif #ifndef __MWERKS__ - #include - #include + #include + #include #endif #include "pa_util.h" @@ -109,9 +109,9 @@ #undef WINVER #undef _WIN32_WINNT #define WINVER 0x0600 // VISTA - #define _WIN32_WINNT WINVER + #define _WIN32_WINNT WINVER - #ifndef _AVRT_ //<< fix MinGW dummy compile by defining missing type: AVRT_PRIORITY + #ifndef _AVRT_ //<< fix MinGW dummy compile by defining missing type: AVRT_PRIORITY typedef enum _AVRT_PRIORITY { AVRT_PRIORITY_LOW = -1, @@ -119,16 +119,16 @@ AVRT_PRIORITY_HIGH, AVRT_PRIORITY_CRITICAL } AVRT_PRIORITY, *PAVRT_PRIORITY; - #endif + #endif - #include // << for IID/CLSID + #include // << for IID/CLSID #include #include - #ifndef __LPCGUID_DEFINED__ - #define __LPCGUID_DEFINED__ - typedef const GUID *LPCGUID; - #endif + #ifndef __LPCGUID_DEFINED__ + #define __LPCGUID_DEFINED__ + typedef const GUID *LPCGUID; + #endif #ifndef PROPERTYKEY_DEFINED #define PROPERTYKEY_DEFINED @@ -136,7 +136,7 @@ { GUID fmtid; DWORD pid; - } PROPERTYKEY; + } PROPERTYKEY; #endif #ifdef __midl_proxy @@ -156,7 +156,7 @@ { unsigned long clSize; unsigned char abData[ 1 ]; - } BYTE_BLOB; + } BYTE_BLOB; typedef /* [unique] */ __RPC_unique_pointer BYTE_BLOB *UP_BYTE_BLOB; typedef LONGLONG REFERENCE_TIME; #define NONAMELESSUNION @@ -182,7 +182,7 @@ #include #include #include - #include // Used to get IKsJackDescription interface + #include // Used to get IKsJackDescription interface #undef INITGUID #endif // NTDDI_VERSION @@ -190,32 +190,32 @@ // Missing declarations for WinRT #ifdef PA_WINRT - #define DEVICE_STATE_ACTIVE 0x00000001 + #define DEVICE_STATE_ACTIVE 0x00000001 - typedef enum _EDataFlow - { - eRender = 0, - eCapture = ( eRender + 1 ) , - eAll = ( eCapture + 1 ) , - EDataFlow_enum_count = ( eAll + 1 ) - } - EDataFlow; + typedef enum _EDataFlow + { + eRender = 0, + eCapture = ( eRender + 1 ) , + eAll = ( eCapture + 1 ) , + EDataFlow_enum_count = ( eAll + 1 ) + } + EDataFlow; - typedef enum _EndpointFormFactor - { - RemoteNetworkDevice = 0, - Speakers = ( RemoteNetworkDevice + 1 ) , - LineLevel = ( Speakers + 1 ) , - Headphones = ( LineLevel + 1 ) , - Microphone = ( Headphones + 1 ) , - Headset = ( Microphone + 1 ) , - Handset = ( Headset + 1 ) , - UnknownDigitalPassthrough = ( Handset + 1 ) , - SPDIF = ( UnknownDigitalPassthrough + 1 ) , - HDMI = ( SPDIF + 1 ) , - UnknownFormFactor = ( HDMI + 1 ) - } - EndpointFormFactor; + typedef enum _EndpointFormFactor + { + RemoteNetworkDevice = 0, + Speakers = ( RemoteNetworkDevice + 1 ) , + LineLevel = ( Speakers + 1 ) , + Headphones = ( LineLevel + 1 ) , + Microphone = ( Headphones + 1 ) , + Headset = ( Microphone + 1 ) , + Handset = ( Headset + 1 ) , + UnknownDigitalPassthrough = ( Handset + 1 ) , + SPDIF = ( UnknownDigitalPassthrough + 1 ) , + HDMI = ( SPDIF + 1 ) , + UnknownFormFactor = ( HDMI + 1 ) + } + EndpointFormFactor; #endif @@ -261,15 +261,15 @@ __DEFINE_GUID(pa_KSDATAFORMAT_SUBTYPE_IEEE_FLOAT, 0x00000003, 0x0000, 0x0010, 0x #ifdef __IAudioClient2_INTERFACE_DEFINED__ typedef enum _pa_AUDCLNT_STREAMOPTIONS { - pa_AUDCLNT_STREAMOPTIONS_NONE = 0x00, - pa_AUDCLNT_STREAMOPTIONS_RAW = 0x01, - pa_AUDCLNT_STREAMOPTIONS_MATCH_FORMAT = 0x02 + pa_AUDCLNT_STREAMOPTIONS_NONE = 0x00, + pa_AUDCLNT_STREAMOPTIONS_RAW = 0x01, + pa_AUDCLNT_STREAMOPTIONS_MATCH_FORMAT = 0x02 } pa_AUDCLNT_STREAMOPTIONS; typedef struct _pa_AudioClientProperties { - UINT32 cbSize; - BOOL bIsOffload; - AUDIO_STREAM_CATEGORY eCategory; - pa_AUDCLNT_STREAMOPTIONS Options; + UINT32 cbSize; + BOOL bIsOffload; + AUDIO_STREAM_CATEGORY eCategory; + pa_AUDCLNT_STREAMOPTIONS Options; } pa_AudioClientProperties; #define PA_AUDIOCLIENTPROPERTIES_SIZE_CATEGORY (sizeof(pa_AudioClientProperties) - sizeof(pa_AUDCLNT_STREAMOPTIONS)) #define PA_AUDIOCLIENTPROPERTIES_SIZE_OPTIONS sizeof(pa_AudioClientProperties) @@ -277,13 +277,13 @@ typedef struct _pa_AudioClientProperties { /* use CreateThread for CYGWIN/Windows Mobile, _beginthreadex for all others */ #if !defined(__CYGWIN__) && !defined(_WIN32_WCE) - #define CREATE_THREAD(PROC) (HANDLE)_beginthreadex( NULL, 0, (PROC), stream, 0, &stream->dwThreadId ) - #define PA_THREAD_FUNC static unsigned WINAPI - #define PA_THREAD_ID unsigned + #define CREATE_THREAD(PROC) (HANDLE)_beginthreadex( NULL, 0, (PROC), stream, 0, &stream->dwThreadId ) + #define PA_THREAD_FUNC static unsigned WINAPI + #define PA_THREAD_ID unsigned #else - #define CREATE_THREAD(PROC) CreateThread( NULL, 0, (PROC), stream, 0, &stream->dwThreadId ) - #define PA_THREAD_FUNC static DWORD WINAPI - #define PA_THREAD_ID DWORD + #define CREATE_THREAD(PROC) CreateThread( NULL, 0, (PROC), stream, 0, &stream->dwThreadId ) + #define PA_THREAD_FUNC static DWORD WINAPI + #define PA_THREAD_ID DWORD #endif // Thread function forward decl. @@ -292,27 +292,27 @@ PA_THREAD_FUNC ProcThreadPoll(void *param); // Error codes (availabe since Windows 7) #ifndef AUDCLNT_E_BUFFER_ERROR - #define AUDCLNT_E_BUFFER_ERROR AUDCLNT_ERR(0x018) + #define AUDCLNT_E_BUFFER_ERROR AUDCLNT_ERR(0x018) #endif #ifndef AUDCLNT_E_BUFFER_SIZE_NOT_ALIGNED - #define AUDCLNT_E_BUFFER_SIZE_NOT_ALIGNED AUDCLNT_ERR(0x019) + #define AUDCLNT_E_BUFFER_SIZE_NOT_ALIGNED AUDCLNT_ERR(0x019) #endif #ifndef AUDCLNT_E_INVALID_DEVICE_PERIOD - #define AUDCLNT_E_INVALID_DEVICE_PERIOD AUDCLNT_ERR(0x020) + #define AUDCLNT_E_INVALID_DEVICE_PERIOD AUDCLNT_ERR(0x020) #endif // Stream flags (availabe since Windows 7) #ifndef AUDCLNT_STREAMFLAGS_SRC_DEFAULT_QUALITY - #define AUDCLNT_STREAMFLAGS_SRC_DEFAULT_QUALITY 0x08000000 + #define AUDCLNT_STREAMFLAGS_SRC_DEFAULT_QUALITY 0x08000000 #endif #ifndef AUDCLNT_STREAMFLAGS_AUTOCONVERTPCM - #define AUDCLNT_STREAMFLAGS_AUTOCONVERTPCM 0x80000000 + #define AUDCLNT_STREAMFLAGS_AUTOCONVERTPCM 0x80000000 #endif #define MAX_STR_LEN 512 #ifdef PA_WINRT - #define PA_WASAPI_DEVICE_ID_LEN 4096 + #define PA_WASAPI_DEVICE_ID_LEN 4096 #endif enum { S_INPUT = 0, S_OUTPUT = 1, S_COUNT = 2, S_FULLDUPLEX = 0 }; @@ -430,10 +430,10 @@ typedef struct PaWasapiDeviceInfo IMMDevice *device; #endif - // from GetId + // from GetId WCHAR szDeviceID[MAX_STR_LEN]; - // from GetState + // from GetState DWORD state; // Fields filled from IAudioDevice (_prior_ to Initialize) @@ -441,17 +441,17 @@ typedef struct PaWasapiDeviceInfo REFERENCE_TIME DefaultDevicePeriod; REFERENCE_TIME MinimumDevicePeriod; - // Default format (setup through Control Panel by user) - WAVEFORMATEXTENSIBLE DefaultFormat; + // Default format (setup through Control Panel by user) + WAVEFORMATEXTENSIBLE DefaultFormat; - // Mix format (internal format used by WASAPI audio engine) - WAVEFORMATEXTENSIBLE MixFormat; + // Mix format (internal format used by WASAPI audio engine) + WAVEFORMATEXTENSIBLE MixFormat; // Fields filled from IMMEndpoint'sGetDataFlow EDataFlow flow; - // Formfactor - EndpointFormFactor formFactor; + // Formfactor + EndpointFormFactor formFactor; } PaWasapiDeviceInfo; @@ -477,8 +477,8 @@ typedef struct PaWasapiDeviceInfo *devInfo; - // is TRUE when WOW64 Vista/7 Workaround is needed - BOOL useWOW64Workaround; + // is TRUE when WOW64 Vista/7 Workaround is needed + BOOL useWOW64Workaround; } PaWasapiHostApiRepresentation; @@ -486,14 +486,14 @@ PaWasapiHostApiRepresentation; /* PaWasapiAudioClientParams - audio client parameters */ typedef struct PaWasapiAudioClientParams { - PaWasapiDeviceInfo *device_info; - PaStreamParameters stream_params; - PaWasapiStreamInfo wasapi_params; - UINT32 frames_per_buffer; - double sample_rate; - BOOL blocking; - BOOL full_duplex; - BOOL wow64_workaround; + PaWasapiDeviceInfo *device_info; + PaStreamParameters stream_params; + PaWasapiStreamInfo wasapi_params; + UINT32 frames_per_buffer; + double sample_rate; + BOOL blocking; + BOOL full_duplex; + BOOL wow64_workaround; } PaWasapiAudioClientParams; @@ -503,34 +503,34 @@ typedef struct PaWasapiSubStream { IAudioClient *clientParent; #ifndef PA_WINRT - IStream *clientStream; + IStream *clientStream; #endif - IAudioClient *clientProc; + IAudioClient *clientProc; WAVEFORMATEXTENSIBLE wavex; UINT32 bufferSize; REFERENCE_TIME deviceLatency; REFERENCE_TIME period; - double latencySeconds; - UINT32 framesPerHostCallback; - AUDCLNT_SHAREMODE shareMode; - UINT32 streamFlags; // AUDCLNT_STREAMFLAGS_EVENTCALLBACK, ... - UINT32 flags; - PaWasapiAudioClientParams params; //!< parameters + double latencySeconds; + UINT32 framesPerHostCallback; + AUDCLNT_SHAREMODE shareMode; + UINT32 streamFlags; // AUDCLNT_STREAMFLAGS_EVENTCALLBACK, ... + UINT32 flags; + PaWasapiAudioClientParams params; //!< parameters - // Buffers - UINT32 buffers; //!< number of buffers used (from host side) - UINT32 framesPerBuffer; //!< number of frames per 1 buffer - BOOL userBufferAndHostMatch; + // Buffers + UINT32 buffers; //!< number of buffers used (from host side) + UINT32 framesPerBuffer; //!< number of frames per 1 buffer + BOOL userBufferAndHostMatch; - // Used for Mono >> Stereo workaround, if driver does not support it - // (in Exclusive mode WASAPI usually refuses to operate with Mono (1-ch) - void *monoBuffer; //!< pointer to buffer - UINT32 monoBufferSize; //!< buffer size in bytes - MixMonoToStereoF monoMixer; //!< pointer to mixer function + // Used for Mono >> Stereo workaround, if driver does not support it + // (in Exclusive mode WASAPI usually refuses to operate with Mono (1-ch) + void *monoBuffer; //!< pointer to buffer + UINT32 monoBufferSize; //!< buffer size in bytes + MixMonoToStereoF monoMixer; //!< pointer to mixer function - PaUtilRingBuffer *tailBuffer; //!< buffer with trailing sample for blocking mode operations (only for Input) - void *tailBufferMemory; //!< tail buffer memory region + PaUtilRingBuffer *tailBuffer; //!< buffer with trailing sample for blocking mode operations (only for Input) + void *tailBufferMemory; //!< tail buffer memory region } PaWasapiSubStream; @@ -546,65 +546,65 @@ PaWasapiHostProcessor; // ------------------------------------------------------------------------------------------ typedef struct PaWasapiStream { - /* IMPLEMENT ME: rename this */ + /* IMPLEMENT ME: rename this */ PaUtilStreamRepresentation streamRepresentation; PaUtilCpuLoadMeasurer cpuLoadMeasurer; PaUtilBufferProcessor bufferProcessor; // input - PaWasapiSubStream in; + PaWasapiSubStream in; IAudioCaptureClient *captureClientParent; #ifndef PA_WINRT - IStream *captureClientStream; + IStream *captureClientStream; #endif - IAudioCaptureClient *captureClient; + IAudioCaptureClient *captureClient; IAudioEndpointVolume *inVol; - // output - PaWasapiSubStream out; + // output + PaWasapiSubStream out; IAudioRenderClient *renderClientParent; #ifndef PA_WINRT - IStream *renderClientStream; + IStream *renderClientStream; #endif - IAudioRenderClient *renderClient; - IAudioEndpointVolume *outVol; + IAudioRenderClient *renderClient; + IAudioEndpointVolume *outVol; - // event handles for event-driven processing mode - HANDLE event[S_COUNT]; + // event handles for event-driven processing mode + HANDLE event[S_COUNT]; - // buffer mode - PaUtilHostBufferSizeMode bufferMode; + // buffer mode + PaUtilHostBufferSizeMode bufferMode; - // must be volatile to avoid race condition on user query while - // thread is being started + // must be volatile to avoid race condition on user query while + // thread is being started volatile BOOL running; PA_THREAD_ID dwThreadId; HANDLE hThread; - HANDLE hCloseRequest; - HANDLE hThreadStart; //!< signalled by thread on start - HANDLE hThreadExit; //!< signalled by thread on exit - HANDLE hBlockingOpStreamRD; - HANDLE hBlockingOpStreamWR; + HANDLE hCloseRequest; + HANDLE hThreadStart; //!< signalled by thread on start + HANDLE hThreadExit; //!< signalled by thread on exit + HANDLE hBlockingOpStreamRD; + HANDLE hBlockingOpStreamWR; // Host callback Output overrider - PaWasapiHostProcessor hostProcessOverrideOutput; + PaWasapiHostProcessor hostProcessOverrideOutput; // Host callback Input overrider - PaWasapiHostProcessor hostProcessOverrideInput; + PaWasapiHostProcessor hostProcessOverrideInput; - // Defines blocking/callback interface used - BOOL bBlocking; + // Defines blocking/callback interface used + BOOL bBlocking; - // Av Task (MM thread management) - HANDLE hAvTask; + // Av Task (MM thread management) + HANDLE hAvTask; - // Thread priority level - PaWasapiThreadPriority nThreadPriority; + // Thread priority level + PaWasapiThreadPriority nThreadPriority; - // State handler - PaWasapiStreamStateCallback fnStateHandler; - void *pStateHandlerUserData; + // State handler + PaWasapiStreamStateCallback fnStateHandler; + void *pStateHandlerUserData; } PaWasapiStream; @@ -638,143 +638,143 @@ static HRESULT __LogHostError(HRESULT res, const char *func, const char *file, i { const char *text = NULL; switch (res) - { - case S_OK: return res; - case E_POINTER :text ="E_POINTER"; break; - case E_INVALIDARG :text ="E_INVALIDARG"; break; + { + case S_OK: return res; + case E_POINTER :text ="E_POINTER"; break; + case E_INVALIDARG :text ="E_INVALIDARG"; break; - case AUDCLNT_E_NOT_INITIALIZED :text ="AUDCLNT_E_NOT_INITIALIZED"; break; - case AUDCLNT_E_ALREADY_INITIALIZED :text ="AUDCLNT_E_ALREADY_INITIALIZED"; break; - case AUDCLNT_E_WRONG_ENDPOINT_TYPE :text ="AUDCLNT_E_WRONG_ENDPOINT_TYPE"; break; - case AUDCLNT_E_DEVICE_INVALIDATED :text ="AUDCLNT_E_DEVICE_INVALIDATED"; break; - case AUDCLNT_E_NOT_STOPPED :text ="AUDCLNT_E_NOT_STOPPED"; break; - case AUDCLNT_E_BUFFER_TOO_LARGE :text ="AUDCLNT_E_BUFFER_TOO_LARGE"; break; - case AUDCLNT_E_OUT_OF_ORDER :text ="AUDCLNT_E_OUT_OF_ORDER"; break; - case AUDCLNT_E_UNSUPPORTED_FORMAT :text ="AUDCLNT_E_UNSUPPORTED_FORMAT"; break; - case AUDCLNT_E_INVALID_SIZE :text ="AUDCLNT_E_INVALID_SIZE"; break; - case AUDCLNT_E_DEVICE_IN_USE :text ="AUDCLNT_E_DEVICE_IN_USE"; break; - case AUDCLNT_E_BUFFER_OPERATION_PENDING :text ="AUDCLNT_E_BUFFER_OPERATION_PENDING"; break; - case AUDCLNT_E_THREAD_NOT_REGISTERED :text ="AUDCLNT_E_THREAD_NOT_REGISTERED"; break; - case AUDCLNT_E_EXCLUSIVE_MODE_NOT_ALLOWED :text ="AUDCLNT_E_EXCLUSIVE_MODE_NOT_ALLOWED"; break; - case AUDCLNT_E_ENDPOINT_CREATE_FAILED :text ="AUDCLNT_E_ENDPOINT_CREATE_FAILED"; break; - case AUDCLNT_E_SERVICE_NOT_RUNNING :text ="AUDCLNT_E_SERVICE_NOT_RUNNING"; break; - case AUDCLNT_E_EVENTHANDLE_NOT_EXPECTED :text ="AUDCLNT_E_EVENTHANDLE_NOT_EXPECTED"; break; - case AUDCLNT_E_EXCLUSIVE_MODE_ONLY :text ="AUDCLNT_E_EXCLUSIVE_MODE_ONLY"; break; - case AUDCLNT_E_BUFDURATION_PERIOD_NOT_EQUAL :text ="AUDCLNT_E_BUFDURATION_PERIOD_NOT_EQUAL"; break; - case AUDCLNT_E_EVENTHANDLE_NOT_SET :text ="AUDCLNT_E_EVENTHANDLE_NOT_SET"; break; - case AUDCLNT_E_INCORRECT_BUFFER_SIZE :text ="AUDCLNT_E_INCORRECT_BUFFER_SIZE"; break; - case AUDCLNT_E_BUFFER_SIZE_ERROR :text ="AUDCLNT_E_BUFFER_SIZE_ERROR"; break; - case AUDCLNT_E_CPUUSAGE_EXCEEDED :text ="AUDCLNT_E_CPUUSAGE_EXCEEDED"; break; - case AUDCLNT_E_BUFFER_ERROR :text ="AUDCLNT_E_BUFFER_ERROR"; break; - case AUDCLNT_E_BUFFER_SIZE_NOT_ALIGNED :text ="AUDCLNT_E_BUFFER_SIZE_NOT_ALIGNED"; break; - case AUDCLNT_E_INVALID_DEVICE_PERIOD :text ="AUDCLNT_E_INVALID_DEVICE_PERIOD"; break; + case AUDCLNT_E_NOT_INITIALIZED :text ="AUDCLNT_E_NOT_INITIALIZED"; break; + case AUDCLNT_E_ALREADY_INITIALIZED :text ="AUDCLNT_E_ALREADY_INITIALIZED"; break; + case AUDCLNT_E_WRONG_ENDPOINT_TYPE :text ="AUDCLNT_E_WRONG_ENDPOINT_TYPE"; break; + case AUDCLNT_E_DEVICE_INVALIDATED :text ="AUDCLNT_E_DEVICE_INVALIDATED"; break; + case AUDCLNT_E_NOT_STOPPED :text ="AUDCLNT_E_NOT_STOPPED"; break; + case AUDCLNT_E_BUFFER_TOO_LARGE :text ="AUDCLNT_E_BUFFER_TOO_LARGE"; break; + case AUDCLNT_E_OUT_OF_ORDER :text ="AUDCLNT_E_OUT_OF_ORDER"; break; + case AUDCLNT_E_UNSUPPORTED_FORMAT :text ="AUDCLNT_E_UNSUPPORTED_FORMAT"; break; + case AUDCLNT_E_INVALID_SIZE :text ="AUDCLNT_E_INVALID_SIZE"; break; + case AUDCLNT_E_DEVICE_IN_USE :text ="AUDCLNT_E_DEVICE_IN_USE"; break; + case AUDCLNT_E_BUFFER_OPERATION_PENDING :text ="AUDCLNT_E_BUFFER_OPERATION_PENDING"; break; + case AUDCLNT_E_THREAD_NOT_REGISTERED :text ="AUDCLNT_E_THREAD_NOT_REGISTERED"; break; + case AUDCLNT_E_EXCLUSIVE_MODE_NOT_ALLOWED :text ="AUDCLNT_E_EXCLUSIVE_MODE_NOT_ALLOWED"; break; + case AUDCLNT_E_ENDPOINT_CREATE_FAILED :text ="AUDCLNT_E_ENDPOINT_CREATE_FAILED"; break; + case AUDCLNT_E_SERVICE_NOT_RUNNING :text ="AUDCLNT_E_SERVICE_NOT_RUNNING"; break; + case AUDCLNT_E_EVENTHANDLE_NOT_EXPECTED :text ="AUDCLNT_E_EVENTHANDLE_NOT_EXPECTED"; break; + case AUDCLNT_E_EXCLUSIVE_MODE_ONLY :text ="AUDCLNT_E_EXCLUSIVE_MODE_ONLY"; break; + case AUDCLNT_E_BUFDURATION_PERIOD_NOT_EQUAL :text ="AUDCLNT_E_BUFDURATION_PERIOD_NOT_EQUAL"; break; + case AUDCLNT_E_EVENTHANDLE_NOT_SET :text ="AUDCLNT_E_EVENTHANDLE_NOT_SET"; break; + case AUDCLNT_E_INCORRECT_BUFFER_SIZE :text ="AUDCLNT_E_INCORRECT_BUFFER_SIZE"; break; + case AUDCLNT_E_BUFFER_SIZE_ERROR :text ="AUDCLNT_E_BUFFER_SIZE_ERROR"; break; + case AUDCLNT_E_CPUUSAGE_EXCEEDED :text ="AUDCLNT_E_CPUUSAGE_EXCEEDED"; break; + case AUDCLNT_E_BUFFER_ERROR :text ="AUDCLNT_E_BUFFER_ERROR"; break; + case AUDCLNT_E_BUFFER_SIZE_NOT_ALIGNED :text ="AUDCLNT_E_BUFFER_SIZE_NOT_ALIGNED"; break; + case AUDCLNT_E_INVALID_DEVICE_PERIOD :text ="AUDCLNT_E_INVALID_DEVICE_PERIOD"; break; #ifdef AUDCLNT_E_INVALID_STREAM_FLAG - case AUDCLNT_E_INVALID_STREAM_FLAG :text ="AUDCLNT_E_INVALID_STREAM_FLAG"; break; + case AUDCLNT_E_INVALID_STREAM_FLAG :text ="AUDCLNT_E_INVALID_STREAM_FLAG"; break; #endif #ifdef AUDCLNT_E_ENDPOINT_OFFLOAD_NOT_CAPABLE - case AUDCLNT_E_ENDPOINT_OFFLOAD_NOT_CAPABLE :text ="AUDCLNT_E_ENDPOINT_OFFLOAD_NOT_CAPABLE"; break; + case AUDCLNT_E_ENDPOINT_OFFLOAD_NOT_CAPABLE :text ="AUDCLNT_E_ENDPOINT_OFFLOAD_NOT_CAPABLE"; break; #endif #ifdef AUDCLNT_E_OUT_OF_OFFLOAD_RESOURCES - case AUDCLNT_E_OUT_OF_OFFLOAD_RESOURCES :text ="AUDCLNT_E_OUT_OF_OFFLOAD_RESOURCES"; break; + case AUDCLNT_E_OUT_OF_OFFLOAD_RESOURCES :text ="AUDCLNT_E_OUT_OF_OFFLOAD_RESOURCES"; break; #endif #ifdef AUDCLNT_E_OFFLOAD_MODE_ONLY - case AUDCLNT_E_OFFLOAD_MODE_ONLY :text ="AUDCLNT_E_OFFLOAD_MODE_ONLY"; break; + case AUDCLNT_E_OFFLOAD_MODE_ONLY :text ="AUDCLNT_E_OFFLOAD_MODE_ONLY"; break; #endif #ifdef AUDCLNT_E_NONOFFLOAD_MODE_ONLY - case AUDCLNT_E_NONOFFLOAD_MODE_ONLY :text ="AUDCLNT_E_NONOFFLOAD_MODE_ONLY"; break; + case AUDCLNT_E_NONOFFLOAD_MODE_ONLY :text ="AUDCLNT_E_NONOFFLOAD_MODE_ONLY"; break; #endif #ifdef AUDCLNT_E_RESOURCES_INVALIDATED - case AUDCLNT_E_RESOURCES_INVALIDATED :text ="AUDCLNT_E_RESOURCES_INVALIDATED"; break; + case AUDCLNT_E_RESOURCES_INVALIDATED :text ="AUDCLNT_E_RESOURCES_INVALIDATED"; break; #endif #ifdef AUDCLNT_E_RAW_MODE_UNSUPPORTED - case AUDCLNT_E_RAW_MODE_UNSUPPORTED :text ="AUDCLNT_E_RAW_MODE_UNSUPPORTED"; break; + case AUDCLNT_E_RAW_MODE_UNSUPPORTED :text ="AUDCLNT_E_RAW_MODE_UNSUPPORTED"; break; #endif #ifdef AUDCLNT_E_ENGINE_PERIODICITY_LOCKED - case AUDCLNT_E_ENGINE_PERIODICITY_LOCKED :text ="AUDCLNT_E_ENGINE_PERIODICITY_LOCKED"; break; + case AUDCLNT_E_ENGINE_PERIODICITY_LOCKED :text ="AUDCLNT_E_ENGINE_PERIODICITY_LOCKED"; break; #endif #ifdef AUDCLNT_E_ENGINE_FORMAT_LOCKED - case AUDCLNT_E_ENGINE_FORMAT_LOCKED :text ="AUDCLNT_E_ENGINE_FORMAT_LOCKED"; break; + case AUDCLNT_E_ENGINE_FORMAT_LOCKED :text ="AUDCLNT_E_ENGINE_FORMAT_LOCKED"; break; #endif - case AUDCLNT_S_BUFFER_EMPTY :text ="AUDCLNT_S_BUFFER_EMPTY"; break; - case AUDCLNT_S_THREAD_ALREADY_REGISTERED :text ="AUDCLNT_S_THREAD_ALREADY_REGISTERED"; break; - case AUDCLNT_S_POSITION_STALLED :text ="AUDCLNT_S_POSITION_STALLED"; break; + case AUDCLNT_S_BUFFER_EMPTY :text ="AUDCLNT_S_BUFFER_EMPTY"; break; + case AUDCLNT_S_THREAD_ALREADY_REGISTERED :text ="AUDCLNT_S_THREAD_ALREADY_REGISTERED"; break; + case AUDCLNT_S_POSITION_STALLED :text ="AUDCLNT_S_POSITION_STALLED"; break; - // other windows common errors: - case CO_E_NOTINITIALIZED :text ="CO_E_NOTINITIALIZED: you must call CoInitialize() before Pa_OpenStream()"; break; + // other windows common errors: + case CO_E_NOTINITIALIZED :text ="CO_E_NOTINITIALIZED: you must call CoInitialize() before Pa_OpenStream()"; break; - default: - text = "UNKNOWN ERROR"; + default: + text = "UNKNOWN ERROR"; } - PRINT(("WASAPI ERROR HRESULT: 0x%X : %s\n [FUNCTION: %s FILE: %s {LINE: %d}]\n", res, text, func, file, line)); + PRINT(("WASAPI ERROR HRESULT: 0x%X : %s\n [FUNCTION: %s FILE: %s {LINE: %d}]\n", res, text, func, file, line)); #ifndef PA_ENABLE_DEBUG_OUTPUT - (void)func; (void)file; (void)line; + (void)func; (void)file; (void)line; #endif - PA_SKELETON_SET_LAST_HOST_ERROR(res, text); - return res; + PA_SKELETON_SET_LAST_HOST_ERROR(res, text); + return res; } // ------------------------------------------------------------------------------------------ #define LogPaError(PAERR) __LogPaError(PAERR, __FUNCTION__, __FILE__, __LINE__) static PaError __LogPaError(PaError err, const char *func, const char *file, int line) { - if (err == paNoError) - return err; + if (err == paNoError) + return err; - PRINT(("WASAPI ERROR PAERROR: %i : %s\n [FUNCTION: %s FILE: %s {LINE: %d}]\n", err, Pa_GetErrorText(err), func, file, line)); + PRINT(("WASAPI ERROR PAERROR: %i : %s\n [FUNCTION: %s FILE: %s {LINE: %d}]\n", err, Pa_GetErrorText(err), func, file, line)); #ifndef PA_ENABLE_DEBUG_OUTPUT - (void)func; (void)file; (void)line; + (void)func; (void)file; (void)line; #endif - return err; + return err; } // ------------------------------------------------------------------------------------------ /*! \class ThreadSleepScheduler Allows to emulate thread sleep of less than 1 millisecond under Windows. Scheduler - calculates number of times the thread must run untill next sleep of 1 millisecond. - It does not make thread sleeping for real number of microseconds but rather controls - how many of imaginary microseconds the thread task can allow thread to sleep. + calculates number of times the thread must run untill next sleep of 1 millisecond. + It does not make thread sleeping for real number of microseconds but rather controls + how many of imaginary microseconds the thread task can allow thread to sleep. */ typedef struct ThreadIdleScheduler { - UINT32 m_idle_microseconds; //!< number of microseconds to sleep - UINT32 m_next_sleep; //!< next sleep round - UINT32 m_i; //!< current round iterator position - UINT32 m_resolution; //!< resolution in number of milliseconds + UINT32 m_idle_microseconds; //!< number of microseconds to sleep + UINT32 m_next_sleep; //!< next sleep round + UINT32 m_i; //!< current round iterator position + UINT32 m_resolution; //!< resolution in number of milliseconds } ThreadIdleScheduler; //! Setup scheduler. static void ThreadIdleScheduler_Setup(ThreadIdleScheduler *sched, UINT32 resolution, UINT32 microseconds) { - assert(microseconds != 0); - assert(resolution != 0); - assert((resolution * 1000) >= microseconds); + assert(microseconds != 0); + assert(resolution != 0); + assert((resolution * 1000) >= microseconds); - memset(sched, 0, sizeof(*sched)); + memset(sched, 0, sizeof(*sched)); - sched->m_idle_microseconds = microseconds; - sched->m_resolution = resolution; - sched->m_next_sleep = (resolution * 1000) / microseconds; + sched->m_idle_microseconds = microseconds; + sched->m_resolution = resolution; + sched->m_next_sleep = (resolution * 1000) / microseconds; } //! Iterate and check if can sleep. static inline UINT32 ThreadIdleScheduler_NextSleep(ThreadIdleScheduler *sched) { - // advance and check if thread can sleep - if (++sched->m_i == sched->m_next_sleep) - { - sched->m_i = 0; - return sched->m_resolution; - } - return 0; + // advance and check if thread can sleep + if (++sched->m_i == sched->m_next_sleep) + { + sched->m_i = 0; + return sched->m_resolution; + } + return 0; } // ------------------------------------------------------------------------------------------ typedef struct _SystemTimer { - UINT32 granularity; + UINT32 granularity; } SystemTimer; static LARGE_INTEGER g_SystemTimerFrequency; @@ -784,66 +784,66 @@ static BOOL g_SystemTimerUseQpc = FALSE; static BOOL SystemTimer_SetGranularity(SystemTimer *timer, UINT32 granularity) { #ifndef PA_WINRT - TIMECAPS caps; + TIMECAPS caps; - timer->granularity = granularity; + timer->granularity = granularity; - if (timeGetDevCaps(&caps, sizeof(caps)) == MMSYSERR_NOERROR) - { - if (timer->granularity < caps.wPeriodMin) - timer->granularity = caps.wPeriodMin; - } + if (timeGetDevCaps(&caps, sizeof(caps)) == MMSYSERR_NOERROR) + { + if (timer->granularity < caps.wPeriodMin) + timer->granularity = caps.wPeriodMin; + } if (timeBeginPeriod(timer->granularity) != TIMERR_NOERROR) - { + { PRINT(("SetSystemTimer: timeBeginPeriod(1) failed!\n")); - timer->granularity = 0; - return FALSE; + timer->granularity = 0; + return FALSE; } #endif - return TRUE; + return TRUE; } //! Restore granularity of the system timer. static void SystemTimer_RestoreGranularity(SystemTimer *timer) { #ifndef PA_WINRT - if (timer->granularity != 0) - { - if (timeEndPeriod(timer->granularity) != TIMERR_NOERROR) - { - PRINT(("RestoreSystemTimer: timeEndPeriod(1) failed!\n")); - } - } + if (timer->granularity != 0) + { + if (timeEndPeriod(timer->granularity) != TIMERR_NOERROR) + { + PRINT(("RestoreSystemTimer: timeEndPeriod(1) failed!\n")); + } + } #endif } //! Initialize high-resolution time getter. static void SystemTimer_InitializeTimeGetter() { - g_SystemTimerUseQpc = QueryPerformanceFrequency(&g_SystemTimerFrequency); + g_SystemTimerUseQpc = QueryPerformanceFrequency(&g_SystemTimerFrequency); } //! Get high-resolution time in milliseconds (using QPC by default). static inline LONGLONG SystemTimer_GetTime(SystemTimer *timer) { - // QPC: https://docs.microsoft.com/en-us/windows/win32/sysinfo/acquiring-high-resolution-time-stamps - if (g_SystemTimerUseQpc) - { - LARGE_INTEGER now; - QueryPerformanceCounter(&now); - return (now.QuadPart * 1000LL) / g_SystemTimerFrequency.QuadPart; - } - else - { - #ifdef PA_WINRT - return GetTickCount64(); - #else - return timeGetTime(); - #endif - } + // QPC: https://docs.microsoft.com/en-us/windows/win32/sysinfo/acquiring-high-resolution-time-stamps + if (g_SystemTimerUseQpc) + { + LARGE_INTEGER now; + QueryPerformanceCounter(&now); + return (now.QuadPart * 1000LL) / g_SystemTimerFrequency.QuadPart; + } + else + { + #ifdef PA_WINRT + return GetTickCount64(); + #else + return timeGetTime(); + #endif + } } // ------------------------------------------------------------------------------------------ @@ -852,7 +852,7 @@ static inline LONGLONG SystemTimer_GetTime(SystemTimer *timer) // 1 nano = 0.000000001 seconds //100 nano = 0.0000001 seconds //100 nano = 0.0001 milliseconds - return ((double)ref)*0.0001; + return ((double)ref) * 0.0001; }*/ // ------------------------------------------------------------------------------------------ @@ -861,7 +861,7 @@ static double nano100ToSeconds(REFERENCE_TIME ref) // 1 nano = 0.000000001 seconds //100 nano = 0.0000001 seconds //100 nano = 0.0001 milliseconds - return ((double)ref)*0.0000001; + return ((double)ref) * 0.0000001; } // ------------------------------------------------------------------------------------------ @@ -870,7 +870,7 @@ static double nano100ToSeconds(REFERENCE_TIME ref) // 1 nano = 0.000000001 seconds //100 nano = 0.0000001 seconds //100 nano = 0.0001 milliseconds - return (REFERENCE_TIME)(ref/0.0001); + return (REFERENCE_TIME)(ref / 0.0001); }*/ // ------------------------------------------------------------------------------------------ @@ -879,14 +879,14 @@ static REFERENCE_TIME SecondsTonano100(double ref) // 1 nano = 0.000000001 seconds //100 nano = 0.0000001 seconds //100 nano = 0.0001 milliseconds - return (REFERENCE_TIME)(ref/0.0000001); + return (REFERENCE_TIME)(ref / 0.0000001); } // ------------------------------------------------------------------------------------------ // Makes Hns period from frames and sample rate static REFERENCE_TIME MakeHnsPeriod(UINT32 nFrames, DWORD nSamplesPerSec) { - return (REFERENCE_TIME)((10000.0 * 1000 / nSamplesPerSec * nFrames) + 0.5); + return (REFERENCE_TIME)((10000.0 * 1000 / nSamplesPerSec * nFrames) + 0.5); } // ------------------------------------------------------------------------------------------ @@ -894,17 +894,17 @@ static REFERENCE_TIME MakeHnsPeriod(UINT32 nFrames, DWORD nSamplesPerSec) // Note: paCustomFormat stands for 8.24 format (24-bits inside 32-bit containers) static WORD PaSampleFormatToBitsPerSample(PaSampleFormat format_id) { - switch (format_id & ~paNonInterleaved) - { - case paFloat32: - case paInt32: return 32; - case paCustomFormat: - case paInt24: return 24; - case paInt16: return 16; - case paInt8: - case paUInt8: return 8; - } - return 0; + switch (format_id & ~paNonInterleaved) + { + case paFloat32: + case paInt32: return 32; + case paCustomFormat: + case paInt24: return 24; + case paInt16: return 16; + case paInt8: + case paUInt8: return 8; + } + return 0; } // ------------------------------------------------------------------------------------------ @@ -913,22 +913,22 @@ static WORD PaSampleFormatToBitsPerSample(PaSampleFormat format_id) // Note: paCustomFormat stands for 8.24 format (24-bits inside 32-bit containers) static PaSampleFormat GetSampleFormatForIO(PaSampleFormat format_id) { - return ((format_id & ~paNonInterleaved) == paCustomFormat ? - (paInt32 | (format_id & paNonInterleaved ? paNonInterleaved : 0)) : format_id); + return ((format_id & ~paNonInterleaved) == paCustomFormat ? + (paInt32 | (format_id & paNonInterleaved ? paNonInterleaved : 0)) : format_id); } // ------------------------------------------------------------------------------------------ // Converts Hns period into number of frames static UINT32 MakeFramesFromHns(REFERENCE_TIME hnsPeriod, UINT32 nSamplesPerSec) { - UINT32 nFrames = (UINT32)( // frames = - 1.0 * hnsPeriod * // hns * - nSamplesPerSec / // (frames / s) / - 1000 / // (ms / s) / - 10000 // (hns / s) / - + 0.5 // rounding + UINT32 nFrames = (UINT32)( // frames = + 1.0 * hnsPeriod * // hns * + nSamplesPerSec / // (frames / s) / + 1000 / // (ms / s) / + 10000 // (hns / s) / + + 0.5 // rounding ); - return nFrames; + return nFrames; } // Aligning function type @@ -938,27 +938,27 @@ typedef UINT32 (*ALIGN_FUNC) (UINT32 v, UINT32 align); // Aligns 'v' backwards static UINT32 ALIGN_BWD(UINT32 v, UINT32 align) { - return ((v - (align ? v % align : 0))); + return ((v - (align ? v % align : 0))); } // ------------------------------------------------------------------------------------------ // Aligns 'v' forward static UINT32 ALIGN_FWD(UINT32 v, UINT32 align) { - UINT32 remainder = (align ? (v % align) : 0); - if (remainder == 0) - return v; - return v + (align - remainder); + UINT32 remainder = (align ? (v % align) : 0); + if (remainder == 0) + return v; + return v + (align - remainder); } // ------------------------------------------------------------------------------------------ // Get next value power of 2 static UINT32 ALIGN_NEXT_POW2(UINT32 v) { - UINT32 v2 = 1; - while (v > (v2 <<= 1)) { } - v = v2; - return v; + UINT32 v2 = 1; + while (v > (v2 <<= 1)) { } + v = v2; + return v; } // ------------------------------------------------------------------------------------------ @@ -966,28 +966,28 @@ static UINT32 ALIGN_NEXT_POW2(UINT32 v) // is misaligned. This problem was solved in Windows 7 were AUDCLNT_E_BUFFER_SIZE_NOT_ALIGNED // is thrown although we must align for Vista anyway. static UINT32 AlignFramesPerBuffer(UINT32 nFrames, UINT32 nSamplesPerSec, UINT32 nBlockAlign, - ALIGN_FUNC pAlignFunc) + ALIGN_FUNC pAlignFunc) { #define HDA_PACKET_SIZE (128) - long frame_bytes = nFrames * nBlockAlign; - long packets; - (void)nSamplesPerSec; + long frame_bytes = nFrames * nBlockAlign; + long packets; + (void)nSamplesPerSec; - // align to packet size - frame_bytes = pAlignFunc(frame_bytes, HDA_PACKET_SIZE); // use ALIGN_FWD if bigger but safer period is more desired + // align to packet size + frame_bytes = pAlignFunc(frame_bytes, HDA_PACKET_SIZE); // use ALIGN_FWD if bigger but safer period is more desired - // atlest 1 frame must be available - if (frame_bytes < HDA_PACKET_SIZE) - frame_bytes = HDA_PACKET_SIZE; + // atlest 1 frame must be available + if (frame_bytes < HDA_PACKET_SIZE) + frame_bytes = HDA_PACKET_SIZE; - nFrames = frame_bytes / nBlockAlign; - packets = frame_bytes / HDA_PACKET_SIZE; + nFrames = frame_bytes / nBlockAlign; + packets = frame_bytes / HDA_PACKET_SIZE; - frame_bytes = packets * HDA_PACKET_SIZE; - nFrames = frame_bytes / nBlockAlign; + frame_bytes = packets * HDA_PACKET_SIZE; + nFrames = frame_bytes / nBlockAlign; - return nFrames; + return nFrames; #undef HDA_PACKET_SIZE } @@ -995,16 +995,16 @@ static UINT32 AlignFramesPerBuffer(UINT32 nFrames, UINT32 nSamplesPerSec, UINT32 // ------------------------------------------------------------------------------------------ static UINT32 GetFramesSleepTime(REFERENCE_TIME nFrames, REFERENCE_TIME nSamplesPerSec) { - REFERENCE_TIME nDuration; - if (nSamplesPerSec == 0) - return 0; + REFERENCE_TIME nDuration; + if (nSamplesPerSec == 0) + return 0; #define REFTIMES_PER_SEC 10000000LL #define REFTIMES_PER_MILLISEC 10000LL - // Calculate the actual duration of the allocated buffer. - nDuration = (REFTIMES_PER_SEC * nFrames) / nSamplesPerSec; - return (UINT32)(nDuration / REFTIMES_PER_MILLISEC); + // Calculate the actual duration of the allocated buffer. + nDuration = (REFTIMES_PER_SEC * nFrames) / nSamplesPerSec; + return (UINT32)(nDuration / REFTIMES_PER_MILLISEC); #undef REFTIMES_PER_SEC #undef REFTIMES_PER_MILLISEC @@ -1013,16 +1013,16 @@ static UINT32 GetFramesSleepTime(REFERENCE_TIME nFrames, REFERENCE_TIME nSamples // ------------------------------------------------------------------------------------------ static UINT32 GetFramesSleepTimeMicroseconds(REFERENCE_TIME nFrames, REFERENCE_TIME nSamplesPerSec) { - REFERENCE_TIME nDuration; - if (nSamplesPerSec == 0) - return 0; + REFERENCE_TIME nDuration; + if (nSamplesPerSec == 0) + return 0; #define REFTIMES_PER_SEC 10000000LL #define REFTIMES_PER_MILLISEC 10000LL - // Calculate the actual duration of the allocated buffer. - nDuration = (REFTIMES_PER_SEC * nFrames) / nSamplesPerSec; - return (UINT32)(nDuration / 10); + // Calculate the actual duration of the allocated buffer. + nDuration = (REFTIMES_PER_SEC * nFrames) / nSamplesPerSec; + return (UINT32)(nDuration / 10); #undef REFTIMES_PER_SEC #undef REFTIMES_PER_MILLISEC @@ -1040,15 +1040,15 @@ static BOOL SetupAVRT() _GetProc(pAvRtDeleteThreadOrderingGroup, FAvRtDeleteThreadOrderingGroup, "AvRtDeleteThreadOrderingGroup"); _GetProc(pAvRtWaitOnThreadOrderingGroup, FAvRtWaitOnThreadOrderingGroup, "AvRtWaitOnThreadOrderingGroup"); _GetProc(pAvSetMmThreadCharacteristics, FAvSetMmThreadCharacteristics, "AvSetMmThreadCharacteristicsA"); - _GetProc(pAvRevertMmThreadCharacteristics,FAvRevertMmThreadCharacteristics,"AvRevertMmThreadCharacteristics"); + _GetProc(pAvRevertMmThreadCharacteristics,FAvRevertMmThreadCharacteristics,"AvRevertMmThreadCharacteristics"); _GetProc(pAvSetMmThreadPriority, FAvSetMmThreadPriority, "AvSetMmThreadPriority"); - return pAvRtCreateThreadOrderingGroup && - pAvRtDeleteThreadOrderingGroup && - pAvRtWaitOnThreadOrderingGroup && - pAvSetMmThreadCharacteristics && - pAvRevertMmThreadCharacteristics && - pAvSetMmThreadPriority; + return pAvRtCreateThreadOrderingGroup && + pAvRtDeleteThreadOrderingGroup && + pAvRtWaitOnThreadOrderingGroup && + pAvSetMmThreadCharacteristics && + pAvRevertMmThreadCharacteristics && + pAvSetMmThreadPriority; } #endif @@ -1056,9 +1056,9 @@ static BOOL SetupAVRT() static void CloseAVRT() { #ifndef PA_WINRT - if (hDInputDLL != NULL) - FreeLibrary(hDInputDLL); - hDInputDLL = NULL; + if (hDInputDLL != NULL) + FreeLibrary(hDInputDLL); + hDInputDLL = NULL; #endif } @@ -1067,10 +1067,10 @@ static BOOL IsWow64() { #ifndef PA_WINRT - // http://msdn.microsoft.com/en-us/library/ms684139(VS.85).aspx + // http://msdn.microsoft.com/en-us/library/ms684139(VS.85).aspx - typedef BOOL (WINAPI *LPFN_ISWOW64PROCESS) (HANDLE, PBOOL); - LPFN_ISWOW64PROCESS fnIsWow64Process; + typedef BOOL (WINAPI *LPFN_ISWOW64PROCESS) (HANDLE, PBOOL); + LPFN_ISWOW64PROCESS fnIsWow64Process; BOOL bIsWow64 = FALSE; @@ -1082,16 +1082,16 @@ static BOOL IsWow64() GetModuleHandleA("kernel32"), "IsWow64Process"); if (fnIsWow64Process == NULL) - return FALSE; + return FALSE; if (!fnIsWow64Process(GetCurrentProcess(), &bIsWow64)) - return FALSE; + return FALSE; return bIsWow64; #else - return FALSE; + return FALSE; #endif } @@ -1099,277 +1099,277 @@ static BOOL IsWow64() // ------------------------------------------------------------------------------------------ typedef enum EWindowsVersion { - WINDOWS_UNKNOWN = 0, - WINDOWS_VISTA_SERVER2008, - WINDOWS_7_SERVER2008R2, - WINDOWS_8_SERVER2012, - WINDOWS_8_1_SERVER2012R2, - WINDOWS_10_SERVER2016, - WINDOWS_FUTURE + WINDOWS_UNKNOWN = 0, + WINDOWS_VISTA_SERVER2008, + WINDOWS_7_SERVER2008R2, + WINDOWS_8_SERVER2012, + WINDOWS_8_1_SERVER2012R2, + WINDOWS_10_SERVER2016, + WINDOWS_FUTURE } EWindowsVersion; // Alternative way for checking Windows version (allows to check version on Windows 8.1 and up) #ifndef PA_WINRT static BOOL IsWindowsVersionOrGreater(WORD wMajorVersion, WORD wMinorVersion, WORD wServicePackMajor) { - typedef ULONGLONG (NTAPI *LPFN_VERSETCONDITIONMASK)(ULONGLONG ConditionMask, DWORD TypeMask, BYTE Condition); - typedef BOOL (WINAPI *LPFN_VERIFYVERSIONINFO)(LPOSVERSIONINFOEXA lpVersionInformation, DWORD dwTypeMask, DWORDLONG dwlConditionMask); + typedef ULONGLONG (NTAPI *LPFN_VERSETCONDITIONMASK)(ULONGLONG ConditionMask, DWORD TypeMask, BYTE Condition); + typedef BOOL (WINAPI *LPFN_VERIFYVERSIONINFO)(LPOSVERSIONINFOEXA lpVersionInformation, DWORD dwTypeMask, DWORDLONG dwlConditionMask); - LPFN_VERSETCONDITIONMASK fnVerSetConditionMask; - LPFN_VERIFYVERSIONINFO fnVerifyVersionInfo; - OSVERSIONINFOEXA osvi = { sizeof(osvi), 0, 0, 0, 0, {0}, 0, 0 }; - DWORDLONG dwlConditionMask; + LPFN_VERSETCONDITIONMASK fnVerSetConditionMask; + LPFN_VERIFYVERSIONINFO fnVerifyVersionInfo; + OSVERSIONINFOEXA osvi = { sizeof(osvi), 0, 0, 0, 0, {0}, 0, 0 }; + DWORDLONG dwlConditionMask; - fnVerSetConditionMask = (LPFN_VERSETCONDITIONMASK)GetProcAddress(GetModuleHandleA("kernel32"), "VerSetConditionMask"); - fnVerifyVersionInfo = (LPFN_VERIFYVERSIONINFO)GetProcAddress(GetModuleHandleA("kernel32"), "VerifyVersionInfoA"); + fnVerSetConditionMask = (LPFN_VERSETCONDITIONMASK)GetProcAddress(GetModuleHandleA("kernel32"), "VerSetConditionMask"); + fnVerifyVersionInfo = (LPFN_VERIFYVERSIONINFO)GetProcAddress(GetModuleHandleA("kernel32"), "VerifyVersionInfoA"); - if ((fnVerSetConditionMask == NULL) || (fnVerifyVersionInfo == NULL)) - return FALSE; + if ((fnVerSetConditionMask == NULL) || (fnVerifyVersionInfo == NULL)) + return FALSE; - dwlConditionMask = fnVerSetConditionMask( - fnVerSetConditionMask( - fnVerSetConditionMask( - 0, VER_MAJORVERSION, VER_GREATER_EQUAL), - VER_MINORVERSION, VER_GREATER_EQUAL), - VER_SERVICEPACKMAJOR, VER_GREATER_EQUAL); + dwlConditionMask = fnVerSetConditionMask( + fnVerSetConditionMask( + fnVerSetConditionMask( + 0, VER_MAJORVERSION, VER_GREATER_EQUAL), + VER_MINORVERSION, VER_GREATER_EQUAL), + VER_SERVICEPACKMAJOR, VER_GREATER_EQUAL); - osvi.dwMajorVersion = wMajorVersion; - osvi.dwMinorVersion = wMinorVersion; - osvi.wServicePackMajor = wServicePackMajor; + osvi.dwMajorVersion = wMajorVersion; + osvi.dwMinorVersion = wMinorVersion; + osvi.wServicePackMajor = wServicePackMajor; - return (fnVerifyVersionInfo(&osvi, VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR, dwlConditionMask) != FALSE); + return (fnVerifyVersionInfo(&osvi, VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR, dwlConditionMask) != FALSE); } #endif // Get Windows version static EWindowsVersion GetWindowsVersion() { #ifndef PA_WINRT - static EWindowsVersion version = WINDOWS_UNKNOWN; + static EWindowsVersion version = WINDOWS_UNKNOWN; - if (version == WINDOWS_UNKNOWN) - { - DWORD dwMajorVersion = 0xFFFFFFFFU, dwMinorVersion = 0, dwBuild = 0; - - // RTL_OSVERSIONINFOW equals OSVERSIONINFOW but it is missing inb MinGW winnt.h header, - // thus use OSVERSIONINFOW for greater portability - typedef NTSTATUS (WINAPI *LPFN_RTLGETVERSION)(POSVERSIONINFOW lpVersionInformation); - LPFN_RTLGETVERSION fnRtlGetVersion; + if (version == WINDOWS_UNKNOWN) + { + DWORD dwMajorVersion = 0xFFFFFFFFU, dwMinorVersion = 0, dwBuild = 0; + + // RTL_OSVERSIONINFOW equals OSVERSIONINFOW but it is missing inb MinGW winnt.h header, + // thus use OSVERSIONINFOW for greater portability + typedef NTSTATUS (WINAPI *LPFN_RTLGETVERSION)(POSVERSIONINFOW lpVersionInformation); + LPFN_RTLGETVERSION fnRtlGetVersion; - #define NTSTATUS_SUCCESS ((NTSTATUS)0x00000000L) + #define NTSTATUS_SUCCESS ((NTSTATUS)0x00000000L) - // RtlGetVersion must be able to provide true Windows version (Windows 10 may be reported as Windows 8 - // by GetVersion API) - if ((fnRtlGetVersion = (LPFN_RTLGETVERSION)GetProcAddress(GetModuleHandleA("ntdll"), "RtlGetVersion")) != NULL) - { - OSVERSIONINFOW ver = { sizeof(OSVERSIONINFOW), 0, 0, 0, 0, {0} }; + // RtlGetVersion must be able to provide true Windows version (Windows 10 may be reported as Windows 8 + // by GetVersion API) + if ((fnRtlGetVersion = (LPFN_RTLGETVERSION)GetProcAddress(GetModuleHandleA("ntdll"), "RtlGetVersion")) != NULL) + { + OSVERSIONINFOW ver = { sizeof(OSVERSIONINFOW), 0, 0, 0, 0, {0} }; - PRINT(("WASAPI: getting Windows version with RtlGetVersion()\n")); + PRINT(("WASAPI: getting Windows version with RtlGetVersion()\n")); - if (fnRtlGetVersion(&ver) == NTSTATUS_SUCCESS) - { - dwMajorVersion = ver.dwMajorVersion; - dwMinorVersion = ver.dwMinorVersion; - dwBuild = ver.dwBuildNumber; - } - } + if (fnRtlGetVersion(&ver) == NTSTATUS_SUCCESS) + { + dwMajorVersion = ver.dwMajorVersion; + dwMinorVersion = ver.dwMinorVersion; + dwBuild = ver.dwBuildNumber; + } + } - #undef NTSTATUS_SUCCESS + #undef NTSTATUS_SUCCESS - // fallback to GetVersion if RtlGetVersion is missing - if (dwMajorVersion == 0xFFFFFFFFU) - { - typedef DWORD (WINAPI *LPFN_GETVERSION)(VOID); - LPFN_GETVERSION fnGetVersion; + // fallback to GetVersion if RtlGetVersion is missing + if (dwMajorVersion == 0xFFFFFFFFU) + { + typedef DWORD (WINAPI *LPFN_GETVERSION)(VOID); + LPFN_GETVERSION fnGetVersion; - if ((fnGetVersion = (LPFN_GETVERSION)GetProcAddress(GetModuleHandleA("kernel32"), "GetVersion")) != NULL) - { - DWORD dwVersion; + if ((fnGetVersion = (LPFN_GETVERSION)GetProcAddress(GetModuleHandleA("kernel32"), "GetVersion")) != NULL) + { + DWORD dwVersion; - PRINT(("WASAPI: getting Windows version with GetVersion()\n")); + PRINT(("WASAPI: getting Windows version with GetVersion()\n")); - dwVersion = fnGetVersion(); + dwVersion = fnGetVersion(); - dwMajorVersion = (DWORD)(LOBYTE(LOWORD(dwVersion))); - dwMinorVersion = (DWORD)(HIBYTE(LOWORD(dwVersion))); + dwMajorVersion = (DWORD)(LOBYTE(LOWORD(dwVersion))); + dwMinorVersion = (DWORD)(HIBYTE(LOWORD(dwVersion))); - if (dwVersion < 0x80000000) - dwBuild = (DWORD)(HIWORD(dwVersion)); - } - } + if (dwVersion < 0x80000000) + dwBuild = (DWORD)(HIWORD(dwVersion)); + } + } - if (dwMajorVersion != 0xFFFFFFFFU) - { - switch (dwMajorVersion) - { - case 0: - case 1: - case 2: - case 3: - case 4: - case 5: - break; // skip lower - case 6: - switch (dwMinorVersion) - { - case 0: version = WINDOWS_VISTA_SERVER2008; break; - case 1: version = WINDOWS_7_SERVER2008R2; break; - case 2: version = WINDOWS_8_SERVER2012; break; - case 3: version = WINDOWS_8_1_SERVER2012R2; break; - default: version = WINDOWS_FUTURE; break; - } - break; - case 10: - switch (dwMinorVersion) - { - case 0: version = WINDOWS_10_SERVER2016; break; - default: version = WINDOWS_FUTURE; break; - } - break; - default: - version = WINDOWS_FUTURE; - break; - } - } - // fallback to VerifyVersionInfo if RtlGetVersion and GetVersion are missing - else - { - PRINT(("WASAPI: getting Windows version with VerifyVersionInfo()\n")); + if (dwMajorVersion != 0xFFFFFFFFU) + { + switch (dwMajorVersion) + { + case 0: + case 1: + case 2: + case 3: + case 4: + case 5: + break; // skip lower + case 6: + switch (dwMinorVersion) + { + case 0: version = WINDOWS_VISTA_SERVER2008; break; + case 1: version = WINDOWS_7_SERVER2008R2; break; + case 2: version = WINDOWS_8_SERVER2012; break; + case 3: version = WINDOWS_8_1_SERVER2012R2; break; + default: version = WINDOWS_FUTURE; break; + } + break; + case 10: + switch (dwMinorVersion) + { + case 0: version = WINDOWS_10_SERVER2016; break; + default: version = WINDOWS_FUTURE; break; + } + break; + default: + version = WINDOWS_FUTURE; + break; + } + } + // fallback to VerifyVersionInfo if RtlGetVersion and GetVersion are missing + else + { + PRINT(("WASAPI: getting Windows version with VerifyVersionInfo()\n")); - if (IsWindowsVersionOrGreater(10, 0, 0)) - version = WINDOWS_10_SERVER2016; - else - if (IsWindowsVersionOrGreater(6, 3, 0)) - version = WINDOWS_8_1_SERVER2012R2; - else - if (IsWindowsVersionOrGreater(6, 2, 0)) - version = WINDOWS_8_SERVER2012; - else - if (IsWindowsVersionOrGreater(6, 1, 0)) - version = WINDOWS_7_SERVER2008R2; - else - if (IsWindowsVersionOrGreater(6, 0, 0)) - version = WINDOWS_VISTA_SERVER2008; - else - version = WINDOWS_FUTURE; - } + if (IsWindowsVersionOrGreater(10, 0, 0)) + version = WINDOWS_10_SERVER2016; + else + if (IsWindowsVersionOrGreater(6, 3, 0)) + version = WINDOWS_8_1_SERVER2012R2; + else + if (IsWindowsVersionOrGreater(6, 2, 0)) + version = WINDOWS_8_SERVER2012; + else + if (IsWindowsVersionOrGreater(6, 1, 0)) + version = WINDOWS_7_SERVER2008R2; + else + if (IsWindowsVersionOrGreater(6, 0, 0)) + version = WINDOWS_VISTA_SERVER2008; + else + version = WINDOWS_FUTURE; + } - PRINT(("WASAPI: Windows version = %d\n", version)); - } + PRINT(("WASAPI: Windows version = %d\n", version)); + } - return version; + return version; #else - #if (_WIN32_WINNT >= _WIN32_WINNT_WIN10) - return WINDOWS_10_SERVER2016; - #else - return WINDOWS_8_SERVER2012; - #endif + #if (_WIN32_WINNT >= _WIN32_WINNT_WIN10) + return WINDOWS_10_SERVER2016; + #else + return WINDOWS_8_SERVER2012; + #endif #endif } // ------------------------------------------------------------------------------------------ static BOOL UseWOW64Workaround() { - // note: WOW64 bug is common to Windows Vista x64, thus we fall back to safe Poll-driven - // method. Windows 7 x64 seems has WOW64 bug fixed. + // note: WOW64 bug is common to Windows Vista x64, thus we fall back to safe Poll-driven + // method. Windows 7 x64 seems has WOW64 bug fixed. - return (IsWow64() && (GetWindowsVersion() == WINDOWS_VISTA_SERVER2008)); + return (IsWow64() && (GetWindowsVersion() == WINDOWS_VISTA_SERVER2008)); } // ------------------------------------------------------------------------------------------ static UINT32 GetAudioClientVersion() { - if (GetWindowsVersion() >= WINDOWS_10_SERVER2016) - return 3; - else - if (GetWindowsVersion() >= WINDOWS_8_SERVER2012) - return 2; + if (GetWindowsVersion() >= WINDOWS_10_SERVER2016) + return 3; + else + if (GetWindowsVersion() >= WINDOWS_8_SERVER2012) + return 2; - return 1; + return 1; } // ------------------------------------------------------------------------------------------ static const IID *GetAudioClientIID() { - static const IID *cli_iid = NULL; - if (cli_iid == NULL) - { - UINT32 cli_version = GetAudioClientVersion(); - switch (cli_version) - { - case 3: cli_iid = &pa_IID_IAudioClient3; break; - case 2: cli_iid = &pa_IID_IAudioClient2; break; - default: cli_iid = &pa_IID_IAudioClient; break; - } + static const IID *cli_iid = NULL; + if (cli_iid == NULL) + { + UINT32 cli_version = GetAudioClientVersion(); + switch (cli_version) + { + case 3: cli_iid = &pa_IID_IAudioClient3; break; + case 2: cli_iid = &pa_IID_IAudioClient2; break; + default: cli_iid = &pa_IID_IAudioClient; break; + } - PRINT(("WASAPI: IAudioClient version = %d\n", cli_version)); - } + PRINT(("WASAPI: IAudioClient version = %d\n", cli_version)); + } - return cli_iid; + return cli_iid; } // ------------------------------------------------------------------------------------------ typedef enum EMixDirection { - MIX_DIR__1TO2, //!< mix one channel to L and R - MIX_DIR__2TO1, //!< mix L and R channels to one channel - MIX_DIR__2TO1_L //!< mix only L channel (of total 2 channels) to one channel + MIX_DIR__1TO2, //!< mix one channel to L and R + MIX_DIR__2TO1, //!< mix L and R channels to one channel + MIX_DIR__2TO1_L //!< mix only L channel (of total 2 channels) to one channel } EMixDirection; // ------------------------------------------------------------------------------------------ #define _WASAPI_MONO_TO_STEREO_MIXER_1_TO_2(TYPE)\ - TYPE * __restrict to = (TYPE *)__to;\ - const TYPE * __restrict from = (const TYPE *)__from;\ - const TYPE * __restrict end = from + count;\ - while (from != end)\ - {\ - to[0] = to[1] = *from ++;\ - to += 2;\ - } + TYPE * __restrict to = (TYPE *)__to;\ + const TYPE * __restrict from = (const TYPE *)__from;\ + const TYPE * __restrict end = from + count;\ + while (from != end)\ + {\ + to[0] = to[1] = *from ++;\ + to += 2;\ + } // ------------------------------------------------------------------------------------------ #define _WASAPI_MONO_TO_STEREO_MIXER_2_TO_1_FLT32(TYPE)\ - TYPE * __restrict to = (TYPE *)__to;\ - const TYPE * __restrict from = (const TYPE *)__from;\ - const TYPE * __restrict end = to + count;\ - while (to != end)\ - {\ - *to ++ = (TYPE)((float)(from[0] + from[1]) * 0.5f);\ - from += 2;\ - } + TYPE * __restrict to = (TYPE *)__to;\ + const TYPE * __restrict from = (const TYPE *)__from;\ + const TYPE * __restrict end = to + count;\ + while (to != end)\ + {\ + *to ++ = (TYPE)((float)(from[0] + from[1]) * 0.5f);\ + from += 2;\ + } // ------------------------------------------------------------------------------------------ #define _WASAPI_MONO_TO_STEREO_MIXER_2_TO_1_INT32(TYPE)\ - TYPE * __restrict to = (TYPE *)__to;\ - const TYPE * __restrict from = (const TYPE *)__from;\ - const TYPE * __restrict end = to + count;\ - while (to != end)\ - {\ - *to ++ = (TYPE)(((INT32)from[0] + (INT32)from[1]) >> 1);\ - from += 2;\ - } + TYPE * __restrict to = (TYPE *)__to;\ + const TYPE * __restrict from = (const TYPE *)__from;\ + const TYPE * __restrict end = to + count;\ + while (to != end)\ + {\ + *to ++ = (TYPE)(((INT32)from[0] + (INT32)from[1]) >> 1);\ + from += 2;\ + } // ------------------------------------------------------------------------------------------ #define _WASAPI_MONO_TO_STEREO_MIXER_2_TO_1_INT64(TYPE)\ - TYPE * __restrict to = (TYPE *)__to;\ - const TYPE * __restrict from = (const TYPE *)__from;\ - const TYPE * __restrict end = to + count;\ - while (to != end)\ - {\ - *to ++ = (TYPE)(((INT64)from[0] + (INT64)from[1]) >> 1);\ - from += 2;\ - } + TYPE * __restrict to = (TYPE *)__to;\ + const TYPE * __restrict from = (const TYPE *)__from;\ + const TYPE * __restrict end = to + count;\ + while (to != end)\ + {\ + *to ++ = (TYPE)(((INT64)from[0] + (INT64)from[1]) >> 1);\ + from += 2;\ + } // ------------------------------------------------------------------------------------------ #define _WASAPI_MONO_TO_STEREO_MIXER_2_TO_1_L(TYPE)\ - TYPE * __restrict to = (TYPE *)__to;\ - const TYPE * __restrict from = (const TYPE *)__from;\ - const TYPE * __restrict end = to + count;\ - while (to != end)\ - {\ - *to ++ = from[0];\ - from += 2;\ - } + TYPE * __restrict to = (TYPE *)__to;\ + const TYPE * __restrict from = (const TYPE *)__from;\ + const TYPE * __restrict end = to + count;\ + while (to != end)\ + {\ + *to ++ = from[0];\ + from += 2;\ + } // ------------------------------------------------------------------------------------------ static void _MixMonoToStereo_1TO2_8(void *__to, const void *__from, UINT32 count) { _WASAPI_MONO_TO_STEREO_MIXER_1_TO_2(BYTE); } @@ -1379,19 +1379,19 @@ static void _MixMonoToStereo_1TO2_32(void *__to, const void *__from, UINT32 coun static void _MixMonoToStereo_1TO2_32f(void *__to, const void *__from, UINT32 count) { _WASAPI_MONO_TO_STEREO_MIXER_1_TO_2(float); } static void _MixMonoToStereo_1TO2_24(void *__to, const void *__from, UINT32 count) { - const UCHAR * __restrict from = (const UCHAR *)__from; - UCHAR * __restrict to = (UCHAR *)__to; - const UCHAR * __restrict end = to + (count * (2 * 3)); + const UCHAR * __restrict from = (const UCHAR *)__from; + UCHAR * __restrict to = (UCHAR *)__to; + const UCHAR * __restrict end = to + (count * (2 * 3)); - while (to != end) - { - to[0] = to[3] = from[0]; - to[1] = to[4] = from[1]; - to[2] = to[5] = from[2]; + while (to != end) + { + to[0] = to[3] = from[0]; + to[1] = to[4] = from[1]; + to[2] = to[5] = from[2]; - from += 3; - to += (2 * 3); - } + from += 3; + to += (2 * 3); + } } // ------------------------------------------------------------------------------------------ @@ -1402,13 +1402,13 @@ static void _MixMonoToStereo_2TO1_32(void *__to, const void *__from, UINT32 coun static void _MixMonoToStereo_2TO1_32f(void *__to, const void *__from, UINT32 count) { _WASAPI_MONO_TO_STEREO_MIXER_2_TO_1_FLT32(float); } static void _MixMonoToStereo_2TO1_24(void *__to, const void *__from, UINT32 count) { - const UCHAR * __restrict from = (const UCHAR *)__from; - UCHAR * __restrict to = (UCHAR *)__to; - const UCHAR * __restrict end = to + (count * 3); - PaInt32 tempL, tempR, tempM; + const UCHAR * __restrict from = (const UCHAR *)__from; + UCHAR * __restrict to = (UCHAR *)__to; + const UCHAR * __restrict end = to + (count * 3); + PaInt32 tempL, tempR, tempM; - while (to != end) - { + while (to != end) + { tempL = (((PaInt32)from[0]) << 8); tempL = tempL | (((PaInt32)from[1]) << 16); tempL = tempL | (((PaInt32)from[2]) << 24); @@ -1417,15 +1417,15 @@ static void _MixMonoToStereo_2TO1_24(void *__to, const void *__from, UINT32 coun tempR = tempR | (((PaInt32)from[4]) << 16); tempR = tempR | (((PaInt32)from[5]) << 24); - tempM = (tempL + tempR) >> 1; + tempM = (tempL + tempR) >> 1; - to[0] = (UCHAR)(tempM >> 8); - to[1] = (UCHAR)(tempM >> 16); - to[2] = (UCHAR)(tempM >> 24); + to[0] = (UCHAR)(tempM >> 8); + to[1] = (UCHAR)(tempM >> 16); + to[2] = (UCHAR)(tempM >> 24); - from += (2 * 3); - to += 3; - } + from += (2 * 3); + to += 3; + } } // ------------------------------------------------------------------------------------------ @@ -1436,132 +1436,132 @@ static void _MixMonoToStereo_2TO1_32_L(void *__to, const void *__from, UINT32 co static void _MixMonoToStereo_2TO1_32f_L(void *__to, const void *__from, UINT32 count) { _WASAPI_MONO_TO_STEREO_MIXER_2_TO_1_L(float); } static void _MixMonoToStereo_2TO1_24_L(void *__to, const void *__from, UINT32 count) { - const UCHAR * __restrict from = (const UCHAR *)__from; - UCHAR * __restrict to = (UCHAR *)__to; - const UCHAR * __restrict end = to + (count * 3); + const UCHAR * __restrict from = (const UCHAR *)__from; + UCHAR * __restrict to = (UCHAR *)__to; + const UCHAR * __restrict end = to + (count * 3); - while (to != end) - { - to[0] = from[0]; - to[1] = from[1]; - to[2] = from[2]; + while (to != end) + { + to[0] = from[0]; + to[1] = from[1]; + to[2] = from[2]; - from += (2 * 3); - to += 3; - } + from += (2 * 3); + to += 3; + } } // ------------------------------------------------------------------------------------------ static MixMonoToStereoF GetMonoToStereoMixer(const WAVEFORMATEXTENSIBLE *fmtext, EMixDirection dir) { - PaSampleFormat format = WaveToPaFormat(fmtext); - - switch (dir) - { - case MIX_DIR__1TO2: - switch (format & ~paNonInterleaved) - { - case paUInt8: return _MixMonoToStereo_1TO2_8; - case paInt16: return _MixMonoToStereo_1TO2_16; - case paInt24: return (fmtext->Format.wBitsPerSample == 32 ? _MixMonoToStereo_1TO2_8_24 : _MixMonoToStereo_1TO2_24); - case paInt32: return _MixMonoToStereo_1TO2_32; - case paFloat32: return _MixMonoToStereo_1TO2_32f; - } - break; + PaSampleFormat format = WaveToPaFormat(fmtext); + + switch (dir) + { + case MIX_DIR__1TO2: + switch (format & ~paNonInterleaved) + { + case paUInt8: return _MixMonoToStereo_1TO2_8; + case paInt16: return _MixMonoToStereo_1TO2_16; + case paInt24: return (fmtext->Format.wBitsPerSample == 32 ? _MixMonoToStereo_1TO2_8_24 : _MixMonoToStereo_1TO2_24); + case paInt32: return _MixMonoToStereo_1TO2_32; + case paFloat32: return _MixMonoToStereo_1TO2_32f; + } + break; - case MIX_DIR__2TO1: - switch (format & ~paNonInterleaved) - { - case paUInt8: return _MixMonoToStereo_2TO1_8; - case paInt16: return _MixMonoToStereo_2TO1_16; - case paInt24: return (fmtext->Format.wBitsPerSample == 32 ? _MixMonoToStereo_2TO1_8_24 : _MixMonoToStereo_2TO1_24); - case paInt32: return _MixMonoToStereo_2TO1_32; - case paFloat32: return _MixMonoToStereo_2TO1_32f; - } - break; + case MIX_DIR__2TO1: + switch (format & ~paNonInterleaved) + { + case paUInt8: return _MixMonoToStereo_2TO1_8; + case paInt16: return _MixMonoToStereo_2TO1_16; + case paInt24: return (fmtext->Format.wBitsPerSample == 32 ? _MixMonoToStereo_2TO1_8_24 : _MixMonoToStereo_2TO1_24); + case paInt32: return _MixMonoToStereo_2TO1_32; + case paFloat32: return _MixMonoToStereo_2TO1_32f; + } + break; - case MIX_DIR__2TO1_L: - switch (format & ~paNonInterleaved) - { - case paUInt8: return _MixMonoToStereo_2TO1_8_L; - case paInt16: return _MixMonoToStereo_2TO1_16_L; - case paInt24: return (fmtext->Format.wBitsPerSample == 32 ? _MixMonoToStereo_2TO1_8_24_L : _MixMonoToStereo_2TO1_24_L); - case paInt32: return _MixMonoToStereo_2TO1_32_L; - case paFloat32: return _MixMonoToStereo_2TO1_32f_L; - } - break; - } + case MIX_DIR__2TO1_L: + switch (format & ~paNonInterleaved) + { + case paUInt8: return _MixMonoToStereo_2TO1_8_L; + case paInt16: return _MixMonoToStereo_2TO1_16_L; + case paInt24: return (fmtext->Format.wBitsPerSample == 32 ? _MixMonoToStereo_2TO1_8_24_L : _MixMonoToStereo_2TO1_24_L); + case paInt32: return _MixMonoToStereo_2TO1_32_L; + case paFloat32: return _MixMonoToStereo_2TO1_32f_L; + } + break; + } - return NULL; + return NULL; } // ------------------------------------------------------------------------------------------ #ifdef PA_WINRT typedef struct PaActivateAudioInterfaceCompletionHandler { - IActivateAudioInterfaceCompletionHandler parent; - volatile LONG refs; - volatile LONG done; - struct - { - const IID *iid; - void **obj; - } - in; - struct - { - HRESULT hr; - } - out; + IActivateAudioInterfaceCompletionHandler parent; + volatile LONG refs; + volatile LONG done; + struct + { + const IID *iid; + void **obj; + } + in; + struct + { + HRESULT hr; + } + out; } PaActivateAudioInterfaceCompletionHandler; static HRESULT (STDMETHODCALLTYPE PaActivateAudioInterfaceCompletionHandler_QueryInterface)( IActivateAudioInterfaceCompletionHandler *This, REFIID riid, void **ppvObject) { - PaActivateAudioInterfaceCompletionHandler *handler = (PaActivateAudioInterfaceCompletionHandler *)This; + PaActivateAudioInterfaceCompletionHandler *handler = (PaActivateAudioInterfaceCompletionHandler *)This; - // From MSDN: - // "The IAgileObject interface is a marker interface that indicates that an object - // is free threaded and can be called from any apartment." - if (IsEqualIID(riid, &IID_IUnknown) || - IsEqualIID(riid, &IID_IAgileObject)) - { - IActivateAudioInterfaceCompletionHandler_AddRef((IActivateAudioInterfaceCompletionHandler *)handler); - (*ppvObject) = handler; - return S_OK; - } + // From MSDN: + // "The IAgileObject interface is a marker interface that indicates that an object + // is free threaded and can be called from any apartment." + if (IsEqualIID(riid, &IID_IUnknown) || + IsEqualIID(riid, &IID_IAgileObject)) + { + IActivateAudioInterfaceCompletionHandler_AddRef((IActivateAudioInterfaceCompletionHandler *)handler); + (*ppvObject) = handler; + return S_OK; + } - return E_NOINTERFACE; + return E_NOINTERFACE; } static ULONG (STDMETHODCALLTYPE PaActivateAudioInterfaceCompletionHandler_AddRef)( IActivateAudioInterfaceCompletionHandler *This) { - PaActivateAudioInterfaceCompletionHandler *handler = (PaActivateAudioInterfaceCompletionHandler *)This; + PaActivateAudioInterfaceCompletionHandler *handler = (PaActivateAudioInterfaceCompletionHandler *)This; - return InterlockedIncrement(&handler->refs); + return InterlockedIncrement(&handler->refs); } static ULONG (STDMETHODCALLTYPE PaActivateAudioInterfaceCompletionHandler_Release)( IActivateAudioInterfaceCompletionHandler *This) { - PaActivateAudioInterfaceCompletionHandler *handler = (PaActivateAudioInterfaceCompletionHandler *)This; - ULONG refs; + PaActivateAudioInterfaceCompletionHandler *handler = (PaActivateAudioInterfaceCompletionHandler *)This; + ULONG refs; - if ((refs = InterlockedDecrement(&handler->refs)) == 0) - { - PaUtil_FreeMemory(handler->parent.lpVtbl); - PaUtil_FreeMemory(handler); - } + if ((refs = InterlockedDecrement(&handler->refs)) == 0) + { + PaUtil_FreeMemory(handler->parent.lpVtbl); + PaUtil_FreeMemory(handler); + } - return refs; + return refs; } static HRESULT (STDMETHODCALLTYPE PaActivateAudioInterfaceCompletionHandler_ActivateCompleted)( IActivateAudioInterfaceCompletionHandler *This, IActivateAudioInterfaceAsyncOperation *activateOperation) { - PaActivateAudioInterfaceCompletionHandler *handler = (PaActivateAudioInterfaceCompletionHandler *)This; + PaActivateAudioInterfaceCompletionHandler *handler = (PaActivateAudioInterfaceCompletionHandler *)This; HRESULT hr = S_OK; HRESULT hrActivateResult = S_OK; @@ -1575,33 +1575,33 @@ static HRESULT (STDMETHODCALLTYPE PaActivateAudioInterfaceCompletionHandler_Acti IUnknown_QueryInterface(punkAudioInterface, handler->in.iid, handler->in.obj); if ((*handler->in.obj) == NULL) hrActivateResult = E_FAIL; - } - SAFE_RELEASE(punkAudioInterface); + } + SAFE_RELEASE(punkAudioInterface); - if (SUCCEEDED(hr)) - handler->out.hr = hrActivateResult; - else - handler->out.hr = hr; - - // Got client object, stop busy waiting in ActivateAudioInterface - InterlockedExchange(&handler->done, TRUE); + if (SUCCEEDED(hr)) + handler->out.hr = hrActivateResult; + else + handler->out.hr = hr; + + // Got client object, stop busy waiting in ActivateAudioInterface + InterlockedExchange(&handler->done, TRUE); - return hr; + return hr; } static IActivateAudioInterfaceCompletionHandler *CreateActivateAudioInterfaceCompletionHandler(const IID *iid, void **obj) { - PaActivateAudioInterfaceCompletionHandler *handler = PaUtil_AllocateMemory(sizeof(PaActivateAudioInterfaceCompletionHandler)); - ZeroMemory(handler, sizeof(*handler)); - handler->parent.lpVtbl = PaUtil_AllocateMemory(sizeof(*handler->parent.lpVtbl)); - handler->parent.lpVtbl->QueryInterface = &PaActivateAudioInterfaceCompletionHandler_QueryInterface; - handler->parent.lpVtbl->AddRef = &PaActivateAudioInterfaceCompletionHandler_AddRef; - handler->parent.lpVtbl->Release = &PaActivateAudioInterfaceCompletionHandler_Release; - handler->parent.lpVtbl->ActivateCompleted = &PaActivateAudioInterfaceCompletionHandler_ActivateCompleted; - handler->refs = 1; - handler->in.iid = iid; - handler->in.obj = obj; - return (IActivateAudioInterfaceCompletionHandler *)handler; + PaActivateAudioInterfaceCompletionHandler *handler = PaUtil_AllocateMemory(sizeof(PaActivateAudioInterfaceCompletionHandler)); + ZeroMemory(handler, sizeof(*handler)); + handler->parent.lpVtbl = PaUtil_AllocateMemory(sizeof(*handler->parent.lpVtbl)); + handler->parent.lpVtbl->QueryInterface = &PaActivateAudioInterfaceCompletionHandler_QueryInterface; + handler->parent.lpVtbl->AddRef = &PaActivateAudioInterfaceCompletionHandler_AddRef; + handler->parent.lpVtbl->Release = &PaActivateAudioInterfaceCompletionHandler_Release; + handler->parent.lpVtbl->ActivateCompleted = &PaActivateAudioInterfaceCompletionHandler_ActivateCompleted; + handler->refs = 1; + handler->in.iid = iid; + handler->in.obj = obj; + return (IActivateAudioInterfaceCompletionHandler *)handler; } #endif @@ -1610,108 +1610,108 @@ static IActivateAudioInterfaceCompletionHandler *CreateActivateAudioInterfaceCom static HRESULT ActivateAudioInterface_WINRT(EDataFlow flow, const IID *iid, void **obj) { #define PA_WASAPI_DEVICE_PATH_LEN 64 - - PaError result = paNoError; - HRESULT hr = S_OK; - IActivateAudioInterfaceAsyncOperation *asyncOp = NULL; - IActivateAudioInterfaceCompletionHandler *handler = CreateActivateAudioInterfaceCompletionHandler(iid, obj); - PaActivateAudioInterfaceCompletionHandler *handlerImpl = (PaActivateAudioInterfaceCompletionHandler *)handler; - OLECHAR tmp[PA_WASAPI_DEVICE_PATH_LEN] = { 0 }; - OLECHAR *devicePath = tmp; + + PaError result = paNoError; + HRESULT hr = S_OK; + IActivateAudioInterfaceAsyncOperation *asyncOp = NULL; + IActivateAudioInterfaceCompletionHandler *handler = CreateActivateAudioInterfaceCompletionHandler(iid, obj); + PaActivateAudioInterfaceCompletionHandler *handlerImpl = (PaActivateAudioInterfaceCompletionHandler *)handler; + OLECHAR tmp[PA_WASAPI_DEVICE_PATH_LEN] = { 0 }; + OLECHAR *devicePath = tmp; - // Get device path in form L"{DEVICE_GUID}" - switch (flow) - { - case eRender: - if (g_DefaultRenderId[0] != 0) - devicePath = g_DefaultRenderId; - else - StringFromGUID2(&DEVINTERFACE_AUDIO_RENDER, devicePath, PA_WASAPI_DEVICE_PATH_LEN - 1); - break; - case eCapture: - if (g_DefaultCaptureId[0] != 0) - devicePath = g_DefaultCaptureId; - else - StringFromGUID2(&DEVINTERFACE_AUDIO_CAPTURE, devicePath, PA_WASAPI_DEVICE_PATH_LEN - 1); - break; - default: - return S_FALSE; - } + // Get device path in form L"{DEVICE_GUID}" + switch (flow) + { + case eRender: + if (g_DefaultRenderId[0] != 0) + devicePath = g_DefaultRenderId; + else + StringFromGUID2(&DEVINTERFACE_AUDIO_RENDER, devicePath, PA_WASAPI_DEVICE_PATH_LEN - 1); + break; + case eCapture: + if (g_DefaultCaptureId[0] != 0) + devicePath = g_DefaultCaptureId; + else + StringFromGUID2(&DEVINTERFACE_AUDIO_CAPTURE, devicePath, PA_WASAPI_DEVICE_PATH_LEN - 1); + break; + default: + return S_FALSE; + } - // Async operation will call back to IActivateAudioInterfaceCompletionHandler::ActivateCompleted - // which must be an agile interface implementation + // Async operation will call back to IActivateAudioInterfaceCompletionHandler::ActivateCompleted + // which must be an agile interface implementation hr = ActivateAudioInterfaceAsync(devicePath, iid, NULL, handler, &asyncOp); IF_FAILED_INTERNAL_ERROR_JUMP(hr, result, error); - // Wait in busy loop for async operation to complete - // Use Interlocked API here to ensure that ->done variable is read every time through the loop - while (SUCCEEDED(hr) && !InterlockedOr(&handlerImpl->done, 0)) - { - Sleep(1); - } + // Wait in busy loop for async operation to complete + // Use Interlocked API here to ensure that ->done variable is read every time through the loop + while (SUCCEEDED(hr) && !InterlockedOr(&handlerImpl->done, 0)) + { + Sleep(1); + } - hr = handlerImpl->out.hr; + hr = handlerImpl->out.hr; error: - SAFE_RELEASE(asyncOp); - SAFE_RELEASE(handler); + SAFE_RELEASE(asyncOp); + SAFE_RELEASE(handler); return hr; - + #undef PA_WASAPI_DEVICE_PATH_LEN } #endif // ------------------------------------------------------------------------------------------ static HRESULT ActivateAudioInterface(const PaWasapiDeviceInfo *deviceInfo, const PaWasapiStreamInfo *streamInfo, - IAudioClient **client) + IAudioClient **client) { - HRESULT hr; + HRESULT hr; #ifndef PA_WINRT - if (FAILED(hr = IMMDevice_Activate(deviceInfo->device, GetAudioClientIID(), CLSCTX_ALL, NULL, (void **)client))) - return hr; + if (FAILED(hr = IMMDevice_Activate(deviceInfo->device, GetAudioClientIID(), CLSCTX_ALL, NULL, (void **)client))) + return hr; #else - if (FAILED(hr = ActivateAudioInterface_WINRT(deviceInfo->flow, GetAudioClientIID(), (void **)client))) - return hr; + if (FAILED(hr = ActivateAudioInterface_WINRT(deviceInfo->flow, GetAudioClientIID(), (void **)client))) + return hr; #endif - // Set audio client options (applicable only to IAudioClient2+): options may affect the audio format - // support by IAudioClient implementation and therefore we should set them before GetClosestFormat() - // in order to correctly match the requested format + // Set audio client options (applicable only to IAudioClient2+): options may affect the audio format + // support by IAudioClient implementation and therefore we should set them before GetClosestFormat() + // in order to correctly match the requested format #ifdef __IAudioClient2_INTERFACE_DEFINED__ - if ((streamInfo != NULL) && (GetAudioClientVersion() >= 2)) - { - pa_AudioClientProperties audioProps = { 0 }; - audioProps.cbSize = sizeof(pa_AudioClientProperties); - audioProps.bIsOffload = FALSE; - audioProps.eCategory = (AUDIO_STREAM_CATEGORY)streamInfo->streamCategory; - switch (streamInfo->streamOption) - { - case eStreamOptionRaw: - if (GetWindowsVersion() >= WINDOWS_8_1_SERVER2012R2) - audioProps.Options = pa_AUDCLNT_STREAMOPTIONS_RAW; - break; - case eStreamOptionMatchFormat: - if (GetWindowsVersion() >= WINDOWS_10_SERVER2016) - audioProps.Options = pa_AUDCLNT_STREAMOPTIONS_MATCH_FORMAT; - break; - } + if ((streamInfo != NULL) && (GetAudioClientVersion() >= 2)) + { + pa_AudioClientProperties audioProps = { 0 }; + audioProps.cbSize = sizeof(pa_AudioClientProperties); + audioProps.bIsOffload = FALSE; + audioProps.eCategory = (AUDIO_STREAM_CATEGORY)streamInfo->streamCategory; + switch (streamInfo->streamOption) + { + case eStreamOptionRaw: + if (GetWindowsVersion() >= WINDOWS_8_1_SERVER2012R2) + audioProps.Options = pa_AUDCLNT_STREAMOPTIONS_RAW; + break; + case eStreamOptionMatchFormat: + if (GetWindowsVersion() >= WINDOWS_10_SERVER2016) + audioProps.Options = pa_AUDCLNT_STREAMOPTIONS_MATCH_FORMAT; + break; + } - if (FAILED(hr = IAudioClient2_SetClientProperties((IAudioClient2 *)(*client), (AudioClientProperties *)&audioProps))) - { - PRINT(("WASAPI: IAudioClient2_SetClientProperties(IsOffload = %d, Category = %d, Options = %d) failed\n", audioProps.bIsOffload, audioProps.eCategory, audioProps.Options)); - LogHostError(hr); - } - else - { - PRINT(("WASAPI: IAudioClient2 set properties: IsOffload = %d, Category = %d, Options = %d\n", audioProps.bIsOffload, audioProps.eCategory, audioProps.Options)); - } - } + if (FAILED(hr = IAudioClient2_SetClientProperties((IAudioClient2 *)(*client), (AudioClientProperties *)&audioProps))) + { + PRINT(("WASAPI: IAudioClient2_SetClientProperties(IsOffload = %d, Category = %d, Options = %d) failed\n", audioProps.bIsOffload, audioProps.eCategory, audioProps.Options)); + LogHostError(hr); + } + else + { + PRINT(("WASAPI: IAudioClient2 set properties: IsOffload = %d, Category = %d, Options = %d\n", audioProps.bIsOffload, audioProps.eCategory, audioProps.Options)); + } + } #endif - return S_OK; + return S_OK; } // ------------------------------------------------------------------------------------------ @@ -1720,8 +1720,8 @@ static HRESULT ActivateAudioInterface(const PaWasapiDeviceInfo *deviceInfo, cons #if !defined(WDK_NTDDI_VERSION) || (WDK_NTDDI_VERSION < NTDDI_WIN10_RS2) static DWORD SignalObjectAndWait(HANDLE hObjectToSignal, HANDLE hObjectToWaitOn, DWORD dwMilliseconds, BOOL bAlertable) { - SetEvent(hObjectToSignal); - return WaitForSingleObjectEx(hObjectToWaitOn, dwMilliseconds, bAlertable); + SetEvent(hObjectToSignal); + return WaitForSingleObjectEx(hObjectToWaitOn, dwMilliseconds, bAlertable); } #endif #endif @@ -1729,40 +1729,40 @@ static DWORD SignalObjectAndWait(HANDLE hObjectToSignal, HANDLE hObjectToWaitOn, // ------------------------------------------------------------------------------------------ static void NotifyStateChanged(PaWasapiStream *stream, UINT32 flags, HRESULT hr) { - if (stream->fnStateHandler == NULL) - return; + if (stream->fnStateHandler == NULL) + return; - if (FAILED(hr)) - flags |= paWasapiStreamStateError; - - stream->fnStateHandler((PaStream *)stream, flags, hr, stream->pStateHandlerUserData); + if (FAILED(hr)) + flags |= paWasapiStreamStateError; + + stream->fnStateHandler((PaStream *)stream, flags, hr, stream->pStateHandlerUserData); } // ------------------------------------------------------------------------------------------ static PaError CreateDeviceList(PaWasapiHostApiRepresentation *paWasapi, PaHostApiIndex hostApiIndex) { - PaUtilHostApiRepresentation *hostApi = (PaUtilHostApiRepresentation *)paWasapi; + PaUtilHostApiRepresentation *hostApi = (PaUtilHostApiRepresentation *)paWasapi; PaError result = paNoError; PaDeviceInfo *deviceInfoArray; HRESULT hr = S_OK; - UINT i; + UINT i; #ifndef PA_WINRT IMMDeviceCollection* pEndPoints = NULL; - IMMDeviceEnumerator *pEnumerator = NULL; + IMMDeviceEnumerator *pEnumerator = NULL; #endif - IAudioClient *tmpClient; + IAudioClient *tmpClient; - // Make sure device list empty - if ((paWasapi->deviceCount != 0) || (hostApi->info.deviceCount != 0)) - return paInternalError; + // Make sure device list empty + if ((paWasapi->deviceCount != 0) || (hostApi->info.deviceCount != 0)) + return paInternalError; #ifndef PA_WINRT hr = CoCreateInstance(&pa_CLSID_IMMDeviceEnumerator, NULL, CLSCTX_INPROC_SERVER, &pa_IID_IMMDeviceEnumerator, (void **)&pEnumerator); - // We need to set the result to a value otherwise we will return paNoError - // [IF_FAILED_JUMP(hResult, error);] - IF_FAILED_INTERNAL_ERROR_JUMP(hr, result, error); + // We need to set the result to a value otherwise we will return paNoError + // [IF_FAILED_JUMP(hResult, error);] + IF_FAILED_INTERNAL_ERROR_JUMP(hr, result, error); // getting default device ids in the eMultimedia "role" { @@ -1770,79 +1770,79 @@ static PaError CreateDeviceList(PaWasapiHostApiRepresentation *paWasapi, PaHostA IMMDevice *defaultRenderer = NULL; hr = IMMDeviceEnumerator_GetDefaultAudioEndpoint(pEnumerator, eRender, eMultimedia, &defaultRenderer); if (hr != S_OK) - { - if (hr != E_NOTFOUND) { - // We need to set the result to a value otherwise we will return paNoError - // [IF_FAILED_JUMP(hResult, error);] - IF_FAILED_INTERNAL_ERROR_JUMP(hr, result, error); - } - } - else - { - WCHAR *pszDeviceId = NULL; - hr = IMMDevice_GetId(defaultRenderer, &pszDeviceId); - // We need to set the result to a value otherwise we will return paNoError - // [IF_FAILED_JUMP(hResult, error);] - IF_FAILED_INTERNAL_ERROR_JUMP(hr, result, error); - wcsncpy(paWasapi->defaultRenderer, pszDeviceId, MAX_STR_LEN-1); - CoTaskMemFree(pszDeviceId); - IMMDevice_Release(defaultRenderer); - } + { + if (hr != E_NOTFOUND) { + // We need to set the result to a value otherwise we will return paNoError + // [IF_FAILED_JUMP(hResult, error);] + IF_FAILED_INTERNAL_ERROR_JUMP(hr, result, error); + } + } + else + { + WCHAR *pszDeviceId = NULL; + hr = IMMDevice_GetId(defaultRenderer, &pszDeviceId); + // We need to set the result to a value otherwise we will return paNoError + // [IF_FAILED_JUMP(hResult, error);] + IF_FAILED_INTERNAL_ERROR_JUMP(hr, result, error); + wcsncpy(paWasapi->defaultRenderer, pszDeviceId, MAX_STR_LEN-1); + CoTaskMemFree(pszDeviceId); + IMMDevice_Release(defaultRenderer); + } } { IMMDevice *defaultCapturer = NULL; hr = IMMDeviceEnumerator_GetDefaultAudioEndpoint(pEnumerator, eCapture, eMultimedia, &defaultCapturer); if (hr != S_OK) - { - if (hr != E_NOTFOUND) { - // We need to set the result to a value otherwise we will return paNoError - // [IF_FAILED_JUMP(hResult, error);] - IF_FAILED_INTERNAL_ERROR_JUMP(hr, result, error); - } - } - else - { - WCHAR *pszDeviceId = NULL; - hr = IMMDevice_GetId(defaultCapturer, &pszDeviceId); - // We need to set the result to a value otherwise we will return paNoError - // [IF_FAILED_JUMP(hResult, error);] - IF_FAILED_INTERNAL_ERROR_JUMP(hr, result, error); - wcsncpy(paWasapi->defaultCapturer, pszDeviceId, MAX_STR_LEN-1); - CoTaskMemFree(pszDeviceId); - IMMDevice_Release(defaultCapturer); - } + { + if (hr != E_NOTFOUND) { + // We need to set the result to a value otherwise we will return paNoError + // [IF_FAILED_JUMP(hResult, error);] + IF_FAILED_INTERNAL_ERROR_JUMP(hr, result, error); + } + } + else + { + WCHAR *pszDeviceId = NULL; + hr = IMMDevice_GetId(defaultCapturer, &pszDeviceId); + // We need to set the result to a value otherwise we will return paNoError + // [IF_FAILED_JUMP(hResult, error);] + IF_FAILED_INTERNAL_ERROR_JUMP(hr, result, error); + wcsncpy(paWasapi->defaultCapturer, pszDeviceId, MAX_STR_LEN-1); + CoTaskMemFree(pszDeviceId); + IMMDevice_Release(defaultCapturer); + } } } hr = IMMDeviceEnumerator_EnumAudioEndpoints(pEnumerator, eAll, DEVICE_STATE_ACTIVE, &pEndPoints); - // We need to set the result to a value otherwise we will return paNoError - // [IF_FAILED_JUMP(hResult, error);] - IF_FAILED_INTERNAL_ERROR_JUMP(hr, result, error); + // We need to set the result to a value otherwise we will return paNoError + // [IF_FAILED_JUMP(hResult, error);] + IF_FAILED_INTERNAL_ERROR_JUMP(hr, result, error); hr = IMMDeviceCollection_GetCount(pEndPoints, &paWasapi->deviceCount); - // We need to set the result to a value otherwise we will return paNoError - // [IF_FAILED_JUMP(hResult, error);] - IF_FAILED_INTERNAL_ERROR_JUMP(hr, result, error); + // We need to set the result to a value otherwise we will return paNoError + // [IF_FAILED_JUMP(hResult, error);] + IF_FAILED_INTERNAL_ERROR_JUMP(hr, result, error); #else - // Determine number of available devices by activating AudioClient for render and capture data flows - if (SUCCEEDED(ActivateAudioInterface_WINRT(eRender, GetAudioClientIID(), &tmpClient))) - { - paWasapi->deviceCount++; - SAFE_RELEASE(tmpClient); - } - if (SUCCEEDED(ActivateAudioInterface_WINRT(eCapture, GetAudioClientIID(), &tmpClient))) - { - paWasapi->deviceCount++; - SAFE_RELEASE(tmpClient); - } + // Determine number of available devices by activating AudioClient for render and capture data flows + if (SUCCEEDED(ActivateAudioInterface_WINRT(eRender, GetAudioClientIID(), &tmpClient))) + { + paWasapi->deviceCount++; + SAFE_RELEASE(tmpClient); + } + if (SUCCEEDED(ActivateAudioInterface_WINRT(eCapture, GetAudioClientIID(), &tmpClient))) + { + paWasapi->deviceCount++; + SAFE_RELEASE(tmpClient); + } #endif paWasapi->devInfo = (PaWasapiDeviceInfo *)PaUtil_GroupAllocateMemory( - paWasapi->allocations, sizeof(PaWasapiDeviceInfo) * paWasapi->deviceCount); + paWasapi->allocations, sizeof(PaWasapiDeviceInfo) * paWasapi->deviceCount); if (paWasapi->devInfo == NULL) - { + { result = paInsufficientMemory; goto error; } @@ -1850,16 +1850,16 @@ static PaError CreateDeviceList(PaWasapiHostApiRepresentation *paWasapi, PaHostA if (paWasapi->deviceCount > 0) { - UINT32 deviceCount = paWasapi->deviceCount; - #if defined(PA_WASAPI_MAX_CONST_DEVICE_COUNT) && (PA_WASAPI_MAX_CONST_DEVICE_COUNT > 0) - if (deviceCount < PA_WASAPI_MAX_CONST_DEVICE_COUNT) - deviceCount = PA_WASAPI_MAX_CONST_DEVICE_COUNT; - #endif + UINT32 deviceCount = paWasapi->deviceCount; + #if defined(PA_WASAPI_MAX_CONST_DEVICE_COUNT) && (PA_WASAPI_MAX_CONST_DEVICE_COUNT > 0) + if (deviceCount < PA_WASAPI_MAX_CONST_DEVICE_COUNT) + deviceCount = PA_WASAPI_MAX_CONST_DEVICE_COUNT; + #endif hostApi->deviceInfos = (PaDeviceInfo **)PaUtil_GroupAllocateMemory( paWasapi->allocations, sizeof(PaDeviceInfo *) * deviceCount); if (hostApi->deviceInfos == NULL) - { + { result = paInsufficientMemory; goto error; } @@ -1868,83 +1868,83 @@ static PaError CreateDeviceList(PaWasapiHostApiRepresentation *paWasapi, PaHostA deviceInfoArray = (PaDeviceInfo *)PaUtil_GroupAllocateMemory( paWasapi->allocations, sizeof(PaDeviceInfo) * deviceCount); if (deviceInfoArray == NULL) - { + { result = paInsufficientMemory; goto error; } - memset(deviceInfoArray, 0, sizeof(PaDeviceInfo) * deviceCount); + memset(deviceInfoArray, 0, sizeof(PaDeviceInfo) * deviceCount); for (i = 0; i < paWasapi->deviceCount; ++i) - { + { PaDeviceInfo *deviceInfo = &deviceInfoArray[i]; deviceInfo->structVersion = 2; deviceInfo->hostApi = hostApiIndex; - PA_DEBUG(("WASAPI: device idx: %02d\n", i)); - PA_DEBUG(("WASAPI: ---------------\n")); + PA_DEBUG(("WASAPI: device idx: %02d\n", i)); + PA_DEBUG(("WASAPI: ---------------\n")); - #ifndef PA_WINRT + #ifndef PA_WINRT hr = IMMDeviceCollection_Item(pEndPoints, i, &paWasapi->devInfo[i].device); - // We need to set the result to a value otherwise we will return paNoError - // [IF_FAILED_JUMP(hResult, error);] - IF_FAILED_INTERNAL_ERROR_JUMP(hr, result, error); + // We need to set the result to a value otherwise we will return paNoError + // [IF_FAILED_JUMP(hResult, error);] + IF_FAILED_INTERNAL_ERROR_JUMP(hr, result, error); // getting ID { WCHAR *pszDeviceId = NULL; hr = IMMDevice_GetId(paWasapi->devInfo[i].device, &pszDeviceId); - // We need to set the result to a value otherwise we will return paNoError - // [IF_FAILED_JUMP(hr, error);] - IF_FAILED_INTERNAL_ERROR_JUMP(hr, result, error); + // We need to set the result to a value otherwise we will return paNoError + // [IF_FAILED_JUMP(hr, error);] + IF_FAILED_INTERNAL_ERROR_JUMP(hr, result, error); wcsncpy(paWasapi->devInfo[i].szDeviceID, pszDeviceId, MAX_STR_LEN-1); CoTaskMemFree(pszDeviceId); if (lstrcmpW(paWasapi->devInfo[i].szDeviceID, paWasapi->defaultCapturer) == 0) - {// we found the default input! + {// we found the default input! hostApi->info.defaultInputDevice = hostApi->info.deviceCount; } if (lstrcmpW(paWasapi->devInfo[i].szDeviceID, paWasapi->defaultRenderer) == 0) - {// we found the default output! + {// we found the default output! hostApi->info.defaultOutputDevice = hostApi->info.deviceCount; } } hr = IMMDevice_GetState(paWasapi->devInfo[i].device, &paWasapi->devInfo[i].state); - // We need to set the result to a value otherwise we will return paNoError - // [IF_FAILED_JUMP(hResult, error);] - IF_FAILED_INTERNAL_ERROR_JUMP(hr, result, error); + // We need to set the result to a value otherwise we will return paNoError + // [IF_FAILED_JUMP(hResult, error);] + IF_FAILED_INTERNAL_ERROR_JUMP(hr, result, error); if (paWasapi->devInfo[i].state != DEVICE_STATE_ACTIVE) - { + { PRINT(("WASAPI device: %d is not currently available (state:%d)\n", i, paWasapi->devInfo[i].state)); } { IPropertyStore *pProperty; hr = IMMDevice_OpenPropertyStore(paWasapi->devInfo[i].device, STGM_READ, &pProperty); - // We need to set the result to a value otherwise we will return paNoError - // [IF_FAILED_JUMP(hResult, error);] - IF_FAILED_INTERNAL_ERROR_JUMP(hr, result, error); + // We need to set the result to a value otherwise we will return paNoError + // [IF_FAILED_JUMP(hResult, error);] + IF_FAILED_INTERNAL_ERROR_JUMP(hr, result, error); // "Friendly" Name { PROPVARIANT value; PropVariantInit(&value); hr = IPropertyStore_GetValue(pProperty, &PKEY_Device_FriendlyName, &value); - // We need to set the result to a value otherwise we will return paNoError - // [IF_FAILED_JUMP(hResult, error);] - IF_FAILED_INTERNAL_ERROR_JUMP(hr, result, error); + // We need to set the result to a value otherwise we will return paNoError + // [IF_FAILED_JUMP(hResult, error);] + IF_FAILED_INTERNAL_ERROR_JUMP(hr, result, error); if ((deviceInfo->name = (char *)PaUtil_GroupAllocateMemory(paWasapi->allocations, MAX_STR_LEN + 1)) == NULL) - { + { result = paInsufficientMemory; goto error; } - if (value.pwszVal) - WideCharToMultiByte(CP_UTF8, 0, value.pwszVal, (int)wcslen(value.pwszVal), (char *)deviceInfo->name, MAX_STR_LEN - 1, 0, 0); - else - _snprintf((char *)deviceInfo->name, MAX_STR_LEN - 1, "baddev%d", i); + if (value.pwszVal) + WideCharToMultiByte(CP_UTF8, 0, value.pwszVal, (int)wcslen(value.pwszVal), (char *)deviceInfo->name, MAX_STR_LEN - 1, 0, 0); + else + _snprintf((char *)deviceInfo->name, MAX_STR_LEN - 1, "baddev%d", i); PropVariantClear(&value); - PA_DEBUG(("WASAPI:%d| name[%s]\n", i, deviceInfo->name)); + PA_DEBUG(("WASAPI:%d| name[%s]\n", i, deviceInfo->name)); } // Default format @@ -1952,10 +1952,10 @@ static PaError CreateDeviceList(PaWasapiHostApiRepresentation *paWasapi, PaHostA PROPVARIANT value; PropVariantInit(&value); hr = IPropertyStore_GetValue(pProperty, &PKEY_AudioEngine_DeviceFormat, &value); - // We need to set the result to a value otherwise we will return paNoError - // [IF_FAILED_JUMP(hResult, error);] - IF_FAILED_INTERNAL_ERROR_JUMP(hr, result, error); - memcpy(&paWasapi->devInfo[i].DefaultFormat, value.blob.pBlobData, min(sizeof(paWasapi->devInfo[i].DefaultFormat), value.blob.cbSize)); + // We need to set the result to a value otherwise we will return paNoError + // [IF_FAILED_JUMP(hResult, error);] + IF_FAILED_INTERNAL_ERROR_JUMP(hr, result, error); + memcpy(&paWasapi->devInfo[i].DefaultFormat, value.blob.pBlobData, min(sizeof(paWasapi->devInfo[i].DefaultFormat), value.blob.cbSize)); // cleanup PropVariantClear(&value); } @@ -1965,203 +1965,203 @@ static PaError CreateDeviceList(PaWasapiHostApiRepresentation *paWasapi, PaHostA PROPVARIANT value; PropVariantInit(&value); hr = IPropertyStore_GetValue(pProperty, &PKEY_AudioEndpoint_FormFactor, &value); - // We need to set the result to a value otherwise we will return paNoError - // [IF_FAILED_JUMP(hResult, error);] - IF_FAILED_INTERNAL_ERROR_JUMP(hr, result, error); - // set - #if defined(DUMMYUNIONNAME) && defined(NONAMELESSUNION) - // avoid breaking strict-aliasing rules in such line: (EndpointFormFactor)(*((UINT *)(((WORD *)&value.wReserved3)+1))); - UINT v; - memcpy(&v, (((WORD *)&value.wReserved3)+1), sizeof(v)); - paWasapi->devInfo[i].formFactor = (EndpointFormFactor)v; - #else - paWasapi->devInfo[i].formFactor = (EndpointFormFactor)value.uintVal; - #endif - PA_DEBUG(("WASAPI:%d| form-factor[%d]\n", i, paWasapi->devInfo[i].formFactor)); + // We need to set the result to a value otherwise we will return paNoError + // [IF_FAILED_JUMP(hResult, error);] + IF_FAILED_INTERNAL_ERROR_JUMP(hr, result, error); + // set + #if defined(DUMMYUNIONNAME) && defined(NONAMELESSUNION) + // avoid breaking strict-aliasing rules in such line: (EndpointFormFactor)(*((UINT *)(((WORD *)&value.wReserved3)+1))); + UINT v; + memcpy(&v, (((WORD *)&value.wReserved3)+1), sizeof(v)); + paWasapi->devInfo[i].formFactor = (EndpointFormFactor)v; + #else + paWasapi->devInfo[i].formFactor = (EndpointFormFactor)value.uintVal; + #endif + PA_DEBUG(("WASAPI:%d| form-factor[%d]\n", i, paWasapi->devInfo[i].formFactor)); // cleanup PropVariantClear(&value); } - SAFE_RELEASE(pProperty); + SAFE_RELEASE(pProperty); } - + // Endpoint data { IMMEndpoint *endpoint = NULL; hr = IMMDevice_QueryInterface(paWasapi->devInfo[i].device, &pa_IID_IMMEndpoint, (void **)&endpoint); if (SUCCEEDED(hr)) - { + { hr = IMMEndpoint_GetDataFlow(endpoint, &paWasapi->devInfo[i].flow); SAFE_RELEASE(endpoint); } } - #endif + #endif // Getting a temporary IAudioClient for more fields // we make sure NOT to call Initialize yet! { - #ifdef PA_WINRT - // Set flow as ActivateAudioInterface depends on it and selects corresponding - // direction for the Audio Client - paWasapi->devInfo[i].flow = (i == 0 ? eRender : eCapture); - #endif + #ifdef PA_WINRT + // Set flow as ActivateAudioInterface depends on it and selects corresponding + // direction for the Audio Client + paWasapi->devInfo[i].flow = (i == 0 ? eRender : eCapture); + #endif - // Create temp Audio Client instance to query additional details + // Create temp Audio Client instance to query additional details hr = ActivateAudioInterface(&paWasapi->devInfo[i], NULL, &tmpClient); - // We need to set the result to a value otherwise we will return paNoError - // [IF_FAILED_JUMP(hResult, error);] - IF_FAILED_INTERNAL_ERROR_JUMP(hr, result, error); + // We need to set the result to a value otherwise we will return paNoError + // [IF_FAILED_JUMP(hResult, error);] + IF_FAILED_INTERNAL_ERROR_JUMP(hr, result, error); - // Get latency + // Get latency hr = IAudioClient_GetDevicePeriod(tmpClient, &paWasapi->devInfo[i].DefaultDevicePeriod, &paWasapi->devInfo[i].MinimumDevicePeriod); - if (FAILED(hr)) - { - PA_DEBUG(("WASAPI:%d| failed getting min/default periods by IAudioClient::GetDevicePeriod() with error[%08X], will use 30000/100000 hns\n", i, (UINT32)hr)); + if (FAILED(hr)) + { + PA_DEBUG(("WASAPI:%d| failed getting min/default periods by IAudioClient::GetDevicePeriod() with error[%08X], will use 30000/100000 hns\n", i, (UINT32)hr)); - // assign WASAPI common values - paWasapi->devInfo[i].DefaultDevicePeriod = 100000; - paWasapi->devInfo[i].MinimumDevicePeriod = 30000; + // assign WASAPI common values + paWasapi->devInfo[i].DefaultDevicePeriod = 100000; + paWasapi->devInfo[i].MinimumDevicePeriod = 30000; - // ignore error, let continue further without failing with paInternalError - hr = S_OK; - } - - // Get mix format - { - WAVEFORMATEX *mixFormat; + // ignore error, let continue further without failing with paInternalError + hr = S_OK; + } + + // Get mix format + { + WAVEFORMATEX *mixFormat; - hr = IAudioClient_GetMixFormat(tmpClient, &mixFormat); - if (SUCCEEDED(hr)) - { - memcpy(&paWasapi->devInfo[i].MixFormat, mixFormat, min(sizeof(paWasapi->devInfo[i].MixFormat), (sizeof(*mixFormat) + mixFormat->cbSize))); - CoTaskMemFree(mixFormat); - } - } + hr = IAudioClient_GetMixFormat(tmpClient, &mixFormat); + if (SUCCEEDED(hr)) + { + memcpy(&paWasapi->devInfo[i].MixFormat, mixFormat, min(sizeof(paWasapi->devInfo[i].MixFormat), (sizeof(*mixFormat) + mixFormat->cbSize))); + CoTaskMemFree(mixFormat); + } + } - // Register WINRT device - #ifdef PA_WINRT - if (SUCCEEDED(hr)) - { - // Default device - if (i == 0) - hostApi->info.defaultOutputDevice = hostApi->info.deviceCount; - else - hostApi->info.defaultInputDevice = hostApi->info.deviceCount; + // Register WINRT device + #ifdef PA_WINRT + if (SUCCEEDED(hr)) + { + // Default device + if (i == 0) + hostApi->info.defaultOutputDevice = hostApi->info.deviceCount; + else + hostApi->info.defaultInputDevice = hostApi->info.deviceCount; - // State - paWasapi->devInfo[i].state = DEVICE_STATE_ACTIVE; + // State + paWasapi->devInfo[i].state = DEVICE_STATE_ACTIVE; - // Default format is always a mix format - paWasapi->devInfo[i].DefaultFormat = paWasapi->devInfo[i].MixFormat; + // Default format is always a mix format + paWasapi->devInfo[i].DefaultFormat = paWasapi->devInfo[i].MixFormat; - // Form-factor - paWasapi->devInfo[i].formFactor = UnknownFormFactor; + // Form-factor + paWasapi->devInfo[i].formFactor = UnknownFormFactor; - // Name + // Name if ((deviceInfo->name = (char *)PaUtil_GroupAllocateMemory(paWasapi->allocations, MAX_STR_LEN + 1)) == NULL) - { - SAFE_RELEASE(tmpClient); + { + SAFE_RELEASE(tmpClient); result = paInsufficientMemory; goto error; } - _snprintf((char *)deviceInfo->name, MAX_STR_LEN - 1, "WASAPI_%s:%d", (i == 0 ? "Output" : "Input"), i); - PA_DEBUG(("WASAPI:%d| name[%s]\n", i, deviceInfo->name)); - } - #endif + _snprintf((char *)deviceInfo->name, MAX_STR_LEN - 1, "WASAPI_%s:%d", (i == 0 ? "Output" : "Input"), i); + PA_DEBUG(("WASAPI:%d| name[%s]\n", i, deviceInfo->name)); + } + #endif - // Release tmp client - SAFE_RELEASE(tmpClient); + // Release tmp client + SAFE_RELEASE(tmpClient); - if (hr != S_OK) - { - //davidv: this happened with my hardware, previously for that same device in DirectSound: - //Digital Output (Realtek AC'97 Audio)'s GUID: {0x38f2cf50,0x7b4c,0x4740,0x86,0xeb,0xd4,0x38,0x66,0xd8,0xc8, 0x9f} - //so something must be _really_ wrong with this device, TODO handle this better. We kind of need GetMixFormat - LogHostError(hr); - // We need to set the result to a value otherwise we will return paNoError - result = paInternalError; - goto error; - } + if (hr != S_OK) + { + //davidv: this happened with my hardware, previously for that same device in DirectSound: + //Digital Output (Realtek AC'97 Audio)'s GUID: {0x38f2cf50,0x7b4c,0x4740,0x86,0xeb,0xd4,0x38,0x66,0xd8,0xc8, 0x9f} + //so something must be _really_ wrong with this device, TODO handle this better. We kind of need GetMixFormat + LogHostError(hr); + // We need to set the result to a value otherwise we will return paNoError + result = paInternalError; + goto error; + } } - + // we can now fill in portaudio device data deviceInfo->maxInputChannels = 0; deviceInfo->maxOutputChannels = 0; - deviceInfo->defaultSampleRate = paWasapi->devInfo[i].MixFormat.Format.nSamplesPerSec; + deviceInfo->defaultSampleRate = paWasapi->devInfo[i].MixFormat.Format.nSamplesPerSec; switch (paWasapi->devInfo[i].flow) - { - case eRender: { - deviceInfo->maxOutputChannels = paWasapi->devInfo[i].MixFormat.Format.nChannels; + { + case eRender: { + deviceInfo->maxOutputChannels = paWasapi->devInfo[i].MixFormat.Format.nChannels; deviceInfo->defaultHighOutputLatency = nano100ToSeconds(paWasapi->devInfo[i].DefaultDevicePeriod); deviceInfo->defaultLowOutputLatency = nano100ToSeconds(paWasapi->devInfo[i].MinimumDevicePeriod); - PA_DEBUG(("WASAPI:%d| def.SR[%d] max.CH[%d] latency{hi[%f] lo[%f]}\n", i, (UINT32)deviceInfo->defaultSampleRate, - deviceInfo->maxOutputChannels, (float)deviceInfo->defaultHighOutputLatency, (float)deviceInfo->defaultLowOutputLatency)); - break;} - case eCapture: { - deviceInfo->maxInputChannels = paWasapi->devInfo[i].MixFormat.Format.nChannels; + PA_DEBUG(("WASAPI:%d| def.SR[%d] max.CH[%d] latency{hi[%f] lo[%f]}\n", i, (UINT32)deviceInfo->defaultSampleRate, + deviceInfo->maxOutputChannels, (float)deviceInfo->defaultHighOutputLatency, (float)deviceInfo->defaultLowOutputLatency)); + break;} + case eCapture: { + deviceInfo->maxInputChannels = paWasapi->devInfo[i].MixFormat.Format.nChannels; deviceInfo->defaultHighInputLatency = nano100ToSeconds(paWasapi->devInfo[i].DefaultDevicePeriod); deviceInfo->defaultLowInputLatency = nano100ToSeconds(paWasapi->devInfo[i].MinimumDevicePeriod); - PA_DEBUG(("WASAPI:%d| def.SR[%d] max.CH[%d] latency{hi[%f] lo[%f]}\n", i, (UINT32)deviceInfo->defaultSampleRate, - deviceInfo->maxInputChannels, (float)deviceInfo->defaultHighInputLatency, (float)deviceInfo->defaultLowInputLatency)); - break; } + PA_DEBUG(("WASAPI:%d| def.SR[%d] max.CH[%d] latency{hi[%f] lo[%f]}\n", i, (UINT32)deviceInfo->defaultSampleRate, + deviceInfo->maxInputChannels, (float)deviceInfo->defaultHighInputLatency, (float)deviceInfo->defaultLowInputLatency)); + break; } default: PRINT(("WASAPI:%d| bad Data Flow!\n", i)); - // We need to set the result to a value otherwise we will return paNoError - result = paInternalError; + // We need to set the result to a value otherwise we will return paNoError + result = paInternalError; //continue; // do not skip from list, allow to initialize - break; + break; } hostApi->deviceInfos[i] = deviceInfo; ++hostApi->info.deviceCount; } - #if defined(PA_WASAPI_MAX_CONST_DEVICE_COUNT) && (PA_WASAPI_MAX_CONST_DEVICE_COUNT > 0) - if (hostApi->info.deviceCount < PA_WASAPI_MAX_CONST_DEVICE_COUNT) - { - for (i = hostApi->info.deviceCount; i < PA_WASAPI_MAX_CONST_DEVICE_COUNT; ++i) - { - PaDeviceInfo *deviceInfo = &deviceInfoArray[i]; - deviceInfo->structVersion = 2; - deviceInfo->hostApi = hostApiIndex; + #if defined(PA_WASAPI_MAX_CONST_DEVICE_COUNT) && (PA_WASAPI_MAX_CONST_DEVICE_COUNT > 0) + if (hostApi->info.deviceCount < PA_WASAPI_MAX_CONST_DEVICE_COUNT) + { + for (i = hostApi->info.deviceCount; i < PA_WASAPI_MAX_CONST_DEVICE_COUNT; ++i) + { + PaDeviceInfo *deviceInfo = &deviceInfoArray[i]; + deviceInfo->structVersion = 2; + deviceInfo->hostApi = hostApiIndex; if ((deviceInfo->name = (char *)PaUtil_GroupAllocateMemory(paWasapi->allocations, 1)) == NULL) - { + { result = paInsufficientMemory; goto error; } - ((char *)deviceInfo->name)[0] = 0; + ((char *)deviceInfo->name)[0] = 0; - hostApi->deviceInfos[i] = deviceInfo; - ++hostApi->info.deviceCount; - } - } - #endif + hostApi->deviceInfos[i] = deviceInfo; + ++hostApi->info.deviceCount; + } + } + #endif } #ifndef PA_WINRT SAFE_RELEASE(pEndPoints); - SAFE_RELEASE(pEnumerator); + SAFE_RELEASE(pEnumerator); #endif - PRINT(("WASAPI: device list created ok\n")); + PRINT(("WASAPI: device list created ok\n")); return paNoError; error: - PRINT(("WASAPI: failed %s error[%d|%s]\n", __FUNCTION__, result, Pa_GetErrorText(result))); + PRINT(("WASAPI: failed %s error[%d|%s]\n", __FUNCTION__, result, Pa_GetErrorText(result))); #ifndef PA_WINRT SAFE_RELEASE(pEndPoints); - SAFE_RELEASE(pEnumerator); + SAFE_RELEASE(pEnumerator); #endif - - // Safety if error was not set so that we do not think initialize was a success - if (result == paNoError) - result = paInternalError; + + // Safety if error was not set so that we do not think initialize was a success + if (result == paNoError) + result = paInternalError; return result; } @@ -2174,7 +2174,7 @@ PaError PaWasapi_Initialize( PaUtilHostApiRepresentation **hostApi, PaHostApiInd #ifndef PA_WINRT if (!SetupAVRT()) - { + { PRINT(("WASAPI: No AVRT! (not VISTA?)\n")); return paNoError; } @@ -2182,46 +2182,46 @@ PaError PaWasapi_Initialize( PaUtilHostApiRepresentation **hostApi, PaHostApiInd paWasapi = (PaWasapiHostApiRepresentation *)PaUtil_AllocateMemory(sizeof(PaWasapiHostApiRepresentation)); if (paWasapi == NULL) - { + { result = paInsufficientMemory; goto error; - } + } memset(paWasapi, 0, sizeof(PaWasapiHostApiRepresentation)); /* ensure all fields are zeroed. especially paWasapi->allocations */ - // Initialize COM subsystem + // Initialize COM subsystem result = PaWinUtil_CoInitialize(paWASAPI, &paWasapi->comInitializationResult); if (result != paNoError) goto error; - // Create memory group + // Create memory group paWasapi->allocations = PaUtil_CreateAllocationGroup(); if (paWasapi->allocations == NULL) - { + { result = paInsufficientMemory; goto error; } - // Fill basic interface info + // Fill basic interface info *hostApi = &paWasapi->inheritedHostApiRep; - (*hostApi)->info.structVersion = 1; - (*hostApi)->info.type = paWASAPI; - (*hostApi)->info.name = "Windows WASAPI"; - (*hostApi)->info.deviceCount = 0; - (*hostApi)->info.defaultInputDevice = paNoDevice; + (*hostApi)->info.structVersion = 1; + (*hostApi)->info.type = paWASAPI; + (*hostApi)->info.name = "Windows WASAPI"; + (*hostApi)->info.deviceCount = 0; + (*hostApi)->info.defaultInputDevice = paNoDevice; (*hostApi)->info.defaultOutputDevice = paNoDevice; - (*hostApi)->Terminate = Terminate; + (*hostApi)->Terminate = Terminate; (*hostApi)->OpenStream = OpenStream; (*hostApi)->IsFormatSupported = IsFormatSupported; - // Fill the device list - if ((result = CreateDeviceList(paWasapi, hostApiIndex)) != paNoError) - goto error; + // Fill the device list + if ((result = CreateDeviceList(paWasapi, hostApiIndex)) != paNoError) + goto error; - // Detect if platform workaround is required - paWasapi->useWOW64Workaround = UseWOW64Workaround(); + // Detect if platform workaround is required + paWasapi->useWOW64Workaround = UseWOW64Workaround(); - // Initialize time getter - SystemTimer_InitializeTimeGetter(); + // Initialize time getter + SystemTimer_InitializeTimeGetter(); PaUtil_InitializeStreamInterface( &paWasapi->callbackStreamInterface, CloseStream, StartStream, StopStream, AbortStream, IsStreamStopped, IsStreamActive, @@ -2234,15 +2234,15 @@ PaError PaWasapi_Initialize( PaUtilHostApiRepresentation **hostApi, PaHostApiInd GetStreamTime, PaUtil_DummyGetCpuLoad, ReadStream, WriteStream, GetStreamReadAvailable, GetStreamWriteAvailable ); - PRINT(("WASAPI: initialized ok\n")); + PRINT(("WASAPI: initialized ok\n")); return paNoError; error: - PRINT(("WASAPI: failed %s error[%d|%s]\n", __FUNCTION__, result, Pa_GetErrorText(result))); + PRINT(("WASAPI: failed %s error[%d|%s]\n", __FUNCTION__, result, Pa_GetErrorText(result))); - Terminate((PaUtilHostApiRepresentation *)paWasapi); + Terminate((PaUtilHostApiRepresentation *)paWasapi); return result; } @@ -2250,295 +2250,295 @@ error: // ------------------------------------------------------------------------------------------ static void ReleaseWasapiDeviceInfoList( PaWasapiHostApiRepresentation *paWasapi ) { - UINT32 i; + UINT32 i; - // Release device info bound objects + // Release device info bound objects for (i = 0; i < paWasapi->deviceCount; ++i) - { - #ifndef PA_WINRT + { + #ifndef PA_WINRT SAFE_RELEASE(paWasapi->devInfo[i].device); - #endif + #endif } - // Free device info - if (paWasapi->allocations != NULL) - PaUtil_GroupFreeMemory(paWasapi->allocations, paWasapi->devInfo); + // Free device info + if (paWasapi->allocations != NULL) + PaUtil_GroupFreeMemory(paWasapi->allocations, paWasapi->devInfo); - // Be ready for a device list reinitialization and if its creation is failed pointers must not be dangling - paWasapi->devInfo = NULL; - paWasapi->deviceCount = 0; + // Be ready for a device list reinitialization and if its creation is failed pointers must not be dangling + paWasapi->devInfo = NULL; + paWasapi->deviceCount = 0; } // ------------------------------------------------------------------------------------------ static void Terminate( PaUtilHostApiRepresentation *hostApi ) { PaWasapiHostApiRepresentation *paWasapi = (PaWasapiHostApiRepresentation*)hostApi; - if (paWasapi == NULL) - return; + if (paWasapi == NULL) + return; - // Release device list - ReleaseWasapiDeviceInfoList(paWasapi); + // Release device list + ReleaseWasapiDeviceInfoList(paWasapi); - // Free allocations and memory group itself + // Free allocations and memory group itself if (paWasapi->allocations != NULL) - { + { PaUtil_FreeAllAllocations(paWasapi->allocations); PaUtil_DestroyAllocationGroup(paWasapi->allocations); } - // Release COM subsystem + // Release COM subsystem PaWinUtil_CoUninitialize(paWASAPI, &paWasapi->comInitializationResult); - // Free API representation + // Free API representation PaUtil_FreeMemory(paWasapi); - // Close AVRT - CloseAVRT(); + // Close AVRT + CloseAVRT(); } // ------------------------------------------------------------------------------------------ static PaWasapiHostApiRepresentation *_GetHostApi(PaError *ret) { - PaError error; - PaUtilHostApiRepresentation *pApi; + PaError error; + PaUtilHostApiRepresentation *pApi; - if ((error = PaUtil_GetHostApiRepresentation(&pApi, paWASAPI)) != paNoError) - { - if (ret != NULL) - (*ret) = error; + if ((error = PaUtil_GetHostApiRepresentation(&pApi, paWASAPI)) != paNoError) + { + if (ret != NULL) + (*ret) = error; - return NULL; - } + return NULL; + } - return (PaWasapiHostApiRepresentation *)pApi; + return (PaWasapiHostApiRepresentation *)pApi; } // ------------------------------------------------------------------------------------------ static PaError UpdateDeviceList() { - int i; - PaError ret; - PaWasapiHostApiRepresentation *paWasapi; - PaUtilHostApiRepresentation *hostApi; + int i; + PaError ret; + PaWasapiHostApiRepresentation *paWasapi; + PaUtilHostApiRepresentation *hostApi; - // Get API - hostApi = (PaUtilHostApiRepresentation *)(paWasapi = _GetHostApi(&ret)); - if (paWasapi == NULL) - return paNotInitialized; + // Get API + hostApi = (PaUtilHostApiRepresentation *)(paWasapi = _GetHostApi(&ret)); + if (paWasapi == NULL) + return paNotInitialized; - // Make sure initialized properly - if (paWasapi->allocations == NULL) - return paNotInitialized; + // Make sure initialized properly + if (paWasapi->allocations == NULL) + return paNotInitialized; - // Release WASAPI internal device info list - ReleaseWasapiDeviceInfoList(paWasapi); + // Release WASAPI internal device info list + ReleaseWasapiDeviceInfoList(paWasapi); - // Release external device info list - if (hostApi->deviceInfos != NULL) - { - for (i = 0; i < hostApi->info.deviceCount; ++i) - { - PaUtil_GroupFreeMemory(paWasapi->allocations, (void *)hostApi->deviceInfos[i]->name); - } - PaUtil_GroupFreeMemory(paWasapi->allocations, hostApi->deviceInfos[0]); - PaUtil_GroupFreeMemory(paWasapi->allocations, hostApi->deviceInfos); + // Release external device info list + if (hostApi->deviceInfos != NULL) + { + for (i = 0; i < hostApi->info.deviceCount; ++i) + { + PaUtil_GroupFreeMemory(paWasapi->allocations, (void *)hostApi->deviceInfos[i]->name); + } + PaUtil_GroupFreeMemory(paWasapi->allocations, hostApi->deviceInfos[0]); + PaUtil_GroupFreeMemory(paWasapi->allocations, hostApi->deviceInfos); - // Be ready for a device list reinitialization and if its creation is failed pointers must not be dangling - hostApi->deviceInfos = NULL; - hostApi->info.deviceCount = 0; - hostApi->info.defaultInputDevice = paNoDevice; - hostApi->info.defaultOutputDevice = paNoDevice; - } + // Be ready for a device list reinitialization and if its creation is failed pointers must not be dangling + hostApi->deviceInfos = NULL; + hostApi->info.deviceCount = 0; + hostApi->info.defaultInputDevice = paNoDevice; + hostApi->info.defaultOutputDevice = paNoDevice; + } - // Fill possibly updated device list - if ((ret = CreateDeviceList(paWasapi, Pa_HostApiTypeIdToHostApiIndex(paWASAPI))) != paNoError) - return ret; + // Fill possibly updated device list + if ((ret = CreateDeviceList(paWasapi, Pa_HostApiTypeIdToHostApiIndex(paWASAPI))) != paNoError) + return ret; - return paNoError; + return paNoError; } // ------------------------------------------------------------------------------------------ #if defined(PA_WASAPI_MAX_CONST_DEVICE_COUNT) && (PA_WASAPI_MAX_CONST_DEVICE_COUNT > 0) PaError PaWasapi_UpdateDeviceList() { - return UpdateDeviceList(); + return UpdateDeviceList(); } #endif // ------------------------------------------------------------------------------------------ int PaWasapi_GetDeviceCurrentFormat( PaStream *pStream, void *pFormat, unsigned int formatSize, int bOutput ) { - UINT32 size; - WAVEFORMATEXTENSIBLE *format; + UINT32 size; + WAVEFORMATEXTENSIBLE *format; - PaWasapiStream *stream = (PaWasapiStream *)pStream; - if (stream == NULL) - return paBadStreamPtr; - - format = (bOutput == TRUE ? &stream->out.wavex : &stream->in.wavex); + PaWasapiStream *stream = (PaWasapiStream *)pStream; + if (stream == NULL) + return paBadStreamPtr; + + format = (bOutput == TRUE ? &stream->out.wavex : &stream->in.wavex); - size = min(formatSize, (UINT32)sizeof(*format)); - memcpy(pFormat, format, size); + size = min(formatSize, (UINT32)sizeof(*format)); + memcpy(pFormat, format, size); - return size; + return size; } // ------------------------------------------------------------------------------------------ int PaWasapi_GetDeviceDefaultFormat( void *pFormat, unsigned int formatSize, PaDeviceIndex device ) { - PaError ret; - PaWasapiHostApiRepresentation *paWasapi; - UINT32 size; - PaDeviceIndex index; + PaError ret; + PaWasapiHostApiRepresentation *paWasapi; + UINT32 size; + PaDeviceIndex index; - if (pFormat == NULL) - return paBadBufferPtr; - if (formatSize <= 0) - return paBufferTooSmall; + if (pFormat == NULL) + return paBadBufferPtr; + if (formatSize <= 0) + return paBufferTooSmall; - // Get API - paWasapi = _GetHostApi(&ret); - if (paWasapi == NULL) - return ret; + // Get API + paWasapi = _GetHostApi(&ret); + if (paWasapi == NULL) + return ret; - // Get device index - ret = PaUtil_DeviceIndexToHostApiDeviceIndex(&index, device, &paWasapi->inheritedHostApiRep); + // Get device index + ret = PaUtil_DeviceIndexToHostApiDeviceIndex(&index, device, &paWasapi->inheritedHostApiRep); if (ret != paNoError) return ret; - // Validate index - if ((UINT32)index >= paWasapi->deviceCount) - return paInvalidDevice; - - size = min(formatSize, (UINT32)sizeof(paWasapi->devInfo[ index ].DefaultFormat)); - memcpy(pFormat, &paWasapi->devInfo[ index ].DefaultFormat, size); + // Validate index + if ((UINT32)index >= paWasapi->deviceCount) + return paInvalidDevice; + + size = min(formatSize, (UINT32)sizeof(paWasapi->devInfo[ index ].DefaultFormat)); + memcpy(pFormat, &paWasapi->devInfo[ index ].DefaultFormat, size); - return size; + return size; } // ------------------------------------------------------------------------------------------ int PaWasapi_GetDeviceMixFormat( void *pFormat, unsigned int formatSize, PaDeviceIndex device ) { - PaError ret; - PaWasapiHostApiRepresentation *paWasapi; - UINT32 size; - PaDeviceIndex index; + PaError ret; + PaWasapiHostApiRepresentation *paWasapi; + UINT32 size; + PaDeviceIndex index; - if (pFormat == NULL) - return paBadBufferPtr; - if (formatSize <= 0) - return paBufferTooSmall; + if (pFormat == NULL) + return paBadBufferPtr; + if (formatSize <= 0) + return paBufferTooSmall; - // Get API - paWasapi = _GetHostApi(&ret); - if (paWasapi == NULL) - return ret; + // Get API + paWasapi = _GetHostApi(&ret); + if (paWasapi == NULL) + return ret; - // Get device index - ret = PaUtil_DeviceIndexToHostApiDeviceIndex(&index, device, &paWasapi->inheritedHostApiRep); + // Get device index + ret = PaUtil_DeviceIndexToHostApiDeviceIndex(&index, device, &paWasapi->inheritedHostApiRep); if (ret != paNoError) return ret; - // Validate index - if ((UINT32)index >= paWasapi->deviceCount) - return paInvalidDevice; - - size = min(formatSize, (UINT32)sizeof(paWasapi->devInfo[ index ].MixFormat)); - memcpy(pFormat, &paWasapi->devInfo[ index ].MixFormat, size); + // Validate index + if ((UINT32)index >= paWasapi->deviceCount) + return paInvalidDevice; + + size = min(formatSize, (UINT32)sizeof(paWasapi->devInfo[ index ].MixFormat)); + memcpy(pFormat, &paWasapi->devInfo[ index ].MixFormat, size); - return size; + return size; } // ------------------------------------------------------------------------------------------ int PaWasapi_GetDeviceRole( PaDeviceIndex device ) { - PaError ret; - PaDeviceIndex index; + PaError ret; + PaDeviceIndex index; - // Get API - PaWasapiHostApiRepresentation *paWasapi = _GetHostApi(&ret); - if (paWasapi == NULL) - return paNotInitialized; + // Get API + PaWasapiHostApiRepresentation *paWasapi = _GetHostApi(&ret); + if (paWasapi == NULL) + return paNotInitialized; - // Get device index - ret = PaUtil_DeviceIndexToHostApiDeviceIndex(&index, device, &paWasapi->inheritedHostApiRep); + // Get device index + ret = PaUtil_DeviceIndexToHostApiDeviceIndex(&index, device, &paWasapi->inheritedHostApiRep); if (ret != paNoError) return ret; - // Validate index - if ((UINT32)index >= paWasapi->deviceCount) - return paInvalidDevice; + // Validate index + if ((UINT32)index >= paWasapi->deviceCount) + return paInvalidDevice; - return paWasapi->devInfo[ index ].formFactor; + return paWasapi->devInfo[ index ].formFactor; } // ------------------------------------------------------------------------------------------ PaError PaWasapi_GetFramesPerHostBuffer( PaStream *pStream, unsigned int *pInput, unsigned int *pOutput ) { PaWasapiStream *stream = (PaWasapiStream *)pStream; - if (stream == NULL) - return paBadStreamPtr; + if (stream == NULL) + return paBadStreamPtr; - if (pInput != NULL) - (*pInput) = stream->in.framesPerHostCallback; + if (pInput != NULL) + (*pInput) = stream->in.framesPerHostCallback; - if (pOutput != NULL) - (*pOutput) = stream->out.framesPerHostCallback; + if (pOutput != NULL) + (*pOutput) = stream->out.framesPerHostCallback; - return paNoError; + return paNoError; } // ------------------------------------------------------------------------------------------ static void LogWAVEFORMATEXTENSIBLE(const WAVEFORMATEXTENSIBLE *in) { const WAVEFORMATEX *old = (WAVEFORMATEX *)in; - switch (old->wFormatTag) - { - case WAVE_FORMAT_EXTENSIBLE: { + switch (old->wFormatTag) + { + case WAVE_FORMAT_EXTENSIBLE: { - PRINT(("wFormatTag =WAVE_FORMAT_EXTENSIBLE\n")); + PRINT(("wFormatTag =WAVE_FORMAT_EXTENSIBLE\n")); - if (IsEqualGUID(&in->SubFormat, &pa_KSDATAFORMAT_SUBTYPE_IEEE_FLOAT)) - { - PRINT(("SubFormat =KSDATAFORMAT_SUBTYPE_IEEE_FLOAT\n")); - } - else - if (IsEqualGUID(&in->SubFormat, &pa_KSDATAFORMAT_SUBTYPE_PCM)) - { - PRINT(("SubFormat =KSDATAFORMAT_SUBTYPE_PCM\n")); - } - else - { - PRINT(("SubFormat =CUSTOM GUID{%d:%d:%d:%d%d%d%d%d%d%d%d}\n", - in->SubFormat.Data1, - in->SubFormat.Data2, - in->SubFormat.Data3, - (int)in->SubFormat.Data4[0], - (int)in->SubFormat.Data4[1], - (int)in->SubFormat.Data4[2], - (int)in->SubFormat.Data4[3], - (int)in->SubFormat.Data4[4], - (int)in->SubFormat.Data4[5], - (int)in->SubFormat.Data4[6], - (int)in->SubFormat.Data4[7])); - } - PRINT(("Samples.wValidBitsPerSample =%d\n", in->Samples.wValidBitsPerSample)); - PRINT(("dwChannelMask =0x%X\n",in->dwChannelMask)); + if (IsEqualGUID(&in->SubFormat, &pa_KSDATAFORMAT_SUBTYPE_IEEE_FLOAT)) + { + PRINT(("SubFormat =KSDATAFORMAT_SUBTYPE_IEEE_FLOAT\n")); + } + else + if (IsEqualGUID(&in->SubFormat, &pa_KSDATAFORMAT_SUBTYPE_PCM)) + { + PRINT(("SubFormat =KSDATAFORMAT_SUBTYPE_PCM\n")); + } + else + { + PRINT(("SubFormat =CUSTOM GUID{%d:%d:%d:%d%d%d%d%d%d%d%d}\n", + in->SubFormat.Data1, + in->SubFormat.Data2, + in->SubFormat.Data3, + (int)in->SubFormat.Data4[0], + (int)in->SubFormat.Data4[1], + (int)in->SubFormat.Data4[2], + (int)in->SubFormat.Data4[3], + (int)in->SubFormat.Data4[4], + (int)in->SubFormat.Data4[5], + (int)in->SubFormat.Data4[6], + (int)in->SubFormat.Data4[7])); + } + PRINT(("Samples.wValidBitsPerSample =%d\n", in->Samples.wValidBitsPerSample)); + PRINT(("dwChannelMask =0x%X\n",in->dwChannelMask)); - break; } + break; } - case WAVE_FORMAT_PCM: PRINT(("wFormatTag =WAVE_FORMAT_PCM\n")); break; - case WAVE_FORMAT_IEEE_FLOAT: PRINT(("wFormatTag =WAVE_FORMAT_IEEE_FLOAT\n")); break; - default: - PRINT(("wFormatTag =UNKNOWN(%d)\n",old->wFormatTag)); break; - } + case WAVE_FORMAT_PCM: PRINT(("wFormatTag =WAVE_FORMAT_PCM\n")); break; + case WAVE_FORMAT_IEEE_FLOAT: PRINT(("wFormatTag =WAVE_FORMAT_IEEE_FLOAT\n")); break; + default: + PRINT(("wFormatTag =UNKNOWN(%d)\n",old->wFormatTag)); break; + } - PRINT(("nChannels =%d\n",old->nChannels)); - PRINT(("nSamplesPerSec =%d\n",old->nSamplesPerSec)); - PRINT(("nAvgBytesPerSec=%d\n",old->nAvgBytesPerSec)); - PRINT(("nBlockAlign =%d\n",old->nBlockAlign)); - PRINT(("wBitsPerSample =%d\n",old->wBitsPerSample)); - PRINT(("cbSize =%d\n",old->cbSize)); + PRINT(("nChannels =%d\n",old->nChannels)); + PRINT(("nSamplesPerSec =%d\n",old->nSamplesPerSec)); + PRINT(("nAvgBytesPerSec=%d\n",old->nAvgBytesPerSec)); + PRINT(("nBlockAlign =%d\n",old->nBlockAlign)); + PRINT(("wBitsPerSample =%d\n",old->wBitsPerSample)); + PRINT(("cbSize =%d\n",old->cbSize)); } // ------------------------------------------------------------------------------------------ @@ -2547,38 +2547,38 @@ PaSampleFormat WaveToPaFormat(const WAVEFORMATEXTENSIBLE *fmtext) const WAVEFORMATEX *fmt = (WAVEFORMATEX *)fmtext; switch (fmt->wFormatTag) - { + { case WAVE_FORMAT_EXTENSIBLE: { if (IsEqualGUID(&fmtext->SubFormat, &pa_KSDATAFORMAT_SUBTYPE_IEEE_FLOAT)) - { + { if (fmtext->Samples.wValidBitsPerSample == 32) return paFloat32; } else - if (IsEqualGUID(&fmtext->SubFormat, &pa_KSDATAFORMAT_SUBTYPE_PCM)) - { + if (IsEqualGUID(&fmtext->SubFormat, &pa_KSDATAFORMAT_SUBTYPE_PCM)) + { switch (fmt->wBitsPerSample) - { - case 32: return paInt32; + { + case 32: return paInt32; case 24: return paInt24; case 16: return paInt16; - case 8: return paUInt8; + case 8: return paUInt8; } } - break; } + break; } case WAVE_FORMAT_IEEE_FLOAT: - return paFloat32; + return paFloat32; case WAVE_FORMAT_PCM: { switch (fmt->wBitsPerSample) - { + { case 32: return paInt32; case 24: return paInt24; case 16: return paInt16; case 8: return paUInt8; } - break; } + break; } } return paCustomFormat; @@ -2588,50 +2588,50 @@ PaSampleFormat WaveToPaFormat(const WAVEFORMATEXTENSIBLE *fmtext) static PaError MakeWaveFormatFromParams(WAVEFORMATEXTENSIBLE *wavex, const PaStreamParameters *params, double sampleRate, BOOL packedOnly) { - WORD bitsPerSample; - WAVEFORMATEX *old; - DWORD channelMask = 0; - BOOL useExtensible = (params->channelCount > 2); // format is always forced for >2 channels format - PaWasapiStreamInfo *streamInfo = (PaWasapiStreamInfo *)params->hostApiSpecificStreamInfo; + WORD bitsPerSample; + WAVEFORMATEX *old; + DWORD channelMask = 0; + BOOL useExtensible = (params->channelCount > 2); // format is always forced for >2 channels format + PaWasapiStreamInfo *streamInfo = (PaWasapiStreamInfo *)params->hostApiSpecificStreamInfo; - // Convert PaSampleFormat to valid data bits - if ((bitsPerSample = PaSampleFormatToBitsPerSample(params->sampleFormat)) == 0) - return paSampleFormatNotSupported; + // Convert PaSampleFormat to valid data bits + if ((bitsPerSample = PaSampleFormatToBitsPerSample(params->sampleFormat)) == 0) + return paSampleFormatNotSupported; - // Use user assigned channel mask - if ((streamInfo != NULL) && (streamInfo->flags & paWinWasapiUseChannelMask)) - { - channelMask = streamInfo->channelMask; - useExtensible = TRUE; - } + // Use user assigned channel mask + if ((streamInfo != NULL) && (streamInfo->flags & paWinWasapiUseChannelMask)) + { + channelMask = streamInfo->channelMask; + useExtensible = TRUE; + } memset(wavex, 0, sizeof(*wavex)); - old = (WAVEFORMATEX *)wavex; + old = (WAVEFORMATEX *)wavex; old->nChannels = (WORD)params->channelCount; old->nSamplesPerSec = (DWORD)sampleRate; - old->wBitsPerSample = bitsPerSample; + old->wBitsPerSample = bitsPerSample; - // according to MSDN for WAVEFORMATEX structure for WAVE_FORMAT_PCM: - // "If wFormatTag is WAVE_FORMAT_PCM, then wBitsPerSample should be equal to 8 or 16." - if ((bitsPerSample != 8) && (bitsPerSample != 16)) - { - // Normally 20 or 24 bits must go in 32 bit containers (ints) but in Exclusive mode some devices require - // packed version of the format, e.g. for example 24-bit in 3-bytes - old->wBitsPerSample = (packedOnly ? bitsPerSample : 32); - useExtensible = TRUE; - } + // according to MSDN for WAVEFORMATEX structure for WAVE_FORMAT_PCM: + // "If wFormatTag is WAVE_FORMAT_PCM, then wBitsPerSample should be equal to 8 or 16." + if ((bitsPerSample != 8) && (bitsPerSample != 16)) + { + // Normally 20 or 24 bits must go in 32 bit containers (ints) but in Exclusive mode some devices require + // packed version of the format, e.g. for example 24-bit in 3-bytes + old->wBitsPerSample = (packedOnly ? bitsPerSample : 32); + useExtensible = TRUE; + } // WAVEFORMATEX if (!useExtensible) - { - old->wFormatTag = WAVE_FORMAT_PCM; + { + old->wFormatTag = WAVE_FORMAT_PCM; } // WAVEFORMATEXTENSIBLE else - { + { old->wFormatTag = WAVE_FORMAT_EXTENSIBLE; - old->cbSize = sizeof(WAVEFORMATEXTENSIBLE) - sizeof(WAVEFORMATEX); + old->cbSize = sizeof(WAVEFORMATEXTENSIBLE) - sizeof(WAVEFORMATEX); if ((params->sampleFormat & ~paNonInterleaved) == paFloat32) wavex->SubFormat = pa_KSDATAFORMAT_SUBTYPE_IEEE_FLOAT; @@ -2640,40 +2640,40 @@ static PaError MakeWaveFormatFromParams(WAVEFORMATEXTENSIBLE *wavex, const PaStr wavex->Samples.wValidBitsPerSample = bitsPerSample; - // Set channel mask - if (channelMask != 0) - { - wavex->dwChannelMask = channelMask; - } - else - { - switch (params->channelCount) - { - case 1: wavex->dwChannelMask = PAWIN_SPEAKER_MONO; break; - case 2: wavex->dwChannelMask = PAWIN_SPEAKER_STEREO; break; - case 3: wavex->dwChannelMask = PAWIN_SPEAKER_STEREO|SPEAKER_LOW_FREQUENCY; break; - case 4: wavex->dwChannelMask = PAWIN_SPEAKER_QUAD; break; - case 5: wavex->dwChannelMask = PAWIN_SPEAKER_QUAD|SPEAKER_LOW_FREQUENCY; break; + // Set channel mask + if (channelMask != 0) + { + wavex->dwChannelMask = channelMask; + } + else + { + switch (params->channelCount) + { + case 1: wavex->dwChannelMask = PAWIN_SPEAKER_MONO; break; + case 2: wavex->dwChannelMask = PAWIN_SPEAKER_STEREO; break; + case 3: wavex->dwChannelMask = PAWIN_SPEAKER_STEREO|SPEAKER_LOW_FREQUENCY; break; + case 4: wavex->dwChannelMask = PAWIN_SPEAKER_QUAD; break; + case 5: wavex->dwChannelMask = PAWIN_SPEAKER_QUAD|SPEAKER_LOW_FREQUENCY; break; #ifdef PAWIN_SPEAKER_5POINT1_SURROUND - case 6: wavex->dwChannelMask = PAWIN_SPEAKER_5POINT1_SURROUND; break; + case 6: wavex->dwChannelMask = PAWIN_SPEAKER_5POINT1_SURROUND; break; #else - case 6: wavex->dwChannelMask = PAWIN_SPEAKER_5POINT1; break; + case 6: wavex->dwChannelMask = PAWIN_SPEAKER_5POINT1; break; #endif #ifdef PAWIN_SPEAKER_5POINT1_SURROUND - case 7: wavex->dwChannelMask = PAWIN_SPEAKER_5POINT1_SURROUND|SPEAKER_BACK_CENTER; break; + case 7: wavex->dwChannelMask = PAWIN_SPEAKER_5POINT1_SURROUND|SPEAKER_BACK_CENTER; break; #else - case 7: wavex->dwChannelMask = PAWIN_SPEAKER_5POINT1|SPEAKER_BACK_CENTER; break; -#endif + case 7: wavex->dwChannelMask = PAWIN_SPEAKER_5POINT1|SPEAKER_BACK_CENTER; break; +#endif #ifdef PAWIN_SPEAKER_7POINT1_SURROUND - case 8: wavex->dwChannelMask = PAWIN_SPEAKER_7POINT1_SURROUND; break; + case 8: wavex->dwChannelMask = PAWIN_SPEAKER_7POINT1_SURROUND; break; #else - case 8: wavex->dwChannelMask = PAWIN_SPEAKER_7POINT1; break; + case 8: wavex->dwChannelMask = PAWIN_SPEAKER_7POINT1; break; #endif - default: wavex->dwChannelMask = 0; - } - } - } + default: wavex->dwChannelMask = 0; + } + } + } old->nBlockAlign = old->nChannels * (old->wBitsPerSample / 8); old->nAvgBytesPerSec = old->nSamplesPerSec * old->nBlockAlign; @@ -2683,164 +2683,164 @@ static PaError MakeWaveFormatFromParams(WAVEFORMATEXTENSIBLE *wavex, const PaStr // ------------------------------------------------------------------------------------------ static HRESULT GetAlternativeSampleFormatExclusive(IAudioClient *client, double sampleRate, - const PaStreamParameters *params, WAVEFORMATEXTENSIBLE *outWavex, BOOL packedSampleFormatOnly) + const PaStreamParameters *params, WAVEFORMATEXTENSIBLE *outWavex, BOOL packedSampleFormatOnly) { - HRESULT hr = !S_OK; - AUDCLNT_SHAREMODE shareMode = AUDCLNT_SHAREMODE_EXCLUSIVE; - WAVEFORMATEXTENSIBLE testFormat; - PaStreamParameters testParams; - int i; - static const PaSampleFormat bestToWorst[] = { paInt32, paInt24, paFloat32, paInt16 }; + HRESULT hr = !S_OK; + AUDCLNT_SHAREMODE shareMode = AUDCLNT_SHAREMODE_EXCLUSIVE; + WAVEFORMATEXTENSIBLE testFormat; + PaStreamParameters testParams; + int i; + static const PaSampleFormat bestToWorst[] = { paInt32, paInt24, paFloat32, paInt16 }; - // Try combination Stereo (2 channels) and then we will use our custom mono-stereo mixer - if (params->channelCount == 1) - { - testParams = (*params); - testParams.channelCount = 2; + // Try combination Stereo (2 channels) and then we will use our custom mono-stereo mixer + if (params->channelCount == 1) + { + testParams = (*params); + testParams.channelCount = 2; - if (MakeWaveFormatFromParams(&testFormat, &testParams, sampleRate, packedSampleFormatOnly) == paNoError) - { - if ((hr = IAudioClient_IsFormatSupported(client, shareMode, &testFormat.Format, NULL)) == S_OK) - { - (*outWavex) = testFormat; - return hr; - } - } + if (MakeWaveFormatFromParams(&testFormat, &testParams, sampleRate, packedSampleFormatOnly) == paNoError) + { + if ((hr = IAudioClient_IsFormatSupported(client, shareMode, &testFormat.Format, NULL)) == S_OK) + { + (*outWavex) = testFormat; + return hr; + } + } - // Try selecting suitable sample type - for (i = 0; i < STATIC_ARRAY_SIZE(bestToWorst); ++i) - { - testParams.sampleFormat = bestToWorst[i]; + // Try selecting suitable sample type + for (i = 0; i < STATIC_ARRAY_SIZE(bestToWorst); ++i) + { + testParams.sampleFormat = bestToWorst[i]; - if (MakeWaveFormatFromParams(&testFormat, &testParams, sampleRate, packedSampleFormatOnly) == paNoError) - { - if ((hr = IAudioClient_IsFormatSupported(client, shareMode, &testFormat.Format, NULL)) == S_OK) - { - (*outWavex) = testFormat; - return hr; - } - } - } - } + if (MakeWaveFormatFromParams(&testFormat, &testParams, sampleRate, packedSampleFormatOnly) == paNoError) + { + if ((hr = IAudioClient_IsFormatSupported(client, shareMode, &testFormat.Format, NULL)) == S_OK) + { + (*outWavex) = testFormat; + return hr; + } + } + } + } - // Try selecting suitable sample type - testParams = (*params); - for (i = 0; i < STATIC_ARRAY_SIZE(bestToWorst); ++i) - { - testParams.sampleFormat = bestToWorst[i]; + // Try selecting suitable sample type + testParams = (*params); + for (i = 0; i < STATIC_ARRAY_SIZE(bestToWorst); ++i) + { + testParams.sampleFormat = bestToWorst[i]; - if (MakeWaveFormatFromParams(&testFormat, &testParams, sampleRate, packedSampleFormatOnly) == paNoError) - { - if ((hr = IAudioClient_IsFormatSupported(client, shareMode, &testFormat.Format, NULL)) == S_OK) - { - (*outWavex) = testFormat; - return hr; - } - } - } - - return hr; + if (MakeWaveFormatFromParams(&testFormat, &testParams, sampleRate, packedSampleFormatOnly) == paNoError) + { + if ((hr = IAudioClient_IsFormatSupported(client, shareMode, &testFormat.Format, NULL)) == S_OK) + { + (*outWavex) = testFormat; + return hr; + } + } + } + + return hr; } // ------------------------------------------------------------------------------------------ static PaError GetClosestFormat(IAudioClient *client, double sampleRate, const PaStreamParameters *_params, - AUDCLNT_SHAREMODE shareMode, WAVEFORMATEXTENSIBLE *outWavex, BOOL output) + AUDCLNT_SHAREMODE shareMode, WAVEFORMATEXTENSIBLE *outWavex, BOOL output) { - PaWasapiStreamInfo *streamInfo = (PaWasapiStreamInfo *)_params->hostApiSpecificStreamInfo; - WAVEFORMATEX *sharedClosestMatch = NULL; - HRESULT hr = !S_OK; - PaStreamParameters params = (*_params); - const BOOL explicitFormat = (streamInfo != NULL) && ((streamInfo->flags & paWinWasapiExplicitSampleFormat) == paWinWasapiExplicitSampleFormat); - (void)output; + PaWasapiStreamInfo *streamInfo = (PaWasapiStreamInfo *)_params->hostApiSpecificStreamInfo; + WAVEFORMATEX *sharedClosestMatch = NULL; + HRESULT hr = !S_OK; + PaStreamParameters params = (*_params); + const BOOL explicitFormat = (streamInfo != NULL) && ((streamInfo->flags & paWinWasapiExplicitSampleFormat) == paWinWasapiExplicitSampleFormat); + (void)output; - /* It was not noticed that 24-bit Input producing no output while device accepts this format. - To fix this issue let's ask for 32-bits and let PA converters convert host 32-bit data - to 24-bit for user-space. The bug concerns Vista, if Windows 7 supports 24-bits for Input - please report to PortAudio developers to exclude Windows 7. - */ - /*if ((params.sampleFormat == paInt24) && (output == FALSE)) - params.sampleFormat = paFloat32;*/ // <<< The silence was due to missing Int32_To_Int24_Dither implementation + /* It was not noticed that 24-bit Input producing no output while device accepts this format. + To fix this issue let's ask for 32-bits and let PA converters convert host 32-bit data + to 24-bit for user-space. The bug concerns Vista, if Windows 7 supports 24-bits for Input + please report to PortAudio developers to exclude Windows 7. + */ + /*if ((params.sampleFormat == paInt24) && (output == FALSE)) + params.sampleFormat = paFloat32;*/ // <<< The silence was due to missing Int32_To_Int24_Dither implementation - // Try standard approach, e.g. if data is > 16 bits it will be packed into 32-bit containers + // Try standard approach, e.g. if data is > 16 bits it will be packed into 32-bit containers MakeWaveFormatFromParams(outWavex, ¶ms, sampleRate, FALSE); - - // If built-in PCM converter requested then shared mode format will always succeed - if ((GetWindowsVersion() >= WINDOWS_7_SERVER2008R2) && - (shareMode == AUDCLNT_SHAREMODE_SHARED) && - ((streamInfo != NULL) && (streamInfo->flags & paWinWasapiAutoConvert))) - return paFormatIsSupported; + + // If built-in PCM converter requested then shared mode format will always succeed + if ((GetWindowsVersion() >= WINDOWS_7_SERVER2008R2) && + (shareMode == AUDCLNT_SHAREMODE_SHARED) && + ((streamInfo != NULL) && (streamInfo->flags & paWinWasapiAutoConvert))) + return paFormatIsSupported; - hr = IAudioClient_IsFormatSupported(client, shareMode, &outWavex->Format, (shareMode == AUDCLNT_SHAREMODE_SHARED ? &sharedClosestMatch : NULL)); - - // Exclusive mode can require packed format for some devices - if ((hr != S_OK) && (shareMode == AUDCLNT_SHAREMODE_EXCLUSIVE)) - { - // Enforce packed only format, e.g. data bits will not be packed into 32-bit containers in any case - MakeWaveFormatFromParams(outWavex, ¶ms, sampleRate, TRUE); - hr = IAudioClient_IsFormatSupported(client, shareMode, &outWavex->Format, NULL); - } + hr = IAudioClient_IsFormatSupported(client, shareMode, &outWavex->Format, (shareMode == AUDCLNT_SHAREMODE_SHARED ? &sharedClosestMatch : NULL)); + + // Exclusive mode can require packed format for some devices + if ((hr != S_OK) && (shareMode == AUDCLNT_SHAREMODE_EXCLUSIVE)) + { + // Enforce packed only format, e.g. data bits will not be packed into 32-bit containers in any case + MakeWaveFormatFromParams(outWavex, ¶ms, sampleRate, TRUE); + hr = IAudioClient_IsFormatSupported(client, shareMode, &outWavex->Format, NULL); + } - if (hr == S_OK) - { - return paFormatIsSupported; - } - else - if (sharedClosestMatch != NULL) - { - WORD bitsPerSample; + if (hr == S_OK) + { + return paFormatIsSupported; + } + else + if (sharedClosestMatch != NULL) + { + WORD bitsPerSample; - if (sharedClosestMatch->wFormatTag == WAVE_FORMAT_EXTENSIBLE) - memcpy(outWavex, sharedClosestMatch, sizeof(WAVEFORMATEXTENSIBLE)); - else - memcpy(outWavex, sharedClosestMatch, sizeof(WAVEFORMATEX)); + if (sharedClosestMatch->wFormatTag == WAVE_FORMAT_EXTENSIBLE) + memcpy(outWavex, sharedClosestMatch, sizeof(WAVEFORMATEXTENSIBLE)); + else + memcpy(outWavex, sharedClosestMatch, sizeof(WAVEFORMATEX)); - CoTaskMemFree(sharedClosestMatch); - sharedClosestMatch = NULL; + CoTaskMemFree(sharedClosestMatch); + sharedClosestMatch = NULL; - // Validate SampleRate - if ((DWORD)sampleRate != outWavex->Format.nSamplesPerSec) - return paInvalidSampleRate; + // Validate SampleRate + if ((DWORD)sampleRate != outWavex->Format.nSamplesPerSec) + return paInvalidSampleRate; - // Validate Channel count - if ((WORD)params.channelCount != outWavex->Format.nChannels) - { - // If mono, then driver does not support 1 channel, we use internal workaround - // of tiny software mixing functionality, e.g. we provide to user buffer 1 channel - // but then mix into 2 for device buffer - if ((params.channelCount == 1) && (outWavex->Format.nChannels == 2)) - return paFormatIsSupported; - else - return paInvalidChannelCount; - } + // Validate Channel count + if ((WORD)params.channelCount != outWavex->Format.nChannels) + { + // If mono, then driver does not support 1 channel, we use internal workaround + // of tiny software mixing functionality, e.g. we provide to user buffer 1 channel + // but then mix into 2 for device buffer + if ((params.channelCount == 1) && (outWavex->Format.nChannels == 2)) + return paFormatIsSupported; + else + return paInvalidChannelCount; + } - // Validate Sample format - if ((bitsPerSample = PaSampleFormatToBitsPerSample(params.sampleFormat)) == 0) - return paSampleFormatNotSupported; + // Validate Sample format + if ((bitsPerSample = PaSampleFormatToBitsPerSample(params.sampleFormat)) == 0) + return paSampleFormatNotSupported; - // Accepted format - return paFormatIsSupported; - } - else - if ((shareMode == AUDCLNT_SHAREMODE_EXCLUSIVE) && !explicitFormat) - { - // Try standard approach, e.g. if data is > 16 bits it will be packed into 32-bit containers - if ((hr = GetAlternativeSampleFormatExclusive(client, sampleRate, ¶ms, outWavex, FALSE)) == S_OK) - return paFormatIsSupported; + // Accepted format + return paFormatIsSupported; + } + else + if ((shareMode == AUDCLNT_SHAREMODE_EXCLUSIVE) && !explicitFormat) + { + // Try standard approach, e.g. if data is > 16 bits it will be packed into 32-bit containers + if ((hr = GetAlternativeSampleFormatExclusive(client, sampleRate, ¶ms, outWavex, FALSE)) == S_OK) + return paFormatIsSupported; - // Enforce packed only format, e.g. data bits will not be packed into 32-bit containers in any case - if ((hr = GetAlternativeSampleFormatExclusive(client, sampleRate, ¶ms, outWavex, TRUE)) == S_OK) - return paFormatIsSupported; + // Enforce packed only format, e.g. data bits will not be packed into 32-bit containers in any case + if ((hr = GetAlternativeSampleFormatExclusive(client, sampleRate, ¶ms, outWavex, TRUE)) == S_OK) + return paFormatIsSupported; - // Log failure - LogHostError(hr); - } - else - { - // Exclusive mode and requested strict format, WASAPI did not accept this sample format - LogHostError(hr); - } + // Log failure + LogHostError(hr); + } + else + { + // Exclusive mode and requested strict format, WASAPI did not accept this sample format + LogHostError(hr); + } - return paInvalidSampleRate; + return paInvalidSampleRate; } // ------------------------------------------------------------------------------------------ @@ -2849,17 +2849,17 @@ static PaError IsStreamParamsValid(struct PaUtilHostApiRepresentation *hostApi, const PaStreamParameters *outputParameters, double sampleRate) { - if (hostApi == NULL) - return paHostApiNotFound; - if ((UINT32)sampleRate == 0) - return paInvalidSampleRate; + if (hostApi == NULL) + return paHostApiNotFound; + if ((UINT32)sampleRate == 0) + return paInvalidSampleRate; - if (inputParameters != NULL) + if (inputParameters != NULL) { /* all standard sample formats are supported by the buffer adapter, this implementation doesn't support any custom sample formats */ - // Note: paCustomFormat is now 8.24 (24-bits in 32-bit containers) - //if (inputParameters->sampleFormat & paCustomFormat) + // Note: paCustomFormat is now 8.24 (24-bits in 32-bit containers) + //if (inputParameters->sampleFormat & paCustomFormat) // return paSampleFormatNotSupported; /* unless alternate device specification is supported, reject the use of @@ -2873,15 +2873,15 @@ static PaError IsStreamParamsValid(struct PaUtilHostApiRepresentation *hostApi, /* validate inputStreamInfo */ if (inputParameters->hostApiSpecificStreamInfo) - { - PaWasapiStreamInfo *inputStreamInfo = (PaWasapiStreamInfo *)inputParameters->hostApiSpecificStreamInfo; - if ((inputStreamInfo->size != sizeof(PaWasapiStreamInfo)) || - (inputStreamInfo->version != 1) || + { + PaWasapiStreamInfo *inputStreamInfo = (PaWasapiStreamInfo *)inputParameters->hostApiSpecificStreamInfo; + if ((inputStreamInfo->size != sizeof(PaWasapiStreamInfo)) || + (inputStreamInfo->version != 1) || (inputStreamInfo->hostApiType != paWASAPI)) - { - return paIncompatibleHostApiSpecificStreamInfo; - } - } + { + return paIncompatibleHostApiSpecificStreamInfo; + } + } return paNoError; } @@ -2890,7 +2890,7 @@ static PaError IsStreamParamsValid(struct PaUtilHostApiRepresentation *hostApi, { /* all standard sample formats are supported by the buffer adapter, this implementation doesn't support any custom sample formats */ - // Note: paCustomFormat is now 8.24 (24-bits in 32-bit containers) + // Note: paCustomFormat is now 8.24 (24-bits in 32-bit containers) //if (outputParameters->sampleFormat & paCustomFormat) // return paSampleFormatNotSupported; @@ -2906,19 +2906,19 @@ static PaError IsStreamParamsValid(struct PaUtilHostApiRepresentation *hostApi, /* validate outputStreamInfo */ if(outputParameters->hostApiSpecificStreamInfo) { - PaWasapiStreamInfo *outputStreamInfo = (PaWasapiStreamInfo *)outputParameters->hostApiSpecificStreamInfo; - if ((outputStreamInfo->size != sizeof(PaWasapiStreamInfo)) || - (outputStreamInfo->version != 1) || + PaWasapiStreamInfo *outputStreamInfo = (PaWasapiStreamInfo *)outputParameters->hostApiSpecificStreamInfo; + if ((outputStreamInfo->size != sizeof(PaWasapiStreamInfo)) || + (outputStreamInfo->version != 1) || (outputStreamInfo->hostApiType != paWASAPI)) - { - return paIncompatibleHostApiSpecificStreamInfo; - } + { + return paIncompatibleHostApiSpecificStreamInfo; + } } - return paNoError; + return paNoError; } - return (inputParameters || outputParameters ? paNoError : paInternalError); + return (inputParameters || outputParameters ? paNoError : paInternalError); } // ------------------------------------------------------------------------------------------ @@ -2927,63 +2927,63 @@ static PaError IsFormatSupported( struct PaUtilHostApiRepresentation *hostApi, const PaStreamParameters *outputParameters, double sampleRate ) { - IAudioClient *tmpClient = NULL; - PaWasapiHostApiRepresentation *paWasapi = (PaWasapiHostApiRepresentation*)hostApi; - PaWasapiStreamInfo *inputStreamInfo = NULL, *outputStreamInfo = NULL; + IAudioClient *tmpClient = NULL; + PaWasapiHostApiRepresentation *paWasapi = (PaWasapiHostApiRepresentation*)hostApi; + PaWasapiStreamInfo *inputStreamInfo = NULL, *outputStreamInfo = NULL; - // Validate PaStreamParameters - PaError error; - if ((error = IsStreamParamsValid(hostApi, inputParameters, outputParameters, sampleRate)) != paNoError) - return error; + // Validate PaStreamParameters + PaError error; + if ((error = IsStreamParamsValid(hostApi, inputParameters, outputParameters, sampleRate)) != paNoError) + return error; if (inputParameters != NULL) { - WAVEFORMATEXTENSIBLE wavex; - HRESULT hr; - PaError answer; - AUDCLNT_SHAREMODE shareMode = AUDCLNT_SHAREMODE_SHARED; - inputStreamInfo = (PaWasapiStreamInfo *)inputParameters->hostApiSpecificStreamInfo; + WAVEFORMATEXTENSIBLE wavex; + HRESULT hr; + PaError answer; + AUDCLNT_SHAREMODE shareMode = AUDCLNT_SHAREMODE_SHARED; + inputStreamInfo = (PaWasapiStreamInfo *)inputParameters->hostApiSpecificStreamInfo; - if (inputStreamInfo && (inputStreamInfo->flags & paWinWasapiExclusive)) - shareMode = AUDCLNT_SHAREMODE_EXCLUSIVE; + if (inputStreamInfo && (inputStreamInfo->flags & paWinWasapiExclusive)) + shareMode = AUDCLNT_SHAREMODE_EXCLUSIVE; - hr = ActivateAudioInterface(&paWasapi->devInfo[inputParameters->device], inputStreamInfo, &tmpClient); - if (hr != S_OK) - { - LogHostError(hr); - return paInvalidDevice; - } + hr = ActivateAudioInterface(&paWasapi->devInfo[inputParameters->device], inputStreamInfo, &tmpClient); + if (hr != S_OK) + { + LogHostError(hr); + return paInvalidDevice; + } - answer = GetClosestFormat(tmpClient, sampleRate, inputParameters, shareMode, &wavex, FALSE); - SAFE_RELEASE(tmpClient); + answer = GetClosestFormat(tmpClient, sampleRate, inputParameters, shareMode, &wavex, FALSE); + SAFE_RELEASE(tmpClient); - if (answer != paFormatIsSupported) - return answer; + if (answer != paFormatIsSupported) + return answer; } if (outputParameters != NULL) { - HRESULT hr; - WAVEFORMATEXTENSIBLE wavex; - PaError answer; - AUDCLNT_SHAREMODE shareMode = AUDCLNT_SHAREMODE_SHARED; + HRESULT hr; + WAVEFORMATEXTENSIBLE wavex; + PaError answer; + AUDCLNT_SHAREMODE shareMode = AUDCLNT_SHAREMODE_SHARED; outputStreamInfo = (PaWasapiStreamInfo *)outputParameters->hostApiSpecificStreamInfo; - if (outputStreamInfo && (outputStreamInfo->flags & paWinWasapiExclusive)) - shareMode = AUDCLNT_SHAREMODE_EXCLUSIVE; + if (outputStreamInfo && (outputStreamInfo->flags & paWinWasapiExclusive)) + shareMode = AUDCLNT_SHAREMODE_EXCLUSIVE; - hr = ActivateAudioInterface(&paWasapi->devInfo[outputParameters->device], outputStreamInfo, &tmpClient); - if (hr != S_OK) - { - LogHostError(hr); - return paInvalidDevice; - } + hr = ActivateAudioInterface(&paWasapi->devInfo[outputParameters->device], outputStreamInfo, &tmpClient); + if (hr != S_OK) + { + LogHostError(hr); + return paInvalidDevice; + } - answer = GetClosestFormat(tmpClient, sampleRate, outputParameters, shareMode, &wavex, TRUE); - SAFE_RELEASE(tmpClient); + answer = GetClosestFormat(tmpClient, sampleRate, outputParameters, shareMode, &wavex, TRUE); + SAFE_RELEASE(tmpClient); - if (answer != paFormatIsSupported) - return answer; + if (answer != paFormatIsSupported) + return answer; } return paFormatIsSupported; @@ -2992,438 +2992,438 @@ static PaError IsFormatSupported( struct PaUtilHostApiRepresentation *hostApi, // ------------------------------------------------------------------------------------------ static PaUint32 _GetFramesPerHostBuffer(PaUint32 userFramesPerBuffer, PaTime suggestedLatency, double sampleRate, PaUint32 TimerJitterMs) { - PaUint32 frames = userFramesPerBuffer + max( userFramesPerBuffer, (PaUint32)(suggestedLatency * sampleRate) ); + PaUint32 frames = userFramesPerBuffer + max( userFramesPerBuffer, (PaUint32)(suggestedLatency * sampleRate) ); frames += (PaUint32)((sampleRate * 0.001) * TimerJitterMs); - return frames; + return frames; } // ------------------------------------------------------------------------------------------ static void _RecalculateBuffersCount(PaWasapiSubStream *sub, UINT32 userFramesPerBuffer, UINT32 framesPerLatency, BOOL fullDuplex) { - // Count buffers (must be at least 1) - sub->buffers = (userFramesPerBuffer ? framesPerLatency / userFramesPerBuffer : 0); - if (sub->buffers == 0) - sub->buffers = 1; + // Count buffers (must be at least 1) + sub->buffers = (userFramesPerBuffer ? framesPerLatency / userFramesPerBuffer : 0); + if (sub->buffers == 0) + sub->buffers = 1; - // Determine amount of buffers used: - // - Full-duplex mode will lead to period difference, thus only 1. - // - Input mode, only 1, as WASAPI allows extraction of only 1 packet. - // - For Shared mode we use double buffering. - if ((sub->shareMode == AUDCLNT_SHAREMODE_EXCLUSIVE) || fullDuplex) - { - // Exclusive mode does not allow >1 buffers be used for Event interface, e.g. GetBuffer - // call must acquire max buffer size and it all must be processed. - if (sub->streamFlags & AUDCLNT_STREAMFLAGS_EVENTCALLBACK) - sub->userBufferAndHostMatch = 1; + // Determine amount of buffers used: + // - Full-duplex mode will lead to period difference, thus only 1. + // - Input mode, only 1, as WASAPI allows extraction of only 1 packet. + // - For Shared mode we use double buffering. + if ((sub->shareMode == AUDCLNT_SHAREMODE_EXCLUSIVE) || fullDuplex) + { + // Exclusive mode does not allow >1 buffers be used for Event interface, e.g. GetBuffer + // call must acquire max buffer size and it all must be processed. + if (sub->streamFlags & AUDCLNT_STREAMFLAGS_EVENTCALLBACK) + sub->userBufferAndHostMatch = 1; - // Use paUtilBoundedHostBufferSize because exclusive mode will starve and produce - // bad quality of audio - sub->buffers = 1; - } + // Use paUtilBoundedHostBufferSize because exclusive mode will starve and produce + // bad quality of audio + sub->buffers = 1; + } } // ------------------------------------------------------------------------------------------ static void _CalculateAlignedPeriod(PaWasapiSubStream *pSub, UINT32 *nFramesPerLatency, ALIGN_FUNC pAlignFunc) { - // Align frames to HD Audio packet size of 128 bytes for Exclusive mode only. - // Not aligning on Windows Vista will cause Event timeout, although Windows 7 will - // return AUDCLNT_E_BUFFER_SIZE_NOT_ALIGNED error to realign buffer. Aligning is necessary - // for Exclusive mode only! when audio data is feeded directly to hardware. - if (pSub->shareMode == AUDCLNT_SHAREMODE_EXCLUSIVE) - { - (*nFramesPerLatency) = AlignFramesPerBuffer((*nFramesPerLatency), - pSub->wavex.Format.nSamplesPerSec, pSub->wavex.Format.nBlockAlign, pAlignFunc); - } + // Align frames to HD Audio packet size of 128 bytes for Exclusive mode only. + // Not aligning on Windows Vista will cause Event timeout, although Windows 7 will + // return AUDCLNT_E_BUFFER_SIZE_NOT_ALIGNED error to realign buffer. Aligning is necessary + // for Exclusive mode only! when audio data is feeded directly to hardware. + if (pSub->shareMode == AUDCLNT_SHAREMODE_EXCLUSIVE) + { + (*nFramesPerLatency) = AlignFramesPerBuffer((*nFramesPerLatency), + pSub->wavex.Format.nSamplesPerSec, pSub->wavex.Format.nBlockAlign, pAlignFunc); + } - // Calculate period - pSub->period = MakeHnsPeriod((*nFramesPerLatency), pSub->wavex.Format.nSamplesPerSec); + // Calculate period + pSub->period = MakeHnsPeriod((*nFramesPerLatency), pSub->wavex.Format.nSamplesPerSec); } // ------------------------------------------------------------------------------------------ static void _CalculatePeriodicity(PaWasapiSubStream *pSub, BOOL output, REFERENCE_TIME *periodicity) { - // Note: according Microsoft docs for IAudioClient::Initialize we can set periodicity of the buffer - // only for Exclusive mode. By setting periodicity almost equal to the user buffer frames we can - // achieve high quality (less glitchy) low-latency audio. - if (pSub->shareMode == AUDCLNT_SHAREMODE_EXCLUSIVE) - { - const PaWasapiDeviceInfo *pInfo = pSub->params.device_info; + // Note: according Microsoft docs for IAudioClient::Initialize we can set periodicity of the buffer + // only for Exclusive mode. By setting periodicity almost equal to the user buffer frames we can + // achieve high quality (less glitchy) low-latency audio. + if (pSub->shareMode == AUDCLNT_SHAREMODE_EXCLUSIVE) + { + const PaWasapiDeviceInfo *pInfo = pSub->params.device_info; - // By default periodicity equals to the full buffer (legacy PA WASAPI's behavior) - (*periodicity) = pSub->period; + // By default periodicity equals to the full buffer (legacy PA WASAPI's behavior) + (*periodicity) = pSub->period; - // Try make buffer ready for I/O once we request the buffer readiness for it. Only Polling mode - // because for Event mode buffer size and periodicity must be equal according Microsoft - // documentation for IAudioClient::Initialize. - // - // TO-DO: try spread to capture and full-duplex cases (not tested and therefore disabled) - // - if (((pSub->streamFlags & AUDCLNT_STREAMFLAGS_EVENTCALLBACK) == 0) && - (output && !pSub->params.full_duplex)) - { - UINT32 alignedFrames; - REFERENCE_TIME userPeriodicity; + // Try make buffer ready for I/O once we request the buffer readiness for it. Only Polling mode + // because for Event mode buffer size and periodicity must be equal according Microsoft + // documentation for IAudioClient::Initialize. + // + // TO-DO: try spread to capture and full-duplex cases (not tested and therefore disabled) + // + if (((pSub->streamFlags & AUDCLNT_STREAMFLAGS_EVENTCALLBACK) == 0) && + (output && !pSub->params.full_duplex)) + { + UINT32 alignedFrames; + REFERENCE_TIME userPeriodicity; - // Align frames backwards, so device will likely make buffer read ready when we are ready - // to read it (our sheduling will wait for amount of millisoconds of frames_per_buffer) - alignedFrames = AlignFramesPerBuffer(pSub->params.frames_per_buffer, - pSub->wavex.Format.nSamplesPerSec, pSub->wavex.Format.nBlockAlign, ALIGN_BWD); + // Align frames backwards, so device will likely make buffer read ready when we are ready + // to read it (our sheduling will wait for amount of millisoconds of frames_per_buffer) + alignedFrames = AlignFramesPerBuffer(pSub->params.frames_per_buffer, + pSub->wavex.Format.nSamplesPerSec, pSub->wavex.Format.nBlockAlign, ALIGN_BWD); - userPeriodicity = MakeHnsPeriod(alignedFrames, pSub->wavex.Format.nSamplesPerSec); + userPeriodicity = MakeHnsPeriod(alignedFrames, pSub->wavex.Format.nSamplesPerSec); - // Must not be larger than buffer size - if (userPeriodicity > pSub->period) - userPeriodicity = pSub->period; + // Must not be larger than buffer size + if (userPeriodicity > pSub->period) + userPeriodicity = pSub->period; - // Must not be smaller than minimum supported by the device - if (userPeriodicity < pInfo->MinimumDevicePeriod) - userPeriodicity = pInfo->MinimumDevicePeriod; - - (*periodicity) = userPeriodicity; - } - } - else - (*periodicity) = 0; + // Must not be smaller than minimum supported by the device + if (userPeriodicity < pInfo->MinimumDevicePeriod) + userPeriodicity = pInfo->MinimumDevicePeriod; + + (*periodicity) = userPeriodicity; + } + } + else + (*periodicity) = 0; } // ------------------------------------------------------------------------------------------ static HRESULT CreateAudioClient(PaWasapiStream *pStream, PaWasapiSubStream *pSub, BOOL output, PaError *pa_error) { - PaError error; + PaError error; HRESULT hr; - const PaWasapiDeviceInfo *pInfo = pSub->params.device_info; - const PaStreamParameters *params = &pSub->params.stream_params; - const double sampleRate = pSub->params.sample_rate; - const BOOL fullDuplex = pSub->params.full_duplex; - const UINT32 userFramesPerBuffer = pSub->params.frames_per_buffer; - UINT32 framesPerLatency = userFramesPerBuffer; - IAudioClient *audioClient = NULL; - REFERENCE_TIME eventPeriodicity = 0; + const PaWasapiDeviceInfo *pInfo = pSub->params.device_info; + const PaStreamParameters *params = &pSub->params.stream_params; + const double sampleRate = pSub->params.sample_rate; + const BOOL fullDuplex = pSub->params.full_duplex; + const UINT32 userFramesPerBuffer = pSub->params.frames_per_buffer; + UINT32 framesPerLatency = userFramesPerBuffer; + IAudioClient *audioClient = NULL; + REFERENCE_TIME eventPeriodicity = 0; - // Assume default failure due to some reason - (*pa_error) = paInvalidDevice; + // Assume default failure due to some reason + (*pa_error) = paInvalidDevice; - // Validate parameters + // Validate parameters if (!pSub || !pInfo || !params) - { - (*pa_error) = paBadStreamPtr; + { + (*pa_error) = paBadStreamPtr; return E_POINTER; - } - if ((UINT32)sampleRate == 0) - { - (*pa_error) = paInvalidSampleRate; + } + if ((UINT32)sampleRate == 0) + { + (*pa_error) = paInvalidSampleRate; return E_INVALIDARG; - } + } // Get the audio client - if (FAILED(hr = ActivateAudioInterface(pInfo, &pSub->params.wasapi_params, &audioClient))) - { - (*pa_error) = paInsufficientMemory; - LogHostError(hr); - goto done; - } + if (FAILED(hr = ActivateAudioInterface(pInfo, &pSub->params.wasapi_params, &audioClient))) + { + (*pa_error) = paInsufficientMemory; + LogHostError(hr); + goto done; + } - // Get closest format - if ((error = GetClosestFormat(audioClient, sampleRate, params, pSub->shareMode, &pSub->wavex, output)) != paFormatIsSupported) - { - (*pa_error) = error; - LogHostError(hr = AUDCLNT_E_UNSUPPORTED_FORMAT); - goto done; // fail, format not supported - } + // Get closest format + if ((error = GetClosestFormat(audioClient, sampleRate, params, pSub->shareMode, &pSub->wavex, output)) != paFormatIsSupported) + { + (*pa_error) = error; + LogHostError(hr = AUDCLNT_E_UNSUPPORTED_FORMAT); + goto done; // fail, format not supported + } - // Check for Mono <<>> Stereo workaround - if ((params->channelCount == 1) && (pSub->wavex.Format.nChannels == 2)) - { - // select mixer - pSub->monoMixer = GetMonoToStereoMixer(&pSub->wavex, (pInfo->flow == eRender ? MIX_DIR__1TO2 : MIX_DIR__2TO1_L)); - if (pSub->monoMixer == NULL) - { - (*pa_error) = paInvalidChannelCount; - LogHostError(hr = AUDCLNT_E_UNSUPPORTED_FORMAT); - goto done; // fail, no mixer for format - } - } + // Check for Mono <<>> Stereo workaround + if ((params->channelCount == 1) && (pSub->wavex.Format.nChannels == 2)) + { + // select mixer + pSub->monoMixer = GetMonoToStereoMixer(&pSub->wavex, (pInfo->flow == eRender ? MIX_DIR__1TO2 : MIX_DIR__2TO1_L)); + if (pSub->monoMixer == NULL) + { + (*pa_error) = paInvalidChannelCount; + LogHostError(hr = AUDCLNT_E_UNSUPPORTED_FORMAT); + goto done; // fail, no mixer for format + } + } - // Calculate host buffer size - if ((pSub->shareMode != AUDCLNT_SHAREMODE_EXCLUSIVE) && - (!pSub->streamFlags || ((pSub->streamFlags & AUDCLNT_STREAMFLAGS_EVENTCALLBACK) == 0))) - { - framesPerLatency = _GetFramesPerHostBuffer(userFramesPerBuffer, - params->suggestedLatency, pSub->wavex.Format.nSamplesPerSec, 0/*, - (pSub->streamFlags & AUDCLNT_STREAMFLAGS_EVENTCALLBACK ? 0 : 1)*/); - } - else - { - #ifdef PA_WASAPI_FORCE_POLL_IF_LARGE_BUFFER - REFERENCE_TIME overall; - #endif + // Calculate host buffer size + if ((pSub->shareMode != AUDCLNT_SHAREMODE_EXCLUSIVE) && + (!pSub->streamFlags || ((pSub->streamFlags & AUDCLNT_STREAMFLAGS_EVENTCALLBACK) == 0))) + { + framesPerLatency = _GetFramesPerHostBuffer(userFramesPerBuffer, + params->suggestedLatency, pSub->wavex.Format.nSamplesPerSec, 0/*, + (pSub->streamFlags & AUDCLNT_STREAMFLAGS_EVENTCALLBACK ? 0 : 1)*/); + } + else + { + #ifdef PA_WASAPI_FORCE_POLL_IF_LARGE_BUFFER + REFERENCE_TIME overall; + #endif - // Work 1:1 with user buffer (only polling allows to use >1) - framesPerLatency += MakeFramesFromHns(SecondsTonano100(params->suggestedLatency), pSub->wavex.Format.nSamplesPerSec); + // Work 1:1 with user buffer (only polling allows to use >1) + framesPerLatency += MakeFramesFromHns(SecondsTonano100(params->suggestedLatency), pSub->wavex.Format.nSamplesPerSec); - // Force Polling if overall latency is >= 21.33ms as it allows to use 100% CPU in a callback, - // or user specified latency parameter. - #ifdef PA_WASAPI_FORCE_POLL_IF_LARGE_BUFFER - overall = MakeHnsPeriod(framesPerLatency, pSub->wavex.Format.nSamplesPerSec); - if (overall >= (106667 * 2)/*21.33ms*/) - { - framesPerLatency = _GetFramesPerHostBuffer(userFramesPerBuffer, - params->suggestedLatency, pSub->wavex.Format.nSamplesPerSec, 0/*, - (streamFlags & AUDCLNT_STREAMFLAGS_EVENTCALLBACK ? 0 : 1)*/); + // Force Polling if overall latency is >= 21.33ms as it allows to use 100% CPU in a callback, + // or user specified latency parameter. + #ifdef PA_WASAPI_FORCE_POLL_IF_LARGE_BUFFER + overall = MakeHnsPeriod(framesPerLatency, pSub->wavex.Format.nSamplesPerSec); + if (overall >= (106667 * 2)/*21.33ms*/) + { + framesPerLatency = _GetFramesPerHostBuffer(userFramesPerBuffer, + params->suggestedLatency, pSub->wavex.Format.nSamplesPerSec, 0/*, + (streamFlags & AUDCLNT_STREAMFLAGS_EVENTCALLBACK ? 0 : 1)*/); - // Use Polling interface - pSub->streamFlags &= ~AUDCLNT_STREAMFLAGS_EVENTCALLBACK; - PRINT(("WASAPI: CreateAudioClient: forcing POLL mode\n")); - } - #endif - } + // Use Polling interface + pSub->streamFlags &= ~AUDCLNT_STREAMFLAGS_EVENTCALLBACK; + PRINT(("WASAPI: CreateAudioClient: forcing POLL mode\n")); + } + #endif + } - // For full-duplex output resize buffer to be the same as for input - if (output && fullDuplex) - framesPerLatency = pStream->in.framesPerHostCallback; + // For full-duplex output resize buffer to be the same as for input + if (output && fullDuplex) + framesPerLatency = pStream->in.framesPerHostCallback; - // Avoid 0 frames - if (framesPerLatency == 0) - framesPerLatency = MakeFramesFromHns(pInfo->DefaultDevicePeriod, pSub->wavex.Format.nSamplesPerSec); + // Avoid 0 frames + if (framesPerLatency == 0) + framesPerLatency = MakeFramesFromHns(pInfo->DefaultDevicePeriod, pSub->wavex.Format.nSamplesPerSec); - // Exclusive Input stream renders data in 6 packets, we must set then the size of - // single packet, total buffer size, e.g. required latency will be PacketSize * 6 - if (!output && (pSub->shareMode == AUDCLNT_SHAREMODE_EXCLUSIVE)) - { - // Do it only for Polling mode - if ((pSub->streamFlags & AUDCLNT_STREAMFLAGS_EVENTCALLBACK) == 0) - framesPerLatency /= WASAPI_PACKETS_PER_INPUT_BUFFER; - } + // Exclusive Input stream renders data in 6 packets, we must set then the size of + // single packet, total buffer size, e.g. required latency will be PacketSize * 6 + if (!output && (pSub->shareMode == AUDCLNT_SHAREMODE_EXCLUSIVE)) + { + // Do it only for Polling mode + if ((pSub->streamFlags & AUDCLNT_STREAMFLAGS_EVENTCALLBACK) == 0) + framesPerLatency /= WASAPI_PACKETS_PER_INPUT_BUFFER; + } - // Calculate aligned period - _CalculateAlignedPeriod(pSub, &framesPerLatency, ALIGN_BWD); + // Calculate aligned period + _CalculateAlignedPeriod(pSub, &framesPerLatency, ALIGN_BWD); - /*! Enforce min/max period for device in Shared mode to avoid bad audio quality. + /*! Enforce min/max period for device in Shared mode to avoid bad audio quality. Avoid doing so for Exclusive mode as alignment will suffer. - */ - if (pSub->shareMode == AUDCLNT_SHAREMODE_SHARED) - { - if (pSub->period < pInfo->DefaultDevicePeriod) - { - pSub->period = pInfo->DefaultDevicePeriod; + */ + if (pSub->shareMode == AUDCLNT_SHAREMODE_SHARED) + { + if (pSub->period < pInfo->DefaultDevicePeriod) + { + pSub->period = pInfo->DefaultDevicePeriod; - // Recalculate aligned period - framesPerLatency = MakeFramesFromHns(pSub->period, pSub->wavex.Format.nSamplesPerSec); - _CalculateAlignedPeriod(pSub, &framesPerLatency, ALIGN_BWD); - } - } - else - { - if (pSub->period < pInfo->MinimumDevicePeriod) - { - pSub->period = pInfo->MinimumDevicePeriod; + // Recalculate aligned period + framesPerLatency = MakeFramesFromHns(pSub->period, pSub->wavex.Format.nSamplesPerSec); + _CalculateAlignedPeriod(pSub, &framesPerLatency, ALIGN_BWD); + } + } + else + { + if (pSub->period < pInfo->MinimumDevicePeriod) + { + pSub->period = pInfo->MinimumDevicePeriod; - // Recalculate aligned period - framesPerLatency = MakeFramesFromHns(pSub->period, pSub->wavex.Format.nSamplesPerSec); - _CalculateAlignedPeriod(pSub, &framesPerLatency, ALIGN_FWD); - } - } + // Recalculate aligned period + framesPerLatency = MakeFramesFromHns(pSub->period, pSub->wavex.Format.nSamplesPerSec); + _CalculateAlignedPeriod(pSub, &framesPerLatency, ALIGN_FWD); + } + } - /*! Windows 7 does not allow to set latency lower than minimal device period and will - return error: AUDCLNT_E_INVALID_DEVICE_PERIOD. Under Vista we enforce the same behavior - manually for unified behavior on all platforms. - */ - { - /*! AUDCLNT_E_BUFFER_SIZE_ERROR: Applies to Windows 7 and later. - Indicates that the buffer duration value requested by an exclusive-mode client is - out of range. The requested duration value for pull mode must not be greater than - 500 milliseconds; for push mode the duration value must not be greater than 2 seconds. - */ - if (pSub->shareMode == AUDCLNT_SHAREMODE_EXCLUSIVE) - { - static const REFERENCE_TIME MAX_BUFFER_EVENT_DURATION = 500 * 10000; - static const REFERENCE_TIME MAX_BUFFER_POLL_DURATION = 2000 * 10000; + /*! Windows 7 does not allow to set latency lower than minimal device period and will + return error: AUDCLNT_E_INVALID_DEVICE_PERIOD. Under Vista we enforce the same behavior + manually for unified behavior on all platforms. + */ + { + /*! AUDCLNT_E_BUFFER_SIZE_ERROR: Applies to Windows 7 and later. + Indicates that the buffer duration value requested by an exclusive-mode client is + out of range. The requested duration value for pull mode must not be greater than + 500 milliseconds; for push mode the duration value must not be greater than 2 seconds. + */ + if (pSub->shareMode == AUDCLNT_SHAREMODE_EXCLUSIVE) + { + static const REFERENCE_TIME MAX_BUFFER_EVENT_DURATION = 500 * 10000; + static const REFERENCE_TIME MAX_BUFFER_POLL_DURATION = 2000 * 10000; - // Pull mode, max 500ms - if (pSub->streamFlags & AUDCLNT_STREAMFLAGS_EVENTCALLBACK) - { - if (pSub->period > MAX_BUFFER_EVENT_DURATION) - { - pSub->period = MAX_BUFFER_EVENT_DURATION; + // Pull mode, max 500ms + if (pSub->streamFlags & AUDCLNT_STREAMFLAGS_EVENTCALLBACK) + { + if (pSub->period > MAX_BUFFER_EVENT_DURATION) + { + pSub->period = MAX_BUFFER_EVENT_DURATION; - // Recalculate aligned period - framesPerLatency = MakeFramesFromHns(pSub->period, pSub->wavex.Format.nSamplesPerSec); - _CalculateAlignedPeriod(pSub, &framesPerLatency, ALIGN_BWD); - } - } - // Push mode, max 2000ms - else - { - if (pSub->period > MAX_BUFFER_POLL_DURATION) - { - pSub->period = MAX_BUFFER_POLL_DURATION; + // Recalculate aligned period + framesPerLatency = MakeFramesFromHns(pSub->period, pSub->wavex.Format.nSamplesPerSec); + _CalculateAlignedPeriod(pSub, &framesPerLatency, ALIGN_BWD); + } + } + // Push mode, max 2000ms + else + { + if (pSub->period > MAX_BUFFER_POLL_DURATION) + { + pSub->period = MAX_BUFFER_POLL_DURATION; - // Recalculate aligned period - framesPerLatency = MakeFramesFromHns(pSub->period, pSub->wavex.Format.nSamplesPerSec); - _CalculateAlignedPeriod(pSub, &framesPerLatency, ALIGN_BWD); - } - } - } - } + // Recalculate aligned period + framesPerLatency = MakeFramesFromHns(pSub->period, pSub->wavex.Format.nSamplesPerSec); + _CalculateAlignedPeriod(pSub, &framesPerLatency, ALIGN_BWD); + } + } + } + } - // Set device scheduling period (always 0 in Shared mode according Microsoft docs) - _CalculatePeriodicity(pSub, output, &eventPeriodicity); - - // Open the stream and associate it with an audio session + // Set device scheduling period (always 0 in Shared mode according Microsoft docs) + _CalculatePeriodicity(pSub, output, &eventPeriodicity); + + // Open the stream and associate it with an audio session hr = IAudioClient_Initialize(audioClient, pSub->shareMode, pSub->streamFlags, - pSub->period, - eventPeriodicity, - &pSub->wavex.Format, + pSub->period, + eventPeriodicity, + &pSub->wavex.Format, NULL); - - // [Output only] Check if buffer size is the one we requested in Exclusive mode, for UAC1 USB DACs WASAPI - // can allocate internal buffer equal to 8 times of pSub->period that has to be corrected in order to match - // the requested latency - if (output && SUCCEEDED(hr) && (pSub->shareMode == AUDCLNT_SHAREMODE_EXCLUSIVE)) - { - UINT32 maxBufferFrames; - - if (FAILED(hr = IAudioClient_GetBufferSize(audioClient, &maxBufferFrames))) - { - (*pa_error) = paInvalidDevice; - LogHostError(hr); - goto done; - } - - // For Exclusive mode for UAC1 devices maxBufferFrames may be framesPerLatency * 8 but check any difference - // to be able to guarantee the latency user requested and also resulted framesPerLatency may be bigger than - // 2 seconds that will cause audio client not operational (GetCurrentPadding() will return always 0) - if (maxBufferFrames >= (framesPerLatency * 2)) - { - UINT32 ratio = maxBufferFrames / framesPerLatency; - - PRINT(("WASAPI: CreateAudioClient: detected %d times larger buffer than requested, correct to match user latency\n", ratio)); - - // Get new aligned frames lowered by calculated ratio - framesPerLatency = MakeFramesFromHns(pSub->period / ratio, pSub->wavex.Format.nSamplesPerSec); - _CalculateAlignedPeriod(pSub, &framesPerLatency, ALIGN_BWD); - - // Make sure we are not below the minimum period - if (pSub->period < pInfo->MinimumDevicePeriod) - pSub->period = pInfo->MinimumDevicePeriod; - - // Release previous client - SAFE_RELEASE(audioClient); - - // Create a new audio client - if (FAILED(hr = ActivateAudioInterface(pInfo, &pSub->params.wasapi_params, &audioClient))) - { - (*pa_error) = paInsufficientMemory; - LogHostError(hr); - goto done; - } - - // Set device scheduling period (always 0 in Shared mode according Microsoft docs) - _CalculatePeriodicity(pSub, output, &eventPeriodicity); - - // Open the stream and associate it with an audio session - hr = IAudioClient_Initialize(audioClient, - pSub->shareMode, - pSub->streamFlags, - pSub->period, - eventPeriodicity, - &pSub->wavex.Format, - NULL); - } - } - - /*! WASAPI is tricky on large device buffer, sometimes 2000ms can be allocated sometimes - less. There is no known guaranteed level thus we make subsequent tries by decreasing - buffer by 100ms per try. - */ - while ((hr == E_OUTOFMEMORY) && (pSub->period > (100 * 10000))) - { - PRINT(("WASAPI: CreateAudioClient: decreasing buffer size to %d milliseconds\n", (pSub->period / 10000))); - - // Decrease by 100ms and try again - pSub->period -= (100 * 10000); - - // Recalculate aligned period - framesPerLatency = MakeFramesFromHns(pSub->period, pSub->wavex.Format.nSamplesPerSec); - _CalculateAlignedPeriod(pSub, &framesPerLatency, ALIGN_BWD); - - // Release the previous allocations - SAFE_RELEASE(audioClient); - - // Create a new audio client - if (FAILED(hr = ActivateAudioInterface(pInfo, &pSub->params.wasapi_params, &audioClient))) - { - (*pa_error) = paInsufficientMemory; - LogHostError(hr); - goto done; - } - - // Set device scheduling period (always 0 in Shared mode according Microsoft docs) - _CalculatePeriodicity(pSub, output, &eventPeriodicity); - - // Open the stream and associate it with an audio session - hr = IAudioClient_Initialize(audioClient, - pSub->shareMode, - pSub->streamFlags, - pSub->period, - eventPeriodicity, - &pSub->wavex.Format, - NULL); - } - - /*! WASAPI buffer size or alignment failure. Fallback to using default size and alignment. - */ - if ((hr == AUDCLNT_E_BUFFER_SIZE_ERROR) || (hr == AUDCLNT_E_BUFFER_SIZE_NOT_ALIGNED)) - { - // Use default - pSub->period = pInfo->DefaultDevicePeriod; - - PRINT(("WASAPI: CreateAudioClient: correcting buffer size/alignment to device default\n")); - - // Release the previous allocations - SAFE_RELEASE(audioClient); - - // Create a new audio client - if (FAILED(hr = ActivateAudioInterface(pInfo, &pSub->params.wasapi_params, &audioClient))) - { - (*pa_error) = paInsufficientMemory; - LogHostError(hr); - goto done; - } - - // Set device scheduling period (always 0 in Shared mode according Microsoft docs) - _CalculatePeriodicity(pSub, output, &eventPeriodicity); - - // Open the stream and associate it with an audio session - hr = IAudioClient_Initialize(audioClient, - pSub->shareMode, - pSub->streamFlags, - pSub->period, - eventPeriodicity, - &pSub->wavex.Format, - NULL); - } - - // Error has no workaround, fail completely - if (FAILED(hr)) + + // [Output only] Check if buffer size is the one we requested in Exclusive mode, for UAC1 USB DACs WASAPI + // can allocate internal buffer equal to 8 times of pSub->period that has to be corrected in order to match + // the requested latency + if (output && SUCCEEDED(hr) && (pSub->shareMode == AUDCLNT_SHAREMODE_EXCLUSIVE)) { - (*pa_error) = paInvalidDevice; - LogHostError(hr); - goto done; + UINT32 maxBufferFrames; + + if (FAILED(hr = IAudioClient_GetBufferSize(audioClient, &maxBufferFrames))) + { + (*pa_error) = paInvalidDevice; + LogHostError(hr); + goto done; + } + + // For Exclusive mode for UAC1 devices maxBufferFrames may be framesPerLatency * 8 but check any difference + // to be able to guarantee the latency user requested and also resulted framesPerLatency may be bigger than + // 2 seconds that will cause audio client not operational (GetCurrentPadding() will return always 0) + if (maxBufferFrames >= (framesPerLatency * 2)) + { + UINT32 ratio = maxBufferFrames / framesPerLatency; + + PRINT(("WASAPI: CreateAudioClient: detected %d times larger buffer than requested, correct to match user latency\n", ratio)); + + // Get new aligned frames lowered by calculated ratio + framesPerLatency = MakeFramesFromHns(pSub->period / ratio, pSub->wavex.Format.nSamplesPerSec); + _CalculateAlignedPeriod(pSub, &framesPerLatency, ALIGN_BWD); + + // Make sure we are not below the minimum period + if (pSub->period < pInfo->MinimumDevicePeriod) + pSub->period = pInfo->MinimumDevicePeriod; + + // Release previous client + SAFE_RELEASE(audioClient); + + // Create a new audio client + if (FAILED(hr = ActivateAudioInterface(pInfo, &pSub->params.wasapi_params, &audioClient))) + { + (*pa_error) = paInsufficientMemory; + LogHostError(hr); + goto done; + } + + // Set device scheduling period (always 0 in Shared mode according Microsoft docs) + _CalculatePeriodicity(pSub, output, &eventPeriodicity); + + // Open the stream and associate it with an audio session + hr = IAudioClient_Initialize(audioClient, + pSub->shareMode, + pSub->streamFlags, + pSub->period, + eventPeriodicity, + &pSub->wavex.Format, + NULL); + } + } + + /*! WASAPI is tricky on large device buffer, sometimes 2000ms can be allocated sometimes + less. There is no known guaranteed level thus we make subsequent tries by decreasing + buffer by 100ms per try. + */ + while ((hr == E_OUTOFMEMORY) && (pSub->period > (100 * 10000))) + { + PRINT(("WASAPI: CreateAudioClient: decreasing buffer size to %d milliseconds\n", (pSub->period / 10000))); + + // Decrease by 100ms and try again + pSub->period -= (100 * 10000); + + // Recalculate aligned period + framesPerLatency = MakeFramesFromHns(pSub->period, pSub->wavex.Format.nSamplesPerSec); + _CalculateAlignedPeriod(pSub, &framesPerLatency, ALIGN_BWD); + + // Release the previous allocations + SAFE_RELEASE(audioClient); + + // Create a new audio client + if (FAILED(hr = ActivateAudioInterface(pInfo, &pSub->params.wasapi_params, &audioClient))) + { + (*pa_error) = paInsufficientMemory; + LogHostError(hr); + goto done; + } + + // Set device scheduling period (always 0 in Shared mode according Microsoft docs) + _CalculatePeriodicity(pSub, output, &eventPeriodicity); + + // Open the stream and associate it with an audio session + hr = IAudioClient_Initialize(audioClient, + pSub->shareMode, + pSub->streamFlags, + pSub->period, + eventPeriodicity, + &pSub->wavex.Format, + NULL); + } + + /*! WASAPI buffer size or alignment failure. Fallback to using default size and alignment. + */ + if ((hr == AUDCLNT_E_BUFFER_SIZE_ERROR) || (hr == AUDCLNT_E_BUFFER_SIZE_NOT_ALIGNED)) + { + // Use default + pSub->period = pInfo->DefaultDevicePeriod; + + PRINT(("WASAPI: CreateAudioClient: correcting buffer size/alignment to device default\n")); + + // Release the previous allocations + SAFE_RELEASE(audioClient); + + // Create a new audio client + if (FAILED(hr = ActivateAudioInterface(pInfo, &pSub->params.wasapi_params, &audioClient))) + { + (*pa_error) = paInsufficientMemory; + LogHostError(hr); + goto done; + } + + // Set device scheduling period (always 0 in Shared mode according Microsoft docs) + _CalculatePeriodicity(pSub, output, &eventPeriodicity); + + // Open the stream and associate it with an audio session + hr = IAudioClient_Initialize(audioClient, + pSub->shareMode, + pSub->streamFlags, + pSub->period, + eventPeriodicity, + &pSub->wavex.Format, + NULL); + } + + // Error has no workaround, fail completely + if (FAILED(hr)) + { + (*pa_error) = paInvalidDevice; + LogHostError(hr); + goto done; } // Set client - pSub->clientParent = audioClient; + pSub->clientParent = audioClient; IAudioClient_AddRef(pSub->clientParent); - // Recalculate buffers count - _RecalculateBuffersCount(pSub, userFramesPerBuffer, MakeFramesFromHns(pSub->period, pSub->wavex.Format.nSamplesPerSec), - fullDuplex); + // Recalculate buffers count + _RecalculateBuffersCount(pSub, userFramesPerBuffer, MakeFramesFromHns(pSub->period, pSub->wavex.Format.nSamplesPerSec), + fullDuplex); - // No error, client is succesfully created - (*pa_error) = paNoError; + // No error, client is succesfully created + (*pa_error) = paNoError; done: @@ -3435,22 +3435,22 @@ done: // ------------------------------------------------------------------------------------------ static PaError ActivateAudioClientOutput(PaWasapiStream *stream) { - HRESULT hr; - PaError result; - UINT32 maxBufferSize; - PaTime bufferLatency; - const UINT32 framesPerBuffer = stream->out.params.frames_per_buffer; + HRESULT hr; + PaError result; + UINT32 maxBufferSize; + PaTime bufferLatency; + const UINT32 framesPerBuffer = stream->out.params.frames_per_buffer; - // Create Audio client + // Create Audio client if (FAILED(hr = CreateAudioClient(stream, &stream->out, TRUE, &result))) - { - LogPaError(result); - goto error; + { + LogPaError(result); + goto error; } - LogWAVEFORMATEXTENSIBLE(&stream->out.wavex); + LogWAVEFORMATEXTENSIBLE(&stream->out.wavex); - // Activate volume - stream->outVol = NULL; + // Activate volume + stream->outVol = NULL; /*hr = info->device->Activate( __uuidof(IAudioEndpointVolume), CLSCTX_INPROC_SERVER, NULL, (void**)&stream->outVol); @@ -3459,65 +3459,65 @@ static PaError ActivateAudioClientOutput(PaWasapiStream *stream) // Get max possible buffer size to check if it is not less than that we request if (FAILED(hr = IAudioClient_GetBufferSize(stream->out.clientParent, &maxBufferSize))) - { - LogHostError(hr); - LogPaError(result = paInvalidDevice); - goto error; - } + { + LogHostError(hr); + LogPaError(result = paInvalidDevice); + goto error; + } // Correct buffer to max size if it maxed out result of GetBufferSize - stream->out.bufferSize = maxBufferSize; + stream->out.bufferSize = maxBufferSize; - // Get interface latency (actually uneeded as we calculate latency from the size of maxBufferSize) + // Get interface latency (actually uneeded as we calculate latency from the size of maxBufferSize) if (FAILED(hr = IAudioClient_GetStreamLatency(stream->out.clientParent, &stream->out.deviceLatency))) - { - LogHostError(hr); - LogPaError(result = paInvalidDevice); - goto error; - } - //stream->out.latencySeconds = nano100ToSeconds(stream->out.deviceLatency); + { + LogHostError(hr); + LogPaError(result = paInvalidDevice); + goto error; + } + //stream->out.latencySeconds = nano100ToSeconds(stream->out.deviceLatency); // Number of frames that are required at each period - stream->out.framesPerHostCallback = maxBufferSize; + stream->out.framesPerHostCallback = maxBufferSize; - // Calculate frames per single buffer, if buffers > 1 then always framesPerBuffer - stream->out.framesPerBuffer = - (stream->out.userBufferAndHostMatch ? stream->out.framesPerHostCallback : framesPerBuffer); + // Calculate frames per single buffer, if buffers > 1 then always framesPerBuffer + stream->out.framesPerBuffer = + (stream->out.userBufferAndHostMatch ? stream->out.framesPerHostCallback : framesPerBuffer); - // Calculate buffer latency - bufferLatency = (PaTime)maxBufferSize / stream->out.wavex.Format.nSamplesPerSec; + // Calculate buffer latency + bufferLatency = (PaTime)maxBufferSize / stream->out.wavex.Format.nSamplesPerSec; - // Append buffer latency to interface latency in shared mode (see GetStreamLatency notes) - stream->out.latencySeconds = bufferLatency; + // Append buffer latency to interface latency in shared mode (see GetStreamLatency notes) + stream->out.latencySeconds = bufferLatency; - PRINT(("WASAPI::OpenStream(output): framesPerUser[ %d ] framesPerHost[ %d ] latency[ %.02fms ] exclusive[ %s ] wow64_fix[ %s ] mode[ %s ]\n", (UINT32)framesPerBuffer, (UINT32)stream->out.framesPerHostCallback, (float)(stream->out.latencySeconds*1000.0f), (stream->out.shareMode == AUDCLNT_SHAREMODE_EXCLUSIVE ? "YES" : "NO"), (stream->out.params.wow64_workaround ? "YES" : "NO"), (stream->out.streamFlags & AUDCLNT_STREAMFLAGS_EVENTCALLBACK ? "EVENT" : "POLL"))); + PRINT(("WASAPI::OpenStream(output): framesPerUser[ %d ] framesPerHost[ %d ] latency[ %.02fms ] exclusive[ %s ] wow64_fix[ %s ] mode[ %s ]\n", (UINT32)framesPerBuffer, (UINT32)stream->out.framesPerHostCallback, (float)(stream->out.latencySeconds*1000.0f), (stream->out.shareMode == AUDCLNT_SHAREMODE_EXCLUSIVE ? "YES" : "NO"), (stream->out.params.wow64_workaround ? "YES" : "NO"), (stream->out.streamFlags & AUDCLNT_STREAMFLAGS_EVENTCALLBACK ? "EVENT" : "POLL"))); - return paNoError; + return paNoError; error: - return result; + return result; } // ------------------------------------------------------------------------------------------ static PaError ActivateAudioClientInput(PaWasapiStream *stream) { - HRESULT hr; - PaError result; - UINT32 maxBufferSize; - PaTime bufferLatency; - const UINT32 framesPerBuffer = stream->in.params.frames_per_buffer; + HRESULT hr; + PaError result; + UINT32 maxBufferSize; + PaTime bufferLatency; + const UINT32 framesPerBuffer = stream->in.params.frames_per_buffer; - // Create Audio client + // Create Audio client if (FAILED(hr = CreateAudioClient(stream, &stream->in, FALSE, &result))) - { - LogPaError(result); - goto error; + { + LogPaError(result); + goto error; } - LogWAVEFORMATEXTENSIBLE(&stream->in.wavex); + LogWAVEFORMATEXTENSIBLE(&stream->in.wavex); - // Create volume mgr - stream->inVol = NULL; + // Create volume mgr + stream->inVol = NULL; /*hr = info->device->Activate( __uuidof(IAudioEndpointVolume), CLSCTX_INPROC_SERVER, NULL, (void**)&stream->inVol); @@ -3526,45 +3526,45 @@ static PaError ActivateAudioClientInput(PaWasapiStream *stream) // Get max possible buffer size to check if it is not less than that we request if (FAILED(hr = IAudioClient_GetBufferSize(stream->in.clientParent, &maxBufferSize))) - { - LogHostError(hr); - LogPaError(result = paInvalidDevice); - goto error; - } + { + LogHostError(hr); + LogPaError(result = paInvalidDevice); + goto error; + } // Correct buffer to max size if it maxed out result of GetBufferSize - stream->in.bufferSize = maxBufferSize; + stream->in.bufferSize = maxBufferSize; - // Get interface latency (actually uneeded as we calculate latency from the size - // of maxBufferSize). + // Get interface latency (actually uneeded as we calculate latency from the size + // of maxBufferSize). if (FAILED(hr = IAudioClient_GetStreamLatency(stream->in.clientParent, &stream->in.deviceLatency))) - { - LogHostError(hr); - LogPaError(result = paInvalidDevice); - goto error; - } - //stream->in.latencySeconds = nano100ToSeconds(stream->in.deviceLatency); + { + LogHostError(hr); + LogPaError(result = paInvalidDevice); + goto error; + } + //stream->in.latencySeconds = nano100ToSeconds(stream->in.deviceLatency); // Number of frames that are required at each period - stream->in.framesPerHostCallback = maxBufferSize; + stream->in.framesPerHostCallback = maxBufferSize; - // Calculate frames per single buffer, if buffers > 1 then always framesPerBuffer - stream->in.framesPerBuffer = - (stream->in.userBufferAndHostMatch ? stream->in.framesPerHostCallback : framesPerBuffer); + // Calculate frames per single buffer, if buffers > 1 then always framesPerBuffer + stream->in.framesPerBuffer = + (stream->in.userBufferAndHostMatch ? stream->in.framesPerHostCallback : framesPerBuffer); - // Calculate buffer latency - bufferLatency = (PaTime)maxBufferSize / stream->in.wavex.Format.nSamplesPerSec; + // Calculate buffer latency + bufferLatency = (PaTime)maxBufferSize / stream->in.wavex.Format.nSamplesPerSec; - // Append buffer latency to interface latency in shared mode (see GetStreamLatency notes) - stream->in.latencySeconds = bufferLatency; + // Append buffer latency to interface latency in shared mode (see GetStreamLatency notes) + stream->in.latencySeconds = bufferLatency; - PRINT(("WASAPI::OpenStream(input): framesPerUser[ %d ] framesPerHost[ %d ] latency[ %.02fms ] exclusive[ %s ] wow64_fix[ %s ] mode[ %s ]\n", (UINT32)framesPerBuffer, (UINT32)stream->in.framesPerHostCallback, (float)(stream->in.latencySeconds*1000.0f), (stream->in.shareMode == AUDCLNT_SHAREMODE_EXCLUSIVE ? "YES" : "NO"), (stream->in.params.wow64_workaround ? "YES" : "NO"), (stream->in.streamFlags & AUDCLNT_STREAMFLAGS_EVENTCALLBACK ? "EVENT" : "POLL"))); + PRINT(("WASAPI::OpenStream(input): framesPerUser[ %d ] framesPerHost[ %d ] latency[ %.02fms ] exclusive[ %s ] wow64_fix[ %s ] mode[ %s ]\n", (UINT32)framesPerBuffer, (UINT32)stream->in.framesPerHostCallback, (float)(stream->in.latencySeconds*1000.0f), (stream->in.shareMode == AUDCLNT_SHAREMODE_EXCLUSIVE ? "YES" : "NO"), (stream->in.params.wow64_workaround ? "YES" : "NO"), (stream->in.streamFlags & AUDCLNT_STREAMFLAGS_EVENTCALLBACK ? "EVENT" : "POLL"))); - return paNoError; + return paNoError; error: - return result; + return result; } // ------------------------------------------------------------------------------------------ @@ -3579,139 +3579,139 @@ static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi, void *userData ) { PaError result = paNoError; - HRESULT hr; + HRESULT hr; PaWasapiHostApiRepresentation *paWasapi = (PaWasapiHostApiRepresentation*)hostApi; PaWasapiStream *stream = NULL; int inputChannelCount, outputChannelCount; PaSampleFormat inputSampleFormat, outputSampleFormat; PaSampleFormat hostInputSampleFormat, hostOutputSampleFormat; - PaWasapiStreamInfo *inputStreamInfo = NULL, *outputStreamInfo = NULL; - PaWasapiDeviceInfo *info = NULL; - ULONG framesPerHostCallback; - PaUtilHostBufferSizeMode bufferMode; - const BOOL fullDuplex = ((inputParameters != NULL) && (outputParameters != NULL)); - BOOL useInputBufferProcessor = (inputParameters != NULL), useOutputBufferProcessor = (outputParameters != NULL); + PaWasapiStreamInfo *inputStreamInfo = NULL, *outputStreamInfo = NULL; + PaWasapiDeviceInfo *info = NULL; + ULONG framesPerHostCallback; + PaUtilHostBufferSizeMode bufferMode; + const BOOL fullDuplex = ((inputParameters != NULL) && (outputParameters != NULL)); + BOOL useInputBufferProcessor = (inputParameters != NULL), useOutputBufferProcessor = (outputParameters != NULL); - // validate PaStreamParameters - if ((result = IsStreamParamsValid(hostApi, inputParameters, outputParameters, sampleRate)) != paNoError) - return LogPaError(result); + // validate PaStreamParameters + if ((result = IsStreamParamsValid(hostApi, inputParameters, outputParameters, sampleRate)) != paNoError) + return LogPaError(result); // Validate platform specific flags if ((streamFlags & paPlatformSpecificFlags) != 0) - { - LogPaError(result = paInvalidFlag); /* unexpected platform specific flag */ - goto error; - } + { + LogPaError(result = paInvalidFlag); /* unexpected platform specific flag */ + goto error; + } - // Allocate memory for PaWasapiStream + // Allocate memory for PaWasapiStream if ((stream = (PaWasapiStream *)PaUtil_AllocateMemory(sizeof(PaWasapiStream))) == NULL) - { + { LogPaError(result = paInsufficientMemory); goto error; } - // Default thread priority is Audio: for exclusive mode we will use Pro Audio. - stream->nThreadPriority = eThreadPriorityAudio; + // Default thread priority is Audio: for exclusive mode we will use Pro Audio. + stream->nThreadPriority = eThreadPriorityAudio; - // Set default number of frames: paFramesPerBufferUnspecified - if (framesPerBuffer == paFramesPerBufferUnspecified) - { - UINT32 framesPerBufferIn = 0, framesPerBufferOut = 0; - if (inputParameters != NULL) - { - info = &paWasapi->devInfo[inputParameters->device]; - framesPerBufferIn = MakeFramesFromHns(info->DefaultDevicePeriod, (UINT32)sampleRate); - } - if (outputParameters != NULL) - { - info = &paWasapi->devInfo[outputParameters->device]; - framesPerBufferOut = MakeFramesFromHns(info->DefaultDevicePeriod, (UINT32)sampleRate); - } - // choosing maximum default size - framesPerBuffer = max(framesPerBufferIn, framesPerBufferOut); - } - if (framesPerBuffer == 0) - framesPerBuffer = ((UINT32)sampleRate / 100) * 2; + // Set default number of frames: paFramesPerBufferUnspecified + if (framesPerBuffer == paFramesPerBufferUnspecified) + { + UINT32 framesPerBufferIn = 0, framesPerBufferOut = 0; + if (inputParameters != NULL) + { + info = &paWasapi->devInfo[inputParameters->device]; + framesPerBufferIn = MakeFramesFromHns(info->DefaultDevicePeriod, (UINT32)sampleRate); + } + if (outputParameters != NULL) + { + info = &paWasapi->devInfo[outputParameters->device]; + framesPerBufferOut = MakeFramesFromHns(info->DefaultDevicePeriod, (UINT32)sampleRate); + } + // choosing maximum default size + framesPerBuffer = max(framesPerBufferIn, framesPerBufferOut); + } + if (framesPerBuffer == 0) + framesPerBuffer = ((UINT32)sampleRate / 100) * 2; - // Try create device: Input - if (inputParameters != NULL) + // Try create device: Input + if (inputParameters != NULL) { inputChannelCount = inputParameters->channelCount; inputSampleFormat = GetSampleFormatForIO(inputParameters->sampleFormat); info = &paWasapi->devInfo[inputParameters->device]; - // default Shared Mode - stream->in.shareMode = AUDCLNT_SHAREMODE_SHARED; + // default Shared Mode + stream->in.shareMode = AUDCLNT_SHAREMODE_SHARED; - // PaWasapiStreamInfo - if (inputParameters->hostApiSpecificStreamInfo != NULL) - { - memcpy(&stream->in.params.wasapi_params, inputParameters->hostApiSpecificStreamInfo, min(sizeof(stream->in.params.wasapi_params), ((PaWasapiStreamInfo *)inputParameters->hostApiSpecificStreamInfo)->size)); - stream->in.params.wasapi_params.size = sizeof(stream->in.params.wasapi_params); + // PaWasapiStreamInfo + if (inputParameters->hostApiSpecificStreamInfo != NULL) + { + memcpy(&stream->in.params.wasapi_params, inputParameters->hostApiSpecificStreamInfo, min(sizeof(stream->in.params.wasapi_params), ((PaWasapiStreamInfo *)inputParameters->hostApiSpecificStreamInfo)->size)); + stream->in.params.wasapi_params.size = sizeof(stream->in.params.wasapi_params); - stream->in.params.stream_params.hostApiSpecificStreamInfo = &stream->in.params.wasapi_params; - inputStreamInfo = &stream->in.params.wasapi_params; + stream->in.params.stream_params.hostApiSpecificStreamInfo = &stream->in.params.wasapi_params; + inputStreamInfo = &stream->in.params.wasapi_params; - stream->in.flags = inputStreamInfo->flags; + stream->in.flags = inputStreamInfo->flags; - // Exclusive Mode - if (inputStreamInfo->flags & paWinWasapiExclusive) - { - // Boost thread priority - stream->nThreadPriority = eThreadPriorityProAudio; - // Make Exclusive - stream->in.shareMode = AUDCLNT_SHAREMODE_EXCLUSIVE; - } + // Exclusive Mode + if (inputStreamInfo->flags & paWinWasapiExclusive) + { + // Boost thread priority + stream->nThreadPriority = eThreadPriorityProAudio; + // Make Exclusive + stream->in.shareMode = AUDCLNT_SHAREMODE_EXCLUSIVE; + } - // explicit thread priority level - if (inputStreamInfo->flags & paWinWasapiThreadPriority) - { - if ((inputStreamInfo->threadPriority > eThreadPriorityNone) && - (inputStreamInfo->threadPriority <= eThreadPriorityWindowManager)) - stream->nThreadPriority = inputStreamInfo->threadPriority; - } + // explicit thread priority level + if (inputStreamInfo->flags & paWinWasapiThreadPriority) + { + if ((inputStreamInfo->threadPriority > eThreadPriorityNone) && + (inputStreamInfo->threadPriority <= eThreadPriorityWindowManager)) + stream->nThreadPriority = inputStreamInfo->threadPriority; + } - // redirect processing to custom user callback, ignore PA buffer processor - useInputBufferProcessor = !(inputStreamInfo->flags & paWinWasapiRedirectHostProcessor); - } + // redirect processing to custom user callback, ignore PA buffer processor + useInputBufferProcessor = !(inputStreamInfo->flags & paWinWasapiRedirectHostProcessor); + } - // Choose processing mode - stream->in.streamFlags = (stream->in.shareMode == AUDCLNT_SHAREMODE_EXCLUSIVE ? AUDCLNT_STREAMFLAGS_EVENTCALLBACK : 0); - if (paWasapi->useWOW64Workaround) - stream->in.streamFlags = 0; // polling interface - else - if (streamCallback == NULL) - stream->in.streamFlags = 0; // polling interface - else - if ((inputStreamInfo != NULL) && (inputStreamInfo->flags & paWinWasapiPolling)) - stream->in.streamFlags = 0; // polling interface - else - if (fullDuplex) - stream->in.streamFlags = 0; // polling interface is implemented for full-duplex mode also + // Choose processing mode + stream->in.streamFlags = (stream->in.shareMode == AUDCLNT_SHAREMODE_EXCLUSIVE ? AUDCLNT_STREAMFLAGS_EVENTCALLBACK : 0); + if (paWasapi->useWOW64Workaround) + stream->in.streamFlags = 0; // polling interface + else + if (streamCallback == NULL) + stream->in.streamFlags = 0; // polling interface + else + if ((inputStreamInfo != NULL) && (inputStreamInfo->flags & paWinWasapiPolling)) + stream->in.streamFlags = 0; // polling interface + else + if (fullDuplex) + stream->in.streamFlags = 0; // polling interface is implemented for full-duplex mode also - // Use built-in PCM converter (channel count and sample rate) if requested - if ((GetWindowsVersion() >= WINDOWS_7_SERVER2008R2) && - (stream->in.shareMode == AUDCLNT_SHAREMODE_SHARED) && - ((inputStreamInfo != NULL) && (inputStreamInfo->flags & paWinWasapiAutoConvert))) - stream->in.streamFlags |= (AUDCLNT_STREAMFLAGS_AUTOCONVERTPCM | AUDCLNT_STREAMFLAGS_SRC_DEFAULT_QUALITY); + // Use built-in PCM converter (channel count and sample rate) if requested + if ((GetWindowsVersion() >= WINDOWS_7_SERVER2008R2) && + (stream->in.shareMode == AUDCLNT_SHAREMODE_SHARED) && + ((inputStreamInfo != NULL) && (inputStreamInfo->flags & paWinWasapiAutoConvert))) + stream->in.streamFlags |= (AUDCLNT_STREAMFLAGS_AUTOCONVERTPCM | AUDCLNT_STREAMFLAGS_SRC_DEFAULT_QUALITY); - // Fill parameters for Audio Client creation - stream->in.params.device_info = info; - stream->in.params.stream_params = (*inputParameters); - stream->in.params.frames_per_buffer = framesPerBuffer; - stream->in.params.sample_rate = sampleRate; - stream->in.params.blocking = (streamCallback == NULL); - stream->in.params.full_duplex = fullDuplex; - stream->in.params.wow64_workaround = paWasapi->useWOW64Workaround; + // Fill parameters for Audio Client creation + stream->in.params.device_info = info; + stream->in.params.stream_params = (*inputParameters); + stream->in.params.frames_per_buffer = framesPerBuffer; + stream->in.params.sample_rate = sampleRate; + stream->in.params.blocking = (streamCallback == NULL); + stream->in.params.full_duplex = fullDuplex; + stream->in.params.wow64_workaround = paWasapi->useWOW64Workaround; - // Create and activate audio client - if ((result = ActivateAudioClientInput(stream)) != paNoError) - { - LogPaError(result); - goto error; - } + // Create and activate audio client + if ((result = ActivateAudioClientInput(stream)) != paNoError) + { + LogPaError(result); + goto error; + } - // Get closest format + // Get closest format hostInputSampleFormat = PaUtil_SelectClosestAvailableFormat(WaveToPaFormat(&stream->in.wavex), inputSampleFormat); // Set user-side custom host processor @@ -3722,130 +3722,130 @@ static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi, stream->hostProcessOverrideInput.userData = userData; } - // Only get IAudioCaptureClient input once here instead of getting it at multiple places based on the use - if (FAILED(hr = IAudioClient_GetService(stream->in.clientParent, &pa_IID_IAudioCaptureClient, (void **)&stream->captureClientParent))) - { - LogHostError(hr); - LogPaError(result = paUnanticipatedHostError); - goto error; - } + // Only get IAudioCaptureClient input once here instead of getting it at multiple places based on the use + if (FAILED(hr = IAudioClient_GetService(stream->in.clientParent, &pa_IID_IAudioCaptureClient, (void **)&stream->captureClientParent))) + { + LogHostError(hr); + LogPaError(result = paUnanticipatedHostError); + goto error; + } - // Create ring buffer for blocking mode (It is needed because we fetch Input packets, not frames, - // and thus we have to save partial packet if such remains unread) - if (stream->in.params.blocking == TRUE) - { - UINT32 bufferFrames = ALIGN_NEXT_POW2((stream->in.framesPerHostCallback / WASAPI_PACKETS_PER_INPUT_BUFFER) * 2); - UINT32 frameSize = stream->in.wavex.Format.nBlockAlign; + // Create ring buffer for blocking mode (It is needed because we fetch Input packets, not frames, + // and thus we have to save partial packet if such remains unread) + if (stream->in.params.blocking == TRUE) + { + UINT32 bufferFrames = ALIGN_NEXT_POW2((stream->in.framesPerHostCallback / WASAPI_PACKETS_PER_INPUT_BUFFER) * 2); + UINT32 frameSize = stream->in.wavex.Format.nBlockAlign; - // buffer - if ((stream->in.tailBuffer = PaUtil_AllocateMemory(sizeof(PaUtilRingBuffer))) == NULL) - { - LogPaError(result = paInsufficientMemory); - goto error; - } - memset(stream->in.tailBuffer, 0, sizeof(PaUtilRingBuffer)); + // buffer + if ((stream->in.tailBuffer = PaUtil_AllocateMemory(sizeof(PaUtilRingBuffer))) == NULL) + { + LogPaError(result = paInsufficientMemory); + goto error; + } + memset(stream->in.tailBuffer, 0, sizeof(PaUtilRingBuffer)); - // buffer memory region - stream->in.tailBufferMemory = PaUtil_AllocateMemory(frameSize * bufferFrames); - if (stream->in.tailBufferMemory == NULL) - { - LogPaError(result = paInsufficientMemory); - goto error; - } + // buffer memory region + stream->in.tailBufferMemory = PaUtil_AllocateMemory(frameSize * bufferFrames); + if (stream->in.tailBufferMemory == NULL) + { + LogPaError(result = paInsufficientMemory); + goto error; + } - // initialize - if (PaUtil_InitializeRingBuffer(stream->in.tailBuffer, frameSize, bufferFrames, stream->in.tailBufferMemory) != 0) - { - LogPaError(result = paInternalError); - goto error; - } - } - } + // initialize + if (PaUtil_InitializeRingBuffer(stream->in.tailBuffer, frameSize, bufferFrames, stream->in.tailBufferMemory) != 0) + { + LogPaError(result = paInternalError); + goto error; + } + } + } else { inputChannelCount = 0; inputSampleFormat = hostInputSampleFormat = paInt16; /* Surpress 'uninitialised var' warnings. */ } - // Try create device: Output + // Try create device: Output if (outputParameters != NULL) { outputChannelCount = outputParameters->channelCount; outputSampleFormat = GetSampleFormatForIO(outputParameters->sampleFormat); - info = &paWasapi->devInfo[outputParameters->device]; + info = &paWasapi->devInfo[outputParameters->device]; - // default Shared Mode - stream->out.shareMode = AUDCLNT_SHAREMODE_SHARED; + // default Shared Mode + stream->out.shareMode = AUDCLNT_SHAREMODE_SHARED; - // set PaWasapiStreamInfo - if (outputParameters->hostApiSpecificStreamInfo != NULL) - { - memcpy(&stream->out.params.wasapi_params, outputParameters->hostApiSpecificStreamInfo, min(sizeof(stream->out.params.wasapi_params), ((PaWasapiStreamInfo *)outputParameters->hostApiSpecificStreamInfo)->size)); - stream->out.params.wasapi_params.size = sizeof(stream->out.params.wasapi_params); + // set PaWasapiStreamInfo + if (outputParameters->hostApiSpecificStreamInfo != NULL) + { + memcpy(&stream->out.params.wasapi_params, outputParameters->hostApiSpecificStreamInfo, min(sizeof(stream->out.params.wasapi_params), ((PaWasapiStreamInfo *)outputParameters->hostApiSpecificStreamInfo)->size)); + stream->out.params.wasapi_params.size = sizeof(stream->out.params.wasapi_params); - stream->out.params.stream_params.hostApiSpecificStreamInfo = &stream->out.params.wasapi_params; - outputStreamInfo = &stream->out.params.wasapi_params; + stream->out.params.stream_params.hostApiSpecificStreamInfo = &stream->out.params.wasapi_params; + outputStreamInfo = &stream->out.params.wasapi_params; - stream->out.flags = outputStreamInfo->flags; + stream->out.flags = outputStreamInfo->flags; - // Exclusive Mode - if (outputStreamInfo->flags & paWinWasapiExclusive) - { - // Boost thread priority - stream->nThreadPriority = eThreadPriorityProAudio; - // Make Exclusive - stream->out.shareMode = AUDCLNT_SHAREMODE_EXCLUSIVE; - } + // Exclusive Mode + if (outputStreamInfo->flags & paWinWasapiExclusive) + { + // Boost thread priority + stream->nThreadPriority = eThreadPriorityProAudio; + // Make Exclusive + stream->out.shareMode = AUDCLNT_SHAREMODE_EXCLUSIVE; + } - // explicit thread priority level - if (outputStreamInfo->flags & paWinWasapiThreadPriority) - { - if ((outputStreamInfo->threadPriority > eThreadPriorityNone) && - (outputStreamInfo->threadPriority <= eThreadPriorityWindowManager)) - stream->nThreadPriority = outputStreamInfo->threadPriority; - } + // explicit thread priority level + if (outputStreamInfo->flags & paWinWasapiThreadPriority) + { + if ((outputStreamInfo->threadPriority > eThreadPriorityNone) && + (outputStreamInfo->threadPriority <= eThreadPriorityWindowManager)) + stream->nThreadPriority = outputStreamInfo->threadPriority; + } - // redirect processing to custom user callback, ignore PA buffer processor - useOutputBufferProcessor = !(outputStreamInfo->flags & paWinWasapiRedirectHostProcessor); - } + // redirect processing to custom user callback, ignore PA buffer processor + useOutputBufferProcessor = !(outputStreamInfo->flags & paWinWasapiRedirectHostProcessor); + } - // Choose processing mode - stream->out.streamFlags = (stream->out.shareMode == AUDCLNT_SHAREMODE_EXCLUSIVE ? AUDCLNT_STREAMFLAGS_EVENTCALLBACK : 0); - if (paWasapi->useWOW64Workaround) - stream->out.streamFlags = 0; // polling interface - else - if (streamCallback == NULL) - stream->out.streamFlags = 0; // polling interface - else - if ((outputStreamInfo != NULL) && (outputStreamInfo->flags & paWinWasapiPolling)) - stream->out.streamFlags = 0; // polling interface - else - if (fullDuplex) - stream->out.streamFlags = 0; // polling interface is implemented for full-duplex mode also + // Choose processing mode + stream->out.streamFlags = (stream->out.shareMode == AUDCLNT_SHAREMODE_EXCLUSIVE ? AUDCLNT_STREAMFLAGS_EVENTCALLBACK : 0); + if (paWasapi->useWOW64Workaround) + stream->out.streamFlags = 0; // polling interface + else + if (streamCallback == NULL) + stream->out.streamFlags = 0; // polling interface + else + if ((outputStreamInfo != NULL) && (outputStreamInfo->flags & paWinWasapiPolling)) + stream->out.streamFlags = 0; // polling interface + else + if (fullDuplex) + stream->out.streamFlags = 0; // polling interface is implemented for full-duplex mode also - // Use built-in PCM converter (channel count and sample rate) if requested - if ((GetWindowsVersion() >= WINDOWS_7_SERVER2008R2) && - (stream->out.shareMode == AUDCLNT_SHAREMODE_SHARED) && - ((outputStreamInfo != NULL) && (outputStreamInfo->flags & paWinWasapiAutoConvert))) - stream->out.streamFlags |= (AUDCLNT_STREAMFLAGS_AUTOCONVERTPCM | AUDCLNT_STREAMFLAGS_SRC_DEFAULT_QUALITY); + // Use built-in PCM converter (channel count and sample rate) if requested + if ((GetWindowsVersion() >= WINDOWS_7_SERVER2008R2) && + (stream->out.shareMode == AUDCLNT_SHAREMODE_SHARED) && + ((outputStreamInfo != NULL) && (outputStreamInfo->flags & paWinWasapiAutoConvert))) + stream->out.streamFlags |= (AUDCLNT_STREAMFLAGS_AUTOCONVERTPCM | AUDCLNT_STREAMFLAGS_SRC_DEFAULT_QUALITY); - // Fill parameters for Audio Client creation - stream->out.params.device_info = info; - stream->out.params.stream_params = (*outputParameters); - stream->out.params.frames_per_buffer = framesPerBuffer; - stream->out.params.sample_rate = sampleRate; - stream->out.params.blocking = (streamCallback == NULL); - stream->out.params.full_duplex = fullDuplex; - stream->out.params.wow64_workaround = paWasapi->useWOW64Workaround; + // Fill parameters for Audio Client creation + stream->out.params.device_info = info; + stream->out.params.stream_params = (*outputParameters); + stream->out.params.frames_per_buffer = framesPerBuffer; + stream->out.params.sample_rate = sampleRate; + stream->out.params.blocking = (streamCallback == NULL); + stream->out.params.full_duplex = fullDuplex; + stream->out.params.wow64_workaround = paWasapi->useWOW64Workaround; - // Create and activate audio client - if ((result = ActivateAudioClientOutput(stream)) != paNoError) - { - LogPaError(result); - goto error; - } + // Create and activate audio client + if ((result = ActivateAudioClientOutput(stream)) != paNoError) + { + LogPaError(result); + goto error; + } - // Get closest format + // Get closest format hostOutputSampleFormat = PaUtil_SelectClosestAvailableFormat(WaveToPaFormat(&stream->out.wavex), outputSampleFormat); // Set user-side custom host processor @@ -3856,137 +3856,137 @@ static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi, stream->hostProcessOverrideOutput.userData = userData; } - // Only get IAudioCaptureClient output once here instead of getting it at multiple places based on the use - if (FAILED(hr = IAudioClient_GetService(stream->out.clientParent, &pa_IID_IAudioRenderClient, (void **)&stream->renderClientParent))) - { - LogHostError(hr); - LogPaError(result = paUnanticipatedHostError); - goto error; - } - } + // Only get IAudioCaptureClient output once here instead of getting it at multiple places based on the use + if (FAILED(hr = IAudioClient_GetService(stream->out.clientParent, &pa_IID_IAudioRenderClient, (void **)&stream->renderClientParent))) + { + LogHostError(hr); + LogPaError(result = paUnanticipatedHostError); + goto error; + } + } else { outputChannelCount = 0; outputSampleFormat = hostOutputSampleFormat = paInt16; /* Surpress 'uninitialized var' warnings. */ } - // log full-duplex - if (fullDuplex) - PRINT(("WASAPI::OpenStream: full-duplex mode\n")); + // log full-duplex + if (fullDuplex) + PRINT(("WASAPI::OpenStream: full-duplex mode\n")); - // paWinWasapiPolling must be on/or not on both streams - if ((inputParameters != NULL) && (outputParameters != NULL)) - { - if ((inputStreamInfo != NULL) && (outputStreamInfo != NULL)) - { - if (((inputStreamInfo->flags & paWinWasapiPolling) && - !(outputStreamInfo->flags & paWinWasapiPolling)) - || - (!(inputStreamInfo->flags & paWinWasapiPolling) && - (outputStreamInfo->flags & paWinWasapiPolling))) - { - LogPaError(result = paInvalidFlag); - goto error; - } - } - } + // paWinWasapiPolling must be on/or not on both streams + if ((inputParameters != NULL) && (outputParameters != NULL)) + { + if ((inputStreamInfo != NULL) && (outputStreamInfo != NULL)) + { + if (((inputStreamInfo->flags & paWinWasapiPolling) && + !(outputStreamInfo->flags & paWinWasapiPolling)) + || + (!(inputStreamInfo->flags & paWinWasapiPolling) && + (outputStreamInfo->flags & paWinWasapiPolling))) + { + LogPaError(result = paInvalidFlag); + goto error; + } + } + } - // Initialize stream representation + // Initialize stream representation if (streamCallback) { - stream->bBlocking = FALSE; + stream->bBlocking = FALSE; PaUtil_InitializeStreamRepresentation(&stream->streamRepresentation, &paWasapi->callbackStreamInterface, - streamCallback, userData); + streamCallback, userData); } else { - stream->bBlocking = TRUE; + stream->bBlocking = TRUE; PaUtil_InitializeStreamRepresentation(&stream->streamRepresentation, &paWasapi->blockingStreamInterface, - streamCallback, userData); + streamCallback, userData); } - // Initialize CPU measurer + // Initialize CPU measurer PaUtil_InitializeCpuLoadMeasurer(&stream->cpuLoadMeasurer, sampleRate); - if (outputParameters && inputParameters) - { - // serious problem #1 - No, Not a problem, especially concerning Exclusive mode. - // Input device in exclusive mode somehow is getting large buffer always, thus we - // adjust Output latency to reflect it, thus period will differ but playback will be - // normal. - /*if (stream->in.period != stream->out.period) - { - PRINT(("WASAPI: OpenStream: period discrepancy\n")); - LogPaError(result = paBadIODeviceCombination); - goto error; - }*/ + if (outputParameters && inputParameters) + { + // serious problem #1 - No, Not a problem, especially concerning Exclusive mode. + // Input device in exclusive mode somehow is getting large buffer always, thus we + // adjust Output latency to reflect it, thus period will differ but playback will be + // normal. + /*if (stream->in.period != stream->out.period) + { + PRINT(("WASAPI: OpenStream: period discrepancy\n")); + LogPaError(result = paBadIODeviceCombination); + goto error; + }*/ - // serious problem #2 - No, Not a problem, as framesPerHostCallback take into account - // sample size while it is not a problem for PA full-duplex, we must care of - // preriod only! - /*if (stream->out.framesPerHostCallback != stream->in.framesPerHostCallback) - { - PRINT(("WASAPI: OpenStream: framesPerHostCallback discrepancy\n")); - goto error; - }*/ - } + // serious problem #2 - No, Not a problem, as framesPerHostCallback take into account + // sample size while it is not a problem for PA full-duplex, we must care of + // preriod only! + /*if (stream->out.framesPerHostCallback != stream->in.framesPerHostCallback) + { + PRINT(("WASAPI: OpenStream: framesPerHostCallback discrepancy\n")); + goto error; + }*/ + } - // Calculate frames per host for processor - framesPerHostCallback = (outputParameters ? stream->out.framesPerBuffer : stream->in.framesPerBuffer); + // Calculate frames per host for processor + framesPerHostCallback = (outputParameters ? stream->out.framesPerBuffer : stream->in.framesPerBuffer); - // Choose correct mode of buffer processing: - // Exclusive/Shared non paWinWasapiPolling mode: paUtilFixedHostBufferSize - always fixed - // Exclusive/Shared paWinWasapiPolling mode: paUtilBoundedHostBufferSize - may vary for Exclusive or Full-duplex - bufferMode = paUtilFixedHostBufferSize; - if (inputParameters) // !!! WASAPI IAudioCaptureClient::GetBuffer extracts not number of frames but 1 packet, thus we always must adapt - bufferMode = paUtilBoundedHostBufferSize; - else - if (outputParameters) - { - if ((stream->out.buffers == 1) && - (!stream->out.streamFlags || ((stream->out.streamFlags & AUDCLNT_STREAMFLAGS_EVENTCALLBACK) == 0))) - bufferMode = paUtilBoundedHostBufferSize; - } - stream->bufferMode = bufferMode; + // Choose correct mode of buffer processing: + // Exclusive/Shared non paWinWasapiPolling mode: paUtilFixedHostBufferSize - always fixed + // Exclusive/Shared paWinWasapiPolling mode: paUtilBoundedHostBufferSize - may vary for Exclusive or Full-duplex + bufferMode = paUtilFixedHostBufferSize; + if (inputParameters) // !!! WASAPI IAudioCaptureClient::GetBuffer extracts not number of frames but 1 packet, thus we always must adapt + bufferMode = paUtilBoundedHostBufferSize; + else + if (outputParameters) + { + if ((stream->out.buffers == 1) && + (!stream->out.streamFlags || ((stream->out.streamFlags & AUDCLNT_STREAMFLAGS_EVENTCALLBACK) == 0))) + bufferMode = paUtilBoundedHostBufferSize; + } + stream->bufferMode = bufferMode; // Initialize buffer processor - if (useInputBufferProcessor || useOutputBufferProcessor) - { - result = PaUtil_InitializeBufferProcessor( - &stream->bufferProcessor, - inputChannelCount, - inputSampleFormat, - hostInputSampleFormat, - outputChannelCount, - outputSampleFormat, - hostOutputSampleFormat, - sampleRate, - streamFlags, - framesPerBuffer, - framesPerHostCallback, - bufferMode, - streamCallback, - userData); - if (result != paNoError) - { - LogPaError(result); - goto error; - } - } + if (useInputBufferProcessor || useOutputBufferProcessor) + { + result = PaUtil_InitializeBufferProcessor( + &stream->bufferProcessor, + inputChannelCount, + inputSampleFormat, + hostInputSampleFormat, + outputChannelCount, + outputSampleFormat, + hostOutputSampleFormat, + sampleRate, + streamFlags, + framesPerBuffer, + framesPerHostCallback, + bufferMode, + streamCallback, + userData); + if (result != paNoError) + { + LogPaError(result); + goto error; + } + } - // Set Input latency + // Set Input latency stream->streamRepresentation.streamInfo.inputLatency = (useInputBufferProcessor ? PaUtil_GetBufferProcessorInputLatencyFrames(&stream->bufferProcessor) / sampleRate : 0) - + (inputParameters != NULL ? stream->in.latencySeconds : 0); + + (inputParameters != NULL ? stream->in.latencySeconds : 0); - // Set Output latency + // Set Output latency stream->streamRepresentation.streamInfo.outputLatency = (useOutputBufferProcessor ? PaUtil_GetBufferProcessorOutputLatencyFrames(&stream->bufferProcessor) / sampleRate : 0) - + (outputParameters != NULL ? stream->out.latencySeconds : 0); + + (outputParameters != NULL ? stream->out.latencySeconds : 0); - // Set SR + // Set SR stream->streamRepresentation.streamInfo.sampleRate = sampleRate; (*s) = (PaStream *)stream; @@ -3995,7 +3995,7 @@ static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi, error: if (stream != NULL) - CloseStream(stream); + CloseStream(stream); return result; } @@ -4006,32 +4006,32 @@ static PaError CloseStream( PaStream* s ) PaError result = paNoError; PaWasapiStream *stream = (PaWasapiStream*)s; - // abort active stream - if (IsStreamActive(s)) - { - result = AbortStream(s); - } + // abort active stream + if (IsStreamActive(s)) + { + result = AbortStream(s); + } SAFE_RELEASE(stream->captureClientParent); SAFE_RELEASE(stream->renderClientParent); SAFE_RELEASE(stream->out.clientParent); SAFE_RELEASE(stream->in.clientParent); - SAFE_RELEASE(stream->inVol); - SAFE_RELEASE(stream->outVol); + SAFE_RELEASE(stream->inVol); + SAFE_RELEASE(stream->outVol); - CloseHandle(stream->event[S_INPUT]); - CloseHandle(stream->event[S_OUTPUT]); + CloseHandle(stream->event[S_INPUT]); + CloseHandle(stream->event[S_OUTPUT]); - _StreamCleanup(stream); + _StreamCleanup(stream); - PaWasapi_FreeMemory(stream->in.monoBuffer); - PaWasapi_FreeMemory(stream->out.monoBuffer); + PaWasapi_FreeMemory(stream->in.monoBuffer); + PaWasapi_FreeMemory(stream->out.monoBuffer); - PaUtil_FreeMemory(stream->in.tailBuffer); - PaUtil_FreeMemory(stream->in.tailBufferMemory); + PaUtil_FreeMemory(stream->in.tailBuffer); + PaUtil_FreeMemory(stream->in.tailBufferMemory); - PaUtil_FreeMemory(stream->out.tailBuffer); - PaUtil_FreeMemory(stream->out.tailBufferMemory); + PaUtil_FreeMemory(stream->out.tailBuffer); + PaUtil_FreeMemory(stream->out.tailBufferMemory); PaUtil_TerminateBufferProcessor(&stream->bufferProcessor); PaUtil_TerminateStreamRepresentation(&stream->streamRepresentation); @@ -4044,23 +4044,23 @@ static PaError CloseStream( PaStream* s ) HRESULT UnmarshalSubStreamComPointers(PaWasapiSubStream *substream) { #ifndef PA_WINRT - HRESULT hResult = S_OK; - HRESULT hFirstBadResult = S_OK; - substream->clientProc = NULL; + HRESULT hResult = S_OK; + HRESULT hFirstBadResult = S_OK; + substream->clientProc = NULL; - // IAudioClient - hResult = CoGetInterfaceAndReleaseStream(substream->clientStream, GetAudioClientIID(), (LPVOID*)&substream->clientProc); - substream->clientStream = NULL; - if (hResult != S_OK) - { - hFirstBadResult = (hFirstBadResult == S_OK) ? hResult : hFirstBadResult; - } + // IAudioClient + hResult = CoGetInterfaceAndReleaseStream(substream->clientStream, GetAudioClientIID(), (LPVOID*)&substream->clientProc); + substream->clientStream = NULL; + if (hResult != S_OK) + { + hFirstBadResult = (hFirstBadResult == S_OK) ? hResult : hFirstBadResult; + } - return hFirstBadResult; + return hFirstBadResult; #else - (void)substream; - return S_OK; + (void)substream; + return S_OK; #endif } @@ -4068,120 +4068,120 @@ HRESULT UnmarshalSubStreamComPointers(PaWasapiSubStream *substream) HRESULT UnmarshalStreamComPointers(PaWasapiStream *stream) { #ifndef PA_WINRT - HRESULT hResult = S_OK; - HRESULT hFirstBadResult = S_OK; - stream->captureClient = NULL; - stream->renderClient = NULL; - stream->in.clientProc = NULL; - stream->out.clientProc = NULL; + HRESULT hResult = S_OK; + HRESULT hFirstBadResult = S_OK; + stream->captureClient = NULL; + stream->renderClient = NULL; + stream->in.clientProc = NULL; + stream->out.clientProc = NULL; - if (NULL != stream->in.clientParent) - { - // SubStream pointers - hResult = UnmarshalSubStreamComPointers(&stream->in); - if (hResult != S_OK) - { - hFirstBadResult = (hFirstBadResult == S_OK) ? hResult : hFirstBadResult; - } + if (NULL != stream->in.clientParent) + { + // SubStream pointers + hResult = UnmarshalSubStreamComPointers(&stream->in); + if (hResult != S_OK) + { + hFirstBadResult = (hFirstBadResult == S_OK) ? hResult : hFirstBadResult; + } - // IAudioCaptureClient - hResult = CoGetInterfaceAndReleaseStream(stream->captureClientStream, &pa_IID_IAudioCaptureClient, (LPVOID*)&stream->captureClient); - stream->captureClientStream = NULL; - if (hResult != S_OK) - { - hFirstBadResult = (hFirstBadResult == S_OK) ? hResult : hFirstBadResult; - } - } + // IAudioCaptureClient + hResult = CoGetInterfaceAndReleaseStream(stream->captureClientStream, &pa_IID_IAudioCaptureClient, (LPVOID*)&stream->captureClient); + stream->captureClientStream = NULL; + if (hResult != S_OK) + { + hFirstBadResult = (hFirstBadResult == S_OK) ? hResult : hFirstBadResult; + } + } - if (NULL != stream->out.clientParent) - { - // SubStream pointers - hResult = UnmarshalSubStreamComPointers(&stream->out); - if (hResult != S_OK) - { - hFirstBadResult = (hFirstBadResult == S_OK) ? hResult : hFirstBadResult; - } + if (NULL != stream->out.clientParent) + { + // SubStream pointers + hResult = UnmarshalSubStreamComPointers(&stream->out); + if (hResult != S_OK) + { + hFirstBadResult = (hFirstBadResult == S_OK) ? hResult : hFirstBadResult; + } - // IAudioRenderClient - hResult = CoGetInterfaceAndReleaseStream(stream->renderClientStream, &pa_IID_IAudioRenderClient, (LPVOID*)&stream->renderClient); - stream->renderClientStream = NULL; - if (hResult != S_OK) - { - hFirstBadResult = (hFirstBadResult == S_OK) ? hResult : hFirstBadResult; - } - } + // IAudioRenderClient + hResult = CoGetInterfaceAndReleaseStream(stream->renderClientStream, &pa_IID_IAudioRenderClient, (LPVOID*)&stream->renderClient); + stream->renderClientStream = NULL; + if (hResult != S_OK) + { + hFirstBadResult = (hFirstBadResult == S_OK) ? hResult : hFirstBadResult; + } + } - return hFirstBadResult; + return hFirstBadResult; #else - if (stream->in.clientParent != NULL) - { - stream->in.clientProc = stream->in.clientParent; - IAudioClient_AddRef(stream->in.clientParent); - } + if (stream->in.clientParent != NULL) + { + stream->in.clientProc = stream->in.clientParent; + IAudioClient_AddRef(stream->in.clientParent); + } - if (stream->out.clientParent != NULL) - { - stream->out.clientProc = stream->out.clientParent; - IAudioClient_AddRef(stream->out.clientParent); - } + if (stream->out.clientParent != NULL) + { + stream->out.clientProc = stream->out.clientParent; + IAudioClient_AddRef(stream->out.clientParent); + } - if (stream->renderClientParent != NULL) - { - stream->renderClient = stream->renderClientParent; - IAudioRenderClient_AddRef(stream->renderClientParent); - } + if (stream->renderClientParent != NULL) + { + stream->renderClient = stream->renderClientParent; + IAudioRenderClient_AddRef(stream->renderClientParent); + } - if (stream->captureClientParent != NULL) - { - stream->captureClient = stream->captureClientParent; - IAudioCaptureClient_AddRef(stream->captureClientParent); - } + if (stream->captureClientParent != NULL) + { + stream->captureClient = stream->captureClientParent; + IAudioCaptureClient_AddRef(stream->captureClientParent); + } - return S_OK; + return S_OK; #endif } // ----------------------------------------------------------------------------------------- void ReleaseUnmarshaledSubComPointers(PaWasapiSubStream *substream) { - SAFE_RELEASE(substream->clientProc); + SAFE_RELEASE(substream->clientProc); } // ----------------------------------------------------------------------------------------- void ReleaseUnmarshaledComPointers(PaWasapiStream *stream) { - // Release AudioClient services first - SAFE_RELEASE(stream->captureClient); - SAFE_RELEASE(stream->renderClient); + // Release AudioClient services first + SAFE_RELEASE(stream->captureClient); + SAFE_RELEASE(stream->renderClient); - // Release AudioClients - ReleaseUnmarshaledSubComPointers(&stream->in); - ReleaseUnmarshaledSubComPointers(&stream->out); + // Release AudioClients + ReleaseUnmarshaledSubComPointers(&stream->in); + ReleaseUnmarshaledSubComPointers(&stream->out); } // ------------------------------------------------------------------------------------------ HRESULT MarshalSubStreamComPointers(PaWasapiSubStream *substream) { #ifndef PA_WINRT - HRESULT hResult; - substream->clientStream = NULL; + HRESULT hResult; + substream->clientStream = NULL; - // IAudioClient - hResult = CoMarshalInterThreadInterfaceInStream(GetAudioClientIID(), (LPUNKNOWN)substream->clientParent, &substream->clientStream); - if (hResult != S_OK) - goto marshal_sub_error; + // IAudioClient + hResult = CoMarshalInterThreadInterfaceInStream(GetAudioClientIID(), (LPUNKNOWN)substream->clientParent, &substream->clientStream); + if (hResult != S_OK) + goto marshal_sub_error; - return hResult; + return hResult; - // If marshaling error occurred, make sure to release everything. + // If marshaling error occurred, make sure to release everything. marshal_sub_error: - UnmarshalSubStreamComPointers(substream); - ReleaseUnmarshaledSubComPointers(substream); - return hResult; + UnmarshalSubStreamComPointers(substream); + ReleaseUnmarshaledSubComPointers(substream); + return hResult; #else - (void)substream; - return S_OK; + (void)substream; + return S_OK; #endif } @@ -4189,214 +4189,214 @@ marshal_sub_error: HRESULT MarshalStreamComPointers(PaWasapiStream *stream) { #ifndef PA_WINRT - HRESULT hResult = S_OK; - stream->captureClientStream = NULL; - stream->in.clientStream = NULL; - stream->renderClientStream = NULL; - stream->out.clientStream = NULL; + HRESULT hResult = S_OK; + stream->captureClientStream = NULL; + stream->in.clientStream = NULL; + stream->renderClientStream = NULL; + stream->out.clientStream = NULL; - if (NULL != stream->in.clientParent) - { - // SubStream pointers - hResult = MarshalSubStreamComPointers(&stream->in); - if (hResult != S_OK) - goto marshal_error; + if (NULL != stream->in.clientParent) + { + // SubStream pointers + hResult = MarshalSubStreamComPointers(&stream->in); + if (hResult != S_OK) + goto marshal_error; - // IAudioCaptureClient - hResult = CoMarshalInterThreadInterfaceInStream(&pa_IID_IAudioCaptureClient, (LPUNKNOWN)stream->captureClientParent, &stream->captureClientStream); - if (hResult != S_OK) - goto marshal_error; - } + // IAudioCaptureClient + hResult = CoMarshalInterThreadInterfaceInStream(&pa_IID_IAudioCaptureClient, (LPUNKNOWN)stream->captureClientParent, &stream->captureClientStream); + if (hResult != S_OK) + goto marshal_error; + } - if (NULL != stream->out.clientParent) - { - // SubStream pointers - hResult = MarshalSubStreamComPointers(&stream->out); - if (hResult != S_OK) - goto marshal_error; + if (NULL != stream->out.clientParent) + { + // SubStream pointers + hResult = MarshalSubStreamComPointers(&stream->out); + if (hResult != S_OK) + goto marshal_error; - // IAudioRenderClient - hResult = CoMarshalInterThreadInterfaceInStream(&pa_IID_IAudioRenderClient, (LPUNKNOWN)stream->renderClientParent, &stream->renderClientStream); - if (hResult != S_OK) - goto marshal_error; - } + // IAudioRenderClient + hResult = CoMarshalInterThreadInterfaceInStream(&pa_IID_IAudioRenderClient, (LPUNKNOWN)stream->renderClientParent, &stream->renderClientStream); + if (hResult != S_OK) + goto marshal_error; + } - return hResult; + return hResult; - // If marshaling error occurred, make sure to release everything. + // If marshaling error occurred, make sure to release everything. marshal_error: - UnmarshalStreamComPointers(stream); - ReleaseUnmarshaledComPointers(stream); - return hResult; + UnmarshalStreamComPointers(stream); + ReleaseUnmarshaledComPointers(stream); + return hResult; #else - (void)stream; - return S_OK; + (void)stream; + return S_OK; #endif } // ------------------------------------------------------------------------------------------ static PaError StartStream( PaStream *s ) { - HRESULT hr; + HRESULT hr; PaWasapiStream *stream = (PaWasapiStream*)s; - PaError result = paNoError; + PaError result = paNoError; - // check if stream is active already - if (IsStreamActive(s)) - return paStreamIsNotStopped; + // check if stream is active already + if (IsStreamActive(s)) + return paStreamIsNotStopped; PaUtil_ResetBufferProcessor(&stream->bufferProcessor); - // Cleanup handles (may be necessary if stream was stopped by itself due to error) - _StreamCleanup(stream); + // Cleanup handles (may be necessary if stream was stopped by itself due to error) + _StreamCleanup(stream); - // Create close event - if ((stream->hCloseRequest = CreateEvent(NULL, TRUE, FALSE, NULL)) == NULL) - { - result = paInsufficientMemory; - goto start_error; - } + // Create close event + if ((stream->hCloseRequest = CreateEvent(NULL, TRUE, FALSE, NULL)) == NULL) + { + result = paInsufficientMemory; + goto start_error; + } - // Create thread - if (!stream->bBlocking) - { - // Create thread events - stream->hThreadStart = CreateEvent(NULL, TRUE, FALSE, NULL); - stream->hThreadExit = CreateEvent(NULL, TRUE, FALSE, NULL); - if ((stream->hThreadStart == NULL) || (stream->hThreadExit == NULL)) - { - result = paInsufficientMemory; - goto start_error; - } + // Create thread + if (!stream->bBlocking) + { + // Create thread events + stream->hThreadStart = CreateEvent(NULL, TRUE, FALSE, NULL); + stream->hThreadExit = CreateEvent(NULL, TRUE, FALSE, NULL); + if ((stream->hThreadStart == NULL) || (stream->hThreadExit == NULL)) + { + result = paInsufficientMemory; + goto start_error; + } - // Marshal WASAPI interface pointers for safe use in thread created below. - if ((hr = MarshalStreamComPointers(stream)) != S_OK) - { - PRINT(("Failed marshaling stream COM pointers.")); - result = paUnanticipatedHostError; - goto nonblocking_start_error; - } + // Marshal WASAPI interface pointers for safe use in thread created below. + if ((hr = MarshalStreamComPointers(stream)) != S_OK) + { + PRINT(("Failed marshaling stream COM pointers.")); + result = paUnanticipatedHostError; + goto nonblocking_start_error; + } - if ((stream->in.clientParent && (stream->in.streamFlags & AUDCLNT_STREAMFLAGS_EVENTCALLBACK)) || - (stream->out.clientParent && (stream->out.streamFlags & AUDCLNT_STREAMFLAGS_EVENTCALLBACK))) - { - if ((stream->hThread = CREATE_THREAD(ProcThreadEvent)) == NULL) - { - PRINT(("Failed creating thread: ProcThreadEvent.")); - result = paUnanticipatedHostError; - goto nonblocking_start_error; - } - } - else - { - if ((stream->hThread = CREATE_THREAD(ProcThreadPoll)) == NULL) - { - PRINT(("Failed creating thread: ProcThreadPoll.")); - result = paUnanticipatedHostError; - goto nonblocking_start_error; - } - } + if ((stream->in.clientParent && (stream->in.streamFlags & AUDCLNT_STREAMFLAGS_EVENTCALLBACK)) || + (stream->out.clientParent && (stream->out.streamFlags & AUDCLNT_STREAMFLAGS_EVENTCALLBACK))) + { + if ((stream->hThread = CREATE_THREAD(ProcThreadEvent)) == NULL) + { + PRINT(("Failed creating thread: ProcThreadEvent.")); + result = paUnanticipatedHostError; + goto nonblocking_start_error; + } + } + else + { + if ((stream->hThread = CREATE_THREAD(ProcThreadPoll)) == NULL) + { + PRINT(("Failed creating thread: ProcThreadPoll.")); + result = paUnanticipatedHostError; + goto nonblocking_start_error; + } + } - // Wait for thread to start - if (WaitForSingleObject(stream->hThreadStart, 60*1000) == WAIT_TIMEOUT) - { - PRINT(("Failed starting thread: timeout.")); - result = paUnanticipatedHostError; - goto nonblocking_start_error; - } - } - else - { - // Create blocking operation events (non-signaled event means - blocking operation is pending) - if (stream->out.clientParent != NULL) - { - if ((stream->hBlockingOpStreamWR = CreateEvent(NULL, TRUE, TRUE, NULL)) == NULL) - { - result = paInsufficientMemory; - goto start_error; - } - } - if (stream->in.clientParent != NULL) - { - if ((stream->hBlockingOpStreamRD = CreateEvent(NULL, TRUE, TRUE, NULL)) == NULL) - { - result = paInsufficientMemory; - goto start_error; - } - } + // Wait for thread to start + if (WaitForSingleObject(stream->hThreadStart, 60*1000) == WAIT_TIMEOUT) + { + PRINT(("Failed starting thread: timeout.")); + result = paUnanticipatedHostError; + goto nonblocking_start_error; + } + } + else + { + // Create blocking operation events (non-signaled event means - blocking operation is pending) + if (stream->out.clientParent != NULL) + { + if ((stream->hBlockingOpStreamWR = CreateEvent(NULL, TRUE, TRUE, NULL)) == NULL) + { + result = paInsufficientMemory; + goto start_error; + } + } + if (stream->in.clientParent != NULL) + { + if ((stream->hBlockingOpStreamRD = CreateEvent(NULL, TRUE, TRUE, NULL)) == NULL) + { + result = paInsufficientMemory; + goto start_error; + } + } - // Initialize event & start INPUT stream - if (stream->in.clientParent != NULL) - { - if ((hr = IAudioClient_Start(stream->in.clientParent)) != S_OK) - { - LogHostError(hr); - result = paUnanticipatedHostError; - goto start_error; - } - } + // Initialize event & start INPUT stream + if (stream->in.clientParent != NULL) + { + if ((hr = IAudioClient_Start(stream->in.clientParent)) != S_OK) + { + LogHostError(hr); + result = paUnanticipatedHostError; + goto start_error; + } + } - // Initialize event & start OUTPUT stream - if (stream->out.clientParent != NULL) - { - // Start - if ((hr = IAudioClient_Start(stream->out.clientParent)) != S_OK) - { - LogHostError(hr); - result = paUnanticipatedHostError; - goto start_error; - } - } + // Initialize event & start OUTPUT stream + if (stream->out.clientParent != NULL) + { + // Start + if ((hr = IAudioClient_Start(stream->out.clientParent)) != S_OK) + { + LogHostError(hr); + result = paUnanticipatedHostError; + goto start_error; + } + } - // Set parent to working pointers to use shared functions. - stream->captureClient = stream->captureClientParent; - stream->renderClient = stream->renderClientParent; - stream->in.clientProc = stream->in.clientParent; - stream->out.clientProc = stream->out.clientParent; + // Set parent to working pointers to use shared functions. + stream->captureClient = stream->captureClientParent; + stream->renderClient = stream->renderClientParent; + stream->in.clientProc = stream->in.clientParent; + stream->out.clientProc = stream->out.clientParent; - // Signal: stream running. - stream->running = TRUE; - } + // Signal: stream running. + stream->running = TRUE; + } return result; nonblocking_start_error: - // Set hThreadExit event to prevent blocking during cleanup - SetEvent(stream->hThreadExit); - UnmarshalStreamComPointers(stream); - ReleaseUnmarshaledComPointers(stream); + // Set hThreadExit event to prevent blocking during cleanup + SetEvent(stream->hThreadExit); + UnmarshalStreamComPointers(stream); + ReleaseUnmarshaledComPointers(stream); start_error: - StopStream(s); - return result; + StopStream(s); + return result; } // ------------------------------------------------------------------------------------------ void _StreamFinish(PaWasapiStream *stream) { - // Issue command to thread to stop processing and wait for thread exit - if (!stream->bBlocking) - { - SignalObjectAndWait(stream->hCloseRequest, stream->hThreadExit, INFINITE, FALSE); - } - else - // Blocking mode does not own thread - { - // Signal close event and wait for each of 2 blocking operations to complete - if (stream->out.clientParent) - SignalObjectAndWait(stream->hCloseRequest, stream->hBlockingOpStreamWR, INFINITE, TRUE); - if (stream->out.clientParent) - SignalObjectAndWait(stream->hCloseRequest, stream->hBlockingOpStreamRD, INFINITE, TRUE); + // Issue command to thread to stop processing and wait for thread exit + if (!stream->bBlocking) + { + SignalObjectAndWait(stream->hCloseRequest, stream->hThreadExit, INFINITE, FALSE); + } + else + // Blocking mode does not own thread + { + // Signal close event and wait for each of 2 blocking operations to complete + if (stream->out.clientParent) + SignalObjectAndWait(stream->hCloseRequest, stream->hBlockingOpStreamWR, INFINITE, TRUE); + if (stream->out.clientParent) + SignalObjectAndWait(stream->hCloseRequest, stream->hBlockingOpStreamRD, INFINITE, TRUE); - // Process stop - _StreamOnStop(stream); - } + // Process stop + _StreamOnStop(stream); + } - // Cleanup handles - _StreamCleanup(stream); + // Cleanup handles + _StreamCleanup(stream); stream->running = FALSE; } @@ -4404,35 +4404,35 @@ void _StreamFinish(PaWasapiStream *stream) // ------------------------------------------------------------------------------------------ void _StreamCleanup(PaWasapiStream *stream) { - // Close thread handles to allow restart - SAFE_CLOSE(stream->hThread); - SAFE_CLOSE(stream->hThreadStart); - SAFE_CLOSE(stream->hThreadExit); - SAFE_CLOSE(stream->hCloseRequest); - SAFE_CLOSE(stream->hBlockingOpStreamRD); - SAFE_CLOSE(stream->hBlockingOpStreamWR); + // Close thread handles to allow restart + SAFE_CLOSE(stream->hThread); + SAFE_CLOSE(stream->hThreadStart); + SAFE_CLOSE(stream->hThreadExit); + SAFE_CLOSE(stream->hCloseRequest); + SAFE_CLOSE(stream->hBlockingOpStreamRD); + SAFE_CLOSE(stream->hBlockingOpStreamWR); } // ------------------------------------------------------------------------------------------ static PaError StopStream( PaStream *s ) { - // Finish stream - _StreamFinish((PaWasapiStream *)s); + // Finish stream + _StreamFinish((PaWasapiStream *)s); return paNoError; } // ------------------------------------------------------------------------------------------ static PaError AbortStream( PaStream *s ) { - // Finish stream - _StreamFinish((PaWasapiStream *)s); + // Finish stream + _StreamFinish((PaWasapiStream *)s); return paNoError; } // ------------------------------------------------------------------------------------------ static PaError IsStreamStopped( PaStream *s ) { - return !((PaWasapiStream *)s)->running; + return !((PaWasapiStream *)s)->running; } // ------------------------------------------------------------------------------------------ @@ -4455,7 +4455,7 @@ static PaTime GetStreamTime( PaStream *s ) // ------------------------------------------------------------------------------------------ static double GetStreamCpuLoad( PaStream* s ) { - return PaUtil_GetCpuLoad(&((PaWasapiStream *)s)->cpuLoadMeasurer); + return PaUtil_GetCpuLoad(&((PaWasapiStream *)s)->cpuLoadMeasurer); } // ------------------------------------------------------------------------------------------ @@ -4463,32 +4463,32 @@ static PaError ReadStream( PaStream* s, void *_buffer, unsigned long frames ) { PaWasapiStream *stream = (PaWasapiStream*)s; - HRESULT hr = S_OK; - BYTE *user_buffer = (BYTE *)_buffer; - BYTE *wasapi_buffer = NULL; - DWORD flags = 0; - UINT32 i, available, sleep = 0; - unsigned long processed; - ThreadIdleScheduler sched; + HRESULT hr = S_OK; + BYTE *user_buffer = (BYTE *)_buffer; + BYTE *wasapi_buffer = NULL; + DWORD flags = 0; + UINT32 i, available, sleep = 0; + unsigned long processed; + ThreadIdleScheduler sched; - // validate - if (!stream->running) - return paStreamIsStopped; - if (stream->captureClient == NULL) - return paBadStreamPtr; + // validate + if (!stream->running) + return paStreamIsStopped; + if (stream->captureClient == NULL) + return paBadStreamPtr; - // Notify blocking op has begun - ResetEvent(stream->hBlockingOpStreamRD); + // Notify blocking op has begun + ResetEvent(stream->hBlockingOpStreamRD); - // Use thread scheduling for 500 microseconds (emulated) when wait time for frames is less than - // 1 milliseconds, emulation helps to normalize CPU consumption and avoids too busy waiting - ThreadIdleScheduler_Setup(&sched, 1, 250/* microseconds */); + // Use thread scheduling for 500 microseconds (emulated) when wait time for frames is less than + // 1 milliseconds, emulation helps to normalize CPU consumption and avoids too busy waiting + ThreadIdleScheduler_Setup(&sched, 1, 250/* microseconds */); // Make a local copy of the user buffer pointer(s), this is necessary - // because PaUtil_CopyOutput() advances these pointers every time it is called + // because PaUtil_CopyOutput() advances these pointers every time it is called if (!stream->bufferProcessor.userInputIsInterleaved) { - user_buffer = (BYTE *)alloca(sizeof(BYTE *) * stream->bufferProcessor.inputChannelCount); + user_buffer = (BYTE *)alloca(sizeof(BYTE *) * stream->bufferProcessor.inputChannelCount); if (user_buffer == NULL) return paInsufficientMemory; @@ -4496,145 +4496,145 @@ static PaError ReadStream( PaStream* s, void *_buffer, unsigned long frames ) ((BYTE **)user_buffer)[i] = ((BYTE **)_buffer)[i]; } - // Findout if there are tail frames, flush them all before reading hardware - if ((available = PaUtil_GetRingBufferReadAvailable(stream->in.tailBuffer)) != 0) - { - ring_buffer_size_t buf1_size = 0, buf2_size = 0, read, desired; - void *buf1 = NULL, *buf2 = NULL; + // Findout if there are tail frames, flush them all before reading hardware + if ((available = PaUtil_GetRingBufferReadAvailable(stream->in.tailBuffer)) != 0) + { + ring_buffer_size_t buf1_size = 0, buf2_size = 0, read, desired; + void *buf1 = NULL, *buf2 = NULL; - // Limit desired to amount of requested frames - desired = available; - if ((UINT32)desired > frames) - desired = frames; - - // Get pointers to read regions - read = PaUtil_GetRingBufferReadRegions(stream->in.tailBuffer, desired, &buf1, &buf1_size, &buf2, &buf2_size); + // Limit desired to amount of requested frames + desired = available; + if ((UINT32)desired > frames) + desired = frames; + + // Get pointers to read regions + read = PaUtil_GetRingBufferReadRegions(stream->in.tailBuffer, desired, &buf1, &buf1_size, &buf2, &buf2_size); - if (buf1 != NULL) - { - // Register available frames to processor - PaUtil_SetInputFrameCount(&stream->bufferProcessor, buf1_size); + if (buf1 != NULL) + { + // Register available frames to processor + PaUtil_SetInputFrameCount(&stream->bufferProcessor, buf1_size); - // Register host buffer pointer to processor - PaUtil_SetInterleavedInputChannels(&stream->bufferProcessor, 0, buf1, stream->bufferProcessor.inputChannelCount); + // Register host buffer pointer to processor + PaUtil_SetInterleavedInputChannels(&stream->bufferProcessor, 0, buf1, stream->bufferProcessor.inputChannelCount); - // Copy user data to host buffer (with conversion if applicable) - processed = PaUtil_CopyInput(&stream->bufferProcessor, (void **)&user_buffer, buf1_size); - frames -= processed; - } + // Copy user data to host buffer (with conversion if applicable) + processed = PaUtil_CopyInput(&stream->bufferProcessor, (void **)&user_buffer, buf1_size); + frames -= processed; + } - if (buf2 != NULL) - { - // Register available frames to processor - PaUtil_SetInputFrameCount(&stream->bufferProcessor, buf2_size); + if (buf2 != NULL) + { + // Register available frames to processor + PaUtil_SetInputFrameCount(&stream->bufferProcessor, buf2_size); - // Register host buffer pointer to processor - PaUtil_SetInterleavedInputChannels(&stream->bufferProcessor, 0, buf2, stream->bufferProcessor.inputChannelCount); + // Register host buffer pointer to processor + PaUtil_SetInterleavedInputChannels(&stream->bufferProcessor, 0, buf2, stream->bufferProcessor.inputChannelCount); - // Copy user data to host buffer (with conversion if applicable) - processed = PaUtil_CopyInput(&stream->bufferProcessor, (void **)&user_buffer, buf2_size); - frames -= processed; - } + // Copy user data to host buffer (with conversion if applicable) + processed = PaUtil_CopyInput(&stream->bufferProcessor, (void **)&user_buffer, buf2_size); + frames -= processed; + } - // Advance - PaUtil_AdvanceRingBufferReadIndex(stream->in.tailBuffer, read); - } + // Advance + PaUtil_AdvanceRingBufferReadIndex(stream->in.tailBuffer, read); + } - // Read hardware - while (frames != 0) - { - // Check if blocking call must be interrupted - if (WaitForSingleObject(stream->hCloseRequest, sleep) != WAIT_TIMEOUT) - break; + // Read hardware + while (frames != 0) + { + // Check if blocking call must be interrupted + if (WaitForSingleObject(stream->hCloseRequest, sleep) != WAIT_TIMEOUT) + break; - // Get available frames (must be finding out available frames before call to IAudioCaptureClient_GetBuffer - // othervise audio glitches will occur inExclusive mode as it seems that WASAPI has some scheduling/ - // processing problems when such busy polling with IAudioCaptureClient_GetBuffer occurs) - if ((hr = _PollGetInputFramesAvailable(stream, &available)) != S_OK) - { - LogHostError(hr); - return paUnanticipatedHostError; - } + // Get available frames (must be finding out available frames before call to IAudioCaptureClient_GetBuffer + // othervise audio glitches will occur inExclusive mode as it seems that WASAPI has some scheduling/ + // processing problems when such busy polling with IAudioCaptureClient_GetBuffer occurs) + if ((hr = _PollGetInputFramesAvailable(stream, &available)) != S_OK) + { + LogHostError(hr); + return paUnanticipatedHostError; + } - // Wait for more frames to become available - if (available == 0) - { - // Exclusive mode may require latency of 1 millisecond, thus we shall sleep - // around 500 microseconds (emulated) to collect packets in time - if (stream->in.shareMode != AUDCLNT_SHAREMODE_EXCLUSIVE) - { - UINT32 sleep_frames = (frames < stream->in.framesPerHostCallback ? frames : stream->in.framesPerHostCallback); + // Wait for more frames to become available + if (available == 0) + { + // Exclusive mode may require latency of 1 millisecond, thus we shall sleep + // around 500 microseconds (emulated) to collect packets in time + if (stream->in.shareMode != AUDCLNT_SHAREMODE_EXCLUSIVE) + { + UINT32 sleep_frames = (frames < stream->in.framesPerHostCallback ? frames : stream->in.framesPerHostCallback); - sleep = GetFramesSleepTime(sleep_frames, stream->in.wavex.Format.nSamplesPerSec); - sleep /= 4; // wait only for 1/4 of the buffer + sleep = GetFramesSleepTime(sleep_frames, stream->in.wavex.Format.nSamplesPerSec); + sleep /= 4; // wait only for 1/4 of the buffer - // WASAPI input provides packets, thus expiring packet will result in bad audio - // limit waiting time to 2 seconds (will always work for smallest buffer in Shared) - if (sleep > 2) - sleep = 2; + // WASAPI input provides packets, thus expiring packet will result in bad audio + // limit waiting time to 2 seconds (will always work for smallest buffer in Shared) + if (sleep > 2) + sleep = 2; - // Avoid busy waiting, schedule next 1 millesecond wait - if (sleep == 0) - sleep = ThreadIdleScheduler_NextSleep(&sched); - } - else - { - if ((sleep = ThreadIdleScheduler_NextSleep(&sched)) != 0) - { - Sleep(sleep); - sleep = 0; - } - } + // Avoid busy waiting, schedule next 1 millesecond wait + if (sleep == 0) + sleep = ThreadIdleScheduler_NextSleep(&sched); + } + else + { + if ((sleep = ThreadIdleScheduler_NextSleep(&sched)) != 0) + { + Sleep(sleep); + sleep = 0; + } + } - continue; - } + continue; + } - // Get the available data in the shared buffer. - if ((hr = IAudioCaptureClient_GetBuffer(stream->captureClient, &wasapi_buffer, &available, &flags, NULL, NULL)) != S_OK) - { - // Buffer size is too small, waiting - if (hr != AUDCLNT_S_BUFFER_EMPTY) - { - LogHostError(hr); - goto end; - } + // Get the available data in the shared buffer. + if ((hr = IAudioCaptureClient_GetBuffer(stream->captureClient, &wasapi_buffer, &available, &flags, NULL, NULL)) != S_OK) + { + // Buffer size is too small, waiting + if (hr != AUDCLNT_S_BUFFER_EMPTY) + { + LogHostError(hr); + goto end; + } - continue; - } + continue; + } - // Register available frames to processor + // Register available frames to processor PaUtil_SetInputFrameCount(&stream->bufferProcessor, available); - // Register host buffer pointer to processor + // Register host buffer pointer to processor PaUtil_SetInterleavedInputChannels(&stream->bufferProcessor, 0, wasapi_buffer, stream->bufferProcessor.inputChannelCount); - // Copy user data to host buffer (with conversion if applicable) - processed = PaUtil_CopyInput(&stream->bufferProcessor, (void **)&user_buffer, frames); - frames -= processed; + // Copy user data to host buffer (with conversion if applicable) + processed = PaUtil_CopyInput(&stream->bufferProcessor, (void **)&user_buffer, frames); + frames -= processed; - // Save tail into buffer - if ((frames == 0) && (available > processed)) - { - UINT32 bytes_processed = processed * stream->in.wavex.Format.nBlockAlign; - UINT32 frames_to_save = available - processed; + // Save tail into buffer + if ((frames == 0) && (available > processed)) + { + UINT32 bytes_processed = processed * stream->in.wavex.Format.nBlockAlign; + UINT32 frames_to_save = available - processed; - PaUtil_WriteRingBuffer(stream->in.tailBuffer, wasapi_buffer + bytes_processed, frames_to_save); - } + PaUtil_WriteRingBuffer(stream->in.tailBuffer, wasapi_buffer + bytes_processed, frames_to_save); + } - // Release host buffer - if ((hr = IAudioCaptureClient_ReleaseBuffer(stream->captureClient, available)) != S_OK) - { - LogHostError(hr); - goto end; - } - } + // Release host buffer + if ((hr = IAudioCaptureClient_ReleaseBuffer(stream->captureClient, available)) != S_OK) + { + LogHostError(hr); + goto end; + } + } end: - // Notify blocking op has ended - SetEvent(stream->hBlockingOpStreamRD); + // Notify blocking op has ended + SetEvent(stream->hBlockingOpStreamRD); - return (hr != S_OK ? paUnanticipatedHostError : paNoError); + return (hr != S_OK ? paUnanticipatedHostError : paNoError); } // ------------------------------------------------------------------------------------------ @@ -4642,29 +4642,29 @@ static PaError WriteStream( PaStream* s, const void *_buffer, unsigned long fram { PaWasapiStream *stream = (PaWasapiStream*)s; - //UINT32 frames; - const BYTE *user_buffer = (const BYTE *)_buffer; - BYTE *wasapi_buffer; - HRESULT hr = S_OK; - UINT32 i, available, sleep = 0; - unsigned long processed; - ThreadIdleScheduler sched; + //UINT32 frames; + const BYTE *user_buffer = (const BYTE *)_buffer; + BYTE *wasapi_buffer; + HRESULT hr = S_OK; + UINT32 i, available, sleep = 0; + unsigned long processed; + ThreadIdleScheduler sched; - // validate - if (!stream->running) - return paStreamIsStopped; - if (stream->renderClient == NULL) - return paBadStreamPtr; + // validate + if (!stream->running) + return paStreamIsStopped; + if (stream->renderClient == NULL) + return paBadStreamPtr; - // Notify blocking op has begun - ResetEvent(stream->hBlockingOpStreamWR); + // Notify blocking op has begun + ResetEvent(stream->hBlockingOpStreamWR); - // Use thread scheduling for 500 microseconds (emulated) when wait time for frames is less than - // 1 milliseconds, emulation helps to normalize CPU consumption and avoids too busy waiting - ThreadIdleScheduler_Setup(&sched, 1, 500/* microseconds */); + // Use thread scheduling for 500 microseconds (emulated) when wait time for frames is less than + // 1 milliseconds, emulation helps to normalize CPU consumption and avoids too busy waiting + ThreadIdleScheduler_Setup(&sched, 1, 500/* microseconds */); // Make a local copy of the user buffer pointer(s), this is necessary - // because PaUtil_CopyOutput() advances these pointers every time it is called + // because PaUtil_CopyOutput() advances these pointers every time it is called if (!stream->bufferProcessor.userOutputIsInterleaved) { user_buffer = (const BYTE *)alloca(sizeof(const BYTE *) * stream->bufferProcessor.outputChannelCount); @@ -4675,85 +4675,85 @@ static PaError WriteStream( PaStream* s, const void *_buffer, unsigned long fram ((const BYTE **)user_buffer)[i] = ((const BYTE **)_buffer)[i]; } - // Blocking (potentially, untill 'frames' are consumed) loop - while (frames != 0) - { - // Check if blocking call must be interrupted - if (WaitForSingleObject(stream->hCloseRequest, sleep) != WAIT_TIMEOUT) - break; + // Blocking (potentially, untill 'frames' are consumed) loop + while (frames != 0) + { + // Check if blocking call must be interrupted + if (WaitForSingleObject(stream->hCloseRequest, sleep) != WAIT_TIMEOUT) + break; - // Get frames available - if ((hr = _PollGetOutputFramesAvailable(stream, &available)) != S_OK) - { - LogHostError(hr); - goto end; - } + // Get frames available + if ((hr = _PollGetOutputFramesAvailable(stream, &available)) != S_OK) + { + LogHostError(hr); + goto end; + } - // Wait for more frames to become available - if (available == 0) - { - UINT32 sleep_frames = (frames < stream->out.framesPerHostCallback ? frames : stream->out.framesPerHostCallback); + // Wait for more frames to become available + if (available == 0) + { + UINT32 sleep_frames = (frames < stream->out.framesPerHostCallback ? frames : stream->out.framesPerHostCallback); - sleep = GetFramesSleepTime(sleep_frames, stream->out.wavex.Format.nSamplesPerSec); - sleep /= 2; // wait only for half of the buffer + sleep = GetFramesSleepTime(sleep_frames, stream->out.wavex.Format.nSamplesPerSec); + sleep /= 2; // wait only for half of the buffer - // Avoid busy waiting, schedule next 1 millesecond wait - if (sleep == 0) - sleep = ThreadIdleScheduler_NextSleep(&sched); + // Avoid busy waiting, schedule next 1 millesecond wait + if (sleep == 0) + sleep = ThreadIdleScheduler_NextSleep(&sched); - continue; - } + continue; + } - // Keep in 'frames' range - if (available > frames) - available = frames; + // Keep in 'frames' range + if (available > frames) + available = frames; - // Get pointer to host buffer - if ((hr = IAudioRenderClient_GetBuffer(stream->renderClient, available, &wasapi_buffer)) != S_OK) - { - // Buffer size is too big, waiting - if (hr == AUDCLNT_E_BUFFER_TOO_LARGE) - continue; + // Get pointer to host buffer + if ((hr = IAudioRenderClient_GetBuffer(stream->renderClient, available, &wasapi_buffer)) != S_OK) + { + // Buffer size is too big, waiting + if (hr == AUDCLNT_E_BUFFER_TOO_LARGE) + continue; - LogHostError(hr); - goto end; - } + LogHostError(hr); + goto end; + } - // Keep waiting again (on Vista it was noticed that WASAPI could SOMETIMES return NULL pointer - // to buffer without returning AUDCLNT_E_BUFFER_TOO_LARGE instead) - if (wasapi_buffer == NULL) - continue; + // Keep waiting again (on Vista it was noticed that WASAPI could SOMETIMES return NULL pointer + // to buffer without returning AUDCLNT_E_BUFFER_TOO_LARGE instead) + if (wasapi_buffer == NULL) + continue; - // Register available frames to processor + // Register available frames to processor PaUtil_SetOutputFrameCount(&stream->bufferProcessor, available); - // Register host buffer pointer to processor - PaUtil_SetInterleavedOutputChannels(&stream->bufferProcessor, 0, wasapi_buffer, stream->bufferProcessor.outputChannelCount); + // Register host buffer pointer to processor + PaUtil_SetInterleavedOutputChannels(&stream->bufferProcessor, 0, wasapi_buffer, stream->bufferProcessor.outputChannelCount); - // Copy user data to host buffer (with conversion if applicable), this call will advance - // pointer 'user_buffer' to consumed portion of data - processed = PaUtil_CopyOutput(&stream->bufferProcessor, (const void **)&user_buffer, frames); - frames -= processed; + // Copy user data to host buffer (with conversion if applicable), this call will advance + // pointer 'user_buffer' to consumed portion of data + processed = PaUtil_CopyOutput(&stream->bufferProcessor, (const void **)&user_buffer, frames); + frames -= processed; - // Release host buffer - if ((hr = IAudioRenderClient_ReleaseBuffer(stream->renderClient, available, 0)) != S_OK) - { - LogHostError(hr); - goto end; - } - } + // Release host buffer + if ((hr = IAudioRenderClient_ReleaseBuffer(stream->renderClient, available, 0)) != S_OK) + { + LogHostError(hr); + goto end; + } + } end: - // Notify blocking op has ended - SetEvent(stream->hBlockingOpStreamWR); + // Notify blocking op has ended + SetEvent(stream->hBlockingOpStreamWR); - return (hr != S_OK ? paUnanticipatedHostError : paNoError); + return (hr != S_OK ? paUnanticipatedHostError : paNoError); } unsigned long PaUtil_GetOutputFrameCount( PaUtilBufferProcessor* bp ) { - return bp->hostOutputFrameCount[0]; + return bp->hostOutputFrameCount[0]; } // ------------------------------------------------------------------------------------------ @@ -4761,24 +4761,24 @@ static signed long GetStreamReadAvailable( PaStream* s ) { PaWasapiStream *stream = (PaWasapiStream*)s; - HRESULT hr; - UINT32 available = 0; + HRESULT hr; + UINT32 available = 0; - // validate - if (!stream->running) - return paStreamIsStopped; - if (stream->captureClient == NULL) - return paBadStreamPtr; + // validate + if (!stream->running) + return paStreamIsStopped; + if (stream->captureClient == NULL) + return paBadStreamPtr; - // available in hardware buffer - if ((hr = _PollGetInputFramesAvailable(stream, &available)) != S_OK) - { - LogHostError(hr); - return paUnanticipatedHostError; - } + // available in hardware buffer + if ((hr = _PollGetInputFramesAvailable(stream, &available)) != S_OK) + { + LogHostError(hr); + return paUnanticipatedHostError; + } - // available in software tail buffer - available += PaUtil_GetRingBufferReadAvailable(stream->in.tailBuffer); + // available in software tail buffer + available += PaUtil_GetRingBufferReadAvailable(stream->in.tailBuffer); return available; } @@ -4787,22 +4787,22 @@ static signed long GetStreamReadAvailable( PaStream* s ) static signed long GetStreamWriteAvailable( PaStream* s ) { PaWasapiStream *stream = (PaWasapiStream*)s; - HRESULT hr; - UINT32 available = 0; + HRESULT hr; + UINT32 available = 0; - // validate - if (!stream->running) - return paStreamIsStopped; - if (stream->renderClient == NULL) - return paBadStreamPtr; + // validate + if (!stream->running) + return paStreamIsStopped; + if (stream->renderClient == NULL) + return paBadStreamPtr; - if ((hr = _PollGetOutputFramesAvailable(stream, &available)) != S_OK) - { - LogHostError(hr); - return paUnanticipatedHostError; - } + if ((hr = _PollGetOutputFramesAvailable(stream, &available)) != S_OK) + { + LogHostError(hr); + return paUnanticipatedHostError; + } - return (signed long)available; + return (signed long)available; } @@ -4813,42 +4813,42 @@ static void WaspiHostProcessingLoop( void *inputBuffer, long inputFrames, { PaWasapiStream *stream = (PaWasapiStream*)userData; PaStreamCallbackTimeInfo timeInfo = {0,0,0}; - PaStreamCallbackFlags flags = 0; + PaStreamCallbackFlags flags = 0; int callbackResult; unsigned long framesProcessed; - HRESULT hr; - UINT32 pending; + HRESULT hr; + UINT32 pending; PaUtil_BeginCpuLoadMeasurement( &stream->cpuLoadMeasurer ); /* - Pa_GetStreamTime: + Pa_GetStreamTime: - generate timing information - handle buffer slips */ - timeInfo.currentTime = PaUtil_GetTime(); - // Query input latency - if (stream->in.clientProc != NULL) - { - PaTime pending_time; - if ((hr = IAudioClient_GetCurrentPadding(stream->in.clientProc, &pending)) == S_OK) - pending_time = (PaTime)pending / (PaTime)stream->in.wavex.Format.nSamplesPerSec; - else - pending_time = (PaTime)stream->in.latencySeconds; + timeInfo.currentTime = PaUtil_GetTime(); + // Query input latency + if (stream->in.clientProc != NULL) + { + PaTime pending_time; + if ((hr = IAudioClient_GetCurrentPadding(stream->in.clientProc, &pending)) == S_OK) + pending_time = (PaTime)pending / (PaTime)stream->in.wavex.Format.nSamplesPerSec; + else + pending_time = (PaTime)stream->in.latencySeconds; - timeInfo.inputBufferAdcTime = timeInfo.currentTime + pending_time; - } - // Query output current latency - if (stream->out.clientProc != NULL) - { - PaTime pending_time; - if ((hr = IAudioClient_GetCurrentPadding(stream->out.clientProc, &pending)) == S_OK) - pending_time = (PaTime)pending / (PaTime)stream->out.wavex.Format.nSamplesPerSec; - else - pending_time = (PaTime)stream->out.latencySeconds; + timeInfo.inputBufferAdcTime = timeInfo.currentTime + pending_time; + } + // Query output current latency + if (stream->out.clientProc != NULL) + { + PaTime pending_time; + if ((hr = IAudioClient_GetCurrentPadding(stream->out.clientProc, &pending)) == S_OK) + pending_time = (PaTime)pending / (PaTime)stream->out.wavex.Format.nSamplesPerSec; + else + pending_time = (PaTime)stream->out.latencySeconds; - timeInfo.outputBufferDacTime = timeInfo.currentTime + pending_time; - } + timeInfo.outputBufferDacTime = timeInfo.currentTime + pending_time; + } /* If you need to byte swap or shift inputBuffer to convert it into a @@ -4895,21 +4895,21 @@ static void WaspiHostProcessingLoop( void *inputBuffer, long inputFrames, host format, do it here. */ - PaUtil_EndCpuLoadMeasurement( &stream->cpuLoadMeasurer, framesProcessed ); + PaUtil_EndCpuLoadMeasurement( &stream->cpuLoadMeasurer, framesProcessed ); if (callbackResult == paContinue) { /* nothing special to do */ } else - if (callbackResult == paAbort) + if (callbackResult == paAbort) { - // stop stream + // stop stream SetEvent(stream->hCloseRequest); } else { - // stop stream + // stop stream SetEvent(stream->hCloseRequest); } } @@ -4918,45 +4918,45 @@ static void WaspiHostProcessingLoop( void *inputBuffer, long inputFrames, #ifndef PA_WINRT static PaError MMCSS_activate(PaWasapiThreadPriority nPriorityClass, HANDLE *ret) { - static const char *mmcs_name[] = - { - NULL, - "Audio", - "Capture", - "Distribution", - "Games", - "Playback", - "Pro Audio", - "Window Manager" - }; + static const char *mmcs_name[] = + { + NULL, + "Audio", + "Capture", + "Distribution", + "Games", + "Playback", + "Pro Audio", + "Window Manager" + }; DWORD task_idx = 0; HANDLE hTask; - - if ((UINT32)nPriorityClass >= STATIC_ARRAY_SIZE(mmcs_name)) - return paUnanticipatedHostError; - + + if ((UINT32)nPriorityClass >= STATIC_ARRAY_SIZE(mmcs_name)) + return paUnanticipatedHostError; + if ((hTask = pAvSetMmThreadCharacteristics(mmcs_name[nPriorityClass], &task_idx)) == NULL) - { + { PRINT(("WASAPI: AvSetMmThreadCharacteristics failed: error[%d]\n", GetLastError())); - return paUnanticipatedHostError; + return paUnanticipatedHostError; } /*BOOL priority_ok = pAvSetMmThreadPriority(hTask, AVRT_PRIORITY_NORMAL); if (priority_ok == FALSE) - { + { PRINT(("WASAPI: AvSetMmThreadPriority failed!\n")); }*/ - // debug + // debug { - int cur_priority = GetThreadPriority(GetCurrentThread()); + int cur_priority = GetThreadPriority(GetCurrentThread()); DWORD cur_priority_class = GetPriorityClass(GetCurrentProcess()); - PRINT(("WASAPI: thread[ priority-0x%X class-0x%X ]\n", cur_priority, cur_priority_class)); + PRINT(("WASAPI: thread[ priority-0x%X class-0x%X ]\n", cur_priority, cur_priority_class)); } - (*ret) = hTask; - return paNoError; + (*ret) = hTask; + return paNoError; } #endif @@ -4964,8 +4964,8 @@ static PaError MMCSS_activate(PaWasapiThreadPriority nPriorityClass, HANDLE *ret #ifndef PA_WINRT static void MMCSS_deactivate(HANDLE hTask) { - if (pAvRevertMmThreadCharacteristics(hTask) == FALSE) - { + if (pAvRevertMmThreadCharacteristics(hTask) == FALSE) + { PRINT(("WASAPI: AvRevertMmThreadCharacteristics failed!\n")); } } @@ -4974,59 +4974,59 @@ static void MMCSS_deactivate(HANDLE hTask) // ------------------------------------------------------------------------------------------ PaError PaWasapi_ThreadPriorityBoost(void **pTask, PaWasapiThreadPriority priorityClass) { - HANDLE task; - PaError ret; + HANDLE task; + PaError ret; - if (pTask == NULL) - return paUnanticipatedHostError; + if (pTask == NULL) + return paUnanticipatedHostError; #ifndef PA_WINRT - if ((ret = MMCSS_activate(priorityClass, &task)) != paNoError) - return ret; + if ((ret = MMCSS_activate(priorityClass, &task)) != paNoError) + return ret; #else - switch (priorityClass) - { - case eThreadPriorityAudio: - case eThreadPriorityProAudio: { + switch (priorityClass) + { + case eThreadPriorityAudio: + case eThreadPriorityProAudio: { - // Save previous thread priority - intptr_t priority_prev = GetThreadPriority(GetCurrentThread()); + // Save previous thread priority + intptr_t priority_prev = GetThreadPriority(GetCurrentThread()); - // Try set new thread priority - if (SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_HIGHEST) == FALSE) - return paUnanticipatedHostError; + // Try set new thread priority + if (SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_HIGHEST) == FALSE) + return paUnanticipatedHostError; - // Memorize prev priority (pretend to be non NULL pointer by adding 0x80000000 mask) - task = (HANDLE)(priority_prev | 0x80000000); + // Memorize prev priority (pretend to be non NULL pointer by adding 0x80000000 mask) + task = (HANDLE)(priority_prev | 0x80000000); - ret = paNoError; + ret = paNoError; - break; } + break; } - default: - return paUnanticipatedHostError; - } + default: + return paUnanticipatedHostError; + } #endif - (*pTask) = task; - return ret; + (*pTask) = task; + return ret; } // ------------------------------------------------------------------------------------------ PaError PaWasapi_ThreadPriorityRevert(void *pTask) { - if (pTask == NULL) - return paUnanticipatedHostError; + if (pTask == NULL) + return paUnanticipatedHostError; #ifndef PA_WINRT - MMCSS_deactivate((HANDLE)pTask); + MMCSS_deactivate((HANDLE)pTask); #else - // Revert previous priority by removing 0x80000000 mask - if (SetThreadPriority(GetCurrentThread(), (int)((intptr_t)pTask & ~0x80000000)) == FALSE) - return paUnanticipatedHostError; + // Revert previous priority by removing 0x80000000 mask + if (SetThreadPriority(GetCurrentThread(), (int)((intptr_t)pTask & ~0x80000000)) == FALSE) + return paUnanticipatedHostError; #endif - return paNoError; + return paNoError; } // ------------------------------------------------------------------------------------------ @@ -5036,82 +5036,82 @@ PaError PaWasapi_ThreadPriorityRevert(void *pTask) PaError PaWasapi_GetJackCount(PaDeviceIndex device, int *pJackCount) { #ifndef PA_WINRT - PaError ret; - HRESULT hr = S_OK; - PaDeviceIndex index; + PaError ret; + HRESULT hr = S_OK; + PaDeviceIndex index; IDeviceTopology *pDeviceTopology = NULL; IConnector *pConnFrom = NULL; IConnector *pConnTo = NULL; IPart *pPart = NULL; IKsJackDescription *pJackDesc = NULL; - UINT jackCount = 0; + UINT jackCount = 0; - PaWasapiHostApiRepresentation *paWasapi = _GetHostApi(&ret); - if (paWasapi == NULL) - return paNotInitialized; + PaWasapiHostApiRepresentation *paWasapi = _GetHostApi(&ret); + if (paWasapi == NULL) + return paNotInitialized; - if (pJackCount == NULL) - return paUnanticipatedHostError; + if (pJackCount == NULL) + return paUnanticipatedHostError; - // Get device index - ret = PaUtil_DeviceIndexToHostApiDeviceIndex(&index, device, &paWasapi->inheritedHostApiRep); + // Get device index + ret = PaUtil_DeviceIndexToHostApiDeviceIndex(&index, device, &paWasapi->inheritedHostApiRep); if (ret != paNoError) return ret; - // Validate index - if ((UINT32)index >= paWasapi->deviceCount) - return paInvalidDevice; + // Validate index + if ((UINT32)index >= paWasapi->deviceCount) + return paInvalidDevice; - // Get the endpoint device's IDeviceTopology interface - hr = IMMDevice_Activate(paWasapi->devInfo[index].device, &pa_IID_IDeviceTopology, - CLSCTX_INPROC_SERVER, NULL, (void**)&pDeviceTopology); - IF_FAILED_JUMP(hr, error); + // Get the endpoint device's IDeviceTopology interface + hr = IMMDevice_Activate(paWasapi->devInfo[index].device, &pa_IID_IDeviceTopology, + CLSCTX_INPROC_SERVER, NULL, (void**)&pDeviceTopology); + IF_FAILED_JUMP(hr, error); // The device topology for an endpoint device always contains just one connector (connector number 0) - hr = IDeviceTopology_GetConnector(pDeviceTopology, 0, &pConnFrom); - IF_FAILED_JUMP(hr, error); + hr = IDeviceTopology_GetConnector(pDeviceTopology, 0, &pConnFrom); + IF_FAILED_JUMP(hr, error); // Step across the connection to the jack on the adapter - hr = IConnector_GetConnectedTo(pConnFrom, &pConnTo); + hr = IConnector_GetConnectedTo(pConnFrom, &pConnTo); if (HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND) == hr) { // The adapter device is not currently active hr = E_NOINTERFACE; } - IF_FAILED_JUMP(hr, error); + IF_FAILED_JUMP(hr, error); - // Get the connector's IPart interface - hr = IConnector_QueryInterface(pConnTo, &pa_IID_IPart, (void**)&pPart); - IF_FAILED_JUMP(hr, error); + // Get the connector's IPart interface + hr = IConnector_QueryInterface(pConnTo, &pa_IID_IPart, (void**)&pPart); + IF_FAILED_JUMP(hr, error); - // Activate the connector's IKsJackDescription interface - hr = IPart_Activate(pPart, CLSCTX_INPROC_SERVER, &pa_IID_IKsJackDescription, (void**)&pJackDesc); - IF_FAILED_JUMP(hr, error); + // Activate the connector's IKsJackDescription interface + hr = IPart_Activate(pPart, CLSCTX_INPROC_SERVER, &pa_IID_IKsJackDescription, (void**)&pJackDesc); + IF_FAILED_JUMP(hr, error); - // Return jack count for this device - hr = IKsJackDescription_GetJackCount(pJackDesc, &jackCount); - IF_FAILED_JUMP(hr, error); + // Return jack count for this device + hr = IKsJackDescription_GetJackCount(pJackDesc, &jackCount); + IF_FAILED_JUMP(hr, error); - // Set. - (*pJackCount) = jackCount; + // Set. + (*pJackCount) = jackCount; - // Ok. - ret = paNoError; + // Ok. + ret = paNoError; error: - SAFE_RELEASE(pDeviceTopology); - SAFE_RELEASE(pConnFrom); - SAFE_RELEASE(pConnTo); - SAFE_RELEASE(pPart); - SAFE_RELEASE(pJackDesc); + SAFE_RELEASE(pDeviceTopology); + SAFE_RELEASE(pConnFrom); + SAFE_RELEASE(pConnTo); + SAFE_RELEASE(pPart); + SAFE_RELEASE(pJackDesc); - LogHostError(hr); - return paNoError; + LogHostError(hr); + return paNoError; #else - (void)device; - (void)pJackCount; - return paUnanticipatedHostError; + (void)device; + (void)pJackCount; + return paUnanticipatedHostError; #endif } @@ -5119,26 +5119,26 @@ error: #ifndef PA_WINRT static PaWasapiJackConnectionType _ConvertJackConnectionTypeWASAPIToPA(int connType) { - switch (connType) - { - case eConnTypeUnknown: return eJackConnTypeUnknown; + switch (connType) + { + case eConnTypeUnknown: return eJackConnTypeUnknown; #ifdef _KS_ - case eConnType3Point5mm: return eJackConnType3Point5mm; + case eConnType3Point5mm: return eJackConnType3Point5mm; #else - case eConnTypeEighth: return eJackConnType3Point5mm; + case eConnTypeEighth: return eJackConnType3Point5mm; #endif - case eConnTypeQuarter: return eJackConnTypeQuarter; - case eConnTypeAtapiInternal: return eJackConnTypeAtapiInternal; - case eConnTypeRCA: return eJackConnTypeRCA; - case eConnTypeOptical: return eJackConnTypeOptical; - case eConnTypeOtherDigital: return eJackConnTypeOtherDigital; - case eConnTypeOtherAnalog: return eJackConnTypeOtherAnalog; - case eConnTypeMultichannelAnalogDIN: return eJackConnTypeMultichannelAnalogDIN; - case eConnTypeXlrProfessional: return eJackConnTypeXlrProfessional; - case eConnTypeRJ11Modem: return eJackConnTypeRJ11Modem; - case eConnTypeCombination: return eJackConnTypeCombination; - } - return eJackConnTypeUnknown; + case eConnTypeQuarter: return eJackConnTypeQuarter; + case eConnTypeAtapiInternal: return eJackConnTypeAtapiInternal; + case eConnTypeRCA: return eJackConnTypeRCA; + case eConnTypeOptical: return eJackConnTypeOptical; + case eConnTypeOtherDigital: return eJackConnTypeOtherDigital; + case eConnTypeOtherAnalog: return eJackConnTypeOtherAnalog; + case eConnTypeMultichannelAnalogDIN: return eJackConnTypeMultichannelAnalogDIN; + case eConnTypeXlrProfessional: return eJackConnTypeXlrProfessional; + case eConnTypeRJ11Modem: return eJackConnTypeRJ11Modem; + case eConnTypeCombination: return eJackConnTypeCombination; + } + return eJackConnTypeUnknown; } #endif @@ -5146,27 +5146,27 @@ static PaWasapiJackConnectionType _ConvertJackConnectionTypeWASAPIToPA(int connT #ifndef PA_WINRT static PaWasapiJackGeoLocation _ConvertJackGeoLocationWASAPIToPA(int geoLoc) { - switch (geoLoc) - { - case eGeoLocRear: return eJackGeoLocRear; - case eGeoLocFront: return eJackGeoLocFront; - case eGeoLocLeft: return eJackGeoLocLeft; - case eGeoLocRight: return eJackGeoLocRight; - case eGeoLocTop: return eJackGeoLocTop; - case eGeoLocBottom: return eJackGeoLocBottom; + switch (geoLoc) + { + case eGeoLocRear: return eJackGeoLocRear; + case eGeoLocFront: return eJackGeoLocFront; + case eGeoLocLeft: return eJackGeoLocLeft; + case eGeoLocRight: return eJackGeoLocRight; + case eGeoLocTop: return eJackGeoLocTop; + case eGeoLocBottom: return eJackGeoLocBottom; #ifdef _KS_ - case eGeoLocRearPanel: return eJackGeoLocRearPanel; + case eGeoLocRearPanel: return eJackGeoLocRearPanel; #else - case eGeoLocRearOPanel: return eJackGeoLocRearPanel; + case eGeoLocRearOPanel: return eJackGeoLocRearPanel; #endif - case eGeoLocRiser: return eJackGeoLocRiser; - case eGeoLocInsideMobileLid: return eJackGeoLocInsideMobileLid; - case eGeoLocDrivebay: return eJackGeoLocDrivebay; - case eGeoLocHDMI: return eJackGeoLocHDMI; - case eGeoLocOutsideMobileLid: return eJackGeoLocOutsideMobileLid; - case eGeoLocATAPI: return eJackGeoLocATAPI; - } - return eJackGeoLocUnk; + case eGeoLocRiser: return eJackGeoLocRiser; + case eGeoLocInsideMobileLid: return eJackGeoLocInsideMobileLid; + case eGeoLocDrivebay: return eJackGeoLocDrivebay; + case eGeoLocHDMI: return eJackGeoLocHDMI; + case eGeoLocOutsideMobileLid: return eJackGeoLocOutsideMobileLid; + case eGeoLocATAPI: return eJackGeoLocATAPI; + } + return eJackGeoLocUnk; } #endif @@ -5174,18 +5174,18 @@ static PaWasapiJackGeoLocation _ConvertJackGeoLocationWASAPIToPA(int geoLoc) #ifndef PA_WINRT static PaWasapiJackGenLocation _ConvertJackGenLocationWASAPIToPA(int genLoc) { - switch (genLoc) - { - case eGenLocPrimaryBox: return eJackGenLocPrimaryBox; - case eGenLocInternal: return eJackGenLocInternal; + switch (genLoc) + { + case eGenLocPrimaryBox: return eJackGenLocPrimaryBox; + case eGenLocInternal: return eJackGenLocInternal; #ifdef _KS_ - case eGenLocSeparate: return eJackGenLocSeparate; + case eGenLocSeparate: return eJackGenLocSeparate; #else - case eGenLocSeperate: return eJackGenLocSeparate; + case eGenLocSeperate: return eJackGenLocSeparate; #endif - case eGenLocOther: return eJackGenLocOther; - } - return eJackGenLocPrimaryBox; + case eGenLocOther: return eJackGenLocOther; + } + return eJackGenLocPrimaryBox; } #endif @@ -5193,14 +5193,14 @@ static PaWasapiJackGenLocation _ConvertJackGenLocationWASAPIToPA(int genLoc) #ifndef PA_WINRT static PaWasapiJackPortConnection _ConvertJackPortConnectionWASAPIToPA(int portConn) { - switch (portConn) - { - case ePortConnJack: return eJackPortConnJack; - case ePortConnIntegratedDevice: return eJackPortConnIntegratedDevice; - case ePortConnBothIntegratedAndJack:return eJackPortConnBothIntegratedAndJack; - case ePortConnUnknown: return eJackPortConnUnknown; - } - return eJackPortConnJack; + switch (portConn) + { + case ePortConnJack: return eJackPortConnJack; + case ePortConnIntegratedDevice: return eJackPortConnIntegratedDevice; + case ePortConnBothIntegratedAndJack: return eJackPortConnBothIntegratedAndJack; + case ePortConnUnknown: return eJackPortConnUnknown; + } + return eJackPortConnJack; } #endif @@ -5211,378 +5211,378 @@ static PaWasapiJackPortConnection _ConvertJackPortConnectionWASAPIToPA(int portC PaError PaWasapi_GetJackDescription(PaDeviceIndex device, int jackIndex, PaWasapiJackDescription *pJackDescription) { #ifndef PA_WINRT - PaError ret; - HRESULT hr = S_OK; - PaDeviceIndex index; + PaError ret; + HRESULT hr = S_OK; + PaDeviceIndex index; IDeviceTopology *pDeviceTopology = NULL; IConnector *pConnFrom = NULL; IConnector *pConnTo = NULL; IPart *pPart = NULL; IKsJackDescription *pJackDesc = NULL; - KSJACK_DESCRIPTION jack = { 0 }; + KSJACK_DESCRIPTION jack = { 0 }; - PaWasapiHostApiRepresentation *paWasapi = _GetHostApi(&ret); - if (paWasapi == NULL) - return paNotInitialized; + PaWasapiHostApiRepresentation *paWasapi = _GetHostApi(&ret); + if (paWasapi == NULL) + return paNotInitialized; - // Get device index - ret = PaUtil_DeviceIndexToHostApiDeviceIndex(&index, device, &paWasapi->inheritedHostApiRep); + // Get device index + ret = PaUtil_DeviceIndexToHostApiDeviceIndex(&index, device, &paWasapi->inheritedHostApiRep); if (ret != paNoError) return ret; - // Validate index - if ((UINT32)index >= paWasapi->deviceCount) - return paInvalidDevice; + // Validate index + if ((UINT32)index >= paWasapi->deviceCount) + return paInvalidDevice; - // Get the endpoint device's IDeviceTopology interface - hr = IMMDevice_Activate(paWasapi->devInfo[index].device, &pa_IID_IDeviceTopology, - CLSCTX_INPROC_SERVER, NULL, (void**)&pDeviceTopology); - IF_FAILED_JUMP(hr, error); + // Get the endpoint device's IDeviceTopology interface + hr = IMMDevice_Activate(paWasapi->devInfo[index].device, &pa_IID_IDeviceTopology, + CLSCTX_INPROC_SERVER, NULL, (void**)&pDeviceTopology); + IF_FAILED_JUMP(hr, error); // The device topology for an endpoint device always contains just one connector (connector number 0) - hr = IDeviceTopology_GetConnector(pDeviceTopology, 0, &pConnFrom); - IF_FAILED_JUMP(hr, error); + hr = IDeviceTopology_GetConnector(pDeviceTopology, 0, &pConnFrom); + IF_FAILED_JUMP(hr, error); // Step across the connection to the jack on the adapter - hr = IConnector_GetConnectedTo(pConnFrom, &pConnTo); + hr = IConnector_GetConnectedTo(pConnFrom, &pConnTo); if (HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND) == hr) { // The adapter device is not currently active hr = E_NOINTERFACE; } - IF_FAILED_JUMP(hr, error); + IF_FAILED_JUMP(hr, error); - // Get the connector's IPart interface - hr = IConnector_QueryInterface(pConnTo, &pa_IID_IPart, (void**)&pPart); - IF_FAILED_JUMP(hr, error); + // Get the connector's IPart interface + hr = IConnector_QueryInterface(pConnTo, &pa_IID_IPart, (void**)&pPart); + IF_FAILED_JUMP(hr, error); - // Activate the connector's IKsJackDescription interface - hr = IPart_Activate(pPart, CLSCTX_INPROC_SERVER, &pa_IID_IKsJackDescription, (void**)&pJackDesc); - IF_FAILED_JUMP(hr, error); + // Activate the connector's IKsJackDescription interface + hr = IPart_Activate(pPart, CLSCTX_INPROC_SERVER, &pa_IID_IKsJackDescription, (void**)&pJackDesc); + IF_FAILED_JUMP(hr, error); - // Test to return jack description struct for index 0 - hr = IKsJackDescription_GetJackDescription(pJackDesc, jackIndex, &jack); - IF_FAILED_JUMP(hr, error); + // Test to return jack description struct for index 0 + hr = IKsJackDescription_GetJackDescription(pJackDesc, jackIndex, &jack); + IF_FAILED_JUMP(hr, error); - // Convert WASAPI values to PA format - pJackDescription->channelMapping = jack.ChannelMapping; - pJackDescription->color = jack.Color; - pJackDescription->connectionType = _ConvertJackConnectionTypeWASAPIToPA(jack.ConnectionType); - pJackDescription->genLocation = _ConvertJackGenLocationWASAPIToPA(jack.GenLocation); - pJackDescription->geoLocation = _ConvertJackGeoLocationWASAPIToPA(jack.GeoLocation); - pJackDescription->isConnected = jack.IsConnected; - pJackDescription->portConnection = _ConvertJackPortConnectionWASAPIToPA(jack.PortConnection); + // Convert WASAPI values to PA format + pJackDescription->channelMapping = jack.ChannelMapping; + pJackDescription->color = jack.Color; + pJackDescription->connectionType = _ConvertJackConnectionTypeWASAPIToPA(jack.ConnectionType); + pJackDescription->genLocation = _ConvertJackGenLocationWASAPIToPA(jack.GenLocation); + pJackDescription->geoLocation = _ConvertJackGeoLocationWASAPIToPA(jack.GeoLocation); + pJackDescription->isConnected = jack.IsConnected; + pJackDescription->portConnection = _ConvertJackPortConnectionWASAPIToPA(jack.PortConnection); - // Ok - ret = paNoError; + // Ok + ret = paNoError; error: - SAFE_RELEASE(pDeviceTopology); - SAFE_RELEASE(pConnFrom); - SAFE_RELEASE(pConnTo); - SAFE_RELEASE(pPart); - SAFE_RELEASE(pJackDesc); + SAFE_RELEASE(pDeviceTopology); + SAFE_RELEASE(pConnFrom); + SAFE_RELEASE(pConnTo); + SAFE_RELEASE(pPart); + SAFE_RELEASE(pJackDesc); - LogHostError(hr); - return ret; + LogHostError(hr); + return ret; #else - (void)device; - (void)jackIndex; - (void)pJackDescription; - return paUnanticipatedHostError; + (void)device; + (void)jackIndex; + (void)pJackDescription; + return paUnanticipatedHostError; #endif } // ------------------------------------------------------------------------------------------ PaError PaWasapi_GetAudioClient(PaStream *pStream, void **pAudioClient, int bOutput) { - PaWasapiStream *stream = (PaWasapiStream *)pStream; - if (stream == NULL) - return paBadStreamPtr; + PaWasapiStream *stream = (PaWasapiStream *)pStream; + if (stream == NULL) + return paBadStreamPtr; - if (pAudioClient == NULL) - return paUnanticipatedHostError; + if (pAudioClient == NULL) + return paUnanticipatedHostError; - (*pAudioClient) = (bOutput == TRUE ? stream->out.clientParent : stream->in.clientParent); + (*pAudioClient) = (bOutput == TRUE ? stream->out.clientParent : stream->in.clientParent); - return paNoError; + return paNoError; } // ------------------------------------------------------------------------------------------ PaError PaWasapi_SetDefaultInterfaceId( unsigned short *pId, int bOutput ) { #ifdef PA_WINRT - int i; + int i; - // Validate Id length - if (pId != NULL) - { - for (i = 0; pId[i] != 0; ++i) - { - if (i >= PA_WASAPI_DEVICE_ID_LEN) - return paBufferTooBig; - } - } + // Validate Id length + if (pId != NULL) + { + for (i = 0; pId[i] != 0; ++i) + { + if (i >= PA_WASAPI_DEVICE_ID_LEN) + return paBufferTooBig; + } + } - // Set Id (or reset to all 0 if NULL is provided) - if (bOutput) - { - memset(g_DefaultRenderId, 0, sizeof(g_DefaultRenderId)); - if (pId != NULL) - { - for (i = 0; (pId[i] != 0) && (i < STATIC_ARRAY_SIZE(g_DefaultRenderId)); ++i) - g_DefaultRenderId[i] = pId[i]; - } - } - else - { - memset(g_DefaultCaptureId, 0, sizeof(g_DefaultCaptureId)); - if (pId != NULL) - { - for (i = 0; (pId[i] != 0) && (i < STATIC_ARRAY_SIZE(g_DefaultCaptureId)); ++i) - g_DefaultCaptureId[i] = pId[i]; - } - } + // Set Id (or reset to all 0 if NULL is provided) + if (bOutput) + { + memset(g_DefaultRenderId, 0, sizeof(g_DefaultRenderId)); + if (pId != NULL) + { + for (i = 0; (pId[i] != 0) && (i < STATIC_ARRAY_SIZE(g_DefaultRenderId)); ++i) + g_DefaultRenderId[i] = pId[i]; + } + } + else + { + memset(g_DefaultCaptureId, 0, sizeof(g_DefaultCaptureId)); + if (pId != NULL) + { + for (i = 0; (pId[i] != 0) && (i < STATIC_ARRAY_SIZE(g_DefaultCaptureId)); ++i) + g_DefaultCaptureId[i] = pId[i]; + } + } - return paNoError; + return paNoError; #else - return paIncompatibleStreamHostApi; + return paIncompatibleStreamHostApi; #endif } // ------------------------------------------------------------------------------------------ PaError PaWasapi_SetStreamStateHandler( PaStream *pStream, PaWasapiStreamStateCallback fnStateHandler, void *pUserData ) { - PaWasapiStream *stream = (PaWasapiStream *)pStream; - if (stream == NULL) - return paBadStreamPtr; + PaWasapiStream *stream = (PaWasapiStream *)pStream; + if (stream == NULL) + return paBadStreamPtr; - stream->fnStateHandler = fnStateHandler; - stream->pStateHandlerUserData = pUserData; + stream->fnStateHandler = fnStateHandler; + stream->pStateHandlerUserData = pUserData; - return paNoError; + return paNoError; } // ------------------------------------------------------------------------------------------ HRESULT _PollGetOutputFramesAvailable(PaWasapiStream *stream, UINT32 *available) { - HRESULT hr; - UINT32 frames = stream->out.framesPerHostCallback, - padding = 0; + HRESULT hr; + UINT32 frames = stream->out.framesPerHostCallback, + padding = 0; - (*available) = 0; + (*available) = 0; - // get read position - if ((hr = IAudioClient_GetCurrentPadding(stream->out.clientProc, &padding)) != S_OK) - return LogHostError(hr); + // get read position + if ((hr = IAudioClient_GetCurrentPadding(stream->out.clientProc, &padding)) != S_OK) + return LogHostError(hr); - // get available - frames -= padding; + // get available + frames -= padding; - // set - (*available) = frames; - return hr; + // set + (*available) = frames; + return hr; } // ------------------------------------------------------------------------------------------ HRESULT _PollGetInputFramesAvailable(PaWasapiStream *stream, UINT32 *available) { - HRESULT hr; + HRESULT hr; - (*available) = 0; + (*available) = 0; - // GetCurrentPadding() has opposite meaning to Output stream - if ((hr = IAudioClient_GetCurrentPadding(stream->in.clientProc, available)) != S_OK) - return LogHostError(hr); + // GetCurrentPadding() has opposite meaning to Output stream + if ((hr = IAudioClient_GetCurrentPadding(stream->in.clientProc, available)) != S_OK) + return LogHostError(hr); - return hr; + return hr; } // ------------------------------------------------------------------------------------------ static HRESULT ProcessOutputBuffer(PaWasapiStream *stream, PaWasapiHostProcessor *processor, UINT32 frames) { - HRESULT hr; - BYTE *data = NULL; + HRESULT hr; + BYTE *data = NULL; - // Get buffer - if ((hr = IAudioRenderClient_GetBuffer(stream->renderClient, frames, &data)) != S_OK) - { - // Both modes, Shared and Exclusive, can fail with AUDCLNT_E_BUFFER_TOO_LARGE error - #if 0 - if (stream->out.shareMode == AUDCLNT_SHAREMODE_SHARED) - { - // Using GetCurrentPadding to overcome AUDCLNT_E_BUFFER_TOO_LARGE in - // shared mode results in no sound in Event-driven mode (MSDN does not - // document this, or is it WASAPI bug?), thus we better - // try to acquire buffer next time when GetBuffer allows to do so. - #if 0 - // Get Read position - UINT32 padding = 0; - hr = IAudioClient_GetCurrentPadding(stream->out.clientProc, &padding); - if (hr != S_OK) - return LogHostError(hr); + // Get buffer + if ((hr = IAudioRenderClient_GetBuffer(stream->renderClient, frames, &data)) != S_OK) + { + // Both modes, Shared and Exclusive, can fail with AUDCLNT_E_BUFFER_TOO_LARGE error + #if 0 + if (stream->out.shareMode == AUDCLNT_SHAREMODE_SHARED) + { + // Using GetCurrentPadding to overcome AUDCLNT_E_BUFFER_TOO_LARGE in + // shared mode results in no sound in Event-driven mode (MSDN does not + // document this, or is it WASAPI bug?), thus we better + // try to acquire buffer next time when GetBuffer allows to do so. + #if 0 + // Get Read position + UINT32 padding = 0; + hr = IAudioClient_GetCurrentPadding(stream->out.clientProc, &padding); + if (hr != S_OK) + return LogHostError(hr); - // Get frames to write - frames -= padding; - if (frames == 0) - return S_OK; + // Get frames to write + frames -= padding; + if (frames == 0) + return S_OK; - if ((hr = IAudioRenderClient_GetBuffer(stream->renderClient, frames, &data)) != S_OK) - return LogHostError(hr); - #else - if (hr == AUDCLNT_E_BUFFER_TOO_LARGE) - return S_OK; // be silent in shared mode, try again next time - #endif - } - else - return LogHostError(hr); - #else - if (hr == AUDCLNT_E_BUFFER_TOO_LARGE) - return S_OK; // try again next time + if ((hr = IAudioRenderClient_GetBuffer(stream->renderClient, frames, &data)) != S_OK) + return LogHostError(hr); + #else + if (hr == AUDCLNT_E_BUFFER_TOO_LARGE) + return S_OK; // be silent in shared mode, try again next time + #endif + } + else + return LogHostError(hr); + #else + if (hr == AUDCLNT_E_BUFFER_TOO_LARGE) + return S_OK; // try again next time - return LogHostError(hr); - #endif - } + return LogHostError(hr); + #endif + } - // Process data - if (stream->out.monoMixer != NULL) - { - // expand buffer - UINT32 mono_frames_size = frames * (stream->out.wavex.Format.wBitsPerSample / 8); - if (mono_frames_size > stream->out.monoBufferSize) - { - stream->out.monoBuffer = PaWasapi_ReallocateMemory(stream->out.monoBuffer, (stream->out.monoBufferSize = mono_frames_size)); - if (stream->out.monoBuffer == NULL) - { - hr = E_OUTOFMEMORY; - LogHostError(hr); - return hr; - } - } + // Process data + if (stream->out.monoMixer != NULL) + { + // expand buffer + UINT32 mono_frames_size = frames * (stream->out.wavex.Format.wBitsPerSample / 8); + if (mono_frames_size > stream->out.monoBufferSize) + { + stream->out.monoBuffer = PaWasapi_ReallocateMemory(stream->out.monoBuffer, (stream->out.monoBufferSize = mono_frames_size)); + if (stream->out.monoBuffer == NULL) + { + hr = E_OUTOFMEMORY; + LogHostError(hr); + return hr; + } + } - // process - processor[S_OUTPUT].processor(NULL, 0, (BYTE *)stream->out.monoBuffer, frames, processor[S_OUTPUT].userData); + // process + processor[S_OUTPUT].processor(NULL, 0, (BYTE *)stream->out.monoBuffer, frames, processor[S_OUTPUT].userData); - // mix 1 to 2 channels - stream->out.monoMixer(data, stream->out.monoBuffer, frames); - } - else - { - processor[S_OUTPUT].processor(NULL, 0, data, frames, processor[S_OUTPUT].userData); - } + // mix 1 to 2 channels + stream->out.monoMixer(data, stream->out.monoBuffer, frames); + } + else + { + processor[S_OUTPUT].processor(NULL, 0, data, frames, processor[S_OUTPUT].userData); + } - // Release buffer - if ((hr = IAudioRenderClient_ReleaseBuffer(stream->renderClient, frames, 0)) != S_OK) - LogHostError(hr); + // Release buffer + if ((hr = IAudioRenderClient_ReleaseBuffer(stream->renderClient, frames, 0)) != S_OK) + LogHostError(hr); - return hr; + return hr; } // ------------------------------------------------------------------------------------------ static HRESULT ProcessInputBuffer(PaWasapiStream *stream, PaWasapiHostProcessor *processor) { - HRESULT hr = S_OK; - UINT32 frames; - BYTE *data = NULL; - DWORD flags = 0; + HRESULT hr = S_OK; + UINT32 frames; + BYTE *data = NULL; + DWORD flags = 0; - for (;;) - { - // Check if blocking call must be interrupted - if (WaitForSingleObject(stream->hCloseRequest, 0) != WAIT_TIMEOUT) - break; + for (;;) + { + // Check if blocking call must be interrupted + if (WaitForSingleObject(stream->hCloseRequest, 0) != WAIT_TIMEOUT) + break; - // Findout if any frames available - frames = 0; - if ((hr = _PollGetInputFramesAvailable(stream, &frames)) != S_OK) - return hr; + // Findout if any frames available + frames = 0; + if ((hr = _PollGetInputFramesAvailable(stream, &frames)) != S_OK) + return hr; - // Empty/consumed buffer - if (frames == 0) - break; + // Empty/consumed buffer + if (frames == 0) + break; - // Get the available data in the shared buffer. - if ((hr = IAudioCaptureClient_GetBuffer(stream->captureClient, &data, &frames, &flags, NULL, NULL)) != S_OK) - { - if (hr == AUDCLNT_S_BUFFER_EMPTY) - { - hr = S_OK; - break; // Empty/consumed buffer - } + // Get the available data in the shared buffer. + if ((hr = IAudioCaptureClient_GetBuffer(stream->captureClient, &data, &frames, &flags, NULL, NULL)) != S_OK) + { + if (hr == AUDCLNT_S_BUFFER_EMPTY) + { + hr = S_OK; + break; // Empty/consumed buffer + } - return LogHostError(hr); - break; - } + return LogHostError(hr); + break; + } - // Detect silence - // if (flags & AUDCLNT_BUFFERFLAGS_SILENT) - // data = NULL; + // Detect silence + // if (flags & AUDCLNT_BUFFERFLAGS_SILENT) + // data = NULL; - // Process data - if (stream->in.monoMixer != NULL) - { - // expand buffer - UINT32 mono_frames_size = frames * (stream->in.wavex.Format.wBitsPerSample / 8); - if (mono_frames_size > stream->in.monoBufferSize) - { - stream->in.monoBuffer = PaWasapi_ReallocateMemory(stream->in.monoBuffer, (stream->in.monoBufferSize = mono_frames_size)); - if (stream->in.monoBuffer == NULL) - { - hr = E_OUTOFMEMORY; - LogHostError(hr); - return hr; - } - } + // Process data + if (stream->in.monoMixer != NULL) + { + // expand buffer + UINT32 mono_frames_size = frames * (stream->in.wavex.Format.wBitsPerSample / 8); + if (mono_frames_size > stream->in.monoBufferSize) + { + stream->in.monoBuffer = PaWasapi_ReallocateMemory(stream->in.monoBuffer, (stream->in.monoBufferSize = mono_frames_size)); + if (stream->in.monoBuffer == NULL) + { + hr = E_OUTOFMEMORY; + LogHostError(hr); + return hr; + } + } - // mix 1 to 2 channels - stream->in.monoMixer(stream->in.monoBuffer, data, frames); + // mix 1 to 2 channels + stream->in.monoMixer(stream->in.monoBuffer, data, frames); - // process - processor[S_INPUT].processor((BYTE *)stream->in.monoBuffer, frames, NULL, 0, processor[S_INPUT].userData); - } - else - { - processor[S_INPUT].processor(data, frames, NULL, 0, processor[S_INPUT].userData); - } + // process + processor[S_INPUT].processor((BYTE *)stream->in.monoBuffer, frames, NULL, 0, processor[S_INPUT].userData); + } + else + { + processor[S_INPUT].processor(data, frames, NULL, 0, processor[S_INPUT].userData); + } - // Release buffer - if ((hr = IAudioCaptureClient_ReleaseBuffer(stream->captureClient, frames)) != S_OK) - return LogHostError(hr); + // Release buffer + if ((hr = IAudioCaptureClient_ReleaseBuffer(stream->captureClient, frames)) != S_OK) + return LogHostError(hr); - //break; - } + //break; + } - return hr; + return hr; } // ------------------------------------------------------------------------------------------ void _StreamOnStop(PaWasapiStream *stream) { - // Stop INPUT/OUTPUT clients - if (!stream->bBlocking) - { - if (stream->in.clientProc != NULL) - IAudioClient_Stop(stream->in.clientProc); - if (stream->out.clientProc != NULL) - IAudioClient_Stop(stream->out.clientProc); - } - else - { - if (stream->in.clientParent != NULL) - IAudioClient_Stop(stream->in.clientParent); - if (stream->out.clientParent != NULL) - IAudioClient_Stop(stream->out.clientParent); - } + // Stop INPUT/OUTPUT clients + if (!stream->bBlocking) + { + if (stream->in.clientProc != NULL) + IAudioClient_Stop(stream->in.clientProc); + if (stream->out.clientProc != NULL) + IAudioClient_Stop(stream->out.clientProc); + } + else + { + if (stream->in.clientParent != NULL) + IAudioClient_Stop(stream->in.clientParent); + if (stream->out.clientParent != NULL) + IAudioClient_Stop(stream->out.clientParent); + } - // Restore thread priority - if (stream->hAvTask != NULL) - { - PaWasapi_ThreadPriorityRevert(stream->hAvTask); - stream->hAvTask = NULL; - } + // Restore thread priority + if (stream->hAvTask != NULL) + { + PaWasapi_ThreadPriorityRevert(stream->hAvTask); + stream->hAvTask = NULL; + } // Notify if (stream->streamRepresentation.streamFinishedCallback != NULL) @@ -5592,76 +5592,76 @@ void _StreamOnStop(PaWasapiStream *stream) // ------------------------------------------------------------------------------------------ static BOOL PrepareComPointers(PaWasapiStream *stream, BOOL *threadComInitialized) { - HRESULT hr; + HRESULT hr; - /* - If COM is already initialized CoInitialize will either return - FALSE, or RPC_E_CHANGED_MODE if it was initialized in a different - threading mode. In either case we shouldn't consider it an error - but we need to be careful to not call CoUninitialize() if - RPC_E_CHANGED_MODE was returned. - */ - hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED); - if (FAILED(hr) && (hr != RPC_E_CHANGED_MODE)) - { - PRINT(("WASAPI: failed ProcThreadEvent CoInitialize")); - return FALSE; - } - if (hr != RPC_E_CHANGED_MODE) - *threadComInitialized = TRUE; + /* + If COM is already initialized CoInitialize will either return + FALSE, or RPC_E_CHANGED_MODE if it was initialized in a different + threading mode. In either case we shouldn't consider it an error + but we need to be careful to not call CoUninitialize() if + RPC_E_CHANGED_MODE was returned. + */ + hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED); + if (FAILED(hr) && (hr != RPC_E_CHANGED_MODE)) + { + PRINT(("WASAPI: failed ProcThreadEvent CoInitialize")); + return FALSE; + } + if (hr != RPC_E_CHANGED_MODE) + *threadComInitialized = TRUE; - // Unmarshal stream pointers for safe COM operation - hr = UnmarshalStreamComPointers(stream); - if (hr != S_OK) - { - PRINT(("WASAPI: Error unmarshaling stream COM pointers. HRESULT: %i\n", hr)); - CoUninitialize(); - return FALSE; - } + // Unmarshal stream pointers for safe COM operation + hr = UnmarshalStreamComPointers(stream); + if (hr != S_OK) + { + PRINT(("WASAPI: Error unmarshaling stream COM pointers. HRESULT: %i\n", hr)); + CoUninitialize(); + return FALSE; + } - return TRUE; + return TRUE; } // ------------------------------------------------------------------------------------------ static void FinishComPointers(PaWasapiStream *stream, BOOL threadComInitialized) { - // Release unmarshaled COM pointers - ReleaseUnmarshaledComPointers(stream); + // Release unmarshaled COM pointers + ReleaseUnmarshaledComPointers(stream); - // Cleanup COM for this thread - if (threadComInitialized == TRUE) - CoUninitialize(); + // Cleanup COM for this thread + if (threadComInitialized == TRUE) + CoUninitialize(); } // ------------------------------------------------------------------------------------------ PA_THREAD_FUNC ProcThreadEvent(void *param) { PaWasapiHostProcessor processor[S_COUNT]; - HRESULT hr; - DWORD dwResult; + HRESULT hr; + DWORD dwResult; PaWasapiStream *stream = (PaWasapiStream *)param; - PaWasapiHostProcessor defaultProcessor; - BOOL setEvent[S_COUNT] = { FALSE, FALSE }; - BOOL waitAllEvents = FALSE; - BOOL threadComInitialized = FALSE; - SystemTimer timer; + PaWasapiHostProcessor defaultProcessor; + BOOL setEvent[S_COUNT] = { FALSE, FALSE }; + BOOL waitAllEvents = FALSE; + BOOL threadComInitialized = FALSE; + SystemTimer timer; - // Notify: state - NotifyStateChanged(stream, paWasapiStreamStateThreadPrepare, ERROR_SUCCESS); + // Notify: state + NotifyStateChanged(stream, paWasapiStreamStateThreadPrepare, ERROR_SUCCESS); - // Prepare COM pointers - if (!PrepareComPointers(stream, &threadComInitialized)) - return (UINT32)paUnanticipatedHostError; + // Prepare COM pointers + if (!PrepareComPointers(stream, &threadComInitialized)) + return (UINT32)paUnanticipatedHostError; - // Request fine (1 ms) granularity of the system timer functions for precise operation of waitable timers - SystemTimer_SetGranularity(&timer, 1); + // Request fine (1 ms) granularity of the system timer functions for precise operation of waitable timers + SystemTimer_SetGranularity(&timer, 1); - // Waiting on all events in case of Full-Duplex/Exclusive mode. - if ((stream->in.clientProc != NULL) && (stream->out.clientProc != NULL)) - { - waitAllEvents = (stream->in.shareMode == AUDCLNT_SHAREMODE_EXCLUSIVE) && - (stream->out.shareMode == AUDCLNT_SHAREMODE_EXCLUSIVE); - } + // Waiting on all events in case of Full-Duplex/Exclusive mode. + if ((stream->in.clientProc != NULL) && (stream->out.clientProc != NULL)) + { + waitAllEvents = (stream->in.shareMode == AUDCLNT_SHAREMODE_EXCLUSIVE) && + (stream->out.shareMode == AUDCLNT_SHAREMODE_EXCLUSIVE); + } // Setup data processors defaultProcessor.processor = WaspiHostProcessingLoop; @@ -5669,294 +5669,294 @@ PA_THREAD_FUNC ProcThreadEvent(void *param) processor[S_INPUT] = (stream->hostProcessOverrideInput.processor != NULL ? stream->hostProcessOverrideInput : defaultProcessor); processor[S_OUTPUT] = (stream->hostProcessOverrideOutput.processor != NULL ? stream->hostProcessOverrideOutput : defaultProcessor); - // Boost thread priority - PaWasapi_ThreadPriorityBoost((void **)&stream->hAvTask, stream->nThreadPriority); + // Boost thread priority + PaWasapi_ThreadPriorityBoost((void **)&stream->hAvTask, stream->nThreadPriority); - // Create events - if (stream->event[S_OUTPUT] == NULL) - { - stream->event[S_OUTPUT] = CreateEvent(NULL, FALSE, FALSE, NULL); - setEvent[S_OUTPUT] = TRUE; - } - if (stream->event[S_INPUT] == NULL) - { - stream->event[S_INPUT] = CreateEvent(NULL, FALSE, FALSE, NULL); - setEvent[S_INPUT] = TRUE; - } - if ((stream->event[S_OUTPUT] == NULL) || (stream->event[S_INPUT] == NULL)) - { - PRINT(("WASAPI Thread: failed creating Input/Output event handle\n")); - goto thread_error; - } - - // Initialize event & start INPUT stream - if (stream->in.clientProc) - { - // Create & set handle - if (setEvent[S_INPUT]) - { - if ((hr = IAudioClient_SetEventHandle(stream->in.clientProc, stream->event[S_INPUT])) != S_OK) - { - LogHostError(hr); - goto thread_error; - } - } - - // Start - if ((hr = IAudioClient_Start(stream->in.clientProc)) != S_OK) - { - LogHostError(hr); - goto thread_error; - } - } - - // Initialize event & start OUTPUT stream - if (stream->out.clientProc) - { - // Create & set handle - if (setEvent[S_OUTPUT]) - { - if ((hr = IAudioClient_SetEventHandle(stream->out.clientProc, stream->event[S_OUTPUT])) != S_OK) - { - LogHostError(hr); - goto thread_error; - } - } - - // Preload buffer before start - if ((hr = ProcessOutputBuffer(stream, processor, stream->out.framesPerBuffer)) != S_OK) - { - LogHostError(hr); - goto thread_error; - } - - // Start - if ((hr = IAudioClient_Start(stream->out.clientProc)) != S_OK) - { - LogHostError(hr); - goto thread_error; - } - - } - - // Signal: stream running - stream->running = TRUE; - - // Notify: thread started - SetEvent(stream->hThreadStart); - - // Notify: state - NotifyStateChanged(stream, paWasapiStreamStateThreadStart, ERROR_SUCCESS); - - // Processing Loop - for (;;) + // Create events + if (stream->event[S_OUTPUT] == NULL) { - // 10 sec timeout (on timeout stream will auto-stop when processed by WAIT_TIMEOUT case) + stream->event[S_OUTPUT] = CreateEvent(NULL, FALSE, FALSE, NULL); + setEvent[S_OUTPUT] = TRUE; + } + if (stream->event[S_INPUT] == NULL) + { + stream->event[S_INPUT] = CreateEvent(NULL, FALSE, FALSE, NULL); + setEvent[S_INPUT] = TRUE; + } + if ((stream->event[S_OUTPUT] == NULL) || (stream->event[S_INPUT] == NULL)) + { + PRINT(("WASAPI Thread: failed creating Input/Output event handle\n")); + goto thread_error; + } + + // Initialize event & start INPUT stream + if (stream->in.clientProc) + { + // Create & set handle + if (setEvent[S_INPUT]) + { + if ((hr = IAudioClient_SetEventHandle(stream->in.clientProc, stream->event[S_INPUT])) != S_OK) + { + LogHostError(hr); + goto thread_error; + } + } + + // Start + if ((hr = IAudioClient_Start(stream->in.clientProc)) != S_OK) + { + LogHostError(hr); + goto thread_error; + } + } + + // Initialize event & start OUTPUT stream + if (stream->out.clientProc) + { + // Create & set handle + if (setEvent[S_OUTPUT]) + { + if ((hr = IAudioClient_SetEventHandle(stream->out.clientProc, stream->event[S_OUTPUT])) != S_OK) + { + LogHostError(hr); + goto thread_error; + } + } + + // Preload buffer before start + if ((hr = ProcessOutputBuffer(stream, processor, stream->out.framesPerBuffer)) != S_OK) + { + LogHostError(hr); + goto thread_error; + } + + // Start + if ((hr = IAudioClient_Start(stream->out.clientProc)) != S_OK) + { + LogHostError(hr); + goto thread_error; + } + + } + + // Signal: stream running + stream->running = TRUE; + + // Notify: thread started + SetEvent(stream->hThreadStart); + + // Notify: state + NotifyStateChanged(stream, paWasapiStreamStateThreadStart, ERROR_SUCCESS); + + // Processing Loop + for (;;) + { + // 10 sec timeout (on timeout stream will auto-stop when processed by WAIT_TIMEOUT case) dwResult = WaitForMultipleObjects(S_COUNT, stream->event, waitAllEvents, 10*1000); - // Check for close event (after wait for buffers to avoid any calls to user - // callback when hCloseRequest was set) - if (WaitForSingleObject(stream->hCloseRequest, 0) != WAIT_TIMEOUT) - break; + // Check for close event (after wait for buffers to avoid any calls to user + // callback when hCloseRequest was set) + if (WaitForSingleObject(stream->hCloseRequest, 0) != WAIT_TIMEOUT) + break; - // Process S_INPUT/S_OUTPUT - switch (dwResult) - { - case WAIT_TIMEOUT: { - PRINT(("WASAPI Thread: WAIT_TIMEOUT - probably bad audio driver or Vista x64 bug: use paWinWasapiPolling instead\n")); - goto thread_end; - break; } + // Process S_INPUT/S_OUTPUT + switch (dwResult) + { + case WAIT_TIMEOUT: { + PRINT(("WASAPI Thread: WAIT_TIMEOUT - probably bad audio driver or Vista x64 bug: use paWinWasapiPolling instead\n")); + goto thread_end; + break; } - // Input stream - case WAIT_OBJECT_0 + S_INPUT: { + // Input stream + case WAIT_OBJECT_0 + S_INPUT: { if (stream->captureClient == NULL) break; - if ((hr = ProcessInputBuffer(stream, processor)) != S_OK) - { - LogHostError(hr); - goto thread_error; - } + if ((hr = ProcessInputBuffer(stream, processor)) != S_OK) + { + LogHostError(hr); + goto thread_error; + } - break; } + break; } - // Output stream - case WAIT_OBJECT_0 + S_OUTPUT: { + // Output stream + case WAIT_OBJECT_0 + S_OUTPUT: { if (stream->renderClient == NULL) break; - if ((hr = ProcessOutputBuffer(stream, processor, stream->out.framesPerBuffer)) != S_OK) - { - LogHostError(hr); - goto thread_error; - } + if ((hr = ProcessOutputBuffer(stream, processor, stream->out.framesPerBuffer)) != S_OK) + { + LogHostError(hr); + goto thread_error; + } - break; } - } - } + break; } + } + } thread_end: - // Process stop - _StreamOnStop(stream); + // Process stop + _StreamOnStop(stream); - // Release unmarshaled COM pointers - FinishComPointers(stream, threadComInitialized); + // Release unmarshaled COM pointers + FinishComPointers(stream, threadComInitialized); - // Restore system timer granularity - SystemTimer_RestoreGranularity(&timer); + // Restore system timer granularity + SystemTimer_RestoreGranularity(&timer); - // Notify: not running - stream->running = FALSE; + // Notify: not running + stream->running = FALSE; - // Notify: thread exited - SetEvent(stream->hThreadExit); + // Notify: thread exited + SetEvent(stream->hThreadExit); - // Notify: state - NotifyStateChanged(stream, paWasapiStreamStateThreadStop, hr); + // Notify: state + NotifyStateChanged(stream, paWasapiStreamStateThreadStop, hr); - return 0; + return 0; thread_error: - // Prevent deadlocking in Pa_StreamStart - SetEvent(stream->hThreadStart); + // Prevent deadlocking in Pa_StreamStart + SetEvent(stream->hThreadStart); - // Exit - goto thread_end; + // Exit + goto thread_end; } // ------------------------------------------------------------------------------------------ static UINT32 GetSleepTime(PaWasapiStream *stream, UINT32 sleepTimeIn, UINT32 sleepTimeOut, UINT32 userFramesOut) { - UINT32 sleepTime; + UINT32 sleepTime; - // According to the issue [https://github.com/PortAudio/portaudio/issues/303] glitches may occur when user frames - // equal to 1/2 of the host buffer frames, therefore the emperical workaround for this problem is to lower - // the sleep time by 2 - if (userFramesOut != 0) - { - UINT32 chunks = stream->out.framesPerHostCallback / userFramesOut; - if (chunks <= 2) - { - sleepTimeOut /= 2; - PRINT(("WASAPI: underrun workaround, sleep [%d] ms - 1/2 of the user buffer[%d] | host buffer[%d]\n", sleepTimeOut, userFramesOut, stream->out.framesPerHostCallback)); - } - } + // According to the issue [https://github.com/PortAudio/portaudio/issues/303] glitches may occur when user frames + // equal to 1/2 of the host buffer frames, therefore the emperical workaround for this problem is to lower + // the sleep time by 2 + if (userFramesOut != 0) + { + UINT32 chunks = stream->out.framesPerHostCallback / userFramesOut; + if (chunks <= 2) + { + sleepTimeOut /= 2; + PRINT(("WASAPI: underrun workaround, sleep [%d] ms - 1/2 of the user buffer[%d] | host buffer[%d]\n", sleepTimeOut, userFramesOut, stream->out.framesPerHostCallback)); + } + } - // Choose the smallest - if ((sleepTimeIn != 0) && (sleepTimeOut != 0)) - sleepTime = min(sleepTimeIn, sleepTimeOut); - else - sleepTime = (sleepTimeIn ? sleepTimeIn : sleepTimeOut); + // Choose the smallest + if ((sleepTimeIn != 0) && (sleepTimeOut != 0)) + sleepTime = min(sleepTimeIn, sleepTimeOut); + else + sleepTime = (sleepTimeIn ? sleepTimeIn : sleepTimeOut); - return sleepTime; + return sleepTime; } // ------------------------------------------------------------------------------------------ static UINT32 ConfigureLoopSleepTimeAndScheduler(PaWasapiStream *stream, ThreadIdleScheduler *scheduler) { - UINT32 sleepTime, sleepTimeIn, sleepTimeOut; - UINT32 userFramesIn = stream->in.framesPerHostCallback / WASAPI_PACKETS_PER_INPUT_BUFFER; - UINT32 userFramesOut = stream->out.framesPerBuffer; + UINT32 sleepTime, sleepTimeIn, sleepTimeOut; + UINT32 userFramesIn = stream->in.framesPerHostCallback / WASAPI_PACKETS_PER_INPUT_BUFFER; + UINT32 userFramesOut = stream->out.framesPerBuffer; - // Adjust polling time for non-paUtilFixedHostBufferSize, input stream is not adjustable as it is being - // polled according its packet length - if (stream->bufferMode != paUtilFixedHostBufferSize) - { - userFramesOut = (stream->bufferProcessor.framesPerUserBuffer ? stream->bufferProcessor.framesPerUserBuffer : - stream->out.params.frames_per_buffer); - } + // Adjust polling time for non-paUtilFixedHostBufferSize, input stream is not adjustable as it is being + // polled according its packet length + if (stream->bufferMode != paUtilFixedHostBufferSize) + { + userFramesOut = (stream->bufferProcessor.framesPerUserBuffer ? stream->bufferProcessor.framesPerUserBuffer : + stream->out.params.frames_per_buffer); + } - // Calculate timeout for the next polling attempt - sleepTimeIn = GetFramesSleepTime(userFramesIn, stream->in.wavex.Format.nSamplesPerSec); - sleepTimeOut = GetFramesSleepTime(userFramesOut, stream->out.wavex.Format.nSamplesPerSec); + // Calculate timeout for the next polling attempt + sleepTimeIn = GetFramesSleepTime(userFramesIn, stream->in.wavex.Format.nSamplesPerSec); + sleepTimeOut = GetFramesSleepTime(userFramesOut, stream->out.wavex.Format.nSamplesPerSec); - // WASAPI input packets tend to expire very easily, let's limit sleep time to 2 milliseconds - // for all cases. Please propose better solution if any - if (sleepTimeIn > 2) - sleepTimeIn = 2; + // WASAPI input packets tend to expire very easily, let's limit sleep time to 2 milliseconds + // for all cases. Please propose better solution if any + if (sleepTimeIn > 2) + sleepTimeIn = 2; - sleepTime = GetSleepTime(stream, sleepTimeIn, sleepTimeOut, userFramesOut); + sleepTime = GetSleepTime(stream, sleepTimeIn, sleepTimeOut, userFramesOut); - // Make sure not 0, othervise use ThreadIdleScheduler to bounce between [0, 1] ms to avoid too busy loop - if (sleepTime == 0) - { - sleepTimeIn = GetFramesSleepTimeMicroseconds(userFramesIn, stream->in.wavex.Format.nSamplesPerSec); - sleepTimeOut = GetFramesSleepTimeMicroseconds(userFramesOut, stream->out.wavex.Format.nSamplesPerSec); + // Make sure not 0, othervise use ThreadIdleScheduler to bounce between [0, 1] ms to avoid too busy loop + if (sleepTime == 0) + { + sleepTimeIn = GetFramesSleepTimeMicroseconds(userFramesIn, stream->in.wavex.Format.nSamplesPerSec); + sleepTimeOut = GetFramesSleepTimeMicroseconds(userFramesOut, stream->out.wavex.Format.nSamplesPerSec); - sleepTime = GetSleepTime(stream, sleepTimeIn, sleepTimeOut, userFramesOut); + sleepTime = GetSleepTime(stream, sleepTimeIn, sleepTimeOut, userFramesOut); - // Setup thread sleep scheduler - ThreadIdleScheduler_Setup(scheduler, 1, sleepTime/* microseconds here */); - sleepTime = 0; - } + // Setup thread sleep scheduler + ThreadIdleScheduler_Setup(scheduler, 1, sleepTime/* microseconds here */); + sleepTime = 0; + } - return sleepTime; + return sleepTime; } // ------------------------------------------------------------------------------------------ static inline INT32 GetNextSleepTime(SystemTimer *timer, ThreadIdleScheduler *scheduler, LONGLONG startTime, - UINT32 sleepTime) + UINT32 sleepTime) { - INT32 nextSleepTime; + INT32 nextSleepTime; - // Get next sleep time - if (sleepTime == 0) - nextSleepTime = ThreadIdleScheduler_NextSleep(scheduler); - else - nextSleepTime = sleepTime; + // Get next sleep time + if (sleepTime == 0) + nextSleepTime = ThreadIdleScheduler_NextSleep(scheduler); + else + nextSleepTime = sleepTime; - // Adjust next sleep time dynamically depending on how much time was spent in ProcessOutputBuffer/ProcessInputBuffer - // therefore periodicity will not jitter or be increased for the amount of time spent in processing; - // example when sleepTime is 10 ms where [] is polling time slot, {} processing time slot: - // - // [9],{2},[8],{1},[9],{1},[9],{3},[7],{2},[8],{3},[7],{2},[8],{2},[8],{3},[7],{2},[8],... - // - INT32 procTime = (INT32)(SystemTimer_GetTime(timer) - startTime); - nextSleepTime -= procTime; - if (nextSleepTime < 0) - nextSleepTime = 0; + // Adjust next sleep time dynamically depending on how much time was spent in ProcessOutputBuffer/ProcessInputBuffer + // therefore periodicity will not jitter or be increased for the amount of time spent in processing; + // example when sleepTime is 10 ms where [] is polling time slot, {} processing time slot: + // + // [9],{2},[8],{1},[9],{1},[9],{3},[7],{2},[8],{3},[7],{2},[8],{2},[8],{3},[7],{2},[8],... + // + INT32 procTime = (INT32)(SystemTimer_GetTime(timer) - startTime); + nextSleepTime -= procTime; + if (nextSleepTime < 0) + nextSleepTime = 0; #ifdef PA_WASAPI_LOG_TIME_SLOTS - printf("{%d},", procTime); + printf("{%d},", procTime); #endif - return nextSleepTime; + return nextSleepTime; } // ------------------------------------------------------------------------------------------ PA_THREAD_FUNC ProcThreadPoll(void *param) { PaWasapiHostProcessor processor[S_COUNT]; - HRESULT hr; + HRESULT hr; PaWasapiStream *stream = (PaWasapiStream *)param; - PaWasapiHostProcessor defaultProcessor; - INT32 i; - ThreadIdleScheduler scheduler; - SystemTimer timer; - LONGLONG startTime; - UINT32 sleepTime; - INT32 nextSleepTime = 0; //! Do first loop without waiting as time could be spent when calling other APIs before ProcessXXXBuffer. - BOOL threadComInitialized = FALSE; + PaWasapiHostProcessor defaultProcessor; + INT32 i; + ThreadIdleScheduler scheduler; + SystemTimer timer; + LONGLONG startTime; + UINT32 sleepTime; + INT32 nextSleepTime = 0; //! Do first loop without waiting as time could be spent when calling other APIs before ProcessXXXBuffer. + BOOL threadComInitialized = FALSE; #ifdef PA_WASAPI_LOG_TIME_SLOTS - LONGLONG startWaitTime; + LONGLONG startWaitTime; #endif - // Notify: state - NotifyStateChanged(stream, paWasapiStreamStateThreadPrepare, ERROR_SUCCESS); + // Notify: state + NotifyStateChanged(stream, paWasapiStreamStateThreadPrepare, ERROR_SUCCESS); - // Prepare COM pointers - if (!PrepareComPointers(stream, &threadComInitialized)) - return (UINT32)paUnanticipatedHostError; + // Prepare COM pointers + if (!PrepareComPointers(stream, &threadComInitialized)) + return (UINT32)paUnanticipatedHostError; - // Request fine (1 ms) granularity of the system timer functions to guarantee correct logic around WaitForSingleObject - SystemTimer_SetGranularity(&timer, 1); + // Request fine (1 ms) granularity of the system timer functions to guarantee correct logic around WaitForSingleObject + SystemTimer_SetGranularity(&timer, 1); - // Claculate sleep time of the processing loop (inside WaitForSingleObject) - sleepTime = ConfigureLoopSleepTimeAndScheduler(stream, &scheduler); + // Claculate sleep time of the processing loop (inside WaitForSingleObject) + sleepTime = ConfigureLoopSleepTimeAndScheduler(stream, &scheduler); // Setup data processors defaultProcessor.processor = WaspiHostProcessingLoop; @@ -5964,373 +5964,373 @@ PA_THREAD_FUNC ProcThreadPoll(void *param) processor[S_INPUT] = (stream->hostProcessOverrideInput.processor != NULL ? stream->hostProcessOverrideInput : defaultProcessor); processor[S_OUTPUT] = (stream->hostProcessOverrideOutput.processor != NULL ? stream->hostProcessOverrideOutput : defaultProcessor); - // Boost thread priority - PaWasapi_ThreadPriorityBoost((void **)&stream->hAvTask, stream->nThreadPriority); + // Boost thread priority + PaWasapi_ThreadPriorityBoost((void **)&stream->hAvTask, stream->nThreadPriority); - // Initialize event & start INPUT stream - if (stream->in.clientProc) - { - if ((hr = IAudioClient_Start(stream->in.clientProc)) != S_OK) - { - LogHostError(hr); - goto thread_error; - } - } + // Initialize event & start INPUT stream + if (stream->in.clientProc) + { + if ((hr = IAudioClient_Start(stream->in.clientProc)) != S_OK) + { + LogHostError(hr); + goto thread_error; + } + } - // Initialize event & start OUTPUT stream - if (stream->out.clientProc) - { - // Preload buffer (obligatory, othervise ->Start() will fail), avoid processing - // when in full-duplex mode as it requires input processing as well - if (!PA_WASAPI__IS_FULLDUPLEX(stream)) - { - UINT32 frames = 0; - if ((hr = _PollGetOutputFramesAvailable(stream, &frames)) == S_OK) - { - if (stream->bufferMode == paUtilFixedHostBufferSize) - { - // It is important to preload whole host buffer to avoid underruns/glitches when stream is started, - // for more details see the discussion: https://github.com/PortAudio/portaudio/issues/303 - while (frames >= stream->out.framesPerBuffer) - { - if ((hr = ProcessOutputBuffer(stream, processor, stream->out.framesPerBuffer)) != S_OK) - { - LogHostError(hr); // not fatal, just log - break; - } + // Initialize event & start OUTPUT stream + if (stream->out.clientProc) + { + // Preload buffer (obligatory, othervise ->Start() will fail), avoid processing + // when in full-duplex mode as it requires input processing as well + if (!PA_WASAPI__IS_FULLDUPLEX(stream)) + { + UINT32 frames = 0; + if ((hr = _PollGetOutputFramesAvailable(stream, &frames)) == S_OK) + { + if (stream->bufferMode == paUtilFixedHostBufferSize) + { + // It is important to preload whole host buffer to avoid underruns/glitches when stream is started, + // for more details see the discussion: https://github.com/PortAudio/portaudio/issues/303 + while (frames >= stream->out.framesPerBuffer) + { + if ((hr = ProcessOutputBuffer(stream, processor, stream->out.framesPerBuffer)) != S_OK) + { + LogHostError(hr); // not fatal, just log + break; + } - frames -= stream->out.framesPerBuffer; - } - } - else - { - // Some devices may not start (will get stuck with 0 ready frames) if data not prefetched - if (frames == 0) - frames = stream->out.framesPerBuffer; + frames -= stream->out.framesPerBuffer; + } + } + else + { + // Some devices may not start (will get stuck with 0 ready frames) if data not prefetched + if (frames == 0) + frames = stream->out.framesPerBuffer; - // USB DACs report large buffer in Exclusive mode and if it is filled fully will stuck in - // non playing state, e.g. IAudioClient_GetCurrentPadding() will start reporting max buffer size - // constantly, thus preload data size equal to the user buffer to allow process going - if ((stream->out.shareMode == AUDCLNT_SHAREMODE_EXCLUSIVE) && (frames >= (stream->out.framesPerBuffer * 2))) - frames -= stream->out.framesPerBuffer; + // USB DACs report large buffer in Exclusive mode and if it is filled fully will stuck in + // non playing state, e.g. IAudioClient_GetCurrentPadding() will start reporting max buffer size + // constantly, thus preload data size equal to the user buffer to allow process going + if ((stream->out.shareMode == AUDCLNT_SHAREMODE_EXCLUSIVE) && (frames >= (stream->out.framesPerBuffer * 2))) + frames -= stream->out.framesPerBuffer; - if ((hr = ProcessOutputBuffer(stream, processor, frames)) != S_OK) - { - LogHostError(hr); // not fatal, just log - } - } - } - else - { - LogHostError(hr); // not fatal, just log - } - } + if ((hr = ProcessOutputBuffer(stream, processor, frames)) != S_OK) + { + LogHostError(hr); // not fatal, just log + } + } + } + else + { + LogHostError(hr); // not fatal, just log + } + } - // Start - if ((hr = IAudioClient_Start(stream->out.clientProc)) != S_OK) - { - LogHostError(hr); - goto thread_error; - } - } + // Start + if ((hr = IAudioClient_Start(stream->out.clientProc)) != S_OK) + { + LogHostError(hr); + goto thread_error; + } + } - // Signal: stream running - stream->running = TRUE; + // Signal: stream running + stream->running = TRUE; - // Notify: thread started - SetEvent(stream->hThreadStart); + // Notify: thread started + SetEvent(stream->hThreadStart); - // Notify: state - NotifyStateChanged(stream, paWasapiStreamStateThreadStart, ERROR_SUCCESS); + // Notify: state + NotifyStateChanged(stream, paWasapiStreamStateThreadStart, ERROR_SUCCESS); #ifdef PA_WASAPI_LOG_TIME_SLOTS - startWaitTime = SystemTimer_GetTime(&timer); + startWaitTime = SystemTimer_GetTime(&timer); #endif - if (!PA_WASAPI__IS_FULLDUPLEX(stream)) - { - // Processing Loop - while (WaitForSingleObject(stream->hCloseRequest, nextSleepTime) == WAIT_TIMEOUT) - { - startTime = SystemTimer_GetTime(&timer); + if (!PA_WASAPI__IS_FULLDUPLEX(stream)) + { + // Processing Loop + while (WaitForSingleObject(stream->hCloseRequest, nextSleepTime) == WAIT_TIMEOUT) + { + startTime = SystemTimer_GetTime(&timer); - #ifdef PA_WASAPI_LOG_TIME_SLOTS - printf("[%d|%d],", nextSleepTime, (INT32)(startTime - startWaitTime)); - #endif + #ifdef PA_WASAPI_LOG_TIME_SLOTS + printf("[%d|%d],", nextSleepTime, (INT32)(startTime - startWaitTime)); + #endif - for (i = 0; i < S_COUNT; ++i) - { - // Process S_INPUT/S_OUTPUT - switch (i) - { - // Input stream - case S_INPUT: { + for (i = 0; i < S_COUNT; ++i) + { + // Process S_INPUT/S_OUTPUT + switch (i) + { + // Input stream + case S_INPUT: { - if (stream->captureClient == NULL) - break; + if (stream->captureClient == NULL) + break; - if ((hr = ProcessInputBuffer(stream, processor)) != S_OK) - { - LogHostError(hr); - goto thread_error; - } + if ((hr = ProcessInputBuffer(stream, processor)) != S_OK) + { + LogHostError(hr); + goto thread_error; + } - break; } + break; } - // Output stream - case S_OUTPUT: { + // Output stream + case S_OUTPUT: { - UINT32 framesAvail; + UINT32 framesAvail; - if (stream->renderClient == NULL) - break; + if (stream->renderClient == NULL) + break; - // Get available frames - if ((hr = _PollGetOutputFramesAvailable(stream, &framesAvail)) != S_OK) - { - LogHostError(hr); - goto thread_error; - } + // Get available frames + if ((hr = _PollGetOutputFramesAvailable(stream, &framesAvail)) != S_OK) + { + LogHostError(hr); + goto thread_error; + } - // Output data to the user callback - if (stream->bufferMode == paUtilFixedHostBufferSize) - { - UINT32 framesProc = stream->out.framesPerBuffer; + // Output data to the user callback + if (stream->bufferMode == paUtilFixedHostBufferSize) + { + UINT32 framesProc = stream->out.framesPerBuffer; - // If we got less frames avoid sleeping again as it might be the corner case and buffer - // has sufficient number of frames now, in case 'out.framesPerBuffer' is 1/2 of the host - // buffer sleeping again may cause underruns. Do short busy waiting (normally might take - // 1-2 iterations) - if (framesAvail < framesProc) - { - nextSleepTime = 0; - continue; - } + // If we got less frames avoid sleeping again as it might be the corner case and buffer + // has sufficient number of frames now, in case 'out.framesPerBuffer' is 1/2 of the host + // buffer sleeping again may cause underruns. Do short busy waiting (normally might take + // 1-2 iterations) + if (framesAvail < framesProc) + { + nextSleepTime = 0; + continue; + } - while (framesAvail >= framesProc) - { - if ((hr = ProcessOutputBuffer(stream, processor, framesProc)) != S_OK) - { - LogHostError(hr); - goto thread_error; - } + while (framesAvail >= framesProc) + { + if ((hr = ProcessOutputBuffer(stream, processor, framesProc)) != S_OK) + { + LogHostError(hr); + goto thread_error; + } - framesAvail -= framesProc; - } - } - else - if (framesAvail != 0) - { - if ((hr = ProcessOutputBuffer(stream, processor, framesAvail)) != S_OK) - { - LogHostError(hr); - goto thread_error; - } - } + framesAvail -= framesProc; + } + } + else + if (framesAvail != 0) + { + if ((hr = ProcessOutputBuffer(stream, processor, framesAvail)) != S_OK) + { + LogHostError(hr); + goto thread_error; + } + } - break; } - } - } + break; } + } + } - // Get next sleep time - nextSleepTime = GetNextSleepTime(&timer, &scheduler, startTime, sleepTime); + // Get next sleep time + nextSleepTime = GetNextSleepTime(&timer, &scheduler, startTime, sleepTime); - #ifdef PA_WASAPI_LOG_TIME_SLOTS - startWaitTime = SystemTimer_GetTime(&timer); - #endif - } - } - else - { - // Processing Loop (full-duplex) - while (WaitForSingleObject(stream->hCloseRequest, nextSleepTime) == WAIT_TIMEOUT) - { - UINT32 i_frames = 0, i_processed = 0, o_frames = 0; - BYTE *i_data = NULL, *o_data = NULL, *o_data_host = NULL; - DWORD i_flags = 0; - - startTime = SystemTimer_GetTime(&timer); + #ifdef PA_WASAPI_LOG_TIME_SLOTS + startWaitTime = SystemTimer_GetTime(&timer); + #endif + } + } + else + { + // Processing Loop (full-duplex) + while (WaitForSingleObject(stream->hCloseRequest, nextSleepTime) == WAIT_TIMEOUT) + { + UINT32 i_frames = 0, i_processed = 0, o_frames = 0; + BYTE *i_data = NULL, *o_data = NULL, *o_data_host = NULL; + DWORD i_flags = 0; + + startTime = SystemTimer_GetTime(&timer); - #ifdef PA_WASAPI_LOG_TIME_SLOTS - printf("[%d|%d],", nextSleepTime, (INT32)(startTime - startWaitTime)); - #endif + #ifdef PA_WASAPI_LOG_TIME_SLOTS + printf("[%d|%d],", nextSleepTime, (INT32)(startTime - startWaitTime)); + #endif - // get available frames - if ((hr = _PollGetOutputFramesAvailable(stream, &o_frames)) != S_OK) - { - LogHostError(hr); - break; - } + // get available frames + if ((hr = _PollGetOutputFramesAvailable(stream, &o_frames)) != S_OK) + { + LogHostError(hr); + break; + } - while (o_frames != 0) - { - // get host input buffer - if ((hr = IAudioCaptureClient_GetBuffer(stream->captureClient, &i_data, &i_frames, &i_flags, NULL, NULL)) != S_OK) - { - if (hr == AUDCLNT_S_BUFFER_EMPTY) - break; // no data in capture buffer + while (o_frames != 0) + { + // get host input buffer + if ((hr = IAudioCaptureClient_GetBuffer(stream->captureClient, &i_data, &i_frames, &i_flags, NULL, NULL)) != S_OK) + { + if (hr == AUDCLNT_S_BUFFER_EMPTY) + break; // no data in capture buffer - LogHostError(hr); - break; - } + LogHostError(hr); + break; + } - // process equal ammount of frames - if (o_frames >= i_frames) - { - // process input ammount of frames - UINT32 o_processed = i_frames; + // process equal ammount of frames + if (o_frames >= i_frames) + { + // process input ammount of frames + UINT32 o_processed = i_frames; - // get host output buffer - if ((hr = IAudioRenderClient_GetBuffer(stream->renderClient, o_processed, &o_data)) == S_OK) - { - // processed amount of i_frames - i_processed = i_frames; - o_data_host = o_data; + // get host output buffer + if ((hr = IAudioRenderClient_GetBuffer(stream->renderClient, o_processed, &o_data)) == S_OK) + { + // processed amount of i_frames + i_processed = i_frames; + o_data_host = o_data; - // convert output mono - if (stream->out.monoMixer) - { - UINT32 mono_frames_size = o_processed * (stream->out.wavex.Format.wBitsPerSample / 8); - // expand buffer - if (mono_frames_size > stream->out.monoBufferSize) - { - stream->out.monoBuffer = PaWasapi_ReallocateMemory(stream->out.monoBuffer, (stream->out.monoBufferSize = mono_frames_size)); - if (stream->out.monoBuffer == NULL) - { - // release input buffer - IAudioCaptureClient_ReleaseBuffer(stream->captureClient, 0); - // release output buffer - IAudioRenderClient_ReleaseBuffer(stream->renderClient, 0, 0); + // convert output mono + if (stream->out.monoMixer) + { + UINT32 mono_frames_size = o_processed * (stream->out.wavex.Format.wBitsPerSample / 8); + // expand buffer + if (mono_frames_size > stream->out.monoBufferSize) + { + stream->out.monoBuffer = PaWasapi_ReallocateMemory(stream->out.monoBuffer, (stream->out.monoBufferSize = mono_frames_size)); + if (stream->out.monoBuffer == NULL) + { + // release input buffer + IAudioCaptureClient_ReleaseBuffer(stream->captureClient, 0); + // release output buffer + IAudioRenderClient_ReleaseBuffer(stream->renderClient, 0, 0); - LogPaError(paInsufficientMemory); - goto thread_error; - } - } + LogPaError(paInsufficientMemory); + goto thread_error; + } + } - // replace buffer pointer - o_data = (BYTE *)stream->out.monoBuffer; - } + // replace buffer pointer + o_data = (BYTE *)stream->out.monoBuffer; + } - // convert input mono - if (stream->in.monoMixer) - { - UINT32 mono_frames_size = i_processed * (stream->in.wavex.Format.wBitsPerSample / 8); - // expand buffer - if (mono_frames_size > stream->in.monoBufferSize) - { - stream->in.monoBuffer = PaWasapi_ReallocateMemory(stream->in.monoBuffer, (stream->in.monoBufferSize = mono_frames_size)); - if (stream->in.monoBuffer == NULL) - { - // release input buffer - IAudioCaptureClient_ReleaseBuffer(stream->captureClient, 0); - // release output buffer - IAudioRenderClient_ReleaseBuffer(stream->renderClient, 0, 0); + // convert input mono + if (stream->in.monoMixer) + { + UINT32 mono_frames_size = i_processed * (stream->in.wavex.Format.wBitsPerSample / 8); + // expand buffer + if (mono_frames_size > stream->in.monoBufferSize) + { + stream->in.monoBuffer = PaWasapi_ReallocateMemory(stream->in.monoBuffer, (stream->in.monoBufferSize = mono_frames_size)); + if (stream->in.monoBuffer == NULL) + { + // release input buffer + IAudioCaptureClient_ReleaseBuffer(stream->captureClient, 0); + // release output buffer + IAudioRenderClient_ReleaseBuffer(stream->renderClient, 0, 0); - LogPaError(paInsufficientMemory); - goto thread_error; - } - } + LogPaError(paInsufficientMemory); + goto thread_error; + } + } - // mix 2 to 1 input channels - stream->in.monoMixer(stream->in.monoBuffer, i_data, i_processed); + // mix 2 to 1 input channels + stream->in.monoMixer(stream->in.monoBuffer, i_data, i_processed); - // replace buffer pointer - i_data = (BYTE *)stream->in.monoBuffer; - } + // replace buffer pointer + i_data = (BYTE *)stream->in.monoBuffer; + } - // process - processor[S_FULLDUPLEX].processor(i_data, i_processed, o_data, o_processed, processor[S_FULLDUPLEX].userData); + // process + processor[S_FULLDUPLEX].processor(i_data, i_processed, o_data, o_processed, processor[S_FULLDUPLEX].userData); - // mix 1 to 2 output channels - if (stream->out.monoBuffer) - stream->out.monoMixer(o_data_host, stream->out.monoBuffer, o_processed); + // mix 1 to 2 output channels + if (stream->out.monoBuffer) + stream->out.monoMixer(o_data_host, stream->out.monoBuffer, o_processed); - // release host output buffer - if ((hr = IAudioRenderClient_ReleaseBuffer(stream->renderClient, o_processed, 0)) != S_OK) - LogHostError(hr); + // release host output buffer + if ((hr = IAudioRenderClient_ReleaseBuffer(stream->renderClient, o_processed, 0)) != S_OK) + LogHostError(hr); - o_frames -= o_processed; - } - else - { - if (stream->out.shareMode != AUDCLNT_SHAREMODE_SHARED) - LogHostError(hr); // be silent in shared mode, try again next time - } - } - else - { - i_processed = 0; - goto fd_release_buffer_in; - } + o_frames -= o_processed; + } + else + { + if (stream->out.shareMode != AUDCLNT_SHAREMODE_SHARED) + LogHostError(hr); // be silent in shared mode, try again next time + } + } + else + { + i_processed = 0; + goto fd_release_buffer_in; + } fd_release_buffer_in: - // release host input buffer - if ((hr = IAudioCaptureClient_ReleaseBuffer(stream->captureClient, i_processed)) != S_OK) - { - LogHostError(hr); - break; - } + // release host input buffer + if ((hr = IAudioCaptureClient_ReleaseBuffer(stream->captureClient, i_processed)) != S_OK) + { + LogHostError(hr); + break; + } - // break processing, input hasn't been accumulated yet - if (i_processed == 0) - break; - } + // break processing, input hasn't been accumulated yet + if (i_processed == 0) + break; + } - // Get next sleep time - nextSleepTime = GetNextSleepTime(&timer, &scheduler, startTime, sleepTime); + // Get next sleep time + nextSleepTime = GetNextSleepTime(&timer, &scheduler, startTime, sleepTime); - #ifdef PA_WASAPI_LOG_TIME_SLOTS - startWaitTime = SystemTimer_GetTime(&timer); - #endif - } - } + #ifdef PA_WASAPI_LOG_TIME_SLOTS + startWaitTime = SystemTimer_GetTime(&timer); + #endif + } + } thread_end: - // Process stop - _StreamOnStop(stream); + // Process stop + _StreamOnStop(stream); - // Release unmarshaled COM pointers - FinishComPointers(stream, threadComInitialized); + // Release unmarshaled COM pointers + FinishComPointers(stream, threadComInitialized); - // Restore system timer granularity - SystemTimer_RestoreGranularity(&timer); + // Restore system timer granularity + SystemTimer_RestoreGranularity(&timer); - // Notify: not running - stream->running = FALSE; + // Notify: not running + stream->running = FALSE; - // Notify: thread exited - SetEvent(stream->hThreadExit); + // Notify: thread exited + SetEvent(stream->hThreadExit); - // Notify: state - NotifyStateChanged(stream, paWasapiStreamStateThreadStop, hr); + // Notify: state + NotifyStateChanged(stream, paWasapiStreamStateThreadStop, hr); - return 0; + return 0; thread_error: - // Prevent deadlocking in Pa_StreamStart - SetEvent(stream->hThreadStart); + // Prevent deadlocking in Pa_StreamStart + SetEvent(stream->hThreadStart); - // Exit - goto thread_end; + // Exit + goto thread_end; } // ------------------------------------------------------------------------------------------ void *PaWasapi_ReallocateMemory(void *prev, size_t size) { - void *ret = realloc(prev, size); - if (ret == NULL) - { - PaWasapi_FreeMemory(prev); - return NULL; - } - return ret; + void *ret = realloc(prev, size); + if (ret == NULL) + { + PaWasapi_FreeMemory(prev); + return NULL; + } + return ret; } // ------------------------------------------------------------------------------------------ void PaWasapi_FreeMemory(void *ptr) { - free(ptr); + free(ptr); } From 522f982158d2c7cb3d5ead593eed018821c10d4c Mon Sep 17 00:00:00 2001 From: dmitrykos Date: Sat, 10 Oct 2020 00:42:20 +0300 Subject: [PATCH 025/164] wasapi: Refactored device list creation, if faulty audio device is reported as active by WASAPI then it will not break device list creation, silenced warnings when compiling for UWP platform. --- src/hostapi/wasapi/pa_win_wasapi.c | 737 +++++++++++++++-------------- 1 file changed, 386 insertions(+), 351 deletions(-) diff --git a/src/hostapi/wasapi/pa_win_wasapi.c b/src/hostapi/wasapi/pa_win_wasapi.c index cdefe13..866d372 100644 --- a/src/hostapi/wasapi/pa_win_wasapi.c +++ b/src/hostapi/wasapi/pa_win_wasapi.c @@ -472,9 +472,6 @@ typedef struct // this is the REAL number of devices, whether they are usefull to PA or not! UINT32 deviceCount; - WCHAR defaultRenderer[MAX_STR_LEN]; - WCHAR defaultCapturer[MAX_STR_LEN]; - PaWasapiDeviceInfo *devInfo; // is TRUE when WOW64 Vista/7 Workaround is needed @@ -801,6 +798,9 @@ static BOOL SystemTimer_SetGranularity(SystemTimer *timer, UINT32 granularity) timer->granularity = 0; return FALSE; } +#else + (void)timer; + (void)granularity; #endif return TRUE; @@ -817,6 +817,8 @@ static void SystemTimer_RestoreGranularity(SystemTimer *timer) PRINT(("RestoreSystemTimer: timeEndPeriod(1) failed!\n")); } } +#else + (void)timer; #endif } @@ -829,6 +831,8 @@ static void SystemTimer_InitializeTimeGetter() //! Get high-resolution time in milliseconds (using QPC by default). static inline LONGLONG SystemTimer_GetTime(SystemTimer *timer) { + (void)timer; + // QPC: https://docs.microsoft.com/en-us/windows/win32/sysinfo/acquiring-high-resolution-time-stamps if (g_SystemTimerUseQpc) { @@ -1738,93 +1742,376 @@ static void NotifyStateChanged(PaWasapiStream *stream, UINT32 flags, HRESULT hr) stream->fnStateHandler((PaStream *)stream, flags, hr, stream->pStateHandlerUserData); } +// ------------------------------------------------------------------------------------------ +static void FillBaseDeviceInfo(PaDeviceInfo *deviceInfo, PaHostApiIndex hostApiIndex) +{ + deviceInfo->structVersion = 2; + deviceInfo->hostApi = hostApiIndex; +} + +// ------------------------------------------------------------------------------------------ +static PaError FillInactiveDeviceInfo(PaWasapiHostApiRepresentation *paWasapi, PaDeviceInfo *deviceInfo) +{ + if (deviceInfo->name == NULL) + deviceInfo->name = (char *)PaUtil_GroupAllocateMemory(paWasapi->allocations, 1); + + if (deviceInfo->name != NULL) + { + ((char *)deviceInfo->name)[0] = 0; + } + else + return paInsufficientMemory; + + return paNoError; +} + +// ------------------------------------------------------------------------------------------ +static PaError FillDeviceInfo(PaWasapiHostApiRepresentation *paWasapi, void *pEndPoints, INT32 index, const WCHAR *defaultRenderer, + const WCHAR *defaultCapturer, PaDeviceInfo *deviceInfo, PaWasapiDeviceInfo *wasapiDeviceInfo) +{ + HRESULT hr; + PaError result; + PaUtilHostApiRepresentation *hostApi = (PaUtilHostApiRepresentation *)paWasapi; + +#ifndef PA_WINRT + hr = IMMDeviceCollection_Item((IMMDeviceCollection *)pEndPoints, index, &wasapiDeviceInfo->device); + IF_FAILED_INTERNAL_ERROR_JUMP(hr, result, error); + + // getting ID + { + WCHAR *pszDeviceId; + + hr = IMMDevice_GetId(wasapiDeviceInfo->device, &pszDeviceId); + IF_FAILED_INTERNAL_ERROR_JUMP(hr, result, error); + + wcsncpy(wasapiDeviceInfo->szDeviceID, pszDeviceId, MAX_STR_LEN - 1); + CoTaskMemFree(pszDeviceId); + + if ((defaultCapturer != NULL) && (lstrcmpW(wasapiDeviceInfo->szDeviceID, defaultCapturer) == 0)) + hostApi->info.defaultInputDevice = hostApi->info.deviceCount; + + if ((defaultRenderer != NULL) && (lstrcmpW(wasapiDeviceInfo->szDeviceID, defaultRenderer) == 0)) + hostApi->info.defaultOutputDevice = hostApi->info.deviceCount; + } + + hr = IMMDevice_GetState(wasapiDeviceInfo->device, &wasapiDeviceInfo->state); + IF_FAILED_INTERNAL_ERROR_JUMP(hr, result, error); + + if (wasapiDeviceInfo->state != DEVICE_STATE_ACTIVE) + { + PRINT(("WASAPI device: %d is not currently available (state:%d)\n", index, wasapiDeviceInfo->state)); + } + + // Get basic device info + { + IPropertyStore *pProperty; + IMMEndpoint *endpoint; + PROPVARIANT value; + + hr = IMMDevice_OpenPropertyStore(wasapiDeviceInfo->device, STGM_READ, &pProperty); + IF_FAILED_INTERNAL_ERROR_JUMP(hr, result, error); + + // "Friendly" Name + { + PropVariantInit(&value); + + hr = IPropertyStore_GetValue(pProperty, &PKEY_Device_FriendlyName, &value); + IF_FAILED_INTERNAL_ERROR_JUMP(hr, result, error); + + if ((deviceInfo->name = (char *)PaUtil_GroupAllocateMemory(paWasapi->allocations, MAX_STR_LEN + 1)) == NULL) + { + result = paInsufficientMemory; + PropVariantClear(&value); + goto error; + } + if (value.pwszVal) + WideCharToMultiByte(CP_UTF8, 0, value.pwszVal, (int)wcslen(value.pwszVal), (char *)deviceInfo->name, MAX_STR_LEN - 1, 0, 0); + else + _snprintf((char *)deviceInfo->name, MAX_STR_LEN - 1, "baddev%d", index); + + PropVariantClear(&value); + + PA_DEBUG(("WASAPI:%d| name[%s]\n", index, deviceInfo->name)); + } + + // Default format + { + PropVariantInit(&value); + + hr = IPropertyStore_GetValue(pProperty, &PKEY_AudioEngine_DeviceFormat, &value); + IF_FAILED_INTERNAL_ERROR_JUMP(hr, result, error); + + memcpy(&wasapiDeviceInfo->DefaultFormat, value.blob.pBlobData, min(sizeof(wasapiDeviceInfo->DefaultFormat), value.blob.cbSize)); + + PropVariantClear(&value); + } + + // Form factor + { + PropVariantInit(&value); + + hr = IPropertyStore_GetValue(pProperty, &PKEY_AudioEndpoint_FormFactor, &value); + IF_FAILED_INTERNAL_ERROR_JUMP(hr, result, error); + + // set + #if defined(DUMMYUNIONNAME) && defined(NONAMELESSUNION) + // avoid breaking strict-aliasing rules in such line: (EndpointFormFactor)(*((UINT *)(((WORD *)&value.wReserved3)+1))); + UINT v; + memcpy(&v, (((WORD *)&value.wReserved3) + 1), sizeof(v)); + wasapiDeviceInfo->formFactor = (EndpointFormFactor)v; + #else + wasapiDeviceInfo->formFactor = (EndpointFormFactor)value.uintVal; + #endif + + PA_DEBUG(("WASAPI:%d| form-factor[%d]\n", index, wasapiDeviceInfo->formFactor)); + + PropVariantClear(&value); + } + + // Data flow (Renderer or Capture) + hr = IMMDevice_QueryInterface(wasapiDeviceInfo->device, &pa_IID_IMMEndpoint, (void **)&endpoint); + if (SUCCEEDED(hr)) + { + hr = IMMEndpoint_GetDataFlow(endpoint, &wasapiDeviceInfo->flow); + SAFE_RELEASE(endpoint); + } + + SAFE_RELEASE(pProperty); + } +#else + (void)pEndPoints; + (void)defaultRenderer; + (void)defaultCapturer; +#endif + + // Getting a temporary IAudioClient for more fields + // we make sure NOT to call Initialize yet! + { + IAudioClient *tmpClient; + WAVEFORMATEX *mixFormat; + + #ifdef PA_WINRT + // Set flow as ActivateAudioInterface depends on it and selects corresponding + // direction for the Audio Client + wasapiDeviceInfo->flow = (index == 0 ? eRender : eCapture); + #endif + + // Create temp Audio Client instance to query additional details + hr = ActivateAudioInterface(wasapiDeviceInfo, NULL, &tmpClient); + IF_FAILED_INTERNAL_ERROR_JUMP(hr, result, error); + + // Get latency + hr = IAudioClient_GetDevicePeriod(tmpClient, &wasapiDeviceInfo->DefaultDevicePeriod, &wasapiDeviceInfo->MinimumDevicePeriod); + if (FAILED(hr)) + { + PA_DEBUG(("WASAPI:%d| failed getting min/default periods by IAudioClient::GetDevicePeriod() with error[%08X], will use 30000/100000 hns\n", index, (UINT32)hr)); + + // assign WASAPI common values + wasapiDeviceInfo->DefaultDevicePeriod = 100000; + wasapiDeviceInfo->MinimumDevicePeriod = 30000; + + // ignore error, let continue further without failing with paInternalError + hr = S_OK; + } + + // Get mix format + hr = IAudioClient_GetMixFormat(tmpClient, &mixFormat); + if (SUCCEEDED(hr)) + { + memcpy(&wasapiDeviceInfo->MixFormat, mixFormat, min(sizeof(wasapiDeviceInfo->MixFormat), (sizeof(*mixFormat) + mixFormat->cbSize))); + CoTaskMemFree(mixFormat); + } + + // Register WINRT device + #ifdef PA_WINRT + if (SUCCEEDED(hr)) + { + // Default device + if (index == 0) + hostApi->info.defaultOutputDevice = hostApi->info.deviceCount; + else + hostApi->info.defaultInputDevice = hostApi->info.deviceCount; + + // State + wasapiDeviceInfo->state = DEVICE_STATE_ACTIVE; + + // Default format is always a mix format + wasapiDeviceInfo->DefaultFormat = wasapiDeviceInfo->MixFormat; + + // Form-factor + wasapiDeviceInfo->formFactor = UnknownFormFactor; + + // Name + if ((deviceInfo->name = (char *)PaUtil_GroupAllocateMemory(paWasapi->allocations, MAX_STR_LEN + 1)) == NULL) + { + SAFE_RELEASE(tmpClient); + result = paInsufficientMemory; + goto error; + } + _snprintf((char *)deviceInfo->name, MAX_STR_LEN - 1, "WASAPI_%s:%d", (index == 0 ? "Output" : "Input"), index); + PA_DEBUG(("WASAPI:%d| name[%s]\n", index, deviceInfo->name)); + } + #endif + + // Release tmp client + SAFE_RELEASE(tmpClient); + + if (hr != S_OK) + { + //davidv: this happened with my hardware, previously for that same device in DirectSound: + //Digital Output (Realtek AC'97 Audio)'s GUID: {0x38f2cf50,0x7b4c,0x4740,0x86,0xeb,0xd4,0x38,0x66,0xd8,0xc8, 0x9f} + //so something must be _really_ wrong with this device, TODO handle this better. We kind of need GetMixFormat + LogHostError(hr); + result = paInternalError; + goto error; + } + } + + // Fill basic device data + deviceInfo->maxInputChannels = 0; + deviceInfo->maxOutputChannels = 0; + deviceInfo->defaultSampleRate = wasapiDeviceInfo->MixFormat.Format.nSamplesPerSec; + switch (wasapiDeviceInfo->flow) + { + case eRender: { + deviceInfo->maxOutputChannels = wasapiDeviceInfo->MixFormat.Format.nChannels; + deviceInfo->defaultHighOutputLatency = nano100ToSeconds(wasapiDeviceInfo->DefaultDevicePeriod); + deviceInfo->defaultLowOutputLatency = nano100ToSeconds(wasapiDeviceInfo->MinimumDevicePeriod); + PA_DEBUG(("WASAPI:%d| def.SR[%d] max.CH[%d] latency{hi[%f] lo[%f]}\n", index, (UINT32)deviceInfo->defaultSampleRate, + deviceInfo->maxOutputChannels, (float)deviceInfo->defaultHighOutputLatency, (float)deviceInfo->defaultLowOutputLatency)); + break;} + case eCapture: { + deviceInfo->maxInputChannels = wasapiDeviceInfo->MixFormat.Format.nChannels; + deviceInfo->defaultHighInputLatency = nano100ToSeconds(wasapiDeviceInfo->DefaultDevicePeriod); + deviceInfo->defaultLowInputLatency = nano100ToSeconds(wasapiDeviceInfo->MinimumDevicePeriod); + PA_DEBUG(("WASAPI:%d| def.SR[%d] max.CH[%d] latency{hi[%f] lo[%f]}\n", index, (UINT32)deviceInfo->defaultSampleRate, + deviceInfo->maxInputChannels, (float)deviceInfo->defaultHighInputLatency, (float)deviceInfo->defaultLowInputLatency)); + break; } + default: + PRINT(("WASAPI:%d| bad Data Flow!\n", index)); + result = paInternalError; + goto error; + } + + return paNoError; + +error: + + PRINT(("WASAPI: failed filling device info for device index[%d] - error[%d|%s]\n", index, result, Pa_GetErrorText(result))); + + return result; +} + +// ------------------------------------------------------------------------------------------ +static PaDeviceInfo *AllocateDeviceListMemory(PaWasapiHostApiRepresentation *paWasapi) +{ + PaUtilHostApiRepresentation *hostApi = (PaUtilHostApiRepresentation *)paWasapi; + PaDeviceInfo *deviceInfoArray = NULL; + + if ((paWasapi->devInfo = (PaWasapiDeviceInfo *)PaUtil_GroupAllocateMemory(paWasapi->allocations, + sizeof(PaWasapiDeviceInfo) * paWasapi->deviceCount)) == NULL) + { + return NULL; + } + memset(paWasapi->devInfo, 0, sizeof(PaWasapiDeviceInfo) * paWasapi->deviceCount); + + if (paWasapi->deviceCount != 0) + { + UINT32 deviceCount = paWasapi->deviceCount; + #if defined(PA_WASAPI_MAX_CONST_DEVICE_COUNT) && (PA_WASAPI_MAX_CONST_DEVICE_COUNT > 0) + if (deviceCount < PA_WASAPI_MAX_CONST_DEVICE_COUNT) + deviceCount = PA_WASAPI_MAX_CONST_DEVICE_COUNT; + #endif + + if ((hostApi->deviceInfos = (PaDeviceInfo **)PaUtil_GroupAllocateMemory(paWasapi->allocations, + sizeof(PaDeviceInfo *) * deviceCount)) == NULL) + { + return NULL; + } + for (UINT32 i = 0; i < deviceCount; ++i) + hostApi->deviceInfos[i] = NULL; + + // Allocate all device info structs in a contiguous block + if ((deviceInfoArray = (PaDeviceInfo *)PaUtil_GroupAllocateMemory(paWasapi->allocations, + sizeof(PaDeviceInfo) * deviceCount)) == NULL) + { + return NULL; + } + memset(deviceInfoArray, 0, sizeof(PaDeviceInfo) * deviceCount); + } + + return deviceInfoArray; +} + // ------------------------------------------------------------------------------------------ static PaError CreateDeviceList(PaWasapiHostApiRepresentation *paWasapi, PaHostApiIndex hostApiIndex) { PaUtilHostApiRepresentation *hostApi = (PaUtilHostApiRepresentation *)paWasapi; PaError result = paNoError; PaDeviceInfo *deviceInfoArray; - HRESULT hr = S_OK; UINT i; + WCHAR *defaultRenderer = NULL; + WCHAR *defaultCapturer = NULL; #ifndef PA_WINRT - IMMDeviceCollection* pEndPoints = NULL; + HRESULT hr; + IMMDeviceCollection *pEndPoints = NULL; IMMDeviceEnumerator *pEnumerator = NULL; -#endif +#else + void *pEndPoints = NULL; IAudioClient *tmpClient; +#endif // Make sure device list empty if ((paWasapi->deviceCount != 0) || (hostApi->info.deviceCount != 0)) return paInternalError; #ifndef PA_WINRT - hr = CoCreateInstance(&pa_CLSID_IMMDeviceEnumerator, NULL, CLSCTX_INPROC_SERVER, - &pa_IID_IMMDeviceEnumerator, (void **)&pEnumerator); - - // We need to set the result to a value otherwise we will return paNoError - // [IF_FAILED_JUMP(hResult, error);] + hr = CoCreateInstance(&pa_CLSID_IMMDeviceEnumerator, NULL, CLSCTX_INPROC_SERVER, + &pa_IID_IMMDeviceEnumerator, (void **)&pEnumerator); IF_FAILED_INTERNAL_ERROR_JUMP(hr, result, error); - // getting default device ids in the eMultimedia "role" + // Get default render and capture devices { + IMMDevice *device; + + hr = IMMDeviceEnumerator_GetDefaultAudioEndpoint(pEnumerator, eRender, eMultimedia, &device); + if (hr != S_OK) { - IMMDevice *defaultRenderer = NULL; - hr = IMMDeviceEnumerator_GetDefaultAudioEndpoint(pEnumerator, eRender, eMultimedia, &defaultRenderer); - if (hr != S_OK) + if (hr != E_NOTFOUND) { - if (hr != E_NOTFOUND) { - // We need to set the result to a value otherwise we will return paNoError - // [IF_FAILED_JUMP(hResult, error);] - IF_FAILED_INTERNAL_ERROR_JUMP(hr, result, error); - } - } - else - { - WCHAR *pszDeviceId = NULL; - hr = IMMDevice_GetId(defaultRenderer, &pszDeviceId); - // We need to set the result to a value otherwise we will return paNoError - // [IF_FAILED_JUMP(hResult, error);] IF_FAILED_INTERNAL_ERROR_JUMP(hr, result, error); - wcsncpy(paWasapi->defaultRenderer, pszDeviceId, MAX_STR_LEN-1); - CoTaskMemFree(pszDeviceId); - IMMDevice_Release(defaultRenderer); } } - + else { - IMMDevice *defaultCapturer = NULL; - hr = IMMDeviceEnumerator_GetDefaultAudioEndpoint(pEnumerator, eCapture, eMultimedia, &defaultCapturer); - if (hr != S_OK) + hr = IMMDevice_GetId(device, &defaultRenderer); + IMMDevice_Release(device); + IF_FAILED_INTERNAL_ERROR_JUMP(hr, result, error); + } + + hr = IMMDeviceEnumerator_GetDefaultAudioEndpoint(pEnumerator, eCapture, eMultimedia, &device); + if (hr != S_OK) + { + if (hr != E_NOTFOUND) { - if (hr != E_NOTFOUND) { - // We need to set the result to a value otherwise we will return paNoError - // [IF_FAILED_JUMP(hResult, error);] - IF_FAILED_INTERNAL_ERROR_JUMP(hr, result, error); - } - } - else - { - WCHAR *pszDeviceId = NULL; - hr = IMMDevice_GetId(defaultCapturer, &pszDeviceId); - // We need to set the result to a value otherwise we will return paNoError - // [IF_FAILED_JUMP(hResult, error);] IF_FAILED_INTERNAL_ERROR_JUMP(hr, result, error); - wcsncpy(paWasapi->defaultCapturer, pszDeviceId, MAX_STR_LEN-1); - CoTaskMemFree(pszDeviceId); - IMMDevice_Release(defaultCapturer); } } + else + { + hr = IMMDevice_GetId(device, &defaultCapturer); + IMMDevice_Release(device); + IF_FAILED_INTERNAL_ERROR_JUMP(hr, result, error); + } } + // Get all currently active devices hr = IMMDeviceEnumerator_EnumAudioEndpoints(pEnumerator, eAll, DEVICE_STATE_ACTIVE, &pEndPoints); - // We need to set the result to a value otherwise we will return paNoError - // [IF_FAILED_JUMP(hResult, error);] IF_FAILED_INTERNAL_ERROR_JUMP(hr, result, error); + // Get device count hr = IMMDeviceCollection_GetCount(pEndPoints, &paWasapi->deviceCount); - // We need to set the result to a value otherwise we will return paNoError - // [IF_FAILED_JUMP(hResult, error);] IF_FAILED_INTERNAL_ERROR_JUMP(hr, result, error); - #else // Determine number of available devices by activating AudioClient for render and capture data flows if (SUCCEEDED(ActivateAudioInterface_WINRT(eRender, GetAudioClientIID(), &tmpClient))) @@ -1839,331 +2126,79 @@ static PaError CreateDeviceList(PaWasapiHostApiRepresentation *paWasapi, PaHostA } #endif - paWasapi->devInfo = (PaWasapiDeviceInfo *)PaUtil_GroupAllocateMemory( - paWasapi->allocations, sizeof(PaWasapiDeviceInfo) * paWasapi->deviceCount); - if (paWasapi->devInfo == NULL) + // Allocate memory for the device list + if ((deviceInfoArray = AllocateDeviceListMemory(paWasapi)) == NULL) { result = paInsufficientMemory; goto error; } - memset(paWasapi->devInfo, 0, sizeof(PaWasapiDeviceInfo) * paWasapi->deviceCount); - if (paWasapi->deviceCount > 0) + // Fill WASAPI device info + for (i = 0; i < paWasapi->deviceCount; ++i) { - UINT32 deviceCount = paWasapi->deviceCount; - #if defined(PA_WASAPI_MAX_CONST_DEVICE_COUNT) && (PA_WASAPI_MAX_CONST_DEVICE_COUNT > 0) - if (deviceCount < PA_WASAPI_MAX_CONST_DEVICE_COUNT) - deviceCount = PA_WASAPI_MAX_CONST_DEVICE_COUNT; - #endif + PaDeviceInfo *deviceInfo = &deviceInfoArray[i]; - hostApi->deviceInfos = (PaDeviceInfo **)PaUtil_GroupAllocateMemory( - paWasapi->allocations, sizeof(PaDeviceInfo *) * deviceCount); - if (hostApi->deviceInfos == NULL) + PA_DEBUG(("WASAPI: device idx: %02d\n", i)); + PA_DEBUG(("WASAPI: ---------------\n")); + + FillBaseDeviceInfo(deviceInfo, hostApiIndex); + + if ((result = FillDeviceInfo(paWasapi, pEndPoints, i, defaultRenderer, defaultCapturer, + deviceInfo, &paWasapi->devInfo[i])) != paNoError) { - result = paInsufficientMemory; - goto error; + // Faulty device is made inactive + if ((result = FillInactiveDeviceInfo(paWasapi, deviceInfo)) != paNoError) + goto error; } - /* allocate all device info structs in a contiguous block */ - deviceInfoArray = (PaDeviceInfo *)PaUtil_GroupAllocateMemory( - paWasapi->allocations, sizeof(PaDeviceInfo) * deviceCount); - if (deviceInfoArray == NULL) + hostApi->deviceInfos[i] = deviceInfo; + ++hostApi->info.deviceCount; + } + + // Fill the remaining slots with inactive device info +#if defined(PA_WASAPI_MAX_CONST_DEVICE_COUNT) && (PA_WASAPI_MAX_CONST_DEVICE_COUNT > 0) + if (hostApi->info.deviceCount < PA_WASAPI_MAX_CONST_DEVICE_COUNT) + { + for (i = hostApi->info.deviceCount; i < PA_WASAPI_MAX_CONST_DEVICE_COUNT; ++i) { - result = paInsufficientMemory; - goto error; - } - memset(deviceInfoArray, 0, sizeof(PaDeviceInfo) * deviceCount); + PaDeviceInfo *deviceInfo = &deviceInfoArray[i]; - for (i = 0; i < paWasapi->deviceCount; ++i) - { - PaDeviceInfo *deviceInfo = &deviceInfoArray[i]; - deviceInfo->structVersion = 2; - deviceInfo->hostApi = hostApiIndex; + FillBaseDeviceInfo(deviceInfo, hostApiIndex); - PA_DEBUG(("WASAPI: device idx: %02d\n", i)); - PA_DEBUG(("WASAPI: ---------------\n")); - - #ifndef PA_WINRT - hr = IMMDeviceCollection_Item(pEndPoints, i, &paWasapi->devInfo[i].device); - // We need to set the result to a value otherwise we will return paNoError - // [IF_FAILED_JUMP(hResult, error);] - IF_FAILED_INTERNAL_ERROR_JUMP(hr, result, error); - - // getting ID - { - WCHAR *pszDeviceId = NULL; - hr = IMMDevice_GetId(paWasapi->devInfo[i].device, &pszDeviceId); - // We need to set the result to a value otherwise we will return paNoError - // [IF_FAILED_JUMP(hr, error);] - IF_FAILED_INTERNAL_ERROR_JUMP(hr, result, error); - wcsncpy(paWasapi->devInfo[i].szDeviceID, pszDeviceId, MAX_STR_LEN-1); - CoTaskMemFree(pszDeviceId); - - if (lstrcmpW(paWasapi->devInfo[i].szDeviceID, paWasapi->defaultCapturer) == 0) - {// we found the default input! - hostApi->info.defaultInputDevice = hostApi->info.deviceCount; - } - if (lstrcmpW(paWasapi->devInfo[i].szDeviceID, paWasapi->defaultRenderer) == 0) - {// we found the default output! - hostApi->info.defaultOutputDevice = hostApi->info.deviceCount; - } - } - - hr = IMMDevice_GetState(paWasapi->devInfo[i].device, &paWasapi->devInfo[i].state); - // We need to set the result to a value otherwise we will return paNoError - // [IF_FAILED_JUMP(hResult, error);] - IF_FAILED_INTERNAL_ERROR_JUMP(hr, result, error); - - if (paWasapi->devInfo[i].state != DEVICE_STATE_ACTIVE) - { - PRINT(("WASAPI device: %d is not currently available (state:%d)\n", i, paWasapi->devInfo[i].state)); - } - - { - IPropertyStore *pProperty; - hr = IMMDevice_OpenPropertyStore(paWasapi->devInfo[i].device, STGM_READ, &pProperty); - // We need to set the result to a value otherwise we will return paNoError - // [IF_FAILED_JUMP(hResult, error);] - IF_FAILED_INTERNAL_ERROR_JUMP(hr, result, error); - - // "Friendly" Name - { - PROPVARIANT value; - PropVariantInit(&value); - hr = IPropertyStore_GetValue(pProperty, &PKEY_Device_FriendlyName, &value); - // We need to set the result to a value otherwise we will return paNoError - // [IF_FAILED_JUMP(hResult, error);] - IF_FAILED_INTERNAL_ERROR_JUMP(hr, result, error); - if ((deviceInfo->name = (char *)PaUtil_GroupAllocateMemory(paWasapi->allocations, MAX_STR_LEN + 1)) == NULL) - { - result = paInsufficientMemory; - goto error; - } - if (value.pwszVal) - WideCharToMultiByte(CP_UTF8, 0, value.pwszVal, (int)wcslen(value.pwszVal), (char *)deviceInfo->name, MAX_STR_LEN - 1, 0, 0); - else - _snprintf((char *)deviceInfo->name, MAX_STR_LEN - 1, "baddev%d", i); - PropVariantClear(&value); - PA_DEBUG(("WASAPI:%d| name[%s]\n", i, deviceInfo->name)); - } - - // Default format - { - PROPVARIANT value; - PropVariantInit(&value); - hr = IPropertyStore_GetValue(pProperty, &PKEY_AudioEngine_DeviceFormat, &value); - // We need to set the result to a value otherwise we will return paNoError - // [IF_FAILED_JUMP(hResult, error);] - IF_FAILED_INTERNAL_ERROR_JUMP(hr, result, error); - memcpy(&paWasapi->devInfo[i].DefaultFormat, value.blob.pBlobData, min(sizeof(paWasapi->devInfo[i].DefaultFormat), value.blob.cbSize)); - // cleanup - PropVariantClear(&value); - } - - // Formfactor - { - PROPVARIANT value; - PropVariantInit(&value); - hr = IPropertyStore_GetValue(pProperty, &PKEY_AudioEndpoint_FormFactor, &value); - // We need to set the result to a value otherwise we will return paNoError - // [IF_FAILED_JUMP(hResult, error);] - IF_FAILED_INTERNAL_ERROR_JUMP(hr, result, error); - // set - #if defined(DUMMYUNIONNAME) && defined(NONAMELESSUNION) - // avoid breaking strict-aliasing rules in such line: (EndpointFormFactor)(*((UINT *)(((WORD *)&value.wReserved3)+1))); - UINT v; - memcpy(&v, (((WORD *)&value.wReserved3)+1), sizeof(v)); - paWasapi->devInfo[i].formFactor = (EndpointFormFactor)v; - #else - paWasapi->devInfo[i].formFactor = (EndpointFormFactor)value.uintVal; - #endif - PA_DEBUG(("WASAPI:%d| form-factor[%d]\n", i, paWasapi->devInfo[i].formFactor)); - // cleanup - PropVariantClear(&value); - } - - SAFE_RELEASE(pProperty); - } - - // Endpoint data - { - IMMEndpoint *endpoint = NULL; - hr = IMMDevice_QueryInterface(paWasapi->devInfo[i].device, &pa_IID_IMMEndpoint, (void **)&endpoint); - if (SUCCEEDED(hr)) - { - hr = IMMEndpoint_GetDataFlow(endpoint, &paWasapi->devInfo[i].flow); - SAFE_RELEASE(endpoint); - } - } - #endif - - // Getting a temporary IAudioClient for more fields - // we make sure NOT to call Initialize yet! - { - #ifdef PA_WINRT - // Set flow as ActivateAudioInterface depends on it and selects corresponding - // direction for the Audio Client - paWasapi->devInfo[i].flow = (i == 0 ? eRender : eCapture); - #endif - - // Create temp Audio Client instance to query additional details - hr = ActivateAudioInterface(&paWasapi->devInfo[i], NULL, &tmpClient); - // We need to set the result to a value otherwise we will return paNoError - // [IF_FAILED_JUMP(hResult, error);] - IF_FAILED_INTERNAL_ERROR_JUMP(hr, result, error); - - // Get latency - hr = IAudioClient_GetDevicePeriod(tmpClient, - &paWasapi->devInfo[i].DefaultDevicePeriod, - &paWasapi->devInfo[i].MinimumDevicePeriod); - if (FAILED(hr)) - { - PA_DEBUG(("WASAPI:%d| failed getting min/default periods by IAudioClient::GetDevicePeriod() with error[%08X], will use 30000/100000 hns\n", i, (UINT32)hr)); - - // assign WASAPI common values - paWasapi->devInfo[i].DefaultDevicePeriod = 100000; - paWasapi->devInfo[i].MinimumDevicePeriod = 30000; - - // ignore error, let continue further without failing with paInternalError - hr = S_OK; - } - - // Get mix format - { - WAVEFORMATEX *mixFormat; - - hr = IAudioClient_GetMixFormat(tmpClient, &mixFormat); - if (SUCCEEDED(hr)) - { - memcpy(&paWasapi->devInfo[i].MixFormat, mixFormat, min(sizeof(paWasapi->devInfo[i].MixFormat), (sizeof(*mixFormat) + mixFormat->cbSize))); - CoTaskMemFree(mixFormat); - } - } - - // Register WINRT device - #ifdef PA_WINRT - if (SUCCEEDED(hr)) - { - // Default device - if (i == 0) - hostApi->info.defaultOutputDevice = hostApi->info.deviceCount; - else - hostApi->info.defaultInputDevice = hostApi->info.deviceCount; - - // State - paWasapi->devInfo[i].state = DEVICE_STATE_ACTIVE; - - // Default format is always a mix format - paWasapi->devInfo[i].DefaultFormat = paWasapi->devInfo[i].MixFormat; - - // Form-factor - paWasapi->devInfo[i].formFactor = UnknownFormFactor; - - // Name - if ((deviceInfo->name = (char *)PaUtil_GroupAllocateMemory(paWasapi->allocations, MAX_STR_LEN + 1)) == NULL) - { - SAFE_RELEASE(tmpClient); - result = paInsufficientMemory; - goto error; - } - _snprintf((char *)deviceInfo->name, MAX_STR_LEN - 1, "WASAPI_%s:%d", (i == 0 ? "Output" : "Input"), i); - PA_DEBUG(("WASAPI:%d| name[%s]\n", i, deviceInfo->name)); - } - #endif - - // Release tmp client - SAFE_RELEASE(tmpClient); - - if (hr != S_OK) - { - //davidv: this happened with my hardware, previously for that same device in DirectSound: - //Digital Output (Realtek AC'97 Audio)'s GUID: {0x38f2cf50,0x7b4c,0x4740,0x86,0xeb,0xd4,0x38,0x66,0xd8,0xc8, 0x9f} - //so something must be _really_ wrong with this device, TODO handle this better. We kind of need GetMixFormat - LogHostError(hr); - // We need to set the result to a value otherwise we will return paNoError - result = paInternalError; - goto error; - } - } - - // we can now fill in portaudio device data - deviceInfo->maxInputChannels = 0; - deviceInfo->maxOutputChannels = 0; - deviceInfo->defaultSampleRate = paWasapi->devInfo[i].MixFormat.Format.nSamplesPerSec; - switch (paWasapi->devInfo[i].flow) - { - case eRender: { - deviceInfo->maxOutputChannels = paWasapi->devInfo[i].MixFormat.Format.nChannels; - deviceInfo->defaultHighOutputLatency = nano100ToSeconds(paWasapi->devInfo[i].DefaultDevicePeriod); - deviceInfo->defaultLowOutputLatency = nano100ToSeconds(paWasapi->devInfo[i].MinimumDevicePeriod); - PA_DEBUG(("WASAPI:%d| def.SR[%d] max.CH[%d] latency{hi[%f] lo[%f]}\n", i, (UINT32)deviceInfo->defaultSampleRate, - deviceInfo->maxOutputChannels, (float)deviceInfo->defaultHighOutputLatency, (float)deviceInfo->defaultLowOutputLatency)); - break;} - case eCapture: { - deviceInfo->maxInputChannels = paWasapi->devInfo[i].MixFormat.Format.nChannels; - deviceInfo->defaultHighInputLatency = nano100ToSeconds(paWasapi->devInfo[i].DefaultDevicePeriod); - deviceInfo->defaultLowInputLatency = nano100ToSeconds(paWasapi->devInfo[i].MinimumDevicePeriod); - PA_DEBUG(("WASAPI:%d| def.SR[%d] max.CH[%d] latency{hi[%f] lo[%f]}\n", i, (UINT32)deviceInfo->defaultSampleRate, - deviceInfo->maxInputChannels, (float)deviceInfo->defaultHighInputLatency, (float)deviceInfo->defaultLowInputLatency)); - break; } - default: - PRINT(("WASAPI:%d| bad Data Flow!\n", i)); - // We need to set the result to a value otherwise we will return paNoError - result = paInternalError; - //continue; // do not skip from list, allow to initialize - break; - } + if ((result = FillInactiveDeviceInfo(paWasapi, deviceInfo)) != paNoError) + goto error; hostApi->deviceInfos[i] = deviceInfo; ++hostApi->info.deviceCount; } - - #if defined(PA_WASAPI_MAX_CONST_DEVICE_COUNT) && (PA_WASAPI_MAX_CONST_DEVICE_COUNT > 0) - if (hostApi->info.deviceCount < PA_WASAPI_MAX_CONST_DEVICE_COUNT) - { - for (i = hostApi->info.deviceCount; i < PA_WASAPI_MAX_CONST_DEVICE_COUNT; ++i) - { - PaDeviceInfo *deviceInfo = &deviceInfoArray[i]; - deviceInfo->structVersion = 2; - deviceInfo->hostApi = hostApiIndex; - - if ((deviceInfo->name = (char *)PaUtil_GroupAllocateMemory(paWasapi->allocations, 1)) == NULL) - { - result = paInsufficientMemory; - goto error; - } - ((char *)deviceInfo->name)[0] = 0; - - hostApi->deviceInfos[i] = deviceInfo; - ++hostApi->info.deviceCount; - } - } - #endif } +#endif + + // Clear any non-fatal errors + result = paNoError; + + PRINT(("WASAPI: device list ok - found %d devices\n", paWasapi->deviceCount)); + +done: #ifndef PA_WINRT + CoTaskMemFree(defaultRenderer); + CoTaskMemFree(defaultCapturer); SAFE_RELEASE(pEndPoints); SAFE_RELEASE(pEnumerator); #endif - PRINT(("WASAPI: device list created ok\n")); - - return paNoError; + return result; error: - - PRINT(("WASAPI: failed %s error[%d|%s]\n", __FUNCTION__, result, Pa_GetErrorText(result))); - -#ifndef PA_WINRT - SAFE_RELEASE(pEndPoints); - SAFE_RELEASE(pEnumerator); -#endif - + // Safety if error was not set so that we do not think initialize was a success if (result == paNoError) result = paInternalError; - return result; + PRINT(("WASAPI: failed to create device list - error[%d|%s]\n", result, Pa_GetErrorText(result))); + + goto done; } // ------------------------------------------------------------------------------------------ @@ -5637,7 +5672,7 @@ static void FinishComPointers(PaWasapiStream *stream, BOOL threadComInitialized) PA_THREAD_FUNC ProcThreadEvent(void *param) { PaWasapiHostProcessor processor[S_COUNT]; - HRESULT hr; + HRESULT hr = S_OK; DWORD dwResult; PaWasapiStream *stream = (PaWasapiStream *)param; PaWasapiHostProcessor defaultProcessor; @@ -5931,7 +5966,7 @@ static inline INT32 GetNextSleepTime(SystemTimer *timer, ThreadIdleScheduler *sc PA_THREAD_FUNC ProcThreadPoll(void *param) { PaWasapiHostProcessor processor[S_COUNT]; - HRESULT hr; + HRESULT hr = S_OK; PaWasapiStream *stream = (PaWasapiStream *)param; PaWasapiHostProcessor defaultProcessor; INT32 i; From 6bb858643b55834b12664401e9df7fe1899a20ef Mon Sep 17 00:00:00 2001 From: dmitrykos Date: Thu, 26 Mar 2020 20:50:52 +0200 Subject: [PATCH 026/164] alsa: Introduce possibility to ignore all ALSA plugin devices by setting the environment variable PA_ALSA_IGNORE_ALL_PLUGINS to non-0. Fixed logic of guarding assertion in BuildDeviceList() when only one or none PCM device is available (may occur if PA_ALSA_IGNORE_ALL_PLUGINS is set to non-0 or when device has no any audio device available, including plugin devices). --- src/hostapi/alsa/pa_linux_alsa.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/hostapi/alsa/pa_linux_alsa.c b/src/hostapi/alsa/pa_linux_alsa.c index 584cde8..c92f9aa 100644 --- a/src/hostapi/alsa/pa_linux_alsa.c +++ b/src/hostapi/alsa/pa_linux_alsa.c @@ -1066,6 +1066,10 @@ static int IgnorePlugin( const char *pluginId ) static const char *ignoredPlugins[] = {"hw", "plughw", "plug", "dsnoop", "tee", "file", "null", "shm", "cards", "rate_convert", NULL}; int i = 0; + + if( getenv( "PA_ALSA_IGNORE_ALL_PLUGINS" ) && atoi( getenv( "PA_ALSA_IGNORE_ALL_PLUGINS") ) ) + return 1; + while( ignoredPlugins[i] ) { if( !strcmp( pluginId, ignoredPlugins[i] ) ) @@ -1327,6 +1331,8 @@ static PaError BuildDeviceList( PaAlsaHostApiRepresentation *alsaApi ) paInsufficientMemory ); snprintf( deviceName, len, "%s: %s (%s)", cardName, infoName, buf ); + PA_DEBUG(( "%s: Found device [%d]: %s\n", __FUNCTION__, numDeviceNames, deviceName )); + ++numDeviceNames; if( !hwDevInfos || numDeviceNames > maxDeviceNames ) { @@ -1450,7 +1456,7 @@ static PaError BuildDeviceList( PaAlsaHostApiRepresentation *alsaApi ) PA_ENSURE( FillInDevInfo( alsaApi, hwInfo, blocking, devInfo, &devIdx ) ); } - assert( devIdx < numDeviceNames ); + assert( devIdx <= numDeviceNames ); /* Now inspect 'dmix' and 'default' plugins */ for( i = 0; i < numDeviceNames; ++i ) { From bd5b68a62b9ed4cca652b5c7875d93f0510dac04 Mon Sep 17 00:00:00 2001 From: Etienne Dechamps Date: Sun, 18 Oct 2020 10:42:55 +0200 Subject: [PATCH 027/164] Ignore files generated by Visual Studio 2017/2019. --- .gitignore | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.gitignore b/.gitignore index 892ddfc..8efca60 100644 --- a/.gitignore +++ b/.gitignore @@ -40,3 +40,9 @@ portaudio-2.0.pc *.exe *.out *.app + +# Visual Studio 2017/2019 state folder +.vs/ + +# Visual Studio CMake build output folder +out/ From 5bc01421c830f0785d5634acfc53ee0613bdb28e Mon Sep 17 00:00:00 2001 From: Etienne Dechamps Date: Sun, 18 Oct 2020 11:09:40 +0200 Subject: [PATCH 028/164] Add a GitHub action for cross-compiling to MinGW via CMake. --- .github/workflows/c-cpp.yml | 13 +++++++++++++ i686-w64-mingw32.cmake | 17 +++++++++++++++++ 2 files changed, 30 insertions(+) create mode 100644 i686-w64-mingw32.cmake diff --git a/.github/workflows/c-cpp.yml b/.github/workflows/c-cpp.yml index 10ecb69..ea0f17b 100644 --- a/.github/workflows/c-cpp.yml +++ b/.github/workflows/c-cpp.yml @@ -17,3 +17,16 @@ jobs: run: ./configure - name: make run: make + + build-cmake-mingw: + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + - name: apt + run: sudo apt-get install mingw-w64 + - name: cmake + run: cmake -DCMAKE_TOOLCHAIN_FILE=i686-w64-mingw32.cmake . + - name: make + run: make diff --git a/i686-w64-mingw32.cmake b/i686-w64-mingw32.cmake new file mode 100644 index 0000000..c3331b6 --- /dev/null +++ b/i686-w64-mingw32.cmake @@ -0,0 +1,17 @@ +# CMake Toolchain file for cross-compiling PortAudio to i686-w64-mingw32 +# Inspired from: https://gitlab.kitware.com/cmake/community/-/wikis/doc/cmake/cross_compiling/Mingw +# Example usage: $ cmake -DCMAKE_TOOLCHAIN_FILE=i686-w64-mingw32.cmake . +# i686-w64-mingw32 needs to be installed for this to work. On Debian-based +# distributions the package is typically named `mingw-w64`. + +SET(CMAKE_SYSTEM_NAME Windows) + +SET(CMAKE_C_COMPILER i686-w64-mingw32-gcc) +SET(CMAKE_CXX_COMPILER i686-w64-mingw32-g++) +SET(CMAKE_RC_COMPILER i686-w64-mingw32-windres) + +SET(CMAKE_FIND_ROOT_PATH /usr/i686-w64-mingw32) + +set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) +set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) From 58fe947b7fdb74a1010e2a3619ea2c7ff9c929dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-Micha=C3=ABl=20Celerier?= Date: Tue, 6 Oct 2020 23:07:15 +0200 Subject: [PATCH 029/164] Add support for enabling dynamic alsa loading in CMakeLists.txt It had been added to the source code a long time ago, but was not integrated to the build system. --- CMakeLists.txt | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 4fbb3a8..0302ae8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -293,6 +293,7 @@ ELSE() FIND_PACKAGE(ALSA) IF(ALSA_FOUND) OPTION(PA_USE_ALSA "Enable support for ALSA" ON) + OPTION(PA_ALSA_DYNAMIC "Enable loading ALSA through dlopen" OFF) ELSE() OPTION(PA_USE_ALSA "Enable support for ALSA" OFF) ENDIF() @@ -303,8 +304,14 @@ ELSE() SET(PA_PUBLIC_INCLUDES ${PA_PUBLIC_INCLUDES} include/pa_linux_alsa.h) SET(PA_SOURCES ${PA_SOURCES} ${PA_ALSA_SOURCES}) SET(PA_PRIVATE_COMPILE_DEFINITIONS ${PA_PRIVATE_COMPILE_DEFINITIONS} PA_USE_ALSA) - SET(PA_LIBRARY_DEPENDENCIES ${PA_LIBRARY_DEPENDENCIES} ${ALSA_LIBRARIES}) - SET(PA_PKGCONFIG_LDFLAGS "${PA_PKGCONFIG_LDFLAGS} -lasound") + IF(PA_ALSA_DYNAMIC) + SET(PA_PRIVATE_COMPILE_DEFINITIONS ${PA_PRIVATE_COMPILE_DEFINITIONS} PA_ALSA_DYNAMIC) + SET(PA_LIBRARY_DEPENDENCIES ${PA_LIBRARY_DEPENDENCIES} ${CMAKE_DL_LIBS}) + SET(PA_PKGCONFIG_LDFLAGS "${PA_PKGCONFIG_LDFLAGS} -l${CMAKE_DL_LIBS}") + ELSE() + SET(PA_LIBRARY_DEPENDENCIES ${PA_LIBRARY_DEPENDENCIES} ${ALSA_LIBRARIES}) + SET(PA_PKGCONFIG_LDFLAGS "${PA_PKGCONFIG_LDFLAGS} -lasound") + ENDIF() ENDIF() ENDIF() From e96c5dbdec277fa59a432894bae65342cfbd4cc6 Mon Sep 17 00:00:00 2001 From: Etienne Dechamps Date: Sun, 18 Oct 2020 10:48:57 +0200 Subject: [PATCH 030/164] Add a GitHub action for building with CMake. --- .github/workflows/c-cpp.yml | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/.github/workflows/c-cpp.yml b/.github/workflows/c-cpp.yml index ea0f17b..a9fb33f 100644 --- a/.github/workflows/c-cpp.yml +++ b/.github/workflows/c-cpp.yml @@ -18,6 +18,17 @@ jobs: - name: make run: make + build-cmake: + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + - name: cmake + run: cmake . + - name: make + run: make + build-cmake-mingw: runs-on: ubuntu-latest From 9d3e583ce50a075ff36d9050bf7ee9fcca88f6ca Mon Sep 17 00:00:00 2001 From: Etienne Dechamps Date: Sun, 18 Oct 2020 13:06:03 +0200 Subject: [PATCH 031/164] Add a GitHub action for building with CMake on MSVC. --- .github/workflows/c-cpp.yml | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/.github/workflows/c-cpp.yml b/.github/workflows/c-cpp.yml index a9fb33f..180b46b 100644 --- a/.github/workflows/c-cpp.yml +++ b/.github/workflows/c-cpp.yml @@ -29,6 +29,17 @@ jobs: - name: make run: make + build-cmake-msvc: + + runs-on: windows-latest + + steps: + - uses: actions/checkout@v1 + - name: cmake + run: cmake . + - name: build + run: cmake --build . + build-cmake-mingw: runs-on: ubuntu-latest From b1a09028525629a5d7dc9bc4189264e729f47ed8 Mon Sep 17 00:00:00 2001 From: "Hool, Rory" Date: Thu, 22 Oct 2020 13:53:56 -0400 Subject: [PATCH 032/164] Replace usage of deprecated component manager APIs on 10.6+ These APIs are deprecated in 10.8+ and are disabled on 11.0(10.16)+ https://developer.apple.com/documentation/coreservices/carbon_core/component_manager?language=objc > "This application, or a library it uses, is using the deprecated Component Manager for hosting Audio Components. This is not supported when rebuilding against the 10.16 or later SDK. Also, this makes the host incompatible with version 3 audio units. Please transition to the API's in AudioComponent.h." --- src/hostapi/coreaudio/pa_mac_core.c | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/src/hostapi/coreaudio/pa_mac_core.c b/src/hostapi/coreaudio/pa_mac_core.c index 257e9de..a0eb6fd 100644 --- a/src/hostapi/coreaudio/pa_mac_core.c +++ b/src/hostapi/coreaudio/pa_mac_core.c @@ -1173,8 +1173,13 @@ static PaError OpenAndSetupOneAudioUnit( const double sampleRate, void *refCon ) { +#if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_6 + AudioComponentDescription desc; + AudioComponent comp; +#else ComponentDescription desc; Component comp; +#endif /*An Apple TN suggests using CAStreamBasicDescription, but that is C++*/ AudioStreamBasicDescription desiredFormat; OSStatus result = noErr; @@ -1245,7 +1250,11 @@ static PaError OpenAndSetupOneAudioUnit( desc.componentFlags = 0; desc.componentFlagsMask = 0; /* -- find the component -- */ +#if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_6 + comp = AudioComponentFindNext( NULL, &desc ); +#else comp = FindNextComponent( NULL, &desc ); +#endif if( !comp ) { DBUG( ( "AUHAL component not found." ) ); @@ -1254,7 +1263,11 @@ static PaError OpenAndSetupOneAudioUnit( return paUnanticipatedHostError; } /* -- open it -- */ +#if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_6 + result = AudioComponentInstanceNew( comp, audioUnit ); +#else result = OpenAComponent( comp, audioUnit ); +#endif if( result ) { DBUG( ( "Failed to open AUHAL component." ) ); @@ -1607,7 +1620,12 @@ static PaError OpenAndSetupOneAudioUnit( #undef ERR_WRAP error: + +#if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_6 + AudioComponentInstanceDispose( *audioUnit ); +#else CloseComponent( *audioUnit ); +#endif *audioUnit = NULL; if( result ) return PaMacCore_SetError( result, line, 1 ); @@ -2645,13 +2663,21 @@ static PaError CloseStream( PaStream* s ) } if( stream->outputUnit && stream->outputUnit != stream->inputUnit ) { AudioUnitUninitialize( stream->outputUnit ); +#if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_6 + AudioComponentInstanceDispose( stream->outputUnit ); +#else CloseComponent( stream->outputUnit ); +#endif } stream->outputUnit = NULL; if( stream->inputUnit ) { AudioUnitUninitialize( stream->inputUnit ); +#if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_6 + AudioComponentInstanceDispose( stream->inputUnit ); +#else CloseComponent( stream->inputUnit ); +#endif stream->inputUnit = NULL; } if( stream->inputRingBuffer.buffer ) From a5fb8d94aa77c517022f9a6b112acb3cf61362dc Mon Sep 17 00:00:00 2001 From: dmitrykos Date: Mon, 26 Oct 2020 16:40:25 +0200 Subject: [PATCH 033/164] wasapi: Support multiple devices in the device list on Windows UWP/WinRT platform. All UWP/WinRT functions are now prefixed as PaWasapiWinrt_ to be clearly visible, therefore PaWasapi_SetDefaultInterfaceId() was renamed to PaWasapiWinrt_SetDefaultDeviceId(). Expanded Important notes regarding UWP/WinRT platform and how to make the fully-functional device list with the corresponding pseudo-code example for easier understanding of the functionality. --- include/pa_win_wasapi.h | 128 ++++++++-- src/hostapi/wasapi/pa_win_wasapi.c | 377 ++++++++++++++++++++--------- 2 files changed, 365 insertions(+), 140 deletions(-) diff --git a/include/pa_win_wasapi.h b/include/pa_win_wasapi.h index 9b827d1..e8b93b6 100644 --- a/include/pa_win_wasapi.h +++ b/include/pa_win_wasapi.h @@ -516,28 +516,6 @@ PaError PaWasapi_GetJackCount( PaDeviceIndex device, int *pJackCount ); PaError PaWasapi_GetJackDescription( PaDeviceIndex device, int jackIndex, PaWasapiJackDescription *pJackDescription ); -/** Set default interface Id. - - By default PA implementation will use DEVINTERFACE_AUDIO_RENDER and - DEVINTERFACE_AUDIO_CAPTURE if device Id is not provided explicitly. These default Ids - will not allow to use Exclusive mode on UWP platform and thus you must provide - device Id explicitly via this API before calling Pa_OpenStream(). - Device Ids on UWP platform are obtainable via - Windows::Media::Devices::MediaDevice::GetDefaultAudioRenderId() or - Windows::Media::Devices::MediaDevice::GetDefaultAudioCaptureId() API. - - @note UWP platform only. - - @param pId Interface Id, pointer to the 16-bit Unicode string (WCHAR). If NULL then device Id - will be reset to the default, e.g. DEVINTERFACE_AUDIO_RENDER or DEVINTERFACE_AUDIO_CAPTURE. - @param bOutput TRUE (1) for output (render), FALSE (0) for input (capture). - - @return Error code indicating success or failure. Will return paIncompatibleStreamHostApi if PA is not compiled - for UWP platform. If Id is longer than 4096 characters paBufferTooBig will be returned. -*/ -PaError PaWasapi_SetDefaultInterfaceId( unsigned short *pId, int bOutput ); - - /** Set stream state handler. @param pStream Pointer to PaStream object. @@ -549,6 +527,74 @@ PaError PaWasapi_SetDefaultInterfaceId( unsigned short *pId, int bOutput ); PaError PaWasapi_SetStreamStateHandler( PaStream *pStream, PaWasapiStreamStateCallback fnStateHandler, void *pUserData ); +/** Set default device Id. + + By default implementation will use the DEVINTERFACE_AUDIO_RENDER and + DEVINTERFACE_AUDIO_CAPTURE Ids if device Id is not provided explicitly. These default Ids + will not allow to use Exclusive mode on UWP/WinRT platform and thus you must provide + device Id explicitly via this API before calling the Pa_OpenStream(). + + Device Ids on UWP platform are obtainable via: + Windows::Media::Devices::MediaDevice::GetDefaultAudioRenderId() or + Windows::Media::Devices::MediaDevice::GetDefaultAudioCaptureId() API. + + After the call completes, memory referenced by pointers can be freed, as implementation keeps its own copy. + + Call this function before calling Pa_IsFormatSupported() when Exclusive mode is requested. + + See an example in the IMPORTANT notes. + + @note UWP/WinRT platform only. + + @param pId Device Id, pointer to the 16-bit Unicode string (WCHAR). If NULL then device Id + will be reset to the default, e.g. DEVINTERFACE_AUDIO_RENDER or DEVINTERFACE_AUDIO_CAPTURE. + @param bOutput TRUE (1) for output (render), FALSE (0) for input (capture). + + @return Error code indicating success or failure. Will return paIncompatibleStreamHostApi if library is not compiled + for UWP/WinRT platform. If Id is longer than PA_WASAPI_DEVICE_ID_LEN characters paBufferTooBig will + be returned. +*/ +PaError PaWasapiWinrt_SetDefaultDeviceId( const unsigned short *pId, int bOutput ); + + +/** Populate the device list. + + By default the implementation will rely on DEVINTERFACE_AUDIO_RENDER and DEVINTERFACE_AUDIO_CAPTURE as + default devices. If device Id is provided by PaWasapiWinrt_SetDefaultDeviceId() then those + device Ids will be used as default and only devices for the device list. + + By populating the device list you can provide an additional available audio devices of the system to PA + which are obtainable by: + Windows::Devices::Enumeration::DeviceInformation::FindAllAsync(selector) where selector is obtainable by + Windows::Media::Devices::MediaDevice::GetAudioRenderSelector() or + Windows::Media::Devices::MediaDevice::GetAudioCaptureSelector() API. + + After the call completes, memory referenced by pointers can be freed, as implementation keeps its own copy. + + You must call PaWasapi_UpdateDeviceList() to update the internal device list of the implementation after + calling this function. + + See an example in the IMPORTANT notes. + + @note UWP/WinRT platform only. + + @param pId Array of device Ids, pointer to the array of pointers of 16-bit Unicode string (WCHAR). If NULL + and count is also 0 then device Ids will be reset to the default. Required. + @param pName Array of device Names, pointer to the array of pointers of 16-bit Unicode string (WCHAR). Optional. + @param pRole Array of device Roles, see PaWasapiDeviceRole and PaWasapi_GetDeviceRole() for more details. Optional. + @param count Number of devices, the number of array elements (pId, pName, pRole). Maximum count of devices + is limited by PA_WASAPI_DEVICE_MAX_COUNT. + @param bOutput TRUE (1) for output (render), FALSE (0) for input (capture). + + @return Error code indicating success or failure. Will return paIncompatibleStreamHostApi if library is not compiled + for UWP/WinRT platform. If Id is longer than PA_WASAPI_DEVICE_ID_LEN characters paBufferTooBig will + be returned. If Name is longer than PA_WASAPI_DEVICE_NAME_LEN characters paBufferTooBig will + be returned. +*/ +PaError PaWasapiWinrt_PopulateDeviceList( const unsigned short **pId, const unsigned short **pName, + const PaWasapiDeviceRole *pRole, unsigned int count, int bOutput ); + + /* IMPORTANT: @@ -626,6 +672,44 @@ PaError PaWasapi_SetStreamStateHandler( PaStream *pStream, PaWasapiStreamStateCa 2) pXXX - pointer 3) fnXXX - pointer to function 4) structure members are never prefixed with a type distinguisher + + + UWP/WinRT: + + This platform has number of limitations which do not allow to enumerate audio devices without + an additional external help. Enumeration is possible though from C++/CX, check the related API + Windows::Devices::Enumeration::DeviceInformation::FindAllAsync(). + + The main limitation is an absence of the device enumeration from inside the PA's implementation. + This problem can be solved by using the following functions: + + PaWasapiWinrt_SetDefaultDeviceId() - to set default input/output device, + PaWasapiWinrt_PopulateDeviceList() - to populate device list with devices. + + Here is an example of populating the device list which can also be updated dynamically depending on + whether device was removed from or added to the system: + + ---------------- + + std::vector ids, names; + std::vector role; + + ids.resize(count); + names.resize(count); + role.resize(count); + + for (UINT32 i = 0; i < count; ++i) + { + ids[i] = (const UINT16 *)device_ids[i].c_str(); + names[i] = (const UINT16 *)device_names[i].c_str(); + role[i] = eRoleUnknownFormFactor; + } + + PaWasapiWinrt_SetDefaultDeviceId((const UINT16 *)default_device_id.c_str(), !capture); + PaWasapiWinrt_PopulateDeviceList(ids.data(), names.data(), role.data(), count, !capture); + PaWasapi_UpdateDeviceList(); + + ---------------- */ #ifdef __cplusplus diff --git a/src/hostapi/wasapi/pa_win_wasapi.c b/src/hostapi/wasapi/pa_win_wasapi.c index 866d372..c155f1f 100644 --- a/src/hostapi/wasapi/pa_win_wasapi.c +++ b/src/hostapi/wasapi/pa_win_wasapi.c @@ -309,10 +309,10 @@ PA_THREAD_FUNC ProcThreadPoll(void *param); #define AUDCLNT_STREAMFLAGS_AUTOCONVERTPCM 0x80000000 #endif -#define MAX_STR_LEN 512 - +#define PA_WASAPI_DEVICE_ID_LEN 256 +#define PA_WASAPI_DEVICE_NAME_LEN 128 #ifdef PA_WINRT - #define PA_WASAPI_DEVICE_ID_LEN 4096 + #define PA_WASAPI_DEVICE_MAX_COUNT 16 #endif enum { S_INPUT = 0, S_OUTPUT = 1, S_COUNT = 2, S_FULLDUPLEX = 0 }; @@ -430,8 +430,8 @@ typedef struct PaWasapiDeviceInfo IMMDevice *device; #endif - // from GetId - WCHAR szDeviceID[MAX_STR_LEN]; + // device Id + WCHAR deviceId[PA_WASAPI_DEVICE_ID_LEN]; // from GetState DWORD state; @@ -450,7 +450,7 @@ typedef struct PaWasapiDeviceInfo // Fields filled from IMMEndpoint'sGetDataFlow EDataFlow flow; - // Formfactor + // Form-factor EndpointFormFactor formFactor; } PaWasapiDeviceInfo; @@ -623,10 +623,44 @@ static void *PaWasapi_ReallocateMemory(void *prev, size_t size); static void PaWasapi_FreeMemory(void *ptr); static PaSampleFormat WaveToPaFormat(const WAVEFORMATEXTENSIBLE *fmtext); -// Local statics +// WinRT (UWP) device list #ifdef PA_WINRT -static OLECHAR g_DefaultRenderId[PA_WASAPI_DEVICE_ID_LEN] = { 0 }; -static OLECHAR g_DefaultCaptureId[PA_WASAPI_DEVICE_ID_LEN] = { 0 }; +typedef struct PaWasapiWinrtDeviceInfo +{ + WCHAR id[PA_WASAPI_DEVICE_ID_LEN]; + WCHAR name[PA_WASAPI_DEVICE_NAME_LEN]; + EndpointFormFactor formFactor; +} +PaWasapiWinrtDeviceInfo; +typedef struct PaWasapiWinrtDeviceListRole +{ + WCHAR defaultId[PA_WASAPI_DEVICE_ID_LEN]; + PaWasapiWinrtDeviceInfo devices[PA_WASAPI_DEVICE_MAX_COUNT]; + UINT32 deviceCount; +} +PaWasapiWinrtDeviceListRole; +typedef struct PaWasapiWinrtDeviceList +{ + PaWasapiWinrtDeviceListRole render; + PaWasapiWinrtDeviceListRole capture; +} +PaWasapiWinrtDeviceList; +static PaWasapiWinrtDeviceList g_DeviceListInfo = { 0 }; +#endif + +// WinRT (UWP) device list context +#ifdef PA_WINRT +typedef struct PaWasapiWinrtDeviceListContextEntry +{ + PaWasapiWinrtDeviceInfo *info; + EDataFlow flow; +} +PaWasapiWinrtDeviceListContextEntry; +typedef struct PaWasapiWinrtDeviceListContext +{ + PaWasapiWinrtDeviceListContextEntry devices[PA_WASAPI_DEVICE_MAX_COUNT * 2]; +} +PaWasapiWinrtDeviceListContext; #endif // ------------------------------------------------------------------------------------------ @@ -1593,65 +1627,72 @@ static HRESULT (STDMETHODCALLTYPE PaActivateAudioInterfaceCompletionHandler_Acti return hr; } -static IActivateAudioInterfaceCompletionHandler *CreateActivateAudioInterfaceCompletionHandler(const IID *iid, void **obj) +static IActivateAudioInterfaceCompletionHandler *CreateActivateAudioInterfaceCompletionHandler(const IID *iid, void **client) { PaActivateAudioInterfaceCompletionHandler *handler = PaUtil_AllocateMemory(sizeof(PaActivateAudioInterfaceCompletionHandler)); - ZeroMemory(handler, sizeof(*handler)); + + memset(handler, 0, sizeof(*handler)); + handler->parent.lpVtbl = PaUtil_AllocateMemory(sizeof(*handler->parent.lpVtbl)); handler->parent.lpVtbl->QueryInterface = &PaActivateAudioInterfaceCompletionHandler_QueryInterface; handler->parent.lpVtbl->AddRef = &PaActivateAudioInterfaceCompletionHandler_AddRef; handler->parent.lpVtbl->Release = &PaActivateAudioInterfaceCompletionHandler_Release; handler->parent.lpVtbl->ActivateCompleted = &PaActivateAudioInterfaceCompletionHandler_ActivateCompleted; - handler->refs = 1; + handler->refs = 1; handler->in.iid = iid; - handler->in.obj = obj; + handler->in.obj = client; + return (IActivateAudioInterfaceCompletionHandler *)handler; } #endif // ------------------------------------------------------------------------------------------ #ifdef PA_WINRT -static HRESULT ActivateAudioInterface_WINRT(EDataFlow flow, const IID *iid, void **obj) +static HRESULT WinRT_GetDefaultDeviceId(WCHAR *deviceId, UINT32 deviceIdMax, EDataFlow flow) { -#define PA_WASAPI_DEVICE_PATH_LEN 64 - - PaError result = paNoError; - HRESULT hr = S_OK; - IActivateAudioInterfaceAsyncOperation *asyncOp = NULL; - IActivateAudioInterfaceCompletionHandler *handler = CreateActivateAudioInterfaceCompletionHandler(iid, obj); - PaActivateAudioInterfaceCompletionHandler *handlerImpl = (PaActivateAudioInterfaceCompletionHandler *)handler; - OLECHAR tmp[PA_WASAPI_DEVICE_PATH_LEN] = { 0 }; - OLECHAR *devicePath = tmp; - - // Get device path in form L"{DEVICE_GUID}" switch (flow) { case eRender: - if (g_DefaultRenderId[0] != 0) - devicePath = g_DefaultRenderId; + if (g_DeviceListInfo.render.defaultId[0] != 0) + wcsncpy_s(deviceId, deviceIdMax, g_DeviceListInfo.render.defaultId, wcslen(g_DeviceListInfo.render.defaultId)); else - StringFromGUID2(&DEVINTERFACE_AUDIO_RENDER, devicePath, PA_WASAPI_DEVICE_PATH_LEN - 1); + StringFromGUID2(&DEVINTERFACE_AUDIO_RENDER, deviceId, deviceIdMax); break; case eCapture: - if (g_DefaultCaptureId[0] != 0) - devicePath = g_DefaultCaptureId; + if (g_DeviceListInfo.capture.defaultId[0] != 0) + wcsncpy_s(deviceId, deviceIdMax, g_DeviceListInfo.capture.defaultId, wcslen(g_DeviceListInfo.capture.defaultId)); else - StringFromGUID2(&DEVINTERFACE_AUDIO_CAPTURE, devicePath, PA_WASAPI_DEVICE_PATH_LEN - 1); + StringFromGUID2(&DEVINTERFACE_AUDIO_CAPTURE, deviceId, deviceIdMax); break; default: return S_FALSE; - } + } + return S_OK; +} +#endif + +// ------------------------------------------------------------------------------------------ +#ifdef PA_WINRT +static HRESULT WinRT_ActivateAudioInterface(const WCHAR *deviceId, const IID *iid, void **client) +{ + PaError result = paNoError; + HRESULT hr = S_OK; + IActivateAudioInterfaceAsyncOperation *asyncOp = NULL; + IActivateAudioInterfaceCompletionHandler *handler = CreateActivateAudioInterfaceCompletionHandler(iid, client); + PaActivateAudioInterfaceCompletionHandler *handlerImpl = (PaActivateAudioInterfaceCompletionHandler *)handler; + UINT32 sleepToggle = 0; + // Async operation will call back to IActivateAudioInterfaceCompletionHandler::ActivateCompleted // which must be an agile interface implementation - hr = ActivateAudioInterfaceAsync(devicePath, iid, NULL, handler, &asyncOp); + hr = ActivateAudioInterfaceAsync(deviceId, iid, NULL, handler, &asyncOp); IF_FAILED_INTERNAL_ERROR_JUMP(hr, result, error); // Wait in busy loop for async operation to complete // Use Interlocked API here to ensure that ->done variable is read every time through the loop while (SUCCEEDED(hr) && !InterlockedOr(&handlerImpl->done, 0)) { - Sleep(1); + Sleep(sleepToggle ^= 1); } hr = handlerImpl->out.hr; @@ -1662,8 +1703,6 @@ error: SAFE_RELEASE(handler); return hr; - -#undef PA_WASAPI_DEVICE_PATH_LEN } #endif @@ -1677,7 +1716,7 @@ static HRESULT ActivateAudioInterface(const PaWasapiDeviceInfo *deviceInfo, cons if (FAILED(hr = IMMDevice_Activate(deviceInfo->device, GetAudioClientIID(), CLSCTX_ALL, NULL, (void **)client))) return hr; #else - if (FAILED(hr = ActivateAudioInterface_WINRT(deviceInfo->flow, GetAudioClientIID(), (void **)client))) + if (FAILED(hr = WinRT_ActivateAudioInterface(deviceInfo->deviceId, GetAudioClientIID(), (void **)client))) return hr; #endif @@ -1766,37 +1805,41 @@ static PaError FillInactiveDeviceInfo(PaWasapiHostApiRepresentation *paWasapi, P } // ------------------------------------------------------------------------------------------ -static PaError FillDeviceInfo(PaWasapiHostApiRepresentation *paWasapi, void *pEndPoints, INT32 index, const WCHAR *defaultRenderer, - const WCHAR *defaultCapturer, PaDeviceInfo *deviceInfo, PaWasapiDeviceInfo *wasapiDeviceInfo) +static PaError FillDeviceInfo(PaWasapiHostApiRepresentation *paWasapi, void *pEndPoints, INT32 index, const WCHAR *defaultRenderId, + const WCHAR *defaultCaptureId, PaDeviceInfo *deviceInfo, PaWasapiDeviceInfo *wasapiDeviceInfo +#ifdef PA_WINRT + , PaWasapiWinrtDeviceListContext *deviceListContext +#endif +) { HRESULT hr; PaError result; PaUtilHostApiRepresentation *hostApi = (PaUtilHostApiRepresentation *)paWasapi; +#ifdef PA_WINRT + PaWasapiWinrtDeviceListContextEntry *listEntry = &deviceListContext->devices[index]; + (void)pEndPoints; + (void)defaultRenderId; + (void)defaultCaptureId; +#endif #ifndef PA_WINRT hr = IMMDeviceCollection_Item((IMMDeviceCollection *)pEndPoints, index, &wasapiDeviceInfo->device); IF_FAILED_INTERNAL_ERROR_JUMP(hr, result, error); - // getting ID + // Get device Id { - WCHAR *pszDeviceId; + WCHAR *deviceId; - hr = IMMDevice_GetId(wasapiDeviceInfo->device, &pszDeviceId); + hr = IMMDevice_GetId(wasapiDeviceInfo->device, &deviceId); IF_FAILED_INTERNAL_ERROR_JUMP(hr, result, error); - wcsncpy(wasapiDeviceInfo->szDeviceID, pszDeviceId, MAX_STR_LEN - 1); - CoTaskMemFree(pszDeviceId); - - if ((defaultCapturer != NULL) && (lstrcmpW(wasapiDeviceInfo->szDeviceID, defaultCapturer) == 0)) - hostApi->info.defaultInputDevice = hostApi->info.deviceCount; - - if ((defaultRenderer != NULL) && (lstrcmpW(wasapiDeviceInfo->szDeviceID, defaultRenderer) == 0)) - hostApi->info.defaultOutputDevice = hostApi->info.deviceCount; + wcsncpy(wasapiDeviceInfo->deviceId, deviceId, PA_WASAPI_DEVICE_ID_LEN - 1); + CoTaskMemFree(deviceId); } + // Get state of the device hr = IMMDevice_GetState(wasapiDeviceInfo->device, &wasapiDeviceInfo->state); IF_FAILED_INTERNAL_ERROR_JUMP(hr, result, error); - if (wasapiDeviceInfo->state != DEVICE_STATE_ACTIVE) { PRINT(("WASAPI device: %d is not currently available (state:%d)\n", index, wasapiDeviceInfo->state)); @@ -1818,16 +1861,16 @@ static PaError FillDeviceInfo(PaWasapiHostApiRepresentation *paWasapi, void *pEn hr = IPropertyStore_GetValue(pProperty, &PKEY_Device_FriendlyName, &value); IF_FAILED_INTERNAL_ERROR_JUMP(hr, result, error); - if ((deviceInfo->name = (char *)PaUtil_GroupAllocateMemory(paWasapi->allocations, MAX_STR_LEN + 1)) == NULL) + if ((deviceInfo->name = (char *)PaUtil_GroupAllocateMemory(paWasapi->allocations, PA_WASAPI_DEVICE_NAME_LEN)) == NULL) { result = paInsufficientMemory; PropVariantClear(&value); goto error; } if (value.pwszVal) - WideCharToMultiByte(CP_UTF8, 0, value.pwszVal, (int)wcslen(value.pwszVal), (char *)deviceInfo->name, MAX_STR_LEN - 1, 0, 0); + WideCharToMultiByte(CP_UTF8, 0, value.pwszVal, (INT32)wcslen(value.pwszVal), (char *)deviceInfo->name, PA_WASAPI_DEVICE_NAME_LEN - 1, 0, 0); else - _snprintf((char *)deviceInfo->name, MAX_STR_LEN - 1, "baddev%d", index); + _snprintf((char *)deviceInfo->name, PA_WASAPI_DEVICE_NAME_LEN - 1, "baddev%d", index); PropVariantClear(&value); @@ -1879,24 +1922,39 @@ static PaError FillDeviceInfo(PaWasapiHostApiRepresentation *paWasapi, void *pEn SAFE_RELEASE(pProperty); } #else - (void)pEndPoints; - (void)defaultRenderer; - (void)defaultCapturer; + // Set device Id + wcsncpy(wasapiDeviceInfo->deviceId, listEntry->info->id, PA_WASAPI_DEVICE_ID_LEN - 1); + + // Set device name + if ((deviceInfo->name = (char *)PaUtil_GroupAllocateMemory(paWasapi->allocations, PA_WASAPI_DEVICE_NAME_LEN)) == NULL) + { + result = paInsufficientMemory; + goto error; + } + ((char *)deviceInfo->name)[0] = 0; + if (listEntry->info->name[0] != 0) + WideCharToMultiByte(CP_UTF8, 0, listEntry->info->name, (INT32)wcslen(listEntry->info->name), (char *)deviceInfo->name, PA_WASAPI_DEVICE_NAME_LEN - 1, 0, 0); + if (deviceInfo->name[0] == 0) // fallback if WideCharToMultiByte is failed, or listEntry is nameless + _snprintf((char *)deviceInfo->name, PA_WASAPI_DEVICE_NAME_LEN - 1, "WASAPI_%s:%d", (listEntry->flow == eRender ? "Output" : "Input"), index); + + // Form-factor + wasapiDeviceInfo->formFactor = listEntry->info->formFactor; + + // Set data flow + wasapiDeviceInfo->flow = listEntry->flow; #endif - // Getting a temporary IAudioClient for more fields - // we make sure NOT to call Initialize yet! + // Set default Output/Input devices + if ((defaultRenderId != NULL) && (wcsncmp(wasapiDeviceInfo->deviceId, defaultRenderId, PA_WASAPI_DEVICE_NAME_LEN - 1) == 0)) + hostApi->info.defaultOutputDevice = hostApi->info.deviceCount; + if ((defaultCaptureId != NULL) && (wcsncmp(wasapiDeviceInfo->deviceId, defaultCaptureId, PA_WASAPI_DEVICE_NAME_LEN - 1) == 0)) + hostApi->info.defaultInputDevice = hostApi->info.deviceCount; + + // Get a temporary IAudioClient for more details { IAudioClient *tmpClient; WAVEFORMATEX *mixFormat; - #ifdef PA_WINRT - // Set flow as ActivateAudioInterface depends on it and selects corresponding - // direction for the Audio Client - wasapiDeviceInfo->flow = (index == 0 ? eRender : eCapture); - #endif - - // Create temp Audio Client instance to query additional details hr = ActivateAudioInterface(wasapiDeviceInfo, NULL, &tmpClient); IF_FAILED_INTERNAL_ERROR_JUMP(hr, result, error); @@ -1926,30 +1984,11 @@ static PaError FillDeviceInfo(PaWasapiHostApiRepresentation *paWasapi, void *pEn #ifdef PA_WINRT if (SUCCEEDED(hr)) { - // Default device - if (index == 0) - hostApi->info.defaultOutputDevice = hostApi->info.deviceCount; - else - hostApi->info.defaultInputDevice = hostApi->info.deviceCount; - - // State + // Set state wasapiDeviceInfo->state = DEVICE_STATE_ACTIVE; - // Default format is always a mix format + // Default format (Shared mode) is always a mix format wasapiDeviceInfo->DefaultFormat = wasapiDeviceInfo->MixFormat; - - // Form-factor - wasapiDeviceInfo->formFactor = UnknownFormFactor; - - // Name - if ((deviceInfo->name = (char *)PaUtil_GroupAllocateMemory(paWasapi->allocations, MAX_STR_LEN + 1)) == NULL) - { - SAFE_RELEASE(tmpClient); - result = paInsufficientMemory; - goto error; - } - _snprintf((char *)deviceInfo->name, MAX_STR_LEN - 1, "WASAPI_%s:%d", (index == 0 ? "Output" : "Input"), index); - PA_DEBUG(("WASAPI:%d| name[%s]\n", index, deviceInfo->name)); } #endif @@ -2049,9 +2088,9 @@ static PaError CreateDeviceList(PaWasapiHostApiRepresentation *paWasapi, PaHostA PaUtilHostApiRepresentation *hostApi = (PaUtilHostApiRepresentation *)paWasapi; PaError result = paNoError; PaDeviceInfo *deviceInfoArray; - UINT i; - WCHAR *defaultRenderer = NULL; - WCHAR *defaultCapturer = NULL; + UINT32 i; + WCHAR *defaultRenderId = NULL; + WCHAR *defaultCaptureId = NULL; #ifndef PA_WINRT HRESULT hr; IMMDeviceCollection *pEndPoints = NULL; @@ -2059,6 +2098,9 @@ static PaError CreateDeviceList(PaWasapiHostApiRepresentation *paWasapi, PaHostA #else void *pEndPoints = NULL; IAudioClient *tmpClient; + PaWasapiWinrtDeviceListContext deviceListContext = { 0 }; + PaWasapiWinrtDeviceInfo defaultRender = { 0 }; + PaWasapiWinrtDeviceInfo defaultCapture = { 0 }; #endif // Make sure device list empty @@ -2084,7 +2126,7 @@ static PaError CreateDeviceList(PaWasapiHostApiRepresentation *paWasapi, PaHostA } else { - hr = IMMDevice_GetId(device, &defaultRenderer); + hr = IMMDevice_GetId(device, &defaultRenderId); IMMDevice_Release(device); IF_FAILED_INTERNAL_ERROR_JUMP(hr, result, error); } @@ -2099,7 +2141,7 @@ static PaError CreateDeviceList(PaWasapiHostApiRepresentation *paWasapi, PaHostA } else { - hr = IMMDevice_GetId(device, &defaultCapturer); + hr = IMMDevice_GetId(device, &defaultCaptureId); IMMDevice_Release(device); IF_FAILED_INTERNAL_ERROR_JUMP(hr, result, error); } @@ -2113,16 +2155,52 @@ static PaError CreateDeviceList(PaWasapiHostApiRepresentation *paWasapi, PaHostA hr = IMMDeviceCollection_GetCount(pEndPoints, &paWasapi->deviceCount); IF_FAILED_INTERNAL_ERROR_JUMP(hr, result, error); #else - // Determine number of available devices by activating AudioClient for render and capture data flows - if (SUCCEEDED(ActivateAudioInterface_WINRT(eRender, GetAudioClientIID(), &tmpClient))) + WinRT_GetDefaultDeviceId(defaultRender.id, STATIC_ARRAY_SIZE(defaultRender.id) - 1, eRender); + defaultRenderId = defaultRender.id; + + WinRT_GetDefaultDeviceId(defaultCapture.id, STATIC_ARRAY_SIZE(defaultCapture.id) - 1, eCapture); + defaultCaptureId = defaultCapture.id; + + if (g_DeviceListInfo.render.deviceCount == 0) { - paWasapi->deviceCount++; - SAFE_RELEASE(tmpClient); + if (SUCCEEDED(WinRT_ActivateAudioInterface(defaultRenderId, GetAudioClientIID(), &tmpClient))) + { + deviceListContext.devices[paWasapi->deviceCount].info = &defaultRender; + deviceListContext.devices[paWasapi->deviceCount].flow = eRender; + paWasapi->deviceCount++; + + SAFE_RELEASE(tmpClient); + } } - if (SUCCEEDED(ActivateAudioInterface_WINRT(eCapture, GetAudioClientIID(), &tmpClient))) + else { - paWasapi->deviceCount++; - SAFE_RELEASE(tmpClient); + for (i = 0; i < g_DeviceListInfo.render.deviceCount; ++i) + { + deviceListContext.devices[paWasapi->deviceCount].info = &g_DeviceListInfo.render.devices[i]; + deviceListContext.devices[paWasapi->deviceCount].flow = eRender; + paWasapi->deviceCount++; + } + } + + if (g_DeviceListInfo.capture.deviceCount == 0) + { + if (SUCCEEDED(WinRT_ActivateAudioInterface(defaultCaptureId, GetAudioClientIID(), &tmpClient))) + { + deviceListContext.devices[paWasapi->deviceCount].info = &defaultCapture; + deviceListContext.devices[paWasapi->deviceCount].flow = eCapture; + paWasapi->deviceCount++; + + SAFE_RELEASE(tmpClient); + } + } + else + { + for (i = 0; i < g_DeviceListInfo.capture.deviceCount; ++i) + { + deviceListContext.devices[paWasapi->deviceCount].info = &g_DeviceListInfo.capture.devices[i]; + deviceListContext.devices[paWasapi->deviceCount].flow = eCapture; + paWasapi->deviceCount++; + } } #endif @@ -2143,8 +2221,12 @@ static PaError CreateDeviceList(PaWasapiHostApiRepresentation *paWasapi, PaHostA FillBaseDeviceInfo(deviceInfo, hostApiIndex); - if ((result = FillDeviceInfo(paWasapi, pEndPoints, i, defaultRenderer, defaultCapturer, - deviceInfo, &paWasapi->devInfo[i])) != paNoError) + if ((result = FillDeviceInfo(paWasapi, pEndPoints, i, defaultRenderId, defaultCaptureId, + deviceInfo, &paWasapi->devInfo[i] + #ifdef PA_WINRT + , &deviceListContext + #endif + )) != paNoError) { // Faulty device is made inactive if ((result = FillInactiveDeviceInfo(paWasapi, deviceInfo)) != paNoError) @@ -2182,8 +2264,8 @@ static PaError CreateDeviceList(PaWasapiHostApiRepresentation *paWasapi, PaHostA done: #ifndef PA_WINRT - CoTaskMemFree(defaultRenderer); - CoTaskMemFree(defaultCapturer); + CoTaskMemFree(defaultRenderId); + CoTaskMemFree(defaultCaptureId); SAFE_RELEASE(pEndPoints); SAFE_RELEASE(pEnumerator); #endif @@ -5346,10 +5428,30 @@ PaError PaWasapi_GetAudioClient(PaStream *pStream, void **pAudioClient, int bOut } // ------------------------------------------------------------------------------------------ -PaError PaWasapi_SetDefaultInterfaceId( unsigned short *pId, int bOutput ) +#ifdef PA_WINRT +static void CopyNameOrIdString(WCHAR *dst, const UINT32 dstMaxCount, const WCHAR *src) +{ + UINT32 i; + + for (i = 0; i < dstMaxCount; ++i) + dst[i] = 0; + + if (src != NULL) + { + for (i = 0; (src[i] != 0) && (i < dstMaxCount); ++i) + dst[i] = src[i]; + } +} +#endif + +// ------------------------------------------------------------------------------------------ +PaError PaWasapiWinrt_SetDefaultDeviceId( const unsigned short *pId, int bOutput ) { #ifdef PA_WINRT - int i; + INT32 i; + PaWasapiWinrtDeviceListRole *role = (bOutput ? &g_DeviceListInfo.render : &g_DeviceListInfo.capture); + + assert(STATIC_ARRAY_SIZE(role->defaultId) == PA_WASAPI_DEVICE_ID_LEN); // Validate Id length if (pId != NULL) @@ -5362,27 +5464,66 @@ PaError PaWasapi_SetDefaultInterfaceId( unsigned short *pId, int bOutput ) } // Set Id (or reset to all 0 if NULL is provided) - if (bOutput) + CopyNameOrIdString(role->defaultId, STATIC_ARRAY_SIZE(role->defaultId), pId); + + return paNoError; +#else + return paIncompatibleStreamHostApi; +#endif +} + +// ------------------------------------------------------------------------------------------ +PaError PaWasapiWinrt_PopulateDeviceList( const unsigned short **pId, const unsigned short **pName, + const PaWasapiDeviceRole *pRole, unsigned int count, int bOutput ) +{ +#ifdef PA_WINRT + UINT32 i, j; + PaWasapiWinrtDeviceListRole *role = (bOutput ? &g_DeviceListInfo.render : &g_DeviceListInfo.capture); + + memset(&role->devices, 0, sizeof(role->devices)); + role->deviceCount = 0; + + if (count == 0) + return paNoError; + else + if (count > PA_WASAPI_DEVICE_MAX_COUNT) + return paBufferTooBig; + + // pName or pRole are optional + if (pId == NULL) + return paInsufficientMemory; + + // Validate Id and Name lengths + for (i = 0; i < count; ++i) { - memset(g_DefaultRenderId, 0, sizeof(g_DefaultRenderId)); - if (pId != NULL) + const unsigned short *id = pId[i]; + const unsigned short *name = pName[i]; + + for (j = 0; id[j] != 0; ++j) { - for (i = 0; (pId[i] != 0) && (i < STATIC_ARRAY_SIZE(g_DefaultRenderId)); ++i) - g_DefaultRenderId[i] = pId[i]; + if (j >= PA_WASAPI_DEVICE_ID_LEN) + return paBufferTooBig; + } + + for (j = 0; name[j] != 0; ++j) + { + if (j >= PA_WASAPI_DEVICE_NAME_LEN) + return paBufferTooBig; } } - else + + // Set Id and Name (or reset to all 0 if NULL is provided) + for (i = 0; i < count; ++i) { - memset(g_DefaultCaptureId, 0, sizeof(g_DefaultCaptureId)); - if (pId != NULL) - { - for (i = 0; (pId[i] != 0) && (i < STATIC_ARRAY_SIZE(g_DefaultCaptureId)); ++i) - g_DefaultCaptureId[i] = pId[i]; - } + CopyNameOrIdString(role->devices[i].id, STATIC_ARRAY_SIZE(role->devices[i].id), pId[i]); + CopyNameOrIdString(role->devices[i].name, STATIC_ARRAY_SIZE(role->devices[i].name), pName[i]); + role->devices[i].formFactor = (pRole != NULL ? (EndpointFormFactor)pRole[i] : UnknownFormFactor); + + // Count device if it has at least the Id + role->deviceCount += (role->devices[i].id[0] != 0); } return paNoError; - #else return paIncompatibleStreamHostApi; #endif From b3592b0749e40013adb5826325b09d38ced9f9c5 Mon Sep 17 00:00:00 2001 From: dmitrykos Date: Mon, 26 Oct 2020 18:25:10 +0200 Subject: [PATCH 034/164] wasapi: Fixed compilation with MinGW (mingw32): gcc version 6.3.0 (MinGW.org GCC-6.3.0-1), include /mingw-include folder explicitly (when compiling with mingw-w64 the /mingw-include folder must not be included). --- .../wasapi/mingw-include/AudioSessionTypes.h | 58 +++ src/hostapi/wasapi/mingw-include/PropIdl.h | 19 + src/hostapi/wasapi/mingw-include/ShTypes.h | 359 ++++++++++++++++++ .../wasapi/mingw-include/audioclient.h | 2 +- .../functiondiscoverykeys_devpkey.h | 13 + src/hostapi/wasapi/mingw-include/propkey.h | 13 + src/hostapi/wasapi/mingw-include/sdkddkver.h | 220 +++++++++++ .../wasapi/mingw-include/winapifamily.h | 24 ++ src/hostapi/wasapi/pa_win_wasapi.c | 24 +- 9 files changed, 729 insertions(+), 3 deletions(-) create mode 100644 src/hostapi/wasapi/mingw-include/AudioSessionTypes.h create mode 100644 src/hostapi/wasapi/mingw-include/PropIdl.h create mode 100644 src/hostapi/wasapi/mingw-include/ShTypes.h create mode 100644 src/hostapi/wasapi/mingw-include/functiondiscoverykeys_devpkey.h create mode 100644 src/hostapi/wasapi/mingw-include/propkey.h create mode 100644 src/hostapi/wasapi/mingw-include/sdkddkver.h create mode 100644 src/hostapi/wasapi/mingw-include/winapifamily.h diff --git a/src/hostapi/wasapi/mingw-include/AudioSessionTypes.h b/src/hostapi/wasapi/mingw-include/AudioSessionTypes.h new file mode 100644 index 0000000..91e7213 --- /dev/null +++ b/src/hostapi/wasapi/mingw-include/AudioSessionTypes.h @@ -0,0 +1,58 @@ +/** + * This file is part of the mingw-w64 runtime package. + * No warranty is given; refer to the file DISCLAIMER within this package. + */ + +#include + +#ifndef __AUDIOSESSIONTYPES__ +#define __AUDIOSESSIONTYPES__ + +#if WINAPI_FAMILY_PARTITION (WINAPI_PARTITION_APP) +#if defined (__WIDL__) +#define MIDL_SIZE_IS(x) [size_is (x)] +#define MIDL_STRING [string] +#define MIDL_ANYSIZE_ARRAY +#else +#define MIDL_SIZE_IS(x) +#define MIDL_STRING +#define MIDL_ANYSIZE_ARRAY ANYSIZE_ARRAY +#endif + +typedef enum _AudioSessionState { + AudioSessionStateInactive = 0, + AudioSessionStateActive = 1, + AudioSessionStateExpired = 2 +} AudioSessionState; + +typedef enum _AUDCLNT_SHAREMODE { + AUDCLNT_SHAREMODE_SHARED, + AUDCLNT_SHAREMODE_EXCLUSIVE +} AUDCLNT_SHAREMODE; + +typedef enum _AUDIO_STREAM_CATEGORY { + AudioCategory_Other = 0, + AudioCategory_ForegroundOnlyMedia, + AudioCategory_BackgroundCapableMedia, + AudioCategory_Communications, + AudioCategory_Alerts, + AudioCategory_SoundEffects, + AudioCategory_GameEffects, + AudioCategory_GameMedia, + AudioCategory_GameChat, + AudioCategory_Speech, + AudioCategory_Movie, + AudioCategory_Media +} AUDIO_STREAM_CATEGORY; + +#define AUDCLNT_STREAMFLAGS_CROSSPROCESS 0x00010000 +#define AUDCLNT_STREAMFLAGS_LOOPBACK 0x00020000 +#define AUDCLNT_STREAMFLAGS_EVENTCALLBACK 0x00040000 +#define AUDCLNT_STREAMFLAGS_NOPERSIST 0x00080000 +#define AUDCLNT_STREAMFLAGS_RATEADJUST 0x00100000 +#define AUDCLNT_SESSIONFLAGS_EXPIREWHENUNOWNED 0x10000000 +#define AUDCLNT_SESSIONFLAGS_DISPLAY_HIDE 0x20000000 +#define AUDCLNT_SESSIONFLAGS_DISPLAY_HIDEWHENEXPIRED 0x40000000 + +#endif +#endif diff --git a/src/hostapi/wasapi/mingw-include/PropIdl.h b/src/hostapi/wasapi/mingw-include/PropIdl.h new file mode 100644 index 0000000..84832d9 --- /dev/null +++ b/src/hostapi/wasapi/mingw-include/PropIdl.h @@ -0,0 +1,19 @@ +/** + * This file has no copyright assigned and is placed in the Public Domain. + * This file is part of the PortAudio library. + */ +#ifndef _INC_PROPIDL_PA +#define _INC_PROPIDL_PA + +#ifndef COM_NO_WINDOWS_H +#include "windows.h" +#include "ole2.h" +#endif + +typedef const PROPVARIANT *REFPROPVARIANT; + +#define PropVariantInit(VAR) memset((VAR), 0, sizeof(PROPVARIANT)) +WINOLEAPI PropVariantClear(PROPVARIANT *pvar); + +#endif /* _INC_PROPIDL_PA */ + diff --git a/src/hostapi/wasapi/mingw-include/ShTypes.h b/src/hostapi/wasapi/mingw-include/ShTypes.h new file mode 100644 index 0000000..cd11186 --- /dev/null +++ b/src/hostapi/wasapi/mingw-include/ShTypes.h @@ -0,0 +1,359 @@ +/*** Autogenerated by WIDL 4.5 from shtypes.idl - Do not edit ***/ + +#ifdef _WIN32 +#ifndef __REQUIRED_RPCNDR_H_VERSION__ +#define __REQUIRED_RPCNDR_H_VERSION__ 475 +#endif +#include +#include +#endif + +#ifndef COM_NO_WINDOWS_H +#include +#include +#endif + +#ifndef __shtypes_h__ +#define __shtypes_h__ + +/* Forward declarations */ + +/* Headers for imported files */ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * This file is part of the mingw-w64 runtime package. + * No warranty is given; refer to the file DISCLAIMER within this package. + */ + + +#ifndef DUMMYUNIONNAME +#ifdef NONAMELESSUNION +#define DUMMYUNIONNAME u +#define DUMMYUNIONNAME2 u2 +#define DUMMYUNIONNAME3 u3 +#define DUMMYUNIONNAME4 u4 +#define DUMMYUNIONNAME5 u5 +#else +#define DUMMYUNIONNAME +#define DUMMYUNIONNAME2 +#define DUMMYUNIONNAME3 +#define DUMMYUNIONNAME4 +#define DUMMYUNIONNAME5 +#endif +#endif + +#include +typedef struct _SHITEMID { + USHORT cb; + BYTE abID[1]; +} SHITEMID; +#include + +#if (defined(_X86_) && !defined(__x86_64)) +#undef __unaligned +#define __unaligned +#endif + +typedef SHITEMID *LPSHITEMID; +typedef const SHITEMID *LPCSHITEMID; + +#include +typedef struct _ITEMIDLIST { + SHITEMID mkid; +} ITEMIDLIST; + +#if defined(STRICT_TYPED_ITEMIDS) && defined(__cplusplus) + typedef struct _ITEMIDLIST_RELATIVE : ITEMIDLIST { } ITEMIDLIST_RELATIVE; + typedef struct _ITEMID_CHILD : ITEMIDLIST_RELATIVE { } ITEMID_CHILD; + typedef struct _ITEMIDLIST_ABSOLUTE : ITEMIDLIST_RELATIVE { } ITEMIDLIST_ABSOLUTE; +#else +typedef ITEMIDLIST ITEMIDLIST_RELATIVE; +typedef ITEMIDLIST ITEMID_CHILD; +typedef ITEMIDLIST ITEMIDLIST_ABSOLUTE; +#endif +#include + +typedef BYTE_BLOB *wirePIDL; +typedef ITEMIDLIST *LPITEMIDLIST; +typedef const ITEMIDLIST *LPCITEMIDLIST; +#if defined(STRICT_TYPED_ITEMIDS) && defined(__cplusplus) +typedef ITEMIDLIST_ABSOLUTE *PIDLIST_ABSOLUTE; +typedef const ITEMIDLIST_ABSOLUTE *PCIDLIST_ABSOLUTE; +typedef const ITEMIDLIST_ABSOLUTE *PCUIDLIST_ABSOLUTE; +typedef ITEMIDLIST_RELATIVE *PIDLIST_RELATIVE; +typedef const ITEMIDLIST_RELATIVE *PCIDLIST_RELATIVE; +typedef ITEMIDLIST_RELATIVE *PUIDLIST_RELATIVE; +typedef const ITEMIDLIST_RELATIVE *PCUIDLIST_RELATIVE; +typedef ITEMID_CHILD *PITEMID_CHILD; +typedef const ITEMID_CHILD *PCITEMID_CHILD; +typedef ITEMID_CHILD *PUITEMID_CHILD; +typedef const ITEMID_CHILD *PCUITEMID_CHILD; +typedef const PCUITEMID_CHILD *PCUITEMID_CHILD_ARRAY; +typedef const PCUIDLIST_RELATIVE *PCUIDLIST_RELATIVE_ARRAY; +typedef const PCIDLIST_ABSOLUTE *PCIDLIST_ABSOLUTE_ARRAY; +typedef const PCUIDLIST_ABSOLUTE *PCUIDLIST_ABSOLUTE_ARRAY; +#else +#define PIDLIST_ABSOLUTE LPITEMIDLIST +#define PCIDLIST_ABSOLUTE LPCITEMIDLIST +#define PCUIDLIST_ABSOLUTE LPCITEMIDLIST +#define PIDLIST_RELATIVE LPITEMIDLIST +#define PCIDLIST_RELATIVE LPCITEMIDLIST +#define PUIDLIST_RELATIVE LPITEMIDLIST +#define PCUIDLIST_RELATIVE LPCITEMIDLIST +#define PITEMID_CHILD LPITEMIDLIST +#define PCITEMID_CHILD LPCITEMIDLIST +#define PUITEMID_CHILD LPITEMIDLIST +#define PCUITEMID_CHILD LPCITEMIDLIST +#define PCUITEMID_CHILD_ARRAY LPCITEMIDLIST * +#define PCUIDLIST_RELATIVE_ARRAY LPCITEMIDLIST * +#define PCIDLIST_ABSOLUTE_ARRAY LPCITEMIDLIST * +#define PCUIDLIST_ABSOLUTE_ARRAY LPCITEMIDLIST * +#endif + +#if 0 +typedef struct _WIN32_FIND_DATAA { + DWORD dwFileAttributes; + FILETIME ftCreationTime; + FILETIME ftLastAccessTime; + FILETIME ftLastWriteTime; + DWORD nFileSizeHigh; + DWORD nFileSizeLow; + DWORD dwReserved0; + DWORD dwReserved1; + CHAR cFileName[260]; + CHAR cAlternateFileName[14]; +} WIN32_FIND_DATAA; +typedef struct _WIN32_FIND_DATAA *PWIN32_FIND_DATAA; +typedef struct _WIN32_FIND_DATAA *LPWIN32_FIND_DATAA; + +typedef struct _WIN32_FIND_DATAW { + DWORD dwFileAttributes; + FILETIME ftCreationTime; + FILETIME ftLastAccessTime; + FILETIME ftLastWriteTime; + DWORD nFileSizeHigh; + DWORD nFileSizeLow; + DWORD dwReserved0; + DWORD dwReserved1; + WCHAR cFileName[260]; + WCHAR cAlternateFileName[14]; +} WIN32_FIND_DATAW; +typedef struct _WIN32_FIND_DATAW *PWIN32_FIND_DATAW; +typedef struct _WIN32_FIND_DATAW *LPWIN32_FIND_DATAW; +#endif + +typedef enum tagSTRRET_TYPE { + STRRET_WSTR = 0x0, + STRRET_OFFSET = 0x1, + STRRET_CSTR = 0x2 +} STRRET_TYPE; + +#include +typedef struct _STRRET { + UINT uType; + __C89_NAMELESS union { + LPWSTR pOleStr; + UINT uOffset; + char cStr[260]; + } __C89_NAMELESSUNIONNAME; +} STRRET; +#include + +typedef STRRET *LPSTRRET; + +#include +typedef struct _SHELLDETAILS { + int fmt; + int cxChar; + STRRET str; +} SHELLDETAILS; +typedef struct _SHELLDETAILS *LPSHELLDETAILS; +#include + +#if _WIN32_IE >= _WIN32_IE_IE60SP2 +typedef enum tagPERCEIVED { + PERCEIVED_TYPE_FIRST = -3, + PERCEIVED_TYPE_CUSTOM = -3, + PERCEIVED_TYPE_UNSPECIFIED = -2, + PERCEIVED_TYPE_FOLDER = -1, + PERCEIVED_TYPE_UNKNOWN = 0, + PERCEIVED_TYPE_TEXT = 1, + PERCEIVED_TYPE_IMAGE = 2, + PERCEIVED_TYPE_AUDIO = 3, + PERCEIVED_TYPE_VIDEO = 4, + PERCEIVED_TYPE_COMPRESSED = 5, + PERCEIVED_TYPE_DOCUMENT = 6, + PERCEIVED_TYPE_SYSTEM = 7, + PERCEIVED_TYPE_APPLICATION = 8, + PERCEIVED_TYPE_GAMEMEDIA = 9, + PERCEIVED_TYPE_CONTACTS = 10, + PERCEIVED_TYPE_LAST = 10 +} PERCEIVED; + +#define PERCEIVEDFLAG_UNDEFINED 0x0000 +#define PERCEIVEDFLAG_SOFTCODED 0x0001 +#define PERCEIVEDFLAG_HARDCODED 0x0002 +#define PERCEIVEDFLAG_NATIVESUPPORT 0x0004 +#define PERCEIVEDFLAG_GDIPLUS 0x0010 +#define PERCEIVEDFLAG_WMSDK 0x0020 +#define PERCEIVEDFLAG_ZIPFOLDER 0x0040 + +typedef DWORD PERCEIVEDFLAG; +#endif + +typedef struct _COMDLG_FILTERSPEC { + LPCWSTR pszName; + LPCWSTR pszSpec; +} COMDLG_FILTERSPEC; + +typedef GUID KNOWNFOLDERID; + +#if 0 +typedef KNOWNFOLDERID *REFKNOWNFOLDERID; +#endif + +#ifdef __cplusplus +#define REFKNOWNFOLDERID const KNOWNFOLDERID & +#else +#define REFKNOWNFOLDERID const KNOWNFOLDERID * __MIDL_CONST +#endif + +typedef DWORD KF_REDIRECT_FLAGS; + +typedef GUID FOLDERTYPEID; + +#if 0 +typedef FOLDERTYPEID *REFFOLDERTYPEID; +#endif + +#ifdef __cplusplus +#define REFFOLDERTYPEID const FOLDERTYPEID & +#else +#define REFFOLDERTYPEID const FOLDERTYPEID * __MIDL_CONST +#endif + +typedef GUID TASKOWNERID; + +#if 0 +typedef TASKOWNERID *REFTASKOWNERID; +#endif + +#ifdef __cplusplus +#define REFTASKOWNERID const TASKOWNERID & +#else +#define REFTASKOWNERID const TASKOWNERID * __MIDL_CONST +#endif + +typedef GUID ELEMENTID; + +#if 0 +typedef ELEMENTID *REFELEMENTID; +#endif + +#ifdef __cplusplus +#define REFELEMENTID const ELEMENTID & +#else +#define REFELEMENTID const ELEMENTID * __MIDL_CONST +#endif + +#ifndef LF_FACESIZE +typedef struct tagLOGFONTA { + LONG lfHeight; + LONG lfWidth; + LONG lfEscapement; + LONG lfOrientation; + LONG lfWeight; + BYTE lfItalic; + BYTE lfUnderline; + BYTE lfStrikeOut; + BYTE lfCharSet; + BYTE lfOutPrecision; + BYTE lfClipPrecision; + BYTE lfQuality; + BYTE lfPitchAndFamily; + CHAR lfFaceName[32]; +} LOGFONTA; + +typedef struct tagLOGFONTW { + LONG lfHeight; + LONG lfWidth; + LONG lfEscapement; + LONG lfOrientation; + LONG lfWeight; + BYTE lfItalic; + BYTE lfUnderline; + BYTE lfStrikeOut; + BYTE lfCharSet; + BYTE lfOutPrecision; + BYTE lfClipPrecision; + BYTE lfQuality; + BYTE lfPitchAndFamily; + WCHAR lfFaceName[32]; +} LOGFONTW; + +typedef LOGFONTA LOGFONT; +#endif + +typedef enum tagSHCOLSTATE { + SHCOLSTATE_DEFAULT = 0x0, + SHCOLSTATE_TYPE_STR = 0x1, + SHCOLSTATE_TYPE_INT = 0x2, + SHCOLSTATE_TYPE_DATE = 0x3, + SHCOLSTATE_TYPEMASK = 0xf, + SHCOLSTATE_ONBYDEFAULT = 0x10, + SHCOLSTATE_SLOW = 0x20, + SHCOLSTATE_EXTENDED = 0x40, + SHCOLSTATE_SECONDARYUI = 0x80, + SHCOLSTATE_HIDDEN = 0x100, + SHCOLSTATE_PREFER_VARCMP = 0x200, + SHCOLSTATE_PREFER_FMTCMP = 0x400, + SHCOLSTATE_NOSORTBYFOLDERNESS = 0x800, + SHCOLSTATE_VIEWONLY = 0x10000, + SHCOLSTATE_BATCHREAD = 0x20000, + SHCOLSTATE_NO_GROUPBY = 0x40000, + SHCOLSTATE_FIXED_WIDTH = 0x1000, + SHCOLSTATE_NODPISCALE = 0x2000, + SHCOLSTATE_FIXED_RATIO = 0x4000, + SHCOLSTATE_DISPLAYMASK = 0xf000 +} SHCOLSTATE; + +typedef DWORD SHCOLSTATEF; +typedef PROPERTYKEY SHCOLUMNID; +typedef const SHCOLUMNID *LPCSHCOLUMNID; + +typedef enum DEVICE_SCALE_FACTOR { + DEVICE_SCALE_FACTOR_INVALID = 0, + SCALE_100_PERCENT = 100, + SCALE_120_PERCENT = 120, + SCALE_125_PERCENT = 125, + SCALE_140_PERCENT = 140, + SCALE_150_PERCENT = 150, + SCALE_160_PERCENT = 160, + SCALE_175_PERCENT = 175, + SCALE_180_PERCENT = 180, + SCALE_200_PERCENT = 200, + SCALE_225_PERCENT = 225, + SCALE_250_PERCENT = 250, + SCALE_300_PERCENT = 300, + SCALE_350_PERCENT = 350, + SCALE_400_PERCENT = 400, + SCALE_450_PERCENT = 450, + SCALE_500_PERCENT = 500 +} DEVICE_SCALE_FACTOR; +/* Begin additional prototypes for all interfaces */ + + +/* End additional prototypes */ + +#ifdef __cplusplus +} +#endif + +#endif /* __shtypes_h__ */ diff --git a/src/hostapi/wasapi/mingw-include/audioclient.h b/src/hostapi/wasapi/mingw-include/audioclient.h index bf77baf..60db0cd 100644 --- a/src/hostapi/wasapi/mingw-include/audioclient.h +++ b/src/hostapi/wasapi/mingw-include/audioclient.h @@ -19,7 +19,7 @@ /* verify that the version is high enough to compile this file*/ #ifndef __REQUIRED_RPCNDR_H_VERSION__ -#define __REQUIRED_RPCNDR_H_VERSION__ 500 +#define __REQUIRED_RPCNDR_H_VERSION__ 475 #endif /* verify that the version is high enough to compile this file*/ diff --git a/src/hostapi/wasapi/mingw-include/functiondiscoverykeys_devpkey.h b/src/hostapi/wasapi/mingw-include/functiondiscoverykeys_devpkey.h new file mode 100644 index 0000000..d66cb97 --- /dev/null +++ b/src/hostapi/wasapi/mingw-include/functiondiscoverykeys_devpkey.h @@ -0,0 +1,13 @@ +/** + * This file has no copyright assigned and is placed in the Public Domain. + * This file is part of the mingw-w64 runtime package. + * No warranty is given; refer to the file DISCLAIMER.PD within this package. + */ +#ifndef _INC_FUNCTIONDISCOVERYKEYS +#define _INC_FUNCTIONDISCOVERYKEYS + +#include + +DEFINE_PROPERTYKEY(PKEY_Device_FriendlyName, 0xa45c254e, 0xdf1c, 0x4efd, 0x80, 0x20, 0x67, 0xd1, 0x46, 0xa8, 0x50, 0xe0, 14); + +#endif /* _INC_FUNCTIONDISCOVERYKEYS */ diff --git a/src/hostapi/wasapi/mingw-include/propkey.h b/src/hostapi/wasapi/mingw-include/propkey.h new file mode 100644 index 0000000..5b68236 --- /dev/null +++ b/src/hostapi/wasapi/mingw-include/propkey.h @@ -0,0 +1,13 @@ +/** + * This file has no copyright assigned and is placed in the Public Domain. + * This file is part of the PortAudio library. + */ +#ifndef _INC_PROPKEY_PA +#define _INC_PROPKEY_PA + +#ifndef DEFINE_API_PKEY +#define DEFINE_API_PKEY(name, managed_name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8, pid) \ + DEFINE_PROPERTYKEY(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8, pid) +#endif + +#endif /* _INC_PROPKEY_PA */ diff --git a/src/hostapi/wasapi/mingw-include/sdkddkver.h b/src/hostapi/wasapi/mingw-include/sdkddkver.h new file mode 100644 index 0000000..44b5fb2 --- /dev/null +++ b/src/hostapi/wasapi/mingw-include/sdkddkver.h @@ -0,0 +1,220 @@ +/** + * sdkddkver.h: Version definitions for SDK and DDK. Originally + * from ReactOS PSDK/DDK, this file is in the public domain: + * + * This file has no copyright assigned and is placed in the Public Domain. + * This file is part of the mingw-w64 runtime package. + * No warranty is given; refer to the file DISCLAIMER.PD within this package. + */ + +#ifndef _INC_SDKDDKVER +#define _INC_SDKDDKVER + +/* _WIN32_WINNT */ +#define _WIN32_WINNT_NT4 0x0400 +#define _WIN32_WINNT_WIN2K 0x0500 +#define _WIN32_WINNT_WINXP 0x0501 +#define _WIN32_WINNT_WS03 0x0502 +#define _WIN32_WINNT_WIN6 0x0600 +#define _WIN32_WINNT_VISTA 0x0600 +#define _WIN32_WINNT_WS08 0x0600 +#define _WIN32_WINNT_LONGHORN 0x0600 +#define _WIN32_WINNT_WIN7 0x0601 +#define _WIN32_WINNT_WIN8 0x0602 +#define _WIN32_WINNT_WINBLUE 0x0603 +#define _WIN32_WINNT_WINTHRESHOLD 0x0A00 +#define _WIN32_WINNT_WIN10 0x0A00 + +/* _WIN32_IE */ +#define _WIN32_IE_IE20 0x0200 +#define _WIN32_IE_IE30 0x0300 +#define _WIN32_IE_IE302 0x0302 +#define _WIN32_IE_IE40 0x0400 +#define _WIN32_IE_IE401 0x0401 +#define _WIN32_IE_IE50 0x0500 +#define _WIN32_IE_IE501 0x0501 +#define _WIN32_IE_IE55 0x0550 +#define _WIN32_IE_IE60 0x0600 +#define _WIN32_IE_IE60SP1 0x0601 +#define _WIN32_IE_IE60SP2 0x0603 +#define _WIN32_IE_IE70 0x0700 +#define _WIN32_IE_IE80 0x0800 +#define _WIN32_IE_IE90 0x0900 +#define _WIN32_IE_IE100 0x0a00 +#define _WIN32_IE_IE110 0x0A00 + +/* Mappings Between IE Version and Windows Version */ +#define _WIN32_IE_NT4 _WIN32_IE_IE20 +#define _WIN32_IE_NT4SP1 _WIN32_IE_IE20 +#define _WIN32_IE_NT4SP2 _WIN32_IE_IE20 +#define _WIN32_IE_NT4SP3 _WIN32_IE_IE302 +#define _WIN32_IE_NT4SP4 _WIN32_IE_IE401 +#define _WIN32_IE_NT4SP5 _WIN32_IE_IE401 +#define _WIN32_IE_NT4SP6 _WIN32_IE_IE50 +#define _WIN32_IE_WIN98 _WIN32_IE_IE401 +#define _WIN32_IE_WIN98SE _WIN32_IE_IE50 +#define _WIN32_IE_WINME _WIN32_IE_IE55 +#define _WIN32_IE_WIN2K _WIN32_IE_IE501 +#define _WIN32_IE_WIN2KSP1 _WIN32_IE_IE501 +#define _WIN32_IE_WIN2KSP2 _WIN32_IE_IE501 +#define _WIN32_IE_WIN2KSP3 _WIN32_IE_IE501 +#define _WIN32_IE_WIN2KSP4 _WIN32_IE_IE501 +#define _WIN32_IE_XP _WIN32_IE_IE60 +#define _WIN32_IE_XPSP1 _WIN32_IE_IE60SP1 +#define _WIN32_IE_XPSP2 _WIN32_IE_IE60SP2 +#define _WIN32_IE_WS03 0x0602 +#define _WIN32_IE_WS03SP1 _WIN32_IE_IE60SP2 +#define _WIN32_IE_WIN6 _WIN32_IE_IE70 +#define _WIN32_IE_LONGHORN _WIN32_IE_IE70 +#define _WIN32_IE_WIN7 _WIN32_IE_IE80 +#define _WIN32_IE_WIN8 _WIN32_IE_IE100 +#define _WIN32_IE_WINBLUE _WIN32_IE_IE100 +#define _WIN32_IE_WINTHRESHOLD _WIN32_IE_IE110 +#define _WIN32_IE_WIN10 _WIN32_IE_IE110 + +/* NTDDI_VERSION */ +#ifndef NTDDI_WIN2K +#define NTDDI_WIN2K 0x05000000 +#endif +#ifndef NTDDI_WIN2KSP1 +#define NTDDI_WIN2KSP1 0x05000100 +#endif +#ifndef NTDDI_WIN2KSP2 +#define NTDDI_WIN2KSP2 0x05000200 +#endif +#ifndef NTDDI_WIN2KSP3 +#define NTDDI_WIN2KSP3 0x05000300 +#endif +#ifndef NTDDI_WIN2KSP4 +#define NTDDI_WIN2KSP4 0x05000400 +#endif + +#ifndef NTDDI_WINXP +#define NTDDI_WINXP 0x05010000 +#endif +#ifndef NTDDI_WINXPSP1 +#define NTDDI_WINXPSP1 0x05010100 +#endif +#ifndef NTDDI_WINXPSP2 +#define NTDDI_WINXPSP2 0x05010200 +#endif +#ifndef NTDDI_WINXPSP3 +#define NTDDI_WINXPSP3 0x05010300 +#endif +#ifndef NTDDI_WINXPSP4 +#define NTDDI_WINXPSP4 0x05010400 +#endif + +#define NTDDI_WS03 0x05020000 +#define NTDDI_WS03SP1 0x05020100 +#define NTDDI_WS03SP2 0x05020200 +#define NTDDI_WS03SP3 0x05020300 +#define NTDDI_WS03SP4 0x05020400 + +#define NTDDI_WIN6 0x06000000 +#define NTDDI_WIN6SP1 0x06000100 +#define NTDDI_WIN6SP2 0x06000200 +#define NTDDI_WIN6SP3 0x06000300 +#define NTDDI_WIN6SP4 0x06000400 + +#define NTDDI_VISTA NTDDI_WIN6 +#define NTDDI_VISTASP1 NTDDI_WIN6SP1 +#define NTDDI_VISTASP2 NTDDI_WIN6SP2 +#define NTDDI_VISTASP3 NTDDI_WIN6SP3 +#define NTDDI_VISTASP4 NTDDI_WIN6SP4 +#define NTDDI_LONGHORN NTDDI_VISTA + +#define NTDDI_WS08 NTDDI_WIN6SP1 +#define NTDDI_WS08SP2 NTDDI_WIN6SP2 +#define NTDDI_WS08SP3 NTDDI_WIN6SP3 +#define NTDDI_WS08SP4 NTDDI_WIN6SP4 + +#define NTDDI_WIN7 0x06010000 +#define NTDDI_WIN8 0x06020000 +#define NTDDI_WINBLUE 0x06030000 +#define NTDDI_WINTHRESHOLD 0x0A000000 +#define NTDDI_WIN10 0x0A000000 +#define NTDDI_WIN10_TH2 0x0A000001 +#define NTDDI_WIN10_RS1 0x0A000002 +#define NTDDI_WIN10_RS2 0x0A000003 +#define NTDDI_WIN10_RS3 0x0A000004 +#define NTDDI_WIN10_RS4 0x0A000005 +#define NTDDI_WIN10_RS5 0x0A000006 +#define NTDDI_WIN10_19H1 0x0A000007 +#define NTDDI_WIN10_VB 0x0A000008 +#define NTDDI_WIN10_MN 0x0A000009 +#define NTDDI_WIN10_FE 0x0A00000A + +#define WDK_NTDDI_VERSION NTDDI_WIN10_FE + +/* Version Fields in NTDDI_VERSION */ +#define OSVERSION_MASK 0xFFFF0000U +#define SPVERSION_MASK 0x0000FF00 +#define SUBVERSION_MASK 0x000000FF + +/* Macros to Extract Version Fields From NTDDI_VERSION */ +#define OSVER(Version) ((Version) & OSVERSION_MASK) +#define SPVER(Version) (((Version) & SPVERSION_MASK) >> 8) +#define SUBVER(Version) (((Version) & SUBVERSION_MASK)) + +/* Macros to get the NTDDI for a given WIN32 */ +#define NTDDI_VERSION_FROM_WIN32_WINNT2(Version) Version##0000 +#define NTDDI_VERSION_FROM_WIN32_WINNT(Version) NTDDI_VERSION_FROM_WIN32_WINNT2(Version) + +/* Select Default WIN32_WINNT Value */ +#if !defined(_WIN32_WINNT) && !defined(_CHICAGO_) +#define _WIN32_WINNT _WIN32_WINNT_WS03 +#endif + +/* Choose NTDDI Version */ +#ifndef NTDDI_VERSION +#ifdef _WIN32_WINNT +#define NTDDI_VERSION NTDDI_VERSION_FROM_WIN32_WINNT(_WIN32_WINNT) +#else +#define NTDDI_VERSION NTDDI_WS03 +#endif +#endif + +/* Choose WINVER Value */ +#ifndef WINVER +#ifdef _WIN32_WINNT +#define WINVER _WIN32_WINNT +#else +#define WINVER 0x0502 +#endif +#endif + +/* Choose IE Version */ +#ifndef _WIN32_IE +#ifdef _WIN32_WINNT +#if (_WIN32_WINNT <= _WIN32_WINNT_NT4) +#define _WIN32_IE _WIN32_IE_IE50 +#elif (_WIN32_WINNT <= _WIN32_WINNT_WIN2K) +#define _WIN32_IE _WIN32_IE_IE501 +#elif (_WIN32_WINNT <= _WIN32_WINNT_WINXP) +#define _WIN32_IE _WIN32_IE_IE60 +#elif (_WIN32_WINNT <= _WIN32_WINNT_WS03) +#define _WIN32_IE _WIN32_IE_WS03 +#elif (_WIN32_WINNT <= _WIN32_WINNT_VISTA) +#define _WIN32_IE _WIN32_IE_LONGHORN +#elif (_WIN32_WINNT <= _WIN32_WINNT_WIN7) +#define _WIN32_IE _WIN32_IE_WIN7 +#elif (_WIN32_WINNT <= _WIN32_WINNT_WIN8) +#define _WIN32_IE _WIN32_IE_WIN8 +#else +#define _WIN32_IE 0x0a00 +#endif +#else +#define _WIN32_IE 0x0700 +#endif +#endif + +/* Make Sure NTDDI_VERSION and _WIN32_WINNT Match */ +#if ((OSVER(NTDDI_VERSION) == NTDDI_WIN2K) && (_WIN32_WINNT != _WIN32_WINNT_WIN2K)) || \ + ((OSVER(NTDDI_VERSION) == NTDDI_WINXP) && (_WIN32_WINNT != _WIN32_WINNT_WINXP)) || \ + ((OSVER(NTDDI_VERSION) == NTDDI_WS03) && (_WIN32_WINNT != _WIN32_WINNT_WS03)) || \ + ((OSVER(NTDDI_VERSION) == NTDDI_WINXP) && (_WIN32_WINNT != _WIN32_WINNT_WINXP)) +#error NTDDI_VERSION and _WIN32_WINNT mismatch! +#endif + +#endif /* _INC_SDKDDKVER */ diff --git a/src/hostapi/wasapi/mingw-include/winapifamily.h b/src/hostapi/wasapi/mingw-include/winapifamily.h new file mode 100644 index 0000000..388d5f0 --- /dev/null +++ b/src/hostapi/wasapi/mingw-include/winapifamily.h @@ -0,0 +1,24 @@ +/** + * This file is part of the mingw-w64 runtime package. + * No warranty is given; refer to the file DISCLAIMER within this package. + */ + +#ifndef _INC_WINAPIFAMILY +#define _INC_WINAPIFAMILY + +#define WINAPI_PARTITION_DESKTOP 0x1 +#define WINAPI_PARTITION_APP 0x2 + +#define WINAPI_FAMILY_APP WINAPI_PARTITION_APP +#define WINAPI_FAMILY_DESKTOP_APP (WINAPI_PARTITION_DESKTOP \ + | WINAPI_PARTITION_APP) + +/* WINAPI_FAMILY can be either desktop + App, or App. */ +#ifndef WINAPI_FAMILY +#define WINAPI_FAMILY WINAPI_FAMILY_DESKTOP_APP +#endif + +#define WINAPI_FAMILY_PARTITION(v) ((WINAPI_FAMILY & v) == v) +#define WINAPI_FAMILY_ONE_PARTITION(vset, v) ((WINAPI_FAMILY & vset) == v) + +#endif diff --git a/src/hostapi/wasapi/pa_win_wasapi.c b/src/hostapi/wasapi/pa_win_wasapi.c index c155f1f..7e321f1 100644 --- a/src/hostapi/wasapi/pa_win_wasapi.c +++ b/src/hostapi/wasapi/pa_win_wasapi.c @@ -92,6 +92,9 @@ #include #include #endif +#ifndef PA_WINRT + #include +#endif #include "pa_util.h" #include "pa_allocation.h" @@ -104,13 +107,25 @@ #include "pa_ringbuffer.h" #include "pa_win_coinitialize.h" -#if !defined(NTDDI_VERSION) +#if !defined(NTDDI_VERSION) || (defined(__GNUC__) && (__GNUC__ <= 6) && !defined(__MINGW64__)) #undef WINVER #undef _WIN32_WINNT #define WINVER 0x0600 // VISTA #define _WIN32_WINNT WINVER + #ifndef WINAPI + #define WINAPI __stdcall + #endif + + #ifndef __unaligned + #define __unaligned + #endif + + #ifndef __C89_NAMELESS + #define __C89_NAMELESS + #endif + #ifndef _AVRT_ //<< fix MinGW dummy compile by defining missing type: AVRT_PRIORITY typedef enum _AVRT_PRIORITY { @@ -129,6 +144,8 @@ #define __LPCGUID_DEFINED__ typedef const GUID *LPCGUID; #endif + typedef GUID IID; + typedef GUID CLSID; #ifndef PROPERTYKEY_DEFINED #define PROPERTYKEY_DEFINED @@ -147,7 +164,6 @@ #ifdef WIN64 #include - typedef LONG NTSTATUS; #define FASTCALL #include #include @@ -161,6 +177,10 @@ typedef LONGLONG REFERENCE_TIME; #define NONAMELESSUNION #endif + + #ifndef NT_SUCCESS + typedef LONG NTSTATUS; + #endif #ifndef WAVE_FORMAT_IEEE_FLOAT #define WAVE_FORMAT_IEEE_FLOAT 0x0003 // 32-bit floating-point From fd0d181261280f48180227fe42e1b3094f565555 Mon Sep 17 00:00:00 2001 From: Nemirtingas <9432037+Nemirtingas@users.noreply.github.com> Date: Tue, 13 Oct 2020 09:56:09 +0200 Subject: [PATCH 035/164] Add the install interface. --- CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 0302ae8..5c5f748 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -372,7 +372,7 @@ IF(PA_BUILD_SHARED) ADD_LIBRARY(portaudio SHARED ${PA_INCLUDES} ${PA_COMMON_INCLUDES} ${PA_SOURCES} ${PA_NON_UNICODE_SOURCES} ${PA_EXTRA_SHARED_SOURCES}) SET_PROPERTY(TARGET portaudio APPEND_STRING PROPERTY COMPILE_DEFINITIONS ${PA_PRIVATE_COMPILE_DEFINITIONS}) TARGET_INCLUDE_DIRECTORIES(portaudio PRIVATE ${PA_PRIVATE_INCLUDE_PATHS}) - TARGET_INCLUDE_DIRECTORIES(portaudio PUBLIC "$") + TARGET_INCLUDE_DIRECTORIES(portaudio PUBLIC "$" "$") TARGET_LINK_LIBRARIES(portaudio ${PA_LIBRARY_DEPENDENCIES}) ENDIF() @@ -381,7 +381,7 @@ IF(PA_BUILD_STATIC) ADD_LIBRARY(portaudio_static STATIC ${PA_INCLUDES} ${PA_COMMON_INCLUDES} ${PA_SOURCES} ${PA_NON_UNICODE_SOURCES}) SET_PROPERTY(TARGET portaudio_static APPEND_STRING PROPERTY COMPILE_DEFINITIONS ${PA_PRIVATE_COMPILE_DEFINITIONS}) TARGET_INCLUDE_DIRECTORIES(portaudio_static PRIVATE ${PA_PRIVATE_INCLUDE_PATHS}) - TARGET_INCLUDE_DIRECTORIES(portaudio_static PUBLIC "$") + TARGET_INCLUDE_DIRECTORIES(portaudio_static PUBLIC "$" "$") TARGET_LINK_LIBRARIES(portaudio_static ${PA_LIBRARY_DEPENDENCIES}) IF(NOT PA_LIBNAME_ADD_SUFFIX) SET_PROPERTY(TARGET portaudio_static PROPERTY OUTPUT_NAME portaudio) From ccc88607b60e7fad7be4fc26c7a0d47aeae3fe15 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Sch=C3=BCrmann?= Date: Thu, 12 Nov 2020 00:25:34 +0100 Subject: [PATCH 036/164] Don't crash if alsa_snd_pcm_poll_descriptors fails --- src/hostapi/alsa/pa_linux_alsa.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/hostapi/alsa/pa_linux_alsa.c b/src/hostapi/alsa/pa_linux_alsa.c index 5539d9d..48d77c1 100644 --- a/src/hostapi/alsa/pa_linux_alsa.c +++ b/src/hostapi/alsa/pa_linux_alsa.c @@ -3642,8 +3642,11 @@ static PaError PaAlsaStreamComponent_BeginPolling( PaAlsaStreamComponent* self, PaError result = paNoError; int ret = alsa_snd_pcm_poll_descriptors( self->pcm, pfds, self->nfds ); (void)ret; /* Prevent unused variable warning if asserts are turned off */ - assert( ret == self->nfds ); - + /* If alsa returns anything else, like -EPIPE return*/ + if( ret != self->nfds ) + { + return paUnanticipatedHostError; + } self->ready = 0; return result; @@ -3810,7 +3813,12 @@ static PaError PaAlsaStream_WaitForFrames( PaAlsaStream *self, unsigned long *fr { /* self->pfds is in effect an array of fds; if necessary, index past the capture fds */ playbackPfds = self->pfds + (pollCapture ? self->capture.nfds : 0); - PA_ENSURE( PaAlsaStreamComponent_BeginPolling( &self->playback, playbackPfds ) ); + int res = PaAlsaStreamComponent_BeginPolling( &self->playback, playbackPfds ); + if( res != paNoError) + { + xrun = 1; + goto end; + } totalFds += self->playback.nfds; } From 7e2a33c875c6b2b53a8925959496cc698765621f Mon Sep 17 00:00:00 2001 From: Colin McEwan Date: Thu, 19 Nov 2020 02:22:22 +0000 Subject: [PATCH 037/164] Fix crashes on disconnected pins in wmdks topologies. (#300) * Fix crashes on disconnected pins in wmdks topologies. * Fix potential assert on disconnected physical output pin in PinNew --- src/hostapi/wdmks/pa_win_wdmks.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/hostapi/wdmks/pa_win_wdmks.c b/src/hostapi/wdmks/pa_win_wdmks.c index 2403ed5..15ba438 100644 --- a/src/hostapi/wdmks/pa_win_wdmks.c +++ b/src/hostapi/wdmks/pa_win_wdmks.c @@ -1057,8 +1057,9 @@ static const KSTOPOLOGY_CONNECTION* FindStartConnectionFrom(ULONG startPin, PaWi } } + /* Some devices may report topologies that leave pins unconnected. This may be by design or driver installation + issues. Pass the error condition back to caller. */ PA_DEBUG(("FindStartConnectionFrom: returning NULL\n")); - assert(FALSE); return 0; } @@ -1077,8 +1078,8 @@ static const KSTOPOLOGY_CONNECTION* FindStartConnectionTo(ULONG startPin, PaWinW } } + /* Unconnected pin. Inform caller. */ PA_DEBUG(("FindStartConnectionTo: returning NULL\n")); - assert(FALSE); return 0; } @@ -1970,8 +1971,8 @@ static PaWinWdmPin* PinNew(PaWinWdmFilter* parentFilter, unsigned long pinId, Pa } else { - /* Should never come here! */ - assert(FALSE); + /* Unconnected pin */ + goto error; } } } From 4793ce4fbff3565d107ce306b632b664ff99276c Mon Sep 17 00:00:00 2001 From: Paul Boersma Date: Thu, 26 Nov 2020 02:39:01 +0100 Subject: [PATCH 038/164] Add missing void argument, and include include pa_jack.h in pa_jack.c (#347) * Update pa_jack.c include `pa_jack.h` in `pa_jack.c`, which provides prototypes for PaJack_SetClientName() and PaJack_GetClientName() * Update pa_unix_util.h PaUnixThreading_Initialize() is not a prototype in C, make it PaUnixThreading_Initialize(void) * Update pa_unix_util.c make PaUnixThreading_Initialize definition correspond to prototype --- src/hostapi/jack/pa_jack.c | 2 ++ src/os/unix/pa_unix_util.c | 2 +- src/os/unix/pa_unix_util.h | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/hostapi/jack/pa_jack.c b/src/hostapi/jack/pa_jack.c index a800f8e..5ec55c6 100644 --- a/src/hostapi/jack/pa_jack.c +++ b/src/hostapi/jack/pa_jack.c @@ -71,6 +71,8 @@ #include "pa_ringbuffer.h" #include "pa_debugprint.h" +#include "pa_jack.h" + static pthread_t mainThread_; static char *jackErr_ = NULL; static const char* clientName_ = "PortAudio"; diff --git a/src/os/unix/pa_unix_util.c b/src/os/unix/pa_unix_util.c index 17664ea..5472336 100644 --- a/src/os/unix/pa_unix_util.c +++ b/src/os/unix/pa_unix_util.c @@ -236,7 +236,7 @@ pthread_t paUnixMainThread = 0; pthread_t paUnixMainThread = 0; #endif -PaError PaUnixThreading_Initialize() +PaError PaUnixThreading_Initialize( void ) { paUnixMainThread = pthread_self(); return paNoError; diff --git a/src/os/unix/pa_unix_util.h b/src/os/unix/pa_unix_util.h index d73c99c..c401f19 100644 --- a/src/os/unix/pa_unix_util.h +++ b/src/os/unix/pa_unix_util.h @@ -157,7 +157,7 @@ typedef struct /** Initialize global threading state. */ -PaError PaUnixThreading_Initialize(); +PaError PaUnixThreading_Initialize( void ); /** Perish, passing on eventual error code. * From 521209c6335b3d835d77614e9015fe0ae0b46d9d Mon Sep 17 00:00:00 2001 From: Ross Bencina Date: Thu, 26 Nov 2020 13:46:05 +1100 Subject: [PATCH 039/164] pa_mac_core_utilities: add void to empty function argument list (#355) Insert "void" in the argument list to turn initializeXRunListenerList and destroyXRunListenerList declarations into valid prototypes. Also update the function definitions to match. Thanks to Paul Boersma. --- src/hostapi/coreaudio/pa_mac_core_utilities.c | 4 ++-- src/hostapi/coreaudio/pa_mac_core_utilities.h | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/hostapi/coreaudio/pa_mac_core_utilities.c b/src/hostapi/coreaudio/pa_mac_core_utilities.c index 63e616f..f3563ee 100644 --- a/src/hostapi/coreaudio/pa_mac_core_utilities.c +++ b/src/hostapi/coreaudio/pa_mac_core_utilities.c @@ -641,13 +641,13 @@ OSStatus xrunCallback( return 0; } -int initializeXRunListenerList() +int initializeXRunListenerList( void ) { xRunListSize = 0; bzero( (void *) &firstXRunListNode, sizeof(firstXRunListNode) ); return pthread_mutex_init( &xrunMutex, NULL ); } -int destroyXRunListenerList() +int destroyXRunListenerList( void ) { PaMacXRunListNode *node; node = firstXRunListNode.next; diff --git a/src/hostapi/coreaudio/pa_mac_core_utilities.h b/src/hostapi/coreaudio/pa_mac_core_utilities.h index 7c4afe5..fc65868 100644 --- a/src/hostapi/coreaudio/pa_mac_core_utilities.h +++ b/src/hostapi/coreaudio/pa_mac_core_utilities.h @@ -206,9 +206,9 @@ OSStatus xrunCallback( void* inClientData ) ; /** returns zero on success or a unix style error code. */ -int initializeXRunListenerList(); +int initializeXRunListenerList( void ); /** returns zero on success or a unix style error code. */ -int destroyXRunListenerList(); +int destroyXRunListenerList( void ); /**Returns the list, so that it can be passed to CorAudio.*/ void *addToXRunListenerList( void *stream ); From b37657be7081c8cd4dbb16f1f592082795dce776 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Sch=C3=BCrmann?= Date: Fri, 27 Nov 2020 08:40:45 +0100 Subject: [PATCH 040/164] Remove superfluid void cast --- src/hostapi/alsa/pa_linux_alsa.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/hostapi/alsa/pa_linux_alsa.c b/src/hostapi/alsa/pa_linux_alsa.c index 48d77c1..0564351 100644 --- a/src/hostapi/alsa/pa_linux_alsa.c +++ b/src/hostapi/alsa/pa_linux_alsa.c @@ -3641,7 +3641,6 @@ static PaError PaAlsaStreamComponent_BeginPolling( PaAlsaStreamComponent* self, { PaError result = paNoError; int ret = alsa_snd_pcm_poll_descriptors( self->pcm, pfds, self->nfds ); - (void)ret; /* Prevent unused variable warning if asserts are turned off */ /* If alsa returns anything else, like -EPIPE return*/ if( ret != self->nfds ) { From 5f35d35ad0f171dc0456d6806539df7bc67f8f1b Mon Sep 17 00:00:00 2001 From: Dmitry Kostjuchenko Date: Tue, 8 Dec 2020 08:26:54 +0200 Subject: [PATCH 041/164] Fixed breaking strict-aliasing rules (if compiled with GCC with -fstrict-aliasing) in PaWin_InitializeWaveFormatExtensible(). (#342) --- src/os/win/pa_win_waveformat.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/os/win/pa_win_waveformat.c b/src/os/win/pa_win_waveformat.c index bd5addd..5c6f29d 100644 --- a/src/os/win/pa_win_waveformat.c +++ b/src/os/win/pa_win_waveformat.c @@ -98,14 +98,15 @@ void PaWin_InitializeWaveFormatExtensible( PaWinWaveFormat *waveFormat, waveFormatEx->wBitsPerSample = bytesPerSample * 8; waveFormatEx->cbSize = 22; - *((WORD*)&waveFormat->fields[PAWIN_INDEXOF_WVALIDBITSPERSAMPLE]) = - waveFormatEx->wBitsPerSample; + memcpy(&waveFormat->fields[PAWIN_INDEXOF_WVALIDBITSPERSAMPLE], + &waveFormatEx->wBitsPerSample, sizeof(WORD)); + + memcpy(&waveFormat->fields[PAWIN_INDEXOF_DWCHANNELMASK], + &channelMask, sizeof(DWORD)); - *((DWORD*)&waveFormat->fields[PAWIN_INDEXOF_DWCHANNELMASK]) = channelMask; - guid = pawin_ksDataFormatSubtypeGuidBase; guid.Data1 = (USHORT)waveFormatTag; - *((GUID*)&waveFormat->fields[PAWIN_INDEXOF_SUBFORMAT]) = guid; + memcpy(&waveFormat->fields[PAWIN_INDEXOF_SUBFORMAT], &guid, sizeof(GUID)); } PaWinWaveFormatChannelMask PaWin_DefaultChannelMask( int numChannels ) From e5279859cecd4d2e0bd68b6cfc07a5c40a73a5eb Mon Sep 17 00:00:00 2001 From: Nemirtingas <9432037+Nemirtingas@users.noreply.github.com> Date: Tue, 8 Dec 2020 07:28:56 +0100 Subject: [PATCH 042/164] Fix GUID defines in pa_win_wdmks.c when compiling with clang-cl (#327) Fix GUID defines in pa_win_wdmks.c when compiling with clang-cl Co-authored-by: Nemirtingas --- src/hostapi/wdmks/pa_win_wdmks.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/hostapi/wdmks/pa_win_wdmks.c b/src/hostapi/wdmks/pa_win_wdmks.c index 15ba438..add663b 100644 --- a/src/hostapi/wdmks/pa_win_wdmks.c +++ b/src/hostapi/wdmks/pa_win_wdmks.c @@ -163,9 +163,15 @@ Default is to use the pin category. #define DYNAMIC_GUID(data) {data} #define _NTRTL_ /* Turn off default definition of DEFINE_GUIDEX */ #undef DEFINE_GUID -#define DEFINE_GUID(n,data) EXTERN_C const GUID n = {data} -#define DEFINE_GUID_THUNK(n,data) DEFINE_GUID(n,data) -#define DEFINE_GUIDEX(n) DEFINE_GUID_THUNK(n, STATIC_##n) +#ifdef __clang__ /* clang-cl: avoid too many arguments error */ + #define DEFINE_GUID(n, ...) EXTERN_C const GUID n = {__VA_ARGS__} + #define DEFINE_GUID_THUNK(n, ...) DEFINE_GUID(n, __VA_ARGS__) + #define DEFINE_GUIDEX(n) DEFINE_GUID_THUNK(n, STATIC_##n) +#else + #define DEFINE_GUID(n, data) EXTERN_C const GUID n = {data} + #define DEFINE_GUID_THUNK(n, data) DEFINE_GUID(n, data) + #define DEFINE_GUIDEX(n) DEFINE_GUID_THUNK(n, STATIC_##n) +#endif /* __clang__ */ #endif #include From f3924081ab5004deb86ed055d674bd018959b878 Mon Sep 17 00:00:00 2001 From: dmitrykos Date: Fri, 11 Dec 2020 15:30:08 +0200 Subject: [PATCH 043/164] wasapi: Fixed underruns in the Exclusive mode on UWP platform (or when timeBeginPeriod does not allow to set 1 ms granularity) by assuming that system timer granularity on UWP equals to 10 msec, make sure time to sleep provided by GetNextSleepTime is aligned to the granularity of the system timer. --- src/hostapi/wasapi/pa_win_wasapi.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/hostapi/wasapi/pa_win_wasapi.c b/src/hostapi/wasapi/pa_win_wasapi.c index 7e321f1..216796e 100644 --- a/src/hostapi/wasapi/pa_win_wasapi.c +++ b/src/hostapi/wasapi/pa_win_wasapi.c @@ -825,7 +825,7 @@ static inline UINT32 ThreadIdleScheduler_NextSleep(ThreadIdleScheduler *sched) // ------------------------------------------------------------------------------------------ typedef struct _SystemTimer { - UINT32 granularity; + INT32 granularity; } SystemTimer; static LARGE_INTEGER g_SystemTimerFrequency; @@ -849,12 +849,15 @@ static BOOL SystemTimer_SetGranularity(SystemTimer *timer, UINT32 granularity) { PRINT(("SetSystemTimer: timeBeginPeriod(1) failed!\n")); - timer->granularity = 0; + timer->granularity = 10; return FALSE; } #else - (void)timer; (void)granularity; + + // UWP does not support increase of the timer precision change and thus calling WaitForSingleObject with anything + // below 10 milliseconds will cause underruns for input and output stream. + timer->granularity = 10; #endif return TRUE; @@ -6113,8 +6116,11 @@ static inline INT32 GetNextSleepTime(SystemTimer *timer, ThreadIdleScheduler *sc // INT32 procTime = (INT32)(SystemTimer_GetTime(timer) - startTime); nextSleepTime -= procTime; - if (nextSleepTime < 0) + if (nextSleepTime < timer->granularity) nextSleepTime = 0; + else + if (timer->granularity > 1) + nextSleepTime = ALIGN_BWD(nextSleepTime, timer->granularity); #ifdef PA_WASAPI_LOG_TIME_SLOTS printf("{%d},", procTime); From e1c3e59ee8bafe7e3e2e3b0c703b72c97649bcff Mon Sep 17 00:00:00 2001 From: luz paz Date: Fri, 11 Dec 2020 07:37:23 -0500 Subject: [PATCH 044/164] Fix user-facing and non-user-facing typos Found via `codespell v2.1.dev0` --- README.md | 4 +-- aclocal.m4 | 4 +-- bindings/cpp/ChangeLog | 8 ++--- bindings/cpp/aclocal.m4 | 2 +- bindings/cpp/build/gnu/config.guess | Bin 38293 -> 38292 bytes bindings/cpp/example/devs.cxx | 8 ++--- bindings/cpp/example/sine.cxx | 8 ++--- .../portaudiocpp/AsioDeviceAdapter.hxx | 2 +- bindings/cpp/include/portaudiocpp/Device.hxx | 2 +- .../cpp/include/portaudiocpp/Exception.hxx | 2 +- bindings/cpp/include/portaudiocpp/HostApi.hxx | 2 +- .../cpp/include/portaudiocpp/PortAudioCpp.hxx | 2 +- bindings/cpp/include/portaudiocpp/Stream.hxx | 2 +- bindings/cpp/include/portaudiocpp/System.hxx | 2 +- .../source/portaudiocpp/StreamParameters.cxx | 2 +- .../jtests/com/portaudio/TestBasic.java | 6 ++-- build/msvc/readme.txt | 2 +- doc/src/api_overview.dox | 2 +- doc/src/tutorial/compile_cmake.dox | 2 +- doc/src/tutorial/compile_linux.dox | 2 +- doc/src/tutorial/start_stop_abort.dox | 2 +- examples/pa_fuzz.c | 2 +- examples/paex_mono_asio_channel_select.c | 2 +- examples/paex_ocean_shore.c | 2 +- examples/paex_pink.c | 2 +- examples/paex_read_write_wire.c | 2 +- examples/paex_record.c | 2 +- examples/paex_record_file.c | 2 +- examples/paex_saw.c | 2 +- examples/paex_sine.c | 2 +- examples/paex_sine_c++.cpp | 2 +- examples/paex_wmme_ac3.c | 2 +- examples/paex_wmme_surround.c | 2 +- examples/paex_write_sine.c | 2 +- examples/paex_write_sine_nonint.c | 2 +- include/pa_asio.h | 4 +-- include/pa_mac_core.h | 8 ++--- include/pa_win_wasapi.h | 16 ++++----- include/pa_win_wmme.h | 2 +- ltmain.sh | 4 +-- pablio/test_rw.c | 2 +- pablio/test_rw_echo.c | 2 +- pablio/test_w_saw.c | 2 +- pablio/test_w_saw8.c | 2 +- qa/loopback/src/audio_analyzer.h | 2 +- qa/loopback/src/paqa.c | 4 +-- qa/loopback/src/paqa_tools.c | 4 +-- src/common/pa_allocation.h | 2 +- src/common/pa_converters.c | 2 +- src/common/pa_converters.h | 6 ++-- src/common/pa_endianness.h | 6 ++-- src/common/pa_front.c | 8 ++--- src/common/pa_process.h | 18 +++++----- src/common/pa_util.h | 6 ++-- src/hostapi/alsa/pa_linux_alsa.c | 12 +++---- src/hostapi/asio/pa_asio.cpp | 28 +++++++-------- src/hostapi/coreaudio/notes.txt | 2 +- src/hostapi/coreaudio/pa_mac_core.c | 16 ++++----- src/hostapi/coreaudio/pa_mac_core_blocking.c | 6 ++-- src/hostapi/coreaudio/pa_mac_core_utilities.c | 10 +++--- src/hostapi/coreaudio/pa_mac_core_utilities.h | 6 ++-- src/hostapi/dsound/pa_win_ds.c | 12 +++---- src/hostapi/dsound/pa_win_ds_dynlink.c | 2 +- src/hostapi/dsound/pa_win_ds_dynlink.h | 2 +- src/hostapi/oss/pa_unix_oss.c | 12 +++---- src/hostapi/skeleton/pa_hostapi_skeleton.c | 4 +-- src/hostapi/wasapi/mingw-include/ksproxy.h | 2 +- src/hostapi/wasapi/pa_win_wasapi.c | 34 +++++++++--------- src/hostapi/wdmks/pa_win_wdmks.c | 4 +-- src/hostapi/wdmks/readme.txt | 2 +- src/hostapi/wmme/pa_win_wmme.c | 12 +++---- src/os/unix/pa_unix_util.h | 4 +-- src/os/win/pa_win_waveformat.c | 4 +-- src/os/win/pa_win_wdmks_utils.h | 2 +- src/os/win/pa_x86_plain_converters.c | 4 +-- test/pa_minlat.c | 2 +- test/patest1.c | 4 +-- test/patest_buffer.c | 2 +- test/patest_callbackstop.c | 2 +- test/patest_clip.c | 2 +- test/patest_dither.c | 2 +- test/patest_dsound_low_level_latency_params.c | 2 +- test/patest_dsound_surround.c | 2 +- test/patest_hang.c | 2 +- test/patest_in_overflow.c | 4 +-- test/patest_jack_wasapi.c | 4 +-- test/patest_latency.c | 2 +- test/patest_leftright.c | 2 +- test/patest_longsine.c | 2 +- test/patest_many.c | 2 +- test/patest_maxsines.c | 2 +- test/patest_mono.c | 2 +- test/patest_multi_sine.c | 2 +- test/patest_out_underflow.c | 2 +- test/patest_prime.c | 4 +-- test/patest_read_record.c | 2 +- test/patest_sine8.c | 2 +- test/patest_sine_channelmaps.c | 2 +- test/patest_sine_formats.c | 2 +- test/patest_sine_srate.c | 2 +- test/patest_sine_time.c | 2 +- test/patest_start_stop.c | 2 +- test/patest_stop.c | 2 +- test/patest_stop_playout.c | 2 +- test/patest_suggested_vs_streaminfo_latency.c | 2 +- test/patest_sync.c | 2 +- test/patest_timing.c | 2 +- test/patest_toomanysines.c | 2 +- test/patest_two_rates.c | 2 +- test/patest_underflow.c | 2 +- test/patest_unplug.c | 2 +- test/patest_wire.c | 2 +- test/patest_wmme_find_best_latency_params.c | 4 +-- test/patest_wmme_low_level_latency_params.c | 2 +- test/patest_write_stop.c | 2 +- test/patest_write_stop_hang_illegal.c | 2 +- 116 files changed, 233 insertions(+), 233 deletions(-) diff --git a/README.md b/README.md index 74cfe6f..bf48975 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,7 @@ Please feel free to join. See http://www.portaudio.com for details. ## Important Files and Folders: include/portaudio.h = header file for PortAudio API. Specifies API. - src/common/ = platform independant code, host independant + src/common/ = platform independent code, host independent code for all implementations. src/os = os specific (but host api neutral) code src/hostapi = implementations for different host apis @@ -58,5 +58,5 @@ Please feel free to join. See http://www.portaudio.com for details. test/patest_record.c = record and playback some audio test/patest_maxsines.c = how many sine waves can we play? Tests Pa_GetCPULoad(). test/patest_sine.c = output a sine wave in a simple PA app - test/patest_sync.c = test syncronization of audio and video + test/patest_sync.c = test synchronization of audio and video test/patest_wire.c = pass input to output, wire simulator diff --git a/aclocal.m4 b/aclocal.m4 index 85326be..f6850af 100644 --- a/aclocal.m4 +++ b/aclocal.m4 @@ -649,7 +649,7 @@ configured by $[0], generated by m4_PACKAGE_STRING. Copyright (C) 2011 Free Software Foundation, Inc. This config.lt script is free software; the Free Software Foundation -gives unlimited permision to copy, distribute and modify it." +gives unlimited permission to copy, distribute and modify it." while test $[#] != 0 do @@ -8669,7 +8669,7 @@ fi[]dnl # to PKG_CHECK_MODULES(), but does not set variables or print errors. # # Please remember that m4 expands AC_REQUIRE([PKG_PROG_PKG_CONFIG]) -# only at the first occurence in configure.ac, so if the first place +# only at the first occurrence in configure.ac, so if the first place # it's called might be skipped (such as if it is within an "if", you # have to call PKG_CHECK_EXISTS manually # -------------------------------------------------------------- diff --git a/bindings/cpp/ChangeLog b/bindings/cpp/ChangeLog index 6b0b027..1e96618 100644 --- a/bindings/cpp/ChangeLog +++ b/bindings/cpp/ChangeLog @@ -12,7 +12,7 @@ PortAudioCpp v19 revision 15 (unknown release date): mblaauw: - Changed some exception handling code in HostApi's constructor. - - Added accessors to PortAudio PaStream from PortAudioCpp Stream (their absense being pointed out + - Added accessors to PortAudio PaStream from PortAudioCpp Stream (their absence being pointed out by Tom Jordan). - Fixed a bug/typo in MemFunToCallbackInterfaceAdapter::init() thanks to Fredrik Viklund. - Fixed issue with concrete Stream classes possibly throwing an exception and fixed documentation w.r.t. this. @@ -37,14 +37,14 @@ PortAudioCpp v19 revision 13 03/10/19: the std::exception base class's what() member function (which had throw(), i.e. no-throw guarantee). - Changed the iterators so that they have a set of public typedefs instead of deriving the C++ standard library std::iterator<> struct. G++ 2.95 doesn't support std::exception<> and composition-by-aggregation - is prefered over composition-by-inheritance in this case. + is preferred over composition-by-inheritance in this case. - Changed some minor things to avoid G++ warning messages. mblaauw: - Renamed this file (/WHATSNEW.txt) to /CHANGELOG. - Renamed /PA_ISSUES.txt to /PA_ISSUES. - Added /INSTALL file with some build info for GNU/Linux and VC6. - - Added MSVC 6.0 projects for building PortAudioCpp as a staticly or dynamically linkable library. + - Added MSVC 6.0 projects for building PortAudioCpp as a statically or dynamically linkable library. - Moved build files to /build/(gnu/ or vc6/). - Moved Doxygen configuration files to /doc/ and output to /doc/api_reference/. - Added a /doc/README with some info how to generate Doxygen documentation. @@ -82,7 +82,7 @@ PortAudioCpp v19 revision 09 03/06/25: mblaauw: - Changed some things in SingleDirectionStreamParameters to ease it's usage. - Placed all SingleDirectionStreamParameters stuff into a separate file. - + Totally redid the callback stuff, now it's less ackward and supports C++ functions. + + Totally redid the callback stuff, now it's less awkward and supports C++ functions. PortAudioCpp v19 revision 08 03/06/20: diff --git a/bindings/cpp/aclocal.m4 b/bindings/cpp/aclocal.m4 index 68c908f..f5dec8f 100644 --- a/bindings/cpp/aclocal.m4 +++ b/bindings/cpp/aclocal.m4 @@ -657,7 +657,7 @@ configured by $[0], generated by m4_PACKAGE_STRING. Copyright (C) 2011 Free Software Foundation, Inc. This config.lt script is free software; the Free Software Foundation -gives unlimited permision to copy, distribute and modify it." +gives unlimited permission to copy, distribute and modify it." while test $[#] != 0 do diff --git a/bindings/cpp/build/gnu/config.guess b/bindings/cpp/build/gnu/config.guess index 297e5c30f41b65e95341322c77994c4d1d447134..d5128acaf109e638a025c86cfdf17c453b4339c1 100644 GIT binary patch delta 14 WcmbQbnrX^vrVY0QHs2Q5)dB!B00#O1 delta 14 WcmbQTnrZ54rVY0QHs2K3-2wnI_Xha@ diff --git a/bindings/cpp/example/devs.cxx b/bindings/cpp/example/devs.cxx index 31a560f..5ef4cab 100644 --- a/bindings/cpp/example/devs.cxx +++ b/bindings/cpp/example/devs.cxx @@ -158,19 +158,19 @@ int main(int, char*[]) } catch (const portaudio::PaException &e) { - std::cout << "A PortAudio error occured: " << e.paErrorText() << std::endl; + std::cout << "A PortAudio error occurred: " << e.paErrorText() << std::endl; } catch (const portaudio::PaCppException &e) { - std::cout << "A PortAudioCpp error occured: " << e.what() << std::endl; + std::cout << "A PortAudioCpp error occurred: " << e.what() << std::endl; } catch (const std::exception &e) { - std::cout << "A generic exception occured: " << e.what() << std::endl; + std::cout << "A generic exception occurred: " << e.what() << std::endl; } catch (...) { - std::cout << "An unknown exception occured." << std::endl; + std::cout << "An unknown exception occurred." << std::endl; } return 0; diff --git a/bindings/cpp/example/sine.cxx b/bindings/cpp/example/sine.cxx index 0676e3e..0c772e6 100644 --- a/bindings/cpp/example/sine.cxx +++ b/bindings/cpp/example/sine.cxx @@ -116,19 +116,19 @@ int main(int, char *[]) } catch (const portaudio::PaException &e) { - std::cout << "A PortAudio error occured: " << e.paErrorText() << std::endl; + std::cout << "A PortAudio error occurred: " << e.paErrorText() << std::endl; } catch (const portaudio::PaCppException &e) { - std::cout << "A PortAudioCpp error occured: " << e.what() << std::endl; + std::cout << "A PortAudioCpp error occurred: " << e.what() << std::endl; } catch (const std::exception &e) { - std::cout << "A generic exception occured: " << e.what() << std::endl; + std::cout << "A generic exception occurred: " << e.what() << std::endl; } catch (...) { - std::cout << "An unknown exception occured." << std::endl; + std::cout << "An unknown exception occurred." << std::endl; } return 0; diff --git a/bindings/cpp/include/portaudiocpp/AsioDeviceAdapter.hxx b/bindings/cpp/include/portaudiocpp/AsioDeviceAdapter.hxx index 26957c4..59f6095 100644 --- a/bindings/cpp/include/portaudiocpp/AsioDeviceAdapter.hxx +++ b/bindings/cpp/include/portaudiocpp/AsioDeviceAdapter.hxx @@ -11,7 +11,7 @@ namespace portaudio ////// /// @brief Adapts the given Device to an ASIO specific extension. /// - /// Deleting the AsioDeviceAdapter does not affect the underlaying + /// Deleting the AsioDeviceAdapter does not affect the underlying /// Device. ////// class AsioDeviceAdapter diff --git a/bindings/cpp/include/portaudiocpp/Device.hxx b/bindings/cpp/include/portaudiocpp/Device.hxx index 3c6c3c0..0599582 100644 --- a/bindings/cpp/include/portaudiocpp/Device.hxx +++ b/bindings/cpp/include/portaudiocpp/Device.hxx @@ -41,7 +41,7 @@ namespace portaudio { public: // query info: name, max in channels, max out channels, - // default low/hight input/output latency, default sample rate + // default low/high input/output latency, default sample rate PaDeviceIndex index() const; const char *name() const; int maxInputChannels() const; diff --git a/bindings/cpp/include/portaudiocpp/Exception.hxx b/bindings/cpp/include/portaudiocpp/Exception.hxx index f5249c9..02d36b2 100644 --- a/bindings/cpp/include/portaudiocpp/Exception.hxx +++ b/bindings/cpp/include/portaudiocpp/Exception.hxx @@ -36,7 +36,7 @@ namespace portaudio /// other code. /// /// To know what exceptions each function may throw, look up - /// the errors that can occure in the PortAudio documentation + /// the errors that can occur in the PortAudio documentation /// for the equivalent functions. /// /// Some functions are likely to throw an exception (such as diff --git a/bindings/cpp/include/portaudiocpp/HostApi.hxx b/bindings/cpp/include/portaudiocpp/HostApi.hxx index ce397ca..113558c 100644 --- a/bindings/cpp/include/portaudiocpp/HostApi.hxx +++ b/bindings/cpp/include/portaudiocpp/HostApi.hxx @@ -28,7 +28,7 @@ namespace portaudio /// A single System can support multiple HostApi's each one typically having /// a set of Devices using that HostApi (usually driver type). All Devices in /// the HostApi can be enumerated and the default input/output Device for this - /// HostApi can be retreived. + /// HostApi can be retrieved. ////// class HostApi { diff --git a/bindings/cpp/include/portaudiocpp/PortAudioCpp.hxx b/bindings/cpp/include/portaudiocpp/PortAudioCpp.hxx index 96df96e..1165550 100644 --- a/bindings/cpp/include/portaudiocpp/PortAudioCpp.hxx +++ b/bindings/cpp/include/portaudiocpp/PortAudioCpp.hxx @@ -50,7 +50,7 @@ /// Other platforms should be easily supported as PortAudioCpp is platform-independent and (reasonably) C++ standard compliant. ///