diff options
| -rw-r--r-- | engines/scumm/player_v4a.cpp | 5 | ||||
| -rw-r--r-- | sound/mods/tfmx.cpp | 21 | ||||
| -rw-r--r-- | sound/mods/tfmx.h | 4 | 
3 files changed, 20 insertions, 10 deletions
| diff --git a/engines/scumm/player_v4a.cpp b/engines/scumm/player_v4a.cpp index 7dddffe0ad..fadb456694 100644 --- a/engines/scumm/player_v4a.cpp +++ b/engines/scumm/player_v4a.cpp @@ -82,7 +82,8 @@ void Player_V4A::stopAllSounds() {  void Player_V4A::stopSound(int nr) {  	if (nr == _musicId) { -		_mixer->stopHandle(_musicHandle); +		_tfmxPlay->stopSong(); +		//_mixer->stopHandle(_musicHandle);  		_musicId = 0;  	} else  		warning("player_v4a: stop Sound %d", nr); @@ -133,7 +134,7 @@ void Player_V4A::startSound(int nr) {  		_musicId = nr;  		if (!_mixer->isSoundHandleActive(_musicHandle)) -			_mixer->playInputStream(Audio::Mixer::kMusicSoundType, &_musicHandle, _tfmxPlay, -1, Audio::Mixer::kMaxChannelVolume, 0, false, false); +			_mixer->playInputStream(Audio::Mixer::kMusicSoundType, &_musicHandle, _tfmxPlay, -1, Audio::Mixer::kMaxChannelVolume, 0, true, false);  	}  } diff --git a/sound/mods/tfmx.cpp b/sound/mods/tfmx.cpp index 60c2833f45..da91fe43a9 100644 --- a/sound/mods/tfmx.cpp +++ b/sound/mods/tfmx.cpp @@ -890,11 +890,20 @@ void Tfmx::doMacro(int note, int macro, int relVol, int finetune, int channelNo)  	startPaula();  } -void Tfmx::doSong(int songPos) { +void Tfmx::stopSong(bool stopAudio) { +	Common::StackLock lock(_mutex); +	_playerCtx.song = -1; +	if (stopAudio) +		stopMacroChannels(); +} + +void Tfmx::doSong(int songPos, bool stopAudio) {  	assert(0 <= songPos && songPos < kNumSubsongs);  	Common::StackLock lock(_mutex); -	// bool stopCurSong = false; -	int prevSong = _playerCtx.song; + +	stopPatternChannels(); +	if (stopAudio) +		stopMacroChannels();  	_playerCtx.song = (int8)songPos; @@ -902,20 +911,18 @@ void Tfmx::doSong(int songPos) {  	_trackCtx.startInd = _trackCtx.posInd = _subsong[songPos].songstart;  	_trackCtx.stopInd = _subsong[songPos].songend; +	const bool palFlag = (_resource.headerFlags & 2);  	const uint16 tempo = _subsong[songPos].tempo;  	uint16 ciaIntervall;  	if (tempo >= 0x10) {  		ciaIntervall = (uint16)(kCiaBaseInterval / tempo);  		_playerCtx.patternSkip = 0;  	} else { -		ciaIntervall = kPalDefaultCiaVal; +		ciaIntervall = palFlag ? kPalDefaultCiaVal : kNtscDefaultCiaVal;  		_playerCtx.patternSkip = tempo;  	} -	setTimerBaseValue(kPalCiaClock);  	setInterruptFreqUnscaled(ciaIntervall); -	stopPatternChannels(); -	stopMacroChannels();  	_playerCtx.patternCount = 0;  	while (trackStep())  		; diff --git a/sound/mods/tfmx.h b/sound/mods/tfmx.h index aa89361da8..5ca6f3cbda 100644 --- a/sound/mods/tfmx.h +++ b/sound/mods/tfmx.h @@ -46,7 +46,8 @@ public:  	virtual ~Tfmx();  	void interrupt(); -	void doSong(int songPos); +	void stopSong(bool stopAudio = true); +	void doSong(int songPos, bool stopAudio = false);  	void doSfx(int sfxIndex);  	void doMacro(int note, int macro, int relVol = 0, int finetune = 0, int channelNo = 0);  	bool load(Common::SeekableReadStream &musicData, Common::SeekableReadStream &sampleData); @@ -261,6 +262,7 @@ public:  			unlockMacroChannel(_channelCtx[i]);  			clearMacroProgramm(_channelCtx[i]);  			_channelCtx[i].note = 0; +			_channelCtx[i].volume = 0;  		}  	} | 
