Mixxx

/home/maxime/Projets/Mixxx/1.10/mixxx/src/dlgprefcrossfader.cpp

Go to the documentation of this file.
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 }
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Defines