mirror of
https://github.com/libretro/scummvm.git
synced 2025-03-05 01:38:36 +00:00
AUDIO: Use fixed-point arithmetic in the CMS emulator
This commit is contained in:
parent
e494ef1aa8
commit
8c40151285
@ -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;
|
||||
|
@ -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 */
|
||||
};
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user