1
#include "waveform/waveformwidgetfactory.h"
2
#include "waveform/widgets/waveformwidgetabstract.h"
4
#include "widget/wwaveformviewer.h"
7
#include "waveform/widgets/emptywaveformwidget.h"
8
#include "waveform/widgets/softwarewaveformwidget.h"
9
#include "waveform/widgets/glwaveformwidget.h"
10
#include "waveform/widgets/glslwaveformwidget.h"
11
#include "waveform/widgets/glsimplewaveformwidget.h"
18
#include <QStringList>
20
6
#include <QtOpenGL/QGLFormat>
21
7
#include <QtOpenGL/QGLShaderProgram>
9
#include "waveform/waveformwidgetfactory.h"
11
#include "controlpotmeter.h"
13
#include "waveform/widgets/emptywaveformwidget.h"
14
#include "waveform/widgets/glsimplewaveformwidget.h"
15
#include "waveform/widgets/glslwaveformwidget.h"
16
#include "waveform/widgets/glwaveformwidget.h"
17
#include "waveform/widgets/softwarewaveformwidget.h"
18
#include "waveform/widgets/waveformwidgetabstract.h"
19
#include "widget/wwaveformviewer.h"
21
///////////////////////////////////////////
23
WaveformWidgetAbstractHandle::WaveformWidgetAbstractHandle()
25
m_type(WaveformWidgetType::Count_WaveformwidgetType) {
28
///////////////////////////////////////////
30
WaveformWidgetHolder::WaveformWidgetHolder(WaveformWidgetAbstract* waveformWidget,
31
WWaveformViewer* waveformViewer,
32
const QDomNode& visualNodeCache)
33
: m_waveformWidget(waveformWidget),
34
m_waveformViewer(waveformViewer),
35
m_visualNodeCache(visualNodeCache.cloneNode()) {
38
///////////////////////////////////////////
26
40
WaveformWidgetFactory::WaveformWidgetFactory() {
27
41
m_time = new QTime();
31
46
m_zoomSync = false;
47
m_visualGain[All] = 1.5;
48
m_visualGain[Low] = 1.0;
49
m_visualGain[Mid] = 1.0;
50
m_visualGain[High] = 1.0;
33
52
m_lastFrameTime = 0;
34
53
m_actualFrameRate = 0;
113
120
bool WaveformWidgetFactory::setConfig(ConfigObject<ConfigValue> *config){
114
121
m_config = config;
118
QString framRate = m_config->getValueString(ConfigKey("[Waveform]","FrameRate"));
119
if( !framRate.isEmpty()) {
120
int frameRate = framRate.toInt();
127
int frameRate = m_config->getValueString(ConfigKey("[Waveform]","FrameRate")).toInt(&ok);
121
129
setFrameRate(frameRate);
123
131
m_config->set(ConfigKey("[Waveform]","FrameRate"), ConfigValue(m_frameRate));
126
QString defaultZoom = m_config->getValueString(ConfigKey("[Waveform]","DefaultZoom"));
127
if( !defaultZoom.isEmpty()) {
128
int zoom = defaultZoom.toInt();
129
setDefaultZoom(zoom);
134
int defaultZoom = m_config->getValueString(ConfigKey("[Waveform]","DefaultZoom")).toInt(&ok);
136
setDefaultZoom(defaultZoom);
131
138
m_config->set(ConfigKey("[Waveform]","DefaultZoom"), ConfigValue(m_defaultZoom));
134
QString zoomSync = m_config->getValueString(ConfigKey("[Waveform]","ZoomSynchronization"));
135
if( !zoomSync.isEmpty()) {
136
bool sync = zoomSync.toInt();
142
int zoomSync = m_config->getValueString(ConfigKey("[Waveform]","ZoomSynchronization")).toInt(&ok);
144
setZoomSync(static_cast<bool>(zoomSync));
139
146
m_config->set(ConfigKey("[Waveform]","ZoomSynchronization"), ConfigValue(m_zoomSync));
149
WaveformWidgetType::Type type = static_cast<WaveformWidgetType::Type>(
150
m_config->getValueString(ConfigKey("[Waveform]","WaveformType")).toInt(&ok));
151
if (!ok || !setWidgetType(type)) {
152
setWidgetType(autoChooseWidgetType());
155
for (int i = 0; i < FilterCount; i++) {
156
double visualGain = m_config->getValueString(
157
ConfigKey("[Waveform]","VisualGain_" + QString::number(i))).toDouble(&ok);
160
setVisualGain(FilterIndex(i), visualGain);
162
m_config->set(ConfigKey("[Waveform]","VisualGain_" + QString::number(i)),
163
QString::number(m_visualGain[i]));
145
170
void WaveformWidgetFactory::start() {
146
qDebug() << "WaveformWidgetFactory::start";
171
//qDebug() << "WaveformWidgetFactory::start";
147
172
killTimer(m_mainTimerId);
148
173
m_mainTimerId = startTimer(1000.0/double(m_frameRate));
151
176
void WaveformWidgetFactory::stop() {
152
177
killTimer(m_mainTimerId);
156
181
void WaveformWidgetFactory::timerEvent(QTimerEvent *timerEvent) {
157
if( timerEvent->timerId() == m_mainTimerId)
182
if (timerEvent->timerId() == m_mainTimerId) {
161
187
void WaveformWidgetFactory::destroyWidgets() {
162
for (int i = 0; i < m_waveformWidgets.size(); i++)
163
delete m_waveformWidgets[i];
164
m_waveformWidgets.clear();
188
for (unsigned int i = 0; i < m_waveformWidgetHolders.size(); i++) {
189
WaveformWidgetAbstract* pWidget = m_waveformWidgetHolders[i].m_waveformWidget;;
190
m_waveformWidgetHolders[i].m_waveformWidget = NULL;
193
m_waveformWidgetHolders.clear();
167
196
void WaveformWidgetFactory::addTimerListener(QWidget* pWidget) {
199
231
void WaveformWidgetFactory::setFrameRate(int frameRate) {
200
m_frameRate = math_min(60, math_max( 10, frameRate));
232
m_frameRate = math_min(60, math_max(10, frameRate));
202
234
m_config->set(ConfigKey("[Waveform]","FrameRate"), ConfigValue(m_frameRate));
205
bool WaveformWidgetFactory::setWidgetType(int handleIndex) {
238
bool WaveformWidgetFactory::setWidgetType(WaveformWidgetType::Type type) {
242
// check if type is acceptable
243
for (unsigned int i = 0; i < m_waveformWidgetHandles.size(); i++) {
244
WaveformWidgetAbstractHandle& handle = m_waveformWidgetHandles[i];
245
if (handle.m_type == type) {
246
// type is acceptable
249
m_config->set(ConfigKey("[Waveform]","WaveformType"), ConfigValue((int)m_type));
256
m_type = WaveformWidgetType::EmptyWaveform;
258
m_config->set(ConfigKey("[Waveform]","WaveformType"), ConfigValue((int)m_type));
263
bool WaveformWidgetFactory::setWidgetTypeFromHandle(int handleIndex) {
206
264
if (handleIndex < 0 && handleIndex > m_waveformWidgetHandles.size()) {
207
qDebug() << "WaveformWidgetFactory::setWidgetType - invalid handle";
265
qDebug() << "WaveformWidgetFactory::setWidgetType - invalid handle --> use of 'EmptyWaveform'";
266
// fallback empty type
267
setWidgetType(WaveformWidgetType::EmptyWaveform);
211
271
WaveformWidgetAbstractHandle& handle = m_waveformWidgetHandles[handleIndex];
212
272
if (handle.m_type == m_type) {
213
273
qDebug() << "WaveformWidgetFactory::setWidgetType - type already in use";
218
m_type = handle.m_type;
222
I can't just recreate waveform widgets (even if its nicer !!)
223
Waveform widget creation works but it the complete setup (color etc ...) from the skin
224
need to be re-run ! I tried to implement some int the skin loader be it became "spagetti"
225
code :( ... So for the moment a mixxx restart will do ...
227
//retrieve existing viewers
228
QVector<WWaveformViewer*> viewers;
229
for( int i = 0; i < m_waveformWidgets.size(); i++)
231
if( !m_waveformWidgets[i]->isValid())
233
//should never happend the casting must be check into the setWaveformWidget
234
//method to ensre we never store mis-formed widget in the factory !!
238
//it should be safe since only the factory can build WaveformWidget and we know
239
//we give them a WWaveformViewer as a parent
240
WWaveformViewer* viewer = static_cast<WWaveformViewer*>(m_waveformWidgets[i]->getWidget()->parent());
241
viewers.push_back(viewer);
244
//re-create them with the current type
245
for( int i = 0; i < viewers.size(); i++)
246
setWaveformWidget(viewers[i]);
278
setWidgetType(handle.m_type);
281
qDebug() << "recreate start";
283
//re-create/setup all waveform widgets
284
for (unsigned int i = 0; i < m_waveformWidgetHolders.size(); i++) {
285
WaveformWidgetHolder& holder = m_waveformWidgetHolders[i];
286
WaveformWidgetAbstract* previousWidget = holder.m_waveformWidget;
287
TrackPointer pTrack = previousWidget->getTrackInfo();
288
previousWidget->hold();
289
delete previousWidget;
290
WWaveformViewer* viewer = holder.m_waveformViewer;
291
WaveformWidgetAbstract* widget = createWaveformWidget(m_type, holder.m_waveformViewer);
292
holder.m_waveformWidget = widget;
293
widget->castToQWidget();
295
viewer->setWaveformWidget(widget);
296
viewer->setup(holder.m_visualNodeCache);
297
// resize() doesn't seem to get called on the widget. I think Qt skips
298
// it since the size didn't change.
299
//viewer->resize(viewer->size());
300
widget->resize(viewer->width(), viewer->height());
301
widget->setTrack(pTrack);
304
m_skipRender = false;
305
qDebug() << "recreate done";
252
void WaveformWidgetFactory::setDefaultZoom(int zoom){
253
m_defaultZoom = math_max(1,math_min(4,zoom));
309
void WaveformWidgetFactory::setDefaultZoom(int zoom) {
310
m_defaultZoom = math_max(WaveformWidgetRenderer::s_waveformMinZoom,
311
math_min(zoom, WaveformWidgetRenderer::s_waveformMaxZoom));
255
313
m_config->set(ConfigKey("[Waveform]","DefaultZoom"), ConfigValue(m_defaultZoom));
257
for (int i = 0; i < m_waveformWidgets.size(); i++)
258
m_waveformWidgets[i]->setZoom(m_defaultZoom);
316
for (unsigned int i = 0; i < m_waveformWidgetHolders.size(); i++) {
317
m_waveformWidgetHolders[i].m_waveformViewer->setZoom(m_defaultZoom);
261
321
void WaveformWidgetFactory::setZoomSync(bool sync) {
262
322
m_zoomSync = sync;
264
324
m_config->set(ConfigKey("[Waveform]","ZoomSynchronization"), ConfigValue(m_zoomSync));
266
if( m_waveformWidgets.isEmpty())
327
if (m_waveformWidgetHolders.size() == 0) {
269
int refZoom = m_waveformWidgets[0]->getZoomFactor();
270
for (int i = 1; i < m_waveformWidgets.size(); i++)
271
m_waveformWidgets[i]->setZoom(refZoom);
274
void WaveformWidgetFactory::onZoomChange( WaveformWidgetAbstract* widget) {
276
int refZoom = widget->getZoomFactor();
277
for (int i = 0; i < m_waveformWidgets.size(); i++)
278
if( m_waveformWidgets[i] != widget)
279
m_waveformWidgets[i]->setZoom(refZoom);
331
int refZoom = m_waveformWidgetHolders[0].m_waveformWidget->getZoomFactor();
332
for (unsigned int i = 1; i < m_waveformWidgetHolders.size(); i++) {
333
m_waveformWidgetHolders[i].m_waveformViewer->setZoom(refZoom);
337
void WaveformWidgetFactory::setVisualGain(FilterIndex index, double gain) {
338
m_visualGain[index] = gain;
340
m_config->set(ConfigKey("[Waveform]","VisualGain_" + QString::number(index)), QString::number(m_visualGain[index]));
343
double WaveformWidgetFactory::getVisualGain(FilterIndex index) const {
344
return m_visualGain[index];
347
void WaveformWidgetFactory::notifyZoomChange(WWaveformViewer* viewer) {
349
//qDebug() << "WaveformWidgetFactory::notifyZoomChange";
350
int refZoom = viewer->getWaveformWidget()->getZoomFactor();
351
for (int i = 0; i < m_waveformWidgetHolders.size(); i++) {
352
if (m_waveformWidgetHolders[i].m_waveformViewer != viewer) {
353
m_waveformWidgetHolders[i].m_waveformViewer->setZoom(refZoom);
283
359
void WaveformWidgetFactory::refresh() {
284
for (int i = 0; i < m_waveformWidgets.size(); i++)
285
m_waveformWidgets[i]->preRender();
287
for (int i = 0; i < m_waveformWidgets.size(); i++)
288
m_waveformWidgets[i]->render();
363
for (unsigned int i = 0; i < m_waveformWidgetHolders.size(); i++)
364
m_waveformWidgetHolders[i].m_waveformWidget->preRender();
366
for (unsigned int i = 0; i < m_waveformWidgetHolders.size(); i++)
367
m_waveformWidgetHolders[i].m_waveformWidget->render();
369
for (unsigned int i = 0; i < m_waveformWidgetHolders.size(); i++)
370
m_waveformWidgetHolders[i].m_waveformWidget->postRender();
290
372
// Notify all other waveform-like widgets (e.g. WSpinny's) that they should