annotate src/portaudio_20161030_catalina_patch/test/patest_multi_sine.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 4edcd14160a5
children
rev   line source
Chris@4 1 /** @file patest_multi_sine.c
Chris@4 2 @ingroup test_src
Chris@4 3 @brief Play a different sine wave on each channel.
Chris@4 4 @author Phil Burk http://www.softsynth.com
Chris@4 5 */
Chris@4 6 /*
Chris@55 7 * $Id$
Chris@4 8 *
Chris@4 9 * This program uses the PortAudio Portable Audio Library.
Chris@4 10 * For more information see: http://www.portaudio.com
Chris@4 11 * Copyright (c) 1999-2000 Ross Bencina and Phil Burk
Chris@4 12 *
Chris@4 13 * Permission is hereby granted, free of charge, to any person obtaining
Chris@4 14 * a copy of this software and associated documentation files
Chris@4 15 * (the "Software"), to deal in the Software without restriction,
Chris@4 16 * including without limitation the rights to use, copy, modify, merge,
Chris@4 17 * publish, distribute, sublicense, and/or sell copies of the Software,
Chris@4 18 * and to permit persons to whom the Software is furnished to do so,
Chris@4 19 * subject to the following conditions:
Chris@4 20 *
Chris@4 21 * The above copyright notice and this permission notice shall be
Chris@4 22 * included in all copies or substantial portions of the Software.
Chris@4 23 *
Chris@4 24 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
Chris@4 25 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
Chris@4 26 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
Chris@4 27 * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR
Chris@4 28 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
Chris@4 29 * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
Chris@4 30 * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Chris@4 31 */
Chris@4 32
Chris@4 33 /*
Chris@4 34 * The text above constitutes the entire PortAudio license; however,
Chris@4 35 * the PortAudio community also makes the following non-binding requests:
Chris@4 36 *
Chris@4 37 * Any person wishing to distribute modifications to the Software is
Chris@4 38 * requested to send the modifications to the original developer so that
Chris@4 39 * they can be incorporated into the canonical version. It is also
Chris@4 40 * requested that these non-binding requests be included along with the
Chris@4 41 * license above.
Chris@4 42 */
Chris@4 43
Chris@4 44 #include <stdio.h>
Chris@4 45 #include <math.h>
Chris@4 46
Chris@4 47 #include "portaudio.h"
Chris@4 48
Chris@4 49 #define SAMPLE_RATE (44100)
Chris@55 50 #define FRAMES_PER_BUFFER (128)
Chris@4 51 #define FREQ_INCR (300.0 / SAMPLE_RATE)
Chris@4 52 #define MAX_CHANNELS (64)
Chris@4 53
Chris@4 54 #ifndef M_PI
Chris@4 55 #define M_PI (3.14159265)
Chris@4 56 #endif
Chris@4 57
Chris@4 58 typedef struct
Chris@4 59 {
Chris@4 60 short interleaved; /* Nonzero for interleaved / zero for non-interleaved. */
Chris@4 61 int numChannels; /* Actually used. */
Chris@4 62 double phases[MAX_CHANNELS]; /* Each channel gets its' own frequency. */
Chris@4 63 }
Chris@4 64 paTestData;
Chris@4 65
Chris@4 66 /* This routine will be called by the PortAudio engine when audio is needed.
Chris@4 67 ** It may called at interrupt level on some machines so don't do anything
Chris@4 68 ** that could mess up the system like calling malloc() or free().
Chris@4 69 */
Chris@4 70 static int patestCallback(const void* inputBuffer,
Chris@4 71 void* outputBuffer,
Chris@4 72 unsigned long framesPerBuffer,
Chris@4 73 const PaStreamCallbackTimeInfo* timeInfo,
Chris@4 74 PaStreamCallbackFlags statusFlags,
Chris@4 75 void* userData)
Chris@4 76 {
Chris@4 77 int frameIndex, channelIndex;
Chris@4 78 float** outputs = (float**)outputBuffer;
Chris@4 79 paTestData* data = (paTestData*)userData;
Chris@4 80
Chris@4 81 (void) inputBuffer; /* Prevent unused arg warning. */
Chris@4 82 if (data->interleaved)
Chris@4 83 {
Chris@4 84 float *out = (float*)outputBuffer; /* interleaved version */
Chris@4 85 for( frameIndex=0; frameIndex<(int)framesPerBuffer; frameIndex++ )
Chris@4 86 {
Chris@4 87 for( channelIndex=0; channelIndex<data->numChannels; channelIndex++ )
Chris@4 88 {
Chris@4 89 /* Output sine wave on every channel. */
Chris@4 90 *out++ = (float) sin(data->phases[channelIndex]);
Chris@4 91
Chris@4 92 /* Play each channel at a higher frequency. */
Chris@4 93 data->phases[channelIndex] += FREQ_INCR * (4 + channelIndex);
Chris@4 94 if( data->phases[channelIndex] >= (2.0 * M_PI) ) data->phases[channelIndex] -= (2.0 * M_PI);
Chris@4 95 }
Chris@4 96 }
Chris@4 97 }
Chris@4 98 else
Chris@4 99 {
Chris@4 100 for( frameIndex=0; frameIndex<(int)framesPerBuffer; frameIndex++ )
Chris@4 101 {
Chris@4 102 for( channelIndex=0; channelIndex<data->numChannels; channelIndex++ )
Chris@4 103 {
Chris@4 104 /* Output sine wave on every channel. */
Chris@4 105 outputs[channelIndex][frameIndex] = (float) sin(data->phases[channelIndex]);
Chris@4 106
Chris@4 107 /* Play each channel at a higher frequency. */
Chris@4 108 data->phases[channelIndex] += FREQ_INCR * (4 + channelIndex);
Chris@4 109 if( data->phases[channelIndex] >= (2.0 * M_PI) ) data->phases[channelIndex] -= (2.0 * M_PI);
Chris@4 110 }
Chris@4 111 }
Chris@4 112 }
Chris@4 113 return 0;
Chris@4 114 }
Chris@4 115
Chris@4 116 /*******************************************************************/
Chris@4 117 int test(short interleaved)
Chris@4 118 {
Chris@4 119 PaStream* stream;
Chris@4 120 PaStreamParameters outputParameters;
Chris@4 121 PaError err;
Chris@4 122 const PaDeviceInfo* pdi;
Chris@4 123 paTestData data;
Chris@4 124 short n;
Chris@4 125
Chris@4 126 outputParameters.device = Pa_GetDefaultOutputDevice(); /* Default output device, max channels. */
Chris@4 127 if (outputParameters.device == paNoDevice) {
Chris@4 128 fprintf(stderr,"Error: No default output device.\n");
Chris@4 129 return paInvalidDevice;
Chris@4 130 }
Chris@4 131 pdi = Pa_GetDeviceInfo(outputParameters.device);
Chris@4 132 outputParameters.channelCount = pdi->maxOutputChannels;
Chris@4 133 if (outputParameters.channelCount > MAX_CHANNELS)
Chris@4 134 outputParameters.channelCount = MAX_CHANNELS;
Chris@4 135 outputParameters.sampleFormat = paFloat32; /* 32 bit floating point output */
Chris@4 136 outputParameters.suggestedLatency = pdi->defaultLowOutputLatency;
Chris@4 137 outputParameters.hostApiSpecificStreamInfo = NULL;
Chris@4 138
Chris@4 139 data.interleaved = interleaved;
Chris@4 140 data.numChannels = outputParameters.channelCount;
Chris@4 141 for (n = 0; n < data.numChannels; n++)
Chris@4 142 data.phases[n] = 0.0; /* Phases wrap and maybe don't need initialisation. */
Chris@4 143 printf("%d ", data.numChannels);
Chris@4 144 if (interleaved)
Chris@4 145 printf("interleaved ");
Chris@4 146 else
Chris@4 147 {
Chris@4 148 printf(" non-interleaved ");
Chris@4 149 outputParameters.sampleFormat |= paNonInterleaved;
Chris@4 150 }
Chris@4 151 printf("channels.\n");
Chris@4 152
Chris@4 153 err = Pa_OpenStream(&stream,
Chris@4 154 NULL, /* No input. */
Chris@4 155 &outputParameters,
Chris@4 156 SAMPLE_RATE, /* Sample rate. */
Chris@4 157 FRAMES_PER_BUFFER, /* Frames per buffer. */
Chris@4 158 paClipOff, /* Samples never out of range, no clipping. */
Chris@4 159 patestCallback,
Chris@4 160 &data);
Chris@4 161 if (err == paNoError)
Chris@4 162 {
Chris@4 163 err = Pa_StartStream(stream);
Chris@4 164 if (err == paNoError)
Chris@4 165 {
Chris@4 166 printf("Hit ENTER to stop this test.\n");
Chris@4 167 getchar();
Chris@4 168 err = Pa_StopStream(stream);
Chris@4 169 }
Chris@4 170 Pa_CloseStream( stream );
Chris@4 171 }
Chris@4 172 return err;
Chris@4 173 }
Chris@4 174
Chris@4 175
Chris@4 176 /*******************************************************************/
Chris@4 177 int main(void)
Chris@4 178 {
Chris@4 179 PaError err;
Chris@4 180
Chris@4 181 printf("PortAudio Test: output sine wave on each channel.\n" );
Chris@4 182
Chris@4 183 err = Pa_Initialize();
Chris@4 184 if (err != paNoError)
Chris@4 185 goto done;
Chris@4 186
Chris@4 187 err = test(1); /* 1 means interleaved. */
Chris@4 188 if (err != paNoError)
Chris@4 189 goto done;
Chris@4 190
Chris@4 191 err = test(0); /* 0 means not interleaved. */
Chris@4 192 if (err != paNoError)
Chris@4 193 goto done;
Chris@4 194
Chris@4 195 printf("Test finished.\n");
Chris@4 196 done:
Chris@4 197 if (err)
Chris@4 198 {
Chris@4 199 fprintf(stderr, "An error occured while using the portaudio stream\n");
Chris@4 200 fprintf(stderr, "Error number: %d\n", err );
Chris@4 201 fprintf(stderr, "Error message: %s\n", Pa_GetErrorText(err));
Chris@4 202 }
Chris@4 203 Pa_Terminate();
Chris@4 204 return 0;
Chris@4 205 }