comparison src/portaudio/test/pa_minlat.c @ 4:e13257ea84a4

Add bzip2, zlib, liblo, portaudio sources
author Chris Cannam
date Wed, 20 Mar 2013 13:59:52 +0000
parents
children
comparison
equal deleted inserted replaced
3:6c505a35919a 4:e13257ea84a4
1 /** @file pa_minlat.c
2 @ingroup test_src
3 @brief Experiment with different numbers of buffers to determine the
4 minimum latency for a computer.
5 @author Phil Burk http://www.softsynth.com
6 */
7 /*
8 * $Id: pa_minlat.c 1612 2011-02-28 23:56:48Z philburk $
9 *
10 * This program uses the PortAudio Portable Audio Library.
11 * For more information see: http://www.portaudio.com
12 * Copyright (c) 1999-2000 Ross Bencina and Phil Burk
13 *
14 * Permission is hereby granted, free of charge, to any person obtaining
15 * a copy of this software and associated documentation files
16 * (the "Software"), to deal in the Software without restriction,
17 * including without limitation the rights to use, copy, modify, merge,
18 * publish, distribute, sublicense, and/or sell copies of the Software,
19 * and to permit persons to whom the Software is furnished to do so,
20 * subject to the following conditions:
21 *
22 * The above copyright notice and this permission notice shall be
23 * included in all copies or substantial portions of the Software.
24 *
25 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
26 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
27 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
28 * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR
29 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
30 * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
31 * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
32 */
33
34 /*
35 * The text above constitutes the entire PortAudio license; however,
36 * the PortAudio community also makes the following non-binding requests:
37 *
38 * Any person wishing to distribute modifications to the Software is
39 * requested to send the modifications to the original developer so that
40 * they can be incorporated into the canonical version. It is also
41 * requested that these non-binding requests be included along with the
42 * license above.
43 */
44
45 #include <stdio.h>
46 #include <stdlib.h>
47 #include <math.h>
48 #include <string.h>
49 #include "portaudio.h"
50
51 #ifndef M_PI
52 #define M_PI (3.14159265)
53 #endif
54 #define TWOPI (M_PI * 2.0)
55
56 #define DEFAULT_BUFFER_SIZE (32)
57
58 typedef struct
59 {
60 double left_phase;
61 double right_phase;
62 }
63 paTestData;
64
65 /* Very simple synthesis routine to generate two sine waves. */
66 static int paminlatCallback( const void *inputBuffer, void *outputBuffer,
67 unsigned long framesPerBuffer,
68 const PaStreamCallbackTimeInfo* timeInfo,
69 PaStreamCallbackFlags statusFlags,
70 void *userData )
71 {
72 paTestData *data = (paTestData*)userData;
73 float *out = (float*)outputBuffer;
74 unsigned int i;
75 double left_phaseInc = 0.02;
76 double right_phaseInc = 0.06;
77
78 double left_phase = data->left_phase;
79 double right_phase = data->right_phase;
80
81 for( i=0; i<framesPerBuffer; i++ )
82 {
83 left_phase += left_phaseInc;
84 if( left_phase > TWOPI ) left_phase -= TWOPI;
85 *out++ = (float) sin( left_phase );
86
87 right_phase += right_phaseInc;
88 if( right_phase > TWOPI ) right_phase -= TWOPI;
89 *out++ = (float) sin( right_phase );
90 }
91
92 data->left_phase = left_phase;
93 data->right_phase = right_phase;
94 return 0;
95 }
96
97 int main( int argc, char **argv );
98 int main( int argc, char **argv )
99 {
100 PaStreamParameters outputParameters;
101 PaStream *stream;
102 PaError err;
103 paTestData data;
104 int go;
105 int outLatency = 0;
106 int minLatency = DEFAULT_BUFFER_SIZE * 2;
107 int framesPerBuffer;
108 double sampleRate = 44100.0;
109 char str[256];
110 char *line;
111
112 printf("pa_minlat - Determine minimum latency for your computer.\n");
113 printf(" usage: pa_minlat {userBufferSize}\n");
114 printf(" for example: pa_minlat 64\n");
115 printf("Adjust your stereo until you hear a smooth tone in each speaker.\n");
116 printf("Then try to find the smallest number of frames that still sounds smooth.\n");
117 printf("Note that the sound will stop momentarily when you change the number of buffers.\n");
118
119 /* Get bufferSize from command line. */
120 framesPerBuffer = ( argc > 1 ) ? atol( argv[1] ) : DEFAULT_BUFFER_SIZE;
121 printf("Frames per buffer = %d\n", framesPerBuffer );
122
123 data.left_phase = data.right_phase = 0.0;
124
125 err = Pa_Initialize();
126 if( err != paNoError ) goto error;
127
128 outLatency = sampleRate * 200.0 / 1000.0; /* 200 msec. */
129
130 /* Try different numBuffers in a loop. */
131 go = 1;
132 while( go )
133 {
134 outputParameters.device = Pa_GetDefaultOutputDevice(); /* Default output device. */
135 outputParameters.channelCount = 2; /* Stereo output */
136 outputParameters.sampleFormat = paFloat32; /* 32 bit floating point output. */
137 outputParameters.suggestedLatency = (double)outLatency / sampleRate; /* In seconds. */
138 outputParameters.hostApiSpecificStreamInfo = NULL;
139
140 printf("Latency = %d frames = %6.1f msec.\n", outLatency, outputParameters.suggestedLatency * 1000.0 );
141
142 err = Pa_OpenStream(
143 &stream,
144 NULL, /* no input */
145 &outputParameters,
146 sampleRate,
147 framesPerBuffer,
148 paClipOff, /* we won't output out of range samples so don't bother clipping them */
149 paminlatCallback,
150 &data );
151 if( err != paNoError ) goto error;
152 if( stream == NULL ) goto error;
153
154 /* Start audio. */
155 err = Pa_StartStream( stream );
156 if( err != paNoError ) goto error;
157
158 /* Ask user for a new nlatency. */
159 printf("\nMove windows around to see if the sound glitches.\n");
160 printf("Latency now %d, enter new number of frames, or 'q' to quit: ", outLatency );
161 line = fgets( str, 256, stdin );
162 if( line == NULL )
163 {
164 go = 0;
165 }
166 else
167 {
168 {
169 /* Get rid of newline */
170 size_t l = strlen( str ) - 1;
171 if( str[ l ] == '\n')
172 str[ l ] = '\0';
173 }
174
175
176 if( str[0] == 'q' ) go = 0;
177 else
178 {
179 outLatency = atol( str );
180 if( outLatency < minLatency )
181 {
182 printf( "Latency below minimum of %d! Set to minimum!!!\n", minLatency );
183 outLatency = minLatency;
184 }
185 }
186
187 }
188 /* Stop sound until ENTER hit. */
189 err = Pa_StopStream( stream );
190 if( err != paNoError ) goto error;
191 err = Pa_CloseStream( stream );
192 if( err != paNoError ) goto error;
193 }
194 printf("A good setting for latency would be somewhat higher than\n");
195 printf("the minimum latency that worked.\n");
196 printf("PortAudio: Test finished.\n");
197 Pa_Terminate();
198 return 0;
199 error:
200 Pa_Terminate();
201 fprintf( stderr, "An error occured while using the portaudio stream\n" );
202 fprintf( stderr, "Error number: %d\n", err );
203 fprintf( stderr, "Error message: %s\n", Pa_GetErrorText( err ) );
204 return 1;
205 }