diff options
-rw-r--r-- | engines/sherlock/tattoo/drivers/tattoo_adlib.cpp | 30 |
1 files changed, 27 insertions, 3 deletions
diff --git a/engines/sherlock/tattoo/drivers/tattoo_adlib.cpp b/engines/sherlock/tattoo/drivers/tattoo_adlib.cpp index 6f2008a2fc..75530f4ccd 100644 --- a/engines/sherlock/tattoo/drivers/tattoo_adlib.cpp +++ b/engines/sherlock/tattoo/drivers/tattoo_adlib.cpp @@ -211,6 +211,9 @@ private: InstrumentEntry *_instrumentTablePtr; uint16 _instrumentTableCount; + bool circularPhysicalAssignment; + byte circularPhysicalAssignmentFmVoice; + protected: void onTimer(); @@ -249,6 +252,11 @@ MidiDriver_Miles_AdLib::MidiDriver_Miles_AdLib(Audio::Mixer *mixer, InstrumentEn _instrumentTablePtr = instrumentTablePtr; _instrumentTableCount = instrumentTableCount; + // Older Miles Audio drivers did not do a circular assign for physical FM-voices + // Sherlock Holmes 2 used the circular assign + circularPhysicalAssignment = true; + circularPhysicalAssignmentFmVoice = 255; + resetData(); } @@ -394,9 +402,25 @@ int16 MidiDriver_Miles_AdLib::searchFreeVirtualFmVoiceChannel() { } int16 MidiDriver_Miles_AdLib::searchFreePhysicalFmVoiceChannel() { - for (byte physicalFmVoice = 0; physicalFmVoice < SHERLOCK_MILES_ADLIB_PHYSICAL_FMVOICES_COUNT; physicalFmVoice++) { - if (!_physicalFmVoices[physicalFmVoice].inUse) - return physicalFmVoice; + if (!circularPhysicalAssignment) { + // Older assign logic + for (byte physicalFmVoice = 0; physicalFmVoice < SHERLOCK_MILES_ADLIB_PHYSICAL_FMVOICES_COUNT; physicalFmVoice++) { + if (!_physicalFmVoices[physicalFmVoice].inUse) + return physicalFmVoice; + } + } else { + // Newer one + // Remembers last physical FM-voice and searches from that spot + byte physicalFmVoice = circularPhysicalAssignmentFmVoice; + for (byte physicalFmVoiceCount = 0; physicalFmVoiceCount < SHERLOCK_MILES_ADLIB_PHYSICAL_FMVOICES_COUNT; physicalFmVoiceCount++) { + physicalFmVoice++; + if (physicalFmVoice >= SHERLOCK_MILES_ADLIB_PHYSICAL_FMVOICES_COUNT) + physicalFmVoice = 0; + if (!_physicalFmVoices[physicalFmVoice].inUse) { + circularPhysicalAssignmentFmVoice = physicalFmVoice; + return physicalFmVoice; + } + } } return -1; } |