diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2013-10-09 14:00:42 -0400 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2013-10-09 14:00:42 -0400 |
commit | 2a6a16f980ff9181b138f7a30aedfbde4426a591 (patch) | |
tree | d86752508bbd033be18301796e7d0c571a4fe1c0 /libs/ardour | |
parent | 66aa6dfc8ecdb7591768bc45866a8c2b0d77e767 (diff) | |
parent | 465b800d8b7dc0d9e0f92a16c6fcae29d2bbd544 (diff) |
merge with master, fixing conflicts in 3 wscript files
Diffstat (limited to 'libs/ardour')
-rw-r--r-- | libs/ardour/ardour/ardour.h | 2 | ||||
-rw-r--r-- | libs/ardour/ardour/audio_backend.h | 18 | ||||
-rw-r--r-- | libs/ardour/ardour/audioengine.h | 12 | ||||
-rw-r--r-- | libs/ardour/ardour/graph.h | 5 | ||||
-rw-r--r-- | libs/ardour/ardour/rc_configuration_vars.h | 2 | ||||
-rw-r--r-- | libs/ardour/ardour/session.h | 16 | ||||
-rw-r--r-- | libs/ardour/ardour/slave.h | 6 | ||||
-rw-r--r-- | libs/ardour/ardour/types.h | 17 | ||||
-rw-r--r-- | libs/ardour/audioengine.cc | 46 | ||||
-rw-r--r-- | libs/ardour/engine_slave.cc (renamed from libs/ardour/jack_slave.cc) | 10 | ||||
-rw-r--r-- | libs/ardour/enums.cc | 1 | ||||
-rw-r--r-- | libs/ardour/globals.cc | 19 | ||||
-rw-r--r-- | libs/ardour/graph.cc | 30 | ||||
-rw-r--r-- | libs/ardour/po/de.po | 602 | ||||
-rw-r--r-- | libs/ardour/session.cc | 34 | ||||
-rw-r--r-- | libs/ardour/session_jack.cc | 185 | ||||
-rw-r--r-- | libs/ardour/session_state.cc | 80 | ||||
-rw-r--r-- | libs/ardour/session_time.cc | 2 | ||||
-rw-r--r-- | libs/ardour/session_transport.cc | 30 | ||||
-rw-r--r-- | libs/ardour/utils.cc | 9 | ||||
-rw-r--r-- | libs/ardour/wscript | 22 |
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', |