[Scummvm-cvs-logs] SF.net SVN: scummvm: [31194] scummvm/trunk/engines/lure

dreammaster at users.sourceforge.net dreammaster at users.sourceforge.net
Wed Mar 19 11:37:33 CET 2008


Revision: 31194
          http://scummvm.svn.sourceforge.net/scummvm/?rev=31194&view=rev
Author:   dreammaster
Date:     2008-03-19 03:37:33 -0700 (Wed, 19 Mar 2008)

Log Message:
-----------
Commit of Hans de Goede's patches to the sound handling code

Modified Paths:
--------------
    scummvm/trunk/engines/lure/sound.cpp
    scummvm/trunk/engines/lure/sound.h

Modified: scummvm/trunk/engines/lure/sound.cpp
===================================================================
--- scummvm/trunk/engines/lure/sound.cpp	2008-03-19 10:18:05 UTC (rev 31193)
+++ scummvm/trunk/engines/lure/sound.cpp	2008-03-19 10:37:33 UTC (rev 31194)
@@ -38,7 +38,6 @@
 
 SoundManager::SoundManager() {
 	Disk &disk = Disk::getReference();
-	Game &game = Game::getReference();
 	_soundMutex = g_system->createMutex();
 
 	int index;
@@ -51,7 +50,7 @@
 	_isRoland = midiDriver != MD_ADLIB;
 	_nativeMT32 = ((midiDriver == MD_MT32) || ConfMan.getBool("native_mt32"));
 
-	Common::set_to(_channelsInUse, _channelsInUse+NUM_CHANNELS_OUTER, false);
+	Common::set_to(_channelsInUse, _channelsInUse + NUM_CHANNELS, false);
 
 	_driver = MidiDriver::createMidi(midiDriver);
 	int statusCode = _driver->open();
@@ -63,10 +62,10 @@
 		if (_nativeMT32)
 			_driver->property(MidiDriver::PROP_CHANNEL_MASK, 0x03FE);
 
-		for (index = 0; index < NUM_CHANNELS_INNER; ++index) {
+		for (index = 0; index < NUM_CHANNELS; ++index) {
 			_channelsInner[index].midiChannel = _driver->allocateChannel();
-			_channelsInner[index].isMusic = false;
-			_channelsInner[index].volume = game.sfxVolume();
+			/* 90 is power on default for midi compliant devices */
+			_channelsInner[index].volume = 90;
 		}
 	}
 }
@@ -173,7 +172,7 @@
 
 	// Clear the active sounds
 	_activeSounds.clear();
