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);
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
class Cartridge {
@ -90,6 +90,11 @@ public:
return rc;
}
/**
* Loads sysex stream
* Returns 0 if it was parsed sucessfully
* Returns -1 if it cannot open the stream
*/
int load(InputStream &fis) {
uint8 buffer[65535];
int sz = fis.read(buffer, 65535);
@ -98,8 +103,17 @@ public:
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) {
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 tmp[65535];
uint8 *pos = tmp;
@ -113,16 +127,14 @@ public:
while(size >= 4104) {
// random data
if ( pos[0] != 0xF0 ) {
if ( status != 0 )
if ( status != 3 )
return status;
memcpy(voiceData, pos+6, 4096);
TRACE("SYSEX Header not found, loading random data");
return 2;
}
pos[3] = 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);
if ( sysexChecksum(voiceData + 6, 4096) == pos[4102] )
status = 0;
@ -143,6 +155,12 @@ public:
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;
}
@ -168,7 +186,7 @@ public:
}
// 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;
bool found = 0;

Loading…
Cancel
Save