aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--audio/miles.h2
-rw-r--r--audio/miles_adlib.cpp47
2 files changed, 41 insertions, 8 deletions
diff --git a/audio/miles.h b/audio/miles.h
index 584460952e..fc19cc35eb 100644
--- a/audio/miles.h
+++ b/audio/miles.h
@@ -72,7 +72,7 @@ namespace Audio {
// Miles Audio actually used 0x4000, because they didn't shift the 2 bytes properly
#define MILES_PITCHBENDER_DEFAULT 0x2000
-extern MidiDriver *MidiDriver_Miles_AdLib_create(const Common::String &instrumentDataFilename, const Common::String &instrumentDataFilenameOPL3, Common::SeekableReadStream *instrumentStream = nullptr);
+extern MidiDriver *MidiDriver_Miles_AdLib_create(const Common::String &filenameAdLib, const Common::String &filenameOPL3, Common::SeekableReadStream *instrumentStream = nullptr);
extern MidiDriver *MidiDriver_Miles_MT32_create(const Common::String &instrumentDataFilename);
diff --git a/audio/miles_adlib.cpp b/audio/miles_adlib.cpp
index c85348cdd5..6731c5f7a4 100644
--- a/audio/miles_adlib.cpp
+++ b/audio/miles_adlib.cpp
@@ -1060,9 +1060,10 @@ uint32 MidiDriver_Miles_AdLib::property(int prop, uint32 param) {
return 0;
}
-MidiDriver *MidiDriver_Miles_AdLib_create(const Common::String &instrumentDataFilename, const Common::String &instrumentDataFilenameOPL3, Common::SeekableReadStream *instrumentStream) {
+MidiDriver *MidiDriver_Miles_AdLib_create(const Common::String &filenameAdLib, const Common::String &filenameOPL3, Common::SeekableReadStream *instrumentStream) {
// Load adlib instrument data from file SAMPLE.AD (OPL3: SAMPLE.OPL)
- Common::File *fileStream = NULL;
+ Common::String filename;
+ Common::File *fileStream = new Common::File();
uint32 fileSize = 0;
uint32 fileDataOffset = 0;
uint32 fileDataLeft = 0;
@@ -1079,11 +1080,42 @@ MidiDriver *MidiDriver_Miles_AdLib_create(const Common::String &instrumentDataFi
uint32 instrumentOffset = 0;
uint16 instrumentDataSize = 0;
- if (!instrumentDataFilename.empty()) {
- // Filename was passed to us (this is the common case for most games)
- fileStream = new Common::File();
+ // First check if any filename was passed to us
+ if ((!filenameAdLib.empty()) || (!filenameOPL3.empty())) {
+ // If that's the case, check if one of those exists
+ // Prefer the AdLib one for now
+ if (!filenameAdLib.empty()) {
+ if (fileStream->exists(filenameAdLib)) {
+ // if AdLib file exists, use it
+ filename = filenameAdLib;
+ }
+ }
+ if (!filename.empty()) {
+ if (!filenameOPL3.empty()) {
+ if (fileStream->exists(filenameOPL3)) {
+ // if OPL3 file exists, use it
+ filename = filenameOPL3;
+ }
+ }
+ }
+ if (filename.empty()) {
+ // If none of them exists, we can't do anything about it
+ if (!filenameAdLib.empty()) {
+ if (!filenameOPL3.empty()) {
+ error("MILES-ADLIB: could not open instrument file (%s or %s)", filenameAdLib.c_str(), filenameOPL3.c_str());
+ } else {
+ error("MILES-ADLIB: could not open instrument file (%s)", filenameAdLib.c_str());
+ }
+ } else {
+ error("MILES-ADLIB: could not open instrument file (%s)", filenameOPL3.c_str());
+ }
+ }
+ }
+
+ if (!filename.empty()) {
+ // Filename was passed to us and file exists (this is the common case for most games)
- if (!fileStream->open(instrumentDataFilename))
+ if (!fileStream->open(filename))
error("MILES-ADLIB: could not open instrument file");
streamSize = fileStream->size();
@@ -1093,7 +1125,6 @@ MidiDriver *MidiDriver_Miles_AdLib_create(const Common::String &instrumentDataFi
if (fileStream->read(streamDataPtr, streamSize) != streamSize)
error("MILES-ADLIB: error while reading instrument file");
fileStream->close();
- delete fileStream;
} else if (instrumentStream) {
// instrument data was passed directly (currently used by Amazon Guardians of Eden + Simon 2)
@@ -1104,6 +1135,8 @@ MidiDriver *MidiDriver_Miles_AdLib_create(const Common::String &instrumentDataFi
error("MILES-ADLIB: error while reading instrument stream");
}
+ delete fileStream;
+
// File is like this:
// [patch:BYTE] [bank:BYTE] [patchoffset:UINT32]
// ...