Blob Blame History Raw
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 */