]> git.sesse.net Git - kdenlive/commitdiff
First steps for "split audio" feature,. Don't use yet, it might corrupt your projects
authorJean-Baptiste Mardelle <jb@kdenlive.org>
Thu, 19 Mar 2009 23:41:16 +0000 (23:41 +0000)
committerJean-Baptiste Mardelle <jb@kdenlive.org>
Thu, 19 Mar 2009 23:41:16 +0000 (23:41 +0000)
http://www.kdenlive.org:80/mantis/view.php?id=332

svn path=/trunk/kdenlive/; revision=3165

15 files changed:
src/CMakeLists.txt
src/clipitem.cpp
src/clipitem.h
src/customtrackview.cpp
src/customtrackview.h
src/docclipbase.cpp
src/docclipbase.h
src/kdenliveui.rc
src/mainwindow.cpp
src/mainwindow.h
src/renderer.cpp
src/renderer.h
src/splitaudiocommand.cpp [new file with mode: 0644]
src/splitaudiocommand.h [new file with mode: 0644]
src/trackview.cpp

index 623645ac1726522f3dfb572e34977791198b9af2..a2004419b20519a1890ef6dc48e1e6ee073ea839 100644 (file)
@@ -151,6 +151,7 @@ set(kdenlive_SRCS
   dvdwizard.cpp
   locktrackcommand.cpp
   groupclipscommand.cpp
+  splitaudiocommand.cpp
 )
 
 add_definitions( ${KDE4_DEFINITIONS} )
index 6e72172dc11611fbaf27048b5d1b2f1070189c12..749aa6698046a1671561376586d7258e0fa88430 100644 (file)
@@ -28,6 +28,7 @@
 #include "kthumb.h"
 
 #include <KDebug>
+#include <KIcon>
 
 #include <QPainter>
 #include <QTimer>
@@ -37,7 +38,7 @@
 
 
 ClipItem::ClipItem(DocClipBase *clip, ItemInfo info, double fps, double speed, bool generateThumbs)
