1 /******************************************/
4 by Gary P. Scavone, 2007
6 This program will make a variety of calls
7 to extensively test RtAudio functionality.
9 /******************************************/
14 #define BASE_RATE 0.005
18 // Error function in case of incorrect command-line
19 // argument specifications
20 std::cout << "\nuseage: testall N fs <device> <channelOffset>\n";
21 std::cout << " where N = number of channels,\n";
22 std::cout << " fs = the sample rate,\n";
23 std::cout << " device = optional device to use (default = 0),\n";
24 std::cout << " and channelOffset = an optional channel offset on the device (default = 0).\n\n";
28 unsigned int channels;
30 // Interleaved buffers
31 int sawi( void *outputBuffer, void *inputBuffer, unsigned int nBufferFrames,
32 double streamTime, RtAudioStreamStatus status, void *data )
35 extern unsigned int channels;
36 double *buffer = (double *) outputBuffer;
37 double *lastValues = (double *) data;
40 std::cout << "Stream underflow detected!" << std::endl;
42 for ( i=0; i<nBufferFrames; i++ ) {
43 for ( j=0; j<channels; j++ ) {
44 *buffer++ = (double) lastValues[j];
45 lastValues[j] += BASE_RATE * (j+1+(j*0.1));
46 if ( lastValues[j] >= 1.0 ) lastValues[j] -= 2.0;
53 // Non-interleaved buffers
54 int sawni( void *outputBuffer, void *inputBuffer, unsigned int nBufferFrames,
55 double streamTime, RtAudioStreamStatus status, void *data )
58 extern unsigned int channels;
59 double *buffer = (double *) outputBuffer;
60 double *lastValues = (double *) data;
63 std::cout << "Stream underflow detected!" << std::endl;
66 for ( j=0; j<channels; j++ ) {
67 increment = BASE_RATE * (j+1+(j*0.1));
68 for ( i=0; i<nBufferFrames; i++ ) {
69 *buffer++ = (double) lastValues[j];
70 lastValues[j] += increment;
71 if ( lastValues[j] >= 1.0 ) lastValues[j] -= 2.0;
78 int inout( void *outputBuffer, void *inputBuffer, unsigned int nBufferFrames,
79 double streamTime, RtAudioStreamStatus status, void *data )
81 // Since the number of input and output channels is equal, we can do
82 // a simple buffer copy operation here.
83 if ( status ) std::cout << "Stream over/underflow detected." << std::endl;
85 unsigned long *bytes = (unsigned long *) data;
86 memcpy( outputBuffer, inputBuffer, *bytes );
90 int main( int argc, char *argv[] )
92 unsigned int bufferFrames, fs, device = 0, offset = 0;
95 // minimal command-line checking
96 if (argc < 3 || argc > 5 ) usage();
99 if ( dac.getDeviceCount() < 1 ) {
100 std::cout << "\nNo audio devices found!\n";
104 channels = (unsigned int) atoi( argv[1] );
105 fs = (unsigned int) atoi( argv[2] );
107 device = (unsigned int) atoi( argv[3] );
109 offset = (unsigned int) atoi( argv[4] );
112 data = (double *) calloc( channels, sizeof( double ) );
114 // Let RtAudio print messages to stderr.
115 dac.showWarnings( true );
117 // Set our stream parameters for output only.
119 RtAudio::StreamParameters oParams, iParams;
120 oParams.deviceId = device;
121 oParams.nChannels = channels;
122 oParams.firstChannel = offset;
124 RtAudio::StreamOptions options;
125 options.flags = RTAUDIO_HOG_DEVICE;
127 dac.openStream( &oParams, NULL, RTAUDIO_FLOAT64, fs, &bufferFrames, &sawi, (void *)data, &options );
128 std::cout << "\nStream latency = " << dac.getStreamLatency() << std::endl;
132 std::cout << "\nPlaying ... press <enter> to stop.\n";
133 std::cin.get( input );
139 std::cout << "Press <enter> to restart.\n";
140 std::cin.get( input );
143 // Test abort function
144 std::cout << "Playing again ... press <enter> to abort.\n";
145 std::cin.get( input );
148 // Restart another time
149 std::cout << "Press <enter> to restart again.\n";
150 std::cin.get( input );
153 std::cout << "Playing again ... press <enter> to close the stream.\n";
154 std::cin.get( input );
156 catch ( RtError& e ) {
161 if ( dac.isStreamOpen() ) dac.closeStream();
163 // Test non-interleaved functionality
164 options.flags = RTAUDIO_NONINTERLEAVED;
166 dac.openStream( &oParams, NULL, RTAUDIO_FLOAT64, fs, &bufferFrames, &sawni, (void *)data, &options );
168 std::cout << "Press <enter> to start non-interleaved playback.\n";
169 std::cin.get( input );
173 std::cout << "\nPlaying ... press <enter> to stop.\n";
174 std::cin.get( input );
176 catch ( RtError& e ) {
181 if ( dac.isStreamOpen() ) dac.closeStream();
183 // Now open a duplex stream.
184 unsigned int bufferBytes;
185 iParams.deviceId = device;
186 iParams.nChannels = channels;
187 iParams.firstChannel = offset;
188 options.flags = RTAUDIO_NONINTERLEAVED;
190 dac.openStream( &oParams, &iParams, RTAUDIO_SINT32, fs, &bufferFrames, &inout, (void *)&bufferBytes, &options );
192 bufferBytes = bufferFrames * channels * 4;
194 std::cout << "Press <enter> to start duplex operation.\n";
195 std::cin.get( input );
199 std::cout << "\nRunning ... press <enter> to stop.\n";
200 std::cin.get( input );
204 std::cout << "\nStopped ... press <enter> to restart.\n";
205 std::cin.get( input );
207 // Restart the stream
209 std::cout << "\nRunning ... press <enter> to stop.\n";
210 std::cin.get( input );
212 catch ( RtError& e ) {
217 if ( dac.isStreamOpen() ) dac.closeStream();