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:
parent
08c32cee7c
commit
af7ed73f31
29 changed files with 1860 additions and 706 deletions
|
@ -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;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue