From: Ed R. <ed....@go...> - 2013-03-29 21:25:55
|
Git commit 70959209707d0210e4219d96f78d3a3dc3e541a3 by Ed Rogalsky. Committed on 29/03/2013 at 21:48. Pushed by rogalsky into branch 'feature/jack'. jack refactoring + cleanup - part3 M +17 -21 src/abstractmonitor.h M +1 -1 src/dvdwizardchapters.cpp M +7 -7 src/mainwindow.cpp M +1 -1 src/mltdevicecapture.cpp M +6 -6 src/monitor.cpp M +2 -2 src/monitor.h M +0 -5 src/monitormanager.cpp M +28 -29 src/renderer.cpp M +3 -3 src/renderer.h http://commits.kde.org/kdenlive/70959209707d0210e4219d96f78d3a3dc3e541a3 diff --git a/src/abstractmonitor.h b/src/abstractmonitor.h index b1c5888..afeade5 100644 --- a/src/abstractmonitor.h +++ b/src/abstractmonitor.h @@ -42,12 +42,6 @@ class VideoContainer; /* transport slave namespace */ namespace Slave { - namespace Perm - { - const static unsigned int Internal = (1<<0); - const static unsigned int Jack = (1<<1); - }; - enum Type { Internal = 0, @@ -65,13 +59,21 @@ namespace AudioEngine }; }; -namespace Mon +/* render role namespace */ +namespace Rndr { - const static unsigned int NoRole = (1<<0); - const static unsigned int OpenCloseEngineRole = (1<<1); - const static unsigned int OpenCloseSlaveRole = (1<<2); + enum Role + { + NoRole = (1<<0), + OpenCloseEngineRole = (1<<1), + OpenCloseSlaveRole = (1<<2) + }; }; +Q_DECLARE_FLAGS(RndrRole, Rndr::Role); +Q_DECLARE_OPERATORS_FOR_FLAGS(RndrRole); + + class AbstractRender: public QObject { @@ -81,12 +83,12 @@ Q_OBJECT public: * @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). */ - explicit AbstractRender(Kdenlive::MONITORID name, QWidget *parent = 0) : + explicit AbstractRender(Kdenlive::MONITORID name, RndrRole role, QWidget *parent = 0) : QObject(parent), sendFrameForAnalysis(false), analyseAudio(false), m_name(name), - m_slavePerm(Slave::Perm::Internal) + m_role(role) {}; /** @brief Destroy the MLT Renderer. */ @@ -103,14 +105,8 @@ Q_OBJECT public: /** @brief Someone needs us to send again a frame. */ virtual void sendFrameUpdate() = 0; - /** @brief Checks if appropriate slave permission is set. */ - virtual bool isSlavePermSet(unsigned int perm) {return ((perm & m_slavePerm) == perm);} - - /** @brief Set appropriate slave permission. */ - virtual void setSlavePerm(unsigned int perm) {m_slavePerm |= perm;} - - /** @brief Reset appropriate slave permission. */ - virtual void resetSlavePerm(unsigned int perm) {m_slavePerm &= ~perm;} + /** @brief Checks if appropriate role is set. */ + virtual bool hasRole(Rndr::Role role) {return m_role.testFlag(role);} /** @brief Checks if appropriate slave is active.*/ virtual bool isSlaveActive(Slave::Type slave) {return (m_activeSlave == slave);} @@ -131,7 +127,7 @@ private: QString m_name; protected: - unsigned int m_slavePerm; + RndrRole m_role; Slave::Type m_activeSlave; signals: diff --git a/src/dvdwizardchapters.cpp b/src/dvdwizardchapters.cpp index b289445..9c8dd26 100644 --- a/src/dvdwizardchapters.cpp +++ b/src/dvdwizardchapters.cpp @@ -154,7 +154,7 @@ void DvdWizardChapters::createMonitor(DVDFORMAT format) { QString profile = DvdWizardVob::getDvdProfile(format); if (m_monitor == NULL) { - m_monitor = new Monitor(Kdenlive::dvdMonitor, m_manager, profile, this); + m_monitor = new Monitor(Kdenlive::dvdMonitor, m_manager, Rndr::NoRole, profile, this); //m_monitor->start(); QVBoxLayout *vbox = new QVBoxLayout; vbox->addWidget(m_monitor); diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 87a0eb5..acf090d 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -240,7 +240,7 @@ MainWindow::MainWindow(const QString &MltPath, const KUrl & Url, const QString & m_clipMonitorDock = new QDockWidget(i18n("Clip Monitor"), this); m_clipMonitorDock->setObjectName("clip_monitor"); - m_clipMonitor = new Monitor(Kdenlive::clipMonitor, m_monitorManager, QString(), m_timelineArea); + m_clipMonitor = new Monitor(Kdenlive::clipMonitor, m_monitorManager, Rndr::NoRole, QString(), m_timelineArea); m_clipMonitorDock->setWidget(m_clipMonitor); // Connect the project list @@ -258,7 +258,7 @@ MainWindow::MainWindow(const QString &MltPath, const KUrl & Url, const QString & m_projectMonitorDock = new QDockWidget(i18n("Project Monitor"), this); m_projectMonitorDock->setObjectName("project_monitor"); - m_projectMonitor = new Monitor(Kdenlive::projectMonitor, m_monitorManager, QString()); + m_projectMonitor = new Monitor(Kdenlive::projectMonitor, m_monitorManager, Rndr::OpenCloseEngineRole | Rndr::OpenCloseSlaveRole, QString()); m_projectMonitorDock->setWidget(m_projectMonitor); #ifndef Q_WS_MAC @@ -2956,7 +2956,7 @@ void MainWindow::slotSwitchJackTransport() bool jacktransport = KdenliveSettings::jacktransport(); if (abstrRender) { - if(abstrRender->isSlavePermSet(Slave::Perm::Jack) && + if(abstrRender->hasRole(Rndr::OpenCloseSlaveRole) && abstrRender->isAudioEngineActive(AudioEngine::Jack) && !jacktransport) { KdenliveSettings::setJacktransport(true); abstrRender->enableSlave(Slave::Jack); @@ -2978,7 +2978,7 @@ void MainWindow::slotSwitchJackTransportMon() bool monEnabled = KdenliveSettings::jacktransportmon(); if (abstrRender) { - if(abstrRender->isSlavePermSet(Slave::Perm::Jack) && !monEnabled) { + if(abstrRender->hasRole(Rndr::OpenCloseSlaveRole) && !monEnabled) { KdenliveSettings::setJacktransportmon(true); abstrRender->setPlaybackSyncMonEnabled(true); } else { @@ -2998,7 +2998,7 @@ void MainWindow::slotEnableJackTransportButton(AbstractMonitor& monitor) #ifdef USE_JACK AbstractRender* abstrRender = monitor.abstractRender(); if (abstrRender) { - if(abstrRender->isSlavePermSet(Slave::Perm::Jack) && + if(abstrRender->hasRole(Rndr::OpenCloseSlaveRole) && abstrRender->isAudioEngineActive(AudioEngine::Jack)) { /* if jack transport enabled slave to jack */ if (KdenliveSettings::jacktransport()) { @@ -3032,7 +3032,7 @@ void MainWindow::slotEnableJackTransportMonButton(AbstractMonitor& monitor) #ifdef USE_JACK AbstractRender* abstrRender = monitor.abstractRender(); if (abstrRender) { - if(abstrRender->isSlavePermSet(Slave::Perm::Jack) && + if(abstrRender->hasRole(Rndr::OpenCloseSlaveRole) && abstrRender->isAudioEngineActive(AudioEngine::Jack)) { /* enable toggle button */ m_buttonJackTransportMon->setDisabled(false); @@ -4849,7 +4849,7 @@ void MainWindow::slotConnectJack() m_monitorManager->slotOpenAudioEngine(AudioEngine::Jack); AbstractRender* abstrRender = m_monitorManager->activeRenderer(); - if (abstrRender && abstrRender->isSlavePermSet(Slave::Perm::Jack)) { + if (abstrRender && abstrRender->hasRole(Rndr::OpenCloseSlaveRole)) { if(abstrRender->isAudioEngineActive(AudioEngine::Jack)) { abstrRender->enableSlave(Slave::Jack); } diff --git a/src/mltdevicecapture.cpp b/src/mltdevicecapture.cpp index 629ed51..078df84 100644 --- a/src/mltdevicecapture.cpp +++ b/src/mltdevicecapture.cpp @@ -77,7 +77,7 @@ static void rec_consumer_frame_preview(mlt_consumer, MltDeviceCapture * self, ml MltDeviceCapture::MltDeviceCapture(QString profile, VideoSurface *surface, QWidget *parent) : - AbstractRender(Kdenlive::recordMonitor, parent), + AbstractRender(Kdenlive::recordMonitor, Rndr::NoRole, parent), doCapture(0), sendFrameForAnalysis(false), processingImage(false), diff --git a/src/monitor.cpp b/src/monitor.cpp index d34555a..22fc74b 100644 --- a/src/monitor.cpp +++ b/src/monitor.cpp @@ -47,7 +47,7 @@ #define SEEK_INACTIVE (-1) -Monitor::Monitor(Kdenlive::MONITORID id, MonitorManager *manager, QString profile, QWidget *parent) : +Monitor::Monitor(Kdenlive::MONITORID id, MonitorManager *manager, RndrRole role, QString profile, QWidget *parent) : AbstractMonitor(id, manager, parent) , render(NULL) , m_currentClip(NULL) @@ -152,17 +152,17 @@ Monitor::Monitor(Kdenlive::MONITORID id, MonitorManager *manager, QString profil bool monitorCreated = false; #ifdef Q_WS_MAC - createOpenGlWidget(videoBox, profile); + createOpenGlWidget(videoBox, profile, role); monitorCreated = true; //m_glWidget->setFixedSize(width, height); #elif defined(USE_OPENGL) if (KdenliveSettings::openglmonitors()) { - monitorCreated = createOpenGlWidget(videoBox, profile); + monitorCreated = createOpenGlWidget(videoBox, profile, role); } #endif if (!monitorCreated) { createVideoSurface(); - render = new Render(m_id, (int) videoSurface->winId(), profile, this); + render = new Render(m_id, (int) videoSurface->winId(), role, profile, this); connect(videoSurface, SIGNAL(refreshMonitor()), render, SLOT(doRefresh())); } #ifdef USE_OPENGL @@ -228,9 +228,9 @@ QWidget *Monitor::container() } #ifdef USE_OPENGL -bool Monitor::createOpenGlWidget(QWidget *parent, const QString profile) +bool Monitor::createOpenGlWidget(QWidget *parent, const QString profile, RndrRole role) { - render = new Render(id(), 0, profile, this); + render = new Render(id(), 0, role, profile, this); m_glWidget = new VideoGLWidget(parent); if (m_glWidget == NULL) { // Creation failed, we are in trouble... diff --git a/src/monitor.h b/src/monitor.h index c782127..3914def 100644 --- a/src/monitor.h +++ b/src/monitor.h @@ -70,7 +70,7 @@ class Monitor : public AbstractMonitor Q_OBJECT public: - Monitor(Kdenlive::MONITORID id, MonitorManager *manager, QString profile = QString(), QWidget *parent = 0); + Monitor(Kdenlive::MONITORID id, MonitorManager *manager, RndrRole role, QString profile = QString(), QWidget *parent = 0); ~Monitor(); Render *render; AbstractRender *abstractRender(); @@ -148,7 +148,7 @@ private: #ifdef USE_OPENGL VideoGLWidget *m_glWidget; - bool createOpenGlWidget(QWidget *parent, const QString profile); + bool createOpenGlWidget(QWidget *parent, const QString profile, RndrRole role); #endif GenTime getSnapForPos(bool previous); diff --git a/src/monitormanager.cpp b/src/monitormanager.cpp index 53ce69a..0452e68 100644 --- a/src/monitormanager.cpp +++ b/src/monitormanager.cpp @@ -57,11 +57,6 @@ void MonitorManager::initMonitors(Monitor *clipMonitor, Monitor *projectMonitor, connect(m_clipMonitor->render, SIGNAL(activateMonitor(Kdenlive::MONITORID)), this, SLOT(activateMonitor(Kdenlive::MONITORID))); connect(m_projectMonitor->render, SIGNAL(activateMonitor(Kdenlive::MONITORID)), this, SLOT(activateMonitor(Kdenlive::MONITORID))); -#ifdef USE_JACK - /* special jack enabled permission */ - m_projectMonitor->render->setSlavePerm(Slave::Perm::Internal | Slave::Perm::Jack); -#endif - m_monitorsList.append(clipMonitor); m_monitorsList.append(projectMonitor); if (recMonitor) diff --git a/src/renderer.cpp b/src/renderer.cpp index 43d718a..f7bbd64 100644 --- a/src/renderer.cpp +++ b/src/renderer.cpp @@ -89,7 +89,7 @@ void Render::consumer_frame_show(mlt_consumer, Render * self, mlt_frame frame_pt } #ifdef USE_JACK - if(&JACKDEV && JACKDEV.isValid()) { + if (self->isAudioEngineActive(AudioEngine::Jack)) { JACKDEV.updateBuffers(frame); } #endif @@ -135,7 +135,7 @@ void Render::consumer_gl_frame_show(mlt_consumer consumer, Render * self, mlt_fr } #ifdef USE_JACK - if(&JACKDEV && JACKDEV.isValid()) { + if (self->isAudioEngineActive(AudioEngine::Jack)) { JACKDEV.updateBuffers(frame); } #endif @@ -143,8 +143,8 @@ void Render::consumer_gl_frame_show(mlt_consumer consumer, Render * self, mlt_fr emit self->mltFrameReceived(new Mlt::Frame(frame_ptr)); } -Render::Render(Kdenlive::MONITORID rendererName, int winid, QString profile, QWidget *parent) : - AbstractRender(rendererName, parent), +Render::Render(Kdenlive::MONITORID rendererName, int winid, RndrRole role, QString profile, QWidget *parent) : + AbstractRender(rendererName, role, parent), requestedSeekPosition(SEEK_INACTIVE), showFrameSemaphore(1), externalConsumer(false), @@ -183,7 +183,9 @@ Render::~Render() { #ifdef USE_JACK /* isDeviceActive ()*/ - closeAudioEngine(AudioEngine::Jack); + if (hasRole(Rndr::OpenCloseEngineRole)) { + closeAudioEngine(AudioEngine::Jack); + } #endif closeMlt(); delete m_mltProfile; @@ -364,14 +366,13 @@ void Render::buildConsumer(const QString &profileName) #ifdef USE_JACK if (!audioDriver.isEmpty()) { - if(audioDriver == "jack") { + if (audioDriver == "jack") { /* create the jack device singleton instance */ JackDevice::singleton(m_mltProfile); - if(&JACKDEV && JACKDEV.probe()) { - /* I hate the enumeration shit here */ - if(m_name == Kdenlive::projectMonitor) { + if (&JACKDEV && JACKDEV.probe()) { + if (hasRole(Rndr::OpenCloseEngineRole)) { openAudioEngine(AudioEngine::Jack); - } else if (m_name == Kdenlive::clipMonitor) { + } else { /* stop consumer */ if (!m_mltConsumer->is_stopped()) m_mltConsumer->stop(); @@ -387,10 +388,10 @@ void Render::buildConsumer(const QString &profileName) /* if jackd is running default to jackdev because in most cases the * audio driver is claimed by jackd */ JackDevice::singleton(m_mltProfile); - if(&JACKDEV && JACKDEV.probe()) { - if(m_name == Kdenlive::projectMonitor) { + if (&JACKDEV && JACKDEV.probe()) { + if (hasRole(Rndr::OpenCloseEngineRole)) { openAudioEngine(AudioEngine::Jack); - } else if (m_name == Kdenlive::clipMonitor) { + } else { /* stop consumer */ if (!m_mltConsumer->is_stopped()) m_mltConsumer->stop(); @@ -496,20 +497,20 @@ void Render::seek(GenTime time) seek(pos); } -void Render::seek(int time, bool slave) +void Render::seek(int time, bool fromSlave) { /* limit time */ time = qMax(0, time); time = qMin(m_mltProducer->get_playtime(), time); #ifdef USE_JACK - if (!slave && isSlaveActive(Slave::Jack)) { - if(&JACKDEV) { + if (!fromSlave && isSlaveActive(Slave::Jack)) { + if (isAudioEngineActive(AudioEngine::Jack)) { JACKDEV.seekPlayback(time < 0 ? 0 : time); } /* return */ return; - } else if(slave && isSlaveActive(Slave::Jack)) { + } else if (fromSlave && isSlaveActive(Slave::Jack)) { m_mltProducer->set_speed(0); } #endif @@ -1708,7 +1709,7 @@ void Render::setActiveMonitor() if (!m_isActive) emit activateMonitor(m_name); } -void Render::switchPlay(bool play, bool slave) +void Render::switchPlay(bool play, bool fromSlave) { QMutexLocker locker(&m_mutex); requestedSeekPosition = SEEK_INACTIVE; @@ -1716,8 +1717,8 @@ void Render::switchPlay(bool play, bool slave) return; #ifdef USE_JACK - if (!slave && isSlaveActive(Slave::Jack)) { - if(&JACKDEV) { + if (!fromSlave && isSlaveActive(Slave::Jack)) { + if (isAudioEngineActive(AudioEngine::Jack)) { if (play) { JACKDEV.startPlayback(); } else { @@ -1726,7 +1727,7 @@ void Render::switchPlay(bool play, bool slave) } /* return */ return; - } else if (slave && isSlaveActive(Slave::Jack)) { + } else if (fromSlave && isSlaveActive(Slave::Jack)) { // position = JACKDEV.getPlaybackPosition(); } #endif @@ -1802,8 +1803,7 @@ void Render::playZone(const GenTime & startTime, const GenTime & stopTime) return; #ifdef USE_JACK - /* TODO: after impl jack shutdown invalid => remove &JACKDEV test */ - if(isSlaveActive(Slave::Jack) && &JACKDEV) { + if (isSlaveActive(Slave::Jack) && isAudioEngineActive(AudioEngine::Jack)) { /* calc loop in/out */ int loopIn = (int)(startTime.frames(m_fps)); int loopOut = (int)(stopTime.frames(m_fps)); @@ -1970,9 +1970,8 @@ void Render::emitConsumerStopped(bool forcePause) if (m_mltProducer && (forcePause || (!m_paused && m_mltProducer->get_speed() == 0))) { #ifdef USE_JACK - /* TODO: after impl jack shutdown invalid => remove &JACKDEV test */ - if(isSlaveActive(Slave::Jack) && &JACKDEV) { - if(m_mltConsumer->position() == m_mltProducer->get_out()) { + if (isSlaveActive(Slave::Jack) && isAudioEngineActive(AudioEngine::Jack)) { + if (m_mltConsumer->position() == m_mltProducer->get_out()) { JACKDEV.stopPlayback(); } return; @@ -4946,7 +4945,7 @@ void Render::closeAudioEngine(AudioEngine::Type engine) { #ifdef USE_JACK if (engine == AudioEngine::Jack) { - if(isAudioEngineActive(AudioEngine::Jack)) { + if (isAudioEngineActive(AudioEngine::Jack)) { /* close jack slave */ enableSlave(Slave::Internal); /* disconnect shutdown event handler */ @@ -5003,8 +5002,8 @@ void Render::enableSlave(Slave::Type slave) } #ifdef USE_JACK - if ((slave == Slave::Jack) && isSlavePermSet(Slave::Perm::Jack) - && &JACKDEV && JACKDEV.isValid()) { + if ((slave == Slave::Jack) && hasRole(Rndr::OpenCloseSlaveRole) + && isAudioEngineActive(AudioEngine::Jack)) { /* connect transport callbacks */ connect(&JACKDEV, SIGNAL(playbackStarted(int)), this, SLOT(slotOnSlavePlaybackStarted(int))); diff --git a/src/renderer.h b/src/renderer.h index cb1977a..b941b16 100644 --- a/src/renderer.h +++ b/src/renderer.h @@ -105,14 +105,14 @@ Q_OBJECT public: * @param rendererName 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). */ - Render(Kdenlive::MONITORID rendererName, int winid, QString profile = QString(), QWidget *parent = 0); + Render(Kdenlive::MONITORID rendererName, int winid, RndrRole role, QString profile = QString(), QWidget *parent = 0); /** @brief Destroy the MLT Renderer. */ virtual ~Render(); /** @brief Seeks the renderer clip to the given time. */ void seek(GenTime time); - void seek(int time, bool slave = false); + void seek(int time, bool fromSlave = false); void seekToFrameDiff(int diff); /** @brief Open appropriate audio engine */ @@ -157,7 +157,7 @@ Q_OBJECT public: * The speed is relative to normal playback, e.g. 1.0 is normal speed, 0.0 * is paused, -1.0 means play backwards. It does not specify start/stop */ void play(double speed); - void switchPlay(bool play, bool slave = false); + void switchPlay(bool play, bool fromSlave = false); void pause(); /** @brief Stops playing. |