[Scummvm-cvs-logs] CVS: scummvm/sound fmopl.cpp,1.3,1.4 fmopl.h,1.1.1.1,1.2

Nicolas Bacca arisme at users.sourceforge.net
Wed Jan 29 13:29:07 CET 2003


Update of /cvsroot/scummvm/scummvm/sound
In directory sc8-pr-cvs1:/tmp/cvs-serv10355/sound

Modified Files:
	fmopl.cpp fmopl.h 
Log Message:
Change AdLib emulation quality for slower devices - added PROP_GET_FMOPL_ENV_BITS and PROP_GET_FMOPL_EG_ENT

Index: fmopl.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/sound/fmopl.cpp,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -d -r1.3 -r1.4
--- fmopl.cpp	8 Sep 2002 01:08:12 -0000	1.3
+++ fmopl.cpp	29 Jan 2003 21:28:37 -0000	1.4
@@ -62,16 +62,16 @@
 
 /* output level entries (envelope,sinwave) */
 /* envelope counter lower bits */
-#define ENV_BITS 16
+int ENV_BITS;
 /* envelope output entries */
-#define EG_ENT   4096
+int EG_ENT;
+
 /* used dynamic memory = EG_ENT*4*4(byte)or EG_ENT*6*4(byte) */
 /* used static  memory = EG_ENT*4 (byte)                     */
-
-#define EG_OFF   ((2*EG_ENT)<<ENV_BITS)  /* OFF          */
-#define EG_DED   EG_OFF
-#define EG_DST   (EG_ENT<<ENV_BITS)      /* DECAY  START */
-#define EG_AED   EG_DST
+int EG_OFF;								 /* OFF */
+int EG_DED;
+int EG_DST;								 /* DECAY START */
+int EG_AED;
 #define EG_AST   0                       /* ATTACK START */
 
 #define EG_STEP (96.0/EG_ENT) /* OPL is 0.1875 dB step  */
@@ -104,61 +104,59 @@
 	-1,-1,-1,-1,-1,-1,-1,-1
 };
 
-#define SC(mydb) ((uint) (mydb / (EG_STEP/2)))
+static uint KSL_TABLE[8 * 16];
 
