Version 2.0.1
[rtaudio-cdist.git] / tests / call_twostreams.cpp
1 /******************************************/
2 /*
3   twostreams.cpp
4   by Gary P. Scavone, 2001
5
6   Text 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\n";
45   cout << "    where N = number of channels,\n";
46   cout << "    and fs = the sample rate.\n\n";
47   exit(0);
48 }
49
50 int chans;
51
52 int in(char *buffer, int buffer_size, void *data)
53 {
54   extern int chans;
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);
58
59   memcpy(my_data, my_buffer, buffer_bytes);
60
61   return 0;
62 }
63
64 int out(char *buffer, int buffer_size, void *data)
65 {
66   extern int chans;
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);
70
71   memcpy(my_buffer, my_data, buffer_bytes);
72
73   return 0;
74 }
75
76 int main(int argc, char *argv[])
77 {
78   int device, buffer_size, stream1, stream2, fs;
79   MY_TYPE *data = 0;
80   RtAudio *audio;
81   char input;
82
83   // minimal command-line checking
84   if (argc != 3) usage();
85
86   chans = (int) atoi(argv[1]);
87   fs = (int) atoi(argv[2]);
88
89   // Open the realtime output device
90   buffer_size = 512;
91   device = 0; // default device
92   try {
93     audio = new RtAudio();
94   }
95   catch (RtError &) {
96     exit(EXIT_FAILURE);
97   }
98
99   try {
100     stream1 = audio->openStream(0, 0, device, chans,
101                                 FORMAT, fs, &buffer_size, 8);
102     stream2 = audio->openStream(device, chans, 0, 0,
103                                 FORMAT, fs, &buffer_size, 8);
104   }
105   catch (RtError &) {
106     goto cleanup;
107   }
108
109   data = (MY_TYPE *) calloc(chans*buffer_size, sizeof(MY_TYPE));
110   try {
111     audio->setStreamCallback(stream1, &in, (void *)data);
112     audio->setStreamCallback(stream2, &out, (void *)data);
113     audio->startStream(stream1);
114     audio->startStream(stream2);
115   }
116   catch (RtError &) {
117     goto cleanup;
118   }
119
120   cout << "\nRunning two streams (quasi-duplex) ... press <enter> to quit.\n";
121   cin.get(input);
122
123   cout << "\nStopping both streams.\n";
124   try {
125     audio->stopStream(stream1);
126     audio->stopStream(stream2);
127   }
128   catch (RtError &) {
129     goto cleanup;
130   }
131
132   cout << "\nPress <enter> to restart streams:\n";
133   cin.get(input);
134
135   try {
136     audio->startStream(stream1);
137     audio->startStream(stream2);
138   }
139   catch (RtError &) {
140     goto cleanup;
141   }
142
143   cout << "\nRunning two streams (quasi-duplex) ... press <enter> to quit.\n";
144   cin.get(input);
145
146   try {
147     audio->stopStream(stream1);
148     audio->stopStream(stream2);
149   }
150   catch (RtError &) {
151   }
152
153  cleanup:
154   audio->closeStream(stream1);
155   audio->closeStream(stream2);
156   delete audio;
157   if (data) free(data);
158
159   return 0;
160 }