![]() |
Mixxx
|
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 }