aboutsummaryrefslogtreecommitdiff
path: root/engines
diff options
context:
space:
mode:
Diffstat (limited to 'engines')
-rw-r--r--engines/kyra/sound.h2
-rw-r--r--engines/kyra/sound_adlib.cpp27
2 files changed, 20 insertions, 9 deletions
diff --git a/engines/kyra/sound.h b/engines/kyra/sound.h
index 348f1768e4..158270c201 100644
--- a/engines/kyra/sound.h
+++ b/engines/kyra/sound.h
@@ -112,7 +112,7 @@ private:
int _sfxPlayingSound;
Common::String _soundFileLoaded;
- uint8 _sfxSecondByteOfSong;
+ uint8 _sfxPriority;
uint8 _sfxFourthByteOfSong;
};
diff --git a/engines/kyra/sound_adlib.cpp b/engines/kyra/sound_adlib.cpp
index 0394b3ec8a..90f362a0e6 100644
--- a/engines/kyra/sound_adlib.cpp
+++ b/engines/kyra/sound_adlib.cpp
@@ -534,7 +534,7 @@ int AdlibDriver::snd_unkOpcode3(va_list &list) {
int AdlibDriver::snd_readByte(va_list &list) {
int a = va_arg(list, int);
int b = va_arg(list, int);
- uint8 *ptr = _soundData + READ_LE_UINT16(&_soundData[a << 1]) + b;
+ uint8 *ptr = getProgram(a) + b;
return *ptr;
}
@@ -542,7 +542,7 @@ int AdlibDriver::snd_writeByte(va_list &list) {
int a = va_arg(list, int);
int b = va_arg(list, int);
int c = va_arg(list, int);
- uint8 *ptr = _soundData + READ_LE_UINT16(&_soundData[a << 1]) + b;
+ uint8 *ptr = getProgram(a) + b;
uint8 oldValue = *ptr;
*ptr = (uint8)c;
return oldValue;
@@ -2162,22 +2162,33 @@ void SoundAdlibPC::playSoundEffect(uint8 track) {
_engine->_system->delayMillis(10);
}
if (_sfxPlayingSound != -1) {
- _driver->callback(10, _sfxPlayingSound, int(1), int(_sfxSecondByteOfSong));
+ // Restore the sounds's normal values.
+ _driver->callback(10, _sfxPlayingSound, int(1), int(_sfxPriority));
_driver->callback(10, _sfxPlayingSound, int(3), int(_sfxFourthByteOfSong));
_sfxPlayingSound = -1;
}
- int firstByteOfSong = _driver->callback(9, soundId, int(0));
+ int chan = _driver->callback(9, soundId, int(0));
- if (firstByteOfSong != 9) {
+ if (chan != 9) {
_sfxPlayingSound = soundId;
- _sfxSecondByteOfSong = _driver->callback(9, soundId, int(1));
+ _sfxPriority = _driver->callback(9, soundId, int(1));
_sfxFourthByteOfSong = _driver->callback(9, soundId, int(3));
+ // In the cases I've seen, the mysterious fourth byte has been
+ // the parameter for the update_setExtraLevel3() callback.
+ //
+ // The extra level is part of the channels "total level", which
+ // is a six-bit value where larger values means softer volume.
+ //
+ // So what seems to be happening here is that sounds which are
+ // started by this function are given a slightly lower priority
+ // and a slightly higher (i.e. softer) extra level 3 than they
+ // would have if they were started from anywhere else. Strange.
+
int newVal = ((((-_sfxFourthByteOfSong) + 63) * 0xFF) >> 8) & 0xFF;
- newVal = -newVal + 63;
_driver->callback(10, soundId, int(3), newVal);
- newVal = ((_sfxSecondByteOfSong * 0xFF) >> 8) & 0xFF;
+ newVal = ((_sfxPriority * 0xFF) >> 8) & 0xFF;
_driver->callback(10, soundId, int(1), newVal);
}