From 55c685bbb7b7b68e36a450344bac403d5e66dbd3 Mon Sep 17 00:00:00 2001 From: Nicolas Carion Date: Thu, 3 May 2018 01:34:20 +0200 Subject: [PATCH] wip to correctly apply bin's effect --- src/bin/projectclip.cpp | 25 ++++++++++++++++--- .../effectstack/model/effectstackmodel.cpp | 15 +++++++++++ .../effectstack/model/effectstackmodel.hpp | 3 +++ 3 files changed, 40 insertions(+), 3 deletions(-) diff --git a/src/bin/projectclip.cpp b/src/bin/projectclip.cpp index 544bb4ddc..406ed8a9e 100644 --- a/src/bin/projectclip.cpp +++ b/src/bin/projectclip.cpp @@ -425,6 +425,7 @@ void ProjectClip::createVideoMasterProducer() // disable audio but activate video m_videoProducer->set("set.test_audio", 1); m_videoProducer->set("set.test_image", 0); + m_effectStack->addService(m_videoProducer); } } void ProjectClip::createDisabledMasterProducer() @@ -433,6 +434,7 @@ void ProjectClip::createDisabledMasterProducer() m_disabledProducer = cloneProducer(&pCore->getCurrentProfile()->profile()); m_disabledProducer->set("set.test_audio", 1); m_disabledProducer->set("set.test_image", 1); + m_effectStack->addService(m_disabledProducer); } } std::shared_ptr ProjectClip::getTimelineProducer(int clipId, PlaylistState::ClipState state, double speed) @@ -440,17 +442,24 @@ std::shared_ptr ProjectClip::getTimelineProducer(int clipId, Play if (qFuzzyCompare(speed, 1.0)) { // we are requesting a normal speed producer // We can first cleen the speed producers we have for the current id - m_timewarpProducers.erase(clipId); + if (m_timewarpProducers.count(clipId) > 0) { + m_effectStack->removeService(m_timewarpProducers[clipId]); + m_timewarpProducers.erase(clipId); + } if (state == PlaylistState::AudioOnly) { // We need to get an audio producer, if none exists if (m_audioProducers.count(clipId) == 0) { m_audioProducers[clipId] = cloneProducer(&pCore->getCurrentProfile()->profile()); m_audioProducers[clipId]->set("set.test_audio", 0); m_audioProducers[clipId]->set("set.test_image", 1); + m_effectStack->addService(m_audioProducers[clipId]); } return std::shared_ptr(m_audioProducers[clipId]->cut()); } - m_audioProducers.erase(clipId); + if (m_audioProducers.count(clipId) > 0) { + m_effectStack->removeService(m_audioProducers[clipId]); + m_audioProducers.erase(clipId); + } if (state == PlaylistState::VideoOnly) { // we return the video producer createVideoMasterProducer(); @@ -462,7 +471,10 @@ std::shared_ptr ProjectClip::getTimelineProducer(int clipId, Play } // in that case, we need to create a warp producer, if we don't have one - m_audioProducers.erase(clipId); + if (m_audioProducers.count(clipId) > 0) { + m_effectStack->removeService(m_audioProducers[clipId]); + m_audioProducers.erase(clipId); + } std::shared_ptr warpProducer; if (m_timewarpProducers.count(clipId) > 0) { @@ -470,6 +482,8 @@ std::shared_ptr ProjectClip::getTimelineProducer(int clipId, Play // the producer we have is good, use it ! warpProducer = m_timewarpProducers[clipId]; } + // remove in all cases, we add it unconditionally anyways + m_effectStack->removeService(m_timewarpProducers[clipId]); } if (!warpProducer) { QString resource = QString("timewarp:%1:%2").arg(speed).arg(originalProducer()->get("resource")); @@ -485,6 +499,7 @@ std::shared_ptr ProjectClip::getTimelineProducer(int clipId, Play warpProducer->set("set.test_image", 0); } m_timewarpProducers[clipId] = warpProducer; + m_effectStack->addService(m_timewarpProducers[clipId]); return warpProducer; } @@ -534,20 +549,24 @@ std::pair, bool> ProjectClip::giveMasterAndGetTim master->parent().set("loaded", 1); if (state == PlaylistState::AudioOnly) { m_audioProducers[clipId] = std::shared_ptr(&master->parent()); + m_effectStack->addService(m_audioProducers[clipId]); return {master, true}; } if (timeWarp) { m_timewarpProducers[clipId] = std::shared_ptr(&master->parent()); + m_effectStack->addService(m_timewarpProducers[clipId]); return {master, true}; } if (state == PlaylistState::VideoOnly && !m_videoProducer) { // good, we found a master video producer, and we didn't have any m_videoProducer.reset(&master->parent()); + m_effectStack->addService(m_videoProducer); return {master, true}; } if (state == PlaylistState::Disabled && !m_disabledProducer) { // good, we found a master disabled producer, and we didn't have any m_disabledProducer.reset(&master->parent()); + m_effectStack->addService(m_disabledProducer); return {master, true}; } qDebug() << "Warning: weird, we found a clip whose master is not loaded but we already have a master"; diff --git a/src/effects/effectstack/model/effectstackmodel.cpp b/src/effects/effectstack/model/effectstackmodel.cpp index a3c67141e..aa45129c1 100644 --- a/src/effects/effectstack/model/effectstackmodel.cpp +++ b/src/effects/effectstack/model/effectstackmodel.cpp @@ -67,6 +67,18 @@ void EffectStackModel::addService(std::weak_ptr service) std::static_pointer_cast(rootItem->child(i))->plant(m_services.back()); } } +void EffectStackModel::removeService(std::shared_ptr service) +{ + std::vector to_delete; + for (int i = int(m_services.size()) - 1; i >= 0; --i) { + if (service.get() == m_services[i].lock().get()) { + to_delete.push_back(i); + } + } + for (int i : to_delete) { + m_services.erase(m_services.begin() + i); + } +} void EffectStackModel::removeEffect(std::shared_ptr effect) { @@ -445,11 +457,14 @@ void EffectStackModel::moveEffect(int destRow, std::shared_ptr &item) { + qDebug() << "$$$$$$$$$$$$$$$$$$$$$ Planting effect"; QModelIndex ix; if (!item->isRoot()) { auto effectItem = std::static_pointer_cast(item); if (!m_loadingExisting) { + qDebug() << "$$$$$$$$$$$$$$$$$$$$$ Planting effect in " << m_services.size(); for (const auto &service : m_services) { + qDebug() << "$$$$$$$$$$$$$$$$$$$$$ Planting effect in " << (void *)service.lock().get(); effectItem->plant(service); } } diff --git a/src/effects/effectstack/model/effectstackmodel.hpp b/src/effects/effectstack/model/effectstackmodel.hpp index 91fb7676d..569fcd4e5 100644 --- a/src/effects/effectstack/model/effectstackmodel.hpp +++ b/src/effects/effectstack/model/effectstackmodel.hpp @@ -112,6 +112,9 @@ public: /* @brief Append a new service to be managed by this stack */ void addService(std::weak_ptr service); + /* @brief Remove a service from those managed by this stack */ + void removeService(std::shared_ptr service); + public slots: /* @brief Delete an effect from the stack */ void removeEffect(std::shared_ptr effect); -- GitLab