From 88416b870d36116a32e33381733599d231f16e88 Mon Sep 17 00:00:00 2001 From: Florian Kagerer Date: Sat, 9 Oct 2010 01:36:38 +0000 Subject: SCUMM/FM-TOWNS: cleanup sfx code svn-id: r53095 --- engines/scumm/player_towns.cpp | 120 ++++++++++++++++++++--------------------- engines/scumm/player_towns.h | 35 ++++++------ 2 files changed, 77 insertions(+), 78 deletions(-) diff --git a/engines/scumm/player_towns.cpp b/engines/scumm/player_towns.cpp index ee4caeaec1..24eb92edc7 100644 --- a/engines/scumm/player_towns.cpp +++ b/engines/scumm/player_towns.cpp @@ -31,8 +31,6 @@ namespace Scumm { Player_Towns::Player_Towns(ScummEngine *vm, bool isVersion2) : _vm(vm), _v2(isVersion2), _numSoundMax(isVersion2 ? 256 : 200) { memset(_pcmCurrentSound, 0, sizeof(_pcmCurrentSound)); - memset(&_ovrCur, 0, sizeof(SoundOvrParameters)); - _soundOverride = 0; _unkFlags = 0x33; _intf = 0; } @@ -107,15 +105,6 @@ void Player_Towns::playPcmTrack(int sound, const uint8 *data, int velo, int pan, const uint8 *ptr = data; const uint8 *sfxData = ptr + 16; - int note2, velocity; - - if (velo) - velocity = velo; - else if (_ovrCur.vLeft + _ovrCur.vRight) - velocity = (_ovrCur.vLeft + _ovrCur.vRight) >> 2; - else - velocity = ptr[8] >> 1; - int numChan = _v2 ? 1 : ptr[14]; for (int i = 0; i < numChan; i++) { int chan = allocatePcmChannel(sound, i, priority); @@ -124,18 +113,10 @@ void Player_Towns::playPcmTrack(int sound, const uint8 *data, int velo, int pan, _intf->callback(70, _unkFlags); _intf->callback(3, chan + 0x3f, pan); + _intf->callback(37, chan + 0x3f, note, velo, sfxData); - if (note) - note2 = note; - else if (_ovrCur.note) - note2 = _ovrCur.note; - else - note2 = sfxData[28]; - - _intf->callback(37, chan + 0x3f, note2, velocity, sfxData); - - _pcmCurrentSound[chan].note = note2; - _pcmCurrentSound[chan].velo = velocity; + _pcmCurrentSound[chan].note = note; + _pcmCurrentSound[chan].velo = velo; _pcmCurrentSound[chan].pan = pan; _pcmCurrentSound[chan].paused = 0; _pcmCurrentSound[chan].looping = READ_LE_UINT32(&sfxData[20]) ? 1 : 0; @@ -201,18 +182,18 @@ int Player_Towns::allocatePcmChannel(int sound, int sfxChanRelIndex, uint32 prio } Player_Towns_v1::Player_Towns_v1(ScummEngine *vm, Audio::Mixer *mixer) : Player_Towns(vm, false) { + _soundOverride = 0; _cdaCurrentSound = _eupCurrentSound = _cdaNumLoops = 0; _cdaForceRestart = 0; _cdaVolLeft = _cdaVolRight = 0; _eupVolLeft = _eupVolRight = 0; + _eupLooping = false; if (_vm->_game.version == 3) { _soundOverride = new SoundOvrParameters[_numSoundMax]; memset(_soundOverride, 0, _numSoundMax * sizeof(SoundOvrParameters)); - } - - _eupLooping = false; + } _driver = new TownsEuphonyDriver(mixer); } @@ -248,23 +229,32 @@ void Player_Towns_v1::setMusicVolume(int vol) { void Player_Towns_v1::startSound(int sound) { uint8 *ptr = _vm->getResourceAddress(rtSound, sound); - if (_vm->_game.version != 3) { + if (_vm->_game.version != 3) ptr += 2; - } else if (_soundOverride && sound > 0 && sound < _numSoundMax) { - memcpy(&_ovrCur, &_soundOverride[sound], sizeof(SoundOvrParameters)); - memset(&_soundOverride[sound], 0, sizeof(SoundOvrParameters)); - } int type = ptr[13]; if (type == 0) { - playPcmTrack(sound, ptr + 6, 0, 64, 0, READ_LE_UINT16(ptr + 10)); + uint8 velocity = 0; + uint8 note = 0; + + if (_vm->_game.version == 3) { + velocity = (_soundOverride[sound].vLeft + _soundOverride[sound].vRight); + note = _soundOverride[sound].note; + } + + velocity = velocity ? velocity >> 2 : ptr[14] >> 1; + playPcmTrack(sound, ptr + 6, velocity, 64, note ? note : ptr[50], READ_LE_UINT16(ptr + 10)); + } else if (type == 1) { playEuphonyTrack(sound, ptr + 6); + } else if (type == 2) { playCdaTrack(sound, ptr + 6); } - memset(&_ovrCur, 0, sizeof(SoundOvrParameters)); + + if (_vm->_game.version == 3) + _soundOverride[sound].vLeft = _soundOverride[sound].vRight = _soundOverride[sound].note = 0; } void Player_Towns_v1::stopSound(int sound) { @@ -465,7 +455,7 @@ void Player_Towns_v1::startSoundEx(int sound, int velo, int pan, int note) { pan = pan ? (((pan << 7) - pan) + 50) / 100 : 64; - playPcmTrack(sound, ptr + 6, velo, pan, note, pri); + playPcmTrack(sound, ptr + 6, velo ? velo : ptr[14] >> 1, pan, note ? note : ptr[50], pri); } else if (ptr[13] == 2) { int volLeft = velo; @@ -531,9 +521,9 @@ void Player_Towns_v1::playEuphonyTrack(int sound, const uint8 *data) { _driver->intf()->callback(4, i, i); } - _eupVolLeft = _ovrCur.vLeft; - _eupVolRight = _ovrCur.vRight; - int lvl = _ovrCur.vLeft + _ovrCur.vRight; + _eupVolLeft = _soundOverride[sound].vLeft; + _eupVolRight = _soundOverride[sound].vRight; + int lvl = _soundOverride[sound].vLeft + _soundOverride[sound].vRight; if (!lvl) lvl = data[8] + data[9]; lvl >>= 2; @@ -561,10 +551,14 @@ void Player_Towns_v1::playCdaTrack(int sound, const uint8 *data, bool skipTrackV return; if (!skipTrackVelo) { - if (_ovrCur.vLeft + _ovrCur.vRight) - setVolumeCD(_ovrCur.vLeft, _ovrCur.vRight); - else + if (_vm->_game.version == 3) { + if (_soundOverride[sound].vLeft + _soundOverride[sound].vRight) + setVolumeCD(_soundOverride[sound].vLeft, _soundOverride[sound].vRight); + else + setVolumeCD(ptr[8], ptr[9]); + } else { setVolumeCD(ptr[8], ptr[9]); + } } if (sound == _cdaCurrentSound && _vm->_sound->pollCD() == 1) @@ -583,8 +577,8 @@ void Player_Towns_v1::playCdaTrack(int sound, const uint8 *data, bool skipTrackV } Player_Towns_v2::Player_Towns_v2(ScummEngine *vm, IMuse *imuse, Audio::Mixer *mixer, bool disposeIMuse) : Player_Towns(vm, true), _imuse(imuse), _imuseDispose(disposeIMuse) { - _soundOverride2 = new SoundOvrParameters2[_numSoundMax]; - memset(_soundOverride2, 0, _numSoundMax * sizeof(SoundOvrParameters2)); + _soundOverride = new SoundOvrParameters[_numSoundMax]; + memset(_soundOverride, 0, _numSoundMax * sizeof(SoundOvrParameters)); _sblData = 0; _intf = new TownsAudioInterface(mixer, 0); } @@ -617,31 +611,37 @@ void Player_Towns_v2::setMusicVolume(int vol) { } int Player_Towns_v2::getSoundStatus(int sound) const { - if (_soundOverride2[sound].type == 7) + if (_soundOverride[sound].type == 7) return Player_Towns::getSoundStatus(sound); return _imuse->getSoundStatus(sound); } void Player_Towns_v2::startSound(int sound) { uint8 *ptr = _vm->getResourceAddress(rtSound, sound); + if (READ_BE_UINT32(ptr) == MKID_BE('TOWS')) { - _soundOverride2[sound].type = 7; - uint8 velo = _soundOverride2[sound].velo ? _soundOverride2[sound].velo - 1: (ptr[10] + ptr[11] + 1) >> 1; - uint8 pan = _soundOverride2[sound].pan ? _soundOverride2[sound].pan - 1 : 64; + _soundOverride[sound].type = 7; + uint8 velo = _soundOverride[sound].velo ? _soundOverride[sound].velo - 1: (ptr[10] + ptr[11] + 1) >> 1; + uint8 pan = _soundOverride[sound].pan ? _soundOverride[sound].pan - 1 : 64; uint8 pri = ptr[9]; - _soundOverride2[sound].velo = _soundOverride2[sound].pan = 0; - playPcmTrack(sound, ptr + 8, velo, pan, 0, pri); + _soundOverride[sound].velo = _soundOverride[sound].pan = 0; + + playPcmTrack(sound, ptr + 8, velo, pan, ptr[52], pri); + } else if (READ_BE_UINT32(ptr) == MKID_BE('SBL ')) { - _soundOverride2[sound].type = 5; - playPcmTrackSBL(ptr + 27); + _soundOverride[sound].type = 5; + + playVocTrack(ptr + 27); + } else { - _soundOverride2[sound].type = 3; + _soundOverride[sound].type = 3; + _imuse->startSound(sound); } } void Player_Towns_v2::stopSound(int sound) { - if (_soundOverride2[sound].type == 7) { + if (_soundOverride[sound].type == 7) { stopPcmTrack(sound); } else { _imuse->stopSound(sound); @@ -678,25 +678,25 @@ int32 Player_Towns_v2::doCommand(int numargs, int args[]) { break; case 258: - if (_soundOverride2[args[1]].type == 0) { + if (_soundOverride[args[1]].type == 0) { ptr = _vm->getResourceAddress(rtSound, args[1]); if (READ_BE_UINT32(ptr) == MKID_BE('TOWS')) - _soundOverride2[args[1]].type = 7; + _soundOverride[args[1]].type = 7; } - if (_soundOverride2[args[1]].type == 7) { - _soundOverride2[args[1]].velo = args[2] + 1; + if (_soundOverride[args[1]].type == 7) { + _soundOverride[args[1]].velo = args[2] + 1; res = 0; } break; case 259: - if (_soundOverride2[args[1]].type == 0) { + if (_soundOverride[args[1]].type == 0) { ptr = _vm->getResourceAddress(rtSound, args[1]); if (READ_BE_UINT32(ptr) == MKID_BE('TOWS')) - _soundOverride2[args[1]].type = 7; + _soundOverride[args[1]].type = 7; } - if (_soundOverride2[args[1]].type == 7) { - _soundOverride2[args[1]].pan = 64 - CLIP(args[2], -63, 63); + if (_soundOverride[args[1]].type == 7) { + _soundOverride[args[1]].pan = 64 - CLIP(args[2], -63, 63); res = 0; } break; @@ -716,7 +716,7 @@ void Player_Towns_v2::saveLoadWithSerializer(Serializer *ser) { Player_Towns::saveLoadWithSerializer(ser); } -void Player_Towns_v2::playPcmTrackSBL(const uint8 *data) { +void Player_Towns_v2::playVocTrack(const uint8 *data) { static const uint8 header[] = { 0x54, 0x61, 0x6C, 0x6B, 0x69, 0x65, 0x20, 0x20, 0x78, 0x56, 0x34, 0x12, 0x00, 0x00, 0x00, 0x00, diff --git a/engines/scumm/player_towns.h b/engines/scumm/player_towns.h index 6916655899..e5023d25c2 100644 --- a/engines/scumm/player_towns.h +++ b/engines/scumm/player_towns.h @@ -72,23 +72,6 @@ protected: uint32 priority; } _pcmCurrentSound[9]; - struct SoundOvrParameters { - uint8 vLeft; - uint8 vRight; - uint8 note; - }; - - SoundOvrParameters *_soundOverride; - SoundOvrParameters _ovrCur; - - struct SoundOvrParameters2 { - uint8 velo; - uint8 pan; - uint8 type; - }; - - SoundOvrParameters2 *_soundOverride2; - uint8 _unkFlags; TownsAudioInterface *_intf; @@ -133,6 +116,14 @@ private: void playEuphonyTrack(int sound, const uint8 *data); void playCdaTrack(int sound, const uint8 *data, bool skipTrackVelo = false); + struct SoundOvrParameters { + uint8 vLeft; + uint8 vRight; + uint8 note; + }; + + SoundOvrParameters *_soundOverride; + uint8 _cdaVolLeft; uint8 _cdaVolRight; @@ -170,7 +161,15 @@ public: void saveLoadWithSerializer(Serializer *ser); private: - void playPcmTrackSBL(const uint8 *data); + void playVocTrack(const uint8 *data); + + struct SoundOvrParameters { + uint8 velo; + uint8 pan; + uint8 type; + }; + + SoundOvrParameters *_soundOverride; uint8 *_sblData; IMuse *_imuse; -- cgit v1.2.3