diff options
-rw-r--r-- | dists/msvc9/scumm.vcproj | 2 | ||||
-rw-r--r-- | dists/msvc9/scummvm-tfmx.sln | 4 | ||||
-rw-r--r-- | dists/msvc9/scummvm-tfmx.vcproj | 167 | ||||
-rw-r--r-- | engines/scumm/player_v4a.cpp | 34 | ||||
-rw-r--r-- | engines/scumm/player_v4a.h | 1 | ||||
-rw-r--r-- | sound/mods/paula.cpp | 8 | ||||
-rw-r--r-- | sound/mods/tfmx.cpp | 80 | ||||
-rw-r--r-- | sound/mods/tfmx.h | 24 | ||||
-rw-r--r-- | tfmx/tfmxdebug.cpp | 1 | ||||
-rw-r--r-- | tfmx/tfmxplayer.cpp | 2 |
10 files changed, 248 insertions, 75 deletions
diff --git a/dists/msvc9/scumm.vcproj b/dists/msvc9/scumm.vcproj index 723113b253..7d6edc0c52 100644 --- a/dists/msvc9/scumm.vcproj +++ b/dists/msvc9/scumm.vcproj @@ -120,7 +120,7 @@ FavorSizeOrSpeed="2" OmitFramePointers="true" AdditionalIncludeDirectories="../../;../../engines" - PreprocessorDefinitions="WIN32;NDEBUG;ENABLE_SCUMM_7_8;ENABLE_HE;USE_ZLIB;USE_MAD;USE_VORBIS" + PreprocessorDefinitions="WIN32;NDEBUG;ENABLE_SCUMM_7_8;ENABLE_HE;USE_ZLIB" StringPooling="true" ExceptionHandling="1" RuntimeLibrary="0" diff --git a/dists/msvc9/scummvm-tfmx.sln b/dists/msvc9/scummvm-tfmx.sln index 70447a14b8..63e4ff89dd 100644 --- a/dists/msvc9/scummvm-tfmx.sln +++ b/dists/msvc9/scummvm-tfmx.sln @@ -12,6 +12,7 @@ Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug_Command|Win32 = Debug_Command|Win32 Debug|Win32 = Debug|Win32 + Release_Command|Win32 = Release_Command|Win32 Release|Win32 = Release|Win32 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution @@ -19,12 +20,15 @@ Global {8434CB15-D08F-427D-9E6D-581AE5B28440}.Debug_Command|Win32.Build.0 = Debug_Command|Win32 {8434CB15-D08F-427D-9E6D-581AE5B28440}.Debug|Win32.ActiveCfg = Debug|Win32 {8434CB15-D08F-427D-9E6D-581AE5B28440}.Debug|Win32.Build.0 = Debug|Win32 + {8434CB15-D08F-427D-9E6D-581AE5B28440}.Release_Command|Win32.ActiveCfg = Release_Command|Win32 + {8434CB15-D08F-427D-9E6D-581AE5B28440}.Release_Command|Win32.Build.0 = Release_Command|Win32 {8434CB15-D08F-427D-9E6D-581AE5B28440}.Release|Win32.ActiveCfg = Release|Win32 {8434CB15-D08F-427D-9E6D-581AE5B28440}.Release|Win32.Build.0 = Release|Win32 {B6AFD548-63D2-40CD-A652-E87095AFCBAF}.Debug_Command|Win32.ActiveCfg = Debug|Win32 {B6AFD548-63D2-40CD-A652-E87095AFCBAF}.Debug_Command|Win32.Build.0 = Debug|Win32 {B6AFD548-63D2-40CD-A652-E87095AFCBAF}.Debug|Win32.ActiveCfg = Debug|Win32 {B6AFD548-63D2-40CD-A652-E87095AFCBAF}.Debug|Win32.Build.0 = Debug|Win32 + {B6AFD548-63D2-40CD-A652-E87095AFCBAF}.Release_Command|Win32.ActiveCfg = Release|Win32 {B6AFD548-63D2-40CD-A652-E87095AFCBAF}.Release|Win32.ActiveCfg = Release|Win32 {B6AFD548-63D2-40CD-A652-E87095AFCBAF}.Release|Win32.Build.0 = Release|Win32 EndGlobalSection diff --git a/dists/msvc9/scummvm-tfmx.vcproj b/dists/msvc9/scummvm-tfmx.vcproj index 65d4d27aea..952711ed05 100644 --- a/dists/msvc9/scummvm-tfmx.vcproj +++ b/dists/msvc9/scummvm-tfmx.vcproj @@ -135,7 +135,7 @@ EnableIntrinsicFunctions="true" OmitFramePointers="true" AdditionalIncludeDirectories="../../;../../engines" - PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;ENABLE_SCUMM;USE_ZLIB;USE_MAD;USE_VORBIS" + PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;ENABLE_SCUMM;USE_ZLIB" StringPooling="true" MinimalRebuild="false" ExceptionHandling="1" @@ -160,7 +160,7 @@ /> <Tool Name="VCLinkerTool" - AdditionalDependencies="winmm.lib sdl.lib zlib.lib libmad.lib vorbisfile_static.lib vorbis_static.lib ogg_static.lib" + AdditionalDependencies="winmm.lib sdl.lib zlib.lib" OutputFile="$(OutDir)\$(ProjectName)-tfmx.exe" LinkIncremental="1" SuppressStartupBanner="true" @@ -285,6 +285,98 @@ Name="VCPostBuildEventTool" /> </Configuration> + <Configuration + Name="Release_Command|Win32" + OutputDirectory="$(SolutionDir)$(ConfigurationName)" + IntermediateDirectory="$(ConfigurationName)" + ConfigurationType="1" + CharacterSet="2" + WholeProgramOptimization="1" + > + <Tool + Name="VCPreBuildEventTool" + /> + <Tool + Name="VCCustomBuildTool" + /> + <Tool + Name="VCXMLDataGeneratorTool" + /> + <Tool + Name="VCWebServiceProxyGeneratorTool" + /> + <Tool + Name="VCMIDLTool" + /> + <Tool + Name="VCCLCompilerTool" + AdditionalOptions="/wd4201 /wd4512 /wd4511 /wd4100 /wd4121 /wd4310 /wd4706 /wd4127 /wd4189 /wd4702 /wd4996" + Optimization="2" + EnableIntrinsicFunctions="true" + OmitFramePointers="true" + AdditionalIncludeDirectories="../../;../../engines" + PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;TFMX_CMDLINE_TOOL" + StringPooling="true" + MinimalRebuild="false" + ExceptionHandling="1" + RuntimeLibrary="0" + BufferSecurityCheck="false" + EnableFunctionLevelLinking="false" + DisableLanguageExtensions="false" + ForceConformanceInForLoopScope="true" + RuntimeTypeInfo="true" + UsePrecompiledHeader="0" + WarningLevel="4" + DebugInformationFormat="0" + /> + <Tool + Name="VCManagedResourceCompilerTool" + /> + <Tool + Name="VCResourceCompilerTool" + /> + <Tool + Name="VCPreLinkEventTool" + /> + <Tool + Name="VCLinkerTool" + LinkLibraryDependencies="false" + AdditionalDependencies="winmm.lib sdl.lib" + OutputFile="$(OutDir)\$(ProjectName)-tfmx.exe" + LinkIncremental="1" + SuppressStartupBanner="true" + IgnoreDefaultLibraryNames="libc.lib" + GenerateDebugInformation="false" + SubSystem="1" + OptimizeReferences="2" + EnableCOMDATFolding="2" + EntryPointSymbol="WinMainCRTStartup" + RandomizedBaseAddress="1" + DataExecutionPrevention="0" + TargetMachine="1" + /> + <Tool + Name="VCALinkTool" + /> + <Tool + Name="VCManifestTool" + /> + <Tool + Name="VCXDCMakeTool" + /> + <Tool + Name="VCBscMakeTool" + /> + <Tool + Name="VCFxCopTool" + /> + <Tool + Name="VCAppVerifierTool" + /> + <Tool + Name="VCPostBuildEventTool" + /> + </Configuration> </Configurations> <References> </References> @@ -658,6 +750,15 @@ XMLDocumentationFileName="$(IntDir)\$(InputName)1.xdc" /> </FileConfiguration> + <FileConfiguration + Name="Release_Command|Win32" + > + <Tool + Name="VCCLCompilerTool" + ObjectFile="$(IntDir)\$(InputName)1.obj" + XMLDocumentationFileName="$(IntDir)\$(InputName)1.xdc" + /> + </FileConfiguration> </File> <File RelativePath="..\..\sound\iff.h" @@ -816,6 +917,15 @@ XMLDocumentationFileName="$(IntDir)/$(InputName)1.xdc" /> </FileConfiguration> + <FileConfiguration + Name="Release_Command|Win32" + > + <Tool + Name="VCCLCompilerTool" + ObjectFile="$(IntDir)/$(InputName)1.obj" + XMLDocumentationFileName="$(IntDir)/$(InputName)1.xdc" + /> + </FileConfiguration> </File> <File RelativePath="..\..\sound\softsynth\emumidi.h" @@ -855,6 +965,15 @@ XMLDocumentationFileName="$(IntDir)/$(InputName)1.xdc" /> </FileConfiguration> + <FileConfiguration + Name="Release_Command|Win32" + > + <Tool + Name="VCCLCompilerTool" + ObjectFile="$(IntDir)/$(InputName)1.obj" + XMLDocumentationFileName="$(IntDir)/$(InputName)1.xdc" + /> + </FileConfiguration> </File> <File RelativePath="..\..\sound\softsynth\pcspk.cpp" @@ -894,6 +1013,15 @@ XMLDocumentationFileName="$(IntDir)/$(InputName)1.xdc" /> </FileConfiguration> + <FileConfiguration + Name="Release_Command|Win32" + > + <Tool + Name="VCCLCompilerTool" + ObjectFile="$(IntDir)/$(InputName)1.obj" + XMLDocumentationFileName="$(IntDir)/$(InputName)1.xdc" + /> + </FileConfiguration> </File> <File RelativePath="..\..\sound\softsynth\ym2612.h" @@ -1058,6 +1186,14 @@ <File RelativePath="..\..\sound\mods\tfmx.cpp" > + <FileConfiguration + Name="Release|Win32" + > + <Tool + Name="VCCLCompilerTool" + AssemblerOutput="2" + /> + </FileConfiguration> </File> <File RelativePath="..\..\sound\mods\tfmx.h" @@ -1150,6 +1286,15 @@ XMLDocumentationFileName="$(IntDir)\$(InputName)1.xdc" /> </FileConfiguration> + <FileConfiguration + Name="Release_Command|Win32" + > + <Tool + Name="VCCLCompilerTool" + ObjectFile="$(IntDir)\$(InputName)1.obj" + XMLDocumentationFileName="$(IntDir)\$(InputName)1.xdc" + /> + </FileConfiguration> </File> <File RelativePath="..\..\backends\platform\sdl\sdl.cpp" @@ -1719,6 +1864,15 @@ Outputs="$(OutDir)\$(InputName).obj" /> </FileConfiguration> + <FileConfiguration + Name="Release_Command|Win32" + > + <Tool + Name="VCCustomBuildTool" + CommandLine="nasm.exe -f win32 -o "$(OutDir)\$(InputName).obj" "$(InputPath)"
" + Outputs="$(OutDir)\$(InputName).obj" + /> + </FileConfiguration> </File> <File RelativePath="..\..\graphics\scaler\hq3x.cpp" @@ -1758,6 +1912,15 @@ Outputs="$(OutDir)\$(InputName).obj" /> </FileConfiguration> + <FileConfiguration + Name="Release_Command|Win32" + > + <Tool + Name="VCCustomBuildTool" + CommandLine="nasm.exe -f win32 -o "$(OutDir)\$(InputName).obj" "$(InputPath)"
" + Outputs="$(OutDir)\$(InputName).obj" + /> + </FileConfiguration> </File> <File RelativePath="..\..\graphics\scaler\intern.h" diff --git a/engines/scumm/player_v4a.cpp b/engines/scumm/player_v4a.cpp index f44d77089e..92ae52351d 100644 --- a/engines/scumm/player_v4a.cpp +++ b/engines/scumm/player_v4a.cpp @@ -49,6 +49,7 @@ bool Player_V4A::init() { if (mdatExists && sampleExists) { Audio::Tfmx *play = new Audio::Tfmx(_mixer->getOutputRate(), true); if (play->load(fileMdat, fileSample)) { + play->setSignalPtr(_signal); _tfmxPlay = play; } else delete play; @@ -77,8 +78,10 @@ void Player_V4A::setMusicVolume(int vol) { void Player_V4A::stopAllSounds() { debug(5, "player_v4a: stopAllSounds"); - if (_tfmxPlay) + if (_tfmxPlay) { _tfmxPlay->stopSong(); + _signal[0] = 0; + } _musicId = 0; if (_tfmxSfx) _tfmxSfx->stopSong(); @@ -87,9 +90,12 @@ void Player_V4A::stopAllSounds() { void Player_V4A::stopSound(int nr) { debug(5, "player_v4a: stopSound %d", nr); + if (nr == 0) + return; if (nr == _musicId) { - _tfmxPlay->stopSong(); _musicId = 0; + _tfmxPlay->stopSong(); + _signal[0] = 0; } else { const int chan = getSfxChan(nr); if (chan != -1) { @@ -132,14 +138,14 @@ void Player_V4A::startSound(int nr) { if (_tfmxSfx->getSongIndex() < 0) _tfmxSfx->doSong(0x18); - const int chan = _tfmxSfx->doSfx(index); + const int chan = _tfmxSfx->doSfx((uint16)index); if (chan >= 0 && chan < ARRAYSIZE(_sfxSlots)) setSfxSlot(chan, nr, type); else warning("player_v4a: custom %i is not of required type", index); - if (!_mixer->isSoundHandleActive(_sfxHandle)) - _mixer->playInputStream(Audio::Mixer::kSFXSoundType, &_sfxHandle, _tfmxSfx, -1, Audio::Mixer::kMaxChannelVolume, 0, false, true); + if (!_mixer->isSoundHandleActive(_musicHandle)) + _mixer->playInputStream(Audio::Mixer::kSFXSoundType, &_musicHandle, _tfmxSfx, -1, Audio::Mixer::kMaxChannelVolume, 0, false); } else { // Song debug(3, "player_v4a: play %d: song %i - %02X", nr, index, type); @@ -147,10 +153,11 @@ void Player_V4A::startSound(int nr) { warning("player_v4a: Song has wrong type"); _tfmxPlay->doSong(index); + _signal[0] = 2; _musicId = nr; if (!_mixer->isSoundHandleActive(_musicHandle)) - _mixer->playInputStream(Audio::Mixer::kMusicSoundType, &_musicHandle, _tfmxPlay, -1, Audio::Mixer::kMaxChannelVolume, 0, false, true); + _mixer->playInputStream(Audio::Mixer::kMusicSoundType, &_musicHandle, _tfmxPlay, -1, Audio::Mixer::kMaxChannelVolume, 0, false); } } @@ -159,15 +166,20 @@ int Player_V4A::getMusicTimer() const { // TODO: The titlesong is running with ~70 ticks per second and the scale seems to be based on that. // Other songs dont and I have no clue if this scalevalue is anything close to correct for them. // The Amiga-Game doesnt counts the ticks of the song, but has an own timer and I hope thespeed is constant through the game - const int magicScale = 359; // ~ 1000 * 25 * (10173 / 709379.0) + const int magicScale = 357; // ~ 1000 * 25 * (10173 / 709379.0) return (_mixer->getSoundElapsedTime(_musicHandle)) / magicScale; - } else - return 0; + } + return 0; } int Player_V4A::getSoundStatus(int nr) const { - if (nr == _musicId && _mixer->isSoundHandleActive(_musicHandle)) - return _tfmxPlay->getSignal(0); + bool a = nr == _musicId; + bool b = _tfmxPlay->getSongIndex() >= 0; + int c = _signal[0]; + + debug(5, "player_v4a: getSoundStatus music=%d, active=%d, signal=%d", a, b, c); + if (nr == _musicId) + return _signal[0]; return 0; } diff --git a/engines/scumm/player_v4a.h b/engines/scumm/player_v4a.h index a261235867..3b454e9349 100644 --- a/engines/scumm/player_v4a.h +++ b/engines/scumm/player_v4a.h @@ -62,6 +62,7 @@ private: Audio::SoundHandle _sfxHandle; int _musicId; + uint16 _signal[4]; struct SfxChan { int id; diff --git a/sound/mods/paula.cpp b/sound/mods/paula.cpp index 9f2eb4290a..c9866e51ab 100644 --- a/sound/mods/paula.cpp +++ b/sound/mods/paula.cpp @@ -31,10 +31,10 @@ Paula::Paula(bool stereo, int rate, uint interruptFreq) : _stereo(stereo), _rate(rate), _periodScale((kPalSystemClock / 2.0) / rate), _intFreq(interruptFreq) { clearVoices(); - _voice[0].panning = 63; - _voice[1].panning = 191; - _voice[2].panning = 191; - _voice[3].panning = 63; + _voice[0].panning = 191; + _voice[1].panning = 63; + _voice[2].panning = 63; + _voice[3].panning = 191; if (_intFreq == 0) _intFreq = _rate; diff --git a/sound/mods/tfmx.cpp b/sound/mods/tfmx.cpp index 002e5e004e..d3c8774a05 100644 --- a/sound/mods/tfmx.cpp +++ b/sound/mods/tfmx.cpp @@ -44,7 +44,7 @@ const uint16 Tfmx::noteIntervalls[64] = { 214, 202, 191, 180 }; Tfmx::Tfmx(int rate, bool stereo) -: Paula(stereo, rate), _resource() { +: Paula(stereo, rate), _resource(), _playerCtx() { _playerCtx.stopWithLastPattern = false; for (int i = 0; i < kNumVoices; ++i) @@ -52,8 +52,6 @@ Tfmx::Tfmx(int rate, bool stereo) _playerCtx.song = -1; _playerCtx.volume = 0x40; - _playerCtx.fadeDelta = 0; - _playerCtx.patternCount = 0; _playerCtx.patternSkip = 6; stopPatternChannels(); stopMacroChannels(); @@ -89,10 +87,8 @@ void Tfmx::interrupt() { // externally queued macros if (channel.customMacro) { const byte *const noteCmd = (const byte *)&channel.customMacro; - const uint8 channelNo = (uint8)(&channel - _channelCtx); - channel.sfxLocked = false; - noteCommand(noteCmd[0], noteCmd[1], (noteCmd[2] & 0xF0) | channelNo, noteCmd[3]); + noteCommand(noteCmd[0], noteCmd[1], (noteCmd[2] & 0xF0) | (uint8)i, noteCmd[3]); channel.customMacro = 0; channel.sfxLocked = (channel.customMacroPrio != 0); } @@ -143,8 +139,8 @@ void Tfmx::effects(ChannelContext &channel) { channel.portaCount = channel.portaSkip; bool resetPorta = true; - uint16 period = channel.refPeriod; // d1 - uint16 portaVal = channel.portaValue; // d0 + uint16 period = channel.refPeriod; + uint16 portaVal = channel.portaValue; if (period > portaVal) { portaVal = ((uint32)portaVal * (uint16)((1 << 8) + channel.portaDelta)) >> 8; @@ -213,7 +209,7 @@ static void warnMacroUnimplemented(const byte *macroPtr, int level) { #endif } -FORCEINLINE bool Tfmx::macroStep(ChannelContext &channel) { +inline bool Tfmx::macroStep(ChannelContext &channel) { const byte *const macroPtr = (byte *)(_resource.getMacroPtr(channel.macroOffset) + channel.macroStep); ++channel.macroStep; @@ -289,8 +285,8 @@ FORCEINLINE bool Tfmx::macroStep(ChannelContext &channel) { return true; case 0x06: // Jump. Parameters: MacroIndex, MacroStep(W) - channel.macroIndex = macroPtr[1] % kMaxMacroOffsets; - channel.macroOffset = _macroOffset[macroPtr[1] % kMaxMacroOffsets]; + channel.macroIndex = macroPtr[1] & (kMaxMacroOffsets - 1); + channel.macroOffset = _macroOffset[macroPtr[1] & (kMaxMacroOffsets - 1)]; channel.macroStep = READ_BE_UINT16(¯oPtr[2]); channel.macroLoopCount = 0xFF; return true; @@ -359,7 +355,7 @@ FORCEINLINE bool Tfmx::macroStep(ChannelContext &channel) { return true; case 0x12: // AddLen. Parameters: added Length(W) - channel.sampleLen += READ_BE_UINT16(¯oPtr[2]); + channel.sampleLen += (int16)READ_BE_UINT16(¯oPtr[2]); Paula::setChannelSampleLen(channel.paulaChannel, channel.sampleLen); return true; @@ -377,7 +373,7 @@ FORCEINLINE bool Tfmx::macroStep(ChannelContext &channel) { channel.macroReturnOffset = channel.macroOffset; channel.macroReturnStep = channel.macroStep; - channel.macroOffset = _macroOffset[macroPtr[1] % kMaxMacroOffsets]; + channel.macroOffset = _macroOffset[macroPtr[1] & (kMaxMacroOffsets - 1)]; channel.macroStep = READ_BE_UINT16(¯oPtr[2]); // TODO: MI does some weird stuff there. Figure out which varioables need to be set return true; @@ -440,12 +436,12 @@ FORCEINLINE bool Tfmx::macroStep(ChannelContext &channel) { return channel.deferWait; case 0x20: // Signal. Parameters: signalnumber/value - if (macroPtr[1] < ARRAYSIZE(_playerCtx.signal)) + if (_playerCtx.signal) _playerCtx.signal[macroPtr[1]] = READ_BE_UINT16(¯oPtr[2]); return true; case 0x21: // Play macro. Parameters: macro/chan/detune - warnMacroUnimplemented(macroPtr, 0); + noteCommand(channel.note, (channel.relVol << 4) | macroPtr[1], macroPtr[2], macroPtr[3]); return true; #if defined(TFMX_NOT_IMPLEMENTED) // used by Gem`X according to the docs @@ -503,7 +499,7 @@ startPatterns: } else if (pattCmd == 0xFE) { // Stop voice in pattern.expose _patternCtx[i].command = 0xFF; - ChannelContext &channel = _channelCtx[_patternCtx[i].expose % kNumVoices]; + ChannelContext &channel = _channelCtx[_patternCtx[i].expose & (kNumVoices - 1)]; if (!channel.sfxLocked) { clearMacroProgramm(channel); Paula::disableChannel(channel.paulaChannel); @@ -528,7 +524,7 @@ static void warnPatternUnimplemented(const byte *patternPtr, int level) { } -FORCEINLINE bool Tfmx::patternStep(PatternContext &pattern, bool &pendingTrackstep) { +inline bool Tfmx::patternStep(PatternContext &pattern, bool &pendingTrackstep) { const byte *const patternPtr = (byte *)(_resource.getPatternPtr(pattern.offset) + pattern.step); ++pattern.step; @@ -538,18 +534,19 @@ FORCEINLINE bool Tfmx::patternStep(PatternContext &pattern, bool &pendingTrackst const byte pattCmd = patternPtr[0]; if (pattCmd < 0xF0) { // Playnote - const byte flags = pattCmd >> 6; // 0-1 means note, 2 means wait, 3 means portamento + bool nextStep = true; byte noteCmd = pattCmd + pattern.expose; byte param3 = patternPtr[3]; - if (flags == 2) { - // Store wait-value in context and delete it the (note)command - pattern.wait = param3; - param3 = 0; - } - if (flags != 3) + if (pattCmd < 0xC0) { // Note + if (pattCmd >= 0x80) { // Wait + pattern.wait = param3; + param3 = 0; + nextStep = false; + } noteCmd &= 0x3F; + } // else Portamento noteCommand(noteCmd, patternPtr[1], patternPtr[2], param3); - return (flags != 2); + return nextStep; } else { // Patterncommand switch (pattCmd & 0xF) { @@ -588,8 +585,8 @@ FORCEINLINE bool Tfmx::patternStep(PatternContext &pattern, bool &pendingTrackst return false; case 5: // Kup^-Set key up - if (!_channelCtx[patternPtr[2] % kNumVoices].sfxLocked) - _channelCtx[patternPtr[2] % kNumVoices].keyUp = false; + if (!_channelCtx[patternPtr[2] & (kNumVoices - 1)].sfxLocked) + _channelCtx[patternPtr[2] & (kNumVoices - 1)].keyUp = false; return true; case 6: // Vibrato @@ -618,10 +615,10 @@ FORCEINLINE bool Tfmx::patternStep(PatternContext &pattern, bool &pendingTrackst return true; case 11: { // play pattern. Parameters: patternCmd, channel, expose - PatternContext &target = _patternCtx[patternPtr[2] % kNumChannels]; + PatternContext &target = _patternCtx[patternPtr[2] & (kNumChannels - 1)]; target.command = patternPtr[1]; - target.offset = _patternOffset[patternPtr[1] % kMaxPatternOffsets]; + target.offset = _patternOffset[patternPtr[1] & (kMaxPatternOffsets - 1)]; target.expose = patternPtr[3]; target.step = 0; target.wait = 0; @@ -630,12 +627,12 @@ FORCEINLINE bool Tfmx::patternStep(PatternContext &pattern, bool &pendingTrackst return true; case 12: // Lock - _channelCtx[patternPtr[2] % kNumVoices].sfxLocked = (patternPtr[1] != 0); - _channelCtx[patternPtr[2] % kNumVoices].sfxLockTime = patternPtr[3]; + _channelCtx[patternPtr[2] & (kNumVoices - 1)].sfxLocked = (patternPtr[1] != 0); + _channelCtx[patternPtr[2] & (kNumVoices - 1)].sfxLockTime = patternPtr[3]; return true; case 13: // Cue - if (patternPtr[1] < ARRAYSIZE(_playerCtx.signal)) + if (_playerCtx.signal) _playerCtx.signal[patternPtr[1]] = READ_BE_UINT16(&patternPtr[2]); return true; @@ -719,7 +716,7 @@ bool Tfmx::trackStep() { } void Tfmx::noteCommand(const uint8 note, const uint8 param1, const uint8 param2, const uint8 param3) { - ChannelContext &channel = _channelCtx[param2 % kNumVoices]; + ChannelContext &channel = _channelCtx[param2 & (kNumVoices - 1)]; if (note == 0xFC) { // Lock channel.sfxLocked = (param1 != 0); @@ -732,8 +729,8 @@ void Tfmx::noteCommand(const uint8 note, const uint8 param1, const uint8 param2, if (note < 0xC0) { // Play Note channel.prevNote = channel.note; channel.note = note; - channel.macroIndex = param1 % kMaxMacroOffsets; - channel.macroOffset = _macroOffset[param1 % kMaxMacroOffsets]; + channel.macroIndex = param1 & (kMaxMacroOffsets - 1); + channel.macroOffset = _macroOffset[param1 & (kMaxMacroOffsets - 1)]; channel.relVol = (param2 >> 4) & 0xF; channel.fineTune = (int8)param3; @@ -893,11 +890,11 @@ void Tfmx::doMacro(int note, int macro, int relVol, int finetune, int channelNo) assert(0 <= note && note < 0xC0); Common::StackLock lock(_mutex); - channelNo %= kNumVoices; + channelNo &= (kNumVoices - 1); ChannelContext &channel = _channelCtx[channelNo]; unlockMacroChannel(channel); - noteCommand((uint8)note, (uint8)macro, (uint8)(relVol << 4) | channelNo, finetune); + noteCommand((uint8)note, (uint8)macro, (uint8)(relVol << 4) | channelNo, (uint8)finetune); startPaula(); } @@ -926,14 +923,14 @@ void Tfmx::doSong(int songPos, bool stopAudio) { _trackCtx.startInd = _trackCtx.posInd = _subsong[songPos].songstart; _trackCtx.stopInd = _subsong[songPos].songend; - const bool palFlag = (_resource.headerFlags & 2); + const bool palFlag = (_resource.headerFlags & 2) != 0; const uint16 tempo = _subsong[songPos].tempo; uint16 ciaIntervall; if (tempo >= 0x10) { ciaIntervall = (uint16)(kCiaBaseInterval / tempo); _playerCtx.patternSkip = 0; } else { - ciaIntervall = palFlag ? kPalDefaultCiaVal : kNtscDefaultCiaVal; + ciaIntervall = palFlag ? (uint16)kPalDefaultCiaVal : (uint16)kNtscDefaultCiaVal; _playerCtx.patternSkip = tempo; } setInterruptFreqUnscaled(ciaIntervall); @@ -944,7 +941,7 @@ void Tfmx::doSong(int songPos, bool stopAudio) { startPaula(); } -int Tfmx::doSfx(int sfxIndex, bool unlockChannel) { +int Tfmx::doSfx(uint16 sfxIndex, bool unlockChannel) { assert(0 <= sfxIndex && sfxIndex < 128); Common::StackLock lock(_mutex); @@ -955,8 +952,7 @@ int Tfmx::doSfx(int sfxIndex, bool unlockChannel) { const int8 patExp = (int8)sfxEntry[3]; } else { // custommacro - const byte channelNo = sfxEntry[2] % kNumVoices; - const byte index = (_playerCtx.song >= 0) ? sfxEntry[2] : sfxEntry[4]; + const byte channelNo = ((_playerCtx.song >= 0) ? sfxEntry[2] : sfxEntry[4]) & (kNumVoices - 1); const byte priority = sfxEntry[5] & 0x7F; ChannelContext &channel = _channelCtx[channelNo]; diff --git a/sound/mods/tfmx.h b/sound/mods/tfmx.h index 91ea408834..36e4151ce9 100644 --- a/sound/mods/tfmx.h +++ b/sound/mods/tfmx.h @@ -48,12 +48,12 @@ public: void interrupt(); void stopSong(bool stopAudio = true); void doSong(int songPos, bool stopAudio = false); - int doSfx(int sfxIndex, bool unlockChannel = false); + int doSfx(uint16 sfxIndex, bool unlockChannel = false); void doMacro(int note, int macro, int relVol = 0, int finetune = 0, int channelNo = 0); bool load(Common::SeekableReadStream &musicData, Common::SeekableReadStream &sampleData); - int getTicks() {return _playerCtx.tickCount;} - int getSongIndex() {return _playerCtx.song;} - uint16 getSignal(int index) {return (index < ARRAYSIZE(_playerCtx.signal)) ? _playerCtx.signal[index] : 0xFFFF;} + int getTicks() const {return _playerCtx.tickCount;} + int getSongIndex() const {return _playerCtx.song;} + void setSignalPtr(uint16 *ptr) {_playerCtx.signal = ptr;} void stopMacroEffect(int channel) { assert(0 <= channel && channel < kNumVoices); Common::StackLock lock(_mutex); @@ -84,7 +84,7 @@ public: uint32 headerUnknown; char textField[6 * 40]; - const byte *getSfxPtr(uint8 index = 0) { + const byte *getSfxPtr(uint16 index = 0) { byte *sfxPtr = (byte *)(_mdatData + _sfxTableOffset + index * 8); boundaryCheck(_mdatData, _mdatLen, sfxPtr, 8); @@ -223,11 +223,11 @@ public: int tickCount; - uint16 signal[4]; + uint16 *signal; bool stopWithLastPattern; //!< hack to automatically stop the whole player if no Pattern is running } _playerCtx; - +private: static void initMacroProgramm(ChannelContext &channel) { channel.macroStep = 0; channel.macroWait = 0; @@ -271,20 +271,18 @@ public: } } - void setNoteMacro(ChannelContext &channel, uint note, int fineTune) { + static void setNoteMacro(ChannelContext &channel, uint note, int fineTune) { const uint16 noteInt = noteIntervalls[note & 0x3F]; const uint16 finetune = (uint16)(fineTune + channel.fineTune + (1 << 8)); channel.refPeriod = ((uint32)noteInt * finetune >> 8); - if (!channel.portaDelta) { + if (!channel.portaDelta) channel.period = channel.refPeriod; - //Paula::setChannelPeriod(channel.paulaChannel, channel.period); - } } void effects(ChannelContext &channel); - FORCEINLINE bool macroStep(ChannelContext &channel); + inline bool macroStep(ChannelContext &channel); void advancePatterns(); - FORCEINLINE bool patternStep(PatternContext &pattern, bool &pendingTrackstep); + inline bool patternStep(PatternContext &pattern, bool &pendingTrackstep); bool trackStep(); void noteCommand(uint8 note, uint8 param1, uint8 param2, uint8 param3); }; diff --git a/tfmx/tfmxdebug.cpp b/tfmx/tfmxdebug.cpp index 47567f33b7..cf2595a220 100644 --- a/tfmx/tfmxdebug.cpp +++ b/tfmx/tfmxdebug.cpp @@ -79,7 +79,6 @@ const char *const trackstepFmt[] = { "Tempo tempo/ciaDiv", "Timeshare ?/? ", "Fade start/end " - "Unknown (cc) " }; void displayPatternstep(const void *const vptr) { diff --git a/tfmx/tfmxplayer.cpp b/tfmx/tfmxplayer.cpp index 4f2f0a0071..fe4ef0cf88 100644 --- a/tfmx/tfmxplayer.cpp +++ b/tfmx/tfmxplayer.cpp @@ -110,7 +110,7 @@ void tfmxmain(const int argc, const char *const argv[]) { param = atoi(argv[++i]); debug( "play Macro %02X", param); dumpMacro(*player, param); - player->doMacro(param,param); + player->doMacro(0x1B, param); hasCmd = true; } } else if (!strcmp("-s", argv[i])) { |