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; } } |