Q_OBJECT public:
/** @brief Build an abstract MLT Renderer
- * @param rendererName A unique identifier for this renderer
+ * @param name A unique identifier for this renderer
* @param winid The parent widget identifier (required for SDL display). Set to 0 for OpenGL rendering
* @param profile The MLT profile used for the renderer (default one will be used if empty). */
- AbstractRender(QWidget *parent = 0):QObject(parent),sendFrameForAnalysis(false) {};
+ AbstractRender(const QString &name, QWidget *parent = 0):QObject(parent), m_name(name), sendFrameForAnalysis(false) {};
/** @brief Destroy the MLT Renderer. */
virtual ~AbstractRender() {};
/** @brief This property is used to decide if the renderer should convert it's frames to QImage for use in other Kdenlive widgets. */
bool sendFrameForAnalysis;
+
+ const QString &name() const {return m_name;};
/** @brief Someone needs us to send again a frame. */
virtual void sendFrameUpdate() = 0;
+private:
+ QString m_name;
+
signals:
/** @brief The renderer refreshed the current frame. */
void frameUpdated(QImage);
void AbstractGfxScopeWidget::slotActiveMonitorChanged()
{
if (m_activeRender) {
+ if (m_activeRender == m_manager->activeRenderer()) return;
bool b = m_activeRender->disconnect(this);
Q_ASSERT(b);
}
-
m_activeRender = m_manager->activeRenderer();
+
+ if (m_activeRender) {
#ifdef DEBUG_AGSW
qDebug() << "Active monitor has changed in " << widgetName() << ". Is the clip monitor active now? " << m_activeRender->name();
#endif
-
- //b &= connect(m_activeRender, SIGNAL(rendererPosition(int)), this, SLOT(slotRenderZoneUpdated()));
- if (m_activeRender) {
bool b = connect(m_activeRender, SIGNAL(frameUpdated(QImage)), this, SLOT(slotRenderZoneUpdated(QImage)));
Q_ASSERT(b);
}
forceUpdate(true);
}
+void AbstractGfxScopeWidget::slotClearMonitor()
+{
+ m_activeRender = NULL;
+}
+
void AbstractGfxScopeWidget::slotRenderZoneUpdated(QImage frame)
{
m_scopeImage = frame;
This slot must be connected in the implementing class, it is *not*
done in this abstract class. */
void slotActiveMonitorChanged();
+ void slotClearMonitor();
protected slots:
virtual void slotAutoRefreshToggled(bool autoRefresh);
//connect(m_monitorManager, SIGNAL(connectMonitors()), this, SLOT(slotConnectMonitors()));
connect(m_monitorManager, SIGNAL(raiseMonitor(AbstractMonitor *)), this, SLOT(slotRaiseMonitor(AbstractMonitor *)));
connect(m_monitorManager, SIGNAL(checkColorScopes()), this, SLOT(slotUpdateColorScopes()));
+ connect(m_monitorManager, SIGNAL(clearScopes()), this, SLOT(slotClearColorScopes()));
connect(m_effectList, SIGNAL(addEffect(const QDomElement)), this, SLOT(slotAddEffect(const QDomElement)));
connect(m_effectList, SIGNAL(reloadEffects()), this, SLOT(slotReloadEffects()));
}
}
+void MainWindow::slotClearColorScopes()
+{
+ for (int i = 0; i < m_gfxScopesList.count(); i++) {
+ static_cast<AbstractGfxScopeWidget *>(m_gfxScopesList.at(i)->widget())->slotClearMonitor();
+ }
+}
+
void MainWindow::slotOpenStopmotion()
{
if (m_stopmotion == NULL) {
void slotDoUpdateAudioScopeFrameRequest();
/** @brief When switching between monitors, update the visible scopes. */
void slotUpdateColorScopes();
+ /** @brief Active monitor deleted, clear scopes. */
+ void slotClearColorScopes();
/** @brief Switch current monitor to fullscreen. */
void slotSwitchFullscreen();
/** @brief Open the stopmotion dialog. */
MltDeviceCapture::MltDeviceCapture(QString profile, VideoPreviewContainer *surface, QWidget *parent) :
- AbstractRender(parent),
+ AbstractRender("capture", parent),
doCapture(0),
sendFrameForAnalysis(false),
m_mltConsumer(NULL),
{
if (m_blocked) return;
if (m_projectMonitor == NULL || m_clipMonitor == NULL) return;
+ blockSignals(true);
QString active = m_activeMonitor ? m_activeMonitor->name() : QString();
activateMonitor("clip");
m_clipMonitor->resetProfile(KdenliveSettings::current_profile());
m_projectMonitor->updateTimecodeFormat();
//m_projectMonitor->refreshMonitor(true);
if (!active.isEmpty()) activateMonitor(active);
+ blockSignals(false);
+ emit raiseMonitor(m_activeMonitor);
+ emit checkColorScopes();
}
void MonitorManager::slotRefreshCurrentMonitor()
}
}
+void MonitorManager::clearScopeSource()
+{
+ emit clearScopes();
+}
+
void MonitorManager::updateScopeSource()
{
emit checkColorScopes();
AbstractRender *MonitorManager::activeRenderer()
{
- if (m_activeMonitor) return m_activeMonitor->abstractRender();
+ if (m_activeMonitor) {
+ return m_activeMonitor->abstractRender();
+ }
return NULL;
}
void stopActiveMonitor();
AbstractRender *activeRenderer();
void updateScopeSource();
+ void clearScopeSource();
public slots:
void raiseMonitor(AbstractMonitor *);
/** @brief When the monitor changed, update the visible color scopes */
void checkColorScopes();
+ /** @brief When the active monitor renderer was deleted, reset color scopes */
+ void clearScopes();
};
m_recAction = toolbar->addAction(KIcon("media-record"), i18n("Record"));
connect(m_recAction, SIGNAL(triggered()), this, SLOT(slotRecord()));
- m_recAction->setCheckable(true);
toolbar->addSeparator();
m_fwdAction->setVisible(ix == FIREWIRE);
m_discAction->setVisible(ix == FIREWIRE);
m_rewAction->setVisible(ix == FIREWIRE);
+ m_recAction->setEnabled(ix != FIREWIRE);
m_logger.setVisible(ix == BLACKMAGIC);
if (m_captureDevice) {
// MLT capture still running, abort
m_captureDevice->stop();
delete m_captureDevice;
m_captureDevice = NULL;
+ m_manager->clearScopeSource();
}
switch (ix) {
case SCREENGRAB:
m_discAction->setEnabled(false);
m_rewAction->setEnabled(false);
m_fwdAction->setEnabled(false);
- m_recAction->setEnabled(true);
m_stopAction->setEnabled(false);
m_playAction->setEnabled(false);
if (KdenliveSettings::rmd_path().isEmpty()) {
//video_frame->setText(i18n("Press record button\nto start screen capture"));
break;
case VIDEO4LINUX:
- m_discAction->setEnabled(false);
- m_rewAction->setEnabled(false);
- m_fwdAction->setEnabled(false);
- m_recAction->setEnabled(true);
m_stopAction->setEnabled(false);
m_playAction->setEnabled(true);
checkDeviceAvailability();
break;
case BLACKMAGIC:
- m_recAction->setEnabled(true);
m_stopAction->setEnabled(false);
m_playAction->setEnabled(true);
-
capturefile = m_capturePath;
if (!capturefile.endsWith("/")) capturefile.append("/");
capturename = KdenliveSettings::decklink_filename();
break;
default: // FIREWIRE
m_discAction->setEnabled(true);
- m_recAction->setEnabled(false);
m_stopAction->setEnabled(false);
m_playAction->setEnabled(false);
m_rewAction->setEnabled(false);
m_playAction->setIcon(m_playIcon);
m_isPlaying = false;
break;
- case VIDEO4LINUX:
- if (m_captureDevice) {
- m_captureDevice->stop();
- }
- m_playAction->setEnabled(true);
- m_stopAction->setEnabled(false);
- break;
case SCREENGRAB:
m_captureProcess->write("q\n", 3);
QTimer::singleShot(1000, m_captureProcess, SLOT(kill()));
break;
+ case VIDEO4LINUX:
case BLACKMAGIC:
if (m_captureDevice) {
m_captureDevice->stop();
}
- //m_bmCapture->stopPreview();
m_playAction->setEnabled(true);
m_stopAction->setEnabled(false);
m_recAction->setEnabled(true);
m_stopAction->setEnabled(true);
}
- /*m_captureArgs << KdenliveSettings::video4capture().simplified().split(' ') << KdenliveSettings::video4encoding().simplified().split(' ') << "-f" << KdenliveSettings::video4container() << "-";
- m_displayArgs << "-f" << KdenliveSettings::video4container() << "-x" << QString::number(video_frame->width()) << "-y" << QString::number(video_frame->height()) << "-";
- m_captureProcess->setStandardOutputProcess(m_displayProcess);
- kDebug() << "Capture: Running ffmpeg " << m_captureArgs.join(" ");
- m_captureProcess->start("ffmpeg", m_captureArgs);*/
break;
case BLACKMAGIC:
path = KdenliveSettings::current_profile();
m_playAction->setEnabled(false);
m_stopAction->setEnabled(true);
}
- //m_bmCapture->startPreview(KdenliveSettings::decklink_capturedevice(), KdenliveSettings::hdmi_capturemode());
- m_playAction->setEnabled(false);
- m_stopAction->setEnabled(true);
- m_recAction->setEnabled(true);
break;
default:
break;
slotStopCapture();
slotSetInfoMessage(i18n("Capture stopped"));
m_isCapturing = false;
- m_recAction->setChecked(false);
+ m_recAction->setEnabled(true);
+ m_stopAction->setEnabled(false);
if (autoaddbox->isChecked() && QFile::exists(m_captureFile.path())) emit addProjectClip(m_captureFile);
//QTimer::singleShot(1000, this, SLOT(slotStartCapture()));
break;
if (m_captureDevice->slotStartCapture(KdenliveSettings::v4l_parameters(), m_captureFile.path(), playlist, enable_preview->isChecked())) {
m_videoBox->setHidden(false);
m_isCapturing = true;
+ m_recAction->setEnabled(false);
+ m_stopAction->setEnabled(true);
}
else {
video_frame->setText(i18n("Failed to start Video4Linux,\ncheck your parameters..."));
m_videoBox->setHidden(true);
m_isCapturing = false;
- m_recAction->setChecked(false);
}
/*
m_videoBox->setHidden(false);
m_isCapturing = true;
slotSetInfoMessage(i18n("Capturing to %1", m_captureFile.fileName()));
+ m_recAction->setEnabled(false);
+ m_stopAction->setEnabled(true);
}
else {
video_frame->setText(i18n("Failed to start Decklink,\ncheck your parameters..."));
slotSetInfoMessage(i18n("Failed to start capture"));
m_videoBox->setHidden(true);
m_isCapturing = false;
- m_recAction->setChecked(false);
}
break;
}
Render::Render(const QString & rendererName, int winid, QString profile, QWidget *parent) :
- AbstractRender(parent),
+ AbstractRender(rendererName, parent),
m_isBlocked(0),
analyseAudio(KdenliveSettings::monitor_audio()),
m_name(rendererName),
StopmotionWidget::~StopmotionWidget()
{
- /*if (m_bmCapture)
- m_bmCapture->stopPreview();*/
+ m_manager->removeMonitor(m_monitor);
if (m_captureDevice) {
m_captureDevice->stop();
delete m_captureDevice;