summaryrefslogtreecommitdiff
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
parent66aa6dfc8ecdb7591768bc45866a8c2b0d77e767 (diff)
parent465b800d8b7dc0d9e0f92a16c6fcae29d2bbd544 (diff)
merge with master, fixing conflicts in 3 wscript files
-rw-r--r--gtk2_ardour/ardour_ui.cc272
-rw-r--r--gtk2_ardour/ardour_ui.h19
-rw-r--r--gtk2_ardour/ardour_ui_dependents.cc8
-rw-r--r--gtk2_ardour/ardour_ui_ed.cc59
-rw-r--r--gtk2_ardour/ardour_ui_options.cc18
-rw-r--r--gtk2_ardour/audio_clock.cc2
-rw-r--r--gtk2_ardour/editor_ops.cc2
-rw-r--r--gtk2_ardour/editor_regions.cc8
-rw-r--r--gtk2_ardour/engine_dialog.cc746
-rw-r--r--gtk2_ardour/engine_dialog.h22
-rw-r--r--gtk2_ardour/export_video_dialog.cc1
-rw-r--r--gtk2_ardour/gtk_pianokeyboard.c8
-rw-r--r--gtk2_ardour/keyeditor.cc2
-rw-r--r--gtk2_ardour/main.cc12
-rw-r--r--gtk2_ardour/mixer_strip.cc4
-rw-r--r--gtk2_ardour/plugin_selector.cc10
-rw-r--r--gtk2_ardour/po/de.po2563
-rw-r--r--gtk2_ardour/processor_box.cc2
-rw-r--r--gtk2_ardour/rc_option_editor.cc6
-rw-r--r--gtk2_ardour/session_dialog.cc1075
-rw-r--r--gtk2_ardour/session_dialog.h240
-rw-r--r--gtk2_ardour/session_option_editor.cc2
-rw-r--r--gtk2_ardour/sfdb_ui.cc4
-rw-r--r--gtk2_ardour/small-splash.pngbin0 -> 9671 bytes
-rw-r--r--gtk2_ardour/startup.cc1095
-rw-r--r--gtk2_ardour/startup.h181
-rw-r--r--gtk2_ardour/transcode_video_dialog.cc1
-rw-r--r--gtk2_ardour/utils.cc15
-rw-r--r--gtk2_ardour/utils.h2
-rw-r--r--gtk2_ardour/video_monitor.cc2
-rw-r--r--gtk2_ardour/window_manager.cc1
-rw-r--r--gtk2_ardour/wscript1
-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_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
-rw-r--r--libs/backends/jack/jack_api.cc2
-rw-r--r--libs/backends/jack/jack_audiobackend.cc80
-rw-r--r--libs/backends/jack/jack_audiobackend.h19
-rw-r--r--libs/backends/jack/jack_connection.cc36
-rw-r--r--libs/backends/jack/jack_connection.h6
-rw-r--r--libs/backends/jack/jack_session.cc (renamed from libs/ardour/session_jack.cc)98
-rw-r--r--libs/backends/jack/jack_session.h47
-rw-r--r--libs/backends/jack/wscript4
-rw-r--r--libs/gtkmm2ext/gtk_ui.cc10
-rw-r--r--libs/gtkmm2ext/gtkmm2ext/gtk_ui.h3
-rw-r--r--libs/pbd/stacktrace.cc6
-rw-r--r--wscript12
64 files changed, 4168 insertions, 3501 deletions
diff --git a/gtk2_ardour/ardour_ui.cc b/gtk2_ardour/ardour_ui.cc
index 5dde7f977e..8205290590 100644
--- a/gtk2_ardour/ardour_ui.cc
+++ b/gtk2_ardour/ardour_ui.cc
@@ -113,6 +113,7 @@ typedef uint64_t microseconds_t;
#include "rc_option_editor.h"
#include "route_time_axis.h"
#include "route_params_ui.h"
+#include "session_dialog.h"
#include "session_metadata_dialog.h"
#include "session_option_editor.h"
#include "shuttle_control.h"
@@ -160,7 +161,6 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], const char* localedir)
/* start of private members */
- , _startup (0)
, nsm (0)
, _was_dirty (false)
, _mixer_on_top (false)
@@ -195,6 +195,7 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], const char* localedir)
, about (X_("about"), _("About"))
, location_ui (X_("locations"), _("Locations"))
, route_params (X_("inspector"), _("Tracks and Busses"))
+ , audio_midi_setup (X_("audio-midi-setup"), _("Audio/MIDI Setup"))
, session_option_editor (X_("session-options-editor"), _("Properties"), boost::bind (&ARDOUR_UI::create_session_option_editor, this))
, add_video_dialog (X_("add-video"), _("Add Tracks/Busses"), boost::bind (&ARDOUR_UI::create_add_video_dialog, this))
, bundle_manager (X_("bundle-manager"), _("Bundle Manager"), boost::bind (&ARDOUR_UI::create_bundle_manager, this))
@@ -206,7 +207,6 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], const char* localedir)
, _status_bar_visibility (X_("status-bar"))
, _feedback_exists (false)
- , _audio_midi_setup (0)
{
Gtkmm2ext::init(localedir);
@@ -217,7 +217,6 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], const char* localedir)
}
ui_config = new UIConfiguration();
- _audio_midi_setup = new EngineControl;
editor = 0;
mixer = 0;
@@ -352,6 +351,7 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], const char* localedir)
WM::Manager::instance().register_window (&add_route_dialog);
WM::Manager::instance().register_window (&add_video_dialog);
WM::Manager::instance().register_window (&route_params);
+ WM::Manager::instance().register_window (&audio_midi_setup);
WM::Manager::instance().register_window (&bundle_manager);
WM::Manager::instance().register_window (&location_ui);
WM::Manager::instance().register_window (&big_clock_window);
@@ -365,9 +365,6 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], const char* localedir)
(void) theme_manager.get (true);
- starting.connect (sigc::mem_fun(*this, &ARDOUR_UI::startup));
- stopping.connect (sigc::mem_fun(*this, &ARDOUR_UI::shutdown));
-
_process_thread = new ProcessThread ();
_process_thread->init ();
@@ -406,58 +403,12 @@ ARDOUR_UI::engine_running ()
if (first_time_engine_run) {
post_engine();
first_time_engine_run = false;
- }
+ }
- ActionManager::set_sensitive (ActionManager::engine_sensitive_actions, true);
- ActionManager::set_sensitive (ActionManager::engine_opposite_sensitive_actions, false);
-
- Glib::RefPtr<Action> action;
- const char* action_name = 0;
-
- switch (AudioEngine::instance()->samples_per_cycle()) {
- case 32:
- action_name = X_("JACKLatency32");
- break;
- case 64:
- action_name = X_("JACKLatency64");
- break;
- case 128:
- action_name = X_("JACKLatency128");
- break;
- case 512:
- action_name = X_("JACKLatency512");
- break;
- case 1024:
- action_name = X_("JACKLatency1024");
- break;
- case 2048:
- action_name = X_("JACKLatency2048");
- break;
- case 4096:
- action_name = X_("JACKLatency4096");
- break;
- case 8192:
- action_name = X_("JACKLatency8192");
- break;
- default:
- /* XXX can we do anything useful ? */
- break;
- }
-
- if (action_name) {
-
- action = ActionManager::get_action (X_("JACK"), action_name);
-
- if (action) {
- Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic (action);
- ract->set_active ();
- }
-
- update_disk_space ();
- update_cpu_load ();
- update_sample_rate (AudioEngine::instance()->sample_rate());
- update_timecode_format ();
- }
+ update_disk_space ();
+ update_cpu_load ();
+ update_sample_rate (AudioEngine::instance()->sample_rate());
+ update_timecode_format ();
}
void
@@ -485,13 +436,13 @@ ARDOUR_UI::engine_halted (const char* reason, bool free_reason)
*/
if (strlen (reason)) {
- msgstr = string_compose (_("The audio backend (JACK) was shutdown because:\n\n%1"), reason);
+ msgstr = string_compose (_("The audio backend was shutdown because:\n\n%1"), reason);
} else {
msgstr = string_compose (_("\
-JACK has either been shutdown or it\n\
+`The audio backend has either been shutdown or it\n\
disconnected %1 because %1\n\
was not fast enough. Try to restart\n\
-JACK, reconnect and save the session."), PROGRAM_NAME);
+the audio backend and save the session."), PROGRAM_NAME);
}
MessageDialog msg (*editor, msgstr);
@@ -586,6 +537,10 @@ ARDOUR_UI::post_engine ()
ARDOUR_UI::~ARDOUR_UI ()
{
+ if (ui_config->dirty()) {
+ ui_config->save_state();
+ }
+
delete keyboard;
delete editor;
delete mixer;
@@ -762,8 +717,8 @@ ARDOUR_UI::check_announcements ()
#endif
}
-void
-ARDOUR_UI::startup ()
+int
+ARDOUR_UI::starting ()
{
Application* app = Application::instance ();
char *nsm_url;
@@ -825,10 +780,33 @@ ARDOUR_UI::startup ()
delete nsm;
nsm = 0;
}
- }
- else if (get_session_parameters (true, ARDOUR_COMMAND_LINE::new_session, ARDOUR_COMMAND_LINE::load_template)) {
- exit (1);
+ } else {
+
+ if (ArdourStartup::required()) {
+ ArdourStartup s;
+ s.present ();
+ main().run();
+ s.hide ();
+ switch (s.response ()) {
+ case Gtk::RESPONSE_REJECT:
+ return -1;
+ default:
+ break;
+ }
+ }
+
+ /* we need to create this early because it may need to set the
+ * audio backend end up.
+ */
+
+ audio_midi_setup.get (true);
+
+ /* go get a session */
+
+ if (get_session_parameters (false, ARDOUR_COMMAND_LINE::new_session, ARDOUR_COMMAND_LINE::load_template)) {
+ return -1;
+ }
}
use_config ();
@@ -843,6 +821,7 @@ ARDOUR_UI::startup ()
_status_bar_visibility.update ();
BootMessage (string_compose (_("%1 is ready for use"), PROGRAM_NAME));
+ return 0;
}
void
@@ -1156,7 +1135,6 @@ ARDOUR_UI::update_sample_rate (framecnt_t)
}
}
}
-
sample_rate_label.set_markup (buf);
}
@@ -1860,7 +1838,7 @@ ARDOUR_UI::transport_roll ()
#if 0
if (_session->config.get_external_sync()) {
switch (Config->get_sync_source()) {
- case JACK:
+ case Engine:
break;
default:
/* transport controlled by the master */
@@ -1910,7 +1888,7 @@ ARDOUR_UI::toggle_roll (bool with_abort, bool roll_out_of_bounded_mode)
if (_session->config.get_external_sync()) {
switch (Config->get_sync_source()) {
- case JACK:
+ case Engine:
break;
default:
/* transport controlled by the master */
@@ -2482,7 +2460,7 @@ ARDOUR_UI::ask_about_loading_existing_session (const std::string& session_path)
}
int
-ARDOUR_UI::build_session_from_nsd (const std::string& session_path, const std::string& session_name)
+ARDOUR_UI::build_session_from_dialog (SessionDialog& sd, const std::string& session_path, const std::string& session_name)
{
BusProfile bus_profile;
@@ -2498,13 +2476,13 @@ ARDOUR_UI::build_session_from_nsd (const std::string& session_path, const std::s
/* get settings from advanced section of NSD */
- if (_startup->create_master_bus()) {
- bus_profile.master_out_channels = (uint32_t) _startup->master_channel_count();
+ if (sd.create_master_bus()) {
+ bus_profile.master_out_channels = (uint32_t) sd.master_channel_count();
} else {
bus_profile.master_out_channels = 0;
}
- if (_startup->connect_inputs()) {
+ if (sd.connect_inputs()) {
bus_profile.input_ac = AutoConnectPhysical;
} else {
bus_profile.input_ac = AutoConnectOption (0);
@@ -2512,16 +2490,16 @@ ARDOUR_UI::build_session_from_nsd (const std::string& session_path, const std::s
bus_profile.output_ac = AutoConnectOption (0);
- if (_startup->connect_outputs ()) {
- if (_startup->connect_outs_to_master()) {
+ if (sd.connect_outputs ()) {
+ if (sd.connect_outs_to_master()) {
bus_profile.output_ac = AutoConnectMaster;
- } else if (_startup->connect_outs_to_physical()) {
+ } else if (sd.connect_outs_to_physical()) {
bus_profile.output_ac = AutoConnectPhysical;
}
}
- bus_profile.requested_physical_in = (uint32_t) _startup->input_limit_count();
- bus_profile.requested_physical_out = (uint32_t) _startup->output_limit_count();
+ bus_profile.requested_physical_in = (uint32_t) sd.input_limit_count();
+ bus_profile.requested_physical_out = (uint32_t) sd.output_limit_count();
}
if (build_session (session_path, session_name, bus_profile)) {
@@ -2557,6 +2535,7 @@ ARDOUR_UI::get_session_parameters (bool quit_on_cancel, bool should_be_new, stri
string template_name;
int ret = -1;
bool likely_new = false;
+ bool cancel_not_quit;
/* deal with any existing DIRTY session now, rather than later. don't
* treat a non-dirty session this way, so that it stays visible
@@ -2567,6 +2546,11 @@ ARDOUR_UI::get_session_parameters (bool quit_on_cancel, bool should_be_new, stri
ARDOUR_UI::instance()->video_timeline->sync_session_state();
}
+ /* if there is already a session, relabel the button
+ on the SessionDialog so that we don't Quit directly
+ */
+ cancel_not_quit = (_session != 0);
+
if (_session && _session->dirty()) {
if (unload_session (false)) {
/* unload cancelled by user */
@@ -2580,6 +2564,20 @@ ARDOUR_UI::get_session_parameters (bool quit_on_cancel, bool should_be_new, stri
template_name = load_template;
}
+ session_name = basename_nosuffix (ARDOUR_COMMAND_LINE::session_name);
+ session_path = ARDOUR_COMMAND_LINE::session_name;
+
+ if (!session_path.empty()) {
+ if (Glib::file_test (session_path.c_str(), Glib::FILE_TEST_EXISTS)) {
+ if (Glib::file_test (session_path.c_str(), Glib::FILE_TEST_IS_REGULAR)) {
+ /* session/snapshot file, change path to be dir */
+ session_path = Glib::path_get_dirname (session_path);
+ }
+ }
+ }
+
+ SessionDialog session_dialog (should_be_new, session_name, session_path, load_template, cancel_not_quit);
+
while (ret != 0) {
if (!ARDOUR_COMMAND_LINE::session_name.empty()) {
@@ -2602,34 +2600,35 @@ ARDOUR_UI::get_session_parameters (bool quit_on_cancel, bool should_be_new, stri
} else {
session_path = "";
session_name = "";
- }
-
- delete _startup;
- _startup = new ArdourStartup (should_be_new, session_name, session_path, load_template);
-
- if (!_startup->ready_without_display()) {
- _startup->present ();
- main().run();
- _startup->hide ();
+ session_dialog.clear_given ();
}
- switch (_startup->response()) {
- case RESPONSE_OK:
- break;
- default:
- if (quit_on_cancel) {
- exit (1);
- } else {
- return ret;
+ if (should_be_new || session_name.empty()) {
+ /* need the dialog to get info from user */
+
+ cerr << "run dialog\n";
+
+ switch (session_dialog.run()) {
+ case RESPONSE_ACCEPT:
+ break;
+ default:
+ if (quit_on_cancel) {
+ exit (1);
+ } else {
+ return ret;
+ }
}
+
+ session_dialog.hide ();
}
/* if we run the startup dialog again, offer more than just "new session" */
should_be_new = false;
- session_name = _startup->session_name (likely_new);
-
+ session_name = session_dialog.session_name (likely_new);
+ session_path = session_dialog.session_folder ();
+
if (nsm) {
likely_new = true;
}
@@ -2646,8 +2645,8 @@ ARDOUR_UI::get_session_parameters (bool quit_on_cancel, bool should_be_new, stri
continue;
}
- if (_startup->use_session_template()) {
- template_name = _startup->session_template_name();
+ if (session_dialog.use_session_template()) {
+ template_name = session_dialog.session_template_name();
_session_is_new = true;
}
@@ -2664,12 +2663,12 @@ ARDOUR_UI::get_session_parameters (bool quit_on_cancel, bool should_be_new, stri
} else {
- session_path = _startup->session_folder();
+ session_path = session_dialog.session_folder();
char illegal = Session::session_name_is_legal (session_name);
if (illegal) {
- MessageDialog msg (*_startup,
+ MessageDialog msg (session_dialog,
string_compose (_("To ensure compatibility with various systems\n"
"session names may not contain a '%1' character"),
illegal));
@@ -2681,6 +2680,7 @@ ARDOUR_UI::get_session_parameters (bool quit_on_cancel, bool should_be_new, stri
if (Glib::file_test (session_path, Glib::FileTest (G_FILE_TEST_EXISTS | G_FILE_TEST_IS_DIR))) {
+
if (likely_new && !nsm) {
std::string existing = Glib::build_filename (session_path, session_name);
@@ -2696,12 +2696,7 @@ ARDOUR_UI::get_session_parameters (bool quit_on_cancel, bool should_be_new, stri
} else {
if (!likely_new) {
- if (_startup) {
- pop_back_splash (*_startup);
- } else {
- hide_splash ();
- }
-
+ pop_back_splash (session_dialog);
MessageDialog msg (string_compose (_("There is no existing session at \"%1\""), session_path));
msg.run ();
ARDOUR_COMMAND_LINE::session_name = ""; // cancel that
@@ -2709,10 +2704,11 @@ ARDOUR_UI::get_session_parameters (bool quit_on_cancel, bool should_be_new, stri
}
char illegal = Session::session_name_is_legal(session_name);
+
if (illegal) {
- pop_back_splash (*_startup);
- MessageDialog msg (*_startup, string_compose(_("To ensure compatibility with various systems\n"
- "session names may not contain a '%1' character"), illegal));
+ pop_back_splash (session_dialog);
+ MessageDialog msg (session_dialog, string_compose(_("To ensure compatibility with various systems\n"
+ "session names may not contain a '%1' character"), illegal));
msg.run ();
ARDOUR_COMMAND_LINE::session_name = ""; // cancel that
continue;
@@ -2723,7 +2719,7 @@ ARDOUR_UI::get_session_parameters (bool quit_on_cancel, bool should_be_new, stri
if (likely_new && template_name.empty()) {
- ret = build_session_from_nsd (session_path, session_name);
+ ret = build_session_from_dialog (session_dialog, session_path, session_name);
} else {
@@ -2738,6 +2734,12 @@ ARDOUR_UI::get_session_parameters (bool quit_on_cancel, bool should_be_new, stri
_session->save_state (ARDOUR_COMMAND_LINE::immediate_save, false);
exit (1);
}
+
+ /* clear this to avoid endless attempts to load the
+ same session.
+ */
+
+ ARDOUR_COMMAND_LINE::session_name = "";
}
}
@@ -2830,22 +2832,12 @@ ARDOUR_UI::load_session (const std::string& path, const std::string& snap_name,
Gtk::MESSAGE_INFO,
BUTTONS_OK);
+ msg.set_keep_above (true);
msg.set_title (_("Loading Error"));
- msg.set_secondary_text (_("Click the Refresh button to try again."));
- msg.add_button (Stock::REFRESH, 1);
msg.set_position (Gtk::WIN_POS_CENTER);
pop_back_splash (msg);
msg.present ();
-
- int response = msg.run ();
-
- switch (response) {
- case 1:
- break;
- default:
- exit (1);
- }
-
+ (void) msg.run ();
msg.hide ();
goto out;
@@ -3804,6 +3796,7 @@ ARDOUR_UI::disconnect_from_engine ()
/* drop connection to AudioEngine::Halted so that we don't act
* as if the engine unexpectedly shut down
*/
+
halt_connection.disconnect ();
if (AudioEngine::instance()->stop ()) {
@@ -4136,41 +4129,12 @@ ARDOUR_UI::reset_route_peak_display (Route* route)
}
}
-void
-ARDOUR_UI::toggle_audio_midi_setup ()
-{
- Glib::RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("toggle-audio-midi-setup"));
- if (!act) {
- return;
- }
-
- Glib::RefPtr<ToggleAction> tact = Glib::RefPtr<ToggleAction>::cast_dynamic (act);
-
- if (tact->get_active()) {
- launch_audio_midi_setup ();
- } else {
- _audio_midi_setup->hide ();
- }
-}
-
-void
-ARDOUR_UI::launch_audio_midi_setup ()
-{
- if (!_audio_midi_setup) {
- _audio_midi_setup = new EngineControl ();
- }
-
- _audio_midi_setup->present ();
-}
-
int
ARDOUR_UI::do_audio_midi_setup (uint32_t desired_sample_rate)
{
- launch_audio_midi_setup ();
+ audio_midi_setup->set_desired_sample_rate (desired_sample_rate);
- _audio_midi_setup->set_desired_sample_rate (desired_sample_rate);
-
- switch (_audio_midi_setup->run()) {
+ switch (audio_midi_setup->run()) {
case Gtk::RESPONSE_OK:
return 0;
case Gtk::RESPONSE_APPLY:
@@ -4179,3 +4143,5 @@ ARDOUR_UI::do_audio_midi_setup (uint32_t desired_sample_rate)
return -1;
}
}
+
+
diff --git a/gtk2_ardour/ardour_ui.h b/gtk2_ardour/ardour_ui.h
index 0ca8cde907..8f4432f8e2 100644
--- a/gtk2_ardour/ardour_ui.h
+++ b/gtk2_ardour/ardour_ui.h
@@ -83,7 +83,6 @@ class AddRouteDialog;
class AddVideoDialog;
class VideoTimeLine;
class SystemExec;
-class ArdourStartup;
class ArdourKeyboard;
class AudioClock;
class BigClockWindow;
@@ -98,6 +97,7 @@ class Mixer_UI;
class PublicEditor;
class RCOptionEditor;
class RouteParams_UI;
+class SessionDialog;
class SessionOptionEditor;
class ShuttleControl;
class Splash;
@@ -153,7 +153,7 @@ class ARDOUR_UI : public Gtkmm2ext::UI, public ARDOUR::SessionHandlePtr
bool get_smart_mode () const;
int get_session_parameters (bool quit_on_cancel, bool should_be_new = false, std::string load_template = "");
- int build_session_from_nsd (const std::string& session_name, const std::string& session_path);
+ int build_session_from_dialog (SessionDialog&, const std::string& session_name, const std::string& session_path);
bool ask_about_loading_existing_session (const std::string& session_path);
/// @return true if session was successfully unloaded.
@@ -312,11 +312,10 @@ class ARDOUR_UI : public Gtkmm2ext::UI, public ARDOUR::SessionHandlePtr
void toggle_session_options_window ();
private:
- ArdourStartup* _startup;
- Gtk::Tooltips _tooltips;
+ Gtk::Tooltips _tooltips;
NSM_Client *nsm;
- bool _was_dirty;
- bool _mixer_on_top;
+ bool _was_dirty;
+ bool _mixer_on_top;
bool first_time_engine_run;
void goto_editor_window ();
@@ -331,8 +330,7 @@ class ARDOUR_UI : public Gtkmm2ext::UI, public ARDOUR::SessionHandlePtr
static ARDOUR_UI *theArdourUI;
- void startup ();
- void shutdown ();
+ int starting ();
int ask_about_saving_session (const std::vector<std::string>& actions);
@@ -603,6 +601,7 @@ class ARDOUR_UI : public Gtkmm2ext::UI, public ARDOUR::SessionHandlePtr
WM::Proxy<About> about;
WM::Proxy<LocationUIWindow> location_ui;
WM::Proxy<RouteParams_UI> route_params;
+ WM::Proxy<EngineControl> audio_midi_setup;
/* Windows/Dialogs that require a creator method */
@@ -670,8 +669,6 @@ class ARDOUR_UI : public Gtkmm2ext::UI, public ARDOUR::SessionHandlePtr
int pending_state_dialog ();
int sr_mismatch_dialog (ARDOUR::framecnt_t, ARDOUR::framecnt_t);
- void set_engine_buffer_size (ARDOUR::pframes_t);
-
Gtk::MenuItem* jack_disconnect_item;
Gtk::MenuItem* jack_reconnect_item;
Gtk::Menu* jack_bufsize_menu;
@@ -749,8 +746,6 @@ class ARDOUR_UI : public Gtkmm2ext::UI, public ARDOUR::SessionHandlePtr
std::string _announce_string;
void check_announcements ();
- EngineControl* _audio_midi_setup;
- void launch_audio_midi_setup ();
int do_audio_midi_setup (uint32_t);
};
diff --git a/gtk2_ardour/ardour_ui_dependents.cc b/gtk2_ardour/ardour_ui_dependents.cc
index 821382717f..fbfc8c7afd 100644
--- a/gtk2_ardour/ardour_ui_dependents.cc
+++ b/gtk2_ardour/ardour_ui_dependents.cc
@@ -51,14 +51,6 @@ namespace ARDOUR {
using namespace ARDOUR;
void
-ARDOUR_UI::shutdown ()
-{
- if (ui_config->dirty()) {
- ui_config->save_state();
- }
-}
-
-void
ARDOUR_UI::we_have_dependents ()
{
install_actions ();
diff --git a/gtk2_ardour/ardour_ui_ed.cc b/gtk2_ardour/ardour_ui_ed.cc
index b64498fb33..251fc8f6fc 100644
--- a/gtk2_ardour/ardour_ui_ed.cc
+++ b/gtk2_ardour/ardour_ui_ed.cc
@@ -197,7 +197,6 @@ ARDOUR_UI::install_actions ()
ActionManager::register_toggle_action (common_actions, X_("toggle-mixer"), S_("Window|Mixer"), sigc::mem_fun(*this, &ARDOUR_UI::toggle_mixer_window));
ActionManager::register_action (common_actions, X_("toggle-editor-mixer"), _("Toggle Editor+Mixer"), sigc::mem_fun(*this, &ARDOUR_UI::toggle_editor_mixer));
ActionManager::register_toggle_action (common_actions, X_("toggle-meterbridge"), S_("Window|Meterbridge"), sigc::mem_fun(*this, &ARDOUR_UI::toggle_meterbridge));
- ActionManager::register_toggle_action (common_actions, X_("toggle-audio-midi-setup"), S_("Window|Audio/MIDI Setup"), sigc::mem_fun(*this, &ARDOUR_UI::toggle_audio_midi_setup));
act = ActionManager::register_action (common_actions, X_("NewMIDITracer"), _("MIDI Tracer"), sigc::mem_fun(*this, &ARDOUR_UI::new_midi_tracer_window));
ActionManager::session_sensitive_actions.push_back (act);
@@ -397,60 +396,6 @@ ARDOUR_UI::install_actions ()
}
void
-ARDOUR_UI::set_engine_buffer_size (pframes_t nframes)
-{
- Glib::RefPtr<Action> action;
- const char* action_name = 0;
-
- switch (nframes) {
- case 32:
- action_name = X_("EngineLatency32");
- break;
- case 64:
- action_name = X_("EngineLatency64");
- break;
- case 128:
- action_name = X_("EngineLatency128");
- break;
- case 256:
- action_name = X_("EngineLatency256");
- break;
- case 512:
- action_name = X_("EngineLatency512");
- break;
- case 1024:
- action_name = X_("EngineLatency1024");
- break;
- case 2048:
- action_name = X_("EngineLatency2048");
- break;
- case 4096:
- action_name = X_("EngineLatency4096");
- break;
- case 8192:
- action_name = X_("EngineLatency8192");
- break;
- default:
- /* XXX can we do anything useful ? */
- break;
- }
-
- if (action_name) {
-
- action = ActionManager::get_action (X_("JACK"), action_name);
-
- if (action) {
- Glib::RefPtr<RadioAction> ract = Glib::RefPtr<RadioAction>::cast_dynamic (action);
-
- if (ract && ract->get_active()) {
- AudioEngine::instance()->request_buffer_size (nframes);
- update_sample_rate (0);
- }
- }
- }
-}
-
-void
ARDOUR_UI::build_menu_bar ()
{
menu_bar = dynamic_cast<MenuBar*> (ActionManager::get_widget (X_("/Main")));
@@ -528,7 +473,7 @@ ARDOUR_UI::build_menu_bar ()
_status_bar_visibility.add (&disk_space_label, X_("Disk"), _("Disk Space"), disk_space);
_status_bar_visibility.add (&cpu_load_label, X_("DSP"), _("DSP"), true);
_status_bar_visibility.add (&buffer_load_label, X_("Buffers"), _("Buffers"), true);
- _status_bar_visibility.add (&sample_rate_label, X_("JACK"), _("JACK Sampling Rate and Latency"), true);
+ _status_bar_visibility.add (&sample_rate_label, X_("Audio"), _("Audio"), true);
_status_bar_visibility.add (&timecode_format_label, X_("TCFormat"), _("Timecode Format"), true);
_status_bar_visibility.add (&format_label, X_("Format"), _("File Format"), true);
@@ -614,7 +559,7 @@ ARDOUR_UI::save_ardour_state ()
window_node->add_child_nocopy (*tearoff_node);
Config->add_extra_xml (*window_node);
- Config->add_extra_xml (_audio_midi_setup->get_state());
+ Config->add_extra_xml (audio_midi_setup->get_state());
Config->save_state();
diff --git a/gtk2_ardour/ardour_ui_options.cc b/gtk2_ardour/ardour_ui_options.cc
index 6b2c9da6fa..0e28900450 100644
--- a/gtk2_ardour/ardour_ui_options.cc
+++ b/gtk2_ardour/ardour_ui_options.cc
@@ -29,10 +29,6 @@
#include "ardour/rc_configuration.h"
#include "ardour/session.h"
-#ifdef HAVE_LIBLO
-#include "ardour/osc.h"
-#endif
-
#include "audio_clock.h"
#include "ardour_ui.h"
#include "actions.h"
@@ -60,7 +56,7 @@ ARDOUR_UI::toggle_external_sync()
{
if (_session) {
if (_session->config.get_video_pullup() != 0.0f) {
- if (Config->get_sync_source() == JACK) {
+ if (Config->get_sync_source() == Engine) {
MessageDialog msg (
_("It is not possible to use JACK as the the sync source\n\
when the pull up/down setting is non-zero."));
@@ -342,16 +338,6 @@ ARDOUR_UI::parameter_changed (std::string p)
ActionManager::map_some_state ("options", "SendMMC", &RCConfiguration::get_send_mmc);
- } else if (p == "use-osc") {
-
-#ifdef HAVE_LIBLO
- if (Config->get_use_osc()) {
- osc->start ();
- } else {
- osc->stop ();
- }
-#endif
-
} else if (p == "keep-tearoffs") {
ActionManager::map_some_state ("Common", "KeepTearoffs", &RCConfiguration::get_keep_tearoffs);
} else if (p == "mmc-control") {
@@ -465,7 +451,7 @@ ARDOUR_UI::synchronize_sync_source_and_video_pullup ()
act->set_sensitive (true);
} else {
/* can't sync to JACK if video pullup != 0.0 */
- if (Config->get_sync_source() == JACK) {
+ if (Config->get_sync_source() == Engine) {
act->set_sensitive (false);
} else {
act->set_sensitive (true);
diff --git a/gtk2_ardour/audio_clock.cc b/gtk2_ardour/audio_clock.cc
index c658160e14..6680e95b15 100644
--- a/gtk2_ardour/audio_clock.cc
+++ b/gtk2_ardour/audio_clock.cc
@@ -996,7 +996,7 @@ AudioClock::set_slave_info ()
Slave* slave = _session->slave();
switch (sync_src) {
- case JACK:
+ case Engine:
_left_layout->set_markup (string_compose ("<span size=\"%1\">" TXTSPAN "%2</span></span>",
INFO_FONT_SIZE, sync_source_to_string(sync_src, true)));
_right_layout->set_text ("");
diff --git a/gtk2_ardour/editor_ops.cc b/gtk2_ardour/editor_ops.cc
index 93a53dd1d3..6ada12220a 100644
--- a/gtk2_ardour/editor_ops.cc
+++ b/gtk2_ardour/editor_ops.cc
@@ -2108,7 +2108,7 @@ Editor::transition_to_rolling (bool fwd)
if (_session->config.get_external_sync()) {
switch (Config->get_sync_source()) {
- case JACK:
+ case Engine:
break;
default:
/* transport controlled by the master */
diff --git a/gtk2_ardour/editor_regions.cc b/gtk2_ardour/editor_regions.cc
index ad5263d1d1..72a0da2909 100644
--- a/gtk2_ardour/editor_regions.cc
+++ b/gtk2_ardour/editor_regions.cc
@@ -1115,7 +1115,7 @@ EditorRegions::sorter (TreeModel::iterator a, TreeModel::iterator b)
switch (_sort_type) {
case ByName:
- cmp = strcasecmp (region1->name().c_str(), region2->name().c_str());
+ cmp = g_strcasecmp (region1->name().c_str(), region2->name().c_str());
break;
case ByLength:
@@ -1140,7 +1140,7 @@ EditorRegions::sorter (TreeModel::iterator a, TreeModel::iterator b)
break;
case BySourceFileName:
- cmp = strcasecmp (region1->source()->name().c_str(), region2->source()->name().c_str());
+ cmp = g_strcasecmp (region1->source()->name().c_str(), region2->source()->name().c_str());
break;
case BySourceFileLength:
@@ -1153,9 +1153,9 @@ EditorRegions::sorter (TreeModel::iterator a, TreeModel::iterator b)
case BySourceFileFS:
if (region1->source()->name() == region2->source()->name()) {
- cmp = strcasecmp (region1->name().c_str(), region2->name().c_str());
+ cmp = g_strcasecmp (region1->name().c_str(), region2->name().c_str());
} else {
- cmp = strcasecmp (region1->source()->name().c_str(), region2->source()->name().c_str());
+ cmp = g_strcasecmp (region1->source()->name().c_str(), region2->source()->name().c_str());
}
break;
}
diff --git a/gtk2_ardour/engine_dialog.cc b/gtk2_ardour/engine_dialog.cc
index 65fa7227a7..dfd24af739 100644
--- a/gtk2_ardour/engine_dialog.cc
+++ b/gtk2_ardour/engine_dialog.cc
@@ -48,6 +48,7 @@
#include "ardour_ui.h"
#include "engine_dialog.h"
#include "gui_thread.h"
+#include "utils.h"
#include "i18n.h"
using namespace std;
@@ -78,20 +79,147 @@ EngineControl::EngineControl ()
, aj_button (_("Start MIDI ALSA/JACK bridge"))
, ignore_changes (0)
, _desired_sample_rate (0)
+ , no_push (true)
+ , started_at_least_once (false)
{
- if (!ARDOUR::AudioEngine::instance()->setup_required()) {
- _have_control = false;
- } else {
- _have_control = true;
- }
+ using namespace Notebook_Helpers;
+ vector<string> strings;
+ Label* label;
+ AttachOptions xopt = AttachOptions (FILL|EXPAND);
+ int row;
set_name (X_("AudioMIDISetup"));
- build_notebook ();
+ /* the backend combo is the one thing that is ALWAYS visible
+ */
+
+ vector<const ARDOUR::AudioBackendInfo*> backends = ARDOUR::AudioEngine::instance()->available_backends();
+ for (vector<const ARDOUR::AudioBackendInfo*>::const_iterator b = backends.begin(); b != backends.end(); ++b) {
+ strings.push_back ((*b)->name);
+ }
+
+ set_popdown_strings (backend_combo, strings);
+ backend_combo.set_active_text (strings.front());
+ backend_combo.signal_changed().connect (sigc::mem_fun (*this, &EngineControl::backend_changed));
+
+ /* setup basic packing characteristics for the table used on the main
+ * tab of the notebook
+ */
+
+ basic_packer.set_spacings (6);
+ basic_packer.set_border_width (12);
+ basic_packer.set_homogeneous (true);
+
+ /* pack it in */
+
+ basic_hbox.pack_start (basic_packer, false, false);
+
+ /* latency tab */
+
+ /* latency measurement tab */
+
+ lm_title.set_markup (string_compose ("<span size=\"large\" weight=\"bold\">%1</span>", _("Latency Measurement Tool")));
+
+ row = 0;
+ lm_table.set_row_spacings (12);
+
+ lm_table.attach (lm_title, 0, 2, row, row+1, xopt, (AttachOptions) 0);
+ row++;
+
+ Gtk::Label* preamble;
+
+ preamble = manage (new Label);
+ preamble->set_width_chars (60);
+ preamble->set_line_wrap (true);
+ preamble->set_markup (_("<span weight=\"bold\">Turn down the volume on your hardware to a very low level.</span>"));
+
+ lm_table.attach (*preamble, 0, 2, row, row+1, AttachOptions(FILL|EXPAND), (AttachOptions) 0);
+ row++;
+
+ preamble = manage (new Label);
+ preamble->set_width_chars (60);
+ preamble->set_line_wrap (true);
+ preamble->set_markup (_("Select two channels below and connect them using a cable or (less ideally) a speaker and microphone."));
+
+ lm_table.attach (*preamble, 0, 2, row, row+1, AttachOptions(FILL|EXPAND), (AttachOptions) 0);
+ row++;
+
+ label = manage (new Label (_("Output channel")));
+ lm_table.attach (*label, 0, 1, row, row+1, xopt, (AttachOptions) 0);
+
+ Gtk::Alignment* misc_align = manage (new Alignment (0.0, 0.5));
+ misc_align->add (lm_output_channel_combo);
+ lm_table.attach (*misc_align, 1, 2, row, row+1, xopt, (AttachOptions) 0);
+ ++row;
+
+ label = manage (new Label (_("Input channel")));
+ lm_table.attach (*label, 0, 1, row, row+1, xopt, (AttachOptions) 0);
+
+ misc_align = manage (new Alignment (0.0, 0.5));
+ misc_align->add (lm_input_channel_combo);
+ lm_table.attach (*misc_align, 1, 2, row, row+1, FILL, (AttachOptions) 0);
+ ++row;
+
+ xopt = AttachOptions(0);
+
+ lm_measure_button.add (lm_start_stop_label);
+
+ lm_measure_button.signal_toggled().connect (sigc::mem_fun (*this, &EngineControl::latency_button_toggled));
+ lm_use_button.signal_clicked().connect (sigc::mem_fun (*this, &EngineControl::use_latency_button_clicked));
+ lm_use_button.set_sensitive (false);
+
+ preamble = manage (new Label);
+ preamble->set_width_chars (60);
+ preamble->set_line_wrap (true);
+ preamble->set_markup (_("Once the channels are connected, click the \"Measure latency\" button."));
+ lm_table.attach (*preamble, 0, 2, row, row+1, AttachOptions(FILL|EXPAND), (AttachOptions) 0);
+ row++;
+
+ lm_table.attach (lm_measure_button, 0, 2, row, row+1, xopt, (AttachOptions) 0);
+ ++row;
+ lm_table.attach (lm_results, 0, 2, row, row+1, AttachOptions(FILL|EXPAND), (AttachOptions) 0);
+ ++row;
+
+
+ preamble = manage (new Label);
+ preamble->set_width_chars (60);
+ preamble->set_line_wrap (true);
+ preamble->set_markup (_("When satisfied with the results, click the \"Use results\" button."));
+ lm_table.attach (*preamble, 0, 2, row, row+1, AttachOptions(FILL|EXPAND), (AttachOptions) 0);
+ row++;
+
+ lm_table.attach (lm_use_button, 0, 2, row, row+1, xopt, (AttachOptions) 0);
+ ++row;
+
+ lm_results.set_markup ("<i>No measurement results yet</i>");
+
+ lm_vbox.set_border_width (12);
+ lm_vbox.pack_start (lm_table, false, false);
+
+ /* pack it all up */
+
+ notebook.pages().push_back (TabElem (basic_vbox, _("Audio")));
+ notebook.pages().push_back (TabElem (midi_vbox, _("MIDI")));
+ notebook.pages().push_back (TabElem (lm_vbox, _("Latency")));
+ notebook.set_border_width (12);
+
+ notebook.set_tab_pos (POS_RIGHT);
+ notebook.show_all ();
+
+ notebook.set_name ("SettingsNotebook");
+
+ /* packup the notebook */
get_vbox()->set_border_width (12);
get_vbox()->pack_start (notebook);
+ /* need a special function to print "all available channels" when the
+ * channel counts hit zero.
+ */
+
+ input_channels.signal_output().connect (sigc::bind (sigc::ptr_fun (&EngineControl::print_channel_count), &input_channels));
+ output_channels.signal_output().connect (sigc::bind (sigc::ptr_fun (&EngineControl::print_channel_count), &output_channels));
+
control_app_button.signal_clicked().connect (mem_fun (*this, &EngineControl::control_app_button_clicked));
manage_control_app_sensitivity ();
@@ -103,12 +231,31 @@ EngineControl::EngineControl ()
XMLNode* audio_setup = ARDOUR::Config->extra_xml ("AudioMIDISetup");
- /* push a change as if we altered the backend */
+ ARDOUR::AudioEngine::instance()->Running.connect (running_connection, MISSING_INVALIDATOR, boost::bind (&EngineControl::engine_running, this), gui_context());
+ ARDOUR::AudioEngine::instance()->Stopped.connect (stopped_connection, MISSING_INVALIDATOR, boost::bind (&EngineControl::engine_stopped, this), gui_context());
+ ARDOUR::AudioEngine::instance()->Halted.connect (stopped_connection, MISSING_INVALIDATOR, boost::bind (&EngineControl::engine_stopped, this), gui_context());
+
backend_changed ();
if (audio_setup) {
set_state (*audio_setup);
- }
+ }
+
+ /* Connect to signals */
+
+ driver_combo.signal_changed().connect (sigc::mem_fun (*this, &EngineControl::driver_changed));
+ sample_rate_combo.signal_changed().connect (sigc::mem_fun (*this, &EngineControl::sample_rate_changed));
+ buffer_size_combo.signal_changed().connect (sigc::mem_fun (*this, &EngineControl::buffer_size_changed));
+ device_combo.signal_changed().connect (sigc::mem_fun (*this, &EngineControl::device_changed));
+
+ input_latency.signal_changed().connect (sigc::mem_fun (*this, &EngineControl::parameter_changed));
+ output_latency.signal_changed().connect (sigc::mem_fun (*this, &EngineControl::parameter_changed));
+ input_channels.signal_changed().connect (sigc::mem_fun (*this, &EngineControl::parameter_changed));
+ output_channels.signal_changed().connect (sigc::mem_fun (*this, &EngineControl::parameter_changed));
+
+ notebook.signal_switch_page().connect (sigc::mem_fun (*this, &EngineControl::on_switch_page));
+
+ no_push = false;
}
void
@@ -139,36 +286,58 @@ EngineControl::on_response (int response_id)
void
EngineControl::build_notebook ()
{
- using namespace Notebook_Helpers;
Label* label;
- vector<string> strings;
- int row = 0;
+ AttachOptions xopt = AttachOptions (FILL|EXPAND);
- vector<const ARDOUR::AudioBackendInfo*> backends = ARDOUR::AudioEngine::instance()->available_backends();
- for (vector<const ARDOUR::AudioBackendInfo*>::const_iterator b = backends.begin(); b != backends.end(); ++b) {
- strings.push_back ((*b)->name);
+ /* clear the table */
+
+ Gtkmm2ext::container_clear (basic_vbox);
+ Gtkmm2ext::container_clear (basic_packer);
+
+ label = manage (left_aligned_label (_("Audio System:")));
+ basic_packer.attach (*label, 0, 1, 0, 1, xopt, (AttachOptions) 0);
+ basic_packer.attach (backend_combo, 1, 2, 0, 1, xopt, (AttachOptions) 0);
+
+ if (_have_control) {
+ build_full_control_notebook ();
+ } else {
+ build_no_control_notebook ();
}
- set_popdown_strings (backend_combo, strings);
- backend_combo.set_active_text (strings.front());
+ basic_vbox.pack_start (basic_hbox, false, false);
- basic_packer.set_spacings (6);
- basic_packer.set_border_width (12);
- basic_packer.set_homogeneous (true);
+ if (_have_control) {
+ Gtk::HBox* hpacker = manage (new HBox);
+ hpacker->set_border_width (12);
+ hpacker->pack_start (control_app_button, false, false);
+ hpacker->show ();
+ control_app_button.show();
+ basic_vbox.pack_start (*hpacker);
+ }
- row = 0;
+ basic_vbox.show_all ();
+}
+
+void
+EngineControl::build_full_control_notebook ()
+{
+ boost::shared_ptr<ARDOUR::AudioBackend> backend = ARDOUR::AudioEngine::instance()->current_backend();
+ assert (backend);
+ using namespace Notebook_Helpers;
+ Label* label;
+ vector<string> strings;
AttachOptions xopt = AttachOptions (FILL|EXPAND);
+ int row = 1; // row zero == backend combo
- label = manage (left_aligned_label (_("Audio System:")));
- basic_packer.attach (*label, 0, 1, row, row + 1, xopt, (AttachOptions) 0);
- basic_packer.attach (backend_combo, 1, 2, row, row + 1, xopt, (AttachOptions) 0);
- row++;
+ /* start packing it up */
- label = manage (left_aligned_label (_("Driver:")));
- basic_packer.attach (*label, 0, 1, row, row + 1, xopt, (AttachOptions) 0);
- basic_packer.attach (driver_combo, 1, 2, row, row + 1, xopt, (AttachOptions) 0);
- row++;
+ if (backend->requires_driver_selection()) {
+ label = manage (left_aligned_label (_("Driver:")));
+ basic_packer.attach (*label, 0, 1, row, row + 1, xopt, (AttachOptions) 0);
+ basic_packer.attach (driver_combo, 1, 2, row, row + 1, xopt, (AttachOptions) 0);
+ row++;
+ }
label = manage (left_aligned_label (_("Device:")));
basic_packer.attach (*label, 0, 1, row, row + 1, xopt, (AttachOptions) 0);
@@ -236,126 +405,46 @@ EngineControl::build_notebook ()
basic_packer.attach (*label, 2, 3, row, row+1, xopt, (AttachOptions) 0);
++row;
- basic_hbox.pack_start (basic_packer, false, false);
- basic_vbox.pack_start (basic_hbox, false, false);
-
- Gtk::HBox* hpacker = manage (new HBox);
- hpacker->set_border_width (12);
- hpacker->pack_start (control_app_button, false, false);
- hpacker->show ();
- control_app_button.show();
- basic_vbox.pack_start (*hpacker);
-
- /* latency measurement tab */
-
- lm_title.set_markup (string_compose ("<span size=\"large\" weight=\"bold\">%1</span>", _("Latency Measurement Tool")));
-
- row = 0;
- lm_table.set_row_spacings (12);
-
- lm_table.attach (lm_title, 0, 2, row, row+1, xopt, (AttachOptions) 0);
- row++;
-
- Gtk::Label* preamble;
-
- preamble = manage (new Label);
- preamble->set_width_chars (60);
- preamble->set_line_wrap (true);
- preamble->set_markup (_("<span weight=\"bold\">Turn down the volume on your hardware to a very low level.</span>"));
+}
- lm_table.attach (*preamble, 0, 2, row, row+1, AttachOptions(FILL|EXPAND), (AttachOptions) 0);
- row++;
+void
+EngineControl::build_no_control_notebook ()
+{
+ boost::shared_ptr<ARDOUR::AudioBackend> backend = ARDOUR::AudioEngine::instance()->current_backend();
+ assert (backend);
- preamble = manage (new Label);
- preamble->set_width_chars (60);
- preamble->set_line_wrap (true);
- preamble->set_markup (_("Select two channels below and connect them using a cable or (less ideally) a speaker and microphone."));
+ using namespace Notebook_Helpers;
+ Label* label;
+ vector<string> strings;
+ AttachOptions xopt = AttachOptions (FILL|EXPAND);
+ int row = 1; // row zero == backend combo
+ const string msg = string_compose (_("The %1 audio backend was configured and started externally.\nThis limits your control over it."), backend->name());
- lm_table.attach (*preamble, 0, 2, row, row+1, AttachOptions(FILL|EXPAND), (AttachOptions) 0);
+ label = manage (new Label);
+ label->set_markup (string_compose ("<span weight=\"bold\" foreground=\"red\">%1</span>", msg));
+ basic_packer.attach (*label, 0, 2, row, row + 1, xopt, (AttachOptions) 0);
row++;
- label = manage (new Label (_("Output channel")));
- lm_table.attach (*label, 0, 1, row, row+1, xopt, (AttachOptions) 0);
-
- Gtk::Alignment* misc_align = manage (new Alignment (0.0, 0.5));
- misc_align->add (lm_output_channel_combo);
- lm_table.attach (*misc_align, 1, 2, row, row+1, xopt, (AttachOptions) 0);
- ++row;
-
- label = manage (new Label (_("Input channel")));
- lm_table.attach (*label, 0, 1, row, row+1, xopt, (AttachOptions) 0);
-
- misc_align = manage (new Alignment (0.0, 0.5));
- misc_align->add (lm_input_channel_combo);
- lm_table.attach (*misc_align, 1, 2, row, row+1, FILL, (AttachOptions) 0);
- ++row;
-
- xopt = AttachOptions(0);
-
- lm_measure_button.add (lm_start_stop_label);
-
- lm_measure_button.signal_toggled().connect (sigc::mem_fun (*this, &EngineControl::latency_button_toggled));
- lm_use_button.signal_clicked().connect (sigc::mem_fun (*this, &EngineControl::use_latency_button_clicked));
- lm_use_button.set_sensitive (false);
-
-
- preamble = manage (new Label);
- preamble->set_width_chars (60);
- preamble->set_line_wrap (true);
- preamble->set_markup (_("Once the channels are connected, click the \"Measure latency\" button."));
- lm_table.attach (*preamble, 0, 2, row, row+1, AttachOptions(FILL|EXPAND), (AttachOptions) 0);
- row++;
+ if (backend->can_change_sample_rate_when_running()) {
+ label = manage (left_aligned_label (_("Sample rate:")));
+ basic_packer.attach (*label, 0, 1, row, row + 1, xopt, (AttachOptions) 0);
+ basic_packer.attach (sample_rate_combo, 1, 2, row, row + 1, xopt, (AttachOptions) 0);
+ row++;
+ }
- lm_table.attach (lm_measure_button, 0, 2, row, row+1, xopt, (AttachOptions) 0);
- ++row;
- lm_table.attach (lm_results, 0, 2, row, row+1, AttachOptions(FILL|EXPAND), (AttachOptions) 0);
- ++row;
+ if (backend->can_change_buffer_size_when_running()) {
+ label = manage (left_aligned_label (_("Buffer size:")));
+ basic_packer.attach (*label, 0, 1, row, row + 1, xopt, (AttachOptions) 0);
+ basic_packer.attach (buffer_size_combo, 1, 2, row, row + 1, xopt, (AttachOptions) 0);
+ buffer_size_duration_label.set_alignment (0.0); /* left-align */
+ basic_packer.attach (buffer_size_duration_label, 2, 3, row, row+1, xopt, (AttachOptions) 0);
+ row++;
+ }
+ connect_disconnect_button.signal_clicked().connect (sigc::mem_fun (*this, &EngineControl::connect_disconnect_click));
- preamble = manage (new Label);
- preamble->set_width_chars (60);
- preamble->set_line_wrap (true);
- preamble->set_markup (_("When satisfied with the results, click the \"Use results\" button."));
- lm_table.attach (*preamble, 0, 2, row, row+1, AttachOptions(FILL|EXPAND), (AttachOptions) 0);
+ basic_packer.attach (connect_disconnect_button, 0, 2, row, row+1, FILL, AttachOptions (0));
row++;
-
- lm_table.attach (lm_use_button, 0, 2, row, row+1, xopt, (AttachOptions) 0);
- ++row;
-
- lm_results.set_markup ("<i>No measurement results yet</i>");
-
- lm_vbox.set_border_width (12);
- lm_vbox.pack_start (lm_table, false, false);
-
- /* pack it all up */
-
- notebook.pages().push_back (TabElem (basic_vbox, _("Audio")));
- notebook.pages().push_back (TabElem (midi_vbox, _("MIDI")));
- notebook.pages().push_back (TabElem (lm_vbox, _("Latency")));
- notebook.set_border_width (12);
-
- notebook.set_tab_pos (POS_RIGHT);
- notebook.show_all ();
-
- notebook.set_name ("SettingsNotebook");
-
- /* Connect to signals */
-
- backend_combo.signal_changed().connect (sigc::mem_fun (*this, &EngineControl::backend_changed));
- driver_combo.signal_changed().connect (sigc::mem_fun (*this, &EngineControl::driver_changed));
- sample_rate_combo.signal_changed().connect (sigc::mem_fun (*this, &EngineControl::sample_rate_changed));
- buffer_size_combo.signal_changed().connect (sigc::mem_fun (*this, &EngineControl::buffer_size_changed));
- device_combo.signal_changed().connect (sigc::mem_fun (*this, &EngineControl::device_changed));
-
- input_latency.signal_changed().connect (sigc::mem_fun (*this, &EngineControl::parameter_changed));
- output_latency.signal_changed().connect (sigc::mem_fun (*this, &EngineControl::parameter_changed));
- input_channels.signal_changed().connect (sigc::mem_fun (*this, &EngineControl::parameter_changed));
- output_channels.signal_changed().connect (sigc::mem_fun (*this, &EngineControl::parameter_changed));
-
- input_channels.signal_output().connect (sigc::bind (sigc::ptr_fun (&EngineControl::print_channel_count), &input_channels));
- output_channels.signal_output().connect (sigc::bind (sigc::ptr_fun (&EngineControl::print_channel_count), &output_channels));
-
- notebook.signal_switch_page().connect (sigc::mem_fun (*this, &EngineControl::on_switch_page));
}
EngineControl::~EngineControl ()
@@ -471,6 +560,11 @@ EngineControl::refresh_midi_display ()
}
void
+EngineControl::update_sensitivity ()
+{
+}
+
+void
EngineControl::backend_changed ()
{
if (ignore_changes) {
@@ -485,16 +579,29 @@ EngineControl::backend_changed ()
return;
}
+ _have_control = ARDOUR::AudioEngine::instance()->setup_required ();
+
+ build_notebook ();
setup_midi_tab_for_backend ();
if (backend->requires_driver_selection()) {
vector<string> drivers = backend->enumerate_drivers();
- driver_combo.set_sensitive (true);
- set_popdown_strings (driver_combo, drivers);
- driver_combo.set_active_text (drivers.front());
- driver_changed ();
+
+ if (!drivers.empty()) {
+ {
+ PBD::Unwinder<uint32_t> protect_ignore_changes (ignore_changes, ignore_changes + 1);
+ set_popdown_strings (driver_combo, drivers);
+ driver_combo.set_active_text (drivers.front());
+ }
+
+ driver_changed ();
+ }
+
} else {
driver_combo.set_sensitive (false);
+ /* this will change the device text which will cause a call to
+ * device changed which will set up parameters
+ */
list_devices ();
}
@@ -540,33 +647,33 @@ EngineControl::list_devices ()
available_devices.push_back (i->name);
}
- ignore_changes++;
- set_popdown_strings (device_combo, available_devices);
- ignore_changes--;
-
if (!available_devices.empty()) {
- sample_rate_combo.set_sensitive (true);
- buffer_size_combo.set_sensitive (true);
- input_latency.set_sensitive (true);
- output_latency.set_sensitive (true);
- input_channels.set_sensitive (true);
- output_channels.set_sensitive (true);
+
+ update_sensitivity ();
- /* changing the text in the combo will trigger device_changed()
- which should populate the parameter controls
- */
-
- device_combo.set_active_text (available_devices.front());
+ {
+ PBD::Unwinder<uint32_t> protect_ignore_changes (ignore_changes, ignore_changes + 1);
+ set_popdown_strings (device_combo, available_devices);
+ device_combo.set_active_text (available_devices.front());
+ }
+
+ device_changed ();
+
+ ok_button->set_sensitive (true);
+ apply_button->set_sensitive (true);
+
} else {
- sample_rate_combo.set_sensitive (true);
- buffer_size_combo.set_sensitive (true);
- input_latency.set_sensitive (true);
- output_latency.set_sensitive (true);
- input_channels.set_sensitive (true);
- output_channels.set_sensitive (true);
+ sample_rate_combo.set_sensitive (false);
+ buffer_size_combo.set_sensitive (false);
+ input_latency.set_sensitive (false);
+ output_latency.set_sensitive (false);
+ input_channels.set_sensitive (false);
+ output_channels.set_sensitive (false);
+ ok_button->set_sensitive (false);
+ apply_button->set_sensitive (false);
}
}
-
+
void
EngineControl::driver_changed ()
{
@@ -595,59 +702,95 @@ EngineControl::device_changed ()
string device_name = device_combo.get_active_text ();
vector<string> s;
- /* don't allow programmatic change to sample_rate_combo to cause a
- recursive call to this method.
- */
-
- ignore_changes++;
+ {
+ PBD::Unwinder<uint32_t> protect_ignore_changes (ignore_changes, ignore_changes + 1);
- /* sample rates */
-
- string desired;
+ /* don't allow programmatic change to combos to cause a
+ recursive call to this method.
+ */
+
+ /* sample rates */
+
+ string desired;
+
+ vector<float> sr;
- vector<float> sr = backend->available_sample_rates (device_name);
- for (vector<float>::const_iterator x = sr.begin(); x != sr.end(); ++x) {
- s.push_back (rate_as_string (*x));
- if (*x == _desired_sample_rate) {
- desired = s.back();
+ if (_have_control) {
+ sr = backend->available_sample_rates (device_name);
+ } else {
+
+ sr.push_back (8000.0f);
+ sr.push_back (16000.0f);
+ sr.push_back (32000.0f);
+ sr.push_back (44100.0f);
+ sr.push_back (48000.0f);
+ sr.push_back (88200.0f);
+ sr.push_back (96000.0f);
+ sr.push_back (192000.0f);
+ sr.push_back (384000.0f);
}
- }
- if (!s.empty()) {
- set_popdown_strings (sample_rate_combo, s);
-
- if (desired.empty()) {
- sample_rate_combo.set_active_text (s.front());
+ for (vector<float>::const_iterator x = sr.begin(); x != sr.end(); ++x) {
+ s.push_back (rate_as_string (*x));
+ if (*x == _desired_sample_rate) {
+ desired = s.back();
+ }
+ }
+
+ if (!s.empty()) {
+ sample_rate_combo.set_sensitive (true);
+ set_popdown_strings (sample_rate_combo, s);
+
+ if (desired.empty()) {
+ sample_rate_combo.set_active_text (s.front());
+ } else {
+ sample_rate_combo.set_active_text (desired);
+ }
+
} else {
- sample_rate_combo.set_active_text (desired);
+ sample_rate_combo.set_sensitive (false);
}
- } else {
- /* hmm ... how to tell the user about the fact that we have no
- * available sample rates.
- */
- }
-
- vector<uint32_t> bs = backend->available_buffer_sizes(device_name);
- s.clear ();
- for (vector<uint32_t>::const_iterator x = bs.begin(); x != bs.end(); ++x) {
- s.push_back (bufsize_as_string (*x));
- }
+ /* buffer sizes */
+
+ vector<uint32_t> bs;
+
+ if (_have_control) {
+ bs = backend->available_buffer_sizes(device_name);
+ } else if (backend->can_change_buffer_size_when_running()) {
+ bs.push_back (8);
+ bs.push_back (16);
+ bs.push_back (32);
+ bs.push_back (64);
+ bs.push_back (128);
+ bs.push_back (256);
+ bs.push_back (512);
+ bs.push_back (1024);
+ bs.push_back (2048);
+ bs.push_back (4096);
+ bs.push_back (8192);
+ }
+ s.clear ();
+ for (vector<uint32_t>::const_iterator x = bs.begin(); x != bs.end(); ++x) {
+ s.push_back (bufsize_as_string (*x));
+ }
+
+ if (!s.empty()) {
+ buffer_size_combo.set_sensitive (true);
+ set_popdown_strings (buffer_size_combo, s);
+
+ buffer_size_combo.set_active_text (s.front());
+ show_buffer_duration ();
+ } else {
+ buffer_size_combo.set_sensitive (false);
+ }
- if (!s.empty()) {
- set_popdown_strings (buffer_size_combo, s);
- buffer_size_combo.set_active_text (s.front());
- show_buffer_duration ();
- } else {
- /* hmm ... how to tell the user about the fact that we have no
- * available buffer sizes.
+ /* XXX theoretically need to set min + max channel counts here
*/
+
+ manage_control_app_sensitivity ();
}
- manage_control_app_sensitivity ();
-
- ignore_changes--;
-
/* pick up any saved state for this device */
maybe_display_saved_state ();
@@ -658,18 +801,6 @@ EngineControl::device_changed ()
}
string
-EngineControl::rate_as_string (float r)
-{
- char buf[32];
- if (fmod (r, 1000.0f)) {
- snprintf (buf, sizeof (buf), "%.1f kHz", r/1000.0);
- } else {
- snprintf (buf, sizeof (buf), "%.0f kHz", r/1000.0);
- }
- return buf;
-}
-
-string
EngineControl::bufsize_as_string (uint32_t sz)
{
/* Translators: "samples" is always plural here, so no
@@ -774,6 +905,10 @@ EngineControl::get_saved_state_for_currently_displayed_backend_and_device ()
EngineControl::State*
EngineControl::save_state ()
{
+ if (!_have_control) {
+ return 0;
+ }
+
bool existing = true;
State* state = get_saved_state_for_currently_displayed_backend_and_device ();
@@ -808,10 +943,15 @@ EngineControl::store_state (State& state)
void
EngineControl::maybe_display_saved_state ()
{
+ if (!_have_control) {
+ return;
+ }
+
State* state = get_saved_state_for_currently_displayed_backend_and_device ();
if (state) {
- ignore_changes++;
+ PBD::Unwinder<uint32_t> protect_ignore_changes (ignore_changes, ignore_changes + 1);
+
if (!_desired_sample_rate) {
sample_rate_combo.set_active_text (rate_as_string (state->sample_rate));
}
@@ -822,7 +962,6 @@ EngineControl::maybe_display_saved_state ()
show_buffer_duration ();
input_latency.set_value (state->input_latency);
output_latency.set_value (state->output_latency);
- ignore_changes--;
}
}
@@ -952,6 +1091,7 @@ EngineControl::set_state (const XMLNode& root)
/* now see if there was an active state and switch the setup to it */
for (StateList::const_iterator i = states.begin(); i != states.end(); ++i) {
+
if ((*i).active) {
ignore_changes++;
backend_combo.set_active_text ((*i).backend);
@@ -971,6 +1111,10 @@ EngineControl::set_state (const XMLNode& root)
int
EngineControl::push_state_to_backend (bool start)
{
+ if (no_push) {
+ return 0;
+ }
+
boost::shared_ptr<ARDOUR::AudioBackend> backend = ARDOUR::AudioEngine::instance()->current_backend();
if (!backend) {
@@ -992,47 +1136,60 @@ EngineControl::push_state_to_backend (bool start)
uint32_t ichan = get_input_channels ();
if (_have_control) {
-
- /* we can control the backend */
- if (backend->requires_driver_selection()) {
- if (get_driver() != backend->driver_name()) {
- change_driver = true;
+ if (started_at_least_once) {
+
+ /* we can control the backend */
+
+ if (backend->requires_driver_selection()) {
+ if (get_driver() != backend->driver_name()) {
+ change_driver = true;
+ }
}
- }
+
+ if (get_device_name() != backend->device_name()) {
+ change_device = true;
+ }
+
+ if (get_rate() != backend->sample_rate()) {
+ change_rate = true;
+ }
+
+ if (get_buffer_size() != backend->buffer_size()) {
+ change_bufsize = true;
+ }
+
+ /* zero-requested channels means "all available" */
- if (get_device_name() != backend->device_name()) {
- change_device = true;
- }
+ if (ichan == 0) {
+ ichan = backend->input_channels();
+ }
+
+ if (ochan == 0) {
+ ochan = backend->output_channels();
+ }
+
+ if (ichan != backend->input_channels()) {
+ change_channels = true;
+ }
+
+ if (ochan != backend->output_channels()) {
+ change_channels = true;
+ }
- if (get_rate() != backend->sample_rate()) {
+ if (get_input_latency() != backend->systemic_input_latency() ||
+ get_output_latency() != backend->systemic_output_latency()) {
+ change_latency = true;
+ }
+ } else {
+ /* backend never started, so we have to force a group
+ of settings.
+ */
+ change_driver = true;
+ change_device = true;
change_rate = true;
- }
-
- if (get_buffer_size() != backend->buffer_size()) {
change_bufsize = true;
- }
-
- /* zero-requested channels means "all available" */
-
- if (ichan == 0) {
- ichan = backend->input_channels();
- }
-
- if (ochan == 0) {
- ochan = backend->output_channels();
- }
-
- if (ichan != backend->input_channels()) {
change_channels = true;
- }
-
- if (ochan != backend->output_channels()) {
- change_channels = true;
- }
-
- if (get_input_latency() != backend->systemic_input_latency() ||
- get_output_latency() != backend->systemic_output_latency()) {
change_latency = true;
}
@@ -1175,26 +1332,28 @@ EngineControl::post_push ()
* necessary
*/
- State* state = get_saved_state_for_currently_displayed_backend_and_device ();
-
- if (!state) {
- state = save_state ();
- assert (state);
- }
-
- /* all off */
-
- for (StateList::iterator i = states.begin(); i != states.end(); ++i) {
- (*i).active = false;
+ if (_have_control) {
+ State* state = get_saved_state_for_currently_displayed_backend_and_device ();
+
+ if (!state) {
+ state = save_state ();
+ assert (state);
+ }
+
+ /* all off */
+
+ for (StateList::iterator i = states.begin(); i != states.end(); ++i) {
+ (*i).active = false;
+ }
+
+ /* mark this one active (to be used next time the dialog is
+ * shown)
+ */
+
+ state->active = true;
+
+ manage_control_app_sensitivity ();
}
-
- /* mark this one active (to be used next time the dialog is
- * shown)
- */
-
- state->active = true;
-
- manage_control_app_sensitivity ();
/* schedule a redisplay of MIDI ports */
@@ -1482,3 +1641,42 @@ EngineControl::on_delete_event (GdkEventAny* ev)
return ArdourDialog::on_delete_event (ev);
}
+void
+EngineControl::engine_running ()
+{
+ boost::shared_ptr<ARDOUR::AudioBackend> backend = ARDOUR::AudioEngine::instance()->current_backend();
+ assert (backend);
+
+ buffer_size_combo.set_active_text (bufsize_as_string (backend->buffer_size()));
+ sample_rate_combo.set_active_text (rate_as_string (backend->sample_rate()));
+
+ buffer_size_combo.set_sensitive (true);
+ sample_rate_combo.set_sensitive (true);
+
+ connect_disconnect_button.set_label (string_compose (_("Disconnect from %1"), backend->name()));
+
+ started_at_least_once = true;
+}
+
+void
+EngineControl::engine_stopped ()
+{
+ boost::shared_ptr<ARDOUR::AudioBackend> backend = ARDOUR::AudioEngine::instance()->current_backend();
+ assert (backend);
+
+ buffer_size_combo.set_sensitive (false);
+ connect_disconnect_button.set_label (string_compose (_("Connect to %1"), backend->name()));
+
+ sample_rate_combo.set_sensitive (true);
+ buffer_size_combo.set_sensitive (true);
+}
+
+void
+EngineControl::connect_disconnect_click()
+{
+ if (ARDOUR::AudioEngine::instance()->running()) {
+ ARDOUR_UI::instance()->disconnect_from_engine ();
+ } else {
+ ARDOUR_UI::instance()->reconnect_to_engine ();
+ }
+}
diff --git a/gtk2_ardour/engine_dialog.h b/gtk2_ardour/engine_dialog.h
index fcbdfe4cb8..ac17814a5f 100644
--- a/gtk2_ardour/engine_dialog.h
+++ b/gtk2_ardour/engine_dialog.h
@@ -75,8 +75,11 @@ class EngineControl : public ArdourDialog, public PBD::ScopedConnectionList {
Gtk::Adjustment ports_adjustment;
Gtk::SpinButton ports_spinner;
+ Gtk::Label have_control_text;
Gtk::Button control_app_button;
+ Gtk::Button connect_disconnect_button;
+
/* latency measurement */
Gtk::ComboBoxText lm_output_channel_combo;
@@ -106,9 +109,9 @@ class EngineControl : public ArdourDialog, public PBD::ScopedConnectionList {
uint32_t ignore_changes;
uint32_t _desired_sample_rate;
-
- static bool engine_running ();
-
+ bool no_push;
+ bool started_at_least_once;
+
void driver_changed ();
void backend_changed ();
void sample_rate_changed ();
@@ -119,7 +122,6 @@ class EngineControl : public ArdourDialog, public PBD::ScopedConnectionList {
void setup_midi_tab_for_jack ();
void refresh_midi_display ();
- std::string rate_as_string (float);
std::string bufsize_as_string (uint32_t);
float get_rate() const;
@@ -174,6 +176,8 @@ class EngineControl : public ArdourDialog, public PBD::ScopedConnectionList {
static bool print_channel_count (Gtk::SpinButton*);
void build_notebook ();
+ void build_full_control_notebook ();
+ void build_no_control_notebook ();
void on_response (int);
void control_app_button_clicked ();
@@ -181,6 +185,7 @@ class EngineControl : public ArdourDialog, public PBD::ScopedConnectionList {
void manage_control_app_sensitivity ();
int push_state_to_backend (bool start);
void post_push ();
+ void update_sensitivity ();
/* latency measurement */
void latency_button_toggled ();
@@ -190,9 +195,16 @@ class EngineControl : public ArdourDialog, public PBD::ScopedConnectionList {
void disable_latency_tab ();
void start_latency_detection ();
void end_latency_detection ();
-
+
void on_switch_page (GtkNotebookPage*, guint page_num);
bool on_delete_event (GdkEventAny*);
+
+ void engine_running ();
+ void engine_stopped ();
+ PBD::ScopedConnection running_connection;
+ PBD::ScopedConnection stopped_connection;
+
+ void connect_disconnect_click ();
};
#endif /* __gtk2_ardour_engine_dialog_h__ */
diff --git a/gtk2_ardour/export_video_dialog.cc b/gtk2_ardour/export_video_dialog.cc
index 7f6fcc2a8a..b3a97f20b9 100644
--- a/gtk2_ardour/export_video_dialog.cc
+++ b/gtk2_ardour/export_video_dialog.cc
@@ -28,7 +28,6 @@
#include <fcntl.h>
#include <sigc++/bind.h>
-#include <libgen.h>
#include <glib/gstdio.h>
diff --git a/gtk2_ardour/gtk_pianokeyboard.c b/gtk2_ardour/gtk_pianokeyboard.c
index 1e5768040e..f3897e3d44 100644
--- a/gtk2_ardour/gtk_pianokeyboard.c
+++ b/gtk2_ardour/gtk_pianokeyboard.c
@@ -33,9 +33,9 @@
#include <assert.h>
#include <string.h>
-#include <strings.h>
#include <stdint.h>
#include <cairo/cairo.h>
+
#include <gtk/gtk.h>
#include <gdk/gdkkeysyms.h>
@@ -732,13 +732,13 @@ piano_keyboard_set_keyboard_layout(PianoKeyboard *pk, const char *layout)
{
assert(layout);
- if (!strcasecmp(layout, "QWERTY")) {
+ if (!g_strcasecmp(layout, "QWERTY")) {
bind_keys_qwerty(pk);
- } else if (!strcasecmp(layout, "QWERTZ")) {
+ } else if (!g_strcasecmp(layout, "QWERTZ")) {
bind_keys_qwertz(pk);
- } else if (!strcasecmp(layout, "AZERTY")) {
+ } else if (!g_strcasecmp(layout, "AZERTY")) {
bind_keys_azerty(pk);
} else {
diff --git a/gtk2_ardour/keyeditor.cc b/gtk2_ardour/keyeditor.cc
index 07042a1cdf..f23e246958 100644
--- a/gtk2_ardour/keyeditor.cc
+++ b/gtk2_ardour/keyeditor.cc
@@ -250,8 +250,6 @@ KeyEditor::populate ()
//kinda kludgy way to avoid displaying menu items as mappable
if ( parts[1] == _("Main_menu") )
continue;
- if ( parts[1] == _("JACK") )
- continue;
if ( parts[1] == _("redirectmenu") )
continue;
if ( parts[1] == _("Editor_menus") )
diff --git a/gtk2_ardour/main.cc b/gtk2_ardour/main.cc
index f55405a84d..da2677b296 100644
--- a/gtk2_ardour/main.cc
+++ b/gtk2_ardour/main.cc
@@ -37,8 +37,6 @@
#include "pbd/boost_debug.h"
#endif
-#include <jack/jack.h>
-
#include "ardour/revision.h"
#include "ardour/version.h"
#include "ardour/ardour.h"
@@ -81,17 +79,10 @@ static const char* localedir = LOCALEDIR;
void
gui_jack_error ()
{
- MessageDialog win (string_compose (_("%1 could not connect to JACK."), PROGRAM_NAME),
+ MessageDialog win (string_compose (_("%1 could not connect to the audio backend."), PROGRAM_NAME),
false,
Gtk::MESSAGE_INFO,
Gtk::BUTTONS_NONE);
- win.set_secondary_text(string_compose (_("There are several possible reasons:\n\
-\n\
-1) JACK is not running.\n\
-2) JACK is running as another user, perhaps root.\n\
-3) There is already another client called \"%1\".\n\
-\n\
-Please consider the possibilities, and perhaps (re)start JACK."), PROGRAM_NAME));
win.add_button (Stock::QUIT, RESPONSE_CLOSE);
win.set_default_response (RESPONSE_CLOSE);
@@ -530,6 +521,7 @@ int main (int argc, char *argv[])
ui->run (text_receiver);
Gtkmm2ext::Application::instance()->cleanup();
+ delete ui;
ui = 0;
ARDOUR::cleanup ();
diff --git a/gtk2_ardour/mixer_strip.cc b/gtk2_ardour/mixer_strip.cc
index 9e2140fd10..a8ec7d5c79 100644
--- a/gtk2_ardour/mixer_strip.cc
+++ b/gtk2_ardour/mixer_strip.cc
@@ -698,7 +698,7 @@ MixerStrip::output_press (GdkEventButton *ev)
{
using namespace Menu_Helpers;
if (!_session->engine().connected()) {
- MessageDialog msg (_("Not connected to JACK - no I/O changes are possible"));
+ MessageDialog msg (_("Not connected to audio engine - no I/O changes are possible"));
msg.run ();
return true;
}
@@ -826,7 +826,7 @@ MixerStrip::input_press (GdkEventButton *ev)
citems.clear();
if (!_session->engine().connected()) {
- MessageDialog msg (_("Not connected to JACK - no I/O changes are possible"));
+ MessageDialog msg (_("Not connected to audio engine - no I/O changes are possible"));
msg.run ();
return true;
}
diff --git a/gtk2_ardour/plugin_selector.cc b/gtk2_ardour/plugin_selector.cc
index 2a031318ff..9c03bd5c48 100644
--- a/gtk2_ardour/plugin_selector.cc
+++ b/gtk2_ardour/plugin_selector.cc
@@ -537,13 +537,13 @@ struct PluginMenuCompareByCreator {
bool operator() (PluginInfoPtr a, PluginInfoPtr b) const {
int cmp;
- cmp = strcasecmp (a->creator.c_str(), b->creator.c_str());
+ cmp = g_strcasecmp (a->creator.c_str(), b->creator.c_str());
if (cmp < 0) {
return true;
} else if (cmp == 0) {
/* same creator ... compare names */
- if (strcasecmp (a->name.c_str(), b->name.c_str()) < 0) {
+ if (g_strcasecmp (a->name.c_str(), b->name.c_str()) < 0) {
return true;
}
}
@@ -555,7 +555,7 @@ struct PluginMenuCompareByName {
bool operator() (PluginInfoPtr a, PluginInfoPtr b) const {
int cmp;
- cmp = strcasecmp (a->name.c_str(), b->name.c_str());
+ cmp = g_strcasecmp (a->name.c_str(), b->name.c_str());
if (cmp < 0) {
return true;
@@ -573,13 +573,13 @@ struct PluginMenuCompareByCategory {
bool operator() (PluginInfoPtr a, PluginInfoPtr b) const {
int cmp;
- cmp = strcasecmp (a->category.c_str(), b->category.c_str());
+ cmp = g_strcasecmp (a->category.c_str(), b->category.c_str());
if (cmp < 0) {
return true;
} else if (cmp == 0) {
/* same category ... compare names */
- if (strcasecmp (a->name.c_str(), b->name.c_str()) < 0) {
+ if (g_strcasecmp (a->name.c_str(), b->name.c_str()) < 0) {
return true;
}
}
diff --git a/gtk2_ardour/po/de.po b/gtk2_ardour/po/de.po
index 74288bde3f..5817ab3878 100644
--- a/gtk2_ardour/po/de.po
+++ b/gtk2_ardour/po/de.po
@@ -8,8 +8,8 @@ msgid ""
msgstr ""
"Project-Id-Version: gtk-ardour 0.347.2\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2013-09-03 10:44+0200\n"
-"PO-Revision-Date: 2013-09-03 11:41+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"
@@ -448,8 +448,8 @@ msgstr "Audiobusse"
msgid "Add:"
msgstr "Erstelle:"
-#: add_route_dialog.cc:114 startup.cc:841 time_fx_dialog.cc:91
-#: add_video_dialog.cc:150 video_server_dialog.cc:112
+#: add_route_dialog.cc:114 time_fx_dialog.cc:91 add_video_dialog.cc:150
+#: video_server_dialog.cc:112
msgid "<b>Options</b>"
msgstr "<b>Optionen</b>"
@@ -463,21 +463,22 @@ msgid "Group:"
msgstr "Gruppe:"
#: add_route_dialog.cc:215 add_route_dialog.cc:224 add_route_dialog.cc:298
-#: rc_option_editor.cc:1456 rc_option_editor.cc:1458 rc_option_editor.cc:1460
-#: rc_option_editor.cc:1478 rc_option_editor.cc:1480 rc_option_editor.cc:1488
-#: rc_option_editor.cc:1490 rc_option_editor.cc:1508 rc_option_editor.cc:1521
-#: rc_option_editor.cc:1523 rc_option_editor.cc:1525 rc_option_editor.cc:1556
-#: rc_option_editor.cc:1558 rc_option_editor.cc:1560 rc_option_editor.cc:1568
-#: rc_option_editor.cc:1576 rc_option_editor.cc:1584
+#: ardour_ui_ed.cc:476 engine_dialog.cc:201 rc_option_editor.cc:1454
+#: rc_option_editor.cc:1456 rc_option_editor.cc:1458 rc_option_editor.cc:1474
+#: rc_option_editor.cc:1476 rc_option_editor.cc:1484 rc_option_editor.cc:1486
+#: rc_option_editor.cc:1504 rc_option_editor.cc:1517 rc_option_editor.cc:1519
+#: rc_option_editor.cc:1521 rc_option_editor.cc:1552 rc_option_editor.cc:1554
+#: rc_option_editor.cc:1556 rc_option_editor.cc:1564 rc_option_editor.cc:1572
+#: rc_option_editor.cc:1580
msgid "Audio"
msgstr "Audio"
#: add_route_dialog.cc:216 add_route_dialog.cc:227 add_route_dialog.cc:299
-#: editor_actions.cc:105 missing_file_dialog.cc:55 rc_option_editor.cc:1707
-#: rc_option_editor.cc:1715 rc_option_editor.cc:1723 rc_option_editor.cc:1732
-#: rc_option_editor.cc:1740 rc_option_editor.cc:1748 rc_option_editor.cc:1756
-#: rc_option_editor.cc:1765 rc_option_editor.cc:1774 rc_option_editor.cc:1783
-#: rc_option_editor.cc:1791 rc_option_editor.cc:1799
+#: editor_actions.cc:105 engine_dialog.cc:202 missing_file_dialog.cc:55
+#: rc_option_editor.cc:1703 rc_option_editor.cc:1711 rc_option_editor.cc:1719
+#: rc_option_editor.cc:1728 rc_option_editor.cc:1736 rc_option_editor.cc:1744
+#: rc_option_editor.cc:1752 rc_option_editor.cc:1761 rc_option_editor.cc:1770
+#: rc_option_editor.cc:1779 rc_option_editor.cc:1787 rc_option_editor.cc:1795
msgid "MIDI"
msgstr "MIDI"
@@ -626,7 +627,7 @@ msgstr "Normalisieren"
msgid "FFT analysis window"
msgstr "FFT-Analysefenster"
-#: analysis_window.cc:60 editor.cc:1856
+#: analysis_window.cc:60 editor.cc:1857
msgid "Spectral Analysis"
msgstr "FFT-Analyse"
@@ -650,50 +651,54 @@ msgstr ""
"Schaltfläche kann den Status des nichtexistenten Kontrollzieles nicht "
"verfolgen\n"
-#: ardour_ui.cc:180
+#: ardour_ui.cc:179
msgid "audition"
msgstr "Vorhören"
-#: ardour_ui.cc:181
+#: ardour_ui.cc:180
msgid "solo"
msgstr "Solo"
-#: ardour_ui.cc:182
+#: ardour_ui.cc:181
msgid "feedback"
msgstr "Feedback"
-#: ardour_ui.cc:187 speaker_dialog.cc:36
+#: ardour_ui.cc:186 speaker_dialog.cc:36
msgid "Speaker Configuration"
msgstr "Lautsprechereinstellung"
-#: ardour_ui.cc:188 theme_manager.cc:56 theme_manager.cc:64
+#: ardour_ui.cc:187 theme_manager.cc:56 theme_manager.cc:64
msgid "Theme Manager"
msgstr "Thema"
-#: ardour_ui.cc:189 keyeditor.cc:53
+#: ardour_ui.cc:188 keyeditor.cc:53
msgid "Key Bindings"
msgstr "Tastenkombinationen"
-#: ardour_ui.cc:190
+#: ardour_ui.cc:189
msgid "Preferences"
msgstr "Globale Einstellungen"
-#: ardour_ui.cc:191 ardour_ui.cc:196
+#: ardour_ui.cc:190 ardour_ui.cc:196
msgid "Add Tracks/Busses"
msgstr "Spuren/Busse hinzufügen"
-#: ardour_ui.cc:192
+#: ardour_ui.cc:191
msgid "About"
msgstr "Ãœber..."
-#: ardour_ui.cc:193 location_ui.cc:1146
+#: ardour_ui.cc:192 location_ui.cc:1146
msgid "Locations"
msgstr "Positionen"
-#: ardour_ui.cc:194 route_params_ui.cc:58 route_params_ui.cc:606
+#: ardour_ui.cc:193 route_params_ui.cc:58 route_params_ui.cc:606
msgid "Tracks and Busses"
msgstr "Spuren/Busse"
+#: ardour_ui.cc:194 engine_dialog.cc:61
+msgid "Audio/MIDI Setup"
+msgstr "Audio/MIDI Einstellungen"
+
#: ardour_ui.cc:195
msgid "Properties"
msgstr "Projekteinstellungen"
@@ -718,15 +723,33 @@ msgstr "MIDI-Verbindungen"
msgid "Errors"
msgstr "Fehlermeldungen"
-#: ardour_ui.cc:388
-msgid "Starting audio engine"
-msgstr "Starte Audio-Engine"
+#: ardour_ui.cc:438
+msgid ""
+"The audio backend was shutdown because:\n"
+"\n"
+"%1"
+msgstr ""
+"Das Audiobackend wurde aus folgendem Grund beendet:\n"
+"\n"
+"%1"
-#: ardour_ui.cc:758 startup.cc:638
+#: ardour_ui.cc:440
+msgid ""
+"`The audio backend has either been shutdown or it\n"
+"disconnected %1 because %1\n"
+"was not fast enough. Try to restart\n"
+"the audio backend and save the session."
+msgstr ""
+"Das Audiobackend wurde entweder beendet oder von\n"
+"%1 getrennt, weil %1 nicht schnell genug\n"
+"war. Sie sollten versuchen, das Audiobackend \n"
+"neu zu starten und das Projekt zu speichern."
+
+#: ardour_ui.cc:818 startup.cc:378
msgid "%1 is ready for use"
msgstr "%1 ist bereit"
-#: ardour_ui.cc:806
+#: ardour_ui.cc:866
msgid ""
"WARNING: Your system has a limit for maximum amount of locked memory. This "
"might cause %1 to run out of memory before your system runs out of memory. \n"
@@ -741,23 +764,23 @@ msgstr ""
"Sie können die Speicherbegrenzung mit 'ulimit -l' einsehen und normalerweise "
"in %2 verändern."
-#: ardour_ui.cc:823
+#: ardour_ui.cc:883
msgid "Do not show this window again"
msgstr "Diese Meldung nicht erneut anzeigen"
-#: ardour_ui.cc:865
+#: ardour_ui.cc:925
msgid "Don't quit"
msgstr "Abbrechen"
-#: ardour_ui.cc:866
+#: ardour_ui.cc:926
msgid "Just quit"
msgstr "Beenden ohne zu speichern"
-#: ardour_ui.cc:867
+#: ardour_ui.cc:927
msgid "Save and quit"
msgstr "Speichern und beenden"
-#: ardour_ui.cc:877
+#: ardour_ui.cc:937
msgid ""
"%1 was unable to save your session.\n"
"\n"
@@ -771,15 +794,15 @@ msgstr ""
"\n"
"\"Trotzdem beenden\"."
-#: ardour_ui.cc:908
+#: ardour_ui.cc:968
msgid "Please wait while %1 cleans up..."
msgstr "Bitte warten Sie, während %1 aufräumt."
-#: ardour_ui.cc:925
+#: ardour_ui.cc:986
msgid "Unsaved Session"
msgstr "Nicht gespeichertes Projekt"
-#: ardour_ui.cc:946
+#: ardour_ui.cc:1007
msgid ""
"The session \"%1\"\n"
"has not been saved.\n"
@@ -797,7 +820,7 @@ msgstr ""
"\n"
"Wie wollen Sie vorgehen?"
-#: ardour_ui.cc:949
+#: ardour_ui.cc:1010
msgid ""
"The snapshot \"%1\"\n"
"has not been saved.\n"
@@ -815,74 +838,75 @@ msgstr ""
"\n"
"Wie wollen Sie vorgehen?"
-#: ardour_ui.cc:963
+#: ardour_ui.cc:1024
msgid "Prompter"
msgstr "Frage"
-#: ardour_ui.cc:1049
-msgid "disconnected"
-msgstr "getrennt"
+#: ardour_ui.cc:1110 ardour_ui.cc:1118
+#, c-format
+msgid "Audio: <span foreground=\"red\">none</span>"
+msgstr "Audio: <span foreground=\"red\">Kein</span>"
-#: ardour_ui.cc:1056
+#: ardour_ui.cc:1122
#, c-format
-msgid "JACK: <span foreground=\"green\">%.1f kHz / %4.1f ms</span>"
-msgstr "JACK: <span foreground=\"green\">%.1f kHz / %4.1f ms</span>"
+msgid "Audio: <span foreground=\"green\">%.1f kHz / %4.1f ms</span>"
+msgstr "Audio: <span foreground=\"green\">%.1f kHz / %4.1f ms</span>"
-#: ardour_ui.cc:1060
+#: ardour_ui.cc:1126
#, c-format
-msgid "JACK: <span foreground=\"green\">%<PRId64> kHz / %4.1f ms</span>"
-msgstr "JACK: <span foreground=\"green\">%<PRId64> kHz / %4.1f ms</span>"
+msgid "Audio: <span foreground=\"green\">%<PRId64> kHz / %4.1f ms</span>"
+msgstr "Audio: <span foreground=\"green\">%<PRId64> kHz / %4.1f ms</span>"
-#: ardour_ui.cc:1078 export_video_dialog.cc:68
+#: ardour_ui.cc:1144 export_video_dialog.cc:68
msgid "File:"
msgstr "Datei:"
-#: ardour_ui.cc:1082
+#: ardour_ui.cc:1148
msgid "BWF"
msgstr "BWF"
-#: ardour_ui.cc:1085
+#: ardour_ui.cc:1151
msgid "WAV"
msgstr "WAV"
-#: ardour_ui.cc:1088
+#: ardour_ui.cc:1154
msgid "WAV64"
msgstr "WAV64"
-#: ardour_ui.cc:1091 session_option_editor.cc:197
+#: ardour_ui.cc:1157 session_option_editor.cc:197
msgid "CAF"
msgstr "CAF"
-#: ardour_ui.cc:1094
+#: ardour_ui.cc:1160
msgid "AIFF"
msgstr "AIFF"
-#: ardour_ui.cc:1097
+#: ardour_ui.cc:1163
msgid "iXML"
msgstr "iXML"
-#: ardour_ui.cc:1100
+#: ardour_ui.cc:1166
msgid "RF64"
msgstr "RF64"
-#: ardour_ui.cc:1108
+#: ardour_ui.cc:1174
msgid "32-float"
msgstr "32-float"
-#: ardour_ui.cc:1111
+#: ardour_ui.cc:1177
msgid "24-int"
msgstr "24-int"
-#: ardour_ui.cc:1114
+#: ardour_ui.cc:1180
msgid "16-int"
msgstr "16-int"
-#: ardour_ui.cc:1133
+#: ardour_ui.cc:1199
#, c-format
msgid "DSP: <span foreground=\"%s\">%5.1f%%</span>"
msgstr "DSP: <span foreground=\"%s\">%5.1f%%</span>"
-#: ardour_ui.cc:1152
+#: ardour_ui.cc:1218
#, c-format
msgid ""
"Buffers: <span foreground=\"green\">p:</span><span foreground=\"%s\">"
@@ -893,61 +917,62 @@ msgstr ""
"%%</span> <span foreground=\"green\">c:</span><span foreground=\"%s\">"
"%<PRIu32>%%</span>"
-#: ardour_ui.cc:1188
+#: ardour_ui.cc:1259
msgid "Disk: <span foreground=\"green\">Unknown</span>"
msgstr "Disk: <span foreground=\"green\">Unbekannt</span>"
-#: ardour_ui.cc:1190
+#: ardour_ui.cc:1261
msgid "Disk: <span foreground=\"green\">24hrs+</span>"
msgstr "Disk: <span foreground=\"green\">24h+</span>"
-#: ardour_ui.cc:1208
+#: ardour_ui.cc:1279
msgid "Disk: <span foreground=\"green\">&gt;24 hrs</span>"
msgstr "Disk: <span foreground=\"green\">&gt;24 h</span>"
-#: ardour_ui.cc:1219
+#: ardour_ui.cc:1290
#, c-format
msgid "Disk: <span foreground=\"%s\">%02dh:%02dm:%02ds</span>"
msgstr "Disk: <span foreground=\"%s\">%02dh:%02dm:%02ds</span>"
-#: ardour_ui.cc:1245
+#: ardour_ui.cc:1316
#, c-format
msgid "Timecode|TC: <span foreground=\"%s\">%s</span>"
msgstr "Timecode|TC: <span foreground=\"%s\">%s</span>"
-#: ardour_ui.cc:1362 ardour_ui.cc:1371 startup.cc:1054
+#: ardour_ui.cc:1433 ardour_ui.cc:1442 session_dialog.cc:301
+#: session_dialog.cc:306
msgid "Recent Sessions"
msgstr "Zuletzt verwendete Projekte"
-#: ardour_ui.cc:1451
+#: ardour_ui.cc:1521
msgid ""
-"%1 is not connected to JACK\n"
+"%1 is not connected to any audio backend.\n"
"You cannot open or close sessions in this condition"
msgstr ""
-"%1 ist derzeit nicht mit JACK verbunden.\n"
-"Dadurch können keine Projekte geöffnet oder geschlossen werden."
+"%1 ist derzeit mit keinem Audiobackend verbunden.\n"
+"Daher können keine Projekte geöffnet oder geschlossen werden."
-#: ardour_ui.cc:1478
+#: ardour_ui.cc:1545
msgid "Open Session"
msgstr "Projekt öffnen"
-#: ardour_ui.cc:1503 session_import_dialog.cc:169
-#: session_metadata_dialog.cc:729 startup.cc:1083
+#: ardour_ui.cc:1570 session_dialog.cc:332 session_import_dialog.cc:169
+#: session_metadata_dialog.cc:729
msgid "%1 sessions"
msgstr "%1 Projekte"
-#: ardour_ui.cc:1540
+#: ardour_ui.cc:1607
msgid "You cannot add a track without a session already loaded."
msgstr ""
"Sie können erst Spuren oder Busse hinzufügen, wenn ein Projekt geladen wurde."
-#: ardour_ui.cc:1548
+#: ardour_ui.cc:1615
msgid "could not create %1 new mixed track"
msgid_plural "could not create %1 new mixed tracks"
msgstr[0] "konnte %1 neue Audio+MIDI-Spur nicht erstellen"
msgstr[1] "konnte %1 neue Audio+MIDI-Spuren nicht erstellen"
-#: ardour_ui.cc:1554 ardour_ui.cc:1615
+#: ardour_ui.cc:1621 ardour_ui.cc:1682
msgid ""
"There are insufficient JACK ports available\n"
"to create a new track or bus.\n"
@@ -960,24 +985,24 @@ msgstr ""
"%1 und starten Sie JACK mit einer größeren\n"
"Anzahl Ports neu."
-#: ardour_ui.cc:1589
+#: ardour_ui.cc:1656
msgid "You cannot add a track or bus without a session already loaded."
msgstr ""
"Sie können erst Spuren oder Busse hinzufügen, wenn ein Projekt geladen wurde."
-#: ardour_ui.cc:1598
+#: ardour_ui.cc:1665
msgid "could not create %1 new audio track"
msgid_plural "could not create %1 new audio tracks"
msgstr[0] "konnte %1 neue Audiospur nicht erstellen."
msgstr[1] "konnte %1 neue Audiospuren nicht erstellen."
-#: ardour_ui.cc:1607
+#: ardour_ui.cc:1674
msgid "could not create %1 new audio bus"
msgid_plural "could not create %1 new audio busses"
msgstr[0] "konnte %1 neuen Audiobus nicht erstellen"
msgstr[1] "konnte %1 neue Audiobusse nicht erstellen"
-#: ardour_ui.cc:1724
+#: ardour_ui.cc:1798
msgid ""
"Please create one or more tracks before trying to record.\n"
"You can do this with the \"Add Track or Bus\" option in the Session menu."
@@ -986,41 +1011,15 @@ msgstr ""
"eine oder mehrere Spur hinzu. Die geht über \"Spur/Bus hinzufügen\"\n"
"im Menüpunkt Projekt."
-#: ardour_ui.cc:2114
-msgid ""
-"The audio backend (JACK) was shutdown because:\n"
-"\n"
-"%1"
-msgstr ""
-"Der Audioserver (JACK) wurde aus folgendem Grund beendet:\n"
-"\n"
-"%1"
-
-#: ardour_ui.cc:2116
-msgid ""
-"JACK has either been shutdown or it\n"
-"disconnected %1 because %1\n"
-"was not fast enough. Try to restart\n"
-"JACK, reconnect and save the session."
-msgstr ""
-"JACK wurde entweder beendet oder von\n"
-"%1 getrennt, weil %1 nicht schnell genug\n"
-"war. Sie sollten versuchen, JACK neu zu starten,\n"
-"neu zu verbinden, und das Projekt zu speichern."
-
-#: ardour_ui.cc:2142
-msgid "Unable to start the session running"
-msgstr "Konnte das aktuelle Projekt nicht starten"
-
-#: ardour_ui.cc:2222
+#: ardour_ui.cc:2175
msgid "Take Snapshot"
msgstr "Schnappschuss machen"
-#: ardour_ui.cc:2223
+#: ardour_ui.cc:2176
msgid "Name of new snapshot"
msgstr "Name für neuen Schnappschuss"
-#: ardour_ui.cc:2247
+#: ardour_ui.cc:2200
msgid ""
"To ensure compatibility with various systems\n"
"snapshot names may not contain a '%1' character"
@@ -1028,29 +1027,29 @@ msgstr ""
"Um die Kompatibilität mit verschiedenen Systemen sicher zu stellen,\n"
"dürfen Namen von Schnappschüssen kein '%1'-Zeichen enthalten"
-#: ardour_ui.cc:2259
+#: ardour_ui.cc:2212
msgid "Confirm Snapshot Overwrite"
msgstr "Bestätige das Überschreiben des Schnappschusses"
-#: ardour_ui.cc:2260
+#: ardour_ui.cc:2213
msgid "A snapshot already exists with that name. Do you want to overwrite it?"
msgstr ""
"Ein Schnappschuss mit diesem Namen existiert bereits. Wollen Sie ihn "
"überschreiben?"
-#: ardour_ui.cc:2263 utils_videotl.cc:67
+#: ardour_ui.cc:2216 utils_videotl.cc:67
msgid "Overwrite"
msgstr "Ãœberschreiben"
-#: ardour_ui.cc:2297
+#: ardour_ui.cc:2250
msgid "Rename Session"
msgstr "Projekt umbenennen"
-#: ardour_ui.cc:2298
+#: ardour_ui.cc:2251
msgid "New session name"
msgstr "Neuer Projektname"
-#: ardour_ui.cc:2312 ardour_ui.cc:2692 ardour_ui.cc:2737
+#: ardour_ui.cc:2265 ardour_ui.cc:2650 ardour_ui.cc:2686
msgid ""
"To ensure compatibility with various systems\n"
"session names may not contain a '%1' character"
@@ -1058,14 +1057,14 @@ msgstr ""
"Um die Kompatibilität mit verschiedenen Systemen sicher zu stellen,\n"
"dürfen Projektnamen kein '%1'-Zeichen enthalten"
-#: ardour_ui.cc:2320
+#: ardour_ui.cc:2273
msgid ""
"That name is already in use by another directory/folder. Please try again."
msgstr ""
"Dieser Name wird schon von einem anderen Verzeichnis/Ordner benutzt. Bitte "
"versuchen Sie einen anderen Namen."
-#: ardour_ui.cc:2329
+#: ardour_ui.cc:2282
msgid ""
"Renaming this session failed.\n"
"Things could be seriously messed up at this point"
@@ -1073,19 +1072,19 @@ msgstr ""
"Das Umbenennen des Projekts ist fehlgeschlagen.\n"
"Dies könnte auf schwerwiegende Probleme hinweisen."
-#: ardour_ui.cc:2440
+#: ardour_ui.cc:2393
msgid "Save Template"
msgstr "Als Vorlage Speichern"
-#: ardour_ui.cc:2441
+#: ardour_ui.cc:2394
msgid "Name for template:"
msgstr "Name für Vorlage"
-#: ardour_ui.cc:2442
+#: ardour_ui.cc:2395
msgid "-template"
msgstr "-Vorlage"
-#: ardour_ui.cc:2480
+#: ardour_ui.cc:2433
msgid ""
"This session\n"
"%1\n"
@@ -1095,52 +1094,48 @@ msgstr ""
"%1\n"
"existiert bereits. Wollen Sie sie öffnen?"
-#: ardour_ui.cc:2490
+#: ardour_ui.cc:2443
msgid "Open Existing Session"
msgstr "Vorhandenes Projekt öffnen"
-#: ardour_ui.cc:2728
+#: ardour_ui.cc:2677
msgid "There is no existing session at \"%1\""
msgstr "Es gibt kein Projekt in: \"%1\""
-#: ardour_ui.cc:2815
+#: ardour_ui.cc:2764
msgid "Please wait while %1 loads your session"
msgstr "Bitte warten Sie, während %1 das Projekt lädt"
-#: ardour_ui.cc:2830
+#: ardour_ui.cc:2779
msgid "Port Registration Error"
msgstr "Fehler bei der Registrierung von Ports"
-#: ardour_ui.cc:2831
+#: ardour_ui.cc:2780
msgid "Click the Close button to try again."
msgstr "Klicken Sie auf Schließen, um es erneut zu versuchen."
-#: ardour_ui.cc:2852
+#: ardour_ui.cc:2801
msgid "Session \"%1 (snapshot %2)\" did not load successfully"
msgstr "Projekt \"%1 (Schnappschuss %2)\" konnte nicht geladen werden."
-#: ardour_ui.cc:2858
+#: ardour_ui.cc:2808
msgid "Loading Error"
msgstr "Fehler beim Laden"
-#: ardour_ui.cc:2859
-msgid "Click the Refresh button to try again."
-msgstr "Klicken Sie auf Aktualisieren, um es erneut zu versuchen."
-
-#: ardour_ui.cc:2941
+#: ardour_ui.cc:2875
msgid "Could not create session in \"%1\""
msgstr "Konnte kein Projekt in \"%1\" anlegen"
-#: ardour_ui.cc:3041
+#: ardour_ui.cc:2975
msgid "No files were ready for clean-up"
msgstr "Keine Audiodateien zum Aufräumen vorhanden"
-#: ardour_ui.cc:3045 ardour_ui.cc:3055 ardour_ui.cc:3188 ardour_ui.cc:3195
+#: ardour_ui.cc:2979 ardour_ui.cc:2989 ardour_ui.cc:3122 ardour_ui.cc:3129
#: ardour_ui_ed.cc:104
msgid "Clean-up"
msgstr "Aufräumen"
-#: ardour_ui.cc:3046
+#: ardour_ui.cc:2980
msgid ""
"If this seems suprising, \n"
"check for any existing snapshots.\n"
@@ -1152,19 +1147,19 @@ msgstr ""
"sind sie wahrscheinlich noch in einem\n"
"älteren Schnappschuss als Region eingebunden."
-#: ardour_ui.cc:3105
+#: ardour_ui.cc:3039
msgid "kilo"
msgstr "kilo"
-#: ardour_ui.cc:3108
+#: ardour_ui.cc:3042
msgid "mega"
msgstr "mega"
-#: ardour_ui.cc:3111
+#: ardour_ui.cc:3045
msgid "giga"
msgstr "giga"
-#: ardour_ui.cc:3116
+#: ardour_ui.cc:3050
msgid ""
"The following file was deleted from %2,\n"
"releasing %3 %4bytes of disk space"
@@ -1178,7 +1173,7 @@ msgstr[1] ""
"Die folgenden %1 Dateien wurden von %2\n"
"gelöscht und gaben %3 %4bytes Speicherplatz frei"
-#: ardour_ui.cc:3123
+#: ardour_ui.cc:3057
msgid ""
"The following file was not in use and \n"
"has been moved to: %2\n"
@@ -1216,11 +1211,11 @@ msgstr[1] ""
"\n"
"%3 %4bytes Speicherplatz freigegeben werden.\n"
-#: ardour_ui.cc:3183
+#: ardour_ui.cc:3117
msgid "Are you sure you want to clean-up?"
msgstr "Wollen Sie wirklich aufräumen?"
-#: ardour_ui.cc:3190
+#: ardour_ui.cc:3124
msgid ""
"Clean-up is a destructive operation.\n"
"ALL undo/redo information will be lost if you clean-up.\n"
@@ -1232,42 +1227,42 @@ msgstr ""
"Nach dem Aufräumen werden alle nicht benötigten Audiodateien in den \"dead "
"sounds\" Ordner verschoben."
-#: ardour_ui.cc:3198
+#: ardour_ui.cc:3132
msgid "CleanupDialog"
msgstr "Aufräumdialog"
-#: ardour_ui.cc:3228
+#: ardour_ui.cc:3162
msgid "Cleaned Files"
msgstr "Aufgeräumte Dateien"
-#: ardour_ui.cc:3245
+#: ardour_ui.cc:3179
msgid "deleted file"
msgstr "gelöschte Datei"
-#: ardour_ui.cc:3337
+#: ardour_ui.cc:3271
msgid ""
"Video-Server was not launched by Ardour. The request to stop it is ignored."
msgstr ""
"Der Video-Server wurde nicht von Ardour gestartet, der Befehl ihn anzuhalten "
"wird ignoriert."
-#: ardour_ui.cc:3341
+#: ardour_ui.cc:3275
msgid "Stop Video-Server"
msgstr "Video-Server anhalten"
-#: ardour_ui.cc:3342
+#: ardour_ui.cc:3276
msgid "Do you really want to stop the Video Server?"
msgstr "Wollen Sie den Video-Server wirklich anhalten?"
-#: ardour_ui.cc:3345
+#: ardour_ui.cc:3279
msgid "Yes, Stop It"
msgstr "Ja, anhalten."
-#: ardour_ui.cc:3371
+#: ardour_ui.cc:3305
msgid "The Video Server is already started."
msgstr "Der Video-Server läuft bereits"
-#: ardour_ui.cc:3373
+#: ardour_ui.cc:3307
msgid ""
"An external Video Server is configured and can be reached. Not starting a "
"new instance."
@@ -1275,7 +1270,7 @@ msgstr ""
"Ein externer Video-Server wurde konfiguriert, ist aber nicht erreichbar. Es "
"wird keine neue Instanz gestartet."
-#: ardour_ui.cc:3381 ardour_ui.cc:3471
+#: ardour_ui.cc:3315 ardour_ui.cc:3405
msgid ""
"Could not connect to the Video Server. Start it or configure its access URL "
"in Edit -> Preferences."
@@ -1284,36 +1279,36 @@ msgstr ""
"ihn vorher starten oder die Adresse in Bearbeiten -> Globale Einstellungen "
"anpassen"
-#: ardour_ui.cc:3405
+#: ardour_ui.cc:3339
msgid "Specified docroot is not an existing directory."
msgstr "Das eingestellte Dokumentenverzeichnis existiert nicht."
-#: ardour_ui.cc:3410
+#: ardour_ui.cc:3344
msgid "Given Video Server is not an executable file."
msgstr "Der eingestellte Video-Server ist keine ausführbare Datei."
-#: ardour_ui.cc:3443
+#: ardour_ui.cc:3377
msgid "Cannot launch the video-server"
msgstr "Kann den Videoserver nicht starten "
-#: ardour_ui.cc:3452
+#: ardour_ui.cc:3386
msgid "Video-server was started but does not respond to requests..."
msgstr "Viideoserver wurde gestartet, reagiert aber nicht auf Anfragen..."
-#: ardour_ui.cc:3497 editor_audio_import.cc:632
+#: ardour_ui.cc:3431 editor_audio_import.cc:632
msgid "could not open %1"
msgstr "Konnte \"%s\" nicht öffnen."
-#: ardour_ui.cc:3501
+#: ardour_ui.cc:3435
msgid "no video-file selected"
msgstr "Es wurde keine Video-Datei ausgewählt."
-#: ardour_ui.cc:3673
+#: ardour_ui.cc:3607
msgid "Recording was stopped because your system could not keep up."
msgstr ""
"Die Aufnahme wurde gestoppt, da Ihr System nicht schnell genug folgen konnte."
-#: ardour_ui.cc:3702
+#: ardour_ui.cc:3636
msgid ""
"The disk system on your computer\n"
"was not able to keep up with %1.\n"
@@ -1327,7 +1322,7 @@ msgstr ""
"Die Daten konnten nicht schnell genug geschrieben\n"
"werden, um die Aufnahme fortzuführen.\n"
-#: ardour_ui.cc:3721
+#: ardour_ui.cc:3655
msgid ""
"The disk system on your computer\n"
"was not able to keep up with %1.\n"
@@ -1341,11 +1336,11 @@ msgstr ""
"Die Daten konnten nicht schnell genug gelesen\n"
"werden, um die Wiedergabe aufrechtzuerhalten.\n"
-#: ardour_ui.cc:3761
+#: ardour_ui.cc:3695
msgid "Crash Recovery"
msgstr "Absturz-Wiederherstellung"
-#: ardour_ui.cc:3762
+#: ardour_ui.cc:3696
msgid ""
"This session appears to have been in the\n"
"middle of recording when %1 or\n"
@@ -1363,19 +1358,19 @@ msgstr ""
"für Sie wiederherstellen oder sie verwerfen.\n"
"Bitte entscheiden Sie, wie Sie vorgehen möchten.\n"
-#: ardour_ui.cc:3774
+#: ardour_ui.cc:3708
msgid "Ignore crash data"
msgstr "Daten verwerfen"
-#: ardour_ui.cc:3775
+#: ardour_ui.cc:3709
msgid "Recover from crash"
msgstr "Daten wiederherstellen"
-#: ardour_ui.cc:3795
+#: ardour_ui.cc:3729
msgid "Sample Rate Mismatch"
msgstr "Samplerate passt nicht"
-#: ardour_ui.cc:3796
+#: ardour_ui.cc:3730
msgid ""
"This session was created with a sample rate of %1 Hz, but\n"
"%2 is currently running at %3 Hz. If you load this session,\n"
@@ -1386,23 +1381,23 @@ msgstr ""
"%2 läuft derzeit mit %3 Hz. Wenn Sie dieses Projekt laden, \n"
"wird Ihr Audiomaterial mit der falschen Samplerate abgespielt.\n"
-#: ardour_ui.cc:3805
+#: ardour_ui.cc:3739
msgid "Do not load session"
msgstr "Projekt nicht laden"
-#: ardour_ui.cc:3806
+#: ardour_ui.cc:3740
msgid "Load session anyway"
msgstr "Projekt trotzdem laden"
-#: ardour_ui.cc:3829
-msgid "Could not disconnect from JACK"
-msgstr "Konnte Verbindung mit JACK nicht trennen"
+#: ardour_ui.cc:3766
+msgid "Could not disconnect from Audio/MIDI engine"
+msgstr "Konnte Verbindung mit der Audio/MIDI Engine nicht trennen"
-#: ardour_ui.cc:3842
-msgid "Could not reconnect to JACK"
-msgstr "Konnte nicht erneut zu JACK verbinden"
+#: ardour_ui.cc:3781
+msgid "Could not reconnect to the Audio/MIDI engine"
+msgstr "Konnte nicht zur Audio/MIDI Engine wiederverbinden"
-#: ardour_ui.cc:4116
+#: ardour_ui.cc:4056
msgid ""
"%4This is a session from an older version of %3%5\n"
"\n"
@@ -1562,20 +1557,20 @@ msgstr "[WARNUNG]:"
msgid "[INFO]: "
msgstr "[INFO]: "
-#: ardour_ui2.cc:247 ardour_ui_ed.cc:377
+#: ardour_ui2.cc:247 ardour_ui_ed.cc:344
msgid "Auto Return"
msgstr "Auto Return"
-#: ardour_ui2.cc:249 ardour_ui_ed.cc:380
+#: ardour_ui2.cc:249 ardour_ui_ed.cc:347
msgid "Follow Edits"
msgstr "Folge Bearbeitungen"
-#: ardour_ui2.cc:628 rc_option_editor.cc:1004 rc_option_editor.cc:1022
-#: rc_option_editor.cc:1025 rc_option_editor.cc:1027 rc_option_editor.cc:1029
-#: rc_option_editor.cc:1037 rc_option_editor.cc:1045 rc_option_editor.cc:1047
-#: rc_option_editor.cc:1055 rc_option_editor.cc:1062 rc_option_editor.cc:1071
-#: rc_option_editor.cc:1073 rc_option_editor.cc:1075 rc_option_editor.cc:1083
-#: rc_option_editor.cc:1085 rc_option_editor.cc:1094
+#: ardour_ui2.cc:628 rc_option_editor.cc:1002 rc_option_editor.cc:1020
+#: rc_option_editor.cc:1023 rc_option_editor.cc:1025 rc_option_editor.cc:1027
+#: rc_option_editor.cc:1035 rc_option_editor.cc:1043 rc_option_editor.cc:1045
+#: rc_option_editor.cc:1053 rc_option_editor.cc:1060 rc_option_editor.cc:1069
+#: rc_option_editor.cc:1071 rc_option_editor.cc:1073 rc_option_editor.cc:1081
+#: rc_option_editor.cc:1083 rc_option_editor.cc:1092
#: session_option_editor.cc:234 session_option_editor.cc:236
#: session_option_editor.cc:257 session_option_editor.cc:259
#: session_option_editor.cc:261 session_option_editor.cc:268
@@ -1594,19 +1589,19 @@ msgstr "Mixer laden"
msgid "Reload Session History"
msgstr "Projekt-Aktionsverlauf laden"
-#: ardour_ui_dialogs.cc:242
+#: ardour_ui_dialogs.cc:238
msgid "Don't close"
msgstr "Abbrechen"
-#: ardour_ui_dialogs.cc:243
+#: ardour_ui_dialogs.cc:239
msgid "Just close"
msgstr "Ohne speichern schließen"
-#: ardour_ui_dialogs.cc:244
+#: ardour_ui_dialogs.cc:240
msgid "Save and close"
msgstr "Speichern und schließen"
-#: ardour_ui_dialogs.cc:340
+#: ardour_ui_dialogs.cc:339
msgid "This screen is not tall enough to display the mixer window"
msgstr ""
"Dieser Bildschirm ist nicht hoch genug, um das Mixerfenster darzustellen"
@@ -1616,11 +1611,11 @@ msgid "Session"
msgstr "Projekt"
#: ardour_ui_ed.cc:106 editor_actions.cc:134 editor_regions.cc:115
-#: port_group.cc:457 session_option_editor.cc:82 session_option_editor.cc:89
+#: port_group.cc:458 session_option_editor.cc:82 session_option_editor.cc:89
msgid "Sync"
msgstr "Sync"
-#: ardour_ui_ed.cc:107 engine_dialog.cc:369
+#: ardour_ui_ed.cc:107
msgid "Options"
msgstr "Optionen"
@@ -1648,15 +1643,15 @@ msgstr "Dateiformat"
msgid "Sample Format"
msgstr "Sampleformat"
-#: ardour_ui_ed.cc:114 rc_option_editor.cc:1826 rc_option_editor.cc:1839
+#: ardour_ui_ed.cc:114 rc_option_editor.cc:1822 rc_option_editor.cc:1835
msgid "Control Surfaces"
msgstr "Eingabegeräte / Controller"
-#: ardour_ui_ed.cc:115 rc_option_editor.cc:1558
+#: ardour_ui_ed.cc:115 rc_option_editor.cc:1554
msgid "Plugins"
msgstr "Plugins"
-#: ardour_ui_ed.cc:116 rc_option_editor.cc:1902
+#: ardour_ui_ed.cc:116 rc_option_editor.cc:1898
msgid "Metering"
msgstr "Pegelanzeige"
@@ -1754,170 +1749,153 @@ msgstr "Nicht benutzte Dateien entfernen..."
msgid "Flush Wastebasket"
msgstr "Müll leeren"
-#: ardour_ui_ed.cc:189 keyeditor.cc:253 rc_option_editor.cc:1472
-msgid "JACK"
-msgstr "JACK"
-
-#: ardour_ui_ed.cc:190 route_params_ui.cc:105
-msgid "Latency"
-msgstr "Latenz"
-
-#: ardour_ui_ed.cc:192
-msgid "Reconnect"
-msgstr "Verbinde neu"
-
-#: ardour_ui_ed.cc:195 global_port_matrix.cc:207 io_selector.cc:210
-#: mixer_strip.cc:719 mixer_strip.cc:845
-msgid "Disconnect"
-msgstr "Trenne"
-
-#: ardour_ui_ed.cc:222
+#: ardour_ui_ed.cc:189
msgid "Quit"
msgstr "Beenden"
-#: ardour_ui_ed.cc:226
+#: ardour_ui_ed.cc:193
msgid "Maximise Editor Space"
msgstr "Editor maximieren"
-#: ardour_ui_ed.cc:227
+#: ardour_ui_ed.cc:194
msgid "Show Toolbars"
msgstr "Zeige Werkzeugleisten"
-#: ardour_ui_ed.cc:230 mixer_ui.cc:1865 mixer_ui.cc:1871
+#: ardour_ui_ed.cc:197 mixer_ui.cc:1865 mixer_ui.cc:1871
msgid "Window|Mixer"
msgstr "Mixer"
-#: ardour_ui_ed.cc:231
+#: ardour_ui_ed.cc:198
msgid "Toggle Editor+Mixer"
msgstr "Editor+Mixer umschalten"
-#: ardour_ui_ed.cc:232 meterbridge.cc:230 meterbridge.cc:236
+#: ardour_ui_ed.cc:199 meterbridge.cc:230 meterbridge.cc:236
msgid "Window|Meterbridge"
msgstr "Meterbridge"
-#: ardour_ui_ed.cc:234 midi_tracer.cc:39
+#: ardour_ui_ed.cc:201 midi_tracer.cc:42
msgid "MIDI Tracer"
msgstr "Midisignale verfolgen"
-#: ardour_ui_ed.cc:236
+#: ardour_ui_ed.cc:203
msgid "Chat"
msgstr "Chat"
-#: ardour_ui_ed.cc:238
+#: ardour_ui_ed.cc:205
msgid "Help|Manual"
msgstr "Handbuch"
-#: ardour_ui_ed.cc:239
+#: ardour_ui_ed.cc:206
msgid "Reference"
msgstr "Referenz"
-#: ardour_ui_ed.cc:241 plugin_ui.cc:418
+#: ardour_ui_ed.cc:208 plugin_ui.cc:416
msgid "Save"
msgstr "Speichern"
-#: ardour_ui_ed.cc:249 rc_option_editor.cc:1114 rc_option_editor.cc:1125
-#: rc_option_editor.cc:1134 rc_option_editor.cc:1147 rc_option_editor.cc:1160
-#: rc_option_editor.cc:1169 rc_option_editor.cc:1179 rc_option_editor.cc:1181
-#: rc_option_editor.cc:1191 rc_option_editor.cc:1207 rc_option_editor.cc:1220
-#: rc_option_editor.cc:1238 rc_option_editor.cc:1240 rc_option_editor.cc:1254
-#: rc_option_editor.cc:1257 rc_option_editor.cc:1259 rc_option_editor.cc:1276
-#: rc_option_editor.cc:1287
+#: ardour_ui_ed.cc:216 rc_option_editor.cc:1112 rc_option_editor.cc:1123
+#: rc_option_editor.cc:1132 rc_option_editor.cc:1145 rc_option_editor.cc:1158
+#: rc_option_editor.cc:1167 rc_option_editor.cc:1177 rc_option_editor.cc:1179
+#: rc_option_editor.cc:1189 rc_option_editor.cc:1205 rc_option_editor.cc:1218
+#: rc_option_editor.cc:1236 rc_option_editor.cc:1238 rc_option_editor.cc:1252
+#: rc_option_editor.cc:1255 rc_option_editor.cc:1257 rc_option_editor.cc:1274
+#: rc_option_editor.cc:1285
msgid "Transport"
msgstr "Transport"
-#: ardour_ui_ed.cc:255 engine_dialog.cc:85
+#: ardour_ui_ed.cc:222
msgid "Stop"
msgstr "Stopp"
-#: ardour_ui_ed.cc:258
+#: ardour_ui_ed.cc:225
msgid "Roll"
msgstr "Wiedergabe"
-#: ardour_ui_ed.cc:262
+#: ardour_ui_ed.cc:229
msgid "Start/Stop"
msgstr "Start/Stopp"
-#: ardour_ui_ed.cc:265
+#: ardour_ui_ed.cc:232
msgid "Start/Continue/Stop"
msgstr "Start/Stopp"
-#: ardour_ui_ed.cc:268
+#: ardour_ui_ed.cc:235
msgid "Stop and Forget Capture"
msgstr "Stopp + Aufnahme verwerfen"
-#: ardour_ui_ed.cc:278
+#: ardour_ui_ed.cc:245
msgid "Transition To Roll"
msgstr "Vorwärts (normal)"
-#: ardour_ui_ed.cc:282
+#: ardour_ui_ed.cc:249
msgid "Transition To Reverse"
msgstr "Rückwärts (normal)"
-#: ardour_ui_ed.cc:286
+#: ardour_ui_ed.cc:253
msgid "Play Loop Range"
msgstr "Schleife wiedergeben"
-#: ardour_ui_ed.cc:289
+#: ardour_ui_ed.cc:256
msgid "Play Selected Range"
msgstr "Gewählten Bereich wiedergeben"
-#: ardour_ui_ed.cc:292
+#: ardour_ui_ed.cc:259
msgid "Play Selection w/Preroll"
msgstr "Ausgewählten Bereich mit Vorlauf wiedergeben"
-#: ardour_ui_ed.cc:296
+#: ardour_ui_ed.cc:263
msgid "Enable Record"
msgstr "Aufnahme aktivieren"
-#: ardour_ui_ed.cc:299
+#: ardour_ui_ed.cc:266
msgid "Start Recording"
msgstr "Aufnahme starten"
-#: ardour_ui_ed.cc:303
+#: ardour_ui_ed.cc:270
msgid "Rewind"
msgstr "Rückwärts (beschleunigen)"
-#: ardour_ui_ed.cc:306
+#: ardour_ui_ed.cc:273
msgid "Rewind (Slow)"
msgstr "Rückwärts (langsam)"
-#: ardour_ui_ed.cc:309
+#: ardour_ui_ed.cc:276
msgid "Rewind (Fast)"
msgstr "Rückwärts (schnell)"
-#: ardour_ui_ed.cc:312 startup.cc:727
+#: ardour_ui_ed.cc:279
msgid "Forward"
msgstr "Vorwärts (beschleunigen)"
-#: ardour_ui_ed.cc:315
+#: ardour_ui_ed.cc:282
msgid "Forward (Slow)"
msgstr "Vorwärts (langsam)"
-#: ardour_ui_ed.cc:318
+#: ardour_ui_ed.cc:285
msgid "Forward (Fast)"
msgstr "Vorwärts (schnell)"
-#: ardour_ui_ed.cc:321
+#: ardour_ui_ed.cc:288
msgid "Goto Zero"
msgstr "Zum Nullpunkt springen"
-#: ardour_ui_ed.cc:324
+#: ardour_ui_ed.cc:291
msgid "Goto Start"
msgstr "Zum Anfang springen"
-#: ardour_ui_ed.cc:327
+#: ardour_ui_ed.cc:294
msgid "Goto End"
msgstr "Zum Ende springen"
-#: ardour_ui_ed.cc:330
+#: ardour_ui_ed.cc:297
msgid "Goto Wall Clock"
msgstr "Zur lokalen Uhrzeit springen"
-#: ardour_ui_ed.cc:334
+#: ardour_ui_ed.cc:301
msgid "Focus On Clock"
msgstr "Fokus auf Zeitanzeige setzen"
-#: ardour_ui_ed.cc:338 ardour_ui_ed.cc:347 audio_clock.cc:2046 editor.cc:237
+#: ardour_ui_ed.cc:305 ardour_ui_ed.cc:314 audio_clock.cc:2046 editor.cc:237
#: editor_actions.cc:544 editor_actions.cc:553 export_timespan_selector.cc:88
#: session_option_editor.cc:41 session_option_editor.cc:61
#: session_option_editor.cc:80 session_option_editor.cc:96
@@ -1926,125 +1904,121 @@ msgstr "Fokus auf Zeitanzeige setzen"
msgid "Timecode"
msgstr "Timecode"
-#: ardour_ui_ed.cc:340 ardour_ui_ed.cc:349 editor_actions.cc:542
+#: ardour_ui_ed.cc:307 ardour_ui_ed.cc:316 editor_actions.cc:542
msgid "Bars & Beats"
msgstr "Takte & Schläge"
-#: ardour_ui_ed.cc:342 ardour_ui_ed.cc:351
+#: ardour_ui_ed.cc:309 ardour_ui_ed.cc:318
msgid "Minutes & Seconds"
msgstr "Minuten & Sekunden"
-#: ardour_ui_ed.cc:344 ardour_ui_ed.cc:353 audio_clock.cc:2050 editor.cc:238
+#: ardour_ui_ed.cc:311 ardour_ui_ed.cc:320 audio_clock.cc:2050 editor.cc:238
#: editor_actions.cc:543
msgid "Samples"
msgstr "Samples"
-#: ardour_ui_ed.cc:356
+#: ardour_ui_ed.cc:323
msgid "Punch In"
msgstr "Punch In"
-#: ardour_ui_ed.cc:357 mixer_strip.cc:1905 route_ui.cc:137
+#: ardour_ui_ed.cc:324 mixer_strip.cc:1905 route_ui.cc:137
#: time_info_box.cc:113
msgid "In"
msgstr "In"
-#: ardour_ui_ed.cc:360
+#: ardour_ui_ed.cc:327
msgid "Punch Out"
msgstr "Punch Out"
-#: ardour_ui_ed.cc:361 time_info_box.cc:114
+#: ardour_ui_ed.cc:328 time_info_box.cc:114
msgid "Out"
msgstr "Out"
-#: ardour_ui_ed.cc:364
+#: ardour_ui_ed.cc:331
msgid "Punch In/Out"
msgstr "Punch In/Out"
-#: ardour_ui_ed.cc:365
+#: ardour_ui_ed.cc:332
msgid "In/Out"
msgstr "In/Out"
-#: ardour_ui_ed.cc:368 rc_option_editor.cc:1071
+#: ardour_ui_ed.cc:335 rc_option_editor.cc:1069
msgid "Click"
msgstr "Klick"
-#: ardour_ui_ed.cc:371
+#: ardour_ui_ed.cc:338
msgid "Auto Input"
msgstr "Auto Input"
-#: ardour_ui_ed.cc:374
+#: ardour_ui_ed.cc:341
msgid "Auto Play"
msgstr "Auto Play"
-#: ardour_ui_ed.cc:385
+#: ardour_ui_ed.cc:352
msgid "Sync Startup to Video"
msgstr "Start mit Video synchronisieren"
-#: ardour_ui_ed.cc:387
+#: ardour_ui_ed.cc:354
msgid "Time Master"
msgstr "Time Master"
-#: ardour_ui_ed.cc:394
+#: ardour_ui_ed.cc:361
msgid "Toggle Record Enable Track %1"
msgstr "Aufnahme auf Spur %1 aktivieren"
-#: ardour_ui_ed.cc:401
+#: ardour_ui_ed.cc:368
msgid "Percentage"
msgstr "Prozent"
-#: ardour_ui_ed.cc:402 shuttle_control.cc:169
+#: ardour_ui_ed.cc:369 shuttle_control.cc:169
msgid "Semitones"
msgstr "Halbtöne"
-#: ardour_ui_ed.cc:406
+#: ardour_ui_ed.cc:373
msgid "Send MTC"
msgstr "MTC senden"
-#: ardour_ui_ed.cc:408
+#: ardour_ui_ed.cc:375
msgid "Send MMC"
msgstr "MMC senden"
-#: ardour_ui_ed.cc:410
+#: ardour_ui_ed.cc:377
msgid "Use MMC"
msgstr "Benutze MMC"
-#: ardour_ui_ed.cc:412 rc_option_editor.cc:1710
+#: ardour_ui_ed.cc:379 rc_option_editor.cc:1706
msgid "Send MIDI Clock"
msgstr "MIDI Clock senden"
-#: ardour_ui_ed.cc:414
+#: ardour_ui_ed.cc:381
msgid "Send MIDI Feedback"
msgstr "MIDI Feedback senden"
-#: ardour_ui_ed.cc:420
+#: ardour_ui_ed.cc:387
msgid "Panic"
msgstr "Panic"
-#: ardour_ui_ed.cc:560
+#: ardour_ui_ed.cc:472
msgid "Wall Clock"
msgstr "Uhrzeit"
-#: ardour_ui_ed.cc:561
+#: ardour_ui_ed.cc:473
msgid "Disk Space"
msgstr "Speicherplatz"
-#: ardour_ui_ed.cc:562
+#: ardour_ui_ed.cc:474
msgid "DSP"
msgstr "DSP"
-#: ardour_ui_ed.cc:563
+#: ardour_ui_ed.cc:475
msgid "Buffers"
msgstr "Puffer"
-#: ardour_ui_ed.cc:564
-msgid "JACK Sampling Rate and Latency"
-msgstr "JACK Samplerate und Latenz"
-
-#: ardour_ui_ed.cc:565
+#: ardour_ui_ed.cc:477
msgid "Timecode Format"
msgstr "Timecode-Format"
-#: ardour_ui_ed.cc:566
+#: ardour_ui_ed.cc:478
msgid "File Format"
msgstr "Dateiformat"
@@ -2183,32 +2157,32 @@ msgid "hide track"
msgstr "Diese Spur verbergen"
#: automation_time_axis.cc:255 automation_time_axis.cc:307
-#: automation_time_axis.cc:496 gain_meter.cc:195 generic_pluginui.cc:456
-#: generic_pluginui.cc:746 panner_ui.cc:150
+#: automation_time_axis.cc:496 gain_meter.cc:194 generic_pluginui.cc:454
+#: generic_pluginui.cc:744 panner_ui.cc:149
msgid "Automation|Manual"
msgstr "Manuell"
#: automation_time_axis.cc:257 automation_time_axis.cc:318
-#: automation_time_axis.cc:501 editor.cc:1933 editor.cc:2010
-#: editor_actions.cc:118 editor_actions.cc:1865 gain_meter.cc:198
-#: generic_pluginui.cc:459 generic_pluginui.cc:748 midi_time_axis.cc:1488
-#: midi_time_axis.cc:1491 midi_time_axis.cc:1494 panner_ui.cc:153
+#: automation_time_axis.cc:501 editor.cc:1934 editor.cc:2011
+#: editor_actions.cc:118 editor_actions.cc:1865 gain_meter.cc:197
+#: generic_pluginui.cc:457 generic_pluginui.cc:746 midi_time_axis.cc:1488
+#: midi_time_axis.cc:1491 midi_time_axis.cc:1494 panner_ui.cc:152
msgid "Play"
msgstr "Wiedergabe"
#: automation_time_axis.cc:259 automation_time_axis.cc:329
-#: automation_time_axis.cc:506 gain_meter.cc:201 generic_pluginui.cc:462
-#: generic_pluginui.cc:750 panner_ui.cc:156
+#: automation_time_axis.cc:506 gain_meter.cc:200 generic_pluginui.cc:460
+#: generic_pluginui.cc:748 panner_ui.cc:155
msgid "Write"
msgstr "Schreiben"
#: automation_time_axis.cc:261 automation_time_axis.cc:340
-#: automation_time_axis.cc:511 gain_meter.cc:204 generic_pluginui.cc:465
-#: generic_pluginui.cc:752 panner_ui.cc:159
+#: automation_time_axis.cc:511 gain_meter.cc:203 generic_pluginui.cc:463
+#: generic_pluginui.cc:750 panner_ui.cc:158
msgid "Touch"
msgstr "Ändern"
-#: automation_time_axis.cc:351 generic_pluginui.cc:468 meter_patterns.cc:108
+#: automation_time_axis.cc:351 generic_pluginui.cc:466 meter_patterns.cc:108
msgid "???"
msgstr "???"
@@ -2233,8 +2207,8 @@ msgstr "Automationssmodus"
msgid "Discrete"
msgstr "Diskret"
-#: automation_time_axis.cc:537 editor.cc:1457 editor.cc:1464 editor.cc:1520
-#: editor.cc:1526 export_format_dialog.cc:476
+#: automation_time_axis.cc:537 editor.cc:1458 editor.cc:1465 editor.cc:1521
+#: editor.cc:1527 export_format_dialog.cc:476
msgid "Linear"
msgstr "Linear"
@@ -2265,13 +2239,13 @@ msgstr "Eingang"
msgid "Output"
msgstr "Ausgang"
-#: bundle_manager.cc:264 editor.cc:1974 editor_actions.cc:90
+#: bundle_manager.cc:264 editor.cc:1975 editor_actions.cc:90
#: editor_actions.cc:100
msgid "Edit"
msgstr "Bearbeiten"
-#: bundle_manager.cc:265 editor.cc:5493 editor_actions.cc:310
-#: editor_actions.cc:368 plugin_ui.cc:419 processor_box.cc:2229
+#: bundle_manager.cc:265 editor.cc:5494 editor_actions.cc:310
+#: editor_actions.cc:368 plugin_ui.cc:417 processor_box.cc:2229
#: route_time_axis.cc:713
msgid "Delete"
msgstr "Löschen"
@@ -2448,164 +2422,164 @@ msgstr "Länge"
msgid "edit note"
msgstr "Note bearbeiten"
-#: editor.cc:137 editor.cc:3429
+#: editor.cc:137 editor.cc:3430
msgid "CD Frames"
msgstr "CD-Frames"
-#: editor.cc:138 editor.cc:3431
+#: editor.cc:138 editor.cc:3432
msgid "Timecode Frames"
msgstr "Timecode-Frames"
-#: editor.cc:139 editor.cc:3433
+#: editor.cc:139 editor.cc:3434
msgid "Timecode Seconds"
msgstr "Timecode-Sekunden"
-#: editor.cc:140 editor.cc:3435
+#: editor.cc:140 editor.cc:3436
msgid "Timecode Minutes"
msgstr "Timecode-Minuten"
-#: editor.cc:141 editor.cc:3437
+#: editor.cc:141 editor.cc:3438
msgid "Seconds"
msgstr "Sekunden"
-#: editor.cc:142 editor.cc:3439
+#: editor.cc:142 editor.cc:3440
msgid "Minutes"
msgstr "Minuten"
-#: editor.cc:143 editor.cc:3413 quantize_dialog.cc:37 quantize_dialog.cc:141
+#: editor.cc:143 editor.cc:3414 quantize_dialog.cc:37 quantize_dialog.cc:141
msgid "Beats/128"
msgstr "Schläge/128"
-#: editor.cc:144 editor.cc:3411 quantize_dialog.cc:38 quantize_dialog.cc:143
+#: editor.cc:144 editor.cc:3412 quantize_dialog.cc:38 quantize_dialog.cc:143
msgid "Beats/64"
msgstr "Schläge/64"
-#: editor.cc:145 editor.cc:3409 quantize_dialog.cc:39 quantize_dialog.cc:145
+#: editor.cc:145 editor.cc:3410 quantize_dialog.cc:39 quantize_dialog.cc:145
msgid "Beats/32"
msgstr "Schläge/32"
-#: editor.cc:146 editor.cc:3407
+#: editor.cc:146 editor.cc:3408
msgid "Beats/28"
msgstr "Schläge/28"
-#: editor.cc:147 editor.cc:3405
+#: editor.cc:147 editor.cc:3406
msgid "Beats/24"
msgstr "Schläge/24"
-#: editor.cc:148 editor.cc:3403
+#: editor.cc:148 editor.cc:3404
msgid "Beats/20"
msgstr "Schläge/20"
-#: editor.cc:149 editor.cc:3401 quantize_dialog.cc:40 quantize_dialog.cc:147
+#: editor.cc:149 editor.cc:3402 quantize_dialog.cc:40 quantize_dialog.cc:147
msgid "Beats/16"
msgstr "Schläge/16"
-#: editor.cc:150 editor.cc:3399
+#: editor.cc:150 editor.cc:3400
msgid "Beats/14"
msgstr "Schläge/14"
-#: editor.cc:151 editor.cc:3397
+#: editor.cc:151 editor.cc:3398
msgid "Beats/12"
msgstr "Schläge/12"
-#: editor.cc:152 editor.cc:3395
+#: editor.cc:152 editor.cc:3396
msgid "Beats/10"
msgstr "Schläge/10"
-#: editor.cc:153 editor.cc:3393 quantize_dialog.cc:41 quantize_dialog.cc:149
+#: editor.cc:153 editor.cc:3394 quantize_dialog.cc:41 quantize_dialog.cc:149
msgid "Beats/8"
msgstr "Schläge/8"
-#: editor.cc:154 editor.cc:3391
+#: editor.cc:154 editor.cc:3392
msgid "Beats/7"
msgstr "Schläge/7"
-#: editor.cc:155 editor.cc:3389
+#: editor.cc:155 editor.cc:3390
msgid "Beats/6"
msgstr "Schläge/6"
-#: editor.cc:156 editor.cc:3387
+#: editor.cc:156 editor.cc:3388
msgid "Beats/5"
msgstr "Schläge/5"
-#: editor.cc:157 editor.cc:3385 quantize_dialog.cc:42 quantize_dialog.cc:151
+#: editor.cc:157 editor.cc:3386 quantize_dialog.cc:42 quantize_dialog.cc:151
msgid "Beats/4"
msgstr "Schläge/4"
-#: editor.cc:158 editor.cc:3383 quantize_dialog.cc:43 quantize_dialog.cc:153
+#: editor.cc:158 editor.cc:3384 quantize_dialog.cc:43 quantize_dialog.cc:153
msgid "Beats/3"
msgstr "Schläge/3"
-#: editor.cc:159 editor.cc:3381 quantize_dialog.cc:44 quantize_dialog.cc:155
+#: editor.cc:159 editor.cc:3382 quantize_dialog.cc:44 quantize_dialog.cc:155
msgid "Beats/2"
msgstr "Schläge/2"
-#: editor.cc:160 editor.cc:3415 quantize_dialog.cc:45 quantize_dialog.cc:157
+#: editor.cc:160 editor.cc:3416 quantize_dialog.cc:45 quantize_dialog.cc:157
msgid "Beats"
msgstr "Schläge"
-#: editor.cc:161 editor.cc:3417
+#: editor.cc:161 editor.cc:3418
msgid "Bars"
msgstr "Takte"
-#: editor.cc:162 editor.cc:3419
+#: editor.cc:162 editor.cc:3420
msgid "Marks"
msgstr "Marker"
-#: editor.cc:163 editor.cc:3421
+#: editor.cc:163 editor.cc:3422
msgid "Region starts"
msgstr "Regionen-Anfang"
-#: editor.cc:164 editor.cc:3423
+#: editor.cc:164 editor.cc:3424
msgid "Region ends"
msgstr "Regionen-Ende"
-#: editor.cc:165 editor.cc:3427
+#: editor.cc:165 editor.cc:3428
msgid "Region syncs"
msgstr "Regionen-Sync"
-#: editor.cc:166 editor.cc:3425
+#: editor.cc:166 editor.cc:3426
msgid "Region bounds"
msgstr "Regionengrenzen"
-#: editor.cc:171 editor.cc:3455 editor_actions.cc:485
+#: editor.cc:171 editor.cc:3456 editor_actions.cc:485
msgid "No Grid"
msgstr "Raster aus"
-#: editor.cc:172 editor.cc:3457 editor_actions.cc:486
+#: editor.cc:172 editor.cc:3458 editor_actions.cc:486
msgid "Grid"
msgstr "Einrasten"
-#: editor.cc:173 editor.cc:3459 editor_actions.cc:487
+#: editor.cc:173 editor.cc:3460 editor_actions.cc:487
msgid "Magnetic"
msgstr "Magnetisch"
-#: editor.cc:178 editor.cc:188 editor.cc:3498 editor.cc:3523
+#: editor.cc:178 editor.cc:188 editor.cc:3499 editor.cc:3524
#: editor_actions.cc:117 editor_actions.cc:468
msgid "Playhead"
msgstr "Positionszeiger"
-#: editor.cc:179 editor.cc:3496 editor_actions.cc:470
+#: editor.cc:179 editor.cc:3497 editor_actions.cc:470
msgid "Marker"
msgstr "Marker"
-#: editor.cc:180 editor.cc:189 editor.cc:3525 editor_actions.cc:469
+#: editor.cc:180 editor.cc:189 editor.cc:3526 editor_actions.cc:469
msgid "Mouse"
msgstr "Maus"
-#: editor.cc:185 editor.cc:3517 mono_panner_editor.cc:42
+#: editor.cc:185 editor.cc:3518 mono_panner_editor.cc:42
msgid "Left"
msgstr "Links"
-#: editor.cc:186 editor.cc:3519 mono_panner_editor.cc:47
+#: editor.cc:186 editor.cc:3520 mono_panner_editor.cc:47
msgid "Right"
msgstr "Rechts"
-#: editor.cc:187 editor.cc:3521
+#: editor.cc:187 editor.cc:3522
msgid "Center"
msgstr "Mitte"
-#: editor.cc:190 editor.cc:3090 editor.cc:3527
+#: editor.cc:190 editor.cc:3091 editor.cc:3528
msgid "Edit point"
msgstr "Arbeitspunkt"
@@ -2665,337 +2639,337 @@ msgstr "Video Zeitleiste"
msgid "mode"
msgstr "Modus"
-#: editor.cc:542
+#: editor.cc:541
msgid "Regions"
msgstr "Regionen"
-#: editor.cc:543
+#: editor.cc:542
msgid "Tracks & Busses"
msgstr "Spuren & Busse"
-#: editor.cc:544
+#: editor.cc:543
msgid "Snapshots"
msgstr "Schnappschüsse"
-#: editor.cc:545
+#: editor.cc:544
msgid "Track & Bus Groups"
msgstr "Spuren & Bus-Gruppen"
-#: editor.cc:546
+#: editor.cc:545
msgid "Ranges & Marks"
msgstr "Bereiche & Marker"
-#: editor.cc:690 editor.cc:5345 rc_option_editor.cc:1294
-#: rc_option_editor.cc:1302 rc_option_editor.cc:1310 rc_option_editor.cc:1318
-#: rc_option_editor.cc:1335 rc_option_editor.cc:1337 rc_option_editor.cc:1345
-#: rc_option_editor.cc:1353 rc_option_editor.cc:1373 rc_option_editor.cc:1385
-#: rc_option_editor.cc:1387 rc_option_editor.cc:1395 rc_option_editor.cc:1403
-#: rc_option_editor.cc:1411 rc_option_editor.cc:1419 rc_option_editor.cc:1427
-#: rc_option_editor.cc:1442 rc_option_editor.cc:1446
+#: editor.cc:690 editor.cc:5346 rc_option_editor.cc:1292
+#: rc_option_editor.cc:1300 rc_option_editor.cc:1308 rc_option_editor.cc:1316
+#: rc_option_editor.cc:1333 rc_option_editor.cc:1335 rc_option_editor.cc:1343
+#: rc_option_editor.cc:1351 rc_option_editor.cc:1371 rc_option_editor.cc:1383
+#: rc_option_editor.cc:1385 rc_option_editor.cc:1393 rc_option_editor.cc:1401
+#: rc_option_editor.cc:1409 rc_option_editor.cc:1417 rc_option_editor.cc:1425
+#: rc_option_editor.cc:1440 rc_option_editor.cc:1444
msgid "Editor"
msgstr "Editor"
-#: editor.cc:1215 editor.cc:1225 editor.cc:4440 editor_actions.cc:130
+#: editor.cc:1215 editor.cc:1225 editor.cc:4441 editor_actions.cc:130
#: editor_actions.cc:1813
msgid "Loop"
msgstr "Schleife"
-#: editor.cc:1231 editor.cc:1241 editor.cc:4467 editor_actions.cc:131
+#: editor.cc:1231 editor.cc:1241 editor.cc:4468 editor_actions.cc:131
#: time_info_box.cc:67
msgid "Punch"
msgstr "Punch"
-#: editor.cc:1352
+#: editor.cc:1353
msgid "Linear (for highly correlated material)"
msgstr "Linear (für stark korreliertes Material)"
-#: editor.cc:1362 editor.cc:1499 editor.cc:1561
+#: editor.cc:1363 editor.cc:1500 editor.cc:1562
msgid "Constant power"
msgstr "Konstante Energie"
-#: editor.cc:1371 editor.cc:1492 editor.cc:1554
+#: editor.cc:1372 editor.cc:1493 editor.cc:1555
msgid "Symmetric"
msgstr "Symmetrisch"
-#: editor.cc:1381 editor.cc:1474 editor.cc:1536
+#: editor.cc:1382 editor.cc:1475 editor.cc:1537
msgid "Slow"
msgstr "Langsam"
-#: editor.cc:1390 editor.cc:1483 editor.cc:1545 sfdb_ui.cc:1627
+#: editor.cc:1391 editor.cc:1484 editor.cc:1546 sfdb_ui.cc:1627
#: sfdb_ui.cc:1736
msgid "Fast"
msgstr "Schnell"
-#: editor.cc:1437
+#: editor.cc:1438
msgid "programming error: fade in canvas item has no regionview data pointer!"
msgstr "Programmierfehler: fade in canvas item has no regionview data pointer!"
-#: editor.cc:1448 editor.cc:1512
+#: editor.cc:1449 editor.cc:1513
msgid "Deactivate"
msgstr "Deaktivieren"
-#: editor.cc:1450 editor.cc:1514
+#: editor.cc:1451 editor.cc:1515
msgid "Activate"
msgstr "Aktivieren"
-#: editor.cc:1458 editor.cc:1521
+#: editor.cc:1459 editor.cc:1522
msgid "Slowest"
msgstr "Sehr langsam"
-#: editor.cc:1572 route_time_axis.cc:1877 selection.cc:1009 selection.cc:1064
+#: editor.cc:1573 route_time_axis.cc:1877 selection.cc:1009 selection.cc:1064
msgid "programming error: "
msgstr "Programmierfehler:"
-#: editor.cc:1673 editor.cc:1681 editor_ops.cc:3522
+#: editor.cc:1674 editor.cc:1682 editor_ops.cc:3522
msgid "Freeze"
msgstr "Einfrieren"
-#: editor.cc:1677
+#: editor.cc:1678
msgid "Unfreeze"
msgstr "Auftauen"
-#: editor.cc:1816
+#: editor.cc:1817
msgid "Selected Regions"
msgstr "Ausgewählte Regionen"
-#: editor.cc:1852 editor_markers.cc:895
+#: editor.cc:1853 editor_markers.cc:895
msgid "Play Range"
msgstr "Bereich wiedergeben"
-#: editor.cc:1853 editor_markers.cc:898
+#: editor.cc:1854 editor_markers.cc:898
msgid "Loop Range"
msgstr "Bereich in Schleife wiedergeben"
-#: editor.cc:1862 editor_actions.cc:332
+#: editor.cc:1863 editor_actions.cc:332
msgid "Move Range Start to Previous Region Boundary"
msgstr "Anfang des Bereiches zur vorherigen Regiongrenze verschieben"
-#: editor.cc:1869 editor_actions.cc:339
+#: editor.cc:1870 editor_actions.cc:339
msgid "Move Range Start to Next Region Boundary"
msgstr "Anfang des Bereiches zur nächsten Regiongrenze verschieben"
-#: editor.cc:1876 editor_actions.cc:346
+#: editor.cc:1877 editor_actions.cc:346
msgid "Move Range End to Previous Region Boundary"
msgstr "Ende des Bereiches zur vorherigen Regiongrenze verschieben"
-#: editor.cc:1883 editor_actions.cc:353
+#: editor.cc:1884 editor_actions.cc:353
msgid "Move Range End to Next Region Boundary"
msgstr "Ende des Bereiches zur nächsten Regiongrenze verschieben"
-#: editor.cc:1889
+#: editor.cc:1890
msgid "Convert to Region In-Place"
msgstr "In Region umwanden (direkt)"
-#: editor.cc:1890
+#: editor.cc:1891
msgid "Convert to Region in Region List"
msgstr "In Region umwanden (in Regionenliste hinzufügen)"
-#: editor.cc:1893 editor_markers.cc:925
+#: editor.cc:1894 editor_markers.cc:925
msgid "Select All in Range"
msgstr "Alles im Bereich auswählen"
-#: editor.cc:1896
+#: editor.cc:1897
msgid "Set Loop from Range"
msgstr "Schleife aus Bereich erstellen"
-#: editor.cc:1897
+#: editor.cc:1898
msgid "Set Punch from Range"
msgstr "Punch aus Bereich erstellen"
-#: editor.cc:1900
+#: editor.cc:1901
msgid "Add Range Markers"
msgstr "Bereichsmarker einfügen"
-#: editor.cc:1903
+#: editor.cc:1904
msgid "Crop Region to Range"
msgstr "Region auf Bereich kürzen"
-#: editor.cc:1904
+#: editor.cc:1905
msgid "Fill Range with Region"
msgstr "Bereich mit Region füllen"
-#: editor.cc:1905 editor_actions.cc:289
+#: editor.cc:1906 editor_actions.cc:289
msgid "Duplicate Range"
msgstr "Bereich duplizieren"
-#: editor.cc:1908
+#: editor.cc:1909
msgid "Consolidate Range"
msgstr "Bereich als neue Region pre-Mixer"
-#: editor.cc:1909
+#: editor.cc:1910
msgid "Consolidate Range With Processing"
msgstr "Bereich als neue Region post-mixer"
-#: editor.cc:1910
+#: editor.cc:1911
msgid "Bounce Range to Region List"
msgstr "Auswahl zur Regionenliste bouncen"
-#: editor.cc:1911
+#: editor.cc:1912
msgid "Bounce Range to Region List With Processing"
msgstr "Auswahl zur Regionenliste bouncen (Post-Fader)"
-#: editor.cc:1912 editor_markers.cc:908
+#: editor.cc:1913 editor_markers.cc:908
msgid "Export Range..."
msgstr "Bereich exportieren..."
-#: editor.cc:1927 editor.cc:2008 editor_actions.cc:281
+#: editor.cc:1928 editor.cc:2009 editor_actions.cc:281
msgid "Play From Edit Point"
msgstr "Wiedergabe ab Arbeitspunkt"
-#: editor.cc:1928 editor.cc:2009
+#: editor.cc:1929 editor.cc:2010
msgid "Play From Start"
msgstr "Wiedergabe ab Anfang"
-#: editor.cc:1929
+#: editor.cc:1930
msgid "Play Region"
msgstr "Region wiedergeben"
-#: editor.cc:1931
+#: editor.cc:1932
msgid "Loop Region"
msgstr "Region in Schleife wiedergeben"
-#: editor.cc:1941 editor.cc:2018
+#: editor.cc:1942 editor.cc:2019
msgid "Select All in Track"
msgstr "Alles in der Spur auswählen"
-#: editor.cc:1942 editor.cc:2019 editor_actions.cc:185
+#: editor.cc:1943 editor.cc:2020 editor_actions.cc:185
#: export_timespan_selector.cc:53 processor_box.cc:2237
msgid "Select All"
msgstr "Alles auswählen"
-#: editor.cc:1943 editor.cc:2020
+#: editor.cc:1944 editor.cc:2021
msgid "Invert Selection in Track"
msgstr "Auswahl in der Spur umkehren"
-#: editor.cc:1944 editor.cc:2021 editor_actions.cc:187
+#: editor.cc:1945 editor.cc:2022 editor_actions.cc:187
msgid "Invert Selection"
msgstr "Auswahl umkehren"
-#: editor.cc:1946
+#: editor.cc:1947
msgid "Set Range to Loop Range"
msgstr "Bereich als Schleife auswählen"
-#: editor.cc:1947
+#: editor.cc:1948
msgid "Set Range to Punch Range"
msgstr "Bereich als Punchbereich"
-#: editor.cc:1949 editor.cc:2023 editor_actions.cc:188
+#: editor.cc:1950 editor.cc:2024 editor_actions.cc:188
msgid "Select All After Edit Point"
msgstr "Alle Regionen nach dem Arbeitspunkt auswählen"
-#: editor.cc:1950 editor.cc:2024 editor_actions.cc:189
+#: editor.cc:1951 editor.cc:2025 editor_actions.cc:189
msgid "Select All Before Edit Point"
msgstr "Alle Regionen vor dem Arbeitspunkt auswählen"
-#: editor.cc:1951 editor.cc:2025
+#: editor.cc:1952 editor.cc:2026
msgid "Select All After Playhead"
msgstr "Alle Regionen nach dem Positionszeiger auswählen"
-#: editor.cc:1952 editor.cc:2026
+#: editor.cc:1953 editor.cc:2027
msgid "Select All Before Playhead"
msgstr "Alle Regionen vor dem Positionszeiger auswählen"
-#: editor.cc:1953
+#: editor.cc:1954
msgid "Select All Between Playhead and Edit Point"
msgstr "Alle zwischen Positionszeiger und Arbeitspunkt auswählen"
-#: editor.cc:1954
+#: editor.cc:1955
msgid "Select All Within Playhead and Edit Point"
msgstr "Alles zwischen Positionszeiger und Arbeitspunkt auswählen"
-#: editor.cc:1955
+#: editor.cc:1956
msgid "Select Range Between Playhead and Edit Point"
msgstr "Wähle Bereich zwischen Positionszeiger und Arbeitspunkt aus"
-#: editor.cc:1957 editor.cc:2028 editor_actions.cc:127 editor_actions.cc:128
+#: editor.cc:1958 editor.cc:2029 editor_actions.cc:127 editor_actions.cc:128
msgid "Select"
msgstr "Auswahl"
-#: editor.cc:1965 editor.cc:2036 editor_actions.cc:309 processor_box.cc:2222
+#: editor.cc:1966 editor.cc:2037 editor_actions.cc:309 processor_box.cc:2222
msgid "Cut"
msgstr "Ausschneiden"
-#: editor.cc:1966 editor.cc:2037 editor_actions.cc:312 processor_box.cc:2225
+#: editor.cc:1967 editor.cc:2038 editor_actions.cc:312 processor_box.cc:2225
msgid "Copy"
msgstr "Kopieren"
-#: editor.cc:1967 editor.cc:2038 editor_actions.cc:313 processor_box.cc:2233
+#: editor.cc:1968 editor.cc:2039 editor_actions.cc:313 processor_box.cc:2233
msgid "Paste"
msgstr "Einfügen"
-#: editor.cc:1971 editor_actions.cc:87
+#: editor.cc:1972 editor_actions.cc:87
msgid "Align"
msgstr "Ausrichten"
-#: editor.cc:1972
+#: editor.cc:1973
msgid "Align Relative"
msgstr "Relativ ausrichten"
-#: editor.cc:1979
+#: editor.cc:1980
msgid "Insert Selected Region"
msgstr "Ausgewählte Region einfügen"
-#: editor.cc:1980
+#: editor.cc:1981
msgid "Insert Existing Media"
msgstr "Vorhandenes Material importieren"
-#: editor.cc:1989 editor.cc:2045
+#: editor.cc:1990 editor.cc:2046
msgid "Nudge Entire Track Later"
msgstr "Gesamte Spur schrittweise nach hinten"
-#: editor.cc:1990 editor.cc:2046
+#: editor.cc:1991 editor.cc:2047
msgid "Nudge Track After Edit Point Later"
msgstr "Spur nach Arbeitspunkt schrittweise nach hinten"
-#: editor.cc:1991 editor.cc:2047
+#: editor.cc:1992 editor.cc:2048
msgid "Nudge Entire Track Earlier"
msgstr "Gesamte Spur schrittweise nach vorne"
-#: editor.cc:1992 editor.cc:2048
+#: editor.cc:1993 editor.cc:2049
msgid "Nudge Track After Edit Point Earlier"
msgstr "Spur nach Arbeitspunkt schrittweise nach vorne"
-#: editor.cc:1994 editor.cc:2050
+#: editor.cc:1995 editor.cc:2051
msgid "Nudge"
msgstr "Verschieben"
-#: editor.cc:3070
+#: editor.cc:3071
msgid "Smart Mode (add Range functions to Object mode)"
msgstr "Smart-Modus (zusätzliche Bereichsfunktionen m Objekt-Modus)"
-#: editor.cc:3071
+#: editor.cc:3072
msgid "Object Mode (select/move Objects)"
msgstr "Objekt-Modus (Objekte auswählen/verschieben)"
-#: editor.cc:3072
+#: editor.cc:3073
msgid "Range Mode (select/move Ranges)"
msgstr "Bereichs-Modus (Bereiche auswählen/verschieben)"
-#: editor.cc:3073
+#: editor.cc:3074
msgid "Draw/Edit MIDI Notes"
msgstr "MIDI Noten eingeben/editieren"
-#: editor.cc:3074
+#: editor.cc:3075
msgid "Draw Region Gain"
msgstr "Lautstärkeautomation zeichnen"
-#: editor.cc:3075
+#: editor.cc:3076
msgid "Select Zoom Range"
msgstr "Zoombereich auswählen"
-#: editor.cc:3076
+#: editor.cc:3077
msgid "Stretch/Shrink Regions and MIDI Notes"
msgstr "Regionen und MIDI-Noten strecken/stauchen (Time-Stretch)"
-#: editor.cc:3077
+#: editor.cc:3078
msgid "Listen to Specific Regions"
msgstr "Ausgewählte Regionen vorhören"
-#: editor.cc:3078
+#: editor.cc:3079
msgid "Note Level Editing"
msgstr "Auf Notenebene bearbeiten"
-#: editor.cc:3079
+#: editor.cc:3080
msgid ""
"Groups: click to (de)activate\n"
"Context-click for other operations"
@@ -3003,51 +2977,51 @@ msgstr ""
"Gruppen: Klicken zum (De)aktivieren\n"
"Rechtsklick für Optionen"
-#: editor.cc:3080
+#: editor.cc:3081
msgid "Nudge Region/Selection Later"
msgstr "Region/Auswahl schrittweise nach hinten"
-#: editor.cc:3081
+#: editor.cc:3082
msgid "Nudge Region/Selection Earlier"
msgstr "Region/Auswahl schrittweise nach vorne"
-#: editor.cc:3082 editor_actions.cc:242
+#: editor.cc:3083 editor_actions.cc:242
msgid "Zoom In"
msgstr "Vergrößern"
-#: editor.cc:3083 editor_actions.cc:241
+#: editor.cc:3084 editor_actions.cc:241
msgid "Zoom Out"
msgstr "Verkleinern"
-#: editor.cc:3084 editor_actions.cc:243
+#: editor.cc:3085 editor_actions.cc:243
msgid "Zoom to Session"
msgstr "Auf ganzes Projekt zoomen"
-#: editor.cc:3085
+#: editor.cc:3086
msgid "Zoom focus"
msgstr "Zoom-Mittelpunkt"
-#: editor.cc:3086
+#: editor.cc:3087
msgid "Expand Tracks"
msgstr "Spuren vergrößern"
-#: editor.cc:3087
+#: editor.cc:3088
msgid "Shrink Tracks"
msgstr "Spuren verkleinern"
-#: editor.cc:3088
+#: editor.cc:3089
msgid "Snap/Grid Units"
msgstr "Rastereinheiten"
-#: editor.cc:3089
+#: editor.cc:3090
msgid "Snap/Grid Mode"
msgstr "Einrastmodus"
-#: editor.cc:3091
+#: editor.cc:3092
msgid "Edit Mode"
msgstr "Bearbeitungsmodus"
-#: editor.cc:3092
+#: editor.cc:3093
msgid ""
"Nudge Clock\n"
"(controls distance used to nudge regions and selections)"
@@ -3056,39 +3030,39 @@ msgstr ""
"(bestimmt den Abstand für das schrittweise Verschieben von Regionen und "
"Bereichen)"
-#: editor.cc:3194
+#: editor.cc:3195
msgid "malformed URL passed to drag-n-drop code"
msgstr "Ungültige URL an drag-n-drop-Code weitergeleitet"
-#: editor.cc:3256 editor_actions.cc:291
+#: editor.cc:3257 editor_actions.cc:291
msgid "Command|Undo"
msgstr "Rückgängig"
-#: editor.cc:3258
+#: editor.cc:3259
msgid "Command|Undo (%1)"
msgstr "Rückgängig (%1)"
-#: editor.cc:3265 editor_actions.cc:292
+#: editor.cc:3266 editor_actions.cc:292
msgid "Redo"
msgstr "Wiederherstellen"
-#: editor.cc:3267
+#: editor.cc:3268
msgid "Redo (%1)"
msgstr "Wiederherstellen (%1)"
-#: editor.cc:3286 editor.cc:3310 editor_actions.cc:106 editor_actions.cc:1794
+#: editor.cc:3287 editor.cc:3311 editor_actions.cc:106 editor_actions.cc:1794
msgid "Duplicate"
msgstr "Duplizieren"
-#: editor.cc:3287
+#: editor.cc:3288
msgid "Number of duplications:"
msgstr "Anzahl der Duplikate:"
-#: editor.cc:3864
+#: editor.cc:3865
msgid "Playlist Deletion"
msgstr "Löschen von Wiedergabelisten"
-#: editor.cc:3865
+#: editor.cc:3866
msgid ""
"Playlist %1 is currently unused.\n"
"If it is kept, its audio files will not be cleaned.\n"
@@ -3100,36 +3074,36 @@ msgstr ""
"Falls sie gelöscht wird, werden die ausschließlich von ihr verwendeten "
"Audiodateien gelöscht."
-#: editor.cc:3875
+#: editor.cc:3876
msgid "Delete Playlist"
msgstr "Wiedergabeliste löschen"
-#: editor.cc:3876
+#: editor.cc:3877
msgid "Keep Playlist"
msgstr "Wiedergabeliste behalten"
-#: editor.cc:3877 editor_audio_import.cc:581 editor_ops.cc:5856
+#: editor.cc:3878 editor_audio_import.cc:581 editor_ops.cc:5856
#: sfdb_freesound_mootcher.cc:69 processor_box.cc:2003 processor_box.cc:2028
msgid "Cancel"
msgstr "Abbrechen"
-#: editor.cc:4021
+#: editor.cc:4022
msgid "new playlists"
msgstr "Neue Wiedergabelisten"
-#: editor.cc:4037
+#: editor.cc:4038
msgid "copy playlists"
msgstr "Wiedergabelisten kopieren"
-#: editor.cc:4052
+#: editor.cc:4053
msgid "clear playlists"
msgstr "Wiedergabelisten zurücksetzen"
-#: editor.cc:4687
+#: editor.cc:4688
msgid "Please wait while %1 loads visual data."
msgstr "Bitte warten Sie, während %1 die Daten zur Anzeige des Projekts lädt."
-#: editor.cc:5492 editor_markers.cc:940 panner_ui.cc:393 processor_box.cc:2253
+#: editor.cc:5493 editor_markers.cc:940 panner_ui.cc:392 processor_box.cc:2253
msgid "Edit..."
msgstr "Bearbeiten..."
@@ -3178,8 +3152,8 @@ msgstr "Layering"
msgid "Position"
msgstr "Position"
-#: editor_actions.cc:101 gain_meter.cc:121 gain_meter.cc:791 panner_ui.cc:177
-#: panner_ui.cc:586
+#: editor_actions.cc:101 gain_meter.cc:120 gain_meter.cc:794 panner_ui.cc:176
+#: panner_ui.cc:585
msgid "Trim"
msgstr "Anpassen"
@@ -3229,7 +3203,7 @@ msgstr "MIDI Optionen"
msgid "Misc Options"
msgstr "Sonstiges"
-#: editor_actions.cc:115 rc_option_editor.cc:1460 route_group_dialog.cc:48
+#: editor_actions.cc:115 rc_option_editor.cc:1458 route_group_dialog.cc:48
#: session_option_editor.cc:218 session_option_editor.cc:225
msgid "Monitoring"
msgstr "Monitoring"
@@ -3637,11 +3611,11 @@ msgstr "Log"
#: editor_actions.cc:320
msgid "Move Later to Transient"
-msgstr "Zum nächsten Transienten"
+msgstr "Zum nächsten Transienten bewegen"
#: editor_actions.cc:321
msgid "Move Earlier to Transient"
-msgstr "Zum vorigen Transienten"
+msgstr "Zum vorigen Transienten bewegen"
#: editor_actions.cc:325
msgid "Start Range"
@@ -3966,7 +3940,7 @@ msgstr "Min:Sek"
msgid "Video Monitor"
msgstr "Videomonitor"
-#: editor_actions.cc:549 rc_option_editor.cc:1842
+#: editor_actions.cc:549 rc_option_editor.cc:1838
msgid "Video"
msgstr "Video"
@@ -4485,31 +4459,31 @@ msgstr "Tempomarker kopieren"
msgid "move tempo mark"
msgstr "Tempowechsel bewegen"
-#: editor_drag.cc:2545
+#: editor_drag.cc:2550
msgid "change fade in length"
msgstr "Ändere Fade-In Länge"
-#: editor_drag.cc:2663
+#: editor_drag.cc:2668
msgid "change fade out length"
msgstr "Fade-Out verändern"
-#: editor_drag.cc:3018
+#: editor_drag.cc:3023
msgid "move marker"
msgstr "Marker bewegen"
-#: editor_drag.cc:3581
+#: editor_drag.cc:3586
msgid "An error occurred while executing time stretch operation"
msgstr "Beim Ausführen der Timestretch-Operation trat ein Fehler auf"
-#: editor_drag.cc:4011
+#: editor_drag.cc:4016
msgid "programming_error: %1"
msgstr "Programmierfehler: %1"
-#: editor_drag.cc:4081 editor_markers.cc:680
+#: editor_drag.cc:4086 editor_markers.cc:680
msgid "new range marker"
msgstr "Neuer Bereich"
-#: editor_drag.cc:4762
+#: editor_drag.cc:4767
msgid "rubberband selection"
msgstr "Gummiband-Auswahl"
@@ -5206,7 +5180,7 @@ msgstr "Übermäßige Aufteilung?"
#: editor_ops.cc:6125
msgid "place transient"
-msgstr "Transienten Platzieren"
+msgstr "Transienten platzieren"
#: editor_ops.cc:6160
msgid "snap regions to grid"
@@ -5401,8 +5375,8 @@ msgstr "G"
msgid "Region position glued to Bars|Beats time?"
msgstr "Regionenposition an Takt und Schäge gebunden?"
-#: editor_regions.cc:120 editor_routes.cc:207 gain_meter.cc:759
-#: mixer_strip.cc:1931 meter_strip.cc:320 panner_ui.cc:554
+#: editor_regions.cc:120 editor_routes.cc:207 gain_meter.cc:762
+#: mixer_strip.cc:1931 meter_strip.cc:320 panner_ui.cc:553
#: stereo_panner.cc:237
msgid "M"
msgstr "M"
@@ -5447,8 +5421,7 @@ msgstr "Ungenutzte Regionen entfernen"
msgid "Mult."
msgstr "Viele"
-#: editor_regions.cc:847 engine_dialog.cc:84 midi_list_editor.cc:103
-#: time_info_box.cc:91
+#: editor_regions.cc:847 midi_list_editor.cc:103 time_info_box.cc:91
msgid "Start"
msgstr "Start"
@@ -5514,7 +5487,7 @@ msgstr "Solo ein"
msgid "SI"
msgstr "SI"
-#: editor_routes.cc:209 mixer_strip.cc:353 rc_option_editor.cc:1880
+#: editor_routes.cc:209 mixer_strip.cc:353 rc_option_editor.cc:1876
msgid "Solo Isolated"
msgstr "Isoliertes Solo"
@@ -5733,264 +5706,196 @@ msgstr ""
"Time-Stretch konnte nicht gestartet werden - Fehler beim erstellen des "
"Threads"
-#: engine_dialog.cc:75
-msgid "Realtime"
-msgstr "Realtime"
+#: engine_dialog.cc:73
+msgid "Device Control Panel"
+msgstr "Gerätekontrollfeld"
-#: engine_dialog.cc:76
-msgid "Do not lock memory"
-msgstr "Speicherzugriff nicht sperren"
+#: engine_dialog.cc:74 engine_dialog.cc:1600
+msgid "Measure latency"
+msgstr "Latenz messen"
-#: engine_dialog.cc:77
-msgid "Unlock memory"
-msgstr "Speicherzugriff öffnen"
+#: engine_dialog.cc:75
+msgid "Use results"
+msgstr "Benutze Ergebnisse"
#: engine_dialog.cc:78
-msgid "No zombies"
-msgstr "Keine Zombies (Soft Mode)"
+msgid "Refresh list"
+msgstr "Liste auffrischen"
#: engine_dialog.cc:79
-msgid "Provide monitor ports"
-msgstr "Monitor-Ports erstellen"
-
-#: engine_dialog.cc:80
-msgid "Force 16 bit"
-msgstr "Erzwinge 16 Bit"
-
-#: engine_dialog.cc:81
-msgid "H/W monitoring"
-msgstr "Hardware Monitoring"
-
-#: engine_dialog.cc:82
-msgid "H/W metering"
-msgstr "Hardware-Pegelanzeige"
-
-#: engine_dialog.cc:83
-msgid "Verbose output"
-msgstr "Ausführliche Statusmeldungen"
+msgid "Start MIDI ALSA/JACK bridge"
+msgstr "Starte MIDI ALSA/JACK bridge"
-#: engine_dialog.cc:103
-msgid "8000Hz"
-msgstr "8000 Hz"
+#: engine_dialog.cc:121
+msgid "Latency Measurement Tool"
+msgstr "Latenzmeßwerkzeug"
-#: engine_dialog.cc:104
-msgid "22050Hz"
-msgstr "22050 Hz"
-
-#: engine_dialog.cc:105
-msgid "44100Hz"
-msgstr "44100 Hz"
-
-#: engine_dialog.cc:106
-msgid "48000Hz"
-msgstr "48000 Hz"
-
-#: engine_dialog.cc:107
-msgid "88200Hz"
-msgstr "88200 Hz"
-
-#: engine_dialog.cc:108
-msgid "96000Hz"
-msgstr "96000 Hz"
-
-#: engine_dialog.cc:109
-msgid "192000Hz"
-msgstr "192000 Hz"
-
-#: engine_dialog.cc:127 engine_dialog.cc:132 engine_dialog.cc:169
-#: engine_dialog.cc:562 midi_channel_selector.cc:163
-#: midi_channel_selector.cc:402 midi_channel_selector.cc:438
-#: rc_option_editor.cc:1250 sfdb_ui.cc:538
-msgid "None"
-msgstr "Kein"
-
-#: engine_dialog.cc:128 engine_dialog.cc:563
-msgid "Triangular"
-msgstr "dreieckig"
-
-#: engine_dialog.cc:129 engine_dialog.cc:565
-msgid "Rectangular"
-msgstr "rechteckig"
-
-#: engine_dialog.cc:130 engine_dialog.cc:567
-msgid "Shaped"
-msgstr "shaped"
+#: engine_dialog.cc:134
+msgid ""
+"<span weight=\"bold\">Turn down the volume on your hardware to a very low "
+"level.</span>"
+msgstr ""
+"<span weight=\"bold\">Stellen Sie Ihre Hardwarelautstärke auf einen sehr "
+"niedrigen "
+"Pegel ein.</span>"
-#: engine_dialog.cc:158 engine_dialog.cc:483 engine_dialog.cc:974
-msgid "Playback/recording on 1 device"
-msgstr "Wiedergabe/Aufnahme mit einem Gerät"
+#: engine_dialog.cc:142
+msgid ""
+"Select two channels below and connect them using a cable or (less ideally) a "
+"speaker and microphone."
+msgstr ""
+"Wählen Sie unten zwei Kanäle aus und verbinden sie mit einem Kabel oder "
+"(weniger empfehlenswert) mittels Lautsprecher und Mikrofon."
-#: engine_dialog.cc:159 engine_dialog.cc:487 engine_dialog.cc:540
-#: engine_dialog.cc:977
-msgid "Playback/recording on 2 devices"
-msgstr "Wiedergabe/Aufnahme mit zwei Geräten"
+#: engine_dialog.cc:147
+msgid "Output channel"
+msgstr "Ausgangskanal"
-#: engine_dialog.cc:160 engine_dialog.cc:503 engine_dialog.cc:980
-msgid "Playback only"
-msgstr "Nur Wiedergabe"
+#: engine_dialog.cc:155
+msgid "Input channel"
+msgstr "Eingangskanal"
-#: engine_dialog.cc:161 engine_dialog.cc:505 engine_dialog.cc:983
-msgid "Recording only"
-msgstr "Nur Aufnahme"
+#: engine_dialog.cc:174
+msgid "Once the channels are connected, click the \"Measure latency\" button."
+msgstr ""
+"Wenn die Kanäle verbunden sind, klicken Sie den Knopf \"Latenz messen\"."
-#: engine_dialog.cc:171 engine_dialog.cc:448
-msgid "coremidi"
-msgstr "coremidi"
+#: engine_dialog.cc:187
+msgid "When satisfied with the results, click the \"Use results\" button."
+msgstr ""
+"Wenn Sie mit dem Resultat zufrieden sind, klicken Sie den Knopf \"Benutze "
+"Ergebnisse\"."
-#: engine_dialog.cc:173 engine_dialog.cc:581
-msgid "seq"
-msgstr "seq"
+#: engine_dialog.cc:203 route_params_ui.cc:105
+msgid "Latency"
+msgstr "Latenz"
-#: engine_dialog.cc:174 engine_dialog.cc:583
-msgid "raw"
-msgstr "raw"
+#: engine_dialog.cc:298
+msgid "Audio System:"
+msgstr "Audiosystem:"
-#: engine_dialog.cc:181
+#: engine_dialog.cc:337
msgid "Driver:"
msgstr "Treiber:"
-#: engine_dialog.cc:186
-msgid "Audio Interface:"
-msgstr "Audio-Schnittstelle:"
+#: engine_dialog.cc:343
+msgid "Device:"
+msgstr "Gerät:"
-#: engine_dialog.cc:191 sfdb_ui.cc:147 sfdb_ui.cc:260 sfdb_ui.cc:265
+#: engine_dialog.cc:348 engine_dialog.cc:430 sfdb_ui.cc:147 sfdb_ui.cc:260
+#: sfdb_ui.cc:265
msgid "Sample rate:"
msgstr "Samplerate:"
-#: engine_dialog.cc:196
+#: engine_dialog.cc:354 engine_dialog.cc:437
msgid "Buffer size:"
msgstr "Puffergröße"
-#: engine_dialog.cc:202
-msgid "Number of buffers:"
-msgstr "Pufferanzahl:"
+#: engine_dialog.cc:367
+msgid "Input Channels:"
+msgstr "Eingangskanäle:"
-#: engine_dialog.cc:209
-msgid "Approximate latency:"
-msgstr "Latenz (ca.)"
+#: engine_dialog.cc:378
+msgid "Output Channels:"
+msgstr "Ausgangskanäle:"
-#: engine_dialog.cc:222
-msgid "Audio mode:"
-msgstr "Audio-Modus:"
+#: engine_dialog.cc:389
+msgid "Hardware input latency:"
+msgstr "Hardware Eingangslatenz (Samples)"
-#: engine_dialog.cc:284 engine_dialog.cc:408
-msgid "Ignore"
-msgstr "ignorieren"
+#: engine_dialog.cc:392 engine_dialog.cc:405
+msgid "samples"
+msgstr "Samples"
-#: engine_dialog.cc:292
-msgid "Client timeout"
-msgstr "Client Timeout"
+#: engine_dialog.cc:402
+msgid "Hardware output latency:"
+msgstr "Hardware Ausgangslatenz (Samples)"
-#: engine_dialog.cc:299
-msgid "Number of ports:"
-msgstr "Portanzahl"
+#: engine_dialog.cc:422
+msgid ""
+"The %1 audio backend was configured and started externally.\n"
+"This limits your control over it."
+msgstr ""
+"Das %1 Audiobackend wurde extern konfiguriert und gestartet.\n"
+"Dies beschränkt Ihre Kontrolle darüber."
-#: engine_dialog.cc:304
-msgid "MIDI driver:"
-msgstr "MIDI-Treiber:"
+#: engine_dialog.cc:531
+msgid "MIDI Inputs"
+msgstr "MIDI Eingänge"
-#: engine_dialog.cc:310
-msgid "Dither:"
-msgstr "Dithering:"
+#: engine_dialog.cc:548
+msgid "MIDI Outputs"
+msgstr "MIDI Ausgänge"
-#: engine_dialog.cc:319
-msgid ""
-"No JACK server found anywhere on this system. Please install JACK and restart"
-msgstr ""
-"Es wurde kein JACK Server auf diesem System gefunden. Bitte installieren Sie "
-"JACK vor einem Neuversuch."
+#: engine_dialog.cc:617
+msgid "all available channels"
+msgstr "alle verfügbaren Kanäle"
-#: engine_dialog.cc:327
-msgid "Server:"
-msgstr "Server:"
+#: engine_dialog.cc:811
+#, c-format
+msgid "%u samples"
+msgstr "%u Samples"
-#: engine_dialog.cc:339
-msgid "Input device:"
-msgstr "Eingangsgerät:"
+#: engine_dialog.cc:862
+#, c-format
+msgid "(%.1f msecs)"
+msgstr "(%.1f msecs)"
-#: engine_dialog.cc:343
-msgid "Output device:"
-msgstr "Ausgabegerät:"
+#: engine_dialog.cc:1281
+msgid "Cannot set driver to %1"
+msgstr "Kann Treiber nicht auf %1 setzen"
-#: engine_dialog.cc:348
-msgid "Hardware input latency:"
-msgstr "Hardware Eingangslatenz (Samples)"
+#: engine_dialog.cc:1285
+msgid "Cannot set device name to %1"
+msgstr "Kann Gerät nicht auf %1 setzen"
-#: engine_dialog.cc:351 engine_dialog.cc:357
-msgid "samples"
-msgstr "Samples"
+#: engine_dialog.cc:1289
+msgid "Cannot set sample rate to %1"
+msgstr "Kann Samplerate nicht auf %1 setzen"
-#: engine_dialog.cc:354
-msgid "Hardware output latency:"
-msgstr "Hardware Ausgangslatenz (Samples)"
+#: engine_dialog.cc:1293
+msgid "Cannot set buffer size to %1"
+msgstr "Kann Buffergröße nicht auf %1 setzen"
-#: engine_dialog.cc:368
-msgid "Device"
-msgstr "Gerät"
+#: engine_dialog.cc:1299
+msgid "Cannot set input channels to %1"
+msgstr "Kann Eingangskanäle nicht auf %1 setzen"
-#: engine_dialog.cc:370
-msgid "Advanced"
-msgstr "Erweitert"
+#: engine_dialog.cc:1303
+msgid "Cannot set output channels to %1"
+msgstr "Kann Ausgangskanäle nicht auf %1 setzen"
-#: engine_dialog.cc:653
-msgid "cannot open JACK rc file %1 to store parameters"
-msgstr "kann die JACK rc-Datei %1 nicht öffnen, um die Parameter zu sichern"
+#: engine_dialog.cc:1309
+msgid "Cannot set input latency to %1"
+msgstr "Kann Eingangslatenz nicht auf %1 setzen"
-#: engine_dialog.cc:787
-msgid ""
-"You do not have any audio devices capable of\n"
-"simultaneous playback and recording.\n"
-"\n"
-"Please use Applications -> Utilities -> Audio MIDI Setup\n"
-"to create an \"aggregrate\" device, or install a suitable\n"
-"audio interface.\n"
-"\n"
-"Please send email to Apple and ask them why new Macs\n"
-"have no duplex audio device.\n"
-"\n"
-"Alternatively, if you really want just playback\n"
-"or recording but not both, start JACK before running\n"
-"%1 and choose the relevant device then."
-msgstr ""
-"Sie haben keine Soundkarte, die gleichzeitiges\n"
-"Abspielen und Aufnehmen unterstützt.\n"
-"\n"
-"Benützen Sie Programme>Dienstprogramme>Audio-Midi-Setup\n"
-" um ein kombiniertes Gerät zu erzeugen, oder installieren Sie ein\n"
-"geeignetes Audiointerface.\n"
-"\n"
-"Bitte senden Sie eine E-Mail an Apple und fragen Sie, warum Sie\n"
-"keine Duplex Soundkarte in Ihrem Mac haben.\n"
-"\n"
-"Wenn Sie Audiomaterial wirklich nicht gleichzeitig aufnehmen und wiedergeben "
-"wollen,\n"
-"können Sie JACK vor dem Starten von %1 aufrufen und das entsprechende Gerät "
-"auswählen."
+#: engine_dialog.cc:1313
+msgid "Cannot set output latency to %1"
+msgstr "Kann Ausgangslatenz nicht auf %1 setzen"
-#: engine_dialog.cc:800
-msgid "No suitable audio devices"
-msgstr "Keine passenden Audiogeräte."
+#: engine_dialog.cc:1534
+msgid "No signal detected "
+msgstr "Kein Signal erkannt"
-#: engine_dialog.cc:1017
-msgid "JACK appears to be missing from the %1 bundle"
-msgstr "JACK scheint im %1-Paket zu fehlen."
+#: engine_dialog.cc:1547 port_insert_ui.cc:71 port_insert_ui.cc:99
+msgid "Disconnected from audio engine"
+msgstr "Von Audio-Engine getrennt"
-#: engine_dialog.cc:1087
-msgid "You need to choose an audio device first."
-msgstr "Sie müssen zuerst ein Audiogerät auswählen."
+#: engine_dialog.cc:1587 port_insert_ui.cc:135
+msgid "Detecting ..."
+msgstr "Messe..."
-#: engine_dialog.cc:1104
-msgid "Audio device \"%1\" not known on this computer."
-msgstr "Audiogerät %1 scheint auf diesem Computer nicht vorhanden zu sein."
+#: engine_dialog.cc:1589
+msgid "Cancel measurement"
+msgstr "Messung abbrechen"
-#: engine_dialog.cc:1256
-msgid "AudioSetup value for %1 is missing data"
-msgstr "Es fehlen Daten zum AudioSetup-Wert von %1"
+#: engine_dialog.cc:1657
+msgid "Disconnect from %1"
+msgstr "Trenne von %1"
-#: engine_dialog.cc:1335
-msgid "configuration files contain a JACK server path that doesn't exist (%1)"
-msgstr ""
-"die Konfiguration enthält einen JACK-Serverpfad, der nicht existiert (%1)"
+#: engine_dialog.cc:1669
+msgid "Connect to %1"
+msgstr "Verbinde zu %1"
#: export_channel_selector.cc:45 sfdb_ui.cc:145
msgid "Channels:"
@@ -6325,72 +6230,77 @@ msgstr "getSoundResourceFile: Wurzel = %1, != Antwort"
msgid "%1"
msgstr "%1"
-#: gain_meter.cc:106 gain_meter.cc:357 gain_meter.cc:462 gain_meter.cc:856
+#: gain_meter.cc:105 gain_meter.cc:360 gain_meter.cc:465 gain_meter.cc:859
msgid "-inf"
msgstr "-inf"
-#: gain_meter.cc:112 gain_meter.cc:913
+#: gain_meter.cc:111 gain_meter.cc:916
msgid "Fader automation mode"
msgstr "Fader Automationsmodus"
-#: gain_meter.cc:113 gain_meter.cc:914
+#: gain_meter.cc:112 gain_meter.cc:917
msgid "Fader automation type"
msgstr "Fader-Automationstyp"
-#: gain_meter.cc:122 gain_meter.cc:795 panner_ui.cc:178 panner_ui.cc:590
+#: gain_meter.cc:121 gain_meter.cc:798 panner_ui.cc:177 panner_ui.cc:589
msgid "Abs"
msgstr "Abs"
-#: gain_meter.cc:762 mixer_strip.cc:1948 meter_strip.cc:337 panner_ui.cc:557
+#: gain_meter.cc:765 mixer_strip.cc:1948 meter_strip.cc:337 panner_ui.cc:556
#: route_time_axis.cc:2411
msgid "P"
msgstr "P"
-#: gain_meter.cc:765 panner_ui.cc:560
+#: gain_meter.cc:768 panner_ui.cc:559
msgid "T"
msgstr "T"
-#: gain_meter.cc:768 panner_ui.cc:563
+#: gain_meter.cc:771 panner_ui.cc:562
msgid "W"
msgstr "W"
-#: generic_pluginui.cc:83
+#: generic_pluginui.cc:81
msgid "<span size=\"large\">Presets</span>"
msgstr "<span size=\"large\">Voreinstellungen</span>"
-#: generic_pluginui.cc:232
+#: generic_pluginui.cc:230
msgid "Switches"
msgstr "Schalter"
-#: generic_pluginui.cc:242 generic_pluginui.cc:376 processor_box.cc:2212
+#: generic_pluginui.cc:240 generic_pluginui.cc:374 processor_box.cc:2212
msgid "Controls"
msgstr "Steuerelemente"
-#: generic_pluginui.cc:270
+#: generic_pluginui.cc:268
msgid "Plugin Editor: could not build control element for port %1"
msgstr "Plugin Editor: konnte kein Steuerelement für Port %1 erzeugen"
-#: generic_pluginui.cc:408
+#: generic_pluginui.cc:406
msgid "Meters"
msgstr "Pegelanzeigen"
-#: generic_pluginui.cc:423
+#: generic_pluginui.cc:421
msgid "Automation control"
msgstr "Automation"
-#: generic_pluginui.cc:430
+#: generic_pluginui.cc:428
msgid "Mgnual"
msgstr "Mgnuell"
-#: global_port_matrix.cc:164
+#: global_port_matrix.cc:157
msgid "Audio Connection Manager"
msgstr "Audio Verbindungsmanager"
-#: global_port_matrix.cc:167
+#: global_port_matrix.cc:160
msgid "MIDI Connection Manager"
msgstr "Midi Verbindungsmanager"
-#: global_port_matrix.cc:213 io_selector.cc:216
+#: global_port_matrix.cc:200 io_selector.cc:210 mixer_strip.cc:719
+#: mixer_strip.cc:845
+msgid "Disconnect"
+msgstr "Trenne"
+
+#: global_port_matrix.cc:206 io_selector.cc:216
msgid "port"
msgstr "Port"
@@ -6588,19 +6498,19 @@ msgstr ""
msgid "Main_menu"
msgstr "Hauptmenü"
-#: keyeditor.cc:255
+#: keyeditor.cc:253
msgid "redirectmenu"
msgstr "Umleitungsmenü"
-#: keyeditor.cc:257
+#: keyeditor.cc:255
msgid "Editor_menus"
msgstr "Editor-Menü"
-#: keyeditor.cc:259
+#: keyeditor.cc:257
msgid "RegionList"
msgstr "Regionenliste"
-#: keyeditor.cc:261
+#: keyeditor.cc:259
msgid "ProcessorMenu"
msgstr "Prozessor-Menü"
@@ -6622,7 +6532,7 @@ msgid_plural "%1 samples"
msgstr[0] "%1 Sample"
msgstr[1] "%1 Samples"
-#: latency_gui.cc:72 panner_ui.cc:392
+#: latency_gui.cc:72 panner_ui.cc:391
msgid "Reset"
msgstr "Zurücksetzen"
@@ -6714,103 +6624,73 @@ msgstr "<b>Bereiche (Inclusive CD Track-Bereichen)</b>"
msgid "add range marker"
msgstr "Bereich hinzufügen"
-#: main.cc:83
-msgid "%1 could not connect to JACK."
-msgstr "%1 konnte nicht zu JACK verbinden."
+#: main.cc:81
+msgid "%1 could not connect to the audio backend."
+msgstr "%1 konnte nicht zum Audiobackend verbinden."
-#: main.cc:87
-msgid ""
-"There are several possible reasons:\n"
-"\n"
-"1) JACK is not running.\n"
-"2) JACK is running as another user, perhaps root.\n"
-"3) There is already another client called \"%1\".\n"
-"\n"
-"Please consider the possibilities, and perhaps (re)start JACK."
-msgstr ""
-"Dafür kann es verschiedene Gründe geben:\n"
-"\n"
-"1) JACK läuft nicht.\n"
-"2) JACK wurde unter einem anderen Benutzer gestartet, möglicherweise als "
-"root.\n"
-"3) Es gibt bereits einen anderen Client mit der Bezeichnung \"%1\".\n"
-"\n"
-"Betrachten Sie bitte diese Möglichkeiten und starten Sie ggf. JACK neu."
-
-#: main.cc:203 main.cc:324
+#: main.cc:194 main.cc:315
msgid "cannot create user %3 folder %1 (%2)"
msgstr "Kann benutzerspezifischen %3-Ordner %1 nicht erstellen: %2"
-#: main.cc:210 main.cc:331
+#: main.cc:201 main.cc:322
msgid "cannot open pango.rc file %1"
msgstr "kann die Datei pango.rc nicht öffnen %1"
-#: main.cc:235 main.cc:358
+#: main.cc:226 main.cc:349
msgid "Cannot find ArdourMono TrueType font"
msgstr "Kann den TrueType-Font ArdourMono nicht finden"
-#: main.cc:247 main.cc:364
+#: main.cc:238 main.cc:355
msgid "Cannot load ArdourMono TrueType font."
msgstr "Kann den TrueType-Font ArdourMono nicht laden."
-#: main.cc:312
+#: main.cc:303
msgid ""
"No fontconfig file found on your system. Things may looked very odd or ugly"
msgstr ""
"Keine fontconfig-Datei auf Ihrem System gefunden. Das kann zu seltsamem oder "
"hässlichem Aussehen führen"
-#: main.cc:368
+#: main.cc:359
msgid "Failed to set fontconfig configuration."
msgstr "Fontconfig-Konfiguration gescheitert."
-#: main.cc:379 main.cc:395
-msgid "JACK exited"
-msgstr "JACK wurde beendet"
+#: main.cc:370 main.cc:386
+msgid "The audio backend (%1) has failed, or terminated"
+msgstr "Das Audiobackend (%1) funktioniert nicht oder wurde beendet"
-#: main.cc:382
+#: main.cc:373
msgid ""
-"JACK exited unexpectedly, and without notifying %1.\n"
+"%2 exited unexpectedly, and without notifying %1.\n"
"\n"
-"This could be due to misconfiguration or to an error inside JACK.\n"
+"This could be due to misconfiguration or to an error inside %2.\n"
"\n"
"Click OK to exit %1."
msgstr ""
-"JACK wurde unerwartet und ohne Benachrichtigung beendet %1.\n"
+"%2 wurde unerwartet und ohne %1 zu benachrichtigen beendet .\n"
"\n"
"Dies liegt entweder an einer fehlerhaften Konfiguration oder an einem Fehler "
-"in JACK.\n"
+"in %2.\n"
"\n"
"Klicke OK, um %1 zu verlassen."
-#: main.cc:397
-msgid ""
-"JACK exited unexpectedly, and without notifying %1.\n"
-"\n"
-"This is probably due to an error inside JACK. You should restart JACK\n"
-"and reconnect %1 to it, or exit %1 now. You cannot save your\n"
-"session at this time, because we would lose your connection information.\n"
-msgstr ""
-"JACK wurde unerwartet und ohne Benachrichtigung beendet %1.\n"
-"\n"
-"Dies liegt wahrscheinlich an einem Fehler in JACK. Sie sollten\n"
-"JACK neu starten und %1 erneut mit ihm verbinden, oder %1 jetzt beenden.\n"
-"Momentan läßt sich das Projekt nicht speichern, da alle Informationen\n"
-"über Verbindungen verloren gehen würden.\n"
+#: main.cc:387
+msgid "%2 exited unexpectedly, and without notifying %1."
+msgstr "%2 wurde unerwartet und ohne %1 zu benachrichtigen beendet "
-#: main.cc:487
+#: main.cc:474
msgid " (built using "
msgstr " (kompiliert mit Version "
-#: main.cc:490
+#: main.cc:477
msgid " and GCC version "
msgstr " und GCC Version"
-#: main.cc:500
+#: main.cc:487
msgid "Copyright (C) 1999-2012 Paul Davis"
msgstr "Copyright (C) 1999-2012 Paul Davis"
-#: main.cc:501
+#: main.cc:488
msgid ""
"Some portions Copyright (C) Steve Harris, Ari Johnson, Brett Viren, Joel "
"Baker, Robin Gareus"
@@ -6818,34 +6698,34 @@ msgstr ""
"Einige Teile Copyright (C) Steve Harris, Ari Johnson, Brett Viren, Joel "
"Baker, Robin Gareus"
-#: main.cc:503
+#: main.cc:490
msgid "%1 comes with ABSOLUTELY NO WARRANTY"
msgstr "%1 wird Ihnen ohne jegliche Gewährleistung"
-#: main.cc:504
+#: main.cc:491
msgid "not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
msgstr ""
"für allgemeine oder spezielle Gebrauchstauglichkeit zur Verfügung gestellt."
-#: main.cc:505
+#: main.cc:492
msgid "This is free software, and you are welcome to redistribute it "
msgstr "Dies ist freie Software, die Sie gerne weitergeben dürfen"
-#: main.cc:506
+#: main.cc:493
msgid "under certain conditions; see the source for copying conditions."
msgstr ""
"solange Sie sich an die Bedingungen, die in der Datei COPYING aufgeführt "
"sind halten."
-#: main.cc:513
+#: main.cc:500
msgid "could not initialize %1."
msgstr "Konnte %1 nicht initialisieren."
-#: main.cc:522
+#: main.cc:509
msgid "Cannot xinstall SIGPIPE error handler"
msgstr "Kann die SIGPIPE Fehlerbehandlung nicht installieren"
-#: main.cc:528
+#: main.cc:515
msgid "could not create %1 GUI"
msgstr "konnte das %1 GUI nicht erstellen"
@@ -6862,6 +6742,11 @@ msgstr "MarkerText"
msgid "All"
msgstr "Alle"
+#: midi_channel_selector.cc:163 midi_channel_selector.cc:402
+#: midi_channel_selector.cc:438 rc_option_editor.cc:1248 sfdb_ui.cc:538
+msgid "None"
+msgstr "Kein"
+
#: midi_channel_selector.cc:167 midi_channel_selector.cc:407
#: midi_channel_selector.cc:443
msgid "Invert"
@@ -7250,27 +7135,27 @@ msgstr "alle"
msgid "some"
msgstr "einige"
-#: midi_tracer.cc:43
+#: midi_tracer.cc:46
msgid "Line history: "
msgstr "Aktionsliste:"
-#: midi_tracer.cc:51
+#: midi_tracer.cc:54
msgid "Auto-Scroll"
msgstr "Auto-Scroll"
-#: midi_tracer.cc:52
+#: midi_tracer.cc:55
msgid "Decimal"
msgstr "Dezimal"
-#: midi_tracer.cc:53 rc_option_editor.cc:659
+#: midi_tracer.cc:56 rc_option_editor.cc:657
msgid "Enabled"
msgstr "Aktiviert"
-#: midi_tracer.cc:54
+#: midi_tracer.cc:57
msgid "Delta times"
msgstr "Deltazeiten"
-#: midi_tracer.cc:66
+#: midi_tracer.cc:70
msgid "Port:"
msgstr "Port:"
@@ -7411,7 +7296,7 @@ msgid "pre"
msgstr "Pre"
#: mixer_strip.cc:95 mixer_strip.cc:123 mixer_strip.cc:354 mixer_strip.cc:1300
-#: rc_option_editor.cc:1881
+#: rc_option_editor.cc:1877
msgid "Comments"
msgstr "Kommentare"
@@ -7459,11 +7344,11 @@ msgstr "iso"
msgid "Mix group"
msgstr "Bearbeitungsgruppe"
-#: mixer_strip.cc:351 rc_option_editor.cc:1878
+#: mixer_strip.cc:351 rc_option_editor.cc:1874
msgid "Phase Invert"
msgstr "Phaseninvertierung"
-#: mixer_strip.cc:352 rc_option_editor.cc:1879 route_ui.cc:1218
+#: mixer_strip.cc:352 rc_option_editor.cc:1875 route_ui.cc:1218
msgid "Solo Safe"
msgstr "Solo sperren"
@@ -7471,7 +7356,7 @@ msgstr "Solo sperren"
msgid "Group"
msgstr "Gruppe"
-#: mixer_strip.cc:356 rc_option_editor.cc:1882
+#: mixer_strip.cc:356 rc_option_editor.cc:1878
msgid "Meter Point"
msgstr "Abgreifpunkt der Pegelanzeige"
@@ -7492,9 +7377,10 @@ msgid "Snd"
msgstr "Snd"
#: mixer_strip.cc:701 mixer_strip.cc:829 processor_box.cc:2154
-msgid "Not connected to JACK - no I/O changes are possible"
+msgid "Not connected to audio engine - no I/O changes are possible"
msgstr ""
-"Nicht mit Jack verbunden - es sind keine Änderungen an Ein-/Ausgängen möglich"
+"Nicht mit Audioengine verbunden - es sind keine Änderungen an Ein-/Ausgängen "
+"möglich"
#: mixer_strip.cc:1096
msgid "<b>INPUT</b> to %1"
@@ -8014,11 +7900,11 @@ msgstr ""
#: opts.cc:63
msgid ""
-" -c, --name <name> Use a specific jack client name, default is "
+" -c, --name <name> Use a specific backend client name, default is "
"ardour\n"
msgstr ""
-" -c, --name name Benutze spezielle JACK-Clientkennung, "
-"Standard: ardour\n"
+" -c, --name name Benutze speziellen Backend-Clientnamen, "
+"Voreinstellung: ardour\n"
#: opts.cc:64
msgid ""
@@ -8092,7 +7978,7 @@ msgstr ""
msgid "Panner (2D)"
msgstr "Panner (2D)"
-#: panner2d.cc:783 panner_ui.cc:384 plugin_ui.cc:451
+#: panner2d.cc:783 panner_ui.cc:383 plugin_ui.cc:449
msgid "Bypass"
msgstr "Bypass"
@@ -8100,15 +7986,15 @@ msgstr "Bypass"
msgid "Panner"
msgstr "Panner"
-#: panner_ui.cc:71
+#: panner_ui.cc:70
msgid "Pan automation mode"
msgstr "Pan-Automationsmodus"
-#: panner_ui.cc:72
+#: panner_ui.cc:71
msgid "Pan automation type"
msgstr "Pan-Automationstyp"
-#: panner_ui.cc:295
+#: panner_ui.cc:294
msgid ""
"No panner user interface is currently available for %1-in/2out tracks/busses"
msgstr "Für %1-in/2out Spuren/Busse ist momentan kein Panner-UI verfügbar"
@@ -8264,11 +8150,11 @@ msgstr "Nach Urheber"
msgid "By Category"
msgstr "Nach Kategorie"
-#: plugin_ui.cc:116
+#: plugin_ui.cc:114
msgid "Eh? LADSPA plugins don't have editors!"
msgstr "Merkwürdig... LADSPA-Plugins sollten kein GUI haben!"
-#: plugin_ui.cc:125 plugin_ui.cc:227
+#: plugin_ui.cc:123 plugin_ui.cc:225
msgid ""
"unknown type of editor-supplying plugin (note: no VST support in this "
"version of %1)"
@@ -8276,11 +8162,11 @@ msgstr ""
"Unbekannter Plugintyp mit eigenem Editor (Hinweis: diese %1-Version "
"unterstützt keine VST-Plugins)"
-#: plugin_ui.cc:128
+#: plugin_ui.cc:126
msgid "unknown type of editor-supplying plugin"
msgstr "Unbekannter Plugintyp"
-#: plugin_ui.cc:257
+#: plugin_ui.cc:255
msgid ""
"unknown type of editor-supplying plugin (note: no linuxVST support in this "
"version of %1)"
@@ -8288,23 +8174,23 @@ msgstr ""
"Unbekannter Plugintyp mit eigenem Editor (Hinweis: diese %1-Version "
"unterstützt keine linuxVST-Plugins)"
-#: plugin_ui.cc:329
+#: plugin_ui.cc:327
msgid "create_lv2_editor called on non-LV2 plugin"
msgstr "create_lv2_editor auf nicht-LV2-Plugin angewandt"
-#: plugin_ui.cc:417
+#: plugin_ui.cc:415
msgid "Add"
msgstr "Hinzufügen"
-#: plugin_ui.cc:421
+#: plugin_ui.cc:419
msgid "Description"
msgstr "Beschreibung:"
-#: plugin_ui.cc:422
+#: plugin_ui.cc:420
msgid "Plugin analysis"
msgstr "Pluginanalyse"
-#: plugin_ui.cc:429
+#: plugin_ui.cc:427
msgid ""
"Presets (if any) for this plugin\n"
"(Both factory and user-created)"
@@ -8312,23 +8198,23 @@ msgstr ""
"Presets (falls existent) für dieses Plugin\n"
"(Hersteller- und Benutzerpresets)"
-#: plugin_ui.cc:430
+#: plugin_ui.cc:428
msgid "Save a new preset"
msgstr "Neues Preset speichern"
-#: plugin_ui.cc:431
+#: plugin_ui.cc:429
msgid "Save the current preset"
msgstr "Momentanes Preset speichern"
-#: plugin_ui.cc:432
+#: plugin_ui.cc:430
msgid "Delete the current preset"
msgstr "Lösche das aktuelle Preset"
-#: plugin_ui.cc:433
+#: plugin_ui.cc:431
msgid "Disable signal processing by the plugin"
msgstr "Deaktiviere die Signalverarbeitung des Plugins"
-#: plugin_ui.cc:466 plugin_ui.cc:662
+#: plugin_ui.cc:464 plugin_ui.cc:660
msgid ""
"Click to allow the plugin to receive keyboard events that %1 would normally "
"use as a shortcut"
@@ -8336,29 +8222,29 @@ msgstr ""
"Klicke, damit das Plugin Tastaturbefehle erhält, die %1 sonst als "
"Tastenkürzel verwenden würde"
-#: plugin_ui.cc:467
+#: plugin_ui.cc:465
msgid "Click to enable/disable this plugin"
msgstr "Klicke, um dieses Plugin zu ein/auszuschalten"
-#: plugin_ui.cc:506
+#: plugin_ui.cc:504
msgid "latency (%1 sample)"
msgid_plural "latency (%1 samples)"
msgstr[0] "Latenz (%1 Sample)"
msgstr[1] "Latenz (%1 Samples)"
-#: plugin_ui.cc:508
+#: plugin_ui.cc:506
msgid "latency (%1 ms)"
msgstr "Latenz (%1 ms)"
-#: plugin_ui.cc:519
+#: plugin_ui.cc:517
msgid "Edit Latency"
msgstr "Latenz bearbeiten"
-#: plugin_ui.cc:558
+#: plugin_ui.cc:556
msgid "Plugin preset %1 not found"
msgstr "Plugin Preset %1 nicht gefunden"
-#: plugin_ui.cc:595
+#: plugin_ui.cc:593
msgid ""
"Plugin presets are not supported in this build of %1. Consider paying for a "
"full version"
@@ -8366,7 +8252,7 @@ msgstr ""
"Pluginpresets werden in diesem Version von %1 nicht unterstützt. Erwägen "
"Sie, für eine Vollversion zu zahlen"
-#: plugin_ui.cc:615 plugin_ui.cc:630
+#: plugin_ui.cc:613 plugin_ui.cc:628
msgid ""
"Plugin presets are not supported in this build of %1. Consider paying for a "
"newer version"
@@ -8374,35 +8260,35 @@ msgstr ""
"Pluginpresets werden in diesem Version von %1 nicht unterstützt. Erwägen "
"Sie, für eine neuere Version zu zahlen"
-#: plugin_ui.cc:669
+#: plugin_ui.cc:667
msgid "Click to allow normal use of %1 keyboard shortcuts"
msgstr "Klicke, um die normale Verwendung von %1 Tastenkürzeln zu aktivieren"
-#: port_group.cc:335
+#: port_group.cc:337
msgid "%1 Busses"
msgstr "%1 Busse"
-#: port_group.cc:336
+#: port_group.cc:338
msgid "%1 Tracks"
msgstr "%1 Spuren"
-#: port_group.cc:337
+#: port_group.cc:339
msgid "Hardware"
msgstr "Hardware"
-#: port_group.cc:338
+#: port_group.cc:340
msgid "%1 Misc"
msgstr "%1 Sonstige"
-#: port_group.cc:339
+#: port_group.cc:341
msgid "Other"
msgstr "Andere"
-#: port_group.cc:430 port_group.cc:431
+#: port_group.cc:432 port_group.cc:433
msgid "LTC Out"
msgstr "LTC Ausgang"
-#: port_group.cc:434 port_group.cc:435
+#: port_group.cc:436 port_group.cc:437
msgid "LTC In"
msgstr "LTC Eingang"
@@ -8438,15 +8324,15 @@ msgstr "MIDI clock out"
msgid "MMC out"
msgstr "MMC out"
-#: port_group.cc:540
+#: port_group.cc:532
msgid ":monitor"
msgstr ":monitor"
-#: port_group.cc:552
+#: port_group.cc:544
msgid "system:"
msgstr "system:"
-#: port_group.cc:553
+#: port_group.cc:545
msgid "alsa_pcm"
msgstr "alsa_pcm"
@@ -8462,18 +8348,10 @@ msgstr "Send/Ausgang"
msgid "Return/Input"
msgstr "Return/Input"
-#: port_insert_ui.cc:71 port_insert_ui.cc:99
-msgid "Disconnected from audio engine"
-msgstr "Von Audio-Engine getrennt"
-
#: port_insert_ui.cc:86
msgid "No signal detected"
msgstr "Kein Signal erkannt"
-#: port_insert_ui.cc:135
-msgid "Detecting ..."
-msgstr "Messe..."
-
#: port_insert_ui.cc:166
msgid "Port Insert "
msgstr "Port Insert "
@@ -8596,7 +8474,7 @@ msgstr "Alle Regler verbergen"
msgid "on"
msgstr "an"
-#: processor_box.cc:465 rc_option_editor.cc:1911 rc_option_editor.cc:1925
+#: processor_box.cc:465 rc_option_editor.cc:1907 rc_option_editor.cc:1921
msgid "off"
msgstr "Aus"
@@ -8830,101 +8708,101 @@ msgstr "Notenanfang einrasten an"
msgid "Snap note end"
msgstr "Notenende einrasten an"
-#: rc_option_editor.cc:69
+#: rc_option_editor.cc:67
msgid "Click audio file:"
msgstr "Audiodatei für Klick"
-#: rc_option_editor.cc:72 rc_option_editor.cc:79
+#: rc_option_editor.cc:70 rc_option_editor.cc:77
msgid "Browse..."
msgstr "Durchsuchen..."
-#: rc_option_editor.cc:76
+#: rc_option_editor.cc:74
msgid "Click emphasis audio file:"
msgstr "Audiodatei für Klick-Betonung"
-#: rc_option_editor.cc:108
+#: rc_option_editor.cc:106
msgid "Choose Click"
msgstr "Click auswählen"
-#: rc_option_editor.cc:128
+#: rc_option_editor.cc:126
msgid "Choose Click Emphasis"
msgstr "Click-Betonung auswählen"
-#: rc_option_editor.cc:160
+#: rc_option_editor.cc:158
msgid "Limit undo history to"
msgstr "Limitiere Aktionsliste auf"
-#: rc_option_editor.cc:161
+#: rc_option_editor.cc:159
msgid "Save undo history of"
msgstr "Speichere Aktionsliste von"
-#: rc_option_editor.cc:170 rc_option_editor.cc:177
+#: rc_option_editor.cc:168 rc_option_editor.cc:175
msgid "commands"
msgstr "Aktionen"
-#: rc_option_editor.cc:315
+#: rc_option_editor.cc:313
msgid "Edit using:"
msgstr "Bearbeiten mit:"
-#: rc_option_editor.cc:321 rc_option_editor.cc:347 rc_option_editor.cc:374
+#: rc_option_editor.cc:319 rc_option_editor.cc:345 rc_option_editor.cc:372
msgid "+ button"
msgstr "+ Maustaste"
-#: rc_option_editor.cc:341
+#: rc_option_editor.cc:339
msgid "Delete using:"
msgstr "Entfernen mit:"
-#: rc_option_editor.cc:368
+#: rc_option_editor.cc:366
msgid "Insert note using:"
msgstr "Note einfügen:"
-#: rc_option_editor.cc:395
+#: rc_option_editor.cc:393
msgid "Ignore snap using:"
msgstr "Einrasten ignorieren mittels:"
-#: rc_option_editor.cc:411
+#: rc_option_editor.cc:409
msgid "Keyboard layout:"
msgstr "Tastaturlayout:"
-#: rc_option_editor.cc:534
+#: rc_option_editor.cc:532
msgid "Font scaling:"
msgstr "Schriftskalierung"
-#: rc_option_editor.cc:586
+#: rc_option_editor.cc:584
msgid "Playback (seconds of buffering):"
msgstr "Wiedergabe (gepufferte Sekunden):"
-#: rc_option_editor.cc:599
+#: rc_option_editor.cc:597
msgid "Recording (seconds of buffering):"
msgstr "Aufnahme (gepufferte Sekunden):"
-#: rc_option_editor.cc:656
+#: rc_option_editor.cc:654
msgid "Control Surface Protocol"
msgstr "Eingabegeräteprotokoll"
-#: rc_option_editor.cc:660
+#: rc_option_editor.cc:658
msgid "Feedback"
msgstr "Feedback"
-#: rc_option_editor.cc:665
+#: rc_option_editor.cc:663
msgid "Double-click on a name to edit settings for an enabled protocol"
msgstr ""
"Doppelklick auf einen Namen editiert Einstellungen für ein aktiviertes "
"Protokoll"
-#: rc_option_editor.cc:817
+#: rc_option_editor.cc:815
msgid "Show Video Export Info before export"
msgstr "Zeige Video-Exportinformationen vor dem Exportieren"
-#: rc_option_editor.cc:818
+#: rc_option_editor.cc:816
msgid "Show Video Server Startup Dialog"
msgstr "Zeige den Videoserver-Startdialog"
-#: rc_option_editor.cc:819
+#: rc_option_editor.cc:817
msgid "Advanced Setup (remote video server)"
msgstr "Ausführliche Einrichtung (entfernter Videoserver)"
-#: rc_option_editor.cc:827
+#: rc_option_editor.cc:825
msgid ""
"<b>When enabled</b> you can speficify a custom video-server URL and docroot. "
"- Do not enable this option unless you know what you are doing."
@@ -8933,11 +8811,11 @@ msgstr ""
"für den Videoserver eingeben. - Aktivieren Sie diese Option nur, wenn Sie "
"wissen, was Sie tun."
-#: rc_option_editor.cc:829
+#: rc_option_editor.cc:827
msgid "Video Server URL:"
msgstr "Videoserver URL:"
-#: rc_option_editor.cc:834
+#: rc_option_editor.cc:832
msgid ""
"Base URL of the video-server including http prefix. This is usually 'http://"
"hostname.example.org:1554/' and defaults to 'http://localhost:1554/' when "
@@ -8947,11 +8825,11 @@ msgstr ""
"hostname.example.org:1554/' und ist auf 'http://localhost:1554/' "
"voreingestellt, wenn der Videoserver lokal läuft"
-#: rc_option_editor.cc:836
+#: rc_option_editor.cc:834
msgid "Video Folder:"
msgstr "Videoordner:"
-#: rc_option_editor.cc:841
+#: rc_option_editor.cc:839
msgid ""
"Local path to the video-server document-root. Only files below this "
"directory will be accessible by the video-server. If the server run on a "
@@ -8966,7 +8844,7 @@ msgstr ""
"werden, falls es nicht zugänglich ist. Wird für den lokalen Videomonitor und "
"die Dateisuche beim Öffnen/Hinzufügen einer Videodatei benutzt."
-#: rc_option_editor.cc:848
+#: rc_option_editor.cc:846
msgid ""
"<b>When enabled</b> an information window with details is displayed before "
"the video-export dialog."
@@ -8974,94 +8852,94 @@ msgstr ""
"<b>Wenn aktiviert</b> , wird vor dem Videoexport-Dialog ein "
"Informationsfenster mit Details angezeigt."
-#: rc_option_editor.cc:853
+#: rc_option_editor.cc:851
msgid ""
"<b>When enabled</b> the video server is never launched automatically without "
"confirmation"
msgstr ""
"<b>Wenn aktiviert</b>, wird der Videoserver nie ohne Bestätigung gestartet"
-#: rc_option_editor.cc:993
+#: rc_option_editor.cc:991
msgid "%1 Preferences"
msgstr "%1 Einstellungen"
-#: rc_option_editor.cc:1004
+#: rc_option_editor.cc:1002
msgid "DSP CPU Utilization"
msgstr "DSP CPU Nutzung"
-#: rc_option_editor.cc:1008
+#: rc_option_editor.cc:1006
msgid "Signal processing uses"
msgstr "Die Signalverarbeitung verwendet"
-#: rc_option_editor.cc:1013
+#: rc_option_editor.cc:1011
msgid "all but one processor"
msgstr "Alle außer einem Prozessor"
-#: rc_option_editor.cc:1014
+#: rc_option_editor.cc:1012
msgid "all available processors"
msgstr "Alle verfügbaren Prozessoren"
-#: rc_option_editor.cc:1017
+#: rc_option_editor.cc:1015
msgid "%1 processors"
msgstr "%1 Prozessoren"
-#: rc_option_editor.cc:1020
+#: rc_option_editor.cc:1018
msgid "This setting will only take effect when %1 is restarted."
msgstr "Diese Einstellung wird erst nach einem Neustart von %1 wirksam."
-#: rc_option_editor.cc:1025
+#: rc_option_editor.cc:1023
msgid "Options|Undo"
msgstr "Undo"
-#: rc_option_editor.cc:1032
+#: rc_option_editor.cc:1030
msgid "Verify removal of last capture"
msgstr "Verwerfen der letzten Aufnahme bestätigen"
-#: rc_option_editor.cc:1040
+#: rc_option_editor.cc:1038
msgid "Make periodic backups of the session file"
msgstr "Erstelle regelmäßig Backups der Projektdatei"
-#: rc_option_editor.cc:1045
+#: rc_option_editor.cc:1043
msgid "Session Management"
msgstr "Projektmanagement:"
-#: rc_option_editor.cc:1050
+#: rc_option_editor.cc:1048
msgid "Always copy imported files"
msgstr "Importierte Dateien immer kopieren"
-#: rc_option_editor.cc:1057
+#: rc_option_editor.cc:1055
msgid "Default folder for new sessions:"
msgstr "Standardordner für neue Projekte"
-#: rc_option_editor.cc:1065
+#: rc_option_editor.cc:1063
msgid "Maximum number of recent sessions"
msgstr "Maximale Anzahl kürzlich geöffneter Projekte"
-#: rc_option_editor.cc:1078
+#: rc_option_editor.cc:1076
msgid "Click gain level"
msgstr "Lautstärke für Klick"
-#: rc_option_editor.cc:1083 route_time_axis.cc:215 route_time_axis.cc:676
+#: rc_option_editor.cc:1081 route_time_axis.cc:215 route_time_axis.cc:676
msgid "Automation"
msgstr "Automationen"
-#: rc_option_editor.cc:1088
+#: rc_option_editor.cc:1086
msgid "Thinning factor (larger value => less data)"
msgstr "Ausdünnungsfaktor (größerer Wert => weniger Daten)"
-#: rc_option_editor.cc:1097
+#: rc_option_editor.cc:1095
msgid "Automation sampling interval (milliseconds)"
msgstr "Meßintervall für Automation (Millisekunden)"
-#: rc_option_editor.cc:1109
+#: rc_option_editor.cc:1107
msgid "Keep record-enable engaged on stop"
msgstr "Aufnahme bleibt nach Stopp aktiviert"
-#: rc_option_editor.cc:1118
+#: rc_option_editor.cc:1116
msgid "Stop recording when an xrun occurs"
msgstr "Aufnahme bei xrun stoppen"
-#: rc_option_editor.cc:1123
+#: rc_option_editor.cc:1121
msgid ""
"<b>When enabled</b> %1 will stop recording if an over- or underrun is "
"detected by the audio engine"
@@ -9069,15 +8947,15 @@ msgstr ""
"<b>Falls an</b>, wird %1 Aufnahmen bei Auftreten von Over- oder Underruns "
"abbrechen"
-#: rc_option_editor.cc:1129
+#: rc_option_editor.cc:1127
msgid "Create markers where xruns occur"
msgstr "Bei xrun Marker erzeugen"
-#: rc_option_editor.cc:1138
+#: rc_option_editor.cc:1136
msgid "Stop at the end of the session"
msgstr "Am Ende des Projektes anhalten"
-#: rc_option_editor.cc:1143
+#: rc_option_editor.cc:1141
msgid ""
"<b>When enabled</b> if %1 is <b>not recording</b>, it will stop the "
"transport when it reaches the current session end marker\n"
@@ -9090,11 +8968,11 @@ msgstr ""
"\n"
"<b>Falls aus</b> , wird Ardour am Ende des Projektes immer weiterlaufen"
-#: rc_option_editor.cc:1151
-msgid "Do seamless looping (not possible when slaved to MTC, JACK etc)"
-msgstr "Nahtlose Schleifen (nicht möglich wenn MTC, JACK etc. Master sind)"
+#: rc_option_editor.cc:1149
+msgid "Do seamless looping (not possible when slaved to MTC, LTC etc)"
+msgstr "Nahtlose Schleifen (nicht möglich, wenn an MTC, LTC o.ä. gekoppelt)"
-#: rc_option_editor.cc:1156
+#: rc_option_editor.cc:1154
msgid ""
"<b>When enabled</b> this will loop by reading ahead and wrapping around at "
"the loop point, preventing any need to do a transport locate at the end of "
@@ -9111,11 +8989,11 @@ msgstr ""
"Schleife springen, was oft einen hörbaren Klick oder kurze Verzögerung "
"verursacht"
-#: rc_option_editor.cc:1164
+#: rc_option_editor.cc:1162
msgid "Disable per-track record disarm while rolling"
msgstr "Während der Aufnahme Aufnahmestatus einzelner Spuren sperren"
-#: rc_option_editor.cc:1168
+#: rc_option_editor.cc:1166
msgid ""
"<b>When enabled</b> this will prevent you from accidentally stopping "
"specific tracks recording during a take"
@@ -9123,11 +9001,11 @@ msgstr ""
"<b>Wenn eingeschaltet</b> , hindert Sie dies daran, während eines "
"Aufnahmevorgangs unabsichtlich bei einzelnen Spuren die Aufnahme zu beenden"
-#: rc_option_editor.cc:1173
+#: rc_option_editor.cc:1171
msgid "12dB gain reduction during fast-forward and fast-rewind"
msgstr "Beim Spulen Pegel um 12dB absenken"
-#: rc_option_editor.cc:1177
+#: rc_option_editor.cc:1175
msgid ""
"This will reduce the unpleasant increase in perceived volume that occurs "
"when fast-forwarding or rewinding through some kinds of audio"
@@ -9135,19 +9013,19 @@ msgstr ""
"Dies wird die unangenehme Steigerung der wahrgenommenen Lautstärke "
"verringern, die bei manchem Material bei Vor/Rücklauf auftritt"
-#: rc_option_editor.cc:1181
+#: rc_option_editor.cc:1179
msgid "Sync/Slave"
msgstr "Sync/Slave"
-#: rc_option_editor.cc:1185
+#: rc_option_editor.cc:1183
msgid "External timecode source"
msgstr "Externe Timecode-Quelle"
-#: rc_option_editor.cc:1195
+#: rc_option_editor.cc:1193
msgid "Match session video frame rate to external timecode"
msgstr "Videoframerate des Projekts an externen Timecode anpassen"
-#: rc_option_editor.cc:1201
+#: rc_option_editor.cc:1199
msgid ""
"This option controls the value of the video frame rate <i>while chasing</i> "
"an external timecode source.\n"
@@ -9171,11 +9049,11 @@ msgstr ""
"wird zwischen den Standards der externen Quelle und des Projektes "
"konvertieren."
-#: rc_option_editor.cc:1211
+#: rc_option_editor.cc:1209
msgid "External timecode is sync locked"
msgstr "Externe Timecode-Quelle ist starr synchronisiert"
-#: rc_option_editor.cc:1217
+#: rc_option_editor.cc:1215
msgid ""
"<b>When enabled</b> indicates that the selected external timecode source "
"shares sync (Black &amp; Burst, Wordclock, etc) with the audio interface."
@@ -9183,11 +9061,11 @@ msgstr ""
"<b>Falls an</b>, zeigt dies an, daß die ausgewählte externe Timecode-Quelle "
"synchron zum Audio-Interface läuft (Black &amp; Burst, Wordclock, etc)."
-#: rc_option_editor.cc:1224
+#: rc_option_editor.cc:1222
msgid "Lock to 29.9700 fps instead of 30000/1001"
msgstr "Fest auf 29.9700 fps statt 30000/1001"
-#: rc_option_editor.cc:1230
+#: rc_option_editor.cc:1228
msgid ""
"<b>When enabled</b> the external timecode source is assumed to use 29.97 fps "
"instead of 30000/1001.\n"
@@ -9210,27 +9088,27 @@ msgstr ""
"widersprechend - da bei der Variante mit exakt 29.97 fps kein Timecode-Drift "
"auftritt.\n"
-#: rc_option_editor.cc:1240
+#: rc_option_editor.cc:1238
msgid "LTC Reader"
msgstr "LTC-Leser"
-#: rc_option_editor.cc:1244
+#: rc_option_editor.cc:1242
msgid "LTC incoming port"
msgstr "LTC Eingangsport"
-#: rc_option_editor.cc:1257
+#: rc_option_editor.cc:1255
msgid "LTC Generator"
msgstr "LTC-Generator"
-#: rc_option_editor.cc:1262
+#: rc_option_editor.cc:1260
msgid "Enable LTC generator"
msgstr "LTC-Generator aktivieren"
-#: rc_option_editor.cc:1269
+#: rc_option_editor.cc:1267
msgid "send LTC while stopped"
msgstr "LTC senden, wenn Transport steht"
-#: rc_option_editor.cc:1275
+#: rc_option_editor.cc:1273
msgid ""
"<b>When enabled</b> %1 will continue to send LTC information even when the "
"transport (playhead) is not moving"
@@ -9238,11 +9116,11 @@ msgstr ""
"<b>Falls an</b>, wird %1 weiterhin LTC-Information senden, sogar wenn der "
"Transport (Positionszeiger) stillsteht"
-#: rc_option_editor.cc:1281
+#: rc_option_editor.cc:1279
msgid "LTC generator level"
msgstr "LTC-Generator-Lautstärke"
-#: rc_option_editor.cc:1285
+#: rc_option_editor.cc:1283
msgid ""
"Specify the Peak Volume of the generated LTC signal in dbFS. A good value "
"is 0dBu ^= -18dbFS in an EBU calibrated system"
@@ -9250,108 +9128,108 @@ msgstr ""
"Geben Sie den Spitzenwert des erzeugten LTC-Signals in dbFS an. Ein guter "
"Wert für ein EBU-kalibriertes System ist 0dBu ^= -18dbFS"
-#: rc_option_editor.cc:1297
+#: rc_option_editor.cc:1295
msgid "Link selection of regions and tracks"
msgstr "Auswahl von Spuren und Regionen verbinden"
-#: rc_option_editor.cc:1305
+#: rc_option_editor.cc:1303
msgid "Move relevant automation when audio regions are moved"
msgstr "Verschiebe relevante Automationen mit Region"
-#: rc_option_editor.cc:1313
+#: rc_option_editor.cc:1311
msgid "Show meters on tracks in the editor"
msgstr "Aktiviere Pegelanzeigen im Editor"
-#: rc_option_editor.cc:1321
+#: rc_option_editor.cc:1319
msgid "Display master-meter in the toolbar"
msgstr "Master-Pegelanzeige in der Werkzeugleiste anzeigen"
-#: rc_option_editor.cc:1328
+#: rc_option_editor.cc:1326
msgid "Regions in active edit groups are edited together"
msgstr "Regionen der aktiven Bearbeitungsgruppen werden gemeinsam bearbeitet"
-#: rc_option_editor.cc:1329
+#: rc_option_editor.cc:1327
msgid "whenever they overlap in time"
msgstr "immer, wenn sie sich auf der Zeitachse überlappen"
-#: rc_option_editor.cc:1330
+#: rc_option_editor.cc:1328
msgid "only if they have identical length, position and origin"
msgstr "nur bei identischer Länge, Position und Herkunft"
-#: rc_option_editor.cc:1340
+#: rc_option_editor.cc:1338
msgid "Make rubberband selection rectangle snap to the grid"
msgstr "Gummiband-Auswahl an Raster ausrichten"
-#: rc_option_editor.cc:1348
+#: rc_option_editor.cc:1346
msgid "Show waveforms in regions"
msgstr "Zeige Wellenformen in Regionen"
-#: rc_option_editor.cc:1356
+#: rc_option_editor.cc:1354
msgid "Show gain envelopes in audio regions"
msgstr "Zeige Lautstärkekurven in Regionen an"
-#: rc_option_editor.cc:1357
+#: rc_option_editor.cc:1355
msgid "in all modes"
msgstr "in allen Modi"
-#: rc_option_editor.cc:1358
+#: rc_option_editor.cc:1356
msgid "only in region gain mode"
msgstr "nur im Region-Gain Modus"
-#: rc_option_editor.cc:1365
+#: rc_option_editor.cc:1363
msgid "Waveform scale"
msgstr "Wellenformskalierung"
-#: rc_option_editor.cc:1370
+#: rc_option_editor.cc:1368
msgid "linear"
msgstr "Linear"
-#: rc_option_editor.cc:1371
+#: rc_option_editor.cc:1369
msgid "logarithmic"
msgstr "Logarithmisch"
-#: rc_option_editor.cc:1377
+#: rc_option_editor.cc:1375
msgid "Waveform shape"
msgstr "Wellenform Anzeigeart"
-#: rc_option_editor.cc:1382
+#: rc_option_editor.cc:1380
msgid "traditional"
msgstr "Traditionell"
-#: rc_option_editor.cc:1383
+#: rc_option_editor.cc:1381
msgid "rectified"
msgstr "Rectified"
-#: rc_option_editor.cc:1390
+#: rc_option_editor.cc:1388
msgid "Show waveforms for audio while it is being recorded"
msgstr "Zeige bei Aufnahmen die Wellenformen des aufgenommenen Audiomaterials"
-#: rc_option_editor.cc:1398
+#: rc_option_editor.cc:1396
msgid "Show zoom toolbar"
msgstr "Zeige Zoom Toolbar"
-#: rc_option_editor.cc:1406
+#: rc_option_editor.cc:1404
msgid "Color regions using their track's color"
msgstr "Färbe Regionen in der Spurfarbe ein"
-#: rc_option_editor.cc:1414
+#: rc_option_editor.cc:1412
msgid "Update editor window during drags of the summary"
msgstr ""
"Aktualisiere das Editorfenster, während die Projektübersicht verändert wird"
-#: rc_option_editor.cc:1422
+#: rc_option_editor.cc:1420
msgid "Synchronise editor and mixer track order"
msgstr "Einheitliche Reihenfolge der Spuren im Editor und Mixer"
-#: rc_option_editor.cc:1430
+#: rc_option_editor.cc:1428
msgid "Synchronise editor and mixer selection"
msgstr "Synchronisiere Auswahl der Spuren im Editor und Mixer"
-#: rc_option_editor.cc:1437
+#: rc_option_editor.cc:1435
msgid "Name new markers"
msgstr "Neue Marker benennen"
-#: rc_option_editor.cc:1443
+#: rc_option_editor.cc:1441
msgid ""
"If enabled, popup a dialog when a new marker is created to allow its name to "
"be set as it is created.\n"
@@ -9363,241 +9241,245 @@ msgstr ""
"\n"
"Marker können jederzeit per Rechtsklick umbenannt werden"
-#: rc_option_editor.cc:1449
+#: rc_option_editor.cc:1447
msgid "Auto-scroll editor window when dragging near its edges"
msgstr "Bei Mausziehen nahe den Rändern das Editorfenster automatisch scrollen"
-#: rc_option_editor.cc:1456
+#: rc_option_editor.cc:1454
msgid "Buffering"
msgstr "Pufferung"
-#: rc_option_editor.cc:1464
+#: rc_option_editor.cc:1462
msgid "Record monitoring handled by"
msgstr "Aufnahmemonitoring wird verwaltet von"
-#: rc_option_editor.cc:1475
+#: rc_option_editor.cc:1468
+msgid "via Audio Driver"
+msgstr "via Audiotreiber"
+
+#: rc_option_editor.cc:1471
msgid "ardour"
msgstr "Ardour"
-#: rc_option_editor.cc:1476
+#: rc_option_editor.cc:1472
msgid "audio hardware"
msgstr "Audiohardware"
-#: rc_option_editor.cc:1483
+#: rc_option_editor.cc:1479
msgid "Tape machine mode"
msgstr "Bandmaschinen-Modus"
-#: rc_option_editor.cc:1488
+#: rc_option_editor.cc:1484
msgid "Connection of tracks and busses"
msgstr "Verbindung von Spuren und Bussen"
-#: rc_option_editor.cc:1493
+#: rc_option_editor.cc:1489
msgid "Auto-connect master/monitor busses"
msgstr "Master/Monitor-Busse automatisch verbinden"
-#: rc_option_editor.cc:1500
+#: rc_option_editor.cc:1496
msgid "Connect track inputs"
msgstr "Verbinde Spureingänge"
-#: rc_option_editor.cc:1505
+#: rc_option_editor.cc:1501
msgid "automatically to physical inputs"
msgstr "automatisch mit Audioeingängen"
-#: rc_option_editor.cc:1506 rc_option_editor.cc:1519
+#: rc_option_editor.cc:1502 rc_option_editor.cc:1515
msgid "manually"
msgstr "manuell"
-#: rc_option_editor.cc:1512
+#: rc_option_editor.cc:1508
msgid "Connect track and bus outputs"
msgstr "Verbinde Spur- und Busausgänge"
-#: rc_option_editor.cc:1517
+#: rc_option_editor.cc:1513
msgid "automatically to physical outputs"
msgstr "automatisch mit Audioausgängen"
-#: rc_option_editor.cc:1518
+#: rc_option_editor.cc:1514
msgid "automatically to master bus"
msgstr "automatisch mit dem Master-Bus"
-#: rc_option_editor.cc:1523
+#: rc_option_editor.cc:1519
msgid "Denormals"
msgstr "Denormals"
-#: rc_option_editor.cc:1528
+#: rc_option_editor.cc:1524
msgid "Use DC bias to protect against denormals"
msgstr "Nutze DC bias als Schutz vor Denormals"
-#: rc_option_editor.cc:1535
+#: rc_option_editor.cc:1531
msgid "Processor handling"
msgstr "Umgang des Prozessors mit Denormals"
-#: rc_option_editor.cc:1540
+#: rc_option_editor.cc:1536
msgid "no processor handling"
msgstr "nicht behandeln"
-#: rc_option_editor.cc:1545
+#: rc_option_editor.cc:1541
msgid "use FlushToZero"
msgstr "Benutze FlushToZero"
-#: rc_option_editor.cc:1549
+#: rc_option_editor.cc:1545
msgid "use DenormalsAreZero"
msgstr "Benutze DenormalsAreZero"
-#: rc_option_editor.cc:1553
+#: rc_option_editor.cc:1549
msgid "use FlushToZero and DenormalsAreZero"
msgstr "Benutze FlushToZero & DenormalsAreZero"
-#: rc_option_editor.cc:1563
+#: rc_option_editor.cc:1559
msgid "Silence plugins when the transport is stopped"
msgstr "Deaktiviere Plugins, wenn der Transport gestoppt ist."
-#: rc_option_editor.cc:1571
+#: rc_option_editor.cc:1567
msgid "Make new plugins active"
msgstr "Neue Plugins sind aktiv"
-#: rc_option_editor.cc:1579
+#: rc_option_editor.cc:1575
msgid "Enable automatic analysis of audio"
msgstr "Audiodaten automatisch analysieren"
-#: rc_option_editor.cc:1587
+#: rc_option_editor.cc:1583
msgid "Replicate missing region channels"
msgstr "Fehlende Kanäle von Regionen ersetzen"
-#: rc_option_editor.cc:1594 rc_option_editor.cc:1609 rc_option_editor.cc:1621
-#: rc_option_editor.cc:1633 rc_option_editor.cc:1645 rc_option_editor.cc:1649
-#: rc_option_editor.cc:1657 rc_option_editor.cc:1665 rc_option_editor.cc:1673
-#: rc_option_editor.cc:1675 rc_option_editor.cc:1683 rc_option_editor.cc:1691
-#: rc_option_editor.cc:1699
+#: rc_option_editor.cc:1590 rc_option_editor.cc:1605 rc_option_editor.cc:1617
+#: rc_option_editor.cc:1629 rc_option_editor.cc:1641 rc_option_editor.cc:1645
+#: rc_option_editor.cc:1653 rc_option_editor.cc:1661 rc_option_editor.cc:1669
+#: rc_option_editor.cc:1671 rc_option_editor.cc:1679 rc_option_editor.cc:1687
+#: rc_option_editor.cc:1695
msgid "Solo / mute"
msgstr "Solo / Mute"
-#: rc_option_editor.cc:1597
+#: rc_option_editor.cc:1593
msgid "Solo-in-place mute cut (dB)"
msgstr "Solo-in-Place Mute Dämpfung (dB)"
-#: rc_option_editor.cc:1604
+#: rc_option_editor.cc:1600
msgid "Solo controls are Listen controls"
msgstr "Solo-Schalter arbeiten als AFL/PFL"
-#: rc_option_editor.cc:1613
+#: rc_option_editor.cc:1609
msgid "Listen Position"
msgstr "Abhörpunkt"
-#: rc_option_editor.cc:1618
+#: rc_option_editor.cc:1614
msgid "after-fader (AFL)"
msgstr "After-Fader (AFL)"
-#: rc_option_editor.cc:1619
+#: rc_option_editor.cc:1615
msgid "pre-fader (PFL)"
msgstr "Pre-Fader (PFL)"
-#: rc_option_editor.cc:1625
+#: rc_option_editor.cc:1621
msgid "PFL signals come from"
msgstr "Abgreifpunkt der PFL Signale"
-#: rc_option_editor.cc:1630
+#: rc_option_editor.cc:1626
msgid "before pre-fader processors"
msgstr "Vor den Pre-Fader Prozessoren"
-#: rc_option_editor.cc:1631
+#: rc_option_editor.cc:1627
msgid "pre-fader but after pre-fader processors"
msgstr "Pre-Fader, aber nach den Prozessoren"
-#: rc_option_editor.cc:1637
+#: rc_option_editor.cc:1633
msgid "AFL signals come from"
msgstr "Abgreifpunkt der AFL Signale"
-#: rc_option_editor.cc:1642
+#: rc_option_editor.cc:1638
msgid "immediately post-fader"
msgstr "Direkt nach dem Fader"
-#: rc_option_editor.cc:1643
+#: rc_option_editor.cc:1639
msgid "after post-fader processors (before pan)"
msgstr "Nach den Post-Fader Prozessoren (vor Pan)"
-#: rc_option_editor.cc:1652
+#: rc_option_editor.cc:1648
msgid "Exclusive solo"
msgstr "Exclusives Solo"
-#: rc_option_editor.cc:1660
+#: rc_option_editor.cc:1656
msgid "Show solo muting"
msgstr "Solo auf anderen Kanälen als Mute anzeigen"
-#: rc_option_editor.cc:1668
+#: rc_option_editor.cc:1664
msgid "Soloing overrides muting"
msgstr "Solo ist trotz Mute hörbar"
-#: rc_option_editor.cc:1673
+#: rc_option_editor.cc:1669
msgid "Default track / bus muting options"
msgstr "Standardeinstellungen für Mute von Spuren / Bussen"
-#: rc_option_editor.cc:1678
+#: rc_option_editor.cc:1674
msgid "Mute affects pre-fader sends"
msgstr "Mute schaltet Pre-Fader Sends stumm"
-#: rc_option_editor.cc:1686
+#: rc_option_editor.cc:1682
msgid "Mute affects post-fader sends"
msgstr "Mute schaltet Post-Fader Sends stumm"
-#: rc_option_editor.cc:1694
+#: rc_option_editor.cc:1690
msgid "Mute affects control outputs"
msgstr "Mute schaltet Abhörausgänge stumm"
-#: rc_option_editor.cc:1702
+#: rc_option_editor.cc:1698
msgid "Mute affects main outputs"
msgstr "Mute schaltet Hauptausgänge stumm"
-#: rc_option_editor.cc:1718
+#: rc_option_editor.cc:1714
msgid "Send MIDI Time Code"
msgstr "Sende MIDI Time Code"
-#: rc_option_editor.cc:1726
+#: rc_option_editor.cc:1722
msgid "Percentage either side of normal transport speed to transmit MTC"
msgstr ""
"Prozentzahl beiderseits der normalen Transportgeschwindigkeit, bis zu der "
"MTC übertragen wird"
-#: rc_option_editor.cc:1735
+#: rc_option_editor.cc:1731
msgid "Obey MIDI Machine Control commands"
msgstr "MIDI Machine Control Commands empfangen"
-#: rc_option_editor.cc:1743
+#: rc_option_editor.cc:1739
msgid "Send MIDI Machine Control commands"
msgstr "MIDI Machine Control Commands senden"
-#: rc_option_editor.cc:1751
+#: rc_option_editor.cc:1747
msgid "Send MIDI control feedback"
msgstr "MIDI Control Feedback senden"
-#: rc_option_editor.cc:1759
+#: rc_option_editor.cc:1755
msgid "Inbound MMC device ID"
msgstr "ID des eingehenden MMC-Geräts"
-#: rc_option_editor.cc:1768
+#: rc_option_editor.cc:1764
msgid "Outbound MMC device ID"
msgstr "ID des ausgehenden MMC-Geräts"
-#: rc_option_editor.cc:1777
+#: rc_option_editor.cc:1773
msgid "Initial program change"
msgstr "Erstmaliger Programmwechsel"
-#: rc_option_editor.cc:1786
+#: rc_option_editor.cc:1782
msgid "Display first MIDI bank/program as 0"
msgstr "Erste(s) MIDI Bank/Programm als 0 anzeigen"
-#: rc_option_editor.cc:1794
+#: rc_option_editor.cc:1790
msgid "Never display periodic MIDI messages (MTC, MIDI Clock)"
msgstr "Periodische MIDI Nachrichten nie anzeigen (MTC, MIDI Clock)"
-#: rc_option_editor.cc:1802
+#: rc_option_editor.cc:1798
msgid "Sound MIDI notes as they are selected"
msgstr "MIDI Noten ertönen bei Auswahl"
-#: rc_option_editor.cc:1810 rc_option_editor.cc:1820 rc_option_editor.cc:1822
+#: rc_option_editor.cc:1806 rc_option_editor.cc:1816 rc_option_editor.cc:1818
msgid "User interaction"
msgstr "Benutzerinteraktion"
-#: rc_option_editor.cc:1813
+#: rc_option_editor.cc:1809
msgid ""
"Use translations of %1 messages\n"
" <i>(requires a restart of %1 to take effect)</i>\n"
@@ -9607,131 +9489,131 @@ msgstr ""
" <i>(erfordert Neustart von %1)</i>\n"
" <i>(falls für Ihre gewünschte Sprache verfügbar)</i>"
-#: rc_option_editor.cc:1820
+#: rc_option_editor.cc:1816
msgid "Keyboard"
msgstr "Tastatur"
-#: rc_option_editor.cc:1830
+#: rc_option_editor.cc:1826
msgid "Control surface remote ID"
msgstr "Remote ID des Eingabegeräts"
-#: rc_option_editor.cc:1835
+#: rc_option_editor.cc:1831
msgid "assigned by user"
msgstr "vom Benutzer festgelegt"
-#: rc_option_editor.cc:1836
+#: rc_option_editor.cc:1832
msgid "follows order of mixer"
msgstr "folgt Reihenfolge im Mixer"
-#: rc_option_editor.cc:1837
+#: rc_option_editor.cc:1833
msgid "follows order of editor"
msgstr "folgt Reihenfolge im Editor"
-#: rc_option_editor.cc:1846 rc_option_editor.cc:1854 rc_option_editor.cc:1864
-#: rc_option_editor.cc:1885 rc_option_editor.cc:1894 rc_option_editor.cc:1902
-#: rc_option_editor.cc:1916 rc_option_editor.cc:1935 rc_option_editor.cc:1951
-#: rc_option_editor.cc:1967 rc_option_editor.cc:1981 rc_option_editor.cc:1995
-#: rc_option_editor.cc:1997
+#: rc_option_editor.cc:1842 rc_option_editor.cc:1850 rc_option_editor.cc:1860
+#: rc_option_editor.cc:1881 rc_option_editor.cc:1890 rc_option_editor.cc:1898
+#: rc_option_editor.cc:1912 rc_option_editor.cc:1931 rc_option_editor.cc:1947
+#: rc_option_editor.cc:1963 rc_option_editor.cc:1977 rc_option_editor.cc:1991
+#: rc_option_editor.cc:1993
msgid "Preferences|GUI"
msgstr "GUI"
-#: rc_option_editor.cc:1849
+#: rc_option_editor.cc:1845
msgid "Graphically indicate mouse pointer hovering over various widgets"
msgstr "Mouseover-Effekt über verschiedenen Anzeigen"
-#: rc_option_editor.cc:1857
+#: rc_option_editor.cc:1853
msgid "Show tooltips if mouse hovers over a control"
msgstr "Zeige Tooltips, wenn die Maus über einem Element schwebt"
-#: rc_option_editor.cc:1867
+#: rc_option_editor.cc:1863
msgid "GUI"
msgstr "GUI"
-#: rc_option_editor.cc:1870
+#: rc_option_editor.cc:1866
msgid "update transport clock display every 40ms instead of every 100ms"
msgstr "Auffrischen der Transport-Zeitanzeige alle 40ms statt 100ms"
-#: rc_option_editor.cc:1887
+#: rc_option_editor.cc:1883
msgid "Mixer Strip"
msgstr "Anzeige im Channel strip"
-#: rc_option_editor.cc:1897
+#: rc_option_editor.cc:1893
msgid "Use narrow strips in the mixer by default"
msgstr "Standardmäßig schmale Mixer-Kanalzüge verwenden"
-#: rc_option_editor.cc:1906
+#: rc_option_editor.cc:1902
msgid "Peak hold time"
msgstr "Haltezeit für Spitzenwert"
-#: rc_option_editor.cc:1912
+#: rc_option_editor.cc:1908
msgid "short"
msgstr "Kurz"
-#: rc_option_editor.cc:1913
+#: rc_option_editor.cc:1909
msgid "medium"
msgstr "Mittel"
-#: rc_option_editor.cc:1914
+#: rc_option_editor.cc:1910
msgid "long"
msgstr "Lange"
-#: rc_option_editor.cc:1920
+#: rc_option_editor.cc:1916
msgid "DPM fall-off"
msgstr "Abfall der digitalen Pegelanzeige"
-#: rc_option_editor.cc:1926
+#: rc_option_editor.cc:1922
msgid "slowest [6.6dB/sec]"
msgstr "am langsamsten [6.6dB/sec]"
-#: rc_option_editor.cc:1927
+#: rc_option_editor.cc:1923
msgid "slow [8.6dB/sec] (BBC PPM, EBU PPM)"
msgstr "langsam [8.6dB/sec] (BBC PPM, EBU PPM)"
-#: rc_option_editor.cc:1928
+#: rc_option_editor.cc:1924
msgid "slowish [12.0dB/sec] (DIN)"
msgstr "etwas langsam [12.0dB/sec] (DIN)"
-#: rc_option_editor.cc:1929
+#: rc_option_editor.cc:1925
msgid "moderate [13.3dB/sec] (EBU Digi PPM, IRT Digi PPM)"
msgstr "mäßig [13.3dB/sec] (EBU Digi PPM, IRT Digi PPM)"
-#: rc_option_editor.cc:1930
+#: rc_option_editor.cc:1926
msgid "medium [20dB/sec]"
msgstr "mittel [20dB/sec]"
-#: rc_option_editor.cc:1931
+#: rc_option_editor.cc:1927
msgid "fast [32dB/sec]"
msgstr "schnell [32dB/sec]"
-#: rc_option_editor.cc:1932
+#: rc_option_editor.cc:1928
msgid "faster [46dB/sec]"
msgstr "schneller [46dB/sec]"
-#: rc_option_editor.cc:1933
+#: rc_option_editor.cc:1929
msgid "fastest [70dB/sec]"
msgstr "am schnellsten [70dB/sec]"
-#: rc_option_editor.cc:1939
+#: rc_option_editor.cc:1935
msgid "Meter line-up level; 0dBu"
msgstr "Ausrichtung der Pegelanzeige; 0dBu"
-#: rc_option_editor.cc:1944 rc_option_editor.cc:1960
+#: rc_option_editor.cc:1940 rc_option_editor.cc:1956
msgid "-24dBFS (SMPTE US: 4dBu = -20dBFS)"
msgstr "-24dBFS (SMPTE US: 4dBu = -20dBFS)"
-#: rc_option_editor.cc:1945 rc_option_editor.cc:1961
+#: rc_option_editor.cc:1941 rc_option_editor.cc:1957
msgid "-20dBFS (SMPTE RP.0155)"
msgstr "-20dBFS (SMPTE RP.0155)"
-#: rc_option_editor.cc:1946 rc_option_editor.cc:1962
+#: rc_option_editor.cc:1942 rc_option_editor.cc:1958
msgid "-18dBFS (EBU, BBC)"
msgstr "-18dBFS (EBU, BBC)"
-#: rc_option_editor.cc:1947 rc_option_editor.cc:1963
+#: rc_option_editor.cc:1943 rc_option_editor.cc:1959
msgid "-15dBFS (DIN)"
msgstr "-15dBFS (DIN)"
-#: rc_option_editor.cc:1949
+#: rc_option_editor.cc:1945
msgid ""
"Configure meter-marks and color-knee point for dBFS scale DPM, set reference "
"level for IEC1/Nordic, IEC2 PPM and VU meter."
@@ -9739,39 +9621,39 @@ msgstr ""
"Konfiguriere Skalierung und Farbschwellwert für DPM mit dBFS-Skala, "
"setzeReferenzpegel für IEC1/Nordisch, IEC2 PPM und VU Pegelanzeigen."
-#: rc_option_editor.cc:1955
+#: rc_option_editor.cc:1951
msgid "IEC1/DIN Meter line-up level; 0dBu"
msgstr "Ausrichtung der IEC1/DIN Pegelanzeige; 0dBu"
-#: rc_option_editor.cc:1965
+#: rc_option_editor.cc:1961
msgid "Reference level for IEC1/DIN meter."
msgstr "Referenzpegel für IEC1/DIN Pegelanzeige."
-#: rc_option_editor.cc:1971
+#: rc_option_editor.cc:1967
msgid "VU Meter standard"
msgstr "Standard für VU-Pegelanzeige"
-#: rc_option_editor.cc:1976
+#: rc_option_editor.cc:1972
msgid "0VU = -2dBu (France)"
msgstr "0VU = -2dBu (Frankreich)"
-#: rc_option_editor.cc:1977
+#: rc_option_editor.cc:1973
msgid "0VU = 0dBu (North America, Australia)"
msgstr "0VU = 0dBu (Nordamerika, Australien)"
-#: rc_option_editor.cc:1978
+#: rc_option_editor.cc:1974
msgid "0VU = +4dBu (standard)"
msgstr "0VU = +4dBu (Standard)"
-#: rc_option_editor.cc:1979
+#: rc_option_editor.cc:1975
msgid "0VU = +8dBu"
msgstr "0VU = +8dBu"
-#: rc_option_editor.cc:1985
+#: rc_option_editor.cc:1981
msgid "Peak threshold [dBFS]"
msgstr "Schwelle für Spitzenwert [dBFS]"
-#: rc_option_editor.cc:1993
+#: rc_option_editor.cc:1989
msgid ""
"Specify the audio signal level in dbFS at and above which the meter-peak "
"indicator will flash red."
@@ -9779,7 +9661,7 @@ msgstr ""
"Geben Sie den Signalpegel in dbFS an, bei dessen Erreichen oder "
"Ãœberschreitung die Spitzenwertanzeige in der Pegelanzeige rot blinkt"
-#: rc_option_editor.cc:2000
+#: rc_option_editor.cc:1996
msgid "LED meter style"
msgstr "Pegelanzeigen im LED-Stil"
@@ -10496,6 +10378,118 @@ msgstr "Projektordner"
msgid "Send "
msgstr "Send "
+#: session_dialog.cc:66
+msgid "Session Setup"
+msgstr "Projekteinrichtung"
+
+#: session_dialog.cc:71
+msgid "Advanced options ..."
+msgstr "Erweiterte Einstellungen..."
+
+#: session_dialog.cc:247
+msgid "New Session"
+msgstr "Neues Projekt"
+
+#: session_dialog.cc:284
+msgid "Check the website for more..."
+msgstr "Informieren Sie sich auf der Webseite weiter..."
+
+#: session_dialog.cc:287
+msgid "Click to open the program website in your web browser"
+msgstr "Klicken Sie, um die Webseite in Ihrem Web-Browse zu öffnen"
+
+#: session_dialog.cc:307
+msgid "Sample Rate"
+msgstr "Samplerate"
+
+#: session_dialog.cc:308
+msgid "Disk Format"
+msgstr "Dateiformat"
+
+#: session_dialog.cc:326
+msgid "Select session file"
+msgstr "Projektdatei auswählen"
+
+#: session_dialog.cc:341
+msgid "Other Sessions"
+msgstr "Andere Projekte"
+
+#: session_dialog.cc:367
+msgid "Open"
+msgstr "Öffnen"
+
+#: session_dialog.cc:434
+msgid "Session name:"
+msgstr "Projektname:"
+
+#: session_dialog.cc:456
+msgid "Create session folder in:"
+msgstr "Ort des Projektverzeichnisses:"
+
+#: session_dialog.cc:479
+msgid "Select folder for session"
+msgstr "Ordner für Projekt wählen"
+
+#: session_dialog.cc:508
+msgid "Use this template"
+msgstr "Diese Vorlage verwenden"
+
+#: session_dialog.cc:511
+msgid "no template"
+msgstr "keine Vorlage"
+
+#: session_dialog.cc:643 session_dialog.cc:675
+msgid "32 bit float"
+msgstr "32 Bit float"
+
+#: session_dialog.cc:646 session_dialog.cc:678
+msgid "24 bit"
+msgstr "24 Bit"
+
+#: session_dialog.cc:649 session_dialog.cc:681
+msgid "16 bit"
+msgstr "16 Bit"
+
+#: session_dialog.cc:720 session_dialog.cc:721 session_dialog.cc:722
+msgid "channels"
+msgstr "Kanäle"
+
+#: session_dialog.cc:736
+msgid "<b>Busses</b>"
+msgstr "<b>Busse</b>"
+
+#: session_dialog.cc:737
+msgid "<b>Inputs</b>"
+msgstr "<b>Eingänge</b>"
+
+#: session_dialog.cc:738
+msgid "<b>Outputs</b>"
+msgstr "<b>Ausgänge</b>"
+
+#: session_dialog.cc:746
+msgid "Create master bus"
+msgstr "Master-Bus erstellen"
+
+#: session_dialog.cc:756
+msgid "Automatically connect to physical inputs"
+msgstr "Automatisch mit Audioeingängen verbinden"
+
+#: session_dialog.cc:763 session_dialog.cc:822
+msgid "Use only"
+msgstr "Benutze nur"
+
+#: session_dialog.cc:816
+msgid "Automatically connect outputs"
+msgstr "Ausgänge automatisch verbinden"
+
+#: session_dialog.cc:838
+msgid "... to master bus"
+msgstr "... mit dem Master-Bus"
+
+#: session_dialog.cc:848
+msgid "... to physical outputs"
+msgstr "... mit den Audioausgängen"
+
#: session_import_dialog.cc:64
msgid "Import from Session"
msgstr "Aus Projekt importieren"
@@ -11387,14 +11381,6 @@ msgid "Azimuth:"
msgstr "Azimut:"
#: startup.cc:72
-msgid "Create a new session"
-msgstr "Neues Projekt erzeugen"
-
-#: startup.cc:73
-msgid "Open an existing session"
-msgstr "Vorhandenes Projekt öffnen"
-
-#: startup.cc:74
msgid ""
"Use an external mixer or the hardware mixer of your audio interface.\n"
"%1 will play NO role in monitoring"
@@ -11402,15 +11388,11 @@ msgstr ""
"Verwende einen externen Mixer oder den Hardwaremixer der Audiohardware.\n"
"%1 wird das Monitoring NICHT übernehmen."
-#: startup.cc:76
+#: startup.cc:74
msgid "Ask %1 to play back material as it is being recorded"
msgstr "%1 soll laufende Aufnahmen wiedergeben"
-#: startup.cc:79
-msgid "I'd like more options for this session"
-msgstr "Erweiterte Optionen für dieses Projekt"
-
-#: startup.cc:194
+#: startup.cc:143
msgid ""
"<b>Welcome to this BETA release of Ardour %1</b>\n"
"\n"
@@ -11462,15 +11444,11 @@ msgstr ""
"\n"
" http://ardour.org/support\n"
-#: startup.cc:218
+#: startup.cc:167
msgid "This is a BETA RELEASE"
msgstr "Dies ist ein BETA RELEASE"
-#: startup.cc:324
-msgid "Audio / MIDI Setup"
-msgstr "Audio / MIDI Einstellungen"
-
-#: startup.cc:336
+#: startup.cc:176
msgid ""
"<span size=\"larger\">%1 is a digital audio workstation. You can use it to "
"record, edit and mix multi-track audio. You can produce your own CDs, mix "
@@ -11487,15 +11465,15 @@ msgstr ""
"Es gibt ein paar Dinge, die vor dem ersten Programmstart konfiguriert werden "
"müssen.</span>"
-#: startup.cc:362
+#: startup.cc:202
msgid "Welcome to %1"
msgstr "Willkommen zu %1"
-#: startup.cc:385
+#: startup.cc:225
msgid "Default folder for %1 sessions"
msgstr "Standardordner für %1 Projekte"
-#: startup.cc:391
+#: startup.cc:231
msgid ""
"Each project that you work on with %1 has its own folder.\n"
"These can require a lot of disk space if you are recording audio.\n"
@@ -11512,11 +11490,11 @@ msgstr ""
"<i>(Neue Projekte können überall abgespeichert werden, dies ist nur die "
"Vorgabe)</i>"
-#: startup.cc:415
+#: startup.cc:253
msgid "Default folder for new sessions"
msgstr "Standardordner für neue Projekte"
-#: startup.cc:436
+#: startup.cc:274
msgid ""
"While recording instruments or vocals, you probably want to listen to the\n"
"signal as well as record it. This is called \"monitoring\". There are\n"
@@ -11541,15 +11519,15 @@ msgstr ""
"\n"
"<i>If you do not understand what this is about, just accept the default.</i>"
-#: startup.cc:457
+#: startup.cc:295
msgid "Monitoring Choices"
msgstr "Auswahl des Monitoring"
-#: startup.cc:480
+#: startup.cc:318
msgid "Use a Master bus directly"
msgstr "Nutze den Master-Bus direkt"
-#: startup.cc:482
+#: startup.cc:320
msgid ""
"Connect the Master bus directly to your hardware outputs. This is preferable "
"for simple usage."
@@ -11557,11 +11535,11 @@ msgstr ""
"Verbinde den Master-Bus direkt mit den Audioausgängen. Wird für "
"einfacheAnwendungen empfohlen."
-#: startup.cc:491
+#: startup.cc:329
msgid "Use an additional Monitor bus"
msgstr "Nutze einen zusätzlichen Monitor-Bus"
-#: startup.cc:494
+#: startup.cc:332
msgid ""
"Use a Monitor bus between Master bus and hardware outputs for \n"
"greater control in monitoring without affecting the mix."
@@ -11569,7 +11547,7 @@ msgstr ""
"Nutze einen Monitor-Bus zwischen Master-Bus und Audioausgängen, um mehr\n"
"Möglichkeiten für das Monitoring zu bekommen, ohne den Mix zu beeinflussen."
-#: startup.cc:516
+#: startup.cc:354
msgid ""
"<i>You can change this preference at any time via the Preferences dialog.\n"
"You can also add or remove the monitor section to/from any session.</i>\n"
@@ -11583,110 +11561,10 @@ msgstr ""
"\n"
"</i>Im Zweifelsfall akzeptieren Sie die Voreinstellung.</i>"
-#: startup.cc:527
+#: startup.cc:365
msgid "Monitor Section"
msgstr "Monitorsektion"
-#: startup.cc:573
-msgid "Check the website for more..."
-msgstr "Informieren Sie sich auf der Webseite weiter..."
-
-#: startup.cc:576
-msgid "Click to open the program website in your web browser"
-msgstr "Klicken Sie, um die Webseite in Ihrem Web-Browse zu öffnen"
-
-#: startup.cc:729
-msgid "Open"
-msgstr "Öffnen"
-
-#: startup.cc:775
-msgid "Session name:"
-msgstr "Projektname:"
-
-#: startup.cc:798
-msgid "Create session folder in:"
-msgstr "Ort des Projektverzeichnisses:"
-
-#: startup.cc:821
-msgid "Select folder for session"
-msgstr "Ordner für Projekt wählen"
-
-#: startup.cc:853
-msgid "Use this template"
-msgstr "Diese Vorlage verwenden"
-
-#: startup.cc:856
-msgid "no template"
-msgstr "keine Vorlage"
-
-#: startup.cc:884
-msgid "Use an existing session as a template:"
-msgstr "Ein vorhandenes Projekt als Vorlage verwenden:"
-
-#: startup.cc:896
-msgid "Select template"
-msgstr "Vorlage auswählen"
-
-#: startup.cc:922
-msgid "New Session"
-msgstr "Neues Projekt"
-
-#: startup.cc:1077
-msgid "Select session file"
-msgstr "Projektdatei auswählen"
-
-#: startup.cc:1093
-msgid "Browse:"
-msgstr "Durchsuchen:"
-
-#: startup.cc:1102
-msgid "Select a session"
-msgstr "Projekt auswählen"
-
-#: startup.cc:1129 startup.cc:1130 startup.cc:1131
-msgid "channels"
-msgstr "Kanäle"
-
-#: startup.cc:1145
-msgid "<b>Busses</b>"
-msgstr "<b>Busse</b>"
-
-#: startup.cc:1146
-msgid "<b>Inputs</b>"
-msgstr "<b>Eingänge</b>"
-
-#: startup.cc:1147
-msgid "<b>Outputs</b>"
-msgstr "<b>Ausgänge</b>"
-
-#: startup.cc:1155
-msgid "Create master bus"
-msgstr "Master-Bus erstellen"
-
-#: startup.cc:1165
-msgid "Automatically connect to physical inputs"
-msgstr "Automatisch mit Audioeingängen verbinden"
-
-#: startup.cc:1172 startup.cc:1231
-msgid "Use only"
-msgstr "Benutze nur"
-
-#: startup.cc:1225
-msgid "Automatically connect outputs"
-msgstr "Ausgänge automatisch verbinden"
-
-#: startup.cc:1247
-msgid "... to master bus"
-msgstr "... mit dem Master-Bus"
-
-#: startup.cc:1257
-msgid "... to physical outputs"
-msgstr "... mit den Audioausgängen"
-
-#: startup.cc:1307
-msgid "Advanced Session Options"
-msgstr "Erweiterte Einstellungen"
-
#: step_entry.cc:59
msgid "Step Entry: %1"
msgstr "Eingabemodus (Step Entry): %1"
@@ -12364,23 +12242,23 @@ msgstr ""
msgid "Config file %1 not saved"
msgstr "Konfigurationsdatei %1 nicht gespeichert"
-#: utils.cc:110 utils.cc:153
+#: utils.cc:111 utils.cc:154
msgid "bad XPM header %1"
msgstr "Fehlerhafter XPM Header %1"
-#: utils.cc:292 utils.cc:324
+#: utils.cc:293 utils.cc:325
msgid "missing RGBA style for \"%1\""
msgstr "Fehlender RGBA Style für \"%1\""
-#: utils.cc:591
+#: utils.cc:598
msgid "cannot find XPM file for %1"
msgstr "Konnte XPM-Datei für %1 nicht finden"
-#: utils.cc:617
+#: utils.cc:624
msgid "cannot find icon image for %1 using %2"
msgstr "Konnte Icon-Bild für %1 unter %2 nicht finden"
-#: utils.cc:632
+#: utils.cc:639
msgid "Caught exception while loading icon named %1"
msgstr ""
"Während des Ladens des Icons mit dem Namen %1 trat ein Ausnahmefehler auf"
@@ -12809,51 +12687,55 @@ msgstr "von 00:00:00:00 bis Videoende"
msgid "from the video's start to the video's end"
msgstr "von Videostart bis Videoende"
-#: export_video_dialog.cc:184
+#: export_video_dialog.cc:154
+msgid "Selected range"
+msgstr "Ausgewählter Bereich"
+
+#: export_video_dialog.cc:190
msgid "<b>Settings:</b>"
msgstr "<b>Einstellungen:</b>"
-#: export_video_dialog.cc:192
+#: export_video_dialog.cc:198
msgid "Range:"
msgstr "Bereich:"
-#: export_video_dialog.cc:195
+#: export_video_dialog.cc:201
msgid "Preset:"
msgstr "Preset:"
-#: export_video_dialog.cc:198
+#: export_video_dialog.cc:204
msgid "Video Codec:"
msgstr "Videocodec:"
-#: export_video_dialog.cc:201
+#: export_video_dialog.cc:207
msgid "Video KBit/s:"
msgstr "Video KBit/s:"
-#: export_video_dialog.cc:204
+#: export_video_dialog.cc:210
msgid "Audio Codec:"
msgstr "Audiocodec:"
-#: export_video_dialog.cc:207
+#: export_video_dialog.cc:213
msgid "Audio KBit/s:"
msgstr "Audio KBit/s:"
-#: export_video_dialog.cc:210
+#: export_video_dialog.cc:216
msgid "Audio Samplerate:"
msgstr "Audiosamplerate:"
-#: export_video_dialog.cc:387
+#: export_video_dialog.cc:392
msgid "Normalizing audio"
msgstr "Audio normalisieren"
-#: export_video_dialog.cc:391
+#: export_video_dialog.cc:396
msgid "Exporting audio"
msgstr "Exportiere Audio"
-#: export_video_dialog.cc:437
+#: export_video_dialog.cc:442
msgid "Exporting Audio..."
msgstr "Exportiere Audio..."
-#: export_video_dialog.cc:494
+#: export_video_dialog.cc:499
msgid ""
"Export Video: Cannot query duration of video-file, using duration from "
"timeline instead."
@@ -12861,33 +12743,33 @@ msgstr ""
"Exportiere Video: Kann die Dauer der Videodatei nicht eruieren, verwende "
"statt dessen die Dauer aus der Zeitleiste."
-#: export_video_dialog.cc:523
+#: export_video_dialog.cc:533
msgid "Export Video: No Master Out Ports to Connect for Audio Export"
msgstr ""
"Exportiere Video: Keine Master-Ausgangsports zum Verbinden für den "
"Audioexport"
-#: export_video_dialog.cc:562
+#: export_video_dialog.cc:572
msgid "Encoding Video..."
msgstr "Enkodiere Video..."
-#: export_video_dialog.cc:581
+#: export_video_dialog.cc:591
msgid "Export Video: Video input file cannot be read."
msgstr "Exportiere Video: Die Videoquelldatei kann nicht gelesen werden."
-#: export_video_dialog.cc:679
+#: export_video_dialog.cc:684
msgid "Encoding Video.. Pass 1/2"
msgstr "Kodiere Video.. Durchgang 1/2"
-#: export_video_dialog.cc:691
+#: export_video_dialog.cc:696
msgid "Encoding Video.. Pass 2/2"
msgstr "Kodiere Video.. Durchgang 2/2"
-#: export_video_dialog.cc:779
+#: export_video_dialog.cc:803
msgid "Transcoding failed."
msgstr "Transkodieren fehlgeschlagen."
-#: export_video_dialog.cc:948 export_video_dialog.cc:968
+#: export_video_dialog.cc:972 export_video_dialog.cc:992
msgid "Save Exported Video File"
msgstr "Sichere exportierte Videodatei"
@@ -12920,6 +12802,286 @@ msgstr ""
"\n"
"Handbuch im Browser öffnen? "
+#~ msgid "Click the Refresh button to try again."
+#~ msgstr "Klicken Sie auf Aktualisieren, um es erneut zu versuchen."
+
+#~ msgid "JACK"
+#~ msgstr "JACK"
+
+#~ msgid "Reconnect"
+#~ msgstr "Verbinde neu"
+
+#~ msgid "Window|Audio/MIDI Setup"
+#~ msgstr "Audio/MIDI Einstellungen"
+
+#~ msgid "JACK Sampling Rate and Latency"
+#~ msgstr "JACK Samplerate und Latenz"
+
+#~ msgid "Launch Control App"
+#~ msgstr "Starte Steuerungsprogramm"
+
+#~ msgid ""
+#~ "1. <span weight=\"bold\">Turn down the volume on your hardware to a very "
+#~ "low level.</span>\n"
+#~ "\n"
+#~ "2. Connect the two channels that you select below using either a cable or "
+#~ "(less ideally) a speaker and microphone.\n"
+#~ "\n"
+#~ "3. Once the channels are connected, click the \"Measure latency\" "
+#~ "button.\n"
+#~ "\n"
+#~ "4. When satisfied with the results, click the \"Use results\" button."
+#~ msgstr ""
+#~ "1. <span weight=\"bold\">Stellen Sie die Lautstärke ihrer Hardware auf "
+#~ "einen sehr leisen Pegel.</span>\n"
+#~ "\n"
+#~ "2. Verbinden Sie die zwei Kanäle, die Sie unten auswählen, entweder per "
+#~ "Kabel oder (weniger ideal) per Lautsprecher und Mikrophon.\n"
+#~ "\n"
+#~ "3. Klicken Sie den Knopf \"Latenz messen\".\n"
+#~ "\n"
+#~ "4. Wenn Sie mit den Ergebnissen zufrieden sind, klicken Sie den Knopf "
+#~ "\"Benutze Egebnisse\"."
+
+#~ msgid ""
+#~ "There are several possible reasons:\n"
+#~ "\n"
+#~ "1) JACK is not running.\n"
+#~ "2) JACK is running as another user, perhaps root.\n"
+#~ "3) There is already another client called \"%1\".\n"
+#~ "\n"
+#~ "Please consider the possibilities, and perhaps (re)start JACK."
+#~ msgstr ""
+#~ "Dafür kann es verschiedene Gründe geben:\n"
+#~ "\n"
+#~ "1) JACK läuft nicht.\n"
+#~ "2) JACK wurde unter einem anderen Benutzer gestartet, möglicherweise als "
+#~ "root.\n"
+#~ "3) Es gibt bereits einen anderen Client mit der Bezeichnung \"%1\".\n"
+#~ "\n"
+#~ "Betrachten Sie bitte diese Möglichkeiten und starten Sie ggf. JACK neu."
+
+#~ msgid "Create a new session"
+#~ msgstr "Neues Projekt erzeugen"
+
+#~ msgid "Open an existing session"
+#~ msgstr "Vorhandenes Projekt öffnen"
+
+#~ msgid "I'd like more options for this session"
+#~ msgstr "Erweiterte Optionen für dieses Projekt"
+
+#~ msgid "Use an existing session as a template:"
+#~ msgstr "Ein vorhandenes Projekt als Vorlage verwenden:"
+
+#~ msgid "Select template"
+#~ msgstr "Vorlage auswählen"
+
+#~ msgid "Browse:"
+#~ msgstr "Durchsuchen:"
+
+#~ msgid "Select a session"
+#~ msgstr "Projekt auswählen"
+
+#~ msgid "Playback/recording on 1 device"
+#~ msgstr "Wiedergabe/Aufnahme mit einem Gerät"
+
+#~ msgid "Playback/recording on 2 devices"
+#~ msgstr "Wiedergabe/Aufnahme mit zwei Geräten"
+
+#~ msgid "Playback only"
+#~ msgstr "Nur Wiedergabe"
+
+#~ msgid "Recording only"
+#~ msgstr "Nur Aufnahme"
+
+#~ msgid "Realtime"
+#~ msgstr "Realtime"
+
+#~ msgid "Starting audio engine"
+#~ msgstr "Starte Audio-Engine"
+
+#~ msgid "disconnected"
+#~ msgstr "getrennt"
+
+#~ msgid "Unable to start the session running"
+#~ msgstr "Konnte das aktuelle Projekt nicht starten"
+
+#~ msgid "Do not lock memory"
+#~ msgstr "Speicherzugriff nicht sperren"
+
+#~ msgid "Unlock memory"
+#~ msgstr "Speicherzugriff öffnen"
+
+#~ msgid "No zombies"
+#~ msgstr "Keine Zombies (Soft Mode)"
+
+#~ msgid "Provide monitor ports"
+#~ msgstr "Monitor-Ports erstellen"
+
+#~ msgid "H/W monitoring"
+#~ msgstr "Hardware Monitoring"
+
+#~ msgid "H/W metering"
+#~ msgstr "Hardware-Pegelanzeige"
+
+#~ msgid "Verbose output"
+#~ msgstr "Ausführliche Statusmeldungen"
+
+#~ msgid "8000Hz"
+#~ msgstr "8000 Hz"
+
+#~ msgid "22050Hz"
+#~ msgstr "22050 Hz"
+
+#~ msgid "44100Hz"
+#~ msgstr "44100 Hz"
+
+#~ msgid "48000Hz"
+#~ msgstr "48000 Hz"
+
+#~ msgid "88200Hz"
+#~ msgstr "88200 Hz"
+
+#~ msgid "96000Hz"
+#~ msgstr "96000 Hz"
+
+#~ msgid "192000Hz"
+#~ msgstr "192000 Hz"
+
+#~ msgid "Triangular"
+#~ msgstr "dreieckig"
+
+#~ msgid "Rectangular"
+#~ msgstr "rechteckig"
+
+#~ msgid "Shaped"
+#~ msgstr "shaped"
+
+#~ msgid "coremidi"
+#~ msgstr "coremidi"
+
+#~ msgid "seq"
+#~ msgstr "seq"
+
+#~ msgid "raw"
+#~ msgstr "raw"
+
+#~ msgid "Audio Interface:"
+#~ msgstr "Audio-Schnittstelle:"
+
+#~ msgid "Number of buffers:"
+#~ msgstr "Pufferanzahl:"
+
+#~ msgid "Approximate latency:"
+#~ msgstr "Latenz (ca.)"
+
+#~ msgid "Audio mode:"
+#~ msgstr "Audio-Modus:"
+
+#~ msgid "Ignore"
+#~ msgstr "ignorieren"
+
+#~ msgid "Client timeout"
+#~ msgstr "Client Timeout"
+
+#~ msgid "Number of ports:"
+#~ msgstr "Portanzahl"
+
+#~ msgid "MIDI driver:"
+#~ msgstr "MIDI-Treiber:"
+
+#~ msgid "Dither:"
+#~ msgstr "Dithering:"
+
+#~ msgid ""
+#~ "No JACK server found anywhere on this system. Please install JACK and "
+#~ "restart"
+#~ msgstr ""
+#~ "Es wurde kein JACK Server auf diesem System gefunden. Bitte installieren "
+#~ "Sie JACK vor einem Neuversuch."
+
+#~ msgid "Server:"
+#~ msgstr "Server:"
+
+#~ msgid "Input device:"
+#~ msgstr "Eingangsgerät:"
+
+#~ msgid "Output device:"
+#~ msgstr "Ausgabegerät:"
+
+#~ msgid "Advanced"
+#~ msgstr "Erweitert"
+
+#~ msgid "cannot open JACK rc file %1 to store parameters"
+#~ msgstr "kann die JACK rc-Datei %1 nicht öffnen, um die Parameter zu sichern"
+
+#~ msgid ""
+#~ "You do not have any audio devices capable of\n"
+#~ "simultaneous playback and recording.\n"
+#~ "\n"
+#~ "Please use Applications -> Utilities -> Audio MIDI Setup\n"
+#~ "to create an \"aggregrate\" device, or install a suitable\n"
+#~ "audio interface.\n"
+#~ "\n"
+#~ "Please send email to Apple and ask them why new Macs\n"
+#~ "have no duplex audio device.\n"
+#~ "\n"
+#~ "Alternatively, if you really want just playback\n"
+#~ "or recording but not both, start JACK before running\n"
+#~ "%1 and choose the relevant device then."
+#~ msgstr ""
+#~ "Sie haben keine Soundkarte, die gleichzeitiges\n"
+#~ "Abspielen und Aufnehmen unterstützt.\n"
+#~ "\n"
+#~ "Benützen Sie Programme>Dienstprogramme>Audio-Midi-Setup\n"
+#~ " um ein kombiniertes Gerät zu erzeugen, oder installieren Sie ein\n"
+#~ "geeignetes Audiointerface.\n"
+#~ "\n"
+#~ "Bitte senden Sie eine E-Mail an Apple und fragen Sie, warum Sie\n"
+#~ "keine Duplex Soundkarte in Ihrem Mac haben.\n"
+#~ "\n"
+#~ "Wenn Sie Audiomaterial wirklich nicht gleichzeitig aufnehmen und "
+#~ "wiedergeben wollen,\n"
+#~ "können Sie JACK vor dem Starten von %1 aufrufen und das entsprechende "
+#~ "Gerät auswählen."
+
+#~ msgid "No suitable audio devices"
+#~ msgstr "Keine passenden Audiogeräte."
+
+#~ msgid "JACK appears to be missing from the %1 bundle"
+#~ msgstr "JACK scheint im %1-Paket zu fehlen."
+
+#~ msgid "You need to choose an audio device first."
+#~ msgstr "Sie müssen zuerst ein Audiogerät auswählen."
+
+#~ msgid "Audio device \"%1\" not known on this computer."
+#~ msgstr "Audiogerät %1 scheint auf diesem Computer nicht vorhanden zu sein."
+
+#~ msgid "AudioSetup value for %1 is missing data"
+#~ msgstr "Es fehlen Daten zum AudioSetup-Wert von %1"
+
+#~ msgid ""
+#~ "configuration files contain a JACK server path that doesn't exist (%1)"
+#~ msgstr ""
+#~ "die Konfiguration enthält einen JACK-Serverpfad, der nicht existiert (%1)"
+
+#~ msgid "JACK exited"
+#~ msgstr "JACK wurde beendet"
+
+#~ msgid ""
+#~ "JACK exited unexpectedly, and without notifying %1.\n"
+#~ "\n"
+#~ "This is probably due to an error inside JACK. You should restart JACK\n"
+#~ "and reconnect %1 to it, or exit %1 now. You cannot save your\n"
+#~ "session at this time, because we would lose your connection information.\n"
+#~ msgstr ""
+#~ "JACK wurde unerwartet und ohne Benachrichtigung beendet %1.\n"
+#~ "\n"
+#~ "Dies liegt wahrscheinlich an einem Fehler in JACK. Sie sollten\n"
+#~ "JACK neu starten und %1 erneut mit ihm verbinden, oder %1 jetzt beenden.\n"
+#~ "Momentan läßt sich das Projekt nicht speichern, da alle Informationen\n"
+#~ "über Verbindungen verloren gehen würden.\n"
+
#~ msgid "Failed to set session-framerate: "
#~ msgstr "Konnte Projekt-Framerate nicht einstellen: "
@@ -12974,9 +13136,6 @@ msgstr ""
#~ msgid "What would you like to do ?"
#~ msgstr "Was möchten Sie tun?"
-#~ msgid "Connect"
-#~ msgstr "Verbinden"
-
#~ msgid "Mixer on Top"
#~ msgstr "Mixer über Editor"
diff --git a/gtk2_ardour/processor_box.cc b/gtk2_ardour/processor_box.cc
index 07781fe7ee..1ed7c39312 100644
--- a/gtk2_ardour/processor_box.cc
+++ b/gtk2_ardour/processor_box.cc
@@ -2151,7 +2151,7 @@ ProcessorBox::get_editor_window (boost::shared_ptr<Processor> processor, bool us
} else if ((port_insert = boost::dynamic_pointer_cast<PortInsert> (processor)) != 0) {
if (!_session->engine().connected()) {
- MessageDialog msg ( _("Not connected to JACK - no I/O changes are possible"));
+ MessageDialog msg ( _("Not connected to audio engine - no I/O changes are possible"));
msg.run ();
return 0;
}
diff --git a/gtk2_ardour/rc_option_editor.cc b/gtk2_ardour/rc_option_editor.cc
index ed9ffda4ef..f9336cee31 100644
--- a/gtk2_ardour/rc_option_editor.cc
+++ b/gtk2_ardour/rc_option_editor.cc
@@ -1146,7 +1146,7 @@ RCOptionEditor::RCOptionEditor ()
tsf = new BoolOption (
"seamless-loop",
- _("Do seamless looping (not possible when slaved to MTC, JACK etc)"),
+ _("Do seamless looping (not possible when slaved to MTC, LTC etc)"),
sigc::mem_fun (*_rc_config, &RCConfiguration::get_seamless_loop),
sigc::mem_fun (*_rc_config, &RCConfiguration::set_seamless_loop)
);
@@ -1464,12 +1464,10 @@ RCOptionEditor::RCOptionEditor ()
sigc::mem_fun (*_rc_config, &RCConfiguration::set_monitoring_model)
);
-#ifndef __APPLE__
- /* no JACK monitoring on CoreAudio */
if (AudioEngine::instance()->port_engine().can_monitor_input()) {
mm->add (HardwareMonitoring, _("via Audio Driver"));
}
-#endif
+
mm->add (SoftwareMonitoring, _("ardour"));
mm->add (ExternalMonitoring, _("audio hardware"));
diff --git a/gtk2_ardour/session_dialog.cc b/gtk2_ardour/session_dialog.cc
new file mode 100644
index 0000000000..996dab1cc4
--- /dev/null
+++ b/gtk2_ardour/session_dialog.cc
@@ -0,0 +1,1075 @@
+/*
+ Copyright (C) 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 "gtk2ardour-config.h"
+#endif
+
+#include <fstream>
+#include <algorithm>
+
+#include <gtkmm/filechooser.h>
+
+#include "pbd/failed_constructor.h"
+#include "pbd/file_utils.h"
+#include "pbd/replace_all.h"
+#include "pbd/whitespace.h"
+#include "pbd/stacktrace.h"
+#include "pbd/openuri.h"
+
+#include "ardour/audioengine.h"
+#include "ardour/filesystem_paths.h"
+#include "ardour/recent_sessions.h"
+#include "ardour/session.h"
+#include "ardour/session_state_utils.h"
+#include "ardour/template_utils.h"
+#include "ardour/filename_extensions.h"
+
+#include "ardour_ui.h"
+#include "session_dialog.h"
+#include "opts.h"
+#include "engine_dialog.h"
+#include "i18n.h"
+#include "utils.h"
+
+using namespace std;
+using namespace Gtk;
+using namespace Gdk;
+using namespace Glib;
+using namespace PBD;
+using namespace ARDOUR;
+
+static string poor_mans_glob (string path)
+{
+ string copy = path;
+ replace_all (copy, "~", Glib::get_home_dir());
+ return copy;
+}
+
+SessionDialog::SessionDialog (bool require_new, const std::string& session_name, const std::string& session_path, const std::string& template_name, bool cancel_not_quit)
+ : ArdourDialog (_("Session Setup"), true, true)
+ , new_only (require_new)
+ , _provided_session_name (session_name)
+ , _provided_session_path (session_path)
+ , new_folder_chooser (FILE_CHOOSER_ACTION_SELECT_FOLDER)
+ , more_new_session_options_button (_("Advanced options ..."))
+ , _output_limit_count_adj (1, 0, 100, 1, 10, 0)
+ , _input_limit_count_adj (1, 0, 100, 1, 10, 0)
+ , _master_bus_channel_count_adj (2, 0, 100, 1, 10, 0)
+ , _existing_session_chooser_used (false)
+{
+ set_keep_above (true);
+ set_position (WIN_POS_CENTER);
+ get_vbox()->set_spacing (6);
+
+ cancel_button = add_button ((cancel_not_quit ? Stock::CANCEL : Stock::QUIT), RESPONSE_CANCEL);
+ back_button = add_button (Stock::GO_BACK, RESPONSE_NO);
+ open_button = add_button (Stock::OPEN, RESPONSE_ACCEPT);
+
+ back_button->signal_button_press_event().connect (sigc::mem_fun (*this, &SessionDialog::back_button_pressed), false);
+
+ open_button->set_sensitive (false);
+ back_button->set_sensitive (false);
+
+ /* this is where announcements will be displayed, but it may be empty
+ * and invisible most of the time.
+ */
+
+ info_frame.set_shadow_type(SHADOW_ETCHED_OUT);
+ info_frame.set_no_show_all (true);
+ info_frame.set_border_width (12);
+ get_vbox()->pack_start (info_frame, false, false);
+
+ setup_new_session_page ();
+
+ if (!new_only) {
+ setup_initial_choice_box ();
+ get_vbox()->pack_start (ic_vbox, true, true);
+ } else {
+ get_vbox()->pack_start (session_new_vbox, true, true);
+ }
+
+ if (!template_name.empty()) {
+ use_template_button.set_active (false);
+ load_template_override = template_name;
+ }
+
+ get_vbox()->show_all ();
+
+ /* fill data models and how/hide accordingly */
+
+ populate_session_templates ();
+
+ if (!template_model->children().empty()) {
+ use_template_button.show();
+ template_chooser.show ();
+ } else {
+ use_template_button.hide();
+ template_chooser.hide ();
+ }
+
+ if (recent_session_model) {
+ int cnt = redisplay_recent_sessions ();
+ if (cnt > 0) {
+ recent_scroller.show();
+ recent_label.show ();
+
+ if (cnt > 4) {
+ recent_scroller.set_size_request (-1, 300);
+ }
+ } else {
+ recent_scroller.hide();
+ recent_label.hide ();
+ }
+ }
+
+ /* possibly get out of here immediately if everything is ready to go.
+ We still need to set up the whole dialog because of the way
+ ARDOUR_UI::get_session_parameters() might skip it on a first
+ pass then require it for a second pass (e.g. when there
+ is an error with session loading and we have to ask the user
+ what to do next).
+ */
+
+ if (!session_name.empty() && !require_new) {
+ response (RESPONSE_OK);
+ return;
+ }
+}
+
+SessionDialog::~SessionDialog()
+{
+}
+
+void
+SessionDialog::clear_given ()
+{
+ _provided_session_path = "";
+ _provided_session_name = "";
+}
+
+bool
+SessionDialog::use_session_template ()
+{
+ if (!load_template_override.empty()) {
+ return true;
+ }
+
+ if (use_template_button.get_active()) {
+ return true;
+ }
+
+ return false;
+}
+
+std::string
+SessionDialog::session_template_name ()
+{
+ if (!load_template_override.empty()) {
+ string the_path (ARDOUR::user_template_directory());
+ return Glib::build_filename (the_path, load_template_override + ARDOUR::template_suffix);
+ }
+
+ if (use_template_button.get_active()) {
+ TreeModel::iterator iter = template_chooser.get_active ();
+ TreeModel::Row row = (*iter);
+ string s = row[session_template_columns.path];
+ return s;
+ }
+
+ return string();
+}
+
+std::string
+SessionDialog::session_name (bool& should_be_new)
+{
+ if (!_provided_session_name.empty() && !new_only) {
+ should_be_new = false;
+ return _provided_session_name;
+ }
+
+ /* Try recent session selection */
+
+ TreeIter iter = recent_session_display.get_selection()->get_selected();
+
+ if (iter) {
+ should_be_new = false;
+ return (*iter)[recent_session_columns.visible_name];
+ }
+
+ if (_existing_session_chooser_used) {
+ /* existing session chosen from file chooser */
+ should_be_new = false;
+ return existing_session_chooser.get_filename ();
+ } else {
+ should_be_new = true;
+ string val = new_name_entry.get_text ();
+ strip_whitespace_edges (val);
+ return val;
+ }
+}
+
+std::string
+SessionDialog::session_folder ()
+{
+ if (!_provided_session_path.empty() && !new_only) {
+ return _provided_session_path;
+ }
+
+ /* Try recent session selection */
+
+ TreeIter iter = recent_session_display.get_selection()->get_selected();
+
+ if (iter) {
+ string s = (*iter)[recent_session_columns.fullpath];
+ if (Glib::file_test (s, Glib::FILE_TEST_IS_REGULAR)) {
+ return Glib::path_get_dirname (s);
+ }
+ return s;
+ }
+
+ if (_existing_session_chooser_used) {
+ /* existing session chosen from file chooser */
+ return Glib::path_get_dirname (existing_session_chooser.get_current_folder ());
+ } else {
+ std::string legal_session_folder_name = legalize_for_path (new_name_entry.get_text());
+ return Glib::build_filename (new_folder_chooser.get_current_folder(), legal_session_folder_name);
+ }
+}
+
+void
+SessionDialog::setup_initial_choice_box ()
+{
+ ic_vbox.set_spacing (6);
+
+ HBox* centering_hbox = manage (new HBox);
+ VBox* centering_vbox = manage (new VBox);
+
+ centering_vbox->set_spacing (6);
+
+ Label* new_label = manage (new Label);
+ new_label->set_markup (string_compose ("<span weight=\"bold\" size=\"large\">%1</span>", _("New Session")));
+ new_label->set_justify (JUSTIFY_CENTER);
+
+ ic_new_session_button.add (*new_label);
+ ic_new_session_button.signal_clicked().connect (sigc::mem_fun (*this, &SessionDialog::new_session_button_clicked));
+
+ Gtk::HBox* hbox = manage (new HBox);
+ Gtk::VBox* vbox = manage (new VBox);
+ hbox->set_spacing (12);
+ vbox->set_spacing (12);
+
+ string image_path;
+
+ if (find_file_in_search_path (ardour_data_search_path(), "small-splash.png", image_path)) {
+ Gtk::Image* image;
+ if ((image = manage (new Gtk::Image (image_path))) != 0) {
+ hbox->pack_start (*image, false, false);
+ }
+ }
+
+ vbox->pack_start (ic_new_session_button, true, true, 20);
+ hbox->pack_start (*vbox, true, true, 20);
+
+ centering_vbox->pack_start (*hbox, false, false);
+
+ /* Possible update message */
+
+ if (ARDOUR_UI::instance()->announce_string() != "" ) {
+
+ Box *info_box = manage (new VBox);
+ info_box->set_border_width (12);
+ info_box->set_spacing (6);
+
+ info_box->pack_start (info_scroller_label, false, false);
+
+ info_scroller_count = 0;
+ info_scroller_connection = Glib::signal_timeout().connect (mem_fun(*this, &SessionDialog::info_scroller_update), 50);
+
+ Gtk::Button *updates_button = manage (new Gtk::Button (_("Check the website for more...")));
+
+ updates_button->signal_clicked().connect (mem_fun(*this, &SessionDialog::updates_button_clicked) );
+ ARDOUR_UI::instance()->tooltips().set_tip (*updates_button, _("Click to open the program website in your web browser"));
+
+ info_box->pack_start (*updates_button, false, false);
+
+ info_frame.add (*info_box);
+ info_box->show_all ();
+ info_frame.show ();
+ }
+
+ /* recent session scroller */
+
+ recent_label.set_no_show_all (true);
+ recent_scroller.set_no_show_all (true);
+
+ recent_label.set_markup (string_compose ("<span weight=\"bold\" size=\"large\">%1</span>", _("Recent Sessions")));
+
+ recent_session_model = TreeStore::create (recent_session_columns);
+
+ recent_session_display.set_model (recent_session_model);
+ recent_session_display.append_column (_("Recent Sessions"), recent_session_columns.visible_name);
+ recent_session_display.append_column (_("Sample Rate"), recent_session_columns.sample_rate);
+ recent_session_display.append_column (_("Disk Format"), recent_session_columns.disk_format);
+ recent_session_display.set_headers_visible (false);
+ recent_session_display.get_selection()->set_mode (SELECTION_SINGLE);
+
+ recent_session_display.get_selection()->signal_changed().connect (sigc::mem_fun (*this, &SessionDialog::recent_session_row_selected));
+
+ recent_scroller.add (recent_session_display);
+ recent_scroller.set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);
+ recent_scroller.set_shadow_type (Gtk::SHADOW_IN);
+
+ recent_session_display.show();
+ recent_session_display.signal_row_activated().connect (sigc::mem_fun (*this, &SessionDialog::recent_row_activated));
+
+ centering_vbox->pack_start (recent_label, false, false, 12);
+ centering_vbox->pack_start (recent_scroller, false, true);
+
+ /* Browse button */
+
+ existing_session_chooser.set_title (_("Select session file"));
+ existing_session_chooser.signal_file_set().connect (sigc::mem_fun (*this, &SessionDialog::existing_session_selected));
+ existing_session_chooser.set_current_folder(poor_mans_glob (Config->get_default_session_parent_dir()));
+
+ FileFilter session_filter;
+ session_filter.add_pattern ("*.ardour");
+ session_filter.set_name (string_compose (_("%1 sessions"), PROGRAM_NAME));
+ existing_session_chooser.add_filter (session_filter);
+ existing_session_chooser.set_filter (session_filter);
+
+#ifdef GTKOSX
+ existing_session_chooser.add_shortcut_folder ("/Volumes");
+#endif
+
+ Label* browse_label = manage (new Label);
+ browse_label->set_markup (string_compose ("<span weight=\"bold\" size=\"large\">%1</span>", _("Other Sessions")));
+
+ centering_vbox->pack_start (*browse_label, false, false, 12);
+ centering_vbox->pack_start (existing_session_chooser, false, false);
+
+ /* pack it all up */
+
+ centering_hbox->pack_start (*centering_vbox, true, true);
+ ic_vbox.pack_start (*centering_hbox, true, true);
+ ic_vbox.show_all ();
+}
+
+void
+SessionDialog::session_selected ()
+{
+ /* HACK HACK HACK ... change the "Apply" button label
+ to say "Open"
+ */
+
+ Gtk::Widget* tl = ic_vbox.get_toplevel();
+ Gtk::Window* win;
+ if ((win = dynamic_cast<Gtk::Window*>(tl)) != 0) {
+ /* ::get_default_widget() is not wrapped in gtkmm */
+ Gtk::Widget* def = wrap (gtk_window_get_default_widget (win->gobj()));
+ Gtk::Button* button;
+ if ((button = dynamic_cast<Gtk::Button*>(def)) != 0) {
+ button->set_label (_("Open"));
+ }
+ }
+}
+
+void
+SessionDialog::new_session_button_clicked ()
+{
+ _existing_session_chooser_used = false;
+ recent_session_display.get_selection()->unselect_all ();
+
+ get_vbox()->remove (ic_vbox);
+ get_vbox()->pack_start (session_new_vbox, true, true);
+ back_button->set_sensitive (true);
+ new_name_entry.grab_focus ();
+}
+
+bool
+SessionDialog::back_button_pressed (GdkEventButton*)
+{
+ get_vbox()->remove (session_new_vbox);
+ back_button->set_sensitive (false);
+ get_vbox()->pack_start (ic_vbox);
+
+ return true;
+}
+
+void
+SessionDialog::populate_session_templates ()
+{
+ vector<TemplateInfo> templates;
+
+ find_session_templates (templates);
+
+ template_model->clear ();
+
+ for (vector<TemplateInfo>::iterator x = templates.begin(); x != templates.end(); ++x) {
+ TreeModel::Row row;
+
+ row = *(template_model->append ());
+
+ row[session_template_columns.name] = (*x).name;
+ row[session_template_columns.path] = (*x).path;
+ }
+
+ if (!templates.empty()) {
+ /* select first row */
+ template_chooser.set_active (0);
+ }
+}
+
+void
+SessionDialog::setup_new_session_page ()
+{
+ session_new_vbox.set_border_width (12);
+ session_new_vbox.set_spacing (18);
+
+ VBox *vbox1 = manage (new VBox);
+ HBox* hbox1 = manage (new HBox);
+ Label* label1 = manage (new Label);
+
+ vbox1->set_spacing (6);
+
+ hbox1->set_spacing (6);
+ hbox1->pack_start (*label1, false, false);
+ hbox1->pack_start (new_name_entry, true, true);
+
+ label1->set_text (_("Session name:"));
+
+ if (!ARDOUR_COMMAND_LINE::session_name.empty()) {
+ new_name_entry.set_text (Glib::path_get_basename (ARDOUR_COMMAND_LINE::session_name));
+ /* name provided - they can move right along */
+ open_button->set_sensitive (true);
+ }
+
+ new_name_entry.signal_changed().connect (sigc::mem_fun (*this, &SessionDialog::new_name_changed));
+ new_name_entry.signal_activate().connect (sigc::mem_fun (*this, &SessionDialog::new_name_activated));
+
+ vbox1->pack_start (*hbox1, true, true);
+
+ /* --- */
+
+ HBox* hbox2 = manage (new HBox);
+ Label* label2 = manage (new Label);
+
+ hbox2->set_spacing (6);
+ hbox2->pack_start (*label2, false, false);
+ hbox2->pack_start (new_folder_chooser, true, true);
+
+ label2->set_text (_("Create session folder in:"));
+
+ if (!ARDOUR_COMMAND_LINE::session_name.empty()) {
+ new_folder_chooser.set_current_folder (poor_mans_glob (Glib::path_get_dirname (ARDOUR_COMMAND_LINE::session_name)));
+ } else if (ARDOUR_UI::instance()->session_loaded) {
+ // point the new session file chooser at the parent directory of the current session
+ string session_parent_dir = Glib::path_get_dirname(ARDOUR_UI::instance()->the_session()->path());
+ string::size_type last_dir_sep = session_parent_dir.rfind(G_DIR_SEPARATOR);
+ session_parent_dir = session_parent_dir.substr(0, last_dir_sep);
+ new_folder_chooser.set_current_folder (session_parent_dir);
+ string default_session_folder = poor_mans_glob (Config->get_default_session_parent_dir());
+
+ try {
+ /* add_shortcut_folder throws an exception if the folder being added already has a shortcut */
+ new_folder_chooser.add_shortcut_folder (default_session_folder);
+ }
+ catch (Glib::Error & e) {
+ std::cerr << "new_folder_chooser.add_shortcut_folder (" << default_session_folder << ") threw Glib::Error " << e.what() << std::endl;
+ }
+ } else {
+ new_folder_chooser.set_current_folder (poor_mans_glob (Config->get_default_session_parent_dir()));
+ }
+ new_folder_chooser.show ();
+ new_folder_chooser.set_title (_("Select folder for session"));
+
+#ifdef __APPLE__
+ new_folder_chooser.add_shortcut_folder ("/Volumes");
+#endif
+
+ vbox1->pack_start (*hbox2, false, false);
+
+ session_new_vbox.pack_start (*vbox1, false, false);
+
+ /* --- */
+
+ VBox *vbox2 = manage (new VBox);
+ HBox* hbox3 = manage (new HBox);
+ template_model = ListStore::create (session_template_columns);
+
+ vbox2->set_spacing (6);
+
+ VBox *vbox3 = manage (new VBox);
+
+ vbox3->set_spacing (6);
+
+ /* we may want to hide this and show it at various
+ times depending on the existence of templates.
+ */
+ template_chooser.set_no_show_all (true);
+ use_template_button.set_no_show_all (true);
+
+ HBox* hbox4a = manage (new HBox);
+ use_template_button.set_label (_("Use this template"));
+
+ TreeModel::Row row = *template_model->prepend ();
+ row[session_template_columns.name] = (_("no template"));
+ row[session_template_columns.path] = string();
+
+ hbox4a->set_spacing (6);
+ hbox4a->pack_start (use_template_button, false, false);
+ hbox4a->pack_start (template_chooser, true, true);
+
+ template_chooser.set_model (template_model);
+
+ Gtk::CellRendererText* text_renderer = Gtk::manage (new Gtk::CellRendererText);
+ text_renderer->property_editable() = false;
+
+ template_chooser.pack_start (*text_renderer);
+ template_chooser.add_attribute (text_renderer->property_text(), session_template_columns.name);
+ template_chooser.set_active (0);
+
+ vbox3->pack_start (*hbox4a, false, false);
+
+ /* --- */
+
+ HBox* hbox5 = manage (new HBox);
+
+ hbox5->set_spacing (6);
+ hbox5->pack_start (more_new_session_options_button, false, false);
+
+ setup_more_options_box ();
+ more_new_session_options_button.add (more_options_vbox);
+
+ vbox3->pack_start (*hbox5, false, false);
+ hbox3->pack_start (*vbox3, true, true, 8);
+ vbox2->pack_start (*hbox3, false, false);
+
+ /* --- */
+
+ session_new_vbox.pack_start (*vbox2, false, false);
+ session_new_vbox.show_all ();
+}
+
+void
+SessionDialog::new_name_changed ()
+{
+ if (!new_name_entry.get_text().empty()) {
+ session_selected ();
+ open_button->set_sensitive (true);
+ } else {
+ open_button->set_sensitive (false);
+ }
+}
+
+void
+SessionDialog::new_name_activated ()
+{
+ response (RESPONSE_ACCEPT);
+}
+
+int
+SessionDialog::redisplay_recent_sessions ()
+{
+ std::vector<std::string> session_directories;
+ RecentSessionsSorter cmp;
+
+ recent_session_display.set_model (Glib::RefPtr<TreeModel>(0));
+ recent_session_model->clear ();
+
+ ARDOUR::RecentSessions rs;
+ ARDOUR::read_recent_sessions (rs);
+
+ if (rs.empty()) {
+ recent_session_display.set_model (recent_session_model);
+ return 0;
+ }
+ //
+ // sort them alphabetically
+ sort (rs.begin(), rs.end(), cmp);
+
+ for (ARDOUR::RecentSessions::iterator i = rs.begin(); i != rs.end(); ++i) {
+ session_directories.push_back ((*i).second);
+ }
+
+ int session_snapshot_count = 0;
+
+ for (vector<std::string>::const_iterator i = session_directories.begin(); i != session_directories.end(); ++i)
+ {
+ std::vector<std::string> state_file_paths;
+
+ // now get available states for this session
+
+ get_state_files_in_directory (*i, state_file_paths);
+
+ vector<string*>* states;
+ vector<const gchar*> item;
+ string dirname = *i;
+
+ /* remove any trailing / */
+
+ if (dirname[dirname.length()-1] == '/') {
+ dirname = dirname.substr (0, dirname.length()-1);
+ }
+
+ /* check whether session still exists */
+ if (!Glib::file_test(dirname.c_str(), Glib::FILE_TEST_EXISTS)) {
+ /* session doesn't exist */
+ continue;
+ }
+
+ /* now get available states for this session */
+
+ if ((states = Session::possible_states (dirname)) == 0) {
+ /* no state file? */
+ continue;
+ }
+
+ std::vector<string> state_file_names(get_file_names_no_extension (state_file_paths));
+
+ if (state_file_names.empty()) {
+ continue;
+ }
+
+ Gtk::TreeModel::Row row = *(recent_session_model->append());
+
+ float sr;
+ SampleFormat sf;
+ std::string s = Glib::build_filename (dirname, state_file_names.front() + statefile_suffix);
+
+ row[recent_session_columns.visible_name] = Glib::path_get_basename (dirname);
+ row[recent_session_columns.fullpath] = dirname; /* just the dir, but this works too */
+ row[recent_session_columns.tip] = Glib::Markup::escape_text (dirname);
+
+ if (Session::get_info_from_path (s, sr, sf) == 0) {
+ row[recent_session_columns.sample_rate] = rate_as_string (sr);
+ switch (sf) {
+ case FormatFloat:
+ row[recent_session_columns.disk_format] = _("32 bit float");
+ break;
+ case FormatInt24:
+ row[recent_session_columns.disk_format] = _("24 bit");
+ break;
+ case FormatInt16:
+ row[recent_session_columns.disk_format] = _("16 bit");
+ break;
+ }
+ } else {
+ row[recent_session_columns.sample_rate] = "??";
+ row[recent_session_columns.disk_format] = "--";
+ }
+
+ ++session_snapshot_count;
+
+ if (state_file_names.size() > 1) {
+
+ // add the children
+
+ for (std::vector<std::string>::iterator i2 = state_file_names.begin(); i2 != state_file_names.end(); ++i2) {
+
+ Gtk::TreeModel::Row child_row = *(recent_session_model->append (row.children()));
+
+ child_row[recent_session_columns.visible_name] = *i2;
+ child_row[recent_session_columns.fullpath] = Glib::build_filename (dirname, *i2 + statefile_suffix);
+ child_row[recent_session_columns.tip] = Glib::Markup::escape_text (dirname);
+
+ if (Session::get_info_from_path (s, sr, sf) == 0) {
+ child_row[recent_session_columns.sample_rate] = rate_as_string (sr);
+ switch (sf) {
+ case FormatFloat:
+ child_row[recent_session_columns.disk_format] = _("32 bit float");
+ break;
+ case FormatInt24:
+ child_row[recent_session_columns.disk_format] = _("24 bit");
+ break;
+ case FormatInt16:
+ child_row[recent_session_columns.disk_format] = _("16 bit");
+ break;
+ }
+ } else {
+ child_row[recent_session_columns.sample_rate] = "??";
+ child_row[recent_session_columns.disk_format] = "--";
+ }
+
+
+ ++session_snapshot_count;
+ }
+ }
+ }
+
+ recent_session_display.set_tooltip_column(1); // recent_session_columns.tip
+ recent_session_display.set_model (recent_session_model);
+ return session_snapshot_count;
+}
+
+void
+SessionDialog::recent_session_row_selected ()
+{
+ if (recent_session_display.get_selection()->count_selected_rows() > 0) {
+ open_button->set_sensitive (true);
+ session_selected ();
+ } else {
+ open_button->set_sensitive (false);
+ }
+}
+
+void
+SessionDialog::setup_more_options_box ()
+{
+ more_options_vbox.set_border_width (24);
+
+ _output_limit_count.set_adjustment (_output_limit_count_adj);
+ _input_limit_count.set_adjustment (_input_limit_count_adj);
+ _master_bus_channel_count.set_adjustment (_master_bus_channel_count_adj);
+
+ chan_count_label_1.set_text (_("channels"));
+ chan_count_label_3.set_text (_("channels"));
+ chan_count_label_4.set_text (_("channels"));
+
+ chan_count_label_1.set_alignment(0,0.5);
+ chan_count_label_1.set_padding(0,0);
+ chan_count_label_1.set_line_wrap(false);
+
+ chan_count_label_3.set_alignment(0,0.5);
+ chan_count_label_3.set_padding(0,0);
+ chan_count_label_3.set_line_wrap(false);
+
+ chan_count_label_4.set_alignment(0,0.5);
+ chan_count_label_4.set_padding(0,0);
+ chan_count_label_4.set_line_wrap(false);
+
+ bus_label.set_markup (_("<b>Busses</b>"));
+ input_label.set_markup (_("<b>Inputs</b>"));
+ output_label.set_markup (_("<b>Outputs</b>"));
+
+ _master_bus_channel_count.set_flags(Gtk::CAN_FOCUS);
+ _master_bus_channel_count.set_update_policy(Gtk::UPDATE_ALWAYS);
+ _master_bus_channel_count.set_numeric(true);
+ _master_bus_channel_count.set_digits(0);
+ _master_bus_channel_count.set_wrap(false);
+
+ _create_master_bus.set_label (_("Create master bus"));
+ _create_master_bus.set_flags(Gtk::CAN_FOCUS);
+ _create_master_bus.set_relief(Gtk::RELIEF_NORMAL);
+ _create_master_bus.set_mode(true);
+ _create_master_bus.set_active(true);
+ _create_master_bus.set_border_width(0);
+
+ advanced_table.set_row_spacings(0);
+ advanced_table.set_col_spacings(0);
+
+ _connect_inputs.set_label (_("Automatically connect to physical inputs"));
+ _connect_inputs.set_flags(Gtk::CAN_FOCUS);
+ _connect_inputs.set_relief(Gtk::RELIEF_NORMAL);
+ _connect_inputs.set_mode(true);
+ _connect_inputs.set_active(Config->get_input_auto_connect() != ManualConnect);
+ _connect_inputs.set_border_width(0);
+
+ _limit_input_ports.set_label (_("Use only"));
+ _limit_input_ports.set_flags(Gtk::CAN_FOCUS);
+ _limit_input_ports.set_relief(Gtk::RELIEF_NORMAL);
+ _limit_input_ports.set_mode(true);
+ _limit_input_ports.set_sensitive(true);
+ _limit_input_ports.set_border_width(0);
+
+ _input_limit_count.set_flags(Gtk::CAN_FOCUS);
+ _input_limit_count.set_update_policy(Gtk::UPDATE_ALWAYS);
+ _input_limit_count.set_numeric(true);
+ _input_limit_count.set_digits(0);
+ _input_limit_count.set_wrap(false);
+ _input_limit_count.set_sensitive(false);
+
+ bus_hbox.pack_start (bus_table, Gtk::PACK_SHRINK, 18);
+
+ bus_label.set_alignment(0, 0.5);
+ bus_label.set_padding(0,0);
+ bus_label.set_line_wrap(false);
+ bus_label.set_selectable(false);
+ bus_label.set_use_markup(true);
+ bus_frame.set_shadow_type(Gtk::SHADOW_NONE);
+ bus_frame.set_label_align(0,0.5);
+ bus_frame.add(bus_hbox);
+ bus_frame.set_label_widget(bus_label);
+
+ bus_table.set_row_spacings (0);
+ bus_table.set_col_spacings (0);
+ bus_table.attach (_create_master_bus, 0, 1, 0, 1, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0);
+ bus_table.attach (_master_bus_channel_count, 1, 2, 0, 1, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0);
+ bus_table.attach (chan_count_label_1, 2, 3, 0, 1, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 6, 0);
+
+ input_port_limit_hbox.pack_start(_limit_input_ports, Gtk::PACK_SHRINK, 6);
+ input_port_limit_hbox.pack_start(_input_limit_count, Gtk::PACK_SHRINK, 0);
+ input_port_limit_hbox.pack_start(chan_count_label_3, Gtk::PACK_SHRINK, 6);
+ input_port_vbox.pack_start(_connect_inputs, Gtk::PACK_SHRINK, 0);
+ input_port_vbox.pack_start(input_port_limit_hbox, Gtk::PACK_EXPAND_PADDING, 0);
+ input_table.set_row_spacings(0);
+ input_table.set_col_spacings(0);
+ input_table.attach(input_port_vbox, 0, 1, 0, 1, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 6, 6);
+
+ input_hbox.pack_start (input_table, Gtk::PACK_SHRINK, 18);
+
+ input_label.set_alignment(0, 0.5);
+ input_label.set_padding(0,0);
+ input_label.set_line_wrap(false);
+ input_label.set_selectable(false);
+ input_label.set_use_markup(true);
+ input_frame.set_shadow_type(Gtk::SHADOW_NONE);
+ input_frame.set_label_align(0,0.5);
+ input_frame.add(input_hbox);
+ input_frame.set_label_widget(input_label);
+
+ _connect_outputs.set_label (_("Automatically connect outputs"));
+ _connect_outputs.set_flags(Gtk::CAN_FOCUS);
+ _connect_outputs.set_relief(Gtk::RELIEF_NORMAL);
+ _connect_outputs.set_mode(true);
+ _connect_outputs.set_active(Config->get_output_auto_connect() != ManualConnect);
+ _connect_outputs.set_border_width(0);
+ _limit_output_ports.set_label (_("Use only"));
+ _limit_output_ports.set_flags(Gtk::CAN_FOCUS);
+ _limit_output_ports.set_relief(Gtk::RELIEF_NORMAL);
+ _limit_output_ports.set_mode(true);
+ _limit_output_ports.set_sensitive(true);
+ _limit_output_ports.set_border_width(0);
+ _output_limit_count.set_flags(Gtk::CAN_FOCUS);
+ _output_limit_count.set_update_policy(Gtk::UPDATE_ALWAYS);
+ _output_limit_count.set_numeric(false);
+ _output_limit_count.set_digits(0);
+ _output_limit_count.set_wrap(false);
+ _output_limit_count.set_sensitive(false);
+ output_port_limit_hbox.pack_start(_limit_output_ports, Gtk::PACK_SHRINK, 6);
+ output_port_limit_hbox.pack_start(_output_limit_count, Gtk::PACK_SHRINK, 0);
+ output_port_limit_hbox.pack_start(chan_count_label_4, Gtk::PACK_SHRINK, 6);
+
+ _connect_outputs_to_master.set_label (_("... to master bus"));
+ _connect_outputs_to_master.set_flags(Gtk::CAN_FOCUS);
+ _connect_outputs_to_master.set_relief(Gtk::RELIEF_NORMAL);
+ _connect_outputs_to_master.set_mode(true);
+ _connect_outputs_to_master.set_active(Config->get_output_auto_connect() == AutoConnectMaster);
+ _connect_outputs_to_master.set_border_width(0);
+
+ _connect_outputs_to_master.set_group (connect_outputs_group);
+ _connect_outputs_to_physical.set_group (connect_outputs_group);
+
+ _connect_outputs_to_physical.set_label (_("... to physical outputs"));
+ _connect_outputs_to_physical.set_flags(Gtk::CAN_FOCUS);
+ _connect_outputs_to_physical.set_relief(Gtk::RELIEF_NORMAL);
+ _connect_outputs_to_physical.set_mode(true);
+ _connect_outputs_to_physical.set_active(Config->get_output_auto_connect() == AutoConnectPhysical);
+ _connect_outputs_to_physical.set_border_width(0);
+
+ output_conn_vbox.pack_start(_connect_outputs, Gtk::PACK_SHRINK, 0);
+ output_conn_vbox.pack_start(_connect_outputs_to_master, Gtk::PACK_SHRINK, 0);
+ output_conn_vbox.pack_start(_connect_outputs_to_physical, Gtk::PACK_SHRINK, 0);
+ output_vbox.set_border_width(6);
+
+ output_port_vbox.pack_start(output_port_limit_hbox, Gtk::PACK_SHRINK, 0);
+
+ output_vbox.pack_start(output_conn_vbox);
+ output_vbox.pack_start(output_port_vbox);
+
+ output_label.set_alignment(0, 0.5);
+ output_label.set_padding(0,0);
+ output_label.set_line_wrap(false);
+ output_label.set_selectable(false);
+ output_label.set_use_markup(true);
+ output_frame.set_shadow_type(Gtk::SHADOW_NONE);
+ output_frame.set_label_align(0,0.5);
+
+ output_hbox.pack_start (output_vbox, Gtk::PACK_SHRINK, 18);
+
+ output_frame.add(output_hbox);
+ output_frame.set_label_widget(output_label);
+
+ more_options_vbox.pack_start(advanced_table, Gtk::PACK_SHRINK, 0);
+ more_options_vbox.pack_start(bus_frame, Gtk::PACK_SHRINK, 6);
+ more_options_vbox.pack_start(input_frame, Gtk::PACK_SHRINK, 6);
+ more_options_vbox.pack_start(output_frame, Gtk::PACK_SHRINK, 0);
+
+ /* signals */
+
+ _connect_inputs.signal_clicked().connect (sigc::mem_fun (*this, &SessionDialog::connect_inputs_clicked));
+ _connect_outputs.signal_clicked().connect (sigc::mem_fun (*this, &SessionDialog::connect_outputs_clicked));
+ _limit_input_ports.signal_clicked().connect (sigc::mem_fun (*this, &SessionDialog::limit_inputs_clicked));
+ _limit_output_ports.signal_clicked().connect (sigc::mem_fun (*this, &SessionDialog::limit_outputs_clicked));
+ _create_master_bus.signal_clicked().connect (sigc::mem_fun (*this, &SessionDialog::master_bus_button_clicked));
+
+ /* note that more_options_vbox is "visible" by default even
+ * though it may not be displayed to the user, this is so the dialog
+ * doesn't resize.
+ */
+ more_options_vbox.show_all ();
+}
+
+bool
+SessionDialog::create_master_bus() const
+{
+ return _create_master_bus.get_active();
+}
+
+int
+SessionDialog::master_channel_count() const
+{
+ return _master_bus_channel_count.get_value_as_int();
+}
+
+bool
+SessionDialog::connect_inputs() const
+{
+ return _connect_inputs.get_active();
+}
+
+bool
+SessionDialog::limit_inputs_used_for_connection() const
+{
+ return _limit_input_ports.get_active();
+}
+
+int
+SessionDialog::input_limit_count() const
+{
+ return _input_limit_count.get_value_as_int();
+}
+
+bool
+SessionDialog::connect_outputs() const
+{
+ return _connect_outputs.get_active();
+}
+
+bool
+SessionDialog::limit_outputs_used_for_connection() const
+{
+ return _limit_output_ports.get_active();
+}
+
+int
+SessionDialog::output_limit_count() const
+{
+ return _output_limit_count.get_value_as_int();
+}
+
+bool
+SessionDialog::connect_outs_to_master() const
+{
+ return _connect_outputs_to_master.get_active();
+}
+
+bool
+SessionDialog::connect_outs_to_physical() const
+{
+ return _connect_outputs_to_physical.get_active();
+}
+
+void
+SessionDialog::connect_inputs_clicked ()
+{
+ _limit_input_ports.set_sensitive(_connect_inputs.get_active());
+
+ if (_connect_inputs.get_active() && _limit_input_ports.get_active()) {
+ _input_limit_count.set_sensitive(true);
+ } else {
+ _input_limit_count.set_sensitive(false);
+ }
+}
+
+void
+SessionDialog::connect_outputs_clicked ()
+{
+ bool const co = _connect_outputs.get_active ();
+ _limit_output_ports.set_sensitive(co);
+ _connect_outputs_to_master.set_sensitive(co);
+ _connect_outputs_to_physical.set_sensitive(co);
+
+ if (co && _limit_output_ports.get_active()) {
+ _output_limit_count.set_sensitive(true);
+ } else {
+ _output_limit_count.set_sensitive(false);
+ }
+}
+
+void
+SessionDialog::limit_inputs_clicked ()
+{
+ _input_limit_count.set_sensitive(_limit_input_ports.get_active());
+}
+
+void
+SessionDialog::limit_outputs_clicked ()
+{
+ _output_limit_count.set_sensitive(_limit_output_ports.get_active());
+}
+
+void
+SessionDialog::master_bus_button_clicked ()
+{
+ bool const yn = _create_master_bus.get_active();
+
+ _master_bus_channel_count.set_sensitive(yn);
+ _connect_outputs_to_master.set_sensitive(yn);
+}
+
+void
+SessionDialog::recent_row_activated (const Gtk::TreePath&, Gtk::TreeViewColumn*)
+{
+ response (RESPONSE_ACCEPT);
+}
+
+void
+SessionDialog::existing_session_selected ()
+{
+ _existing_session_chooser_used = true;
+ /* mark this sensitive in case we come back here after a failed open
+ * attempt and the user has hacked up the fix. sigh.
+ */
+ open_button->set_sensitive (true);
+ response (RESPONSE_ACCEPT);
+}
+
+void
+SessionDialog::updates_button_clicked ()
+{
+ //now open a browser window so user can see more
+ PBD::open_uri (Config->get_updates_url());
+}
+
+bool
+SessionDialog::info_scroller_update()
+{
+ info_scroller_count++;
+
+ char buf[512];
+ snprintf (buf, std::min(info_scroller_count,sizeof(buf)-1), "%s", ARDOUR_UI::instance()->announce_string().c_str() );
+ buf[info_scroller_count] = 0;
+ info_scroller_label.set_text (buf);
+ info_scroller_label.show();
+
+ if (info_scroller_count > ARDOUR_UI::instance()->announce_string().length()) {
+ info_scroller_connection.disconnect();
+ }
+
+ return true;
+}
+
+bool
+SessionDialog::on_delete_event (GdkEventAny* ev)
+{
+ response (RESPONSE_CANCEL);
+ return ArdourDialog::on_delete_event (ev);
+}
+
diff --git a/gtk2_ardour/session_dialog.h b/gtk2_ardour/session_dialog.h
new file mode 100644
index 0000000000..2178cfbe73
--- /dev/null
+++ b/gtk2_ardour/session_dialog.h
@@ -0,0 +1,240 @@
+/*
+ Copyright (C) 2010 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.
+
+*/
+
+#ifndef __gtk2_ardour_session_dialog_h__
+#define __gtk2_ardour_session_dialog_h__
+
+#include <string>
+
+#include <gdkmm/pixbuf.h>
+#include <gtkmm/label.h>
+#include <gtkmm/drawingarea.h>
+#include <gtkmm/expander.h>
+#include <gtkmm/box.h>
+#include <gtkmm/radiobutton.h>
+#include <gtkmm/filechooserbutton.h>
+#include <gtkmm/scrolledwindow.h>
+#include <gtkmm/treeview.h>
+#include <gtkmm/treestore.h>
+#include <gtkmm/checkbutton.h>
+#include <gtkmm/table.h>
+#include <gtkmm/frame.h>
+#include <gtkmm/spinbutton.h>
+#include <gtkmm/liststore.h>
+#include <gtkmm/combobox.h>
+
+#include "ardour/utils.h"
+
+#include "ardour_dialog.h"
+
+class EngineControl;
+
+class SessionDialog : public ArdourDialog {
+ public:
+ SessionDialog (bool require_new, const std::string& session_name, const std::string& session_path,
+ const std::string& template_name, bool cancel_not_quit);
+ ~SessionDialog ();
+
+ void clear_given ();
+
+ std::string session_name (bool& should_be_new);
+ std::string session_folder ();
+
+ bool use_session_template();
+ std::string session_template_name();
+
+ // advanced session options
+
+ bool create_master_bus() const;
+ int master_channel_count() const;
+
+ bool connect_inputs() const;
+ bool limit_inputs_used_for_connection() const;
+ int input_limit_count() const;
+
+ bool connect_outputs() const;
+ bool limit_outputs_used_for_connection() const;
+ int output_limit_count() const;
+
+ bool connect_outs_to_master() const;
+ bool connect_outs_to_physical() const;
+
+ private:
+ bool new_only;
+ std::string _provided_session_name;
+ std::string _provided_session_path;
+
+ bool on_delete_event (GdkEventAny*);
+
+ Gtk::Button* cancel_button;
+ Gtk::Button* open_button;
+ Gtk::Button* back_button;
+ Gtk::Button* quit_button;
+
+ bool back_button_pressed (GdkEventButton*);
+
+ Gtk::Frame info_frame;
+
+ /* initial choice page */
+
+ void setup_initial_choice_box ();
+ Gtk::VBox ic_vbox;
+ Gtk::Button ic_new_session_button;
+ void new_session_button_clicked ();
+
+ /* recent sessions */
+
+ void setup_existing_session_page ();
+
+ struct RecentSessionsSorter {
+ bool operator() (std::pair<std::string,std::string> a, std::pair<std::string,std::string> b) const {
+ return cmp_nocase(a.first, b.first) == -1;
+ }
+ };
+
+ struct RecentSessionModelColumns : public Gtk::TreeModel::ColumnRecord {
+ RecentSessionModelColumns() {
+ add (visible_name);
+ add (tip);
+ add (fullpath);
+ add (sample_rate);
+ add (disk_format);
+ }
+ Gtk::TreeModelColumn<std::string> visible_name;
+ Gtk::TreeModelColumn<std::string> tip;
+ Gtk::TreeModelColumn<std::string> fullpath;
+ Gtk::TreeModelColumn<std::string> sample_rate;
+ Gtk::TreeModelColumn<std::string> disk_format;
+ };
+
+ RecentSessionModelColumns recent_session_columns;
+ Gtk::TreeView recent_session_display;
+ Glib::RefPtr<Gtk::TreeStore> recent_session_model;
+ Gtk::ScrolledWindow recent_scroller;
+ Gtk::Label recent_label;
+ Gtk::FileChooserButton existing_session_chooser;
+ int redisplay_recent_sessions ();
+ void recent_session_row_selected ();
+ void recent_row_activated (const Gtk::TreePath& path, Gtk::TreeViewColumn* col);
+
+ void existing_session_selected ();
+ void session_selected ();
+
+ /* new sessions */
+
+ void setup_new_session_page ();
+ Gtk::Entry new_name_entry;
+ Gtk::FileChooserButton new_folder_chooser;
+
+ struct SessionTemplateColumns : public Gtk::TreeModel::ColumnRecord {
+ SessionTemplateColumns () {
+ add (name);
+ add (path);
+ }
+
+ Gtk::TreeModelColumn<std::string> name;
+ Gtk::TreeModelColumn<std::string> path;
+ };
+
+ SessionTemplateColumns session_template_columns;
+ Glib::RefPtr<Gtk::ListStore> template_model;
+ Gtk::ComboBox template_chooser;
+
+ Gtk::VBox session_new_vbox;
+ Gtk::VBox session_existing_vbox;
+ Gtk::Expander more_new_session_options_button;
+ Gtk::CheckButton use_template_button;
+ std::string load_template_override;
+
+ void more_new_session_options_button_clicked();
+ void new_name_changed ();
+ void new_name_activated ();
+ void populate_session_templates ();
+
+ /* more options for new sessions */
+
+ Gtk::VBox more_options_vbox;
+
+ Gtk::Label chan_count_label_1;
+ Gtk::Label chan_count_label_3;
+ Gtk::Label chan_count_label_4;
+ Gtk::Table advanced_table;
+ Gtk::HBox input_port_limit_hbox;
+ Gtk::VBox input_port_vbox;
+ Gtk::Table input_table;
+ Gtk::HBox input_hbox;
+
+ Gtk::Label bus_label;
+ Gtk::Frame bus_frame;
+ Gtk::Table bus_table;
+ Gtk::HBox bus_hbox;
+
+ Gtk::Label input_label;
+ Gtk::Frame input_frame;
+ Gtk::HBox output_port_limit_hbox;
+ Gtk::VBox output_port_vbox;
+ Gtk::VBox output_conn_vbox;
+ Gtk::VBox output_vbox;
+ Gtk::HBox output_hbox;
+
+ Gtk::Label output_label;
+ Gtk::Frame output_frame;
+ Gtk::VBox advanced_vbox;
+ Gtk::Label advanced_label;
+
+ Gtk::CheckButton _create_master_bus;
+ Gtk::SpinButton _master_bus_channel_count;
+
+ Gtk::CheckButton _connect_inputs;
+ Gtk::CheckButton _limit_input_ports;
+ Gtk::SpinButton _input_limit_count;
+
+ Gtk::CheckButton _connect_outputs;
+ Gtk::CheckButton _limit_output_ports;
+ Gtk::SpinButton _output_limit_count;
+
+ Gtk::RadioButtonGroup connect_outputs_group;
+ Gtk::RadioButton _connect_outputs_to_master;
+ Gtk::RadioButton _connect_outputs_to_physical;
+
+ Gtk::Adjustment _output_limit_count_adj;
+ Gtk::Adjustment _input_limit_count_adj;
+ Gtk::Adjustment _master_bus_channel_count_adj;
+
+ void connect_inputs_clicked ();
+ void connect_outputs_clicked ();
+ void limit_inputs_clicked ();
+ void limit_outputs_clicked ();
+ void master_bus_button_clicked ();
+ void setup_more_options_box ();
+
+ /* always there */
+
+ Glib::RefPtr<Pango::Layout> layout;
+
+ bool _existing_session_chooser_used; ///< set to true when the existing session chooser has been used
+
+ Gtk::Label info_scroller_label;
+ std::string::size_type info_scroller_count;
+ bool info_scroller_update();
+ sigc::connection info_scroller_connection;
+ void updates_button_clicked ();
+};
+
+#endif /* __gtk2_ardour_session_dialog_h__ */
diff --git a/gtk2_ardour/session_option_editor.cc b/gtk2_ardour/session_option_editor.cc
index 1815db1056..60f575fb16 100644
--- a/gtk2_ardour/session_option_editor.cc
+++ b/gtk2_ardour/session_option_editor.cc
@@ -334,7 +334,7 @@ SessionOptionEditor::parameter_changed (std::string const & p)
{
OptionEditor::parameter_changed (p);
if (p == "external-sync") {
- if (Config->get_sync_source() == JACK) {
+ if (Config->get_sync_source() == Engine) {
_vpu->set_sensitive(!_session_config->get_external_sync());
} else {
_vpu->set_sensitive(true);
diff --git a/gtk2_ardour/sfdb_ui.cc b/gtk2_ardour/sfdb_ui.cc
index 2640af8379..98df970e39 100644
--- a/gtk2_ardour/sfdb_ui.cc
+++ b/gtk2_ardour/sfdb_ui.cc
@@ -26,8 +26,8 @@
#include <sstream>
#include <unistd.h>
+#include <limits.h>
#include <sys/stat.h>
-#include <sys/param.h>
#include <gtkmm/box.h>
#include <gtkmm/stock.h>
@@ -1473,7 +1473,7 @@ SoundFileOmega::check_link_status (const Session* s, const vector<string>& paths
for (vector<string>::const_iterator i = paths.begin(); i != paths.end(); ++i) {
- char tmpc[MAXPATHLEN+1];
+ char tmpc[PATH_MAX+1];
snprintf (tmpc, sizeof(tmpc), "%s/%s", tmpdir.c_str(), Glib::path_get_basename (*i).c_str());
diff --git a/gtk2_ardour/small-splash.png b/gtk2_ardour/small-splash.png
new file mode 100644
index 0000000000..045062036c
--- /dev/null
+++ b/gtk2_ardour/small-splash.png
Binary files differ
diff --git a/gtk2_ardour/startup.cc b/gtk2_ardour/startup.cc
index 266a7e2a27..7bb9b2e295 100644
--- a/gtk2_ardour/startup.cc
+++ b/gtk2_ardour/startup.cc
@@ -65,104 +65,55 @@ static string poor_mans_glob (string path)
return copy;
}
-ArdourStartup::ArdourStartup (bool require_new, const std::string& session_name, const std::string& session_path, const std::string& template_name)
+ArdourStartup::ArdourStartup ()
: _response (RESPONSE_OK)
, config_modified (false)
- , new_only (require_new)
, default_dir_chooser (0)
- , ic_new_session_button (_("Create a new session"))
- , ic_existing_session_button (_("Open an existing session"))
, monitor_via_hardware_button (string_compose (_("Use an external mixer or the hardware mixer of your audio interface.\n"
"%1 will play NO role in monitoring"), PROGRAM_NAME))
, monitor_via_ardour_button (string_compose (_("Ask %1 to play back material as it is being recorded"), PROGRAM_NAME))
- , new_folder_chooser (FILE_CHOOSER_ACTION_SELECT_FOLDER)
- , more_new_session_options_button (_("I'd like more options for this session"))
- , _output_limit_count_adj (1, 0, 100, 1, 10, 0)
- , _input_limit_count_adj (1, 0, 100, 1, 10, 0)
- , _master_bus_channel_count_adj (2, 0, 100, 1, 10, 0)
, audio_page_index (-1)
, new_user_page_index (-1)
, default_folder_page_index (-1)
, monitoring_page_index (-1)
- , session_page_index (-1)
- , initial_choice_index (-1)
, final_page_index (-1)
- , session_options_page_index (-1)
- , _existing_session_chooser_used (false)
{
- new_user = !Glib::file_test (been_here_before_path(), Glib::FILE_TEST_EXISTS);
- need_session_info = (session_name.empty() || require_new);
-
- _provided_session_name = session_name;
- _provided_session_path = session_path;
+ set_keep_above (true);
+ set_position (WIN_POS_CENTER);
+ set_border_width (12);
+
+ if ((icon_pixbuf = ::get_icon ("ardour_icon_48px")) == 0) {
+ throw failed_constructor();
+ }
+
+ list<Glib::RefPtr<Gdk::Pixbuf> > window_icons;
+ Glib::RefPtr<Gdk::Pixbuf> icon;
+
+ if ((icon = ::get_icon ("ardour_icon_16px")) != 0) {
+ window_icons.push_back (icon);
+ }
+ if ((icon = ::get_icon ("ardour_icon_22px")) != 0) {
+ window_icons.push_back (icon);
+ }
+ if ((icon = ::get_icon ("ardour_icon_32px")) != 0) {
+ window_icons.push_back (icon);
+ }
+ if ((icon = ::get_icon ("ardour_icon_48px")) != 0) {
+ window_icons.push_back (icon);
+ }
+ if (!window_icons.empty ()) {
+ set_default_icon_list (window_icons);
+ }
- if (need_session_info || new_user) {
-
- use_template_button.set_group (session_template_group);
- use_session_as_template_button.set_group (session_template_group);
-
- set_keep_above (true);
- set_position (WIN_POS_CENTER);
- set_border_width (12);
-
- if ((icon_pixbuf = ::get_icon ("ardour_icon_48px")) == 0) {
- throw failed_constructor();
- }
-
- list<Glib::RefPtr<Gdk::Pixbuf> > window_icons;
- Glib::RefPtr<Gdk::Pixbuf> icon;
-
- if ((icon = ::get_icon ("ardour_icon_16px")) != 0) {
- window_icons.push_back (icon);
- }
- if ((icon = ::get_icon ("ardour_icon_22px")) != 0) {
- window_icons.push_back (icon);
- }
- if ((icon = ::get_icon ("ardour_icon_32px")) != 0) {
- window_icons.push_back (icon);
- }
- if ((icon = ::get_icon ("ardour_icon_48px")) != 0) {
- window_icons.push_back (icon);
- }
- if (!window_icons.empty ()) {
- set_default_icon_list (window_icons);
- }
-
#ifdef __APPLE__
- setup_prerelease_page ();
+ setup_prerelease_page ();
#endif
- if (new_user) {
-
- setup_new_user_page ();
- setup_first_time_config_page ();
- setup_monitoring_choice_page ();
- setup_monitor_section_choice_page ();
-
- ic_new_session_button.set_active (true); // always create new session on first run
-
- } else {
-
- setup_initial_choice_page ();
- }
-
- setup_session_page ();
- setup_more_options_page ();
-
- if (new_user) {
- setup_final_page ();
- }
-
- if (new_only) {
- ic_vbox.hide ();
- } else {
- ic_vbox.show ();
- }
-
- if (!template_name.empty()) {
- use_template_button.set_active (false);
- load_template_override = template_name;
- }
- }
+
+ setup_new_user_page ();
+ setup_first_time_config_page ();
+ setup_monitoring_choice_page ();
+ setup_monitor_section_choice_page ();
+ setup_final_page ();
the_startup = this;
}
@@ -172,9 +123,16 @@ ArdourStartup::~ArdourStartup ()
}
bool
-ArdourStartup::ready_without_display () const
+ArdourStartup::required ()
+{
+ return !Glib::file_test (been_here_before_path(), Glib::FILE_TEST_EXISTS);
+}
+
+std::string
+ArdourStartup::been_here_before_path ()
{
- return !new_user && !need_session_info;
+ // XXXX use more specific version so we can catch upgrades
+ return Glib::build_filename (user_config_directory (), ".a3");
}
void
@@ -210,97 +168,6 @@ Full information on all the above can be found on the support page at\n\
set_page_complete (*vbox, true);
}
-bool
-ArdourStartup::use_session_template ()
-{
- if (!load_template_override.empty()) {
- return true;
- }
-
- if (use_template_button.get_active()) {
- return template_chooser.get_active_row_number() > 0;
- } else {
- return !session_template_chooser.get_filename().empty();
- }
-}
-
-std::string
-ArdourStartup::session_template_name ()
-{
- if (!load_template_override.empty()) {
- string the_path (ARDOUR::user_template_directory());
- return Glib::build_filename (the_path, load_template_override + ARDOUR::template_suffix);
- }
-
- if (ic_existing_session_button.get_active()) {
- return string();
- }
-
- if (use_template_button.get_active()) {
- TreeModel::iterator iter = template_chooser.get_active ();
- TreeModel::Row row = (*iter);
- string s = row[session_template_columns.path];
- return s;
- } else {
- return session_template_chooser.get_filename();
-
- }
-}
-
-std::string
-ArdourStartup::session_name (bool& should_be_new)
-{
- if (ready_without_display()) {
- return _provided_session_name;
- }
-
- if (ic_new_session_button.get_active()) {
- should_be_new = true;
- string val = new_name_entry.get_text ();
- strip_whitespace_edges (val);
- return val;
- } else if (_existing_session_chooser_used) {
- /* existing session chosen from file chooser */
- should_be_new = false;
- return existing_session_chooser.get_filename ();
- } else {
- /* existing session chosen from recent list */
- should_be_new = false;
-
- TreeIter iter = recent_session_display.get_selection()->get_selected();
-
- if (iter) {
- return (*iter)[recent_session_columns.visible_name];
- }
-
- return "";
- }
-}
-
-std::string
-ArdourStartup::session_folder ()
-{
- if (ready_without_display()) {
- return _provided_session_path;
- }
-
- if (ic_new_session_button.get_active()) {
- std::string legal_session_folder_name = legalize_for_path (new_name_entry.get_text());
- return Glib::build_filename (new_folder_chooser.get_current_folder(), legal_session_folder_name);
- } else if (_existing_session_chooser_used) {
- /* existing session chosen from file chooser */
- return existing_session_chooser.get_current_folder ();
- } else {
- /* existing session chosen from recent list */
- TreeIter iter = recent_session_display.get_selection()->get_selected();
-
- if (iter) {
- return (*iter)[recent_session_columns.fullpath];
- }
- return "";
- }
-}
-
void
ArdourStartup::setup_new_user_page ()
{
@@ -506,107 +373,11 @@ greater control in monitoring without affecting the mix."));
}
void
-ArdourStartup::setup_initial_choice_page ()
-{
- ic_vbox.set_spacing (6);
- ic_vbox.set_border_width (24);
-
- RadioButton::Group g (ic_new_session_button.get_group());
- ic_existing_session_button.set_group (g);
-
- HBox* centering_hbox = manage (new HBox);
- VBox* centering_vbox = manage (new VBox);
-
- centering_vbox->set_spacing (6);
-
- centering_vbox->pack_start (ic_new_session_button, false, true);
- centering_vbox->pack_start (ic_existing_session_button, false, true);
-
- if (ARDOUR_UI::instance()->announce_string() != "" ) {
-
- Gtk::Frame *info_frame = manage(new Gtk::Frame);
- info_frame->set_shadow_type(SHADOW_ETCHED_OUT);
- centering_vbox->pack_start (*info_frame, false, false, 20);
-
- Box *info_box = manage (new VBox);
- info_box->set_border_width (12);
- info_box->set_spacing (6);
- info_box->set_name("mixbus_info_box");
-
- info_box->pack_start (info_scroller_label, false, false);
-
- info_frame->add (*info_box);
- info_frame->show_all();
-
- info_scroller_count = 0;
- info_scroller_connection = Glib::signal_timeout().connect (mem_fun(*this, &ArdourStartup::info_scroller_update), 50);
-
- Gtk::Button *updates_button = manage (new Gtk::Button (_("Check the website for more...")));
-
- updates_button->signal_clicked().connect (mem_fun(*this, &ArdourStartup::updates_button_clicked) );
- ARDOUR_UI::instance()->tooltips().set_tip (*updates_button, _("Click to open the program website in your web browser"));
-
- info_box->pack_start (*updates_button, false, false);
- }
-
- ic_new_session_button.signal_button_press_event().connect(sigc::mem_fun(*this, &ArdourStartup::initial_button_clicked), false);
- ic_new_session_button.signal_activate().connect(sigc::mem_fun(*this, &ArdourStartup::initial_button_activated), false);
-
- ic_existing_session_button.signal_button_press_event().connect(sigc::mem_fun(*this, &ArdourStartup::initial_button_clicked), false);
- ic_existing_session_button.signal_activate().connect(sigc::mem_fun(*this, &ArdourStartup::initial_button_activated), false);
-
- centering_hbox->pack_start (*centering_vbox, true, true);
-
- ic_vbox.pack_start (*centering_hbox, true, true);
-
- ic_vbox.show_all ();
-
- initial_choice_index = append_page (ic_vbox);
- set_page_title (ic_vbox, string_compose("%1 %2", PROGRAM_NAME, VERSIONSTRING));
- set_page_header_image (ic_vbox, icon_pixbuf);
-
- /* user could just click on "Forward" if default
- * choice is correct.
- */
-
- set_page_complete (ic_vbox, true);
-}
-
-bool
-ArdourStartup::initial_button_clicked (GdkEventButton* ev)
-{
- if (ev->type == GDK_2BUTTON_PRESS && session_page_index != -1) {
- set_current_page(session_page_index);
- }
-
- return false;
-}
-
-void
-ArdourStartup::initial_button_activated ()
-{
- if (session_page_index != -1) {
- set_current_page(session_page_index);
- }
-}
-
-void
-ArdourStartup::setup_session_page ()
-{
- session_vbox.set_border_width (24);
-
- session_vbox.pack_start (session_hbox, true, true);
- session_vbox.show_all ();
-
- session_page_index = append_page (session_vbox);
- /* initial setting */
- set_page_type (session_vbox, ASSISTANT_PAGE_CONFIRM);
-}
-
-void
ArdourStartup::setup_final_page ()
{
- final_page.set_text (string_compose (_("%1 is ready for use"), PROGRAM_NAME));
+ string msg = string_compose (_("%1 is ready for use"), PROGRAM_NAME);
+
+ final_page.set_markup (string_compose ("<span weight=\"bold\" size=\"large\">%1</span>", msg));
final_page.show ();
final_page_index = append_page (final_page);
set_page_complete (final_page, true);
@@ -662,782 +433,12 @@ ArdourStartup::on_apply ()
gtk_main_quit ();
}
-void
-ArdourStartup::on_prepare (Gtk::Widget* page)
-{
- if (page == &session_vbox) {
-
- if (ic_new_session_button.get_active()) {
- /* new session requested */
- setup_new_session_page ();
- } else {
- /* existing session requested */
- setup_existing_session_page ();
-
- }
-
- /* HACK HACK HACK ... change the "Apply" button label
- to say "Open"
- */
-
- Gtk::Widget* tl = session_vbox.get_toplevel();
- Gtk::Window* win;
- if ((win = dynamic_cast<Gtk::Window*>(tl)) != 0) {
- /* ::get_default_widget() is not wrapped in gtkmm */
- Gtk::Widget* def = wrap (gtk_window_get_default_widget (win->gobj()));
- Gtk::Button* button;
- if ((button = dynamic_cast<Gtk::Button*>(def)) != 0) {
- if (more_new_session_options_button.get_active()) {
- button->set_label (_("Forward"));
- }else{
- button->set_label (_("Open"));
- }
- }
- }
- }
-}
-
-void
-ArdourStartup::populate_session_templates ()
-{
- vector<TemplateInfo> templates;
-
- find_session_templates (templates);
-
- template_model->clear ();
-
- for (vector<TemplateInfo>::iterator x = templates.begin(); x != templates.end(); ++x) {
- TreeModel::Row row;
-
- row = *(template_model->append ());
-
- row[session_template_columns.name] = (*x).name;
- row[session_template_columns.path] = (*x).path;
- }
-}
-
-void
-ArdourStartup::setup_new_session_page ()
-{
- if (!session_hbox.get_children().empty()) {
- session_hbox.remove (**session_hbox.get_children().begin());
- }
-
- session_new_vbox.set_spacing (18);
-
- if (session_new_vbox.get_children().empty()) {
- VBox *vbox1 = manage (new VBox);
- HBox* hbox1 = manage (new HBox);
- Label* label1 = manage (new Label);
-
- vbox1->set_spacing (6);
-
- hbox1->set_spacing (6);
- hbox1->pack_start (*label1, false, false);
- hbox1->pack_start (new_name_entry, true, true);
-
- label1->set_text (_("Session name:"));
-
-
- if (!ARDOUR_COMMAND_LINE::session_name.empty()) {
- new_name_entry.set_text (Glib::path_get_basename (ARDOUR_COMMAND_LINE::session_name));
- /* name provided - they can move right along */
- set_page_complete (session_vbox, true);
- }
-
- new_name_entry.signal_changed().connect (sigc::mem_fun (*this, &ArdourStartup::new_name_changed));
- new_name_entry.signal_activate().connect (sigc::mem_fun (*this, &ArdourStartup::move_along_now));
-
- vbox1->pack_start (*hbox1, true, true);
-
- /* --- */
-
- HBox* hbox2 = manage (new HBox);
- Label* label2 = manage (new Label);
-
- hbox2->set_spacing (6);
- hbox2->pack_start (*label2, false, false);
- hbox2->pack_start (new_folder_chooser, true, true);
-
- label2->set_text (_("Create session folder in:"));
-
- if (!ARDOUR_COMMAND_LINE::session_name.empty()) {
- new_folder_chooser.set_current_folder (poor_mans_glob (Glib::path_get_dirname (ARDOUR_COMMAND_LINE::session_name)));
- } else if (ARDOUR_UI::instance()->session_loaded) {
- // point the new session file chooser at the parent directory of the current session
- string session_parent_dir = Glib::path_get_dirname(ARDOUR_UI::instance()->the_session()->path());
- string::size_type last_dir_sep = session_parent_dir.rfind(G_DIR_SEPARATOR);
- session_parent_dir = session_parent_dir.substr(0, last_dir_sep);
- new_folder_chooser.set_current_folder (session_parent_dir);
- string default_session_folder = poor_mans_glob (Config->get_default_session_parent_dir());
-
- try {
- /* add_shortcut_folder throws an exception if the folder being added already has a shortcut */
- new_folder_chooser.add_shortcut_folder (default_session_folder);
- }
- catch (Glib::Error & e) {
- std::cerr << "new_folder_chooser.add_shortcut_folder (" << default_session_folder << ") threw Glib::Error " << e.what() << std::endl;
- }
- } else {
- new_folder_chooser.set_current_folder (poor_mans_glob (Config->get_default_session_parent_dir()));
- }
- new_folder_chooser.show ();
- new_folder_chooser.set_title (_("Select folder for session"));
-
-#ifdef __APPLE__
- new_folder_chooser.add_shortcut_folder ("/Volumes");
-#endif
-
- vbox1->pack_start (*hbox2, false, false);
-
- session_new_vbox.pack_start (*vbox1, false, false);
-
- /* --- */
-
- VBox *vbox2 = manage (new VBox);
- HBox* hbox3 = manage (new HBox);
- Label* label3 = manage (new Label);
- template_model = ListStore::create (session_template_columns);
- populate_session_templates ();
-
- vbox2->set_spacing (6);
-
- label3->set_markup (_("<b>Options</b>"));
- label3->set_alignment (0.0, 0.0);
-
- vbox2->pack_start (*label3, false, true);
-
- VBox *vbox3 = manage (new VBox);
-
- vbox3->set_spacing (6);
-
- if (!template_model->children().empty()) {
-
- HBox* hbox4a = manage (new HBox);
- use_template_button.set_label (_("Use this template"));
-
- TreeModel::Row row = *template_model->prepend ();
- row[session_template_columns.name] = (_("no template"));
- row[session_template_columns.path] = string();
-
- hbox4a->set_spacing (6);
- hbox4a->pack_start (use_template_button, false, false);
- hbox4a->pack_start (template_chooser, true, true);
-
- template_chooser.set_model (template_model);
-
- Gtk::CellRendererText* text_renderer = Gtk::manage (new Gtk::CellRendererText);
- text_renderer->property_editable() = false;
-
- template_chooser.pack_start (*text_renderer);
- template_chooser.add_attribute (text_renderer->property_text(), session_template_columns.name);
- template_chooser.set_active (0);
-
- use_template_button.show();
- template_chooser.show ();
-
- vbox3->pack_start (*hbox4a, false, false);
- }
-
- /* --- */
-
- if (!new_user) {
- session_template_chooser.set_current_folder (poor_mans_glob (Config->get_default_session_parent_dir()));
-
- HBox* hbox4b = manage (new HBox);
- use_session_as_template_button.set_label (_("Use an existing session as a template:"));
-
- hbox4b->set_spacing (6);
- hbox4b->pack_start (use_session_as_template_button, false, false);
- hbox4b->pack_start (session_template_chooser, true, true);
-
- use_session_as_template_button.show ();
- session_template_chooser.show ();
-
- Gtk::FileFilter* session_filter = manage (new (Gtk::FileFilter));
- session_filter->add_pattern (X_("*.ardour"));
- session_template_chooser.set_filter (*session_filter);
- session_template_chooser.set_title (_("Select template"));
-
- vbox3->pack_start (*hbox4b, false, false);
- }
-
- /* --- */
-
- HBox* hbox5 = manage (new HBox);
-
- hbox5->set_spacing (6);
- hbox5->pack_start (more_new_session_options_button, false, false);
-
- more_new_session_options_button.show ();
- more_new_session_options_button.signal_clicked().connect (sigc::mem_fun (*this, &ArdourStartup::more_new_session_options_button_clicked));
-
- vbox3->pack_start (*hbox5, false, false);
- hbox3->pack_start (*vbox3, true, true, 8);
- vbox2->pack_start (*hbox3, false, false);
-
- /* --- */
-
- session_new_vbox.pack_start (*vbox2, false, false);
- }
-
- session_new_vbox.show_all ();
- session_hbox.pack_start (session_new_vbox, true, true);
- set_page_title (session_vbox, _("New Session"));
- set_page_type (session_vbox, ASSISTANT_PAGE_CONFIRM);
-
- if (more_new_session_options_button.get_active()) {
- set_page_type (session_vbox, ASSISTANT_PAGE_CONTENT);
- }
- session_hbox.show_all();
-}
-
-void
-ArdourStartup::new_name_changed ()
-{
- if (!new_name_entry.get_text().empty()) {
- set_page_complete (session_vbox, true);
- } else {
- set_page_complete (session_vbox, false);
- }
-}
-
-int
-ArdourStartup::redisplay_recent_sessions ()
-{
- std::vector<std::string> session_directories;
- RecentSessionsSorter cmp;
-
- recent_session_display.set_model (Glib::RefPtr<TreeModel>(0));
- recent_session_model->clear ();
-
- ARDOUR::RecentSessions rs;
- ARDOUR::read_recent_sessions (rs);
-
- if (rs.empty()) {
- recent_session_display.set_model (recent_session_model);
- return 0;
- }
- //
- // sort them alphabetically
- sort (rs.begin(), rs.end(), cmp);
-
- for (ARDOUR::RecentSessions::iterator i = rs.begin(); i != rs.end(); ++i) {
- session_directories.push_back ((*i).second);
- }
-
- int session_snapshot_count = 0;
-
- for (vector<std::string>::const_iterator i = session_directories.begin(); i != session_directories.end(); ++i)
- {
- std::vector<std::string> state_file_paths;
-
- // now get available states for this session
-
- get_state_files_in_directory (*i, state_file_paths);
-
- vector<string*>* states;
- vector<const gchar*> item;
- string fullpath = *i;
-
- /* remove any trailing / */
-
- if (fullpath[fullpath.length()-1] == '/') {
- fullpath = fullpath.substr (0, fullpath.length()-1);
- }
-
- /* check whether session still exists */
- if (!Glib::file_test(fullpath.c_str(), Glib::FILE_TEST_EXISTS)) {
- /* session doesn't exist */
- continue;
- }
-
- /* now get available states for this session */
-
- if ((states = Session::possible_states (fullpath)) == 0) {
- /* no state file? */
- continue;
- }
-
- std::vector<string> state_file_names(get_file_names_no_extension (state_file_paths));
-
- Gtk::TreeModel::Row row = *(recent_session_model->append());
-
- row[recent_session_columns.visible_name] = Glib::path_get_basename (fullpath);
- row[recent_session_columns.fullpath] = fullpath;
- row[recent_session_columns.tip] = Glib::Markup::escape_text (fullpath);
-
- ++session_snapshot_count;
-
- if (state_file_names.size() > 1) {
-
- // add the children
-
- for (std::vector<std::string>::iterator i2 = state_file_names.begin();
- i2 != state_file_names.end(); ++i2) {
-
- Gtk::TreeModel::Row child_row = *(recent_session_model->append (row.children()));
-
- child_row[recent_session_columns.visible_name] = *i2;
- child_row[recent_session_columns.fullpath] = fullpath;
- child_row[recent_session_columns.tip] = Glib::Markup::escape_text (fullpath);
- ++session_snapshot_count;
- }
- }
- }
-
- recent_session_display.set_tooltip_column(1); // recent_session_columns.tip
- recent_session_display.set_model (recent_session_model);
- return session_snapshot_count;
- // return rs.size();
-}
-
-void
-ArdourStartup::recent_session_row_selected ()
-{
- if (recent_session_display.get_selection()->count_selected_rows() > 0) {
- set_page_complete (session_vbox, true);
- } else {
- set_page_complete (session_vbox, false);
- }
-}
-
-void
-ArdourStartup::setup_existing_session_page ()
-{
- recent_session_model = TreeStore::create (recent_session_columns);
- redisplay_recent_sessions ();
-
- if (!session_hbox.get_children().empty()) {
- session_hbox.remove (**session_hbox.get_children().begin());
- }
-
- if (session_existing_vbox.get_children().empty()) {
-
- recent_session_display.set_model (recent_session_model);
- recent_session_display.append_column (_("Recent Sessions"), recent_session_columns.visible_name);
- recent_session_display.set_headers_visible (false);
- recent_session_display.get_selection()->set_mode (SELECTION_BROWSE);
-
- recent_session_display.get_selection()->signal_changed().connect (sigc::mem_fun (*this, &ArdourStartup::recent_session_row_selected));
-
- recent_scroller.add (recent_session_display);
- recent_scroller.set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);
- recent_scroller.set_shadow_type (Gtk::SHADOW_IN);
-
- recent_session_display.show();
-
- recent_scroller.show();
- int cnt = redisplay_recent_sessions ();
- recent_session_display.signal_row_activated().connect (sigc::mem_fun (*this, &ArdourStartup::recent_row_activated));
-
- if (cnt > 4) {
- recent_scroller.set_size_request (-1, 300);
- }
-
- session_existing_vbox.set_spacing (8);
- session_existing_vbox.pack_start (recent_scroller, true, true);
-
- existing_session_chooser.set_title (_("Select session file"));
- existing_session_chooser.signal_file_set().connect (sigc::mem_fun (*this, &ArdourStartup::existing_session_selected));
- existing_session_chooser.set_current_folder(poor_mans_glob (Config->get_default_session_parent_dir()));
-
- FileFilter session_filter;
- session_filter.add_pattern ("*.ardour");
- session_filter.set_name (string_compose (_("%1 sessions"), PROGRAM_NAME));
- existing_session_chooser.add_filter (session_filter);
- existing_session_chooser.set_filter (session_filter);
-
-#ifdef GTKOSX
- existing_session_chooser.add_shortcut_folder ("/Volumes");
-#endif
-
- HBox* hbox = manage (new HBox);
- hbox->set_spacing (4);
- hbox->pack_start (*manage (new Label (_("Browse:"))), PACK_SHRINK);
- hbox->pack_start (existing_session_chooser);
- session_existing_vbox.pack_start (*hbox, false, false);
- hbox->show_all ();
- }
-
- session_existing_vbox.show_all ();
- session_hbox.pack_start (session_existing_vbox, true, true);
-
- set_page_title (session_vbox, _("Select a session"));
- set_page_type (session_vbox, ASSISTANT_PAGE_CONFIRM);
- session_hbox.show_all();
-}
-
-void
-ArdourStartup::more_new_session_options_button_clicked ()
-{
- if (more_new_session_options_button.get_active()) {
- more_options_vbox.show_all ();
- set_page_type (more_options_vbox, ASSISTANT_PAGE_CONFIRM);
- set_page_type (session_vbox, ASSISTANT_PAGE_CONTENT);
- } else {
- set_page_type (session_vbox, ASSISTANT_PAGE_CONFIRM);
- more_options_vbox.hide ();
- }
-}
-
-void
-ArdourStartup::setup_more_options_page ()
-{
- more_options_vbox.set_border_width (24);
-
- _output_limit_count.set_adjustment (_output_limit_count_adj);
- _input_limit_count.set_adjustment (_input_limit_count_adj);
- _master_bus_channel_count.set_adjustment (_master_bus_channel_count_adj);
-
- chan_count_label_1.set_text (_("channels"));
- chan_count_label_3.set_text (_("channels"));
- chan_count_label_4.set_text (_("channels"));
-
- chan_count_label_1.set_alignment(0,0.5);
- chan_count_label_1.set_padding(0,0);
- chan_count_label_1.set_line_wrap(false);
-
- chan_count_label_3.set_alignment(0,0.5);
- chan_count_label_3.set_padding(0,0);
- chan_count_label_3.set_line_wrap(false);
-
- chan_count_label_4.set_alignment(0,0.5);
- chan_count_label_4.set_padding(0,0);
- chan_count_label_4.set_line_wrap(false);
-
- bus_label.set_markup (_("<b>Busses</b>"));
- input_label.set_markup (_("<b>Inputs</b>"));
- output_label.set_markup (_("<b>Outputs</b>"));
-
- _master_bus_channel_count.set_flags(Gtk::CAN_FOCUS);
- _master_bus_channel_count.set_update_policy(Gtk::UPDATE_ALWAYS);
- _master_bus_channel_count.set_numeric(true);
- _master_bus_channel_count.set_digits(0);
- _master_bus_channel_count.set_wrap(false);
-
- _create_master_bus.set_label (_("Create master bus"));
- _create_master_bus.set_flags(Gtk::CAN_FOCUS);
- _create_master_bus.set_relief(Gtk::RELIEF_NORMAL);
- _create_master_bus.set_mode(true);
- _create_master_bus.set_active(true);
- _create_master_bus.set_border_width(0);
-
- advanced_table.set_row_spacings(0);
- advanced_table.set_col_spacings(0);
-
- _connect_inputs.set_label (_("Automatically connect to physical inputs"));
- _connect_inputs.set_flags(Gtk::CAN_FOCUS);
- _connect_inputs.set_relief(Gtk::RELIEF_NORMAL);
- _connect_inputs.set_mode(true);
- _connect_inputs.set_active(Config->get_input_auto_connect() != ManualConnect);
- _connect_inputs.set_border_width(0);
-
- _limit_input_ports.set_label (_("Use only"));
- _limit_input_ports.set_flags(Gtk::CAN_FOCUS);
- _limit_input_ports.set_relief(Gtk::RELIEF_NORMAL);
- _limit_input_ports.set_mode(true);
- _limit_input_ports.set_sensitive(true);
- _limit_input_ports.set_border_width(0);
-
- _input_limit_count.set_flags(Gtk::CAN_FOCUS);
- _input_limit_count.set_update_policy(Gtk::UPDATE_ALWAYS);
- _input_limit_count.set_numeric(true);
- _input_limit_count.set_digits(0);
- _input_limit_count.set_wrap(false);
- _input_limit_count.set_sensitive(false);
-
- bus_hbox.pack_start (bus_table, Gtk::PACK_SHRINK, 18);
-
- bus_label.set_alignment(0, 0.5);
- bus_label.set_padding(0,0);
- bus_label.set_line_wrap(false);
- bus_label.set_selectable(false);
- bus_label.set_use_markup(true);
- bus_frame.set_shadow_type(Gtk::SHADOW_NONE);
- bus_frame.set_label_align(0,0.5);
- bus_frame.add(bus_hbox);
- bus_frame.set_label_widget(bus_label);
-
- bus_table.set_row_spacings (0);
- bus_table.set_col_spacings (0);
- bus_table.attach (_create_master_bus, 0, 1, 0, 1, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0);
- bus_table.attach (_master_bus_channel_count, 1, 2, 0, 1, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0);
- bus_table.attach (chan_count_label_1, 2, 3, 0, 1, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 6, 0);
-
- input_port_limit_hbox.pack_start(_limit_input_ports, Gtk::PACK_SHRINK, 6);
- input_port_limit_hbox.pack_start(_input_limit_count, Gtk::PACK_SHRINK, 0);
- input_port_limit_hbox.pack_start(chan_count_label_3, Gtk::PACK_SHRINK, 6);
- input_port_vbox.pack_start(_connect_inputs, Gtk::PACK_SHRINK, 0);
- input_port_vbox.pack_start(input_port_limit_hbox, Gtk::PACK_EXPAND_PADDING, 0);
- input_table.set_row_spacings(0);
- input_table.set_col_spacings(0);
- input_table.attach(input_port_vbox, 0, 1, 0, 1, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 6, 6);
-
- input_hbox.pack_start (input_table, Gtk::PACK_SHRINK, 18);
-
- input_label.set_alignment(0, 0.5);
- input_label.set_padding(0,0);
- input_label.set_line_wrap(false);
- input_label.set_selectable(false);
- input_label.set_use_markup(true);
- input_frame.set_shadow_type(Gtk::SHADOW_NONE);
- input_frame.set_label_align(0,0.5);
- input_frame.add(input_hbox);
- input_frame.set_label_widget(input_label);
-
- _connect_outputs.set_label (_("Automatically connect outputs"));
- _connect_outputs.set_flags(Gtk::CAN_FOCUS);
- _connect_outputs.set_relief(Gtk::RELIEF_NORMAL);
- _connect_outputs.set_mode(true);
- _connect_outputs.set_active(Config->get_output_auto_connect() != ManualConnect);
- _connect_outputs.set_border_width(0);
- _limit_output_ports.set_label (_("Use only"));
- _limit_output_ports.set_flags(Gtk::CAN_FOCUS);
- _limit_output_ports.set_relief(Gtk::RELIEF_NORMAL);
- _limit_output_ports.set_mode(true);
- _limit_output_ports.set_sensitive(true);
- _limit_output_ports.set_border_width(0);
- _output_limit_count.set_flags(Gtk::CAN_FOCUS);
- _output_limit_count.set_update_policy(Gtk::UPDATE_ALWAYS);
- _output_limit_count.set_numeric(false);
- _output_limit_count.set_digits(0);
- _output_limit_count.set_wrap(false);
- _output_limit_count.set_sensitive(false);
- output_port_limit_hbox.pack_start(_limit_output_ports, Gtk::PACK_SHRINK, 6);
- output_port_limit_hbox.pack_start(_output_limit_count, Gtk::PACK_SHRINK, 0);
- output_port_limit_hbox.pack_start(chan_count_label_4, Gtk::PACK_SHRINK, 6);
-
- _connect_outputs_to_master.set_label (_("... to master bus"));
- _connect_outputs_to_master.set_flags(Gtk::CAN_FOCUS);
- _connect_outputs_to_master.set_relief(Gtk::RELIEF_NORMAL);
- _connect_outputs_to_master.set_mode(true);
- _connect_outputs_to_master.set_active(Config->get_output_auto_connect() == AutoConnectMaster);
- _connect_outputs_to_master.set_border_width(0);
-
- _connect_outputs_to_master.set_group (connect_outputs_group);
- _connect_outputs_to_physical.set_group (connect_outputs_group);
-
- _connect_outputs_to_physical.set_label (_("... to physical outputs"));
- _connect_outputs_to_physical.set_flags(Gtk::CAN_FOCUS);
- _connect_outputs_to_physical.set_relief(Gtk::RELIEF_NORMAL);
- _connect_outputs_to_physical.set_mode(true);
- _connect_outputs_to_physical.set_active(Config->get_output_auto_connect() == AutoConnectPhysical);
- _connect_outputs_to_physical.set_border_width(0);
-
- output_conn_vbox.pack_start(_connect_outputs, Gtk::PACK_SHRINK, 0);
- output_conn_vbox.pack_start(_connect_outputs_to_master, Gtk::PACK_SHRINK, 0);
- output_conn_vbox.pack_start(_connect_outputs_to_physical, Gtk::PACK_SHRINK, 0);
- output_vbox.set_border_width(6);
-
- output_port_vbox.pack_start(output_port_limit_hbox, Gtk::PACK_SHRINK, 0);
-
- output_vbox.pack_start(output_conn_vbox);
- output_vbox.pack_start(output_port_vbox);
-
- output_label.set_alignment(0, 0.5);
- output_label.set_padding(0,0);
- output_label.set_line_wrap(false);
- output_label.set_selectable(false);
- output_label.set_use_markup(true);
- output_frame.set_shadow_type(Gtk::SHADOW_NONE);
- output_frame.set_label_align(0,0.5);
-
- output_hbox.pack_start (output_vbox, Gtk::PACK_SHRINK, 18);
-
- output_frame.add(output_hbox);
- output_frame.set_label_widget(output_label);
-
- more_options_vbox.pack_start(advanced_table, Gtk::PACK_SHRINK, 0);
- more_options_vbox.pack_start(bus_frame, Gtk::PACK_SHRINK, 6);
- more_options_vbox.pack_start(input_frame, Gtk::PACK_SHRINK, 6);
- more_options_vbox.pack_start(output_frame, Gtk::PACK_SHRINK, 0);
-
- /* signals */
-
- _connect_inputs.signal_clicked().connect (sigc::mem_fun (*this, &ArdourStartup::connect_inputs_clicked));
- _connect_outputs.signal_clicked().connect (sigc::mem_fun (*this, &ArdourStartup::connect_outputs_clicked));
- _limit_input_ports.signal_clicked().connect (sigc::mem_fun (*this, &ArdourStartup::limit_inputs_clicked));
- _limit_output_ports.signal_clicked().connect (sigc::mem_fun (*this, &ArdourStartup::limit_outputs_clicked));
- _create_master_bus.signal_clicked().connect (sigc::mem_fun (*this, &ArdourStartup::master_bus_button_clicked));
-
- /* note that more_options_vbox is "visible" by default even
- * though it may not be displayed to the user, this is so the dialog
- * doesn't resize.
- */
- more_options_vbox.show_all ();
-
- session_options_page_index = append_page (more_options_vbox);
- set_page_title (more_options_vbox, _("Advanced Session Options"));
- set_page_complete (more_options_vbox, true);
-}
-
-bool
-ArdourStartup::create_master_bus() const
-{
- return _create_master_bus.get_active();
-}
-
-int
-ArdourStartup::master_channel_count() const
-{
- return _master_bus_channel_count.get_value_as_int();
-}
-
-bool
-ArdourStartup::connect_inputs() const
-{
- return _connect_inputs.get_active();
-}
-
-bool
-ArdourStartup::limit_inputs_used_for_connection() const
-{
- return _limit_input_ports.get_active();
-}
-
-int
-ArdourStartup::input_limit_count() const
-{
- return _input_limit_count.get_value_as_int();
-}
-
-bool
-ArdourStartup::connect_outputs() const
-{
- return _connect_outputs.get_active();
-}
-
-bool
-ArdourStartup::limit_outputs_used_for_connection() const
-{
- return _limit_output_ports.get_active();
-}
-
-int
-ArdourStartup::output_limit_count() const
-{
- return _output_limit_count.get_value_as_int();
-}
-
-bool
-ArdourStartup::connect_outs_to_master() const
-{
- return _connect_outputs_to_master.get_active();
-}
-
-bool
-ArdourStartup::connect_outs_to_physical() const
-{
- return _connect_outputs_to_physical.get_active();
-}
-
-void
-ArdourStartup::connect_inputs_clicked ()
-{
- _limit_input_ports.set_sensitive(_connect_inputs.get_active());
-
- if (_connect_inputs.get_active() && _limit_input_ports.get_active()) {
- _input_limit_count.set_sensitive(true);
- } else {
- _input_limit_count.set_sensitive(false);
- }
-}
-
-void
-ArdourStartup::connect_outputs_clicked ()
-{
- bool const co = _connect_outputs.get_active ();
- _limit_output_ports.set_sensitive(co);
- _connect_outputs_to_master.set_sensitive(co);
- _connect_outputs_to_physical.set_sensitive(co);
-
- if (co && _limit_output_ports.get_active()) {
- _output_limit_count.set_sensitive(true);
- } else {
- _output_limit_count.set_sensitive(false);
- }
-}
-
-void
-ArdourStartup::limit_inputs_clicked ()
-{
- _input_limit_count.set_sensitive(_limit_input_ports.get_active());
-}
-
-void
-ArdourStartup::limit_outputs_clicked ()
-{
- _output_limit_count.set_sensitive(_limit_output_ports.get_active());
-}
-
-void
-ArdourStartup::master_bus_button_clicked ()
-{
- bool const yn = _create_master_bus.get_active();
-
- _master_bus_channel_count.set_sensitive(yn);
- _connect_outputs_to_master.set_sensitive(yn);
-}
void
ArdourStartup::move_along_now ()
{
- gint cur = get_current_page ();
-
- if (cur == session_page_index) {
- if (more_new_session_options_button.get_active()) {
- set_current_page (session_options_page_index);
- } else {
- on_apply ();
- }
- }
+ on_apply ();
}
-void
-ArdourStartup::recent_row_activated (const Gtk::TreePath&, Gtk::TreeViewColumn*)
-{
- set_page_complete (session_vbox, true);
- move_along_now ();
-}
-void
-ArdourStartup::existing_session_selected ()
-{
- _existing_session_chooser_used = true;
-
- set_page_complete (session_vbox, true);
- move_along_now ();
-}
-
-std::string
-ArdourStartup::been_here_before_path () const
-{
- // XXXX use more specific version so we can catch upgrades
- return Glib::build_filename (user_config_directory (), ".a3");
-}
-
-void
-ArdourStartup::updates_button_clicked ()
-{
- //now open a browser window so user can see more
- PBD::open_uri (Config->get_updates_url());
-}
-
-bool
-ArdourStartup::info_scroller_update()
-{
- info_scroller_count++;
-
- char buf[512];
- snprintf (buf, std::min(info_scroller_count,sizeof(buf)-1), "%s", ARDOUR_UI::instance()->announce_string().c_str() );
- buf[info_scroller_count] = 0;
- info_scroller_label.set_text (buf);
- info_scroller_label.show();
-
- if (info_scroller_count > ARDOUR_UI::instance()->announce_string().length()) {
- info_scroller_connection.disconnect();
- }
-
- return true;
-}
+
diff --git a/gtk2_ardour/startup.h b/gtk2_ardour/startup.h
index 4dcc3a9fb2..c5a9a30162 100644
--- a/gtk2_ardour/startup.h
+++ b/gtk2_ardour/startup.h
@@ -26,6 +26,7 @@
#include <gtkmm/assistant.h>
#include <gtkmm/label.h>
#include <gtkmm/drawingarea.h>
+#include <gtkmm/expander.h>
#include <gtkmm/box.h>
#include <gtkmm/radiobutton.h>
#include <gtkmm/filechooserbutton.h>
@@ -45,32 +46,10 @@ class EngineControl;
class ArdourStartup : public Gtk::Assistant {
public:
- ArdourStartup (bool require_new, const std::string& session_name, const std::string& session_path, const std::string& template_name);
+ ArdourStartup ();
~ArdourStartup ();
- bool ready_without_display () const;
-
- std::string session_name (bool& should_be_new);
- std::string session_folder ();
-
- bool use_session_template();
- std::string session_template_name();
-
- // advanced session options
-
- bool create_master_bus() const;
- int master_channel_count() const;
-
- bool connect_inputs() const;
- bool limit_inputs_used_for_connection() const;
- int input_limit_count() const;
-
- bool connect_outputs() const;
- bool limit_outputs_used_for_connection() const;
- int output_limit_count() const;
-
- bool connect_outs_to_master() const;
- bool connect_outs_to_physical() const;
+ static bool required ();
gint response () const {
return _response;
@@ -80,17 +59,12 @@ class ArdourStartup : public Gtk::Assistant {
gint _response;
bool config_modified;
bool new_user;
- bool need_session_info;
- bool new_only;
- std::string _provided_session_name;
- std::string _provided_session_path;
- std::string been_here_before_path () const;
+ static std::string been_here_before_path ();
void on_apply ();
void on_cancel ();
bool on_delete_event (GdkEventAny*);
- void on_prepare (Gtk::Widget*);
static ArdourStartup *the_startup;
@@ -108,15 +82,7 @@ class ArdourStartup : public Gtk::Assistant {
Gtk::FileChooserButton* default_dir_chooser;
void default_dir_changed();
void setup_first_page ();
-
- /* initial choice page */
-
- void setup_initial_choice_page ();
- Gtk::VBox ic_vbox;
- Gtk::RadioButton ic_new_session_button;
- Gtk::RadioButton ic_existing_session_button;
- bool initial_button_clicked(GdkEventButton*);
- void initial_button_activated();
+ Gtk::FileChooserButton new_folder_chooser;
/* monitoring choices */
@@ -134,134 +100,6 @@ class ArdourStartup : public Gtk::Assistant {
Gtk::RadioButton no_monitor_section_button;
void setup_monitor_section_choice_page ();
- /* session page (could be new or existing) */
-
- void setup_session_page ();
- Gtk::VBox session_vbox;
- Gtk::HBox session_hbox;
-
- /* recent sessions */
-
- void setup_existing_session_page ();
-
- struct RecentSessionsSorter {
- bool operator() (std::pair<std::string,std::string> a, std::pair<std::string,std::string> b) const {
- return cmp_nocase(a.first, b.first) == -1;
- }
- };
-
- struct RecentSessionModelColumns : public Gtk::TreeModel::ColumnRecord {
- RecentSessionModelColumns() {
- add (visible_name);
- add (tip);
- add (fullpath);
- }
- Gtk::TreeModelColumn<std::string> visible_name;
- Gtk::TreeModelColumn<std::string> tip;
- Gtk::TreeModelColumn<std::string> fullpath;
- };
-
- RecentSessionModelColumns recent_session_columns;
- Gtk::TreeView recent_session_display;
- Glib::RefPtr<Gtk::TreeStore> recent_session_model;
- Gtk::ScrolledWindow recent_scroller;
- Gtk::FileChooserButton existing_session_chooser;
- int redisplay_recent_sessions ();
- void recent_session_row_selected ();
- void recent_row_activated (const Gtk::TreePath& path, Gtk::TreeViewColumn* col);
-
- void existing_session_selected ();
-
- /* new sessions */
-
- void setup_new_session_page ();
- Gtk::Entry new_name_entry;
- Gtk::FileChooserButton new_folder_chooser;
- Gtk::FileChooserButton session_template_chooser;
-
- struct SessionTemplateColumns : public Gtk::TreeModel::ColumnRecord {
- SessionTemplateColumns () {
- add (name);
- add (path);
- }
-
- Gtk::TreeModelColumn<std::string> name;
- Gtk::TreeModelColumn<std::string> path;
- };
-
- SessionTemplateColumns session_template_columns;
- Glib::RefPtr<Gtk::ListStore> template_model;
- Gtk::ComboBox template_chooser;
-
- Gtk::VBox session_new_vbox;
- Gtk::VBox session_existing_vbox;
- Gtk::CheckButton more_new_session_options_button;
- Gtk::RadioButtonGroup session_template_group;
- Gtk::RadioButton use_session_as_template_button;
- Gtk::RadioButton use_template_button;
- std::string load_template_override;
-
- void more_new_session_options_button_clicked();
- void new_name_changed ();
- void populate_session_templates ();
-
- /* more options for new sessions */
-
- Gtk::VBox more_options_vbox;
-
- Gtk::Label chan_count_label_1;
- Gtk::Label chan_count_label_3;
- Gtk::Label chan_count_label_4;
- Gtk::Table advanced_table;
- Gtk::HBox input_port_limit_hbox;
- Gtk::VBox input_port_vbox;
- Gtk::Table input_table;
- Gtk::HBox input_hbox;
-
- Gtk::Label bus_label;
- Gtk::Frame bus_frame;
- Gtk::Table bus_table;
- Gtk::HBox bus_hbox;
-
- Gtk::Label input_label;
- Gtk::Frame input_frame;
- Gtk::HBox output_port_limit_hbox;
- Gtk::VBox output_port_vbox;
- Gtk::VBox output_conn_vbox;
- Gtk::VBox output_vbox;
- Gtk::HBox output_hbox;
-
- Gtk::Label output_label;
- Gtk::Frame output_frame;
- Gtk::VBox advanced_vbox;
- Gtk::Label advanced_label;
-
- Gtk::CheckButton _create_master_bus;
- Gtk::SpinButton _master_bus_channel_count;
-
- Gtk::CheckButton _connect_inputs;
- Gtk::CheckButton _limit_input_ports;
- Gtk::SpinButton _input_limit_count;
-
- Gtk::CheckButton _connect_outputs;
- Gtk::CheckButton _limit_output_ports;
- Gtk::SpinButton _output_limit_count;
-
- Gtk::RadioButtonGroup connect_outputs_group;
- Gtk::RadioButton _connect_outputs_to_master;
- Gtk::RadioButton _connect_outputs_to_physical;
-
- Gtk::Adjustment _output_limit_count_adj;
- Gtk::Adjustment _input_limit_count_adj;
- Gtk::Adjustment _master_bus_channel_count_adj;
-
- void connect_inputs_clicked ();
- void connect_outputs_clicked ();
- void limit_inputs_clicked ();
- void limit_outputs_clicked ();
- void master_bus_button_clicked ();
- void setup_more_options_page ();
-
/* final page */
void setup_final_page ();
@@ -278,21 +116,12 @@ class ArdourStartup : public Gtk::Assistant {
gint default_folder_page_index;
gint monitoring_page_index;
gint monitor_section_page_index;
- gint session_page_index;
- gint initial_choice_index;
gint final_page_index;
- gint session_options_page_index;
void move_along_now ();
- bool _existing_session_chooser_used; ///< set to true when the existing session chooser has been used
void setup_prerelease_page ();
- Gtk::Label info_scroller_label;
- std::string::size_type info_scroller_count;
- bool info_scroller_update();
- sigc::connection info_scroller_connection;
- void updates_button_clicked ();
};
#endif /* __gtk2_ardour_startup_h__ */
diff --git a/gtk2_ardour/transcode_video_dialog.cc b/gtk2_ardour/transcode_video_dialog.cc
index 9f18e85b64..3963bb6cd3 100644
--- a/gtk2_ardour/transcode_video_dialog.cc
+++ b/gtk2_ardour/transcode_video_dialog.cc
@@ -28,7 +28,6 @@
#include <fcntl.h>
#include <sigc++/bind.h>
-#include <libgen.h>
#include <glib/gstdio.h>
diff --git a/gtk2_ardour/utils.cc b/gtk2_ardour/utils.cc
index bbce202ad1..1772c7a7c7 100644
--- a/gtk2_ardour/utils.cc
+++ b/gtk2_ardour/utils.cc
@@ -28,6 +28,7 @@
#include <clocale>
#include <cstring>
#include <cctype>
+#include <cmath>
#include <fstream>
#include <list>
#include <sys/stat.h>
@@ -401,7 +402,7 @@ emulate_key_event (Gtk::Widget* w, unsigned int keyval)
ev.state = 0;
ev.keyval = keyval;
ev.length = 0;
- ev.string = (const gchar*) "";
+ ev.string = const_cast<gchar*> ("");
ev.hardware_keycode = keymapkey[0].keycode;
ev.group = keymapkey[0].group;
g_free(keymapkey);
@@ -862,3 +863,15 @@ unique_random_color (list<Gdk::Color>& used_colors)
/* XXX need throttle here to make sure we don't spin for ever */
}
}
+
+string
+rate_as_string (float r)
+{
+ char buf[32];
+ if (fmod (r, 1000.0f)) {
+ snprintf (buf, sizeof (buf), "%.1f kHz", r/1000.0);
+ } else {
+ snprintf (buf, sizeof (buf), "%.0f kHz", r/1000.0);
+ }
+ return buf;
+}
diff --git a/gtk2_ardour/utils.h b/gtk2_ardour/utils.h
index 5d7bf000ea..a1a54898b5 100644
--- a/gtk2_ardour/utils.h
+++ b/gtk2_ardour/utils.h
@@ -86,4 +86,6 @@ std::string escape_angled_brackets (std::string const &);
Gdk::Color unique_random_color (std::list<Gdk::Color> &);
+std::string rate_as_string (float r);
+
#endif /* __ardour_gtk_utils_h__ */
diff --git a/gtk2_ardour/video_monitor.cc b/gtk2_ardour/video_monitor.cc
index ae4d5faacc..6b06f91744 100644
--- a/gtk2_ardour/video_monitor.cc
+++ b/gtk2_ardour/video_monitor.cc
@@ -554,7 +554,7 @@ VideoMonitor::xjadeo_sync_setup ()
bool my_manual_seek = true;
if (_session->config.get_external_sync()) {
- if (ARDOUR::Config->get_sync_source() == ARDOUR::JACK)
+ if (ARDOUR::Config->get_sync_source() == ARDOUR::Engine)
my_manual_seek = false;
}
diff --git a/gtk2_ardour/window_manager.cc b/gtk2_ardour/window_manager.cc
index 3ab9e1adff..4a44dc4691 100644
--- a/gtk2_ardour/window_manager.cc
+++ b/gtk2_ardour/window_manager.cc
@@ -194,6 +194,7 @@ ProxyBase::ProxyBase (const string& name, const std::string& menu_name, const XM
ProxyBase::~ProxyBase ()
{
delete vistracker;
+ delete _window;
}
void
diff --git a/gtk2_ardour/wscript b/gtk2_ardour/wscript
index a02e27f83d..79631e584e 100644
--- a/gtk2_ardour/wscript
+++ b/gtk2_ardour/wscript
@@ -203,6 +203,7 @@ gtk2_ardour_sources = [
'search_path_option.cc',
'selection.cc',
'send_ui.cc',
+ 'session_dialog.cc',
'session_import_dialog.cc',
'session_metadata_dialog.cc',
'session_option_editor.cc',
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_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',
diff --git a/libs/backends/jack/jack_api.cc b/libs/backends/jack/jack_api.cc
index 836acfda11..c8859a1fc9 100644
--- a/libs/backends/jack/jack_api.cc
+++ b/libs/backends/jack/jack_api.cc
@@ -63,7 +63,7 @@ deinstantiate ()
static bool
already_configured ()
{
- return JackConnection::server_running ();
+ return !JackConnection::in_control ();
}
static ARDOUR::AudioBackendInfo _descriptor = {
diff --git a/libs/backends/jack/jack_audiobackend.cc b/libs/backends/jack/jack_audiobackend.cc
index 1e7cb9d8d5..a9bbe4b35a 100644
--- a/libs/backends/jack/jack_audiobackend.cc
+++ b/libs/backends/jack/jack_audiobackend.cc
@@ -37,6 +37,7 @@
#include "jack_audiobackend.h"
#include "jack_connection.h"
#include "jack_utils.h"
+#include "jack_session.h"
#include "i18n.h"
@@ -45,6 +46,7 @@ using namespace PBD;
using std::string;
using std::vector;
+
#define GET_PRIVATE_JACK_POINTER(localvar) jack_client_t* localvar = _jack_connection->jack(); if (!(localvar)) { return; }
#define GET_PRIVATE_JACK_POINTER_RET(localvar,r) jack_client_t* localvar = _jack_connection->jack(); if (!(localvar)) { return r; }
@@ -63,6 +65,7 @@ JACKAudioBackend::JACKAudioBackend (AudioEngine& e, boost::shared_ptr<JackConnec
, _target_systemic_output_latency (0)
, _current_sample_rate (0)
, _current_buffer_size (0)
+ , _session (0)
{
_jack_connection->Connected.connect_same_thread (jack_connection_connection, boost::bind (&JACKAudioBackend::when_connected_to_jack, this));
_jack_connection->Disconnected.connect_same_thread (disconnect_connection, boost::bind (&JACKAudioBackend::disconnected, this, _1));
@@ -513,7 +516,10 @@ JACKAudioBackend::start ()
{
if (!available()) {
- if (!_jack_connection->server_running()) {
+ if (_jack_connection->in_control()) {
+ /* we will be starting JACK, so set up the
+ command that JACK will use when it (auto-)starts
+ */
setup_jack_startup_command ();
}
@@ -744,7 +750,8 @@ JACKAudioBackend::jack_timebase_callback (jack_transport_state_t state, pframes_
ARDOUR::Session* session = engine.session();
if (session) {
- session->jack_timebase_callback (state, nframes, pos, new_position);
+ JACKSession jsession (session);
+ jsession.timebase_callback (state, nframes, pos, new_position);
}
}
@@ -789,7 +796,6 @@ JACKAudioBackend::_xrun_callback (void *arg)
return 0;
}
-#ifdef HAVE_JACK_SESSION
void
JACKAudioBackend::_session_callback (jack_session_event_t *event, void *arg)
{
@@ -797,10 +803,10 @@ JACKAudioBackend::_session_callback (jack_session_event_t *event, void *arg)
ARDOUR::Session* session = jab->engine.session();
if (session) {
- session->jack_session_event (event);
+ JACKSession jsession (session);
+ jsession.session_event (event);
}
}
-#endif
void
JACKAudioBackend::_freewheel_callback (int onoff, void *arg)
@@ -822,25 +828,72 @@ JACKAudioBackend::_latency_callback (jack_latency_callback_mode_t mode, void* ar
}
int
-JACKAudioBackend::create_process_thread (boost::function<void()> f, pthread_t* thread, size_t stacksize)
+JACKAudioBackend::create_process_thread (boost::function<void()> f)
{
GET_PRIVATE_JACK_POINTER_RET (_priv_jack, -1);
- ThreadData* td = new ThreadData (this, f, stacksize);
- if (jack_client_create_thread (_priv_jack, thread, jack_client_real_time_priority (_priv_jack),
+ jack_native_thread_t thread_id;
+ ThreadData* td = new ThreadData (this, f, thread_stack_size());
+
+ if (jack_client_create_thread (_priv_jack, &thread_id, jack_client_real_time_priority (_priv_jack),
jack_is_realtime (_priv_jack), _start_process_thread, td)) {
return -1;
}
- return 0;
+ _jack_threads.push_back(thread_id);
+ return 0;
}
int
-JACKAudioBackend::wait_for_process_thread_exit (AudioBackendNativeThread thr)
+JACKAudioBackend::join_process_threads ()
+{
+ GET_PRIVATE_JACK_POINTER_RET (_priv_jack, -1);
+
+ int ret = 0;
+
+ for (std::vector<jack_native_thread_t>::const_iterator i = _jack_threads.begin ();
+ i != _jack_threads.end(); i++) {
+
+#if defined(USING_JACK2_EXPANSION_OF_JACK_API) || defined(PLATFORM_WINDOWS)
+ if (jack_client_stop_thread (_priv_jack, *i) != 0) {
+#else
+ void* status;
+ if (pthread_join (*i, &status) != 0) {
+#endif
+ error << "AudioEngine: cannot stop process thread" << endmsg;
+ ret += -1;
+ }
+ }
+
+ _jack_threads.clear();
+
+ return ret;
+}
+
+bool
+JACKAudioBackend::in_process_thread ()
{
- void* status;
- /* this doesn't actively try to stop the thread, it just waits till it exits */
- return pthread_join (thr, &status);
+ for (std::vector<jack_native_thread_t>::const_iterator i = _jack_threads.begin ();
+ i != _jack_threads.end(); i++) {
+
+#ifdef COMPILER_MINGW
+ if (*i == GetCurrentThread()) {
+ return true;
+ }
+#else // pthreads
+ if (pthread_equal (*i, pthread_self()) != 0) {
+ return true;
+ }
+#endif
+ }
+
+ return false;
+}
+
+uint32_t
+JACKAudioBackend::process_thread_count ()
+{
+ return _jack_threads.size();
}
void*
@@ -960,6 +1013,7 @@ JACKAudioBackend::disconnected (const char* why)
engine.halted_callback (why); /* EMIT SIGNAL */
}
}
+
float
JACKAudioBackend::cpu_load() const
{
diff --git a/libs/backends/jack/jack_audiobackend.h b/libs/backends/jack/jack_audiobackend.h
index 9ab545f3ee..cb24835d5b 100644
--- a/libs/backends/jack/jack_audiobackend.h
+++ b/libs/backends/jack/jack_audiobackend.h
@@ -30,15 +30,14 @@
#include <boost/shared_ptr.hpp>
#include <jack/jack.h>
-#ifdef HAVE_JACK_SESSION
#include <jack/session.h>
-#endif
#include "ardour/audio_backend.h"
namespace ARDOUR {
class JackConnection;
+class JACKSession;
class JACKAudioBackend : public AudioBackend {
public:
@@ -103,8 +102,10 @@ class JACKAudioBackend : public AudioBackend {
size_t raw_buffer_size (DataType t);
- 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 ();
void transport_start ();
void transport_stop ();
@@ -184,6 +185,8 @@ class JACKAudioBackend : public AudioBackend {
bool _freewheeling;
std::map<DataType,size_t> _raw_buffer_sizes;
+ std::vector<jack_native_thread_t> _jack_threads;
+
static int _xrun_callback (void *arg);
static void* _process_thread (void *arg);
static int _sample_rate_callback (pframes_t nframes, void *arg);
@@ -192,9 +195,7 @@ class JACKAudioBackend : public AudioBackend {
static int _jack_sync_callback (jack_transport_state_t, jack_position_t*, void *arg);
static void _freewheel_callback (int , void *arg);
static void _latency_callback (jack_latency_callback_mode_t, void*);
-#ifdef HAVE_JACK_SESSION
static void _session_callback (jack_session_event_t *event, void *arg);
-#endif
void jack_timebase_callback (jack_transport_state_t, pframes_t, jack_position_t*, int);
int jack_sync_callback (jack_transport_state_t, jack_position_t*);
@@ -257,6 +258,12 @@ class JACKAudioBackend : public AudioBackend {
void when_connected_to_jack ();
PBD::ScopedConnection jack_connection_connection;
+
+ /* Object to manage interactions with Session in a way that
+ keeps JACK out of libardour directly
+ */
+
+ JACKSession* _session;
};
} // namespace
diff --git a/libs/backends/jack/jack_connection.cc b/libs/backends/jack/jack_connection.cc
index d5d25c747f..b3d7fcecc4 100644
--- a/libs/backends/jack/jack_connection.cc
+++ b/libs/backends/jack/jack_connection.cc
@@ -36,6 +36,8 @@ using std::vector;
using std::cerr;
using std::endl;
+bool JackConnection::_in_control = false;
+
static void jack_halted_callback (void* arg)
{
JackConnection* jc = static_cast<JackConnection*> (arg);
@@ -54,17 +56,9 @@ JackConnection::JackConnection (const std::string& arg1, const std::string& arg2
, _client_name (arg1)
, session_uuid (arg2)
{
- _in_control = !server_running();
-}
-
-JackConnection::~JackConnection ()
-{
- close ();
-}
+ /* See if the server is already up
+ */
-bool
-JackConnection::server_running ()
-{
EnvironmentalProtectionAgency* global_epa = EnvironmentalProtectionAgency::get_global_epa ();
boost::scoped_ptr<EnvironmentalProtectionAgency> current_epa;
@@ -83,10 +77,15 @@ JackConnection::server_running ()
if (status == 0) {
jack_client_close (c);
- return true;
+ _in_control = false;
+ } else {
+ _in_control = true;
}
+}
- return false;
+JackConnection::~JackConnection ()
+{
+ close ();
}
int
@@ -106,19 +105,6 @@ JackConnection::open ()
global_epa->restore ();
}
- /* check to see if the server is already running so that we know if we
- * are starting it.
- */
-
- jack_client_t* c = jack_client_open ("ardourprobe", JackNoStartServer, &status);
-
- if (status == 0) {
- _in_control = false;
- jack_client_close (c);
- } else {
- _in_control = true;
- }
-
/* ensure that PATH or equivalent includes likely locations of the JACK
* server, in case the user's default does not.
*/
diff --git a/libs/backends/jack/jack_connection.h b/libs/backends/jack/jack_connection.h
index 229d9697d9..8d15be6e3a 100644
--- a/libs/backends/jack/jack_connection.h
+++ b/libs/backends/jack/jack_connection.h
@@ -27,15 +27,13 @@ class JackConnection {
void halted_callback ();
void halted_info_callback (jack_status_t, const char*);
- bool in_control() const { return _in_control; }
+ static bool in_control() { return _in_control; }
- static bool server_running();
-
private:
jack_client_t* volatile _jack;
std::string _client_name;
std::string session_uuid;
- bool _in_control;
+ static bool _in_control;
};
} // namespace
diff --git a/libs/ardour/session_jack.cc b/libs/backends/jack/jack_session.cc
index af8a93fec3..ca51dafccc 100644
--- a/libs/ardour/session_jack.cc
+++ b/libs/backends/jack/jack_session.cc
@@ -1,5 +1,5 @@
/*
- Copyright (C) 1999-2013 Paul Davis
+ Copyright (C) 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
@@ -18,16 +18,11 @@
*/
-#ifdef WAF_BUILD
-#include "libardour-config.h"
-#endif
-
#include <time.h>
#include <glibmm/miscutils.h>
-#include "jack/jack.h"
-#include "jack/session.h"
+#include <jack/jack.h>
#include "ardour/audioengine.h"
#include "ardour/filename_extensions.h"
@@ -35,12 +30,22 @@
#include "ardour/session_directory.h"
#include "ardour/tempo.h"
+#include "jack_session.h"
+
using namespace ARDOUR;
using std::string;
-#ifdef HAVE_JACK_SESSION
+JACKSession::JACKSession (Session* s)
+ : SessionHandlePtr (s)
+{
+}
+
+JACKSession::~JACKSession ()
+{
+}
+
void
-Session::jack_session_event (jack_session_event_t* event)
+JACKSession::session_event (jack_session_event_t* event)
{
char timebuf[128], *tmp;
time_t n;
@@ -54,7 +59,7 @@ Session::jack_session_event (jack_session_event_t* event)
if (event->type == JackSessionSaveTemplate)
{
- if (save_template( timebuf )) {
+ if (_session->save_template( timebuf )) {
event->flags = JackSessionSaveError;
} else {
string cmd ("ardour3 -P -U ");
@@ -67,10 +72,10 @@ Session::jack_session_event (jack_session_event_t* event)
}
else
{
- if (save_state (timebuf)) {
+ if (_session->save_state (timebuf)) {
event->flags = JackSessionSaveError;
} else {
- std::string xml_path (_session_dir->root_path());
+ std::string xml_path (_session->session_directory().root_path());
std::string legalized_filename = legalize_for_path (timebuf) + statefile_suffix;
xml_path = Glib::build_filename (xml_path, legalized_filename);
@@ -95,66 +100,69 @@ Session::jack_session_event (jack_session_event_t* event)
}
if (event->type == JackSessionSaveAndQuit) {
- Quit (); /* EMIT SIGNAL */
+ _session->Quit (); /* EMIT SIGNAL */
}
- jack_session_event_free( event );
+ jack_session_event_free (event);
}
-#endif
void
-Session::jack_timebase_callback (jack_transport_state_t /*state*/,
+JACKSession::timebase_callback (jack_transport_state_t /*state*/,
pframes_t /*nframes*/,
jack_position_t* pos,
int /*new_position*/)
{
Timecode::BBT_Time bbt;
+ TempoMap& tempo_map (_session->tempo_map());
+ framepos_t tf = _session->transport_frame ();
/* 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 */
- }
+ TempoMetric metric (tempo_map.metric_at (tf));
+
+ try {
+ tempo_map.bbt_time_rt (tf, 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->audio_frames_per_video_frame = _session->frame_rate() / _session->timecode_frames_per_second();
pos->valid = jack_position_bits_t (pos->valid | JackAudioVideoRatio);
#endif
-#if 0
+#ifdef HAVE_JACK_TIMCODE_SUPPORT
+ /* This is not yet defined in JACK */
+
/* 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;
+ pos->timecode_offset = _session->config.get_timecode_offset();
+ t.timecode_frame_rate = _session->timecode_frames_per_second();
+ pos->valid = jack_position_bits_t (pos->valid | JackPositionTimecode);
+#endif
+#ifdef HAVE_JACK_LOOPING_SUPPORT
+ /* This is not yet defined in JACK */
if (_transport_speed) {
if (play_loop) {
- Location* location = _locations.auto_loop_location();
+ Location* location = _session->locations()->auto_loop_location();
if (location) {
diff --git a/libs/backends/jack/jack_session.h b/libs/backends/jack/jack_session.h
new file mode 100644
index 0000000000..c912b5f170
--- /dev/null
+++ b/libs/backends/jack/jack_session.h
@@ -0,0 +1,47 @@
+/*
+ Copyright (C) 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.
+
+*/
+
+#ifndef __ardour_jack_audiobackend_jack_session_h__
+#define __ardour_jack_audiobackend_jack_session_h__
+
+#include <jack/session.h>
+#include <jack/transport.h>
+
+#include "ardour/types.h"
+#include "ardour/session_handle.h"
+
+namespace ARDOUR {
+ class Session;
+
+class JACKSession : public ARDOUR::SessionHandlePtr
+{
+ public:
+ JACKSession (ARDOUR::Session* s);
+ ~JACKSession ();
+
+ void session_event (jack_session_event_t* event);
+ void timebase_callback (jack_transport_state_t /*state*/,
+ ARDOUR::pframes_t /*nframes*/,
+ jack_position_t* pos,
+ int /*new_position*/);
+};
+
+} /* namespace */
+
+#endif /* __ardour_jack_audiobackend_jack_session_h__ */
diff --git a/libs/backends/jack/wscript b/libs/backends/jack/wscript
index 0bfb016e31..c5c506525a 100644
--- a/libs/backends/jack/wscript
+++ b/libs/backends/jack/wscript
@@ -37,10 +37,10 @@ def build(bld):
'jack_connection.cc',
'jack_audiobackend.cc',
'jack_portengine.cc',
- 'jack_utils.cc'
+ 'jack_utils.cc',
+ 'jack_session.cc',
]
obj.includes = ['.']
- obj.cxxflags = [ '-fPIC' ]
obj.name = 'jack_audiobackend'
obj.target = 'jack_audiobackend'
if Options.options.dist_target == 'mingw':
diff --git a/libs/gtkmm2ext/gtk_ui.cc b/libs/gtkmm2ext/gtk_ui.cc
index 9c20da0f4c..cd7ab1537a 100644
--- a/libs/gtkmm2ext/gtk_ui.cc
+++ b/libs/gtkmm2ext/gtk_ui.cc
@@ -120,9 +120,9 @@ UI::UI (string namestr, int *argc, char ***argv)
UI::~UI ()
{
+ _receiver.hangup ();
}
-
bool
UI::caller_is_ui_thread ()
{
@@ -265,12 +265,14 @@ UI::run (Receiver &old_receiver)
Glib::signal_idle().connect (bind_return (mem_fun (old_receiver, &Receiver::hangup), false));
- starting ();
+ if (starting ()) {
+ return;
+ }
+
_active = true;
theMain->run ();
_active = false;
- stopping ();
- _receiver.hangup ();
+
return;
}
diff --git a/libs/gtkmm2ext/gtkmm2ext/gtk_ui.h b/libs/gtkmm2ext/gtkmm2ext/gtk_ui.h
index a758ad78f4..9fa9e99fe8 100644
--- a/libs/gtkmm2ext/gtkmm2ext/gtk_ui.h
+++ b/libs/gtkmm2ext/gtkmm2ext/gtk_ui.h
@@ -156,8 +156,7 @@ class UI : public AbstractUI<UIRequest>
stopping just after we return from it (at the top level)
*/
- sigc::signal<void> starting;
- sigc::signal<void> stopping;
+ virtual int starting() = 0;
sigc::signal<void> theme_changed;
diff --git a/libs/pbd/stacktrace.cc b/libs/pbd/stacktrace.cc
index 805b9a2e84..b78f0e9338 100644
--- a/libs/pbd/stacktrace.cc
+++ b/libs/pbd/stacktrace.cc
@@ -96,6 +96,12 @@ PBD::stacktrace (std::ostream& out, int levels)
#else
+std::string
+PBD::demangle (std::string const & l)
+{
+ return string;
+}
+
void
PBD::stacktrace (std::ostream& out, int /*levels*/)
{
diff --git a/wscript b/wscript
index 82a5ac8b77..4046caf47a 100644
--- a/wscript
+++ b/wscript
@@ -57,7 +57,7 @@ def fetch_gcc_version (CC):
return version
def fetch_git_revision ():
- cmd = "LANG= git describe --tags HEAD"
+ cmd = "git describe --tags HEAD"
output = subprocess.Popen(cmd, shell=True, stderr=subprocess.STDOUT, stdout=subprocess.PIPE).communicate()[0].splitlines()
rev = output[0].decode('utf-8')
return rev
@@ -603,7 +603,12 @@ def configure(conf):
if Options.options.boost_sp_debug:
conf.env.append_value('CXXFLAGS', '-DBOOST_SP_ENABLE_DEBUG_HOOKS')
- autowaf.check_header(conf, 'cxx', 'jack/session.h', define="JACK_SESSION", mandatory = False)
+ conf.check_cxx(fragment = "#include <boost/version.hpp>\nint main(void) { return (BOOST_VERSION >= 103900 ? 0 : 1); }\n",
+ execute = "1",
+ mandatory = True,
+ msg = 'Checking for boost library >= 1.39',
+ okmsg = 'ok',
+ errmsg = 'too old\nPlease install boost version 1.39 or higher.')
autowaf.check_pkg(conf, 'glib-2.0', uselib_store='GLIB', atleast_version='2.2')
autowaf.check_pkg(conf, 'gthread-2.0', uselib_store='GTHREAD', atleast_version='2.2')
@@ -675,8 +680,6 @@ def configure(conf):
else:
conf.define('LXVST_SUPPORT', 1)
conf.env['LXVST_SUPPORT'] = True
- if bool(conf.env['JACK_SESSION']):
- conf.define('HAVE_JACK_SESSION', 1)
conf.define('WINDOWS_KEY', opts.windows_key)
conf.env['PROGRAM_NAME'] = opts.program_name
if opts.rt_alloc_debug:
@@ -738,7 +741,6 @@ const char* const ardour_config_info = "\\n\\
write_config_text('FLAC', conf.is_defined('HAVE_FLAC'))
write_config_text('FPU optimization', opts.fpu_optimization)
write_config_text('Freedesktop files', opts.freedesktop)
- write_config_text('JACK session support', conf.is_defined('JACK_SESSION'))
write_config_text('LV2 UI embedding', conf.is_defined('HAVE_SUIL'))
write_config_text('LV2 support', conf.is_defined('LV2_SUPPORT'))
write_config_text('LXVST support', conf.is_defined('LXVST_SUPPORT'))