traverso-commit
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Traverso-commit] traverso resources/keymap.xml src/commands/AddR...


From: Remon Sijrier
Subject: [Traverso-commit] traverso resources/keymap.xml src/commands/AddR...
Date: Thu, 21 Jun 2007 14:31:12 +0000

CVSROOT:        /sources/traverso
Module name:    traverso
Changes by:     Remon Sijrier <r_sijrier>       07/06/21 14:31:12

Modified files:
        resources      : keymap.xml 
        src/commands   : AddRemove.cpp commands.pro PlayHeadMove.cpp 
                         WorkCursorMove.cpp 
        src/core       : core.pro Project.cpp Song.cpp Song.h 
        src/engine     : AudioDevice.cpp AudioDevice.h Client.cpp 
                         Client.h defines.h JackDriver.cpp JackDriver.h 
        src/traverso/dialogs/settings: Pages.cpp 
        src/traverso/songcanvas: Cursors.cpp SongView.cpp 
        src/traverso/ui: DriverConfigPage.ui 
        src/traverso/widgets: InfoWidgets.cpp 

Log message:
        * Added jack transport control
        * renamed some functions to better reflect their function

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/traverso/resources/keymap.xml?cvsroot=traverso&r1=1.83&r2=1.84
http://cvs.savannah.gnu.org/viewcvs/traverso/src/commands/AddRemove.cpp?cvsroot=traverso&r1=1.2&r2=1.3
http://cvs.savannah.gnu.org/viewcvs/traverso/src/commands/commands.pro?cvsroot=traverso&r1=1.19&r2=1.20
http://cvs.savannah.gnu.org/viewcvs/traverso/src/commands/PlayHeadMove.cpp?cvsroot=traverso&r1=1.12&r2=1.13
http://cvs.savannah.gnu.org/viewcvs/traverso/src/commands/WorkCursorMove.cpp?cvsroot=traverso&r1=1.6&r2=1.7
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/core.pro?cvsroot=traverso&r1=1.28&r2=1.29
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/Project.cpp?cvsroot=traverso&r1=1.48&r2=1.49
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/Song.cpp?cvsroot=traverso&r1=1.118&r2=1.119
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/Song.h?cvsroot=traverso&r1=1.59&r2=1.60
http://cvs.savannah.gnu.org/viewcvs/traverso/src/engine/AudioDevice.cpp?cvsroot=traverso&r1=1.33&r2=1.34
http://cvs.savannah.gnu.org/viewcvs/traverso/src/engine/AudioDevice.h?cvsroot=traverso&r1=1.18&r2=1.19
http://cvs.savannah.gnu.org/viewcvs/traverso/src/engine/Client.cpp?cvsroot=traverso&r1=1.4&r2=1.5
http://cvs.savannah.gnu.org/viewcvs/traverso/src/engine/Client.h?cvsroot=traverso&r1=1.3&r2=1.4
http://cvs.savannah.gnu.org/viewcvs/traverso/src/engine/defines.h?cvsroot=traverso&r1=1.7&r2=1.8
http://cvs.savannah.gnu.org/viewcvs/traverso/src/engine/JackDriver.cpp?cvsroot=traverso&r1=1.15&r2=1.16
http://cvs.savannah.gnu.org/viewcvs/traverso/src/engine/JackDriver.h?cvsroot=traverso&r1=1.6&r2=1.7
http://cvs.savannah.gnu.org/viewcvs/traverso/src/traverso/dialogs/settings/Pages.cpp?cvsroot=traverso&r1=1.23&r2=1.24
http://cvs.savannah.gnu.org/viewcvs/traverso/src/traverso/songcanvas/Cursors.cpp?cvsroot=traverso&r1=1.24&r2=1.25
http://cvs.savannah.gnu.org/viewcvs/traverso/src/traverso/songcanvas/SongView.cpp?cvsroot=traverso&r1=1.69&r2=1.70
http://cvs.savannah.gnu.org/viewcvs/traverso/src/traverso/ui/DriverConfigPage.ui?cvsroot=traverso&r1=1.2&r2=1.3
http://cvs.savannah.gnu.org/viewcvs/traverso/src/traverso/widgets/InfoWidgets.cpp?cvsroot=traverso&r1=1.38&r2=1.39

Patches:
Index: resources/keymap.xml
===================================================================
RCS file: /sources/traverso/traverso/resources/keymap.xml,v
retrieving revision 1.83
retrieving revision 1.84
diff -u -b -r1.83 -r1.84
--- resources/keymap.xml        5 Jun 2007 14:02:15 -0000       1.83
+++ resources/keymap.xml        21 Jun 2007 14:31:10 -0000      1.84
@@ -111,8 +111,8 @@
                </keyfact>
                <keyfact type="FKEY" key1="SPACE" >
                        <Objects>
-                               <Object objectname="Song" slotsignature="go" 
modes="All" sortorder="1" />
-                               <Object objectname="Song" 
slotsignature="go_and_record" modes="All" modifierkeys="CTRL" sortorder="2" />
+                               <Object objectname="Song" 
slotsignature="start_transport" modes="All" sortorder="1" />
+                               <Object objectname="Song" 
slotsignature="set_recordable_and_start_transport" modes="All" 
modifierkeys="CTRL" sortorder="2" />
                        </Objects>
                </keyfact>
                <keyfact type="FKEY" key1="A" >

Index: src/commands/AddRemove.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/commands/AddRemove.cpp,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -b -r1.2 -r1.3
--- src/commands/AddRemove.cpp  20 Apr 2007 08:44:48 -0000      1.2
+++ src/commands/AddRemove.cpp  21 Jun 2007 14:31:10 -0000      1.3
@@ -17,7 +17,7 @@
 along with this program; if not, write to the Free Software
 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA.
 
-$Id: AddRemove.cpp,v 1.2 2007/04/20 08:44:48 benjie Exp $
+$Id: AddRemove.cpp,v 1.3 2007/06/21 14:31:10 r_sijrier Exp $
 */
 
 #include "AddRemove.h"