-	Common::set_to(_channelsInUse, _channelsInUse+NUM_CHANNELS_OUTER, false);
+	Common::set_to(_channelsInUse, _channelsInUse + NUM_CHANNELS, false);
 }
 
 void SoundManager::addSound(uint8 soundIndex, bool tidyFlag) {
@@ -188,58 +187,56 @@
 		return;
 
 	SoundDescResource &rec = soundDescs()[soundIndex];
-	int numChannels = 2; //(rec.numChannels >> 2) & 3;
+	int numChannels;
 
-	int channelCtr = 0;
-	while (channelCtr <= (NUM_CHANNELS_OUTER - numChannels)) {
-		if (!_channelsInUse[channelCtr]) {
-			bool foundSpace = true;
+	if (_isRoland)
+		numChannels = (rec.numChannels & 3) + 1;
+	else
+		numChannels = ((rec.numChannels >> 2) & 3) + 1;
 
-			int channelCtr2 = 1;
-			while (channelCtr2 < numChannels) {
-				foundSpace = !_channelsInUse[channelCtr + channelCtr2];
-				if (!foundSpace) break;
-				++channelCtr2;
-			}
-
-			if (foundSpace)
+	int channelCtr, channelCtr2;
+	for (channelCtr = 0; channelCtr <= (NUM_CHANNELS - numChannels); ++channelCtr) {
+		for (channelCtr2 = 0; channelCtr2 < numChannels; ++channelCtr2)
+			if (_channelsInUse[channelCtr + channelCtr2])
 				break;
-		}
 
-		++channelCtr;
+		if (channelCtr2 == numChannels)
+			break;
 	}
 
-	if (channelCtr > NUM_CHANNELS_OUTER - numChannels) {
+	if (channelCtr > (NUM_CHANNELS - numChannels)) {
 		// No channels free
 		debugC(ERROR_BASIC, kLureDebugSounds, "SoundManager::addSound - no channels free");
 		return;
 	}
 
 	// Mark the found channels as in use
-	Common::set_to(_channelsInUse+channelCtr, _channelsInUse+channelCtr+numChannels, true);
+	Common::set_to(_channelsInUse+channelCtr, _channelsInUse+channelCtr + numChannels, true);
 
 	SoundDescResource *newEntry = new SoundDescResource();
 	newEntry->soundNumber = rec.soundNumber;
 	newEntry->channel = channelCtr;
 	newEntry->numChannels = numChannels;
 	newEntry->flags = rec.flags;
-	newEntry->volume = rec.volume;
+	if (_isRoland)
+		newEntry->volume = rec.volume;
+	else /* resource volumes do not seem to work well with our adlib emu */
+		newEntry->volume = 240; /* 255 causes clipping with adlib */
 	_activeSounds.push_back(newEntry);
 
-	// Map each two channels to four of the 16 available channels
-	byte innerChannel = (channelCtr / 2) * 4;
-	musicInterface_Play(rec.soundNumber, innerChannel);
-	setVolume(rec.soundNumber, rec.volume);
+	musicInterface_Play(rec.soundNumber, channelCtr, numChannels);
+	musicInterface_SetVolume(channelCtr, newEntry->volume);
 }
 
 void SoundManager::addSound2(uint8 soundIndex) {
 	debugC(ERROR_BASIC, kLureDebugSounds, "SoundManager::addSound2 index=%d", soundIndex);
 	tidySounds();
 
-	if (soundIndex == 6)
+	if (soundIndex == 6) {
 		// Chinese torture
-		addSound(6);
-	else {
+		stopSound(6); // sometimes its still playing when restarted
+		addSound(6, false);
+	} else {
 		SoundDescResource &descEntry = soundDescs()[soundIndex];
 		SoundDescResource *rec = findSound(descEntry.soundNumber);
 		if (rec == NULL)
@@ -270,15 +267,6 @@
 		musicInterface_SetVolume(entry->channel, volume);
 }
 
-void SoundManager::setVolume(uint8 volume) {
-	debugC(ERROR_BASIC, kLureDebugSounds, "SoundManager::setVolume volume=%d", volume);
-
-	for (int index = 0; index < NUM_CHANNELS_INNER; ++index) {
-		_channelsInner[index].midiChannel->volume(volume);
-		_channelsInner[index].volume = volume;
-	}
-}
-
 uint8 SoundManager::descIndexOf(uint8 soundNumber) {
 	SoundDescResource *rec = soundDescs();
 
@@ -315,7 +303,7 @@
 	while (i != _activeSounds.end()) {
 		SoundDescResource *rec = *i;
 
-		if (musicInterface_CheckPlaying(rec->soundNumber & 0x7f))
+		if (musicInterface_CheckPlaying(rec->soundNumber))
 			// Still playing, so move to next entry
 			++i;
 		else {
@@ -353,8 +341,8 @@
 		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_SetVolume(rec->soundNumber, rec->volume);
+			musicInterface_Play(rec->soundNumber, rec->channel, rec->numChannels);
+			musicInterface_SetVolume(rec->channel, rec->volume);
 		}
 
 		++i;
@@ -395,7 +383,7 @@
 // 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();
@@ -422,7 +410,7 @@
 	uint8 *soundStart = _soundData->data() + dataOfs;
 	uint32 dataSize;
 
-	if (soundNumber == _soundsTotal - 1)
+	if (soundNum == _soundsTotal - 1)
 		dataSize = _soundData->size() - dataOfs;
 	else {
 		uint32 nextDataOfs = READ_LE_UINT32(_soundData->data() + (soundNum + 1) * 4 + 2);
@@ -430,9 +418,8 @@
 	}
 
 	g_system->lockMutex(_soundMutex);
-	MidiMusic *sound = new MidiMusic(_driver, _channelsInner, channelNumber, soundNumber,
-		isMusic, soundStart, dataSize);
-	sound->setVolume(volume);
+	MidiMusic *sound = new MidiMusic(_driver, _channelsInner, channelNumber, soundNum,
+		isMusic, numChannels, soundStart, dataSize);
 	_playingSounds.push_back(sound);
 	g_system->unlockMutex(_soundMutex);
 }
@@ -573,21 +560,21 @@
 
 /*------------------------------------------------------------------------*/
 
-MidiMusic::MidiMusic(MidiDriver *driver, ChannelEntry channels[NUM_CHANNELS_INNER],
-					 uint8 channelNum, uint8 soundNum, bool isMusic, void *soundData, uint32 size) {
-	 Game &game = Game::getReference();
+MidiMusic::MidiMusic(MidiDriver *driver, ChannelEntry channels[NUM_CHANNELS],
+					 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) {
-		_channels[_channelNumber + i].isMusic = isMusic;
-		_channels[_channelNumber + i].volume = isMusic ? game.musicVolume() : game.sfxVolume();
+		/* 90 is power on default for midi compliant devices */
+		_channels[_channelNumber + i].volume = 90;
 	}
-	setVolume(0xff);
+	setVolume(240); /* 255 causes clipping with mastervol 192 and adlib */
 
 	_passThrough = false;
 
@@ -645,10 +632,14 @@
 
 	_volume = volume;
 
+	Game &game = Game::getReference();
+	volume *= _isMusic ? game.musicVolume() : game.sfxVolume();
+
 	for (int i = 0; i < _numChannels; ++i) {
 		if (_channels[_channelNumber + i].midiChannel != NULL)
 			_channels[_channelNumber + i].midiChannel->volume(
-				_channels[_channelNumber + i].volume * _volume / 255);
+				_channels[_channelNumber + i].volume *
+				volume / 65025);
 	}
 }
 
@@ -683,14 +674,16 @@
 	byte channel = _channelNumber + ((byte)(b & 0x0F) % _numChannels);
 #endif
 
-	if ((channel >= NUM_CHANNELS_INNER) || (_channels[channel].midiChannel == NULL))
+	if ((channel >= NUM_CHANNELS) || (_channels[channel].midiChannel == NULL))
 		return;
 
 	if ((b & 0xFFF0) == 0x07B0) {
-		// Adjust volume changes by master volume
+		// Adjust volume changes by song and master volume
 		byte volume = (byte)((b >> 16) & 0x7F);
 		_channels[channel].volume = volume;
-		volume = volume * _volume / 255;
+		Game &game = Game::getReference();
+		int master_volume = _isMusic ? game.musicVolume() : game.sfxVolume();
+		volume = volume * _volume * master_volume / 65025;
 		b = (b & 0xFF00FFFF) | (volume << 16);
 	} else if ((b & 0xF0) == 0xC0) {
 		if (Sound.isRoland() && !Sound.hasNativeMT32()) {

Modified: scummvm/trunk/engines/lure/sound.h
===================================================================
--- scummvm/trunk/engines/lure/sound.h	2008-03-19 10:18:05 UTC (rev 31193)
+++ scummvm/trunk/engines/lure/sound.h	2008-03-19 10:37:33 UTC (rev 31194)
@@ -34,12 +34,10 @@
 
 namespace Lure {
 
-#define NUM_CHANNELS_OUTER 8
-#define NUM_CHANNELS_INNER 16
+#define NUM_CHANNELS 16
 
 struct ChannelEntry {
 	MidiChannel *midiChannel;
-	bool isMusic;
 	uint8 volume;
 };
 
@@ -55,6 +53,7 @@
 	MidiDriver *_driver;
 	MidiParser *_parser;
 	ChannelEntry *_channels;
+	bool _isMusic;
 	bool _isPlaying;
 
 	void queueUpdatePos();
@@ -65,11 +64,11 @@
 	bool _passThrough;
 
 public:
-	MidiMusic(MidiDriver *driver, ChannelEntry channels[NUM_CHANNELS_INNER],
-		uint8 channelNum, uint8 soundNum, bool isMusic, void *soundData, uint32 size);
+	MidiMusic(MidiDriver *driver, ChannelEntry channels[NUM_CHANNELS],
+		 uint8 channelNum, uint8 soundNum, bool isMusic, uint8 numChannels, void *soundData, uint32 size);
 	~MidiMusic();
 	void setVolume(int volume);
-	int getVolume()	{ return _volume; }
+	int getVolume() { return _volume; }
 
 	void playSong(uint16 songNum);
 	void stopSong() { stopMusic(); }
@@ -89,11 +88,11 @@
 	void metaEvent(byte type, byte *data, uint16 length);
 
 	void setTimerCallback(void *timerParam, void (*timerProc)(void *)) { }
-	uint32 getBaseTempo(void)	{ return _driver ? _driver->getBaseTempo() : 0; }
+	uint32 getBaseTempo(void) { return _driver ? _driver->getBaseTempo() : 0; }
 
 	//Channel allocation functions
-	MidiChannel *allocateChannel()		{ return 0; }
-	MidiChannel *getPercussionChannel()	{ return 0; }
+	MidiChannel *allocateChannel() { return 0; }
+	MidiChannel *getPercussionChannel() { return 0; }
 
 	uint8 channelNumber() { return _channelNumber; }
 	uint8 soundNumber() { return _soundNumber; }
@@ -111,8 +110,8 @@
 	MidiDriver *_driver;
 	ManagedList<SoundDescResource *> _activeSounds;
 	ManagedList<MidiMusic *> _playingSounds;
-	ChannelEntry _channelsInner[NUM_CHANNELS_INNER];
-	bool _channelsInUse[NUM_CHANNELS_OUTER];
+	ChannelEntry _channelsInner[NUM_CHANNELS];
+	bool _channelsInUse[NUM_CHANNELS];
 	bool _isPlaying;
 	bool _nativeMT32;
 	bool _isRoland;
@@ -138,7 +137,6 @@
 	void stopSound(uint8 soundIndex);
 	void killSound(uint8 soundNumber);
 	void setVolume(uint8 soundNumber, uint8 volume);
-	void setVolume(uint8 volume);
 	void tidySounds();
 	uint8 descIndexOf(uint8 soundNumber);
 	SoundDescResource *findSound(uint8 soundNumber);
@@ -153,7 +151,7 @@
 
 	// 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);


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.




More information about the Scummvm-git-logs mailing list