aboutsummaryrefslogtreecommitdiff
path: root/scumm/imuse_digi/dimuse_bndmgr.cpp
diff options
context:
space:
mode:
authorMax Horn2006-02-11 22:45:04 +0000
committerMax Horn2006-02-11 22:45:04 +0000
commit26ee630756ebdd7c96bccede0881a8c8b98e8f2b (patch)
tree26e378d5cf990a2b81c2c96e9e683a7f333b62e8 /scumm/imuse_digi/dimuse_bndmgr.cpp
parent2a9a0d4211b1ea5723f1409d91cb95de8984429e (diff)
downloadscummvm-rg350-26ee630756ebdd7c96bccede0881a8c8b98e8f2b.tar.gz
scummvm-rg350-26ee630756ebdd7c96bccede0881a8c8b98e8f2b.tar.bz2
scummvm-rg350-26ee630756ebdd7c96bccede0881a8c8b98e8f2b.zip
Moved engines to the new engines/ directory
svn-id: r20582
Diffstat (limited to 'scumm/imuse_digi/dimuse_bndmgr.cpp')
-rw-r--r--scumm/imuse_digi/dimuse_bndmgr.cpp344
1 files changed, 0 insertions, 344 deletions
diff --git a/scumm/imuse_digi/dimuse_bndmgr.cpp b/scumm/imuse_digi/dimuse_bndmgr.cpp
deleted file mode 100644
index d36d733ef2..0000000000
--- a/scumm/imuse_digi/dimuse_bndmgr.cpp
+++ /dev/null
@@ -1,344 +0,0 @@
-/* ScummVM - Scumm Interpreter
- * Copyright (C) 2001-2006 The ScummVM project
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * $URL$
- * $Id$
- */
-
-#include "common/stdafx.h"
-#include "common/scummsys.h"
-#include "scumm/scumm.h"
-#include "scumm/util.h"
-#include "scumm/imuse_digi/dimuse_bndmgr.h"
-
-namespace Scumm {
-
-BundleDirCache::BundleDirCache() {
- for (int fileId = 0; fileId < ARRAYSIZE(_budleDirCache); fileId++) {
- _budleDirCache[fileId].bundleTable = NULL;
- _budleDirCache[fileId].fileName[0] = 0;
- _budleDirCache[fileId].numFiles = 0;
- _budleDirCache[fileId].compressedBun = false;
- _budleDirCache[fileId].indexTable = NULL;
- }
-}
-
-BundleDirCache::~BundleDirCache() {
- for (int fileId = 0; fileId < ARRAYSIZE(_budleDirCache); fileId++) {
- free(_budleDirCache[fileId].bundleTable);
- free(_budleDirCache[fileId].indexTable);
- }
-}
-
-BundleDirCache::AudioTable *BundleDirCache::getTable(int slot) {
- return _budleDirCache[slot].bundleTable;
-}
-
-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;
-}
-
-int BundleDirCache::matchFile(const char *filename) {
- int32 tag, offset;
- bool found = false;
- int freeSlot = -1;
- int fileId;
-
- for (fileId = 0; fileId < ARRAYSIZE(_budleDirCache); fileId++) {
- if ((_budleDirCache[fileId].bundleTable == NULL) && (freeSlot == -1)) {
- freeSlot = fileId;
- }
- if (scumm_stricmp(filename, _budleDirCache[fileId].fileName) == 0) {
- found = true;
- break;
- }
- }
-
- if (!found) {
- ScummFile file;
-
- if (g_scumm->openFile(file, filename) == false) {
- error("BundleDirCache::matchFile() Can't open bundle file: %s", filename);
- return false;
- }
-
- if (freeSlot == -1)
- error("BundleDirCache::matchFileFile() Can't find free slot for file bundle dir cache");
-
- tag = file.readUint32BE();
- if (tag == 'LB23')
- _budleDirCache[freeSlot].compressedBun = true;
- offset = file.readUint32BE();
-
- strcpy(_budleDirCache[freeSlot].fileName, filename);
- _budleDirCache[freeSlot].numFiles = file.readUint32BE();
- _budleDirCache[freeSlot].bundleTable = (AudioTable *) malloc(_budleDirCache[freeSlot].numFiles * sizeof(AudioTable));
-
- 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;
- int32 z2;
-
- if (tag == 'LB23') {
- file.read(_budleDirCache[freeSlot].bundleTable[i].filename, 24);
- } else {
- for (z2 = 0; z2 < 8; z2++)
- if ((c = file.readByte()) != 0)
- name[z++] = c;
- name[z++] = '.';
- for (z2 = 0; z2 < 4; z2++)
- if ((c = file.readByte()) != 0)
- name[z++] = c;
-
- name[z] = '\0';
- strcpy(_budleDirCache[freeSlot].bundleTable[i].filename, name);
- }
- _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;
- }
-}
-
-BundleMgr::BundleMgr(BundleDirCache *cache) {
- _cache = cache;
- _bundleTable = NULL;
- _compTable = NULL;
- _numFiles = 0;
- _numCompItems = 0;
- _curSample = -1;
- _fileBundleId = -1;
- _compInput = NULL;
-}
-
-BundleMgr::~BundleMgr() {
- close();
-}
-
-Common::File *BundleMgr::getFile(const char *filename, int32 &offset, int32 &size) {
- 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;
-}
-
-bool BundleMgr::open(const char *filename, bool &compressed, bool errorFlag) {
- if (_file.isOpen())
- return true;
-
- if (g_scumm->openFile(_file, filename) == false) {
- if (errorFlag) {
- error("BundleMgr::open() Can't open bundle file: %s", filename);
- } else {
- warning("BundleMgr::open() Can't open bundle file: %s", filename);
- }
- return false;
- }
-
- int slot = _cache->matchFile(filename);
- assert(slot != -1);
- compressed = _cache->isCompressed(slot);
- _numFiles = _cache->getNumFiles(slot);
- assert(_numFiles);
- _bundleTable = _cache->getTable(slot);
- _indexTable = _cache->getIndexTable(slot);
- assert(_bundleTable);
- _compTableLoaded = false;
- _outputSize = 0;
- _lastBlock = -1;
-
- return true;
-}
-
-void BundleMgr::close() {
- if (_file.isOpen()) {
- _file.close();
- _bundleTable = NULL;
- _numFiles = 0;
- _numCompItems = 0;
- _compTableLoaded = false;
- _lastBlock = -1;
- _outputSize = 0;
- _curSample = -1;
- free(_compTable);
- _compTable = NULL;
- free(_compInput);
- _compInput = NULL;
- }
-}
-
-bool BundleMgr::loadCompTable(int32 index) {
- _file.seek(_bundleTable[index].offset, SEEK_SET);
- uint32 tag = _file.readUint32BE();
- _numCompItems = _file.readUint32BE();
- assert(_numCompItems > 0);
- _file.seek(8, SEEK_CUR);
-
- if (tag != MKID_BE('COMP')) {
- error("BundleMgr::loadCompTable() Compressed sound %d invalid (%s)", index, tag2str(tag));
- return false;
- }
-
- _compTable = (CompTable *)malloc(sizeof(CompTable) * _numCompItems);
- int32 maxSize = 0;
- for (int i = 0; i < _numCompItems; i++) {
- _compTable[i].offset = _file.readUint32BE();
- _compTable[i].size = _file.readUint32BE();
- _compTable[i].codec = _file.readUint32BE();
- _file.seek(4, SEEK_CUR);
- if (_compTable[i].size > maxSize)
- maxSize = _compTable[i].size;
- }
- // CMI hack: one more byte at the end of input buffer
- _compInput = (byte *)malloc(maxSize + 1);
-
- return true;
-}
-
-int32 BundleMgr::decompressSampleByCurIndex(int32 offset, int32 size, byte **comp_final, int header_size, bool header_outside) {
- return decompressSampleByIndex(_curSample, offset, size, comp_final, header_size, header_outside);
-}
-
-int32 BundleMgr::decompressSampleByIndex(int32 index, int32 offset, int32 size, byte **comp_final, int header_size, bool header_outside) {
- int32 i, final_size, output_size;
- int skip, first_block, last_block;
-
- assert(0 <= index && index < _numFiles);
-
- if (_file.isOpen() == false) {
- error("BundleMgr::decompressSampleByIndex() File is not open!");
- return 0;
- }
-
- if (_curSample == -1)
- _curSample = index;
-
- assert(_curSample == index);
-
- if (!_compTableLoaded) {
- _compTableLoaded = loadCompTable(index);
- if (!_compTableLoaded)
- return 0;
- }
-
- first_block = (offset + header_size) / 0x2000;
- last_block = (offset + header_size + size - 1) / 0x2000;
-
- // Clip last_block by the total number of blocks (= "comp items")
- if ((last_block >= _numCompItems) && (_numCompItems > 0))
- last_block = _numCompItems - 1;
-
- int32 blocks_final_size = 0x2000 * (1 + last_block - first_block);
- *comp_final = (byte *)malloc(blocks_final_size);
- final_size = 0;
-
- skip = (offset + header_size) % 0x2000;
-
- for (i = first_block; i <= last_block; i++) {
- if (_lastBlock != i) {
- // CMI hack: one more zero byte at the end of input buffer
- _compInput[_compTable[i].size] = 0;
- _file.seek(_bundleTable[index].offset + _compTable[i].offset, SEEK_SET);
- _file.read(_compInput, _compTable[i].size);
- _outputSize = BundleCodecs::decompressCodec(_compTable[i].codec, _compInput, _compOutput, _compTable[i].size);
- if (_outputSize > 0x2000) {
- error("_outputSize: %d", _outputSize);
- }
- _lastBlock = i;
- }
-
- output_size = _outputSize;
-
- if (header_outside) {
- output_size -= skip;
- } else {
- if ((header_size != 0) && (skip >= header_size))
- output_size -= skip;
- }
-
- if ((output_size + skip) > 0x2000) // workaround
- output_size -= (output_size + skip) - 0x2000;
-
- if (output_size > size)
- output_size = size;
-
- assert(final_size + output_size <= blocks_final_size);
-
- memcpy(*comp_final + final_size, _compOutput + skip, output_size);
- final_size += output_size;
-
- size -= output_size;
- assert(size >= 0);
- if (size == 0)
- break;
-
- skip = 0;
- }
-
- return final_size;
-}
-
-int32 BundleMgr::decompressSampleByName(const char *name, int32 offset, int32 size, byte **comp_final, bool header_outside) {
- int32 final_size = 0;
-
- if (!_file.isOpen()) {
- error("BundleMgr::decompressSampleByName() File is not open!");
- return 0;
- }
-
- 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;
-}
-
-} // End of namespace Scumm