![]() |
Mixxx
|
00001 /*************************************************************************** 00002 dlgprefcrossfader.cpp - description 00003 ------------------- 00004 begin : Thu Jun 7 2007 00005 copyright : (C) 2007 by John Sully 00006 email : jsully@scs.ryerson.ca 00007 ***************************************************************************/ 00008 00009 /*************************************************************************** 00010 * * 00011 * This program is free software; you can redistribute it and/or modify * 00012 * it under the terms of the GNU General Public License as published by * 00013 * the Free Software Foundation; either version 2 of the License, or * 00014 * (at your option) any later version. * 00015 * * 00016 ***************************************************************************/ 00017 00018 #include "dlgprefcrossfader.h" 00019 #include "engine/enginefilteriir.h" 00020 #include "controlobject.h" 00021 #include "engine/enginexfader.h" 00022 #include <qlineedit.h> 00023 #include <qwidget.h> 00024 #include <qslider.h> 00025 #include <qlabel.h> 00026 #include <qstring.h> 00027 #include <qcheckbox.h> 00028 #include <qpushbutton.h> 00029 #include <qgraphicsscene.h> 00030 #include <QtDebug> 00031 00032 #include <assert.h> 00033 00034 #define CONFIG_KEY "[Mixer Profile]" 00035 00036 DlgPrefCrossfader::DlgPrefCrossfader(QWidget * parent, ConfigObject<ConfigValue> * _config) 00037 : QWidget(parent) 00038 , Ui::DlgPrefCrossfaderDlg() 00039 , m_COTCurve(ControlObject::getControl(ConfigKey(CONFIG_KEY, "xFaderCurve"))) 00040 , m_COTCalibration(ControlObject::getControl(ConfigKey(CONFIG_KEY, "xFaderCalibration"))) 00041 { 00042 config = _config; 00043 m_pxfScene = NULL; 00044 00045 m_transform = 0; 00046 m_cal = 0; 00047 00048 setupUi(this); 00049 00050 connect(SliderXFader, SIGNAL(valueChanged(int)), this, SLOT(slotUpdateXFader())); 00051 connect(SliderXFader, SIGNAL(sliderMoved(int)), this, SLOT(slotUpdateXFader())); 00052 connect(SliderXFader, SIGNAL(sliderReleased()), this, SLOT(slotUpdateXFader())); 00053 connect(SliderXFader, SIGNAL(sliderReleased()), this, SLOT(slotApply())); 00054 00055 connect(PushButtonReset, SIGNAL(clicked(bool)), this, SLOT(setDefaults())); 00056 00057 //Update the crossfader curve graph and other setings when the crossfader mode is changed. 00058 connect(radioButtonSlowFade, SIGNAL(clicked(bool)), this, SLOT(slotUpdate())); 00059 connect(radioButtonFastCut, SIGNAL(clicked(bool)), this, SLOT(slotUpdate())); 00060 connect(radioButtonConstantPower, SIGNAL(clicked(bool)), this, SLOT(slotUpdate())); 00061 00062 QButtonGroup crossfaderModes; 00063 crossfaderModes.addButton(radioButtonSlowFade); 00064 crossfaderModes.addButton(radioButtonFastCut); 00065 crossfaderModes.addButton(radioButtonConstantPower); 00066 00067 loadSettings(); 00068 00069 } 00070 00071 DlgPrefCrossfader::~DlgPrefCrossfader() 00072 { 00073 delete m_pxfScene; 00074 } 00075 00077 void DlgPrefCrossfader::loadSettings() 00078 { 00079 m_transform = 1. + ((double) SliderXFader->value() / SliderXFader->maximum()); 00080 double sliderTransform = config->getValueString(ConfigKey(CONFIG_KEY, "xFaderCurve")).toDouble(); 00081 double sliderVal = SliderXFader->maximum() / MIXXX_XFADER_STEEPNESS_COEFF * (sliderTransform - 1.); 00082 SliderXFader->setValue((int)sliderVal); 00083 00084 m_xFaderMode = config->getValueString(ConfigKey(CONFIG_KEY, "xFaderMode")); 00085 00086 qDebug() << "loadSettings:" << sliderTransform << sliderVal << m_xFaderMode; 00087 00088 if (m_xFaderMode == MIXXX_XFADER_SLOWFADE) 00089 { 00090 radioButtonSlowFade->setChecked(true); 00091 SliderXFader->setEnabled(false); 00092 } 00093 else if (m_xFaderMode == MIXXX_XFADER_FASTCUT) 00094 { 00095 radioButtonFastCut->setChecked(true); 00096 SliderXFader->setEnabled(false); 00097 } 00098 else if (m_xFaderMode == MIXXX_XFADER_CONSTPWR) 00099 { 00100 radioButtonConstantPower->setChecked(true); 00101 SliderXFader->setEnabled(true); 00102 } 00103 else 00104 { 00105 radioButtonSlowFade->setChecked(true); 00106 SliderXFader->setEnabled(false); 00107 } 00108 00109 slotUpdateXFader(); 00110 slotApply(); 00111 drawXfaderDisplay(); 00112 } 00113 00115 void DlgPrefCrossfader::setDefaults() 00116 { 00117 SliderXFader->setValue(0); 00118 m_xFaderMode = MIXXX_XFADER_SLOWFADE; 00119 radioButtonSlowFade->setChecked(true); 00120 slotUpdate(); 00121 slotApply(); 00122 } 00123 00125 void DlgPrefCrossfader::slotApply() 00126 { 00127 config->set(ConfigKey(CONFIG_KEY, "xFaderMode"), ConfigValue(m_xFaderMode)); 00128 m_COTCurve.slotSet(m_transform); 00129 m_COTCalibration.slotSet(m_cal); 00130 00131 qDebug() << "slotApply crossfader:" << m_transform << m_xFaderMode; 00132 } 00133 00135 void DlgPrefCrossfader::slotUpdate() 00136 { 00137 if (radioButtonSlowFade->isChecked()) 00138 { 00139 m_xFaderMode = MIXXX_XFADER_SLOWFADE; 00140 SliderXFader->setEnabled(false); 00141 SliderXFader->setValue(SliderXFader->minimum()); 00142 } 00143 if (radioButtonFastCut->isChecked()) 00144 { 00145 m_xFaderMode = MIXXX_XFADER_FASTCUT; 00146 SliderXFader->setEnabled(false); 00147 SliderXFader->setValue(SliderXFader->maximum()); 00148 } 00149 if (radioButtonConstantPower->isChecked()) 00150 { 00151 m_xFaderMode = MIXXX_XFADER_CONSTPWR; 00152 SliderXFader->setEnabled(true); 00153 double sliderTransform = config->getValueString(ConfigKey(CONFIG_KEY, "xFaderCurve")).toDouble(); 00154 double sliderVal = SliderXFader->maximum() / MIXXX_XFADER_STEEPNESS_COEFF * (sliderTransform - 1.); 00155 SliderXFader->setValue((int)sliderVal); 00156 } 00157 00158 slotUpdateXFader(); 00159 } 00160 00162 void DlgPrefCrossfader::drawXfaderDisplay() 00163 { 00164 #define GRID_X_LINES 4 00165 #define GRID_Y_LINES 6 00166 00167 int sizeX = graphicsViewXfader->width(); 00168 int sizeY = graphicsViewXfader->height(); 00169 00170 //Initialize Scene 00171 if (m_pxfScene) 00172 { 00173 delete m_pxfScene; 00174 m_pxfScene = NULL; 00175 } 00176 m_pxfScene = new QGraphicsScene(); 00177 m_pxfScene->setSceneRect(0,0,sizeX, sizeY); 00178 m_pxfScene->setBackgroundBrush(Qt::black); 00179 00180 //Initialize QPens 00181 QPen gridPen(Qt::green); 00182 QPen graphLinePen(Qt::white); 00183 00184 //draw grid 00185 for(int i=1; i < GRID_X_LINES; i++) 00186 { 00187 m_pxfScene->addLine(QLineF(0, i *(sizeY/GRID_X_LINES),sizeX,i *(sizeY/GRID_X_LINES)), gridPen); 00188 } 00189 for(int i=1; i < GRID_Y_LINES; i++) 00190 { 00191 m_pxfScene->addLine(QLineF( i * (sizeX/GRID_Y_LINES), 0, i * (sizeX/GRID_Y_LINES), sizeY), gridPen); 00192 } 00193 00194 //Draw graph lines 00195 float gain1, gain2; 00196 QPoint pointTotal, point1, point2; 00197 QPoint pointTotalPrev, point1Prev, point2Prev; 00198 for(int i=0; i < sizeX; i++) 00199 { 00200 double xfadeStep = 2. / (double)sizeX; 00201 00202 EngineXfader::getXfadeGains(gain1, gain2, (-1. + (xfadeStep * (double) i)), m_transform, m_cal); 00203 00204 double sum = gain1 + gain2; 00205 //scale for graph 00206 gain1 *= 0.80; 00207 gain2 *= 0.80; 00208 sum *= 0.80; 00209 00210 //draw it 00211 pointTotalPrev = pointTotal; 00212 point1Prev = point1; 00213 point2Prev = point2; 00214 pointTotal = QPoint(i - 2, (int)((1. - sum) * (sizeY))); 00215 point1 = QPoint(i - 2, (int)((1. - gain1) * (sizeY))); 00216 point2 = QPoint(i - 2, (int)((1. - gain2) * (sizeY))); 00217 if(i == 0) 00218 { 00219 pointTotalPrev = pointTotal; 00220 point1Prev = point1; 00221 point2Prev = point2; 00222 } 00223 00224 if(pointTotal != point1) 00225 m_pxfScene->addLine(QLineF(point1, point1Prev), graphLinePen); 00226 if(pointTotal != point2) 00227 m_pxfScene->addLine(QLineF(point2, point2Prev), graphLinePen); 00228 m_pxfScene->addLine(QLineF(pointTotal, pointTotalPrev), QPen(Qt::red)); 00229 } 00230 00231 graphicsViewXfader->setScene(m_pxfScene); 00232 graphicsViewXfader->show(); 00233 } 00234 00236 void DlgPrefCrossfader::slotUpdateXFader() 00237 { 00238 m_transform = 1. + ((double) SliderXFader->value() / SliderXFader->maximum() * MIXXX_XFADER_STEEPNESS_COEFF); 00239 00240 if (m_xFaderMode == MIXXX_XFADER_SLOWFADE) 00241 { 00242 m_cal = 0.0f; 00243 SliderXFader->setValue(SliderXFader->minimum()); 00244 } 00245 else if (m_xFaderMode == MIXXX_XFADER_FASTCUT) 00246 { 00247 m_cal = 0.0f; 00248 SliderXFader->setValue(SliderXFader->maximum()); 00249 } 00250 else if (m_xFaderMode == MIXXX_XFADER_CONSTPWR) 00251 { 00252 m_cal = EngineXfader::getCalibration(m_transform); 00253 } 00254 00255 QString QS_transform = QString::number(m_transform); 00256 config->set(ConfigKey(CONFIG_KEY, "xFaderCurve"), ConfigValue(QS_transform)); 00257 //config->set(ConfigKey(CONFIG_KEY, "xFaderCalibration"), ConfigValue(m_cal)); //FIXME: m_cal is a double - be forewarned 00258 00259 drawXfaderDisplay(); 00260 }