From 5c93e0f2fc95d0b7f29c741112fcb86ac1241fa1 Mon Sep 17 00:00:00 2001 From: Glenn Maynard Date: Mon, 18 Jun 2007 21:02:28 +0000 Subject: [PATCH] make music sync follow VisualDelaySeconds by default (fixes receptors flashing off-sync when VDS is used) --- stepmania/src/Actor.cpp | 23 ++++++++++++++++++++++- stepmania/src/Actor.h | 5 ++++- stepmania/src/GameState.cpp | 4 ++-- 3 files changed, 28 insertions(+), 4 deletions(-) diff --git a/stepmania/src/Actor.cpp b/stepmania/src/Actor.cpp index 97791d79fe..7931c3538c 100644 --- a/stepmania/src/Actor.cpp +++ b/stepmania/src/Actor.cpp @@ -29,6 +29,8 @@ public: REGISTER_ACTOR_CLASS_WITH_NAME( HiddenActor, Actor ) float Actor::g_fCurrentBGMTime = 0, Actor::g_fCurrentBGMBeat; +float Actor::g_fCurrentBGMTimeNoOffset = 0, Actor::g_fCurrentBGMBeatNoOffset = 0; + Actor *Actor::Copy() const { return new Actor(*this); } @@ -50,10 +52,16 @@ static const char *VertAlignNames[] = { XToString( VertAlign ); LuaXType( VertAlign ); -void Actor::SetBGMTime( float fTime, float fBeat ) +void Actor::SetBGMTime( float fTime, float fBeat, float fTimeNoOffset, float fBeatNoOffset ) { g_fCurrentBGMTime = fTime; g_fCurrentBGMBeat = fBeat; + + /* This timer is generally only used for effects tied to the background music + * when GameSoundManager is aligning music beats. Alignment doesn't handle + * g_fVisualDelaySeconds. */ + g_fCurrentBGMTimeNoOffset = fTimeNoOffset; + g_fCurrentBGMBeatNoOffset = fBeatNoOffset; } void Actor::SetBGMLight( int iLightNumber, float fCabinetLights ) @@ -647,6 +655,17 @@ void Actor::UpdateInternal( float fDeltaTime ) m_fEffectDelta = g_fCurrentBGMTime - m_fSecsIntoEffect; m_fSecsIntoEffect = g_fCurrentBGMTime; break; + + case CLOCK_BGM_BEAT_NO_OFFSET: + m_fEffectDelta = g_fCurrentBGMBeatNoOffset - m_fSecsIntoEffect; + m_fSecsIntoEffect = g_fCurrentBGMBeatNoOffset; + break; + + case CLOCK_BGM_TIME_NO_OFFSET: + m_fEffectDelta = g_fCurrentBGMTimeNoOffset - m_fSecsIntoEffect; + m_fSecsIntoEffect = g_fCurrentBGMTimeNoOffset; + break; + default: if( m_EffectClock >= CLOCK_LIGHT_1 && m_EffectClock <= CLOCK_LIGHT_LAST ) { @@ -776,6 +795,8 @@ void Actor::SetEffectClockString( const RString &s ) else if(s.EqualsNoCase("beat")) this->SetEffectClock( CLOCK_BGM_BEAT ); else if(s.EqualsNoCase("music")) this->SetEffectClock( CLOCK_BGM_TIME ); else if(s.EqualsNoCase("bgm")) this->SetEffectClock( CLOCK_BGM_BEAT ); // compat, deprecated + else if(s.EqualsNoCase("musicnooffset"))this->SetEffectClock( CLOCK_BGM_TIME_NO_OFFSET ); + else if(s.EqualsNoCase("beatnooffset")) this->SetEffectClock( CLOCK_BGM_BEAT_NO_OFFSET ); else { CabinetLight cl = StringToCabinetLight( s ); diff --git a/stepmania/src/Actor.h b/stepmania/src/Actor.h index 67d67c5b5d..861c915542 100644 --- a/stepmania/src/Actor.h +++ b/stepmania/src/Actor.h @@ -60,7 +60,7 @@ public: virtual void InitState(); virtual void LoadFromNode( const XNode* pNode ); - static void SetBGMTime( float fTime, float fBeat ); + static void SetBGMTime( float fTime, float fBeat, float fTimeNoOffset, float fBeatNoOffset ); static void SetBGMLight( int iLightNumber, float fCabinetLights ); enum Effect { no_effect, @@ -97,6 +97,8 @@ public: CLOCK_TIMER_GLOBAL, CLOCK_BGM_TIME, CLOCK_BGM_BEAT, + CLOCK_BGM_TIME_NO_OFFSET, + CLOCK_BGM_BEAT_NO_OFFSET, CLOCK_LIGHT_1 = 1000, CLOCK_LIGHT_LAST = 1100, NUM_CLOCKS @@ -480,6 +482,7 @@ protected: // global state // static float g_fCurrentBGMTime, g_fCurrentBGMBeat; + static float g_fCurrentBGMTimeNoOffset, g_fCurrentBGMBeatNoOffset; private: // diff --git a/stepmania/src/GameState.cpp b/stepmania/src/GameState.cpp index d31405d47e..8901a6c20e 100644 --- a/stepmania/src/GameState.cpp +++ b/stepmania/src/GameState.cpp @@ -804,7 +804,7 @@ void GameState::ResetMusicStatistics() m_bFreeze = false; m_fMusicSecondsVisible = 0; m_fSongBeatVisible = 0; - Actor::SetBGMTime( 0, 0 ); + Actor::SetBGMTime( 0, 0, 0, 0 ); FOREACH_PlayerNumber( p ) @@ -860,13 +860,13 @@ void GameState::UpdateSongPosition( float fPositionSeconds, const TimingData &ti m_fLightSongBeat = timing.GetBeatFromElapsedTime( fPositionSeconds + g_fLightsAheadSeconds ); m_fSongBeatNoOffset = timing.GetBeatFromElapsedTimeNoOffset( fPositionSeconds ); - Actor::SetBGMTime( fPositionSeconds, m_fSongBeatNoOffset ); m_fMusicSecondsVisible = fPositionSeconds - g_fVisualDelaySeconds.Get(); float fThrowAway; bool bThrowAway; timing.GetBeatAndBPSFromElapsedTime( m_fMusicSecondsVisible, m_fSongBeatVisible, fThrowAway, bThrowAway ); + Actor::SetBGMTime( m_fMusicSecondsVisible, m_fSongBeatVisible, fPositionSeconds, m_fSongBeatNoOffset ); // LOG->Trace( "m_fMusicSeconds = %f, m_fSongBeat = %f, m_fCurBPS = %f, m_bFreeze = %f", m_fMusicSeconds, m_fSongBeat, m_fCurBPS, m_bFreeze ); }