diff -up scummvm-0.11.1/engines/lure/sound.h.alloc scummvm-0.11.1/engines/lure/sound.h
--- scummvm-0.11.1/engines/lure/sound.h.alloc 2008-03-08 21:13:28.000000000 +0100
+++ scummvm-0.11.1/engines/lure/sound.h 2008-03-08 21:13:37.000000000 +0100
@@ -66,7 +66,7 @@ private:
public:
MidiMusic(MidiDriver *driver, ChannelEntry channels[NUM_CHANNELS],
- uint8 channelNum, uint8 soundNum, bool isMusic, void *soundData, uint32 size);
+ uint8 channelNum, uint8 soundNum, bool isMusic, uint8 numChannels, void *soundData, uint32 size);
~MidiMusic();
void setVolume(int volume);
int getVolume() { return _volume; }
@@ -152,7 +152,7 @@ public:
// The following methods implement the external sound player module
void musicInterface_Initialise();
- void musicInterface_Play(uint8 soundNumber, uint8 channelNumber);
+ void musicInterface_Play(uint8 soundNumber, uint8 channelNumber, uint8 numChannels=4);
void musicInterface_Stop(uint8 soundNumber);
bool musicInterface_CheckPlaying(uint8 soundNumber);
void musicInterface_SetVolume(uint8 channelNum, uint8 volume);
diff -up scummvm-0.11.1/engines/lure/sound.cpp.alloc scummvm-0.11.1/engines/lure/sound.cpp
--- scummvm-0.11.1/engines/lure/sound.cpp.alloc 2008-03-08 21:13:28.000000000 +0100
+++ scummvm-0.11.1/engines/lure/sound.cpp 2008-03-08 21:13:37.000000000 +0100
@@ -189,16 +189,24 @@ void SoundManager::addSound(uint8 soundI
return;
SoundDescResource &rec = soundDescs()[soundIndex];
- int numChannels = 4; //(rec.numChannels >> 2) & 3;
+ int numChannels;
- int channelCtr;
- for (channelCtr = 0; channelCtr < NUM_CHANNELS; channelCtr += 4) {
- if (!_channelsInUse[channelCtr]) {
+ if (_isRoland)
+ numChannels = (rec.numChannels & 3) + 1;
+ else
+ numChannels = ((rec.numChannels >> 2) & 3) + 1;
+
+ int channelCtr, channelCtr2;
+ for (channelCtr = 0; channelCtr <= (NUM_CHANNELS-numChannels); channelCtr ++) {
+ for (channelCtr2 = 0; channelCtr2 < numChannels; channelCtr2++)
+ if (_channelsInUse[channelCtr+channelCtr2])
+ break;
+
+ if (channelCtr2 == numChannels)
break;
- }
}
- if (channelCtr >= NUM_CHANNELS) {
+ if (channelCtr > (NUM_CHANNELS-numChannels)) {
// No channels free
debugC(ERROR_BASIC, kLureDebugSounds, "SoundManager::addSound - no channels free");
return;
@@ -218,7 +226,7 @@ void SoundManager::addSound(uint8 soundI
newEntry->volume = 240; /* 255 causes clipping with adlib */
_activeSounds.push_back(newEntry);
- musicInterface_Play(rec.soundNumber, channelCtr);
+ musicInterface_Play(rec.soundNumber, channelCtr, numChannels);
musicInterface_SetVolume(channelCtr, newEntry->volume);
}
@@ -335,7 +343,7 @@ void SoundManager::restoreSounds() {
if ((rec->numChannels != 0) && ((rec->flags & SF_RESTORE) != 0)) {
Common::set_to(_channelsInUse+rec->channel, _channelsInUse+rec->channel+rec->numChannels, true);
- musicInterface_Play(rec->soundNumber, rec->channel);
+ musicInterface_Play(rec->soundNumber, rec->channel, rec->numChannels);
musicInterface_SetVolume(rec->channel, rec->volume);
}
@@ -377,7 +385,7 @@ void SoundManager::fadeOut() {
// musicInterface_Play
// Play the specified sound
-void SoundManager::musicInterface_Play(uint8 soundNumber, uint8 channelNumber) {
+void SoundManager::musicInterface_Play(uint8 soundNumber, uint8 channelNumber, uint8 numChannels) {
debugC(ERROR_INTERMEDIATE, kLureDebugSounds, "musicInterface_Play soundNumber=%d, channel=%d",
soundNumber, channelNumber);
Game &game = Game::getReference();
@@ -413,7 +421,7 @@ void SoundManager::musicInterface_Play(u
g_system->lockMutex(_soundMutex);
MidiMusic *sound = new MidiMusic(_driver, _channelsInner, channelNumber, soundNum,
- isMusic, soundStart, dataSize);
+ isMusic, numChannels, soundStart, dataSize);
_playingSounds.push_back(sound);
g_system->unlockMutex(_soundMutex);
}
@@ -555,14 +563,14 @@ void SoundManager::doTimer() {
/*------------------------------------------------------------------------*/
MidiMusic::MidiMusic(MidiDriver *driver, ChannelEntry channels[NUM_CHANNELS],
- uint8 channelNum, uint8 soundNum, bool isMusic, void *soundData, uint32 size) {
+ uint8 channelNum, uint8 soundNum, bool isMusic, uint8 numChannels, void *soundData, uint32 size) {
_driver = driver;
_channels = channels;
_soundNumber = soundNum;
_channelNumber = channelNum;
_isMusic = isMusic;
- _numChannels = 4;
+ _numChannels = numChannels;
_volume = 0;
for (int i = 0; i < _numChannels; ++i) {
/* 90 is power on default for midi compliant devices */