aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source/soundux.cpp40
-rw-r--r--source/soundux.h1
2 files changed, 24 insertions, 17 deletions
diff --git a/source/soundux.cpp b/source/soundux.cpp
index 6f41f64..8c7841b 100644
--- a/source/soundux.cpp
+++ b/source/soundux.cpp
@@ -385,6 +385,7 @@ void S9xFixSoundAfterSnapshotLoad ()
{
SoundData.channels[i].needs_decode = TRUE;
S9xSetSoundFrequency (i, SoundData.channels[i].hertz);
+ SoundData.channels [i].envxx = SoundData.channels [i].envx << ENVX_SHIFT;
SoundData.channels [i].next_sample = 0;
SoundData.channels [i].interpolate = 0;
SoundData.channels [i].previous [0] = (int32) SoundData.channels [i].previous16 [0];
@@ -442,6 +443,7 @@ void S9xSetEnvelopeHeight (int channel, int level)
Channel *ch = &SoundData.channels[channel];
ch->envx = level;
+ ch->envxx = level << ENVX_SHIFT;
ch->left_vol_level = (level * ch->volume_left) / 128;
ch->right_vol_level = (level * ch->volume_right) / 128;
@@ -942,17 +944,18 @@ void MixStereo (int sample_count)
if (ch->env_error >= FIXED_POINT)
{
uint32 step = ch->env_error >> FIXED_POINT_SHIFT;
- int32 envx_shifted;
switch (ch->state)
{
case SOUND_ATTACK:
ch->env_error &= FIXED_POINT_REMAINDER;
ch->envx += step << 1;
+ ch->envxx = ch->envx << ENVX_SHIFT;
if (ch->envx >= 126)
{
ch->envx = 127;
+ ch->envxx = 127 << ENVX_SHIFT;
ch->state = SOUND_DECAY;
if (ch->sustain_level != 8)
{
@@ -967,13 +970,12 @@ void MixStereo (int sample_count)
break;
case SOUND_DECAY:
- envx_shifted = ch->envx << ENVX_SHIFT;
while (ch->env_error >= FIXED_POINT)
{
- envx_shifted = (envx_shifted >> 8) * 255;
+ ch->envxx = (ch->envxx >> 8) * 255;
ch->env_error -= FIXED_POINT;
}
- ch->envx = envx_shifted >> ENVX_SHIFT;
+ ch->envx = ch->envxx >> ENVX_SHIFT;
if (ch->envx <= ch->envx_target)
{
if (ch->envx <= 0)
@@ -987,13 +989,12 @@ void MixStereo (int sample_count)
break;
case SOUND_SUSTAIN:
- envx_shifted = ch->envx << ENVX_SHIFT;
while (ch->env_error >= FIXED_POINT)
{
- envx_shifted = (envx_shifted >> 8) * 255;
+ ch->envxx = (ch->envxx >> 8) * 255;
ch->env_error -= FIXED_POINT;
}
- ch->envx = envx_shifted >> ENVX_SHIFT;
+ ch->envx = ch->envxx >> ENVX_SHIFT;
if (ch->envx <= 0)
{
S9xAPUSetEndOfSample (J, ch);
@@ -1002,13 +1003,12 @@ void MixStereo (int sample_count)
break;
case SOUND_RELEASE:
- envx_shifted = ch->envx << ENVX_SHIFT;
while (ch->env_error >= FIXED_POINT)
{
- envx_shifted -= (MAX_ENVELOPE_HEIGHT << ENVX_SHIFT) / 256;
+ ch->envxx -= (MAX_ENVELOPE_HEIGHT << ENVX_SHIFT) / 256;
ch->env_error -= FIXED_POINT;
}
- ch->envx = envx_shifted >> ENVX_SHIFT;
+ ch->envx = ch->envxx >> ENVX_SHIFT;
if (ch->envx <= 0)
{
S9xAPUSetEndOfSample (J, ch);
@@ -1019,10 +1019,12 @@ void MixStereo (int sample_count)
case SOUND_INCREASE_LINEAR:
ch->env_error &= FIXED_POINT_REMAINDER;
ch->envx += step << 1;
+ ch->envxx = ch->envx << ENVX_SHIFT;
if (ch->envx >= 126)
{
ch->envx = 127;
+ ch->envxx = 127 << ENVX_SHIFT;
ch->state = SOUND_GAIN;
ch->mode = MODE_GAIN;
S9xSetEnvRate (ch, 0, -1, 0);
@@ -1032,23 +1034,24 @@ void MixStereo (int sample_count)
case SOUND_INCREASE_BENT_LINE:
if (ch->envx >= (MAX_ENVELOPE_HEIGHT * 3) / 4)
{
- envx_shifted = ch->envx << ENVX_SHIFT;
while (ch->env_error >= FIXED_POINT)
{
- envx_shifted += (MAX_ENVELOPE_HEIGHT << ENVX_SHIFT) / 256;
+ ch->envxx += (MAX_ENVELOPE_HEIGHT << ENVX_SHIFT) / 256;
ch->env_error -= FIXED_POINT;
}
- ch->envx = envx_shifted >> ENVX_SHIFT;
+ ch->envx = ch->envxx >> ENVX_SHIFT;
}
else
{
ch->env_error &= FIXED_POINT_REMAINDER;
ch->envx += step << 1;
+ ch->envxx = ch->envx << ENVX_SHIFT;
}
if (ch->envx >= 126)
{
ch->envx = 127;
+ ch->envxx = 127 << ENVX_SHIFT;
ch->state = SOUND_GAIN;
ch->mode = MODE_GAIN;
S9xSetEnvRate (ch, 0, -1, 0);
@@ -1058,6 +1061,7 @@ void MixStereo (int sample_count)
case SOUND_DECREASE_LINEAR:
ch->env_error &= FIXED_POINT_REMAINDER;
ch->envx -= step << 1;
+ ch->envxx = ch->envx << ENVX_SHIFT;
if (ch->envx <= 0)
{
S9xAPUSetEndOfSample (J, ch);
@@ -1066,13 +1070,12 @@ void MixStereo (int sample_count)
break;
case SOUND_DECREASE_EXPONENTIAL:
- envx_shifted = ch->envx << ENVX_SHIFT;
while (ch->env_error >= FIXED_POINT)
{
- envx_shifted = (envx_shifted >> 8) * 255;
+ ch->envxx = (ch->envxx >> 8) * 255;
ch->env_error -= FIXED_POINT;
}
- ch->envx = envx_shifted >> ENVX_SHIFT;
+ ch->envx = ch->envxx >> ENVX_SHIFT;
if (ch->envx <= 0)
{
S9xAPUSetEndOfSample (J, ch);
@@ -1818,7 +1821,7 @@ END_OF_FUNCTION(S9xMixSamples);
void S9xResetSound (bool8 full)
{
- for (int i = 0; i < NUM_CHANNELS; i++)
+ for (int i = 0; i < 8; i++)
{
SoundData.channels[i].state = SOUND_SILENT;
SoundData.channels[i].mode = MODE_NONE;
@@ -1832,6 +1835,7 @@ void S9xResetSound (bool8 full)
SoundData.channels[i].env_error = 0;
SoundData.channels[i].erate = 0;
SoundData.channels[i].envx = 0;
+ SoundData.channels[i].envxx = 0;
SoundData.channels[i].left_vol_level = 0;
SoundData.channels[i].right_vol_level = 0;
SoundData.channels[i].direction = 0;
@@ -2000,6 +2004,7 @@ void S9xPlaySample (int channel)
ch->state = SOUND_SILENT;
ch->mode = MODE_NONE;
ch->envx = 0;
+ ch->envxx = 0;
S9xFixEnvelope (channel,
APU.DSP [APU_GAIN + (channel << 4)],
@@ -2052,6 +2057,7 @@ void S9xPlaySample (int channel)
ch->right_vol_level = 0;
S9xSetEnvRate (ch, ch->attack_rate, 1, MAX_ENVELOPE_HEIGHT);
}
+ ch->envxx = ch->envx << ENVX_SHIFT;
break;
case MODE_GAIN:
diff --git a/source/soundux.h b/source/soundux.h
index 5484e89..ad8cba1 100644
--- a/source/soundux.h
+++ b/source/soundux.h
@@ -178,6 +178,7 @@ typedef struct {
uint32 sample_pointer;
int *echo_buf_ptr;
int mode;
+ int32 envxx;
signed short next_sample;
int32 interpolate;
int32 previous [2];