Mixxx

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

Go to the documentation of this file.
00001 
00002 #include <QtDebug>
00003 #include <QtGui>
00004 #include <QGLContext>
00005 
00006 #include "configobject.h"
00007 #include "waveformviewerfactory.h"
00008 #include "sharedglcontext.h"
00009 
00010 #include "waveform/waveformrenderer.h"
00011 #include "widget/wvisualsimple.h"
00012 #include "widget/wglwaveformviewer.h"
00013 #include "widget/wwaveformviewer.h"
00014 
00015 
00016 QList<QWidget*> WaveformViewerFactory::m_viewers = QList<QWidget*>();
00017 QList<WVisualSimple*> WaveformViewerFactory::m_simpleViewers = QList<WVisualSimple*>();
00018 QList<WWaveformViewer*> WaveformViewerFactory::m_visualViewers = QList<WWaveformViewer*>();
00019 QList<WGLWaveformViewer*> WaveformViewerFactory::m_visualGLViewers = QList<WGLWaveformViewer*>();
00020 QTimer WaveformViewerFactory::s_waveformUpdateTimer;;
00021 
00022 
00023 WaveformViewerType WaveformViewerFactory::createWaveformViewer(const char *group, QWidget *parent, ConfigObject<ConfigValue> *pConfig, QWidget **target, WaveformRenderer* pWaveformRenderer) {
00024     
00025     QGLContext* ctxt = SharedGLContext::getContext();
00026 
00027     qDebug() << "createWaveformViewer()";
00028 
00029     bool bVisualWaveform = true;
00030     WaveformViewerType ret = WAVEFORM_INVALID;
00031 
00032     if(target == NULL) {
00033         qDebug() << "WaveformViewerFactory::createWaveformViewer -- invalid target pointer";
00034         return WAVEFORM_INVALID;
00035     }
00036 
00037     if (pConfig->getValueString(ConfigKey("[Controls]", "Visuals")).toInt() == 1) {
00038         bVisualWaveform = false;
00039     }
00040 
00041     if(bVisualWaveform) {
00042 
00043         qDebug() << "WaveformViewerFactory :: Creating new visual waveform";
00044         // Support shared GL rendering contexts
00045         WGLWaveformViewer *other = (m_visualGLViewers.isEmpty() ? NULL : (WGLWaveformViewer*)m_visualGLViewers.first());
00046         if(other == NULL)
00047             qDebug() << "WaveformViewerFactory :: Making new GL context.";
00048         else
00049             qDebug() << "WaveformViewerFactory :: Sharing existing GL context.";
00050 
00051         WGLWaveformViewer *visual = new WGLWaveformViewer(group, pWaveformRenderer, parent, NULL, ctxt);
00052 
00053         if(visual->isValid()) {
00054             m_visualGLViewers.append(visual);
00055             m_viewers.append(visual);
00056             ret = WAVEFORM_GL;
00057             *target = visual;
00058         } else {
00059 
00060             // GL doesn't work for some reason, warn them and turn off GL viewers.
00061             pConfig->set(ConfigKey("[Controls]","Visuals"), ConfigValue(1));
00062             QMessageBox * mb = new QMessageBox(parent);
00063             mb->setWindowTitle(QString("Waveform Displays"));
00064             mb->setIcon(QMessageBox::Information);
00065             mb->setText("OpenGL cannot be initialized, which means that\nthe waveform displays won't work. A simple\nmode will be used instead where you can still\nuse the mouse to change speed.");
00066             mb->show();
00067 
00068             bVisualWaveform = false;
00069             if(visual != NULL)
00070                 delete visual;
00071             visual = NULL;
00072 
00073             /*qDebug() << "Making a nongl viewer";
00074             WWaveformViewer *nongl = new WWaveformViewer(group,pWaveformRenderer,parent);
00075             m_visualViewers.append(nongl);
00076             m_viewers.append(nongl);
00077             ret = WAVEFORM_WIDGET;
00078             *target = nongl;*/
00079         }
00080 
00081     }
00082 
00083     // WTF: Intentionally separate from previous block.
00084     if(!bVisualWaveform) {
00085         qDebug() << "WaveformViewerFactory :: Creating new simple waveform";
00086         // Preference is for simple or regular, for now just simple.
00087         WVisualSimple *simple = new WVisualSimple(group,parent, pWaveformRenderer);
00088         m_simpleViewers.append(simple);
00089         m_viewers.append(simple);
00090         ret = WAVEFORM_SIMPLE;
00091         *target = simple;
00092     }
00093 
00094     // If the waveform update timer is not active, start it.
00095     if (!s_waveformUpdateTimer.isActive()) {
00096         int desired_fps = 40;
00097         float update_interval = 1000.0f / desired_fps;
00098         s_waveformUpdateTimer.start(update_interval);
00099     }
00100     // Connect the waveform update timer to the waveform
00101     QObject::connect(&s_waveformUpdateTimer, SIGNAL(timeout()), *target, SLOT(refresh()));
00102 
00103     return ret;
00104 }
00105 
00106 void WaveformViewerFactory::destroyWaveformViewer(QWidget *pWaveformViewer) {
00107     qDebug() << "destroyWaveformViewer()";
00108 
00109     if(pWaveformViewer == NULL)
00110         return;
00111 
00112     // Precondition is that we created this waveform viewer.
00113     if(!m_viewers.contains(pWaveformViewer))
00114         return;
00115 
00116 
00117     int index = m_viewers.indexOf(pWaveformViewer);
00118     //ASSERT(index != -!);
00119     m_viewers.removeAt(index);
00120 
00121     index = m_simpleViewers.indexOf((WVisualSimple*)pWaveformViewer);
00122     if(index != -1)
00123         m_simpleViewers.removeAt(index);
00124 
00125     index = m_visualViewers.indexOf((WWaveformViewer*)pWaveformViewer);
00126     if(index != -1)
00127         m_visualViewers.removeAt(index);
00128 
00129     index = m_visualGLViewers.indexOf((WGLWaveformViewer*)pWaveformViewer);
00130     if(index != -1)
00131         m_visualGLViewers.removeAt(index);
00132 
00133     delete pWaveformViewer;
00134 
00135 }
00136 
00137 WaveformViewerType WaveformViewerFactory::getWaveformViewerType(QWidget *pWaveformViewer) {
00138     if(pWaveformViewer == NULL)
00139         return WAVEFORM_INVALID;
00140     if(m_simpleViewers.indexOf((WVisualSimple*)pWaveformViewer) != -1)
00141         return WAVEFORM_SIMPLE;
00142     if(m_visualViewers.indexOf((WWaveformViewer*)pWaveformViewer) != -1)
00143         return WAVEFORM_WIDGET;
00144     if(m_visualGLViewers.indexOf((WGLWaveformViewer*)pWaveformViewer) != -1)
00145         return WAVEFORM_GL;
00146     return WAVEFORM_INVALID;
00147 }
00148 
00149 // static
00150 int WaveformViewerFactory::numViewers(WaveformViewerType type) {
00151     if (type == WAVEFORM_SIMPLE) {
00152         return m_simpleViewers.count();
00153     } else if (type == WAVEFORM_WIDGET) {
00154         return m_visualViewers.count();
00155     } else if (type == WAVEFORM_GL) {
00156         return m_visualGLViewers.count();
00157     }
00158     return 0;
00159 }
00160 
00161 // static
00162 bool WaveformViewerFactory::isDirectRenderingEnabled() {
00163     if (m_visualGLViewers.count() > 0) {
00164         bool enabled = true;
00165         foreach (WGLWaveformViewer* pViewer, m_visualGLViewers) {
00166             if (!pViewer->directRendering()) {
00167                 enabled = false;
00168             }
00169         }
00170         return enabled;
00171     }
00172     // Doesn't matter
00173     return true;
00174 }
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Defines