00001 #include <stdio.h> 00002 #include <stdlib.h> 00003 #include <ctype.h> 00004 #include "../include/asoundlib.h" 00005 #include <signal.h> 00006 00007 static void usage(void) 00008 { 00009 fprintf(stderr, "usage: rawmidi [options]\n"); 00010 fprintf(stderr, " options:\n"); 00011 fprintf(stderr, " -v: verbose mode\n"); 00012 fprintf(stderr, " -i device-id : test ALSA input device\n"); 00013 fprintf(stderr, " -o device-id : test ALSA output device\n"); 00014 fprintf(stderr, " -I node : test input node\n"); 00015 fprintf(stderr, " -O node : test output node\n"); 00016 fprintf(stderr, " -t: test midi thru\n"); 00017 fprintf(stderr, " example:\n"); 00018 fprintf(stderr, " rawmidi -i hw:0,0 -O /dev/midi1\n"); 00019 fprintf(stderr, " tests input for card 0, device 0, using snd_rawmidi API\n"); 00020 fprintf(stderr, " and /dev/midi1 using file descriptors\n"); 00021 } 00022 00023 int stop=0; 00024 00025 void sighandler(int dum) 00026 { 00027 stop=1; 00028 } 00029 00030 int main(int argc,char** argv) 00031 { 00032 int i; 00033 int err; 00034 int thru=0; 00035 int verbose = 0; 00036 char *device_in = NULL; 00037 char *device_out = NULL; 00038 char *node_in = NULL; 00039 char *node_out = NULL; 00040 00041 int fd_in = -1,fd_out = -1; 00042 snd_rawmidi_t *handle_in = 0,*handle_out = 0; 00043 00044 if (argc==1) { 00045 usage(); 00046 exit(0); 00047 } 00048 00049 for (i = 1 ; i<argc ; i++) { 00050 if (argv[i][0]=='-') { 00051 switch (argv[i][1]) { 00052 case 'h': 00053 usage(); 00054 break; 00055 case 'v': 00056 verbose = 1; 00057 break; 00058 case 't': 00059 thru = 1; 00060 break; 00061 case 'i': 00062 if (i + 1 < argc) 00063 device_in = argv[++i]; 00064 break; 00065 case 'I': 00066 if (i + 1 < argc) 00067 node_in = argv[++i]; 00068 break; 00069 case 'o': 00070 if (i + 1 < argc) 00071 device_out = argv[++i]; 00072 break; 00073 case 'O': 00074 if (i + 1 < argc) 00075 node_out = argv[++i]; 00076 break; 00077 } 00078 } 00079 } 00080 00081 if (verbose) { 00082 fprintf(stderr,"Using: \n"); 00083 fprintf(stderr,"Input: "); 00084 if (device_in) { 00085 fprintf(stderr,"device %s\n",device_in); 00086 }else if (node_in){ 00087 fprintf(stderr,"%s\n",node_in); 00088 }else{ 00089 fprintf(stderr,"NONE\n"); 00090 } 00091 fprintf(stderr,"Output: "); 00092 if (device_out) { 00093 fprintf(stderr,"device %s\n",device_out); 00094 }else if (node_out){ 00095 fprintf(stderr,"%s\n",node_out); 00096 }else{ 00097 fprintf(stderr,"NONE\n"); 00098 } 00099 } 00100 00101 if (device_in) { 00102 err = snd_rawmidi_open(&handle_in,NULL,device_in,0); 00103 if (err) { 00104 fprintf(stderr,"snd_rawmidi_open %s failed: %d\n",device_in,err); 00105 } 00106 } 00107 if (node_in && (!node_out || strcmp(node_out,node_in))) { 00108 fd_in = open(node_in,O_RDONLY); 00109 if (fd_in<0) { 00110 fprintf(stderr,"open %s for input failed\n",node_in); 00111 } 00112 } 00113 00114 signal(SIGINT,sighandler); 00115 00116 if (device_out) { 00117 err = snd_rawmidi_open(NULL,&handle_out,device_out,0); 00118 if (err) { 00119 fprintf(stderr,"snd_rawmidi_open %s failed: %d\n",device_out,err); 00120 } 00121 } 00122 if (node_out && (!node_in || strcmp(node_out,node_in))) { 00123 fd_out = open(node_out,O_WRONLY); 00124 if (fd_out<0) { 00125 fprintf(stderr,"open %s for output failed\n",node_out); 00126 } 00127 } 00128 00129 if (node_in && node_out && strcmp(node_out,node_in)==0) { 00130 fd_in = fd_out = open(node_out,O_RDWR); 00131 if (fd_out<0) { 00132 fprintf(stderr,"open %s for input and output failed\n",node_out); 00133 } 00134 } 00135 00136 00137 00138 if (!thru) { 00139 if (handle_in || fd_in!=-1) { 00140 fprintf(stderr,"Read midi in\n"); 00141 fprintf(stderr,"Press ctrl-c to stop\n"); 00142 } 00143 00144 if (handle_in) { 00145 unsigned char ch; 00146 while (!stop) { 00147 snd_rawmidi_read(handle_in,&ch,1); 00148 if (verbose) { 00149 fprintf(stderr,"read %02x\n",ch); 00150 } 00151 } 00152 } 00153 if (fd_in!=-1) { 00154 unsigned char ch; 00155 while (!stop) { 00156 read(fd_in,&ch,1); 00157 if (verbose) { 00158 fprintf(stderr,"read %02x\n",ch); 00159 } 00160 } 00161 } 00162 00163 if (handle_out || fd_out!=-1) { 00164 fprintf(stderr,"Writing note on / note off\n"); 00165 } 00166 00167 if (handle_out) { 00168 unsigned char ch; 00169 ch=0x90; snd_rawmidi_write(handle_out,&ch,1); 00170 ch=60; snd_rawmidi_write(handle_out,&ch,1); 00171 ch=100; snd_rawmidi_write(handle_out,&ch,1); 00172 snd_rawmidi_drain(handle_out); 00173 sleep(1); 00174 ch=0x90; snd_rawmidi_write(handle_out,&ch,1); 00175 ch=60; snd_rawmidi_write(handle_out,&ch,1); 00176 ch=0; snd_rawmidi_write(handle_out,&ch,1); 00177 snd_rawmidi_drain(handle_out); 00178 } 00179 if (fd_out!=-1) { 00180 unsigned char ch; 00181 ch=0x90; write(fd_out,&ch,1); 00182 ch=60; write(fd_out,&ch,1); 00183 ch=100; write(fd_out,&ch,1); 00184 sleep(1); 00185 ch=0x90; write(fd_out,&ch,1); 00186 ch=60; write(fd_out,&ch,1); 00187 ch=0; write(fd_out,&ch,1); 00188 } 00189 } else { 00190 if ((handle_in || fd_in!=-1) && (handle_out || fd_out!=-1)) { 00191 if (verbose) { 00192 fprintf(stderr,"Testing midi thru in\n"); 00193 } 00194 while (!stop) { 00195 unsigned char ch; 00196 00197 if (handle_in) { 00198 snd_rawmidi_read(handle_in,&ch,1); 00199 } 00200 if (fd_in!=-1) { 00201 read(fd_in,&ch,1); 00202 } 00203 if (verbose) { 00204 fprintf(stderr,"thru: %02x\n",ch); 00205 } 00206 00207 if (handle_out) { 00208 snd_rawmidi_write(handle_out,&ch,1); 00209 snd_rawmidi_drain(handle_out); 00210 } 00211 if (fd_out!=-1) { 00212 write(fd_out,&ch,1); 00213 } 00214 } 00215 }else{ 00216 fprintf(stderr,"Testing midi thru needs both input and output\n"); 00217 exit(-1); 00218 } 00219 } 00220 00221 if (verbose) { 00222 fprintf(stderr,"Closing\n"); 00223 } 00224 00225 if (handle_in) { 00226 snd_rawmidi_drain(handle_in); 00227 snd_rawmidi_close(handle_in); 00228 } 00229 if (handle_out) { 00230 snd_rawmidi_drain(handle_out); 00231 snd_rawmidi_close(handle_out); 00232 } 00233 if (fd_in!=-1) { 00234 close(fd_in); 00235 } 00236 if (fd_out!=-1) { 00237 close(fd_out); 00238 } 00239 00240 return 0; 00241 }