Autosync Song + Split Timing = Happy Players! :D

The solution: use actual objects, not references.

Big thanks to Edgars Klepers for the hint.
This commit is contained in:
Jason Felds
2011-05-26 22:00:37 -04:00
parent 5838313614
commit f01763598d
2 changed files with 14 additions and 31 deletions
+13 -27
View File
@@ -43,8 +43,7 @@
#include "ScreenManager.h" #include "ScreenManager.h"
#include "Foreach.h" #include "Foreach.h"
TimingData *AdjustSync::s_pTimingDataOriginal = NULL; vector<TimingData> AdjustSync::s_vpTimingDataOriginal;
vector<TimingData *> AdjustSync::s_vpTimingDataOriginal;
float AdjustSync::s_fGlobalOffsetSecondsOriginal = 0.0f; float AdjustSync::s_fGlobalOffsetSecondsOriginal = 0.0f;
int AdjustSync::s_iAutosyncOffsetSample = 0; int AdjustSync::s_iAutosyncOffsetSample = 0;
float AdjustSync::s_fAutosyncOffset[AdjustSync::OFFSET_SAMPLE_COUNT]; float AdjustSync::s_fAutosyncOffset[AdjustSync::OFFSET_SAMPLE_COUNT];
@@ -56,34 +55,21 @@ int AdjustSync::s_iStepsFiltered = 0;
void AdjustSync::ResetOriginalSyncData() void AdjustSync::ResetOriginalSyncData()
{ {
// TODO: Reset the vector if not in a song? s_vpTimingDataOriginal.clear();
if( s_vpTimingDataOriginal.empty() )
{
s_pTimingDataOriginal = new TimingData;
s_vpTimingDataOriginal.clear(); // sanity check for now.
s_vpTimingDataOriginal.push_back(new TimingData());
}
if( GAMESTATE->m_pCurSong ) if( GAMESTATE->m_pCurSong )
{ {
*s_pTimingDataOriginal = GAMESTATE->m_pCurSong->m_SongTiming;
// Deal with the vector code here. s_vpTimingDataOriginal.push_back(GAMESTATE->m_pCurSong->m_SongTiming);
s_vpTimingDataOriginal.clear();
s_vpTimingDataOriginal.push_back(&GAMESTATE->m_pCurSong->m_SongTiming);
// Loop through the steps.
const vector<Steps *>& vpSteps = GAMESTATE->m_pCurSong->GetAllSteps(); const vector<Steps *>& vpSteps = GAMESTATE->m_pCurSong->GetAllSteps();
FOREACH( Steps*, const_cast<vector<Steps *>&>(vpSteps), s ) FOREACH( Steps*, const_cast<vector<Steps *>&>(vpSteps), s )
{ {
/* Capture each Step's timing data in the vector. s_vpTimingDataOriginal.push_back((*s)->m_Timing);
* TODO: Make this less ugly. */
s_vpTimingDataOriginal.push_back(&(*s)->m_Timing);
} }
} }
else else
{ {
s_vpTimingDataOriginal.clear(); s_vpTimingDataOriginal.push_back(TimingData());
s_vpTimingDataOriginal.push_back(new TimingData());
*s_pTimingDataOriginal = TimingData();
} }
s_fGlobalOffsetSecondsOriginal = PREFSMAN->m_fGlobalOffsetSeconds; s_fGlobalOffsetSecondsOriginal = PREFSMAN->m_fGlobalOffsetSeconds;
@@ -114,7 +100,7 @@ void AdjustSync::SaveSyncChanges()
/* TODO: Save all of the timing data changes. /* TODO: Save all of the timing data changes.
* Luckily, only the song timing data needs comparing here. */ * Luckily, only the song timing data needs comparing here. */
if( GAMESTATE->m_pCurSong && *s_vpTimingDataOriginal[0] != GAMESTATE->m_pCurSong->m_SongTiming ) if( GAMESTATE->m_pCurSong && s_vpTimingDataOriginal[0] != GAMESTATE->m_pCurSong->m_SongTiming )
{ {
if( GAMESTATE->IsEditing() ) if( GAMESTATE->IsEditing() )
{ {
@@ -139,13 +125,13 @@ void AdjustSync::RevertSyncChanges()
PREFSMAN->m_fGlobalOffsetSeconds.Set( s_fGlobalOffsetSecondsOriginal ); PREFSMAN->m_fGlobalOffsetSeconds.Set( s_fGlobalOffsetSecondsOriginal );
// The first one is ALWAYS the song timing. // The first one is ALWAYS the song timing.
GAMESTATE->m_pCurSong->m_SongTiming = *s_vpTimingDataOriginal[0]; GAMESTATE->m_pCurSong->m_SongTiming = s_vpTimingDataOriginal[0];
unsigned location = 1; unsigned location = 1;
const vector<Steps *>& vpSteps = GAMESTATE->m_pCurSong->GetAllSteps(); const vector<Steps *>& vpSteps = GAMESTATE->m_pCurSong->GetAllSteps();
FOREACH( Steps*, const_cast<vector<Steps *>&>(vpSteps), s ) FOREACH( Steps*, const_cast<vector<Steps *>&>(vpSteps), s )
{ {
(*s)->m_Timing = *s_vpTimingDataOriginal[location]; (*s)->m_Timing = s_vpTimingDataOriginal[location];
location++; location++;
} }
@@ -339,11 +325,11 @@ void AdjustSync::GetSyncChangeTextSong( vector<RString> &vsAddTo )
if( GAMESTATE->m_pCurSong.Get() ) if( GAMESTATE->m_pCurSong.Get() )
{ {
unsigned int iOriginalSize = vsAddTo.size(); unsigned int iOriginalSize = vsAddTo.size();
TimingData *original = s_vpTimingDataOriginal[0]; TimingData original = s_vpTimingDataOriginal[0];
TimingData &testing = GAMESTATE->m_pCurSong->m_SongTiming; TimingData &testing = GAMESTATE->m_pCurSong->m_SongTiming;
{ {
float fOld = Quantize( (*original).m_fBeat0OffsetInSeconds, 0.001f ); float fOld = Quantize( original.m_fBeat0OffsetInSeconds, 0.001f );
float fNew = Quantize( testing.m_fBeat0OffsetInSeconds, 0.001f ); float fNew = Quantize( testing.m_fBeat0OffsetInSeconds, 0.001f );
float fDelta = fNew - fOld; float fDelta = fNew - fOld;
@@ -359,7 +345,7 @@ void AdjustSync::GetSyncChangeTextSong( vector<RString> &vsAddTo )
for( unsigned i=0; i< testing.m_BPMSegments.size(); i++ ) for( unsigned i=0; i< testing.m_BPMSegments.size(); i++ )
{ {
float fOld = Quantize( (*original).m_BPMSegments[i].GetBPM(), 0.001f ); float fOld = Quantize( original.m_BPMSegments[i].GetBPM(), 0.001f );
float fNew = Quantize( testing.m_BPMSegments[i].GetBPM(), 0.001f ); float fNew = Quantize( testing.m_BPMSegments[i].GetBPM(), 0.001f );
float fDelta = fNew - fOld; float fDelta = fNew - fOld;
@@ -380,7 +366,7 @@ void AdjustSync::GetSyncChangeTextSong( vector<RString> &vsAddTo )
for( unsigned i=0; i< testing.m_StopSegments.size(); i++ ) for( unsigned i=0; i< testing.m_StopSegments.size(); i++ )
{ {
float fOld = Quantize( (*original).m_StopSegments[i].m_fStopSeconds, 0.001f ); float fOld = Quantize( original.m_StopSegments[i].m_fStopSeconds, 0.001f );
float fNew = Quantize( testing.m_StopSegments[i].m_fStopSeconds, 0.001f ); float fNew = Quantize( testing.m_StopSegments[i].m_fStopSeconds, 0.001f );
float fDelta = fNew - fOld; float fDelta = fNew - fOld;
+1 -4
View File
@@ -13,14 +13,11 @@ class TimingData;
class AdjustSync class AdjustSync
{ {
public: public:
/** @brief The original TimingData before adjustments are made. */
static TimingData *s_pTimingDataOriginal;
/** /**
* @brief The original TimingData before adjustments were made. * @brief The original TimingData before adjustments were made.
* *
* This is designed to work with Split Timing. */ * This is designed to work with Split Timing. */
static vector<TimingData *> s_vpTimingDataOriginal; static vector<TimingData> s_vpTimingDataOriginal;
static float s_fGlobalOffsetSecondsOriginal; static float s_fGlobalOffsetSecondsOriginal;
/* We only want to call the Reset methods before a song, not immediately after /* We only want to call the Reset methods before a song, not immediately after