Return random data even if the syx file doesn't contain any header

pull/1/head
asb2m10 9 years ago
parent 6b69a5bcc1
commit d016da2c27
  1. 28
      Source/PluginData.h

@ -30,7 +30,7 @@
uint8_t sysexChecksum(const uint8_t *sysex, int size); uint8_t sysexChecksum(const uint8_t *sysex, int size);
void exportSysexPgm(uint8_t *dest, uint8_t *src); void exportSysexPgm(uint8_t *dest, uint8_t *src);
#define SYSEX_HEADER { 0xF0, 0x43, 0x00, 0x09, 0x20, 0x00 } #define SYSEX_HEADER { 0xF0, 0x43, 0x00, 0x09, 0x20, 0x00 }
#define SYSEX_SIZE 4104 #define SYSEX_SIZE 4104
class Cartridge { class Cartridge {
@ -90,6 +90,11 @@ public:
return rc; return rc;
} }
/**
* Loads sysex stream
* Returns 0 if it was parsed sucessfully
* Returns -1 if it cannot open the stream
*/
int load(InputStream &fis) { int load(InputStream &fis) {
uint8 buffer[65535]; uint8 buffer[65535];
int sz = fis.read(buffer, 65535); int sz = fis.read(buffer, 65535);
@ -98,8 +103,17 @@ public:
return load(buffer, sz); return load(buffer, sz);
} }
/**
* Loads sysex buffer
* Returns 0 if it was parsed sucessfully
* Returns 1 if sysex checksum didn't match
* Returns 2 if no sysex data found, probably random data
*/
int load(const uint8_t *stream, int size) { int load(const uint8_t *stream, int size) {
const uint8 voiceHeaderBroken[] = { 0xF0, 0x43, 0x00, 0x00, 0x20, 0x00 }; const uint8 voiceHeaderBroken[] = { 0xF0, 0x43, 0x00, 0x00, 0x20, 0x00 };
// I've added a stupid bug that saved the wrong sysex data for dx7 sysex (0.9.1)
// This is there to support this version. One day we will be able to remove this. :(
uint8 voiceHeader[] = SYSEX_HEADER; uint8 voiceHeader[] = SYSEX_HEADER;
uint8 tmp[65535]; uint8 tmp[65535];
uint8 *pos = tmp; uint8 *pos = tmp;
@ -113,16 +127,14 @@ public:
while(size >= 4104) { while(size >= 4104) {
// random data // random data
if ( pos[0] != 0xF0 ) { if ( pos[0] != 0xF0 ) {
if ( status != 0 ) if ( status != 3 )
return status; return status;
memcpy(voiceData, pos+6, 4096); memcpy(voiceData, pos+6, 4096);
TRACE("SYSEX Header not found, loading random data");
return 2; return 2;
} }
pos[3] = 0; pos[3] = 0;
if ( memcmp(pos, voiceHeader, 6) == 0 || memcmp(pos, voiceHeaderBroken, 6) == 0) { if ( memcmp(pos, voiceHeader, 6) == 0 || memcmp(pos, voiceHeaderBroken, 6) == 0) {
TRACE("SYSEX voice header found at %d", pos);
memcpy(voiceData, pos, SYSEX_SIZE); memcpy(voiceData, pos, SYSEX_SIZE);
if ( sysexChecksum(voiceData + 6, 4096) == pos[4102] ) if ( sysexChecksum(voiceData + 6, 4096) == pos[4102] )
status = 0; status = 0;
@ -143,6 +155,12 @@ public:
stream += i; stream += i;
} }
// nothing good has been found, map it then to random data
if ( status > 1 ) {
memcpy(voiceData, pos+6, 4096);
return 2;
}
return status; return status;
} }
@ -168,7 +186,7 @@ public:
} }
// To avoid to erase the performance data, we skip the sysex stream until // To avoid to erase the performance data, we skip the sysex stream until
// we see the header 0xF0, 0x43, 0x00, 0x00, 0x20, 0x00 // we see the header 0xF0, 0x43, 0x00, 0x09, 0x20, 0x00
int pos = 0; int pos = 0;
bool found = 0; bool found = 0;

Loading…
Cancel
Save