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] );
111 double *data = (double *) calloc( channels, sizeof( double ) );
113 // Let RtAudio print messages to stderr.
114 dac.showWarnings( true );
116 // Set our stream parameters for output only.
118 RtAudio::StreamParameters oParams, iParams;
119 oParams.deviceId = device;
120 oParams.nChannels = channels;
121 oParams.firstChannel = offset;
123 RtAudio::StreamOptions options;
124 options.flags = RTAUDIO_HOG_DEVICE;
126 dac.openStream( &oParams, NULL, RTAUDIO_FLOAT64, fs, &bufferFrames, &sawi, (void *)data, &options );
127 std::cout << "\nStream latency = " << dac.getStreamLatency() << std::endl;
131 std::cout << "\nPlaying ... press <enter> to stop.\n";
132 std::cin.get( input );
138 std::cout << "Press <enter> to restart.\n";
139 std::cin.get( input );
142 // Test abort function
143 std::cout << "Playing again ... press <enter> to abort.\n";
144 std::cin.get( input );
147 // Restart another time
148 std::cout << "Press <enter> to restart again.\n";
149 std::cin.get( input );
152 std::cout << "Playing again ... press <enter> to close the stream.\n";
153 std::cin.get( input );
155 catch ( RtError& e ) {
160 if ( dac.isStreamOpen() ) dac.closeStream();
162 // Test non-interleaved functionality
163 options.flags = RTAUDIO_NONINTERLEAVED;
165 dac.openStream( &oParams, NULL, RTAUDIO_FLOAT64, fs, &bufferFrames, &sawni, (void *)data, &options );
167 std::cout << "Press <enter> to start non-interleaved playback.\n";
168 std::cin.get( input );
172 std::cout << "\nPlaying ... press <enter> to stop.\n";
173 std::cin.get( input );
175 catch ( RtError& e ) {
180 if ( dac.isStreamOpen() ) dac.closeStream();
182 // Now open a duplex stream.
183 unsigned int bufferBytes;
184 iParams.deviceId = device;
185 iParams.nChannels = channels;
186 iParams.firstChannel = offset;
187 options.flags = RTAUDIO_NONINTERLEAVED;
189 dac.openStream( &oParams, &iParams, RTAUDIO_SINT32, fs, &bufferFrames, &inout, (void *)&bufferBytes, &options );
191 bufferBytes = bufferFrames * channels * 4;
193 std::cout << "Press <enter> to start duplex operation.\n";
194 std::cin.get( input );
198 std::cout << "\nRunning ... press <enter> to stop.\n";
199 std::cin.get( input );
203 std::cout << "\nStopped ... press <enter> to restart.\n";
204 std::cin.get( input );
206 // Restart the stream
208 std::cout << "\nRunning ... press <enter> to stop.\n";
209 std::cin.get( input );
211 catch ( RtError& e ) {
216 if ( dac.isStreamOpen() ) dac.closeStream();