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 }