2013-03-26 19:29:37 +01:00
|
|
|
Index: libmikmod-3.2.0/playercode/mplayer.c
|
2009-12-30 00:25:54 +01:00
|
|
|
===================================================================
|
2013-03-26 19:29:37 +01:00
|
|
|
--- 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;
|
2009-12-30 00:25:54 +01:00
|
|
|
|
|
|
|
+#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]={
|
2013-03-26 19:29:37 +01:00
|
|
|
@@ -246,14 +248,14 @@ static int MP_FindEmptyChannel(MODULE *m
|
2009-12-30 00:25:54 +01:00
|
|
|
MP_VOICE *a;
|
|
|
|
ULONG t,k,tvol,pp;
|
|
|
|
|
|
|
|
- for (t=0;t<md_sngchn;t++)
|
|
|
|
+ for (t=0;t<NUMVOICES(mod);t++)
|
|
|
|
if (((mod->voice[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;k<md_sngchn;k++,a++) {
|
|
|
|
+ for (k=0;k<NUMVOICES(mod);k++,a++) {
|
|
|
|
/* allow us to take over a nonexisting sample */
|
|
|
|
if (!a->main.s)
|
|
|
|
return k;
|
2013-03-26 19:29:37 +01:00
|
|
|
@@ -2247,12 +2249,12 @@ static void DoNNAEffects(MODULE *mod, MP
|
2009-12-30 00:25:54 +01:00
|
|
|
|
|
|
|
switch (dat) {
|
|
|
|
case 0x0: /* past note cut */
|
|
|
|
- for (t=0;t<md_sngchn;t++)
|
|
|
|
+ for (t=0;t<NUMVOICES(mod);t++)
|
|
|
|
if (mod->voice[t].master==a)
|
|
|
|
mod->voice[t].main.fadevol=0;
|
|
|
|
break;
|
|
|
|
case 0x1: /* past note off */
|
|
|
|
- for (t=0;t<md_sngchn;t++)
|
|
|
|
+ for (t=0;t<NUMVOICES(mod);t++)
|
|
|
|
if (mod->voice[t].master==a) {
|
|
|
|
mod->voice[t].main.keyoff|=KEY_OFF;
|
|
|
|
if ((!(mod->voice[t].venv.flg & EF_ON))||
|
2013-03-26 19:29:37 +01:00
|
|
|
@@ -2261,7 +2263,7 @@ static void DoNNAEffects(MODULE *mod, MP
|
2009-12-30 00:25:54 +01:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
case 0x2: /* past note fade */
|
|
|
|
- for (t=0;t<md_sngchn;t++)
|
|
|
|
+ for (t=0;t<NUMVOICES(mod);t++)
|
|
|
|
if (mod->voice[t].master==a)
|
|
|
|
mod->voice[t].main.keyoff|=KEY_FADE;
|
|
|
|
break;
|
2013-03-26 19:29:37 +01:00
|
|
|
@@ -2737,7 +2739,7 @@ void pt_NNA(MODULE *mod)
|
2009-12-30 00:25:54 +01:00
|
|
|
if (a->dct!=DCT_OFF) {
|
|
|
|
int t;
|
|
|
|
|
|
|
|
- for (t=0;t<md_sngchn;t++)
|
|
|
|
+ for (t=0;t<NUMVOICES(mod);t++)
|
|
|
|
if ((!Voice_Stopped_internal(t))&&
|
|
|
|
(mod->voice[t].masterchn==channel)&&
|
|
|
|
(a->main.sample==mod->voice[t].main.sample)) {
|
2013-03-26 19:29:37 +01:00
|
|
|
@@ -2979,6 +2981,11 @@ BOOL Player_Init(MODULE* mod)
|
|
|
|
if (!(mod->voice=(MP_VOICE*)MikMod_calloc(md_sngchn,sizeof(MP_VOICE))))
|
2009-12-30 00:25:54 +01:00
|
|
|
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;
|
|
|
|
}
|
2013-03-26 19:29:37 +01:00
|
|
|
@@ -3370,7 +3377,7 @@ MIKMODAPI int Player_QueryVoices(UWORD n
|
2009-12-30 00:25:54 +01:00
|
|
|
|
2013-03-26 19:29:37 +01:00
|
|
|
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;
|