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.
This commit is contained in:
Ross Bencina 2021-01-22 00:00:40 +11:00 committed by GitHub
commit 0b832f5ff1
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
15 changed files with 2570 additions and 2569 deletions

File diff suppressed because it is too large Load diff

View file

@ -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: * the PortAudio community also makes the following non-binding requests:
* *
* Any person wishing to distribute modifications to the Software is * Any person wishing to distribute modifications to the Software is
* requested to send the modifications to the original developer so that * requested to send the modifications to the original developer so that
* they can be incorporated into the canonical version. It is also * they can be incorporated into the canonical version. It is also
* requested that these non-binding requests be included along with the * requested that these non-binding requests be included along with the
* license above. * license above.
*/ */
@ -46,44 +46,44 @@
typedef struct PaQaSineGenerator_s typedef struct PaQaSineGenerator_s
{ {
double phase; double phase;
double phaseIncrement; double phaseIncrement;
double frequency; double frequency;
double amplitude; double amplitude;
} PaQaSineGenerator; } PaQaSineGenerator;
/** Container for a monophonic audio sample in memory. */ /** Container for a monophonic audio sample in memory. */
typedef struct PaQaRecording_s typedef struct PaQaRecording_s
{ {
/** Maximum number of frames that can fit in the allocated buffer. */ /** Maximum number of frames that can fit in the allocated buffer. */
int maxFrames; int maxFrames;
float *buffer; float *buffer;
/** Actual number of valid frames in the buffer. */ /** Actual number of valid frames in the buffer. */
int numFrames; int numFrames;
int sampleRate; int sampleRate;
} PaQaRecording; } PaQaRecording;
typedef struct PaQaTestTone_s typedef struct PaQaTestTone_s
{ {
int samplesPerFrame; int samplesPerFrame;
int startDelay; int startDelay;
double sampleRate; double sampleRate;
double frequency; double frequency;
double amplitude; double amplitude;
} PaQaTestTone; } PaQaTestTone;
typedef struct PaQaAnalysisResult_s typedef struct PaQaAnalysisResult_s
{ {
int valid; int valid;
/** Latency in samples from output to input. */ /** Latency in samples from output to input. */
double latency; double latency;
double amplitudeRatio; double amplitudeRatio;
double popAmplitude; double popAmplitude;
double popPosition; double popPosition;
double numDroppedFrames; double numDroppedFrames;
double droppedFramesPosition; double droppedFramesPosition;
double numAddedFrames; double numAddedFrames;
double addedFramesPosition; double addedFramesPosition;
} PaQaAnalysisResult; } 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_MixSine( PaQaSineGenerator *generator, float *buffer, int numSamples, int stride );
void PaQa_WriteSine( 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. * 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. * Allocate memory for containing a mono audio signal. Set up recording for writing.
*/ */
int PaQa_InitializeRecording( PaQaRecording *recording, int maxSamples, int sampleRate ); int PaQa_InitializeRecording( PaQaRecording *recording, int maxSamples, int sampleRate );
/** /**
* Free memory allocated by PaQa_InitializeRecording. * Free memory allocated by PaQa_InitializeRecording.
*/ */
void PaQa_TerminateRecording( PaQaRecording *recording ); void PaQa_TerminateRecording( PaQaRecording *recording );
/** /**
* Apply a biquad filter to the audio from the input recording and write it to the output 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 ); 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. * @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 ); int PaQa_WriteRecording( PaQaRecording *recording, float *buffer, int numSamples, int stride );
/** Write zeros into a recording. */ /** Write zeros into a recording. */
int PaQa_WriteSilence( PaQaRecording *recording, int numSamples ); int PaQa_WriteSilence( PaQaRecording *recording, int numSamples );
int PaQa_RecordFreeze( PaQaRecording *recording, int numSamples ); int PaQa_RecordFreeze( PaQaRecording *recording, int numSamples );
double PaQa_CorrelateSine( PaQaRecording *recording, double frequency, double frameRate, 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 ); double PaQa_FindFirstMatch( PaQaRecording *recording, float *buffer, int numSamples, double tolerance );
/** /**
* Estimate the original amplitude of a clipped sine wave by measuring * Estimate the original amplitude of a clipped sine wave by measuring
* its average slope at the zero crossings. * its average slope at the zero crossings.
*/ */
double PaQa_MeasureSineAmplitudeBySlope( PaQaRecording *recording, double PaQa_MeasureSineAmplitudeBySlope( PaQaRecording *recording,
double frequency, double frameRate, double frequency, double frameRate,
int startFrame, int numFrames ); int startFrame, int numFrames );
double PaQa_MeasureRootMeanSquare( float *buffer, int numFrames ); double PaQa_MeasureRootMeanSquare( float *buffer, int numFrames );

View file

@ -4,9 +4,10 @@
#include "biquad_filter.h" #include "biquad_filter.h"
/** /**
* Unit_BiquadFilter implements a second order IIR filter. * 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) * 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 * @author (C) 2002 Phil Burk, SoftSynth.com, All Rights Reserved
*/ */
@ -17,17 +18,17 @@
*/ */
static void BiquadFilter_CalculateCommon( BiquadFilter *filter, double ratio, double Q ) static void BiquadFilter_CalculateCommon( BiquadFilter *filter, double ratio, double Q )
{ {
double omega; double omega;
memset( filter, 0, sizeof(BiquadFilter) ); memset( filter, 0, sizeof(BiquadFilter) );
/* Don't let frequency get too close to Nyquist or filter will blow up. */ /* Don't let frequency get too close to Nyquist or filter will blow up. */
if( ratio >= 0.499 ) ratio = 0.499; if( ratio >= 0.499 ) ratio = 0.499;
omega = 2.0 * (double)FILTER_PI * ratio; omega = 2.0 * (double)FILTER_PI * ratio;
filter->cos_omega = (double) cos( omega ); filter->cos_omega = (double) cos( omega );
filter->sin_omega = (double) sin( omega ); filter->sin_omega = (double) sin( omega );
filter->alpha = filter->sin_omega / (2.0 * Q); 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 ) void BiquadFilter_SetupHighPass( BiquadFilter *filter, double ratio, double Q )
{ {
double scalar, opc; double scalar, opc;
if( ratio < BIQUAD_MIN_RATIO ) ratio = BIQUAD_MIN_RATIO; if( ratio < BIQUAD_MIN_RATIO ) ratio = BIQUAD_MIN_RATIO;
if( Q < BIQUAD_MIN_Q ) Q = BIQUAD_MIN_Q; if( Q < BIQUAD_MIN_Q ) Q = BIQUAD_MIN_Q;
BiquadFilter_CalculateCommon( filter, ratio, Q ); BiquadFilter_CalculateCommon( filter, ratio, Q );
scalar = 1.0 / (1.0 + filter->alpha); scalar = 1.0 / (1.0 + filter->alpha);
opc = (1.0 + filter->cos_omega); opc = (1.0 + filter->cos_omega);
filter->a0 = opc * 0.5 * scalar; filter->a0 = opc * 0.5 * scalar;
filter->a1 = - opc * scalar; filter->a1 = - opc * scalar;
filter->a2 = filter->a0; filter->a2 = filter->a0;
filter->b1 = -2.0 * filter->cos_omega * scalar; filter->b1 = -2.0 * filter->cos_omega * scalar;
filter->b2 = (1.0 - filter->alpha) * 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 ) void BiquadFilter_SetupNotch( BiquadFilter *filter, double ratio, double Q )
{ {
double scalar, opc; double scalar, opc;
if( ratio < BIQUAD_MIN_RATIO ) ratio = BIQUAD_MIN_RATIO; if( ratio < BIQUAD_MIN_RATIO ) ratio = BIQUAD_MIN_RATIO;
if( Q < BIQUAD_MIN_Q ) Q = BIQUAD_MIN_Q; if( Q < BIQUAD_MIN_Q ) Q = BIQUAD_MIN_Q;
BiquadFilter_CalculateCommon( filter, ratio, Q ); BiquadFilter_CalculateCommon( filter, ratio, Q );
scalar = 1.0 / (1.0 + filter->alpha); scalar = 1.0 / (1.0 + filter->alpha);
opc = (1.0 + filter->cos_omega); opc = (1.0 + filter->cos_omega);
filter->a0 = scalar; filter->a0 = scalar;
filter->a1 = -2.0 * filter->cos_omega * scalar; filter->a1 = -2.0 * filter->cos_omega * scalar;
filter->a2 = filter->a0; filter->a2 = filter->a0;
filter->b1 = filter->a1; filter->b1 = filter->a1;
filter->b2 = (1.0 - filter->alpha) * scalar; 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 ) void BiquadFilter_Filter( BiquadFilter *filter, float *inputs, float *outputs, int numSamples )
{ {
int i; int i;
double xn, yn; double xn, yn;
// Pull values from structure to speed up the calculation. // Pull values from structure to speed up the calculation.
double a0 = filter->a0; double a0 = filter->a0;
double a1 = filter->a1; double a1 = filter->a1;
double a2 = filter->a2; double a2 = filter->a2;
double b1 = filter->b1; double b1 = filter->b1;
double b2 = filter->b2; double b2 = filter->b2;
double xn1 = filter->xn1; double xn1 = filter->xn1;
double xn2 = filter->xn2; double xn2 = filter->xn2;
double yn1 = filter->yn1; double yn1 = filter->yn1;
double yn2 = filter->yn2; double yn2 = filter->yn2;
for( i=0; i<numSamples; i++) for( i=0; i<numSamples; i++)
{ {
// Generate outputs by filtering inputs. // Generate outputs by filtering inputs.
xn = inputs[i]; xn = inputs[i];
yn = (a0 * xn) + (a1 * xn1) + (a2 * xn2) - (b1 * yn1) - (b2 * yn2); yn = (a0 * xn) + (a1 * xn1) + (a2 * xn2) - (b1 * yn1) - (b2 * yn2);
outputs[i] = yn; outputs[i] = yn;
// Delay input and output values. // Delay input and output values.
xn2 = xn1; xn2 = xn1;
xn1 = xn; xn1 = xn;
yn2 = yn1; yn2 = yn1;
yn1 = yn; yn1 = yn;
if( (i & 7) == 0 ) if( (i & 7) == 0 )
{ {
// Apply a small bipolar impulse to filter to prevent arithmetic underflow. // Apply a small bipolar impulse to filter to prevent arithmetic underflow.
// Underflows can cause the FPU to interrupt the CPU. // Underflows can cause the FPU to interrupt the CPU.
yn1 += (double) 1.0E-26; yn1 += (double) 1.0E-26;
yn2 -= (double) 1.0E-26; yn2 -= (double) 1.0E-26;
} }
} }
filter->xn1 = xn1; filter->xn1 = xn1;
filter->xn2 = xn2; filter->xn2 = xn2;
filter->yn1 = yn1; filter->yn1 = yn1;
filter->yn2 = yn2; filter->yn2 = yn2;
} }

View file

@ -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 * @author (C) 2002 Phil Burk, SoftSynth.com, All Rights Reserved
*/ */
@ -14,20 +14,20 @@
typedef struct BiquadFilter_s typedef struct BiquadFilter_s
{ {
double xn1; // storage for delayed signals double xn1; // storage for delayed signals
double xn2; double xn2;
double yn1; double yn1;
double yn2; double yn2;
double a0; // coefficients double a0; // coefficients
double a1; double a1;
double a2; double a2;
double b1; double b1;
double b2; double b2;
double cos_omega; double cos_omega;
double sin_omega; double sin_omega;
double alpha; double alpha;
} BiquadFilter; } BiquadFilter;
void BiquadFilter_SetupHighPass( BiquadFilter *filter, double ratio, double Q ); void BiquadFilter_SetupHighPass( BiquadFilter *filter, double ratio, double Q );

File diff suppressed because it is too large Load diff

View file

@ -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: * the PortAudio community also makes the following non-binding requests:
* *
* Any person wishing to distribute modifications to the Software is * Any person wishing to distribute modifications to the Software is
* requested to send the modifications to the original developer so that * requested to send the modifications to the original developer so that
* they can be incorporated into the canonical version. It is also * they can be incorporated into the canonical version. It is also
* requested that these non-binding requests be included along with the * requested that these non-binding requests be included along with the
* license above. * license above.
*/ */
@ -43,129 +43,129 @@
void PaQa_ListAudioDevices(void) void PaQa_ListAudioDevices(void)
{ {
int i, numDevices; int i, numDevices;
const PaDeviceInfo *deviceInfo; const PaDeviceInfo *deviceInfo;
numDevices = Pa_GetDeviceCount(); numDevices = Pa_GetDeviceCount();
for( i=0; i<numDevices; i++ ) for( i=0; i<numDevices; i++ )
{ {
deviceInfo = Pa_GetDeviceInfo( i ); deviceInfo = Pa_GetDeviceInfo( i );
printf( "#%d: ", i ); printf( "#%d: ", i );
printf( "%2d in", deviceInfo->maxInputChannels ); printf( "%2d in", deviceInfo->maxInputChannels );
printf( ", %2d out", deviceInfo->maxOutputChannels ); printf( ", %2d out", deviceInfo->maxOutputChannels );
printf( ", %s", deviceInfo->name ); printf( ", %s", deviceInfo->name );
printf( ", on %s\n", Pa_GetHostApiInfo( deviceInfo->hostApi )->name ); printf( ", on %s\n", Pa_GetHostApiInfo( deviceInfo->hostApi )->name );
} }
} }
/*******************************************************************/ /*******************************************************************/
void PaQa_ConvertToFloat( const void *input, int numSamples, PaSampleFormat inFormat, float *output ) void PaQa_ConvertToFloat( const void *input, int numSamples, PaSampleFormat inFormat, float *output )
{ {
int i; int i;
switch( inFormat ) switch( inFormat )
{ {
case paUInt8: case paUInt8:
{ {
unsigned char *data = (unsigned char *)input; unsigned char *data = (unsigned char *)input;
for( i=0; i<numSamples; i++ ) for( i=0; i<numSamples; i++ )
{ {
int value = *data++; int value = *data++;
value -= 128; value -= 128;
*output++ = value / 128.0f; *output++ = value / 128.0f;
} }
} }
break; break;
case paInt8: case paInt8:
{ {
char *data = (char *)input; char *data = (char *)input;
for( i=0; i<numSamples; i++ ) for( i=0; i<numSamples; i++ )
{ {
int value = *data++; int value = *data++;
*output++ = value / 128.0f; *output++ = value / 128.0f;
} }
} }
break; break;
case paInt16: case paInt16:
{ {
short *data = (short *)input; short *data = (short *)input;
for( i=0; i<numSamples; i++ ) for( i=0; i<numSamples; i++ )
{ {
*output++ = *data++ / 32768.0f; *output++ = *data++ / 32768.0f;
} }
} }
break; break;
case paInt32: case paInt32:
{ {
int *data = (int *)input; int *data = (int *)input;
for( i=0; i<numSamples; i++ ) for( i=0; i<numSamples; i++ )
{ {
int value = (*data++) >> 8; int value = (*data++) >> 8;
float fval = (float) (value / ((double) 0x00800000)); float fval = (float) (value / ((double) 0x00800000));
*output++ = fval; *output++ = fval;
} }
} }
break; break;
} }
} }
/*******************************************************************/ /*******************************************************************/
void PaQa_ConvertFromFloat( const float *input, int numSamples, PaSampleFormat outFormat, void *output ) void PaQa_ConvertFromFloat( const float *input, int numSamples, PaSampleFormat outFormat, void *output )
{ {
int i; int i;
switch( outFormat ) switch( outFormat )
{ {
case paUInt8: case paUInt8:
{ {
unsigned char *data = (unsigned char *)output; unsigned char *data = (unsigned char *)output;
for( i=0; i<numSamples; i++ ) for( i=0; i<numSamples; i++ )
{ {
float value = *input++; float value = *input++;
int byte = ((int) (value * 127)) + 128; int byte = ((int) (value * 127)) + 128;
*data++ = (unsigned char) byte; *data++ = (unsigned char) byte;
} }
} }
break; break;
case paInt8: case paInt8:
{ {
char *data = (char *)output; char *data = (char *)output;
for( i=0; i<numSamples; i++ ) for( i=0; i<numSamples; i++ )
{ {
float value = *input++; float value = *input++;
int byte = (int) (value * 127); int byte = (int) (value * 127);
*data++ = (char) byte; *data++ = (char) byte;
} }
} }
break; break;
case paInt16: case paInt16:
{ {
short *data = (short *)output; short *data = (short *)output;
for( i=0; i<numSamples; i++ ) for( i=0; i<numSamples; i++ )
{ {
float value = *input++; float value = *input++;
// Use asymmetric conversion to avoid clipping. // Use asymmetric conversion to avoid clipping.
short sval = value * 32767.0; short sval = value * 32767.0;
*data++ = sval; *data++ = sval;
} }
} }
break; break;
case paInt32: case paInt32:
{ {
int *data = (int *)output; int *data = (int *)output;
for( i=0; i<numSamples; i++ ) for( i=0; i<numSamples; i++ )
{ {
float value = *input++; float value = *input++;
// Use asymmetric conversion to avoid clipping. // Use asymmetric conversion to avoid clipping.
int ival = value * ((double) 0x007FFFF0); int ival = value * ((double) 0x007FFFF0);
ival = ival << 8; ival = ival << 8;
*data++ = ival; *data++ = ival;
} }
} }
break; break;
} }
} }

View file

@ -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: * the PortAudio community also makes the following non-binding requests:
* *
* Any person wishing to distribute modifications to the Software is * Any person wishing to distribute modifications to the Software is
* requested to send the modifications to the original developer so that * requested to send the modifications to the original developer so that
* they can be incorporated into the canonical version. It is also * they can be incorporated into the canonical version. It is also
* requested that these non-binding requests be included along with the * requested that these non-binding requests be included along with the
* license above. * license above.
*/ */

View file

@ -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: * the PortAudio community also makes the following non-binding requests:
* *
* Any person wishing to distribute modifications to the Software is * Any person wishing to distribute modifications to the Software is
* requested to send the modifications to the original developer so that * requested to send the modifications to the original developer so that
* they can be incorporated into the canonical version. It is also * they can be incorporated into the canonical version. It is also
* requested that these non-binding requests be included along with the * requested that these non-binding requests be included along with the
* license above. * license above.
*/ */
@ -43,32 +43,32 @@ extern int g_testsPassed;
extern int g_testsFailed; extern int g_testsFailed;
#define QA_ASSERT_TRUE( message, flag ) \ #define QA_ASSERT_TRUE( message, flag ) \
if( !(flag) ) \ if( !(flag) ) \
{ \ { \
printf( "%s:%d - ERROR - %s\n", __FILE__, __LINE__, message ); \ printf( "%s:%d - ERROR - %s\n", __FILE__, __LINE__, message ); \
g_testsFailed++; \ g_testsFailed++; \
goto error; \ goto error; \
} \ } \
else g_testsPassed++; else g_testsPassed++;
#define QA_ASSERT_EQUALS( message, expected, actual ) \ #define QA_ASSERT_EQUALS( message, expected, actual ) \
if( ((expected) != (actual)) ) \ if( ((expected) != (actual)) ) \
{ \ { \
printf( "%s:%d - ERROR - %s, expected %d, got %d\n", __FILE__, __LINE__, message, expected, actual ); \ printf( "%s:%d - ERROR - %s, expected %d, got %d\n", __FILE__, __LINE__, message, expected, actual ); \
g_testsFailed++; \ g_testsFailed++; \
goto error; \ goto error; \
} \ } \
else g_testsPassed++; else g_testsPassed++;
#define QA_ASSERT_CLOSE( message, expected, actual, tolerance ) \ #define QA_ASSERT_CLOSE( message, expected, actual, tolerance ) \
if (fabs((expected)-(actual))>(tolerance)) \ 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)) ); \ printf( "%s:%d - ERROR - %s, expected %f, got %f, tol=%f\n", __FILE__, __LINE__, message, ((double)(expected)), ((double)(actual)), ((double)(tolerance)) ); \
g_testsFailed++; \ g_testsFailed++; \
goto error; \ goto error; \
} \ } \
else g_testsPassed++; else g_testsPassed++;
#define QA_ASSERT_CLOSE_INT( message, expected, actual, tolerance ) \ #define QA_ASSERT_CLOSE_INT( message, expected, actual, tolerance ) \
if (abs((expected)-(actual))>(tolerance)) \ if (abs((expected)-(actual))>(tolerance)) \

