]> git.sesse.net Git - kdenlive/blobdiff - src/renderer.cpp
Several small adjustments for monitor switching
[kdenlive] / src / renderer.cpp
index ebee863cd116ae0142af6eed8f44df8ae2a5874c..8aefda7abce5ccc225746ba92aba7015e7051d07 100644 (file)
@@ -107,6 +107,8 @@ Render::Render(const QString & rendererName, int winid, QString profile, QWidget
     m_mltConsumer(NULL),
     m_mltProducer(NULL),
     m_mltProfile(NULL),
+    m_showFrameEvent(NULL),
+    m_pauseEvent(NULL),
     m_externalConsumer(false),
     m_isZoneMode(false),
     m_isLoopMode(false),
@@ -119,6 +121,9 @@ Render::Render(const QString & rendererName, int winid, QString profile, QWidget
     m_mltProducer = m_blackClip->cut(0, 1);
     m_mltConsumer->connect(*m_mltProducer);
     m_mltProducer->set_speed(0.0);
+    m_refreshTimer.setSingleShot(true);
+    m_refreshTimer.setInterval(50);
+    connect(&m_refreshTimer, SIGNAL(timeout()), this, SLOT(refresh()));
 }
 
 Render::~Render()
@@ -133,6 +138,8 @@ void Render::closeMlt()
     //delete m_osdTimer;
     m_requestList.clear();
     m_infoThread.waitForFinished();
+    if (m_showFrameEvent) delete m_showFrameEvent;
+    if (m_pauseEvent) delete m_pauseEvent;
     if (m_mltConsumer) delete m_mltConsumer;
     if (m_mltProducer) delete m_mltProducer;
     /*if (m_mltProducer) {
@@ -205,7 +212,7 @@ void Render::buildConsumer(const QString &profileName)
                 delete[] tmp;
                 if (m_mltConsumer->is_valid()) {
                     m_externalConsumer = true;
-                    m_mltConsumer->listen("consumer-frame-show", this, (mlt_listener) consumer_frame_show);
+                    m_showFrameEvent = m_mltConsumer->listen("consumer-frame-show", this, (mlt_listener) consumer_frame_show);
                     m_mltConsumer->set("terminate_on_pause", 0);
                     m_mltConsumer->set("deinterlace_method", "onefield");
                     m_mltConsumer->set("real_time", KdenliveSettings::mltthreads());
@@ -233,12 +240,11 @@ void Render::buildConsumer(const QString &profileName)
         m_mltConsumer = new Mlt::Consumer(*m_mltProfile, "sdl_audio");
         m_mltConsumer->set("preview_off", 1);
         m_mltConsumer->set("preview_format", mlt_image_rgb24a);
-        m_mltConsumer->listen("consumer-frame-show", this, (mlt_listener) consumer_gl_frame_show);
+        m_showFrameEvent = m_mltConsumer->listen("consumer-frame-show", this, (mlt_listener) consumer_gl_frame_show);
     } else {
         m_mltConsumer = new Mlt::Consumer(*m_mltProfile, "sdl_preview");
-        // FIXME: the event object returned by the listen gets leaked...
-        m_mltConsumer->listen("consumer-frame-show", this, (mlt_listener) consumer_frame_show);
-        m_mltConsumer->listen("consumer-sdl-paused", this, (mlt_listener) consumer_paused);
+        m_showFrameEvent = m_mltConsumer->listen("consumer-frame-show", this, (mlt_listener) consumer_frame_show);
+        m_pauseEvent = m_mltConsumer->listen("consumer-sdl-paused", this, (mlt_listener) consumer_paused);
         m_mltConsumer->set("window_id", m_winid);
     }
     m_mltConsumer->set("resize", 1);
@@ -295,6 +301,7 @@ bool Render::hasProfile(const QString &profileName) const
 
 int Render::resetProfile(const QString &profileName, bool dropSceneList)
 {
+    m_refreshTimer.stop();
     if (m_mltConsumer) {
         if (m_externalConsumer == KdenliveSettings::external_display()) {
             if (KdenliveSettings::external_display() && m_activeProfile == profileName) return 1;
@@ -312,6 +319,10 @@ int Render::resetProfile(const QString &profileName, bool dropSceneList)
         if (m_isSplitView) slotSplitView(false);
         if (!m_mltConsumer->is_stopped()) m_mltConsumer->stop();
         m_mltConsumer->purge();
+        if (m_showFrameEvent) delete m_showFrameEvent;
+        m_showFrameEvent = NULL;
+        if (m_pauseEvent) delete m_pauseEvent;
+        m_pauseEvent = NULL;
         delete m_mltConsumer;
         m_mltConsumer = NULL;
     }
@@ -987,6 +998,7 @@ void Render::initSceneList()
 
 int Render::setProducer(Mlt::Producer *producer, int position)
 {
+    m_refreshTimer.stop();
     QMutexLocker locker(&m_mutex);
     QString currentId;
     int consumerPosition = 0;
@@ -1041,6 +1053,7 @@ int Render::setSceneList(QDomDocument list, int position)
 
 int Render::setSceneList(QString playlist, int position)
 {
+    m_refreshTimer.stop();
     QMutexLocker locker(&m_mutex);
     if (m_winid == -1) return -1;
     int error = 0;
@@ -1264,6 +1277,10 @@ int Render::connectPlaylist()
     if (m_mltConsumer->start() == -1) {
         // ARGH CONSUMER BROKEN!!!!
         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."));
+        if (m_showFrameEvent) delete m_showFrameEvent;
+        m_showFrameEvent = NULL;
+        if (m_pauseEvent) delete m_pauseEvent;
+        m_pauseEvent = NULL;
         delete m_mltConsumer;
         m_mltConsumer = NULL;
         return -1;
@@ -1377,8 +1394,8 @@ void Render::switchPlay(bool play)
         if (m_mltConsumer->is_stopped()) {
             m_mltConsumer->start();
         }
-        m_mltConsumer->set("refresh", "1");
         m_mltProducer->set_speed(1.0);
+        m_mltConsumer->set("refresh", "1");
     } else if (!play) {
         m_mltProducer->set_speed(0.0);
         m_mltConsumer->set("refresh", 0);
@@ -1473,12 +1490,16 @@ void Render::seekToFrameDiff(int diff)
 
 void Render::doRefresh()
 {
-    // Use a Timer so that we don't refresh too much
-    QMutexLocker locker(&m_mutex);
+    m_refreshTimer.start();
+    /*QMutexLocker locker(&m_mutex);
     if (m_mltConsumer) {
-        if (m_mltConsumer->is_stopped()) m_mltConsumer->start();
+        if (m_mltConsumer->is_stopped()) {
+            kDebug()<<"pppppppppppppppp\n\nSTARTING CONSUMER: "<<m_name<<m_mltConsumer->start();
+        }
+        //m_mltProducer->set_speed(1);
         m_mltConsumer->set("refresh", 1);
-    }
+        //m_mltProducer->set_speed(0);
+    }*/
 }
 
 void Render::refresh()
@@ -1512,7 +1533,7 @@ void Render::setDropFrames(bool show)
     }
 }
 
-double Render::playSpeed()
+double Render::playSpeed() const
 {
     if (m_mltProducer) return m_mltProducer->get_speed();
     return 0.0;