@@ -208,7 +208,7 @@
        }
        
        if (m_song) {
-               if (m_song->is_transporting()) {
+               if (m_song->is_transport_rolling()) {
                        PMESG("Using Thread Save add/remove");
                        tsar().add_event(m_doActionEvent);
                } else {
@@ -236,7 +236,7 @@
        }
        
        if (m_song) {
-               if (m_song->is_transporting()) {
+               if (m_song->is_transport_rolling()) {
                        PMESG("Using Thread Save add/remove");
                        tsar().add_event(m_undoActionEvent);
                } else {

Index: src/commands/commands.pro
===================================================================
RCS file: /sources/traverso/traverso/src/commands/commands.pro,v
retrieving revision 1.19
retrieving revision 1.20
diff -u -b -r1.19 -r1.20
--- src/commands/commands.pro   30 May 2007 13:57:35 -0000      1.19
+++ src/commands/commands.pro   21 Jun 2007 14:31:10 -0000      1.20
@@ -34,6 +34,9 @@
 PlayHeadMove.h \
 WorkCursorMove.h \
 RemoveClip.h
+
+FORMS += ui/ExternalProcessing.ui
+
 TARGET = traversocommands
 DESTDIR = ../../lib
 TEMPLATE = lib

Index: src/commands/PlayHeadMove.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/commands/PlayHeadMove.cpp,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -b -r1.12 -r1.13
--- src/commands/PlayHeadMove.cpp       30 May 2007 16:33:26 -0000      1.12
+++ src/commands/PlayHeadMove.cpp       21 Jun 2007 14:31:10 -0000      1.13
@@ -45,11 +45,11 @@
        
        // When SyncDuringDrag is true, don't seek in finish_hold()
        // since that causes another audio glitch.
-       if (!(m_resync && m_song->is_transporting())) {
+       if (!(m_resync && m_song->is_transport_rolling())) {
                // if the song is transporting, the seek action will cause 
                // the playcursor to be moved to the correct location.
                // Until then hide it, it will be shown again when the seek is 
finished!
-               if (m_song->is_transporting()) {
+               if (m_song->is_transport_rolling()) {
                        m_cursor->hide();
                }
                m_song->set_transport_pos( (nframes_t) (x * m_sv->scalefactor));
@@ -69,7 +69,7 @@
 void PlayHeadMove::cancel_action()
 {
        m_sv->start_shuttle(false);
-       m_cursor->set_active(m_song->is_transporting());
+       m_cursor->set_active(m_song->is_transport_rolling());
        if (!m_resync) {
                m_cursor->setPos(m_origXPos, 0);
        }
@@ -98,7 +98,7 @@
        if (x != m_newXPos) {
                m_cursor->setPos(x, 0);
                nframes_t newpos = (nframes_t) (x * m_sv->scalefactor);
-               if (m_resync && m_song->is_transporting()) {
+               if (m_resync && m_song->is_transport_rolling()) {
                        m_song->set_transport_pos(newpos);
                }
                

Index: src/commands/WorkCursorMove.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/commands/WorkCursorMove.cpp,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -b -r1.6 -r1.7
--- src/commands/WorkCursorMove.cpp     30 May 2007 06:05:06 -0000      1.6
+++ src/commands/WorkCursorMove.cpp     21 Jun 2007 14:31:10 -0000      1.7
@@ -51,7 +51,7 @@
 
 int WorkCursorMove::begin_hold()
 {
-       if (m_song->is_transporting()) {
+       if (m_song->is_transport_rolling()) {
                m_playCursor->disable_follow();
        }
        m_song->get_work_snap()->set_snappable(false);

Index: src/core/core.pro
===================================================================
RCS file: /sources/traverso/traverso/src/core/core.pro,v
retrieving revision 1.28
retrieving revision 1.29
diff -u -b -r1.28 -r1.29
--- src/core/core.pro   30 May 2007 13:14:46 -0000      1.28
+++ src/core/core.pro   21 Jun 2007 14:31:10 -0000      1.29
@@ -8,8 +8,8 @@
 INCLUDEPATH += ../commands \
        ../engine \
        ../plugins \
-       ../plugins/native \
-               . 
+       ../plugins/native
+
 QMAKE_LIBDIR = ../../lib 
 TARGET = traversocore 
 DESTDIR = ../../lib 

Index: src/core/Project.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/core/Project.cpp,v
retrieving revision 1.48
retrieving revision 1.49
diff -u -b -r1.48 -r1.49
--- src/core/Project.cpp        4 Jun 2007 18:22:52 -0000       1.48
+++ src/core/Project.cpp        21 Jun 2007 14:31:10 -0000      1.49
@@ -826,7 +826,7 @@
 bool Project::is_recording() const
 {
        foreach(Song* song, m_songs) {
-               if (song->is_recording() && song->is_transporting()) {
+               if (song->is_recording() && song->is_transport_rolling()) {
                        return true;
                }
        }

Index: src/core/Song.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/core/Song.cpp,v
retrieving revision 1.118
retrieving revision 1.119
diff -u -b -r1.118 -r1.119
--- src/core/Song.cpp   11 Jun 2007 23:28:04 -0000      1.118
+++ src/core/Song.cpp   21 Jun 2007 14:31:10 -0000      1.119
@@ -126,6 +126,7 @@
        m_diskio = new DiskIO(this);
        
        connect(this, SIGNAL(seekStart(uint)), m_diskio, SLOT(seek(uint)), 
Qt::QueuedConnection);
+       connect(this, SIGNAL(prepareRecording()), this, 
SLOT(prepare_recording()));
        connect(&audiodevice(), SIGNAL(clientRemoved(Client*)), this, SLOT 
(audiodevice_client_removed(Client*)));
        connect(&audiodevice(), SIGNAL(started()), this, 
SLOT(audiodevice_started()));
        connect(&audiodevice(), SIGNAL(driverParamsChanged()), this, 
SLOT(audiodevice_params_changed()), Qt::DirectConnection);
@@ -147,19 +148,19 @@
 
        m_playBackBus = audiodevice().get_playback_bus("Playback 1");
 
-       m_transport = m_stopTransport = resumeTransport = false;
+       m_transport = m_stopTransport = resumeTransport = m_readyToRecord = 
false;
        snaplist = new SnapList(this);
        workSnap = new Snappable();
        workSnap->set_snap_list(snaplist);
 
        realtimepath = false;
-       scheduleForDeletion = false;
+       m_scheduledForDeletion = false;
        m_isSnapOn=true;
-       changed = m_rendering = m_recording = false;
+       changed = m_rendering = m_recording = m_prepareRecording = false;
        firstVisibleFrame=workingFrame=0;
-       seeking = 0;
+       m_seeking = m_startSeek = 0;
        // TODO seek to old position on project exit ?
-       transportFrame = 0;
+       m_transportFrame = 0;
        m_mode = EDIT;
        m_sbx = m_sby = 0;
        
@@ -170,6 +171,7 @@
        
        m_audiodeviceClient = new Client("song_" + 
QByteArray::number(get_id()));
        m_audiodeviceClient->set_process_callback( MakeDelegate(this, 
&Song::process) );
+       m_audiodeviceClient->set_transport_control_callback( MakeDelegate(this, 
&Song::transport_control) );
 }
 
 int Song::set_state( const QDomNode & node )
@@ -191,9 +193,9 @@
        m_sby = e.attribute("sby", "0").toInt();
        set_first_visible_frame(e.attribute( "firstVisibleFrame", "0" 
).toUInt());
        set_work_at(e.attribute( "workingFrame", "0").toUInt());
-       transportFrame = e.attribute( "transportFrame", "0").toUInt();
+       m_transportFrame = e.attribute( "transportFrame", "0").toUInt();
        // Start seeking to the 'old' transport pos
-       set_transport_pos(transportFrame);
+       set_transport_pos(m_transportFrame);
        set_snapping(e.attribute("snapping", "0").toInt());
        m_mode = e.attribute("mode", "0").toInt();
        
@@ -229,7 +231,7 @@
        properties.setAttribute("artists", artists);
        properties.setAttribute("firstVisibleFrame", firstVisibleFrame);
        properties.setAttribute("workingFrame", (uint)workingFrame);
-       properties.setAttribute("transportFrame", (uint)transportFrame);
+       properties.setAttribute("transportFrame", (uint)m_transportFrame);
        properties.setAttribute("hzoom", m_hzoom);
        properties.setAttribute("sbx", m_sbx);
        properties.setAttribute("sby", m_sby);
@@ -266,7 +268,7 @@
 void Song::disconnect_from_audiodevice()
 {
        PENTER;
-       if (m_transport) {
+       if (is_transport_rolling()) {
                m_transport = false;
        }
        audiodevice().remove_client(m_audiodeviceClient);
@@ -274,7 +276,7 @@
 
 void Song::schedule_for_deletion()
 {
-       scheduleForDeletion = true;
+       m_scheduledForDeletion = true;
        pm().scheduled_for_deletion(this);
 }
 
@@ -282,7 +284,7 @@
 {
        PENTER;
        if (m_audiodeviceClient == client) {
-               if (scheduleForDeletion) {
+               if (m_scheduledForDeletion) {
                        pm().delete_song(this);
                }
        }
@@ -328,9 +330,9 @@
        PENTER;
        
        if ( ! (spec->renderpass == ExportSpecification::CREATE_CDRDAO_TOC) ) {
-               if (m_transport) {
+               if (is_transport_rolling()) {
                        spec->resumeTransport = true;
-                       m_stopTransport = true;
+                       stop_transport_rolling();
                }
                
                m_rendering = true;
@@ -406,7 +408,7 @@
                m_exportSource = new WriteSource(spec);
        }
 
-       transportFrame = spec->start_frame;
+       m_transportFrame = spec->start_frame;
        
        resize_buffer(false, spec->blocksize);
 
@@ -566,21 +568,12 @@
        emit workingPosChanged();
 }
 
-
 void Song::set_transport_pos(nframes_t position)
 {
-       newTransportFramePos = (uint) position;
-       // If there is no m_transport, start_seek() will _not_ be
-       // called from within process(). So we do it now!
-       if (!m_transport) {
-               start_seek();
-       }
-
-       seeking = 1;
+       audiodevice().transport_seek_to(m_audiodeviceClient, position);
 }
 
 
-
 //
 //  Function _could_ be called in RealTime AudioThread processing path
 //  Be EXTREMELY carefull to not call functions() that have blocking behavior!!
@@ -590,21 +583,20 @@
        PMESG2("Song :: entering start_seek");
 //     PMESG2("Song :: thread id is: %ld", QThread::currentThreadId ());
        PMESG2("Song::start_seek()");
-       if (m_transport) {
+       
+       if (is_transport_rolling()) {
                realtimepath = false;
                resumeTransport = true;
        }
 
+       m_transport = false;
+       m_startSeek = 0;
+       
        // only sets a boolean flag, save to call.
        m_diskio->prepare_for_seek();
 
        // 'Tell' the diskio it should start a seek action.
-       if (!m_transport) {
-               emit seekStart(newTransportFramePos);
-       } else {
-               m_transport = false;
-               RT_THREAD_EMIT(this, (void*)newTransportFramePos, 
seekStart(uint));
-       }
+       RT_THREAD_EMIT(this, (void*)m_newTransportFramePos, seekStart(uint));
 
        PMESG2("Song :: leaving start_seek");
 }
@@ -612,12 +604,11 @@
 void Song::seek_finished()
 {
        PMESG2("Song :: entering seek_finished");
-       transportFrame = newTransportFramePos;
-       seeking = 0;
+       m_transportFrame = m_newTransportFramePos;
+       m_seeking = 0;
 
        if (resumeTransport) {
-               m_transport = true;
-               realtimepath = true;
+               start_transport_rolling();
                resumeTransport = false;
        }
 
@@ -649,63 +640,6 @@
        return track;
 }
 
-Command* Song::go_and_record()
-{
-       if (!is_recording() && !is_transporting()) {
-               if (!any_track_armed()) {
-                       info().critical(tr("No Tracks armed to record too!"));
-                       return 0;
-               }
-       }
-       
-       if ( ! is_transporting() && ! m_recording) {
-               set_recording(true);
-               return go();
-       } else if (is_transporting() && m_recording) {
-               set_recording(false);
-               return go();
-       }
-       
-       return 0;
-}
-
-Command* Song::go()
-{
-//     printf("Song-%d::go m_transport is %d\n", m_id, m_transport);
-       
-       if (is_transporting() && m_recording) {
-               set_recording(false);
-       }
-       
-       if (m_transport) {
-               m_stopTransport = true;
-       } else {
-               emit transferStarted();
-               
-               if (m_recording && any_track_armed()) {
-                       CommandGroup* group = new CommandGroup(this, "");
-                       int clipcount = 0;
-                       foreach(Track* track, m_tracks) {
-                               if (track->armed()) {
-                                       AudioClip* clip = 
track->init_recording();
-                                       if (clip) {
-                                               group->add_command(new 
AddRemoveClip(clip, AddRemoveClip::ADD));
-                                               clipcount++;
-                                       }
-                               }
-                       }
-                       group->setText(tr("Recording to %n Clip(s)", "", 
clipcount));
-                       Command::process_command(group);
-               }
-               
-               m_transport = true;
-               realtimepath = true;
-       }
-       
-       return ie().succes();
-}
-
-
 void Song::solo_track(Track* t)
 {
        bool wasSolo = t->is_solo();
@@ -822,9 +756,13 @@
 //
 int Song::process( nframes_t nframes )
 {
+       if (m_startSeek) {
+               start_seek();
+               return 0;
+       }
+       
        // If no need for playback/record, return.
-//     printf("Song-%d::process m_transport is %d\n", m_id, m_transport);
-       if (!m_transport) {
+       if (!is_transport_rolling()) {
                return 0;
        }
 
@@ -837,11 +775,6 @@
                return 0;
        }
 
-       if (seeking) {
-               start_seek();
-               return 0;
-       }
-       
        // zero the m_masterOut buffers
        m_masterOut->silence_buffers(nframes);
 
@@ -852,8 +785,8 @@
                processResult |= m_tracks.at(i)->process(nframes);
        }
 
-       // update the transportFrame
-       transportFrame += nframes;
+       // update the m_transportFrame
+       m_transportFrame += nframes;
 
        if (!processResult) {
                return 0;
@@ -885,8 +818,8 @@
        Mixer::apply_gain_to_buffer(m_masterOut->get_buffer(0, nframes), 
nframes, get_gain());
        Mixer::apply_gain_to_buffer(m_masterOut->get_buffer(1, nframes), 
nframes, get_gain());
 
-       // update the transportFrame
-       transportFrame += nframes;
+       // update the m_transportFrame
+       m_transportFrame += nframes;
 
        return 1;
 }
@@ -1077,7 +1010,7 @@
 
 void Song::handle_diskio_readbuffer_underrun( )
 {
-       if (m_transport) {
+       if (is_transport_rolling()) {
                printf("Song:: DiskIO ReadBuffer UnderRun signal received!\n");
                info().critical(tr("Hard Disk overload detected!"));
                info().critical(tr("Failed to fill ReadBuffer in time"));
@@ -1086,7 +1019,7 @@
 
 void Song::handle_diskio_writebuffer_overrun( )
 {
-       if (m_transport) {
+       if (is_transport_rolling()) {
                printf("Song:: DiskIO WriteBuffer OverRun signal received!\n");
                info().critical(tr("Hard Disk overload detected!"));
                info().critical(tr("Failed to empty WriteBuffer in time"));
@@ -1150,15 +1083,188 @@
        return 0;
 }
 
+void Song::set_temp_follow_state(bool state)
+{
+       emit tempFollowChanged(state);
+}
+
+// Function is only to be called from GUI thread.
+Command * Song::set_recordable()
+{
+       // Do nothing is transport is rolling!
+       if (is_transport_rolling()) {
+               return 0;
+       }
+       
+       // Transport is not rolling, it's save now to switch 
+       // recording state to on /off
+       if (is_recording()) {
+               set_recording(false);
+       } else {
+               if (!any_track_armed()) {
+                       info().critical(tr("No Tracks armed to record too!"));
+                       return 0;
+               }
+               
+               set_recording(true);
+       }
+       
+       return 0;
+}
+
+// Function is only to be called from GUI thread.
+Command* Song::set_recordable_and_start_transport()
+{
+       if (!is_recording()) {
+               set_recordable();
+       }
+       
+       start_transport();
+       
+       return 0;
+}
+
+// Function is only to be called from GUI thread.
+Command* Song::start_transport()
+{
+       // Delegate the transport start (or if we are rolling stop)
+       // request to the audiodevice. Depending on the driver in use
+       // this call will return directly to us (by a call to 
transport_control),
+       // or handled by the driver
+       if (is_transport_rolling()) {
+               audiodevice().transport_stop(m_audiodeviceClient);
+       } else {
+               audiodevice().transport_start(m_audiodeviceClient);
+       }
+       
+       return ie().succes();
+}
+
+// Function can be called either from the GUI or RT thread.
+// So ALL functions called here need to be RT thread save!!
+int Song::transport_control(transport_state_t state)
+{
+       if (m_scheduledForDeletion) {
+               return true;
+       }
+       
+       switch(state.tranport) {
+       case TransportStopped:
+               if (is_transport_rolling()) {
+                       stop_transport_rolling();
+               }
+               return true;
+       
+       case TransportStarting:
+               if (state.frame != m_transportFrame) {
+                       if ( ! m_seeking ) {
+                               m_newTransportFramePos = state.frame;
+                               m_startSeek = 1;
+                               m_seeking = 1;
+                               
+                               PMESG("tranport starting: initiating seek");
+                               return false;
+                       }
+               }
+               if (! m_seeking) {
+                       if (is_recording()) {
+                               if (!m_prepareRecording) {
+                                       m_prepareRecording = true;
+                                       // prepare_recording() is only to be 
called from the GUI thread
+                                       // so we delegate the 
prepare_recording() function call via a 
+                                       // RT thread save signal!
+                                       RT_THREAD_EMIT(this, 0, 
prepareRecording());
+                                       PMESG("transport starting: initiating 
prepare for record");
+                                       return false;
+                               }
+                               if (!m_readyToRecord) {
+                                       PMESG("transport starting: still 
preparing for record");
+                                       return false;
+                               }
+                       }
+                                       
+                                       
+                       PMESG("tranport starting: seek finished");
+                       return true;
+               } else {
+                       PMESG("tranport starting: still seeking");
+                       return false;
+               }
+       
+       case TransportRolling:
+               if (!is_transport_rolling()) {
+                       // When the transport rolling request came from a non 
slave
+                       // driver, we currently can assume it's comming from 
the GUI 
+                       // thread, and TransportStarting never was called 
before!
+                       // So in case we are recording we have to prepare for 
recording now!
+                       if ( ! state.isSlave && is_recording() ) {
+                               prepare_recording();
+                       }
+                       start_transport_rolling();
+               }
+               return true;
+       }
+       
+       return false;
+}
+
+// RT thread save function
+void Song::start_transport_rolling()
+{
+       realtimepath = true;
+       m_transport = 1;
+       
+       RT_THREAD_EMIT(this, 0, transferStarted());
+       
+       PMESG("tranport rolling");
+}
+
+// RT thread save function
+void Song::stop_transport_rolling()
+{
+       m_stopTransport = 1;
+       
+       if (is_recording()) {
+               set_recording(false);
+       }
+       
+       PMESG("tranport stopped");
+}
+
+// RT thread save function
 void Song::set_recording(bool recording)
 {
        m_recording = recording;
-       emit recordingStateChanged();
+       
+       if (!m_recording) {
+               m_readyToRecord = false;
+               m_prepareRecording = false;
+       }
+       
+       RT_THREAD_EMIT(this, 0, recordingStateChanged());
 }
 
-void Song::set_temp_follow_state(bool state)
+
+// NON RT thread save function, should only be called from GUI thread!!
+void Song::prepare_recording()
 {
-       emit tempFollowChanged(state);
+       if (m_recording && any_track_armed()) {
+               CommandGroup* group = new CommandGroup(this, "");
+               int clipcount = 0;
+               foreach(Track* track, m_tracks) {
+                       if (track->armed()) {
+                               AudioClip* clip = track->init_recording();
+                               if (clip) {
+                                       group->add_command(new 
AddRemoveClip(clip, AddRemoveClip::ADD));
+                                       clipcount++;
+                               }
+                       }
+               }
+               group->setText(tr("Recording to %n Clip(s)", "", clipcount));
+               Command::process_command(group);
+       }
+       
+       m_readyToRecord = true;
 }
 
 // eof

Index: src/core/Song.h
===================================================================
RCS file: /sources/traverso/traverso/src/core/Song.h,v
retrieving revision 1.59
retrieving revision 1.60
diff -u -b -r1.59 -r1.60
--- src/core/Song.h     4 Jun 2007 18:22:53 -0000       1.59
+++ src/core/Song.h     21 Jun 2007 14:31:10 -0000      1.60
@@ -48,8 +48,8 @@
 class Song : public ContextItem
 {
        Q_OBJECT
-       Q_CLASSINFO("go", tr("Play"))
-       Q_CLASSINFO("go_and_record", tr("Record"));
+       Q_CLASSINFO("start_transport", tr("Play"))
+       Q_CLASSINFO("set_recordable_and_start_transport", tr("Record"));
        Q_CLASSINFO("work_next_edge", tr("Workcursor: To next edge"))
        Q_CLASSINFO("work_previous_edge", tr("Workcursor: To previous edge"))
        Q_CLASSINFO("undo", tr("Undo"))
@@ -80,6 +80,7 @@
        int get_numtracks() const {return m_tracks.size();}
        int get_track_index(qint64 id) const;
        int get_mode() const {return m_mode;}
+       int is_transport_rolling() const {return m_transport;}
        void get_scrollbar_xy(int& x, int& y) {x = m_sbx; y = m_sby;}
        
        nframes_t get_transport_frame() const;
@@ -116,6 +117,8 @@
        
 
        int process(nframes_t nframes);
+       // jackd only feature
+       int transport_control(transport_state_t state);
        int process_export(nframes_t nframes);
        int prepare_export(ExportSpecification* spec);
        int render(ExportSpecification* spec);
@@ -128,7 +131,6 @@
        
        bool any_track_armed();
        bool realtime_path() const {return realtimepath;}
-       bool is_transporting() const {return m_transport;}
        bool is_changed() const {return changed;}
        bool is_snap_on() const {return m_isSnapOn;}
        bool is_recording() const {return m_recording;}
@@ -162,11 +164,12 @@
        // atomic behaviour, still not sure if volatile size_t declaration
        // would suffice, or should we use g_atomic_int_set/get() to make
        // it 100% portable and working on all platforms...?
-       volatile size_t         transportFrame;
+       volatile size_t         m_transportFrame;
        volatile size_t         workingFrame;
-       volatile size_t         newTransportFramePos;
+       volatile size_t         m_newTransportFramePos;
        volatile size_t         m_transport;
-       volatile size_t         seeking;
+       volatile size_t         m_seeking;
+       volatile size_t         m_startSeek;
 
        
        nframes_t       firstVisibleFrame;
@@ -182,8 +185,10 @@
        bool            resumeTransport;
        bool            m_stopTransport;
        bool            realtimepath;
-       bool            scheduleForDeletion;
+       bool            m_scheduledForDeletion;
        bool            m_recording;
+       bool            m_prepareRecording;
+       bool            m_readyToRecord;
        SnapList*       snaplist;
        Snappable*      workSnap;
        GainEnvelope*   m_fader;
@@ -192,6 +197,9 @@
 
        int finish_audio_export();
        void start_seek();
+       void start_transport_rolling();
+       void stop_transport_rolling();
+       
        void resize_buffer(bool updateArmStatus, nframes_t size);
 
        Track* create_track();
@@ -209,8 +217,9 @@
 
        void set_temp_follow_state(bool state);
 
-       Command* go();
-       Command* go_and_record();
+       Command* start_transport();
+       Command* set_recordable();
+       Command* set_recordable_and_start_transport();
        Command* work_next_edge();
        Command* work_previous_edge();
        Command* toggle_snap();
@@ -238,18 +247,19 @@
        void masterGainChanged();
        void modeChanged();
        void recordingStateChanged();
+       void prepareRecording();
 
 private slots:
        void private_add_track(Track* track);
        void private_remove_track(Track* track);
        void handle_diskio_writebuffer_overrun();
        void handle_diskio_readbuffer_underrun();
-
+       void prepare_recording();
 };
 
 inline nframes_t Song::get_transport_frame() const
 {
-       return transportFrame;
+       return m_transportFrame;
 }
 
 inline float Song::get_gain() const

Index: src/engine/AudioDevice.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/engine/AudioDevice.cpp,v
retrieving revision 1.33
retrieving revision 1.34
diff -u -b -r1.33 -r1.34
--- src/engine/AudioDevice.cpp  5 Jun 2007 16:18:14 -0000       1.33
+++ src/engine/AudioDevice.cpp  21 Jun 2007 14:31:10 -0000      1.34
@@ -17,7 +17,7 @@
 along with this program; if not, write to the Free Software
 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA.
 
-$Id: AudioDevice.cpp,v 1.33 2007/06/05 16:18:14 r_sijrier Exp $
+$Id: AudioDevice.cpp,v 1.34 2007/06/21 14:31:10 r_sijrier Exp $
 */
 
 #include "AudioDevice.h"
@@ -43,7 +43,6 @@
 #include "Tsar.h"
 #include "Information.h"
 
-
 //#include <sys/mman.h>
 
 // Always put me below _all_ includes, this is needed
@@ -151,8 +150,9 @@
        m_driverType = tr("No Driver Loaded");
 
 #if defined (JACK_SUPPORT)
-       if (libjack_is_present)
+       if (libjack_is_present) {
                availableDrivers << "Jack";
+       }
 #endif
 
 #if defined (ALSA_SUPPORT)
@@ -175,6 +175,7 @@
        
        connect(this, SIGNAL(xrunStormDetected()), this, 
SLOT(switch_to_null_driver()));
        connect(&m_xrunResetTimer, SIGNAL(timeout()), this, 
SLOT(reset_xrun_counter()));
+       
        m_xrunResetTimer.start(30000);
 }
 
@@ -749,6 +750,7 @@
                }
        }
 }
+
 #endif
 
 void AudioDevice::switch_to_null_driver()
@@ -758,5 +760,89 @@
        set_parameters(44100, m_bufferSize, "Null Driver");
 }
 
+int AudioDevice::transport_control(transport_state_t state)
+{
+#if defined (JACK_SUPPORT)
+       if (!slaved_jack_driver()) {
+               return true;
+       }
+#endif 
+
+       int result = 0;
+       for (int i=0; i<clients.size(); ++i) {
+               result = clients.at(i)->transport_control(state);
+       }
+       return result;
+}
+
+void AudioDevice::transport_start(Client * client)
+{
+#if defined (JACK_SUPPORT)
+       JackDriver* jackdriver = slaved_jack_driver();
+       if (jackdriver) {
+               PMESG("using jack_transport_start");
+               jack_transport_start(jackdriver->get_client());
+               return;
+       }
+#endif
+       
+       transport_state_t state;
+       state.tranport = TransportRolling;
+       state.isSlave = false;
+       
+       client->transport_control(state);
+}
+
+void AudioDevice::transport_stop(Client * client)
+{
+#if defined (JACK_SUPPORT)
+       JackDriver* jackdriver = slaved_jack_driver();
+       if (jackdriver) {
+               PMESG("using jack_transport_stop");
+               jack_transport_stop(jackdriver->get_client());
+               return;
+       }
+#endif
+       
+       transport_state_t state;
+       state.tranport = TransportStopped;
+       
+       client->transport_control(state);
+}
+
+// return 0 if valid request, non-zero otherwise.
+int AudioDevice::transport_seek_to(Client* client, nframes_t frame)
+{
+#if defined (JACK_SUPPORT)
+       JackDriver* jackdriver = slaved_jack_driver();
+       if (jackdriver) {
+               PMESG("using jack_transport_locate");
+               return  jack_transport_locate(jackdriver->get_client(), frame);
+       }
+#endif
+       
+       transport_state_t state;
+       state.tranport = TransportStarting;
+       state.frame = frame;
+       
+       client->transport_control(state);
+       
+       return 0;
+}
+
+#if defined (JACK_SUPPORT)
+JackDriver* AudioDevice::slaved_jack_driver()
+{
+       if (libjack_is_present) {
+               JackDriver* jackdriver = qobject_cast<JackDriver*>(driver);
+               if (jackdriver && jackdriver->is_slave()) {
+                       return jackdriver;
+               }
+       }
+       
+       return 0;
+}
+#endif
+
 //eof
 

Index: src/engine/AudioDevice.h
===================================================================
RCS file: /sources/traverso/traverso/src/engine/AudioDevice.h,v
retrieving revision 1.18
retrieving revision 1.19
diff -u -b -r1.18 -r1.19
--- src/engine/AudioDevice.h    5 Jun 2007 16:18:14 -0000       1.18
+++ src/engine/AudioDevice.h    21 Jun 2007 14:31:10 -0000      1.19
@@ -17,7 +17,7 @@
 along with this program; if not, write to the Free Software
 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA.
 
-$Id: AudioDevice.h,v 1.18 2007/06/05 16:18:14 r_sijrier Exp $
+$Id: AudioDevice.h,v 1.19 2007/06/21 14:31:10 r_sijrier Exp $
 */
 
 #ifndef AUDIODEVICE_H
@@ -38,22 +38,29 @@
 class Client;
 class AudioChannel;
 class AudioBus;
+#if defined (JACK_SUPPORT)
+class JackDriver;
+#endif
 
 class AudioDevice : public QObject
 {
        Q_OBJECT
 
 public:
-       void set_parameters(int rate, 
+       void set_parameters(    int rate, 
                                        nframes_t bufferSize, 
                                        const QString& driverType, 
                                        bool capture=true, 
                                        bool playback=true,
-                                       const QString& cardDevice="hw:0");
+                               const QString& device="hw:0" );
 
        void add_client(Client* client);
        void remove_client(Client* client);
 
+       void transport_start(Client* client);
+       void transport_stop(Client* client);
+       int transport_seek_to(Client* client, nframes_t frame);
+
        /**
         * Get the Playback AudioBus instance with name \a name.
         
@@ -143,6 +150,7 @@
        QTimer                                  m_xrunResetTimer;
 #if defined (JACK_SUPPORT)
        QTimer                                  jackShutDownChecker;
+       JackDriver* slaved_jack_driver();
        friend class JackDriver;
 #endif
 
@@ -158,6 +166,7 @@
 
        int run_one_cycle(nframes_t nframes, float delayed_usecs);
        int create_driver(QString driverType, bool capture, bool playback, 
const QString& cardDevice);
+       int transport_control(transport_state_t state);
 
        void setup_buses();
        void post_process();

Index: src/engine/Client.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/engine/Client.cpp,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -b -r1.4 -r1.5
--- src/engine/Client.cpp       7 Sep 2006 09:36:52 -0000       1.4
+++ src/engine/Client.cpp       21 Jun 2007 14:31:10 -0000      1.5
@@ -17,7 +17,7 @@
 along with this program; if not, write to the Free Software
 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA.
 
-$Id: Client.cpp,v 1.4 2006/09/07 09:36:52 r_sijrier Exp $
+$Id: Client.cpp,v 1.5 2007/06/21 14:31:10 r_sijrier Exp $
 */
 
 
@@ -69,4 +69,10 @@
        process = call;
 }
 
+void Client::set_transport_control_callback(TransportControlCallback callback)
+{
+       transport_control = callback;
+}
+
 //eof
+

Index: src/engine/Client.h
===================================================================
RCS file: /sources/traverso/traverso/src/engine/Client.h,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -b -r1.3 -r1.4
--- src/engine/Client.h 7 Sep 2006 09:36:52 -0000       1.3
+++ src/engine/Client.h 21 Jun 2007 14:31:11 -0000      1.4
@@ -17,7 +17,7 @@
 along with this program; if not, write to the Free Software
 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA.
 
-$Id: Client.h,v 1.3 2006/09/07 09:36:52 r_sijrier Exp $
+$Id: Client.h,v 1.4 2007/06/21 14:31:11 r_sijrier Exp $
 */
 
 #ifndef CLIENT_H
@@ -37,9 +37,11 @@
        ~Client();
 
        void set_process_callback(ProcessCallback call);
+       void set_transport_control_callback(TransportControlCallback call);
 
        
        ProcessCallback process;
+       TransportControlCallback transport_control;
        
        QString         m_name;
 

Index: src/engine/defines.h
===================================================================
RCS file: /sources/traverso/traverso/src/engine/defines.h,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -b -r1.7 -r1.8
--- src/engine/defines.h        24 Apr 2007 15:30:08 -0000      1.7
+++ src/engine/defines.h        21 Jun 2007 14:31:11 -0000      1.8
@@ -20,6 +20,19 @@
  */
 typedef uint32_t     nframes_t;
 
+enum {
+       TransportStopped = 0,
+       TransportRolling = 1,
+       TransportLooping = 2,
+       TransportStarting = 3
+};
+
+typedef struct {
+       int tranport;
+       nframes_t frame;
+       bool isSlave;
+} transport_state_t;
+
 /**
  * Type used to represent the value of free running
  * monotonic clock with units of microseconds.
@@ -33,6 +46,8 @@
 
 typedef FastDelegate1<nframes_t, int> ProcessCallback;
 typedef FastDelegate0<int> RunCycleCallback;
+typedef FastDelegate1<transport_state_t, int> TransportControlCallback;
+
 
 
 /**

Index: src/engine/JackDriver.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/engine/JackDriver.cpp,v
retrieving revision 1.15
retrieving revision 1.16
diff -u -b -r1.15 -r1.16
--- src/engine/JackDriver.cpp   14 Jun 2007 11:51:31 -0000      1.15
+++ src/engine/JackDriver.cpp   21 Jun 2007 14:31:11 -0000      1.16
@@ -17,7 +17,7 @@
     along with this program; if not, write to the Free Software
     Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA.
  
-    $Id: JackDriver.cpp,v 1.15 2007/06/14 11:51:31 r_sijrier Exp $
+    $Id: JackDriver.cpp,v 1.16 2007/06/21 14:31:11 r_sijrier Exp $
 */
 
 #include "JackDriver.h"
@@ -26,6 +26,7 @@
 #include "AudioChannel.h"
 
 #include <Information.h>
+#include "Config.h"
 
 #include <jack/jack.h>
 
@@ -44,6 +45,8 @@
         write = MakeDelegate(this, &JackDriver::_write);
         run_cycle = RunCycleCallback(this, &JackDriver::_run_cycle);
        m_running = false;
+       
+       connect(&config(), SIGNAL(configChanged()), this, 
SLOT(update_config()));
 }
 
 JackDriver::~JackDriver( )
@@ -200,6 +203,7 @@
         jack_set_buffer_size_callback (client, _bufsize_callback, this);
        jack_on_shutdown(client, _on_jack_shutdown_callback, this);
 
+       update_config();
 
        info().information(tr("Jack Driver: Connected successfully to the jack 
server!"));
         
@@ -233,10 +237,29 @@
 
 int JackDriver::process_callback (nframes_t nframes)
 {
+       jack_position_t pos;
+       jack_transport_state_t state = jack_transport_query (client, &pos);
+       
+       transport_state_t tranportstate;
+       tranportstate.tranport = state;
+       tranportstate.frame = pos.frame;
+       device->transport_control(tranportstate);
+       
         device->run_cycle( nframes, 0.0);
         return 0;
 }
 
+int JackDriver::jack_sync_callback (jack_transport_state_t state, 
jack_position_t* pos)
+{
+       transport_state_t tranportstate;
+       tranportstate.tranport = state;
+       tranportstate.frame = pos->frame;
+       tranportstate.isSlave = true;
+       
+       return device->transport_control(tranportstate);
+}
+
+
 // Is there a way to get the device name from Jack? Can't find it :-(
 // Since Jack uses ALSA, we ask it from ALSA directly :-)
 QString JackDriver::get_device_name( )
@@ -294,5 +317,21 @@
        driver->m_running = -1;
 }
 
+int JackDriver::_jack_sync_callback (jack_transport_state_t state, 
jack_position_t* pos, void* arg)
+{
+       return static_cast<JackDriver*> (arg)->jack_sync_callback (state, pos);
+}
+
+void JackDriver::update_config()
+{
+       m_isSlave = config().get_property("Hardware", "jackslave", 
false).toBool();
+               
+       if (m_isSlave) {
+               jack_set_sync_callback (client, _jack_sync_callback, this);
+       } else {
+               jack_set_sync_callback(client, NULL, this);
+       }
+}
 
 //eof
+

Index: src/engine/JackDriver.h
===================================================================
RCS file: /sources/traverso/traverso/src/engine/JackDriver.h,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -b -r1.6 -r1.7
--- src/engine/JackDriver.h     19 Mar 2007 11:18:57 -0000      1.6
+++ src/engine/JackDriver.h     21 Jun 2007 14:31:11 -0000      1.7
@@ -17,7 +17,7 @@
     along with this program; if not, write to the Free Software
     Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA.
  
-    $Id: JackDriver.h,v 1.6 2007/03/19 11:18:57 r_sijrier Exp $
+    $Id: JackDriver.h,v 1.7 2007/06/21 14:31:11 r_sijrier Exp $
 */
 
 #ifndef JACKDRIVER_H
@@ -50,21 +50,30 @@
         float get_cpu_load();
        
        size_t is_jack_running() const {return m_running == 1;}
+       jack_client_t* get_client() const {return client;}
+       void set_jack_slave(bool slave);
+       bool is_slave() const {return m_isSlave;}
 
 private:
        volatile size_t m_running;
         jack_client_t* client;
         jack_port_t**  inputPorts;
         jack_port_t**  outputPorts;
+       bool            m_isSlave;
+       
+       int  jack_sync_callback (jack_transport_state_t, jack_position_t*);
 
         static int _xrun_callback(void *arg);
         static int  _process_callback (nframes_t nframes, void *arg);
         static int _bufsize_callback(jack_nframes_t nframes, void *arg);
        static void _on_jack_shutdown_callback(void* arg);
-       
+       static int  _jack_sync_callback (jack_transport_state_t, 
jack_position_t*, void *arg);  
 signals:
        void jackShutDown();    
 
+private slots:
+       void update_config();
+
 };
 
 

Index: src/traverso/dialogs/settings/Pages.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/traverso/dialogs/settings/Pages.cpp,v
retrieving revision 1.23
retrieving revision 1.24
diff -u -b -r1.23 -r1.24
--- src/traverso/dialogs/settings/Pages.cpp     16 Jun 2007 15:28:55 -0000      
1.23
+++ src/traverso/dialogs/settings/Pages.cpp     21 Jun 2007 14:31:11 -0000      
1.24
@@ -136,6 +136,8 @@
        int paindex = m_portaudiodrivers->driverCombo->currentIndex();
        config().set_property("Hardware", "pahostapi", 
m_portaudiodrivers->driverCombo->itemData(paindex));
 #endif
+       
+       config().set_property("Hardware", "jackslave", 
m_driverConfigPage->jackTransportCheckBox->isChecked());
 }
 
 void AudioDriverPage::reset_default_config()
@@ -168,6 +170,8 @@
        config().set_property("Hardware", "capture", 1);
        config().set_property("Hardware", "playback", 1);
        
+       config().set_property("Hardware", "jackslave", false);
+
        load_config();
 }
 
@@ -263,6 +267,9 @@
        m_driverConfigPage->update_latency_combobox();
 
 #endif //end PORTAUDIO_SUPPORT
+
+       bool usetransport = config().get_property("Hardware", "jackslave", 
false).toBool();
+       m_driverConfigPage->jackTransportCheckBox->setChecked(usetransport);
 }
 
 
@@ -312,6 +319,8 @@
 #if defined (ALSA_SUPPORT)
        config().set_property("Hardware", "numberofperiods", currentperiods);
 #endif
+       
+       config().set_property("Hardware", "jackslave", 
m_driverConfigPage->jackTransportCheckBox->isChecked());
 }
 
 
@@ -319,9 +328,9 @@
 void AudioDriverPage::driver_combobox_index_changed(QString driver)
 {
        if (driver == "ALSA" || driver == "PortAudio" || driver == "Null 
Driver") {
-               m_driverConfigPage->setEnabled(true);
+               m_driverConfigPage->driverConfigGroupBox->show();
        } else {
-               m_driverConfigPage->setEnabled(false);
+               m_driverConfigPage->driverConfigGroupBox->hide();
        }
        
 #if defined (ALSA_SUPPORT)
@@ -343,6 +352,14 @@
                m_mainLayout->removeWidget(m_portaudiodrivers);
        }
 #endif
+       
+#if defined(JACK_SUPPORT)
+       if (libjack_is_present && driver == "Jack") {
+               m_driverConfigPage->jackGroupBox->show();
+       } else {
+               m_driverConfigPage->jackGroupBox->hide();
+       }
+#endif
 }
 
 

Index: src/traverso/songcanvas/Cursors.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/traverso/songcanvas/Cursors.cpp,v
retrieving revision 1.24
retrieving revision 1.25
diff -u -b -r1.24 -r1.25
--- src/traverso/songcanvas/Cursors.cpp 16 Jun 2007 15:53:45 -0000      1.24
+++ src/traverso/songcanvas/Cursors.cpp 21 Jun 2007 14:31:11 -0000      1.25
@@ -75,7 +75,7 @@
        Q_UNUSED(widget);
        QColor color;
        
-       if (m_song->is_transporting()) {
+       if (m_song->is_transport_rolling()) {
                color = themer()->get_color("Playhead:active");
        } else {
                color = themer()->get_color("Playhead:inactive");
@@ -120,7 +120,7 @@
        m_followDisabled = false;
        // This function is called after the song finished a seek action.
        // if the song is still playing, update our position, and start moving 
again!
-       if (m_song->is_transporting()) {
+       if (m_song->is_transport_rolling()) {
                play_start();
        }
 }
@@ -135,7 +135,7 @@
                return;
        }
        
-       if ( ! m_follow || m_followDisabled || ! m_song->is_transporting()) {
+       if ( ! m_follow || m_followDisabled || ! 
m_song->is_transport_rolling()) {
                return;
        }
        
@@ -151,7 +151,6 @@
        if (vppoint.x() < 0 || (vppoint.x() > vpWidth)) {
                
                // If the playhead is _not_ in the viewports range, center it 
in the middle!
-//             horizontalScrollbar->setValue((int) ((int)scenePos().x() - (0.5 
* vpWidth)) );
                m_sv->set_hscrollbar_value((int)scenePos().x() - (int)(0.5 * 
vpWidth));
        
        } else if (vppoint.x() > ( vpWidth * 0.85) ) {
@@ -209,7 +208,7 @@
 
 void PlayHead::animation_finished()
 {
-       if (m_song->is_transporting()) {
+       if (m_song->is_transport_rolling()) {
                play_start();
        }
 }

Index: src/traverso/songcanvas/SongView.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/traverso/songcanvas/SongView.cpp,v
retrieving revision 1.69
retrieving revision 1.70
diff -u -b -r1.69 -r1.70
--- src/traverso/songcanvas/SongView.cpp        3 Jun 2007 22:41:58 -0000       
1.69
+++ src/traverso/songcanvas/SongView.cpp        21 Jun 2007 14:31:11 -0000      
1.70
@@ -332,7 +332,7 @@
 {
        PENTER2;
        nframes_t centerX;
-       if (m_song->is_transporting() && m_actOnPlayHead) { 
+       if (m_song->is_transport_rolling() && m_actOnPlayHead) { 
                centerX = m_song->get_transport_frame();
        } else {
                centerX = m_song->get_working_frame();

Index: src/traverso/ui/DriverConfigPage.ui
===================================================================
RCS file: /sources/traverso/traverso/src/traverso/ui/DriverConfigPage.ui,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -b -r1.2 -r1.3
--- src/traverso/ui/DriverConfigPage.ui 5 Apr 2007 13:55:10 -0000       1.2
+++ src/traverso/ui/DriverConfigPage.ui 21 Jun 2007 14:31:11 -0000      1.3
@@ -6,7 +6,7 @@
     <x>0</x>
     <y>0</y>
     <width>373</width>
-    <height>129</height>
+    <height>190</height>
    </rect>
   </property>
   <property name="windowTitle" >
@@ -20,7 +20,7 @@
     <number>6</number>
    </property>
    <item>
-    <widget class="QGroupBox" name="groupBox" >
+    <widget class="QGroupBox" name="driverConfigGroupBox" >
      <property name="title" >
       <string>Configure driver</string>
      </property>
@@ -29,7 +29,7 @@
        <number>9</number>
       </property>
       <property name="spacing" >
-       <number>9</number>
+       <number>6</number>
       </property>
       <item>
        <layout class="QHBoxLayout" >
@@ -170,6 +170,28 @@
      </layout>
     </widget>
    </item>
+   <item>
+    <widget class="QGroupBox" name="jackGroupBox" >
+     <property name="title" >
+      <string>Jack</string>
+     </property>
+     <layout class="QVBoxLayout" >
+      <property name="margin" >
+       <number>9</number>
+      </property>
+      <property name="spacing" >
+       <number>6</number>
+      </property>
+      <item>
+       <widget class="QCheckBox" name="jackTransportCheckBox" >
+        <property name="text" >
+         <string>Enable Jack transport control</string>
+        </property>
+       </widget>
+      </item>
+     </layout>
+    </widget>
+   </item>
   </layout>
  </widget>
  <resources/>

Index: src/traverso/widgets/InfoWidgets.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/traverso/widgets/InfoWidgets.cpp,v
retrieving revision 1.38
retrieving revision 1.39
diff -u -b -r1.38 -r1.39
--- src/traverso/widgets/InfoWidgets.cpp        3 Jun 2007 17:14:17 -0000       
1.38
+++ src/traverso/widgets/InfoWidgets.cpp        21 Jun 2007 14:31:11 -0000      
1.39
@@ -388,7 +388,7 @@
        connect(m_song, SIGNAL(transportPosSet()), this, SLOT(update()));
        
        
-       if (m_song->is_transporting()) {
+       if (m_song->is_transport_rolling()) {
                m_playpixmap = find_pixmap(":/playstop");
        } else {
                m_playpixmap = find_pixmap(":/playstart");
@@ -411,7 +411,7 @@
        int fc = 170;
        QColor fontcolor = QColor(fc, fc, fc);
        
-       if (m_song && m_song->is_transporting()) {
+       if (m_song && m_song->is_transport_rolling()) {
                fc = 60;
                fontcolor = QColor(fc, fc, fc);
        }
@@ -467,7 +467,7 @@
        }
        
        if (event->button() == Qt::LeftButton) {
-               m_song->go();
+               m_song->start_transport();
        }
 }
 
@@ -671,18 +671,18 @@
 
 void SongInfo::update_temp_follow_state(bool state)
 {
-       if (m_song->is_transporting() && m_isFollowing) {
+       if (m_song->is_transport_rolling() && m_isFollowing) {
                m_followAct->setChecked(state);
        }
 }
 
 void SongInfo::follow_state_changed(bool state)
 {
-       if (!m_song->is_transporting() || !m_isFollowing) {
+       if (!m_song->is_transport_rolling() || !m_isFollowing) {
                m_isFollowing = state;
                config().set_property("PlayHead", "Follow", state);
                config().save();
-               if (m_song->is_transporting()) {
+               if (m_song->is_transport_rolling()) {
                        m_song->set_temp_follow_state(state);
                }
        } else {
@@ -701,10 +701,7 @@
 
 void SongInfo::recording_button_clicked()
 {
-       Command* cmd = m_song->go_and_record();
-       if (cmd) {
-               Command::process_command(cmd);
-       }
+       m_song->set_recordable();
 }
 
 void SongInfo::update_recording_state()




reply via email to

[Prev in Thread] Current Thread [Next in Thread]