void WaveformWidgetFactory::swap() { ScopedTimer t(QString("WaveformWidgetFactory::swap() %1waveforms") .arg(m_waveformWidgetHolders.size())); // Do this in an extra slot to be sure to hit the desired interval if (!m_skipRender) { if (m_type) { // no regular updates for an empty waveform // Show rendered buffer from last render() run //qDebug() << "swap() start" << m_vsyncThread->elapsed(); for (int i = 0; i < m_waveformWidgetHolders.size(); i++) { WaveformWidgetAbstract* pWaveformWidget = m_waveformWidgetHolders[i].m_waveformWidget; if (pWaveformWidget->getWidth() > 0) { QGLWidget* glw = dynamic_cast<QGLWidget*>(pWaveformWidget->getWidget()); if (glw) { m_vsyncThread->swapGl(glw, i); } } //qDebug() << "swap x" << m_vsyncThread->elapsed(); } } } //qDebug() << "swap end" << m_vsyncThread->elapsed(); m_vsyncThread->vsyncSlotFinished(); }
void WaveformWidgetFactory::swap() { ScopedTimer t("WaveformWidgetFactory::swap() %1waveforms", m_waveformWidgetHolders.size()); // Do this in an extra slot to be sure to hit the desired interval if (!m_skipRender) { if (m_type) { // no regular updates for an empty waveform // Show rendered buffer from last render() run //qDebug() << "swap() start" << m_vsyncThread->elapsed(); for (int i = 0; i < m_waveformWidgetHolders.size(); i++) { WaveformWidgetAbstract* pWaveformWidget = m_waveformWidgetHolders[i].m_waveformWidget; if (pWaveformWidget->getWidth() > 0) { QGLWidget* glw = dynamic_cast<QGLWidget*>(pWaveformWidget->getWidget()); // Don't swap invalid or invisible widgets. Prevents // continuous log spew of "QOpenGLContext::swapBuffers() // called with non-exposed window, behavior is undefined" on // Qt5. if (glw && glw->isValid() && glw->isVisible()) { VSyncThread::swapGl(glw, i); } } //qDebug() << "swap x" << m_vsyncThread->elapsed(); } } } //qDebug() << "swap end" << m_vsyncThread->elapsed(); m_vsyncThread->vsyncSlotFinished(); }
WaveformWidgetAbstract* WaveformWidgetFactory::createWaveformWidget( WaveformWidgetType::Type type, WWaveformViewer* viewer) { WaveformWidgetAbstract* widget = NULL; if (viewer) { if (CmdlineArgs::Instance().getSafeMode()) { type = WaveformWidgetType::EmptyWaveform; } switch(type) { case WaveformWidgetType::SoftwareWaveform: widget = new SoftwareWaveformWidget(viewer->getGroup(), viewer); break; case WaveformWidgetType::HSVWaveform: widget = new HSVWaveformWidget(viewer->getGroup(), viewer); break; case WaveformWidgetType::RGBWaveform: widget = new RGBWaveformWidget(viewer->getGroup(), viewer); break; case WaveformWidgetType::QtSimpleWaveform: widget = new QtSimpleWaveformWidget(viewer->getGroup(), viewer); break; case WaveformWidgetType::QtWaveform: widget = new QtWaveformWidget(viewer->getGroup(), viewer); break; case WaveformWidgetType::GLSimpleWaveform: widget = new GLSimpleWaveformWidget(viewer->getGroup(), viewer); break; case WaveformWidgetType::GLWaveform: widget = new GLWaveformWidget(viewer->getGroup(), viewer); break; case WaveformWidgetType::GLRGBWaveform: widget = new GLRGBWaveformWidget(viewer->getGroup(), viewer); break; case WaveformWidgetType::GLSLWaveform: widget = new GLSLWaveformWidget(viewer->getGroup(), viewer); break; case WaveformWidgetType::GLVSyncTest: widget = new GLVSyncTestWidget(viewer->getGroup(), viewer); break; default: //case WaveformWidgetType::SoftwareSimpleWaveform: TODO: (vrince) //case WaveformWidgetType::EmptyWaveform: widget = new EmptyWaveformWidget(viewer->getGroup(), viewer); break; } widget->castToQWidget(); if (!widget->isValid()) { qWarning() << "failed to init WafeformWidget" << type << "fall back to \"Empty\""; delete widget; widget = new EmptyWaveformWidget(viewer->getGroup(), viewer); widget->castToQWidget(); if (!widget->isValid()) { qWarning() << "failed to init EmptyWaveformWidget"; delete widget; widget = NULL; } } } return widget; }
void WaveformWidgetFactory::notifyZoomChange(WWaveformViewer* viewer) { WaveformWidgetAbstract* pWaveformWidget = viewer->getWaveformWidget(); if (pWaveformWidget != NULL && isZoomSync()) { //qDebug() << "WaveformWidgetFactory::notifyZoomChange"; int refZoom = pWaveformWidget->getZoomFactor(); for (int i = 0; i < m_waveformWidgetHolders.size(); ++i) { WaveformWidgetHolder& holder = m_waveformWidgetHolders[i]; if (holder.m_waveformViewer != viewer) { holder.m_waveformViewer->setZoom(refZoom); } } } }
void WaveformWidgetFactory::render() { ScopedTimer t(QString("WaveformWidgetFactory::render() %1waveforms") .arg(m_waveformWidgetHolders.size())); //int paintersSetupTime0 = 0; //int paintersSetupTime1 = 0; if (!m_skipRender) { if (m_type) { // no regular updates for an empty waveform // next rendered frame is displayed after next buffer swap and than after VSync for (int i = 0; i < m_waveformWidgetHolders.size(); i++) { // Calculate play position for the new Frame in following run m_waveformWidgetHolders[i].m_waveformWidget->preRender(m_vsyncThread); } //qDebug() << "prerender" << m_vsyncThread->elapsed(); // It may happen that there is an artificially delayed due to // anti tearing driver settings // all render commands are delayed until the swap from the previous run is executed for (int i = 0; i < m_waveformWidgetHolders.size(); i++) { WaveformWidgetAbstract* pWaveformWidget = m_waveformWidgetHolders[i].m_waveformWidget; if (pWaveformWidget->getWidth() > 0 && pWaveformWidget->getWidget()->isVisible()) { (void)pWaveformWidget->render(); } // qDebug() << "render" << i << m_vsyncThread->elapsed(); } } // Notify all other waveform-like widgets (e.g. WSpinny's) that they should // update. //int t1 = m_vsyncThread->elapsed(); emit(waveformUpdateTick()); //qDebug() << "emit" << m_vsyncThread->elapsed() - t1; m_frameCnt += 1.0; int timeCnt = m_time.elapsed(); if (timeCnt > 1000) { m_time.start(); m_frameCnt = m_frameCnt * 1000 / timeCnt; // latency correction emit(waveformMeasured(m_frameCnt, m_vsyncThread->rtErrorCnt())); m_frameCnt = 0.0; } } //qDebug() << "refresh end" << m_vsyncThread->elapsed(); m_vsyncThread->vsyncSlotFinished(); }
bool WaveformWidgetFactory::setWidgetTypeFromHandle(int handleIndex) { if (handleIndex < 0 && handleIndex > (int)m_waveformWidgetHandles.size()) { qDebug() << "WaveformWidgetFactory::setWidgetType - invalid handle --> use of 'EmptyWaveform'"; // fallback empty type setWidgetType(WaveformWidgetType::EmptyWaveform); return false; } WaveformWidgetAbstractHandle& handle = m_waveformWidgetHandles[handleIndex]; if (handle.m_type == m_type) { qDebug() << "WaveformWidgetFactory::setWidgetType - type already in use"; return true; } // change the type setWidgetType(handle.m_type); m_skipRender = true; //qDebug() << "recreate start"; //re-create/setup all waveform widgets for (int i = 0; i < m_waveformWidgetHolders.size(); i++) { WaveformWidgetHolder& holder = m_waveformWidgetHolders[i]; WaveformWidgetAbstract* previousWidget = holder.m_waveformWidget; TrackPointer pTrack = previousWidget->getTrackInfo(); //previousWidget->hold(); int previousZoom = previousWidget->getZoomFactor(); delete previousWidget; WWaveformViewer* viewer = holder.m_waveformViewer; WaveformWidgetAbstract* widget = createWaveformWidget(m_type, holder.m_waveformViewer); holder.m_waveformWidget = widget; viewer->setWaveformWidget(widget); viewer->setup(holder.m_skinNodeCache, holder.m_skinContextCache); viewer->setZoom(previousZoom); // resize() doesn't seem to get called on the widget. I think Qt skips // it since the size didn't change. //viewer->resize(viewer->size()); widget->resize(viewer->width(), viewer->height()); widget->setTrack(pTrack); widget->getWidget()->show(); viewer->update(); } m_skipRender = false; //qDebug() << "recreate done"; return true; }