aboutsummaryrefslogtreecommitdiff
path: root/audio/miles_adlib.cpp
diff options
context:
space:
mode:
authorMartin Kiewitz2015-07-01 01:28:24 +0200
committerMartin Kiewitz2015-07-01 01:28:24 +0200
commit3bb36663f3d8c8a5220afc5afe7d64005cc01794 (patch)
tree2e955b41ca6c84820d204bb290c2384ef0814445 /audio/miles_adlib.cpp
parentb40fcb64a18c904243acd0c5bb5aaee8e0ebf7ec (diff)
downloadscummvm-rg350-3bb36663f3d8c8a5220afc5afe7d64005cc01794.tar.gz
scummvm-rg350-3bb36663f3d8c8a5220afc5afe7d64005cc01794.tar.bz2
scummvm-rg350-3bb36663f3d8c8a5220afc5afe7d64005cc01794.zip
AUDIO: Miles Audio AdLib: timbre data via data-ptr
add ability to pass timbre data directly to the AdLib Miles Audio driver as well
Diffstat (limited to 'audio/miles_adlib.cpp')
-rw-r--r--audio/miles_adlib.cpp40
1 files changed, 27 insertions, 13 deletions
diff --git a/audio/miles_adlib.cpp b/audio/miles_adlib.cpp
index e59da10c40..8d6b1d6177 100644
--- a/audio/miles_adlib.cpp
+++ b/audio/miles_adlib.cpp
@@ -1031,11 +1031,12 @@ uint32 MidiDriver_Miles_AdLib::property(int prop, uint32 param) {
return 0;
}
-MidiDriver *MidiDriver_Miles_AdLib_create(const Common::String instrumentDataFilename, const Common::String instrumentDataFilenameOPL3) {
+MidiDriver *MidiDriver_Miles_AdLib_create(const Common::String instrumentDataFilename, const Common::String instrumentDataFilenameOPL3, const byte *instrumentRawDataPtr, uint32 instrumentRawDataSize) {
// Load adlib instrument data from file SAMPLE.AD (OPL3: SAMPLE.OPL)
- Common::File *fileStream = new Common::File();
+ Common::File *fileStream = NULL;
uint32 fileSize = 0;
- byte *fileDataPtr = NULL;
+ const byte *fileDataPtr = NULL;
+ bool fileDataAllocatedByUs = false;
uint32 fileDataOffset = 0;
uint32 fileDataLeft = 0;
@@ -1048,17 +1049,28 @@ MidiDriver *MidiDriver_Miles_AdLib_create(const Common::String instrumentDataFil
uint32 instrumentOffset = 0;
uint16 instrumentDataSize = 0;
- if (!fileStream->open(instrumentDataFilename))
- error("MILES-ADLIB: could not open instrument file");
+ if (!instrumentDataFilename.empty()) {
+ // Filename was passed to us (this is the common case for most games)
+ fileStream = new Common::File();
- fileSize = fileStream->size();
+ if (!fileStream->open(instrumentDataFilename))
+ error("MILES-ADLIB: could not open instrument file");
- fileDataPtr = new byte[fileSize];
+ fileSize = fileStream->size();
- if (fileStream->read(fileDataPtr, fileSize) != fileSize)
- error("MILES-ADLIB: error while reading instrument file");
- fileStream->close();
- delete fileStream;
+ fileDataPtr = new byte[fileSize];
+ fileDataAllocatedByUs = true;
+
+ if (fileStream->read((byte *)fileDataPtr, fileSize) != fileSize)
+ error("MILES-ADLIB: error while reading instrument file");
+ fileStream->close();
+ delete fileStream;
+
+ } else if (instrumentRawDataPtr) {
+ // instrument data was passed directly (currently used by Amazon Guardians of Eden
+ fileDataPtr = instrumentRawDataPtr;
+ fileSize = instrumentRawDataSize;
+ }
// File is like this:
// [patch:BYTE] [bank:BYTE] [patchoffset:UINT32]
@@ -1127,8 +1139,10 @@ MidiDriver *MidiDriver_Miles_AdLib_create(const Common::String instrumentDataFil
instrumentPtr++;
}
- // Free instrument file data
- delete[] fileDataPtr;
+ if (fileDataAllocatedByUs) {
+ // Free instrument file data
+ delete[] fileDataPtr;
+ }
return new MidiDriver_Miles_AdLib(g_system->getMixer(), instrumentTablePtr, instrumentTableCount);
}