-        : AbstractClipItem(info, QRectF(), fps), m_clip(clip), m_resizeMode(NONE), m_grabPoint(0), m_maxTrack(0), m_hasThumbs(false), startThumbTimer(NULL), endThumbTimer(NULL), audioThumbWasDrawn(false), m_opacity(1.0), m_timeLine(0), m_startThumbRequested(false), m_endThumbRequested(false), m_startFade(0), m_endFade(0), m_hover(false), m_selectedEffect(-1), m_speed(speed), framePixelWidth(0), m_startPix(QPixmap()), m_endPix(QPixmap()) {
+        : AbstractClipItem(info, QRectF(), fps), m_clip(clip), m_resizeMode(NONE), m_grabPoint(0), m_maxTrack(0), m_hasThumbs(false), startThumbTimer(NULL), endThumbTimer(NULL), audioThumbWasDrawn(false), m_opacity(1.0), m_timeLine(0), m_startThumbRequested(false), m_endThumbRequested(false), m_startFade(0), m_endFade(0), m_hover(false), m_selectedEffect(-1), m_speed(speed), framePixelWidth(0), m_startPix(QPixmap()), m_endPix(QPixmap()), m_videoOnly(false), m_audioOnly(false)  {
     setZValue(1);
     setRect(0, 0, (info.endPos - info.startPos).frames(fps) - 0.02, (double)(KdenliveSettings::trackheight() - 2));
     setPos(info.startPos.frames(fps), (double)(info.track * KdenliveSettings::trackheight()) + 1);
@@ -714,10 +715,16 @@ void ClipItem::paint(QPainter *painter,
     }
 
     // Draw clip name
+
     QRectF txtBounding = painter->boundingRect(mapped, Qt::AlignHCenter | Qt::AlignVCenter, ' ' + m_clipName + ' ');
     painter->fillRect(txtBounding, QBrush(QColor(0, 0, 0, 150)));
     //painter->setPen(QColor(0, 0, 0, 180));
     //painter->drawText(txtBounding, Qt::AlignCenter, m_clipName);
+    if (m_videoOnly) {
+        painter->drawPixmap(txtBounding.topLeft() - QPointF(17, -1), KIcon("video-x-generic").pixmap(QSize(15, 15)));
+    } else if (m_audioOnly) {
+        painter->drawPixmap(txtBounding.topLeft() - QPointF(17, -1), KIcon("audio-x-generic").pixmap(QSize(15, 15)));
+    }
     txtBounding.translate(QPointF(1, 1));
     painter->setPen(QColor(255, 255, 255, 255));
     painter->drawText(txtBounding, Qt::AlignCenter, m_clipName);
@@ -1387,6 +1394,15 @@ void ClipItem::addTransition(Transition* t) {
     QDomElement e = doc.documentElement();
     //if (view) view->slotAddTransition(this, t->toXML() , t->startPos(), track());
 }
+
+void ClipItem::setVideoOnly(bool force) {
+    m_videoOnly = force;
+}
+
+void ClipItem::setAudioOnly(bool force) {
+    m_audioOnly = force;
+}
+
 // virtual
 /*
 void CustomTrackView::mousePressEvent ( QMouseEvent * event )
index 42c654cf51545cda01ba38be08eb15e2dc72143a..5817193973470702bcb0178d94da9dba316dbc6a 100644 (file)
@@ -104,6 +104,8 @@ public:
     bool checkKeyFrames();
     QPixmap startThumb() const;
     QPixmap endThumb() const;
+    void setVideoOnly(bool force);
+    void setAudioOnly(bool force);
 
 protected:
     //virtual void mouseMoveEvent(QGraphicsSceneMouseEvent * event);
@@ -127,6 +129,8 @@ private:
     uint m_startFade;
     uint m_endFade;
     int m_maxTrack;
+    bool m_audioOnly;
+    bool m_videoOnly;
 
     QPixmap m_startPix;
     QPixmap m_endPix;
index d8f9659ecec526780543056dd8521acf12a5c618..8f36d8c1e07c4d3f9fbc676805cfd0a39c7bea16 100644 (file)
@@ -55,6 +55,7 @@
 #include "initeffects.h"
 #include "locktrackcommand.h"
 #include "groupclipscommand.h"
+#include "splitaudiocommand.h"
 
 #include <KDebug>
 #include <KLocale>
@@ -3986,4 +3987,72 @@ void CustomTrackView::loadGroups(const QDomNodeList groups) {
     }
 }
 
+void CustomTrackView::splitAudio() {
+    resetSelectionGroup();
+    QList<QGraphicsItem *> selection = scene()->selectedItems();
+    if (selection.isEmpty()) {
+        emit displayMessage(i18n("You must select one clip for this action"), ErrorMessage);
+        return;
+    }
+    QUndoCommand *splitCommand = new QUndoCommand();
+    splitCommand->setText(i18n("Split audio"));
+    for (int i = 0; i < selection.count(); i++) {
+        if (selection.at(i)->type() == AVWIDGET) {
+            ClipItem *clip = static_cast <ClipItem *>(selection.at(i));
+            if (clip->clipType() == AV || clip->clipType() == PLAYLIST) {
+                if (clip->parentItem()) {
+                    emit displayMessage(i18n("Cannot split audio of grouped clips"), ErrorMessage);
+                } else {
+                    new SplitAudioCommand(this, clip->track(), clip->startPos(), true, splitCommand);
+                }
+            }
+        }
+    }
+    m_commandStack->push(splitCommand);
+}
+
+void CustomTrackView::doSplitAudio(const GenTime &pos, int track, bool split) {
+    ClipItem *clip = getClipItemAt(pos, track);
+    if (clip == NULL) {
+        kDebug() << "// Cannot find clip to split!!!";
+        return;
+    }
+    if (split) {
+        int start = pos.frames(m_document->fps());
+        int freetrack = m_document->tracksCount() - track - 1;
+        for (; freetrack > 0; freetrack--) {
+            kDebug() << "// CHK DOC TRK:" << freetrack << ", DUR:" << m_document->renderer()->mltTrackDuration(freetrack);
+            if (m_document->trackInfoAt(freetrack - 1).type == AUDIOTRACK) {
+                kDebug() << "// CHK DOC TRK:" << freetrack << ", DUR:" << m_document->renderer()->mltTrackDuration(freetrack);
+                if (m_document->renderer()->mltTrackDuration(freetrack) < start || m_document->renderer()->mltGetSpaceLength(pos, freetrack, false) >= clip->duration().frames(m_document->fps())) {
+                    kDebug() << "FOUND SPACE ON TRK: " << freetrack;
+                    break;
+                }
+            }
+        }
+        kDebug() << "GOT TRK: " << track;
+        if (freetrack == 0) {
+            emit displayMessage(i18n("No empty space to put clip audio"), ErrorMessage);
+        } else {
+            ItemInfo info;
+            info.startPos = clip->startPos();
+            info.endPos = clip->endPos();
+            info.cropStart = clip->cropStart();
+            info.track = m_document->tracksCount() - freetrack;
+            addClip(clip->xml(), clip->clipProducer(), info, clip->effectList());
+            scene()->clearSelection();
+            clip->setSelected(true);
+            ClipItem *audioClip = getClipItemAt(start, info.track);
+            if (audioClip) {
+                clip->setVideoOnly(true);
+                m_document->renderer()->mltUpdateClipProducer(m_document->tracksCount() - track, start, clip->baseClip()->videoProducer());
+                m_document->renderer()->mltUpdateClipProducer(m_document->tracksCount() - info.track, start, clip->baseClip()->audioProducer());
+                audioClip->setSelected(true);
+                audioClip->setAudioOnly(true);
+                groupSelectedItems(false, true);
+            }
+        }
+    }
+}
+
 #include "customtrackview.moc"
index 7af5a0976b3b002589a2aedfbf63c926d89de17b..84c2483f7aa36fbb0cc641d95bd9903135aa5fe7 100644 (file)
@@ -113,6 +113,8 @@ public:
     void groupClips(bool group = true);
     void doGroupClips(QList <ItemInfo> clipInfos, QList <ItemInfo> transitionInfos, bool group);
     void loadGroups(const QDomNodeList groups);
+    void splitAudio();
+    void doSplitAudio(const GenTime &pos, int track, bool split);
 
 public slots:
     void setCursorPos(int pos, bool seek = true);
index b3a17693195ccc0823969b4888407b85a304264f..e5cc8760294083b2f47b85c90555559ae7b010a6 100644 (file)
@@ -34,7 +34,7 @@
 #include <QCryptographicHash>
 
 DocClipBase::DocClipBase(ClipManager *clipManager, QDomElement xml, const QString &id):
-        m_id(id), m_description(QString()), m_refcount(0), m_audioThumbCreated(false), m_duration(GenTime()), m_thumbProd(NULL), m_audioTimer(NULL), m_properties(QMap <QString, QString> ()), audioFrameChache(QMap<int, QMap<int, QByteArray> > ()), m_baseTrackProducers(QList <Mlt::Producer *>()), m_snapMarkers(QList < CommentedTime > ())  {
+        m_id(id), m_description(QString()), m_refcount(0), m_audioThumbCreated(false), m_duration(GenTime()), m_thumbProd(NULL), m_audioTimer(NULL), m_properties(QMap <QString, QString> ()), audioFrameChache(QMap<int, QMap<int, QByteArray> > ()), m_baseTrackProducers(QList <Mlt::Producer *>()), m_snapMarkers(QList < CommentedTime > ()), m_videoOnlyProducer(NULL), m_audioOnlyProducer(NULL)  {
     int type = xml.attribute("type").toInt();
     m_clipType = (CLIPTYPE) type;
 
@@ -360,7 +360,16 @@ void DocClipBase::setProducer(Mlt::Producer *producer) {
     QString id = producer->get("id");
     if (id.contains('_')) {
         // this is a subtrack producer, insert it at correct place
-        int pos = id.section('_', 1, 1).toInt();
+        id = id.section('_', 1, 1);
+        if (id == "audio") {
+            m_audioOnlyProducer = producer;
+            return;
+        }
+        if (id == "video") {
+            m_videoOnlyProducer = producer;
+            return;
+        }
+        int pos = id.toInt();
         if (pos >= m_baseTrackProducers.count()) {
             while (m_baseTrackProducers.count() - 1 < pos) {
                 m_baseTrackProducers.append(NULL);
@@ -376,6 +385,42 @@ void DocClipBase::setProducer(Mlt::Producer *producer) {
     if (m_thumbProd && !m_thumbProd->hasProducer()) m_thumbProd->setProducer(producer);
 }
 
+Mlt::Producer *DocClipBase::audioProducer() {
+    if (m_audioOnlyProducer == NULL) {
+        int i;
+        for (i = 0; i < m_baseTrackProducers.count(); i++)
+            if (m_baseTrackProducers.at(i) != NULL) break;
+        if (i >= m_baseTrackProducers.count()) return NULL;
+        m_audioOnlyProducer = new Mlt::Producer(*m_baseTrackProducers.at(i)->profile(), m_baseTrackProducers.at(i)->get("resource"));
+        if (m_properties.contains("force_aspect_ratio")) m_audioOnlyProducer->set("force_aspect_ratio", m_properties.value("force_aspect_ratio").toDouble());
+        if (m_properties.contains("threads")) m_audioOnlyProducer->set("threads", m_properties.value("threads").toInt());
+        m_audioOnlyProducer->set("video_index", -1);
+        if (m_properties.contains("audio_index")) m_audioOnlyProducer->set("audio_index", m_properties.value("audio_index").toInt());
+        char *tmp = (char *) qstrdup(QString(getId() + "_audio").toUtf8().data());
+        m_audioOnlyProducer->set("id", tmp);
+        delete[] tmp;
+    }
+    return m_audioOnlyProducer;
+}
+
+Mlt::Producer *DocClipBase::videoProducer() {
+    if (m_videoOnlyProducer == NULL) {
+        int i;
+        for (i = 0; i < m_baseTrackProducers.count(); i++)
+            if (m_baseTrackProducers.at(i) != NULL) break;
+        if (i >= m_baseTrackProducers.count()) return NULL;
+        m_videoOnlyProducer = new Mlt::Producer(*m_baseTrackProducers.at(i)->profile(), m_baseTrackProducers.at(i)->get("resource"));
+        if (m_properties.contains("force_aspect_ratio")) m_videoOnlyProducer->set("force_aspect_ratio", m_properties.value("force_aspect_ratio").toDouble());
+        if (m_properties.contains("threads")) m_videoOnlyProducer->set("threads", m_properties.value("threads").toInt());
+        m_videoOnlyProducer->set("audio_index", -1);
+        if (m_properties.contains("video_index")) m_videoOnlyProducer->set("video_index", m_properties.value("video_index").toInt());
+        char *tmp = (char *) qstrdup(QString(getId() + "_video").toUtf8().data());
+        m_videoOnlyProducer->set("id", tmp);
+        delete[] tmp;
+    }
+    return m_videoOnlyProducer;
+}
+
 Mlt::Producer *DocClipBase::producer(int track) {
     /*for (int i = 0; i < m_baseTrackProducers.count(); i++) {
         if (m_baseTrackProducers.at(i)) kDebug() << "// PROD: " << i << ", ID: " << m_baseTrackProducers.at(i)->get("id");
index 242d78026f537488ec8836f827549d1b175f5c1b..fc9ed3eecb9f7a6d368f8d4ebff987b0c08ff0e5 100644 (file)
@@ -107,8 +107,14 @@ Q_OBJECT public:
         return false;
     }
 
+    /** Sets producers for the current clip (one for each track due to a limitation in MLT's track mixing */
     void setProducer(Mlt::Producer *producer);
+    /** Retrieve a producer for a track */
     Mlt::Producer *producer(int track = -1);
+    /** Retrieve the producer that shows only video */
+    Mlt::Producer *videoProducer();
+    /** Retrieve the producer that shows only audio */
+    Mlt::Producer *audioProducer();
 
     /** Returns true if this clip is a project clip, false otherwise. Overridden in DocClipProject,
      * where it returns true. */
@@ -180,6 +186,8 @@ private:   // Private attributes
      * that exist. */
     uint m_refcount;
     QList <Mlt::Producer *> m_baseTrackProducers;
+    Mlt::Producer *m_audioOnlyProducer;
+    Mlt::Producer *m_videoOnlyProducer;
     CLIPTYPE m_clipType;
 
     /** A list of snap markers; these markers are added to a clips snap-to points, and are displayed as necessary. */
index ddc479fc9096a3ef815aa00bd4308c5870f33ab1..e30707a53f3f2b6ddee39161a181f6afb0d743a0 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE kpartgui SYSTEM "kpartgui.dtd">
-<gui name="kdenlive" version="37">
+<gui name="kdenlive" version="38">
   <ToolBar name="extraToolBar" >
     <text>Extra Toolbar</text>
        <Action name="project_render" />
@@ -54,6 +54,7 @@
                <Action name="delete_all_clip_markers" />
          </Menu>
          <Action name="auto_transition" />
+         <Action name="split_audio" />
     </Menu>
 
     <Menu name="timeline" ><text>Timeline</text>
index a7dff06f492e15789e80f139054a01466f0bdb6e..cfcd776f1df7bc239c4133c8787fbe85c7fb2f58 100644 (file)
@@ -327,6 +327,7 @@ MainWindow::MainWindow(const QString &MltPath, const KUrl & Url, QWidget *parent
     m_timelineContextClipMenu->addAction(actionCollection()->action("cut_timeline_clip"));
     m_timelineContextClipMenu->addAction(actionCollection()->action(KStandardAction::name(KStandardAction::Copy)));
     m_timelineContextClipMenu->addAction(actionCollection()->action("paste_effects"));
+    m_timelineContextClipMenu->addAction(actionCollection()->action("split_audio"));
 
     QMenu *markersMenu = (QMenu*)(factory()->container("marker_menu", this));
     m_timelineContextClipMenu->addMenu(markersMenu);
@@ -933,6 +934,10 @@ void MainWindow::setupActions() {
     collection->addAction("edit_clip_marker", editClipMarker);
     connect(editClipMarker, SIGNAL(triggered(bool)), this, SLOT(slotEditClipMarker()));
 
+    KAction* splitAudio = new KAction(KIcon("document-new"), i18n("Split Audio"), this);
+    collection->addAction("split_audio", splitAudio);
+    connect(splitAudio, SIGNAL(triggered(bool)), this, SLOT(slotSplitAudio()));
+
     KAction *insertSpace = new KAction(KIcon(), i18n("Insert Space"), this);
     collection->addAction("insert_space", insertSpace);
     connect(insertSpace, SIGNAL(triggered()), this, SLOT(slotInsertSpace()));
@@ -2378,7 +2383,11 @@ void MainWindow::slotGetNewMltProfileStuff() {
 }
 
 void MainWindow::slotAutoTransition() {
-    m_activeTimeline->projectView()->autoTransition();
+    if (m_activeTimeline) m_activeTimeline->projectView()->autoTransition();
+}
+
+void MainWindow::slotSplitAudio() {
+    if (m_activeTimeline) m_activeTimeline->projectView()->splitAudio();
 }
 
 void MainWindow::slotDvdWizard(const QString &url, const QString &profile) {
index 381756b2901f1f2993b1bedc6a89a9dba6660c05..a260f6840ea8d06dcbb29b90b84103fd61464768 100644 (file)
@@ -294,6 +294,7 @@ private slots:
     void slotDvdWizard(const QString &url = QString(), const QString &profile = "dv_pal");
     void slotGroupClips();
     void slotUnGroupClips();
+    void slotSplitAudio();
 
 signals:
     Q_SCRIPTABLE void abortRenderJob(const QString &url);
index 20ca3fce4f69746ba64dfe8ebfb0558638f237a5..09fd30778dce7f3efa026bfae927f4940262c215 100644 (file)
@@ -1246,16 +1246,14 @@ void Render::mltCheckLength() {
     double trackDuration;
     if (trackNb == 1) {
         Mlt::Producer trackProducer(tractor.track(0));
-        Mlt::Playlist trackPlaylist((mlt_playlist) trackProducer.get_service());
-        duration = Mlt::Producer(trackPlaylist.get_producer()).get_playtime() - 1;
+        duration = trackProducer.get_playtime() - 1;
         m_mltProducer->set("out", duration);
         emit durationChanged((int) duration);
         return;
     }
     while (trackNb > 1) {
         Mlt::Producer trackProducer(tractor.track(trackNb - 1));
-        Mlt::Playlist trackPlaylist((mlt_playlist) trackProducer.get_service());
-        trackDuration = Mlt::Producer(trackPlaylist.get_producer()).get_playtime() - 1;
+        trackDuration = trackProducer.get_playtime() - 1;
 
         //kDebug() << " / / /DURATON FOR TRACK " << trackNb - 1 << " = " << trackDuration;
         if (trackDuration > duration) duration = trackDuration;
@@ -1263,10 +1261,10 @@ void Render::mltCheckLength() {
     }
 
     Mlt::Producer blackTrackProducer(tractor.track(0));
-    Mlt::Playlist blackTrackPlaylist((mlt_playlist) blackTrackProducer.get_service());
-    double blackDuration = Mlt::Producer(blackTrackPlaylist.get_producer()).get_playtime() - 1;
+    double blackDuration = blackTrackProducer.get_playtime() - 1;
 
     if (blackDuration != duration) {
+        Mlt::Playlist blackTrackPlaylist((mlt_playlist) blackTrackProducer.get_service());
         blackTrackPlaylist.clear();
         int dur = (int)duration;
         while (dur > 14000) {
@@ -1485,6 +1483,23 @@ int Render::mltGetSpaceLength(const GenTime pos, int track, bool fromBlankStart)
     return trackPlaylist.clip_length(clipIndex) + trackPlaylist.clip_start(clipIndex) - insertPos;
 }
 
+int Render::mltTrackDuration(int track) {
+    if (!m_mltProducer) {
+        kDebug() << "PLAYLIST NOT INITIALISED //////";
+        return -1;
+    }
+    Mlt::Producer parentProd(m_mltProducer->parent());
+    if (parentProd.get_producer() == NULL) {
+        kDebug() << "PLAYLIST BROKEN, CANNOT INSERT CLIP //////";
+        return -1;
+    }
+
+    Mlt::Service service(parentProd.get_service());
+    Mlt::Tractor tractor(service);
+
+    Mlt::Producer trackProducer(tractor.track(track));
+    return trackProducer.get_playtime() - 1;
+}
 
 void Render::mltInsertSpace(QMap <int, int> trackClipStartList, QMap <int, int> trackTransitionStartList, int track, const GenTime duration, const GenTime timeOffset) {
     if (!m_mltProducer) {
@@ -2323,7 +2338,8 @@ bool Render::mltMoveClip(int startTrack, int endTrack, int moveStart, int moveEn
             Mlt::Producer *clip;
             // check if we are moving a slowmotion producer
             QString serv = clipProducer.parent().get("mlt_service");
-            if (serv == "framebuffer") {
+            QString currentid = clipProducer.parent().get("id");
+            if (serv == "framebuffer" || currentid.endsWith("_video")) {
                 clip = &clipProducer;
             } else clip = prod->cut(clipProducer.get_in(), clipProducer.get_out());
 
index e834eefe8481989890a4fc82ee9eb841ef73b210..cc1b3ec73530c464d04da6f7458935c864287a56 100644 (file)
@@ -153,6 +153,7 @@ Q_OBJECT public:
     void mltCutClip(int track, GenTime position);
     void mltInsertSpace(QMap <int, int> trackClipStartList, QMap <int, int> trackTransitionStartList, int track, const GenTime duration, const GenTime timeOffset);
     int mltGetSpaceLength(const GenTime pos, int track, bool fromBlankStart);
+    int mltTrackDuration(int track);
     bool mltResizeClipEnd(ItemInfo info, GenTime clipDuration);
     bool mltResizeClipStart(ItemInfo info, GenTime diff);
     bool mltResizeClipCrop(ItemInfo info, GenTime diff);
diff --git a/src/splitaudiocommand.cpp b/src/splitaudiocommand.cpp
new file mode 100644 (file)
index 0000000..f754669
--- /dev/null
@@ -0,0 +1,43 @@
+/***************************************************************************
+ *   Copyright (C) 2007 by Jean-Baptiste Mardelle (jb@kdenlive.org)        *
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) any later version.                                   *
+ *                                                                         *
+ *   This program is distributed in the hope that it will be useful,       *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
+ *   GNU General Public License for more details.                          *
+ *                                                                         *
+ *   You should have received a copy of the GNU General Public License     *
+ *   along with this program; if not, write to the                         *
+ *   Free Software Foundation, Inc.,                                       *
+ *   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA          *
+ ***************************************************************************/
+
+
+#include "splitaudiocommand.h"
+#include "customtrackview.h"
+
+#include <KLocale>
+
+SplitAudioCommand::SplitAudioCommand(CustomTrackView *view, const int track, const GenTime &pos, bool doIt, QUndoCommand * parent) : QUndoCommand(parent), m_view(view), m_track(track), m_pos(pos), m_doIt(doIt) {
+    setText(i18n("Split audio"));
+}
+
+// virtual
+void SplitAudioCommand::undo() {
+// kDebug()<<"----  undoing action";
+    m_doIt = true;
+    m_view->doSplitAudio(m_pos, m_track, false);
+}
+// virtual
+void SplitAudioCommand::redo() {
+    kDebug() << "----  redoing action";
+    if (m_doIt)
+        m_view->doSplitAudio(m_pos, m_track, true);
+    m_doIt = true;
+}
+
diff --git a/src/splitaudiocommand.h b/src/splitaudiocommand.h
new file mode 100644 (file)
index 0000000..d14d970
--- /dev/null
@@ -0,0 +1,48 @@
+/***************************************************************************
+ *   Copyright (C) 2009 by Jean-Baptiste Mardelle (jb@kdenlive.org)        *
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) any later version.                                   *
+ *                                                                         *
+ *   This program is distributed in the hope that it will be useful,       *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
+ *   GNU General Public License for more details.                          *
+ *                                                                         *
+ *   You should have received a copy of the GNU General Public License     *
+ *   along with this program; if not, write to the                         *
+ *   Free Software Foundation, Inc.,                                       *
+ *   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA          *
+ ***************************************************************************/
+
+
+#ifndef SPLITAUDIOCOMMAND_H
+#define SPLITAUDIOCOMMAND_H
+
+#include <QUndoCommand>
+#include <QGraphicsView>
+#include <QPointF>
+
+#include <KDebug>
+#include "definitions.h"
+
+class GenTime;
+class CustomTrackView;
+
+class SplitAudioCommand : public QUndoCommand {
+public:
+    SplitAudioCommand(CustomTrackView *view, const int track, const GenTime &pos, bool doIt, QUndoCommand * parent = 0);
+    virtual void undo();
+    virtual void redo();
+
+private:
+    CustomTrackView *m_view;
+    const GenTime m_pos;
+    const int m_track;
+    bool m_doIt;
+};
+
+#endif
+
index 23803a3de4009e411f59e0ba7b3281d04d82c964..b111c6fcc3edb30781245754bc9e2550c94c0191 100644 (file)
@@ -421,6 +421,8 @@ int TrackView::slotAddProjectTrack(int ix, QDomElement xml, bool locked) {
                 clipinfo.track = ix;
                 //kDebug() << "// INSERTING CLIP: " << in << "x" << out << ", track: " << ix << ", ID: " << id << ", SCALE: " << m_scale << ", FPS: " << m_doc->fps();
                 ClipItem *item = new ClipItem(clip, clipinfo, m_doc->fps(), speed, false);
+                if (idString.endsWith("_video")) item->setVideoOnly(true);
+                else if (idString.endsWith("_audio")) item->setAudioOnly(true);
                 m_scene->addItem(item);
                 if (locked) item->setItemLocked(true);
                 clip->addReference();