[vlmc-devel] [PATCH 5/8] MainWorkflow: Don't use TrackHandler

Hugo Beauzée-Luyssen hugo at beauzee.fr
Fri May 13 11:13:45 CEST 2016


On 05/03/2016 07:24 AM, Yikai Lu wrote:
> ---
>   src/CMakeLists.txt                             |   1 -
>   src/Gui/timeline/AbstractGraphicsMediaItem.cpp |   6 +-
>   src/Gui/timeline/GraphicsTrack.cpp             |   6 +-
>   src/Gui/timeline/TracksView.cpp                |  35 +++---
>   src/Workflow/MainWorkflow.cpp                  | 150 ++++++++++++++-----------
>   src/Workflow/MainWorkflow.h                    |  29 ++---
>   src/Workflow/TrackWorkflow.cpp                 |  36 ++++--
>   src/Workflow/TrackWorkflow.h                   |   4 +-
>   8 files changed, 142 insertions(+), 125 deletions(-)
>
> diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
> index 238bffa..75d6679 100644
> --- a/src/CMakeLists.txt
> +++ b/src/CMakeLists.txt
> @@ -84,7 +84,6 @@ SET(VLMC_SRCS
>       Workflow/Helper.cpp
>       Workflow/ImageClipWorkflow.cpp
>       Workflow/MainWorkflow.cpp
> -    Workflow/TrackHandler.cpp
>       Workflow/TrackWorkflow.cpp
>       Workflow/Types.cpp
>       Workflow/VideoClipWorkflow.cpp
> diff --git a/src/Gui/timeline/AbstractGraphicsMediaItem.cpp b/src/Gui/timeline/AbstractGraphicsMediaItem.cpp
> index be683d0..270757c 100644
> --- a/src/Gui/timeline/AbstractGraphicsMediaItem.cpp
> +++ b/src/Gui/timeline/AbstractGraphicsMediaItem.cpp
> @@ -111,14 +111,12 @@ AbstractGraphicsMediaItem::contextMenuEvent( QGraphicsSceneContextMenuEvent* eve
>           if ( ( m_muted = muteAction->isChecked() ) )
>           {
>               tracksView()->m_mainWorkflow->muteClip( uuid(),
> -                                                    trackId,
> -                                                    trackType() );
> +                                                    trackId );
>           }
>           else
>           {
>               tracksView()->m_mainWorkflow->unmuteClip( uuid(),
> -                                                    trackId,
> -                                                    trackType() );
> +                                                    trackId );
>           }
>       }
>       else if ( selectedAction == linkAction )
> diff --git a/src/Gui/timeline/GraphicsTrack.cpp b/src/Gui/timeline/GraphicsTrack.cpp
> index 7036ad3..b8a85ea 100644
> --- a/src/Gui/timeline/GraphicsTrack.cpp
> +++ b/src/Gui/timeline/GraphicsTrack.cpp
> @@ -36,7 +36,7 @@ GraphicsTrack::GraphicsTrack( Workflow::TrackType type, quint32 trackNumber,
>       m_type = type;
>       m_trackNumber = trackNumber;
>       m_enabled = true;
> -    m_trackWorkflow = Core::instance()->workflow()->track( type, trackNumber );
> +    m_trackWorkflow = Core::instance()->workflow()->track( trackNumber );
>
>       setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed );
>       setContentsMargins( 0, 0, 0, 0 );
> @@ -65,9 +65,9 @@ GraphicsTrack::setTrackEnabled( bool enabled )
>       m_enabled = enabled;
>
>       if( enabled )
> -        Core::instance()->workflow()->unmuteTrack( m_trackNumber, m_type );
> +        Core::instance()->workflow()->unmuteTrack( m_trackNumber );
>       else
> -        Core::instance()->workflow()->muteTrack( m_trackNumber, m_type );
> +        Core::instance()->workflow()->muteTrack( m_trackNumber );
>   }
>
>   bool
> diff --git a/src/Gui/timeline/TracksView.cpp b/src/Gui/timeline/TracksView.cpp
> index 39d69b2..514eb2c 100644
> --- a/src/Gui/timeline/TracksView.cpp
> +++ b/src/Gui/timeline/TracksView.cpp
> @@ -89,27 +89,24 @@ TracksView::TracksView( QGraphicsScene *scene, MainWorkflow *mainWorkflow,
>       connect( m_cursorLine, SIGNAL( cursorMoved(qint64) ),
>                this, SLOT( ensureCursorVisible() ) );
>
> -    for ( quint32 type = Workflow::VideoTrack; type < Workflow::NbTrackType; ++type )
> +    for ( quint32 i = 0; i < m_mainWorkflow->trackCount(); ++i )
>       {
> -        for ( quint32 i = 0; i < m_mainWorkflow->trackCount(); ++i )
> -        {
> -            TrackWorkflow   *tw = m_mainWorkflow->track( static_cast<Workflow::TrackType>( type ), i );
> -            //Clips part:
> -            connect( tw, SIGNAL( clipAdded( TrackWorkflow*, Workflow::Helper*, qint64 ) ),
> -                     this, SLOT( addItem( TrackWorkflow*, Workflow::Helper*, qint64 ) ) );
> -            connect( tw, SIGNAL( clipRemoved( TrackWorkflow*, const QUuid& ) ),
> -                     this, SLOT( removeItem( TrackWorkflow*, const QUuid& ) ) );
> -            connect( tw, SIGNAL( clipMoved( TrackWorkflow*, const QUuid&, qint64 ) ),
> -                     this, SLOT( moveItem( TrackWorkflow*, const QUuid&, qint64 ) ) );
> -            //Effect part:
> -            connect( tw, SIGNAL( effectAdded( TrackWorkflow*, Workflow::Helper*, qint64 ) ),
> -                     this, SLOT(addItem( TrackWorkflow*, Workflow::Helper*, qint64 ) ), Qt::QueuedConnection );
> -            connect( tw, SIGNAL( effectRemoved( TrackWorkflow*, QUuid ) ),
> -                     this, SLOT( removeItem( TrackWorkflow*, QUuid ) ), Qt::QueuedConnection );
> -            connect( tw, SIGNAL( effectMoved( TrackWorkflow*, QUuid, qint64 ) ),
> -                     this, SLOT( moveItem( TrackWorkflow*, QUuid, qint64 ) ), Qt::QueuedConnection );
> +        TrackWorkflow   *tw = m_mainWorkflow->track( i );
> +        //Clips part:
> +        connect( tw, SIGNAL( clipAdded( TrackWorkflow*, Workflow::Helper*, qint64 ) ),
> +                 this, SLOT( addItem( TrackWorkflow*, Workflow::Helper*, qint64 ) ) );
> +        connect( tw, SIGNAL( clipRemoved( TrackWorkflow*, const QUuid& ) ),
> +                 this, SLOT( removeItem( TrackWorkflow*, const QUuid& ) ) );
> +        connect( tw, SIGNAL( clipMoved( TrackWorkflow*, const QUuid&, qint64 ) ),
> +                 this, SLOT( moveItem( TrackWorkflow*, const QUuid&, qint64 ) ) );
> +        //Effect part:
> +        connect( tw, SIGNAL( effectAdded( TrackWorkflow*, Workflow::Helper*, qint64 ) ),
> +                 this, SLOT(addItem( TrackWorkflow*, Workflow::Helper*, qint64 ) ), Qt::QueuedConnection );
> +        connect( tw, SIGNAL( effectRemoved( TrackWorkflow*, QUuid ) ),
> +                 this, SLOT( removeItem( TrackWorkflow*, QUuid ) ), Qt::QueuedConnection );
> +        connect( tw, SIGNAL( effectMoved( TrackWorkflow*, QUuid, qint64 ) ),
> +                 this, SLOT( moveItem( TrackWorkflow*, QUuid, qint64 ) ), Qt::QueuedConnection );
>
> -        }
>       }
>   }
>
> diff --git a/src/Workflow/MainWorkflow.cpp b/src/Workflow/MainWorkflow.cpp
> index 264982b..ceb06fa 100644
> --- a/src/Workflow/MainWorkflow.cpp
> +++ b/src/Workflow/MainWorkflow.cpp
> @@ -30,7 +30,6 @@
>   #include "MainWorkflow.h"
>   #include "Project/Project.h"
>   #include "TrackWorkflow.h"
> -#include "TrackHandler.h"
>   #include "Settings/Settings.h"
>   #include "Tools/VlmcDebug.h"
>   #include "Workflow/Types.h"
> @@ -48,21 +47,19 @@ MainWorkflow::MainWorkflow( Settings* projectSettings, int trackCount ) :
>   {
>       m_currentFrameLock = new QReadWriteLock;
>
> -    m_tracks = new TrackHandler*[Workflow::NbTrackType];
> -    QVariantList l;
>       for ( unsigned int i = 0; i < Workflow::NbTrackType; ++i )
> -    {
> -        Workflow::TrackType trackType = static_cast<Workflow::TrackType>(i);
> -        m_tracks[i] = new TrackHandler( trackCount, trackType );
> -        connect( m_tracks[i], SIGNAL( tracksEndReached() ),
> -                 this, SLOT( tracksEndReached() ) );
> -        connect( m_tracks[i], SIGNAL( lengthChanged(qint64) ),
> -                 this, SLOT( lengthUpdated( qint64 ) ) );
>           m_currentFrame[i] = 0;
> -        l << QVariantHash();
> +
> +    for ( int i = 0; i < trackCount; ++i )
> +    {
> +        Toggleable<TrackWorkflow*> track;
> +        m_tracks << track;
> +        m_tracks[i].setPtr( new TrackWorkflow( i ) );
> +        connect( m_tracks[i], SIGNAL( lengthChanged( qint64 ) ),
> +                 this, SLOT( lengthUpdated(qint64) ) );
>       }
>
> -    m_settings->createVar( SettingValue::List, "tracks", l, "", "", SettingValue::Nothing );
> +    m_settings->createVar( SettingValue::List, "tracks", QVariantList(), "", "", SettingValue::Nothing );
>       connect( m_settings, &Settings::postLoad, this, &MainWorkflow::postLoad, Qt::DirectConnection );
>       connect( m_settings, &Settings::preSave, this, &MainWorkflow::preSave, Qt::DirectConnection );
>       projectSettings->addSettings( "Workspace", *m_settings );
> @@ -70,10 +67,10 @@ MainWorkflow::MainWorkflow( Settings* projectSettings, int trackCount ) :
>
>   MainWorkflow::~MainWorkflow()
>   {
> +    for ( auto track : m_tracks )
> +        delete track;
> +    m_tracks.clear();
>       delete m_currentFrameLock;
> -    for ( unsigned int i = 0; i < Workflow::NbTrackType; ++i )
> -        delete m_tracks[i];
> -    delete[] m_tracks;
>       delete m_blackOutput;
>       delete m_settings;
>   }
> @@ -83,10 +80,10 @@ MainWorkflow::computeLength()
>   {
>       qint64      maxLength = 0;
>
> -    for ( unsigned int i = 0; i < Workflow::NbTrackType; ++i )
> +    for ( auto track : m_tracks )
>       {
> -        if ( m_tracks[i]->getLength() > maxLength )
> -            maxLength = m_tracks[i]->getLength();
> +        if ( track->getLength() > maxLength )
> +            maxLength = track->getLength();
>       }
>       if ( m_lengthFrame != maxLength )
>       {
> @@ -107,8 +104,10 @@ MainWorkflow::startRender( quint32 width, quint32 height )
>           delete m_blackOutput;
>       m_blackOutput = new Workflow::Frame( m_width, m_height );
>       memset( m_blackOutput->buffer(), 0, m_blackOutput->size() );
> -    for ( unsigned int i = 0; i < Workflow::NbTrackType; ++i )
> -        m_tracks[i]->startRender( width, height );
> +    m_endReached = ( m_lengthFrame == 0 ) ? true : false;
> +    if ( m_lengthFrame > 0 )
> +        for ( auto track : m_tracks )
> +            track->initRender( width, height );
>       computeLength();
>   }
>
> @@ -126,8 +125,26 @@ MainWorkflow::getOutput( Workflow::TrackType trackType, bool paused )
>               subFrame = m_currentFrame[trackType];
>           }
>
> -        Workflow::OutputBuffer  *ret = m_tracks[trackType]->getOutput( currentFrame,
> -                                                                       subFrame, paused );
> +        bool        validTrack = false;
> +        Workflow::OutputBuffer  *ret = nullptr;
> +
> +        for ( int i = m_trackCount - 1; i >= 0; --i )
> +        {
> +            if ( m_tracks[i].activated() == false || m_tracks[i]->hasNoMoreFrameToRender( currentFrame ) )
> +                continue ;
> +            validTrack = true;
> +            ret = m_tracks[i]->getOutput( trackType, currentFrame, subFrame, paused );
> +            if ( ret == nullptr )
> +                continue ;
> +            else
> +                break ;
> +        }
> +        if ( validTrack == false )
> +        {
> +            m_endReached = true;
> +            emit mainWorkflowEndReached();
> +        }
> +
>           if ( trackType == Workflow::VideoTrack )
>           {
>               if ( ret == nullptr )
> @@ -165,10 +182,10 @@ MainWorkflow::getLengthFrame() const
>   }
>
>   qint64
> -MainWorkflow::getClipPosition( const QUuid& uuid, unsigned int trackId,
> -                               Workflow::TrackType trackType ) const
> +MainWorkflow::getClipPosition( const QUuid& uuid, unsigned int trackId ) const
>   {
> -    return m_tracks[trackType]->getClipPosition( uuid, trackId );
> +    Q_ASSERT( trackId < m_trackCount );
> +    return m_tracks[trackId]->getClipPosition( uuid );
>   }
>
>   void
> @@ -181,44 +198,45 @@ MainWorkflow::stop()
>       */
>       m_renderStarted = false;
>       for (unsigned int i = 0; i < Workflow::NbTrackType; ++i)
> -    {
> -        m_tracks[i]->stop();
>           m_currentFrame[i] = 0;
> -    }
> +    for ( auto track : m_tracks )
> +        track->stop();
>       emit frameChanged( 0, Vlmc::Renderer );
>   }
>
>   void
>   MainWorkflow::stopFrameComputing()
>   {
> -    for ( qint32 type = 0; type < Workflow::NbTrackType; ++type )
> -        m_tracks[type]->stopFrameComputing();
> +    for ( auto track : m_tracks )
> +        track->stopFrameComputing();
>   }
>
>   void
> -MainWorkflow::muteTrack( unsigned int trackId, Workflow::TrackType trackType )
> +MainWorkflow::muteTrack( unsigned int trackId )
>   {
> -    m_tracks[trackType]->muteTrack( trackId );
> +    Q_ASSERT( trackId < m_trackCount );
> +    m_tracks[trackId].deactivate();
>   }
>
>   void
> -MainWorkflow::unmuteTrack( unsigned int trackId, Workflow::TrackType trackType )
> +MainWorkflow::unmuteTrack( unsigned int trackId )
>   {
> -    m_tracks[trackType]->unmuteTrack( trackId );
> +    Q_ASSERT( trackId < m_trackCount );
> +    m_tracks[trackId].activate();
>   }
>
>   void
> -MainWorkflow::muteClip( const QUuid& uuid, unsigned int trackId,
> -                        Workflow::TrackType trackType )
> +MainWorkflow::muteClip( const QUuid& uuid, unsigned int trackId )
>   {
> -    m_tracks[trackType]->muteClip( uuid, trackId );
> +    Q_ASSERT( trackId < m_trackCount );
> +    m_tracks[trackId]->muteClip( uuid );
>   }
>
>   void
> -MainWorkflow::unmuteClip( const QUuid& uuid, unsigned int trackId,
> -                          Workflow::TrackType trackType )
> +MainWorkflow::unmuteClip( const QUuid& uuid, unsigned int trackId )
>   {
> -    m_tracks[trackType]->unmuteClip( uuid, trackId );
> +    Q_ASSERT( trackId < m_trackCount );
> +    m_tracks[trackId]->unmuteClip( uuid );
>   }
>
>   void
> @@ -232,35 +250,32 @@ MainWorkflow::setCurrentFrame( qint64 currentFrame, Vlmc::FrameChangedReason rea
>   }
>
>   ClipHelper*
> -MainWorkflow::getClipHelper( const QUuid &uuid, unsigned int trackId,
> -                                Workflow::TrackType trackType )
> +MainWorkflow::getClipHelper( const QUuid &uuid, unsigned int trackId )
>   {
> -    return m_tracks[trackType]->getClipHelper( uuid, trackId );
> +    Q_ASSERT( trackId < m_trackCount );
> +    return m_tracks[trackId]->getClipHelper( uuid );
>   }
>
>   void
>   MainWorkflow::clear()
>   {
> -    for ( unsigned int i = 0; i < Workflow::NbTrackType; ++i )
> -        m_tracks[i]->clear();
> +    for ( auto track : m_tracks )
> +        track->clear();
>       emit cleared();
>   }
>
>   void
>   MainWorkflow::tracksEndReached()
>   {
> -    for ( unsigned int i = 0; i < Workflow::NbTrackType; ++i )
> -    {
> -        if ( m_tracks[i]->endIsReached() == false )
> -            return ;
> -    }
> +    if ( m_endReached == false )
> +        return ;
>       emit mainWorkflowEndReached();
>   }
>
>   int
> -MainWorkflow::getTrackCount( Workflow::TrackType trackType ) const
> +MainWorkflow::getTrackCount() const
>   {
> -    return m_tracks[trackType]->getTrackCount();
> +    return m_trackCount;
>   }
>
>   qint64
> @@ -291,8 +306,9 @@ MainWorkflow::getHeight() const
>   void
>   MainWorkflow::renderOneFrame()
>   {
> -    for ( unsigned int i = 0; i < Workflow::NbTrackType; ++i )
> -        m_tracks[i]->renderOneFrame();
> +    for ( auto track : m_tracks )
> +        if ( track.activated() == true )
> +            track->renderOneFrame();
>       nextFrame( Workflow::VideoTrack );
>       nextFrame( Workflow::AudioTrack );
>   }
> @@ -300,15 +316,15 @@ MainWorkflow::renderOneFrame()
>   void
>   MainWorkflow::setFullSpeedRender( bool val )
>   {
> -    for ( unsigned int i = 0; i < Workflow::NbTrackType; ++i )
> -        m_tracks[i]->setFullSpeedRender( val );
> +    for ( auto track : m_tracks )
> +        track->setFullSpeedRender( val );
>   }
>
>   bool
>   MainWorkflow::contains( const QUuid &uuid ) const
>   {
> -    for ( qint32 type = 0; type < Workflow::NbTrackType; ++type )
> -        if ( m_tracks[type]->contains( uuid ) == true )
> +    for ( auto track : m_tracks )
> +        if ( track->contains( uuid ) == true )
>               return true;
>       return false;
>   }
> @@ -329,8 +345,8 @@ void
>   MainWorkflow::preSave()
>   {
>       QVariantList l;
> -    for ( unsigned int i = 0; i < Workflow::NbTrackType; ++i )
> -        l << m_tracks[i]->toVariant();
> +    for ( auto track : m_tracks )
> +        l << track->toVariant();
>       m_settings->value( "tracks" )->set( l );
>   }
>
> @@ -338,7 +354,7 @@ void
>   MainWorkflow::postLoad()
>   {
>       QVariantList l = m_settings->value( "tracks" )->get().toList();
> -    for ( unsigned int i = 0; i < Workflow::NbTrackType; ++i )
> +    for ( int i = 0; i < l.size(); ++i )
>           m_tracks[i]->loadFromVariant( l[i] );
>   }
>
> @@ -347,20 +363,20 @@ MainWorkflow::lengthUpdated( qint64 )
>   {
>       qint64  maxLength = 0;
>
> -    for ( unsigned int i = 0; i < Workflow::NbTrackType; ++i )
> +    for ( auto track : m_tracks )
>       {
> -        if ( m_tracks[i]->getLength() > maxLength )
> -            maxLength = m_tracks[i]->getLength();
> +        if ( track->getLength() > maxLength )
> +            maxLength = track->getLength();
>       }
>       if ( m_lengthFrame != maxLength )
>       {
>           m_lengthFrame = maxLength;
> -        emit lengthChanged( m_lengthFrame );
> +        emit ( m_lengthFrame );
>       }
>   }
>
>   TrackWorkflow*
> -MainWorkflow::track( Workflow::TrackType type, quint32 trackId )
> +MainWorkflow::track( quint32 trackId )
>   {
> -    return m_tracks[type]->track( trackId );
> +    return m_tracks[ trackId ];
>   }
> diff --git a/src/Workflow/MainWorkflow.h b/src/Workflow/MainWorkflow.h
> index 4f6a2bd..09c2a0b 100644
> --- a/src/Workflow/MainWorkflow.h
> +++ b/src/Workflow/MainWorkflow.h
> @@ -27,6 +27,7 @@
>   #include "EffectsEngine/EffectsEngine.h"
>   #include <QXmlStreamWriter>
>   #include "Types.h"
> +#include "Tools/Toggleable.hpp"
>
>   class   Clip;
>   class   ClipHelper;
> @@ -145,8 +146,7 @@ class   MainWorkflow : public QObject
>            *  \return                 The given clip position, in frame. If not found, -1
>            *                          is returned.
>            */
> -        qint64                  getClipPosition( const QUuid& uuid, unsigned int trackId,
> -                                                Workflow::TrackType trackType ) const;
> +        qint64                  getClipPosition( const QUuid& uuid, unsigned int trackId ) const;
>
>           /**
>            *  \brief      Mute a track.
> @@ -157,8 +157,7 @@ class   MainWorkflow : public QObject
>            *  \param  trackType   The type of the track to mute.
>            *  \sa     unmuteTrack( unsigned int, Workflow::TrackType );
>            */
> -        void                    muteTrack( unsigned int trackId,
> -                                           Workflow::TrackType trackType );
> +        void                    muteTrack( unsigned int trackId );
>           /**
>            *  \brief      Unmute a track.
>            *
> @@ -166,8 +165,7 @@ class   MainWorkflow : public QObject
>            *  \param  trackType   The type of the track to unmute.
>            *  \sa     muteTrack( unsigned int, Workflow::TrackType );
>            */
> -        void                    unmuteTrack( unsigned int trackId,
> -                                             Workflow::TrackType trackType );
> +        void                    unmuteTrack( unsigned int trackId );
>
>           /**
>            *  \brief      Mute a clip.
> @@ -176,8 +174,7 @@ class   MainWorkflow : public QObject
>            *  \param  trackId     The id of the track containing the clip.
>            *  \param  trackType   The type of the track containing the clip.
>            */
> -        void                    muteClip( const QUuid& uuid, unsigned int trackId,
> -                                          Workflow::TrackType trackType );
> +        void                    muteClip( const QUuid& uuid, unsigned int trackId );
>
>           /**
>            *  \brief      Unmute a clip.
> @@ -186,8 +183,7 @@ class   MainWorkflow : public QObject
>            *  \param  trackId     The id of the track containing the clip.
>            *  \param  trackType   The type of the track containing the clip.
>            */
> -        void                    unmuteClip( const QUuid& uuid, unsigned int trackId,
> -                                          Workflow::TrackType trackType );
> +        void                    unmuteClip( const QUuid& uuid, unsigned int trackId );
>
>           /**
>            *  \brief              Get the number of track for a specific type
> @@ -195,7 +191,7 @@ class   MainWorkflow : public QObject
>            *  \param  trackType   The type of the tracks to count
>            *  \return             The number of track for the type trackType
>            */
> -        int                     getTrackCount( Workflow::TrackType trackType ) const;
> +        int                     getTrackCount() const;
>
>           /**
>            *  \brief      Get the width used for rendering.
> @@ -251,7 +247,7 @@ class   MainWorkflow : public QObject
>            */
>           void                    stopFrameComputing();
>
> -        TrackWorkflow           *track( Workflow::TrackType type, quint32 trackId );
> +        TrackWorkflow           *track( quint32 trackId );
>
>           const Workflow::Frame   *blackOutput() const;
>
> @@ -276,13 +272,13 @@ class   MainWorkflow : public QObject
>            *  \param      trackType : the track type (audio or video)
>            *  \returns    The clip helper that matches the given UUID, or nullptr.
>            */
> -        ClipHelper*             getClipHelper( const QUuid& uuid, unsigned int trackId,
> -                                               Workflow::TrackType trackType );
> +        ClipHelper*             getClipHelper( const QUuid& uuid, unsigned int trackId );
>
>           void                    preSave();
>           void                    postLoad();
>
>       private:
> +        QList<Toggleable<TrackWorkflow*>>     m_tracks;
>           /// Pre-filled buffer used when there's nothing to render
>           Workflow::Frame         *m_blackOutput;
>
> @@ -304,9 +300,6 @@ class   MainWorkflow : public QObject
>           /// This boolean describe is a render has been started
>           bool                            m_renderStarted;
>
> -        /// Contains the trackhandler, indexed by Workflow::TrackType
> -        TrackHandler**                  m_tracks;
> -
>           /// Width used for the render
>           quint32                         m_width;
>           /// Height used for the render
> @@ -314,6 +307,8 @@ class   MainWorkflow : public QObject
>           /// Store the number of track for each track type.
>           const quint32                   m_trackCount;
>
> +        bool                            m_endReached;
> +
>           Settings*                       m_settings;
>
>       private slots:
> diff --git a/src/Workflow/TrackWorkflow.cpp b/src/Workflow/TrackWorkflow.cpp
> index acb2e2d..295fc75 100644
> --- a/src/Workflow/TrackWorkflow.cpp
> +++ b/src/Workflow/TrackWorkflow.cpp
> @@ -44,10 +44,9 @@
>   #include <QReadLocker>
>   #include <QMutex>
>
> -TrackWorkflow::TrackWorkflow( Workflow::TrackType type, quint32 trackId  ) :
> +TrackWorkflow::TrackWorkflow( quint32 trackId  ) :
>           m_length( 0 ),
> -        m_trackType( type ),
> -        m_lastFrame( 0 ),
> +        m_trackType( Workflow::NbTrackType ),
>           m_trackId( trackId )
>   {
>       m_clipsLock = new QReadWriteLock;
> @@ -80,15 +79,21 @@ void
>   TrackWorkflow::addClip( ClipHelper* ch, qint64 start )
>   {
>       ClipWorkflow* cw;
> -    if ( m_trackType == Workflow::VideoTrack )
> -    {
> -        if ( ch->clip()->media()->fileType() == Media::Video )
> +    if ( ch->clip()->media()->fileType() == Media::FileType::Video )
> +        // FIXME: This whole if statement will be gone as soon as I implement a united ClipWorkflow,
> +        //        which can generate both audio and video buffers.
> +        if ( ch->formats() & ClipHelper::Video )
>               cw = new VideoClipWorkflow( ch );
> +        else if ( ch->formats() & ClipHelper::Audio )
> +            cw = new AudioClipWorkflow( ch );
>           else
> -            cw = new ImageClipWorkflow( ch );
> -    }
> -    else
> +            vlmcFatal( "Nothing to render from this clip!" );
> +    else if ( ch->clip()->media()->fileType() == Media::FileType::Audio )
>           cw = new AudioClipWorkflow( ch );
> +    else if ( ch->clip()->media()->fileType() == Media::FileType::Image )
> +        cw = new ImageClipWorkflow( ch );
> +    else
> +        vlmcFatal( "Unknown file type!" );
>       ch->setClipWorkflow( cw );
>       addClip( cw, start );
>   }
> @@ -268,7 +273,7 @@ TrackWorkflow::stop()
>   }
>
>   Workflow::OutputBuffer*
> -TrackWorkflow::getOutput( qint64 currentFrame, qint64 subFrame, bool paused )
> +TrackWorkflow::getOutput( Workflow::TrackType trackType, qint64 currentFrame, qint64 subFrame, bool paused )
>   {
>       QReadLocker     lock( m_clipsLock );
>
> @@ -301,12 +306,19 @@ TrackWorkflow::getOutput( qint64 currentFrame, qint64 subFrame, bool paused )
>       {
>           qint64          start = it.key();
>           ClipWorkflow*   cw = it.value();
> +
> +        if ( trackType != cw->type() )
> +        {
> +            ++it;
> +            continue ;
> +        }
> +
>           //Is the clip supposed to render now?
>           if ( start <= currentFrame && currentFrame <= start + cw->getClipHelper()->length() )
>           {
>               ret = renderClip( cw, currentFrame, start, needRepositioning,
>                                 renderOneFrame, paused );
> -            if ( m_trackType == Workflow::VideoTrack )
> +            if ( trackType == Workflow::VideoTrack )
>               {
>                   frames[frameId] = static_cast<Workflow::Frame*>( ret );
>                   ++frameId;
> @@ -322,7 +334,7 @@ TrackWorkflow::getOutput( qint64 currentFrame, qint64 subFrame, bool paused )
>           ++it;
>       }
>       //Handle mixers:
> -    if ( m_trackType == Workflow::VideoTrack )
> +    if ( trackType == Workflow::VideoTrack )
>       {
>           EffectHelper*   mixer = getMixer( currentFrame );
>           if ( mixer != nullptr && frames[0] != nullptr ) //There's no point using the mixer if there's no frame rendered.
> diff --git a/src/Workflow/TrackWorkflow.h b/src/Workflow/TrackWorkflow.h
> index 4569c75..6f51cb6 100644
> --- a/src/Workflow/TrackWorkflow.h
> +++ b/src/Workflow/TrackWorkflow.h
> @@ -49,10 +49,10 @@ class   TrackWorkflow : public EffectUser
>       Q_OBJECT
>
>       public:
> -        TrackWorkflow( Workflow::TrackType type, quint32 trackId );
> +        TrackWorkflow( quint32 trackId );
>           ~TrackWorkflow();
>
> -        Workflow::OutputBuffer                  *getOutput( qint64 currentFrame,
> +        Workflow::OutputBuffer                  *getOutput( Workflow::TrackType trackType, qint64 currentFrame,
>                                                              qint64 subFrame, bool paused );
>           qint64                                  getLength() const;
>           void                                    stop();
>
Hey!

So, just for the sake of sureness, starting from this commit, we have 
tracks that can contain audio & video, and the separation is gone. Correct?
I assume the UI must behave in funny ways now, but that's ok for now :)


More information about the Vlmc-devel mailing list