aboutsummaryrefslogtreecommitdiff
path: root/engines/agi/sound.cpp
diff options
context:
space:
mode:
authorMax Horn2007-08-19 20:48:11 +0000
committerMax Horn2007-08-19 20:48:11 +0000
commit5b711795d06d9f8dc2dada2e6e41e25a625de502 (patch)
tree18b164504ddb101a3a8782c9c80719170d07ac3b /engines/agi/sound.cpp
parent07586c378e42dcfa3d1024c19f9e8b3997bbd5c6 (diff)
downloadscummvm-rg350-5b711795d06d9f8dc2dada2e6e41e25a625de502.tar.gz
scummvm-rg350-5b711795d06d9f8dc2dada2e6e41e25a625de502.tar.bz2
scummvm-rg350-5b711795d06d9f8dc2dada2e6e41e25a625de502.zip
Some cleanup / const correctness / OOfication
svn-id: r28671
Diffstat (limited to 'engines/agi/sound.cpp')
-rw-r--r--engines/agi/sound.cpp349
1 files changed, 172 insertions, 177 deletions
diff --git a/engines/agi/sound.cpp b/engines/agi/sound.cpp
index f09f670265..5c19a3b55a 100644
--- a/engines/agi/sound.cpp
+++ b/engines/agi/sound.cpp
@@ -262,18 +262,7 @@ bool SoundMgr::finalizeInstruments(Common::SeekableReadStream &uint8Wave) {
return true;
}
-static int playing;
-static ChannelInfo chn[NUM_CHANNELS];
-static IIgsChannelInfo IIgsChannel;
-static int endflag = -1;
-static int playingSound = -1;
-static uint8 env;
-
-
-static int16 *sndBuffer;
-static int16 *waveform;
-
-static int16 waveformRamp[WAVEFORM_SIZE] = {
+static const int16 waveformRamp[WAVEFORM_SIZE] = {
0, 8, 16, 24, 32, 40, 48, 56,
64, 72, 80, 88, 96, 104, 112, 120,
128, 136, 144, 152, 160, 168, 176, 184,
@@ -284,7 +273,7 @@ static int16 waveformRamp[WAVEFORM_SIZE] = {
-64, -56, -48, -40, -32, -24, -16, -8 /* Ramp up */
};
-static int16 waveformSquare[WAVEFORM_SIZE] = {
+static const int16 waveformSquare[WAVEFORM_SIZE] = {
255, 230, 220, 220, 220, 220, 220, 220,
220, 220, 220, 220, 220, 220, 220, 220,
220, 220, 220, 220, 220, 220, 220, 220,
@@ -295,7 +284,7 @@ static int16 waveformSquare[WAVEFORM_SIZE] = {
-220, -220, -220, -110, 0, 0, 0, 0 /* Square */
};
-static int16 waveformMac[WAVEFORM_SIZE] = {
+static const int16 waveformMac[WAVEFORM_SIZE] = {
45, 110, 135, 161, 167, 173, 175, 176,
156, 137, 123, 110, 91, 72, 35, -2,
-60, -118, -142, -165, -170, -176, -177, -179,
@@ -306,7 +295,7 @@ static int16 waveformMac[WAVEFORM_SIZE] = {
-175, -172, -165, -159, -137, -114, -67, -19
};
-static uint16 period[] = {
+static const uint16 period[] = {
1024, 1085, 1149, 1218, 1290, 1367,
1448, 1534, 1625, 1722, 1825, 1933
};
@@ -329,7 +318,8 @@ void SoundMgr::unloadSound(int resnum) {
}
void SoundMgr::startSound(int resnum, int flag) {
- int i, type;
+ int i;
+ AgiSoundType type;
if (_vm->_game.sounds[resnum] != NULL && _vm->_game.sounds[resnum]->isPlaying())
return;
@@ -339,100 +329,100 @@ void SoundMgr::startSound(int resnum, int flag) {
if (_vm->_game.sounds[resnum] == NULL) // Is this needed at all?
return;
- type = _vm->_game.sounds[resnum]->type();
+ type = (AgiSoundType)_vm->_game.sounds[resnum]->type();
if (type != AGI_SOUND_SAMPLE && type != AGI_SOUND_MIDI && type != AGI_SOUND_4CHN)
return;
_vm->_game.sounds[resnum]->play();
- playingSound = resnum;
+ _playingSound = resnum;
debugC(3, kDebugLevelSound, "startSound(resnum = %d, flag = %d)", resnum, flag);
switch (type) {
case AGI_SOUND_SAMPLE: {
- IIgsSample *sampleRes = (IIgsSample *) _vm->_game.sounds[playingSound];
- const IIgsWaveInfo &waveInfo = IIgsChannel.ins.oscList(0).waves[0];
+ IIgsSample *sampleRes = (IIgsSample *) _vm->_game.sounds[_playingSound];
+ const IIgsWaveInfo &waveInfo = _IIgsChannel.ins.oscList(0).waves[0];
const IIgsSampleHeader &header = sampleRes->getHeader();
- IIgsChannel.ins = header.instrument;
- IIgsChannel.sample = sampleRes->getSample() + waveInfo.addr;
- IIgsChannel.pos = intToFrac(0);
- IIgsChannel.posAdd = intToFrac(0);
- IIgsChannel.note = intToFrac(header.pitch) + doubleToFrac(waveInfo.relPitch/256.0);
- IIgsChannel.startEnvVol = intToFrac(0);
- IIgsChannel.chanVol = intToFrac(header.volume);
- IIgsChannel.envVol = IIgsChannel.startEnvVol;
- IIgsChannel.vol = doubleToFrac(fracToDouble(IIgsChannel.envVol) * fracToDouble(IIgsChannel.chanVol) / 127.0);
- IIgsChannel.envSeg = intToFrac(0);
- IIgsChannel.loop = (waveInfo.mode == OSC_MODE_LOOP);
- IIgsChannel.size = waveInfo.size - waveInfo.addr;
- IIgsChannel.end = false;
+ _IIgsChannel.ins = header.instrument;
+ _IIgsChannel.sample = sampleRes->getSample() + waveInfo.addr;
+ _IIgsChannel.pos = intToFrac(0);
+ _IIgsChannel.posAdd = intToFrac(0);
+ _IIgsChannel.note = intToFrac(header.pitch) + doubleToFrac(waveInfo.relPitch/256.0);
+ _IIgsChannel.startEnvVol = intToFrac(0);
+ _IIgsChannel.chanVol = intToFrac(header.volume);
+ _IIgsChannel.envVol = _IIgsChannel.startEnvVol;
+ _IIgsChannel.vol = doubleToFrac(fracToDouble(_IIgsChannel.envVol) * fracToDouble(_IIgsChannel.chanVol) / 127.0);
+ _IIgsChannel.envSeg = intToFrac(0);
+ _IIgsChannel.loop = (waveInfo.mode == OSC_MODE_LOOP);
+ _IIgsChannel.size = waveInfo.size - waveInfo.addr;
+ _IIgsChannel.end = false;
break;
}
-#if 0
case AGI_SOUND_MIDI:
+#if 0
debugC(3, kDebugLevelSound, "IIGS MIDI sequence");
for (i = 0; i < NUM_CHANNELS; i++) {
- chn[i].type = type;
- chn[i].flags = AGI_SOUND_LOOP | AGI_SOUND_ENVELOPE;
- chn[i].ins = waveform;
- chn[i].size = WAVEFORM_SIZE;
- chn[i].vol = 0;
- chn[i].end = 0;
+ _chn[i].type = type;
+ _chn[i].flags = AGI_SOUND_LOOP | AGI_SOUND_ENVELOPE;
+ _chn[i].ins = _waveform;
+ _chn[i].size = WAVEFORM_SIZE;
+ _chn[i].vol = 0;
+ _chn[i].end = 0;
}
- chn[0].timer = *(song + 2);
- chn[0].ptr = (struct AgiNote *)(song + 3);
- break;
+ _chn[0].timer = *(song + 2);
+ _chn[0].ptr = (struct AgiNote *)(song + 3);
#endif
+ break;
case AGI_SOUND_4CHN:
PCjrSound *pcjrSound = (PCjrSound *) _vm->_game.sounds[resnum];
/* Initialize channel info */
for (i = 0; i < NUM_CHANNELS; i++) {
- chn[i].type = type;
- chn[i].flags = AGI_SOUND_LOOP;
- if (env) {
- chn[i].flags |= AGI_SOUND_ENVELOPE;
- chn[i].adsr = AGI_SOUND_ENV_ATTACK;
+ _chn[i].type = type;
+ _chn[i].flags = AGI_SOUND_LOOP;
+ if (_env) {
+ _chn[i].flags |= AGI_SOUND_ENVELOPE;
+ _chn[i].adsr = AGI_SOUND_ENV_ATTACK;
}
- chn[i].ins = waveform;
- chn[i].size = WAVEFORM_SIZE;
- chn[i].ptr = pcjrSound->getVoicePointer(i % 4);
- chn[i].timer = 0;
- chn[i].vol = 0;
- chn[i].end = 0;
+ _chn[i].ins = _waveform;
+ _chn[i].size = WAVEFORM_SIZE;
+ _chn[i].ptr = pcjrSound->getVoicePointer(i % 4);
+ _chn[i].timer = 0;
+ _chn[i].vol = 0;
+ _chn[i].end = 0;
}
break;
}
- memset(sndBuffer, 0, BUFFER_SIZE << 1);
- endflag = flag;
+ memset(_sndBuffer, 0, BUFFER_SIZE << 1);
+ _endflag = flag;
/* Nat Budin reports that the flag should be reset when sound starts
*/
- _vm->setflag(endflag, false);
+ _vm->setflag(_endflag, false);
}
void SoundMgr::stopSound() {
int i;
- endflag = -1;
+ _endflag = -1;
if (_vm->_soundemu != SOUND_EMU_APPLE2GS) {
for (i = 0; i < NUM_CHANNELS; i++)
stopNote(i);
}
- if (playingSound != -1) {
- _vm->_game.sounds[playingSound]->stop();
+ if (_playingSound != -1) {
+ _vm->_game.sounds[_playingSound]->stop();
if (_vm->_soundemu == SOUND_EMU_APPLE2GS) {
- IIgsChannel.end = true;
- IIgsChannel.chanVol = intToFrac(0);
+ _IIgsChannel.end = true;
+ _IIgsChannel.chanVol = intToFrac(0);
}
- playingSound = -1;
+ _playingSound = -1;
}
}
@@ -441,21 +431,21 @@ static int16 *buffer;
int SoundMgr::initSound() {
int r = -1;
- buffer = sndBuffer = (int16 *)calloc(2, BUFFER_SIZE);
+ buffer = _sndBuffer = (int16 *)calloc(2, BUFFER_SIZE);
- env = false;
+ _env = false;
switch (_vm->_soundemu) {
case SOUND_EMU_NONE:
- waveform = waveformRamp;
- env = true;
+ _waveform = waveformRamp;
+ _env = true;
break;
case SOUND_EMU_AMIGA:
case SOUND_EMU_PC:
- waveform = waveformSquare;
+ _waveform = waveformSquare;
break;
case SOUND_EMU_MAC:
- waveform = waveformMac;
+ _waveform = waveformMac;
break;
case SOUND_EMU_APPLE2GS:
loadInstruments();
@@ -465,7 +455,7 @@ int SoundMgr::initSound() {
report("Initializing sound:\n");
report("sound: envelopes ");
- if (env) {
+ if (_env) {
report("enabled (decay=%d, sustain=%d)\n", ENV_DECAY, ENV_SUSTAIN);
} else {
report("disabled\n");
@@ -479,15 +469,15 @@ int SoundMgr::initSound() {
void SoundMgr::deinitSound() {
debugC(3, kDebugLevelSound, "()");
_mixer->stopHandle(_soundHandle);
- free(sndBuffer);
+ free(_sndBuffer);
}
void SoundMgr::stopNote(int i) {
- chn[i].adsr = AGI_SOUND_ENV_RELEASE;
+ _chn[i].adsr = AGI_SOUND_ENV_RELEASE;
if (g_useChorus) {
/* Stop chorus ;) */
- if (chn[i].type == AGI_SOUND_4CHN &&
+ if (_chn[i].type == AGI_SOUND_4CHN &&
_vm->_soundemu == SOUND_EMU_NONE && i < 3) {
stopNote(i + 4);
}
@@ -500,15 +490,15 @@ void SoundMgr::playNote(int i, int freq, int vol) {
else if (vol && _vm->_soundemu == SOUND_EMU_PC)
vol = 160;
- chn[i].phase = 0;
- chn[i].freq = freq;
- chn[i].vol = vol;
- chn[i].env = 0x10000;
- chn[i].adsr = AGI_SOUND_ENV_ATTACK;
+ _chn[i].phase = 0;
+ _chn[i].freq = freq;
+ _chn[i].vol = vol;
+ _chn[i].env = 0x10000;
+ _chn[i].adsr = AGI_SOUND_ENV_ATTACK;
if (g_useChorus) {
/* Add chorus ;) */
- if (chn[i].type == AGI_SOUND_4CHN &&
+ if (_chn[i].type == AGI_SOUND_4CHN &&
_vm->_soundemu == SOUND_EMU_NONE && i < 3) {
int newfreq = freq * 1007 / 1000;
if (freq == newfreq)
@@ -523,14 +513,14 @@ void SoundMgr::playMidiSound() {
uint8 parm1, parm2;
static uint8 cmd, ch;
- playing = 1;
+ _playing = true;
- if (chn[0].timer > 0) {
- chn[0].timer -= 2;
+ if (_chn[0].timer > 0) {
+ _chn[0].timer -= 2;
return;
}
- p = (uint8 *)chn[0].ptr;
+ p = (uint8 *)_chn[0].ptr;
if (*p & 0x80) {
cmd = *p++;
@@ -560,8 +550,8 @@ void SoundMgr::playMidiSound() {
parm1 = *p++;
#if 0
if (ch < NUM_CHANNELS) {
- chn[ch].ins = (uint16 *)&wave[waveaddr[parm1]];
- chn[ch].size = wavesize[parm1];
+ _chn[ch].ins = (uint16 *)&wave[waveaddr[parm1]];
+ _chn[ch].size = wavesize[parm1];
}
debugC(3, kDebugLevelSound, "set patch %02x (%d,%d), ch %02x",
parm1, waveaddr[parm1], wavesize[parm1], ch);
@@ -569,12 +559,12 @@ void SoundMgr::playMidiSound() {
break;
}
- chn[0].timer = *p++;
- chn[0].ptr = p;
+ _chn[0].timer = *p++;
+ _chn[0].ptr = p;
if (*p >= 0xfc) {
debugC(3, kDebugLevelSound, "end of sequence");
- playing = 0;
+ _playing = false;
return;
}
}
@@ -585,22 +575,23 @@ void SoundMgr::playSampleSound() {
return;
}
- if (playingSound != -1)
- playing = !IIgsChannel.end;
+ if (_playingSound != -1)
+ _playing = !_IIgsChannel.end;
}
void SoundMgr::playAgiSound() {
int i;
AgiNote note;
- for (playing = i = 0; i < (_vm->_soundemu == SOUND_EMU_PC ? 1 : 4); i++) {
- playing |= !chn[i].end;
- note.read(chn[i].ptr); // Read a single note (Doesn't advance the pointer)
+ _playing = false;
+ for (i = 0; i < (_vm->_soundemu == SOUND_EMU_PC ? 1 : 4); i++) {
+ _playing |= !_chn[i].end;
+ note.read(_chn[i].ptr); // Read a single note (Doesn't advance the pointer)
- if (chn[i].end)
+ if (_chn[i].end)
continue;
- if ((--chn[i].timer) <= 0) {
+ if ((--_chn[i].timer) <= 0) {
stopNote(i);
if (note.freqDiv != 0) {
@@ -608,22 +599,22 @@ void SoundMgr::playAgiSound() {
playNote(i, note.freqDiv * 10, volume);
}
- chn[i].timer = note.duration;
+ _chn[i].timer = note.duration;
- if (chn[i].timer == 0xffff) {
- chn[i].end = 1;
- chn[i].vol = 0;
- chn[i].env = 0;
+ if (_chn[i].timer == 0xffff) {
+ _chn[i].end = 1;
+ _chn[i].vol = 0;
+ _chn[i].env = 0;
if (g_useChorus) {
/* chorus */
- if (chn[i].type == AGI_SOUND_4CHN && _vm->_soundemu == SOUND_EMU_NONE && i < 3) {
- chn[i + 4].vol = 0;
- chn[i + 4].env = 0;
+ if (_chn[i].type == AGI_SOUND_4CHN && _vm->_soundemu == SOUND_EMU_NONE && i < 3) {
+ _chn[i + 4].vol = 0;
+ _chn[i + 4].env = 0;
}
}
}
- chn[i].ptr += 5; // Advance the pointer to the next note data (5 bytes per note)
+ _chn[i].ptr += 5; // Advance the pointer to the next note data (5 bytes per note)
}
}
}
@@ -631,16 +622,16 @@ void SoundMgr::playAgiSound() {
void SoundMgr::playSound() {
int i;
- if (endflag == -1)
+ if (_endflag == -1)
return;
if (_vm->_soundemu == SOUND_EMU_APPLE2GS) {
- if (playingSound != -1) {
- if (_vm->_game.sounds[playingSound]->type() == AGI_SOUND_MIDI) {
+ if (_playingSound != -1) {
+ if (_vm->_game.sounds[_playingSound]->type() == AGI_SOUND_MIDI) {
/* play_midi_sound (); */
//warning("playSound: Trying to play an Apple IIGS MIDI sound. Not yet implemented!");
- playing = 0;
- } else if (_vm->_game.sounds[playingSound]->type() == AGI_SOUND_SAMPLE) {
+ _playing = false;
+ } else if (_vm->_game.sounds[_playingSound]->type() == AGI_SOUND_SAMPLE) {
//debugC(3, kDebugLevelSound, "playSound: Trying to play an Apple IIGS sample");
playSampleSound();
}
@@ -650,156 +641,156 @@ void SoundMgr::playSound() {
playAgiSound();
}
- if (!playing) {
+ if (!_playing) {
if (_vm->_soundemu != SOUND_EMU_APPLE2GS) {
- for (i = 0; i < NUM_CHANNELS; chn[i++].vol = 0);
+ for (i = 0; i < NUM_CHANNELS; _chn[i++].vol = 0);
}
- if (endflag != -1)
- _vm->setflag(endflag, true);
+ if (_endflag != -1)
+ _vm->setflag(_endflag, true);
- if (playingSound != -1)
- _vm->_game.sounds[playingSound]->stop();
- playingSound = -1;
- endflag = -1;
+ if (_playingSound != -1)
+ _vm->_game.sounds[_playingSound]->stop();
+ _playingSound = -1;
+ _endflag = -1;
}
}
uint32 SoundMgr::mixSound(void) {
register int i, p;
- int16 *src;
+ const int16 *src;
int c, b, m;
- memset(sndBuffer, 0, BUFFER_SIZE << 1);
+ memset(_sndBuffer, 0, BUFFER_SIZE << 1);
// Handle Apple IIGS sound mixing here
- if (_vm->_soundemu == SOUND_EMU_APPLE2GS && playing && playingSound != -1) {
- //IIgsWaveInfo &waveInfo = IIgsChannel.ins.oscList(0).waves[0];
+ if (_vm->_soundemu == SOUND_EMU_APPLE2GS && _playing && _playingSound != -1) {
+ //IIgsWaveInfo &waveInfo = _IIgsChannel.ins.oscList(0).waves[0];
- //uint period = noteToPeriod(fracToInt(IIgsChannel.note + FRAC_HALF));
- //IIgsChannel.posAdd = ((frac_t) (118600 * 4 / period)) << (FRAC_BITS - 8);
+ //uint period = noteToPeriod(fracToInt(_IIgsChannel.note + FRAC_HALF));
+ //_IIgsChannel.posAdd = ((frac_t) (118600 * 4 / period)) << (FRAC_BITS - 8);
// Hertz (number of vibrations a second) = 6.875 x 2 ^ ( ( 3 + MIDI_Pitch ) / 12 )
// From http://www.musicmasterworks.com/WhereMathMeetsMusic.html
- //double hertz = 6.875 * pow(SEMITONE, 3 + fracToDouble(IIgsChannel.note));
- //double hertz = 8.175798915644 * pow(SEMITONE, fracToDouble(IIgsChannel.note));
+ //double hertz = 6.875 * pow(SEMITONE, 3 + fracToDouble(_IIgsChannel.note));
+ //double hertz = 8.175798915644 * pow(SEMITONE, fracToDouble(_IIgsChannel.note));
// double step = getRate() / hertz;
- // IIgsChannel.posAdd = doubleToFrac(step);
+ // _IIgsChannel.posAdd = doubleToFrac(step);
// Frequency multiplier was 1076.0 based on tests made with MESS 0.117.
// Tests made with KEGS32 averaged the multiplier to around 1045.
// So this is a guess but maybe it's 1046.5... i.e. C6's frequency?
- double hertz = C6_FREQ * pow(SEMITONE, fracToDouble(IIgsChannel.note));
- IIgsChannel.posAdd = doubleToFrac(hertz / getRate());
- IIgsChannel.vol = doubleToFrac(fracToDouble(IIgsChannel.envVol) * fracToDouble(IIgsChannel.chanVol) / 127.0);
- double tempVol = fracToDouble(IIgsChannel.vol)/127.0;
+ double hertz = C6_FREQ * pow(SEMITONE, fracToDouble(_IIgsChannel.note));
+ _IIgsChannel.posAdd = doubleToFrac(hertz / getRate());
+ _IIgsChannel.vol = doubleToFrac(fracToDouble(_IIgsChannel.envVol) * fracToDouble(_IIgsChannel.chanVol) / 127.0);
+ double tempVol = fracToDouble(_IIgsChannel.vol)/127.0;
for (i = 0; i < IIGS_BUFFER_SIZE; i++) {
- b = IIgsChannel.sample[fracToInt(IIgsChannel.pos)];
+ b = _IIgsChannel.sample[fracToInt(_IIgsChannel.pos)];
// DOESN'T DO MIXING YET! ONLY ONE SAMPLE PER PLAYING!
- sndBuffer[i] = (int16) (b * tempVol);
- IIgsChannel.pos += IIgsChannel.posAdd;
+ _sndBuffer[i] = (int16) (b * tempVol);
+ _IIgsChannel.pos += _IIgsChannel.posAdd;
- if (IIgsChannel.pos >= intToFrac(IIgsChannel.size)) {
- if (IIgsChannel.loop) {
- IIgsChannel.pos %= intToFrac(IIgsChannel.size);
+ if (_IIgsChannel.pos >= intToFrac(_IIgsChannel.size)) {
+ if (_IIgsChannel.loop) {
+ _IIgsChannel.pos %= intToFrac(_IIgsChannel.size);
// Probably we should loop the envelope too
- IIgsChannel.envSeg = 0;
- IIgsChannel.envVol = IIgsChannel.startEnvVol;
+ _IIgsChannel.envSeg = 0;
+ _IIgsChannel.envVol = _IIgsChannel.startEnvVol;
} else {
- IIgsChannel.pos = IIgsChannel.chanVol = 0;
- IIgsChannel.end = true;
+ _IIgsChannel.pos = _IIgsChannel.chanVol = 0;
+ _IIgsChannel.end = true;
break;
}
}
}
- if (IIgsChannel.envSeg <= IIgsChannel.ins.relseg) {
- IIgsEnvelopeSegment &seg = IIgsChannel.ins.env.seg[IIgsChannel.envSeg];
+ if (_IIgsChannel.envSeg <= _IIgsChannel.ins.relseg) {
+ IIgsEnvelopeSegment &seg = _IIgsChannel.ins.env.seg[_IIgsChannel.envSeg];
double bufSecLen = IIGS_BUFFER_SIZE / (double) getRate();
double ticksPerSec = 100; // 1000 is way too much
double bufTickLen = bufSecLen / (1.0/ticksPerSec);
frac_t envVolDelta = doubleToFrac((seg.inc/256.0)*bufTickLen);
- if (intToFrac(seg.bp) >= IIgsChannel.envVol) {
- IIgsChannel.envVol += envVolDelta;
- if (IIgsChannel.envVol >= intToFrac(seg.bp)) {
- IIgsChannel.envVol = intToFrac(seg.bp);
- IIgsChannel.envSeg += 1;
+ if (intToFrac(seg.bp) >= _IIgsChannel.envVol) {
+ _IIgsChannel.envVol += envVolDelta;
+ if (_IIgsChannel.envVol >= intToFrac(seg.bp)) {
+ _IIgsChannel.envVol = intToFrac(seg.bp);
+ _IIgsChannel.envSeg += 1;
}
} else {
- IIgsChannel.envVol -= envVolDelta;
- if (IIgsChannel.envVol <= intToFrac(seg.bp)) {
- IIgsChannel.envVol = intToFrac(seg.bp);
- IIgsChannel.envSeg += 1;
+ _IIgsChannel.envVol -= envVolDelta;
+ if (_IIgsChannel.envVol <= intToFrac(seg.bp)) {
+ _IIgsChannel.envVol = intToFrac(seg.bp);
+ _IIgsChannel.envSeg += 1;
}
}
}
- //IIgsChannel.envSeg += doubleToFrac(1/100.0);
+ //_IIgsChannel.envSeg += doubleToFrac(1/100.0);
return IIGS_BUFFER_SIZE;
} /* else ... */
// Handle PCjr 4-channel sound mixing here
for (c = 0; c < NUM_CHANNELS; c++) {
- if (!chn[c].vol)
+ if (!_chn[c].vol)
continue;
- m = chn[c].flags & AGI_SOUND_ENVELOPE ?
- chn[c].vol * chn[c].env >> 16 : chn[c].vol;
+ m = _chn[c].flags & AGI_SOUND_ENVELOPE ?
+ _chn[c].vol * _chn[c].env >> 16 : _chn[c].vol;
- if (chn[c].type != AGI_SOUND_4CHN || c != 3) {
- src = chn[c].ins;
+ if (_chn[c].type != AGI_SOUND_4CHN || c != 3) {
+ src = _chn[c].ins;
- p = chn[c].phase;
+ p = _chn[c].phase;
for (i = 0; i < BUFFER_SIZE; i++) {
b = src[p >> 8];
#ifdef USE_INTERPOLATION
- b += ((src[((p >> 8) + 1) % chn[c].size] - src[p >> 8]) * (p & 0xff)) >> 8;
+ b += ((src[((p >> 8) + 1) % _chn[c].size] - src[p >> 8]) * (p & 0xff)) >> 8;
#endif
- sndBuffer[i] += (b * m) >> 4;
+ _sndBuffer[i] += (b * m) >> 4;
- p += (uint32) 118600 *4 / chn[c].freq;
+ p += (uint32) 118600 *4 / _chn[c].freq;
/* FIXME */
- if (chn[c].flags & AGI_SOUND_LOOP) {
- p %= chn[c].size << 8;
+ if (_chn[c].flags & AGI_SOUND_LOOP) {
+ p %= _chn[c].size << 8;
} else {
- if (p >= chn[c].size << 8) {
- p = chn[c].vol = 0;
- chn[c].end = 1;
+ if (p >= _chn[c].size << 8) {
+ p = _chn[c].vol = 0;
+ _chn[c].end = 1;
break;
}
}
}
- chn[c].phase = p;
+ _chn[c].phase = p;
} else {
/* Add white noise */
for (i = 0; i < BUFFER_SIZE; i++) {
b = _vm->_rnd->getRandomNumber(255) - 128;
- sndBuffer[i] += (b * m) >> 4;
+ _sndBuffer[i] += (b * m) >> 4;
}
}
- switch (chn[c].adsr) {
+ switch (_chn[c].adsr) {
case AGI_SOUND_ENV_ATTACK:
/* not implemented */
- chn[c].adsr = AGI_SOUND_ENV_DECAY;
+ _chn[c].adsr = AGI_SOUND_ENV_DECAY;
break;
case AGI_SOUND_ENV_DECAY:
- if (chn[c].env > chn[c].vol * ENV_SUSTAIN + ENV_DECAY) {
- chn[c].env -= ENV_DECAY;
+ if (_chn[c].env > _chn[c].vol * ENV_SUSTAIN + ENV_DECAY) {
+ _chn[c].env -= ENV_DECAY;
} else {
- chn[c].env = chn[c].vol * ENV_SUSTAIN;
- chn[c].adsr = AGI_SOUND_ENV_SUSTAIN;
+ _chn[c].env = _chn[c].vol * ENV_SUSTAIN;
+ _chn[c].adsr = AGI_SOUND_ENV_SUSTAIN;
}
break;
case AGI_SOUND_ENV_SUSTAIN:
break;
case AGI_SOUND_ENV_RELEASE:
- if (chn[c].env >= ENV_RELEASE) {
- chn[c].env -= ENV_RELEASE;
+ if (_chn[c].env >= ENV_RELEASE) {
+ _chn[c].env -= ENV_RELEASE;
} else {
- chn[c].env = 0;
+ _chn[c].env = 0;
}
}
}
@@ -1027,6 +1018,10 @@ SoundMgr::SoundMgr(AgiEngine *agi, Audio::Mixer *pMixer) {
_vm = agi;
_mixer = pMixer;
_sampleRate = pMixer->getOutputRate();
+ _endflag = -1;
+ _playingSound = -1;
+ _sndBuffer = 0;
+ _waveform = 0;
}
void SoundMgr::premixerCall(int16 *data, uint len) {