}
}
-void KdenliveDoc::setSceneList()
+int KdenliveDoc::setSceneList()
{
- m_render->setSceneList(m_document.toString(), m_documentProperties.value("position").toInt());
+ if (m_render->setSceneList(m_document.toString(), m_documentProperties.value("position").toInt()) == -1) {
+ // INVALID MLT Consumer, something is wrong
+ return -1;
+ }
m_documentProperties.remove("position");
// m_document xml is now useless, clear it
m_document.clear();
checkProjectClips();
+ return 0;
}
QDomDocument KdenliveDoc::createEmptyDocument(const int videotracks, const int audiotracks)
kDebug() << "+++++++++++++ + + + + CHK PCLIPS";
if (m_render == NULL) return;
m_clipManager->resetProducersList(m_render->producersList());
- return;
-
- // Useless now...
- QList <Mlt::Producer *> prods = m_render->producersList();
- QString id ;
- QString prodId ;
- QString prodTrack ;
- for (int i = 0; i < prods.count(); i++) {
- id = prods.at(i)->get("id");
- prodId = id.section('_', 0, 0);
- prodTrack = id.section('_', 1, 1);
- DocClipBase *clip = m_clipManager->getClipById(prodId);
- if (clip) clip->setProducer(prods.at(i));
- if (clip && clip->clipType() == TEXT && !QFile::exists(clip->fileURL().path())) {
- // regenerate text clip image if required
- //kDebug() << "// TITLE: " << clip->getProperty("titlename") << " Preview file: " << clip->getProperty("resource") << " DOES NOT EXIST";
- QString titlename = clip->getProperty("name");
- QString titleresource;
- if (titlename.isEmpty()) {
- QStringList titleInfo = TitleWidget::getFreeTitleInfo(projectFolder());
- titlename = titleInfo.at(0);
- titleresource = titleInfo.at(1);
- clip->setProperty("name", titlename);
- kDebug() << "// New title set to: " << titlename;
- } else {
- titleresource = TitleWidget::getFreeTitleInfo(projectFolder()).at(1);
- //titleresource = TitleWidget::getTitleResourceFromName(projectFolder(), titlename);
- }
- TitleWidget *dia_ui = new TitleWidget(KUrl(), KUrl(titleresource).directory(), m_render, kapp->activeWindow());
- QDomDocument doc;
- doc.setContent(clip->getProperty("xmldata"));
- dia_ui->setXml(doc);
- QImage pix = dia_ui->renderedPixmap();
- pix.save(titleresource);
- clip->setProperty("resource", titleresource);
- delete dia_ui;
- clip->producer()->set("force_reload", 1);
- }
- }
}
void KdenliveDoc::updatePreviewSettings()
QString getLadspaFile() const;
void setZone(int start, int end);
QPoint zone() const;
- void setSceneList();
+ int setSceneList();
void updatePreviewSettings();
bool isTrackLocked(int ix) const;
void setDocumentProperty(const QString &name, const QString &value);
case 5:
setCurrentPage(m_page5);
break;
-
+ case 6:
+ setCurrentPage(m_page6);
+ break;
+ case 7:
+ setCurrentPage(m_page7);
+ break;
+ default:
+ setCurrentPage(m_page1);
}
}
void MainWindow::newFile(bool showProjectSettings)
{
+ if (!m_timelineArea->isEnabled()) return;
QString profileName;
KUrl projectFolder;
QPoint projectTracks(KdenliveSettings::videotracks(), KdenliveSettings::audiotracks());
}
KdenliveDoc *doc = new KdenliveDoc(KUrl(), projectFolder, m_commandStack, profileName, projectTracks, m_projectMonitor->render, this);
doc->m_autosave = new KAutoSaveFile(KUrl(), doc);
- TrackView *trackView = new TrackView(doc, this);
+ bool ok;
+ TrackView *trackView = new TrackView(doc, &ok, this);
m_timelineArea->addTab(trackView, KIcon("kdenlive"), doc->description());
+ if (!ok) {
+ // MLT is broken
+ m_timelineArea->setEnabled(false);
+ m_projectList->setEnabled(false);
+ m_monitorManager->slotBlockMonitors();
+ slotPreferences(6);
+ return;
+ }
if (m_timelineArea->count() == 1) {
connectDocumentInfo(doc);
connectDocument(trackView, doc);
void MainWindow::activateDocument()
{
- if (m_timelineArea->currentWidget() == NULL) return;
+ if (m_timelineArea->currentWidget() == NULL || !m_timelineArea->isEnabled()) return;
TrackView *currentTab = (TrackView *) m_timelineArea->currentWidget();
KdenliveDoc *currentDoc = currentTab->document();
connectDocumentInfo(currentDoc);
void MainWindow::doOpenFile(const KUrl &url, KAutoSaveFile *stale)
{
+ if (!m_timelineArea->isEnabled()) return;
KdenliveDoc *doc = new KdenliveDoc(url, KdenliveSettings::defaultprojectfolder(), m_commandStack, KdenliveSettings::default_profile(), QPoint(KdenliveSettings::videotracks(), KdenliveSettings::audiotracks()), m_projectMonitor->render, this);
if (stale == NULL) {
stale = new KAutoSaveFile(url, doc);
stale->setParent(doc);
}
connectDocumentInfo(doc);
- TrackView *trackView = new TrackView(doc, this);
+ bool ok;
+ TrackView *trackView = new TrackView(doc, &ok, this);
m_timelineArea->setCurrentIndex(m_timelineArea->addTab(trackView, KIcon("kdenlive"), doc->description()));
+ if (!ok) {
+ m_timelineArea->setEnabled(false);
+ m_projectList->setEnabled(false);
+ m_monitorManager->slotBlockMonitors();
+ slotPreferences(6);
+ return;
+ }
m_timelineArea->setTabToolTip(m_timelineArea->currentIndex(), doc->url().path());
trackView->setDuration(trackView->duration());
trackView->projectView()->initCursorPos(m_projectMonitor->render->seekPosition().frames(doc->fps()));
connect(render, SIGNAL(durationChanged(int)), this, SLOT(adjustRulerSize(int)));
connect(render, SIGNAL(rendererPosition(int)), this, SLOT(seekCursor(int)));
connect(render, SIGNAL(rendererStopped(int)), this, SLOT(rendererStopped(int)));
+ connect(render, SIGNAL(blockMonitors()), this, SIGNAL(blockMonitors()));
//render->createVideoXWindow(m_ui.video_frame->winId(), -1);
}
if (clip != m_currentClip) {
m_currentClip = clip;
- render->setProducer(clip->producer(), position);
+ if (render->setProducer(clip->producer(), position) == -1) {
+ // MLT CONSUMER is broken
+ emit blockMonitors();
+ }
m_position = position;
} else if (position != -1) render->seek(GenTime(position, render->fps()));
}
void adjustMonitorSize();
void zoneUpdated(QPoint);
void saveZone(Render *, QPoint);
+ void blockMonitors();
};
#endif
MonitorManager::MonitorManager(QWidget *parent) :
QObject(parent),
m_clipMonitor(NULL),
- m_projectMonitor(NULL)
+ m_projectMonitor(NULL),
+ m_blocked(false)
{
}
{
m_clipMonitor = clipMonitor;
m_projectMonitor = projectMonitor;
+ connect(m_clipMonitor, SIGNAL(blockMonitors()), this, SLOT(slotBlockMonitors()));
+ connect(m_projectMonitor, SIGNAL(blockMonitors()), this, SLOT(slotBlockMonitors()));
}
void MonitorManager::activateMonitor(QString name)
{
+ if (m_blocked) return;
if (m_activeMonitor == name) return;
if (name == "clip") {
m_projectMonitor->stop();
void MonitorManager::switchMonitors()
{
+ if (m_blocked) return;
if (m_clipMonitor->isActive()) {
m_clipMonitor->stop();
m_projectMonitor->start();
void MonitorManager::stopActiveMonitor()
{
+ if (m_blocked) return;
if (m_clipMonitor->isActive()) m_clipMonitor->pause();
else m_projectMonitor->pause();
}
void MonitorManager::resetProfiles(Timecode tc)
{
+ if (m_blocked) return;
m_timecode = tc;
QTimer::singleShot(300, this, SLOT(slotResetProfiles()));
}
void MonitorManager::slotResetProfiles()
{
+ if (m_blocked) return;
if (m_projectMonitor == NULL || m_clipMonitor == NULL) return;
activateMonitor("clip");
m_clipMonitor->resetProfile();
//m_projectMonitor->refreshMonitor(true);
}
+void MonitorManager::slotBlockMonitors()
+{
+ m_blocked = true;
+ if (m_clipMonitor) {
+ m_clipMonitor->blockSignals(true);
+ m_clipMonitor->setEnabled(false);
+ }
+ if (m_projectMonitor) {
+ m_projectMonitor->blockSignals(true);
+ m_projectMonitor->setEnabled(false);
+ }
+}
+
#include "monitormanager.moc"
void slotStart();
void slotEnd();
void slotResetProfiles();
+ void slotBlockMonitors();
private:
Monitor *m_clipMonitor;
Monitor *m_projectMonitor;
QString m_activeMonitor;
Timecode m_timecode;
+ bool m_blocked;
signals:
void raiseClipMonitor(bool);
/** Create the producer from the MLT XML QDomDocument */
-void Render::setProducer(Mlt::Producer *producer, int position)
+int Render::setProducer(Mlt::Producer *producer, int position)
{
- if (m_winid == -1) return;
+ if (m_winid == -1) return -1;
if (m_mltConsumer) {
m_mltConsumer->stop();
- } else return;
+ } else return -1;
m_mltConsumer->purge();
if (!m_mltProducer || !m_mltProducer->is_valid()) kDebug() << " WARNING - - - - -INVALID PLAYLIST: ";
m_fps = m_mltProducer->get_fps();
- connectPlaylist();
+ int error = connectPlaylist();
if (position != -1) {
m_mltProducer->seek(position);
emit rendererPosition(position);
}
m_isBlocked = false;
+ return error;
}
/** Create the producer from the MLT XML QDomDocument */
-void Render::setSceneList(QDomDocument list, int position)
+int Render::setSceneList(QDomDocument list, int position)
{
- setSceneList(list.toString(), position);
+ return setSceneList(list.toString(), position);
}
/** Create the producer from the MLT XML QDomDocument */
-void Render::setSceneList(QString playlist, int position)
+int Render::setSceneList(QString playlist, int position)
{
- if (m_winid == -1) return;
+ if (m_winid == -1) return -1;
m_isBlocked = true;
+ int error;
qDeleteAll(m_slowmotionProducers.values());
m_slowmotionProducers.clear();
if (m_mltConsumer == NULL) {
kWarning() << "/////// ERROR, TRYING TO USE NULL MLT CONSUMER";
m_isBlocked = false;
- return;
+ return -1;
}
if (!m_mltConsumer->is_stopped()) {
}
kDebug() << "// NEW SCENE LIST DURATION SET TO: " << m_mltProducer->get_playtime();
- connectPlaylist();
+ error = connectPlaylist();
fillSlowMotionProducers();
m_isBlocked = false;
blockSignals(false);
emit refreshDocumentProducers();
+ return error;
//kDebug()<<"// SETSCN LST, POS: "<<position;
//if (position != 0) emit rendererPosition(position);
}
return m_fps;
}
-void Render::connectPlaylist()
+int Render::connectPlaylist()
{
- if (!m_mltConsumer) return;
+ if (!m_mltConsumer) return -1;
//m_mltConsumer->set("refresh", "0");
m_mltConsumer->connect(*m_mltProducer);
m_mltProducer->set_speed(0);
- m_mltConsumer->start();
+ 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."));
+ emit blockMonitors();
+ delete m_mltProducer;
+ m_mltProducer = NULL;
+ return -1;
+ }
emit durationChanged(m_mltProducer->get_playtime());
+ return 0;
//refresh();
- /*
- 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."));
- delete m_mltConsumer;
- m_mltConsumer = NULL;
- }
- else {
- refresh();
- }*/
}
void Render::refreshDisplay()
kDebug() << "----- BROKEN MONITOR: " << m_name << ", RESTART";
return;
}
-
if (m_mltConsumer && m_mltConsumer->is_stopped()) {
kDebug() << "----- MONITOR: " << m_name << " WAS 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."));
- delete m_mltConsumer;
- m_mltConsumer = NULL;
- return;
+ emit blockMonitors();
+ delete m_mltProducer;
+ m_mltProducer = NULL;
} else {
kDebug() << "----- MONITOR: " << m_name << " REFRESH";
m_isBlocked = false;
void Render::stop()
{
+ if (m_mltProducer == NULL) return;
if (m_mltConsumer && !m_mltConsumer->is_stopped()) {
kDebug() << "///////////// RENDER STOPPED: " << m_name;
m_isBlocked = true;
if (show == false) dropFrames = 0;
m_mltConsumer->stop();
m_mltConsumer->set("play.real_time", dropFrames);
- m_mltConsumer->start();
+ if (m_mltConsumer->start() == -1) {
+ emit blockMonitors();
+ delete m_mltProducer;
+ m_mltProducer = NULL;
+ }
+
}
}
QList <Mlt::Producer *> Render::producersList()
{
QList <Mlt::Producer *> prods;
+ if (m_mltProducer == NULL) return prods;
Mlt::Service service(m_mltProducer->parent().get_service());
if (service.type() != tractor_type) return prods;
Mlt::Tractor tractor(service);
void Render::fillSlowMotionProducers()
{
+ if (m_mltProducer == NULL) return;
Mlt::Service service(m_mltProducer->parent().get_service());
if (service.type() != tractor_type) return;
/** Wraps the VEML command of the same name. Sets the current scene list to
be list. */
- void setSceneList(QDomDocument list, int position = 0);
- void setSceneList(QString playlist, int position = 0);
- void setProducer(Mlt::Producer *producer, int position);
+ int setSceneList(QDomDocument list, int position = 0);
+ int setSceneList(QString playlist, int position = 0);
+ int setProducer(Mlt::Producer *producer, int position);
const QString sceneList();
bool saveSceneList(QString path, QDomElement kdenliveData = QDomElement());
/** refresh monitor display */
void refresh();
void slotOsdTimeout();
- void connectPlaylist();
+ int connectPlaylist();
//void initSceneList();
signals: // Signals
void rendererStopped(int);
void removeInvalidClip(const QString &, bool replaceProducer);
void refreshDocumentProducers();
+ void blockMonitors();
public slots: // Public slots
/** Start Consumer */
#include <QScrollBar>
-TrackView::TrackView(KdenliveDoc *doc, QWidget *parent) :
+TrackView::TrackView(KdenliveDoc *doc, bool *ok, QWidget *parent) :
QWidget(parent),
m_scale(1.0),
m_projectTracks(0),
connect(m_trackview, SIGNAL(trackHeightChanged()), this, SLOT(slotRebuildTrackHeaders()));
parseDocument(m_doc->toXml());
- m_doc->setSceneList();
+ int error = m_doc->setSceneList();
+ if (error == -1) *ok = false;
+ else *ok = true;
connect(m_trackview, SIGNAL(cursorMoved(int, int)), m_ruler, SLOT(slotCursorMoved(int, int)));
connect(m_trackview->horizontalScrollBar(), SIGNAL(valueChanged(int)), m_ruler, SLOT(slotMoveRuler(int)));
connect(m_trackview, SIGNAL(mousePosition(int)), this, SIGNAL(mousePosition(int)));
Q_OBJECT
public:
- explicit TrackView(KdenliveDoc *doc, QWidget *parent = 0);
+ explicit TrackView(KdenliveDoc *doc, bool *ok, QWidget *parent = 0);
virtual ~ TrackView();
void setEditMode(const QString & editMode);
const QString & editMode() const;