// loopingcontrol.cpp
// Created on Sep 23, 2008
// Author: asantoni, rryan
#include <QtDebug>
#include "controlobject.h"
#include "preferences/usersettings.h"
#include "controlpushbutton.h"
#include "cachingreader.h"
#include "engine/loopingcontrol.h"
#include "engine/bpmcontrol.h"
#include "engine/enginecontrol.h"
#include "util/math.h"
#include "trackinfoobject.h"
#include "track/beats.h"
double LoopingControl::s_dBeatSizes[] = { 0.03125, 0.0625, 0.125, 0.25, 0.5,
1, 2, 4, 8, 16, 32, 64 };
// Used to generate the beatloop_%SIZE, beatjump_%SIZE, and loop_move_%SIZE CO
// ConfigKeys.
ConfigKey keyForControl(QString group, QString ctrlName, double num) {
ConfigKey key;
key.group = group;
key.item = ctrlName.arg(num);
return key;
}
// static
QList<double> LoopingControl::getBeatSizes() {
QList<double> result;
for (unsigned int i = 0; i < (sizeof(s_dBeatSizes) / sizeof(s_dBeatSizes[0])); ++i) {
result.append(s_dBeatSizes[i]);
}
return result;
}
LoopingControl::LoopingControl(QString group,
UserSettingsPointer _config)
: EngineControl(group, _config) {
m_bLoopingEnabled = false;
m_bLoopRollActive = false;
m_iLoopStartSample = kNoTrigger;
m_iLoopEndSample = kNoTrigger;
m_iCurrentSample = 0.;
m_pActiveBeatLoop = NULL;
//Create loop-in, loop-out, loop-exit, and reloop/exit ControlObjects
m_pLoopInButton = new ControlPushButton(ConfigKey(group, "loop_in"));
connect(m_pLoopInButton, SIGNAL(valueChanged(double)),
this, SLOT(slotLoopIn(double)),
Qt::DirectConnection);
m_pLoopInButton->set(0);
m_pLoopOutButton = new ControlPushButton(ConfigKey(group, "loop_out"));
connect(m_pLoopOutButton, SIGNAL(valueChanged(double)),
this, SLOT(slotLoopOut(double)),
Qt::DirectConnection);
m_pLoopOutButton->set(0);
m_pLoopExitButton = new ControlPushButton(ConfigKey(group, "loop_exit"));
connect(m_pLoopExitButton, SIGNAL(valueChanged(double)),
this, SLOT(slotLoopExit(double)),
Qt::DirectConnection);
m_pLoopExitButton->set(0);
m_pReloopExitButton = new ControlPushButton(ConfigKey(group, "reloop_exit"));
connect(m_pReloopExitButton, SIGNAL(valueChanged(double)),
this, SLOT(slotReloopExit(double)),
Qt::DirectConnection);
m_pReloopExitButton->set(0);
m_pCOLoopEnabled = new ControlObject(ConfigKey(group, "loop_enabled"));
m_pCOLoopEnabled->set(0.0);
m_pCOLoopStartPosition =
new ControlObject(ConfigKey(group, "loop_start_position"));
m_pCOLoopStartPosition->set(kNoTrigger);
connect(m_pCOLoopStartPosition, SIGNAL(valueChanged(double)),
this, SLOT(slotLoopStartPos(double)),
Qt::DirectConnection);
m_pCOLoopEndPosition =
new ControlObject(ConfigKey(group, "loop_end_position"));
m_pCOLoopEndPosition->set(kNoTrigger);
connect(m_pCOLoopEndPosition, SIGNAL(valueChanged(double)),
this, SLOT(slotLoopEndPos(double)),
Qt::DirectConnection);
m_pQuantizeEnabled = ControlObject::getControl(ConfigKey(group, "quantize"));
m_pNextBeat = ControlObject::getControl(ConfigKey(group, "beat_next"));
m_pClosestBeat = ControlObject::getControl(ConfigKey(group, "beat_closest"));
m_pTrackSamples = ControlObject::getControl(ConfigKey(group, "track_samples"));
m_pSlipEnabled = ControlObject::getControl(ConfigKey(group, &q