From 04b9d547a562f35c58ee034ebfe09ec4ea414c48 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Mardelle Date: Tue, 14 Oct 2008 15:05:46 +0000 Subject: [PATCH] Fix crash on app close svn path=/branches/KDE4/; revision=2470 --- src/mainwindow.cpp | 1 + src/monitor.cpp | 8 ++++++++ src/monitor.h | 1 + src/monitormanager.cpp | 5 +++++ src/monitormanager.h | 1 + src/renderer.cpp | 12 ++++++++++++ src/renderer.h | 1 + 7 files changed, 29 insertions(+) diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 82bc42ef..7a73edd4 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -318,6 +318,7 @@ void MainWindow::queryQuit() { //virtual bool MainWindow::queryClose() { saveOptions(); + if (m_monitorManager) m_monitorManager->stopActiveMonitor(); if (m_activeDocument && m_activeDocument->isModified()) { switch (KMessageBox::warningYesNoCancel(this, i18n("Save changes to document ?"))) { case KMessageBox::Yes : diff --git a/src/monitor.cpp b/src/monitor.cpp index ef6426f5..26772877 100644 --- a/src/monitor.cpp +++ b/src/monitor.cpp @@ -463,6 +463,14 @@ void Monitor::refreshMonitor(bool visible) { } } +void Monitor::pause() { + if (render == NULL) return; + if (!m_isActive) m_monitorManager->activateMonitor(m_name); + render->pause(); + //m_playAction->setChecked(true); + //m_playAction->setIcon(m_pauseIcon); +} + void Monitor::slotPlay() { if (render == NULL) return; if (!m_isActive) m_monitorManager->activateMonitor(m_name); diff --git a/src/monitor.h b/src/monitor.h index e43aefa9..017864d4 100644 --- a/src/monitor.h +++ b/src/monitor.h @@ -54,6 +54,7 @@ public: QString name() const; void resetSize(); bool isActive() const; + void pause(); protected: virtual void mousePressEvent(QMouseEvent * event); diff --git a/src/monitormanager.cpp b/src/monitormanager.cpp index 9b44fe2d..36459bd0 100644 --- a/src/monitormanager.cpp +++ b/src/monitormanager.cpp @@ -67,6 +67,11 @@ void MonitorManager::switchMonitors() { } } +void MonitorManager::stopActiveMonitor() { + if (m_clipMonitor->isActive()) m_clipMonitor->pause(); + else m_projectMonitor->pause(); +} + void MonitorManager::slotPlay() { if (m_clipMonitor->isActive()) m_clipMonitor->slotPlay(); else m_projectMonitor->slotPlay(); diff --git a/src/monitormanager.h b/src/monitormanager.h index 6d9a9a7b..4eea7141 100644 --- a/src/monitormanager.h +++ b/src/monitormanager.h @@ -35,6 +35,7 @@ public: Timecode timecode(); void switchMonitors(); void resetProfiles(Timecode tc); + void stopActiveMonitor(); public slots: void activateMonitor(QString name = QString::null); diff --git a/src/renderer.cpp b/src/renderer.cpp index 74b6ceb2..394bb466 100644 --- a/src/renderer.cpp +++ b/src/renderer.cpp @@ -1006,6 +1006,18 @@ void Render::stop(const GenTime & startTime) { m_mltConsumer->purge(); } +void Render::pause() { + if (!m_mltProducer || !m_mltConsumer) + return; + if (m_isZoneMode) resetZoneMode(); + m_isBlocked = true; + m_mltConsumer->set("refresh", 0); + m_mltProducer->set_speed(0.0); + emit rendererPosition(m_framePosition); + m_mltProducer->seek(m_framePosition); + m_mltConsumer->purge(); +} + void Render::switchPlay() { if (!m_mltProducer || !m_mltConsumer) return; diff --git a/src/renderer.h b/src/renderer.h index 6d8d8427..45688b92 100644 --- a/src/renderer.h +++ b/src/renderer.h @@ -101,6 +101,7 @@ Q_OBJECT public: backwards. Does not specify start/stop times for playback.*/ void play(double speed); void switchPlay(); + void pause(); /** stop playing */ void stop(const GenTime & startTime); void setVolume(double volume); -- 2.39.2