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