1
0
Fork 0
forked from len0rd/rockbox

FS#13539: Resync mikmod plugin with upstream

Brings it up to libmikmod 3.3.12, relased 2024-12-31

Also fix a segfault that only happened on simulators when using
non-default samplerates.

Change-Id: I2ade2d72a00edab5395328fe76a88a88516aac72
This commit is contained in:
Solomon Peachy 2025-01-03 08:34:47 -05:00
parent 08c32cee7c
commit af7ed73f31
29 changed files with 1860 additions and 706 deletions

View file

@ -73,7 +73,8 @@ typedef struct XMINSTHEADER {
ULONG ssize;
} XMINSTHEADER;
#define XMENVCNT (12*2)
#define XMENVPTS (12)
#define XMENVCNT (XMENVPTS*2)
#define XMNOTECNT (8*OCTAVE)
typedef struct XMPATCHHEADER {
UBYTE what[XMNOTECNT]; /* Sample number for all notes */
@ -442,6 +443,12 @@ static void FixEnvelope(ENVPT *cur, int pts)
}
}
/* Check for MOD plugin packed samples */
static int IsSamplePacked(void)
{
return (s->reserved == 0xad) && !(s->type & 0x30);
}
static int LoadInstruments(void)
{
long filend,ck;
@ -513,10 +520,10 @@ static int LoadInstruments(void)
/* we can't trust the envelope point count here, as some
modules have incorrect values (K_OSPACE.XM reports 32 volume
points, for example). */
if(pth.volpts>XMENVCNT/2) pth.volpts=XMENVCNT/2;
if(pth.panpts>XMENVCNT/2) pth.panpts=XMENVCNT/2;
if(pth.volpts>XMENVPTS) pth.volpts=XMENVPTS;
if(pth.panpts>XMENVPTS) pth.panpts=XMENVPTS;
if((_mm_eof(modreader))||(pth.volpts>XMENVCNT/2)||(pth.panpts>XMENVCNT/2)) {
if(_mm_eof(modreader)) {
MikMod_free(nextwav);nextwav=NULL;
MikMod_free(wh);wh=NULL;
_mm_errno = MMERR_LOADING_SAMPLEINFO;
@ -529,7 +536,7 @@ static int LoadInstruments(void)
#if defined __STDC__ || defined _MSC_VER || defined __WATCOMC__ || defined MPW_C
#define XM_ProcessEnvelope(name) \
for (u = 0; u < (XMENVCNT >> 1); u++) { \
for (u = 0; u < XMENVPTS; u++) { \
d-> name##env[u].pos = pth. name##env[u << 1]; \
d-> name##env[u].val = pth. name##env[(u << 1)+ 1]; \
} \
@ -542,14 +549,14 @@ static int LoadInstruments(void)
d-> name##pts=pth. name##pts; \
\
/* scale envelope */ \
for (p=0;p<XMENVCNT/2;p++) \
for (p = 0; p < XMENVPTS; p++) \
d-> name##env[p].val<<=2; \
\
if ((d-> name##flg&EF_ON)&&(d-> name##pts<2)) \
d-> name##flg&=~EF_ON
#else
#define XM_ProcessEnvelope(name) \
for (u = 0; u < (XMENVCNT >> 1); u++) { \
for (u = 0; u < XMENVPTS; u++) { \
d-> name/**/env[u].pos = pth. name/**/env[u << 1]; \
d-> name/**/env[u].val = pth. name/**/env[(u << 1)+ 1]; \
} \
@ -563,7 +570,7 @@ static int LoadInstruments(void)
d-> name/**/pts=pth. name/**/pts; \
\
/* scale envelope */ \
for (p=0;p<XMENVCNT/2;p++) \
for (p = 0; p < XMENVPTS; p++) \
d-> name/**/env[p].val<<=2; \
\
if ((d-> name/**/flg&EF_ON)&&(d-> name/**/pts<2)) \
@ -625,7 +632,11 @@ static int LoadInstruments(void)
_mm_read_string(s->samplename, 22, modreader);
nextwav[of.numsmp+u]=next;
next+=s->length;
if(IsSamplePacked())
next+=((s->length + 1) >> 1) + 16;
else
next+=s->length;
}
if(mh->version>0x0103) {
@ -793,6 +804,11 @@ static int XM_Load(int curious)
if(s->type&0x3) q->flags|=SF_LOOP;
if(s->type&0x2) q->flags|=SF_BIDI;
if(s->type&0x10) q->flags|=SF_16BITS;
if(IsSamplePacked()) {
q->flags &= ~SF_DELTA;
q->flags |= SF_ADPCM4;
}
}
d=of.instruments;