Version 2.1.1
[rtaudio-cdist.git] / tests / call_twostreams.cpp
1 /******************************************/
2 /*
3   twostreams.cpp
4   by Gary P. Scavone, 2001
5
6   Test executable using two streams with
7   callbacks.
8 */
9 /******************************************/
10
11 #include "RtAudio.h"
12 #include <iostream.h>
13
14 /*
15 typedef signed long  MY_TYPE;
16 #define FORMAT RtAudio::RTAUDIO_SINT24
17 #define SCALE  2147483647.0
18
19 typedef char  MY_TYPE;
20 #define FORMAT RtAudio::RTAUDIO_SINT8
21 #define SCALE  127.0
22
23 typedef signed short  MY_TYPE;
24 #define FORMAT RtAudio::RTAUDIO_SINT16
25 #define SCALE  32767.0
26
27 typedef signed long  MY_TYPE;
28 #define FORMAT RtAudio::RTAUDIO_SINT32
29 #define SCALE  2147483647.0
30
31 typedef float  MY_TYPE;
32 #define FORMAT RtAudio::RTAUDIO_FLOAT32
33 #define SCALE  1.0
34 */
35
36 typedef double  MY_TYPE;
37 #define FORMAT RtAudio::RTAUDIO_FLOAT64
38 #define SCALE  1.0
39
40 void usage(void) {
41   /* Error function in case of incorrect command-line
42      argument specifications
43   */
44   cout << "\nuseage: call_twostreams N fs <device>\n";
45   cout << "    where N = number of channels,\n";
46   cout << "    fs = the sample rate,\n";
47   cout << "    and device = the device to use (default = 0).\n\n";
48   exit(0);
49 }
50
51 int chans;
52
53 int in(char *buffer, int buffer_size, void *data)
54 {
55   extern int chans;
56   MY_TYPE *my_buffer = (MY_TYPE *) buffer;
57   MY_TYPE *my_data = (MY_TYPE *) data;
58   long buffer_bytes = buffer_size * chans * sizeof(MY_TYPE);
59
60   memcpy(my_data, my_buffer, buffer_bytes);
61
62   return 0;
63 }
64
65 int out(char *buffer, int buffer_size, void *data)
66 {
67   extern int chans;
68   MY_TYPE *my_buffer = (MY_TYPE *) buffer;
69   MY_TYPE *my_data = (MY_TYPE *) data;
70   long buffer_bytes = buffer_size * chans * sizeof(MY_TYPE);
71
72   memcpy(my_buffer, my_data, buffer_bytes);
73
74   return 0;
75 }
76
77 int main(int argc, char *argv[])
78 {
79   int buffer_size, stream1 = 0, stream2 = 0, fs, device = 0;
80   MY_TYPE *data = 0;
81   RtAudio *audio;
82   char input;
83
84   // minimal command-line checking
85   if (argc != 3 && argc != 4 ) usage();
86
87   chans = (int) atoi(argv[1]);
88   fs = (int) atoi(argv[2]);
89   if ( argc == 4 )
90     device = (int) atoi(argv[3]);
91
92   // Open the realtime output device
93   buffer_size = 512;
94   try {
95     audio = new RtAudio();
96   }
97   catch (RtError &) {
98     exit(EXIT_FAILURE);
99   }
100
101   try {
102     stream1 = audio->openStream(0, 0, device, chans,
103                                 FORMAT, fs, &buffer_size, 8);
104     stream2 = audio->openStream(device, chans, 0, 0,
105                                 FORMAT, fs, &buffer_size, 8);
106   }
107   catch (RtError &) {
108     goto cleanup;
109   }
110
111   data = (MY_TYPE *) calloc(chans*buffer_size, sizeof(MY_TYPE));
112   try {
113     audio->setStreamCallback(stream1, &in, (void *)data);
114     audio->setStreamCallback(stream2, &out, (void *)data);
115     audio->startStream(stream1);
116     audio->startStream(stream2);
117   }
118   catch (RtError &) {
119     goto cleanup;
120   }
121
122   cout << "\nRunning two streams (quasi-duplex) ... press <enter> to quit.\n";
123   cin.get(input);
124
125   cout << "\nStopping both streams.\n";
126   try {
127     audio->stopStream(stream1);
128     audio->stopStream(stream2);
129   }
130   catch (RtError &) {
131     goto cleanup;
132   }
133
134   cout << "\nPress <enter> to restart streams:\n";
135   cin.get(input);
136
137   try {
138     audio->startStream(stream1);
139     audio->startStream(stream2);
140   }
141   catch (RtError &) {
142     goto cleanup;
143   }
144
145   cout << "\nRunning two streams (quasi-duplex) ... press <enter> to quit.\n";
146   cin.get(input);
147
148   try {
149     audio->stopStream(stream1);
150     audio->stopStream(stream2);
151   }
152   catch (RtError &) {
153   }
154
155  cleanup:
156   audio->closeStream(stream1);
157   audio->closeStream(stream2);
158   delete audio;
159   if (data) free(data);
160
161   return 0;
162 }