Index: libmikmod-3.2.0/playercode/mplayer.c =================================================================== --- libmikmod-3.2.0.orig/playercode/mplayer.c +++ libmikmod-3.2.0/playercode/mplayer.c @@ -50,6 +50,8 @@ extern long int random(void); /* The currently playing module */ MODULE *pf = NULL; +#define NUMVOICES(mod) (md_sngchn < (mod)->numvoices ? md_sngchn : (mod)->numvoices) + #define HIGH_OCTAVE 2 /* number of above-range octaves */ static UWORD oldperiods[OCTAVE*2]={ @@ -246,14 +248,14 @@ static int MP_FindEmptyChannel(MODULE *m MP_VOICE *a; ULONG t,k,tvol,pp; - for (t=0;tvoice[t].main.kick==KICK_ABSENT)|| (mod->voice[t].main.kick==KICK_ENV))&& Voice_Stopped_internal(t)) return t; tvol=0xffffffUL;t=-1;a=mod->voice; - for (k=0;kmain.s) return k; @@ -2247,12 +2249,12 @@ static void DoNNAEffects(MODULE *mod, MP switch (dat) { case 0x0: /* past note cut */ - for (t=0;tvoice[t].master==a) mod->voice[t].main.fadevol=0; break; case 0x1: /* past note off */ - for (t=0;tvoice[t].master==a) { mod->voice[t].main.keyoff|=KEY_OFF; if ((!(mod->voice[t].venv.flg & EF_ON))|| @@ -2261,7 +2263,7 @@ static void DoNNAEffects(MODULE *mod, MP } break; case 0x2: /* past note fade */ - for (t=0;tvoice[t].master==a) mod->voice[t].main.keyoff|=KEY_FADE; break; @@ -2737,7 +2739,7 @@ void pt_NNA(MODULE *mod) if (a->dct!=DCT_OFF) { int t; - for (t=0;tvoice[t].masterchn==channel)&& (a->main.sample==mod->voice[t].main.sample)) { @@ -2979,6 +2981,11 @@ BOOL Player_Init(MODULE* mod) if (!(mod->voice=(MP_VOICE*)MikMod_calloc(md_sngchn,sizeof(MP_VOICE)))) return 1; + /* mod->numvoices was used during loading to clamp md_sngchn. + After loading it's used to remember how big mod->voice is. + */ + mod->numvoices = md_sngchn; + Player_Init_internal(mod); return 0; } @@ -3370,7 +3377,7 @@ MIKMODAPI int Player_QueryVoices(UWORD n MUTEX_LOCK(vars); if (pf) - for (i = 0; i < md_sngchn; i++) { + for (i = 0; i < numvoices; i++) { vinfo [i].i = pf->voice[i].main.i; vinfo [i].s = pf->voice[i].main.s; vinfo [i].panning = pf->voice [i].main.panning;