#include <alsa/asoundlib.h>

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

main(int argc, char **argv) {
   int status;
   int mode = SND_RAWMIDI_SYNC;
   snd_rawmidi_t* midiout = NULL;

unsigned char rbuf[1200];
unsigned char c;
char *device;
int pone=1;
int nchar=0,i,verbose;

if(argc!=2 && argc!=3 || (argc==3 && strcasecmp(argv[1],"-v")) ) {
	fprintf(stderr,"?? ukupload [-v] <midi-device hw:x:x>\n");
	fprintf(stderr,"!! use amidi -l to list available devices\n");
	fprintf(stderr,"!! use amidi -d -a -p <midi-device hw:x:x> to dump U-Key output\n");
	exit(1);
	};
verbose=(argc==3)? 1:0;
device=(argc==3)? argv[2]:argv[1];

if(verbose) fprintf(stderr,"!! ukupload : opening %s\n",device);
if(snd_rawmidi_open(NULL, &midiout, device, mode)< 0) {
	fprintf(stderr,"?? ukupload can't open %s\n",device);
	exit(2);
	};

// sous windows il y a ouverture/fermeture à chaque paquet, pas ici
while(!feof(stdin)) {
	c=(unsigned char)fgetc(stdin);
	rbuf[nchar++]=c;
	if (nchar>=sizeof(rbuf)) {
		fprintf(stderr,"?? ukupload output buffer overflow (this shouldn't occur when using uksyxify...)");
		exit(3);
	   	};
	if(c==(unsigned char)0xF7 ) {
		// envoi
		if ((status = snd_rawmidi_write(midiout, rbuf, nchar)) < 0) {
	      		fprintf(stderr,"?? ukupload can't write to %s: %s",device,snd_strerror(status));
	      		exit(4);
	   		};

		if(verbose) fprintf(stderr,"!! ukupload : %d character packet\n",nchar);
		if(pone) {
			if(verbose) fprintf(stderr,"!! ukupload : wait for 1st sysex to complete\n",nchar);
			sleep(3); 
			pone=0;
			}
		nchar=0;
		};
	
	};

if(verbose) fprintf(stderr,"!! ukupload : wait for last sysex to complete\n",nchar);
// 3 seconds is laaaaaargeeeeely enough
sleep(3); 
if(verbose) fprintf(stderr,"!! ukupload : closing %s\n",device);
snd_rawmidi_close(midiout);
exit(0);
};


