diff options
| -rw-r--r-- | scumm/dialogs.cpp | 5 | ||||
| -rw-r--r-- | scumm/imuse_digi.cpp | 64 | ||||
| -rw-r--r-- | scumm/imuse_digi.h | 11 | ||||
| -rw-r--r-- | scumm/script.cpp | 9 | ||||
| -rw-r--r-- | scumm/script_v6.cpp | 11 | ||||
| -rw-r--r-- | scumm/script_v8.cpp | 2 | ||||
| -rw-r--r-- | scumm/scumm.h | 2 | ||||
| -rw-r--r-- | scumm/scummvm.cpp | 6 | ||||
| -rw-r--r-- | scumm/smush/insane.cpp | 9 | ||||
| -rw-r--r-- | scumm/smush/insane.h | 3 | ||||
| -rw-r--r-- | scumm/smush/smush_player.cpp | 5 | ||||
| -rw-r--r-- | scumm/smush/smush_player.h | 2 | ||||
| -rw-r--r-- | scumm/sound.cpp | 13 | ||||
| -rw-r--r-- | scumm/string.cpp | 7 | 
14 files changed, 56 insertions, 93 deletions
diff --git a/scumm/dialogs.cpp b/scumm/dialogs.cpp index 1501eb10ea..5008e04043 100644 --- a/scumm/dialogs.cpp +++ b/scumm/dialogs.cpp @@ -458,7 +458,7 @@ void ConfigDialog::open() {  	GUI_OptionsDialog::open();  	// update checkboxes, too -	subtitlesCheckbox->setState(_scumm->_noSubtitles == false); +	subtitlesCheckbox->setState(ConfMan.getBool("subtitles"));  }  void ConfigDialog::close() { @@ -484,9 +484,6 @@ void ConfigDialog::close() {  	_scumm->_mixer->setVolume(soundVolumeSfx * soundVolumeMaster / 255);  	_scumm->_mixer->setMusicVolume(soundVolumeMusic); -	 -	// Subtitles? -	_scumm->_noSubtitles = !ConfMan.getBool("subtitles");  } diff --git a/scumm/imuse_digi.cpp b/scumm/imuse_digi.cpp index 35863b03f8..f0df2a8928 100644 --- a/scumm/imuse_digi.cpp +++ b/scumm/imuse_digi.cpp @@ -674,12 +674,6 @@ IMuseDigital::IMuseDigital(ScummEngine *scumm)  	: _scumm(scumm) {  	_pause = false; -	_voiceVocData = NULL; -	_voiceVocSize = 0; -	_voiceVocRate = 0; - -	_voiceBundleData = NULL; -  	_nameBundleMusic = "";  	_musicBundleBufFinal = NULL;  	_musicBundleBufOutput = NULL; @@ -766,23 +760,15 @@ void IMuseDigital::callback() {  	}  } -void IMuseDigital::setVocVoice(byte *src, int32 size, int rate) { -	_voiceVocData = src; -	_voiceVocSize = size; -	_voiceVocRate = rate; -} - -void IMuseDigital::setBundleVoice(byte *src) { -	_voiceBundleData = src; -} - -void IMuseDigital::startSound(int sound) { +void IMuseDigital::startSound(int sound, byte *voc_src, int voc_size, int voc_rate) {  	debug(5, "IMuseDigital::startSound(%d)", sound);  	int l, r;  	for (l = 0; l < MAX_DIGITAL_CHANNELS; l++) {  		if (!_channel[l].used && !_channel[l].handle.isActive()) {  			byte *ptr, *s_ptr; +			byte *_voiceVocData = (voc_src && voc_size > 0) ? voc_src : 0; +			byte *_voiceBundleData = (voc_src && voc_size <= 0) ? voc_src : 0;  			if ((sound == kTalkSoundID) && (_voiceBundleData)) {  				s_ptr = ptr = _voiceBundleData;  			} else if ((sound == kTalkSoundID) && (_voiceVocData)) { @@ -819,37 +805,26 @@ void IMuseDigital::startSound(int sound) {  			int32 size = 0;  			int t; -			if ((sound == kTalkSoundID) && (_voiceVocData)) { -				_channel[l].mixerSize = _voiceVocRate * 2; -				_channel[l].freq = _voiceVocRate; -				_channel[l].size = _voiceVocSize * 2; -				_channel[l].bits = 8; -				_channel[l].channels = 2; -				_channel[l].mixerFlags = SoundMixer::FLAG_STEREO | SoundMixer::FLAG_REVERSE_STEREO | SoundMixer::FLAG_UNSIGNED; -				_channel[l].data = (byte *)malloc(_channel[l].size); - -				for (t = 0; t < _channel[l].size / 2; t++) { -					*(_channel[l].data + t * 2 + 0) = *(_voiceVocData + t); -					*(_channel[l].data + t * 2 + 1) = *(_voiceVocData + t); +			if ((sound == kTalkSoundID) && (_voiceVocData) || (READ_UINT32(ptr) == MKID('Crea'))) { +				if (READ_UINT32(ptr) == MKID('Crea')) { +					int loops = 0; +					voc_src = readVOCFromMemory(ptr, voc_size, voc_rate, loops);  				} - -				_voiceVocData = NULL; -			} else if (READ_UINT32(ptr) == MKID('Crea')) { -				int32 loops = 0; -				byte *t_ptr= readVOCFromMemory(ptr, size, _channel[l].freq, loops); -				_channel[l].mixerSize = _channel[l].freq * 2; -				_channel[l].size = size * 2; +				_channel[l].mixerSize = voc_rate * 2; +				_channel[l].freq = voc_rate; +				_channel[l].size = voc_size * 2;  				_channel[l].bits = 8;  				_channel[l].channels = 2;  				_channel[l].mixerFlags = SoundMixer::FLAG_STEREO | SoundMixer::FLAG_REVERSE_STEREO | SoundMixer::FLAG_UNSIGNED;  				_channel[l].data = (byte *)malloc(_channel[l].size); +				// Widen data to two channels  				for (t = 0; t < _channel[l].size / 2; t++) { -					*(_channel[l].data + t * 2 + 0) = *(t_ptr + t); -					*(_channel[l].data + t * 2 + 1) = *(t_ptr + t); +					*(_channel[l].data + t * 2 + 0) = *(voc_src + t); +					*(_channel[l].data + t * 2 + 1) = *(voc_src + t);  				} -				free(t_ptr); +				free(voc_src);  			} else if (READ_UINT32(ptr) == MKID('iMUS')) {  				ptr += 16;  				for (;;) { @@ -964,11 +939,10 @@ void IMuseDigital::startSound(int sound) {  						size *= 2;  						_channel[l].channels = 2;  						_channel[l].data = (byte *)malloc(size); +						// Widen data to two channels  						for (t = 0; t < size / 4; t++) { -							*(_channel[l].data + t * 4 + 0) = *(ptr + t * 2 + 0); -							*(_channel[l].data + t * 4 + 1) = *(ptr + t * 2 + 1); -							*(_channel[l].data + t * 4 + 2) = *(ptr + t * 2 + 0); -							*(_channel[l].data + t * 4 + 3) = *(ptr + t * 2 + 1); +							*(uint16 *)(_channel[l].data + t * 4 + 0) = *(uint16 *)(ptr + t * 2); +							*(uint16 *)(_channel[l].data + t * 4 + 2) = *(uint16 *)(ptr + t * 2);  						}  					}  					_channel[l].size = size; @@ -978,6 +952,7 @@ void IMuseDigital::startSound(int sound) {  						size *= 2;  						_channel[l].channels = 2;  						_channel[l].data = (byte *)malloc(size); +						// Widen data to two channels  						for (t = 0; t < size / 2; t++) {  							*(_channel[l].data + t * 2 + 0) = *(ptr + t);  							*(_channel[l].data + t * 2 + 1) = *(ptr + t); @@ -1478,8 +1453,7 @@ void IMuseDigital::playBundleSound(const char *sound) {  	if (ptr) {  		stopSound(kTalkSoundID); -		setBundleVoice(ptr); -		startSound(kTalkSoundID); +		startSound(kTalkSoundID, ptr);  		free(ptr);  	}  } diff --git a/scumm/imuse_digi.h b/scumm/imuse_digi.h index 9bd7b379e9..5d462f650b 100644 --- a/scumm/imuse_digi.h +++ b/scumm/imuse_digi.h @@ -130,17 +130,12 @@ private:  public:  	int32 _bundleSongPosInMs;  	Bundle *_bundle;	// FIXME: should be protected but is used by ScummEngine::askForDisk -	byte *_voiceVocData; -	int32 _voiceVocSize; -	int _voiceVocRate; - -	byte *_voiceBundleData;  	void pauseBundleMusic(bool state);  	void stopBundleMusic();  	void playBundleSound(const char *sound); -	void setVocVoice(byte *src, int32 size, int rate); -	void setBundleVoice(byte *src); + +	void startSound(int sound, byte *src, int size = 0, int rate = 0);  public:  	IMuseDigital(ScummEngine *scumm); @@ -148,7 +143,7 @@ public:  	void setMasterVolume(int vol) {} -	void startSound(int sound); +	void startSound(int sound) { startSound(sound, 0, 0, 0); }  	void stopSound(int sound);  	void stopAllSounds();  	void pause(bool pause); diff --git a/scumm/script.cpp b/scumm/script.cpp index c7252f98be..9fc9e15315 100644 --- a/scumm/script.cpp +++ b/scumm/script.cpp @@ -22,6 +22,7 @@  #include "stdafx.h" +#include "common/config-manager.h"  #include "common/util.h"  #include "scumm/actor.h" @@ -476,7 +477,7 @@ int ScummEngine::readVar(uint var) {  		}  		if (_gameId == GID_LOOM256 && var == VAR_NOSUBTITLES) { -			return _noSubtitles;	 +			return !ConfMan.getBool("subtitles");	  		}  		checkRange(_numVariables - 1, 0, var, "Variable %d out of range(r)"); @@ -542,8 +543,10 @@ void ScummEngine::writeVar(uint var, int value) {  			_scummVars[var] = value;  		// stay in sync with loom cd subtitle var -		if (_gameId == GID_LOOM256 && var == VAR_NOSUBTITLES && (value == 0 || value == 1))  -			_noSubtitles = (value != 0); +		if (_gameId == GID_LOOM256 && var == VAR_NOSUBTITLES) { +			assert(value == 0 || value == 1); +			ConfMan.set("subtitles", (value == 0)); +		}  		if ((_varwatch == (int)var) || (_varwatch == 0)) {  			if (vm.slot[_currentScript].number < 100) diff --git a/scumm/script_v6.cpp b/scumm/script_v6.cpp index bfa4f8687f..26057c800f 100644 --- a/scumm/script_v6.cpp +++ b/scumm/script_v6.cpp @@ -23,6 +23,8 @@  #include "stdafx.h" +#include "common/config-manager.h" +  #include "scumm/actor.h"  #include "scumm/charset.h"  #include "scumm/imuse.h" @@ -2413,7 +2415,7 @@ void ScummEngine_v6::o6_kernelSetFunctions() {  				debug(1, "INSANE Arg: %d %d", args[1], args[2]); -				SmushPlayer *sp = new SmushPlayer(this, speed, !_noSubtitles); +				SmushPlayer *sp = new SmushPlayer(this, speed);  				// INSANE mode 0: SMUSH movie playback  				if (args[1] == 0) { @@ -2422,7 +2424,7 @@ void ScummEngine_v6::o6_kernelSetFunctions() {  #ifdef INSANE  					const int insaneVarNum = (_features & GF_DEMO) ? 232 : 233; -					_insane->setSmushParams(speed, !_noSubtitles); +					_insane->setSmushParams(speed);  					_insane->runScene(insaneVarNum);  #else @@ -2559,10 +2561,7 @@ void ScummEngine_v6::o6_kernelSetFunctions() {  			_saveSound = args[1];  			break;  		case 215: -			if (args[1]) -				_noSubtitles = false; -			else -				_noSubtitles = true; +			ConfMan.set("subtitles", args[1] != 0);  			break;  		default:  			error("o6_kernelSetFunctions: default case %d (param count %d)", args[0], num); diff --git a/scumm/script_v8.cpp b/scumm/script_v8.cpp index 9d5822db0a..36cb2cfcc5 100644 --- a/scumm/script_v8.cpp +++ b/scumm/script_v8.cpp @@ -1244,7 +1244,7 @@ void ScummEngine_v8::o8_startVideo() {  	debug(4, "o8_startVideo(%s/%s)", getGameDataPath(), (const char*)_scriptPointer); -	SmushPlayer *sp = new SmushPlayer(this, 83333, !_noSubtitles); +	SmushPlayer *sp = new SmushPlayer(this, 83333);  	sp->play((const char*)_scriptPointer, getGameDataPath());  	delete sp; diff --git a/scumm/scumm.h b/scumm/scumm.h index 46ac7180c1..d14d07f48d 100644 --- a/scumm/scumm.h +++ b/scumm/scumm.h @@ -1013,8 +1013,6 @@ protected:  	int _charsetBufPos;  	byte _charsetBuffer[512]; -public: -	bool _noSubtitles;	// Whether to skip all subtitles  protected:  	void initCharset(int charset); diff --git a/scumm/scummvm.cpp b/scumm/scummvm.cpp index dbdc75c899..c6de503849 100644 --- a/scumm/scummvm.cpp +++ b/scumm/scummvm.cpp @@ -471,7 +471,6 @@ ScummEngine::ScummEngine(GameDetector *detector, OSystem *syst, const ScummGameS  	memset(_charsetBuffer, 0, sizeof(_charsetBuffer));  	_copyProtection = false;  	_demoMode = false; -	_noSubtitles = false;  	_confirmExit = false;  	_numInMsgStack = 0;  	_msgPtrToAdd = NULL; @@ -659,11 +658,10 @@ ScummEngine::ScummEngine(GameDetector *detector, OSystem *syst, const ScummGameS  	_copyProtection = ConfMan.getBool("copy_protection");  	_demoMode = ConfMan.getBool("demo_mode"); -	_noSubtitles = ConfMan.getBool("subtitles"); -	_noSubtitles ^=1;  	if (ConfMan.hasKey("nosubtitles")) {  		warning("Configuration key 'nosubtitles' is deprecated. Use 'subtitles' instead"); -		_noSubtitles = ConfMan.getBool("nosubtitles"); +		if (!ConfMan.hasKey("subtitles")) +			ConfMan.set("subtitles", !ConfMan.getBool("nosubtitles"));  	}  	_confirmExit = ConfMan.getBool("confirm_exit");  	_defaultTalkDelay = ConfMan.getInt("talkspeed"); diff --git a/scumm/smush/insane.cpp b/scumm/smush/insane.cpp index 8486ef714c..7347c91a6c 100644 --- a/scumm/smush/insane.cpp +++ b/scumm/smush/insane.cpp @@ -24,6 +24,7 @@  #include "base/engine.h" +#include "common/config-manager.h"  #include "common/file.h"  #include "scumm/scumm.h" @@ -106,16 +107,14 @@ Insane::~Insane(void) {  	delete _smush_icons2Nut;  } -void Insane::setSmushParams(int speed, bool subtitles) { +void Insane::setSmushParams(int speed) {  	_speed = speed; -	_subtitles = subtitles;  }  void Insane::initvars(void) {  	int i, j;  	_speed = 12; -	_subtitles = true;  	_insaneIsRunning = false;  	_numberArray = 0; @@ -1859,7 +1858,7 @@ void Insane::runScene(int arraynum) {  	//	  ptrMainLoop = &ptrMainLoopBody;  	_insaneIsRunning = true; -	_player = new SmushPlayer(_scumm, _speed, _subtitles); +	_player = new SmushPlayer(_scumm, _speed);  	_player->insanity(true);  	_numberArray = arraynum; @@ -3501,7 +3500,7 @@ void Insane::postCaseAll(byte *renderBitmap, int32 codecparam, int32 setupsan12,  	if (tsceneProp->actor != -1) {  		if (_actor[tsceneProp->actor].field_54) {  			tsceneProp->counter++; -			if (!_actor[tsceneProp->actor].runningSound || !_scumm->_noSubtitles) { +			if (!_actor[tsceneProp->actor].runningSound || ConfMan.getBool("subtitles")) {  				if (_actor[tsceneProp->actor].act[3].state == 72 &&  					_currTrsMsg) {  					smush_setPaletteValue(1, tsceneProp->r, tsceneProp->g, tsceneProp->b); diff --git a/scumm/smush/insane.h b/scumm/smush/insane.h index 0c215d75f3..02aab9c779 100644 --- a/scumm/smush/insane.h +++ b/scumm/smush/insane.h @@ -58,7 +58,7 @@ class Insane {  	Insane(ScummEngine *scumm);  	~Insane(); -	void setSmushParams(int speed, bool subtitles); +	void setSmushParams(int speed);  	void runScene(int arraynum);  	void procPreRendering(void); @@ -75,7 +75,6 @@ class Insane {  	SmushPlayer *_player;  	int32 _speed; -	bool _subtitles;  	bool _insaneIsRunning;  	int32 _numberArray; diff --git a/scumm/smush/smush_player.cpp b/scumm/smush/smush_player.cpp index 980668556a..45b6280df4 100644 --- a/scumm/smush/smush_player.cpp +++ b/scumm/smush/smush_player.cpp @@ -23,6 +23,7 @@  #include "base/engine.h" +#include "common/config-manager.h"  #include "common/file.h"  #include "common/util.h"  #include "common/timer.h" @@ -209,7 +210,7 @@ void SmushPlayer::timerCallback(void *refCon) {  	((SmushPlayer *)refCon)->parseNextFrame();  } -SmushPlayer::SmushPlayer(ScummEngine *scumm, int speed, bool subtitles) { +SmushPlayer::SmushPlayer(ScummEngine *scumm, int speed) {  	_scumm = scumm;  	_version = -1;  	_nbframes = 0; @@ -224,7 +225,7 @@ SmushPlayer::SmushPlayer(ScummEngine *scumm, int speed, bool subtitles) {  	_frameBuffer = NULL;  	_skipNext = false; -	_subtitles = subtitles; +	_subtitles = ConfMan.getBool("subtitles");  	_dst = NULL;  	_storeFrame = false;  	_width = 0; diff --git a/scumm/smush/smush_player.h b/scumm/smush/smush_player.h index 12a86a01a9..d45f5446ca 100644 --- a/scumm/smush/smush_player.h +++ b/scumm/smush/smush_player.h @@ -71,7 +71,7 @@ private:  	bool _middleAudio;  public: -	SmushPlayer(ScummEngine *, int, bool); +	SmushPlayer(ScummEngine *scumm, int speed);  	~SmushPlayer();  	void play(const char *filename, const char *directory); diff --git a/scumm/sound.cpp b/scumm/sound.cpp index 13fa9cb31f..9b0abe5185 100644 --- a/scumm/sound.cpp +++ b/scumm/sound.cpp @@ -559,7 +559,8 @@ void Sound::startTalkSound(uint32 offset, uint32 b, int mode, PlayingSoundHandle  		_mouthSyncMode = true;  	} -	startSfxSound(_sfxFile, size, handle, id); +	if (!_soundsPaused && _scumm->_mixer->isReady()) +		startSfxSound(_sfxFile, size, handle, id);  }  void Sound::stopTalkSound() { @@ -794,9 +795,6 @@ void Sound::pauseSounds(bool pause) {  void Sound::startSfxSound(File *file, int file_size, PlayingSoundHandle *handle, int id) { -	if (_soundsPaused || !_scumm->_mixer->isReady()) -		return; -  	if (file_size > 0) {  		if (_vorbis_mode) {  #ifdef USE_VORBIS @@ -815,9 +813,7 @@ void Sound::startSfxSound(File *file, int file_size, PlayingSoundHandle *handle,  	byte *data = loadVOCFile(_sfxFile, size, rate);  	if (_scumm->_imuseDigital) { -		_scumm->_imuseDigital->setVocVoice(data, size, rate); -		_scumm->_imuseDigital->startSound(kTalkSoundID); -		free(data); +		_scumm->_imuseDigital->startSound(kTalkSoundID, data, size, rate);  	} else {  		_scumm->_mixer->playRaw(handle, data, size, rate, SoundMixer::FLAG_AUTOFREE | SoundMixer::FLAG_UNSIGNED, id);  	} @@ -832,7 +828,8 @@ File *Sound::openSfxFile() {  	 * same directory */  	offset_table = NULL; -	// for now until better streaming will be, ft voice can't not be compressed +	// FIXME / TODO / HACK: for FT voice can only be loaded from original .sou +	// files, not .so3 or .sog. This will be so until IMuseDigital gets fixed.  	if (_scumm->_imuseDigital) {  		sprintf(buf, "%s.sou", _scumm->getGameName());  		if (!file->open(buf, _scumm->getGameDataPath())) { diff --git a/scumm/string.cpp b/scumm/string.cpp index 24d709ec3f..d14a4474c9 100644 --- a/scumm/string.cpp +++ b/scumm/string.cpp @@ -21,6 +21,9 @@   */  #include "stdafx.h" + +#include "common/config-manager.h" +  #include "scumm/scumm.h"  #include "scumm/actor.h"  #include "scumm/charset.h" @@ -316,9 +319,9 @@ void ScummEngine::CHARSET_1() {  			if (_version <= 3) {  				_charset->printChar(c);  			} else { -				if ((_gameId == GID_LOOM256) && _noSubtitles && (_sound->pollCD())) { +				if ((_gameId == GID_LOOM256) && !ConfMan.getBool("subtitles") && (_sound->pollCD())) {  					// Special case for loomcd, since it only uses CD audio.for sound -				} else if (_noSubtitles && (_haveMsg == 0xFE || _sound->_talkChannelHandle.isActive())) { +				} else if (!ConfMan.getBool("subtitles") && (_haveMsg == 0xFE || _sound->_talkChannelHandle.isActive())) {  					// Subtitles are turned off, and there is a voice version  					// of this message -> don't print it.   				} else  | 
