summaryrefslogtreecommitdiff
path: root/libs/ardour/session_transport.cc
diff options
context:
space:
mode:
Diffstat (limited to 'libs/ardour/session_transport.cc')
-rw-r--r--libs/ardour/session_transport.cc80
1 files changed, 37 insertions, 43 deletions
diff --git a/libs/ardour/session_transport.cc b/libs/ardour/session_transport.cc
index 69de9ead2e..4055889c9c 100644
--- a/libs/ardour/session_transport.cc
+++ b/libs/ardour/session_transport.cc
@@ -79,14 +79,14 @@ Session::request_input_change_handling ()
}
void
-Session::request_sync_source (SyncSource src)
+Session::request_sync_source (Slave* new_slave)
{
Event* ev = new Event (Event::SetSyncSource, Event::Add, Event::Immediate, 0, 0.0);
bool seamless;
seamless = Config->get_seamless_loop ();
- if (src == JACK) {
+ if (dynamic_cast<JACK_Slave*>(new_slave)) {
/* JACK cannot support seamless looping at present */
Config->set_seamless_loop (false);
} else {
@@ -97,7 +97,7 @@ Session::request_sync_source (SyncSource src)
/* save value of seamless from before the switch */
_was_seamless = seamless;
- ev->sync_source = src;
+ ev->slave = new_slave;
queue_event (ev);
}
@@ -1156,17 +1156,16 @@ Session::reset_rf_scale (nframes_t motion)
}
void
-Session::drop_sync_source ()
+Session::use_sync_source (Slave* new_slave)
{
+ /* Runs in process() context */
+
bool non_rt_required = false;
- if (_transport_speed) {
- error << _("please stop the transport before adjusting slave settings") << endmsg;
- return;
- }
+ /* XXX this deletion is problematic because we're in RT context */
delete _slave;
- _slave = 0;
+ _slave = new_slave;
boost::shared_ptr<DiskstreamList> dsl = diskstreams.reader();
for (DiskstreamList::iterator i = dsl->begin(); i != dsl->end(); ++i) {
@@ -1174,7 +1173,7 @@ Session::drop_sync_source ()
if ((*i)->realtime_set_speed ((*i)->speed(), true)) {
non_rt_required = true;
}
- (*i)->set_slaved (0);
+ (*i)->set_slaved (_slave != 0);
}
}
@@ -1187,24 +1186,27 @@ Session::drop_sync_source ()
}
void
-Session::use_sync_source (SyncSource src)
+Session::drop_sync_source ()
{
- bool reverse = false;
- bool non_rt_required = false;
+ request_sync_source (0);
+}
- if (_transport_speed) {
- error << _("please stop the transport before adjusting slave settings") << endmsg;
- return;
- }
+void
+Session::switch_to_sync_source (SyncSource src)
+{
+ Slave* new_slave;
- delete _slave;
- _slave = 0;
+ DEBUG_TRACE (DEBUG::Slave, string_compose ("Setting up sync source %1\n", enum_2_string (src)));
switch (src) {
case MTC:
+ if (_slave && dynamic_cast<MTC_Slave*>(_slave)) {
+ return;
+ }
+
if (_mtc_port) {
try {
- _slave = new MTC_Slave (*this, *_mtc_port);
+ new_slave = new MTC_Slave (*this, *_mtc_port);
}
catch (failed_constructor& err) {
@@ -1218,9 +1220,13 @@ Session::use_sync_source (SyncSource src)
break;
case MIDIClock:
+ if (_slave && dynamic_cast<MIDIClock_Slave*>(_slave)) {
+ return;
+ }
+
if (_midi_clock_port) {
try {
- _slave = new MIDIClock_Slave (*this, *_midi_clock_port, 24);
+ new_slave = new MIDIClock_Slave (*this, *_midi_clock_port, 24);
}
catch (failed_constructor& err) {
@@ -1234,31 +1240,19 @@ Session::use_sync_source (SyncSource src)
break;
case JACK:
- _slave = new JACK_Slave (_engine.jack());
- break;
-
- };
-
- boost::shared_ptr<DiskstreamList> dsl = diskstreams.reader();
- for (DiskstreamList::iterator i = dsl->begin(); i != dsl->end(); ++i) {
- if (!(*i)->hidden()) {
- if ((*i)->realtime_set_speed ((*i)->speed(), true)) {
- non_rt_required = true;
- }
- (*i)->set_slaved (_slave);
+ if (_slave && dynamic_cast<JACK_Slave*>(_slave)) {
+ return;
}
- }
-
- if (reverse) {
- reverse_diskstream_buffers ();
- }
- if (non_rt_required) {
- add_post_transport_work (PostTransportSpeed);
- _butler->schedule_transport_work ();
- }
+ new_slave = new JACK_Slave (_engine.jack());
+ break;
+
+ default:
+ new_slave = 0;
+ break;
+ };
- set_dirty();
+ request_sync_source (new_slave);
}
void