From: Jean-Baptiste Mardelle Date: Mon, 3 Nov 2008 23:59:46 +0000 (+0000) Subject: Fix several issues with audio fadein / fadeout effects, should solve: X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=eaa145ede7280718ff42cbbc146433ce43bb4101;p=kdenlive Fix several issues with audio fadein / fadeout effects, should solve: http://www.kdenlive.org:80/mantis/view.php?id=307 svn path=/branches/KDE4/; revision=2620 --- diff --git a/src/clipitem.cpp b/src/clipitem.cpp index bbd0c45d..40ee65a3 100644 --- a/src/clipitem.cpp +++ b/src/clipitem.cpp @@ -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()); } diff --git a/src/customtrackview.cpp b/src/customtrackview.cpp index 478261c6..78aa8773 100644 --- a/src/customtrackview.cpp +++ b/src/customtrackview.cpp @@ -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)); diff --git a/src/effectslist.cpp b/src/effectslist.cpp index c4dfe621..b0ba57c7 100644 --- a/src/effectslist.cpp +++ b/src/effectslist.cpp @@ -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(); +} + diff --git a/src/effectslist.h b/src/effectslist.h index fe36a0c3..ff417d58 100644 --- a/src/effectslist.h +++ b/src/effectslist.h @@ -44,7 +44,8 @@ public: QMap 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