From 3ff9a2376acccb5dd3cde4920abf350de741ab46 Mon Sep 17 00:00:00 2001 From: Jason Felds Date: Thu, 19 May 2011 13:58:17 -0400 Subject: [PATCH] AdjustSync Song is conceptually better. Needs review and assistance. Does NOT cover tempo adjustments yet. --- src/AdjustSync.cpp | 49 ++++++++++++++++++++++++++++++++++++---------- src/AdjustSync.h | 3 ++- 2 files changed, 41 insertions(+), 11 deletions(-) diff --git a/src/AdjustSync.cpp b/src/AdjustSync.cpp index 9976311e0a..b3a7fe4d5e 100644 --- a/src/AdjustSync.cpp +++ b/src/AdjustSync.cpp @@ -43,7 +43,7 @@ #include "ScreenManager.h" #include "Foreach.h" -TimingData *AdjustSync::s_pTimingDataOriginal = NULL; +vector AdjustSync::s_vTimingDataOriginal; float AdjustSync::s_fGlobalOffsetSecondsOriginal = 0.0f; int AdjustSync::s_iAutosyncOffsetSample = 0; float AdjustSync::s_fAutosyncOffset[AdjustSync::OFFSET_SAMPLE_COUNT]; @@ -55,13 +55,31 @@ int AdjustSync::s_iStepsFiltered = 0; void AdjustSync::ResetOriginalSyncData() { - if( s_pTimingDataOriginal == NULL ) - s_pTimingDataOriginal = new TimingData; + if( s_vTimingDataOriginal.empty() ) + s_vTimingDataOriginal.push_back(new TimingData); + else if( s_vTimingDataOriginal[0] == NULL ) + s_vTimingDataOriginal[0] = new TimingData; + + s_vTimingDataOriginal.resize(1); + const vector& vpSteps = GAMESTATE->m_pCurSong->GetAllSteps(); if( GAMESTATE->m_pCurSong ) - *s_pTimingDataOriginal = GAMESTATE->m_pCurSong->m_SongTiming; + { + s_vTimingDataOriginal.push_back(&GAMESTATE->m_pCurSong->m_SongTiming); + FOREACH( Steps*, const_cast&>(vpSteps), s ) + { + s_vTimingDataOriginal.push_back(&(*s)->m_Timing); + } + } else - *s_pTimingDataOriginal = TimingData(); + { + s_vTimingDataOriginal.push_back(new TimingData); + FOREACH( Steps*, const_cast&>(vpSteps), s ) + { + s_vTimingDataOriginal.push_back( new TimingData ); + } + + } s_fGlobalOffsetSecondsOriginal = PREFSMAN->m_fGlobalOffsetSeconds; ResetAutosync(); @@ -71,6 +89,7 @@ void AdjustSync::ResetAutosync() { s_iAutosyncOffsetSample = 0; s_vAutosyncTempoData.clear(); + // TODO: Add a call to s_vTimingDataOriginal? } bool AdjustSync::IsSyncDataChanged() @@ -88,7 +107,7 @@ void AdjustSync::SaveSyncChanges() { if( GAMESTATE->IsCourseMode() ) return; - if( GAMESTATE->m_pCurSong && *s_pTimingDataOriginal != GAMESTATE->m_pCurSong->m_SongTiming ) + if( GAMESTATE->m_pCurSong && *s_vTimingDataOriginal[0] != GAMESTATE->m_pCurSong->m_SongTiming ) { if( GAMESTATE->IsEditing() ) { @@ -111,7 +130,15 @@ void AdjustSync::RevertSyncChanges() if( GAMESTATE->IsCourseMode() ) return; PREFSMAN->m_fGlobalOffsetSeconds.Set( s_fGlobalOffsetSecondsOriginal ); - GAMESTATE->m_pCurSong->m_SongTiming = *s_pTimingDataOriginal; + GAMESTATE->m_pCurSong->m_SongTiming = *s_vTimingDataOriginal[0]; + const vector& vpSteps = GAMESTATE->m_pCurSong->GetAllSteps(); + + unsigned index = 1; + FOREACH( Steps*, const_cast&>(vpSteps), s ) + { + (*s)->m_Timing = *s_vTimingDataOriginal[index]; + index++; + } ResetOriginalSyncData(); s_fStandardDeviation = 0.0f; s_fAverageError = 0.0f; @@ -223,6 +250,8 @@ void AdjustSync::AutosyncTempo() s_vAutosyncTempoData.clear(); return; } + + // TODO: Make this work with Steps timing. if( s_fAverageError < ERROR_TOO_HIGH ) { @@ -303,7 +332,7 @@ void AdjustSync::GetSyncChangeTextSong( vector &vsAddTo ) unsigned int iOriginalSize = vsAddTo.size(); { - float fOld = Quantize( AdjustSync::s_pTimingDataOriginal->m_fBeat0OffsetInSeconds, 0.001f ); + float fOld = Quantize( AdjustSync::s_vTimingDataOriginal[0]->m_fBeat0OffsetInSeconds, 0.001f ); float fNew = Quantize( GAMESTATE->m_pCurSong->m_SongTiming.m_fBeat0OffsetInSeconds, 0.001f ); float fDelta = fNew - fOld; @@ -319,7 +348,7 @@ void AdjustSync::GetSyncChangeTextSong( vector &vsAddTo ) for( unsigned i=0; im_pCurSong->m_SongTiming.m_BPMSegments.size(); i++ ) { - float fOld = Quantize( AdjustSync::s_pTimingDataOriginal->m_BPMSegments[i].GetBPM(), 0.001f ); + float fOld = Quantize( AdjustSync::s_vTimingDataOriginal[0]->m_BPMSegments[i].GetBPM(), 0.001f ); float fNew = Quantize( GAMESTATE->m_pCurSong->m_SongTiming.m_BPMSegments[i].GetBPM(), 0.001f ); float fDelta = fNew - fOld; @@ -340,7 +369,7 @@ void AdjustSync::GetSyncChangeTextSong( vector &vsAddTo ) for( unsigned i=0; im_pCurSong->m_SongTiming.m_StopSegments.size(); i++ ) { - float fOld = Quantize( AdjustSync::s_pTimingDataOriginal->m_StopSegments[i].m_fStopSeconds, 0.001f ); + float fOld = Quantize( AdjustSync::s_vTimingDataOriginal[0]->m_StopSegments[i].m_fStopSeconds, 0.001f ); float fNew = Quantize( GAMESTATE->m_pCurSong->m_SongTiming.m_StopSegments[i].m_fStopSeconds, 0.001f ); float fDelta = fNew - fOld; diff --git a/src/AdjustSync.h b/src/AdjustSync.h index 10a0810bd3..7ec03dd13f 100644 --- a/src/AdjustSync.h +++ b/src/AdjustSync.h @@ -13,7 +13,8 @@ class TimingData; class AdjustSync { public: - static TimingData *s_pTimingDataOriginal; + /** @brief The original timing data for the Song and Steps. */ + static vector s_vTimingDataOriginal; static float s_fGlobalOffsetSecondsOriginal; /* We only want to call the Reset methods before a song, not immediately after * a song. If we reset it at the end of a song, we have to carefully check