summaryrefslogtreecommitdiff
path: root/libs/ardour
diff options
context:
space:
mode:
authorJohn Emmas <johne53@tiscali.co.uk>2013-10-06 11:56:03 +0100
committerJohn Emmas <johne53@tiscali.co.uk>2013-10-06 11:56:03 +0100
commit300b484cf6ac14c15e365c4062345d64a61c4b18 (patch)
treef10b9abedc141192f5c35f9c0f40e94f1d52786d /libs/ardour
parent7d78172abfd9b02bcb6809db3f7545e90dbe968d (diff)
parent2d5e605bf124c82f77a5a893e540bc176164947d (diff)
Merge branch 'master' into windows+cc
Conflicts (hopefully resolved): gtk2_ardour/ardour_ui.cc gtk2_ardour/ardour_ui.h gtk2_ardour/ardour_ui_options.cc
Diffstat (limited to 'libs/ardour')
-rw-r--r--libs/ardour/ardour/audio_backend.h18
-rw-r--r--libs/ardour/ardour/audioengine.h8
-rw-r--r--libs/ardour/ardour/graph.h5
-rw-r--r--libs/ardour/ardour/rc_configuration_vars.h2
-rw-r--r--libs/ardour/ardour/session.h7
-rw-r--r--libs/ardour/ardour/slave.h6
-rw-r--r--libs/ardour/ardour/types.h17
-rw-r--r--libs/ardour/audioengine.cc26
-rw-r--r--libs/ardour/engine_slave.cc (renamed from libs/ardour/jack_slave.cc)10
-rw-r--r--libs/ardour/enums.cc1
-rw-r--r--libs/ardour/globals.cc6
-rw-r--r--libs/ardour/graph.cc30
-rw-r--r--libs/ardour/session.cc34
-rw-r--r--libs/ardour/session_state.cc80
-rw-r--r--libs/ardour/session_time.cc2
-rw-r--r--libs/ardour/session_transport.cc30
-rw-r--r--libs/ardour/utils.cc9
-rw-r--r--libs/ardour/wscript4
18 files changed, 201 insertions, 94 deletions
diff --git a/libs/ardour/ardour/audio_backend.h b/libs/ardour/ardour/audio_backend.h
index 9052acd530..0e39625e8c 100644
--- a/libs/ardour/ardour/audio_backend.h
+++ b/libs/ardour/ardour/audio_backend.h
@@ -399,13 +399,25 @@ class AudioBackend : public PortEngine {
* stacksize. The thread will begin executing @param func, and will exit
* when that function returns.
*/
- virtual int create_process_thread (boost::function<void()> func, AudioBackendNativeThread*, size_t stacksize) = 0;
+ virtual int create_process_thread (boost::function<void()> func) = 0;
- /** Wait for the thread specified by @param thread to exit.
+ /** Wait for all processing threads to exit.
*
* Return zero on success, non-zero on failure.
*/
- virtual int wait_for_process_thread_exit (AudioBackendNativeThread thread) = 0;
+ virtual int join_process_threads () = 0;
+
+ /** Return true if execution context is in a backend thread
+ */
+ virtual bool in_process_thread () = 0;
+
+ /** Return the minimum stack size of audio threads in bytes
+ */
+ static size_t thread_stack_size () { return 100000; }
+
+ /** Return number of processing threads
+ */
+ virtual uint32_t process_thread_count () = 0;
virtual void update_latencies () = 0;
diff --git a/libs/ardour/ardour/audioengine.h b/libs/ardour/ardour/audioengine.h
index 201d960479..1bf4be3243 100644
--- a/libs/ardour/ardour/audioengine.h
+++ b/libs/ardour/ardour/audioengine.h
@@ -100,8 +100,12 @@ public:
pframes_t sample_time_at_cycle_start ();
pframes_t samples_since_cycle_start ();
bool get_sync_offset (pframes_t& offset) const;
- int create_process_thread (boost::function<void()> func, AudioBackendNativeThread*, size_t stacksize);
- int wait_for_process_thread_exit (AudioBackendNativeThread);
+
+ int create_process_thread (boost::function<void()> func);
+ int join_process_threads ();
+ bool in_process_thread ();
+ uint32_t process_thread_count ();
+
bool is_realtime() const;
bool connected() const;
diff --git a/libs/ardour/ardour/graph.h b/libs/ardour/ardour/graph.h
index 08af6fb721..763723c792 100644
--- a/libs/ardour/ardour/graph.h
+++ b/libs/ardour/ardour/graph.h
@@ -31,8 +31,6 @@
#include <glib.h>
#include <cassert>
-#include <pthread.h>
-
#include "pbd/semutils.h"
#include "ardour/types.h"
@@ -59,8 +57,6 @@ class Graph : public SessionHandleRef
public:
Graph (Session & session);
- uint32_t threads_in_use () const { return _thread_list.size(); }
-
void prep();
void trigger (GraphNode * n);
void rechain (boost::shared_ptr<RouteList>, GraphEdges const &);
@@ -93,7 +89,6 @@ protected:
virtual void session_going_away ();
private:
- std::list<AudioBackendNativeThread> _thread_list;
volatile bool _quit_threads;
void reset_thread_list ();
diff --git a/libs/ardour/ardour/rc_configuration_vars.h b/libs/ardour/ardour/rc_configuration_vars.h
index 78be86eaea..7000dde3ca 100644
--- a/libs/ardour/ardour/rc_configuration_vars.h
+++ b/libs/ardour/ardour/rc_configuration_vars.h
@@ -51,7 +51,7 @@ CONFIG_VARIABLE (int, mtc_qf_speed_tolerance, "mtc-qf-speed-tolerance", 5)
CONFIG_VARIABLE (bool, timecode_sync_frame_rate, "timecode-sync-frame-rate", true)
CONFIG_VARIABLE (bool, timecode_source_is_synced, "timecode-source-is-synced", true)
CONFIG_VARIABLE (bool, timecode_source_2997, "timecode-source-2997", false)
-CONFIG_VARIABLE (SyncSource, sync_source, "sync-source", JACK)
+CONFIG_VARIABLE (SyncSource, sync_source, "sync-source", Engine)
CONFIG_VARIABLE (std::string, ltc_source_port, "ltc-source-port", "system:capture_1")
CONFIG_VARIABLE (bool, send_ltc, "send-ltc", false)
CONFIG_VARIABLE (bool, ltc_send_continuously, "ltc-send-continuously", true)
diff --git a/libs/ardour/ardour/session.h b/libs/ardour/ardour/session.h
index 3fa9fbcb28..d8004e8505 100644
--- a/libs/ardour/ardour/session.h
+++ b/libs/ardour/ardour/session.h
@@ -161,6 +161,8 @@ class Session : public PBD::StatefulDestructible, public PBD::ScopedConnectionLi
virtual ~Session ();
+ static int get_info_from_path (const std::string& xmlpath, float& sample_rate, SampleFormat& data_format);
+
std::string path() const { return _path; }
std::string name() const { return _name; }
std::string snap_name() const { return _current_snapshot_name; }
@@ -509,7 +511,7 @@ class Session : public PBD::StatefulDestructible, public PBD::ScopedConnectionLi
static PBD::Signal1<void, framepos_t> EndTimeChanged;
void request_sync_source (Slave*);
- bool synced_to_jack() const { return config.get_external_sync() && Config->get_sync_source() == JACK; }
+ bool synced_to_engine() const { return config.get_external_sync() && Config->get_sync_source() == Engine; }
double transport_speed() const { return _transport_speed; }
bool transport_stopped() const { return _transport_speed == 0.0f; }
@@ -1617,7 +1619,10 @@ class Session : public PBD::StatefulDestructible, public PBD::ScopedConnectionLi
void setup_ltc ();
void setup_click ();
+ void setup_click_state (const XMLNode&);
void setup_bundles ();
+
+ static int get_session_info_from_path (XMLTree& state_tree, const std::string& xmlpath);
};
} // namespace ARDOUR
diff --git a/libs/ardour/ardour/slave.h b/libs/ardour/ardour/slave.h
index c60acb1df7..a0b7b878e4 100644
--- a/libs/ardour/ardour/slave.h
+++ b/libs/ardour/ardour/slave.h
@@ -486,11 +486,11 @@ class MIDIClock_Slave : public Slave {
bool _starting;
};
-class JACK_Slave : public Slave
+class Engine_Slave : public Slave
{
public:
- JACK_Slave (AudioEngine&);
- ~JACK_Slave ();
+ Engine_Slave (AudioEngine&);
+ ~Engine_Slave ();
bool speed_and_position (double& speed, framepos_t& pos);
diff --git a/libs/ardour/ardour/types.h b/libs/ardour/ardour/types.h
index f2319d7669..ee43d1f30f 100644
--- a/libs/ardour/ardour/types.h
+++ b/libs/ardour/ardour/types.h
@@ -489,7 +489,12 @@ namespace ARDOUR {
};
enum SyncSource {
- JACK,
+ /* These are "synonyms". It is important for JACK to be first
+ both here and in enums.cc, so that the string "JACK" is
+ correctly recognized in older session and preference files.
+ */
+ JACK = 0,
+ Engine = 0,
MTC,
MIDIClock,
LTC
@@ -610,16 +615,6 @@ namespace ARDOUR {
uint32_t max; //< samples
};
-/* PLATFORM SPECIFIC #ifdef's here */
-
- /** Define the native thread type used on the platform */
- typedef pthread_t AudioBackendNativeThread;
- static inline bool self_thread_equal (AudioBackendNativeThread thr) {
- return pthread_equal (thr, pthread_self());
- }
-
-/* PLATFORM SPECIFIC #endif's here */
-
} // namespace ARDOUR
diff --git a/libs/ardour/audioengine.cc b/libs/ardour/audioengine.cc
index 05fc469c77..7cb4e17a5c 100644
--- a/libs/ardour/audioengine.cc
+++ b/libs/ardour/audioengine.cc
@@ -824,21 +824,39 @@ AudioEngine::get_sync_offset (pframes_t& offset) const
}
int
-AudioEngine::create_process_thread (boost::function<void()> func, AudioBackendNativeThread* thr, size_t stacksize)
+AudioEngine::create_process_thread (boost::function<void()> func)
{
if (!_backend) {
return -1;
}
- return _backend->create_process_thread (func, thr, stacksize);
+ return _backend->create_process_thread (func);
}
int
-AudioEngine::wait_for_process_thread_exit (AudioBackendNativeThread thr)
+AudioEngine::join_process_threads ()
+{
+ if (!_backend) {
+ return -1;
+ }
+ return _backend->join_process_threads ();
+}
+
+bool
+AudioEngine::in_process_thread ()
+{
+ if (!_backend) {
+ return false;
+ }
+ return _backend->in_process_thread ();
+}
+
+uint32_t
+AudioEngine::process_thread_count ()
{
if (!_backend) {
return 0;
}
- return _backend->wait_for_process_thread_exit (thr);
+ return _backend->process_thread_count ();
}
int
diff --git a/libs/ardour/jack_slave.cc b/libs/ardour/engine_slave.cc
index 4b2f3b1860..eb55c9ba54 100644
--- a/libs/ardour/jack_slave.cc
+++ b/libs/ardour/engine_slave.cc
@@ -26,7 +26,7 @@
using namespace std;
using namespace ARDOUR;
-JACK_Slave::JACK_Slave (AudioEngine& e)
+Engine_Slave::Engine_Slave (AudioEngine& e)
: engine (e)
{
double x;
@@ -35,24 +35,24 @@ JACK_Slave::JACK_Slave (AudioEngine& e)
speed_and_position (x, p);
}
-JACK_Slave::~JACK_Slave ()
+Engine_Slave::~Engine_Slave ()
{
}
bool
-JACK_Slave::locked() const
+Engine_Slave::locked() const
{
return true;
}
bool
-JACK_Slave::ok() const
+Engine_Slave::ok() const
{
return true;
}
bool
-JACK_Slave::speed_and_position (double& sp, framepos_t& position)
+Engine_Slave::speed_and_position (double& sp, framepos_t& position)
{
switch (engine.transport_state()) {
case TransportStopped:
diff --git a/libs/ardour/enums.cc b/libs/ardour/enums.cc
index bab0e8ed15..2a38cd2c8a 100644
--- a/libs/ardour/enums.cc
+++ b/libs/ardour/enums.cc
@@ -336,6 +336,7 @@ setup_enum_writer ()
REGISTER_ENUM (MTC);
REGISTER_ENUM (JACK);
+ REGISTER_ENUM (Engine);
REGISTER_ENUM (MIDIClock);
REGISTER_ENUM (LTC);
REGISTER (_SyncSource);
diff --git a/libs/ardour/globals.cc b/libs/ardour/globals.cc
index 0cda9ebdf4..b3bfbd2239 100644
--- a/libs/ardour/globals.cc
+++ b/libs/ardour/globals.cc
@@ -544,7 +544,11 @@ ARDOUR::get_available_sync_options ()
{
vector<SyncSource> ret;
- ret.push_back (JACK);
+ boost::shared_ptr<AudioBackend> backend = AudioEngine::instance()->current_backend();
+ if (backend && backend->name() == "JACK") {
+ ret.push_back (Engine);
+ }
+
ret.push_back (MTC);
ret.push_back (MIDIClock);
ret.push_back (LTC);
diff --git a/libs/ardour/graph.cc b/libs/ardour/graph.cc
index 69c4953272..f8a1d51e10 100644
--- a/libs/ardour/graph.cc
+++ b/libs/ardour/graph.cc
@@ -97,29 +97,24 @@ Graph::reset_thread_list ()
number of threads.
*/
- if (_thread_list.size() == num_threads) {
+ if (AudioEngine::instance()->process_thread_count() == num_threads) {
return;
}
Glib::Threads::Mutex::Lock lm (_session.engine().process_lock());
- AudioBackendNativeThread a_thread;
- if (!_thread_list.empty()) {
+ if (AudioEngine::instance()->process_thread_count() != 0) {
drop_threads ();
}
- if (AudioEngine::instance()->create_process_thread (boost::bind (&Graph::main_thread, this), &a_thread, 100000) != 0) {
+ if (AudioEngine::instance()->create_process_thread (boost::bind (&Graph::main_thread, this)) != 0) {
throw failed_constructor ();
}
- _thread_list.push_back (a_thread);
-
for (uint32_t i = 1; i < num_threads; ++i) {
- if (AudioEngine::instance()->create_process_thread (boost::bind (&Graph::helper_thread, this), &a_thread, 100000) != 0) {
+ if (AudioEngine::instance()->create_process_thread (boost::bind (&Graph::helper_thread, this))) {
throw failed_constructor ();
}
-
- _thread_list.push_back (a_thread);
}
}
@@ -141,17 +136,15 @@ Graph::drop_threads ()
{
_quit_threads = true;
- for (unsigned int i=0; i< _thread_list.size(); i++) {
+ uint32_t thread_count = AudioEngine::instance()->process_thread_count ();
+
+ for (unsigned int i=0; i < thread_count; i++) {
_execution_sem.signal ();
}
_callback_start_sem.signal ();
- for (list<AudioBackendNativeThread>::iterator i = _thread_list.begin(); i != _thread_list.end(); ++i) {
- AudioEngine::instance()->wait_for_process_thread_exit (*i);
- }
-
- _thread_list.clear ();
+ AudioEngine::instance()->join_process_threads ();
_execution_tokens = 0;
@@ -584,10 +577,5 @@ Graph::process_one_route (Route* route)
bool
Graph::in_process_thread () const
{
- for (list<AudioBackendNativeThread>::const_iterator i = _thread_list.begin (); i != _thread_list.end(); ++i) {
- if (self_thread_equal (*i)) {
- return true;
- }
- }
- return false;
+ return AudioEngine::instance()->in_process_thread ();
}
diff --git a/libs/ardour/session.cc b/libs/ardour/session.cc
index 2a081086d4..4b30543cb0 100644
--- a/libs/ardour/session.cc
+++ b/libs/ardour/session.cc
@@ -276,6 +276,21 @@ Session::Session (AudioEngine &eng,
throw failed_constructor ();
}
+ /* if a mix template was provided, then ::create() will
+ * have copied it into the session and we need to load it
+ * so that we have the state ready for ::set_state()
+ * after the engine is started.
+ *
+ * Note that we do NOT try to get the sample rate from
+ * the template at this time, though doing so would
+ * be easy if we decided this was an appropriate part
+ * of a template.
+ */
+
+ if (!mix_template.empty() && load_state (_current_snapshot_name)) {
+ throw failed_constructor ();
+ }
+
} else {
if (load_state (_current_snapshot_name)) {
@@ -393,7 +408,7 @@ Session::immediately_post_engine ()
_engine.Running.connect_same_thread (*this, boost::bind (&Session::initialize_latencies, this));
- if (synced_to_jack()) {
+ if (synced_to_engine()) {
_engine.transport_stop ();
}
@@ -577,14 +592,21 @@ Session::setup_ltc ()
void
Session::setup_click ()
{
- XMLNode* child = 0;
-
_clicking = false;
_click_io.reset (new ClickIO (*this, "click"));
_click_gain.reset (new Amp (*this));
_click_gain->activate ();
-
- if (state_tree && (child = find_named_node (*state_tree->root(), "Click")) != 0) {
+ if (state_tree) {
+ setup_click_state (*state_tree->root());
+ }
+}
+
+void
+Session::setup_click_state (const XMLNode& node)
+{
+ const XMLNode* child = 0;
+
+ if ((child = find_named_node (node, "Click")) != 0) {
/* existing state for Click */
int c = 0;
@@ -1406,7 +1428,7 @@ Session::audible_frame () const
offset = current_block_size;
}
- if (synced_to_jack()) {
+ if (synced_to_engine()) {
tf = _engine.transport_frame();
} else {
tf = _transport_frame;
diff --git a/libs/ardour/session_state.cc b/libs/ardour/session_state.cc
index 1a605d2fd5..59bb3fd718 100644
--- a/libs/ardour/session_state.cc
+++ b/libs/ardour/session_state.cc
@@ -494,9 +494,10 @@ Session::create (const string& session_template, BusProfile* bus_profile)
ifstream in(in_path.c_str());
if (in) {
- string out_path = _path;
- out_path += _name;
- out_path += statefile_suffix;
+ /* no need to call legalize_for_path() since the string
+ * in session_template is already a legal path name
+ */
+ string out_path = Glib::build_filename (_session_dir->root_path(), _name + statefile_suffix);
ofstream out(out_path.c_str());
@@ -1317,13 +1318,7 @@ Session::set_state (const XMLNode& node, int version)
if ((child = find_named_node (node, "Click")) == 0) {
warning << _("Session: XML state has no click section") << endmsg;
} else if (_click_io) {
- const XMLNodeList& children (child->children());
- XMLNodeList::const_iterator i = children.begin();
- _click_io->set_state (**i, version);
- ++i;
- if (i != children.end()) {
- _click_gain->set_state (**i, version);
- }
+ setup_click_state (node);
}
if ((child = find_named_node (node, ControlProtocolManager::state_node_name)) != 0) {
@@ -3781,3 +3776,68 @@ Session::rename (const std::string& new_name)
#undef RENAME
}
+
+int
+Session::get_session_info_from_path (XMLTree& tree, const string& xmlpath)
+{
+ if (!Glib::file_test (xmlpath, Glib::FILE_TEST_EXISTS)) {
+ return -1;
+ }
+
+ if (!tree.read (xmlpath)) {
+ return -1;
+ }
+
+ return 0;
+}
+
+int
+Session::get_info_from_path (const string& xmlpath, float& sample_rate, SampleFormat& data_format)
+{
+ XMLTree tree;
+ bool found_sr = false;
+ bool found_data_format = false;
+
+ if (get_session_info_from_path (tree, xmlpath)) {
+ return -1;
+ }
+
+ /* sample rate */
+
+ const XMLProperty* prop;
+ if ((prop = tree.root()->property (X_("sample-rate"))) != 0) {
+ sample_rate = atoi (prop->value());
+ found_sr = true;
+ }
+
+ const XMLNodeList& children (tree.root()->children());
+ for (XMLNodeList::const_iterator c = children.begin(); c != children.end(); ++c) {
+ const XMLNode* child = *c;
+ if (child->name() == "Config") {
+ const XMLNodeList& options (child->children());
+ for (XMLNodeList::const_iterator oc = options.begin(); oc != options.end(); ++oc) {
+ const XMLNode* option = *oc;
+ const XMLProperty* name = option->property("name");
+
+ if (!name) {
+ continue;
+ }
+
+ if (name->value() == "native-file-data-format") {
+ const XMLProperty* value = option->property ("value");
+ if (value) {
+ SampleFormat fmt = (SampleFormat) string_2_enum (option->property ("value")->value(), fmt);
+ data_format = fmt;
+ found_data_format = true;
+ break;
+ }
+ }
+ }
+ }
+ if (found_data_format) {
+ break;
+ }
+ }
+
+ return !(found_sr && found_data_format); // zero if they are both found
+}
diff --git a/libs/ardour/session_time.cc b/libs/ardour/session_time.cc
index 0f2186c09b..e35910f2df 100644
--- a/libs/ardour/session_time.cc
+++ b/libs/ardour/session_time.cc
@@ -182,7 +182,7 @@ Session::timecode_time (Timecode::Time &t)
int
Session::backend_sync_callback (TransportState state, framepos_t pos)
{
- bool slave = synced_to_jack();
+ bool slave = synced_to_engine();
switch (state) {
case TransportStopped:
diff --git a/libs/ardour/session_transport.cc b/libs/ardour/session_transport.cc
index ab6d68fd67..38ad521235 100644
--- a/libs/ardour/session_transport.cc
+++ b/libs/ardour/session_transport.cc
@@ -86,7 +86,7 @@ Session::request_sync_source (Slave* new_slave)
seamless = Config->get_seamless_loop ();
- if (dynamic_cast<JACK_Slave*>(new_slave)) {
+ if (dynamic_cast<Engine_Slave*>(new_slave)) {
/* JACK cannot support seamless looping at present */
Config->set_seamless_loop (false);
} else {
@@ -514,13 +514,13 @@ Session::non_realtime_stop (bool abort, int on_entry, bool& finished)
if (auto_return_enabled ||
(ptw & PostTransportLocate) ||
(_requested_return_frame >= 0) ||
- synced_to_jack()) {
+ synced_to_engine()) {
if (pending_locate_flush) {
flush_all_inserts ();
}
- if ((auto_return_enabled || synced_to_jack() || _requested_return_frame >= 0) &&
+ if ((auto_return_enabled || synced_to_engine() || _requested_return_frame >= 0) &&
!(ptw & PostTransportLocate)) {
/* no explicit locate queued */
@@ -543,7 +543,7 @@ Session::non_realtime_stop (bool abort, int on_entry, bool& finished)
/* don't try to handle loop play when synced to JACK */
- if (!synced_to_jack()) {
+ if (!synced_to_engine()) {
Location *location = _locations->auto_loop_location();
@@ -734,7 +734,7 @@ Session::set_play_loop (bool yn)
return;
}
- if (yn && Config->get_seamless_loop() && synced_to_jack()) {
+ if (yn && Config->get_seamless_loop() && synced_to_engine()) {
warning << string_compose (
_("Seamless looping cannot be supported while %1 is using JACK transport.\n"
"Recommend changing the configured options"), PROGRAM_NAME)
@@ -811,7 +811,7 @@ Session::flush_all_inserts ()
void
Session::start_locate (framepos_t target_frame, bool with_roll, bool with_flush, bool with_loop, bool force)
{
- if (synced_to_jack()) {
+ if (synced_to_engine()) {
double sp;
framepos_t pos;
@@ -926,7 +926,7 @@ Session::locate (framepos_t target_frame, bool with_roll, bool with_flush, bool
bool transport_was_stopped = !transport_rolling();
- if (transport_was_stopped && (!auto_play_legal || !config.get_auto_play()) && !with_roll && !(synced_to_jack() && play_loop)) {
+ if (transport_was_stopped && (!auto_play_legal || !config.get_auto_play()) && !with_roll && !(synced_to_engine() && play_loop)) {
realtime_stop (false, true); // XXX paul - check if the 2nd arg is really correct
transport_was_stopped = true;
} else {
@@ -1067,7 +1067,7 @@ Session::set_transport_speed (double speed, bool abort, bool clear_state, bool a
set_track_monitor_input_status (true);
}
- if (synced_to_jack ()) {
+ if (synced_to_engine ()) {
if (clear_state) {
/* do this here because our response to the slave won't
take care of it.
@@ -1090,7 +1090,7 @@ Session::set_transport_speed (double speed, bool abort, bool clear_state, bool a
set_track_monitor_input_status (false);
}
- if (synced_to_jack()) {
+ if (synced_to_engine()) {
_engine.transport_start ();
} else {
start_transport ();
@@ -1100,7 +1100,7 @@ Session::set_transport_speed (double speed, bool abort, bool clear_state, bool a
/* not zero, not 1.0 ... varispeed */
- if ((synced_to_jack()) && speed != 0.0 && speed != 1.0) {
+ if ((synced_to_engine()) && speed != 0.0 && speed != 1.0) {
warning << string_compose (
_("Global varispeed cannot be supported while %1 is connected to JACK transport control"),
PROGRAM_NAME)
@@ -1429,8 +1429,8 @@ Session::switch_to_sync_source (SyncSource src)
}
break;
- case JACK:
- if (_slave && dynamic_cast<JACK_Slave*>(_slave)) {
+ case Engine:
+ if (_slave && dynamic_cast<Engine_Slave*>(_slave)) {
return;
}
@@ -1438,7 +1438,7 @@ Session::switch_to_sync_source (SyncSource src)
return;
}
- new_slave = new JACK_Slave (*AudioEngine::instance());
+ new_slave = new Engine_Slave (*AudioEngine::instance());
break;
default:
@@ -1632,9 +1632,9 @@ bool
Session::maybe_stop (framepos_t limit)
{
if ((_transport_speed > 0.0f && _transport_frame >= limit) || (_transport_speed < 0.0f && _transport_frame == 0)) {
- if (synced_to_jack () && config.get_jack_time_master ()) {
+ if (synced_to_engine () && config.get_jack_time_master ()) {
_engine.transport_stop ();
- } else if (!synced_to_jack ()) {
+ } else if (!synced_to_engine ()) {
stop_transport ();
}
return true;
diff --git a/libs/ardour/utils.cc b/libs/ardour/utils.cc
index f23f1332b8..5356616324 100644
--- a/libs/ardour/utils.cc
+++ b/libs/ardour/utils.cc
@@ -397,12 +397,12 @@ string_to_sync_source (string str)
}
if (str == _("JACK")) {
- return JACK;
+ return Engine;
}
fatal << string_compose (_("programming error: unknown sync source string \"%1\""), str) << endmsg;
/*NOTREACHED*/
- return JACK;
+ return Engine;
}
/** @param sh Return a short version of the string */
@@ -410,7 +410,10 @@ const char*
sync_source_to_string (SyncSource src, bool sh)
{
switch (src) {
- case JACK:
+ case Engine:
+ /* no other backends offer sync for now ... deal with this if we
+ * ever have to.
+ */
return _("JACK");
case MTC:
diff --git a/libs/ardour/wscript b/libs/ardour/wscript
index e8c9fb8328..6e57c455fa 100644
--- a/libs/ardour/wscript
+++ b/libs/ardour/wscript
@@ -70,6 +70,7 @@ libardour_sources = [
'diskstream.cc',
'element_import_handler.cc',
'element_importer.cc',
+ 'engine_slave.cc',
'enums.cc',
'event_type_map.cc',
'export_channel.cc',
@@ -104,7 +105,6 @@ libardour_sources = [
'interpolation.cc',
'io.cc',
'io_processor.cc',
- 'jack_slave.cc',
'kmeterdsp.cc',
'ladspa_plugin.cc',
'ladspa_search_path.cc',
@@ -347,7 +347,7 @@ def build(bld):
'AUDIOUNITS', 'OSX','BOOST','CURL','DL']
obj.use = ['libpbd','libmidipp','libevoral','libvamphost',
'libvampplugin','libtaglib','librubberband',
- 'libaudiographer','libltc']
+ 'libaudiographer','libltc','libtimecode']
obj.vnum = LIBARDOUR_LIB_VERSION
obj.install_path = os.path.join(bld.env['LIBDIR'], 'ardour3')
obj.defines = [