diff options
author | athrxx | 2012-11-11 03:01:39 +0100 |
---|---|---|
committer | athrxx | 2012-11-11 19:14:31 +0100 |
commit | 93e69aa4da0558b05fc235684355ed38eed9863d (patch) | |
tree | b809c595a60ce23e2dcb27ae7d4a9f9fa68d7530 /engines/kyra | |
parent | 1bb8f22567e71796bba4f98a6ff4353ec84df197 (diff) | |
download | scummvm-rg350-93e69aa4da0558b05fc235684355ed38eed9863d.tar.gz scummvm-rg350-93e69aa4da0558b05fc235684355ed38eed9863d.tar.bz2 scummvm-rg350-93e69aa4da0558b05fc235684355ed38eed9863d.zip |
KYRA: clean up audio resource handling
(this was really ugly, now it's somewhat less ugly)
Diffstat (limited to 'engines/kyra')
-rw-r--r-- | engines/kyra/kyra_hof.cpp | 2 | ||||
-rw-r--r-- | engines/kyra/kyra_hof.h | 3 | ||||
-rw-r--r-- | engines/kyra/kyra_lok.cpp | 8 | ||||
-rw-r--r-- | engines/kyra/kyra_lok.h | 10 | ||||
-rw-r--r-- | engines/kyra/kyra_v1.h | 12 | ||||
-rw-r--r-- | engines/kyra/lol.cpp | 2 | ||||
-rw-r--r-- | engines/kyra/lol.h | 4 | ||||
-rw-r--r-- | engines/kyra/saveload_lok.cpp | 2 | ||||
-rw-r--r-- | engines/kyra/sequences_hof.cpp | 22 | ||||
-rw-r--r-- | engines/kyra/sequences_lol.cpp | 8 | ||||
-rw-r--r-- | engines/kyra/sound.cpp | 23 | ||||
-rw-r--r-- | engines/kyra/sound.h | 62 | ||||
-rw-r--r-- | engines/kyra/sound_adlib.cpp | 27 | ||||
-rw-r--r-- | engines/kyra/sound_adlib.h | 7 | ||||
-rw-r--r-- | engines/kyra/sound_amiga.cpp | 16 | ||||
-rw-r--r-- | engines/kyra/sound_intern.h | 39 | ||||
-rw-r--r-- | engines/kyra/sound_midi.cpp | 28 | ||||
-rw-r--r-- | engines/kyra/sound_towns.cpp | 106 | ||||
-rw-r--r-- | engines/kyra/staticres.cpp | 102 | ||||
-rw-r--r-- | engines/kyra/staticres_lol.cpp | 36 |
20 files changed, 314 insertions, 205 deletions
diff --git a/engines/kyra/kyra_hof.cpp b/engines/kyra/kyra_hof.cpp index d8d4f69d18..c53731ec35 100644 --- a/engines/kyra/kyra_hof.cpp +++ b/engines/kyra/kyra_hof.cpp @@ -274,7 +274,7 @@ Common::Error KyraEngine_HoF::go() { } void KyraEngine_HoF::startup() { - _sound->setSoundList(&_soundData[kMusicIngame]); + _sound->selectAudioResourceSet(kMusicIngame); // The track map is exactly the same // for FM-TOWNS and DOS _trackMap = _dosTrackMap; diff --git a/engines/kyra/kyra_hof.h b/engines/kyra/kyra_hof.h index 3ee6446436..a9831d0e6c 100644 --- a/engines/kyra/kyra_hof.h +++ b/engines/kyra/kyra_hof.h @@ -57,7 +57,6 @@ public: GUI *gui() const { return _gui; } virtual TextDisplayer *text() { return _text; } int language() const { return _lang; } - const AudioDataStruct *soundData(int index) { return &_soundData[index]; } protected: static const EngineDesc _hofEngineDesc; @@ -87,8 +86,6 @@ protected: static const int8 _pcSpkSfxMap[]; static const int _pcSpkSfxMapSize; - AudioDataStruct _soundData[3]; - protected: // game initialization void startup(); diff --git a/engines/kyra/kyra_lok.cpp b/engines/kyra/kyra_lok.cpp index 27bc2ad22a..7d4e35092f 100644 --- a/engines/kyra/kyra_lok.cpp +++ b/engines/kyra/kyra_lok.cpp @@ -98,8 +98,6 @@ KyraEngine_LoK::KyraEngine_LoK(OSystem *system, const GameFlags &flags) _malcolmFrame = 0; _malcolmTimer1 = _malcolmTimer2 = 0; - - _soundFiles = 0; } KyraEngine_LoK::~KyraEngine_LoK() { @@ -123,8 +121,6 @@ KyraEngine_LoK::~KyraEngine_LoK() { delete _animator; delete _seq; - delete[] _soundFiles; - delete[] _characterList; delete[] _roomTable; @@ -194,7 +190,7 @@ Common::Error KyraEngine_LoK::init() { initStaticResource(); - _sound->setSoundList(&_soundData[kMusicIntro]); + _sound->selectAudioResourceSet(kMusicIntro); if (_flags.platform == Common::kPlatformAmiga) { _trackMap = _amigaTrackMap; @@ -349,7 +345,7 @@ void KyraEngine_LoK::startup() { static const uint8 colorMap[] = { 0, 0, 0, 0, 12, 12, 12, 0, 0, 0, 0, 0 }; _screen->setTextColorMap(colorMap); - _sound->setSoundList(&_soundData[kMusicIngame]); + _sound->selectAudioResourceSet(kMusicIngame); if (_flags.platform == Common::kPlatformPC98) _sound->loadSoundFile("SE.DAT"); else diff --git a/engines/kyra/kyra_lok.h b/engines/kyra/kyra_lok.h index 71177f59e8..7470dd871b 100644 --- a/engines/kyra/kyra_lok.h +++ b/engines/kyra/kyra_lok.h @@ -134,8 +134,6 @@ public: const uint8 * const *palTable1() { return &_specialPalettes[0]; } const uint8 * const *palTable2() { return &_specialPalettes[29]; } - const AudioDataStruct *soundData(int index) { return &_soundData[index]; } - protected: virtual Common::Error go(); virtual Common::Error init(); @@ -645,14 +643,6 @@ protected: const uint8 * const *_specialPalettes; - const char * const *_soundFiles; - int _soundFilesSize; - const char * const *_soundFilesIntro; - int _soundFilesIntroSize; - const int32 *_cdaTrackTable; - int _cdaTrackTableSize; - AudioDataStruct _soundData[3]; - // positions of the inventory static const uint16 _itemPosX[]; static const uint8 _itemPosY[]; diff --git a/engines/kyra/kyra_v1.h b/engines/kyra/kyra_v1.h index d91255327f..79903e6f39 100644 --- a/engines/kyra/kyra_v1.h +++ b/engines/kyra/kyra_v1.h @@ -140,14 +140,6 @@ enum { GI_EOB2 = 6 }; -struct AudioDataStruct { - const char *const *fileList; - int fileListLen; - const void *cdaTracks; - int cdaNumTracks; - int extraOffset; -}; - // TODO: this is just the start of makeing the debug output of the kyra engine a bit more useable // in the future we maybe merge some flags and/or create new ones enum DebugLevels { @@ -164,7 +156,7 @@ enum DebugLevels { kDebugLevelTimer = 1 << 10 ///< debug level for "TimerManager" functions }; -enum MusicDataID { +enum AudioResourceSet { kMusicIntro = 0, kMusicIngame, kMusicFinale @@ -243,8 +235,6 @@ public: virtual bool snd_voiceIsPlaying(); virtual void snd_stopVoice(); - virtual const AudioDataStruct *soundData(int index) { return 0; } - // delay functionallity virtual void delayUntil(uint32 timestamp, bool updateGameTimers = false, bool update = false, bool isMainLoop = false); virtual void delay(uint32 millis, bool update = false, bool isMainLoop = false); diff --git a/engines/kyra/lol.cpp b/engines/kyra/lol.cpp index ed7fe52446..dcfd2b7e10 100644 --- a/engines/kyra/lol.cpp +++ b/engines/kyra/lol.cpp @@ -534,7 +534,7 @@ Common::Error LoLEngine::go() { if (_flags.platform == Common::kPlatformPC98) _sound->loadSoundFile("sound.dat"); - _sound->setSoundList(&_soundData[kMusicIngame]); + _sound->selectAudioResourceSet(kMusicIngame); if (_flags.platform != Common::kPlatformPC) _sound->loadSoundFile(0); diff --git a/engines/kyra/lol.h b/engines/kyra/lol.h index 06f9e32285..be2d83357d 100644 --- a/engines/kyra/lol.h +++ b/engines/kyra/lol.h @@ -275,8 +275,6 @@ public: Screen *screen(); GUI *gui() const; - const AudioDataStruct *soundData(int index) { return &_soundData[index]; } - private: Screen_LoL *_screen; GUI_LoL *_gui; @@ -472,8 +470,6 @@ private: const uint8 *_ingamePCSpeakerSoundIndex; int _ingamePCSpeakerSoundIndexSize; - AudioDataStruct _soundData[3]; - // gui void gui_drawPlayField(); void gui_drawScene(int pageNum); diff --git a/engines/kyra/saveload_lok.cpp b/engines/kyra/saveload_lok.cpp index b76d1da52a..f8cca1ab7b 100644 --- a/engines/kyra/saveload_lok.cpp +++ b/engines/kyra/saveload_lok.cpp @@ -150,7 +150,7 @@ Common::Error KyraEngine_LoK::loadGameState(int slot) { // it wasn't made sure that _curSfxFile was initialized // so if it's out of bounds we just set it to 0. if (_flags.platform == Common::kPlatformFMTowns) { - if (_curSfxFile >= _soundData->fileListLen || _curSfxFile < 0) + if (!_sound->hasSoundFile(_curSfxFile)) _curSfxFile = 0; _sound->loadSoundFile(_curSfxFile); } diff --git a/engines/kyra/sequences_hof.cpp b/engines/kyra/sequences_hof.cpp index 7f105bf25a..7b9e91db73 100644 --- a/engines/kyra/sequences_hof.cpp +++ b/engines/kyra/sequences_hof.cpp @@ -153,7 +153,7 @@ private: void closeNestedAnimation(int animSlot); void unloadNestedAnimation(int animSlot); void doNestedFrameTransition(int transitionType, int animSlot); - void updateAllNestedAnimations(); + void updateAllNestedAnimations(); bool updateNestedAnimation(int animSlot); struct AnimSlot { @@ -478,7 +478,7 @@ SeqPlayer_HOF::~SeqPlayer_HOF() { int SeqPlayer_HOF::play(SequenceID firstScene, SequenceID loopStartScene) { bool incompatibleData = false; - MusicDataID soundSet = kMusicIntro; + AudioResourceSet soundSet = kMusicIntro; _firstScene = firstScene; _loopStartScene = loopStartScene; _preventLooping = false; @@ -521,7 +521,7 @@ int SeqPlayer_HOF::play(SequenceID firstScene, SequenceID loopStartScene) { if (incompatibleData) error("SeqPlayer_HOF::play(): Specified sequences do not match the available sequence data for this target"); - _vm->sound()->setSoundList(_vm->soundData(soundSet)); + _vm->sound()->selectAudioResourceSet(soundSet); _vm->sound()->loadSoundFile(0); setupCallbacks(); @@ -536,7 +536,7 @@ void SeqPlayer_HOF::pause(bool toggle) { } else { uint32 pausedTime = _system->getMillis() - _pauseStart; _pauseStart = 0; - + _countDownLastUpdate += pausedTime; _fisherAnimCurTime += pausedTime; _specialAnimTimeOutTotal += pausedTime; @@ -702,7 +702,7 @@ void SeqPlayer_HOF::playScenes() { while (!checkAbortPlayback() && !_vm->shouldQuit() && (countDownRunning() || _updateAnimations)) { uint32 endFrame = (_system->getMillis() + _vm->tickLength()) & ~(_vm->tickLength() - 1); updateAllNestedAnimations(); - + if (_config->seqProc[_curScene]) (this->*_config->seqProc[_curScene])(0, 0, 0, 0); @@ -715,7 +715,7 @@ void SeqPlayer_HOF::playScenes() { do { if (checkAbortPlayback()) if (checkPlaybackStatus()) - break; + break; } while (_system->getMillis() < endFrame); } } @@ -968,7 +968,7 @@ void SeqPlayer_HOF::playAnimation(WSAMovie_v2 *wsaObj, int startFrame, int lastF } int8 frameStep = (startFrame > lastFrame) ? -1 : 1; - _animCurrentFrame = startFrame; + _animCurrentFrame = startFrame; while (!_vm->shouldQuit() && !finished) { if (checkAbortPlayback()) @@ -1474,7 +1474,7 @@ void SeqPlayer_HOF::playHoFTalkieCredits() { const uint8 *talkieCredits = _vm->staticres()->loadRawData(k2SeqplayCredits, talkieCreditsSize); const char * const *talkieCreditsSpecial = _vm->staticres()->loadStrings(k2SeqplayCreditsSpecial, talkieCreditsSpecialSize); - _vm->sound()->setSoundList(_vm->soundData(kMusicIngame)); + _vm->sound()->selectAudioResourceSet(kMusicIngame); _vm->sound()->loadSoundFile(3); _vm->sound()->playTrack(3); @@ -1493,7 +1493,7 @@ void SeqPlayer_HOF::playHoFTalkieCredits() { delete[] dataPtr; _vm->staticres()->unloadId(k2SeqplayCreditsSpecial); - _vm->sound()->setSoundList(_vm->soundData(kMusicFinale)); + _vm->sound()->selectAudioResourceSet(kMusicFinale); _vm->sound()->loadSoundFile(0); } @@ -1735,7 +1735,7 @@ void SeqPlayer_HOF::setCountDown(uint32 ticks) { _countDownRemainder = _countDownRemainder * 2 / 3; _countDownLastUpdate = _system->getMillis() & ~(_vm->tickLength() - 1); } - + bool SeqPlayer_HOF::countDownRunning() { uint32 cur = _system->getMillis(); uint32 step = cur - _countDownLastUpdate; @@ -1770,7 +1770,7 @@ int SeqPlayer_HOF::cbHOF_title(WSAMovie_v2 *wsaObj, int x, int y, int frm) { _system->updateScreen(); _result = _menu->handle(11) + 1; _updateAnimations = false; - + if (_result == 1) { _curScene = _lastScene; _preventLooping = true; diff --git a/engines/kyra/sequences_lol.cpp b/engines/kyra/sequences_lol.cpp index 44f97f381c..83005367d7 100644 --- a/engines/kyra/sequences_lol.cpp +++ b/engines/kyra/sequences_lol.cpp @@ -182,7 +182,7 @@ void LoLEngine::setupPrologueData(bool load) { memset(_selectionAnimTimers, 0, sizeof(_selectionAnimTimers)); _screen->getPalette(1).clear(); - _sound->setSoundList(&_soundData[kMusicIntro]); + _sound->selectAudioResourceSet(kMusicIntro); // We have three sound.dat files, one for the intro, one for the // end sequence and one for ingame, each contained in a different @@ -203,7 +203,7 @@ void LoLEngine::setupPrologueData(bool load) { return; _eventList.clear(); - _sound->setSoundList(0); + _sound->selectAudioResourceSet(kMusicIntro); } } @@ -1041,7 +1041,7 @@ void LoLEngine::setupEpilogueData(bool load) { _screen->clearPage(3); if (load) { - _sound->setSoundList(&_soundData[kMusicFinale]); + _sound->selectAudioResourceSet(kMusicFinale); // We have three sound.dat files, one for the intro, one for the // end sequence and one for ingame, each contained in a different @@ -1057,7 +1057,7 @@ void LoLEngine::setupEpilogueData(bool load) { return; _eventList.clear(); - _sound->setSoundList(0); + _sound->selectAudioResourceSet(kMusicIntro); } } diff --git a/engines/kyra/sound.cpp b/engines/kyra/sound.cpp index 9d3e5f67f5..7b1b4d82f4 100644 --- a/engines/kyra/sound.cpp +++ b/engines/kyra/sound.cpp @@ -37,7 +37,7 @@ namespace Kyra { Sound::Sound(KyraEngine_v1 *vm, Audio::Mixer *mixer) : _vm(vm), _mixer(mixer), _soundChannels(), _musicEnabled(1), - _sfxEnabled(true), _soundDataList(0) { + _sfxEnabled(true) { } Sound::~Sound() { @@ -47,14 +47,6 @@ Sound::kType Sound::getSfxType() const { return getMusicType(); } -void Sound::setSoundList(const AudioDataStruct *list) { - _soundDataList = list; -} - -bool Sound::hasSoundFile(uint file) const { - return (fileListEntry(file) != 0); -} - bool Sound::isPlaying() const { return false; } @@ -203,12 +195,17 @@ void MixedSoundDriver::updateVolumeSettings() { _sfx->updateVolumeSettings(); } -void MixedSoundDriver::setSoundList(const AudioDataStruct *list) { - _music->setSoundList(list); - _sfx->setSoundList(list); +void MixedSoundDriver::initAudioResourceInfo(int set, void *info) { + _music->initAudioResourceInfo(set, info); + _sfx->initAudioResourceInfo(set, info); +} + +void MixedSoundDriver::selectAudioResourceSet(int set) { + _music->selectAudioResourceSet(set); + _sfx->selectAudioResourceSet(set); } -bool MixedSoundDriver::hasSoundFile(uint file) const { +bool MixedSoundDriver::hasSoundFile(uint file) { return _music->hasSoundFile(file) && _sfx->hasSoundFile(file); } diff --git a/engines/kyra/sound.h b/engines/kyra/sound.h index 384aeb4f35..48d9b60419 100644 --- a/engines/kyra/sound.h +++ b/engines/kyra/sound.h @@ -37,6 +37,35 @@ class SeekableAudioStream; namespace Kyra { +// Helper structs to format the data passed to the various initAudioResourceInfo() implementations +struct SoundResourceInfo_PC { + SoundResourceInfo_PC(const char *const *files, int numFiles) : fileList(files), fileListSize(numFiles) {} + const char *const *fileList; + int fileListSize; +}; + +struct SoundResourceInfo_Towns { + SoundResourceInfo_Towns(const char *const *files, int numFiles, const int32 *cdaTbl, int cdaTblSize) : fileList(files), fileListSize(numFiles), cdaTable(cdaTbl), cdaTableSize(cdaTblSize) {} + const char *const *fileList; + int fileListSize; + const int32 *cdaTable; + int cdaTableSize; +}; + +struct SoundResourceInfo_PC98 { + SoundResourceInfo_PC98(const char *fileNamePattern) : pattern(fileNamePattern) {} + const char *pattern; +}; + +struct SoundResourceInfo_TownsPC98V2 { + SoundResourceInfo_TownsPC98V2(const char *const *files, int numFiles, const char *fileNamePattern, const uint16 *cdaTbl, int cdaTblSize) : fileList(files), fileListSize(numFiles), pattern(fileNamePattern), cdaTable(cdaTbl), cdaTableSize(cdaTblSize) {} + const char *const *fileList; + int fileListSize; + const char *pattern; + const uint16 *cdaTable; + int cdaTableSize; +}; + /** * Analog audio output device API for Kyrandia games. * It contains functionality to play music tracks, @@ -78,12 +107,20 @@ public: virtual void updateVolumeSettings() {} /** - * Sets the soundfiles the output device will use - * when playing a track and/or sound effect. + * Assigns static resource data with information on how to load + * audio resources to * - * @param list soundfile list + * @param set value defined in AudioResourceSet enum + * info various types of resource info data (file list, file name pattern, struct, etc. - depending on the inheriting driver type) */ - virtual void setSoundList(const AudioDataStruct *list); + virtual void initAudioResourceInfo(int set, void *info) = 0; + + /** + * Select audio resource set. + * + * @param set value defined in AudioResourceSet enum + */ + virtual void selectAudioResourceSet(int set) = 0; /** * Checks if a given sound file is present. @@ -91,7 +128,7 @@ public: * @param track track number * @return true if available, false otherwise */ - virtual bool hasSoundFile(uint file) const; + virtual bool hasSoundFile(uint file) = 0; /** * Load a specifc sound file for use of @@ -228,12 +265,6 @@ public: */ virtual void resetTrigger() {} protected: - const char *fileListEntry(int file) const { return (_soundDataList != 0 && file >= 0 && file < _soundDataList->fileListLen) ? _soundDataList->fileList[file] : ""; } - int fileListLen() const { return _soundDataList->fileListLen; } - const void *cdaData() const { return _soundDataList != 0 ? _soundDataList->cdaTracks : 0; } - int cdaTrackNum() const { return _soundDataList != 0 ? _soundDataList->cdaNumTracks : 0; } - int extraOffset() const { return _soundDataList != 0 ? _soundDataList->extraOffset : 0; } - enum { kNumChannelHandles = 4 }; @@ -243,7 +274,7 @@ protected: Audio::SoundHandle handle; int priority; }; - + SoundChannel _soundChannels[kNumChannelHandles]; int _musicEnabled; @@ -253,8 +284,6 @@ protected: Audio::Mixer *_mixer; private: - const AudioDataStruct *_soundDataList; - struct SpeechCodecs { const char *fileext; Audio::SeekableAudioStream *(*streamFunc)( @@ -278,8 +307,9 @@ public: virtual void updateVolumeSettings(); - virtual void setSoundList(const AudioDataStruct *list); - virtual bool hasSoundFile(uint file) const; + virtual void initAudioResourceInfo(int set, void *info); + virtual void selectAudioResourceSet(int set); + virtual bool hasSoundFile(uint file); virtual void loadSoundFile(uint file); virtual void loadSoundFile(Common::String file); diff --git a/engines/kyra/sound_adlib.cpp b/engines/kyra/sound_adlib.cpp index 668e662413..3d4ad1f852 100644 --- a/engines/kyra/sound_adlib.cpp +++ b/engines/kyra/sound_adlib.cpp @@ -2292,6 +2292,8 @@ SoundAdLibPC::SoundAdLibPC(KyraEngine_v1 *vm, Audio::Mixer *mixer) _numSoundTriggers = 0; _sfxPlayingSound = -1; _soundFileLoaded.clear(); + _currentResourceSet = 0; + memset(&_resInfo, 0, sizeof(_resInfo)); switch (vm->game()) { case GI_LOL: @@ -2322,6 +2324,8 @@ SoundAdLibPC::SoundAdLibPC(KyraEngine_v1 *vm, Audio::Mixer *mixer) SoundAdLibPC::~SoundAdLibPC() { delete _driver; delete[] _soundDataPtr; + for (int i = 0; i < 3; i++) + initAudioResourceInfo(i, 0); } bool SoundAdLibPC::init() { @@ -2416,8 +2420,29 @@ void SoundAdLibPC::resetTrigger() { _driver->resetSoundTrigger(); } +void SoundAdLibPC::initAudioResourceInfo(int set, void *info) { + if (set >= kMusicIntro && set <= kMusicFinale) { + delete _resInfo[set]; + _resInfo[set] = info ? new SoundResourceInfo_PC(*(SoundResourceInfo_PC*)info) : 0; + } +} + +void SoundAdLibPC::selectAudioResourceSet(int set) { + if (set >= kMusicIntro && set <= kMusicFinale) { + if (_resInfo[set]) + _currentResourceSet = set; + } +} + +bool SoundAdLibPC::hasSoundFile(uint file) { + if (file < res()->fileListSize) + return (res()->fileList[file] != 0); + return false; +} + void SoundAdLibPC::loadSoundFile(uint file) { - internalLoadFile(fileListEntry(file)); + if (file < res()->fileListSize) + internalLoadFile(res()->fileList[file]); } void SoundAdLibPC::loadSoundFile(Common::String file) { diff --git a/engines/kyra/sound_adlib.h b/engines/kyra/sound_adlib.h index 8492f3b99a..99e1f154c5 100644 --- a/engines/kyra/sound_adlib.h +++ b/engines/kyra/sound_adlib.h @@ -69,6 +69,9 @@ public: virtual void updateVolumeSettings(); + virtual void initAudioResourceInfo(int set, void *info); + virtual void selectAudioResourceSet(int set); + virtual bool hasSoundFile(uint file); virtual void loadSoundFile(uint file); virtual void loadSoundFile(Common::String file); @@ -87,6 +90,10 @@ private: void play(uint8 track, uint8 volume); + const SoundResourceInfo_PC *res() {return _resInfo[_currentResourceSet]; } + SoundResourceInfo_PC *_resInfo[3]; + int _currentResourceSet; + AdLibDriver *_driver; int _version; diff --git a/engines/kyra/sound_amiga.cpp b/engines/kyra/sound_amiga.cpp index ec2748dd38..5962d6f4fe 100644 --- a/engines/kyra/sound_amiga.cpp +++ b/engines/kyra/sound_amiga.cpp @@ -53,6 +53,22 @@ bool SoundAmiga::init() { return _driver != 0 && _tableSfxIntro && _tableSfxGame; } +void SoundAmiga::initAudioResourceInfo(int set, void *info) { + // See comment below +} + +void SoundAmiga::selectAudioResourceSet(int set) { + // It seems that loadSoundFile() is doing what would normally be done in here. + // As long as this driver is only required for one single target (Kyra 1 Amiga) + // this doesn't matter much. +} + +bool SoundAmiga::hasSoundFile(uint file) { + if (file < 3) + return true; + return false; +} + void SoundAmiga::loadSoundFile(uint file) { debugC(5, kDebugLevelSound, "SoundAmiga::loadSoundFile(%d)", file); diff --git a/engines/kyra/sound_intern.h b/engines/kyra/sound_intern.h index e09fe7e360..94f596f402 100644 --- a/engines/kyra/sound_intern.h +++ b/engines/kyra/sound_intern.h @@ -23,6 +23,8 @@ #ifndef KYRA_SOUND_INTERN_H #define KYRA_SOUND_INTERN_H + + #include "kyra/sound.h" #include "kyra/sound_adlib.h" @@ -40,6 +42,7 @@ class MaxTrax; } // End of namespace Audio namespace Kyra { + class MidiOutput; /** @@ -59,6 +62,9 @@ public: void updateVolumeSettings(); + void initAudioResourceInfo(int set, void *info); + void selectAudioResourceSet(int set); + bool hasSoundFile(uint file); void loadSoundFile(uint file); void loadSoundFile(Common::String file); void loadSfxFile(Common::String file); @@ -89,6 +95,10 @@ private: MidiParser *_music; MidiParser *_sfx[3]; + const SoundResourceInfo_PC *res() {return _resInfo[_currentResourceSet]; } + SoundResourceInfo_PC *_resInfo[3]; + int _currentResourceSet; + // misc kType _type; Common::String getFileName(const Common::String &str); @@ -110,6 +120,9 @@ public: bool init(); void process(); + void initAudioResourceInfo(int set, void *info); + void selectAudioResourceSet(int set); + bool hasSoundFile(uint file); void loadSoundFile(uint file); void loadSoundFile(Common::String) {} @@ -142,6 +155,10 @@ private: bool _cdaPlaying; + const SoundResourceInfo_Towns *res() {return _resInfo[_currentResourceSet]; } + SoundResourceInfo_Towns *_resInfo[3]; + int _currentResourceSet; + const uint8 *_musicFadeTable; const uint8 *_sfxBTTable; const uint8 *_sfxWDTable; @@ -157,6 +174,9 @@ public: bool init(); void process() {} + void initAudioResourceInfo(int set, void *info); + void selectAudioResourceSet(int set); + bool hasSoundFile(uint file); void loadSoundFile(uint file); void loadSoundFile(Common::String file); @@ -169,11 +189,15 @@ public: void updateVolumeSettings(); -protected: +private: int _lastTrack; uint8 *_musicTrackData; uint8 *_sfxTrackData; TownsPC98_AudioDriver *_driver; + + const char *resPattern() {return _resInfo[_currentResourceSet]->c_str(); } + Common::String *_resInfo[3]; + int _currentResourceSet; }; class SoundTownsPC98_v2 : public Sound { @@ -186,6 +210,9 @@ public: bool init(); void process(); + void initAudioResourceInfo(int set, void *info); + void selectAudioResourceSet(int set); + bool hasSoundFile(uint file); void loadSoundFile(uint file) {} void loadSoundFile(Common::String file); @@ -198,7 +225,7 @@ public: void updateVolumeSettings(); -protected: +private: Audio::AudioStream *_currentSFX; int _lastTrack; bool _useFmSfx; @@ -206,6 +233,10 @@ protected: uint8 *_musicTrackData; uint8 *_sfxTrackData; TownsPC98_AudioDriver *_driver; + + const SoundResourceInfo_TownsPC98V2 *res() {return _resInfo[_currentResourceSet]; } + SoundResourceInfo_TownsPC98V2 *_resInfo[3]; + int _currentResourceSet; }; // PC Speaker MIDI driver @@ -295,6 +326,10 @@ public: bool init(); void process() {} + + void initAudioResourceInfo(int set, void *info); + void selectAudioResourceSet(int set); + bool hasSoundFile(uint file); void loadSoundFile(uint file); void loadSoundFile(Common::String) {} diff --git a/engines/kyra/sound_midi.cpp b/engines/kyra/sound_midi.cpp index 70cc304192..fe40cb163a 100644 --- a/engines/kyra/sound_midi.cpp +++ b/engines/kyra/sound_midi.cpp @@ -442,6 +442,8 @@ SoundMidiPC::SoundMidiPC(KyraEngine_v1 *vm, Audio::Mixer *mixer, MidiDriver *dri _output = 0; _musicFile = _sfxFile = 0; + _currentResourceSet = 0; + memset(&_resInfo, 0, sizeof(_resInfo)); _music = MidiParser::createParser_XMIDI(); assert(_music); @@ -495,6 +497,9 @@ SoundMidiPC::~SoundMidiPC() { delete[] _sfxFile; delete[] _musicFile; + + for (int i = 0; i < 3; i++) + initAudioResourceInfo(i, 0); } bool SoundMidiPC::init() { @@ -586,8 +591,29 @@ void SoundMidiPC::updateVolumeSettings() { _output->setSourceVolume(i, _sfxVolume, false); } +void SoundMidiPC::initAudioResourceInfo(int set, void *info) { + if (set >= kMusicIntro && set <= kMusicFinale) { + delete _resInfo[set]; + _resInfo[set] = info ? new SoundResourceInfo_PC(*(SoundResourceInfo_PC*)info) : 0; + } +} + +void SoundMidiPC::selectAudioResourceSet(int set) { + if (set >= kMusicIntro && set <= kMusicFinale) { + if (_resInfo[set]) + _currentResourceSet = set; + } +} + +bool SoundMidiPC::hasSoundFile(uint file) { + if (file < res()->fileListSize) + return (res()->fileList[file] != 0); + return false; +} + void SoundMidiPC::loadSoundFile(uint file) { - loadSoundFile(fileListEntry(file)); + if (file < res()->fileListSize) + loadSoundFile(res()->fileList[file]); } void SoundMidiPC::loadSoundFile(Common::String file) { diff --git a/engines/kyra/sound_towns.cpp b/engines/kyra/sound_towns.cpp index 01624d510b..c9a4e207f9 100644 --- a/engines/kyra/sound_towns.cpp +++ b/engines/kyra/sound_towns.cpp @@ -35,8 +35,8 @@ namespace Kyra { SoundTowns::SoundTowns(KyraEngine_v1 *vm, Audio::Mixer *mixer) : Sound(vm, mixer), _lastTrack(-1), _musicTrackData(0), _sfxFileData(0), _cdaPlaying(0), - _sfxFileIndex((uint)-1), _musicFadeTable(0), _sfxWDTable(0), _sfxBTTable(0), _sfxChannel(0x46) { - + _sfxFileIndex((uint)-1), _musicFadeTable(0), _sfxWDTable(0), _sfxBTTable(0), _sfxChannel(0x46), _currentResourceSet(0) { + memset(&_resInfo, 0, sizeof(_resInfo)); _driver = new TownsEuphonyDriver(_mixer); } @@ -46,6 +46,8 @@ SoundTowns::~SoundTowns() { delete _driver; delete[] _musicTrackData; delete[] _sfxFileData; + for (int i = 0; i < 3; i++) + initAudioResourceInfo(i, 0); } bool SoundTowns::init() { @@ -78,11 +80,12 @@ void SoundTowns::playTrack(uint8 track) { return; track -= 2; - const int32 *const tTable = (const int32 *)cdaData(); int tTableIndex = 3 * track; - int trackNum = (int)READ_LE_UINT32(&tTable[tTableIndex + 2]); - int32 loop = (int32)READ_LE_UINT32(&tTable[tTableIndex + 1]); + assert(tTableIndex + 2 < res()->cdaTableSize); + + int trackNum = (int)READ_LE_UINT32(&res()->cdaTable[tTableIndex + 2]); + int32 loop = (int32)READ_LE_UINT32(&res()->cdaTable[tTableIndex + 1]); if (track == _lastTrack && _musicEnabled) return; @@ -95,7 +98,7 @@ void SoundTowns::playTrack(uint8 track) { g_system->getAudioCDManager()->updateCD(); _cdaPlaying = true; } else if (_musicEnabled) { - playEuphonyTrack(READ_LE_UINT32(&tTable[tTableIndex]), loop); + playEuphonyTrack(READ_LE_UINT32(&res()->cdaTable[tTableIndex]), loop); _cdaPlaying = false; } @@ -117,12 +120,31 @@ void SoundTowns::haltTrack() { _driver->stopParser(); } +void SoundTowns::initAudioResourceInfo(int set, void *info) { + if (set >= kMusicIntro && set <= kMusicFinale) { + delete _resInfo[set]; + _resInfo[set] = info ? new SoundResourceInfo_Towns(*(SoundResourceInfo_Towns*)info) : 0; + } +} + +void SoundTowns::selectAudioResourceSet(int set) { + if (set >= kMusicIntro && set <= kMusicFinale) { + if (_resInfo[set]) + _currentResourceSet = set; + } +} + +bool SoundTowns::hasSoundFile(uint file) { + if (file < res()->fileListSize) + return (res()->fileList[file] != 0); +} + void SoundTowns::loadSoundFile(uint file) { - if (_sfxFileIndex == file) + if (_sfxFileIndex == file || file >= res()->fileListSize) return; _sfxFileIndex = file; delete[] _sfxFileData; - _sfxFileData = _vm->resource()->fileData(fileListEntry(file), 0); + _sfxFileData = _vm->resource()->fileData(res()->fileList[file], 0); } void SoundTowns::playSoundEffect(uint8 track, uint8) { @@ -367,13 +389,16 @@ void SoundTowns::fadeOutSoundEffects() { } SoundPC98::SoundPC98(KyraEngine_v1 *vm, Audio::Mixer *mixer) : - Sound(vm, mixer), _musicTrackData(0), _sfxTrackData(0), _lastTrack(-1), _driver(0) { + Sound(vm, mixer), _musicTrackData(0), _sfxTrackData(0), _lastTrack(-1), _driver(0), _currentResourceSet(0) { + memset(&_resInfo, 0, sizeof(_resInfo)); } SoundPC98::~SoundPC98() { delete[] _musicTrackData; delete[] _sfxTrackData; delete _driver; + for (int i = 0; i < 3; i++) + initAudioResourceInfo(i, 0); } bool SoundPC98::init() { @@ -383,8 +408,26 @@ bool SoundPC98::init() { return reslt; } -void SoundPC98::loadSoundFile(uint file) { - if (!scumm_strnicmp(fileListEntry(0), "INTRO", 5)) { +void SoundPC98::initAudioResourceInfo(int set, void *info) { + if (set >= kMusicIntro && set <= kMusicFinale) { + delete _resInfo[set]; + _resInfo[set] = info ? new Common::String(((SoundResourceInfo_PC98*)info)->pattern) : 0; + } +} + +void SoundPC98::selectAudioResourceSet(int set) { + if (set >= kMusicIntro && set <= kMusicFinale) { + if (_resInfo[set]) + _currentResourceSet = set; + } +} + +bool SoundPC98::hasSoundFile(uint file) { + return true; +} + +void SoundPC98::loadSoundFile(uint) { + if (_currentResourceSet == kMusicIntro) { delete[] _sfxTrackData; _sfxTrackData = 0; @@ -407,14 +450,14 @@ void SoundPC98::loadSoundFile(Common::String file) { } void SoundPC98::playTrack(uint8 track) { - track += extraOffset(); + track -= 1; if (track == _lastTrack && _musicEnabled) return; beginFadeOut(); - Common::String musicFile = fileListLen() == 1 ? Common::String::format(fileListEntry(0), track) : fileListEntry(track); + Common::String musicFile = Common::String::format(resPattern(), track); delete[] _musicTrackData; _musicTrackData = _vm->resource()->fileData(musicFile.c_str(), 0); if (_musicEnabled) @@ -464,13 +507,16 @@ void SoundPC98::updateVolumeSettings() { // KYRA 2 SoundTownsPC98_v2::SoundTownsPC98_v2(KyraEngine_v1 *vm, Audio::Mixer *mixer) : - Sound(vm, mixer), _currentSFX(0), _musicTrackData(0), _sfxTrackData(0), _lastTrack(-1), _driver(0), _useFmSfx(false) { + Sound(vm, mixer), _currentSFX(0), _musicTrackData(0), _sfxTrackData(0), _lastTrack(-1), _driver(0), _useFmSfx(false), _currentResourceSet(0) { + memset(&_resInfo, 0, sizeof(_resInfo)); } SoundTownsPC98_v2::~SoundTownsPC98_v2() { delete[] _musicTrackData; delete[] _sfxTrackData; delete _driver; + for (int i = 0; i < 3; i++) + initAudioResourceInfo(i, 0); } bool SoundTownsPC98_v2::init() { @@ -503,6 +549,25 @@ bool SoundTownsPC98_v2::init() { return reslt; } +void SoundTownsPC98_v2::initAudioResourceInfo(int set, void *info) { + if (set >= kMusicIntro && set <= kMusicFinale) { + delete _resInfo[set]; + _resInfo[set] = info ? new SoundResourceInfo_TownsPC98V2(*(SoundResourceInfo_TownsPC98V2*)info) : 0; + } +} + +void SoundTownsPC98_v2::selectAudioResourceSet(int set) { + if (set >= kMusicIntro && set <= kMusicFinale) { + if (_resInfo[set]) + _currentResourceSet = set; + } +} + +bool SoundTownsPC98_v2::hasSoundFile(uint file) { + if (file < res()->fileListSize) + return (res()->fileList[file] != 0); +} + void SoundTownsPC98_v2::loadSoundFile(Common::String file) { delete[] _sfxTrackData; _sfxTrackData = _vm->resource()->fileData(file.c_str(), 0); @@ -513,18 +578,14 @@ void SoundTownsPC98_v2::process() { } void SoundTownsPC98_v2::playTrack(uint8 track) { - track += extraOffset(); - if (track == _lastTrack && _musicEnabled) return; - const uint16 *const cdaTracks = (const uint16 *)cdaData(); - int trackNum = -1; if (_vm->gameFlags().platform == Common::kPlatformFMTowns) { - for (int i = 0; i < cdaTrackNum(); i++) { - if (track == (uint8) READ_LE_UINT16(&cdaTracks[i * 2])) { - trackNum = (int) READ_LE_UINT16(&cdaTracks[i * 2 + 1]) - 1; + for (int i = 0; i < res()->cdaTableSize; i++) { + if (track == (uint8) READ_LE_UINT16(&res()->cdaTable[i * 2])) { + trackNum = (int) READ_LE_UINT16(&res()->cdaTable[i * 2 + 1]) - 1; break; } } @@ -532,9 +593,10 @@ void SoundTownsPC98_v2::playTrack(uint8 track) { beginFadeOut(); - Common::String musicFile = fileListLen() == 1 ? Common::String::format(fileListEntry(0), track) : fileListEntry(track); + Common::String musicFile = res()->pattern ? Common::String::format(res()->pattern, track) : (res()->fileList ? res()->fileList[track] : 0); if (musicFile.empty()) return; + delete[] _musicTrackData; _musicTrackData = _vm->resource()->fileData(musicFile.c_str(), 0); diff --git a/engines/kyra/staticres.cpp b/engines/kyra/staticres.cpp index 04e111b51e..5909931f9f 100644 --- a/engines/kyra/staticres.cpp +++ b/engines/kyra/staticres.cpp @@ -778,22 +778,6 @@ void KyraEngine_LoK::initStaticResource() { _storyStrings = _staticres->loadStrings(k1PC98StoryStrings, _storyStringsSize); - int size1, size2; - const char *const *soundfiles1 = _staticres->loadStrings(k1AudioTracks, size1); - const char *const *soundfiles2 = _staticres->loadStrings(k1AudioTracks2, size2); - _soundFilesSize = size1 + size2; - if (_soundFilesSize) { - delete[] _soundFiles; - const char **soundfiles = new const char*[_soundFilesSize]; - for (int i = 0; i < _soundFilesSize; i++) - soundfiles[i] = (i < size1) ? soundfiles1[i] : soundfiles2[i - size1]; - _soundFiles = soundfiles; - } - _soundFilesIntro = _staticres->loadStrings(k1AudioTracksIntro, _soundFilesIntroSize); - _cdaTrackTable = (const int32 *)_staticres->loadRawData(k1TownsCDATable, _cdaTrackTableSize); - - // copied static res - // room list const Room *tempRoomList = _staticres->loadRoomTable(k1RoomList, _roomTableSize); @@ -820,34 +804,34 @@ void KyraEngine_LoK::initStaticResource() { _staticres->unloadId(k1DefaultShapes); } - // audio data tables - static const char *const tIntro98[] = { "INTRO%d.DAT" }; - static const char *const tIngame98[] = { "KYRAM%d.DAT" }; + // audio resource assignment + int size1, size2; + const char *const *soundfiles1 = _staticres->loadStrings(k1AudioTracks, size1); + const char *const *soundfiles2 = _staticres->loadStrings(k1AudioTracks2, size2); + int soundFilesSize = size1 + size2; + int soundFilesIntroSize = 0; + int cdaTableSize = 0; + const char **soundFiles = 0; + + if (soundFilesSize) { + soundFiles = new const char*[soundFilesSize]; + for (int i = 0; i < soundFilesSize; i++) + soundFiles[i] = (i < size1) ? soundfiles1[i] : soundfiles2[i - size1]; + } + const char *const *soundFilesIntro = _staticres->loadStrings(k1AudioTracksIntro, temp); + const int32 *cdaTable = (const int32 *)_staticres->loadRawData(k1TownsCDATable, cdaTableSize); // FIXME: It seems Kyra1 MAC CD includes AdLib and MIDI music and sfx, thus we enable // support for those for now. (Based on patch #2767489 "Support for Mac Kyrandia 1 CD" by satz). - memset(_soundData, 0, sizeof(_soundData)); if (_flags.platform == Common::kPlatformPC || _flags.platform == Common::kPlatformMacintosh) { - _soundData[0].fileList = _soundFilesIntro; - _soundData[0].fileListLen = _soundFilesIntroSize; - _soundData[1].fileList = _soundFiles; - _soundData[1].fileListLen = _soundFilesSize; + _sound->initAudioResourceInfo(kMusicIntro, &SoundResourceInfo_PC(soundFilesIntro, soundFilesIntroSize)); + _sound->initAudioResourceInfo(kMusicIngame, &SoundResourceInfo_PC(soundFiles, soundFilesSize)); } else if (_flags.platform == Common::kPlatformFMTowns) { - _soundData[0].fileList = _soundFiles; - _soundData[0].fileListLen = _soundFilesSize; - _soundData[0].cdaTracks = _cdaTrackTable; - _soundData[0].cdaNumTracks = _cdaTrackTableSize; - _soundData[1].fileList = _soundFiles; - _soundData[1].fileListLen = _soundFilesSize; - _soundData[1].cdaTracks = _cdaTrackTable; - _soundData[1].cdaNumTracks = _cdaTrackTableSize; + _sound->initAudioResourceInfo(kMusicIntro, &SoundResourceInfo_Towns(soundFiles, soundFilesSize, cdaTable, cdaTableSize)); + _sound->initAudioResourceInfo(kMusicIngame, &SoundResourceInfo_Towns(soundFiles, soundFilesSize, cdaTable, cdaTableSize)); } else if (_flags.platform == Common::kPlatformPC98) { - _soundData[0].fileList = tIntro98; - _soundData[0].fileListLen = 1; - _soundData[0].extraOffset = -1; - _soundData[1].fileList = tIngame98; - _soundData[1].fileListLen = 1; - _soundData[1].extraOffset = -1; + _sound->initAudioResourceInfo(kMusicIntro, &SoundResourceInfo_PC98("INTRO%d.DAT")); + _sound->initAudioResourceInfo(kMusicIngame, &SoundResourceInfo_PC98("KYRAM%d.DAT")); } } @@ -1009,42 +993,18 @@ void KyraEngine_HoF::initStaticResource() { _itemAnimDefinition = _staticres->loadItemAnimDefinition(k2IngameShapeAnimData, _itemAnimDefinitionSize); // assign music data - static const char *const fmtMusicFileListIntro[] = { "intro%d.twn" }; - static const char *const fmtMusicFileListFinale[] = { "finale%d.twn" }; - static const char *const fmtMusicFileListIngame[] = { "km%02d.twn" }; - - static const char *const pc98MusicFileListIntro[] = { "intro%d.86" }; - static const char *const pc98MusicFileListFinale[] = { "finale%d.86" }; - static const char *const pc98MusicFileListIngame[] = { "km%02d.86" }; - - memset(_soundData, 0, sizeof(_soundData)); if (_flags.platform == Common::kPlatformPC) { - _soundData[0].fileList = _musicFileListIntro; - _soundData[0].fileListLen = _musicFileListIntroSize; - _soundData[1].fileList = _musicFileListIngame; - _soundData[1].fileListLen = _musicFileListIngameSize; - _soundData[2].fileList = _musicFileListFinale; - _soundData[2].fileListLen = _musicFileListIntroSize; + _sound->initAudioResourceInfo(kMusicIntro, &SoundResourceInfo_PC(_musicFileListIntro, _musicFileListIntroSize)); + _sound->initAudioResourceInfo(kMusicIngame, &SoundResourceInfo_PC(_musicFileListIngame, _musicFileListIngameSize)); + _sound->initAudioResourceInfo(kMusicFinale, &SoundResourceInfo_PC(_musicFileListFinale, _musicFileListFinaleSize)); } else if (_flags.platform == Common::kPlatformFMTowns) { - _soundData[0].fileList = fmtMusicFileListIntro; - _soundData[0].fileListLen = 1; - _soundData[0].cdaTracks = _cdaTrackTableIntro; - _soundData[0].cdaNumTracks = _cdaTrackTableIntroSize >> 1; - _soundData[1].fileList = fmtMusicFileListIngame; - _soundData[1].fileListLen = 1; - _soundData[1].cdaTracks = _cdaTrackTableIngame; - _soundData[1].cdaNumTracks = _cdaTrackTableIngameSize >> 1; - _soundData[2].fileList = fmtMusicFileListFinale; - _soundData[2].fileListLen = 1; - _soundData[2].cdaTracks = _cdaTrackTableFinale; - _soundData[2].cdaNumTracks = _cdaTrackTableFinaleSize >> 1; + _sound->initAudioResourceInfo(kMusicIntro, &SoundResourceInfo_TownsPC98V2(0, 0, "intro%d.twn", (const uint16*)_cdaTrackTableIntro, _cdaTrackTableIntroSize >> 1)); + _sound->initAudioResourceInfo(kMusicIngame, &SoundResourceInfo_TownsPC98V2(0, 0, "km%02d.twn", (const uint16*)_cdaTrackTableIngame, _cdaTrackTableIngameSize >> 1)); + _sound->initAudioResourceInfo(kMusicFinale, &SoundResourceInfo_TownsPC98V2(0, 0, "finale%d.twn", (const uint16*)_cdaTrackTableFinale, _cdaTrackTableFinaleSize >> 1)); } else if (_flags.platform == Common::kPlatformPC98) { - _soundData[0].fileList = pc98MusicFileListIntro; - _soundData[0].fileListLen = 1; - _soundData[1].fileList = pc98MusicFileListIngame; - _soundData[1].fileListLen = 1; - _soundData[2].fileList = pc98MusicFileListFinale; - _soundData[2].fileListLen = 1; + _sound->initAudioResourceInfo(kMusicIntro, &SoundResourceInfo_TownsPC98V2(0, 0, "intro%d.86", 0, 0)); + _sound->initAudioResourceInfo(kMusicIngame, &SoundResourceInfo_TownsPC98V2(0, 0, "km%02d.86", 0, 0)); + _sound->initAudioResourceInfo(kMusicFinale, &SoundResourceInfo_TownsPC98V2(0, 0, "finale%d.86", 0, 0)); } } diff --git a/engines/kyra/staticres_lol.cpp b/engines/kyra/staticres_lol.cpp index 4934aeb421..af32fb9ad5 100644 --- a/engines/kyra/staticres_lol.cpp +++ b/engines/kyra/staticres_lol.cpp @@ -24,6 +24,7 @@ #include "kyra/lol.h" #include "kyra/screen_lol.h" #include "kyra/gui_lol.h" +#include "kyra/sound_intern.h" #ifdef ENABLE_LOL @@ -213,35 +214,16 @@ void StaticResource::freeButtonDefs(void *&ptr, int &size) { } void LoLEngine::initStaticResource() { - // assign music resource data - static const char *const pcMusicFileListIntro[] = { "LOREINTR" }; - static const char *const pcMusicFileListFinale[] = { "LOREFINL" }; - static const char *const pcMusicFileListIngame[] = { "LORE%02d%c" }; - static const char *const pcMusicFileListDemo[] = { "LOREDEMO" }; - - static const char *const pc98MusicFileListIntro[] = { 0, "lore84.86", "lore82.86", 0, 0, 0, "lore83.86", "lore81.86" }; - static const char *const pc98MusicFileListFinale[] = { 0, 0, "lore85.86", "lore86.86", "lore87.86" }; - static const char *const pc98MusicFileListIngame[] = { "lore%02d.86" }; - - memset(_soundData, 0, sizeof(_soundData)); - + // assign music resource data (not required for the PC version, resource loading is implemented differently there) if (_flags.isDemo) { - _soundData[0].fileList = pcMusicFileListDemo; - _soundData[0].fileListLen = ARRAYSIZE(pcMusicFileListDemo); - } else if (_flags.platform == Common::kPlatformPC) { - _soundData[0].fileList = pcMusicFileListIntro; - _soundData[0].fileListLen = ARRAYSIZE(pcMusicFileListIntro); - _soundData[1].fileList = pcMusicFileListIngame; - _soundData[1].fileListLen = ARRAYSIZE(pcMusicFileListIngame); - _soundData[2].fileList = pcMusicFileListFinale; - _soundData[2].fileListLen = ARRAYSIZE(pcMusicFileListFinale); + static const char *const file[] = { "LOREDEMO" }; + _sound->initAudioResourceInfo(kMusicIntro, &SoundResourceInfo_TownsPC98V2(file, ARRAYSIZE(file), 0, 0, 0)); } else if (_flags.platform == Common::kPlatformPC98) { - _soundData[0].fileList = pc98MusicFileListIntro; - _soundData[0].fileListLen = ARRAYSIZE(pc98MusicFileListIntro); - _soundData[1].fileList = pc98MusicFileListIngame; - _soundData[1].fileListLen = ARRAYSIZE(pc98MusicFileListIngame); - _soundData[2].fileList = pc98MusicFileListFinale; - _soundData[2].fileListLen = ARRAYSIZE(pc98MusicFileListFinale); + static const char *const fileListIntro[] = { 0, "lore84.86", "lore82.86", 0, 0, 0, "lore83.86", "lore81.86" }; + static const char *const fileListFinale[] = { 0, 0, "lore85.86", "lore86.86", "lore87.86" }; + _sound->initAudioResourceInfo(kMusicIntro, &SoundResourceInfo_TownsPC98V2(fileListIntro, ARRAYSIZE(fileListIntro), 0, 0, 0)); + _sound->initAudioResourceInfo(kMusicIngame, &SoundResourceInfo_TownsPC98V2(0, 0, "lore%02d.86", 0, 0)); + _sound->initAudioResourceInfo(kMusicFinale, &SoundResourceInfo_TownsPC98V2(fileListFinale, ARRAYSIZE(fileListFinale), 0, 0, 0)); } if (_flags.isDemo) |