#include #include #include "CyAPI.h" #include #include #include #include #include HANDLE XyloDeviceHandle; /////////////////////////////////////////////////// // Open and close the USB driver void USB_Open() { XyloDeviceHandle = CreateFile("\\\\.\\EzUSB-0", GENERIC_WRITE, FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL); assert(XyloDeviceHandle!=INVALID_HANDLE_VALUE); } void USB_Close() { CloseHandle(XyloDeviceHandle); } /////////////////////////////////////////////////// // USB functions to send and receive bulk packets DWORD USB_BulkWrite(DWORD pipe, void* buffer, DWORD buffersize) { DWORD nBytes; assert(buffersize<0x10000); DeviceIoControl(XyloDeviceHandle, 0x222051, &pipe, sizeof(pipe), buffer, buffersize, &nBytes, NULL); assert(nBytes==buffersize); // make sure everything was sent return nBytes; } DWORD USB_BulkRead(DWORD pipe, void* buffer, DWORD buffersize) { DWORD nBytes; assert(buffersize<0x10000); DeviceIoControl(XyloDeviceHandle, 0x22204E, &pipe, sizeof(pipe), buffer, buffersize, &nBytes, NULL); return nBytes; } unsigned long read4bytes(FILE *f) { unsigned char buf[4]; if (fread(buf, 4, 1, f) != 1) { fprintf(stderr, "Read error\n"); exit(1); } return ((256LU * buf[3] + buf[2]) * 256LU + buf[1] ) * 256LU + buf[0] ; } unsigned read2bytes(FILE *f) { unsigned char buf[2]; if (fread(buf, 2, 1, f) != 1) { fprintf(stderr, "Read error\n"); exit(1); } return 256U * buf[1] + buf[0] ; } void WaveXToXylo(char *filename) { FILE *f; int i, channels, bits; unsigned long len; long count; unsigned char s[100]; f = fopen(filename, "rb"); if (f == NULL) { printf("Can not open %s\n", filename); return; } printf("finename = '%s'\n", filename); if (fread(s, 4, 1, f) != 1) { printf("Read error\n"); fclose(f); return; } if (memcmp(s, "RIFF", 4) != 0) { printf("Not a RIFF format\n"); fclose(f); return; } printf("[RIFF] (%lu bytes)\n", read4bytes(f)); if (fread(s, 8, 1, f) != 1) { printf("Read error\n"); fclose(f); return; } if (memcmp(s, "WAVEfmt ", 8) != 0) { printf("Not a WAVEfmt format\n"); fclose(f); return; } len = read4bytes(f); printf("[WAVEfmt ] (%lu bytes)\n", len); if (len != 40) { printf("Length of WAVEfmt must be 40 for Extended Wave format.\n"); return; } printf(" Data type = %x (0xFFFE = Extended)\n", read2bytes(f)); channels = read2bytes(f); printf(" Number of channels = %u (should be 8)\n", channels); printf(" Sampling rate = %luHz\n", read4bytes(f)); printf(" Bytes per second = %lu\n", read4bytes(f)); printf(" Bytes per sample = %u\n", read2bytes(f)); bits = read2bytes(f); printf(" Bits per sample = %u\n", bits); //read out extended chunk fread(s, (2+2+4+16+4+2+54), 1, f); //len,width,chformat,cue ,len,52x00 while (fread(s, 4, 1, f) == 1) { len = read4bytes(f); s[4] = 0; printf("[%s] (%lu bytes)\n", s, len); if (memcmp(s, "data", 4) == 0) break; for (i = 0; i < (int)len; i++) printf("%02x ", fgetc(f)); printf("\n"); } //get memory for "len" bytes unsigned char * p; p = (unsigned char *)malloc(len); //Copy File to Memory fread(p, len, 1,f); unsigned char transferbuf[8024]; unsigned char ReceiveBuf[8024]; LONG transferlen = 256; LONG ReceivedLen = 0; LONG dwWritten; for (int j = 0; j < 8024; j++) { transferbuf[j] = j; } transferlen = 256; unsigned long pCounter = 0; dwWritten = USB_BulkWrite(2, (p+pCounter), transferlen); pCounter += transferlen; transferlen = 512; for (count = 0; count < 0xFFFFFFFF; count++) { if (pCounter > len) goto loopend; //Write to Xylo, from Memory. dwWritten = USB_BulkWrite(2, (p+pCounter), transferlen); ReceivedLen = USB_BulkRead(4, ReceiveBuf, 512); if ( transferlen != ReceivedLen) { printf("USB_BulkWrite Error\n"); } pCounter += transferlen; } loopend: fclose(f); free(p); } void main(int argc, char * argv[]) { SetPriorityClass(GetCurrentProcess(), 0x00008000); USB_Open(); WaveXToXylo(argv[1]); USB_Close(); }