1 /******************************************/
4 by Gary P. Scavone, 2001
6 Text executable using two streams with
9 /******************************************/
15 typedef signed long MY_TYPE;
16 #define FORMAT RtAudio::RTAUDIO_SINT24
17 #define SCALE 2147483647.0
20 #define FORMAT RtAudio::RTAUDIO_SINT8
23 typedef signed short MY_TYPE;
24 #define FORMAT RtAudio::RTAUDIO_SINT16
27 typedef signed long MY_TYPE;
28 #define FORMAT RtAudio::RTAUDIO_SINT32
29 #define SCALE 2147483647.0
31 typedef float MY_TYPE;
32 #define FORMAT RtAudio::RTAUDIO_FLOAT32
36 typedef double MY_TYPE;
37 #define FORMAT RtAudio::RTAUDIO_FLOAT64
41 /* Error function in case of incorrect command-line
42 argument specifications
44 cout << "\nuseage: call_twostreams N fs\n";
45 cout << " where N = number of channels,\n";
46 cout << " and fs = the sample rate.\n\n";
52 int in(char *buffer, int buffer_size, void *data)
55 MY_TYPE *my_buffer = (MY_TYPE *) buffer;
56 MY_TYPE *my_data = (MY_TYPE *) data;
57 long buffer_bytes = buffer_size * chans * sizeof(MY_TYPE);
59 memcpy(my_data, my_buffer, buffer_bytes);
64 int out(char *buffer, int buffer_size, void *data)
67 MY_TYPE *my_buffer = (MY_TYPE *) buffer;
68 MY_TYPE *my_data = (MY_TYPE *) data;
69 long buffer_bytes = buffer_size * chans * sizeof(MY_TYPE);
71 memcpy(my_buffer, my_data, buffer_bytes);
76 int main(int argc, char *argv[])
78 int device, buffer_size, stream1, stream2, fs;
83 // minimal command-line checking
84 if (argc != 3) usage();
86 chans = (int) atoi(argv[1]);
87 fs = (int) atoi(argv[2]);
89 // Open the realtime output device
91 device = 0; // default device
93 audio = new RtAudio();
95 catch (RtAudioError &m) {
101 stream1 = audio->openStream(0, 0, device, chans,
102 FORMAT, fs, &buffer_size, 8);
103 stream2 = audio->openStream(device, chans, 0, 0,
104 FORMAT, fs, &buffer_size, 8);
106 catch (RtAudioError &m) {
111 data = (MY_TYPE *) calloc(chans*buffer_size, sizeof(MY_TYPE));
113 audio->setStreamCallback(stream1, &in, (void *)data);
114 audio->setStreamCallback(stream2, &out, (void *)data);
115 audio->startStream(stream1);
116 audio->startStream(stream2);
118 catch (RtAudioError &m) {
123 cout << "\nRunning two streams (quasi-duplex) ... press <enter> to quit.\n";
126 cout << "\nStopping both streams.\n";
128 audio->stopStream(stream1);
129 audio->stopStream(stream2);
131 catch (RtAudioError &m) {
136 cout << "\nPress <enter> to restart streams:\n";
140 audio->startStream(stream1);
141 audio->startStream(stream2);
143 catch (RtAudioError &m) {
148 cout << "\nRunning two streams (quasi-duplex) ... press <enter> to quit.\n";
152 audio->stopStream(stream1);
153 audio->stopStream(stream2);
155 catch (RtAudioError &m) {
160 audio->closeStream(stream1);
161 audio->closeStream(stream2);
163 if (data) free(data);