[Scummvm-cvs-logs] SF.net SVN: scummvm:[52484] scummvm/trunk/engines/sci

m_kiewitz at users.sourceforge.net m_kiewitz at users.sourceforge.net
Wed Sep 1 21:20:18 CEST 2010


Revision: 52484
          http://scummvm.svn.sourceforge.net/scummvm/?rev=52484&view=rev
Author:   m_kiewitz
Date:     2010-09-01 19:20:17 +0000 (Wed, 01 Sep 2010)

Log Message:
-----------
SCI: set master volume correctly

and merge it together with global volume, fixes bug #3053104)

Modified Paths:
--------------
    scummvm/trunk/engines/sci/sci.cpp
    scummvm/trunk/engines/sci/sound/midiparser_sci.cpp
    scummvm/trunk/engines/sci/sound/midiparser_sci.h
    scummvm/trunk/engines/sci/sound/music.cpp
    scummvm/trunk/engines/sci/sound/music.h
    scummvm/trunk/engines/sci/sound/soundcmd.cpp
    scummvm/trunk/engines/sci/sound/soundcmd.h

Modified: scummvm/trunk/engines/sci/sci.cpp
===================================================================
--- scummvm/trunk/engines/sci/sci.cpp	2010-09-01 15:46:44 UTC (rev 52483)
+++ scummvm/trunk/engines/sci/sci.cpp	2010-09-01 19:20:17 UTC (rev 52484)
@@ -45,6 +45,7 @@
 #include "sci/engine/selector.h"	// for SELECTOR
 
 #include "sci/sound/audio.h"
+#include "sci/sound/music.h"
 #include "sci/sound/soundcmd.h"
 #include "sci/graphics/animate.h"
 #include "sci/graphics/cache.h"
@@ -678,7 +679,7 @@
 	int soundVolumeMusic = (mute ? 0 : ConfMan.getInt("music_volume"));
 
 	if (_gamestate && g_sci->_soundCmd) {
-		int vol =  (soundVolumeMusic + 1) * SoundCommandParser::kMaxSciVolume / Audio::Mixer::kMaxMixerVolume;
+		int vol =  (soundVolumeMusic + 1) * MUSIC_MASTERVOLUME_MAX / Audio::Mixer::kMaxMixerVolume;
 		g_sci->_soundCmd->setMasterVolume(vol);
 	}
 }

Modified: scummvm/trunk/engines/sci/sound/midiparser_sci.cpp
===================================================================
--- scummvm/trunk/engines/sci/sound/midiparser_sci.cpp	2010-09-01 15:46:44 UTC (rev 52483)
+++ scummvm/trunk/engines/sci/sound/midiparser_sci.cpp	2010-09-01 19:20:17 UTC (rev 52484)
@@ -53,6 +53,7 @@
 	_ppqn = 1;
 	setTempo(16667);
 
+	_masterVolume = 15;
 	_volume = 127;
 
 	_signalSet = false;
@@ -418,7 +419,7 @@
 		int channelVolume = (midi >> 16) & 0xFF;
 		// Remember, if we need to set it ourselves
 		_channelVolume[midiChannel] = channelVolume;
-		// Adjust volume accordingly to current "global" volume
+		// Adjust volume accordingly to current local volume
 		channelVolume = channelVolume * _volume / 127;
 		midi = (midi & 0xFFF0) | ((channelVolume & 0xFF) << 16);
 	}
@@ -659,6 +660,28 @@
 	memset(_active_notes, 0, sizeof(_active_notes));
 }
 
+void MidiParser_SCI::setMasterVolume(byte masterVolume) {
+	assert(masterVolume <= MUSIC_MASTERVOLUME_MAX);
+	_masterVolume = masterVolume;
+	switch (_soundVersion) {
+	case SCI_VERSION_0_EARLY:
+	case SCI_VERSION_0_LATE:
+		// update driver master volume
+		setVolume(_volume);
+		break;
+
+	case SCI_VERSION_1_EARLY:
+	case SCI_VERSION_1_LATE:
+	case SCI_VERSION_2_1:
+		// directly set master volume (global volume is merged with channel volumes)
+		((MidiPlayer *)_driver)->setVolume(masterVolume);
+		break;
+
+	default:
+		error("MidiParser_SCI::setVolume: Unsupported soundVersion");
+	}
+}
+
 void MidiParser_SCI::setVolume(byte volume) {
 	assert(volume <= MUSIC_VOLUME_MAX);
 	_volume = volume;
@@ -667,8 +690,7 @@
 	case SCI_VERSION_0_EARLY:
 	case SCI_VERSION_0_LATE: {
 		// SCI0 adlib driver doesn't support channel volumes, so we need to go this way
-		// TODO: this should take the actual master volume into account
-		int16 globalVolume = _volume * 15 / 127;
+		int16 globalVolume = _volume * _masterVolume / MUSIC_VOLUME_MAX;
 		((MidiPlayer *)_driver)->setVolume(globalVolume);
 		break;
 	}

Modified: scummvm/trunk/engines/sci/sound/midiparser_sci.h
===================================================================
--- scummvm/trunk/engines/sci/sound/midiparser_sci.h	2010-09-01 15:46:44 UTC (rev 52483)
+++ scummvm/trunk/engines/sci/sound/midiparser_sci.h	2010-09-01 19:20:17 UTC (rev 52484)
@@ -65,6 +65,7 @@
 	}
 	void sendInitCommands();
 	void unloadMusic();
