diff options
author | Martin Kiewitz | 2015-06-26 10:36:23 +0200 |
---|---|---|
committer | Martin Kiewitz | 2015-06-26 10:36:23 +0200 |
commit | 258b5adb9ac7ab27ddc2adef0663abd2c11463f8 (patch) | |
tree | b069fc19573d863f19567471e6212ef881807647 | |
parent | 9bbeaa668a559be34638c579310d0e832a278c6d (diff) | |
download | scummvm-rg350-258b5adb9ac7ab27ddc2adef0663abd2c11463f8.tar.gz scummvm-rg350-258b5adb9ac7ab27ddc2adef0663abd2c11463f8.tar.bz2 scummvm-rg350-258b5adb9ac7ab27ddc2adef0663abd2c11463f8.zip |
SHERLOCK: RT: Miles AdLib: circular phys. assign
implements circular physical assignment of FM-voices,
which was enabled for Rose Tattoo.
This is not really needed, but by implementing it assigned
physical FM-voices should exactly match the original driver.
-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; } |