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 */