diff options
Diffstat (limited to 'engines/scumm/sound.cpp')
-rw-r--r-- | engines/scumm/sound.cpp | 26 |
1 files changed, 19 insertions, 7 deletions
diff --git a/engines/scumm/sound.cpp b/engines/scumm/sound.cpp index 3f6290f8fc..071805752b 100644 --- a/engines/scumm/sound.cpp +++ b/engines/scumm/sound.cpp @@ -30,7 +30,7 @@ #include "scumm/file.h" #include "scumm/imuse/imuse.h" #include "scumm/imuse_digi/dimuse.h" -#include "scumm/player_towns.h" +#include "scumm/players/player_towns.h" #include "scumm/resource.h" #include "scumm/scumm.h" #include "scumm/sound.h" @@ -470,8 +470,10 @@ static int compareMP3OffsetTable(const void *a, const void *b) { void Sound::startTalkSound(uint32 offset, uint32 b, int mode, Audio::SoundHandle *handle) { int num = 0, i; - int size = 0; int id = -1; +#if defined(USE_FLAC) || defined(USE_VORBIS) || defined(USE_MAD) + int size = 0; +#endif Common::ScopedPtr<ScummFile> file; if (_vm->_game.id == GID_CMI) { @@ -562,10 +564,14 @@ void Sound::startTalkSound(uint32 offset, uint32 b, int mode, Audio::SoundHandle num = result->num_tags; } offset = result->new_offset; +#if defined(USE_FLAC) || defined(USE_VORBIS) || defined(USE_MAD) size = result->compressed_size; +#endif } else { offset += 8; +#if defined(USE_FLAC) || defined(USE_VORBIS) || defined(USE_MAD) size = -1; +#endif } file.reset(new ScummFile()); @@ -1930,7 +1936,6 @@ int ScummEngine::readSoundResourceSmallHeader(ResId idx) { // 8 bytes MTrk header // 7 bytes MIDI tempo sysex // + some default instruments - byte *ptr; if (_game.features & GF_OLD_BUNDLE) { ad_size -= 4; _fileHandle->seek(ad_offs + 4, SEEK_SET); @@ -1938,10 +1943,17 @@ int ScummEngine::readSoundResourceSmallHeader(ResId idx) { ad_size -= 6; _fileHandle->seek(ad_offs, SEEK_SET); } - ptr = (byte *) calloc(ad_size, 1); - _fileHandle->read(ptr, ad_size); - convertADResource(_res, _game, idx, ptr, ad_size); - free(ptr); + // For games using AD except Indy3 and Loom we are using our iMuse + // implementation. See output initialization in + // ScummEngine::setupMusic for more information. + if (_game.id != GID_INDY3 && _game.id != GID_LOOM) { + byte *ptr = (byte *)calloc(ad_size, 1); + _fileHandle->read(ptr, ad_size); + convertADResource(_res, _game, idx, ptr, ad_size); + free(ptr); + } else { + _fileHandle->read(_res->createResource(rtSound, idx, ad_size), ad_size); + } return 1; } else if (ro_offs != 0) { _fileHandle->seek(ro_offs - 2, SEEK_SET); |