[Scummvm-cvs-logs] scummvm master -> 4009305070f3f8a1a718526b3e00fc9902a9d87e

dreammaster dreammaster at scummvm.org
Thu Mar 19 01:30:54 CET 2015


This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
4009305070 MADS: Hook up ScummVM volume control


Commit: 4009305070f3f8a1a718526b3e00fc9902a9d87e
    https://github.com/scummvm/scummvm/commit/4009305070f3f8a1a718526b3e00fc9902a9d87e
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2015-03-18T20:29:50-04:00

Commit Message:
MADS: Hook up ScummVM volume control

Changed paths:
    engines/mads/mads.cpp
    engines/mads/nebular/sound_nebular.cpp
    engines/mads/nebular/sound_nebular.h
    engines/mads/sound.cpp
    engines/mads/sound.h



diff --git a/engines/mads/mads.cpp b/engines/mads/mads.cpp
index 59d600f..374e373 100644
--- a/engines/mads/mads.cpp
+++ b/engines/mads/mads.cpp
@@ -126,6 +126,13 @@ void MADSEngine::loadOptions() {
 		if (ConfMan.hasKey("NaughtyMode"))
 			_game->setNaughtyMode(ConfMan.getBool("NaughtyMode"));
 	}
+
+	// Note: MADS is weird in that sfx and music are handled by the same driver,
+	// and the game scripts themselves check for music being enabled before playing
+	// a "music" sound. Which means we can independantly mute music in ScummVM, but
+	// otherwise all sound, music and sfx, is controlled by the SFX volume slider.
+	int soundVolume = MIN(255, ConfMan.getInt("sfx_volume"));
+	_sound->setVolume(soundVolume);
 }
 
 void MADSEngine::saveOptions() {
diff --git a/engines/mads/nebular/sound_nebular.cpp b/engines/mads/nebular/sound_nebular.cpp
index 6412654..9716e6d 100644
--- a/engines/mads/nebular/sound_nebular.cpp
+++ b/engines/mads/nebular/sound_nebular.cpp
@@ -44,6 +44,7 @@ AdlibChannel::AdlibChannel() {
 	_field4 = 0;
 	_sampleIndex = 0;
 	_volume = 0;
+	_volumeOffset = 0;
 	_field7 = 0;
 	_field8 = 0;
 	_field9 = 0;
@@ -61,7 +62,6 @@ AdlibChannel::AdlibChannel() {
 	_field19 = 0;
 	_soundData = nullptr;
 	_field1D = 0;
-	_field1E = 0;
 	_field1F = 0;
 
 	_field20 = 0;
@@ -97,6 +97,7 @@ void AdlibChannel::setPtr2(byte *pData) {
 void AdlibChannel::load(byte *pData) {
 	_ptr1 = _pSrc = _ptr3 = pData;
 	_ptr4 = _soundData = pData;
+	_volumeOffset = 0;
 	_fieldA = 0xFF;
 	_activeCount = 1;
 	_fieldD = 64;
@@ -104,7 +105,7 @@ void AdlibChannel::load(byte *pData) {
 	_field1F = 0;
 	_field2 = _field3 = 0;
 	_volume = _field7 = 0;
-	_field1D = _field1E = 0;
+	_field1D = 0;
 	_fieldE = 0;
 	_field9 = 0;
 	_fieldB = 0;
@@ -117,7 +118,7 @@ void AdlibChannel::load(byte *pData) {
 
 void AdlibChannel::check(byte *nullPtr) {
 	if (_activeCount && _fieldE) {
-		if (!_field1E) {
+		if (!_volumeOffset) {
 			_pSrc = nullPtr;
 			_fieldE = 0;
 		} else {
@@ -166,6 +167,7 @@ ASound::ASound(Audio::Mixer *mixer, FM_OPL *opl, const Common::String &filename,
 	_samplePtr = nullptr;
 	_frameCounter = 0;
 	_isDisabled = false;
+	_masterVolume = 255;
 	_v1 = 0;
 	_v2 = 0;
 	_activeChannelNumber = 0;
@@ -540,7 +542,7 @@ void ASound::pollActiveChannel() {
 						chan->_field1 = 0;
 						chan->_field2 = chan->_field3 = 0;
 						chan->_volume = chan->_field7 = 0;
-						chan->_field1D = chan->_field1E = 0;
+						chan->_field1D = chan->_volumeOffset = 0;
 						chan->_field8 = 0;
 						chan->_field9 = 0;
 						chan->_fieldB = 0;
@@ -615,7 +617,7 @@ void ASound::pollActiveChannel() {
 						if (chan->_fieldE) {
 							chan->_pSrc += 2;
 						} else {
-							chan->_field1E = *pSrc >> 1;
+							chan->_volumeOffset = *pSrc >> 1;
 							updateFlag = true;
 							chan->_pSrc += 2;
 						}
@@ -659,7 +661,7 @@ void ASound::pollActiveChannel() {
 			if (!--chan->_field9) {
 				chan->_field9 = chan->_fieldA;
 				if (chan->_field2) {
-					int8 newVal = (int8)chan->_field2 + (int8)chan->_field1E;
+					int8 newVal = (int8)chan->_field2 + (int8)chan->_volumeOffset;
 					if (newVal < 0) {
 						chan->_field9 = 0;
 						newVal = 0;
@@ -668,7 +670,7 @@ void ASound::pollActiveChannel() {
 						newVal = 63;
 					}
 
-					chan->_field1E = newVal;
+					chan->_volumeOffset = newVal;
 					updateFlag = true;
 				}
 			}
@@ -755,7 +757,8 @@ static const int outputChannels[] = {
 void ASound::updateActiveChannel() {
 	int reg = 0x40 + outputChannels[outputIndexes[_activeChannelNumber * 2 + 1]];
 	int portVal = _ports[reg] & 0xFFC0;
-	int newVolume = CLIP(_activeChannelPtr->_volume + _activeChannelPtr->_field1E, 0, 63);
+	int newVolume = CLIP(_activeChannelPtr->_volume + _activeChannelPtr->_volumeOffset, 0, 63);
+	newVolume = newVolume * _masterVolume / 255;
 
 	// Note: Original had a whole block not seeming to be used, since the initialisation
 	// sets a variable to 5660h, and doesn't change it, so the branch is never taken
@@ -857,6 +860,12 @@ int ASound::readBuffer(int16 *buffer, const int numSamples) {
 	return numSamples;
 }
 
+void ASound::setVolume(int volume) {
+	_masterVolume = volume;
+	if (!volume)
+		command0();
+}
+
 int ASound::command0() {
 	bool isDisabled = _isDisabled;
 	_isDisabled = true;
@@ -1014,22 +1023,22 @@ int ASound1::command10() {
 
 int ASound1::command11() {
 	command111213();
-	_channels[0]._field1E = 0;
-	_channels[1]._field1E = 0;
+	_channels[0]._volumeOffset = 0;
+	_channels[1]._volumeOffset = 0;
 	return 0;
 }
 
 int ASound1::command12() {
 	command111213();
-	_channels[0]._field1E = 40;
-	_channels[1]._field1E = 0;
+	_channels[0]._volumeOffset = 40;
+	_channels[1]._volumeOffset = 0;
 	return 0;
 }
 
 int ASound1::command13() {
 	command111213();
-	_channels[0]._field1E = 40;
-	_channels[1]._field1E = 50;
+	_channels[0]._volumeOffset = 40;
+	_channels[1]._volumeOffset = 50;
 	return 0;
 }
 
diff --git a/engines/mads/nebular/sound_nebular.h b/engines/mads/nebular/sound_nebular.h
index cfacb21..d2fc552 100644
--- a/engines/mads/nebular/sound_nebular.h
+++ b/engines/mads/nebular/sound_nebular.h
@@ -70,7 +70,7 @@ public:
 	int _field19;
 	byte *_soundData;
 	int _field1D;
-	int _field1E;
+	int _volumeOffset;
 	int _field1F;
 
 	// TODO: Only used by asound.003. Figure out usage
@@ -146,6 +146,7 @@ class ASound : public Audio::AudioStream {
 private:
 	Common::List<CachedDataEntry> _dataCache;
 	uint16 _randomSeed;
+	int _masterVolume;
 
 	/**
 	 * Does the initial Adlib initialisation
@@ -382,6 +383,11 @@ public:
 	 * Return sample rate
 	 */
 	virtual int getRate() const { return 11025; }
+
+	/**
+	 * Set the volume
+	 */
+	void setVolume(int volume);
 };
 
 class ASound1 : public ASound {
diff --git a/engines/mads/sound.cpp b/engines/mads/sound.cpp
index 1baa169..4036ee8 100644
--- a/engines/mads/sound.cpp
+++ b/engines/mads/sound.cpp
@@ -36,6 +36,7 @@ SoundManager::SoundManager(MADSEngine *vm, Audio::Mixer *mixer) {
 	_pollSoundEnabled = false;
 	_soundPollFlag = false;
 	_newSoundsPaused = false;
+	_masterVolume = 255;
 
 	_opl = OPL::Config::create();
 	_opl->init(11025);
@@ -97,15 +98,18 @@ void SoundManager::init(int sectionNumber) {
 			break;
 		default:
 			_driver = nullptr;
-			break;
+			return;
 		}
 		break;
 
 	default:
 		warning("SoundManager: Unknown game");
 		_driver = nullptr;
-		break;
+		return;
 	}
+
+	// Set volume for newly loaded driver
+	_driver->setVolume(_masterVolume);
 }
 
 void SoundManager::closeDriver() {
@@ -141,6 +145,13 @@ void SoundManager::startQueuedCommands() {
 	}
 }
 
+void SoundManager::setVolume(int volume) {
+	_masterVolume = volume;
+
+	if (_driver)
+		_driver->setVolume(volume);
+}
+
 void SoundManager::command(int commandId, int param) {
 	if (_newSoundsPaused) {
 		if (_queuedCommands.size() < 8)
diff --git a/engines/mads/sound.h b/engines/mads/sound.h
index 72bb21a..5884323 100644
--- a/engines/mads/sound.h
+++ b/engines/mads/sound.h
@@ -43,6 +43,7 @@ private:
 	bool _soundPollFlag;
 	bool _newSoundsPaused;
 	Common::Queue<int> _queuedCommands;
+	int _masterVolume;
 public:
 	SoundManager(MADSEngine *vm, Audio::Mixer *mixer);
 	~SoundManager();
@@ -78,6 +79,11 @@ public:
 	 */
 	void startQueuedCommands();
 
+	/**
+	 * Set the master volume
+	 */
+	void setVolume(int volume);
+
 	//@{
 	/**
 	 * Executes a command on the sound driver






More information about the Scummvm-git-logs mailing list