[Top][All Lists]
[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()
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Traverso-commit] traverso resources/keymap.xml src/commands/AddR...,
Remon Sijrier <=