X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fscopes%2Fscopemanager.cpp;h=b192beafb0ffdab50744a58e0dc8c2a38acf3096;hb=96d7f5a694d5440a935562a441060a42b447a998;hp=a51a1366053b22e411ae7b710b1747d161fbc9b5;hpb=8749ea70a1f9b136e31789103d940d2d7cf2387b;p=kdenlive diff --git a/src/scopes/scopemanager.cpp b/src/scopes/scopemanager.cpp index a51a1366..b192beaf 100644 --- a/src/scopes/scopemanager.cpp +++ b/src/scopes/scopemanager.cpp @@ -29,6 +29,7 @@ ScopeManager::ScopeManager(MonitorManager *monitorManager) : bool b = true; b &= connect(m_monitorManager, SIGNAL(checkColorScopes()), this, SLOT(slotUpdateActiveRenderer())); + b &= connect(m_monitorManager, SIGNAL(clearScopes()), this, SLOT(slotClearColorScopes())); b &= connect(m_signalMapper, SIGNAL(mapped(QString)), this, SLOT(slotRequestFrame(QString))); Q_ASSERT(b); @@ -40,7 +41,7 @@ bool ScopeManager::addScope(AbstractAudioScopeWidget *audioScope, QDockWidget *a bool added = false; int exists = false; // Only add the scope if it does not exist yet in the list - for (int i = 0; i < m_audioScopes.size(); i++) { + for (int i = 0; i < m_audioScopes.size(); ++i) { if (m_audioScopes[i].scope == audioScope) { exists = true; break; @@ -76,7 +77,7 @@ bool ScopeManager::addScope(AbstractGfxScopeWidget *colorScope, QDockWidget *col { bool added = false; int exists = false; - for (int i = 0; i < m_colorScopes.size(); i++) { + for (int i = 0; i < m_colorScopes.size(); ++i) { if (m_colorScopes[i].scope == colorScope) { exists = true; break; @@ -109,12 +110,12 @@ bool ScopeManager::addScope(AbstractGfxScopeWidget *colorScope, QDockWidget *col } -void ScopeManager::slotDistributeAudio(QVector sampleData, int freq, int num_channels, int num_samples) +void ScopeManager::slotDistributeAudio(const QVector &sampleData, int freq, int num_channels, int num_samples) { #ifdef DEBUG_SM qDebug() << "ScopeManager: Starting to distribute audio."; #endif - for (int i = 0; i < m_audioScopes.size(); i++) { + for (int i = 0; i < m_audioScopes.size(); ++i) { // Distribute audio to all scopes that are visible and want to be refreshed if (!m_audioScopes[i].scope->visibleRegion().isEmpty()) { if (m_audioScopes[i].scope->autoRefreshEnabled()) { @@ -128,12 +129,12 @@ void ScopeManager::slotDistributeAudio(QVector sampleData, int freq, in checkActiveAudioScopes(); } -void ScopeManager::slotDistributeFrame(QImage image) +void ScopeManager::slotDistributeFrame(const QImage &image) { #ifdef DEBUG_SM qDebug() << "ScopeManager: Starting to distribute frame."; #endif - for (int i = 0; i < m_colorScopes.size(); i++) { + for (int i = 0; i < m_colorScopes.size(); ++i) { if (!m_colorScopes[i].scope->visibleRegion().isEmpty()) { if (m_colorScopes[i].scope->autoRefreshEnabled()) { m_colorScopes[i].scope->slotRenderZoneUpdated(image); @@ -157,7 +158,7 @@ void ScopeManager::slotDistributeFrame(QImage image) } -void ScopeManager::slotRequestFrame(const QString widgetName) +void ScopeManager::slotRequestFrame(const QString &widgetName) { #ifdef DEBUG_SM qDebug() << "ScopeManager: New frame was requested by " << widgetName; @@ -165,22 +166,27 @@ void ScopeManager::slotRequestFrame(const QString widgetName) // Search for the scope in the lists and tag it to trigger a forced update // in the distribution slots - for (int i = 0; i < m_colorScopes.size(); i++) { + for (int i = 0; i < m_colorScopes.size(); ++i) { if (m_colorScopes[i].scope->widgetName() == widgetName) { m_colorScopes[i].singleFrameRequested = true; break; } } - for (int i = 0; i < m_audioScopes.size(); i++) { + for (int i = 0; i < m_audioScopes.size(); ++i) { if (m_audioScopes[i].scope->widgetName() == widgetName) { m_audioScopes[i].singleFrameRequested = true; break; } } - m_lastConnectedRenderer->sendFrameUpdate(); + if (m_lastConnectedRenderer) m_lastConnectedRenderer->sendFrameUpdate(); } +void ScopeManager::slotClearColorScopes() +{ + m_lastConnectedRenderer = NULL; +} + void ScopeManager::slotUpdateActiveRenderer() { @@ -196,6 +202,8 @@ void ScopeManager::slotUpdateActiveRenderer() } m_lastConnectedRenderer = m_monitorManager->activeRenderer(); + // DVD monitor shouldn't be monitored or will cause crash on deletion + if (m_monitorManager->isActive(Kdenlive::DvdMonitor)) m_lastConnectedRenderer = NULL; // Connect new renderer if (m_lastConnectedRenderer != NULL) { @@ -232,7 +240,7 @@ void ScopeManager::slotCheckActiveScopes() bool ScopeManager::audioAcceptedByScopes() const { bool accepted = false; - for (int i = 0; i < m_audioScopes.size(); i++) { + for (int i = 0; i < m_audioScopes.size(); ++i) { if (!m_audioScopes[i].scope->visibleRegion().isEmpty() && m_audioScopes[i].scope->autoRefreshEnabled()) { accepted = true; break; @@ -246,7 +254,7 @@ bool ScopeManager::audioAcceptedByScopes() const bool ScopeManager::imagesAcceptedByScopes() const { bool accepted = false; - for (int i = 0; i < m_colorScopes.size(); i++) { + for (int i = 0; i < m_colorScopes.size(); ++i) { if (!m_colorScopes[i].scope->visibleRegion().isEmpty() && m_colorScopes[i].scope->autoRefreshEnabled()) { accepted = true; break; @@ -281,13 +289,18 @@ void ScopeManager::checkActiveColourScopes() // Notify monitors whether frames are still required Monitor *monitor; - monitor = static_cast( m_monitorManager->monitor(Kdenlive::projectMonitor) ); - if (monitor != NULL) { monitor->render->sendFrameForAnalysis = imageStillRequested; } + monitor = static_cast( m_monitorManager->monitor(Kdenlive::ProjectMonitor) ); + if (monitor != NULL) { + if (monitor->effectSceneDisplayed()) monitor->render->sendFrameForAnalysis = true; + else monitor->render->sendFrameForAnalysis = imageStillRequested; + } - monitor = static_cast( m_monitorManager->monitor(Kdenlive::clipMonitor) ); + monitor = static_cast( m_monitorManager->monitor(Kdenlive::ClipMonitor) ); if (monitor != NULL) { monitor->render->sendFrameForAnalysis = imageStillRequested; } - RecMonitor *recMonitor = static_cast( m_monitorManager->monitor(Kdenlive::recordMonitor) ); + RecMonitor *recMonitor = static_cast( m_monitorManager->monitor(Kdenlive::RecordMonitor) ); if (recMonitor != NULL) { recMonitor->analyseFrames(imageStillRequested); } } + +#include "scopemanager.moc"