diff options
-rw-r--r-- | scumm/imuse_digi/dimuse_bndmgr.cpp | 52 | ||||
-rw-r--r-- | scumm/imuse_digi/dimuse_bndmgr.h | 14 |
2 files changed, 47 insertions, 19 deletions
diff --git a/scumm/imuse_digi/dimuse_bndmgr.cpp b/scumm/imuse_digi/dimuse_bndmgr.cpp index 64a42a226f..9c17a59a1a 100644 --- a/scumm/imuse_digi/dimuse_bndmgr.cpp +++ b/scumm/imuse_digi/dimuse_bndmgr.cpp @@ -42,14 +42,18 @@ BundleDirCache::~BundleDirCache() { } } -BundleDirCache::AudioTable *BundleDirCache::getTable(const char *filename, int slot) { +BundleDirCache::AudioTable *BundleDirCache::getTable(int slot) { return _budleDirCache[slot].bundleTable; } -int32 BundleDirCache::getNumFiles(const char *filename, int slot) { +int32 BundleDirCache::getNumFiles(int slot) { return _budleDirCache[slot].numFiles; } +BundleDirCache::IndexNode *BundleDirCache::getIndexTable(int slot) { + return _budleDirCache[slot].indexTable; +} + bool BundleDirCache::isCompressed(int slot) { return _budleDirCache[slot].compressedBun; } @@ -92,6 +96,9 @@ int BundleDirCache::matchFile(const char *filename) { file.seek(offset, SEEK_SET); + _budleDirCache[freeSlot].indexTable = + (IndexNode *)calloc(_budleDirCache[freeSlot].numFiles, sizeof(IndexNode)); + for (int32 i = 0; i < _budleDirCache[freeSlot].numFiles; i++) { char name[24], c; int32 z = 0; @@ -113,7 +120,12 @@ int BundleDirCache::matchFile(const char *filename) { } _budleDirCache[freeSlot].bundleTable[i].offset = file.readUint32BE(); _budleDirCache[freeSlot].bundleTable[i].size = file.readUint32BE(); + strcpy(_budleDirCache[freeSlot].indexTable[i].filename, + _budleDirCache[freeSlot].bundleTable[i].filename); + _budleDirCache[freeSlot].indexTable[i].index = i; } + qsort(_budleDirCache[freeSlot].indexTable, _budleDirCache[freeSlot].numFiles, + sizeof(IndexNode), (int (*)(const void*, const void*))scumm_stricmp); return freeSlot; } else { return fileId; @@ -136,13 +148,15 @@ BundleMgr::~BundleMgr() { } Common::File *BundleMgr::getFile(const char *filename, int32 &offset, int32 &size) { - for (int i = 0; i < _numFiles; i++) { - if (!scumm_stricmp(filename, _bundleTable[i].filename)) { - _file.seek(_bundleTable[i].offset, SEEK_SET); - offset = _bundleTable[i].offset; - size = _bundleTable[i].size; - return &_file; - } + BundleDirCache::IndexNode target; + strcpy(target.filename, filename); + BundleDirCache::IndexNode *found = (BundleDirCache::IndexNode *)bsearch(&target, _indexTable, _numFiles, + sizeof(BundleDirCache::IndexNode), (int (*)(const void*, const void*))scumm_stricmp); + if (found) { + _file.seek(_bundleTable[found->index].offset, SEEK_SET); + offset = _bundleTable[found->index].offset; + size = _bundleTable[found->index].size; + return &_file; } return NULL; @@ -164,9 +178,10 @@ bool BundleMgr::open(const char *filename, bool &compressed, bool errorFlag) { int slot = _cache->matchFile(filename); assert(slot != -1); compressed = _cache->isCompressed(slot); - _numFiles = _cache->getNumFiles(filename, slot); + _numFiles = _cache->getNumFiles(slot); assert(_numFiles); - _bundleTable = _cache->getTable(filename, slot); + _bundleTable = _cache->getTable(slot); + _indexTable = _cache->getIndexTable(slot); assert(_bundleTable); _compTableLoaded = false; _outputSize = 0; @@ -304,19 +319,22 @@ int32 BundleMgr::decompressSampleByIndex(int32 index, int32 offset, int32 size, } int32 BundleMgr::decompressSampleByName(const char *name, int32 offset, int32 size, byte **comp_final, bool header_outside) { - int32 final_size = 0, i; + int32 final_size = 0; if (!_file.isOpen()) { error("BundleMgr::decompressSampleByName() File is not open!"); return 0; } - for (i = 0; i < _numFiles; i++) { - if (!scumm_stricmp(name, _bundleTable[i].filename)) { - final_size = decompressSampleByIndex(i, offset, size, comp_final, 0, header_outside); - return final_size; - } + BundleDirCache::IndexNode target; + strcpy(target.filename, name); + BundleDirCache::IndexNode *found = (BundleDirCache::IndexNode *)bsearch(&target, _indexTable, _numFiles, + sizeof(BundleDirCache::IndexNode), (int (*)(const void*, const void*))scumm_stricmp); + if (found) { + final_size = decompressSampleByIndex(found->index, offset, size, comp_final, 0, header_outside); + return final_size; } + debug(2, "BundleMgr::decompressSampleByName() Failed finding voice %s", name); return final_size; } diff --git a/scumm/imuse_digi/dimuse_bndmgr.h b/scumm/imuse_digi/dimuse_bndmgr.h index b6e93bb714..313c5b5fe8 100644 --- a/scumm/imuse_digi/dimuse_bndmgr.h +++ b/scumm/imuse_digi/dimuse_bndmgr.h @@ -34,6 +34,12 @@ public: int32 offset; int32 size; }; + + struct IndexNode { + char filename[24]; + int32 index; + }; + private: struct FileDirCache { @@ -41,6 +47,7 @@ private: AudioTable *bundleTable; int32 numFiles; bool compressedBun; + IndexNode *indexTable; } _budleDirCache[4]; public: @@ -48,12 +55,14 @@ public: ~BundleDirCache(); int matchFile(const char *filename); - AudioTable *getTable(const char *filename, int slot); - int32 getNumFiles(const char *filename, int slot); + AudioTable *getTable(int slot); + IndexNode *getIndexTable(int slot); + int32 getNumFiles(int slot); bool isCompressed(int slot); }; class BundleMgr { + private: struct CompTable { @@ -64,6 +73,7 @@ private: BundleDirCache *_cache; BundleDirCache::AudioTable *_bundleTable; + BundleDirCache::IndexNode *_indexTable; CompTable *_compTable; int _numFiles; int _numCompItems; |