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;