aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Kiewitz2015-06-26 10:36:23 +0200
committerMartin Kiewitz2015-06-26 10:36:23 +0200
commit258b5adb9ac7ab27ddc2adef0663abd2c11463f8 (patch)
treeb069fc19573d863f19567471e6212ef881807647
parent9bbeaa668a559be34638c579310d0e832a278c6d (diff)
downloadscummvm-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.cpp30
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;
}