annotate src/portaudio_20140130/test/patest_sine_formats.c @ 83:ae30d91d2ffe

Replace these with versions built using an older toolset (so as to avoid ABI compatibilities when linking on Ubuntu 14.04 for packaging purposes)
author Chris Cannam
date Fri, 07 Feb 2020 11:51:13 +0000
parents 7ddb4fc30dac
children
rev   line source
Chris@39 1 /** @file patest_sine_formats.c
Chris@39 2 @ingroup test_src
Chris@39 3 @brief Play a sine wave for several seconds. Test various data formats.
Chris@39 4 @author Phil Burk
Chris@39 5 */
Chris@39 6 /*
Chris@39 7 * $Id: patest_sine_formats.c 1097 2006-08-26 08:27:53Z rossb $
Chris@39 8 *
Chris@39 9 * This program uses the PortAudio Portable Audio Library.
Chris@39 10 * For more information see: http://www.portaudio.com
Chris@39 11 * Copyright (c) 1999-2000 Ross Bencina and Phil Burk
Chris@39 12 *
Chris@39 13 * Permission is hereby granted, free of charge, to any person obtaining
Chris@39 14 * a copy of this software and associated documentation files
Chris@39 15 * (the "Software"), to deal in the Software without restriction,
Chris@39 16 * including without limitation the rights to use, copy, modify, merge,
Chris@39 17 * publish, distribute, sublicense, and/or sell copies of the Software,
Chris@39 18 * and to permit persons to whom the Software is furnished to do so,
Chris@39 19 * subject to the following conditions:
Chris@39 20 *
Chris@39 21 * The above copyright notice and this permission notice shall be
Chris@39 22 * included in all copies or substantial portions of the Software.
Chris@39 23 *
Chris@39 24 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
Chris@39 25 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
Chris@39 26 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
Chris@39 27 * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR
Chris@39 28 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
Chris@39 29 * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
Chris@39 30 * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Chris@39 31 */
Chris@39 32
Chris@39 33 /*
Chris@39 34 * The text above constitutes the entire PortAudio license; however,
Chris@39 35 * the PortAudio community also makes the following non-binding requests:
Chris@39 36 *
Chris@39 37 * Any person wishing to distribute modifications to the Software is
Chris@39 38 * requested to send the modifications to the original developer so that
Chris@39 39 * they can be incorporated into the canonical version. It is also
Chris@39 40 * requested that these non-binding requests be included along with the
Chris@39 41 * license above.
Chris@39 42 */
Chris@39 43 #include <stdio.h>
Chris@39 44 #include <math.h>
Chris@39 45 #include "portaudio.h"
Chris@39 46
Chris@39 47 #define NUM_SECONDS (10)
Chris@39 48 #define SAMPLE_RATE (44100)
Chris@39 49 #define FRAMES_PER_BUFFER (512)
Chris@39 50 #define LEFT_FREQ (SAMPLE_RATE/256.0) /* So we hit 1.0 */
Chris@39 51 #define RIGHT_FREQ (500.0)
Chris@39 52 #define AMPLITUDE (1.0)
Chris@39 53
Chris@39 54 /* Select ONE format for testing. */
Chris@39 55 #define TEST_UINT8 (0)
Chris@39 56 #define TEST_INT8 (0)
Chris@39 57 #define TEST_INT16 (1)
Chris@39 58 #define TEST_FLOAT32 (0)
Chris@39 59
Chris@39 60 #if TEST_UINT8
Chris@39 61 #define TEST_FORMAT paUInt8
Chris@39 62 typedef unsigned char SAMPLE_t;
Chris@39 63 #define SAMPLE_ZERO (0x80)
Chris@39 64 #define DOUBLE_TO_SAMPLE(x) (SAMPLE_ZERO + (SAMPLE_t)(127.0 * (x)))
Chris@39 65 #define FORMAT_NAME "Unsigned 8 Bit"
Chris@39 66
Chris@39 67 #elif TEST_INT8
Chris@39 68 #define TEST_FORMAT paInt8
Chris@39 69 typedef char SAMPLE_t;
Chris@39 70 #define SAMPLE_ZERO (0)
Chris@39 71 #define DOUBLE_TO_SAMPLE(x) (SAMPLE_ZERO + (SAMPLE_t)(127.0 * (x)))
Chris@39 72 #define FORMAT_NAME "Signed 8 Bit"
Chris@39 73
Chris@39 74 #elif TEST_INT16
Chris@39 75 #define TEST_FORMAT paInt16
Chris@39 76 typedef short SAMPLE_t;
Chris@39 77 #define SAMPLE_ZERO (0)
Chris@39 78 #define DOUBLE_TO_SAMPLE(x) (SAMPLE_ZERO + (SAMPLE_t)(32767 * (x)))
Chris@39 79 #define FORMAT_NAME "Signed 16 Bit"
Chris@39 80
Chris@39 81 #elif TEST_FLOAT32
Chris@39 82 #define TEST_FORMAT paFloat32
Chris@39 83 typedef float SAMPLE_t;
Chris@39 84 #define SAMPLE_ZERO (0.0)
Chris@39 85 #define DOUBLE_TO_SAMPLE(x) ((SAMPLE_t)(x))
Chris@39 86 #define FORMAT_NAME "Float 32 Bit"
Chris@39 87 #endif
Chris@39 88
Chris@39 89 #ifndef M_PI
Chris@39 90 #define M_PI (3.14159265)
Chris@39 91 #endif
Chris@39 92
Chris@39 93
Chris@39 94 typedef struct
Chris@39 95 {
Chris@39 96 double left_phase;
Chris@39 97 double right_phase;
Chris@39 98 unsigned int framesToGo;
Chris@39 99 }
Chris@39 100 paTestData;
Chris@39 101 /* This routine will be called by the PortAudio engine when audio is needed.
Chris@39 102 ** It may called at interrupt level on some machines so don't do anything
Chris@39 103 ** that could mess up the system like calling malloc() or free().
Chris@39 104 */
Chris@39 105 static int patestCallback( const void *inputBuffer,
Chris@39 106 void *outputBuffer,
Chris@39 107 unsigned long framesPerBuffer,
Chris@39 108 const PaStreamCallbackTimeInfo* timeInfo,
Chris@39 109 PaStreamCallbackFlags statusFlags,
Chris@39 110 void *userData )
Chris@39 111 {
Chris@39 112 paTestData *data = (paTestData*)userData;
Chris@39 113 SAMPLE_t *out = (SAMPLE_t *)outputBuffer;
Chris@39 114 int i;
Chris@39 115 int framesToCalc;
Chris@39 116 int finished = 0;
Chris@39 117 (void) inputBuffer; /* Prevent unused variable warnings. */
Chris@39 118
Chris@39 119 if( data->framesToGo < framesPerBuffer )
Chris@39 120 {
Chris@39 121 framesToCalc = data->framesToGo;
Chris@39 122 data->framesToGo = 0;
Chris@39 123 finished = 1;
Chris@39 124 }
Chris@39 125 else
Chris@39 126 {
Chris@39 127 framesToCalc = framesPerBuffer;
Chris@39 128 data->framesToGo -= framesPerBuffer;
Chris@39 129 }
Chris@39 130
Chris@39 131 for( i=0; i<framesToCalc; i++ )
Chris@39 132 {
Chris@39 133 data->left_phase += (LEFT_FREQ / SAMPLE_RATE);
Chris@39 134 if( data->left_phase > 1.0) data->left_phase -= 1.0;
Chris@39 135 *out++ = DOUBLE_TO_SAMPLE( AMPLITUDE * sin( (data->left_phase * M_PI * 2. )));
Chris@39 136
Chris@39 137 data->right_phase += (RIGHT_FREQ / SAMPLE_RATE);
Chris@39 138 if( data->right_phase > 1.0) data->right_phase -= 1.0;
Chris@39 139 *out++ = DOUBLE_TO_SAMPLE( AMPLITUDE * sin( (data->right_phase * M_PI * 2. )));
Chris@39 140 }
Chris@39 141 /* zero remainder of final buffer */
Chris@39 142 for( ; i<(int)framesPerBuffer; i++ )
Chris@39 143 {
Chris@39 144 *out++ = SAMPLE_ZERO; /* left */
Chris@39 145 *out++ = SAMPLE_ZERO; /* right */
Chris@39 146 }
Chris@39 147 return finished;
Chris@39 148 }
Chris@39 149 /*******************************************************************/
Chris@39 150 int main(void);
Chris@39 151 int main(void)
Chris@39 152 {
Chris@39 153 PaStream *stream;
Chris@39 154 PaStreamParameters outputParameters;
Chris@39 155 PaError err;
Chris@39 156 paTestData data;
Chris@39 157 int totalSamps;
Chris@39 158
Chris@39 159 printf("PortAudio Test: output " FORMAT_NAME "\n");
Chris@39 160
Chris@39 161 data.left_phase = data.right_phase = 0.0;
Chris@39 162 data.framesToGo = totalSamps = NUM_SECONDS * SAMPLE_RATE; /* Play for a few seconds. */
Chris@39 163 err = Pa_Initialize();
Chris@39 164 if( err != paNoError ) goto error;
Chris@39 165
Chris@39 166
Chris@39 167 outputParameters.device = Pa_GetDefaultOutputDevice(); /* Default output device. */
Chris@39 168 outputParameters.channelCount = 2; /* Stereo output */
Chris@39 169 outputParameters.sampleFormat = TEST_FORMAT; /* Selected above. */
Chris@39 170 outputParameters.suggestedLatency = Pa_GetDeviceInfo(outputParameters.device)->defaultLowOutputLatency;
Chris@39 171 outputParameters.hostApiSpecificStreamInfo = NULL;
Chris@39 172 err = Pa_OpenStream( &stream,
Chris@39 173 NULL, /* No input. */
Chris@39 174 &outputParameters, /* As above. */
Chris@39 175 SAMPLE_RATE,
Chris@39 176 FRAMES_PER_BUFFER,
Chris@39 177 paClipOff, /* we won't output out of range samples so don't bother clipping them */
Chris@39 178 patestCallback,
Chris@39 179 &data );
Chris@39 180 if( err != paNoError ) goto error;
Chris@39 181
Chris@39 182 err = Pa_StartStream( stream );
Chris@39 183 if( err != paNoError ) goto error;
Chris@39 184
Chris@39 185 printf("Waiting %d seconds for sound to finish.\n", NUM_SECONDS );
Chris@39 186
Chris@39 187 while( ( err = Pa_IsStreamActive( stream ) ) == 1 ) Pa_Sleep(100);
Chris@39 188 if( err < 0 ) goto error;
Chris@39 189
Chris@39 190 err = Pa_CloseStream( stream );
Chris@39 191 if( err != paNoError ) goto error;
Chris@39 192 Pa_Terminate();
Chris@39 193
Chris@39 194 printf("PortAudio Test Finished: " FORMAT_NAME "\n");
Chris@39 195
Chris@39 196 return err;
Chris@39 197 error:
Chris@39 198 Pa_Terminate();
Chris@39 199 fprintf( stderr, "An error occured while using the portaudio stream\n" );
Chris@39 200 fprintf( stderr, "Error number: %d\n", err );
Chris@39 201 fprintf( stderr, "Error message: %s\n", Pa_GetErrorText( err ) );
Chris@39 202 return err;
Chris@39 203 }