+	void setMasterVolume(byte masterVolume);
 	void setVolume(byte volume);
 	void stop() {
 		_abort_parse = true;
@@ -104,7 +105,8 @@
 	SoundResource::Track *_track;
 	MusicEntry *_pSnd;
 	uint32 _loopTick;
-	byte _volume;
+	byte _masterVolume; // the overall master volume (same for all tracks)
+	byte _volume; // the global volume of the current track
 
 	bool _signalSet;
 	int16 _signalToSet;

Modified: scummvm/trunk/engines/sci/sound/music.cpp
===================================================================
--- scummvm/trunk/engines/sci/sound/music.cpp	2010-09-01 15:46:44 UTC (rev 52483)
+++ scummvm/trunk/engines/sci/sound/music.cpp	2010-09-01 19:20:17 UTC (rev 52484)
@@ -261,6 +261,7 @@
 				pSnd->pMidiParser = new MidiParser_SCI(_soundVersion, this);
 				pSnd->pMidiParser->setMidiDriver(_pMidiDrv);
 				pSnd->pMidiParser->setTimerRate(_dwTempo);
+				pSnd->pMidiParser->setMasterVolume(_masterVolume);
 			}
 
 			pSnd->pauseCounter = 0;
@@ -526,8 +527,11 @@
 
 	Common::StackLock lock(_mutex);
 
-	if (_pMidiDrv)
-		_pMidiDrv->setVolume(vol);
+	const MusicList::iterator end = _playList.end();
+	for (MusicList::iterator i = _playList.begin(); i != end; ++i) {
+		if ((*i)->pMidiParser)
+			(*i)->pMidiParser->setMasterVolume(vol);
+	}
 }
 
 void SciMusic::sendMidiCommand(uint32 cmd) {

Modified: scummvm/trunk/engines/sci/sound/music.h
===================================================================
--- scummvm/trunk/engines/sci/sound/music.h	2010-09-01 15:46:44 UTC (rev 52483)
+++ scummvm/trunk/engines/sci/sound/music.h	2010-09-01 19:20:17 UTC (rev 52484)
@@ -47,6 +47,8 @@
 
 #define MUSIC_VOLUME_DEFAULT 127
 #define MUSIC_VOLUME_MAX 127
+#define MUSIC_MASTERVOLUME_DEFAULT 15
+#define MUSIC_MASTERVOLUME_MAX 15
 
 class MidiParser_SCI;
 class SegManager;

Modified: scummvm/trunk/engines/sci/sound/soundcmd.cpp
===================================================================
--- scummvm/trunk/engines/sci/sound/soundcmd.cpp	2010-09-01 15:46:44 UTC (rev 52483)
+++ scummvm/trunk/engines/sci/sound/soundcmd.cpp	2010-09-01 19:20:17 UTC (rev 52484)
@@ -284,8 +284,8 @@
 
 	if (argc > 0) {
 		debugC(2, kDebugLevelSound, "kDoSound(masterVolume): %d", argv[0].toSint16());
-		int vol = CLIP<int16>(argv[0].toSint16(), 0, kMaxSciVolume);
-		vol = vol * Audio::Mixer::kMaxMixerVolume / kMaxSciVolume;
+		int vol = CLIP<int16>(argv[0].toSint16(), 0, MUSIC_MASTERVOLUME_MAX);
+		vol = vol * Audio::Mixer::kMaxMixerVolume / MUSIC_MASTERVOLUME_MAX;
 		ConfMan.setInt("music_volume", vol);
 		ConfMan.setInt("sfx_volume", vol);
 		g_engine->syncSoundSettings();
@@ -688,6 +688,7 @@
 }
 
 void SoundCommandParser::setMasterVolume(int vol) {
+	// 0...15
 	_music->soundSetMasterVolume(vol);
 }
 

Modified: scummvm/trunk/engines/sci/sound/soundcmd.h
===================================================================
--- scummvm/trunk/engines/sci/sound/soundcmd.h	2010-09-01 15:46:44 UTC (rev 52483)
+++ scummvm/trunk/engines/sci/sound/soundcmd.h	2010-09-01 19:20:17 UTC (rev 52484)
@@ -47,10 +47,6 @@
 	SoundCommandParser(ResourceManager *resMan, SegManager *segMan, Kernel *kernel, AudioPlayer *audio, SciVersion soundVersion);
 	~SoundCommandParser();
 
-	enum {
-		kMaxSciVolume = 15
-	};
-
 	//reg_t parseCommand(int argc, reg_t *argv, reg_t acc);
 
 	// Functions used for game state loading


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