]> git.sesse.net Git - kdenlive/commitdiff
Fix several issues with audio fadein / fadeout effects, should solve:
authorJean-Baptiste Mardelle <jb@kdenlive.org>
Mon, 3 Nov 2008 23:59:46 +0000 (23:59 +0000)
committerJean-Baptiste Mardelle <jb@kdenlive.org>
Mon, 3 Nov 2008 23:59:46 +0000 (23:59 +0000)
http://www.kdenlive.org:80/mantis/view.php?id=307

svn path=/branches/KDE4/; revision=2620

src/clipitem.cpp
src/customtrackview.cpp
src/effectslist.cpp
src/effectslist.h

index bbd0c45d195f8d52c5f63f27e5e31ec33da65808..40ee65a30b783712766bfd41b9c7ab8302af6cac 100644 (file)
@@ -148,6 +148,20 @@ void ClipItem::initEffect(QDomElement effect) {
             }
         }
     }
+
+    if (effect.attribute("tag") == "volume") {
+        if (effect.attribute("id") == "fadeout") {
+            int end = (duration() + cropStart()).frames(m_fps);
+            int start = end - EffectsList::parameter(effect, "out").toInt();
+            EffectsList::setParameter(effect, "in", QString::number(start));
+            EffectsList::setParameter(effect, "out", QString::number(end));
+        } else if (effect.attribute("id") == "fadein") {
+            int start = cropStart().frames(m_fps);
+            int end = start + EffectsList::parameter(effect, "out").toInt();
+            EffectsList::setParameter(effect, "in", QString::number(start));
+            EffectsList::setParameter(effect, "out", QString::number(end));
+        }
+    }
 }
 
 bool ClipItem::checkKeyFrames() {
@@ -864,6 +878,7 @@ uint ClipItem::fadeOut() const {
 
 
 void ClipItem::setFadeIn(int pos) {
+    if (pos == m_startFade) return;
     int oldIn = m_startFade;
     if (pos < 0) pos = 0;
     if (pos > m_cropDuration.frames(m_fps)) pos = (int)(m_cropDuration.frames(m_fps) / 2);
@@ -873,12 +888,13 @@ void ClipItem::setFadeIn(int pos) {
 }
 
 void ClipItem::setFadeOut(int pos) {
+    if (pos == m_endFade) return;
     int oldOut = m_endFade;
     if (pos < 0) pos = 0;
     if (pos > m_cropDuration.frames(m_fps)) pos = (int)(m_cropDuration.frames(m_fps) / 2);
     m_endFade = pos;
     QRectF rect = boundingRect();
-    update(rect.x() + rect.width() - qMax(oldOut, pos), rect.y(), pos, rect.height());
+    update(rect.x() + rect.width() - qMax(oldOut, pos), rect.y(), qMax(oldOut, pos), rect.height());
 
 }
 
index 478261c6062c4ccc67a4dd00931efe82af311df6..78aa87738268200d39cfe9940206f3a7e5569bf5 100644 (file)
@@ -903,6 +903,18 @@ void CustomTrackView::updateEffect(int track, GenTime pos, QDomElement effect, i
         if (ix == clip->selectedEffectIndex()) {
             clip->setSelectedEffect(ix);
         }
+        if (effect.attribute("tag") == "volume") {
+            // A fade effect was modified, update the clip
+            if (effect.attribute("id") == "fadein") {
+                int pos = effectParams.value("out").toInt();
+                clip->setFadeIn(pos);
+            }
+            if (effect.attribute("id") == "fadeout") {
+                int pos = clip->cropDuration().frames(m_document->fps()) - effectParams.value("in").toInt();
+                clip->setFadeOut(pos);
+            }
+
+        }
     }
     m_document->setModified(true);
 }
@@ -1413,17 +1425,14 @@ void CustomTrackView::mouseReleaseEvent(QMouseEvent * event) {
                 slotDeleteEffect(item, oldeffect);
             } else {
                 end += start;
-                QDomElement effect = MainWindow::audioEffects.getEffectByTag("volume", "fadein");
+                QDomElement effect = oldeffect.cloneNode().toElement();
                 EffectsList::setParameter(effect, "in", QString::number(start));
                 EffectsList::setParameter(effect, "out", QString::number(end));
                 slotUpdateClipEffect(item, oldeffect, effect, ix);
             }
         } else if (item->fadeIn() != 0) {
-            QDomElement effect = MainWindow::audioEffects.getEffectByTag("volume", "fadein");
-            int start = item->cropStart().frames(m_document->fps());
-            int end = item->fadeIn() + start;
-            EffectsList::setParameter(effect, "in", QString::number(start));
-            EffectsList::setParameter(effect, "out", QString::number(end));
+            QDomElement effect = MainWindow::audioEffects.getEffectByTag("volume", "fadein").cloneNode().toElement();
+            EffectsList::setParameter(effect, "out", QString::number(item->fadeIn()));
             slotAddEffect(effect, m_dragItem->startPos(), m_dragItem->track());
         }
     } else if (m_operationMode == FADEOUT) {
@@ -1438,17 +1447,14 @@ void CustomTrackView::mouseReleaseEvent(QMouseEvent * event) {
                 slotDeleteEffect(item, oldeffect);
             } else {
                 start = end - start;
-                QDomElement effect = MainWindow::audioEffects.getEffectByTag("volume", "fadeout");
+                QDomElement effect = oldeffect.cloneNode().toElement();
                 EffectsList::setParameter(effect, "in", QString::number(start));
                 EffectsList::setParameter(effect, "out", QString::number(end));
                 slotUpdateClipEffect(item, oldeffect, effect, ix);
             }
         } else if (item->fadeOut() != 0) {
-            QDomElement effect = MainWindow::audioEffects.getEffectByTag("volume", "fadeout");
-            int end = (item->duration() + item->cropStart()).frames(m_document->fps());
-            int start = end - item->fadeOut();
-            EffectsList::setParameter(effect, "in", QString::number(start));
-            EffectsList::setParameter(effect, "out", QString::number(end));
+            QDomElement effect = MainWindow::audioEffects.getEffectByTag("volume", "fadeout").cloneNode().toElement();
+            EffectsList::setParameter(effect, "out", QString::number(item->fadeOut()));
             slotAddEffect(effect, m_dragItem->startPos(), m_dragItem->track());
         }
     } else if (m_operationMode == KEYFRAME) {
@@ -1543,10 +1549,9 @@ void CustomTrackView::doChangeClipSpeed(ItemInfo info, const double speed, const
     ClipItem *item = getClipItemAt((int) info.startPos.frames(m_document->fps()) + 1, info.track);
     info.track = m_scene->m_tracksList.count() - item->track();
     int endPos = m_document->renderer()->mltChangeClipSpeed(info, speed, oldspeed, baseclip->producer());
-    kDebug() << "//CH CLIP SPEED: " << speed << "x" << oldspeed << ", END POS: " << endPos;
+    //kDebug() << "//CH CLIP SPEED: " << speed << "x" << oldspeed << ", END POS: " << endPos;
     item->setSpeed(speed);
     item->updateRectGeometry();
-    kDebug() << "// SPD CHG: " << item->cropDuration().frames(m_document->fps()) << " - " << endPos;
     if (item->cropDuration().frames(m_document->fps()) > endPos)
         item->AbstractClipItem::resizeEnd(info.startPos.frames(m_document->fps()) + endPos, speed);
 }
@@ -1732,7 +1737,8 @@ void CustomTrackView::updateClipFade(ClipItem * item, bool updateFadeOut) {
         if (end != 0) {
             // there is a fade in effect
             QStringList clipeffects = item->effectNames();
-            QDomElement oldeffect = item->effectAt(clipeffects.indexOf("Fade in"));
+            int effectPos = item->hasEffect("volume", "fadein");
+            QDomElement oldeffect = item->effectAt(effectPos);
             int start = item->cropStart().frames(m_document->fps());
             end += start;
             EffectsList::setParameter(oldeffect, "in", QString::number(start));
@@ -1746,7 +1752,8 @@ void CustomTrackView::updateClipFade(ClipItem * item, bool updateFadeOut) {
         if (start != 0) {
             // there is a fade in effect
             QStringList clipeffects = item->effectNames();
-            QDomElement oldeffect = item->effectAt(clipeffects.indexOf("Fade out"));
+            int effectPos = item->hasEffect("volume", "fadeout");
+            QDomElement oldeffect = item->effectAt(effectPos);
             int end = (item->duration() - item->cropStart()).frames(m_document->fps());
             start = end - start;
             EffectsList::setParameter(oldeffect, "in", QString::number(start));
index c4dfe621019505551f82241bdb0634508a6940ef..b0ba57c76f18fd7712fd79574e0aa312f7613434 100644 (file)
@@ -164,7 +164,7 @@ EffectsList EffectsList::clone() const {
 }
 
 // static
-void EffectsList::setParameter(QDomElement effect, QString name, QString value) {
+void EffectsList::setParameter(QDomElement effect, const QString &name, const QString &value) {
     QDomNodeList params = effect.elementsByTagName("parameter");
     for (int i = 0; i < params.count(); i++) {
         QDomElement e = params.item(i).toElement();
@@ -175,3 +175,15 @@ void EffectsList::setParameter(QDomElement effect, QString name, QString value)
     }
 }
 
+// static
+QString EffectsList::parameter(QDomElement effect, const QString &name) {
+    QDomNodeList params = effect.elementsByTagName("parameter");
+    for (int i = 0; i < params.count(); i++) {
+        QDomElement e = params.item(i).toElement();
+        if (e.attribute("name") == name) {
+            return e.attribute("value");
+        }
+    }
+    return QString();
+}
+
index fe36a0c37a196cb6ac6013a0d450726487cfa4fa..ff417d58bd61bec206d28f989d010f4e12c98dc5 100644 (file)
@@ -44,7 +44,8 @@ public:
     QMap <QString, QString> effect(const QString & name);
     EffectsList clone() const;
     static bool hasKeyFrames(QDomElement effect);
-    static void setParameter(QDomElement effect, QString name, QString value);
+    static void setParameter(QDomElement effect, const QString &name, const QString &value);
+    static QString parameter(QDomElement effect, const QString &name);
 };
 
 #endif