annotate src/portaudio_20140130/examples/paex_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 7ddb4fc30dac
children
rev   line source
Chris@39 1 /** @file paex_sine.c
Chris@39 2 @ingroup examples_src
Chris@39 3 @brief Play a sine wave for several seconds.
Chris@39 4 @author Ross Bencina <rossb@audiomulch.com>
Chris@39 5 @author Phil Burk <philburk@softsynth.com>
Chris@39 6 */
Chris@39 7 /*
Chris@39 8 * $Id: paex_sine.c 1752 2011-09-08 03:21:55Z philburk $
Chris@39 9 *
Chris@39 10 * This program uses the PortAudio Portable Audio Library.
Chris@39 11 * For more information see: http://www.portaudio.com/
Chris@39 12 * Copyright (c) 1999-2000 Ross Bencina and Phil Burk
Chris@39 13 *
Chris@39 14 * Permission is hereby granted, free of charge, to any person obtaining
Chris@39 15 * a copy of this software and associated documentation files
Chris@39 16 * (the "Software"), to deal in the Software without restriction,
Chris@39 17 * including without limitation the rights to use, copy, modify, merge,
Chris@39 18 * publish, distribute, sublicense, and/or sell copies of the Software,
Chris@39 19 * and to permit persons to whom the Software is furnished to do so,
Chris@39 20 * subject to the following conditions:
Chris@39 21 *
Chris@39 22 * The above copyright notice and this permission notice shall be
Chris@39 23 * included in all copies or substantial portions of the Software.
Chris@39 24 *
Chris@39 25 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
Chris@39 26 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
Chris@39 27 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
Chris@39 28 * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR
Chris@39 29 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
Chris@39 30 * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
Chris@39 31 * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Chris@39 32 */
Chris@39 33
Chris@39 34 /*
Chris@39 35 * The text above constitutes the entire PortAudio license; however,
Chris@39 36 * the PortAudio community also makes the following non-binding requests:
Chris@39 37 *
Chris@39 38 * Any person wishing to distribute modifications to the Software is
Chris@39 39 * requested to send the modifications to the original developer so that
Chris@39 40 * they can be incorporated into the canonical version. It is also
Chris@39 41 * requested that these non-binding requests be included along with the
Chris@39 42 * license above.
Chris@39 43 */
Chris@39 44 #include <stdio.h>
Chris@39 45 #include <math.h>
Chris@39 46 #include "portaudio.h"
Chris@39 47
Chris@39 48 #define NUM_SECONDS (5)
Chris@39 49 #define SAMPLE_RATE (44100)
Chris@39 50 #define FRAMES_PER_BUFFER (64)
Chris@39 51
Chris@39 52 #ifndef M_PI
Chris@39 53 #define M_PI (3.14159265)
Chris@39 54 #endif
Chris@39 55
Chris@39 56 #define TABLE_SIZE (200)
Chris@39 57 typedef struct
Chris@39 58 {
Chris@39 59 float sine[TABLE_SIZE];
Chris@39 60 int left_phase;
Chris@39 61 int right_phase;
Chris@39 62 char message[20];
Chris@39 63 }
Chris@39 64 paTestData;
Chris@39 65
Chris@39 66 /* This routine will be called by the PortAudio engine when audio is needed.
Chris@39 67 ** It may called at interrupt level on some machines so don't do anything
Chris@39 68 ** that could mess up the system like calling malloc() or free().
Chris@39 69 */
Chris@39 70 static int patestCallback( const void *inputBuffer, void *outputBuffer,
Chris@39 71 unsigned long framesPerBuffer,
Chris@39 72 const PaStreamCallbackTimeInfo* timeInfo,
Chris@39 73 PaStreamCallbackFlags statusFlags,
Chris@39 74 void *userData )
Chris@39 75 {
Chris@39 76 paTestData *data = (paTestData*)userData;
Chris@39 77 float *out = (float*)outputBuffer;
Chris@39 78 unsigned long i;
Chris@39 79
Chris@39 80 (void) timeInfo; /* Prevent unused variable warnings. */
Chris@39 81 (void) statusFlags;
Chris@39 82 (void) inputBuffer;
Chris@39 83
Chris@39 84 for( i=0; i<framesPerBuffer; i++ )
Chris@39 85 {
Chris@39 86 *out++ = data->sine[data->left_phase]; /* left */
Chris@39 87 *out++ = data->sine[data->right_phase]; /* right */
Chris@39 88 data->left_phase += 1;
Chris@39 89 if( data->left_phase >= TABLE_SIZE ) data->left_phase -= TABLE_SIZE;
Chris@39 90 data->right_phase += 3; /* higher pitch so we can distinguish left and right. */
Chris@39 91 if( data->right_phase >= TABLE_SIZE ) data->right_phase -= TABLE_SIZE;
Chris@39 92 }
Chris@39 93
Chris@39 94 return paContinue;
Chris@39 95 }
Chris@39 96
Chris@39 97 /*
Chris@39 98 * This routine is called by portaudio when playback is done.
Chris@39 99 */
Chris@39 100 static void StreamFinished( void* userData )
Chris@39 101 {
Chris@39 102 paTestData *data = (paTestData *) userData;
Chris@39 103 printf( "Stream Completed: %s\n", data->message );
Chris@39 104 }
Chris@39 105
Chris@39 106 /*******************************************************************/
Chris@39 107 int main(void);
Chris@39 108 int main(void)
Chris@39 109 {
Chris@39 110 PaStreamParameters outputParameters;
Chris@39 111 PaStream *stream;
Chris@39 112 PaError err;
Chris@39 113 paTestData data;
Chris@39 114 int i;
Chris@39 115
Chris@39 116
Chris@39 117 printf("PortAudio Test: output sine wave. SR = %d, BufSize = %d\n", SAMPLE_RATE, FRAMES_PER_BUFFER);
Chris@39 118
Chris@39 119 /* initialise sinusoidal wavetable */
Chris@39 120 for( i=0; i<TABLE_SIZE; i++ )
Chris@39 121 {
Chris@39 122 data.sine[i] = (float) sin( ((double)i/(double)TABLE_SIZE) * M_PI * 2. );
Chris@39 123 }
Chris@39 124 data.left_phase = data.right_phase = 0;
Chris@39 125
Chris@39 126 err = Pa_Initialize();
Chris@39 127 if( err != paNoError ) goto error;
Chris@39 128
Chris@39 129 outputParameters.device = Pa_GetDefaultOutputDevice(); /* default output device */
Chris@39 130 if (outputParameters.device == paNoDevice) {
Chris@39 131 fprintf(stderr,"Error: No default output device.\n");
Chris@39 132 goto error;
Chris@39 133 }
Chris@39 134 outputParameters.channelCount = 2; /* stereo output */
Chris@39 135 outputParameters.sampleFormat = paFloat32; /* 32 bit floating point output */
Chris@39 136 outputParameters.suggestedLatency = Pa_GetDeviceInfo( outputParameters.device )->defaultLowOutputLatency;
Chris@39 137 outputParameters.hostApiSpecificStreamInfo = NULL;
Chris@39 138
Chris@39 139 err = Pa_OpenStream(
Chris@39 140 &stream,
Chris@39 141 NULL, /* no input */
Chris@39 142 &outputParameters,
Chris@39 143 SAMPLE_RATE,
Chris@39 144 FRAMES_PER_BUFFER,
Chris@39 145 paClipOff, /* we won't output out of range samples so don't bother clipping them */
Chris@39 146 patestCallback,
Chris@39 147 &data );
Chris@39 148 if( err != paNoError ) goto error;
Chris@39 149
Chris@39 150 sprintf( data.message, "No Message" );
Chris@39 151 err = Pa_SetStreamFinishedCallback( stream, &StreamFinished );
Chris@39 152 if( err != paNoError ) goto error;
Chris@39 153
Chris@39 154 err = Pa_StartStream( stream );
Chris@39 155 if( err != paNoError ) goto error;
Chris@39 156
Chris@39 157 printf("Play for %d seconds.\n", NUM_SECONDS );
Chris@39 158 Pa_Sleep( NUM_SECONDS * 1000 );
Chris@39 159
Chris@39 160 err = Pa_StopStream( stream );
Chris@39 161 if( err != paNoError ) goto error;
Chris@39 162
Chris@39 163 err = Pa_CloseStream( stream );
Chris@39 164 if( err != paNoError ) goto error;
Chris@39 165
Chris@39 166 Pa_Terminate();
Chris@39 167 printf("Test finished.\n");
Chris@39 168
Chris@39 169 return err;
Chris@39 170 error:
Chris@39 171 Pa_Terminate();
Chris@39 172 fprintf( stderr, "An error occured while using the portaudio stream\n" );
Chris@39 173 fprintf( stderr, "Error number: %d\n", err );
Chris@39 174 fprintf( stderr, "Error message: %s\n", Pa_GetErrorText( err ) );
Chris@39 175 return err;
Chris@39 176 }