From 2bb3c8464901451c6d138fa69c700445f2924a42 Mon Sep 17 00:00:00 2001 From: w1z7ard Date: Mon, 3 Aug 2009 03:57:23 +0000 Subject: [PATCH] smooth preset switching hot keys of N/P/R. git-svn-id: https://projectm.svn.sourceforge.net/svnroot/projectm/trunk@1257 6778bc44-b910-0410-a7a0-be141de4315d --- src/libprojectM/KeyHandler.cpp | 137 +++++++++++++++++++--------- src/libprojectM/PresetChooser.hpp | 21 +++++ src/libprojectM/projectM.cpp | 32 ++----- src/libprojectM/projectM.hpp | 3 + src/projectM-qt/qprojectmwidget.hpp | 19 +++- 5 files changed, 142 insertions(+), 70 deletions(-) diff --git a/src/libprojectM/KeyHandler.cpp b/src/libprojectM/KeyHandler.cpp index 528021fcb..1e8d3aff9 100755 --- a/src/libprojectM/KeyHandler.cpp +++ b/src/libprojectM/KeyHandler.cpp @@ -37,6 +37,10 @@ class Preset; interface_t current_interface = DEFAULT_INTERFACE; +void selectRandom(const bool hardCut); +void selectNext(const bool hardCut); +void selectPrevious(const bool hardCut); + void refreshConsole() { switch (current_interface) { @@ -166,53 +170,22 @@ void projectM::default_key_handler( projectMEvent event, projectMKeycode keycode case PROJECTM_K_b: break; case PROJECTM_K_n: - m_presetChooser->nextPreset(*m_presetPos); - presetSwitchedEvent(true, **m_presetPos); - m_activePreset = m_presetPos->allocate(); - renderer->SetPipeline(m_activePreset->pipeline()); - renderer->setPresetName(m_activePreset->name()); - timeKeeper->StartPreset(); + selectNext(true); + break; + case PROJECTM_K_N: + selectNext(false); break; - case PROJECTM_K_r: - - if (m_presetChooser->empty()) - break; - - *m_presetPos = m_presetChooser->weightedRandom(); - presetSwitchedEvent(true, **m_presetPos); - m_activePreset = m_presetPos->allocate(); - renderer->SetPipeline(m_activePreset->pipeline()); - assert(m_activePreset.get()); - - renderer->setPresetName(m_activePreset->name()); - - timeKeeper->StartPreset(); + selectRandom(true); + break; + case PROJECTM_K_R: + selectRandom(false); break; case PROJECTM_K_p: - - if (m_presetChooser->empty()) - break; - - // Case: idle preset currently running, selected last preset of chooser - else if (*m_presetPos == m_presetChooser->end()) { - --(*m_presetPos); - } - - else if (*m_presetPos != m_presetChooser->begin()) { - --(*m_presetPos); - } - - else { - *m_presetPos = m_presetChooser->end(); - --(*m_presetPos); - } - - m_activePreset = m_presetPos->allocate(); - renderer->SetPipeline(m_activePreset->pipeline()); - renderer->setPresetName(m_activePreset->name()); - - timeKeeper->StartPreset(); + selectPrevious(true); + break; + case PROJECTM_K_P: + selectPrevious(false); break; case PROJECTM_K_l: renderer->noSwitch=!renderer->noSwitch; @@ -243,4 +216,82 @@ void projectM::default_key_handler( projectMEvent event, projectMKeycode keycode break; } + + + + +} + +void projectM::selectRandom(const bool hardCut) { + + if (m_presetChooser->empty()) + return; + + if (!hardCut) { + timeKeeper->StartSmoothing(); + } + + *m_presetPos = m_presetChooser->weightedRandom(); + + if (!hardCut) { + switchPreset(m_activePreset2); + } else { + switchPreset(m_activePreset); + timeKeeper->StartPreset(); + } + + presetSwitchedEvent(hardCut, **m_presetPos); + +} + +void projectM::selectPrevious(const bool hardCut) { + + if (m_presetChooser->empty()) + return; + + if (!hardCut) { + timeKeeper->StartSmoothing(); + } + + m_presetChooser->previousPreset(*m_presetPos); + + if (!hardCut) { + switchPreset(m_activePreset2); + } else { + switchPreset(m_activePreset); + timeKeeper->StartPreset(); + } + + presetSwitchedEvent(hardCut, **m_presetPos); + +// m_activePreset = m_presetPos->allocate(); +// renderer->SetPipeline(m_activePreset->pipeline()); +// renderer->setPresetName(m_activePreset->name()); + + //timeKeeper->StartPreset(); + +} + +void projectM::selectNext(const bool hardCut) { + + if (m_presetChooser->empty()) + return; + + if (!hardCut) { + timeKeeper->StartSmoothing(); + std::cout << "start smoothing" << std::endl; + } + + std::cout << "getting next preset" << std::endl; + m_presetChooser->nextPreset(*m_presetPos); + + if (!hardCut) { + switchPreset(m_activePreset2); + } else { + switchPreset(m_activePreset); + timeKeeper->StartPreset(); + } + presetSwitchedEvent(hardCut, **m_presetPos); + + } diff --git a/src/libprojectM/PresetChooser.hpp b/src/libprojectM/PresetChooser.hpp index 20cb3a8cf..26d54bb30 100644 --- a/src/libprojectM/PresetChooser.hpp +++ b/src/libprojectM/PresetChooser.hpp @@ -95,6 +95,7 @@ public: inline void nextPreset(PresetIterator & presetPos); + inline void previousPreset(PresetIterator & presetPos); private: @@ -160,6 +161,26 @@ inline void PresetChooser::nextPreset(PresetIterator & presetPos) { } + +inline void PresetChooser::previousPreset(PresetIterator & presetPos) { + if (this->empty()) + return; + + // Case: idle preset currently running, selected last preset of chooser + else if (presetPos == this->end()) { + --(presetPos); + } + + else if (presetPos != this->begin()) { + --(presetPos); + } + + else { + presetPos = this->end(); + --(presetPos); + } +} + inline PresetIterator PresetChooser::begin() { PresetIterator pos(0); pos.setChooser(*this); diff --git a/src/libprojectM/projectM.cpp b/src/libprojectM/projectM.cpp index 4c2693135..708158180 100755 --- a/src/libprojectM/projectM.cpp +++ b/src/libprojectM/projectM.cpp @@ -326,28 +326,21 @@ static void *thread_callback(void *prjm) { if ( timeKeeper->PresetProgressA()>=1.0 && !timeKeeper->IsSmoothing()) { - timeKeeper->StartSmoothing(); - switchPreset(m_activePreset2); + if (settings().shuffleEnabled) + selectRandom(false); + else + selectNext(false); - // Compute best matching between the render items. - /* - (*_matcher)(m_activePreset.get()->pipeline().drawables, - m_activePreset2.get()->pipeline().drawables); - */ - presetSwitchedEvent(false, **m_presetPos); - } + } else if ((beatDetect->vol-beatDetect->vol_old>beatDetect->beat_sensitivity ) && timeKeeper->CanHardCut()) { // printf("Hard Cut\n"); - - switchPreset(m_activePreset); - - //fz(m_activePreset, presetInputs, presetOutputs); - - timeKeeper->StartPreset(); - presetSwitchedEvent(true, **m_presetPos); + if (settings().shuffleEnabled) + selectRandom(true); + else + selectNext(true); } } @@ -685,15 +678,10 @@ static void *thread_callback(void *prjm) { void projectM::switchPreset(std::auto_ptr & targetPreset) { - if (_settings.shuffleEnabled) - *m_presetPos = m_presetChooser->weightedRandom(); - else - m_presetChooser->nextPreset(*m_presetPos); - targetPreset = m_presetPos->allocate(); // Set preset name here- event is not done because at the moment this function is oblivious to smooth/hard switches - renderer->setPresetName ( targetPreset->name() ); + renderer->setPresetName(targetPreset->name()); renderer->SetPipeline(targetPreset->pipeline()); } diff --git a/src/libprojectM/projectM.hpp b/src/libprojectM/projectM.hpp index 0889d3832..6151c72b9 100755 --- a/src/libprojectM/projectM.hpp +++ b/src/libprojectM/projectM.hpp @@ -276,6 +276,9 @@ private: void readSettings(const Settings &settings); void projectM_init(int gx, int gy, int fps, int texsize, int width, int height); void projectM_reset(); + void selectPrevious(const bool); + void selectNext(const bool); + void selectRandom(const bool); void projectM_initengine(); void projectM_resetengine(); diff --git a/src/projectM-qt/qprojectmwidget.hpp b/src/projectM-qt/qprojectmwidget.hpp index 7807afa3b..2b16b28d4 100644 --- a/src/projectM-qt/qprojectmwidget.hpp +++ b/src/projectM-qt/qprojectmwidget.hpp @@ -177,17 +177,26 @@ class QProjectMWidget : public QGLWidget pkey = PROJECTM_K_F1; break; case Qt::Key_R: - pkey = PROJECTM_K_r; - break; + if (e->modifiers() & Qt::ShiftModifier) + pkey = PROJECTM_K_R; + else + pkey = PROJECTM_K_r; + break; case Qt::Key_L: pkey = PROJECTM_K_l; ignore = true; break; - case Qt::Key_N: - pkey = PROJECTM_K_n; + case Qt::Key_N: + if (e->modifiers() & Qt::ShiftModifier) + pkey = PROJECTM_K_N; + else + pkey = PROJECTM_K_n; break; case Qt::Key_P: - pkey = PROJECTM_K_p; + if (e->modifiers() & Qt::ShiftModifier) + pkey = PROJECTM_K_P; + else + pkey = PROJECTM_K_p; break; case Qt::Key_F5: pkey = PROJECTM_K_F5;