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(); }
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; }
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(); }