From: Jaroslav Kysela Date: Sat, 4 Mar 2000 15:50:15 +0000 (+0000) Subject: Added midiloop utility.. X-Git-Tag: v1.0.3~1312 X-Git-Url: https://git.alsa-project.org/?a=commitdiff_plain;h=744c87fd128d0496af372c9881910d057083ca71;p=alsa-lib.git Added midiloop utility.. --- diff --git a/test/Makefile.am b/test/Makefile.am index e90877ce..e4436fd4 100644 --- a/test/Makefile.am +++ b/test/Makefile.am @@ -1,5 +1,5 @@ check_PROGRAMS=control mixer switches pause pcm pcmtest latency seq \ - playmidi1 timer loopback rawmidi + playmidi1 timer loopback rawmidi midiloop control_LDADD=../src/libasound.la mixer_LDADD=../src/libasound.la @@ -13,6 +13,7 @@ playmidi1_LDADD=../src/libasound.la timer_LDADD=../src/libasound.la loopback_LDADD=../src/libasound.la rawmidi_LDADD=../src/libasound.la +midiloop_LDADD=../src/libasound.la INCLUDES=-I$(top_srcdir)/include CFLAGS=-static -Wall -pipe -g diff --git a/test/midiloop.c b/test/midiloop.c new file mode 100644 index 00000000..e73ab4d6 --- /dev/null +++ b/test/midiloop.c @@ -0,0 +1,209 @@ +#include +#include +#include +#include +#include +#include + +static void usage(void) +{ + fprintf(stderr, "Usage: midiloop [options]\n"); + fprintf(stderr, " options:\n"); + fprintf(stderr, " -v: verbose mode\n"); + fprintf(stderr, " -i [ card-id device-id ] : test input device\n"); + fprintf(stderr, " -o [ card-id device-id ] : test output device\n"); +} + +int stop = 0; + +void sighandler(int dum) +{ + stop=1; +} + +long long timediff(struct timeval t1, struct timeval t2) +{ + signed long l; + + t1.tv_sec -= t2.tv_sec; + l = (signed long) t1.tv_usec - (signed long) t2.tv_usec; + if (l < 0) { + t1.tv_sec--; + l = -l; + l %= 1000000; + } + return ((long long)t1.tv_sec * (long long)1000000) + (long long)l; +} + +int writepattern(snd_rawmidi_t *handle_out, unsigned char *obuf) +{ + int patsize, i; + + patsize = 0; + for (i = 0; i < 15; i++) { + obuf[patsize++] = 0x90 + i; + obuf[patsize++] = 0x40; + obuf[patsize++] = 0x3f; + obuf[patsize++] = 0xb0 + i; + obuf[patsize++] = 0x2e; + obuf[patsize++] = 0x7a; + obuf[patsize++] = 0x80 + i; + obuf[patsize++] = 0x23; + obuf[patsize++] = 0x24; + obuf[patsize++] = 0x25; + obuf[patsize++] = 0x26; + } + i = snd_rawmidi_write(handle_out, obuf, patsize); + if (i != patsize) { + printf("Written only %i bytes from %i bytes\n", i, patsize); + exit(EXIT_FAILURE); + } + return patsize; +} + +int main(int argc, char** argv) +{ + int i, j, k, opos, ipos, patsize; + int err; + int verbose = 0; + int card_in = -1, device_in = 0; + int card_out = -1, device_out = 0; + snd_rawmidi_t *handle_in = NULL, *handle_out = NULL; + unsigned char ibuf[512], obuf[512]; + struct timeval start, end; + long long diff; + snd_rawmidi_status_t istat, ostat; + + if (argc == 1) { + usage(); + exit(EXIT_SUCCESS); + } + + for (i = 1 ; i 0) { + printf("Read ahead: %i\n", i); + for (j = 0; j < i; j++) + printf("%02x:", ibuf[j]); + printf("\n"); + exit(EXIT_FAILURE); + } + + patsize = writepattern(handle_out, obuf); + gettimeofday(&start, NULL); + patsize = writepattern(handle_out, obuf); + + k = ipos = opos = err = 0; + while (!stop) { + i = snd_rawmidi_read(handle_in, ibuf, sizeof(ibuf)); + for (j = 0; j < i; j++, ipos++) + if (obuf[k] != ibuf[j]) { + printf("ipos = %i, i[0x%x] != o[0x%x]\n", ipos, ibuf[j], obuf[k]); + if (opos > 0) + stop = 1; + } else { + printf("match success: ipos = %i, opos = %i [%i:0x%x]\n", ipos, opos, k, obuf[k]); + k++; opos++; + if (k >= patsize) { + patsize = writepattern(handle_out, obuf); + k = 0; + } + } + } + + gettimeofday(&end, NULL); + + printf("End...\n"); + + bzero(&istat, sizeof(istat)); + bzero(&ostat, sizeof(ostat)); + istat.channel = SND_RAWMIDI_CHANNEL_INPUT; + ostat.channel = SND_RAWMIDI_CHANNEL_OUTPUT; + err = snd_rawmidi_channel_status(handle_in, &istat); + if (err < 0) + fprintf(stderr, "input channel status error: %d\n", err); + err = snd_rawmidi_channel_status(handle_out, &ostat); + if (err < 0) + fprintf(stderr, "output channel status error: %d\n", err); + printf("input.status.queue = %i\n", istat.queue); + printf("input.status.overrun = %i\n", istat.overrun); + printf("output.status.queue = %i\n", ostat.queue); + printf("output.status.overrun = %i\n", ostat.overrun); + + diff = timediff(end, start); + printf("Time diff: %Liusec (%Li bytes/sec)\n", diff, ((long long)opos * 1000000) / diff); + + if (verbose) { + fprintf(stderr,"Closing\n"); + } + + snd_rawmidi_input_flush(handle_in); + snd_rawmidi_close(handle_in); + snd_rawmidi_output_flush(handle_out); + snd_rawmidi_close(handle_out); + + return 0; +}