summaryrefslogtreecommitdiff
path: root/libs/ardour
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2013-10-09 14:00:42 -0400
committerPaul Davis <paul@linuxaudiosystems.com>2013-10-09 14:00:42 -0400
commit2a6a16f980ff9181b138f7a30aedfbde4426a591 (patch)
treed86752508bbd033be18301796e7d0c571a4fe1c0 /libs/ardour
parent66aa6dfc8ecdb7591768bc45866a8c2b0d77e767 (diff)
parent465b800d8b7dc0d9e0f92a16c6fcae29d2bbd544 (diff)
merge with master, fixing conflicts in 3 wscript files
Diffstat (limited to 'libs/ardour')
-rw-r--r--libs/ardour/ardour/ardour.h2
-rw-r--r--libs/ardour/ardour/audio_backend.h18
-rw-r--r--libs/ardour/ardour/audioengine.h12
-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.h16
-rw-r--r--libs/ardour/ardour/slave.h6
-rw-r--r--libs/ardour/ardour/types.h17
-rw-r--r--libs/ardour/audioengine.cc46
-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.cc19
-rw-r--r--libs/ardour/graph.cc30
-rw-r--r--libs/ardour/po/de.po602
-rw-r--r--libs/ardour/session.cc34
-rw-r--r--libs/ardour/session_jack.cc185
-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/wscript22
21 files changed, 560 insertions, 588 deletions
diff --git a/libs/ardour/ardour/ardour.h b/libs/ardour/ardour/ardour.h
index 311611997f..80bdf9d80e 100644
--- a/libs/ardour/ardour/ardour.h
+++ b/libs/ardour/ardour/ardour.h
@@ -60,7 +60,7 @@ namespace ARDOUR {
*/
bool init (bool with_vst, bool try_optimization, const char* localedir);
void init_post_engine ();
- int cleanup ();
+ void cleanup ();
bool no_auto_connect ();
void make_property_quarks ();
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..ddffd1d5c0 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;
@@ -225,6 +229,7 @@ public:
std::string _latency_output_name;
framecnt_t _latency_signal_latency;
bool _started_for_latency;
+ bool _in_destructor;
void meter_thread ();
void start_metering_thread ();
@@ -232,9 +237,6 @@ public:
static gint m_meter_exit;
- void parameter_changed (const std::string&);
- PBD::ScopedConnection config_connection;
-
typedef std::map<std::string,AudioBackendInfo*> BackendMap;
BackendMap _backends;
AudioBackendInfo* backend_discover (const std::string&);
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 e05efbd510..3c11304fdb 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..6fe7ac8637 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; }
@@ -879,15 +881,6 @@ class Session : public PBD::StatefulDestructible, public PBD::ScopedConnectionLi
MIDI::MachineControl& mmc() { return *_mmc; }
- /* Callbacks specifically related to JACK, and called directly
- * from the JACK audio backend.
- */
-
-#ifdef HAVE_JACK_SESSION
- void jack_session_event (jack_session_event_t* event);
-#endif
- void jack_timebase_callback (jack_transport_state_t, pframes_t, jack_position_t*, int);
-
protected:
friend class AudioEngine;
void set_block_size (pframes_t nframes);
@@ -1617,7 +1610,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..224e09569f 100644
--- a/libs/ardour/audioengine.cc
+++ b/libs/ardour/audioengine.cc
@@ -79,6 +79,7 @@ AudioEngine::AudioEngine ()
, _latency_flush_frames (0)
, _latency_signal_latency (0)
, _started_for_latency (false)
+ , _in_destructor (false)
{
g_atomic_int_set (&m_meter_exit, 0);
discover_backends ();
@@ -86,15 +87,9 @@ AudioEngine::AudioEngine ()
AudioEngine::~AudioEngine ()
{
+ _in_destructor = true;
+ stop_metering_thread ();
drop_backend ();
-
- config_connection.disconnect ();
-
- {
- Glib::Threads::Mutex::Lock tm (_process_lock);
- session_removed.signal ();
- stop_metering_thread ();
- }
}
AudioEngine*
@@ -477,6 +472,7 @@ AudioEngine::discover_backends ()
Glib::PatternSpec so_extension_pattern("*backend.so");
Glib::PatternSpec dylib_extension_pattern("*backend.dylib");
+ Glib::PatternSpec dll_extension_pattern("*backend.dll");
find_matching_files_in_search_path (backend_search_path (),
so_extension_pattern, backend_modules);
@@ -484,6 +480,9 @@ AudioEngine::discover_backends ()
find_matching_files_in_search_path (backend_search_path (),
dylib_extension_pattern, backend_modules);
+ find_matching_files_in_search_path (backend_search_path (),
+ dll_extension_pattern, backend_modules);
+
DEBUG_TRACE (DEBUG::Panning, string_compose (_("looking for backends in %1\n"), backend_search_path().to_string()));
for (vector<std::string>::iterator i = backend_modules.begin(); i != backend_modules.end(); ++i) {
@@ -824,21 +823,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
@@ -980,6 +997,11 @@ AudioEngine::update_latencies ()
void
AudioEngine::halted_callback (const char* why)
{
+ if (_in_destructor) {
+ /* everything is under control */
+ return;
+ }
+
stop_metering_thread ();
_running = false;
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..84693af541 100644
--- a/libs/ardour/globals.cc
+++ b/libs/ardour/globals.cc
@@ -366,9 +366,15 @@ ARDOUR::init_post_engine ()
ARDOUR::PluginManager::instance().refresh ();
}
-int
-ARDOUR::cleanup ()
+void
+ARDOUR::cleanup ()
{
+ if (!libardour_initialized) {
+ return;
+ }
+
+ ARDOUR::AudioEngine::destroy ();
+
delete Library;
#ifdef HAVE_LRDF
lrdf_cleanup ();
@@ -382,7 +388,8 @@ ARDOUR::cleanup ()
vstfx_exit();
#endif
PBD::cleanup ();
- return 0;
+
+ return;
}
void
@@ -544,7 +551,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 50a66b6144..72017d1b36 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/po/de.po b/libs/ardour/po/de.po
index 87cd8be124..f92bf49d1e 100644
--- a/libs/ardour/po/de.po
+++ b/libs/ardour/po/de.po
@@ -6,8 +6,8 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2013-09-03 07:59-0400\n"
-"PO-Revision-Date: 2013-07-23 15:04+0200\n"
+"POT-Creation-Date: 2013-09-26 16:09+0200\n"
+"PO-Revision-Date: 2013-09-26 16:32+0200\n"
"Last-Translator: Edgar Aichinger <edogawa@aon.at>\n"
"Language-Team: German <ardour-dev@lists.ardour.org>\n"
"Language: de\n"
@@ -137,7 +137,7 @@ msgstr "Audio-Wiedergabelisten (unbenutzt)"
#: audio_playlist_source.cc:171 audiosource.cc:913 file_source.cc:529
#: midi_playlist_source.cc:144 midi_playlist_source.cc:152
#: midi_playlist_source.cc:159 midi_source.cc:371 plugin_insert.cc:643
-#: rb_effect.cc:332 session.cc:2465 session.cc:2498 session.cc:3643
+#: rb_effect.cc:332 session.cc:2606 session.cc:2639 session.cc:3784
#: session_handle.cc:87 sndfilesource.cc:121
msgid "programming error: %1"
msgstr "Programmierfehler: %1"
@@ -206,65 +206,21 @@ msgstr "kann VAMP-Plugin \"%1\" nicht laden"
msgid "VAMP Plugin \"%1\" could not be loaded"
msgstr "VAMP-Plugin \"%1\" konnte nicht geladen werden"
-#: audioengine.cc:186
-msgid ""
-"This version of JACK is old - you should upgrade to a newer version that "
-"supports jack_port_type_get_buffer_size()"
-msgstr ""
-"Diese JACK-Version ist alt - Sie sollten auf eine Version upgraden, die "
-"jack_port_type_get_buffer_size() unterstützt"
+#: audioengine.cc:489
+msgid "looking for backends in %1\n"
+msgstr "Suche nach Backends in %1\n"
-#: audioengine.cc:190
-msgid "Connect session to engine"
-msgstr "Verbinde Projekt mit Engine"
+#: audioengine.cc:512
+msgid "AudioEngine: cannot load module \"%1\" (%2)"
+msgstr "AudioEngine: kann Modul \"%1\" nicht laden (%2)"
-#: audioengine.cc:843
-msgid ""
-"a port with the name \"%1\" already exists: check for duplicated track/bus "
-"names"
-msgstr ""
-"Ein Port mit Namen \"%1\" existiert bereits: Prüfen Sie auf doppelte Spur/"
-"Busnamen"
+#: audioengine.cc:518
+msgid "AudioEngine: backend at \"%1\" has no descriptor function."
+msgstr "AudioEngine: Backend an \"%1\" hat keine Beschreibungsfunktion."
-#: audioengine.cc:845 session.cc:1698
-msgid ""
-"No more JACK ports are available. You will need to stop %1 and restart JACK "
-"with more ports if you need this many tracks."
-msgstr ""
-"Keine JACK-Ports mehr verfügbar. Wenn Sie so viele Spuren benötigen, müssen "
-"Sie %1 stoppen und JACK mit mehr Ports neu starten."
-
-#: audioengine.cc:848
-msgid "AudioEngine: cannot register port \"%1\": %2"
-msgstr "AudioEngine: kann Port \"%1\": %2 nicht registrieren"
-
-#: audioengine.cc:878
-msgid "unable to create port: %1"
-msgstr "kann Port: %1 nicht erzeugen"
-
-#: audioengine.cc:932
-msgid "connect called before engine was started"
-msgstr "Aufruf von connect vor dem Start der Engine"
-
-#: audioengine.cc:958
-msgid "AudioEngine: cannot connect %1 (%2) to %3 (%4)"
-msgstr "AudioEngine: kann %1 (%2) nicht mit %3 (%4) verbinden"
-
-#: audioengine.cc:973 audioengine.cc:1004
-msgid "disconnect called before engine was started"
-msgstr "Aufruf von disconnect vor dem Start der Engine"
-
-#: audioengine.cc:1052
-msgid "get_port_by_name() called before engine was started"
-msgstr "Aufruf von get_port_by_name() vor dem Start der Engine"
-
-#: audioengine.cc:1104
-msgid "get_ports called before engine was started"
-msgstr "Aufruf von get_ports vor dem Start der Engine"
-
-#: audioengine.cc:1427
-msgid "failed to connect to JACK"
-msgstr "Verbindung zu JACK fehlgeschlagen"
+#: audioengine.cc:580
+msgid "Could not create backend for %1: %2"
+msgstr "Konnte Backend für %1 nicht erzeugen: %2"
#: audioregion.cc:1643
msgid ""
@@ -316,8 +272,8 @@ msgstr "AudioSource: kann Pfad für Peaks (b) \"%1\" nicht öffnen (%2)"
msgid ""
"AudioSource[%1]: peak read - cannot read %2 samples at offset %3 of %4 (%5)"
msgstr ""
-"AudioSource[%1]: peak read - kann %2 Samples bei Offset %3 von %4 nicht lesen"
-"(%5)"
+"AudioSource[%1]: peak read - kann %2 Samples bei Offset %3 von %4 nicht "
+"lesen(%5)"
#: audiosource.cc:667
msgid "%1: could not write read raw data for peak computation (%2)"
@@ -467,7 +423,7 @@ msgstr "kann CPU-Takt in /proc/cpuinfo nicht finden"
msgid "audio"
msgstr "Audio"
-#: data_type.cc:28 session.cc:1640 session.cc:1643
+#: data_type.cc:28 session.cc:1781 session.cc:1784
msgid "MIDI"
msgstr "MIDI"
@@ -582,7 +538,7 @@ msgstr "Dreieck"
msgid "Rectangular"
msgstr "Rechteck"
-#: export_formats.cc:52 session.cc:4861 session.cc:4877
+#: export_formats.cc:52 session.cc:5002 session.cc:5018
msgid "None"
msgstr "Kein"
@@ -696,7 +652,7 @@ msgstr ""
"% unterstützt nur %2 Kanäle, in Ihrer Kanalkonfiguration befinden sich "
"jedoch %3 Kanäle"
-#: file_source.cc:198 session_state.cc:2891
+#: file_source.cc:198 session_state.cc:2813
msgid ""
"there are already 1000 files with names like %1; versioning discontinued"
msgstr ""
@@ -800,24 +756,24 @@ msgstr "kann momentanes Arbeitsverzeichnis nicht bestimmen (%1)"
msgid "unknown file type for session %1"
msgstr "Unbekannter Dateityp für Projekt %1"
-#: globals.cc:205
+#: globals.cc:207
msgid "Could not set system open files limit to \"unlimited\""
msgstr ""
"Konnte die Systemgrenze für offene Dateien nicht auf \"unbeschränkt\" setzen"
-#: globals.cc:207
+#: globals.cc:209
msgid "Could not set system open files limit to %1"
msgstr "Konnte die Systemgrenze für offene Dateien nicht auf %1 setzen"
-#: globals.cc:211
+#: globals.cc:213
msgid "Your system is configured to limit %1 to only %2 open files"
msgstr "Ihre Systemkonfiguration beschränkt %1 auf nur %2 offene Dateien"
-#: globals.cc:215
+#: globals.cc:217
msgid "Could not get system open files limit (%1)"
msgstr "Konnte die Grenze für offene Dateien nicht erhalten (%1)"
-#: globals.cc:266
+#: globals.cc:268
msgid "Loading configuration"
msgstr "Lade Konfiguration"
@@ -939,47 +895,47 @@ msgstr "IO: schlecht geformte Zeichenkette in XML-Knoten für Ausgänge \"%1\""
msgid "IO: bad output string in XML node \"%1\""
msgstr "IO: schlechte Zeichenkette für Ausgang in XML-Knoten \"%1\""
-#: io.cc:1410
+#: io.cc:1411
#, c-format
msgid "%s %u"
msgstr "%s %u"
-#: io.cc:1457
+#: io.cc:1458
#, c-format
msgid "%s in"
msgstr "%s in"
-#: io.cc:1459
+#: io.cc:1460
#, c-format
msgid "%s out"
msgstr "%s out"
-#: io.cc:1534 session.cc:494 session.cc:523
+#: io.cc:1535 session.cc:676 session.cc:705
msgid "mono"
msgstr "Mono"
-#: io.cc:1536 session.cc:507 session.cc:537
+#: io.cc:1537 session.cc:689 session.cc:719
msgid "L"
msgstr "L"
-#: io.cc:1536 session.cc:509 session.cc:539
+#: io.cc:1537 session.cc:691 session.cc:721
msgid "R"
msgstr "R"
-#: io.cc:1538 io.cc:1544
+#: io.cc:1539 io.cc:1545
#, c-format
msgid "%d"
msgstr "%d"
-#: ladspa_plugin.cc:88
+#: ladspa_plugin.cc:86
msgid "LADSPA: module has no descriptor function."
msgstr "LADSPA: Modul hat keine Beschreibungsfunktion"
-#: ladspa_plugin.cc:93
+#: ladspa_plugin.cc:91
msgid "LADSPA: plugin has gone away since discovery!"
msgstr "LADSPA: Plugin ist nicht mehr auffindbar!"
-#: ladspa_plugin.cc:100
+#: ladspa_plugin.cc:98
msgid "LADSPA: \"%1\" cannot be used, since it cannot do inplace processing"
msgstr ""
"LADSPA: \"%1\" kann nicht verwendet werdeen, da es kein \"inplace processing"
@@ -1063,7 +1019,7 @@ msgstr ""
msgid "incorrect XML mode passed to Locations::set_state"
msgstr "unkorrekter XML-Modus an Locations::set_state weitergereicht"
-#: location.cc:842 session.cc:4362 session_state.cc:1114
+#: location.cc:842 session.cc:4503 session_state.cc:1031
msgid "session"
msgstr "Projekt"
@@ -1210,6 +1166,38 @@ msgstr "Fehlende Eigenschaft \"state\" bei AutomationState"
msgid "MIDI stretch created non-MIDI source"
msgstr "MIDI Streckung erzeugte Nicht-MIDI Quelle"
+#: midiport_manager.cc:71
+msgid "MIDI control in"
+msgstr "MIDI control in"
+
+#: midiport_manager.cc:72
+msgid "MIDI control out"
+msgstr "MIDI control out"
+
+#: midiport_manager.cc:74
+msgid "MMC in"
+msgstr "MMC in"
+
+#: midiport_manager.cc:75
+msgid "MMC out"
+msgstr "MMC out"
+
+#: midiport_manager.cc:96
+msgid "MTC in"
+msgstr "MTC in"
+
+#: midiport_manager.cc:98
+msgid "MTC out"
+msgstr "MTC out"
+
+#: midiport_manager.cc:101
+msgid "MIDI Clock in"
+msgstr "MIDI Clock in"
+
+#: midiport_manager.cc:103
+msgid "MIDI Clock out"
+msgstr "MIDI Clock out"
+
#: monitor_processor.cc:53
msgid "monitor dim"
msgstr "Monitor dämpfen"
@@ -1246,11 +1234,11 @@ msgstr "Polaritätsschalter"
msgid "solo control"
msgstr "Solo-Schalter"
-#: mtc_slave.cc:235
+#: mtc_slave.cc:238
msgid "MTC Slave: atomic read of current time failed, sleeping!"
msgstr "MTC Slave: Fehler beim atomisches Lesen der momentanen Zeit, schlafe!"
-#: mtc_slave.cc:359
+#: mtc_slave.cc:361
msgid ""
"Unknown rate/drop value %1 in incoming MTC stream, session values used "
"instead"
@@ -1258,11 +1246,11 @@ msgstr ""
"Unbekannter Wert %1 für Rate/Abfall in eingehendem MTC-Datenstrom, verwende "
"Projektwerte"
-#: mtc_slave.cc:379
+#: mtc_slave.cc:381
msgid "Session framerate adjusted from %1 TO: MTC's %2."
msgstr "Projekt-Framerate von %1 auf die von MTC: %2 geändert"
-#: mtc_slave.cc:393
+#: mtc_slave.cc:395
msgid "Session and MTC framerate mismatch: MTC:%1 %2:%3."
msgstr "Framerate von Projekt und MTC stimmen nicht überein: MTC: %1 %2: %3"
@@ -1326,19 +1314,19 @@ msgstr "Pannerziel bekam XML-Daten für %1 übergeben - ignoriert"
msgid "looking for panners in %1"
msgstr "Suche nach Pannern in %1"
-#: panner_manager.cc:99
+#: panner_manager.cc:100
msgid "Panner discovered: \"%1\" in %2"
msgstr "Panner gefunden: \"%1\" in %2"
-#: panner_manager.cc:116
+#: panner_manager.cc:117
msgid "PannerManager: cannot load module \"%1\" (%2)"
msgstr "PannerManager: kann Modul \"%1\" nicht laden (%2)"
-#: panner_manager.cc:123
+#: panner_manager.cc:124
msgid "PannerManager: module \"%1\" has no descriptor function."
msgstr "PannerManager: Modul \"%1\" hat keine Beschreibungsfunktion"
-#: panner_manager.cc:186
+#: panner_manager.cc:187
msgid "no panner discovered for in/out = %1/%2"
msgstr "keinen Panner für %1/%2 Ein/Ausgänge gefunden"
@@ -1461,11 +1449,7 @@ msgstr "unbekannter Plugin-Statustyp \"%1\" - alle Einträge ignoriert"
msgid "unknown plugin type \"%1\" - ignored"
msgstr "unbekannter Plugintyp \"%1\" - ignoriert"
-#: port.cc:367
-msgid "get_connected_latency_range() called while disconnected from JACK"
-msgstr "Aufruf von get_connected_latency_range(), während von JACK getrennt"
-
-#: port.cc:450
+#: port.cc:410
msgid "could not reregister %1"
msgstr "konnte %1 nicht erneut registrieren"
@@ -1482,6 +1466,38 @@ msgstr ""
msgid "non-port insert XML used for port plugin insert"
msgstr "Nicht-Port-Insert XML zum Einfügen eines Port-Plugin benutzt"
+#: port_manager.cc:270
+msgid ""
+"a port with the name \"%1\" already exists: check for duplicated track/bus "
+"names"
+msgstr ""
+"Ein Port mit Namen \"%1\" existiert bereits: Prüfen Sie auf doppelte Spur/"
+"Busnamen"
+
+#: port_manager.cc:272
+msgid ""
+"No more ports are available. You will need to stop %1 and restart with more "
+"ports if you need this many tracks."
+msgstr ""
+"Keine Ports mehr verfügbar. Wenn Sie so viele Spuren brauchen, müssen Sie %1 "
+"stoppen und mit mehr Ports neu starten."
+
+#: port_manager.cc:275
+msgid "AudioEngine: cannot register port \"%1\": %2"
+msgstr "AudioEngine: kann Port \"%1\": %2 nicht registrieren"
+
+#: port_manager.cc:314
+msgid "unable to create port: %1"
+msgstr "kann Port: %1 nicht erzeugen"
+
+#: port_manager.cc:401
+msgid "AudioEngine: cannot connect %1 (%2) to %3 (%4)"
+msgstr "AudioEngine: kann %1 (%2) nicht mit %3 (%4) verbinden"
+
+#: port_manager.cc:453 port_manager.cc:454
+msgid "Re-establising port %1 failed"
+msgstr "Portwiederherstellung fehlgeschlagen"
+
#: processor.cc:207
msgid "No %1 property flag in element %2"
msgstr "Kein Flag für Eigenschaft \"%1\" in Element %2"
@@ -1490,19 +1506,19 @@ msgstr "Kein Flag für Eigenschaft \"%1\" in Element %2"
msgid "No child node with active property"
msgstr "Kein Kindknoten mit der Eigenschaft \"aktiv\""
-#: rc_configuration.cc:93
+#: rc_configuration.cc:88
msgid "Loading system configuration file %1"
msgstr "Lade Systemkonfigurationsdatei %1"
-#: rc_configuration.cc:97
+#: rc_configuration.cc:92
msgid "%1: cannot read system configuration file \"%2\""
msgstr "%1: kann Systemkonfigurationsdatei \"%2\" nicht lesen"
-#: rc_configuration.cc:102
+#: rc_configuration.cc:97
msgid "%1: system configuration file \"%2\" not loaded successfully."
msgstr "%1: Systemkonfigurationsdatei \"%2\" konnte nicht geladen werden."
-#: rc_configuration.cc:106
+#: rc_configuration.cc:101
msgid ""
"Your system %1 configuration file is empty. This probably means that there "
"was an error installing %1"
@@ -1510,23 +1526,23 @@ msgstr ""
"Ihre %1-Systemkonfigurationsdatei ist leer. Das deutet möglicherweise darauf "
"hin, daß bei der Installation von %1 Fehler auftraten."
-#: rc_configuration.cc:121
+#: rc_configuration.cc:116
msgid "Loading user configuration file %1"
msgstr "Lade Benutzerkonfiguration %1"
-#: rc_configuration.cc:125
+#: rc_configuration.cc:120
msgid "%1: cannot read configuration file \"%2\""
msgstr "%1: kann Konfigurationsdatei \"%2\" nicht lesen"
-#: rc_configuration.cc:130
+#: rc_configuration.cc:125
msgid "%1: user configuration file \"%2\" not loaded successfully."
msgstr "%1: Benutzerkonfiguration \"%2\" konnte nicht geladen werden."
-#: rc_configuration.cc:134
+#: rc_configuration.cc:129
msgid "your %1 configuration file is empty. This is not normal."
msgstr "Ihre %1-Konfigurationsdatei ist leer. Das ist nicht normal."
-#: rc_configuration.cc:151
+#: rc_configuration.cc:146
msgid "Config file %1 not saved"
msgstr "Konfigurationsdatei %1 nicht gesichert"
@@ -1614,106 +1630,98 @@ msgstr "Send %1"
msgid "programming error: send created using role %1"
msgstr "Programmierfehler: Send erzeugt mittels Rolle %1"
-#: session.cc:347
-msgid "Set block size and sample rate"
-msgstr "Setze Blockgröße und Samplerate"
+#: session.cc:343
+msgid "Connect to engine"
+msgstr "Verbinde zur Engine"
-#: session.cc:352
-msgid "Using configuration"
-msgstr "Benutze Konfiguration"
+#: session.cc:348
+msgid "Session loading complete"
+msgstr "Laden des Projektes abgeschlossen"
+
+#: session.cc:420
+msgid "Set up LTC"
+msgstr "LTC einrichten"
-#: session.cc:377
+#: session.cc:422
+msgid "Set up Click"
+msgstr "Klick einrichten"
+
+#: session.cc:424
+msgid "Set up standard connections"
+msgstr "Richte Standard-Verbindungen ein"
+
+#: session.cc:561
msgid "LTC In"
msgstr "LTC In"
-#: session.cc:378
+#: session.cc:562
msgid "LTC Out"
msgstr "LTC Out"
-#: session.cc:404
+#: session.cc:588
msgid "LTC-in"
msgstr "LTC-in"
-#: session.cc:405
+#: session.cc:589
msgid "LTC-out"
msgstr "LTC-out"
-#: session.cc:434
+#: session.cc:625
msgid "could not setup Click I/O"
msgstr "konnte Metronom-E/A nicht einrichten"
-#: session.cc:461
-msgid "cannot setup Click I/O"
-msgstr "kann Metronom-E/A nicht einrichten"
-
-#: session.cc:464
-msgid "Compute I/O Latencies"
-msgstr "Berechne E/A-Latenzen"
-
-#: session.cc:470
-msgid "Set up standard connections"
-msgstr "Richte Standard-Verbindungen ein"
-
-#: session.cc:491
+#: session.cc:673
#, c-format
msgid "out %<PRIu32>"
msgstr "out %<PRIu32>"
-#: session.cc:505
+#: session.cc:687
#, c-format
msgid "out %<PRIu32>+%<PRIu32>"
msgstr "out %<PRIu32>+%<PRIu32>"
-#: session.cc:520
+#: session.cc:702
#, c-format
msgid "in %<PRIu32>"
msgstr "in %<PRIu32>"
-#: session.cc:534
+#: session.cc:716
#, c-format
msgid "in %<PRIu32>+%<PRIu32>"
msgstr "in %<PRIu32>+%<PRIu32>"
-#: session.cc:570
-msgid "Setup signal flow and plugins"
-msgstr "Richte Signalfluss and Plugins ein"
-
-#: session.cc:614
-msgid "Connect to engine"
-msgstr "Verbinde zur Engine"
-
-#: session.cc:645
+#: session.cc:780
msgid "cannot connect master output %1 to %2"
msgstr "kann Master-Ausgang %1 nicht mit %2 verbinden"
-#: session.cc:704
+#: session.cc:839
msgid "monitor"
msgstr "Monitor"
-#: session.cc:749
+#: session.cc:884
msgid "cannot connect control input %1 to %2"
msgstr "kann Kontrolleingang %1 nicht mit %2 verbinden"
-#: session.cc:769
+#: session.cc:904
msgid "The preferred I/O for the monitor bus (%1) cannot be found"
msgstr "Bevorzugte E/A für den Monitorbus (%1) kann nicht gefunden werden"
-#: session.cc:800
+#: session.cc:935
msgid "cannot connect control output %1 to %2"
msgstr "kann Kontrollausgang %1 nicht mit %2 verbinden"
-#: session.cc:864
+#: session.cc:999
msgid "cannot create Auditioner: no auditioning of regions possible"
msgstr ""
"Kann das Vorhör-System nicht einrichten: kein Vorhören von Regionen möglich"
-#: session.cc:1043
+#: session.cc:1183
msgid "Session: you can't use that location for auto punch (start <= end)"
msgstr ""
"Session: Sie können diese Position nicht für Auto-Punch verwenden (Start <= "
"Ende) "
-#: session.cc:1083
+#: session.cc:1223
msgid ""
"You cannot use this location for auto-loop because it has zero or negative "
"length"
@@ -1721,84 +1729,92 @@ msgstr ""
"Sie können diese Position nicht für \"automatische Schleife\" verwenden, da "
"sie keine oder eine negative Länge hat"
-#: session.cc:1396
+#: session.cc:1537
msgid "feedback loop setup between %1 and %2"
msgstr "Feedbackschleife zwischen %1 und %2 erkannt"
-#: session.cc:1692
+#: session.cc:1833
msgid "Session: could not create new midi track."
msgstr "Session: konnte keine neue MIDI-Spur erzeugen."
-#: session.cc:1875 session.cc:1878
+#: session.cc:1839
+msgid ""
+"No more JACK ports are available. You will need to stop %1 and restart JACK "
+"with more ports if you need this many tracks."
+msgstr ""
+"Keine JACK-Ports mehr verfügbar. Wenn Sie so viele Spuren benötigen, müssen "
+"Sie %1 stoppen und JACK mit mehr Ports neu starten."
+
+#: session.cc:2016 session.cc:2019
msgid "Audio"
msgstr "Audio"
-#: session.cc:1902 session.cc:1910 session.cc:1987 session.cc:1995
+#: session.cc:2043 session.cc:2051 session.cc:2128 session.cc:2136
msgid "cannot configure %1 in/%2 out configuration for new audio track"
msgstr "kann %1 ein/%2 aus für neue Audiospur nicht konfigurieren"
-#: session.cc:1933
+#: session.cc:2074
msgid "Session: could not create new audio track."
msgstr "Session: konnte keine neue Audios.pur erzeugen"
-#: session.cc:1965 session.cc:1968
+#: session.cc:2106 session.cc:2109
msgid "Bus"
msgstr "Bus"
-#: session.cc:2018
+#: session.cc:2159
msgid "Session: could not create new audio route."
msgstr "Session: konnte keine neueAudio-Route erzeugen"
-#: session.cc:2077 session.cc:2087
+#: session.cc:2218 session.cc:2228
msgid "Session: UINT_MAX routes? impossible!"
msgstr "Session: UINT_MAX Routen? unmöglich!"
-#: session.cc:2109
+#: session.cc:2250
msgid "Session: cannot create track/bus from template description"
msgstr "Session: Kann die Route aus der Vorlagenbeschreibung nicht erzeugen"
-#: session.cc:2135
+#: session.cc:2276
msgid "Session: could not create new route from template"
msgstr "Session: konnte keine neue Route aus der Vorlage erzeugen."
-#: session.cc:2164
+#: session.cc:2305
msgid "Adding new tracks/busses failed"
msgstr "Fehler beim Hinzufügen neuer Spuren/Busse"
-#: session.cc:3265
+#: session.cc:3406
msgid "FATAL ERROR! Could not find a suitable version of %1 for a rename"
msgstr ""
"FATALER FEHLER! Konnte keine passende Version von %1 zum Umbenennen finden"
-#: session.cc:3385 session.cc:3443
+#: session.cc:3526 session.cc:3584
msgid "There are already %1 recordings for %2, which I consider too many."
msgstr "Es gibt bereits %1 Aufnahmen für %2, was ich als zu viele erachte."
-#: session.cc:3833
+#: session.cc:3974
msgid "send ID %1 appears to be in use already"
msgstr "Send ID %1 ist offenbar schon in Gebrauch"
-#: session.cc:3845
+#: session.cc:3986
msgid "aux send ID %1 appears to be in use already"
msgstr "Aux-Send ID %1 ist offenbar schon in Gebrauch"
-#: session.cc:3857
+#: session.cc:3998
msgid "return ID %1 appears to be in use already"
msgstr "Return ID %1 ist offenbar schon in Gebrauch"
-#: session.cc:3869
+#: session.cc:4010
msgid "insert ID %1 appears to be in use already"
msgstr "Insert ID %1 ist offenbar schon in Gebrauch"
-#: session.cc:3996
+#: session.cc:4137
msgid "Cannot write a range where end <= start (e.g. %1 <= %2)"
msgstr "Kann einen Bereich mit Ende <= Start nicht schreiben (z.B. %1 <= %2)"
-#: session.cc:4025
+#: session.cc:4166
msgid "too many bounced versions of playlist \"%1\""
msgstr "zu viele gebouncete Versionen der Wiedergabeliste \"%1\""
-#: session.cc:4035
+#: session.cc:4176
msgid "cannot create new audio file \"%1\" for %2"
msgstr "kann keine neue Audiodatei \"%1\" für %2 erzeugen"
@@ -1845,11 +1861,11 @@ msgstr ""
"Session: zwei Ereignisse des Typs %1 können nicht im selben Frame existieren "
"(%2)."
-#: session_export.cc:126
+#: session_export.cc:125
msgid "%1: cannot seek to %2 for export"
msgstr "%1: kann für Export nicht Dateiposition %2 aufsuchen"
-#: session_export.cc:183
+#: session_export.cc:182
msgid "Export ended unexpectedly: %1"
msgstr "Export endet unerwartet: %1"
@@ -1861,10 +1877,6 @@ msgstr ""
"LTC-Kodierer: ungültige Framerate - das Kodieren von LTC wird für den "
"restlichen Teil dieses Projekts ausgesetzt."
-#: session_midi.cc:428
-msgid "Session: could not send full MIDI time code"
-msgstr "Session: konnte vollständigen MIDI-Timecode nicht senden"
-
#: session_midi.cc:520
msgid "Session: cannot send quarter-frame MTC message (%1)"
msgstr "Session: kann quarter-frame MTC-Nachricht nicht senden (%1)"
@@ -1873,97 +1885,101 @@ msgstr "Session: kann quarter-frame MTC-Nachricht nicht senden (%1)"
msgid "Session: cannot create Playlist from XML description."
msgstr "Session: kann Wiedergabeliste nicht aus der XML-Beschreibung erzeugen"
-#: session_process.cc:133
+#: session_process.cc:132
msgid "Session: error in no roll for %1"
msgstr "Session: Fehler in no_roll für %1"
-#: session_process.cc:1158
+#: session_process.cc:1157
msgid "Programming error: illegal event type in process_event (%1)"
msgstr "Programmierfehler: illegaler Ereignistyp in process_event (%1)"
-#: session_state.cc:139
+#: session_state.cc:140
msgid "Could not use path %1 (%2)"
msgstr "Konnte Pfad %1 nicht benutzen (%2)"
-#: session_state.cc:267
+#: session_state.cc:184
msgid "solo cut control (dB)"
msgstr "Solo Cut Einstellung (dB)"
-#: session_state.cc:360
+#: session_state.cc:208
+msgid "Set block size and sample rate"
+msgstr "Setze Blockgröße und Samplerate"
+
+#: session_state.cc:213
+msgid "Using configuration"
+msgstr "Benutze Konfiguration"
+
+#: session_state.cc:325
msgid "Reset Remote Controls"
msgstr "Fernbedienungen zurücksetzen"
-#: session_state.cc:385
-msgid "Session loading complete"
-msgstr "Laden des Projektes abgeschlossen"
-
-#: session_state.cc:452
+#: session_state.cc:417
msgid "Session: cannot create session peakfile folder \"%1\" (%2)"
msgstr "Session: kann den Peakfile Ordner \"%1\" nicht erzeugen (%2)"
-#: session_state.cc:459
+#: session_state.cc:424
msgid "Session: cannot create session sounds dir \"%1\" (%2)"
msgstr ""
"Session: kann das Projektverzeichnis für Sounddateien \"%1\" nicht erzeugen "
"(%2)"
-#: session_state.cc:466
+#: session_state.cc:431
msgid "Session: cannot create session midi dir \"%1\" (%2)"
msgstr ""
"Session: kann das Projektverzeichnis für MIDI \"%1\" nicht erzeugen (%2)"
-#: session_state.cc:473
+#: session_state.cc:438
msgid "Session: cannot create session dead sounds folder \"%1\" (%2)"
msgstr "Session: kann den Mülleimer des Projektes \"%1\" nicht erzeugen (%2)"
-#: session_state.cc:480
+#: session_state.cc:445
msgid "Session: cannot create session export folder \"%1\" (%2)"
msgstr ""
"Session: kann den Projektordner für Exportdateien \"%1\" nicht erzeugen (%2)"
-#: session_state.cc:487
+#: session_state.cc:452
msgid "Session: cannot create session analysis folder \"%1\" (%2)"
msgstr ""
"Session: kann den Projektordner für Analysedaten \"%1\" nicht erzeugen (%2)"
-#: session_state.cc:494
+#: session_state.cc:459
msgid "Session: cannot create session plugins folder \"%1\" (%2)"
msgstr "Session: kann den Projektordner für Plugins \"%1\" nicht erzeugen (%2)"
-#: session_state.cc:501
+#: session_state.cc:466
msgid "Session: cannot create session externals folder \"%1\" (%2)"
msgstr ""
"Session: kann den Projektordner für Externals \"%1\" nicht erzeugen (%2)"
-#: session_state.cc:515
+#: session_state.cc:480
msgid "Session: cannot create session folder \"%1\" (%2)"
msgstr "Session: kann den Projektordner \"%1\" nicht erzeugen (%2)"
-#: session_state.cc:548
+#: session_state.cc:514
msgid "Could not open %1 for writing session template"
msgstr "Konnte %1 nicht zum Schreiben der Projektvorlage öffnen"
-#: session_state.cc:554
+#: session_state.cc:520
msgid "Could not open session template %1 for reading"
msgstr "Konnte Projektvorlage %1 nicht zum Lesen öffnen"
-#: session_state.cc:573
+#: session_state.cc:539
msgid "master"
msgstr "Master"
-#: session_state.cc:636
+#: session_state.cc:600
msgid "Could not remove pending capture state at path \"%1\" (%2)"
msgstr "Konnte vorläufigen Aufnahmestatus im Pfad \"%1\" nicht entfernen (%2)"
-#: session_state.cc:660
+#: session_state.cc:624
msgid "could not rename snapshot %1 to %2 (%3)"
msgstr "Konnte Schnappschuss %1 nicht auf %2 umbenennen (%3)"
-#: session_state.cc:688
+#: session_state.cc:652
msgid "Could not remove session file at path \"%1\" (%2)"
msgstr "Konnte Projektdatei im Pfad \"%1\" nicht entfernen (%2)"
-#: session_state.cc:761
+#: session_state.cc:669
msgid ""
"the %1 audio engine is not connected and state saving would lose all I/O "
"connections. Session not saved"
@@ -1971,140 +1987,140 @@ msgstr ""
"die %1 Audio-Engine ist nicht verbunden, beim Sichern würden Sie daher alle "
"E/A-Verbindungen verlieren. Projekt nicht gesichert"
-#: session_state.cc:812
+#: session_state.cc:720
msgid "state could not be saved to %1"
msgstr "Status konnte nicht nach %1 gesichert werden"
-#: session_state.cc:814 session_state.cc:825
+#: session_state.cc:722 session_state.cc:733
msgid "Could not remove temporary session file at path \"%1\" (%2)"
msgstr "Konnte temporäre Projektdatei im Pfad \"%1\" nicht entfernen (%2)"
-#: session_state.cc:822
+#: session_state.cc:730
msgid "could not rename temporary session file %1 to %2"
msgstr "Konnte temporäre Projektdatei %1 nicht nach %2 umbenennen"
-#: session_state.cc:890
+#: session_state.cc:798
msgid "%1: session file \"%2\" doesn't exist!"
msgstr "%1: Projektdatei \"%2\" existiert nicht!"
-#: session_state.cc:902
+#: session_state.cc:810
msgid "Could not understand session file %1"
msgstr "Konnte Projektdatei \"%1\" nicht verstehen"
-#: session_state.cc:911
+#: session_state.cc:819
msgid "Session file %1 is not a session"
msgstr "Projektdatei %1 ist kein Projekt"
-#: session_state.cc:1208
+#: session_state.cc:1125
msgid "programming error: Session: incorrect XML node sent to set_state()"
msgstr ""
"Programmierfehler: Session: Inkorrekter XML-Knoten an send_state() gesendet"
-#: session_state.cc:1257
+#: session_state.cc:1179
msgid "Session: XML state has no options section"
msgstr "Session: XML hat keinen Abschnitt \"options\""
-#: session_state.cc:1262
+#: session_state.cc:1184
msgid "Session: XML state has no metadata section"
msgstr "Session: XML hat keinen Abschnitt \"metadata\""
-#: session_state.cc:1273
+#: session_state.cc:1195
msgid "Session: XML state has no sources section"
msgstr "Session: XML hat keinen Abschnitt \"sources\""
-#: session_state.cc:1280
+#: session_state.cc:1202
msgid "Session: XML state has no Tempo Map section"
msgstr "Session: XML hat keinen Abschnitt \"Tempo Map\""
-#: session_state.cc:1287
+#: session_state.cc:1209
msgid "Session: XML state has no locations section"
msgstr "Session: XML hat keinen Abschnitt \"locations\""
-#: session_state.cc:1313
+#: session_state.cc:1235
msgid "Session: XML state has no Regions section"
msgstr "Session: XML hat keinen Abschnitt \"Regions\""
-#: session_state.cc:1320
+#: session_state.cc:1242
msgid "Session: XML state has no playlists section"
msgstr "Session: XML hat keinen Abschnitt \"playlists\""
-#: session_state.cc:1340
+#: session_state.cc:1262
msgid "Session: XML state has no bundles section"
msgstr "Session: XML hat keinen Abschnitt \"bundles\""
-#: session_state.cc:1352
+#: session_state.cc:1274
msgid "Session: XML state has no diskstreams section"
msgstr "Session: XML hat keinen Abschnitt \"diskstreams\""
-#: session_state.cc:1360
+#: session_state.cc:1282
msgid "Session: XML state has no routes section"
msgstr "Session: XML hat keinen Abschnitt \"routes\""
-#: session_state.cc:1372
+#: session_state.cc:1294
msgid "Session: XML state has no route groups section"
msgstr "Session: XML hat keinen Abschnitt \"route groups\""
-#: session_state.cc:1381
+#: session_state.cc:1303
msgid "Session: XML state has no edit groups section"
msgstr "Session: XML hat keinen Abschnitt \"edit groups\""
-#: session_state.cc:1388
+#: session_state.cc:1310
msgid "Session: XML state has no mix groups section"
msgstr "Session: XML hat keinen Abschnitt \"mix groups\""
-#: session_state.cc:1396
+#: session_state.cc:1318
msgid "Session: XML state has no click section"
msgstr "Session: XML hat keinen Abschnitt \"click\""
-#: session_state.cc:1444
+#: session_state.cc:1366
msgid "Session: cannot create Route from XML description."
msgstr "Session: Kann die Route aus der XML-Beschreibung nicht erzeugen"
-#: session_state.cc:1448
+#: session_state.cc:1370
msgid "Loaded track/bus %1"
msgstr "Spur/Bus %1 wurde geladen"
-#: session_state.cc:1546
+#: session_state.cc:1468
msgid "Could not find diskstream for route"
msgstr "Konnte Diskstream für Route nicht finden"
-#: session_state.cc:1600
+#: session_state.cc:1522
msgid "Session: cannot create Region from XML description."
msgstr "Session: kann Region nicht aus XML-Beschreibung erzeugen"
-#: session_state.cc:1604
+#: session_state.cc:1526
msgid "Can not load state for region '%1'"
msgstr "Kann Status für Region '%1' nicht laden"
-#: session_state.cc:1640
+#: session_state.cc:1562
msgid "Regions in compound description not found (ID's %1 and %2): ignored"
msgstr ""
"Regionen der Verbindungsbeschreibung nicht gefunden (IDs %1 and %2): "
"ignoriert"
-#: session_state.cc:1668
+#: session_state.cc:1590
msgid "Nested source has no ID info in session file! (ignored)"
msgstr ""
"Verschachtelte Quelle hat keine ID-Information in Projektdatei! (ignoriert)"
-#: session_state.cc:1680
+#: session_state.cc:1602
msgid "Cannot reconstruct nested source for region %1"
msgstr "Kann verschachtelte Quelle für Region %1 nicht wiederherstellen"
-#: session_state.cc:1742
+#: session_state.cc:1664
msgid "Session: XMLNode describing a AudioRegion is incomplete (no source)"
msgstr ""
"Session: XML-Knoten zur Beschreibung einer Audioregion ist unvollständig "
"(Quelle fehlt)"
-#: session_state.cc:1750 session_state.cc:1771 session_state.cc:1791
+#: session_state.cc:1672 session_state.cc:1693 session_state.cc:1713
msgid ""
"Session: XMLNode describing a AudioRegion references an unknown source id =%1"
msgstr ""
"Session: XML-Knoten zur Beschreibung einer Audioregion referenziert eine "
"unbekannte Quell-ID =%1"
-#: session_state.cc:1756 session_state.cc:1777 session_state.cc:1797
+#: session_state.cc:1678 session_state.cc:1699 session_state.cc:1719
msgid ""
"Session: XMLNode describing a AudioRegion references a non-audio source id ="
"%1"
@@ -2112,7 +2128,7 @@ msgstr ""
"Session: XML-Knoten zur Beschreibung einer Audioregion referenziert eine "
"Nicht-Audio Quell-ID =%1"
-#: session_state.cc:1820
+#: session_state.cc:1742
msgid ""
"Session: XMLNode describing an AudioRegion is missing some master sources; "
"ignored"
@@ -2120,27 +2136,27 @@ msgstr ""
"Session: dem XML-Knoten zur Beschreibung einer Audioregion fehlen einige "
"Hauptquellen; ignoriert"
-#: session_state.cc:1854
+#: session_state.cc:1776
msgid "Session: XMLNode describing a MidiRegion is incomplete (no source)"
msgstr ""
"Session: XML-Knoten zur Beschreibung einer MIDI-Region ist unvollständig "
"(Quelle fehlt)"
-#: session_state.cc:1862
+#: session_state.cc:1784
msgid ""
"Session: XMLNode describing a MidiRegion references an unknown source id =%1"
msgstr ""
"Session: XML-Knoten zur Beschreibung einer MIDI-Region referenziert eine "
"unbekannte Quell-ID =%1"
-#: session_state.cc:1868
+#: session_state.cc:1790
msgid ""
"Session: XMLNode describing a MidiRegion references a non-midi source id =%1"
msgstr ""
"Session: XML-Knoten zur Beschreibung einer MIDI-Region referenziert eine "
"Nicht-MIDI Quell-ID =%1"
-#: session_state.cc:1936
+#: session_state.cc:1858
msgid ""
"cannot create new file from region name \"%1\" with ident = \"%2\": too many "
"existing files with similar names"
@@ -2148,121 +2164,121 @@ msgstr ""
"kann keine neue Datei aus dem Regionennamen \"%1\" mit ident = \"%2\" "
"erzeugen: zu viele Dateien mit ähnlichen Namen existieren"
-#: session_state.cc:1959
+#: session_state.cc:1881
msgid "Session: cannot create Source from XML description."
msgstr "Session: Kann Quelle aus der XML-Beschreibung nicht erzeugen"
-#: session_state.cc:1993
+#: session_state.cc:1915
msgid "A sound file is missing. It will be replaced by silence."
msgstr "Eine Audiodatei fehlt. Sie wird durch Stille ersetzt werden."
-#: session_state.cc:2016
+#: session_state.cc:1938
msgid "Found a sound file that cannot be used by %1. Talk to the progammers."
msgstr ""
"Eine nicht mit %1 benutzbare Audiodatei wurde gefunden. Sprechen Sie mit den "
"Programmierern."
-#: session_state.cc:2033
+#: session_state.cc:1955
msgid "Could not create templates directory \"%1\" (%2)"
msgstr "Konnte Vorlagenverzeichnis \"%1\" nicht erzeugen (%2)"
-#: session_state.cc:2046
+#: session_state.cc:1968
msgid "Template \"%1\" already exists - new version not created"
msgstr "Vorlage \"%1\" existiert bereits - neue Version wurde nicht erzeugt"
-#: session_state.cc:2052
+#: session_state.cc:1974
msgid "Could not create directory for Session template\"%1\" (%2)"
msgstr "Konnte kein Verzeichnis für Projektvorlage \"%1\" erzeugen (%2)"
-#: session_state.cc:2062
+#: session_state.cc:1984
msgid "template not saved"
msgstr "Vorlage nicht gesichert"
-#: session_state.cc:2072
+#: session_state.cc:1994
msgid "Could not create directory for Session template plugin state\"%1\" (%2)"
msgstr ""
"Konnte Verzeichnis für Projektvorlagen-Pluginstatus \"%1\" nicht erzeugen "
"(%2)"
-#: session_state.cc:2267
+#: session_state.cc:2189
msgid "Unknown node \"%1\" found in Bundles list from session file"
msgstr "Unbekannter Knoten \"%1\" in Bündelliste der Projektdatei gefunden"
-#: session_state.cc:2809 session_state.cc:2815
+#: session_state.cc:2731 session_state.cc:2737
msgid "Cannot expand path %1 (%2)"
msgstr "Kann Pfad %1 nicht expandieren (%2)"
-#: session_state.cc:2868
+#: session_state.cc:2790
msgid "Session: cannot create dead file folder \"%1\" (%2)"
msgstr "Session: kann den Mülleimer \"%1\" nicht erzeugen (%2)"
-#: session_state.cc:2907
+#: session_state.cc:2829
msgid "cannot rename unused file source from %1 to %2 (%3)"
msgstr "kann unbenutzte Dateiquelle nicht von %1 nach %2 umbenennen (%3)"
-#: session_state.cc:2925
+#: session_state.cc:2847
msgid "cannot remove peakfile %1 for %2 (%3)"
msgstr "kann Peakdatei %1 für %2 nicht entfernen (%3)"
-#: session_state.cc:3227
+#: session_state.cc:3149
msgid "could not backup old history file, current history not saved"
msgstr ""
"konnte kein Backup der alten Aktionsliste erstellen, momentane Aktionsliste "
"ungesichert"
-#: session_state.cc:3240
+#: session_state.cc:3162
msgid "history could not be saved to %1"
msgstr "Aktionsliste konnte nicht nach %1 gesichert werden"
-#: session_state.cc:3243
+#: session_state.cc:3165
msgid "Could not remove history file at path \"%1\" (%2)"
msgstr "Konnte Aktionslistendatei im Pfad \"%1\" nicht entfernen (%2)"
-#: session_state.cc:3247
+#: session_state.cc:3169
msgid "could not restore history file from backup %1 (%2)"
msgstr "konnte Aktionslistendatei nicht aus dem Backup %1 restaurieren (%2)"
-#: session_state.cc:3272
+#: session_state.cc:3194
msgid "%1: no history file \"%2\" for this session."
msgstr "%1: keine Aktionslistendatei \"%2\" für dieses Projekt."
-#: session_state.cc:3278
+#: session_state.cc:3200
msgid "Could not understand session history file \"%1\""
msgstr "Konnte Projekt-Aktionslistendatei \"%1\" nicht verstehen"
-#: session_state.cc:3320
+#: session_state.cc:3242
msgid "Failed to downcast MidiSource for NoteDiffCommand"
msgstr "MidiSource für NoteDiffCommand nicht auffindbar"
-#: session_state.cc:3331
+#: session_state.cc:3253
msgid "Failed to downcast MidiSource for SysExDiffCommand"
msgstr "MidiSource für SysExDiffCommand nicht auffindbar"
-#: session_state.cc:3342
+#: session_state.cc:3264
msgid "Failed to downcast MidiSource for PatchChangeDiffCommand"
msgstr "MidiSource für PatchChangeDiffCommand nicht auffindbar"
-#: session_state.cc:3350
+#: session_state.cc:3272
msgid "Couldn't figure out how to make a Command out of a %1 XMLNode."
msgstr "Konnte im XML-Knoten \"%1\" keinen Befehl erkennen."
-#: session_state.cc:3602
+#: session_state.cc:3524
msgid "Session: unknown diskstream type in XML"
msgstr "Session: Unbekannter Diskstream im XML"
-#: session_state.cc:3607
+#: session_state.cc:3529
msgid "Session: could not load diskstream via XML state"
msgstr "Session: konnte Diskstream nicht via XML-Status laden"
-#: session_time.cc:215
-msgid "Unknown JACK transport state %1 in sync callback"
-msgstr "Unbekannter JACK-Transportstatus im Sync-Callback"
+#: session_time.cc:214
+msgid "Unknown transport state %1 in sync callback"
+msgstr "Unbekannter Transportstatus %1 im Sync-Callback"
-#: session_transport.cc:168
+#: session_transport.cc:167
msgid "Cannot loop - no loop range defined"
msgstr "Kann nicht loopen - kein Schleifenbereich definieert"
-#: session_transport.cc:728
+#: session_transport.cc:739
msgid ""
"Seamless looping cannot be supported while %1 is using JACK transport.\n"
"Recommend changing the configured options"
@@ -2271,7 +2287,7 @@ msgstr ""
"benutzt.\n"
"Ändern Sie die Konfigurationsoption"
-#: session_transport.cc:1094
+#: session_transport.cc:1105
msgid ""
"Global varispeed cannot be supported while %1 is connected to JACK transport "
"control"
@@ -2421,7 +2437,7 @@ msgstr ""
msgid "attempt to write a non-writable audio file source (%1)"
msgstr "Versuch, in eine schreibgeschützte Audio-Dateiquelle zu schreiben (%1)"
-#: sndfilesource.cc:396 utils.cc:507 utils.cc:531 utils.cc:545 utils.cc:564
+#: sndfilesource.cc:396 utils.cc:510 utils.cc:534 utils.cc:548 utils.cc:567
msgid "programming error: %1 %2"
msgstr "Programmierfehler: %1 %2"
@@ -2659,19 +2675,19 @@ msgstr "Sperren"
msgid "programming error: unknown edit mode string \"%1\""
msgstr "Programmierfehler: unbekannte Zeichenkette für Editiermodus \"%1\""
-#: utils.cc:389 utils.cc:418
+#: utils.cc:389 utils.cc:421
msgid "MIDI Timecode"
msgstr "MIDI Timecode"
-#: utils.cc:389 utils.cc:416
+#: utils.cc:389 utils.cc:419
msgid "MTC"
msgstr "MTC"
-#: utils.cc:393 utils.cc:425
+#: utils.cc:393 utils.cc:428
msgid "MIDI Clock"
msgstr "MIDI Clock"
-#: utils.cc:397 utils.cc:412 utils.cc:432
+#: utils.cc:397 utils.cc:415 utils.cc:435
msgid "JACK"
msgstr "JACK"
@@ -2679,22 +2695,62 @@ msgstr "JACK"
msgid "programming error: unknown sync source string \"%1\""
msgstr "Programmierfehler: unbekannte Zeichenkette für Sync-Quelle \"%1\""
-#: utils.cc:423
+#: utils.cc:426
msgid "M-Clock"
msgstr "M-Clock"
-#: utils.cc:429
+#: utils.cc:432
msgid "LTC"
msgstr "LTC"
-#: utils.cc:599
+#: utils.cc:602
msgid "programming error: unknown native header format: %1"
msgstr "Programmierfehler: unbekanntes natives Dateikopfformat: %1"
-#: utils.cc:614
+#: utils.cc:617
msgid "cannot open directory %1 (%2)"
msgstr "kann Verzeichnis %1 nicht öffnen (%2)"
+#~ msgid "Setup signal flow and plugins"
+#~ msgstr "Richte Signalfluss and Plugins ein"
+
+#~ msgid "cannot setup Click I/O"
+#~ msgstr "kann Metronom-E/A nicht einrichten"
+
+#~ msgid "Compute I/O Latencies"
+#~ msgstr "Berechne E/A-Latenzen"
+
+#~ msgid ""
+#~ "This version of JACK is old - you should upgrade to a newer version that "
+#~ "supports jack_port_type_get_buffer_size()"
+#~ msgstr ""
+#~ "Diese JACK-Version ist alt - Sie sollten auf eine Version upgraden, die "
+#~ "jack_port_type_get_buffer_size() unterstützt"
+
+#~ msgid "Connect session to engine"
+#~ msgstr "Verbinde Projekt mit Engine"
+
+#~ msgid "connect called before engine was started"
+#~ msgstr "Aufruf von connect vor dem Start der Engine"
+
+#~ msgid "disconnect called before engine was started"
+#~ msgstr "Aufruf von disconnect vor dem Start der Engine"
+
+#~ msgid "get_port_by_name() called before engine was started"
+#~ msgstr "Aufruf von get_port_by_name() vor dem Start der Engine"
+
+#~ msgid "get_ports called before engine was started"
+#~ msgstr "Aufruf von get_ports vor dem Start der Engine"
+
+#~ msgid "failed to connect to JACK"
+#~ msgstr "Verbindung zu JACK fehlgeschlagen"
+
+#~ msgid "get_connected_latency_range() called while disconnected from JACK"
+#~ msgstr "Aufruf von get_connected_latency_range(), während von JACK getrennt"
+
+#~ msgid "Session: could not send full MIDI time code"
+#~ msgstr "Session: konnte vollständigen MIDI-Timecode nicht senden"
+
#~ msgid "Session"
#~ msgstr "Projekt"
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_jack.cc b/libs/ardour/session_jack.cc
deleted file mode 100644
index af8a93fec3..0000000000
--- a/libs/ardour/session_jack.cc
+++ /dev/null
@@ -1,185 +0,0 @@
-/*
- Copyright (C) 1999-2013 Paul Davis
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
-*/
-
-
-#ifdef WAF_BUILD
-#include "libardour-config.h"
-#endif
-
-#include <time.h>
-
-#include <glibmm/miscutils.h>
-
-#include "jack/jack.h"
-#include "jack/session.h"
-
-#include "ardour/audioengine.h"
-#include "ardour/filename_extensions.h"
-#include "ardour/session.h"
-#include "ardour/session_directory.h"
-#include "ardour/tempo.h"
-
-using namespace ARDOUR;
-using std::string;
-
-#ifdef HAVE_JACK_SESSION
-void
-Session::jack_session_event (jack_session_event_t* event)
-{
- char timebuf[128], *tmp;
- time_t n;
- struct tm local_time;
-
- time (&n);
- localtime_r (&n, &local_time);
- strftime (timebuf, sizeof(timebuf), "JS_%FT%T", &local_time);
-
- while ((tmp = strchr(timebuf, ':'))) { *tmp = '.'; }
-
- if (event->type == JackSessionSaveTemplate)
- {
- if (save_template( timebuf )) {
- event->flags = JackSessionSaveError;
- } else {
- string cmd ("ardour3 -P -U ");
- cmd += event->client_uuid;
- cmd += " -T ";
- cmd += timebuf;
-
- event->command_line = strdup (cmd.c_str());
- }
- }
- else
- {
- if (save_state (timebuf)) {
- event->flags = JackSessionSaveError;
- } else {
- std::string xml_path (_session_dir->root_path());
- std::string legalized_filename = legalize_for_path (timebuf) + statefile_suffix;
- xml_path = Glib::build_filename (xml_path, legalized_filename);
-
- string cmd ("ardour3 -P -U ");
- cmd += event->client_uuid;
- cmd += " \"";
- cmd += xml_path;
- cmd += '\"';
-
- event->command_line = strdup (cmd.c_str());
- }
- }
-
- /* this won't be called if the port engine in use is not JACK, so we do
- not have to worry about the type of PortEngine::private_handle()
- */
-
- jack_client_t* jack_client = (jack_client_t*) AudioEngine::instance()->port_engine().private_handle();
-
- if (jack_client) {
- jack_session_reply (jack_client, event);
- }
-
- if (event->type == JackSessionSaveAndQuit) {
- Quit (); /* EMIT SIGNAL */
- }
-
- jack_session_event_free( event );
-}
-#endif
-
-void
-Session::jack_timebase_callback (jack_transport_state_t /*state*/,
- pframes_t /*nframes*/,
- jack_position_t* pos,
- int /*new_position*/)
-{
- Timecode::BBT_Time bbt;
-
- /* BBT info */
-
- if (_tempo_map) {
-
- TempoMetric metric (_tempo_map->metric_at (_transport_frame));
-
- try {
- _tempo_map->bbt_time_rt (_transport_frame, bbt);
-
- pos->bar = bbt.bars;
- pos->beat = bbt.beats;
- pos->tick = bbt.ticks;
-
- // XXX still need to set bar_start_tick
-
- pos->beats_per_bar = metric.meter().divisions_per_bar();
- pos->beat_type = metric.meter().note_divisor();
- pos->ticks_per_beat = Timecode::BBT_Time::ticks_per_beat;
- pos->beats_per_minute = metric.tempo().beats_per_minute();
-
- pos->valid = jack_position_bits_t (pos->valid | JackPositionBBT);
-
- } catch (...) {
- /* no message */
- }
- }
-
-#ifdef HAVE_JACK_VIDEO_SUPPORT
- //poke audio video ratio so Ardour can track Video Sync
- pos->audio_frames_per_video_frame = frame_rate() / timecode_frames_per_second();
- pos->valid = jack_position_bits_t (pos->valid | JackAudioVideoRatio);
-#endif
-
-#if 0
- /* Timecode info */
-
- pos->timecode_offset = config.get_timecode_offset();
- t.timecode_frame_rate = timecode_frames_per_second();
- pos->valid = jack_position_bits_t (pos->valid | JackPositionTimecode;
-
- if (_transport_speed) {
-
- if (play_loop) {
-
- Location* location = _locations.auto_loop_location();
-
- if (location) {
-
- t.transport_state = JackTransportLooping;
- t.loop_start = location->start();
- t.loop_end = location->end();
- t.valid = jack_transport_bits_t (t.valid | JackTransportLoop);
-
- } else {
-
- t.loop_start = 0;
- t.loop_end = 0;
- t.transport_state = JackTransportRolling;
-
- }
-
- } else {
-
- t.loop_start = 0;
- t.loop_end = 0;
- t.transport_state = JackTransportRolling;
-
- }
-
- }
-#endif
-}
-
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 b99e70e6bb..ea065530f7 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',
@@ -182,7 +182,6 @@ libardour_sources = [
'session_events.cc',
'session_export.cc',
'session_handle.cc',
- 'session_jack.cc',
'session_ltc.cc',
'session_metadata.cc',
'session_midi.cc',
@@ -246,8 +245,6 @@ def configure(conf):
path_prefix + 'version.cc',
'libardour3', conf.env['MAJOR'], conf.env['MINOR'], 0)
autowaf.configure(conf)
- autowaf.check_pkg(conf, 'jack', uselib_store='JACK',
- atleast_version='0.118.2')
if Options.options.dist_target == 'auto':
if re.search ("linux", sys.platform) != None:
autowaf.check_pkg(conf, 'alsa', uselib_store='ALSA')
@@ -304,9 +301,6 @@ def configure(conf):
conf.check(header_name='sys/vfs.h', define_name='HAVE_SYS_VFS_H',mandatory=False)
conf.check(header_name='sys/statvfs.h', define_name='HAVE_SYS_STATVFS_H',mandatory=False)
- conf.check(header_name='jack/session.h', uselib = [ 'JACK' ],
- define_name='HAVE_JACK_SESSION')
-
conf.check(header_name='unistd.h', define_name='HAVE_UNISTD',mandatory=False)
if flac_supported():
@@ -343,11 +337,11 @@ def build(bld):
obj.name = 'ardour'
obj.target = 'ardour'
obj.uselib = ['GLIBMM','GTHREAD','AUBIO','SIGCPP','XML','UUID',
- 'JACK', 'ALSA', 'SNDFILE','SAMPLERATE','LRDF',
- 'AUDIOUNITS', 'OSX','BOOST','CURL','DL']
+ 'SNDFILE','SAMPLERATE','LRDF','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 = [
@@ -410,7 +404,7 @@ def build(bld):
testcommon.includes = obj.includes + ['test', '../pbd', '..']
testcommon.source = ['test/test_globals.cc', 'test/testrunner.cc', 'test/test_needing_session.cc',
'test/test_common.cc', 'test/dummy_lxvst.cc', 'test/audio_region_test.cc', 'test/test_util.cc']
- testcommon.uselib = ['CPPUNIT','SIGCPP','JACK','GLIBMM','GTHREAD',
+ testcommon.uselib = ['CPPUNIT','SIGCPP','GLIBMM','GTHREAD',
'SAMPLERATE','XML','LRDF','COREAUDIO']
testcommon.use = ['libpbd','libmidipp','libevoral','libvamphost',
'libvampplugin','libtaglib','librubberband',
@@ -488,7 +482,7 @@ def build(bld):
session_load_tester.includes = obj.includes
session_load_tester.includes.append ('test')
- session_load_tester.uselib = ['CPPUNIT','SIGCPP','JACK','GLIBMM','GTHREAD',
+ session_load_tester.uselib = ['CPPUNIT','SIGCPP','GLIBMM','GTHREAD',
'SAMPLERATE','XML','LRDF','COREAUDIO']
session_load_tester.use = ['libpbd','libmidipp','ardour']
session_load_tester.name = 'libardour-session-load-tester'
@@ -523,7 +517,7 @@ def build(bld):
profilingobj.includes = obj.includes
profilingobj.includes.append ('test')
- profilingobj.uselib = ['CPPUNIT','SIGCPP','JACK','GLIBMM','GTHREAD',
+ profilingobj.uselib = ['CPPUNIT','SIGCPP','GLIBMM','GTHREAD',
'SAMPLERATE','XML','LRDF','COREAUDIO']
profilingobj.use = ['libpbd','libmidipp','ardour']
profilingobj.name = 'libardour-profiling'
@@ -550,7 +544,7 @@ def create_ardour_test_program(bld, includes, name, target, sources):
testobj = bld(features = 'cxx cxxprogram')
testobj.includes = includes + ['test', '../pbd', '..']
testobj.source = sources
- testobj.uselib = ['CPPUNIT','SIGCPP','JACK','GLIBMM','GTHREAD',
+ testobj.uselib = ['CPPUNIT','SIGCPP','GLIBMM','GTHREAD',
'SAMPLERATE','XML','LRDF','COREAUDIO']
testobj.use = ['libpbd','libmidipp','libevoral','libvamphost',
'libvampplugin','libtaglib','librubberband',