From 764e734c9f3737c076c1a272c8641e0c59add698 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Mardelle Date: Sun, 17 Feb 2013 11:56:00 +0100 Subject: [PATCH] Try to fix monitor confusion: http://kdenlive.org/mantis/view.php?id=2986 --- src/monitor.cpp | 1 + src/monitormanager.cpp | 6 +++++- src/renderer.cpp | 40 ++++++++++++++++++++++++++-------------- src/renderer.h | 7 +++++++ src/smallruler.cpp | 1 + 5 files changed, 40 insertions(+), 15 deletions(-) diff --git a/src/monitor.cpp b/src/monitor.cpp index 33155581..27b28de3 100644 --- a/src/monitor.cpp +++ b/src/monitor.cpp @@ -460,6 +460,7 @@ void Monitor::slotSetZoneEnd() // virtual void Monitor::mousePressEvent(QMouseEvent * event) { + if (render) render->setActiveMonitor(); if (event->button() != Qt::RightButton) { if (videoBox->geometry().contains(event->pos()) && (!m_overlay || !m_overlay->underMouse())) { m_dragStarted = true; diff --git a/src/monitormanager.cpp b/src/monitormanager.cpp index 8a065bf0..ca23d9a3 100644 --- a/src/monitormanager.cpp +++ b/src/monitormanager.cpp @@ -53,6 +53,9 @@ void MonitorManager::initMonitors(Monitor *clipMonitor, Monitor *projectMonitor, { m_clipMonitor = clipMonitor; m_projectMonitor = projectMonitor; + + connect(m_clipMonitor->render, SIGNAL(activateMonitor(Kdenlive::MONITORID)), this, SLOT(activateMonitor(Kdenlive::MONITORID))); + connect(m_projectMonitor->render, SIGNAL(activateMonitor(Kdenlive::MONITORID)), this, SLOT(activateMonitor(Kdenlive::MONITORID))); m_monitorsList.append(clipMonitor); m_monitorsList.append(projectMonitor); @@ -99,8 +102,9 @@ bool MonitorManager::activateMonitor(Kdenlive::MONITORID name, bool forceRefresh if (m_activeMonitor) { m_activeMonitor->blockSignals(true); m_activeMonitor->parentWidget()->raise(); + m_activeMonitor->blockSignals(false); m_activeMonitor->start(); - m_activeMonitor->blockSignals(false); + } emit checkColorScopes(); return (m_activeMonitor != NULL); diff --git a/src/renderer.cpp b/src/renderer.cpp index eea8cd84..983896d0 100644 --- a/src/renderer.cpp +++ b/src/renderer.cpp @@ -127,7 +127,8 @@ Render::Render(Kdenlive::MONITORID rendererName, int winid, QString profile, QWi m_isSplitView(false), m_blackClip(NULL), m_winid(winid), - m_paused(true) + m_paused(true), + m_isActive(false) { qRegisterMetaType ("stringMap"); analyseAudio = KdenliveSettings::monitor_audio(); @@ -412,7 +413,7 @@ int Render::resetProfile(const QString &profileName, bool dropSceneList) void Render::seek(GenTime time) { - if (!m_mltProducer) + if (!m_mltProducer || !m_isActive) return; int pos = time.frames(m_fps); seek(pos); @@ -1248,6 +1249,7 @@ void Render::startConsumer() { return; } m_mltConsumer->set("refresh", 1); + m_isActive = true; } int Render::setSceneList(QDomDocument list, int position) @@ -1550,7 +1552,10 @@ void Render::start() kDebug() << "----- BROKEN MONITOR: " << m_name << ", RESTART"; return; } - if (!m_mltConsumer) return; + if (!m_mltConsumer) { + kDebug()<<" / - - - STARTED BEFORE CONSUMER!!!"; + return; + } if (m_mltConsumer->is_stopped()) { if (m_mltConsumer->start() == -1) { //KMessageBox::error(qApp->activeWindow(), i18n("Could not create the video preview window.\nThere is something wrong with your Kdenlive install or your driver settings, please fix it.")); @@ -1567,6 +1572,7 @@ void Render::stop() requestedSeekPosition = SEEK_INACTIVE; m_refreshTimer.stop(); QMutexLocker locker(&m_mutex); + m_isActive = false; if (m_mltProducer == NULL) return; if (m_mltConsumer) { m_mltConsumer->set("refresh", 0); @@ -1585,6 +1591,7 @@ void Render::stop(const GenTime & startTime) requestedSeekPosition = SEEK_INACTIVE; m_refreshTimer.stop(); QMutexLocker locker(&m_mutex); + m_isActive = false; if (m_mltProducer) { if (m_isZoneMode) resetZoneMode(); m_mltProducer->set_speed(0.0); @@ -1596,7 +1603,7 @@ void Render::stop(const GenTime & startTime) void Render::pause() { requestedSeekPosition = SEEK_INACTIVE; - if (!m_mltProducer || !m_mltConsumer) + if (!m_mltProducer || !m_mltConsumer || !m_isActive) return; m_paused = true; m_mltProducer->set_speed(0.0); @@ -1605,11 +1612,16 @@ void Render::pause() m_mltProducer->seek(m_mltConsumer->position());*/ } +void Render::setActiveMonitor() +{ + if (!m_isActive) emit activateMonitor(m_name); +} + void Render::switchPlay(bool play) { QMutexLocker locker(&m_mutex); requestedSeekPosition = SEEK_INACTIVE; - if (!m_mltProducer || !m_mltConsumer) + if (!m_mltProducer || !m_mltConsumer || !m_isActive) return; if (m_isZoneMode) resetZoneMode(); if (play && m_paused) { @@ -1640,7 +1652,7 @@ void Render::switchPlay(bool play) void Render::play(double speed) { requestedSeekPosition = SEEK_INACTIVE; - if (!m_mltProducer) return; + if (!m_mltProducer || !m_isActive) return; double current_speed = m_mltProducer->get_speed(); if (current_speed == speed) return; if (m_isZoneMode) resetZoneMode(); @@ -1656,7 +1668,7 @@ void Render::play(double speed) void Render::play(const GenTime & startTime) { requestedSeekPosition = SEEK_INACTIVE; - if (!m_mltProducer || !m_mltConsumer) + if (!m_mltProducer || !m_mltConsumer || !m_isActive) return; m_paused = false; m_mltProducer->seek((int)(startTime.frames(m_fps))); @@ -1667,7 +1679,7 @@ void Render::play(const GenTime & startTime) void Render::loopZone(const GenTime & startTime, const GenTime & stopTime) { requestedSeekPosition = SEEK_INACTIVE; - if (!m_mltProducer || !m_mltConsumer) + if (!m_mltProducer || !m_mltConsumer || !m_isActive) return; //m_mltProducer->set("eof", "loop"); m_isLoopMode = true; @@ -1678,7 +1690,7 @@ void Render::loopZone(const GenTime & startTime, const GenTime & stopTime) void Render::playZone(const GenTime & startTime, const GenTime & stopTime) { requestedSeekPosition = SEEK_INACTIVE; - if (!m_mltProducer || !m_mltConsumer) + if (!m_mltProducer || !m_mltConsumer || !m_isActive) return; m_mltProducer->set("out", (int)(stopTime.frames(m_fps))); m_mltProducer->seek((int)(startTime.frames(m_fps))); @@ -1699,7 +1711,7 @@ void Render::resetZoneMode() void Render::seekToFrame(int pos) { - if (!m_mltProducer) + if (!m_mltProducer || !m_isActive) return; resetZoneMode(); seek(pos); @@ -1707,7 +1719,7 @@ void Render::seekToFrame(int pos) void Render::seekToFrameDiff(int diff) { - if (!m_mltProducer) + if (!m_mltProducer || !m_isActive) return; resetZoneMode(); if (requestedSeekPosition == SEEK_INACTIVE) @@ -1717,19 +1729,19 @@ void Render::seekToFrameDiff(int diff) void Render::refreshIfActive() { - if (!m_mltConsumer->is_stopped() && m_mltProducer && m_paused) m_refreshTimer.start(); + if (!m_mltConsumer->is_stopped() && m_mltProducer && m_paused && m_isActive) m_refreshTimer.start(); } void Render::doRefresh() { - if (m_mltProducer && m_paused) m_refreshTimer.start(); + if (m_mltProducer && m_paused && m_isActive) m_refreshTimer.start(); } void Render::refresh() { m_refreshTimer.stop(); QMutexLocker locker(&m_mutex); - if (!m_mltProducer) + if (!m_mltProducer || !m_isActive) return; if (m_mltConsumer) { if (m_mltConsumer->is_stopped()) m_mltConsumer->start(); diff --git a/src/renderer.h b/src/renderer.h index 972feb03..c65d2cb6 100644 --- a/src/renderer.h +++ b/src/renderer.h @@ -338,6 +338,9 @@ Q_OBJECT public: /** @brief Check if the installed FFmpeg / Libav supports x11grab */ static bool checkX11Grab(); + /** @brief Ask to set this monitor as active */ + void setActiveMonitor(); + QSemaphore showFrameSemaphore; bool externalConsumer; @@ -385,6 +388,8 @@ private: QFuture m_infoThread; QList m_requestList; bool m_paused; + /** @brief True if this monitor is active. */ + bool m_isActive; void closeMlt(); void mltCheckLength(Mlt::Tractor *tractor); @@ -464,6 +469,8 @@ signals: void showAudioSignal(const QVector &); void addClip(const KUrl &, stringMap); void checkSeeking(); + /** @brief Activate current monitor. */ + void activateMonitor(Kdenlive::MONITORID); void mltFrameReceived(Mlt::Frame *); public slots: diff --git a/src/smallruler.cpp b/src/smallruler.cpp index b476c038..df28a8d9 100644 --- a/src/smallruler.cpp +++ b/src/smallruler.cpp @@ -122,6 +122,7 @@ QPoint SmallRuler::zone() // virtual void SmallRuler::mousePressEvent(QMouseEvent * event) { + m_render->setActiveMonitor(); const int pos = event->x() / m_scale; if (event->button() == Qt::RightButton) { // Right button clicked, move selection zone -- 2.39.2