File diff suppressed because it is too large Load diff

View file

@ -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: * the PortAudio community also makes the following non-binding requests:
* *
* Any person wishing to distribute modifications to the Software is * Any person wishing to distribute modifications to the Software is
* requested to send the modifications to the original developer so that * requested to send the modifications to the original developer so that
* they can be incorporated into the canonical version. It is also * they can be incorporated into the canonical version. It is also
* requested that these non-binding requests be included along with the * requested that these non-binding requests be included along with the
* license above. * license above.
*/ */

View file

@ -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: * the PortAudio community also makes the following non-binding requests:
* *
* Any person wishing to distribute modifications to the Software is * Any person wishing to distribute modifications to the Software is
* requested to send the modifications to the original developer so that * requested to send the modifications to the original developer so that
* they can be incorporated into the canonical version. It is also * they can be incorporated into the canonical version. It is also
* requested that these non-binding requests be included along with the * requested that these non-binding requests be included along with the
* license above. * license above.
*/ */
@ -47,32 +47,32 @@
/* Write long word data to a little endian format byte array. */ /* Write long word data to a little endian format byte array. */
static void WriteLongLE( unsigned char **addrPtr, unsigned long data ) static void WriteLongLE( unsigned char **addrPtr, unsigned long data )
{ {
unsigned char *addr = *addrPtr; unsigned char *addr = *addrPtr;
*addr++ = (unsigned char) data; *addr++ = (unsigned char) data;
*addr++ = (unsigned char) (data>>8); *addr++ = (unsigned char) (data>>8);
*addr++ = (unsigned char) (data>>16); *addr++ = (unsigned char) (data>>16);
*addr++ = (unsigned char) (data>>24); *addr++ = (unsigned char) (data>>24);
*addrPtr = addr; *addrPtr = addr;
} }
/* Write short word data to a little endian format byte array. */ /* Write short word data to a little endian format byte array. */
static void WriteShortLE( unsigned char **addrPtr, unsigned short data ) static void WriteShortLE( unsigned char **addrPtr, unsigned short data )
{ {
unsigned char *addr = *addrPtr; unsigned char *addr = *addrPtr;
*addr++ = (unsigned char) data; *addr++ = (unsigned char) data;
*addr++ = (unsigned char) (data>>8); *addr++ = (unsigned char) (data>>8);
*addrPtr = addr; *addrPtr = addr;
} }
/* Write IFF ChunkType data to a byte array. */ /* Write IFF ChunkType data to a byte array. */
static void WriteChunkType( unsigned char **addrPtr, unsigned long cktyp ) static void WriteChunkType( unsigned char **addrPtr, unsigned long cktyp )
{ {
unsigned char *addr = *addrPtr; unsigned char *addr = *addrPtr;
*addr++ = (unsigned char) (cktyp>>24); *addr++ = (unsigned char) (cktyp>>24);
*addr++ = (unsigned char) (cktyp>>16); *addr++ = (unsigned char) (cktyp>>16);
*addr++ = (unsigned char) (cktyp>>8); *addr++ = (unsigned char) (cktyp>>8);
*addr++ = (unsigned char) cktyp; *addr++ = (unsigned char) cktyp;
*addrPtr = addr; *addrPtr = addr;
} }
#define WAV_HEADER_SIZE (4 + 4 + 4 + /* RIFF+size+WAVE */ \ #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 ) 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 header[ WAV_HEADER_SIZE ];
unsigned char *addr = header; unsigned char *addr = header;
int numWritten; int numWritten;
writer->dataSize = 0; writer->dataSize = 0;
writer->dataSizeOffset = 0; writer->dataSizeOffset = 0;
writer->fid = fopen( fileName, "wb" ); writer->fid = fopen( fileName, "wb" );
if( writer->fid == NULL ) if( writer->fid == NULL )
{ {
@ -102,35 +102,35 @@ long Audio_WAV_OpenWriter( WAV_Writer *writer, const char *fileName, int frameRa
} }
/* Write RIFF header. */ /* Write RIFF header. */
WriteChunkType( &addr, RIFF_ID ); WriteChunkType( &addr, RIFF_ID );
/* Write RIFF size as zero for now. Will patch later. */ /* Write RIFF size as zero for now. Will patch later. */
WriteLongLE( &addr, 0 ); WriteLongLE( &addr, 0 );
/* Write WAVE form ID. */ /* Write WAVE form ID. */
WriteChunkType( &addr, WAVE_ID ); WriteChunkType( &addr, WAVE_ID );
/* Write format chunk based on AudioSample structure. */ /* Write format chunk based on AudioSample structure. */
WriteChunkType( &addr, FMT_ID ); WriteChunkType( &addr, FMT_ID );
WriteLongLE( &addr, 16 ); WriteLongLE( &addr, 16 );
WriteShortLE( &addr, WAVE_FORMAT_PCM ); WriteShortLE( &addr, WAVE_FORMAT_PCM );
bytesPerSecond = frameRate * samplesPerFrame * sizeof( short); bytesPerSecond = frameRate * samplesPerFrame * sizeof( short);
WriteShortLE( &addr, (short) samplesPerFrame ); WriteShortLE( &addr, (short) samplesPerFrame );
WriteLongLE( &addr, frameRate ); WriteLongLE( &addr, frameRate );
WriteLongLE( &addr, bytesPerSecond ); WriteLongLE( &addr, bytesPerSecond );
WriteShortLE( &addr, (short) (samplesPerFrame * sizeof( short)) ); /* bytesPerBlock */ WriteShortLE( &addr, (short) (samplesPerFrame * sizeof( short)) ); /* bytesPerBlock */
WriteShortLE( &addr, (short) 16 ); /* bits per sample */ WriteShortLE( &addr, (short) 16 ); /* bits per sample */
/* Write ID and size for 'data' chunk. */ /* Write ID and size for 'data' chunk. */
WriteChunkType( &addr, DATA_ID ); WriteChunkType( &addr, DATA_ID );
/* Save offset so we can patch it later. */ /* Save offset so we can patch it later. */
writer->dataSizeOffset = (int) (addr - header); writer->dataSizeOffset = (int) (addr - header);
WriteLongLE( &addr, 0 ); WriteLongLE( &addr, 0 );
numWritten = fwrite( header, 1, sizeof(header), writer->fid ); numWritten = fwrite( header, 1, sizeof(header), writer->fid );
if( numWritten != sizeof(header) ) return -1; 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. * Returns bytes written or negative error code.
*/ */
long Audio_WAV_WriteShorts( WAV_Writer *writer, long Audio_WAV_WriteShorts( WAV_Writer *writer,
short *samples, short *samples,
int numSamples int numSamples
) )
{ {
unsigned char buffer[2]; unsigned char buffer[2];
unsigned char *bufferPtr; unsigned char *bufferPtr;
int i; int i;
short *p = samples; short *p = samples;
int numWritten; int numWritten;
int bytesWritten; int bytesWritten;
if( numSamples <= 0 ) if( numSamples <= 0 )
{ {
return -1; return -1;
} }
for( i=0; i<numSamples; i++ ) for( i=0; i<numSamples; i++ )
{ {
bufferPtr = buffer; bufferPtr = buffer;
WriteShortLE( &bufferPtr, *p++ ); WriteShortLE( &bufferPtr, *p++ );
numWritten = fwrite( buffer, 1, sizeof( buffer), writer->fid ); numWritten = fwrite( buffer, 1, sizeof( buffer), writer->fid );
if( numWritten != sizeof(buffer) ) return -1; if( numWritten != sizeof(buffer) ) return -1;
} }
bytesWritten = numSamples * sizeof(short); bytesWritten = numSamples * sizeof(short);
writer->dataSize += bytesWritten; 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 ) long Audio_WAV_CloseWriter( WAV_Writer *writer )
{ {
unsigned char buffer[4]; unsigned char buffer[4];
unsigned char *bufferPtr; unsigned char *bufferPtr;
int numWritten; int numWritten;
int riffSize; int riffSize;
@ -212,7 +212,7 @@ int main( void )
#define NUM_SAMPLES (200) #define NUM_SAMPLES (200)
short data[NUM_SAMPLES]; short data[NUM_SAMPLES];
short saw = 0; short saw = 0;
for( i=0; i<NUM_SAMPLES; i++ ) for( i=0; i<NUM_SAMPLES; i++ )
{ {
data[i] = saw; data[i] = saw;

View file

@ -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: * the PortAudio community also makes the following non-binding requests:
* *
* Any person wishing to distribute modifications to the Software is * Any person wishing to distribute modifications to the Software is
* requested to send the modifications to the original developer so that * requested to send the modifications to the original developer so that
* they can be incorporated into the canonical version. It is also * they can be incorporated into the canonical version. It is also
* requested that these non-binding requests be included along with the * requested that these non-binding requests be included along with the
* license above. * license above.
*/ */
#ifndef _WAV_WRITER_H #ifndef _WAV_WRITER_H
@ -65,7 +65,7 @@ extern "C" {
#define WAVE_FORMAT_PCM (1) #define WAVE_FORMAT_PCM (1)
#define WAVE_FORMAT_IMA_ADPCM (0x0011) #define WAVE_FORMAT_IMA_ADPCM (0x0011)
typedef struct WAV_Writer_s typedef struct WAV_Writer_s
{ {
FILE *fid; FILE *fid;
@ -86,9 +86,9 @@ long Audio_WAV_OpenWriter( WAV_Writer *writer, const char *fileName, int frameRa
* Returns bytes written or negative error code. * Returns bytes written or negative error code.
*/ */
long Audio_WAV_WriteShorts( WAV_Writer *writer, long Audio_WAV_WriteShorts( WAV_Writer *writer,
short *samples, short *samples,
int numSamples int numSamples
); );
/********************************************************************************* /*********************************************************************************
* Close WAV file. * Close WAV file.

View file

@ -107,8 +107,8 @@ static int gNumFailed = 0;
} \ } \
else { \ else { \
printf("ERROR - 0x%x - %s for %s\n", result, \ printf("ERROR - 0x%x - %s for %s\n", result, \
((result == 0) ? "-" : Pa_GetErrorText(result)), \ ((result == 0) ? "-" : Pa_GetErrorText(result)), \
#_exp ); \ #_exp ); \
gNumFailed++; \ gNumFailed++; \
goto error; \ goto error; \
} \ } \
@ -386,7 +386,7 @@ static int TestAdvance( int mode, PaDeviceIndex deviceID, double sampleRate,
} }
else else
{ {
ipp = NULL; ipp = NULL;
} }
if( mode == MODE_OUTPUT ) if( mode == MODE_OUTPUT )

View file

@ -1,8 +1,8 @@
/** @file paqa_errs.c /** @file paqa_errs.c
@ingroup qa_src @ingroup qa_src
@brief Self Testing Quality Assurance app for PortAudio @brief Self Testing Quality Assurance app for PortAudio
Do lots of bad things to test error reporting. Do lots of bad things to test error reporting.
@author Phil Burk http://www.softsynth.com @author Phil Burk http://www.softsynth.com
Pieter Suurmond adapted to V19 API. Pieter Suurmond adapted to V19 API.
*/ */
/* /*
@ -33,16 +33,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: * the PortAudio community also makes the following non-binding requests:
* *
* Any person wishing to distribute modifications to the Software is * Any person wishing to distribute modifications to the Software is
* requested to send the modifications to the original developer so that * requested to send the modifications to the original developer so that
* they can be incorporated into the canonical version. It is also * they can be incorporated into the canonical version. It is also
* requested that these non-binding requests be included along with the * requested that these non-binding requests be included along with the
* license above. * license above.
*/ */
#include <stdio.h> #include <stdio.h>
#include <math.h> #include <math.h>
@ -103,14 +103,14 @@ static int gNumFailed = 0;
static int QaCallback( const void* inputBuffer, static int QaCallback( const void* inputBuffer,
void* outputBuffer, void* outputBuffer,
unsigned long framesPerBuffer, unsigned long framesPerBuffer,
const PaStreamCallbackTimeInfo* timeInfo, const PaStreamCallbackTimeInfo* timeInfo,
PaStreamCallbackFlags statusFlags, PaStreamCallbackFlags statusFlags,
void* userData ) void* userData )
{ {
unsigned long i; unsigned long i;
unsigned char* out = (unsigned char *) outputBuffer; unsigned char* out = (unsigned char *) outputBuffer;
PaQaData* data = (PaQaData *) userData; PaQaData* data = (PaQaData *) userData;
(void)inputBuffer; /* Prevent "unused variable" warnings. */ (void)inputBuffer; /* Prevent "unused variable" warnings. */
/* Zero out buffer so we don't hear terrible noise. */ /* Zero out buffer so we don't hear terrible noise. */
@ -174,7 +174,7 @@ static int TestBadOpens( void )
PaStreamParameters ipp, opp; PaStreamParameters ipp, opp;
const PaDeviceInfo* info = NULL; const PaDeviceInfo* info = NULL;
/* Setup data for synthesis thread. */ /* Setup data for synthesis thread. */
myData.framesLeft = (unsigned long) (SAMPLE_RATE * 100); /* 100 seconds */ myData.framesLeft = (unsigned long) (SAMPLE_RATE * 100); /* 100 seconds */
myData.numChannels = 1; myData.numChannels = 1;
@ -222,7 +222,7 @@ static int TestBadOpens( void )
ipp.hostApiSpecificStreamInfo = opp.hostApiSpecificStreamInfo = NULL; ipp.hostApiSpecificStreamInfo = opp.hostApiSpecificStreamInfo = NULL;
ipp.sampleFormat = opp.sampleFormat = paFloat32; ipp.sampleFormat = opp.sampleFormat = paFloat32;
ipp.channelCount = 0; ipp.device = Pa_GetDefaultInputDevice(); 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, HOPEFOR(((result = Pa_OpenStream(&stream, &ipp, NULL,
SAMPLE_RATE, FRAMES_PER_BUFFER, SAMPLE_RATE, FRAMES_PER_BUFFER,
paClipOff, QaCallback, &myData )) == paInvalidChannelCount)); paClipOff, QaCallback, &myData )) == paInvalidChannelCount));
@ -274,7 +274,7 @@ static int TestBadOpens( void )
HOPEFOR(((result = Pa_OpenStream(&stream, NULL, &opp, HOPEFOR(((result = Pa_OpenStream(&stream, NULL, &opp,
1.0, FRAMES_PER_BUFFER, /* 1 cycle per second (1 Hz) is too low. */ 1.0, FRAMES_PER_BUFFER, /* 1 cycle per second (1 Hz) is too low. */
paClipOff, QaCallback, &myData )) == paInvalidSampleRate)); paClipOff, QaCallback, &myData )) == paInvalidSampleRate));
/*----------------------------- High sample rate: */ /*----------------------------- High sample rate: */
ipp.hostApiSpecificStreamInfo = opp.hostApiSpecificStreamInfo = NULL; ipp.hostApiSpecificStreamInfo = opp.hostApiSpecificStreamInfo = NULL;
ipp.sampleFormat = opp.sampleFormat = paFloat32; ipp.sampleFormat = opp.sampleFormat = paFloat32;
@ -286,7 +286,7 @@ static int TestBadOpens( void )
/*----------------------------- NULL callback: */ /*----------------------------- NULL callback: */
/* NULL callback is valid in V19 -- it means use blocking read/write stream /* NULL callback is valid in V19 -- it means use blocking read/write stream
ipp.hostApiSpecificStreamInfo = opp.hostApiSpecificStreamInfo = NULL; ipp.hostApiSpecificStreamInfo = opp.hostApiSpecificStreamInfo = NULL;
ipp.sampleFormat = opp.sampleFormat = paFloat32; ipp.sampleFormat = opp.sampleFormat = paFloat32;
ipp.channelCount = 0; ipp.device = paNoDevice; ipp.channelCount = 0; ipp.device = paNoDevice;
@ -366,7 +366,7 @@ static int TestBadActions( void )
SAMPLE_RATE, FRAMES_PER_BUFFER, SAMPLE_RATE, FRAMES_PER_BUFFER,
paClipOff, QaCallback, &myData )) == paNoError)); paClipOff, QaCallback, &myData )) == paNoError));
} }
HOPEFOR(((deviceInfo = Pa_GetDeviceInfo(paNoDevice)) == NULL)); HOPEFOR(((deviceInfo = Pa_GetDeviceInfo(paNoDevice)) == NULL));
HOPEFOR(((deviceInfo = Pa_GetDeviceInfo(87654)) == NULL)); HOPEFOR(((deviceInfo = Pa_GetDeviceInfo(87654)) == NULL));
HOPEFOR(((result = Pa_StartStream(NULL)) == paBadStreamPtr)); HOPEFOR(((result = Pa_StartStream(NULL)) == paBadStreamPtr));
@ -392,7 +392,7 @@ int main(void);
int main(void) int main(void)
{ {
PaError result; PaError result;
EXPECT(((result = Pa_Initialize()) == paNoError)); EXPECT(((result = Pa_Initialize()) == paNoError));
TestBadOpens(); TestBadOpens();
TestBadActions(); TestBadActions();

View file

@ -1,7 +1,7 @@
/** @file paqa_latency.c /** @file paqa_latency.c
@ingroup qa_src @ingroup qa_src
@brief Test latency estimates. @brief Test latency estimates.
@author Ross Bencina <rossb@audiomulch.com> @author Ross Bencina <rossb@audiomulch.com>
@author Phil Burk <philburk@softsynth.com> @author Phil Burk <philburk@softsynth.com>
*/ */
/* /*
@ -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: * the PortAudio community also makes the following non-binding requests:
* *
* Any person wishing to distribute modifications to the Software is * Any person wishing to distribute modifications to the Software is
* requested to send the modifications to the original developer so that * requested to send the modifications to the original developer so that
* they can be incorporated into the canonical version. It is also * they can be incorporated into the canonical version. It is also
* requested that these non-binding requests be included along with the * requested that these non-binding requests be included along with the
* license above. * license above.
*/ */
#include <stdio.h> #include <stdio.h>
@ -91,7 +91,7 @@ static int patestCallback( const void *inputBuffer, void *outputBuffer,
(void) timeInfo; /* Prevent unused variable warnings. */ (void) timeInfo; /* Prevent unused variable warnings. */
(void) statusFlags; (void) statusFlags;
(void) inputBuffer; (void) inputBuffer;
if( data->minFramesPerBuffer > framesPerBuffer ) if( data->minFramesPerBuffer > framesPerBuffer )
{ {
data->minFramesPerBuffer = framesPerBuffer; data->minFramesPerBuffer = framesPerBuffer;
@ -100,7 +100,7 @@ static int patestCallback( const void *inputBuffer, void *outputBuffer,
{ {
data->maxFramesPerBuffer = framesPerBuffer; data->maxFramesPerBuffer = framesPerBuffer;
} }
/* Measure min and max output time stamp delta. */ /* Measure min and max output time stamp delta. */
if( data->callbackCount > 0 ) if( data->callbackCount > 0 )
{ {
@ -115,7 +115,7 @@ static int patestCallback( const void *inputBuffer, void *outputBuffer,
} }
} }
data->previousTimeInfo = *timeInfo; data->previousTimeInfo = *timeInfo;
for( i=0; i<framesPerBuffer; i++ ) for( i=0; i<framesPerBuffer; i++ )
{ {
*out++ = data->sine[data->left_phase]; /* left */ *out++ = data->sine[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. */ data->right_phase += 3; /* higher pitch so we can distinguish left and right. */
if( data->right_phase >= TABLE_SIZE ) data->right_phase -= TABLE_SIZE; if( data->right_phase >= TABLE_SIZE ) data->right_phase -= TABLE_SIZE;
} }
data->callbackCount += 1; data->callbackCount += 1;
return paContinue; return paContinue;
} }
PaError paqaCheckLatency( PaStreamParameters *outputParamsPtr, PaError paqaCheckLatency( PaStreamParameters *outputParamsPtr,
paTestData *dataPtr, double sampleRate, unsigned long framesPerBuffer ) paTestData *dataPtr, double sampleRate, unsigned long framesPerBuffer )
{ {
PaError err; PaError err;
@ -142,7 +142,7 @@ PaError paqaCheckLatency( PaStreamParameters *outputParamsPtr,
dataPtr->minDeltaDacTime = 9999999.0; dataPtr->minDeltaDacTime = 9999999.0;
dataPtr->maxDeltaDacTime = 0.0; dataPtr->maxDeltaDacTime = 0.0;
dataPtr->callbackCount = 0; dataPtr->callbackCount = 0;
printf("Stream parameter: suggestedOutputLatency = %g\n", outputParamsPtr->suggestedLatency ); printf("Stream parameter: suggestedOutputLatency = %g\n", outputParamsPtr->suggestedLatency );
if( framesPerBuffer == paFramesPerBufferUnspecified ){ if( framesPerBuffer == paFramesPerBufferUnspecified ){
printf("Stream parameter: user framesPerBuffer = paFramesPerBufferUnspecified\n" ); printf("Stream parameter: user framesPerBuffer = paFramesPerBufferUnspecified\n" );
@ -159,7 +159,7 @@ PaError paqaCheckLatency( PaStreamParameters *outputParamsPtr,
patestCallback, patestCallback,
dataPtr ); dataPtr );
if( err != paNoError ) goto error1; if( err != paNoError ) goto error1;
streamInfo = Pa_GetStreamInfo( stream ); streamInfo = Pa_GetStreamInfo( stream );
printf("Stream info: inputLatency = %g\n", streamInfo->inputLatency ); printf("Stream info: inputLatency = %g\n", streamInfo->inputLatency );
printf("Stream info: outputLatency = %g\n", streamInfo->outputLatency ); printf("Stream info: outputLatency = %g\n", streamInfo->outputLatency );
@ -169,7 +169,7 @@ PaError paqaCheckLatency( PaStreamParameters *outputParamsPtr,
printf("Play for %d seconds.\n", NUM_SECONDS ); printf("Play for %d seconds.\n", NUM_SECONDS );
Pa_Sleep( NUM_SECONDS * 1000 ); Pa_Sleep( NUM_SECONDS * 1000 );
printf(" minFramesPerBuffer = %4d\n", dataPtr->minFramesPerBuffer ); printf(" minFramesPerBuffer = %4d\n", dataPtr->minFramesPerBuffer );
printf(" maxFramesPerBuffer = %4d\n", dataPtr->maxFramesPerBuffer ); printf(" maxFramesPerBuffer = %4d\n", dataPtr->maxFramesPerBuffer );
printf(" minDeltaDacTime = %f\n", dataPtr->minDeltaDacTime ); printf(" minDeltaDacTime = %f\n", dataPtr->minDeltaDacTime );
@ -181,7 +181,7 @@ PaError paqaCheckLatency( PaStreamParameters *outputParamsPtr,
err = Pa_CloseStream( stream ); err = Pa_CloseStream( stream );
Pa_Sleep( 1 * 1000 ); Pa_Sleep( 1 * 1000 );
printf("-------------------------------------\n"); printf("-------------------------------------\n");
return err; return err;
error2: error2:
@ -245,26 +245,26 @@ static int paqaCheckMultipleSuggested( PaDeviceIndex deviceIndex, int isInput )
streamParameters.hostApiSpecificStreamInfo = NULL; streamParameters.hostApiSpecificStreamInfo = NULL;
streamParameters.sampleFormat = paFloat32; streamParameters.sampleFormat = paFloat32;
sampleRate = pdi->defaultSampleRate; sampleRate = pdi->defaultSampleRate;
printf(" lowLatency = %g\n", lowLatency ); printf(" lowLatency = %g\n", lowLatency );
printf(" highLatency = %g\n", highLatency ); printf(" highLatency = %g\n", highLatency );
printf(" numChannels = %d\n", numChannels ); printf(" numChannels = %d\n", numChannels );
printf(" sampleRate = %g\n", sampleRate ); printf(" sampleRate = %g\n", sampleRate );
if( (highLatency - lowLatency) < 0.001 ) if( (highLatency - lowLatency) < 0.001 )
{ {
numLoops = 1; numLoops = 1;
} }
for( i=0; i<numLoops; i++ ) for( i=0; i<numLoops; i++ )
{ {
if( numLoops == 1 ) if( numLoops == 1 )
streamParameters.suggestedLatency = lowLatency; streamParameters.suggestedLatency = lowLatency;
else else
streamParameters.suggestedLatency = lowLatency + ((highLatency - lowLatency) * i /(numLoops - 1)); streamParameters.suggestedLatency = lowLatency + ((highLatency - lowLatency) * i /(numLoops - 1));
printf(" suggestedLatency[%d] = %6.4f\n", i, streamParameters.suggestedLatency ); printf(" suggestedLatency[%d] = %6.4f\n", i, streamParameters.suggestedLatency );
err = Pa_OpenStream( err = Pa_OpenStream(
&stream, &stream,
(isInput ? &streamParameters : NULL), (isInput ? &streamParameters : NULL),
@ -275,11 +275,11 @@ static int paqaCheckMultipleSuggested( PaDeviceIndex deviceIndex, int isInput )
paqaNoopCallback, paqaNoopCallback,
NULL ); NULL );
if( err != paNoError ) goto error; if( err != paNoError ) goto error;
streamInfo = Pa_GetStreamInfo( stream ); streamInfo = Pa_GetStreamInfo( stream );
err = Pa_CloseStream( stream ); err = Pa_CloseStream( stream );
if( isInput ) if( isInput )
{ {
finalLatency = streamInfo->inputLatency; finalLatency = streamInfo->inputLatency;
@ -317,7 +317,7 @@ static int paqaVerifySuggestedLatency( void )
int result = 0; int result = 0;
const PaDeviceInfo *pdi; const PaDeviceInfo *pdi;
int numDevices = Pa_GetDeviceCount(); int numDevices = Pa_GetDeviceCount();
printf("\n ------------------------ paqaVerifySuggestedLatency\n"); printf("\n ------------------------ paqaVerifySuggestedLatency\n");
for( id=0; id<numDevices; id++ ) /* Iterate through all devices. */ for( id=0; id<numDevices; id++ ) /* Iterate through all devices. */
{ {
@ -349,7 +349,7 @@ static int paqaVerifyDeviceInfoLatency( void )
PaDeviceIndex id; PaDeviceIndex id;
const PaDeviceInfo *pdi; const PaDeviceInfo *pdi;
int numDevices = Pa_GetDeviceCount(); int numDevices = Pa_GetDeviceCount();
printf("\n ------------------------ paqaVerifyDeviceInfoLatency\n"); printf("\n ------------------------ paqaVerifyDeviceInfoLatency\n");
for( id=0; id<numDevices; id++ ) /* Iterate through all devices. */ for( id=0; id<numDevices; id++ ) /* Iterate through all devices. */
{ {
@ -390,7 +390,7 @@ int main(void)
int i; int i;
int framesPerBuffer; int framesPerBuffer;
double sampleRate = SAMPLE_RATE; double sampleRate = SAMPLE_RATE;
printf("\nPortAudio QA: investigate output latency.\n"); printf("\nPortAudio QA: investigate output latency.\n");
/* initialise sinusoidal wavetable */ /* initialise sinusoidal wavetable */
@ -399,19 +399,19 @@ int main(void)
data.sine[i] = (float) sin( ((double)i/(double)TABLE_SIZE) * M_PI * 2. ); data.sine[i] = (float) sin( ((double)i/(double)TABLE_SIZE) * M_PI * 2. );
} }
data.left_phase = data.right_phase = 0; data.left_phase = data.right_phase = 0;
err = Pa_Initialize(); err = Pa_Initialize();
if( err != paNoError ) goto error; if( err != paNoError ) goto error;
/* Run self tests. */ /* Run self tests. */
if( paqaVerifyDeviceInfoLatency() < 0 ) goto error; if( paqaVerifyDeviceInfoLatency() < 0 ) goto error;
if( paqaVerifySuggestedLatency() < 0 ) goto error; if( paqaVerifySuggestedLatency() < 0 ) goto error;
outputParameters.device = Pa_GetDefaultOutputDevice(); /* default output device */ outputParameters.device = Pa_GetDefaultOutputDevice(); /* default output device */
if (outputParameters.device == paNoDevice) { if (outputParameters.device == paNoDevice) {
fprintf(stderr,"Error: No default output device.\n"); fprintf(stderr,"Error: No default output device.\n");
goto error; goto error;
} }
printf("\n\nNow running Audio Output Tests...\n"); printf("\n\nNow running Audio Output Tests...\n");
@ -435,44 +435,44 @@ int main(void)
outputParameters.suggestedLatency = deviceInfo->defaultLowOutputLatency; outputParameters.suggestedLatency = deviceInfo->defaultLowOutputLatency;
err = paqaCheckLatency( &outputParameters, &data, sampleRate, framesPerBuffer ); err = paqaCheckLatency( &outputParameters, &data, sampleRate, framesPerBuffer );
if( err != paNoError ) goto error; if( err != paNoError ) goto error;
printf("------------- 64 frame buffer with 1.1 * defaultLow latency.\n"); printf("------------- 64 frame buffer with 1.1 * defaultLow latency.\n");
framesPerBuffer = 64; framesPerBuffer = 64;
outputParameters.suggestedLatency = deviceInfo->defaultLowOutputLatency * 1.1; outputParameters.suggestedLatency = deviceInfo->defaultLowOutputLatency * 1.1;
err = paqaCheckLatency( &outputParameters, &data, sampleRate, framesPerBuffer ); err = paqaCheckLatency( &outputParameters, &data, sampleRate, framesPerBuffer );
if( err != paNoError ) goto error; if( err != paNoError ) goto error;
// Try to create a huge buffer that is bigger than the allowed device maximum. // Try to create a huge buffer that is bigger than the allowed device maximum.
printf("------------- Try a huge buffer.\n"); printf("------------- Try a huge buffer.\n");
framesPerBuffer = 16*1024; framesPerBuffer = 16*1024;
outputParameters.suggestedLatency = ((double)framesPerBuffer) / sampleRate; // approximate outputParameters.suggestedLatency = ((double)framesPerBuffer) / sampleRate; // approximate
err = paqaCheckLatency( &outputParameters, &data, sampleRate, framesPerBuffer ); err = paqaCheckLatency( &outputParameters, &data, sampleRate, framesPerBuffer );
if( err != paNoError ) goto error; if( err != paNoError ) goto error;
printf("------------- Try suggestedLatency = 0.0\n"); printf("------------- Try suggestedLatency = 0.0\n");
outputParameters.suggestedLatency = 0.0; outputParameters.suggestedLatency = 0.0;
err = paqaCheckLatency( &outputParameters, &data, sampleRate, paFramesPerBufferUnspecified ); err = paqaCheckLatency( &outputParameters, &data, sampleRate, paFramesPerBufferUnspecified );
if( err != paNoError ) goto error; if( err != paNoError ) goto error;
printf("------------- Try suggestedLatency = defaultLowOutputLatency\n"); printf("------------- Try suggestedLatency = defaultLowOutputLatency\n");
outputParameters.suggestedLatency = deviceInfo->defaultLowOutputLatency; outputParameters.suggestedLatency = deviceInfo->defaultLowOutputLatency;
err = paqaCheckLatency( &outputParameters, &data, sampleRate, paFramesPerBufferUnspecified ); err = paqaCheckLatency( &outputParameters, &data, sampleRate, paFramesPerBufferUnspecified );
if( err != paNoError ) goto error; if( err != paNoError ) goto error;
printf("------------- Try suggestedLatency = defaultHighOutputLatency\n"); printf("------------- Try suggestedLatency = defaultHighOutputLatency\n");
outputParameters.suggestedLatency = deviceInfo->defaultHighOutputLatency; outputParameters.suggestedLatency = deviceInfo->defaultHighOutputLatency;
err = paqaCheckLatency( &outputParameters, &data, sampleRate, paFramesPerBufferUnspecified ); err = paqaCheckLatency( &outputParameters, &data, sampleRate, paFramesPerBufferUnspecified );
if( err != paNoError ) goto error; if( err != paNoError ) goto error;
printf("------------- Try suggestedLatency = defaultHighOutputLatency * 4\n"); printf("------------- Try suggestedLatency = defaultHighOutputLatency * 4\n");
outputParameters.suggestedLatency = deviceInfo->defaultHighOutputLatency * 4; outputParameters.suggestedLatency = deviceInfo->defaultHighOutputLatency * 4;
err = paqaCheckLatency( &outputParameters, &data, sampleRate, paFramesPerBufferUnspecified ); err = paqaCheckLatency( &outputParameters, &data, sampleRate, paFramesPerBufferUnspecified );
if( err != paNoError ) goto error; if( err != paNoError ) goto error;
Pa_Terminate(); Pa_Terminate();
printf("SUCCESS - test finished.\n"); printf("SUCCESS - test finished.\n");
return err; return err;
error: error:
Pa_Terminate(); Pa_Terminate();
fprintf( stderr, "ERROR - test failed.\n" ); fprintf( stderr, "ERROR - test failed.\n" );