diff options
| -rw-r--r-- | engines/sci/engine/game.cpp | 8 | ||||
| -rw-r--r-- | engines/sci/engine/savegame.cpp | 2 | ||||
| -rw-r--r-- | engines/sci/engine/vm.h | 3 | ||||
| -rw-r--r-- | engines/sci/resource.cpp | 10 | ||||
| -rw-r--r-- | engines/sci/sci.cpp | 6 | ||||
| -rw-r--r-- | engines/sci/sfx/iterator/core.cpp | 12 | ||||
| -rw-r--r-- | engines/sci/sfx/iterator/core.h | 2 | ||||
| -rw-r--r-- | engines/sci/sfx/music.cpp | 2 | ||||
| -rw-r--r-- | engines/sci/sfx/softseq/adlib.cpp | 10 | ||||
| -rw-r--r-- | engines/sci/sfx/softseq/amiga.cpp | 10 | ||||
| -rw-r--r-- | engines/sci/sfx/softseq/mididriver.h | 2 | ||||
| -rw-r--r-- | engines/sci/sfx/softseq/pcjr.cpp | 16 | ||||
| -rw-r--r-- | engines/sci/sfx/softseq/pcjr.h | 4 | 
13 files changed, 66 insertions, 21 deletions
| diff --git a/engines/sci/engine/game.cpp b/engines/sci/engine/game.cpp index 0d474a9339..10d914ac59 100644 --- a/engines/sci/engine/game.cpp +++ b/engines/sci/engine/game.cpp @@ -291,13 +291,13 @@ static void _free_graphics_input(EngineState *s) {  }  #endif -int game_init_sound(EngineState *s, int sound_flags) { +int game_init_sound(EngineState *s, int sound_flags, SciVersion soundVersion) {  #ifdef USE_OLD_MUSIC_FUNCTIONS  	if (getSciVersion() > SCI_VERSION_0_LATE)  		sound_flags |= SFX_STATE_FLAG_MULTIPLAY;  	s->sfx_init_flags = sound_flags; -	s->_sound.sfx_init(s->resMan, sound_flags); +	s->_sound.sfx_init(s->resMan, sound_flags, soundVersion);  #endif  	return 0; @@ -421,7 +421,7 @@ int game_init(EngineState *s) {  #ifdef USE_OLD_MUSIC_FUNCTIONS  	if (s->sfx_init_flags & SFX_STATE_FLAG_NOSOUND) -		game_init_sound(s, 0); +		game_init_sound(s, 0, s->detectDoSoundType());  #endif  	// Load game language into printLang property of game object @@ -437,7 +437,7 @@ int game_exit(EngineState *s) {  	if (!s->successor) {  		s->_sound.sfx_exit();  		// Reinit because some other code depends on having a valid state -		game_init_sound(s, SFX_STATE_FLAG_NOSOUND); +		game_init_sound(s, SFX_STATE_FLAG_NOSOUND, s->detectDoSoundType());  	}  #endif diff --git a/engines/sci/engine/savegame.cpp b/engines/sci/engine/savegame.cpp index c8d95a221f..f93438889d 100644 --- a/engines/sci/engine/savegame.cpp +++ b/engines/sci/engine/savegame.cpp @@ -903,7 +903,7 @@ EngineState *gamestate_restore(EngineState *s, Common::SeekableReadStream *fh) {  #ifdef USE_OLD_MUSIC_FUNCTIONS  	temp = retval->_sound._songlib; -	retval->_sound.sfx_init(retval->resMan, s->sfx_init_flags); +	retval->_sound.sfx_init(retval->resMan, s->sfx_init_flags, s->detectDoSoundType());  	retval->sfx_init_flags = s->sfx_init_flags;  	retval->_sound._songlib.freeSounds();  	retval->_sound._songlib = temp; diff --git a/engines/sci/engine/vm.h b/engines/sci/engine/vm.h index 25bca2148c..696aeb1a57 100644 --- a/engines/sci/engine/vm.h +++ b/engines/sci/engine/vm.h @@ -492,9 +492,10 @@ int game_init_graphics(EngineState *s);   * the sound data.   * @param[in] s				The state to initialize the sound in   * @param[in] sound_flags	Flags to pass to the sound subsystem + * @param[in] soundVersion	sound-version that got detected during game init   * @return					0 on success, 1 if an error occured   */ -int game_init_sound(EngineState *s, int sound_flags); +int game_init_sound(EngineState *s, int sound_flags, SciVersion soundVersion);  /**   * Runs an SCI game diff --git a/engines/sci/resource.cpp b/engines/sci/resource.cpp index 9a4a49a01c..f6121bd951 100644 --- a/engines/sci/resource.cpp +++ b/engines/sci/resource.cpp @@ -1942,7 +1942,15 @@ int SoundResource::getChannelFilterMask(int hardwareMask) {  	switch (_soundVersion) {  	case SCI_VERSION_0_EARLY: -		channelMask = 0xFFFF; +		data++; // Skip over digital sample flag +		for (int channelNr = 0; channelNr < 16; channelNr++) { +			channelMask = channelMask >> 1; +			if (*data & hardwareMask) { +				// this Channel is supposed to get played for hardware +				channelMask |= 0x8000; +			} +			data++; +		}  		break;  	case SCI_VERSION_0_LATE: diff --git a/engines/sci/sci.cpp b/engines/sci/sci.cpp index 6a1299f57c..78ff311d7c 100644 --- a/engines/sci/sci.cpp +++ b/engines/sci/sci.cpp @@ -180,7 +180,9 @@ Common::Error SciEngine::run() {  	// since we cannot let the game control where saves are stored)  	strcpy(_gamestate->sys_strings->_strings[SYS_STRING_SAVEDIR]._value, ""); -	_gamestate->_soundCmd = new SoundCommandParser(_resMan, segMan, _audio, _gamestate->detectDoSoundType()); +	SciVersion soundVersion = _gamestate->detectDoSoundType(); + +	_gamestate->_soundCmd = new SoundCommandParser(_resMan, segMan, _audio, soundVersion);  	GfxState gfx_state;  	_gamestate->gfx_state = &gfx_state; @@ -198,7 +200,7 @@ Common::Error SciEngine::run() {  	}  #endif -	if (game_init_sound(_gamestate, 0)) { +	if (game_init_sound(_gamestate, 0, soundVersion)) {  		warning("Game initialization failed: Error in sound subsystem. Aborting...");  		return Common::kUnknownError;  	} diff --git a/engines/sci/sfx/iterator/core.cpp b/engines/sci/sfx/iterator/core.cpp index 0d11344b9f..fcd83ef800 100644 --- a/engines/sci/sfx/iterator/core.cpp +++ b/engines/sci/sfx/iterator/core.cpp @@ -59,6 +59,7 @@ public:  	int _polyphony;  protected: +	SciVersion _soundVersion;  	MidiPlayer *_mididrv;  	SongIterator *_iterator; @@ -77,7 +78,7 @@ protected:  	static void player_timer_callback(void *refCon);  public: -	SfxPlayer(); +	SfxPlayer(SciVersion soundVersion);  	~SfxPlayer();  	/** @@ -138,7 +139,8 @@ public:  	int getVolume();  }; -SfxPlayer::SfxPlayer() { +SfxPlayer::SfxPlayer(SciVersion soundVersion) +	: _soundVersion(soundVersion) {  	_polyphony = 0;  	_mididrv = 0; @@ -261,7 +263,7 @@ Common::Error SfxPlayer::init(ResourceManager *resMan, int expected_latency) {  Common::Error SfxPlayer::add_iterator(SongIterator *it, uint32 start_time) {  	Common::StackLock lock(_mutex); -	SIMSG_SEND(it, SIMSG_SET_PLAYMASK(_mididrv->getPlayMask())); +	SIMSG_SEND(it, SIMSG_SET_PLAYMASK(_mididrv->getPlayMask(_soundVersion)));  	SIMSG_SEND(it, SIMSG_SET_RHYTHM(_mididrv->hasRhythmChannel()));  	if (_iterator == NULL) { @@ -648,7 +650,7 @@ static int sfx_play_iterator_pcm(SongIterator *it, SongHandle handle) {  #define DELAY (1000000 / SFX_TICKS_PER_SEC) -void SfxState::sfx_init(ResourceManager *resMan, int flags) { +void SfxState::sfx_init(ResourceManager *resMan, int flags, SciVersion soundVersion) {  	_songlib._lib = 0;  	_song = NULL;  	_flags = flags; @@ -673,7 +675,7 @@ void SfxState::sfx_init(ResourceManager *resMan, int flags) {  		return;  	} -	_player = new SfxPlayer(); +	_player = new SfxPlayer(soundVersion);  	if (!_player) {  		warning("[SFX] No song player found"); diff --git a/engines/sci/sfx/iterator/core.h b/engines/sci/sfx/iterator/core.h index 0d3bbfb6a2..944b3d0a0f 100644 --- a/engines/sci/sfx/iterator/core.h +++ b/engines/sci/sfx/iterator/core.h @@ -72,7 +72,7 @@ public:  	** Parameters: (ResourceManager *) resMan: Resource manager for initialization  	**             (int) flags: SFX_STATE_FLAG_*  	*/ -	void sfx_init(ResourceManager *resMan, int flags); +	void sfx_init(ResourceManager *resMan, int flags, SciVersion soundVersion);  	/** Deinitializes the sound subsystem. */  	void sfx_exit(); diff --git a/engines/sci/sfx/music.cpp b/engines/sci/sfx/music.cpp index b98004b06f..06860ebc5e 100644 --- a/engines/sci/sfx/music.cpp +++ b/engines/sci/sfx/music.cpp @@ -335,7 +335,7 @@ void SciMusic::soundInitSnd(MusicEntry *pSnd) {  				pSnd->pMidiParser->setTimerRate(_dwTempo);  			}  			// Find out what channels to filter for SCI0 -			channelFilterMask = pSnd->soundRes->getChannelFilterMask(_pMidiDrv->getPlayMask()); +			channelFilterMask = pSnd->soundRes->getChannelFilterMask(_pMidiDrv->getPlayMask(_soundVersion));  			pSnd->pMidiParser->loadMusic(track, pSnd, channelFilterMask, _soundVersion);  		}  	} diff --git a/engines/sci/sfx/softseq/adlib.cpp b/engines/sci/sfx/softseq/adlib.cpp index e29214c915..77e1f5f370 100644 --- a/engines/sci/sfx/softseq/adlib.cpp +++ b/engines/sci/sfx/softseq/adlib.cpp @@ -162,7 +162,7 @@ class MidiPlayer_Adlib : public MidiPlayer {  public:  	MidiPlayer_Adlib() { _driver = new MidiDriver_Adlib(g_system->getMixer()); }  	int open(ResourceManager *resMan); -	int getPlayMask() const { return 0x04; } +	int getPlayMask(SciVersion soundVersion);  	int getPolyphony() const { return MidiDriver_Adlib::kVoices; }  	bool hasRhythmChannel() const { return false; }  	void setVolume(byte volume) { static_cast<MidiDriver_Adlib *>(_driver)->setVolume(volume); } @@ -811,6 +811,14 @@ int MidiPlayer_Adlib::open(ResourceManager *resMan) {  	return static_cast<MidiDriver_Adlib *>(_driver)->open(getSciVersion() <= SCI_VERSION_0_LATE);  } +int MidiPlayer_Adlib::getPlayMask(SciVersion soundVersion) { +	switch (soundVersion) { +	case SCI_VERSION_0_EARLY: +		return 0x10; // FIXME: Not correct +	} +	return 0x04; +} +  MidiPlayer *MidiPlayer_Adlib_create() {  	return new MidiPlayer_Adlib();  } diff --git a/engines/sci/sfx/softseq/amiga.cpp b/engines/sci/sfx/softseq/amiga.cpp index b1cdedaa7a..e0141153ac 100644 --- a/engines/sci/sfx/softseq/amiga.cpp +++ b/engines/sci/sfx/softseq/amiga.cpp @@ -651,7 +651,7 @@ void MidiDriver_Amiga::generateSamples(int16 *data, int len) {  class MidiPlayer_Amiga : public MidiPlayer {  public:  	MidiPlayer_Amiga() { _driver = new MidiDriver_Amiga(g_system->getMixer()); } -	int getPlayMask() const { return 0x40; } +	int getPlayMask(SciVersion soundVersion);  	int getPolyphony() const { return MidiDriver_Amiga::kVoices; }  	bool hasRhythmChannel() const { return false; }  	void setVolume(byte volume) { static_cast<MidiDriver_Amiga *>(_driver)->setVolume(volume); } @@ -663,4 +663,12 @@ MidiPlayer *MidiPlayer_Amiga_create() {  	return new MidiPlayer_Amiga();  } +int MidiPlayer_Amiga::getPlayMask(SciVersion soundVersion) { +	switch (soundVersion) { +	case SCI_VERSION_0_EARLY: +		return 0x40; // FIXME: Not correct +	} +	return 0x40; +} +  } // End of namespace Sci diff --git a/engines/sci/sfx/softseq/mididriver.h b/engines/sci/sfx/softseq/mididriver.h index cded8ab095..df0532d732 100644 --- a/engines/sci/sfx/softseq/mididriver.h +++ b/engines/sci/sfx/softseq/mididriver.h @@ -81,7 +81,7 @@ public:  	MidiChannel *getPercussionChannel() { return _driver->getPercussionChannel(); }  	void setTimerCallback(void *timer_param, Common::TimerManager::TimerProc timer_proc) { _driver->setTimerCallback(timer_param, timer_proc); } -	virtual int getPlayMask() const = 0; +	virtual int getPlayMask(SciVersion soundVersion) = 0;  	virtual int getPolyphony() const = 0;  	virtual void setVolume(byte volume) { diff --git a/engines/sci/sfx/softseq/pcjr.cpp b/engines/sci/sfx/softseq/pcjr.cpp index 1d007874fb..b9118eb678 100644 --- a/engines/sci/sfx/softseq/pcjr.cpp +++ b/engines/sci/sfx/softseq/pcjr.cpp @@ -192,4 +192,20 @@ void MidiDriver_PCJr::close() {  	_mixer->stopHandle(_mixerSoundHandle);  } +int MidiPlayer_PCJr::getPlayMask(SciVersion soundVersion) { +	switch (soundVersion) { +	case SCI_VERSION_0_EARLY: +		return 0x10; // FIXME: Not correct +	} +	return 0x10; +} + +int MidiPlayer_PCSpeaker::getPlayMask(SciVersion soundVersion) { +	switch (soundVersion) { +	case SCI_VERSION_0_EARLY: +		return 0x20; // FIXME: Not correct +	} +	return 0x20; +} +  } // End of namespace Sci diff --git a/engines/sci/sfx/softseq/pcjr.h b/engines/sci/sfx/softseq/pcjr.h index e95c690cc5..60032817fd 100644 --- a/engines/sci/sfx/softseq/pcjr.h +++ b/engines/sci/sfx/softseq/pcjr.h @@ -68,7 +68,7 @@ class MidiPlayer_PCJr : public MidiPlayer {  public:  	MidiPlayer_PCJr() { _driver = new MidiDriver_PCJr(g_system->getMixer()); }  	int open(ResourceManager *resMan) { return static_cast<MidiDriver_PCJr *>(_driver)->open(getPolyphony()); } -	int getPlayMask() const { return 0x10; } +	int getPlayMask(SciVersion soundVersion);  	int getPolyphony() const { return 3; }  	bool hasRhythmChannel() const { return false; }  	void setVolume(byte volume) { static_cast<MidiDriver_PCJr *>(_driver)->_global_volume = volume; } @@ -76,7 +76,7 @@ public:  class MidiPlayer_PCSpeaker : public MidiPlayer_PCJr {  public: -	int getPlayMask() const { return 0x20; } +	int getPlayMask(SciVersion soundVersion);  	int getPolyphony() const { return 1; }  }; | 
