diff options
author | Martin Kiewitz | 2015-07-04 12:55:49 +0200 |
---|---|---|
committer | Martin Kiewitz | 2015-07-04 12:55:49 +0200 |
commit | 96005c7da9229f4801ac73b4200c54e38dcd7e32 (patch) | |
tree | 1cd8886792976f6d156fd39bf0d9d48c5aabb5ff /audio | |
parent | fba886a21f784da5bd48accb0dd5aaf133dd0b29 (diff) | |
download | scummvm-rg350-96005c7da9229f4801ac73b4200c54e38dcd7e32.tar.gz scummvm-rg350-96005c7da9229f4801ac73b4200c54e38dcd7e32.tar.bz2 scummvm-rg350-96005c7da9229f4801ac73b4200c54e38dcd7e32.zip |
AUDIO: Miles Audio AdLib instrument stream support
- not using byte pointer + size and instead now a
SeekableReadStream for factory
- adjusted ACCESS + AGOS engines accordingly
Diffstat (limited to 'audio')
-rw-r--r-- | audio/miles.h | 3 | ||||
-rw-r--r-- | audio/miles_adlib.cpp | 68 |
2 files changed, 36 insertions, 35 deletions
diff --git a/audio/miles.h b/audio/miles.h index fde91e6227..584460952e 100644 --- a/audio/miles.h +++ b/audio/miles.h @@ -25,6 +25,7 @@ #include "audio/mididrv.h" #include "common/error.h" +#include "common/stream.h" namespace Audio { @@ -71,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, const byte *instrumentDataPtr = NULL, uint32 instrumentDataSize = 0); +extern MidiDriver *MidiDriver_Miles_AdLib_create(const Common::String &instrumentDataFilename, const Common::String &instrumentDataFilenameOPL3, 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 a68c252f4b..c85348cdd5 100644 --- a/audio/miles_adlib.cpp +++ b/audio/miles_adlib.cpp @@ -1060,15 +1060,16 @@ uint32 MidiDriver_Miles_AdLib::property(int prop, uint32 param) { return 0; } -MidiDriver *MidiDriver_Miles_AdLib_create(const Common::String &instrumentDataFilename, const Common::String &instrumentDataFilenameOPL3, const byte *instrumentRawDataPtr, uint32 instrumentRawDataSize) { +MidiDriver *MidiDriver_Miles_AdLib_create(const Common::String &instrumentDataFilename, const Common::String &instrumentDataFilenameOPL3, Common::SeekableReadStream *instrumentStream) { // Load adlib instrument data from file SAMPLE.AD (OPL3: SAMPLE.OPL) Common::File *fileStream = NULL; uint32 fileSize = 0; - byte *fileDataReadPtr = nullptr; - const byte *fileDataPtr = nullptr; uint32 fileDataOffset = 0; uint32 fileDataLeft = 0; + uint32 streamSize = 0; + byte *streamDataPtr = nullptr; + byte curBankId = 0; byte curPatchId = 0; @@ -1085,21 +1086,22 @@ MidiDriver *MidiDriver_Miles_AdLib_create(const Common::String &instrumentDataFi if (!fileStream->open(instrumentDataFilename)) error("MILES-ADLIB: could not open instrument file"); - fileSize = fileStream->size(); + streamSize = fileStream->size(); - fileDataReadPtr = new byte[fileSize]; + streamDataPtr = new byte[streamSize]; - if (fileStream->read(fileDataReadPtr, fileSize) != fileSize) + if (fileStream->read(streamDataPtr, streamSize) != streamSize) error("MILES-ADLIB: error while reading instrument file"); fileStream->close(); delete fileStream; - fileDataPtr = fileDataReadPtr; + } else if (instrumentStream) { + // instrument data was passed directly (currently used by Amazon Guardians of Eden + Simon 2) + streamSize = instrumentStream->size(); + streamDataPtr = new byte[streamSize]; - } else if (instrumentRawDataPtr) { - // instrument data was passed directly (currently used by Amazon Guardians of Eden - fileDataPtr = instrumentRawDataPtr; - fileSize = instrumentRawDataSize; + if (instrumentStream->read(streamDataPtr, streamSize) != streamSize) + error("MILES-ADLIB: error while reading instrument stream"); } // File is like this: @@ -1109,13 +1111,13 @@ MidiDriver *MidiDriver_Miles_AdLib_create(const Common::String &instrumentDataFi // First we check how many entries there are fileDataOffset = 0; - fileDataLeft = fileSize; + fileDataLeft = streamSize; while (1) { if (fileDataLeft < 6) error("MILES-ADLIB: unexpected EOF in instrument file"); - curPatchId = fileDataPtr[fileDataOffset++]; - curBankId = fileDataPtr[fileDataOffset++]; + curPatchId = streamDataPtr[fileDataOffset++]; + curBankId = streamDataPtr[fileDataOffset++]; if ((curBankId == 0xFF) && (curPatchId == 0xFF)) break; @@ -1136,43 +1138,41 @@ MidiDriver *MidiDriver_Miles_AdLib_create(const Common::String &instrumentDataFi fileDataOffset = 0; fileDataLeft = fileSize; while (1) { - curPatchId = fileDataPtr[fileDataOffset++]; - curBankId = fileDataPtr[fileDataOffset++]; + curPatchId = streamDataPtr[fileDataOffset++]; + curBankId = streamDataPtr[fileDataOffset++]; if ((curBankId == 0xFF) && (curPatchId == 0xFF)) break; - instrumentOffset = READ_LE_UINT32(fileDataPtr + fileDataOffset); + instrumentOffset = READ_LE_UINT32(streamDataPtr + fileDataOffset); fileDataOffset += 4; instrumentPtr->bankId = curBankId; instrumentPtr->patchId = curPatchId; - instrumentDataSize = READ_LE_UINT16(fileDataPtr + instrumentOffset); + instrumentDataSize = READ_LE_UINT16(streamDataPtr + instrumentOffset); if (instrumentDataSize != 14) error("MILES-ADLIB: unsupported instrument size"); - instrumentPtr->transposition = (signed char)fileDataPtr[instrumentOffset + 2]; - instrumentPtr->reg20op1 = fileDataPtr[instrumentOffset + 3]; - instrumentPtr->reg40op1 = fileDataPtr[instrumentOffset + 4]; - instrumentPtr->reg60op1 = fileDataPtr[instrumentOffset + 5]; - instrumentPtr->reg80op1 = fileDataPtr[instrumentOffset + 6]; - instrumentPtr->regE0op1 = fileDataPtr[instrumentOffset + 7]; - instrumentPtr->regC0 = fileDataPtr[instrumentOffset + 8]; - instrumentPtr->reg20op2 = fileDataPtr[instrumentOffset + 9]; - instrumentPtr->reg40op2 = fileDataPtr[instrumentOffset + 10]; - instrumentPtr->reg60op2 = fileDataPtr[instrumentOffset + 11]; - instrumentPtr->reg80op2 = fileDataPtr[instrumentOffset + 12]; - instrumentPtr->regE0op2 = fileDataPtr[instrumentOffset + 13]; + instrumentPtr->transposition = (signed char)streamDataPtr[instrumentOffset + 2]; + instrumentPtr->reg20op1 = streamDataPtr[instrumentOffset + 3]; + instrumentPtr->reg40op1 = streamDataPtr[instrumentOffset + 4]; + instrumentPtr->reg60op1 = streamDataPtr[instrumentOffset + 5]; + instrumentPtr->reg80op1 = streamDataPtr[instrumentOffset + 6]; + instrumentPtr->regE0op1 = streamDataPtr[instrumentOffset + 7]; + instrumentPtr->regC0 = streamDataPtr[instrumentOffset + 8]; + instrumentPtr->reg20op2 = streamDataPtr[instrumentOffset + 9]; + instrumentPtr->reg40op2 = streamDataPtr[instrumentOffset + 10]; + instrumentPtr->reg60op2 = streamDataPtr[instrumentOffset + 11]; + instrumentPtr->reg80op2 = streamDataPtr[instrumentOffset + 12]; + instrumentPtr->regE0op2 = streamDataPtr[instrumentOffset + 13]; // Instrument read, next instrument please instrumentPtr++; } - if (fileDataReadPtr) { - // Free instrument file data in case it was read by us - delete[] fileDataReadPtr; - } + // Free instrument file/stream data + delete[] streamDataPtr; return new MidiDriver_Miles_AdLib(g_system->getMixer(), instrumentTablePtr, instrumentTableCount); } |