AUDIO: Miles Audio AdLib: timbre data via data-ptr

add ability to pass timbre data directly to the AdLib Miles
Audio driver as well
This commit is contained in:
Martin Kiewitz 2015-07-01 01:28:24 +02:00
parent b40fcb64a1
commit 3bb36663f3
2 changed files with 28 additions and 14 deletions

View File

@ -71,7 +71,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);
extern MidiDriver *MidiDriver_Miles_AdLib_create(const Common::String instrumentDataFilename, const Common::String instrumentDataFilenameOPL3, const byte *instrumentDataPtr = NULL, uint32 instrumentDataSize = 0);
extern MidiDriver *MidiDriver_Miles_MT32_create(const Common::String instrumentDataFilename);

View File

@ -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);
}