[Scummvm-git-logs] scummvm master -> 8c401512853228acadd1a52e566c63c9dd94f44f

sev- noreply at scummvm.org
Mon Nov 28 23:14:04 UTC 2022


This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
8c40151285 AUDIO: Use fixed-point arithmetic in the CMS emulator


Commit: 8c401512853228acadd1a52e566c63c9dd94f44f
    https://github.com/scummvm/scummvm/commit/8c401512853228acadd1a52e566c63c9dd94f44f
Author: Cameron Cawley (ccawley2011 at gmail.com)
Date: 2022-11-29T00:14:00+01:00

Commit Message:
AUDIO: Use fixed-point arithmetic in the CMS emulator

Changed paths:
    audio/softsynth/cms.cpp
    audio/softsynth/cms.h


diff --git a/audio/softsynth/cms.cpp b/audio/softsynth/cms.cpp
index cf13456cba0..5d2c3e8d38a 100644
--- a/audio/softsynth/cms.cpp
+++ b/audio/softsynth/cms.cpp
@@ -30,8 +30,9 @@
 
 #define LEFT	0x00
 #define RIGHT	0x01
+#define FRAC_ONE_CMS (1UL << 8)
 /*#define MASTER_CLOCK 14318180/2 */
-#define MASTER_CLOCK 7159090
+#define MASTER_CLOCK (7159090UL * FRAC_ONE_CMS)
 
 static const byte envelope[8][64] = {
 	/* zero amplitude */
@@ -166,9 +167,9 @@ void CMSEmulator::update(int chip, int16 *buffer, int length) {
 
 	for (ch = 0; ch < 2; ch++) {
 		switch (saa->noise_params[ch]) {
-		case 0: saa->noise[ch].freq = MASTER_CLOCK/256  * 2; break;
-		case 1: saa->noise[ch].freq = MASTER_CLOCK/512  * 2; break;
-		case 2: saa->noise[ch].freq = MASTER_CLOCK/1024 * 2; break;
+		case 0: saa->noise[ch].freq = (MASTER_CLOCK * 2) / 256;   break;
+		case 1: saa->noise[ch].freq = (MASTER_CLOCK * 2) / 512;   break;
+		case 2: saa->noise[ch].freq = (MASTER_CLOCK * 2) / 1024;  break;
 		case 3: saa->noise[ch].freq = saa->channels[ch * 3].freq; break;
 		default: break;
 		}
@@ -180,18 +181,18 @@ void CMSEmulator::update(int chip, int16 *buffer, int length) {
 
 		/* for each channel */
 		for (ch = 0; ch < 6; ch++) {
-			if (saa->channels[ch].freq == 0.0)
-				saa->channels[ch].freq = (double)((2 * MASTER_CLOCK/512) << saa->channels[ch].octave) /
-					(511.0 - (double)saa->channels[ch].frequency);
+			if (saa->channels[ch].freq == 0)
+				saa->channels[ch].freq = (((2 * MASTER_CLOCK) / 512) << saa->channels[ch].octave) /
+					(511 - saa->channels[ch].frequency);
 
 			/* check the actual position in the square wave */
 			saa->channels[ch].counter -= saa->channels[ch].freq;
 			while (saa->channels[ch].counter < 0) {
 				/* calculate new frequency now after the half wave is updated */
-				saa->channels[ch].freq = (double)((2 * MASTER_CLOCK/512) << saa->channels[ch].octave) /
-					(511.0 - (double)saa->channels[ch].frequency);
+				saa->channels[ch].freq = (((2 * MASTER_CLOCK) / 512) << saa->channels[ch].octave) /
+					(511 - saa->channels[ch].frequency);
 
-				saa->channels[ch].counter += _sampleRate;
+				saa->channels[ch].counter += _sampleRate * FRAC_ONE_CMS;
 				saa->channels[ch].level ^= 1;
 
 				/* eventually clock the envelope counters */
@@ -225,7 +226,7 @@ void CMSEmulator::update(int chip, int16 *buffer, int length) {
 			/* check the actual position in noise generator */
 			saa->noise[ch].counter -= saa->noise[ch].freq;
 			while (saa->noise[ch].counter < 0) {
-				saa->noise[ch].counter += _sampleRate;
+				saa->noise[ch].counter += _sampleRate * FRAC_ONE_CMS;
 				if (((saa->noise[ch].level & 0x4000) == 0) == ((saa->noise[ch].level & 0x0040) == 0) )
 					saa->noise[ch].level = (saa->noise[ch].level << 1) | 1;
 				else
@@ -336,7 +337,7 @@ void CMSEmulator::portWriteIntern(int chip, int offset, int data) {
 			/* Synch & Reset generators */
 			for (i = 0; i < 6; i++) {
 				saa->channels[i].level = 0;
-				saa->channels[i].counter = 0.0;
+				saa->channels[i].counter = 0;
 			}
 		}
 		break;
diff --git a/audio/softsynth/cms.h b/audio/softsynth/cms.h
index 4a956d303d7..95048616c92 100644
--- a/audio/softsynth/cms.h
+++ b/audio/softsynth/cms.h
@@ -34,16 +34,16 @@ struct saa1099_channel {
 	int envelope[2];			/* envelope (0x00..0x0f or 0x10 == off) */
 
 	/* vars to simulate the square wave */
-	double counter;
-	double freq;
+	int32 counter;
+	int32 freq;
 	int level;
 };
 
 /* this structure defines a noise channel */
 struct saa1099_noise {
 	/* vars to simulate the noise generator output */
-	double counter;
-	double freq;
+	int32 counter;
+	int32 freq;
 	int level;				/* noise polynomal shifter */
 };
 




More information about the Scummvm-git-logs mailing list