From: <sv...@op...> - 2024-04-21 11:52:28
|
Author: sagamusix Date: Sun Apr 21 13:52:16 2024 New Revision: 20631 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=20631 Log: [Ref] Move play state related SONG_* flags to their own flag set in m_PlayState. Modified: trunk/OpenMPT/mptrack/CleanupSong.cpp trunk/OpenMPT/mptrack/Ctrl_pat.cpp trunk/OpenMPT/mptrack/Ctrl_seq.cpp trunk/OpenMPT/mptrack/MainFrm.cpp trunk/OpenMPT/mptrack/Mod2wave.cpp trunk/OpenMPT/mptrack/ModConvert.cpp trunk/OpenMPT/mptrack/Moddoc.cpp trunk/OpenMPT/mptrack/OPLExport.cpp trunk/OpenMPT/mptrack/SampleTrimmer.cpp trunk/OpenMPT/mptrack/View_ins.cpp trunk/OpenMPT/mptrack/View_pat.cpp trunk/OpenMPT/mptrack/Vstplug.cpp trunk/OpenMPT/mptrack/mod2midi.cpp trunk/OpenMPT/soundlib/Snd_defs.h trunk/OpenMPT/soundlib/Snd_fx.cpp trunk/OpenMPT/soundlib/Sndfile.cpp trunk/OpenMPT/soundlib/Sndfile.h trunk/OpenMPT/soundlib/Sndmix.cpp trunk/OpenMPT/test/test.cpp Modified: trunk/OpenMPT/mptrack/CleanupSong.cpp ============================================================================== --- trunk/OpenMPT/mptrack/CleanupSong.cpp Sun Apr 21 12:59:02 2024 (r20630) +++ trunk/OpenMPT/mptrack/CleanupSong.cpp Sun Apr 21 13:52:16 2024 (r20631) @@ -552,7 +552,7 @@ { sndFile.ResetPlayPos(); sndFile.GetLength(eAdjust, GetLengthTarget(song.startOrder, song.startRow).StartPos(song.sequence, 0, 0)); - sndFile.m_SongFlags.reset(SONG_PLAY_FLAGS); + sndFile.m_PlayState.m_flags.reset(); while(!m_abort) { auto tickSamples = sndFile.ReadOneTick(); Modified: trunk/OpenMPT/mptrack/Ctrl_pat.cpp ============================================================================== --- trunk/OpenMPT/mptrack/Ctrl_pat.cpp Sun Apr 21 12:59:02 2024 (r20630) +++ trunk/OpenMPT/mptrack/Ctrl_pat.cpp Sun Apr 21 13:52:16 2024 (r20631) @@ -440,7 +440,7 @@ case CTRLMSG_SETVIEWWND: { SendViewMessage(VIEWMSG_FOLLOWSONG, IsDlgButtonChecked(IDC_PATTERN_FOLLOWSONG)); - SendViewMessage(VIEWMSG_PATTERNLOOP, (m_sndFile.m_SongFlags & SONG_PATTERNLOOP) ? TRUE : FALSE); + SendViewMessage(VIEWMSG_PATTERNLOOP, (m_sndFile.m_PlayState.m_flags[SONG_PATTERNLOOP]) ? TRUE : FALSE); OnSpacingChanged(); SendViewMessage(VIEWMSG_SETDETAIL, m_nDetailLevel); SendViewMessage(VIEWMSG_SETRECORD, m_bRecord); @@ -493,13 +493,13 @@ if (lParam == -1) { //Toggle loop state - setLoop = !m_sndFile.m_SongFlags[SONG_PATTERNLOOP]; + setLoop = !m_sndFile.m_PlayState.m_flags[SONG_PATTERNLOOP]; } else { setLoop = (lParam != 0); } - m_sndFile.m_SongFlags.set(SONG_PATTERNLOOP, setLoop); + m_sndFile.m_PlayState.m_flags.set(SONG_PATTERNLOOP, setLoop); CheckDlgButton(IDC_PATTERN_LOOP, setLoop ? BST_CHECKED : BST_UNCHECKED); break; } Modified: trunk/OpenMPT/mptrack/Ctrl_seq.cpp ============================================================================== --- trunk/OpenMPT/mptrack/Ctrl_seq.cpp Sun Apr 21 12:59:02 2024 (r20630) +++ trunk/OpenMPT/mptrack/Ctrl_seq.cpp Sun Apr 21 13:52:16 2024 (r20631) @@ -385,23 +385,23 @@ const bool isPlaying = IsPlaying(); bool changedPos = false; - if(isPlaying && sndFile.m_SongFlags[SONG_PATTERNLOOP]) + if(isPlaying && sndFile.m_PlayState.m_flags[SONG_PATTERNLOOP]) { pMainFrm->ResetNotificationBuffer(); // Update channel parameters and play time CriticalSection cs; - m_modDoc.SetElapsedTime(m_nScrollPos, 0, !sndFile.m_SongFlags[SONG_PAUSED | SONG_STEP]); + m_modDoc.SetElapsedTime(m_nScrollPos, 0, !sndFile.m_PlayState.m_flags[SONG_PAUSED | SONG_STEP]); changedPos = true; } else if(m_pParent.GetFollowSong()) { - FlagSet<SongFlags> pausedFlags = sndFile.m_SongFlags & (SONG_PAUSED | SONG_STEP | SONG_PATTERNLOOP); + FlagSet<PlayFlags> pausedFlags = sndFile.m_PlayState.m_flags & (SONG_PAUSED | SONG_STEP | SONG_PATTERNLOOP); // Update channel parameters and play time CriticalSection cs; sndFile.SetCurrentOrder(m_nScrollPos); - m_modDoc.SetElapsedTime(m_nScrollPos, 0, !sndFile.m_SongFlags[SONG_PAUSED | SONG_STEP]); - sndFile.m_SongFlags.set(pausedFlags); + m_modDoc.SetElapsedTime(m_nScrollPos, 0, !sndFile.m_PlayState.m_flags[SONG_PAUSED | SONG_STEP]); + sndFile.m_PlayState.m_flags.set(pausedFlags); if(isPlaying) pMainFrm->ResetNotificationBuffer(); Modified: trunk/OpenMPT/mptrack/MainFrm.cpp ============================================================================== --- trunk/OpenMPT/mptrack/MainFrm.cpp Sun Apr 21 12:59:02 2024 (r20630) +++ trunk/OpenMPT/mptrack/MainFrm.cpp Sun Apr 21 13:52:16 2024 (r20631) @@ -1037,7 +1037,7 @@ m_pSndFile->ResetMixStat(); - if(m_pSndFile->m_SongFlags[SONG_ENDREACHED]) notification.type.set(Notification::EOS); + if(m_pSndFile->m_PlayState.m_flags[SONG_ENDREACHED]) notification.type.set(Notification::EOS); if(notifyType[Notification::Sample]) { @@ -1048,7 +1048,7 @@ for(CHANNELINDEX k = 0; k < MAX_CHANNELS; k++) { const ModChannel &chn = m_pSndFile->m_PlayState.Chn[k]; - if(chn.pModSample == &m_pSndFile->GetSample(smp) && chn.nLength != 0 // Corrent sample is set up on this channel + if(chn.pModSample == &m_pSndFile->GetSample(smp) && chn.nLength != 0 // Correct sample is set up on this channel && (!chn.dwFlags[CHN_NOTEFADE] || chn.nFadeOutVol)) // And it hasn't completely faded out yet, so it's still playing { notification.pos[k] = chn.position.GetInt(); @@ -1359,7 +1359,7 @@ { m_wndTree.UpdatePlayPos(m_pSndFile->GetpModDoc(), nullptr); } - m_pSndFile->m_SongFlags.reset(SONG_PAUSED); + m_pSndFile->m_PlayState.m_flags.reset(SONG_PAUSED); if(m_pSndFile == &m_WaveFile) { // Unload previewed instrument @@ -1412,11 +1412,11 @@ SetPlaybackSoundFile(&sndFile); const bool bPaused = m_pSndFile->IsPaused(); - const bool bPatLoop = m_pSndFile->m_SongFlags[SONG_PATTERNLOOP]; + const bool bPatLoop = m_pSndFile->m_PlayState.m_flags[SONG_PATTERNLOOP]; - m_pSndFile->m_SongFlags.reset(SONG_FADINGSONG | SONG_ENDREACHED); + m_pSndFile->m_PlayState.m_flags.reset(SONG_FADINGSONG | SONG_ENDREACHED); - if(!bPatLoop && bPaused) sndFile.m_SongFlags.set(SONG_PAUSED); + if(!bPatLoop && bPaused) sndFile.m_PlayState.m_flags.set(SONG_PAUSED); sndFile.SetRepeatCount((TrackerSettings::Instance().gbLoopSong) ? -1 : 0); sndFile.InitPlayer(true); @@ -1582,7 +1582,7 @@ if(file.IsValid()) { InitPreview(); - m_WaveFile.m_SongFlags.set(SONG_PAUSED); + m_WaveFile.m_PlayState.m_flags.set(SONG_PAUSED); // Avoid hanging audio while reading file - we have removed all sample and instrument references before, // so it's safe to replace the sample / instrument now. cs.Leave(); @@ -1690,7 +1690,7 @@ } return; } - m_WaveFile.m_SongFlags.reset(SONG_PAUSED); + m_WaveFile.m_PlayState.m_flags.reset(SONG_PAUSED); m_WaveFile.SetRepeatCount(-1); m_WaveFile.ResetPlayPos(); @@ -2587,7 +2587,7 @@ { case kcPrevOrder: case kcNextOrder: - m_pSndFile->GetpModDoc()->SetElapsedTime(order, 0, !m_pSndFile->m_SongFlags[SONG_PAUSED | SONG_STEP]); + m_pSndFile->GetpModDoc()->SetElapsedTime(order, 0, !m_pSndFile->m_PlayState.m_flags[SONG_PAUSED | SONG_STEP]); break; case kcPrevOrderAtMeasureEnd: case kcNextOrderAtMeasureEnd: @@ -3165,7 +3165,7 @@ void CMainFrame::NotifyAccessibilityUpdate(CWnd &source) { - if(!IsPlaying() || m_pSndFile->m_SongFlags[SONG_PAUSED]) + if(!IsPlaying() || m_pSndFile->m_PlayState.m_flags[SONG_PAUSED]) source.NotifyWinEvent(EVENT_OBJECT_NAMECHANGE, OBJID_CLIENT, CHILDID_SELF); } Modified: trunk/OpenMPT/mptrack/Mod2wave.cpp ============================================================================== --- trunk/OpenMPT/mptrack/Mod2wave.cpp Sun Apr 21 12:59:02 2024 (r20630) +++ trunk/OpenMPT/mptrack/Mod2wave.cpp Sun Apr 21 13:52:16 2024 (r20631) @@ -978,7 +978,7 @@ mixersettings.m_nMaxMixChannels = MAX_CHANNELS; // always use max mixing channels when rendering mixersettings.gdwMixingFreq = samplerate; mixersettings.gnChannels = channels; - m_SndFile.m_SongFlags.reset(SONG_PAUSED | SONG_STEP); + m_SndFile.m_PlayState.m_flags.reset(SONG_PAUSED | SONG_STEP); if(m_Settings.normalize) { #ifndef NO_AGC @@ -1062,7 +1062,7 @@ // Reset song position tracking m_SndFile.ResetPlayPos(); - m_SndFile.m_SongFlags.reset(SONG_PATTERNLOOP); + m_SndFile.m_PlayState.m_flags.reset(SONG_PATTERNLOOP); ORDERINDEX startOrder = 0; GetLengthTarget target; if(m_Settings.minOrder != ORDERINDEX_INVALID && m_Settings.maxOrder != ORDERINDEX_INVALID) @@ -1110,7 +1110,7 @@ auto mainFrame = CMainFrame::GetMainFrame(); mainFrame->PauseMod(); - m_SndFile.m_SongFlags.reset(SONG_STEP | SONG_PATTERNLOOP); + m_SndFile.m_PlayState.m_flags.reset(SONG_STEP | SONG_PATTERNLOOP); mainFrame->InitRenderer(&m_SndFile); while(true) Modified: trunk/OpenMPT/mptrack/ModConvert.cpp ============================================================================== --- trunk/OpenMPT/mptrack/ModConvert.cpp Sun Apr 21 12:59:02 2024 (r20630) +++ trunk/OpenMPT/mptrack/ModConvert.cpp Sun Apr 21 13:52:16 2024 (r20631) @@ -566,7 +566,7 @@ m_SndFile.m_SongFlags.set(SONG_ISAMIGA); m_SndFile.InitAmigaResampler(); } - m_SndFile.m_SongFlags &= (specs.songFlags | SONG_PLAY_FLAGS); + m_SndFile.m_SongFlags &= specs.songFlags; // Adjust mix levels if(newTypeIsMOD || newTypeIsS3M) Modified: trunk/OpenMPT/mptrack/Moddoc.cpp ============================================================================== --- trunk/OpenMPT/mptrack/Moddoc.cpp Sun Apr 21 12:59:02 2024 (r20630) +++ trunk/OpenMPT/mptrack/Moddoc.cpp Sun Apr 21 13:52:16 2024 (r20631) @@ -1036,7 +1036,7 @@ // All notes off when resuming paused playback m_SndFile.ResetChannels(); - m_SndFile.m_SongFlags.set(SONG_PAUSED); + m_SndFile.m_PlayState.m_flags.set(SONG_PAUSED); pMainFrm->PlayMod(this); } @@ -2131,7 +2131,7 @@ } const bool isPlaying = (pMainFrm->GetModPlaying() == this); - if(isPlaying && !m_SndFile.m_SongFlags[SONG_PAUSED | SONG_STEP]) + if(isPlaying && !m_SndFile.m_PlayState.m_flags[SONG_PAUSED | SONG_STEP]) { OnPlayerPause(); return; @@ -2146,7 +2146,7 @@ if (!isPlaying) m_SndFile.m_PlayState.Chn[i].nLength = 0; } - m_SndFile.m_PlayState.m_bPositionChanged = true; + m_SndFile.m_PlayState.m_flags.set(SONG_POSITIONCHANGED); if(isPlaying) { @@ -2155,7 +2155,7 @@ cs.Leave(); - m_SndFile.m_SongFlags.reset(SONG_STEP | SONG_PAUSED | SONG_PATTERNLOOP); + m_SndFile.m_PlayState.m_flags.reset(SONG_STEP | SONG_PAUSED | SONG_PATTERNLOOP); pMainFrm->PlayMod(this); } } @@ -2168,7 +2168,7 @@ { if (pMainFrm->GetModPlaying() == this) { - bool isLooping = m_SndFile.m_SongFlags[SONG_PATTERNLOOP]; + bool isLooping = m_SndFile.m_PlayState.m_flags[SONG_PATTERNLOOP]; PATTERNINDEX nPat = m_SndFile.m_PlayState.m_nPattern; ROWINDEX nRow = m_SndFile.m_PlayState.m_nRow; ROWINDEX nNextRow = m_SndFile.m_PlayState.m_nNextRow; @@ -2228,11 +2228,11 @@ pMainFrm->PauseMod(); CriticalSection cs; - m_SndFile.m_SongFlags.reset(SONG_STEP | SONG_PATTERNLOOP); + m_SndFile.m_PlayState.m_flags.reset(SONG_STEP | SONG_PATTERNLOOP); m_SndFile.ResetPlayPos(); //m_SndFile.visitedSongRows.Initialize(true); - m_SndFile.m_PlayState.m_bPositionChanged = true; + m_SndFile.m_PlayState.m_flags.set(SONG_POSITIONCHANGED); cs.Leave(); @@ -2537,7 +2537,7 @@ chn.dwFlags.set(CHN_NOTEFADE | CHN_KEYOFF); } if ((nOrd < m_SndFile.Order().size()) && (m_SndFile.Order()[nOrd] == nPat)) m_SndFile.m_PlayState.m_nCurrentOrder = m_SndFile.m_PlayState.m_nNextOrder = nOrd; - m_SndFile.m_SongFlags.reset(SONG_PAUSED | SONG_STEP); + m_SndFile.m_PlayState.m_flags.reset(SONG_PAUSED | SONG_STEP); if(loop) m_SndFile.LoopPattern(nPat); else @@ -2590,7 +2590,7 @@ m_SndFile.m_PlayState.Chn[i].dwFlags.set(CHN_NOTEFADE | CHN_KEYOFF); } if ((nOrd < m_SndFile.Order().size()) && (m_SndFile.Order()[nOrd] == nPat)) m_SndFile.m_PlayState.m_nCurrentOrder = m_SndFile.m_PlayState.m_nNextOrder = nOrd; - m_SndFile.m_SongFlags.reset(SONG_PAUSED | SONG_STEP); + m_SndFile.m_PlayState.m_flags.reset(SONG_PAUSED | SONG_STEP); m_SndFile.LoopPattern(nPat); // set playback timer in the status bar (and update channel status) @@ -2639,7 +2639,7 @@ { m_SndFile.m_PlayState.Chn[i].dwFlags.set(CHN_NOTEFADE | CHN_KEYOFF); } - m_SndFile.m_SongFlags.reset(SONG_PAUSED | SONG_STEP); + m_SndFile.m_PlayState.m_flags.reset(SONG_PAUSED | SONG_STEP); m_SndFile.SetCurrentOrder(nOrd); if(nOrd < m_SndFile.Order().size() && m_SndFile.Order()[nOrd] == nPat) m_SndFile.DontLoopPattern(nPat, nRow); @@ -2737,7 +2737,7 @@ case kcPlayPatternFromCursor: OnPatternPlay(); break; case kcPlayPatternFromStart: OnPatternRestart(); break; case kcPlaySongFromCursorPause: - if(CMainFrame::GetMainFrame()->GetModPlaying() == this && !m_SndFile.m_SongFlags[SONG_PAUSED | SONG_STEP]) + if(CMainFrame::GetMainFrame()->GetModPlaying() == this && !m_SndFile.m_PlayState.m_flags[SONG_PAUSED | SONG_STEP]) { OnPlayerPause(); break; @@ -2746,7 +2746,7 @@ case kcPlaySongFromCursor: OnPatternPlayNoLoop(); break; case kcPlaySongFromStart: OnPlayerPlayFromStart(); break; case kcPlayStopSong: - if(CMainFrame::GetMainFrame()->GetModPlaying() == this && !m_SndFile.m_SongFlags[SONG_PAUSED | SONG_STEP]) + if(CMainFrame::GetMainFrame()->GetModPlaying() == this && !m_SndFile.m_PlayState.m_flags[SONG_PAUSED | SONG_STEP]) { OnPlayerStop(); break; @@ -2754,7 +2754,7 @@ [[fallthrough]]; case kcPlayPauseSong: OnPlayerPlay(); break; case kcPlaySongFromPatternPause: - if(CMainFrame::GetMainFrame()->GetModPlaying() == this && !m_SndFile.m_SongFlags[SONG_PAUSED | SONG_STEP]) + if(CMainFrame::GetMainFrame()->GetModPlaying() == this && !m_SndFile.m_PlayState.m_flags[SONG_PAUSED | SONG_STEP]) { OnPlayerPause(); break; Modified: trunk/OpenMPT/mptrack/OPLExport.cpp ============================================================================== --- trunk/OpenMPT/mptrack/OPLExport.cpp Sun Apr 21 12:59:02 2024 (r20630) +++ trunk/OpenMPT/mptrack/OPLExport.cpp Sun Apr 21 13:52:16 2024 (r20631) @@ -535,7 +535,7 @@ m_sndFile.ResetPlayPos(); m_sndFile.GetLength(eAdjust, GetLengthTarget(song.startOrder, song.startRow).StartPos(song.sequence, 0, 0)); - m_sndFile.m_SongFlags.reset(SONG_PLAY_FLAGS); + m_sndFile.m_PlayState.m_flags.reset(); m_oplLogger.Reset(); m_sndFile.m_opl = std::make_unique<OPL>(m_oplLogger); @@ -571,7 +571,7 @@ } } - if(m_sndFile.m_SongFlags[SONG_BREAKTOROW] && loopStart == Util::MaxValueOfType(loopStart) && song.loopStartOrder == song.startOrder && song.loopStartRow == song.startRow) + if(m_sndFile.m_PlayState.m_flags[SONG_BREAKTOROW] && loopStart == Util::MaxValueOfType(loopStart) && song.loopStartOrder == song.startOrder && song.loopStartRow == song.startRow) loopStart = 0; mpt::PathString currentFileName = fileName; Modified: trunk/OpenMPT/mptrack/SampleTrimmer.cpp ============================================================================== --- trunk/OpenMPT/mptrack/SampleTrimmer.cpp Sun Apr 21 12:59:02 2024 (r20630) +++ trunk/OpenMPT/mptrack/SampleTrimmer.cpp Sun Apr 21 13:52:16 2024 (r20631) @@ -75,7 +75,7 @@ const auto &song = subSongs[i]; m_SndFile.ResetPlayPos(); m_SndFile.GetLength(eAdjust, GetLengthTarget(song.startOrder, song.startRow).StartPos(song.sequence, 0, 0)); - m_SndFile.m_SongFlags.reset(SONG_PLAY_FLAGS); + m_SndFile.m_PlayState.m_flags.reset(); size_t subsongSamples = 0; DummyAudioTarget target; Modified: trunk/OpenMPT/mptrack/View_ins.cpp ============================================================================== --- trunk/OpenMPT/mptrack/View_ins.cpp Sun Apr 21 12:59:02 2024 (r20630) +++ trunk/OpenMPT/mptrack/View_ins.cpp Sun Apr 21 13:52:16 2024 (r20631) @@ -2024,7 +2024,7 @@ { if(pMainFrm->GetModPlaying() != pModDoc) { - sndFile.m_SongFlags.set(SONG_PAUSED); + sndFile.m_PlayState.m_flags.set(SONG_PAUSED); sndFile.ResetChannels(); if(!pMainFrm->PlayMod(pModDoc)) return; Modified: trunk/OpenMPT/mptrack/View_pat.cpp ============================================================================== --- trunk/OpenMPT/mptrack/View_pat.cpp Sun Apr 21 12:59:02 2024 (r20630) +++ trunk/OpenMPT/mptrack/View_pat.cpp Sun Apr 21 13:52:16 2024 (r20631) @@ -2240,8 +2240,8 @@ } sndFile.LoopPattern(m_nPattern); sndFile.m_PlayState.m_nNextRow = row == ROWINDEX_INVALID ? GetCurrentRow() : row; - sndFile.m_SongFlags.reset(SONG_PAUSED); - sndFile.m_SongFlags.set(SONG_STEP); + sndFile.m_PlayState.m_flags.reset(SONG_PAUSED); + sndFile.m_PlayState.m_flags.set(SONG_STEP); SetPlayCursor(m_nPattern, sndFile.m_PlayState.m_nNextRow, 0); cs.Leave(); @@ -3558,7 +3558,7 @@ } m_nLastPlayedRow = row; - if(!pSndFile->m_SongFlags[SONG_PAUSED | SONG_STEP]) + if(!pSndFile->m_PlayState.m_flags[SONG_PAUSED | SONG_STEP]) { const auto &order = Order(); if(ord >= order.GetLength() || order[ord] != pat) @@ -5436,7 +5436,7 @@ } const bool liveRecord = IsLiveRecord(); - const bool usePlaybackPosition = (liveRecord && (TrackerSettings::Instance().m_dwPatternSetup & PATTERN_AUTODELAY) && !sndFile.m_SongFlags[SONG_STEP]); + const bool usePlaybackPosition = (liveRecord && (TrackerSettings::Instance().m_dwPatternSetup & PATTERN_AUTODELAY) && !sndFile.m_PlayState.m_flags[SONG_STEP]); const bool isSpecial = note >= NOTE_MIN_SPECIAL; const bool isSplit = IsNoteSplit(note); @@ -6122,7 +6122,7 @@ if(!sndFile->Patterns[pat].IsValidRow(row)) { // Quantization exceeds current pattern, try stuffing note into next pattern instead. - PATTERNINDEX nextPat = sndFile->m_SongFlags[SONG_PATTERNLOOP] ? m_nPattern : GetNextPattern(); + PATTERNINDEX nextPat = sndFile->m_PlayState.m_flags[SONG_PATTERNLOOP] ? m_nPattern : GetNextPattern(); if(nextPat != PATTERNINDEX_INVALID) { pat = nextPat; Modified: trunk/OpenMPT/mptrack/Vstplug.cpp ============================================================================== --- trunk/OpenMPT/mptrack/Vstplug.cpp Sun Apr 21 12:59:02 2024 (r20630) +++ trunk/OpenMPT/mptrack/Vstplug.cpp Sun Apr 21 13:52:16 2024 (r20631) @@ -321,7 +321,7 @@ if(pVstPlugin->IsSongPlaying()) { timeInfo.flags |= kVstTransportPlaying; - if(pVstPlugin->GetSoundFile().m_SongFlags[SONG_PATTERNLOOP]) timeInfo.flags |= kVstTransportCycleActive; + if(pVstPlugin->GetSoundFile().m_PlayState.m_flags[SONG_PATTERNLOOP]) timeInfo.flags |= kVstTransportCycleActive; timeInfo.samplePos = sndFile.GetTotalSampleCount(); if(pVstPlugin->m_positionChanged) { Modified: trunk/OpenMPT/mptrack/mod2midi.cpp ============================================================================== --- trunk/OpenMPT/mptrack/mod2midi.cpp Sun Apr 21 12:59:02 2024 (r20630) +++ trunk/OpenMPT/mptrack/mod2midi.cpp Sun Apr 21 13:52:16 2024 (r20631) @@ -857,7 +857,7 @@ m_sndFile.SetCurrentOrder(0); m_sndFile.GetLength(eAdjust, GetLengthTarget(0, 0)); - m_sndFile.m_SongFlags.reset(SONG_PATTERNLOOP); + m_sndFile.m_PlayState.m_flags.reset(SONG_PATTERNLOOP); int oldRepCount = m_sndFile.GetRepeatCount(); m_sndFile.SetRepeatCount(0); m_sndFile.m_bIsRendering = true; Modified: trunk/OpenMPT/soundlib/Snd_defs.h ============================================================================== --- trunk/OpenMPT/soundlib/Snd_defs.h Sun Apr 21 12:59:02 2024 (r20630) +++ trunk/OpenMPT/soundlib/Snd_defs.h Sun Apr 21 13:52:16 2024 (r20631) @@ -242,36 +242,41 @@ }; +enum PlayFlags : uint16 +{ + SONG_PATTERNLOOP = 0x01, // Loop current pattern (pattern editor) + SONG_STEP = 0x02, // Song is in "step" mode (pattern editor) + SONG_PAUSED = 0x04, // Song is paused (no tick processing, just rendering audio) + SONG_FADINGSONG = 0x08, // Song is fading out + SONG_ENDREACHED = 0x10, // Song is finished + SONG_FIRSTTICK = 0x20, // Is set when the current tick is the first tick of the row + SONG_MPTFILTERMODE = 0x40, // Local filter mode (reset filter on each note) + SONG_SURROUNDPAN = 0x80, // Pan in the rear channels + SONG_POSJUMP = 0x100, // Position jump encountered (internal flag, do not touch) + SONG_BREAKTOROW = 0x200, // Break to row command encountered (internal flag, do not touch) + SONG_POSITIONCHANGED = 0x400, // Report to plugins that we jumped around in the module +}; +DECLARE_FLAGSET(PlayFlags) + + // Module flags - contains both song configuration and playback state... Use SONG_FILE_FLAGS and SONG_PLAY_FLAGS distinguish between the two. enum SongFlags { - SONG_FASTPORTAS = 0x01, // Portamentos are executed on every tick - SONG_FASTVOLSLIDES = 0x02, // Old Scream Tracker 3.0 volume slides (executed on every tick) - SONG_ITOLDEFFECTS = 0x04, // Old Impulse Tracker effect implementations - SONG_ITCOMPATGXX = 0x08, // IT "Compatible Gxx" (IT's flag to behave more like other trackers w/r/t portamento effects) - SONG_LINEARSLIDES = 0x10, // Linear slides vs. Amiga slides - SONG_PATTERNLOOP = 0x20, // Loop current pattern (pattern editor) - SONG_STEP = 0x40, // Song is in "step" mode (pattern editor) - SONG_PAUSED = 0x80, // Song is paused (no tick processing, just rendering audio) - SONG_FADINGSONG = 0x0100, // Song is fading out - SONG_ENDREACHED = 0x0200, // Song is finished - SONG_FIRSTTICK = 0x1000, // Is set when the current tick is the first tick of the row - SONG_MPTFILTERMODE = 0x2000, // Local filter mode (reset filter on each note) - SONG_SURROUNDPAN = 0x4000, // Pan in the rear channels - SONG_EXFILTERRANGE = 0x8000, // Cutoff Filter has double frequency range (up to ~10Khz) - SONG_AMIGALIMITS = 0x1'0000, // Enforce amiga frequency limits - SONG_S3MOLDVIBRATO = 0x2'0000, // ScreamTracker 2 vibrato in S3M files - SONG_BREAKTOROW = 0x8'0000, // Break to row command encountered (internal flag, do not touch) - SONG_POSJUMP = 0x10'0000, // Position jump encountered (internal flag, do not touch) - SONG_PT_MODE = 0x20'0000, // ProTracker 1/2 playback mode - SONG_PLAYALLSONGS = 0x40'0000, // Play all subsongs consecutively (libopenmpt) - SONG_ISAMIGA = 0x80'0000, // Is an Amiga module and thus qualifies to be played using the Paula BLEP resampler - SONG_IMPORTED = 0x100'0000, // Song type does not represent actual module format / was imported from a different format (OpenMPT) + SONG_FASTPORTAS = 0x01, // Portamentos are executed on every tick + SONG_FASTVOLSLIDES = 0x02, // Old Scream Tracker 3.0 volume slides (executed on every tick) + SONG_ITOLDEFFECTS = 0x04, // Old Impulse Tracker effect implementations + SONG_ITCOMPATGXX = 0x08, // IT "Compatible Gxx" (IT's flag to behave more like other trackers w/r/t portamento effects) + SONG_LINEARSLIDES = 0x10, // Linear slides vs. Amiga slides + SONG_EXFILTERRANGE = 0x20, // Cutoff Filter has double frequency range (up to ~10Khz) + SONG_AMIGALIMITS = 0x40, // Enforce amiga frequency limits + SONG_S3MOLDVIBRATO = 0x80, // ScreamTracker 2 vibrato in S3M files + SONG_PT_MODE = 0x100, // ProTracker 1/2 playback mode + SONG_ISAMIGA = 0x200, // Is an Amiga module and thus qualifies to be played using the Paula BLEP resampler + SONG_IMPORTED = 0x400, // Song type does not represent actual module format / was imported from a different format (OpenMPT) + SONG_PLAYALLSONGS = 0x800, // Play all subsongs consecutively (libopenmpt) }; DECLARE_FLAGSET(SongFlags) -#define SONG_FILE_FLAGS (SONG_FASTPORTAS|SONG_FASTVOLSLIDES|SONG_ITOLDEFFECTS|SONG_ITCOMPATGXX|SONG_LINEARSLIDES|SONG_EXFILTERRANGE|SONG_AMIGALIMITS|SONG_S3MOLDVIBRATO|SONG_PT_MODE|SONG_ISAMIGA|SONG_IMPORTED) -#define SONG_PLAY_FLAGS (~SONG_FILE_FLAGS) // Global Options (Renderer) #ifndef NO_AGC Modified: trunk/OpenMPT/soundlib/Snd_fx.cpp ============================================================================== --- trunk/OpenMPT/soundlib/Snd_fx.cpp Sun Apr 21 12:59:02 2024 (r20630) +++ trunk/OpenMPT/soundlib/Snd_fx.cpp Sun Apr 21 13:52:16 2024 (r20631) @@ -1282,7 +1282,7 @@ m_PlayState.m_nNextRow = m_PlayState.m_nRow; m_PlayState.m_nFrameDelay = m_PlayState.m_nPatternDelay = 0; m_PlayState.m_nTickCount = TICKS_ROW_FINISHED; - m_PlayState.m_bPositionChanged = true; + m_PlayState.m_flags.set(SONG_POSITIONCHANGED); if(m_opl != nullptr) m_opl->Reset(); for(CHANNELINDEX n = 0; n < GetNumChannels(); n++) @@ -2108,7 +2108,7 @@ chn.SetInstrumentPan(newPan, *this); // IT compatibility: Sample and instrument panning overrides channel surround status. // Test case: SmpInsPanSurround.it - if(m_playBehaviour[kPanOverride] && !m_SongFlags[SONG_SURROUNDPAN]) + if(m_playBehaviour[kPanOverride] && !m_PlayState.m_flags[SONG_SURROUNDPAN]) { chn.dwFlags.reset(CHN_SURROUND); } @@ -2460,7 +2460,7 @@ bool bPorta = chn.rowCommand.IsPortamento(); uint32 nStartTick = 0; - chn.isFirstTick = m_SongFlags[SONG_FIRSTTICK]; + chn.isFirstTick = m_PlayState.m_flags[SONG_FIRSTTICK]; // Process parameter control note. if(chn.rowCommand.note == NOTE_PC) @@ -2484,7 +2484,7 @@ if(chn.rowCommand.note == NOTE_PCS || (cmd == CMD_NONE && chn.m_plugParamValueStep != 0)) { #ifndef NO_PLUGINS - const bool isFirstTick = m_SongFlags[SONG_FIRSTTICK]; + const bool isFirstTick = m_PlayState.m_flags[SONG_FIRSTTICK]; if(isFirstTick) chn.m_RowPlug = chn.rowCommand.instr; const PLUGINDEX plugin = chn.m_RowPlug; @@ -2524,7 +2524,7 @@ } // Process Invert Loop (MOD Effect, called every row if it's active) - if(!m_SongFlags[SONG_FIRSTTICK]) + if(!m_PlayState.m_flags[SONG_FIRSTTICK]) { InvertLoop(m_PlayState.Chn[nChn]); } else @@ -2568,7 +2568,7 @@ } continue; } - } else if(m_SongFlags[SONG_FIRSTTICK]) + } else if(m_PlayState.m_flags[SONG_FIRSTTICK]) { // Pattern Loop ? if((param & 0xF0) == 0xE0) @@ -2728,9 +2728,9 @@ retrigEnv = false; // FT2 Compatbility: Start fading the note for notes with no delay. Only relevant when a volume command is encountered after the note-off. // Test case: NoteOffFadeNoEnv.xm - if(m_SongFlags[SONG_FIRSTTICK] && m_playBehaviour[kFT2NoteOffFlags]) + if(m_PlayState.m_flags[SONG_FIRSTTICK] && m_playBehaviour[kFT2NoteOffFlags]) chn.dwFlags.set(CHN_NOTEFADE); - } else if(m_playBehaviour[kFT2RetrigWithNoteDelay] && !m_SongFlags[SONG_FIRSTTICK]) + } else if(m_playBehaviour[kFT2RetrigWithNoteDelay] && !m_PlayState.m_flags[SONG_FIRSTTICK]) { // FT2 Compatibility: Some special hacks for rogue note delays... (EDx with x > 0) // Apparently anything that is next to a note delay behaves totally unpredictable in FT2. Swedish tracker logic. :) @@ -3029,7 +3029,7 @@ case VOLCMD_PANSLIDELEFT: // FT2 Compatibility: Pan slide left with zero parameter causes panning to be set to full left on every non-row tick. // Test case: PanSlideZero.xm - if(!m_SongFlags[SONG_FIRSTTICK]) + if(!m_PlayState.m_flags[SONG_FIRSTTICK]) { chn.nPan = 0; } @@ -3144,14 +3144,14 @@ { // Set Volume case CMD_VOLUME: - if(m_SongFlags[SONG_FIRSTTICK]) + if(m_PlayState.m_flags[SONG_FIRSTTICK]) { chn.nVolume = (param < 64) ? param * 4 : 256; chn.dwFlags.set(CHN_FASTVOLRAMP); } break; case CMD_VOLUME8: - if(m_SongFlags[SONG_FIRSTTICK]) + if(m_PlayState.m_flags[SONG_FIRSTTICK]) { chn.nVolume = param; chn.dwFlags.set(CHN_FASTVOLRAMP); @@ -3199,7 +3199,7 @@ // Set Speed case CMD_SPEED: - if(m_SongFlags[SONG_FIRSTTICK]) + if(m_PlayState.m_flags[SONG_FIRSTTICK]) SetSpeed(m_PlayState, param); break; @@ -3208,7 +3208,7 @@ if(m_playBehaviour[kMODVBlankTiming]) { // ProTracker MODs with VBlank timing: All Fxx parameters set the tick count. - if(m_SongFlags[SONG_FIRSTTICK] && param != 0) SetSpeed(m_PlayState, param); + if(m_PlayState.m_flags[SONG_FIRSTTICK] && param != 0) SetSpeed(m_PlayState, param); break; } { @@ -3279,7 +3279,7 @@ // Tremor case CMD_TREMOR: - if(!m_SongFlags[SONG_FIRSTTICK]) + if(!m_PlayState.m_flags[SONG_FIRSTTICK]) { break; } @@ -3313,11 +3313,11 @@ case CMD_GLOBALVOLUME: // IT compatibility: Only apply global volume on first tick (and multiples) // Test case: GlobalVolFirstTick.it - if(!m_SongFlags[SONG_FIRSTTICK]) + if(!m_PlayState.m_flags[SONG_FIRSTTICK]) break; // ST3 applies global volume on tick 1 and does other weird things, but we won't emulate this for now. // if(((GetType() & MOD_TYPE_S3M) && m_nTickCount != 1) -// || (!(GetType() & MOD_TYPE_S3M) && !m_SongFlags[SONG_FIRSTTICK])) +// || (!(GetType() & MOD_TYPE_S3M) && !m_PlayState.m_flags[SONG_FIRSTTICK])) // { // break; // } @@ -3326,7 +3326,7 @@ // until the second tick of the row. Since we apply global volume on the mix buffer rather than note volumes, this // cannot be fixed for now. // Test case: GlobalVolume.xm -// if(IsCompatibleMode(TRK_FASTTRACKER2) && m_SongFlags[SONG_FIRSTTICK] && m_nMusicSpeed > 1) +// if(IsCompatibleMode(TRK_FASTTRACKER2) && m_PlayState.m_flags[SONG_FIRSTTICK] && m_nMusicSpeed > 1) // { // break; // } @@ -3355,7 +3355,7 @@ // Set 8-bit Panning case CMD_PANNING8: - if(m_SongFlags[SONG_FIRSTTICK]) + if(m_PlayState.m_flags[SONG_FIRSTTICK]) { Panning(chn, param, Pan8bit); } @@ -3412,7 +3412,7 @@ // This is how it's NOT supposed to sound... else { - if(m_SongFlags[SONG_FIRSTTICK]) + if(m_PlayState.m_flags[SONG_FIRSTTICK]) KeyOff(chn); } break; @@ -3444,13 +3444,13 @@ case CMD_FINETUNE: case CMD_FINETUNE_SMOOTH: - if(m_SongFlags[SONG_FIRSTTICK] || cmd == CMD_FINETUNE_SMOOTH) + if(m_PlayState.m_flags[SONG_FIRSTTICK] || cmd == CMD_FINETUNE_SMOOTH) SetFinetune(m_PlayState.m_nPattern, m_PlayState.m_nRow, nChn, m_PlayState, cmd == CMD_FINETUNE_SMOOTH); break; // Set Channel Global Volume case CMD_CHANNELVOLUME: - if(!m_SongFlags[SONG_FIRSTTICK]) break; + if(!m_PlayState.m_flags[SONG_FIRSTTICK]) break; if (param <= 64) { chn.nGlobalVol = param; @@ -3470,7 +3470,7 @@ // Set Envelope Position case CMD_SETENVPOSITION: - if(m_SongFlags[SONG_FIRSTTICK]) + if(m_PlayState.m_flags[SONG_FIRSTTICK]) { chn.VolEnv.nEnvPosition = param; @@ -3505,7 +3505,7 @@ if(ROWINDEX row = PatternBreak(m_PlayState, nChn, static_cast<ModCommand::PARAM>(param)); row != ROWINDEX_INVALID) { m_PlayState.m_breakRow = row; - if(m_SongFlags[SONG_PATTERNLOOP]) + if(m_PlayState.m_flags[SONG_PATTERNLOOP]) { //If song is set to loop and a pattern break occurs we should stay on the same pattern. //Use nPosJump to force playback to "jump to this pattern" rather than move to next, as by default. @@ -3577,10 +3577,10 @@ } // for(...) end // Navigation Effects - if(m_SongFlags[SONG_FIRSTTICK]) + if(m_PlayState.m_flags[SONG_FIRSTTICK]) { if(HandleNextRow(m_PlayState, Order(), true)) - m_SongFlags.set(SONG_BREAKTOROW); + m_PlayState.m_flags.set(SONG_BREAKTOROW); } return true; } @@ -3624,7 +3624,7 @@ } state.m_nNextRow = state.m_breakRow; - if(!honorPatternLoop || !m_SongFlags[SONG_PATTERNLOOP]) + if(!honorPatternLoop || !m_PlayState.m_flags[SONG_PATTERNLOOP]) state.m_nNextOrder = state.m_posJump; } else if(doPatternLoop) { @@ -4101,7 +4101,7 @@ bool doTrigger = false; if(GetType() == MOD_TYPE_OKT) - doTrigger = ((chn.noteSlideParam & 0xF0) == 0x10) || m_SongFlags[SONG_FIRSTTICK]; + doTrigger = ((chn.noteSlideParam & 0xF0) == 0x10) || m_PlayState.m_flags[SONG_FIRSTTICK]; else doTrigger = !chn.isFirstTick && (--chn.noteSlideCounter == 0); @@ -4313,7 +4313,7 @@ return; } // IT Compatibility (and other trackers as well): panning disables surround (unless panning in rear channels is enabled, which is not supported by the original trackers anyway) - if (!m_SongFlags[SONG_SURROUNDPAN] && (panBits == Pan8bit || m_playBehaviour[kPanOverride])) + if (!m_PlayState.m_flags[SONG_SURROUNDPAN] && (panBits == Pan8bit || m_playBehaviour[kPanOverride])) { chn.dwFlags.reset(CHN_SURROUND); } @@ -4458,18 +4458,18 @@ { if (((param & 0x0F) == 0x0F) && (param & 0xF0)) { - if(m_SongFlags[SONG_FIRSTTICK]) + if(m_PlayState.m_flags[SONG_FIRSTTICK]) { param = (param & 0xF0) / 4u; nPanSlide = - (int)param; } } else if (((param & 0xF0) == 0xF0) && (param & 0x0F)) { - if(m_SongFlags[SONG_FIRSTTICK]) + if(m_PlayState.m_flags[SONG_FIRSTTICK]) { nPanSlide = (param & 0x0F) * 4u; } - } else if(!m_SongFlags[SONG_FIRSTTICK]) + } else if(!m_PlayState.m_flags[SONG_FIRSTTICK]) { if (param & 0x0F) { @@ -4483,7 +4483,7 @@ } } else { - if(!m_SongFlags[SONG_FIRSTTICK]) + if(!m_PlayState.m_flags[SONG_FIRSTTICK]) { if (param & 0xF0) { @@ -4570,13 +4570,13 @@ if (((param & 0x0F) == 0x0F) && (param & 0xF0)) { - if(m_SongFlags[SONG_FIRSTTICK]) nChnSlide = param >> 4; + if(m_PlayState.m_flags[SONG_FIRSTTICK]) nChnSlide = param >> 4; } else if (((param & 0xF0) == 0xF0) && (param & 0x0F)) { - if(m_SongFlags[SONG_FIRSTTICK]) nChnSlide = - (int)(param & 0x0F); + if(m_PlayState.m_flags[SONG_FIRSTTICK]) nChnSlide = - (int)(param & 0x0F); } else { - if(!m_SongFlags[SONG_FIRSTTICK]) + if(!m_PlayState.m_flags[SONG_FIRSTTICK]) { if (param & 0x0F) { @@ -4634,7 +4634,7 @@ // E4x: Set Vibrato WaveForm case 0x40: chn.nVibratoType = param & 0x07; break; // E5x: Set FineTune - case 0x50: if(!m_SongFlags[SONG_FIRSTTICK]) + case 0x50: if(!m_PlayState.m_flags[SONG_FIRSTTICK]) break; if(GetType() & (MOD_TYPE_MOD | MOD_TYPE_DIGI | MOD_TYPE_AMF0 | MOD_TYPE_MED)) { @@ -4657,14 +4657,14 @@ break; // E6x: Pattern Loop case 0x60: - if(m_SongFlags[SONG_FIRSTTICK]) + if(m_PlayState.m_flags[SONG_FIRSTTICK]) PatternLoop(m_PlayState, nChn, param & 0x0F); break; // E7x: Set Tremolo WaveForm case 0x70: chn.nTremoloType = param & 0x07; break; // E8x: Set 4-bit Panning case 0x80: - if(m_SongFlags[SONG_FIRSTTICK]) + if(m_PlayState.m_flags[SONG_FIRSTTICK]) { Panning(chn, param, Pan4bit); } @@ -4683,7 +4683,7 @@ if(GetType() == MOD_TYPE_MOD) // MOD: Invert Loop { chn.nEFxSpeed = param; - if(m_SongFlags[SONG_FIRSTTICK]) InvertLoop(chn); + if(m_PlayState.m_flags[SONG_FIRSTTICK]) InvertLoop(chn); } else // XM: Set Active Midi Macro { chn.nActiveMacro = param; @@ -4704,7 +4704,7 @@ // S1x: Set Glissando Control case 0x10: chn.dwFlags.set(CHN_GLISSANDO, param != 0); break; // S2x: Set FineTune - case 0x20: if(!m_SongFlags[SONG_FIRSTTICK]) + case 0x20: if(!m_PlayState.m_flags[SONG_FIRSTTICK]) break; if(chn.HasCustomTuning()) { @@ -4761,7 +4761,7 @@ break; // S6x: Pattern Delay for x frames case 0x60: - if(m_SongFlags[SONG_FIRSTTICK] && m_PlayState.m_nTickCount == 0) + if(m_PlayState.m_flags[SONG_FIRSTTICK] && m_PlayState.m_nTickCount == 0) { // Tick delays are added up. // Scream Tracker 3 does actually not support this command. @@ -4774,7 +4774,7 @@ } break; // S7x: Envelope Control / Instrument Control - case 0x70: if(!m_SongFlags[SONG_FIRSTTICK]) break; + case 0x70: if(!m_PlayState.m_flags[SONG_FIRSTTICK]) break; switch(param) { case 0: @@ -4822,7 +4822,7 @@ break; // S8x: Set 4-bit Panning case 0x80: - if(m_SongFlags[SONG_FIRSTTICK]) + if(m_PlayState.m_flags[SONG_FIRSTTICK]) { Panning(chn, param, Pan4bit); } @@ -4830,7 +4830,7 @@ // S9x: Sound Control case 0x90: ExtendedChannelEffect(chn, param); break; // SAx: Set 64k Offset - case 0xA0: if(m_SongFlags[SONG_FIRSTTICK]) + case 0xA0: if(m_PlayState.m_flags[SONG_FIRSTTICK]) { chn.nOldHiOffset = static_cast<uint8>(param); if (!m_playBehaviour[kITHighOffsetNoRetrig] && chn.rowCommand.IsNote()) @@ -4842,7 +4842,7 @@ break; // SBx: Pattern Loop case 0xB0: - if(m_SongFlags[SONG_FIRSTTICK]) + if(m_PlayState.m_flags[SONG_FIRSTTICK]) PatternLoop(m_PlayState, nChn, param & 0x0F); break; // SCx: Note Cut @@ -4876,7 +4876,7 @@ void CSoundFile::ExtendedChannelEffect(ModChannel &chn, uint32 param) { // S9x and X9x commands (S3M/XM/IT only) - if(!m_SongFlags[SONG_FIRSTTICK]) return; + if(!m_PlayState.m_flags[SONG_FIRSTTICK]) return; switch(param & 0x0F) { // S90: Surround Off @@ -4898,19 +4898,19 @@ break; // S9A: 2-Channels surround mode case 0x0A: - m_SongFlags.reset(SONG_SURROUNDPAN); + m_PlayState.m_flags.reset(SONG_SURROUNDPAN); break; // S9B: 4-Channels surround mode case 0x0B: - m_SongFlags.set(SONG_SURROUNDPAN); + m_PlayState.m_flags.set(SONG_SURROUNDPAN); break; // S9C: IT Filter Mode case 0x0C: - m_SongFlags.reset(SONG_MPTFILTERMODE); + m_PlayState.m_flags.reset(SONG_MPTFILTERMODE); break; // S9D: MPT Filter Mode case 0x0D: - m_SongFlags.set(SONG_MPTFILTERMODE); + m_PlayState.m_flags.set(SONG_MPTFILTERMODE); break; // S9E: Go forward case 0x0E: @@ -5465,7 +5465,7 @@ if(m_SongFlags[SONG_PT_MODE]) { - // ProTracker compatbility: PT1/2-style funky 9xx offset command + // ProTracker compatibility: PT1/2-style funky 9xx offset command // Test case: ptoffset.mod chn.position.Set(chn.prevNoteOffset); chn.prevNoteOffset += param; @@ -5580,7 +5580,7 @@ { // Buggy-like-hell FT2 Rxy retrig! // Test case: retrig.xm - if(m_SongFlags[SONG_FIRSTTICK]) + if(m_PlayState.m_flags[SONG_FIRSTTICK]) { // Here are some really stupid things FT2 does on the first tick. // Test case: RetrigTick0.xm @@ -5595,7 +5595,7 @@ } if(retrigCount >= retrigSpeed) { - if(!m_SongFlags[SONG_FIRSTTICK] || !chn.rowCommand.IsNote()) + if(!m_PlayState.m_flags[SONG_FIRSTTICK] || !chn.rowCommand.IsNote()) { doRetrig = true; retrigCount = 0; @@ -5630,7 +5630,7 @@ // FT2 bug: if a retrig (Rxy) occurs together with a volume command, the first retrig interval is increased by one tick if((param & 0x100) && (chn.rowCommand.volcmd == VOLCMD_VOLUME) && (chn.rowCommand.param & 0xF0)) realspeed++; - if(!m_SongFlags[SONG_FIRSTTICK] || (param & 0x100)) + if(!m_PlayState.m_flags[SONG_FIRSTTICK] || (param & 0x100)) { if(!realspeed) realspeed = 1; @@ -5978,13 +5978,13 @@ { // Set tempo from UI - ignore slide commands and such. m_PlayState.m_nMusicTempo = Clamp(param, specs.GetTempoMin(), specs.GetTempoMax()); - } else if(param >= minTempo && m_SongFlags[SONG_FIRSTTICK] == !m_playBehaviour[kMODTempoOnSecondTick]) + } else if(param >= minTempo && m_PlayState.m_flags[SONG_FIRSTTICK] == !m_playBehaviour[kMODTempoOnSecondTick]) { // ProTracker sets the tempo after the first tick. // Note: The case of one tick per row is handled in ProcessRow() instead. // Test case: TempoChange.mod m_PlayState.m_nMusicTempo = std::min(param, specs.GetTempoMax()); - } else if(param < minTempo && !m_SongFlags[SONG_FIRSTTICK]) + } else if(param < minTempo && !m_PlayState.m_flags[SONG_FIRSTTICK]) { // Tempo Slide TEMPO tempDiff(param.GetInt() & 0x0F, 0); @@ -6087,14 +6087,14 @@ if (((param & 0x0F) == 0x0F) && (param & 0xF0)) { - if(m_SongFlags[SONG_FIRSTTICK]) nGlbSlide = (param >> 4) * 2; + if(m_PlayState.m_flags[SONG_FIRSTTICK]) nGlbSlide = (param >> 4) * 2; } else if (((param & 0xF0) == 0xF0) && (param & 0x0F)) { - if(m_SongFlags[SONG_FIRSTTICK]) nGlbSlide = - (int)((param & 0x0F) * 2); + if(m_PlayState.m_flags[SONG_FIRSTTICK]) nGlbSlide = - (int)((param & 0x0F) * 2); } else { - if(!m_SongFlags[SONG_FIRSTTICK]) + if(!m_PlayState.m_flags[SONG_FIRSTTICK]) { if (param & 0xF0) { @@ -6444,7 +6444,7 @@ } if(doTransition) { - if(m_SongFlags[SONG_PATTERNLOOP]) + if(m_PlayState.m_flags[SONG_PATTERNLOOP]) m_PlayState.m_nPattern = Order()[m_PlayState.m_nSeqOverride]; m_PlayState.m_nCurrentOrder = m_PlayState.m_nSeqOverride; m_PlayState.m_nSeqOverride = ORDERINDEX_INVALID; Modified: trunk/OpenMPT/soundlib/Sndfile.cpp ============================================================================== --- trunk/OpenMPT/soundlib/Sndfile.cpp Sun Apr 21 12:59:02 2024 (r20630) +++ trunk/OpenMPT/soundlib/Sndfile.cpp Sun Apr 21 13:52:16 2024 (r20631) @@ -886,7 +886,7 @@ m_PlayState.Chn[i].Reset(ModChannel::resetSetPosFull, *this, i, muteFlag); m_visitedRows.Initialize(true); - m_SongFlags.reset(SONG_FADINGSONG | SONG_ENDREACHED); + m_PlayState.m_flags.reset(SONG_FADINGSONG | SONG_ENDREACHED); m_PlayState.m_nGlobalVolume = m_nDefaultGlobalVolume; m_PlayState.m_nMusicSpeed = Order().GetDefaultSpeed(); @@ -952,7 +952,7 @@ m_PlayState.m_nextPatStartRow = 0; } - m_SongFlags.reset(SONG_FADINGSONG | SONG_ENDREACHED); + m_PlayState.m_flags.reset(SONG_FADINGSONG | SONG_ENDREACHED); } void CSoundFile::SuspendPlugins() @@ -1024,7 +1024,7 @@ void CSoundFile::ResetChannels() { - m_SongFlags.reset(SONG_FADINGSONG | SONG_ENDREACHED); + m_PlayState.m_flags.reset(SONG_FADINGSONG | SONG_ENDREACHED); m_PlayState.m_nBufferCount = 0; for(auto &chn : m_PlayState.Chn) { @@ -1071,7 +1071,7 @@ { if(!Patterns.IsValidPat(nPat)) { - m_SongFlags.reset(SONG_PATTERNLOOP); + m_PlayState.m_flags.reset(SONG_PATTERNLOOP); } else { if(nRow >= Patterns[nPat].GetNumRows()) nRow = 0; @@ -1081,7 +1081,7 @@ m_PlayState.m_nPatternDelay = 0; m_PlayState.m_nFrameDelay = 0; m_PlayState.m_nextPatStartRow = 0; - m_SongFlags.set(SONG_PATTERNLOOP); + m_PlayState.m_flags.set(SONG_PATTERNLOOP); } m_PlayState.m_nBufferCount = 0; } @@ -1098,7 +1098,7 @@ m_PlayState.m_nFrameDelay = 0; m_PlayState.m_nBufferCount = 0; m_PlayState.m_nextPatStartRow = 0; - m_SongFlags.reset(SONG_PATTERNLOOP); + m_PlayState.m_flags.reset(SONG_PATTERNLOOP); } Modified: trunk/OpenMPT/soundlib/Sndfile.h ============================================================================== --- trunk/OpenMPT/soundlib/Sndfile.h Sun Apr 21 12:59:02 2024 (r20630) +++ trunk/OpenMPT/soundlib/Sndfile.h Sun Apr 21 13:52:16 2024 (r20631) @@ -462,7 +462,7 @@ public: // for Editing #ifdef MODPLUG_TRACKER - CModDoc *m_pModDoc = nullptr; // Can be a null pointer for example when previewing samples from the treeview. + CModDoc *m_pModDoc = nullptr; // Can be a null pointer for example when previewing samples from the treeview. #endif // MODPLUG_TRACKER Enum<MODTYPE> m_nType; private: @@ -477,7 +477,7 @@ private: CHANNELINDEX m_nMixStat; public: - ROWINDEX m_nDefaultRowsPerBeat, m_nDefaultRowsPerMeasure; // default rows per beat and measure for this module + ROWINDEX m_nDefaultRowsPerBeat, m_nDefaultRowsPerMeasure; // default rows per beat and measure for this module TempoMode m_nTempoMode = TempoMode::Classic; #ifdef MODPLUG_TRACKER @@ -586,7 +586,7 @@ int32 m_lHighResRampingGlobalVolume = 0; // Global volume ramping public: - bool m_bPositionChanged = true; // Report to plugins that we jumped around in the module + FlagSet<PlayFlags> m_flags = SONG_POSITIONCHANGED; public: CHANNELINDEX ChnMix[MAX_CHANNELS]; // Index of channels in Chn to be actually mixed @@ -832,7 +832,7 @@ // A repeat count value of -1 means infinite loop void SetRepeatCount(int n) { m_nRepeatCount = n; } int GetRepeatCount() const { return m_nRepeatCount; } - bool IsPaused() const { return m_SongFlags[SONG_PAUSED | SONG_STEP]; } // Added SONG_STEP as it seems to be desirable in most cases to check for this as well. + bool IsPaused() const { return m_PlayState.m_flags[SONG_PAUSED | SONG_STEP]; } // Added SONG_STEP as it seems to be desirable in most cases to check for this as well. void LoopPattern(PATTERNINDEX nPat, ROWINDEX nRow = 0); bool InitChannel(CHANNELINDEX nChn); @@ -1033,7 +1033,7 @@ void ProcessInputChannels(IAudioSource &source, std::size_t countChunk); public: samplecount_t GetTotalSampleCount() const { return m_PlayState.m_lTotalSampleCount; } - bool HasPositionChanged() { bool b = m_PlayState.m_bPositionChanged; m_PlayState.m_bPositionChanged = false; return b; } + bool HasPositionChanged() { bool b = m_PlayState.m_flags[SONG_POSITIONCHANGED]; m_PlayState.m_flags.reset(SONG_POSITIONCHANGED); return b; } bool IsRenderingToDisc() const { return m_bIsRendering; } void PrecomputeSampleLoops(bool updateChannels = false); Modified: trunk/OpenMPT/soundlib/Sndmix.cpp ============================================================================== --- trunk/OpenMPT/soundlib/Sndmix.cpp Sun Apr 21 12:59:02 2024 (r20630) +++ trunk/OpenMPT/soundlib/Sndmix.cpp Sun Apr 21 13:52:16 2024 (r20631) @@ -223,7 +223,7 @@ samplecount_t countRendered = 0; samplecount_t countToRender = count; - while(!m_SongFlags[SONG_ENDREACHED] && countToRender > 0) + while(!m_PlayState.m_flags[SONG_ENDREACHED] && countToRender > 0) { // Update Channel Data @@ -231,10 +231,10 @@ { // Last tick or fade completely processed, find out what to do next - if(m_SongFlags[SONG_FADINGSONG]) + if(m_PlayState.m_flags[SONG_FADINGSONG]) { // Song was faded out - m_SongFlags.set(SONG_ENDREACHED); + m_PlayState.m_flags.set(SONG_ENDREACHED); } else if(ReadNote()) { // Render next tick (normal progress) @@ -256,29 +256,29 @@ #ifdef MODPLUG_TRACKER if((m_nMaxOrderPosition) && (m_PlayState.m_nCurrentOrder >= m_nMaxOrderPosition)) { - m_SongFlags.set(SONG_ENDREACHED); + m_PlayState.m_flags.set(SONG_ENDREACHED); } #endif // MODPLUG_TRACKER if(IsRenderingToDisc()) { // Disable song fade when rendering or when requested in libopenmpt. - m_SongFlags.set(SONG_ENDREACHED); + m_PlayState.m_flags.set(SONG_ENDREACHED); } else { // end of song reached, fade it out if(FadeSong(FADESONGDELAY)) // sets m_nBufferCount xor returns false { // FadeSong sets m_nBufferCount here MPT_ASSERT(m_PlayState.m_nBufferCount > 0); - m_SongFlags.set(SONG_FADINGSONG); + m_PlayState.m_flags.set(SONG_FADINGSONG); } else { - m_SongFlags.set(SONG_ENDREACHED); + m_PlayState.m_flags.set(SONG_ENDREACHED); } } } } - if(m_SongFlags[SONG_ENDREACHED]) + if(m_PlayState.m_flags[SONG_ENDREACHED]) { // Mix done. @@ -375,7 +375,7 @@ // the end of the next tick. if(m_PlayState.m_nMusicSpeed == uint16_max && (m_nMixStat == 0 || m_PlayState.m_nGlobalVolume == 0) && GetType() == MOD_TYPE_XM && !m_PlayState.m_nBufferCount) { - m_SongFlags.set(SONG_ENDREACHED); + m_PlayState.m_flags.set(SONG_ENDREACHED); } } #endif // MODPLUG_TRACKER @@ -438,7 +438,7 @@ { while(++m_PlayState.m_nTickCount >= m_PlayState.TicksOnRow()) { - const auto [ignoreRow, patternTransition] = NextRow(m_PlayState, m_SongFlags[SONG_BREAKTOROW]); + const auto [ignoreRow, patternTransition] = NextRow(m_PlayState, m_PlayState.m_flags[SONG_BREAKTOROW]); #ifdef MODPLUG_TRACKER HandleRowTransitionEvents(patternTransition); @@ -457,7 +457,7 @@ #endif // MODPLUG_TRACKER // Check if pattern is valid - if(!m_SongFlags[SONG_PATTERNLOOP]) + if(!m_PlayState.m_flags[SONG_PATTERNLOOP]) { m_PlayState.m_nPattern = (m_PlayState.m_nCurrentOrder < Order().size()) ? Order()[m_PlayState.m_nCurrentOrder] : Order.GetInvalidPatIndex(); if (m_PlayState.m_nPattern < Patterns.Size() && !Patterns[m_PlayState.m_nPattern].IsValid()) m_PlayState.m_nPattern = Order.GetIgnoreIndex(); @@ -488,10 +488,10 @@ if(!(TrackerSettings::Instance().m_dwPatternSetup & PATTERN_RESETCHANNELS)) #endif // MODPLUG_TRACKER { - m_SongFlags.set(SONG_BREAKTOROW); + m_PlayState.m_flags.set(SONG_BREAKTOROW); } - if (restartPosOverride == 0 && !m_SongFlags[SONG_BREAKTOROW]) + if (restartPosOverride == 0 && !m_PlayState.m_flags[SONG_BREAKTOROW]) { //rewbs.instroVSTi: stop all VSTi at end of song, if looping. StopAllVsti(); @@ -534,7 +534,7 @@ //Handle Repeat position m_PlayState.m_nCurrentOrder = restartPosOverride; - m_SongFlags.reset(SONG_BREAKTOROW); + m_PlayState.m_flags.reset(SONG_BREAKTOROW); //If restart pos points to +++, move along while(m_PlayState.m_nCurrentOrder < Order().size() && Order()[m_PlayState.m_nCurrentOrder] == Order.GetIgnoreIndex()) { @@ -577,7 +577,7 @@ // But: We will not mark the row as modified if the song is not in loop mode but // the pattern loop (editor flag, not to be confused with the pattern loop effect) // flag is set - because in that case, the module would stop after the first pattern loop... - const bool overrideLoopCheck = (m_nRepeatCount != -1) && m_SongFlags[SONG_PATTERNLOOP]; + const bool overrideLoopCheck = (m_nRepeatCount != -1) && m_PlayState.m_flags[SONG_PATTERNLOOP]; if(!overrideLoopCheck && m_visitedRows.Visit(m_PlayState.m_nCurrentOrder, m_PlayState.m_nRow, m_PlayState.Chn, ignoreRow)) { if(m_nRepeatCount) @@ -663,7 +663,7 @@ } } - SetupNextRow(m_PlayState, m_SongFlags[SONG_PATTERNLOOP]); + SetupNextRow(m_PlayState, m_PlayState.m_flags[SONG_PATTERNLOOP]); // Reset channel values ModCommand *m = Patterns[m_PlayState.m_nPattern].GetpModCommand(m_PlayState.m_nRow, 0); @@ -735,17 +735,17 @@ #ifdef MODPLUG_TRACKER if (m_PlayState.m_nTickCount >= m_PlayState.TicksOnRow() - 1) { - if(m_SongFlags[SONG_STEP]) + if(m_PlayState.m_flags[SONG_STEP]) { - m_SongFlags.reset(SONG_STEP); - m_SongFlags.set(SONG_PAUSED); + m_PlayState.m_flags.reset(SONG_STEP); + m_PlayState.m_flags.set(SONG_PAUSED); } } #endif // MODPLUG_TRACKER if (m_PlayState.m_nTickCount) { - m_SongFlags.reset(SONG_FIRSTTICK); + m_PlayState.m_flags.reset(SONG_FIRSTTICK); if(!(GetType() & (MOD_TYPE_XM | MOD_TYPE_MT2)) && (GetType() != MOD_TYPE_MOD || m_SongFlags[SONG_PT_MODE]) // Fix infinite loop in "GamerMan " by MrGamer, which was made with FT2 && m_PlayState.m_nTickCount < m_PlayState.TicksOnRow()) @@ -754,13 +754,13 @@ // Test cases: PatternDelaysRetrig.it, PatternDelaysRetrig.s3m, PatternDelaysRetrig.xm, PatternDelaysRetrig.mod if(!(m_PlayState.m_nTickCount % (m_PlayState.m_nMusicSpeed + m_PlayState.m_nFrameDelay))) { - m_SongFlags.set(SONG_FIRSTTICK); + m_PlayState.m_flags.set(SONG_FIRSTTICK); } } } else { - m_SongFlags.set(SONG_FIRSTTICK); - m_SongFlags.reset(SONG_BREAKTOROW); + m_PlayState.m_flags.set(SONG_FIRSTTICK); + m_PlayState.m_flags.reset(SONG_BREAKTOROW); } // Update Effects @@ -907,7 +907,7 @@ { if (chn.dwFlags[CHN_TREMOLO]) { - if(m_SongFlags.test_all(SONG_FIRSTTICK | SONG_PT_MODE)) + if(m_SongFlags[SONG_PT_MODE] && m_PlayState.m_flags[SONG_FIRSTTICK]) { // ProTracker doesn't apply tremolo nor advance on the first tick. // Test case: VibratoReset.mod @@ -923,12 +923,12 @@ int delta = GetVibratoDelta(chn.nTremoloType, chn.nTremoloPos); if((chn.nTremoloType & 0x03) == 1 && m_playBehaviour[kFT2MODTremoloRampWaveform]) { - // FT2 compatibility: Tremolo ramp down / triangle implementation is weird and affected by vibrato position (copypaste bug) + // FT2 compatibility: Tremolo ramp down / triangle implementation is weird and affected by vibrato position (copy-paste bug) // Test case: TremoloWaveforms.xm, TremoloVibrato.xm uint8 ramp = (chn.nTremoloPos * 4u) & 0x7F; - // Volume-colum vibrato gets executed first in FT2, so we may need to advance the vibrato position first + // Volume-column vibrato gets executed first in FT2, so we may need to advance the vibrato position first uint32 vibPos = chn.nVibratoPos; - if(!m_SongFlags[SONG_FIRSTTICK] && chn.dwFlags[CHN_VIBRATO]) + if(!m_PlayState.m_flags[SONG_FIRSTTICK] && chn.dwFlags[CHN_VIBRATO]) vibPos += chn.nVibratoSpeed; if((vibPos & 0x3F) >= 32) ramp ^= 0x7F; @@ -946,7 +946,7 @@ vol -= (vol * chn.nTremoloDepth * (64 - delta)) / (128 * 64); } } - if(!m_SongFlags[SONG_FIRSTTICK] || ((GetType() & (MOD_TYPE_IT|MOD_TYPE_MPT)) && !m_SongFlags[SONG_ITOLDEFFECTS])) + if(!m_PlayState.m_flags[SONG_FIRSTTICK] || ((GetType() & (MOD_TYPE_IT|MOD_TYPE_MPT)) && !m_SongFlags[SONG_ITOLDEFFECTS])) { // IT compatibility: IT has its own, more precise tables if(m_playBehaviour[kITVibratoTremoloPanbrello]) @@ -968,7 +968,7 @@ // Test case: Tremor.xm if(chn.nTremorCount & 0x80) { - if(!m_SongFlags[SONG_FIRSTTICK] && chn.nCommand == CMD_TREMOR) + if(!m_PlayState.m_flags[SONG_FIRSTTICK] && chn.nCommand == CMD_TREMOR) { chn.nTremorCount &= ~0x20; if(chn.nTremorCount == 0x80) @@ -1026,7 +1026,7 @@ chn.nTremorCount = tremcount + 1; } else { - if(m_SongFlags[SONG_FIRSTTICK]) + if(m_PlayState.m_flags[SONG_FIRSTTICK]) { // tremcount is only 0 on the first tremor tick after triggering a note. if(tremcount > 0) @@ -1510,7 +1510,7 @@ chn.m_ReCalculateFreqOnFirstTick = true; } else { - if(GetType() == MOD_TYPE_MT2 && m_SongFlags[SONG_FIRSTTICK]) + if(GetType() == MOD_TYPE_MT2 && m_PlayState.m_flags[SONG_FIRSTTICK]) { // MT2 resets any previous portamento when an arpeggio occurs. chn.nPeriod = period = GetPeriodFromNote(chn.nNote, chn.nFineTune, chn.nC5Speed); @@ -1539,7 +1539,7 @@ } else if(m_playBehaviour[kFT2Arpeggio]) { // FastTracker 2: Swedish tracker logic (TM) arpeggio - if(!m_SongFlags[SONG_FIRSTTICK]) + if(!m_PlayState.m_flags[SONG_FIRSTTICK]) { // Arpeggio is added on top of current note, but cannot do it the IT way because of // the behaviour in ArpeggioClamp.xm. @@ -1660,7 +1660,7 @@ if(chn.dwFlags[CHN_VIBRATO]) { - const bool advancePosition = !m_SongFlags[SONG_FIRSTTICK] || ((GetType() & (MOD_TYPE_IT | MOD_TYPE_MPT)) && !(m_SongFlags[SONG_ITOLDEFFECTS])); + const bool advancePosition = !m_PlayState.m_flags[SONG_FIRSTTICK] || ((GetType() & (MOD_TYPE_IT | MOD_TYPE_MPT)) && !(m_SongFlags[SONG_ITOLDEFFECTS])); if(GetType() == MOD_TYPE_669) { @@ -1691,7 +1691,7 @@ } else { // Original behaviour - if(m_SongFlags.test_all(SONG_FIRSTTICK | SONG_PT_MODE) || ((GetType() & (MOD_TYPE_DIGI | MOD_TYPE_DBM)) && m_SongFlags[SONG_FIRSTTICK])) + if((m_SongFlags[SONG_PT_MODE] || (GetType() & (MOD_TYPE_DIGI | MOD_TYPE_DBM))) && m_PlayState.m_flags[SONG_FIRSTTICK]) { // ProTracker doesn't apply vibrato nor advance on the first tick. // Test case: VibratoReset.mod @@ -2030,7 +2030,7 @@ if(!chn.triggerNote) return cutoff; - bool useFilter = !m_SongFlags[SONG_MPTFILTERMODE]; + bool useFilter = !m_PlayState.m_flags[SONG_MPTFILTERMODE]; if(const ModInstrument *pIns = chn.pModInstrument; pIns != nullptr) { if(pIns->IsResonanceEnabled()) @@ -2100,7 +2100,7 @@ { #ifdef MODPLUG_TRACKER // Checking end of row ? - if(m_SongFlags[SONG_PAUSED]) + if(m_PlayState.m_flags[SONG_PAUSED]) { m_PlayState.m_nTickCount = 0; if (!m_PlayState.m_nMusicSpeed) m_PlayState.m_nMusicSpeed = 6; @@ -2284,7 +2284,7 @@ // When glissando mode is set to semitones, clamp to the next halftone. if((chn.dwFlags & (CHN_GLISSANDO | CHN_PORTAMENTO)) == (CHN_GLISSANDO | CHN_PORTAMENTO) - && (!m_SongFlags[SONG_PT_MODE] || (chn.rowCommand.IsPortamento() && !m_SongFlags[SONG_FIRSTTICK]))) + && (!m_SongFlags[SONG_PT_MODE] || (chn.rowCommand.IsPortamento() && !m_PlayState.m_flags[SONG_FIRSTTICK]))) { if(period != chn.cachedPeriod) { @@ -2322,7 +2322,7 @@ // IT Compatibility: Ensure that there is no pan swing, panbrello, panning envelopes, etc. applied on surround channels. // Test case: surround-pan.it - if(chn.dwFlags[CHN_SURROUND] && !m_SongFlags[SONG_SURROUNDPAN] && m_playBehaviour[kITNoSurroundPan]) + if(chn.dwFlags[CHN_SURROUND] && !m_PlayState.m_flags[SONG_SURROUNDPAN] && m_playBehaviour[kITNoSurroundPan]) { chn.nRealPan = 128; } @@ -2351,7 +2351,7 @@ // XM Compatibility: Vibrato should be advanced twice (but not added up) if both volume-column and effect column vibrato is present. // Effect column vibrato parameter has precedence if non-zero. // Test case: VibratoDouble.xm - if(!m_SongFlags[SONG_FIRSTTICK]) + if(!m_PlayState.m_flags[SONG_FIRSTTICK]) chn.nVibratoPos += chn.nVibratoSpeed; } else if(GetType() & (MOD_TYPE_IT | MOD_TYPE_MPT)) { @@ -2615,7 +2615,7 @@ //ProcessMIDIMacro(m_PlayState, nChn, false, m_MidiCfg.Global[MIDIOUT_PAN]); //ProcessMIDIMacro(m_PlayState, nChn, false, m_MidiCfg.Global[MIDIOUT_VOLUME]); - if((chn.rowCommand.command == CMD_MIDI && m_SongFlags[SONG_FIRSTTICK]) || chn.rowCommand.command == CMD_SMOOTHMIDI) + if((chn.rowCommand.command == CMD_MIDI && m_PlayState.m_flags[SONG_FIRSTTICK]) || chn.rowCommand.command == CMD_SMOOTHMIDI) { if(chn.rowCommand.param < 0x80) ProcessMIDIMacro(m_PlayState, nChn, (chn.rowCommand.command == CMD_SMOOTHMIDI), m_MidiCfg.SFx[chn.nActiveMacro], chn.rowCommand.param); Modified: trunk/OpenMPT/test/test.cpp ============================================================================== --- trunk/OpenMPT/test/test.cpp Sun Apr 21 12:59:02 2024 (r20630) +++ trunk/OpenMPT/test/test.cpp Sun Apr 21 13:52:16 2024 (r20631) @@ -2701,7 +2701,7 @@ VERIFY_EQUAL_NONCONT(sndFile.m_nDefaultGlobalVolume, 128); VERIFY_EQUAL_NONCONT(sndFile.m_nVSTiVolume, 42); VERIFY_EQUAL_NONCONT(sndFile.m_nSamplePreAmp, 23); - VERIFY_EQUAL_NONCONT((sndFile.m_SongFlags & SONG_FILE_FLAGS), SONG_LINEARSLIDES | SONG_EXFILTERRANGE); + VERIFY_EQUAL_NONCONT(sndFile.m_SongFlags, SONG_LINEARSLIDES | SONG_EXFILTERRANGE); VERIFY_EQUAL_NONCONT(sndFile.m_playBehaviour[MSF_COMPATIBLE_PLAY], true); VERIFY_EQUAL_NONCONT(sndFile.m_playBehaviour[kMIDICCBugEmulation], false); VERIFY_EQUAL_NONCONT(sndFile.m_playBehaviour[kMPTOldSwingBehaviour], false); @@ -2899,7 +2899,7 @@ VERIFY_EQUAL_NONCONT(sndFile.m_nDefaultGlobalVolume, 128); VERIFY_EQUAL_NONCONT(sndFile.m_nVSTiVolume, 42); VERIFY_EQUAL_NONCONT(sndFile.m_nSamplePreAmp, 23); - VERIFY_EQUAL_NONCONT((sndFile.m_SongFlags & SONG_FILE_FLAGS), SONG_LINEARSLIDES | SONG_EXFILTERRANGE | SONG_ITCOMPATGXX | SONG_ITOLDEFFECTS); + VERIFY_EQUAL_NONCONT(sndFile.m_SongFlags, SONG_LINEARSLIDES | SONG_EXFILTERRANGE | SONG_ITCOMPATGXX | SONG_ITOLDEFFECTS); VERIFY_EQUAL_NONCONT(sndFile.m_playBehaviour[MSF_COMPATIBLE_PLAY], true); VERIFY_EQUAL_NONCONT(sndFile.m_playBehaviour[kMIDICCBugEmulation], false); VERIFY_EQUAL_NONCONT(sndFile.m_playBehaviour[kMPTOldSwingBehaviour], false); @@ -3278,7 +3278,7 @@ VERIFY_EQUAL_NONCONT(sndFile.m_nDefaultGlobalVolume, 32 * 4); VERIFY_EQUAL_NONCONT(sndFile.m_nVSTiVolume, 36); VERIFY_EQUAL_NONCONT(sndFile.m_nSamplePreAmp, 16); - VERIFY_EQUAL_NONCONT((sndFile.m_SongFlags & SONG_FILE_FLAGS), SONG_FASTVOLSLIDES); + VERIFY_EQUAL_NONCONT(sndFile.m_SongFlags, SONG_FASTVOLSLIDES); VERIFY_EQUAL_NONCONT(sndFile.GetMixLevels(), MixLevels::Compatible); VERIFY_EQUAL_NONCONT(sndFile.m_nTempoMode, TempoMode::Classic); VERIFY_EQUAL_NONCONT(sndFile.m_dwLastSavedWithVersion, resaved ? Version::Current() : MPT_V("1.27.00.00")); @@ -3404,7 +3404,7 @@ { // Global Variables VERIFY_EQUAL_NONCONT(sndFile.GetTitle(), "MOD_Test___________X"); - VERIFY_EQUAL_NONCONT((sndFile.m_SongFlags & SONG_FILE_FLAGS), SONG_PT_MODE | SONG_AMIGALIMITS | SONG_ISAMIGA); + VERIFY_EQUAL_NONCONT(sndFile.m_SongFlags, SONG_PT_MODE | SONG_AMIGALIMITS | SONG_ISAMIGA); VERIFY_EQUAL_NONCONT(sndFile.GetMixLevels(), MixLevels::Compatible); VERIFY_EQUAL_NONCONT(sndFile.m_nTempoMode, TempoMode::Classic); VERIFY_EQUAL_NONCONT(sndFile.GetNumChannels(), 4); |