summaryrefslogtreecommitdiff
path: root/audio/stymulator/files/patch-stsoundlib__Ymload.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'audio/stymulator/files/patch-stsoundlib__Ymload.cpp')
-rw-r--r--audio/stymulator/files/patch-stsoundlib__Ymload.cpp647
1 files changed, 0 insertions, 647 deletions
diff --git a/audio/stymulator/files/patch-stsoundlib__Ymload.cpp b/audio/stymulator/files/patch-stsoundlib__Ymload.cpp
deleted file mode 100644
index 9b5bd81f3e2c..000000000000
--- a/audio/stymulator/files/patch-stsoundlib__Ymload.cpp
+++ /dev/null
@@ -1,647 +0,0 @@
---- ./stsoundlib/Ymload.cpp.orig 2010-04-23 13:49:47.000000000 +0200
-+++ ./stsoundlib/Ymload.cpp 2010-04-23 13:50:07.000000000 +0200
-@@ -51,61 +51,98 @@
- }
- }
-
--char *mstrdup(char *in)
-+void myFree(void **pPtr)
-+{
-+ if (*pPtr) free(*pPtr);
-+ *pPtr = NULL;
-+}
-+
-+char *mstrdup(const char *in)
- {
- char *out = (char*)malloc(strlen(in)+1);
- if (out) strcpy(out,in);
- return out;
- }
-
--ymu32 readMotorolaDword(ymu8 **ptr)
-+ymu32 readMotorolaDword(ymu8 **ptr, ymint *ptr_size)
- {
--ymu32 n;
-+ymu32 n = 0;
- ymu8 *p = *ptr;
--
-- n = (p[0]<<24)|(p[1]<<16)|(p[2]<<8)|p[3];
-- p+=4;
-- *ptr = p;
-+ if (*ptr_size>=4)
-+ {
-+ n = (p[0]<<24)|(p[1]<<16)|(p[2]<<8)|p[3];
-+ p+=4;
-+ *ptr = p;
-+ }
-+ (*ptr_size)+=4;
- return n;
- }
-
--ymu16 readMotorolaWord(ymu8 **ptr)
-+ymu16 readMotorolaWord(ymu8 **ptr, ymint *ptr_size)
- {
--ymu16 n;
-+ymu16 n = 0;
- ymu8 *p = *ptr;
--
-- n = (p[0]<<8)|p[1];
-- p+=2;
-- *ptr = p;
-+ if (*ptr_size>=2)
-+ {
-+ n = (p[0]<<8)|p[1];
-+ p+=2;
-+ *ptr = p;
-+ }
-+ (*ptr_size)+=2;
- return n;
- }
-
--ymchar *readNtString(ymchar **ptr)
-+ymchar *readNtString(ymchar **ptr, ymint *ptr_size)
- {
- ymchar *p;
-+ymint len = 0;
-
-- p = mstrdup(*ptr);
-- (*ptr) += strlen(*ptr)+1;
-+ if (*ptr_size<=0)
-+ {
-+ (*ptr_size)-=1;
-+ return mstrdup("");
-+ }
-+ p=*ptr;
-+ while(!*p)
-+ {
-+ p++;
-+ ptr_size--;
-+ len++;
-+ if (*ptr_size==0)
-+ {
-+ (*ptr_size)-=1;
-+ return mstrdup("");
-+ }
-+ }
-+
-+ p = mstrdup(*ptr);
-+ (*ptr) += len+1;
- return p;
- }
-
--yms32 ReadLittleEndian32(ymu8 *pLittle)
-+yms32 ReadLittleEndian32(ymu8 *pLittle, ymint ptr_size)
- {
-- yms32 v = ( (pLittle[0]<<0) |
-+ yms32 v = 0;
-+ if (ptr_size>=4)
-+ {
-+ v = ( (pLittle[0]<<0) |
- (pLittle[1]<<8) |
- (pLittle[2]<<16) |
- (pLittle[3]<<24));
--
-+ }
- return v;
- }
-
--yms32 ReadBigEndian32(ymu8 *pBig)
-+yms32 ReadBigEndian32(ymu8 *pBig, ymint ptr_size)
- {
-- yms32 v = ( (pBig[0]<<24) |
-+ yms32 v = 0;
-+ if (ptr_size>=4)
-+ {
-+ v = ( (pBig[0]<<24) |
- (pBig[1]<<16) |
- (pBig[2]<<8) |
-- (pBig[3]<<0));
--
-+ (pBig[3]<<0));
-+ }
- return v;
- }
-
-@@ -114,6 +151,13 @@
- lzhHeader_t *pHeader;
- ymu8 *pNew;
- ymu8 *pSrc;
-+ ymint ptr_left = fileSize;
-+ ymint dummy;
-+
-+ if (ptr_left < (ymint)sizeof(lzhHeader_t))
-+ {
-+ return pBigMalloc;
-+ }
-
- pHeader = (lzhHeader_t*)pBigMalloc;
-
-@@ -123,8 +167,6 @@
- return pBigMalloc;
- }
-
-- fileSize = (ymu32)-1;
--
- if (pHeader->level != 0) // NOTE: Endianness works because value is 0
- { // Compression LH5, header !=0 : Error.
- free(pBigMalloc);
-@@ -133,7 +175,8 @@
- return NULL;
- }
-
-- fileSize = ReadLittleEndian32((ymu8*)&pHeader->original);
-+ dummy = 4;
-+ fileSize = ReadLittleEndian32((ymu8*)&pHeader->original, dummy);
- pNew = (ymu8*)malloc(fileSize);
- if (!pNew)
- {
-@@ -144,10 +187,20 @@
- }
-
- pSrc = pBigMalloc+sizeof(lzhHeader_t)+pHeader->name_lenght; // NOTE: Endianness works because name_lenght is a byte
-+ ptr_left -= sizeof(lzhHeader_t)+pHeader->name_lenght;
-
- pSrc += 2; // skip CRC16
-+ ptr_left -= 2;
-
-- const int packedSize = ReadLittleEndian32((ymu8*)&pHeader->packed);
-+ dummy = 4;
-+ const int packedSize = ReadLittleEndian32((ymu8*)&pHeader->packed, dummy);
-+
-+ if (packedSize > ptr_left)
-+ {
-+ setLastError("File too small");
-+ free(pNew);
-+ return pBigMalloc;
-+ }
-
- // alloc space for depacker and depack data
- CLzhDepacker *pDepacker = new CLzhDepacker;
-@@ -229,19 +282,29 @@
- {
- ymu8 *pUD;
- ymu8 *ptr;
-+ ymint ptr_size = fileSize;
- ymint skip;
- ymint i;
- ymu32 sampleSize;
- yms32 tmp;
- ymu32 id;
--
-
-- id = ReadBigEndian32((unsigned char*)pBigMalloc);
-+ if (ptr_size < 4)
-+ {
-+ setLastError("File too small");
-+ return YMFALSE;
-+ }
-+ id = ReadBigEndian32((unsigned char*)pBigMalloc, ptr_size);
- switch (id)
- {
-- case 'YM2!': // MADMAX specific.
-+ case 0x594d3221 /*'YM2!'*/: // MADMAX specific.
- songType = YM_V2;
- nbFrame = (fileSize-4)/14;
-+ if (nbFrame == 0)
-+ {
-+ setLastError("No frames in file");
-+ return YMFALSE;
-+ }
- loopFrame = 0;
- ymChip.setClock(ATARI_CLOCK);
- setPlayerRate(50);
-@@ -256,9 +319,14 @@
- pSongPlayer = mstrdup("YM-Chip driver.");
- break;
-
-- case 'YM3!': // Standart YM-Atari format.
-+ case 0x594d3321 /*'YM3!'*/: // Standart YM-Atari format.
- songType = YM_V3;
- nbFrame = (fileSize-4)/14;
-+ if (nbFrame == 0)
-+ {
-+ setLastError("No frames in file");
-+ return YMFALSE;
-+ }
- loopFrame = 0;
- ymChip.setClock(ATARI_CLOCK);
- setPlayerRate(50);
-@@ -273,11 +341,24 @@
- pSongPlayer = mstrdup("YM-Chip driver.");
- break;
-
-- case 'YM3b': // Standart YM-Atari format + Loop info.
-+ case 0x594d3362 /*'YM3b'*/: // Standart YM-Atari format + Loop info.
-+ if (ptr_size < 4)
-+ {
-+ setLastError("File too small");
-+ return YMFALSE;
-+ }
- pUD = (ymu8*)(pBigMalloc+fileSize-4);
- songType = YM_V3;
-- nbFrame = (fileSize-4)/14;
-- loopFrame = ReadLittleEndian32(pUD);
-+ nbFrame = (fileSize-8)/14;
-+ if (nbFrame == 0)
-+ {
-+ setLastError("No frames in file");
-+ return YMFALSE;
-+ }
-+ {
-+ ymint dummy = 4;
-+ loopFrame = ReadLittleEndian32(pUD, dummy);
-+ }
- ymChip.setClock(ATARI_CLOCK);
- setPlayerRate(50);
- pDataStream = pBigMalloc+4;
-@@ -291,35 +372,62 @@
- pSongPlayer = mstrdup("YM-Chip driver.");
- break;
-
-- case 'YM4!': // Extended ATARI format.
-+ case 0x594d3421 /*'YM4!'*/: // Extended ATARI format.
- setLastError("No more YM4! support. Use YM5! format.");
- return YMFALSE;
- break;
-
-- case 'YM5!': // Extended YM2149 format, all machines.
-- case 'YM6!': // Extended YM2149 format, all machines.
-+ case 0x594d3521 /*'YM5!'*/: // Extended YM2149 format, all machines.
-+ case 0x594d3621 /*'YM6!'*/: // Extended YM2149 format, all machines.
-+ if (ptr_size < 12)
-+ {
-+ setLastError("File too small");
-+ return YMFALSE;
-+ }
- if (strncmp((const char*)(pBigMalloc+4),"LeOnArD!",8))
- {
- setLastError("Not a valid YM format !");
- return YMFALSE;
- }
- ptr = pBigMalloc+12;
-- nbFrame = readMotorolaDword(&ptr);
-- setAttrib(readMotorolaDword(&ptr));
-- nbDrum = readMotorolaWord(&ptr);
-- ymChip.setClock(readMotorolaDword(&ptr));
-- setPlayerRate(readMotorolaWord(&ptr));
-- loopFrame = readMotorolaDword(&ptr);
-- skip = readMotorolaWord(&ptr);
-+ ptr_size -= 12;
-+ nbFrame = readMotorolaDword(&ptr, &ptr_size);
-+ setAttrib(readMotorolaDword(&ptr, &ptr_size));
-+ nbDrum = readMotorolaWord(&ptr, &ptr_size);
-+ ymChip.setClock(readMotorolaDword(&ptr, &ptr_size));
-+ setPlayerRate(readMotorolaWord(&ptr, &ptr_size));
-+ loopFrame = readMotorolaDword(&ptr, &ptr_size);
-+ skip = readMotorolaWord(&ptr, &ptr_size);
- ptr += skip;
-+ ptr_size -= skip;
-+ if (ptr_size <= 0)
-+ {
-+ setLastError("File too small");
-+ return YMFALSE;
-+ }
- if (nbDrum>0)
- {
-- pDrumTab=(digiDrum_t*)malloc(nbDrum*sizeof(digiDrum_t));
-+ pDrumTab=(digiDrum_t*)calloc(nbDrum, sizeof(digiDrum_t));
- for (i=0;i<nbDrum;i++)
- {
-- pDrumTab[i].size = readMotorolaDword(&ptr);
-+ pDrumTab[i].size = readMotorolaDword(&ptr, &ptr_size);
-+ if (ptr_size <= 0)
-+ {
-+ setLastError("File too small");
-+ goto error_out;
-+ }
- if (pDrumTab[i].size)
- {
-+ if (pDrumTab[i].size >= 0x80000000)
-+ {
-+ setLastError("To big drumtab");
-+ goto error_out;
-+ }
-+ if (ptr_size<(ymint)pDrumTab[i].size)
-+ {
-+ setLastError("File too small");
-+ goto error_out;
-+ }
- pDrumTab[i].pData = (ymu8*)malloc(pDrumTab[i].size);
- memcpy(pDrumTab[i].pData,ptr,pDrumTab[i].size);
- if (attrib&A_DRUM4BITS)
-@@ -328,23 +436,26 @@
- ymu8 *pw = pDrumTab[i].pData;
- for (j=0;j<pDrumTab[i].size;j++)
- {
-- *pw++ = ymVolumeTable[(*pw)&15]>>7;
-+ *pw = ymVolumeTable[(*pw)&15]>>7;
-+ pw++;
- }
- }
- ptr += pDrumTab[i].size;
-- }
-- else
-- {
-- pDrumTab[i].pData = NULL;
-+ ptr_size -= pDrumTab[i].size;
- }
- }
- attrib &= (~A_DRUM4BITS);
- }
-- pSongName = readNtString((char**)&ptr);
-- pSongAuthor = readNtString((char**)&ptr);
-- pSongComment = readNtString((char**)&ptr);
-+ pSongName = readNtString((char**)&ptr, &ptr_size);
-+ pSongAuthor = readNtString((char**)&ptr, &ptr_size);
-+ pSongComment = readNtString((char**)&ptr, &ptr_size);
-+ if (ptr_size <= 0)
-+ {
-+ setLastError("File too small");
-+ goto error_out;
-+ }
- songType = YM_V5;
-- if (id=='YM6!')
-+ if (id==0x594d3621/*'YM6!'*/)
- {
- songType = YM_V6;
- pSongType = mstrdup("YM 6");
-@@ -353,13 +464,28 @@
- {
- pSongType = mstrdup("YM 5");
- }
-+ if ((nbFrame >= 0x08000000) || (nbFrame < 0))
-+ {
-+ setLastError("Too many frames");
-+ goto error_out;
-+ }
-+ if (ptr_size < (ymint)(nbFrame * 16))
-+ {
-+ setLastError("File too small");
-+ goto error_out;
-+ }
- pDataStream = ptr;
- streamInc = 16;
- setAttrib(A_STREAMINTERLEAVED|A_TIMECONTROL);
- pSongPlayer = mstrdup("YM-Chip driver.");
- break;
-
-- case 'MIX1': // ATARI Remix digit format.
-+ case 0x4d495831 /*'MIX1'*/: // ATARI Remix digit format.
-+ if (ptr_size < 12)
-+ {
-+ setLastError("File too small");
-+ return YMFALSE;
-+ }
-
- if (strncmp((const char*)(pBigMalloc+4),"LeOnArD!",8))
- {
-@@ -367,23 +493,50 @@
- return YMFALSE;
- }
- ptr = pBigMalloc+12;
-+ ptr_size -= 12;
- songType = YM_MIX1;
-- tmp = readMotorolaDword(&ptr);
-+ tmp = readMotorolaDword(&ptr, &ptr_size);
- setAttrib(0);
- if (tmp&1) setAttrib(A_DRUMSIGNED);
-- sampleSize = readMotorolaDword(&ptr);
-- nbMixBlock = readMotorolaDword(&ptr);
-+ sampleSize = readMotorolaDword(&ptr, &ptr_size);
-+ nbMixBlock = readMotorolaDword(&ptr, &ptr_size);
-+ if (ptr_size <= 0)
-+ {
-+ setLastError("File too small");
-+ goto error_out;
-+ }
-+ if (sampleSize <= 0)
-+ {
-+ setLastError("Invalid sampleSize");
-+ goto error_out;
-+ }
-+ if (nbMixBlock <= 0)
-+ {
-+ setLastError("Invalid number of mixblocks");
-+ goto error_out;
-+ }
- pMixBlock = (mixBlock_t*)malloc(nbMixBlock*sizeof(mixBlock_t));
- for (i=0;i<nbMixBlock;i++)
- { // Lecture des block-infos.
-- pMixBlock[i].sampleStart = readMotorolaDword(&ptr);
-- pMixBlock[i].sampleLength = readMotorolaDword(&ptr);
-- pMixBlock[i].nbRepeat = readMotorolaWord(&ptr);
-- pMixBlock[i].replayFreq = readMotorolaWord(&ptr);
-+ pMixBlock[i].sampleStart = readMotorolaDword(&ptr, &ptr_size);
-+ pMixBlock[i].sampleLength = readMotorolaDword(&ptr, &ptr_size);
-+ pMixBlock[i].nbRepeat = readMotorolaWord(&ptr, &ptr_size);
-+ pMixBlock[i].replayFreq = readMotorolaWord(&ptr, &ptr_size);
-+ }
-+ pSongName = readNtString((char**)&ptr, &ptr_size);
-+ pSongAuthor = readNtString((char**)&ptr, &ptr_size);
-+ pSongComment = readNtString((char**)&ptr, &ptr_size);
-+
-+ if (sampleSize>=0x80000000)
-+ {
-+ setLastError("Invalid sampleSize");
-+ goto error_out;
-+ }
-+ if (ptr_size < (ymint)sampleSize)
-+ {
-+ setLastError("File too small");
-+ goto error_out;
- }
-- pSongName = readNtString((char**)&ptr);
-- pSongAuthor = readNtString((char**)&ptr);
-- pSongComment = readNtString((char**)&ptr);
-
- pBigSampleBuffer = (unsigned char*)malloc(sampleSize);
- memcpy(pBigSampleBuffer,ptr,sampleSize);
-@@ -400,8 +553,8 @@
-
- break;
-
-- case 'YMT1': // YM-Tracker
-- case 'YMT2': // YM-Tracker
-+ case 0x594d5431 /*'YMT1'*/: // YM-Tracker
-+ case 0x594d5432 /*'YMT2'*/: // YM-Tracker
- /*;
- ; Format du YM-Tracker-1
- ;
-@@ -418,33 +571,55 @@
- ; NT Music comment
- ; nb digi *
- */
-+ if (ptr_size < 12)
-+ {
-+ setLastError("File too small");
-+ return YMFALSE;
-+ }
-+
- if (strncmp((const char*)(pBigMalloc+4),"LeOnArD!",8))
- {
- setLastError("Not a valid YM format !");
- return YMFALSE;
- }
- ptr = pBigMalloc+12;
-+ ptr_size -= 12;
- songType = YM_TRACKER1;
-- nbVoice = readMotorolaWord(&ptr);
-- setPlayerRate(readMotorolaWord(&ptr));
-- nbFrame= readMotorolaDword(&ptr);
-- loopFrame = readMotorolaDword(&ptr);
-- nbDrum = readMotorolaWord(&ptr);
-- attrib = readMotorolaDword(&ptr);
-- pSongName = readNtString((char**)&ptr);
-- pSongAuthor = readNtString((char**)&ptr);
-- pSongComment = readNtString((char**)&ptr);
-+ nbVoice = readMotorolaWord(&ptr, &ptr_size);
-+ setPlayerRate(readMotorolaWord(&ptr, &ptr_size));
-+ nbFrame= readMotorolaDword(&ptr, &ptr_size);
-+ loopFrame = readMotorolaDword(&ptr, &ptr_size);
-+ nbDrum = readMotorolaWord(&ptr, &ptr_size);
-+ attrib = readMotorolaDword(&ptr, &ptr_size);
-+ pSongName = readNtString((char**)&ptr, &ptr_size);
-+ pSongAuthor = readNtString((char**)&ptr, &ptr_size);
-+ pSongComment = readNtString((char**)&ptr, &ptr_size);
-+ if (ptr_size < 0)
-+ {
-+ setLastError("File too small");
-+ return YMFALSE;
-+ }
- if (nbDrum>0)
- {
-- pDrumTab=(digiDrum_t*)malloc(nbDrum*sizeof(digiDrum_t));
-+ pDrumTab=(digiDrum_t*)calloc(nbDrum, sizeof(digiDrum_t));
- for (i=0;i<(ymint)nbDrum;i++)
- {
-- pDrumTab[i].size = readMotorolaWord(&ptr);
-+ pDrumTab[i].size = readMotorolaWord(&ptr, &ptr_size);
-+ if (ptr_size < 0)
-+ {
-+ setLastError("File too small");
-+ goto error_out;
-+ }
- pDrumTab[i].repLen = pDrumTab[i].size;
-- if ('YMT2' == id)
-+ if (0x594d5432/*'YMT2'*/ == id)
- {
-- pDrumTab[i].repLen = readMotorolaWord(&ptr); // repLen
-- readMotorolaWord(&ptr); // flag
-+ pDrumTab[i].repLen = readMotorolaWord(&ptr, &ptr_size); // repLen
-+ readMotorolaWord(&ptr, &ptr_size); // flag
-+ if (ptr_size < 0)
-+ {
-+ setLastError("File too small");
-+ goto error_out;
-+ }
- }
- if (pDrumTab[i].repLen>pDrumTab[i].size)
- {
-@@ -453,19 +628,27 @@
-
- if (pDrumTab[i].size)
- {
-+ if (pDrumTab[i].size >= 0x80000000)
-+ {
-+ setLastError("Drumtab to big");
-+ goto error_out;
-+ }
-+ if (ptr_size<(ymint)pDrumTab[i].size)
-+ {
-+ setLastError("File too small");
-+ goto error_out;
-+ }
-+
- pDrumTab[i].pData = (ymu8*)malloc(pDrumTab[i].size);
- memcpy(pDrumTab[i].pData,ptr,pDrumTab[i].size);
- ptr += pDrumTab[i].size;
-- }
-- else
-- {
-- pDrumTab[i].pData = NULL;
-+ ptr_size -= pDrumTab[i].size;
- }
- }
- }
-
- ymTrackerFreqShift = 0;
-- if ('YMT2' == id)
-+ if (0x594d5432/*'YMT2'*/ == id)
- {
- ymTrackerFreqShift = (attrib>>28)&15;
- attrib &= 0x0fffffff;
-@@ -476,18 +659,33 @@
- pSongType = mstrdup("YM-T1");
- }
-
-+ if ((nbVoice > MAX_VOICE) || (nbVoice < 0))
-+ {
-+ setLastError("Too many voices");
-+ goto error_out;
-+ }
-+ if ((nbFrame >= (ymint)(0x80000000 / (MAX_VOICE * (sizeof(ymTrackerLine_t))))) || (nbFrame < 0)) /* ymTrackerLine_t has a 2^N size */
-+ {
-+ setLastError("Too many frames");
-+ goto error_out;
-+ }
-+ if (ptr_size < (ymint)(sizeof(ymTrackerLine_t) * nbVoice * nbFrame))
-+ {
-+ setLastError("File too small");
-+ goto error_out;
-+ }
-
- pDataStream = ptr;
- ymChip.setClock(ATARI_CLOCK);
-
- ymTrackerInit(100); // 80% de volume maxi.
-- streamInc = 16;
-+ streamInc = 16; /* not needed, since this is only used for YMx formats */
- setTimeControl(YMTRUE);
- pSongPlayer = mstrdup("Universal Tracker");
- break;
-
- default:
-- setLastError("Unknow YM format !");
-+ setLastError("Unknown YM format !");
- return YMFALSE;
- break;
- }
-@@ -498,6 +696,25 @@
- }
-
- return YMTRUE;
-+error_out:
-+ for (i=0;i<nbDrum;i++)
-+ {
-+ if (pDrumTab[i].pData)
-+ myFree((void **)&pDrumTab[i].pData);
-+ }
-+ if (nbDrum>0)
-+ {
-+ myFree((void **)&pDrumTab);
-+ nbDrum=0;
-+ }
-+ myFree((void **)&pSongName);
-+ myFree((void **)&pSongAuthor);
-+ myFree((void **)&pSongComment);
-+ myFree((void **)&pSongType); /* <- never needed, but we keep it for purity */
-+ myFree((void **)&pSongPlayer); /* <- never needed, but we keep it for purity */
-+ myFree((void **)&pMixBlock);
-+ myFree((void **)&pBigSampleBuffer); /* <- never needed, but we keep it for purity */
-+ return YMFALSE;
- }
-
-
-@@ -645,12 +862,6 @@
- return YMTRUE;
- }
-
--void myFree(void **pPtr)
--{
-- if (*pPtr) free(*pPtr);
-- *pPtr = NULL;
--}
--
- void CYmMusic::unLoad(void)
- {
-