aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFilippos Karapetis2008-01-27 14:32:08 +0000
committerFilippos Karapetis2008-01-27 14:32:08 +0000
commit5b6dbecb62a7a847f4c930b946c62e643a7d2821 (patch)
tree05d0e85a0c6b1ebe6b95c1858d49c5895cd25562
parent83b888b99b4476f8299735bbc050b3ac3a629a26 (diff)
downloadscummvm-rg350-5b6dbecb62a7a847f4c930b946c62e643a7d2821.tar.gz
scummvm-rg350-5b6dbecb62a7a847f4c930b946c62e643a7d2821.tar.bz2
scummvm-rg350-5b6dbecb62a7a847f4c930b946c62e643a7d2821.zip
Limit the number of simultaneous open files in IHNM to 7, down from 12. This is necessary for devices that can keep a limited amount of files open simultaneously, like the PSP
svn-id: r30648
-rw-r--r--engines/saga/rscfile.cpp35
-rw-r--r--engines/saga/rscfile.h4
-rw-r--r--engines/saga/sndres.cpp8
3 files changed, 30 insertions, 17 deletions
diff --git a/engines/saga/rscfile.cpp b/engines/saga/rscfile.cpp
index 094e7141f9..00e9415379 100644
--- a/engines/saga/rscfile.cpp
+++ b/engines/saga/rscfile.cpp
@@ -342,6 +342,12 @@ bool Resource::loadContext(ResourceContext *context) {
}
}
+ // Close the file if it's part of a series of files
+ // This prevents having all voice files open in IHNM for no reason, as each chapter uses
+ // a different voice file
+ if (context->serial > 0)
+ context->file->close();
+
return true;
}
@@ -350,7 +356,6 @@ bool Resource::createContexts() {
ResourceContext *context;
char musicFileName[256];
char soundFileName[256];
- char voicesFileName[256];
int soundFileIndex = 0;
int voicesFileIndex = 0;
bool digitalMusic = false;
@@ -428,18 +433,18 @@ bool Resource::createContexts() {
_contextsCount++;
voicesFileIndex = _contextsCount - 1;
if (Common::File::exists("voices.rsc")) {
- sprintf(voicesFileName, "voices.rsc");
+ sprintf(_voicesFileName[0], "voices.rsc");
} else {
- sprintf(voicesFileName, "voices.cmp");
+ sprintf(_voicesFileName[0], "voices.cmp");
_vm->_gf_compressed_sounds = true;
}
} else if (Common::File::exists("voicesd.rsc") || Common::File::exists("voicesd.cmp")) {
_contextsCount++;
voicesFileIndex = _contextsCount - 1;
if (Common::File::exists("voicesd.rsc")) {
- sprintf(voicesFileName, "voicesd.rsc");
+ sprintf(_voicesFileName[0], "voicesd.rsc");
} else {
- sprintf(voicesFileName, "voicesd.cmp");
+ sprintf(_voicesFileName[0], "voicesd.cmp");
_vm->_gf_compressed_sounds = true;
}
} else if (Common::File::exists("inherit the earth voices") ||
@@ -447,9 +452,9 @@ bool Resource::createContexts() {
_contextsCount++;
voicesFileIndex = _contextsCount - 1;
if (Common::File::exists("inherit the earth voices")) {
- sprintf(voicesFileName, "inherit the earth voices");
+ sprintf(_voicesFileName[0], "inherit the earth voices");
} else {
- sprintf(voicesFileName, "inherit the earth voices.cmp");
+ sprintf(_voicesFileName[0], "inherit the earth voices.cmp");
_vm->_gf_compressed_sounds = true;
}
@@ -483,18 +488,18 @@ bool Resource::createContexts() {
censoredVersion = true;
}
if (Common::File::exists("voicess.res")) {
- sprintf(voicesFileName, "voicess.res");
+ sprintf(_voicesFileName[0], "voicess.res");
} else {
- sprintf(voicesFileName, "voicess.cmp");
+ sprintf(_voicesFileName[0], "voicess.cmp");
_vm->_gf_compressed_sounds = true;
}
} else if (Common::File::exists("voicesd.res") || Common::File::exists("voicesd.cmp")) {
_contextsCount++;
voicesFileIndex = _contextsCount - 1;
if (Common::File::exists("voicesd.res")) {
- sprintf(voicesFileName, "voicesd.res");
+ sprintf(_voicesFileName[0], "voicesd.res");
} else {
- sprintf(voicesFileName, "voicesd.cmp");
+ sprintf(_voicesFileName[0], "voicesd.cmp");
_vm->_gf_compressed_sounds = true;
}
} else {
@@ -544,7 +549,7 @@ bool Resource::createContexts() {
context->fileName = soundFileName;
context->fileType = GAME_SOUNDFILE;
} else if (!voicesFileInArray && i == voicesFileIndex) {
- context->fileName = voicesFileName;
+ context->fileName = _voicesFileName[0];
// can be GAME_VOICEFILE or GAME_SOUNDFILE | GAME_VOICEFILE or GAME_VOICEFILE | GAME_SWAPENDIAN
context->fileType = voiceFileType;
} else {
@@ -555,11 +560,11 @@ bool Resource::createContexts() {
int token = (censoredVersion && (i - voicesFileIndex >= 4)) ? 1 : 0; // censored versions don't have voice4
if (_vm->getFeatures() & GF_COMPRESSED_SOUNDS)
- sprintf(voicesFileName, "voices%i.cmp", i - voicesFileIndex + token);
+ sprintf(_voicesFileName[i - voicesFileIndex + token], "voices%i.cmp", i - voicesFileIndex + token);
else
- sprintf(voicesFileName, "voices%i.res", i - voicesFileIndex + token);
+ sprintf(_voicesFileName[i - voicesFileIndex + token], "voices%i.res", i - voicesFileIndex + token);
- context->fileName = voicesFileName;
+ context->fileName = _voicesFileName[i - voicesFileIndex + token];
context->fileType = GAME_VOICEFILE;
// IHNM has several different voice files, so we need to allow
diff --git a/engines/saga/rscfile.h b/engines/saga/rscfile.h
index 1b767b07c8..765f362489 100644
--- a/engines/saga/rscfile.h
+++ b/engines/saga/rscfile.h
@@ -161,11 +161,11 @@ private:
SagaEngine *_vm;
ResourceContext *_contexts;
int _contextsCount;
+ char _voicesFileName[8][256];
bool loadContext(ResourceContext *context);
bool loadMacContext(ResourceContext *context);
- bool loadSagaContext(ResourceContext *context, uint32 contextOffset, uint32 contextSize);
-
+ bool loadSagaContext(ResourceContext *context, uint32 contextOffset, uint32 contextSize);
public:
MetaResource _metaResource;
diff --git a/engines/saga/sndres.cpp b/engines/saga/sndres.cpp
index d9b31dcd35..9f8a155e32 100644
--- a/engines/saga/sndres.cpp
+++ b/engines/saga/sndres.cpp
@@ -103,9 +103,17 @@ SndRes::~SndRes() {
void SndRes::setVoiceBank(int serial) {
if (_voiceSerial == serial) return;
+ // Close previous voice bank file
+ if (_voiceSerial >= 0 && _voiceContext->file->isOpen())
+ _voiceContext->file->close();
+
_voiceSerial = serial;
_voiceContext = _vm->_resource->getContext(GAME_VOICEFILE, _voiceSerial);
+
+ // Open new voice bank file
+ if (!_voiceContext->file->isOpen())
+ _voiceContext->file->open(_voiceContext->fileName);
}
void SndRes::playSound(uint32 resourceId, int volume, bool loop) {