From 788ad134f194653efcd7e42d865e45f4713069a0 Mon Sep 17 00:00:00 2001 From: Glenn Maynard Date: Wed, 29 Mar 2006 11:12:20 +0000 Subject: [PATCH] This broke beat alignment, and after that was fixed, other questions came up (like how to align beat effects correctly). Revert this and fix assist tick differently. Add GetBeatAndBPSFromElapsedTimeNoOffset, GetBeatFromElapsedTimeNoOffset, GetElapsedTimeFromBeatNoOffset. Use them to ignore GlobalOffsetSeconds. --- stepmania/src/GameSoundManager.cpp | 14 +++++++------- stepmania/src/GameState.cpp | 5 ----- stepmania/src/GameState.h | 1 - stepmania/src/ScreenEdit.cpp | 8 ++++---- stepmania/src/ScreenGameplay.cpp | 8 ++++---- stepmania/src/TimingData.cpp | 13 +++++++++++++ stepmania/src/TimingData.h | 11 +++++++++++ 7 files changed, 39 insertions(+), 21 deletions(-) diff --git a/stepmania/src/GameSoundManager.cpp b/stepmania/src/GameSoundManager.cpp index 823bd214b8..bf860a02bb 100644 --- a/stepmania/src/GameSoundManager.cpp +++ b/stepmania/src/GameSoundManager.cpp @@ -207,7 +207,7 @@ static void StartMusic( MusicToPlay &ToPlay ) * common when starting a precached sound, but our sound isn't, so it'll * probably take a little longer. Nudge the latency up. */ const float fPresumedLatency = SOUND->GetPlayLatency() + 0.040f; - const float fCurSecond = GAMESTATE->m_fMusicSecondsNoOffset + fPresumedLatency; + const float fCurSecond = GAMESTATE->m_fMusicSeconds + fPresumedLatency; const float fCurBeat = g_Playing->m_Timing.GetBeatFromElapsedTime( fCurSecond ); /* The beat that the new sound will start on. */ @@ -220,7 +220,7 @@ static void StartMusic( MusicToPlay &ToPlay ) const float fSecondToStartOn = g_Playing->m_Timing.GetElapsedTimeFromBeat( fCurBeatToStartOn ); const float fMaximumDistance = 2; - const float fDistance = min( fSecondToStartOn - GAMESTATE->m_fMusicSecondsNoOffset, fMaximumDistance ); + const float fDistance = min( fSecondToStartOn - GAMESTATE->m_fMusicSeconds, fMaximumDistance ); when = GAMESTATE->m_LastBeatUpdate + fDistance; } @@ -490,8 +490,8 @@ void GameSoundManager::Update( float fDeltaTime ) if( !g_Playing->m_Music->IsPlaying() ) { /* There's no song playing. Fake it. */ - CHECKPOINT_M( ssprintf("%f, delta %f", GAMESTATE->m_fMusicSecondsNoOffset, fDeltaTime) ); - GAMESTATE->UpdateSongPosition( GAMESTATE->m_fMusicSecondsNoOffset + fDeltaTime, g_Playing->m_Timing ); + CHECKPOINT_M( ssprintf("%f, delta %f", GAMESTATE->m_fMusicSeconds, fDeltaTime) ); + GAMESTATE->UpdateSongPosition( GAMESTATE->m_fMusicSeconds + fDeltaTime, g_Playing->m_Timing ); return; } @@ -509,7 +509,7 @@ void GameSoundManager::Update( float fDeltaTime ) if( PREFSMAN->m_bLogSkips && !g_Playing->m_bTimingDelayed ) { const float fExpectedTimePassed = (tm - GAMESTATE->m_LastBeatUpdate) * g_Playing->m_Music->GetPlaybackRate(); - const float fSoundTimePassed = fSeconds - GAMESTATE->m_fMusicSecondsNoOffset; + const float fSoundTimePassed = fSeconds - GAMESTATE->m_fMusicSeconds; const float fDiff = fExpectedTimePassed - fSoundTimePassed; static RString sLastFile = ""; @@ -518,7 +518,7 @@ void GameSoundManager::Update( float fDeltaTime ) /* If fSoundTimePassed < 0, the sound has probably looped. */ if( sLastFile == ThisFile && fSoundTimePassed >= 0 && fabsf(fDiff) > 0.003f ) LOG->Trace("Song position skip in %s: expected %.3f, got %.3f (cur %f, prev %f) (%.3f difference)", - Basename(ThisFile).c_str(), fExpectedTimePassed, fSoundTimePassed, fSeconds, GAMESTATE->m_fMusicSecondsNoOffset, fDiff ); + Basename(ThisFile).c_str(), fExpectedTimePassed, fSoundTimePassed, fSeconds, GAMESTATE->m_fMusicSeconds, fDiff ); sLastFile = ThisFile; } @@ -537,7 +537,7 @@ void GameSoundManager::Update( float fDeltaTime ) { /* We're still waiting for the new sound to start playing, so keep using the * old timing data and fake the time. */ - GAMESTATE->UpdateSongPosition( GAMESTATE->m_fMusicSecondsNoOffset + fDeltaTime, g_Playing->m_Timing ); + GAMESTATE->UpdateSongPosition( GAMESTATE->m_fMusicSeconds + fDeltaTime, g_Playing->m_Timing ); } else { diff --git a/stepmania/src/GameState.cpp b/stepmania/src/GameState.cpp index 2953f15d27..992270941b 100644 --- a/stepmania/src/GameState.cpp +++ b/stepmania/src/GameState.cpp @@ -582,7 +582,6 @@ const float GameState::MUSIC_SECONDS_INVALID = -5000.0f; void GameState::ResetMusicStatistics() { m_fMusicSeconds = 0; // MUSIC_SECONDS_INVALID; - m_fMusicSecondsNoOffset = 0; m_fSongBeat = 0; m_fCurBPS = 10; m_bFreeze = false; @@ -644,10 +643,6 @@ void GameState::ResetStageStatistics() void GameState::UpdateSongPosition( float fPositionSeconds, const TimingData &timing, const RageTimer ×tamp ) { - m_fMusicSecondsNoOffset = fPositionSeconds; - - fPositionSeconds += PREFSMAN->m_fGlobalOffsetSeconds; - if( !timestamp.IsZero() ) m_LastBeatUpdate = timestamp; else diff --git a/stepmania/src/GameState.h b/stepmania/src/GameState.h index 8117718a50..0ca0360e51 100644 --- a/stepmania/src/GameState.h +++ b/stepmania/src/GameState.h @@ -157,7 +157,6 @@ public: // Let a lot of classes access this info here so the don't have to keep their own copies. // float m_fMusicSeconds; // time into the current song - float m_fMusicSecondsNoOffset; // time into the current song, ignoring m_fGlobalOffsetSeconds float m_fSongBeat; float m_fCurBPS; float m_fLightSongBeat; // g_fLightsFalloffSeconds ahead diff --git a/stepmania/src/ScreenEdit.cpp b/stepmania/src/ScreenEdit.cpp index 18f0bb013e..4603510b75 100644 --- a/stepmania/src/ScreenEdit.cpp +++ b/stepmania/src/ScreenEdit.cpp @@ -782,9 +782,9 @@ void ScreenEdit::PlayTicks() * will start coming out the speaker. Compensate for this by boosting fPositionSeconds * ahead. This is just to make sure that we request the sound early enough for it to * come out on time; the actual precise timing is handled by SetStartTime. */ - float fPositionSeconds = GAMESTATE->m_fMusicSecondsNoOffset; + float fPositionSeconds = GAMESTATE->m_fMusicSeconds; fPositionSeconds += SOUND->GetPlayLatency() + (float)CommonMetrics::TICK_EARLY_SECONDS + 0.250f; - const float fSongBeat = GAMESTATE->m_pCurSong->GetBeatFromElapsedTime( fPositionSeconds ); + const float fSongBeat = GAMESTATE->m_pCurSong->m_Timing.GetBeatFromElapsedTimeNoOffset( fPositionSeconds ); const int iSongRow = max( 0, BeatToNoteRowNotRounded( fSongBeat ) ); static int iRowLastCrossed = -1; @@ -802,8 +802,8 @@ void ScreenEdit::PlayTicks() if( iTickRow != -1 ) { const float fTickBeat = NoteRowToBeat( iTickRow ); - const float fTickSecond = GAMESTATE->m_pCurSong->m_Timing.GetElapsedTimeFromBeat( fTickBeat ); - float fSecondsUntil = fTickSecond - GAMESTATE->m_fMusicSecondsNoOffset; + const float fTickSecond = GAMESTATE->m_pCurSong->m_Timing.GetElapsedTimeFromBeatNoOffset( fTickBeat ); + float fSecondsUntil = fTickSecond - GAMESTATE->m_fMusicSeconds; fSecondsUntil /= m_soundMusic.GetPlaybackRate(); /* 2x music rate means the time until the tick is halved */ RageSoundParams p; diff --git a/stepmania/src/ScreenGameplay.cpp b/stepmania/src/ScreenGameplay.cpp index f83aa3ee30..5d87fd0e1e 100644 --- a/stepmania/src/ScreenGameplay.cpp +++ b/stepmania/src/ScreenGameplay.cpp @@ -1433,9 +1433,9 @@ void ScreenGameplay::PlayTicks() * will start coming out the speaker. Compensate for this by boosting fPositionSeconds * ahead. This is just to make sure that we request the sound early enough for it to * come out on time; the actual precise timing is handled by SetStartTime. */ - float fPositionSeconds = GAMESTATE->m_fMusicSecondsNoOffset; + float fPositionSeconds = GAMESTATE->m_fMusicSeconds; fPositionSeconds += SOUND->GetPlayLatency() + (float)CommonMetrics::TICK_EARLY_SECONDS + 0.250f; - const float fSongBeat = GAMESTATE->m_pCurSong->GetBeatFromElapsedTime( fPositionSeconds ); + const float fSongBeat = GAMESTATE->m_pCurSong->m_Timing.GetBeatFromElapsedTimeNoOffset( fPositionSeconds ); const int iSongRow = max( 0, BeatToNoteRowNotRounded( fSongBeat ) ); static int iRowLastCrossed = -1; @@ -1454,8 +1454,8 @@ void ScreenGameplay::PlayTicks() if( iTickRow != -1 ) { const float fTickBeat = NoteRowToBeat( iTickRow ); - const float fTickSecond = GAMESTATE->m_pCurSong->m_Timing.GetElapsedTimeFromBeat( fTickBeat ); - float fSecondsUntil = fTickSecond - GAMESTATE->m_fMusicSecondsNoOffset; + const float fTickSecond = GAMESTATE->m_pCurSong->m_Timing.GetElapsedTimeFromBeatNoOffset( fTickBeat ); + float fSecondsUntil = fTickSecond - GAMESTATE->m_fMusicSeconds; fSecondsUntil /= GAMESTATE->m_SongOptions.m_fMusicRate; /* 2x music rate means the time until the tick is halved */ RageSoundParams p; diff --git a/stepmania/src/TimingData.cpp b/stepmania/src/TimingData.cpp index aa1bf1f2d5..d63ec09c4b 100644 --- a/stepmania/src/TimingData.cpp +++ b/stepmania/src/TimingData.cpp @@ -1,5 +1,6 @@ #include "global.h" #include "TimingData.h" +#include "PrefsManager.h" #include "RageUtil.h" #include "RageLog.h" #include "NoteTypes.h" @@ -197,6 +198,13 @@ BPMSegment& TimingData::GetBPMSegmentAtBeat( float fBeat ) } void TimingData::GetBeatAndBPSFromElapsedTime( float fElapsedTime, float &fBeatOut, float &fBPSOut, bool &bFreezeOut ) const +{ + fElapsedTime += PREFSMAN->m_fGlobalOffsetSeconds; + + GetBeatAndBPSFromElapsedTimeNoOffset( fElapsedTime, fBeatOut, fBPSOut, bFreezeOut ); +} + +void TimingData::GetBeatAndBPSFromElapsedTimeNoOffset( float fElapsedTime, float &fBeatOut, float &fBPSOut, bool &bFreezeOut ) const { // LOG->Trace( "GetBeatAndBPSFromElapsedTime( fElapsedTime = %f )", fElapsedTime ); @@ -259,6 +267,11 @@ void TimingData::GetBeatAndBPSFromElapsedTime( float fElapsedTime, float &fBeatO float TimingData::GetElapsedTimeFromBeat( float fBeat ) const +{ + return TimingData::GetElapsedTimeFromBeatNoOffset( fBeat ) - PREFSMAN->m_fGlobalOffsetSeconds; +} + +float TimingData::GetElapsedTimeFromBeatNoOffset( float fBeat ) const { float fElapsedTime = 0; fElapsedTime -= m_fBeat0OffsetInSeconds; diff --git a/stepmania/src/TimingData.h b/stepmania/src/TimingData.h index e6566aa3ad..7cbc3a104f 100644 --- a/stepmania/src/TimingData.h +++ b/stepmania/src/TimingData.h @@ -69,6 +69,17 @@ public: return fBeat; } float GetElapsedTimeFromBeat( float fBeat ) const; + + void GetBeatAndBPSFromElapsedTimeNoOffset( float fElapsedTime, float &fBeatOut, float &fBPSOut, bool &bFreezeOut ) const; + float GetBeatFromElapsedTimeNoOffset( float fElapsedTime ) const // shortcut for places that care only about the beat + { + float fBeat, fThrowAway; + bool bThrowAway; + GetBeatAndBPSFromElapsedTimeNoOffset( fElapsedTime, fBeat, fThrowAway, bThrowAway ); + return fBeat; + } + float GetElapsedTimeFromBeatNoOffset( float fBeat ) const; + bool HasBpmChanges() const; bool HasStops() const;