-static const uint KSL_TABLE[8 * 16] = {
+static const double KSL_TABLE_SEED[8 * 16] = {
 	/* OCT 0 */
-	SC(0.000), SC(0.000), SC(0.000), SC(0.000),
-	SC(0.000), SC(0.000), SC(0.000), SC(0.000),
-	SC(0.000), SC(0.000), SC(0.000), SC(0.000),
-	SC(0.000), SC(0.000), SC(0.000), SC(0.000),
+	0.000, 0.000, 0.000, 0.000,
+	0.000, 0.000, 0.000, 0.000,
+	0.000, 0.000, 0.000, 0.000,
+	0.000, 0.000, 0.000, 0.000,
 	/* OCT 1 */
-	SC(0.000), SC(0.000), SC(0.000), SC(0.000),
-	SC(0.000), SC(0.000), SC(0.000), SC(0.000),
-	SC(0.000), SC(0.750), SC(1.125), SC(1.500),
-	SC(1.875), SC(2.250), SC(2.625), SC(3.000),
+	0.000, 0.000, 0.000, 0.000,
+	0.000, 0.000, 0.000, 0.000,
+	0.000, 0.750, 1.125, 1.500,
+	1.875, 2.250, 2.625, 3.000,
 	/* OCT 2 */
-	SC(0.000), SC(0.000), SC(0.000), SC(0.000),
-	SC(0.000), SC(1.125), SC(1.875), SC(2.625),
-	SC(3.000), SC(3.750), SC(4.125), SC(4.500),
-	SC(4.875), SC(5.250), SC(5.625), SC(6.000),
+	0.000, 0.000, 0.000, 0.000,
+	0.000, 1.125, 1.875, 2.625,
+	3.000, 3.750, 4.125, 4.500,
+	4.875, 5.250, 5.625, 6.000,
 	/* OCT 3 */
-	SC(0.000), SC(0.000), SC(0.000), SC(1.875),
-	SC(3.000), SC(4.125), SC(4.875), SC(5.625),
-	SC(6.000), SC(6.750), SC(7.125), SC(7.500),
-	SC(7.875), SC(8.250), SC(8.625), SC(9.000),
+	0.000, 0.000, 0.000, 1.875,
+	3.000, 4.125, 4.875, 5.625,
+	6.000, 6.750, 7.125, 7.500,
+	7.875, 8.250, 8.625, 9.000,
 	/* OCT 4 */
-	SC(0.000), SC(0.000), SC(3.000), SC(4.875),
-	SC(6.000), SC(7.125), SC(7.875), SC(8.625),
-	SC(9.000), SC(9.750), SC(10.125), SC(10.500),
-	SC(10.875), SC(11.250), SC(11.625), SC(12.000),
+	0.000, 0.000, 3.000, 4.875,
+	6.000, 7.125, 7.875, 8.625,
+	9.000, 9.750, 10.125, 10.500,
+	10.875, 11.250, 11.625, 12.000,
 	/* OCT 5 */
-	SC(0.000), SC(3.000), SC(6.000), SC(7.875),
-	SC(9.000), SC(10.125), SC(10.875), SC(11.625),
-	SC(12.000), SC(12.750), SC(13.125), SC(13.500),
-	SC(13.875), SC(14.250), SC(14.625), SC(15.000),
+	0.000, 3.000, 6.000, 7.875,
+	9.000, 10.125, 10.875, 11.625,
+	12.000, 12.750, 13.125, 13.500,
+	13.875, 14.250, 14.625, 15.000,
 	/* OCT 6 */
-	SC(0.000), SC(6.000), SC(9.000), SC(10.875),
-	SC(12.000), SC(13.125), SC(13.875), SC(14.625),
-	SC(15.000), SC(15.750), SC(16.125), SC(16.500),
-	SC(16.875), SC(17.250), SC(17.625), SC(18.000),
+	0.000, 6.000, 9.000, 10.875,
+	12.000, 13.125, 13.875, 14.625,
+	15.000, 15.750, 16.125, 16.500,
+	16.875, 17.250, 17.625, 18.000,
 	/* OCT 7 */
-	SC(0.000), SC(9.000), SC(12.000), SC(13.875),
-	SC(15.000), SC(16.125), SC(16.875), SC(17.625),
-	SC(18.000), SC(18.750), SC(19.125), SC(19.500),
-	SC(19.875), SC(20.250), SC(20.625), SC(21.000)
+	0.000, 9.000, 12.000, 13.875,
+	15.000, 16.125, 16.875, 17.625,
+	18.000, 18.750, 19.125, 19.500,
+	19.875, 20.250, 20.625, 21.000
 };
-#undef SC
-
 
 /* sustain lebel table (3db per step) */
 /* 0 - 15: 0, 3, 6, 9,12,15,18,21,24,27,30,33,36,39,42,93 (dB)*/
-#define SC(db) (int)(db*((3/EG_STEP)*(1<<ENV_BITS)))+EG_DST
-static const int SL_TABLE[16]={
- SC( 0),SC( 1),SC( 2),SC(3 ),SC(4 ),SC(5 ),SC(6 ),SC( 7),
- SC( 8),SC( 9),SC(10),SC(11),SC(12),SC(13),SC(14),SC(31)
+
+static int SL_TABLE[16];
+
+static const uint SL_TABLE_SEED[16]={
+ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 31
 };
-#undef SC
 
 #define TL_MAX (EG_ENT*2) /* limit(tl + ksr + envelope) + sinwave */
 /* TotalLevel : 48 24 12  6  3 1.5 0.75 (dB) */
@@ -175,7 +173,8 @@
 
 /* envelope output curve table */
 /* attack + decay + OFF */
-static int ENV_CURVE[2*EG_ENT+1];
+//static int ENV_CURVE[2*EG_ENT+1];
+static int ENV_CURVE[2 * 4096+1];   // to keep it static ...
 
 /* multiple table */
 #define ML(a) (int)(a*2)
@@ -212,6 +211,32 @@
 static int vibIncr;
 static int feedback2;		/* connect for SLOT 2 */
 
+/* --------------------- rebuild tables ------------------- */
+
+#define SC_KSL(mydb) ((uint) (mydb / (EG_STEP/2)))
+#define SC_SL(db) (int)(db*((3/EG_STEP)*(1<<ENV_BITS)))+EG_DST
+
+void OPLBuildTables(int ENV_BITS_PARAM, int EG_ENT_PARAM) {
+	int i;
+
+	ENV_BITS = ENV_BITS_PARAM;
+	EG_ENT = EG_ENT_PARAM;
+	EG_OFF =  ((2*EG_ENT)<<ENV_BITS);  /* OFF          */
+	EG_DED = EG_OFF;
+	EG_DST = (EG_ENT<<ENV_BITS);     /* DECAY  START */
+	EG_AED = EG_DST;
+	//EG_STEP = (96.0/EG_ENT);
+
+	for (i=0; i<sizeof(KSL_TABLE_SEED); i++)
+		KSL_TABLE[i] = SC_KSL(KSL_TABLE_SEED[i]);
+
+	for (i=0; i<sizeof(SL_TABLE_SEED); i++)
+		SL_TABLE[i] = SC_SL(SL_TABLE_SEED[i]);
+}
+
+#undef SC_KSL
+#undef SC_SL
+
 /* --------------------- subroutines  --------------------- */
 
 inline int Limit( int val, int max, int min ) {
@@ -431,7 +456,7 @@
 	/* SLOT 1 */
 	SLOT = &CH->SLOT[SLOT1];
 	env_out=OPL_CALC_SLOT(SLOT);
-	if( env_out < EG_ENT-1 )
+	if( env_out < (uint)(EG_ENT-1))
 	{
 		/* PG */
 		if(SLOT->vib) SLOT->Cnt += (SLOT->Incr*vib/VIB_RATE);
@@ -455,7 +480,7 @@
 	/* SLOT 2 */
 	SLOT = &CH->SLOT[SLOT2];
 	env_out=OPL_CALC_SLOT(SLOT);
-	if( env_out < EG_ENT-1 )
+	if( env_out < (uint)(EG_ENT-1) )
 	{
 		/* PG */
 		if(SLOT->vib) SLOT->Cnt += (SLOT->Incr*vib/VIB_RATE);
@@ -537,16 +562,16 @@
 	tone8 = OP_OUT(SLOT8_2,whitenoise,0 );
 
 	/* SD */
-	if( env_sd < EG_ENT-1 )
+	if( env_sd < (uint)(EG_ENT-1) )
 		outd[0] += OP_OUT(SLOT7_1,env_sd, 0)*8;
 	/* TAM */
-	if( env_tam < EG_ENT-1 )
+	if( env_tam < (uint)(EG_ENT-1) )
 		outd[0] += OP_OUT(SLOT8_1,env_tam, 0)*2;
 	/* TOP-CY */
-	if( env_top < EG_ENT-1 )
+	if( env_top < (uint)(EG_ENT-1) )
 		outd[0] += OP_OUT(SLOT7_2,env_top,tone8)*2;
 	/* HH */
-	if( env_hh  < EG_ENT-1 )
+	if( env_hh  < (uint)(EG_ENT-1) )
 		outd[0] += OP_OUT(SLOT7_2,env_hh,tone8)*2;
 }
 
@@ -1144,4 +1169,4 @@
 	/* reload timer */
 	if (OPL->TimerHandler) (OPL->TimerHandler)(OPL->TimerParam+c,(double)OPL->T[c]*OPL->TimerBase);
 	return OPL->status>>7;
-}
+}
\ No newline at end of file

Index: fmopl.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/sound/fmopl.h,v
retrieving revision 1.1.1.1
retrieving revision 1.2
diff -u -d -r1.1.1.1 -r1.2
--- fmopl.h	21 Aug 2002 16:07:41 -0000	1.1.1.1
+++ fmopl.h	29 Jan 2003 21:28:37 -0000	1.2
@@ -135,6 +135,8 @@
 #define OPL_TYPE_YM3526 (0)
 #define OPL_TYPE_YM3812 (OPL_TYPE_WAVESEL)
 
+void OPLBuildTables(int ENV_BITS_PARAM, int EG_ENT_PARAM);
+
 FM_OPL *OPLCreate(int type, int clock, int rate);
 void OPLDestroy(FM_OPL *OPL);
 void OPLSetTimerHandler(FM_OPL *OPL,OPL_TIMERHANDLER TimerHandler,int channelOffset);





More information about the Scummvm-git-logs mailing list