From 4c67970f1ac82fe1a78e293f68a46c2be1cba640 Mon Sep 17 00:00:00 2001 From: psperl Date: Wed, 27 Feb 2008 04:49:05 +0000 Subject: [PATCH] PJS: Welcome to TimeKeeper. Carms gaussians are not being sed momentarily. Needs testing. Framerate limiter and frame counting may want to be moved into TimeKeeper. git-svn-id: https://projectm.svn.sourceforge.net/svnroot/projectm/trunk@840 6778bc44-b910-0410-a7a0-be141de4315d --- src/projectM-engine/CMakeLists.txt | 4 +- src/projectM-engine/KeyHandler.cpp | 7 +- src/projectM-engine/PresetMerge.cpp | 5 +- src/projectM-engine/TimeKeeper.cpp | 79 +++++++++++++++++++++ src/projectM-engine/TimeKeeper.hpp | 56 +++++++++++++++ src/projectM-engine/projectM.cpp | 102 ++++++++++++---------------- src/projectM-engine/projectM.hpp | 22 ++---- src/projectM-engine/timer.cpp | 14 ++++ src/projectM-engine/timer.h | 2 + 9 files changed, 206 insertions(+), 85 deletions(-) create mode 100644 src/projectM-engine/TimeKeeper.cpp create mode 100644 src/projectM-engine/TimeKeeper.hpp diff --git a/src/projectM-engine/CMakeLists.txt b/src/projectM-engine/CMakeLists.txt index e753e57f5..13855c513 100644 --- a/src/projectM-engine/CMakeLists.txt +++ b/src/projectM-engine/CMakeLists.txt @@ -5,9 +5,9 @@ Func.cpp Eval.cpp PerFrameEqn.cpp PerPointEqn.cpp fftsg.cpp KeyHandler.cpp timer.cpp wipemalloc.cpp BuiltinFuncs.cpp BuiltinParams.cpp Renderer.cpp PresetLoader.cpp PresetChooser.cpp PresetFrameIO.cpp PresetMerge.cpp -ConfigFile.cpp IdlePreset.cpp TextureManager.cpp MoodBar.cpp image_DXT.c image_helper.c SOIL.c stb_image_aug.c) +ConfigFile.cpp IdlePreset.cpp TextureManager.cpp MoodBar.cpp image_DXT.c image_helper.c SOIL.c stb_image_aug.c TimeKeeper.cpp) -SET_TARGET_PROPERTIES(projectM PROPERTIES VERSION 1.10 SOVERSION 1) +SET_TARGET_PROPERTIES(projectM PROPERTIES VERSION 1.10 SOVERSION 2) ADD_DEFINITIONS(-DLINUX -DUSE_FBO -DSTBI_NO_DDS) ADD_DEFINITIONS(-DCMAKE_INSTALL_PREFIX="\\\"${CMAKE_INSTALL_PREFIX}\\\"") diff --git a/src/projectM-engine/KeyHandler.cpp b/src/projectM-engine/KeyHandler.cpp index 3d5c2f3a2..f079c8924 100755 --- a/src/projectM-engine/KeyHandler.cpp +++ b/src/projectM-engine/KeyHandler.cpp @@ -30,6 +30,7 @@ #include "PresetChooser.hpp" #include "Renderer.hpp" #include +#include "TimeKeeper.hpp" class Preset; @@ -179,7 +180,7 @@ void projectM::default_key_handler( projectMEvent event, projectMKeycode keycode m_activePreset = m_presetPos->allocate(this->presetInputs, this->presetOutputs); renderer->setPresetName(m_activePreset->presetName()); presetInputs.frame = 0; - smoothFrame = 0; + timeKeeper->StartPreset(); break; case PROJECTM_K_r: @@ -195,7 +196,7 @@ void projectM::default_key_handler( projectMEvent event, projectMKeycode keycode renderer->setPresetName(m_activePreset->presetName()); presetInputs.frame = 0; - smoothFrame = 0; + timeKeeper->StartPreset(); break; case PROJECTM_K_p: @@ -219,7 +220,7 @@ void projectM::default_key_handler( projectMEvent event, projectMKeycode keycode m_activePreset = m_presetPos->allocate(this->presetInputs, this->presetOutputs); renderer->setPresetName(m_activePreset->presetName()); presetInputs.frame = 0; - smoothFrame = 0; + timeKeeper->StartPreset(); break; case PROJECTM_K_l: renderer->noSwitch=!renderer->noSwitch; diff --git a/src/projectM-engine/PresetMerge.cpp b/src/projectM-engine/PresetMerge.cpp index 02d3ff192..b197745f5 100644 --- a/src/projectM-engine/PresetMerge.cpp +++ b/src/projectM-engine/PresetMerge.cpp @@ -3,10 +3,9 @@ #include void PresetMerger::MergePresets(PresetOutputs & A, PresetOutputs & B, double ratio, int gx, int gy) -{ - double invratio = ratio; - ratio = 1.0 - invratio; +{ +double invratio = 1.0 - ratio; //Merge Simple Waveforms // // All the mess is because of Waveform 7, which is two lines. diff --git a/src/projectM-engine/TimeKeeper.cpp b/src/projectM-engine/TimeKeeper.cpp new file mode 100644 index 000000000..f67e2db31 --- /dev/null +++ b/src/projectM-engine/TimeKeeper.cpp @@ -0,0 +1,79 @@ +#ifndef WIN32 +#include +#else +#endif /** !WIN32 */ +#include +#include "TimeKeeper.hpp" + + + +TimeKeeper::TimeKeeper(double presetDuration, double smoothDuration) + { + _presetDuration = presetDuration; + _smoothDuration = smoothDuration; + +#ifndef WIN32 + gettimeofday ( &this->startTime, NULL ); +#else + startTime = GetTickCount(); +#endif /** !WIN32 */ + + UpdateTimers(); + } + + void TimeKeeper::UpdateTimers() + { +#ifndef WIN32 + _currentTime = getTicks ( &startTime ) * 0.001; +#else + _currentTime = getTicks ( startTime ) * 0.001; +#endif /** !WIN32 */ + + } + + void TimeKeeper::StartPreset() + { + _isSmoothing = false; + _presetTimeA = _currentTime; + } + void TimeKeeper::StartSmoothing() + { + _isSmoothing = true; + _presetTimeB = _currentTime; + } + void TimeKeeper::EndSmoothing() + { + _isSmoothing = false; + _presetTimeA = _presetTimeB; + } + + bool TimeKeeper::CanHardCut() + { + return ((_currentTime - _presetTimeA) > HARD_CUT_DELAY); + } + + double TimeKeeper::SmoothRatio() + { + return (_currentTime - _presetTimeB) / _smoothDuration; + } + bool TimeKeeper::IsSmoothing() + { + return _isSmoothing; + } + + double TimeKeeper::GetRunningTime() + { + return _currentTime; + } + + double TimeKeeper::PresetProgressA() + { + if (_isSmoothing) return 1.0; + else return (_currentTime - _presetTimeA) / _presetDuration; + } + double TimeKeeper::PresetProgressB() + { + return (_currentTime - _presetTimeB) / _presetDuration; + } + + diff --git a/src/projectM-engine/TimeKeeper.hpp b/src/projectM-engine/TimeKeeper.hpp new file mode 100644 index 000000000..35ab64ede --- /dev/null +++ b/src/projectM-engine/TimeKeeper.hpp @@ -0,0 +1,56 @@ +#ifndef TimeKeeper_HPP +#define TimeKeeper_HPP + +#ifndef WIN32 +#include +#endif + +#include "timer.h" + +#define HARD_CUT_DELAY 3 + +class TimeKeeper +{ + +public: + + TimeKeeper(double presetDuration, double smoothDuration); + + void UpdateTimers(); + + void StartPreset(); + void StartSmoothing(); + void EndSmoothing(); + + bool CanHardCut(); + + double SmoothRatio(); + bool IsSmoothing(); + + double GetRunningTime(); + + double PresetProgressA(); + double PresetProgressB(); + + +#ifndef WIN32 + /* The first ticks value of the application */ + struct timeval startTime; +#else + long startTime; +#endif /** !WIN32 */ + +private: + + double _presetDuration; + double _smoothDuration; + + double _currentTime; + double _presetTimeA; + double _presetTimeB; + + bool _isSmoothing; + + +}; +#endif diff --git a/src/projectM-engine/projectM.cpp b/src/projectM-engine/projectM.cpp index f62ef9cd1..c1a9ddbda 100755 --- a/src/projectM-engine/projectM.cpp +++ b/src/projectM-engine/projectM.cpp @@ -62,7 +62,7 @@ #include "ConfigFile.h" #include "TextureManager.hpp" #include "RandomNumberGenerators.hpp" - +#include "TimeKeeper.hpp" /* DLLEXPORT projectM::projectM ( int gx, int gy, int fps, int texsize, int width, int height, std::string preset_url,std::string title_fonturl, std::string title_menuurl ) :beatDetect ( 0 ), renderer ( 0 ), settings.presetURL ( preset_url ), title_fontURL ( title_fonturl ), menu_fontURL ( menu_fontURL ), smoothFrame ( 0 ), m_presetQueuePos(0) @@ -100,7 +100,7 @@ DLLEXPORT void projectM::projectM_resetTextures() } DLLEXPORT projectM::projectM ( std::string config_file ) : - beatDetect ( 0 ), renderer ( 0 ), smoothFrame ( 0 ), m_presetQueuePos(0), oldFrame(1), _pcm(0) + beatDetect ( 0 ), renderer ( 0 ), m_presetQueuePos(0), oldFrame(1), _pcm(0) { readConfig ( config_file ); projectM_reset(); @@ -189,18 +189,16 @@ DLLEXPORT void projectM::renderFrame() int x, y; #endif - mspf= ( int ) ( 1000.0/ ( float ) presetInputs.fps ); //milliseconds per frame + timeKeeper->UpdateTimers(); -#ifndef WIN32 - presetInputs.time = getTicks ( &startTime ) * 0.001; -#else - presetInputs.time = getTicks ( startTime ) * 0.001; -#endif /** !WIN32 */ + //printf("A:%f, B:%f, S:%f\n", timeKeeper->PresetProgressA(), timeKeeper->PresetProgressB(), timeKeeper->SmoothRatio()); + mspf= ( int ) ( 1000.0/ ( float ) presetInputs.fps ); //milliseconds per frame presetInputs.ResetMesh(); beatDetect->detectFromSamples(); + presetInputs.time = timeKeeper->GetRunningTime(); presetInputs.bass = beatDetect->bass; presetInputs.mid = beatDetect->mid; presetInputs.treb = beatDetect->treb; @@ -212,46 +210,46 @@ DLLEXPORT void projectM::renderFrame() if ( renderer->noSwitch==false && !m_presetChooser->empty() ) { - if ( presetInputs.progress>1.0 ) + if ( presetInputs.progress>=1.0 ) { + oldFrame = presetInputs.frame; - presetInputs.progress=0.0; - presetInputs.frame = 1; - + timeKeeper->StartSmoothing(); + ///printf("Start Smooth\n"); + // if(timeKeeper->IsSmoothing())printf("Confirmed\n"); switchPreset(m_activePreset2, presetInputs, &m_activePreset->presetOutputs() == &presetOutputs ? presetOutputs2 : presetOutputs); - - smoothFrame = ( int ) ( presetInputs.fps * _settings.smoothPresetDuration); + presetSwitchedEvent(false, **m_presetPos); } - else if ( ( beatDetect->vol-beatDetect->vol_old>beatDetect->beat_sensitivity ) && nohard<0 ) + else if ( ( beatDetect->vol-beatDetect->vol_old>beatDetect->beat_sensitivity ) && timeKeeper->CanHardCut() ) { - + // printf("Hard Cut\n"); switchPreset(m_activePreset, presetInputs, presetOutputs); - smoothFrame=0; - presetInputs.progress=0.0; + timeKeeper->StartPreset(); + presetInputs.progress=timeKeeper->PresetProgressA(); presetInputs.frame = 1; presetSwitchedEvent(true, **m_presetPos); - } - else nohard--; + } } - if ( smoothFrame > 1 && !m_presetChooser->empty() ) + if ( timeKeeper->IsSmoothing() && timeKeeper->SmoothRatio() <= 1.0 && !m_presetChooser->empty() ) { + // printf("Smooth: \n", timeKeeper->SmoothRatio()); int frame = ++presetInputs.frame; presetInputs.frame = ++oldFrame; - presetInputs.progress= 1.0; + presetInputs.progress= timeKeeper->PresetProgressA(); assert ( m_activePreset.get() ); m_activePreset->evaluateFrame(); renderer->PerPixelMath ( &m_activePreset->presetOutputs(), &presetInputs ); renderer->WaveformMath ( &m_activePreset->presetOutputs(), &presetInputs, true ); presetInputs.frame = frame; - presetInputs.progress= frame / ( float ) avgtime; + presetInputs.progress= timeKeeper->PresetProgressB(); assert ( m_activePreset2.get() ); m_activePreset2->evaluateFrame(); renderer->PerPixelMath ( &m_activePreset2->presetOutputs(), &presetInputs ); @@ -259,24 +257,22 @@ DLLEXPORT void projectM::renderFrame() //double pos = -((smoothFrame / (presetInputs.fps * smoothDuration))-1); //double ratio = 1/(1 + exp((pos-0.5)*4*M_PI)); - double ratio = smoothFrame / ( presetInputs.fps * (double)settings().smoothPresetDuration); - PresetMerger::MergePresets ( m_activePreset->presetOutputs(),m_activePreset2->presetOutputs(),ratio,presetInputs.gx, presetInputs.gy ); - - smoothFrame--; + + PresetMerger::MergePresets ( m_activePreset->presetOutputs(),m_activePreset2->presetOutputs(),timeKeeper->SmoothRatio(),presetInputs.gx, presetInputs.gy ); } else { - if ( smoothFrame == 1 ) + if ( timeKeeper->IsSmoothing() && timeKeeper->SmoothRatio() > 1.0 ) { - m_activePreset = m_activePreset2; - smoothFrame=0; - avgtime = sampledPresetDuration();// + //printf("End Smooth\n"); + m_activePreset = m_activePreset2; + timeKeeper->EndSmoothing(); } - + //printf("Normal\n"); presetInputs.frame++; //number of frames for current preset - presetInputs.progress= presetInputs.frame/ ( float ) avgtime; + presetInputs.progress= timeKeeper->PresetProgressA(); m_activePreset->evaluateFrame(); renderer->PerPixelMath ( &m_activePreset->presetOutputs(), &presetInputs ); @@ -295,11 +291,11 @@ DLLEXPORT void projectM::renderFrame() /** Compute once per preset */ if ( this->count%100==0 ) { - this->renderer->realfps=100.0/ ( ( getTicks ( &this->startTime )-this->fpsstart ) /1000 ); - this->fpsstart=getTicks ( &this->startTime ); + this->renderer->realfps=100.0/ ( ( getTicks ( &timeKeeper->startTime )-this->fpsstart ) /1000 ); + this->fpsstart=getTicks ( &timeKeeper->startTime ); } - int timediff = getTicks ( &this->startTime )-this->timestart; + int timediff = getTicks ( &timeKeeper->startTime )-this->timestart; if ( timediff < this->mspf ) { @@ -310,7 +306,7 @@ DLLEXPORT void projectM::renderFrame() { if ( usleep ( sleepTime ) != 0 ) {}} } - this->timestart=getTicks ( &this->startTime ); + this->timestart=getTicks ( &timeKeeper->startTime ); #endif /** !WIN32 */ @@ -322,18 +318,12 @@ void projectM::projectM_reset() /** Default variable settings */ this->wvw = 512; - this->wvh = 512; - - - /** Frames per preset */ - this->avgtime = sampledPresetDuration(); - + this->wvh = 512; /** More other stuff */ this->mspf = 0; this->timed = 0; - this->timestart = 0; - this->nohard = 0; + this->timestart = 0; this->count = 0; this->fpsstart = 0; @@ -352,11 +342,7 @@ void projectM::projectM_init ( int gx, int gy, int fps, int texsize, int width, presetOutputs2.Initialize ( gx, gy ); /** Initialise start time */ -#ifndef WIN32 - gettimeofday ( &this->startTime, NULL ); -#else - startTime = GetTickCount(); -#endif /** !WIN32 */ + timeKeeper = new TimeKeeper(_settings.presetDuration,_settings.smoothPresetDuration); /** Nullify frame stash */ @@ -365,7 +351,7 @@ void projectM::projectM_init ( int gx, int gy, int fps, int texsize, int width, presetInputs.fps = fps; - this->nohard=fps*5; + /** We need to initialise this before the builtin param db otherwise bass/mid etc won't bind correctly */ assert ( !beatDetect ); @@ -376,13 +362,10 @@ void projectM::projectM_init ( int gx, int gy, int fps, int texsize, int width, beatDetect = new BeatDetect ( _pcm ); initPresetTools(); - if ( presetInputs.fps > 0 ) mspf= ( int ) ( 1000.0/ ( float ) presetInputs.fps ); else mspf = 0; - - - this->avgtime= sampledPresetDuration(); + this->presetInputs.gx = gx; this->presetInputs.gy = gy; @@ -390,7 +373,7 @@ void projectM::projectM_init ( int gx, int gy, int fps, int texsize, int width, renderer->setPresetName ( m_activePreset->presetName() ); - + timeKeeper->StartPreset(); assert(pcm()); // printf ( "exiting projectM_init()\n" ); } @@ -448,9 +431,7 @@ void projectM::projectM_initengine() this->presetInputs.progress = 0; - this->presetInputs.frame = 1; - - this->avgtime = sampledPresetDuration(); + this->presetInputs.frame = 1; //bass_thresh = 0; /* PER_FRAME CONSTANTS END */ @@ -781,7 +762,7 @@ void projectM::selectPreset ( unsigned int index ) renderer->setPresetName ( m_activePreset->presetName() ); presetInputs.frame = 0; - smoothFrame = 0; + timeKeeper->StartPreset(); } void projectM::switchPreset(std::auto_ptr & targetPreset, const PresetInputs & inputs, PresetOutputs & outputs) { @@ -801,6 +782,7 @@ void projectM::switchPreset(std::auto_ptr & targetPreset, const PresetIn // Set preset name here- event is not done because at the moment this function is oblivious to smooth/hard switches renderer->setPresetName ( targetPreset->presetName() ); + } diff --git a/src/projectM-engine/projectM.hpp b/src/projectM-engine/projectM.hpp index 5295f6261..224df6256 100755 --- a/src/projectM-engine/projectM.hpp +++ b/src/projectM-engine/projectM.hpp @@ -57,10 +57,6 @@ #ifdef WIN322 #define inline #endif /** WIN32 */ -#ifndef WIN32 -#include -#else -#endif /** !WIN32 */ #include "dlldefs.h" #include "event.h" @@ -78,6 +74,7 @@ class Preset; class PresetIterator; class PresetChooser; class PresetLoader; +class TimeKeeper; //class PresetInputs; //class PresetOutputs; @@ -223,25 +220,14 @@ private: BeatDetect * beatDetect; Renderer *renderer; Settings _settings; - int smoothFrame; -#ifndef WIN32 - /* The first ticks value of the application */ - struct timeval startTime; -#else - long startTime; -#endif /** !WIN32 */ - int wvw; //windowed dimensions int wvh; - - int avgtime; //# frames per preset - + /** Timing information */ int mspf; int timed; - int timestart; - int nohard; + int timestart; int count; float fpsstart; @@ -287,6 +273,8 @@ private: /// A preset outputs container used for smooth preset switching PresetOutputs presetOutputs2; + TimeKeeper *timeKeeper; + PCM * _pcm; int oldFrame;// = 1; diff --git a/src/projectM-engine/timer.cpp b/src/projectM-engine/timer.cpp index e9e1dafc7..7a4ca81a6 100755 --- a/src/projectM-engine/timer.cpp +++ b/src/projectM-engine/timer.cpp @@ -37,8 +37,22 @@ unsigned int getTicks( struct timeval *start ) { ticks=(now.tv_sec-start->tv_sec)*1000+(now.tv_usec-start->tv_usec)/1000; return(ticks); } +struct timeval GetCurrentTime() + { + struct timeval now; + gettimeofday (&now, NULL ); + return now; + } #else unsigned int getTicks( long start ) { return GetTickCount() - start; } + +long GetCurrentTime() +{ + return GetTickCount(); +} #endif /** !WIN32 */ + + + diff --git a/src/projectM-engine/timer.h b/src/projectM-engine/timer.h index 2c797593f..6bbabdf9d 100755 --- a/src/projectM-engine/timer.h +++ b/src/projectM-engine/timer.h @@ -41,9 +41,11 @@ #ifndef WIN32 #include unsigned int getTicks( struct timeval *start ); +struct timeval GetCurrentTime(); #else #include unsigned int getTicks( long start ); +long GetCurrentTime(); #endif /** !WIN32 */ #endif /** _TIMER_H */